{"version":3,"file":"Breadcrumbs.mjs","sources":["../../../../src/lib/ui/navigation/Breadcrumbs.tsx"],"sourcesContent":["/**\n * @file Breadcrumbs Component\n * @description Auto-generated breadcrumbs based on route info\n */\n\nimport React, { useMemo, memo } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { AppLink } from '@/lib';\n\n/**\n * Breadcrumb item\n */\nexport interface BreadcrumbItem {\n  label: string;\n  path?: string;\n  icon?: React.ReactNode;\n}\n\n/**\n * Breadcrumbs props\n */\nexport interface BreadcrumbsProps {\n  /** Custom breadcrumb items (overrides auto-generation) */\n  items?: BreadcrumbItem[];\n\n  /** Path to label mapping for auto-generation */\n  pathLabels?: Record<string, string>;\n\n  /** Home path */\n  homePath?: string;\n\n  /** Home label */\n  homeLabel?: string;\n\n  /** Home icon */\n  homeIcon?: React.ReactNode;\n\n  /** Separator element */\n  separator?: React.ReactNode;\n\n  /** Maximum items to show (collapses middle items) */\n  maxItems?: number;\n\n  /** Custom class name */\n  className?: string;\n}\n\n/**\n * Default separator icon - memoized for performance\n */\nconst DefaultSeparator = memo((): React.ReactElement => {\n  return (\n    <svg\n      width=\"16\"\n      height=\"16\"\n      viewBox=\"0 0 20 20\"\n      fill=\"currentColor\"\n      style={{ color: '#9ca3af' }}\n    >\n      <path\n        fillRule=\"evenodd\"\n        d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n        clipRule=\"evenodd\"\n      />\n    </svg>\n  );\n});\n\nDefaultSeparator.displayName = 'DefaultSeparator';\n\n/**\n * Default home icon - memoized for performance\n */\nconst DefaultHomeIcon = memo((): React.ReactElement => {\n  return (\n    <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n      <path d=\"M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z\" />\n    </svg>\n  );\n});\n\nDefaultHomeIcon.displayName = 'DefaultHomeIcon';\n\n/**\n * Generate breadcrumb items from path\n */\nfunction generateBreadcrumbs(\n  pathname: string,\n  pathLabels: Record<string, string>,\n  homePath: string,\n  homeLabel: string,\n  homeIcon?: React.ReactNode\n): BreadcrumbItem[] {\n  const items: BreadcrumbItem[] = [];\n\n  // Add home\n  items.push({\n    label: homeLabel,\n    path: homePath,\n    icon: homeIcon,\n  });\n\n  // Split path and build breadcrumbs\n  const segments = pathname.split('/').filter(Boolean);\n  let currentPath = '';\n\n  segments.forEach((segment, index) => {\n    currentPath += `/${segment}`;\n    const isLast = index === segments.length - 1;\n\n    // Check for custom label\n    let label = pathLabels[currentPath] ?? pathLabels[segment];\n\n    if (label === undefined || label === '') {\n      // Convert segment to readable label\n      // Handle dynamic segments like :id or [id]\n      if (segment.startsWith(':') || segment.startsWith('[')) {\n        label = segment.replace(/[:[\\]]/g, '');\n      } else {\n        // Convert kebab-case or camelCase to Title Case\n        label = segment\n          .replace(/[-_]/g, ' ')\n          .replace(/([a-z])([A-Z])/g, '$1 $2')\n          .replace(/\\b\\w/g, (c) => c.toUpperCase());\n      }\n    }\n\n    items.push({\n      label,\n      path: isLast ? undefined : currentPath,\n    });\n  });\n\n  return items;\n}\n\n/**\n * Breadcrumbs component - memoized for performance\n */\nexport const Breadcrumbs = memo(\n  ({\n    items: customItems,\n    pathLabels = {},\n    homePath = '/',\n    homeLabel = 'Home',\n    homeIcon,\n    separator,\n    maxItems,\n    className,\n  }: BreadcrumbsProps): React.ReactElement | null => {\n    const location = useLocation();\n\n    // Generate or use custom items\n    const items = useMemo(() => {\n      if (customItems !== undefined && customItems.length > 0) {\n        return customItems;\n      }\n      return generateBreadcrumbs(\n        location.pathname,\n        pathLabels,\n        homePath,\n        homeLabel,\n        homeIcon ?? <DefaultHomeIcon />\n      );\n    }, [customItems, location.pathname, pathLabels, homePath, homeLabel, homeIcon]);\n\n    // Collapse items if needed\n    const displayItems = useMemo(() => {\n      if (maxItems === undefined || maxItems === null || items.length <= maxItems) {\n        return items;\n      }\n\n      const firstItems = items.slice(0, 1);\n      const lastItems = items.slice(-(maxItems - 2));\n\n      return [...firstItems, { label: '...', path: undefined }, ...lastItems];\n    }, [items, maxItems]);\n\n    // Don't render if only home\n    if (items.length <= 1) {\n      return null;\n    }\n\n    const separatorElement = separator ?? <DefaultSeparator />;\n\n    return (\n      <nav\n        aria-label=\"Breadcrumb\"\n        className={className}\n        style={{\n          display: 'flex',\n          alignItems: 'center',\n          fontSize: '0.875rem',\n        }}\n      >\n        <ol\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            gap: '0.5rem',\n            listStyle: 'none',\n            margin: 0,\n            padding: 0,\n          }}\n        >\n          {displayItems.map((item, index) => {\n            const isLast = index === displayItems.length - 1;\n\n            return (\n              <li\n                key={index}\n                style={{\n                  display: 'flex',\n                  alignItems: 'center',\n                  gap: '0.5rem',\n                }}\n              >\n                {index > 0 && (\n                  <span style={{ display: 'flex', alignItems: 'center' }}>{separatorElement}</span>\n                )}\n\n                {item.path !== undefined && item.path !== '' && !isLast ? (\n                  <AppLink\n                    to={item.path}\n                    style={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      gap: '0.25rem',\n                      color: '#6b7280',\n                      textDecoration: 'none',\n                    }}\n                  >\n                    {item.icon}\n                    <span>{item.label}</span>\n                  </AppLink>\n                ) : (\n                  <span\n                    style={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      gap: '0.25rem',\n                      color: isLast ? '#111827' : '#6b7280',\n                      fontWeight: isLast ? '500' : '400',\n                    }}\n                    aria-current={isLast ? 'page' : undefined}\n                  >\n                    {item.icon}\n                    <span>{item.label}</span>\n                  </span>\n                )}\n              </li>\n            );\n          })}\n        </ol>\n      </nav>\n    );\n  }\n);\n"],"names":["DefaultSeparator","memo","jsx","DefaultHomeIcon","generateBreadcrumbs","pathname","pathLabels","homePath","homeLabel","homeIcon","items","segments","currentPath","segment","index","isLast","label","c","Breadcrumbs","customItems","separator","maxItems","className","location","useLocation","useMemo","displayItems","firstItems","lastItems","separatorElement","item","jsxs","AppLink"],"mappings":";;;;AAkDA,MAAMA,IAAmBC,EAAK,MAE1B,gBAAAC;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAO,EAAE,OAAO,UAAA;AAAA,IAEhB,UAAA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,UAAS;AAAA,QACT,GAAE;AAAA,QACF,UAAS;AAAA,MAAA;AAAA,IAAA;AAAA,EACX;AAAA,CAGL;AAEDF,EAAiB,cAAc;AAK/B,MAAMG,IAAkBF,EAAK,MAEzB,gBAAAC,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,gBACnD,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,oMAAmM,GAC7M,CAEH;AAEDC,EAAgB,cAAc;AAK9B,SAASC,EACPC,GACAC,GACAC,GACAC,GACAC,GACkB;AAClB,QAAMC,IAA0B,CAAA;AAGhC,EAAAA,EAAM,KAAK;AAAA,IACT,OAAOF;AAAA,IACP,MAAMD;AAAA,IACN,MAAME;AAAA,EAAA,CACP;AAGD,QAAME,IAAWN,EAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AACnD,MAAIO,IAAc;AAElB,SAAAD,EAAS,QAAQ,CAACE,GAASC,MAAU;AACnC,IAAAF,KAAe,IAAIC,CAAO;AAC1B,UAAME,IAASD,MAAUH,EAAS,SAAS;AAG3C,QAAIK,IAAQV,EAAWM,CAAW,KAAKN,EAAWO,CAAO;AAEzD,KAAIG,MAAU,UAAaA,MAAU,QAG/BH,EAAQ,WAAW,GAAG,KAAKA,EAAQ,WAAW,GAAG,IACnDG,IAAQH,EAAQ,QAAQ,WAAW,EAAE,IAGrCG,IAAQH,EACL,QAAQ,SAAS,GAAG,EACpB,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,SAAS,CAACI,MAAMA,EAAE,aAAa,IAI9CP,EAAM,KAAK;AAAA,MACT,OAAAM;AAAA,MACA,MAAMD,IAAS,SAAYH;AAAA,IAAA,CAC5B;AAAA,EACH,CAAC,GAEMF;AACT;AAKO,MAAMQ,IAAcjB;AAAA,EACzB,CAAC;AAAA,IACC,OAAOkB;AAAA,IACP,YAAAb,IAAa,CAAA;AAAA,IACb,UAAAC,IAAW;AAAA,IACX,WAAAC,IAAY;AAAA,IACZ,UAAAC;AAAA,IACA,WAAAW;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,EAAA,MACiD;AACjD,UAAMC,IAAWC,EAAA,GAGXd,IAAQe,EAAQ,MAChBN,MAAgB,UAAaA,EAAY,SAAS,IAC7CA,IAEFf;AAAA,MACLmB,EAAS;AAAA,MACTjB;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC,uBAAaN,GAAA,CAAA,CAAgB;AAAA,IAAA,GAE9B,CAACgB,GAAaI,EAAS,UAAUjB,GAAYC,GAAUC,GAAWC,CAAQ,CAAC,GAGxEiB,IAAeD,EAAQ,MAAM;AACjC,UAA8BJ,KAAa,QAAQX,EAAM,UAAUW;AACjE,eAAOX;AAGT,YAAMiB,IAAajB,EAAM,MAAM,GAAG,CAAC,GAC7BkB,IAAYlB,EAAM,MAAM,EAAEW,IAAW,EAAE;AAE7C,aAAO,CAAC,GAAGM,GAAY,EAAE,OAAO,OAAO,MAAM,UAAa,GAAGC,CAAS;AAAA,IACxE,GAAG,CAAClB,GAAOW,CAAQ,CAAC;AAGpB,QAAIX,EAAM,UAAU;AAClB,aAAO;AAGT,UAAMmB,IAAmBT,KAAa,gBAAAlB,EAACF,GAAA,CAAA,CAAiB;AAExD,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAW;AAAA,QACX,WAAAoB;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,QAGZ,UAAA,gBAAApB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,SAAS;AAAA,YAAA;AAAA,YAGV,UAAAwB,EAAa,IAAI,CAACI,GAAMhB,MAAU;AACjC,oBAAMC,IAASD,MAAUY,EAAa,SAAS;AAE/C,qBACE,gBAAAK;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,kBAAA;AAAA,kBAGN,UAAA;AAAA,oBAAAjB,IAAQ,KACP,gBAAAZ,EAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,SAAA,GAAa,UAAA2B,EAAA,CAAiB;AAAA,oBAG3EC,EAAK,SAAS,UAAaA,EAAK,SAAS,MAAM,CAACf,IAC/C,gBAAAgB;AAAA,sBAACC;AAAA,sBAAA;AAAA,wBACC,IAAIF,EAAK;AAAA,wBACT,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,KAAK;AAAA,0BACL,OAAO;AAAA,0BACP,gBAAgB;AAAA,wBAAA;AAAA,wBAGjB,UAAA;AAAA,0BAAAA,EAAK;AAAA,0BACN,gBAAA5B,EAAC,QAAA,EAAM,UAAA4B,EAAK,MAAA,CAAM;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAAA,IAGpB,gBAAAC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,YAAY;AAAA,0BACZ,KAAK;AAAA,0BACL,OAAOhB,IAAS,YAAY;AAAA,0BAC5B,YAAYA,IAAS,QAAQ;AAAA,wBAAA;AAAA,wBAE/B,gBAAcA,IAAS,SAAS;AAAA,wBAE/B,UAAA;AAAA,0BAAAe,EAAK;AAAA,0BACN,gBAAA5B,EAAC,QAAA,EAAM,UAAA4B,EAAK,MAAA,CAAM;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACpB;AAAA,gBAAA;AAAA,gBAtCGhB;AAAA,cAAA;AAAA,YA0CX,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAGN;AACF;"}