{"version":3,"sources":["../src/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Link, ChevronDown, MoreHorizontal } from 'lucide-react';\n\nexport interface BreadcrumbItem {\n  /**\n   * The label to display for this breadcrumb\n   */\n  label: string;\n  /**\n   * Optional href for the breadcrumb link\n   */\n  href?: string;\n  /**\n   * Optional click handler\n   */\n  onClick?: () => void;\n  /**\n   * Whether this breadcrumb has a dropdown menu\n   */\n  hasDropdown?: boolean;\n}\n\nexport interface BreadcrumbsProps {\n  /**\n   * Array of breadcrumb items\n   */\n  items: BreadcrumbItem[];\n  /**\n   * Callback when copy button is clicked\n   */\n  onCopy?: () => void;\n  /**\n   * Custom className\n   */\n  className?: string;\n  /**\n   * Custom style\n   */\n  style?: React.CSSProperties;\n  /**\n   * Test ID for testing\n   */\n  'data-testid'?: string;\n}\n\n/**\n * Breadcrumbs component - Arbor Design System\n *\n * Navigation component showing the current page's location in the site hierarchy.\n * Automatically truncates to show first and last breadcrumb with ellipsis when more than 6 items.\n */\nexport const Breadcrumbs = React.forwardRef<HTMLDivElement, BreadcrumbsProps>(\n  (\n    {\n      items,\n      onCopy,\n      className,\n      style,\n      'data-testid': dataTestId,\n    },\n    ref\n  ) => {\n    const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n    const [focusedIndex, setFocusedIndex] = React.useState<number | null>(null);\n    const [showCopyTooltip, setShowCopyTooltip] = React.useState(false);\n    const [ellipsisFocused, setEllipsisFocused] = React.useState(false);\n    const [ellipsisHovered, setEllipsisHovered] = React.useState(false);\n\n    // Truncate breadcrumbs if more than 6 items\n    const displayItems = React.useMemo(() => {\n      if (items.length > 6) {\n        // Show first item, ellipsis, and last item\n        return [items[0], { label: '...', isEllipsis: true }, items[items.length - 1]];\n      }\n      return items;\n    }, [items]);\n\n    const handleCopy = () => {\n      onCopy?.();\n      // Copy the breadcrumb trail to clipboard\n      const trail = items.map(item => item.label).join(' / ');\n      navigator.clipboard.writeText(trail);\n    };\n\n    const containerStyles: React.CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      gap: '8px',\n      ...style,\n    };\n\n    const breadcrumbItemStyles = (index: number, isActive: boolean, isEllipsis?: boolean): React.CSSProperties => {\n      const isFocused = focusedIndex === index;\n\n      if (isEllipsis) {\n        return {\n          display: 'flex',\n          alignItems: 'center',\n          gap: '4px',\n          height: '24px',\n          overflow: 'hidden',\n        };\n      }\n\n      return {\n        display: 'flex',\n        alignItems: 'center',\n        gap: '4px',\n        height: '24px',\n        overflow: 'hidden',\n        backgroundColor: isFocused ? 'rgba(255, 255, 255, 0.01)' : 'transparent',\n        borderRadius: '99px',\n        boxShadow: isFocused ? '0px 0px 0px 3px #3cad51' : 'none',\n        padding: isFocused ? '0 6px' : '0 2px',\n        margin: isFocused ? '0' : '0 4px',\n        cursor: isActive ? 'default' : 'pointer',\n        textDecoration: 'none',\n      };\n    };\n\n    const linkStyles = (isActive: boolean, isHovered: boolean): React.CSSProperties => ({\n      fontFamily: isActive\n        ? \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\"\n        : \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n      fontSize: '13px',\n      fontWeight: isActive ? 600 : 400,\n      color: isActive\n        ? isHovered\n          ? '#0e8a0e'\n          : '#2f2f2f'\n        : isHovered\n        ? '#0e8a0e'\n        : '#595959',\n      lineHeight: '1.5',\n      whiteSpace: 'nowrap',\n    });\n\n    const dividerStyles: React.CSSProperties = {\n      fontFamily: \"'PT Sans', sans-serif\",\n      fontSize: '14px',\n      color: '#595959',\n      lineHeight: 'normal',\n      whiteSpace: 'nowrap',\n    };\n\n    const ellipsisButtonStyles: React.CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '24px',\n      height: '24px',\n      borderRadius: '99px',\n      border: 'none',\n      background: 'transparent',\n      cursor: 'pointer',\n      backgroundColor: ellipsisFocused ? 'rgba(255, 255, 255, 0.01)' : ellipsisHovered ? '#efefef' : 'transparent',\n      boxShadow: ellipsisFocused ? '0px 0px 0px 3px #3cad51' : 'none',\n    };\n\n    const copyButtonStyles: React.CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      width: '24px',\n      height: '24px',\n      borderRadius: '99px',\n      border: 'none',\n      background: showCopyTooltip ? '#efefef' : 'transparent',\n      cursor: 'pointer',\n      position: 'relative',\n    };\n\n    const tooltipStyles: React.CSSProperties = {\n      position: 'absolute',\n      top: '100%',\n      left: '50%',\n      transform: 'translateX(-50%)',\n      marginTop: '8px',\n      backgroundColor: '#2f2f2f',\n      color: 'white',\n      padding: '12px',\n      borderRadius: '8px',\n      fontSize: '13px',\n      fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n      fontWeight: 400,\n      lineHeight: '1.5',\n      whiteSpace: 'nowrap',\n      boxShadow: '0px 4px 12px rgba(32, 32, 32, 0.08)',\n      zIndex: 1000,\n    };\n\n    return (\n      <div\n        ref={ref}\n        className={className}\n        style={containerStyles}\n        data-testid={dataTestId}\n      >\n        {displayItems.map((item, index) => {\n          const isActive = index === displayItems.length - 1;\n          const isEllipsis = 'isEllipsis' in item && item.isEllipsis;\n\n          if (isEllipsis) {\n            return (\n              <React.Fragment key={`ellipsis-${index}`}>\n                <button\n                  style={ellipsisButtonStyles}\n                  onFocus={() => setEllipsisFocused(true)}\n                  onBlur={() => setEllipsisFocused(false)}\n                  onMouseEnter={() => setEllipsisHovered(true)}\n                  onMouseLeave={() => setEllipsisHovered(false)}\n                  aria-label=\"More breadcrumbs\"\n                >\n                  <MoreHorizontal\n                    size={12}\n                    color=\"#2f2f2f\"\n                    strokeWidth={2}\n                    style={{ display: 'block', flexShrink: 0 }}\n                  />\n                </button>\n                <span style={dividerStyles}> /</span>\n              </React.Fragment>\n            );\n          }\n\n          const breadcrumbItem = item as BreadcrumbItem;\n\n          if (isActive) {\n            // Active breadcrumb (last item) - not clickable\n            return (\n              <React.Fragment key={index}>\n                <div\n                  style={breadcrumbItemStyles(index, true)}\n                  onMouseEnter={() => setHoveredIndex(index)}\n                  onMouseLeave={() => setHoveredIndex(null)}\n                  onFocus={() => setFocusedIndex(index)}\n                  onBlur={() => setFocusedIndex(null)}\n                  tabIndex={0}\n                >\n                  <span style={linkStyles(true, hoveredIndex === index)}>\n                    {breadcrumbItem.label}\n                  </span>\n                </div>\n                {/* Copy button - appears immediately after active breadcrumb */}\n                {onCopy && (\n                  <button\n                    style={copyButtonStyles}\n                    onClick={handleCopy}\n                    onMouseEnter={() => setShowCopyTooltip(true)}\n                    onMouseLeave={() => setShowCopyTooltip(false)}\n                    aria-label=\"Copy breadcrumb trail\"\n                  >\n                    <Link\n                      size={12}\n                      color=\"#2f2f2f\"\n                      strokeWidth={2}\n                      style={{ display: 'block', flexShrink: 0 }}\n                    />\n                    {showCopyTooltip && (\n                      <div style={tooltipStyles}>Copy breadcrumb trail</div>\n                    )}\n                  </button>\n                )}\n              </React.Fragment>\n            );\n          }\n\n          // Regular breadcrumb link\n          const Element = breadcrumbItem.href ? 'a' : 'button';\n          return (\n            <React.Fragment key={index}>\n              <Element\n                {...(breadcrumbItem.href ? { href: breadcrumbItem.href } : {})}\n                style={{\n                  ...breadcrumbItemStyles(index, false),\n                  border: 'none',\n                  background: 'transparent',\n                }}\n                onClick={(e) => {\n                  if (!breadcrumbItem.href && breadcrumbItem.onClick) {\n                    e.preventDefault();\n                    breadcrumbItem.onClick();\n                  }\n                }}\n                onMouseEnter={() => setHoveredIndex(index)}\n                onMouseLeave={() => setHoveredIndex(null)}\n                onFocus={() => setFocusedIndex(index)}\n                onBlur={() => setFocusedIndex(null)}\n              >\n                <span style={linkStyles(false, hoveredIndex === index)}>\n                  {breadcrumbItem.label}\n                </span>\n                {breadcrumbItem.hasDropdown && (\n                  <ChevronDown\n                    size={12}\n                    color={hoveredIndex === index ? '#0e8a0e' : '#595959'}\n                    strokeWidth={2}\n                    style={{ marginLeft: '2px', display: 'inline-block', flexShrink: 0 }}\n                  />\n                )}\n              </Element>\n              <span style={dividerStyles}> /</span>\n            </React.Fragment>\n          );\n        })}\n      </div>\n    );\n  }\n);\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n"],"mappings":"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","names":[]}