{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "breadcrumb",
  "type": "registry:ui",
  "title": "Breadcrumb",
  "description": "مسیر صفحه؛ آخرین مورد با aria-current=\"page\" مشخص می‌شود و مسیرهای بلند جمع می‌شوند",
  "registryDependencies": [
    "https://kashi.sepantapouya.com/r/cx.json",
    "https://kashi.sepantapouya.com/r/kashi-provider.json"
  ],
  "files": [
    {
      "path": "registry/kashi/Breadcrumb.tsx",
      "type": "registry:ui",
      "target": "components/kashi/Breadcrumb.tsx",
      "content": "\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cx } from \"./cx\";\nimport { useKashi } from \"./KashiProvider\";\n\nexport interface BreadcrumbItem {\n  label: ReactNode;\n  href?: string;\n  icon?: ReactNode;\n  /** فقط آیکون نمایش داده شود؛ برچسب برای صفحه‌خوان می‌ماند (مثل «خانه») */\n  hideLabel?: boolean;\n}\n\nexport interface BreadcrumbProps {\n  /** آخرین مورد صفحهٔ فعلی است */\n  items: BreadcrumbItem[];\n  /** اگر موارد بیشتر بود، وسط مسیر به «…» جمع می‌شود */\n  maxItems?: number;\n  /** @default \"chevron\" */\n  separator?: \"chevron\" | \"slash\";\n  /** @default \"مسیر\" */\n  label?: string;\n  /** @default \"نمایش مسیر کامل\" */\n  expandLabel?: string;\n  className?: string;\n}\n\n/** مسیر صفحه؛ آخرین مورد با aria-current=\"page\" مشخص می‌شود و مسیرهای بلند جمع می‌شوند */\nexport function Breadcrumb({ items, maxItems, separator = \"chevron\", label, expandLabel, className }: BreadcrumbProps) {\n  const { messages: M } = useKashi();\n  label ??= M.breadcrumb.label;\n  expandLabel ??= M.breadcrumb.expand;\n  const [expanded, setExpanded] = useState(false);\n  const listRef = useRef<HTMLOListElement>(null);\n  const justExpanded = useRef(false);\n  // دکمهٔ «…» پس از باز شدن حذف می‌شود؛ فوکوس به اولین مورد تازه‌نمایان می‌رود تا گم نشود\n  useEffect(() => {\n    if (!justExpanded.current) return;\n    justExpanded.current = false;\n    listRef.current?.querySelectorAll<HTMLElement>(\".k-breadcrumb__link\")[1]?.focus();\n  }, [expanded]);\n  const collapse = !expanded && maxItems !== undefined && maxItems >= 2 && items.length > maxItems;\n  // اولی + «…» + آخرین‌ها\n  const visible: (BreadcrumbItem | \"ellipsis\")[] = collapse\n    ? [items[0], \"ellipsis\", ...items.slice(items.length - (maxItems! - 1))]\n    : items;\n\n  return (\n    <nav className={cx(\"k-breadcrumb\", separator === \"slash\" && \"k-breadcrumb--slash\", className)} aria-label={label}>\n      <ol ref={listRef}>\n        {visible.map((item, i) => {\n          if (item === \"ellipsis\") {\n            return (\n              <li key=\"ellipsis\">\n                <button type=\"button\" className=\"k-breadcrumb__link\" aria-label={expandLabel} onClick={() => { justExpanded.current = true; setExpanded(true); }}>…</button>\n              </li>\n            );\n          }\n          const last = item === items[items.length - 1];\n          const iconOnly = !!item.icon && item.hideLabel;\n          const cls = cx(\"k-breadcrumb__link\", iconOnly && \"k-breadcrumb__link--icon\");\n          const title = typeof item.label === \"string\" && !iconOnly ? item.label : undefined;\n          const content = (\n            <>\n              {item.icon}\n              <span className={iconOnly ? \"k-sr-only\" : \"k-breadcrumb__text\"}>{item.label}</span>\n            </>\n          );\n          return (\n            <li key={i}>\n              {last || !item.href ? (\n                <span className={cls} aria-current={last ? \"page\" : undefined} title={title}>{content}</span>\n              ) : (\n                <a className={cls} href={item.href} title={title}>{content}</a>\n              )}\n            </li>\n          );\n        })}\n      </ol>\n    </nav>\n  );\n}\n"
    }
  ]
}