shadcn-glass-ui 2.0.8 → 2.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +153 -109
  2. package/dist/cli/index.cjs +1 -1
  3. package/dist/components.cjs +4 -4
  4. package/dist/components.d.ts +63 -322
  5. package/dist/components.js +2 -2
  6. package/dist/hooks.cjs +2 -2
  7. package/dist/index.cjs +43 -6
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.js +12 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/r/alert-glass.json +2 -1
  12. package/dist/r/avatar-glass.json +2 -3
  13. package/dist/r/button-glass.json +1 -1
  14. package/dist/r/circular-progress-glass.json +1 -1
  15. package/dist/r/combobox-glass.json +1 -1
  16. package/dist/r/dropdown-glass.json +3 -5
  17. package/dist/r/dropdown-menu-glass.json +42 -0
  18. package/dist/r/language-bar-glass.json +2 -2
  19. package/dist/r/popover-glass.json +1 -1
  20. package/dist/r/profile-avatar-glass.json +5 -3
  21. package/dist/r/rainbow-progress-glass.json +1 -1
  22. package/dist/r/registry.json +10 -4
  23. package/dist/r/sort-dropdown-glass.json +3 -4
  24. package/dist/r/tooltip-glass.json +3 -5
  25. package/dist/r/trust-score-card-glass.json +1 -1
  26. package/dist/r/trust-score-display-glass.json +1 -1
  27. package/dist/shadcn-glass-ui.css +1 -1
  28. package/dist/{theme-context-CVW50BKW.cjs → theme-context-DNe_2vWJ.cjs} +2 -2
  29. package/dist/theme-context-DNe_2vWJ.cjs.map +1 -0
  30. package/dist/{theme-context-BZoCplcU.js → theme-context-_T5r1KG4.js} +1 -1
  31. package/dist/theme-context-_T5r1KG4.js.map +1 -0
  32. package/dist/themes.cjs +1 -1
  33. package/dist/themes.d.ts +89 -1
  34. package/dist/themes.js +1 -1
  35. package/dist/{trust-score-card-glass-BcZbul0P.js → trust-score-card-glass-A7kas5OS.js} +353 -279
  36. package/dist/trust-score-card-glass-A7kas5OS.js.map +1 -0
  37. package/dist/{trust-score-card-glass-r3qM09Jp.cjs → trust-score-card-glass-Dgu46oWI.cjs} +551 -313
  38. package/dist/trust-score-card-glass-Dgu46oWI.cjs.map +1 -0
  39. package/dist/{use-focus-ZE8ozmZE.cjs → use-focus-BRkQtQCj.cjs} +2 -2
  40. package/dist/{use-focus-ZE8ozmZE.cjs.map → use-focus-BRkQtQCj.cjs.map} +1 -1
  41. package/dist/{use-wallpaper-tint-BuS80tbN.cjs → use-wallpaper-tint-CfShPBo2.cjs} +2 -2
  42. package/dist/{use-wallpaper-tint-BuS80tbN.cjs.map → use-wallpaper-tint-CfShPBo2.cjs.map} +1 -1
  43. package/dist/{utils-DLXayspX.cjs → utils-BXN7AcRu.cjs} +2 -2
  44. package/dist/{utils-DLXayspX.cjs.map → utils-BXN7AcRu.cjs.map} +1 -1
  45. package/dist/utils.cjs +1 -1
  46. package/docs/AI_USAGE.md +1 -32
  47. package/docs/API_PATTERNS_COMPARISON.md +10 -9
  48. package/docs/COMPONENTS_CATALOG.md +140 -45
  49. package/docs/DROPDOWN_ARCHITECTURE.md +290 -0
  50. package/docs/GETTING_STARTED.md +6 -5
  51. package/docs/TOKEN_ARCHITECTURE.md +100 -0
  52. package/docs/api/README.md +3 -3
  53. package/docs/migration/compound-components-v2.md +384 -0
  54. package/docs/visual-testing-guide.md +50 -12
  55. package/package.json +2 -2
  56. package/dist/theme-context-BZoCplcU.js.map +0 -1
  57. package/dist/theme-context-CVW50BKW.cjs.map +0 -1
  58. package/dist/trust-score-card-glass-BcZbul0P.js.map +0 -1
  59. package/dist/trust-score-card-glass-r3qM09Jp.cjs.map +0 -1
  60. package/docs/ADVANCED_PATTERNS.md +0 -408
  61. package/docs/BREAKING_CHANGES.md +0 -213
  62. package/docs/announcements/v1.0.5-devto.md +0 -363
  63. package/docs/announcements/v1.0.5-reddit.md +0 -115
  64. package/docs/announcements/v1.0.5-twitter.md +0 -70
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["StepperRoot: FC<StepperRootProps>","indicatorStyles: CSSProperties","connectorStyles: CSSProperties","labelStyles: CSSProperties","descriptionStyles: CSSProperties","StepperContent: FC<StepperContentProps>","_extends","ownKeys","r","_objectSpread","_defineProperty","_toPropertyKey","_toPrimitive","r","configLabelKey: string"],"sources":["../src/lib/variants/stepper-glass-variants.ts","../src/components/glass/ui/stepper-glass.tsx","../node_modules/recharts/es6/component/DefaultLegendContent.js","../node_modules/recharts/es6/context/legendPayloadContext.js","../node_modules/recharts/es6/component/Legend.js","../src/components/ui/chart.tsx","../src/lib/variants/dropdown-glass-variants.ts","../src/lib/variants/alert-variants.ts","../src/lib/variants/badge-variants.ts","../src/lib/variants/button-variants.ts"],"sourcesContent":["/**\n * StepperGlass CVA Variants\n *\n * Type-safe variant definitions for the StepperGlass compound component.\n * Extracted for Fast Refresh compatibility and reusability.\n *\n * @module stepper-glass-variants\n */\n\nimport { cva } from 'class-variance-authority';\n\n// ========================================\n// TYPE DEFINITIONS\n// ========================================\n\nexport type StepperOrientation = 'horizontal' | 'vertical';\nexport type StepperVariant = 'numbered' | 'icon' | 'dots';\nexport type StepperSize = 'sm' | 'md' | 'lg';\nexport type StepStatus = 'pending' | 'active' | 'completed' | 'disabled';\n\n// ========================================\n// ROOT VARIANTS\n// ========================================\n\nexport const stepperRootVariants = cva('flex w-full', {\n variants: {\n orientation: {\n horizontal: 'flex-col',\n vertical: 'flex-col',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// LIST VARIANTS\n// ========================================\n\nexport const stepperListVariants = cva('flex', {\n variants: {\n orientation: {\n horizontal: 'flex-row items-center w-full',\n vertical: 'flex-col gap-0',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// STEP CONTAINER VARIANTS\n// ========================================\n\nexport const stepperStepContainerVariants = cva('relative flex transition-all duration-300', {\n variants: {\n orientation: {\n horizontal: 'flex-col items-center flex-1',\n vertical: 'flex-row items-start gap-3',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// STEP INDICATOR VARIANTS\n// ========================================\n\nexport const stepperIndicatorVariants = cva(\n 'relative flex items-center justify-center rounded-full font-medium transition-all duration-300 shrink-0',\n {\n variants: {\n size: {\n sm: 'w-8 h-8 text-xs',\n md: 'w-10 h-10 text-sm',\n lg: 'w-12 h-12 text-base',\n },\n variant: {\n numbered: '',\n icon: '',\n dots: '',\n },\n },\n defaultVariants: {\n size: 'md',\n variant: 'numbered',\n },\n compoundVariants: [\n // Dots variant has smaller indicators\n { variant: 'dots', size: 'sm', className: '!w-2.5 !h-2.5' },\n { variant: 'dots', size: 'md', className: '!w-3 !h-3' },\n { variant: 'dots', size: 'lg', className: '!w-4 !h-4' },\n ],\n }\n);\n\n// ========================================\n// CONNECTOR VARIANTS\n// ========================================\n\nexport const stepperConnectorVariants = cva('transition-all duration-500 ease-out', {\n variants: {\n orientation: {\n horizontal: 'h-0.5 flex-1 mx-2 md:mx-3',\n vertical: 'w-0.5 min-h-6 ml-5 my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// LABEL VARIANTS\n// ========================================\n\nexport const stepperLabelVariants = cva(\n 'font-medium transition-colors duration-300 whitespace-nowrap',\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n orientation: {\n horizontal: 'mt-2 text-center',\n vertical: '',\n },\n },\n defaultVariants: {\n size: 'md',\n orientation: 'horizontal',\n },\n }\n);\n\n// ========================================\n// DESCRIPTION VARIANTS\n// ========================================\n\nexport const stepperDescriptionVariants = cva('transition-colors duration-300', {\n variants: {\n size: {\n sm: 'text-[10px]',\n md: 'text-xs',\n lg: 'text-sm',\n },\n orientation: {\n horizontal: 'text-center max-w-[100px] md:max-w-[120px]',\n vertical: 'max-w-[200px]',\n },\n },\n defaultVariants: {\n size: 'md',\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// CONTENT VARIANTS\n// ========================================\n\nexport const stepperContentVariants = cva('animate-in fade-in-0 duration-200', {\n variants: {\n orientation: {\n horizontal: 'mt-6',\n vertical: 'mt-4',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * StepperGlass Component (Compound API)\n *\n * Glass-themed step indicator with:\n * - Theme-aware styling (glass/light/aurora)\n * - Horizontal and vertical orientations\n * - Numbered, icon, and dots variants\n * - Linear mode (lock future steps)\n * - Animated connector lines\n * - Compound component API for advanced composition\n *\n * @example\n * ```tsx\n * <StepperGlass.Root value=\"step2\" onValueChange={setStep}>\n * <StepperGlass.List>\n * <StepperGlass.Step value=\"step1\" label=\"Account\" description=\"Create your account\" />\n * <StepperGlass.Step value=\"step2\" label=\"Profile\" description=\"Setup your profile\" />\n * <StepperGlass.Step value=\"step3\" label=\"Complete\" description=\"Finish setup\" />\n * </StepperGlass.List>\n * <StepperGlass.Content value=\"step1\">Step 1 content</StepperGlass.Content>\n * <StepperGlass.Content value=\"step2\">Step 2 content</StepperGlass.Content>\n * <StepperGlass.Content value=\"step3\">Step 3 content</StepperGlass.Content>\n * </StepperGlass.Root>\n * ```\n *\n * @accessibility\n * - **Keyboard Navigation:** Arrow keys navigate between steps (WCAG 2.1.1)\n * - **Focus Management:** Visible focus ring using `--focus-glow` (WCAG 2.4.7)\n * - **Screen Readers:** Uses `role=\"tablist\"`, `role=\"tab\"` (WCAG 4.1.3)\n * - **ARIA Attributes:** `aria-current=\"step\"`, `aria-disabled` for state\n * - **Touch Targets:** 44x44px minimum touch targets (WCAG 2.5.5)\n * - **Color Contrast:** All states meet WCAG AA 4.5:1 ratio\n * - **Motion:** Respects `prefers-reduced-motion`\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n useMemo,\n useState,\n useCallback,\n useLayoutEffect,\n type CSSProperties,\n type FC,\n type ReactNode,\n} from 'react';\nimport { cn } from '@/lib/utils';\nimport { useFocus } from '@/lib/hooks/use-focus';\nimport { Check } from 'lucide-react';\nimport {\n stepperRootVariants,\n stepperListVariants,\n stepperStepContainerVariants,\n stepperIndicatorVariants,\n stepperConnectorVariants,\n stepperLabelVariants,\n stepperDescriptionVariants,\n stepperContentVariants,\n type StepperOrientation,\n type StepperVariant,\n type StepperSize,\n type StepStatus,\n} from '@/lib/variants/stepper-glass-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// CONTEXT\n// ========================================\n\ninterface StepperContextValue {\n value: string;\n onValueChange?: (value: string) => void;\n orientation: StepperOrientation;\n variant: StepperVariant;\n size: StepperSize;\n linear: boolean;\n steps: string[];\n registerStep: (value: string, index: number) => void;\n unregisterStep: (value: string) => void;\n}\n\nconst StepperContext = createContext<StepperContextValue | null>(null);\n\nconst useStepperContext = () => {\n const context = useContext(StepperContext);\n if (!context) {\n throw new Error('Stepper compound components must be used within StepperGlass.Root');\n }\n return context;\n};\n\n// ========================================\n// UTILITY: GET STEP STATUS\n// ========================================\n\nfunction getStepStatus(\n stepValue: string,\n currentValue: string,\n steps: string[],\n linear: boolean,\n disabled?: boolean\n): StepStatus {\n if (disabled) return 'disabled';\n\n const stepIndex = steps.indexOf(stepValue);\n const currentIndex = steps.indexOf(currentValue);\n\n if (stepIndex === -1 || currentIndex === -1) return 'pending';\n if (stepIndex === currentIndex) return 'active';\n if (stepIndex < currentIndex) return 'completed';\n if (linear && stepIndex > currentIndex) return 'disabled';\n return 'pending';\n}\n\n// ========================================\n// ROOT COMPONENT\n// ========================================\n\ninterface StepperRootProps {\n /** Current active step value */\n value: string;\n /** Callback when step value changes */\n onValueChange?: (value: string) => void;\n /** Orientation of the stepper */\n orientation?: StepperOrientation;\n /** Visual variant */\n variant?: StepperVariant;\n /** Size of step indicators */\n size?: StepperSize;\n /** Lock future steps (require sequential completion) */\n linear?: boolean;\n /** Child components */\n children: ReactNode;\n /** Optional className */\n className?: string;\n}\n\nconst StepperRoot: FC<StepperRootProps> = ({\n value,\n onValueChange,\n orientation = 'horizontal',\n variant = 'numbered',\n size = 'md',\n linear = false,\n children,\n className,\n}) => {\n const [steps, setSteps] = useState<string[]>([]);\n\n const registerStep = useCallback((stepValue: string, index: number) => {\n setSteps((prev) => {\n if (prev.includes(stepValue)) return prev;\n const newSteps = [...prev];\n // Insert at correct position to maintain order\n newSteps.splice(index, 0, stepValue);\n return newSteps;\n });\n }, []);\n\n const unregisterStep = useCallback((stepValue: string) => {\n setSteps((prev) => prev.filter((s) => s !== stepValue));\n }, []);\n\n const contextValue = useMemo(\n () => ({\n value,\n onValueChange,\n orientation,\n variant,\n size,\n linear,\n steps,\n registerStep,\n unregisterStep,\n }),\n [value, onValueChange, orientation, variant, size, linear, steps, registerStep, unregisterStep]\n );\n\n return (\n <StepperContext.Provider value={contextValue}>\n <div\n className={cn(stepperRootVariants({ orientation }), className)}\n aria-label=\"Progress steps\"\n >\n {children}\n </div>\n </StepperContext.Provider>\n );\n};\n\n// ========================================\n// LIST COMPONENT\n// ========================================\n\ninterface StepperListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n className?: string;\n}\n\nconst StepperList = forwardRef<HTMLDivElement, StepperListProps>(\n ({ children, className, ...props }, ref) => {\n const { orientation } = useStepperContext();\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cn(stepperListVariants({ orientation }), className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nStepperList.displayName = 'StepperList';\n\n// ========================================\n// STEP COMPONENT\n// ========================================\n\ninterface StepperStepProps {\n /** Unique value for this step */\n value: string;\n /** Step label (required for accessibility) */\n label: string;\n /** Optional description */\n description?: string;\n /** Custom icon (for icon variant) */\n icon?: ReactNode;\n /** Completed icon override */\n completedIcon?: ReactNode;\n /** Force disabled state */\n disabled?: boolean;\n /** Optional className */\n className?: string;\n /** Step index for ordering (auto-detected) */\n index?: number;\n}\n\nconst StepperStep = forwardRef<HTMLButtonElement, StepperStepProps>(\n (\n {\n value: stepValue,\n label,\n description,\n icon,\n completedIcon,\n disabled: forcedDisabled,\n className,\n index: providedIndex,\n },\n ref\n ) => {\n const {\n value: currentValue,\n onValueChange,\n orientation,\n variant,\n size,\n linear,\n steps,\n registerStep,\n unregisterStep,\n } = useStepperContext();\n\n const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n\n // Track mount order for step registration\n const [mountIndex] = useState(() => providedIndex ?? Date.now());\n\n // Register step on mount\n // Use useLayoutEffect to register before paint\n useLayoutEffect(() => {\n registerStep(stepValue, mountIndex);\n return () => unregisterStep(stepValue);\n }, [stepValue, mountIndex, registerStep, unregisterStep]);\n\n const status = getStepStatus(stepValue, currentValue, steps, linear, forcedDisabled);\n const stepIndex = steps.indexOf(stepValue);\n const isLast = stepIndex === steps.length - 1;\n const isClickable = status !== 'disabled';\n\n // Styles based on status\n const indicatorStyles: CSSProperties = {\n background:\n status === 'completed'\n ? 'var(--stepper-step-completed-bg)'\n : status === 'active'\n ? 'var(--stepper-step-active-bg)'\n : status === 'disabled'\n ? 'var(--stepper-step-disabled-bg)'\n : 'var(--stepper-step-bg)',\n border: `2px solid ${\n status === 'completed'\n ? 'var(--stepper-step-completed-border)'\n : status === 'active'\n ? 'var(--stepper-step-active-border)'\n : status === 'disabled'\n ? 'var(--stepper-step-disabled-border)'\n : 'var(--stepper-step-border)'\n }`,\n color:\n status === 'completed'\n ? 'var(--stepper-step-completed-text)'\n : status === 'active'\n ? 'var(--stepper-step-active-text)'\n : status === 'disabled'\n ? 'var(--stepper-step-disabled-text)'\n : 'var(--stepper-step-text)',\n boxShadow:\n status === 'active'\n ? 'var(--stepper-step-active-glow)'\n : status === 'completed'\n ? 'var(--stepper-step-glow)'\n : isFocusVisible\n ? 'var(--focus-glow)'\n : 'none',\n backdropFilter: 'blur(var(--blur-sm))',\n };\n\n const connectorStyles: CSSProperties = {\n background:\n stepIndex < steps.indexOf(currentValue)\n ? 'var(--stepper-connector-active-bg)'\n : 'var(--stepper-connector-bg)',\n };\n\n const labelStyles: CSSProperties = {\n color:\n status === 'active' || status === 'completed'\n ? 'var(--stepper-label-text)'\n : 'var(--stepper-description-text)',\n };\n\n const descriptionStyles: CSSProperties = {\n color: 'var(--stepper-description-text)',\n };\n\n // Render indicator content\n const renderIndicatorContent = () => {\n if (status === 'completed') {\n if (completedIcon) return completedIcon;\n return <Check className=\"w-4 h-4\" />;\n }\n if (variant === 'icon' && icon) return icon;\n if (variant === 'dots') return null;\n // Numbered variant\n return stepIndex >= 0 ? stepIndex + 1 : '';\n };\n\n const handleClick = () => {\n if (isClickable && onValueChange) {\n onValueChange(stepValue);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isClickable) return;\n\n const stepList = e.currentTarget.closest('[role=\"tablist\"]');\n if (!stepList) return;\n\n const allSteps = Array.from(\n stepList.querySelectorAll('[role=\"tab\"]:not([aria-disabled=\"true\"])')\n ) as HTMLButtonElement[];\n const currentIdx = allSteps.indexOf(e.currentTarget as HTMLButtonElement);\n\n let nextIdx = currentIdx;\n const isHorizontal = orientation === 'horizontal';\n\n switch (e.key) {\n case isHorizontal ? 'ArrowRight' : 'ArrowDown':\n e.preventDefault();\n nextIdx = (currentIdx + 1) % allSteps.length;\n break;\n case isHorizontal ? 'ArrowLeft' : 'ArrowUp':\n e.preventDefault();\n nextIdx = currentIdx - 1 < 0 ? allSteps.length - 1 : currentIdx - 1;\n break;\n case 'Home':\n e.preventDefault();\n nextIdx = 0;\n break;\n case 'End':\n e.preventDefault();\n nextIdx = allSteps.length - 1;\n break;\n default:\n return;\n }\n\n const nextStep = allSteps[nextIdx];\n if (nextStep) {\n nextStep.focus();\n const nextValue = nextStep.getAttribute('data-value');\n if (nextValue && onValueChange) {\n onValueChange(nextValue);\n }\n }\n };\n\n // For horizontal, we need step + connector inline\n // For vertical, step is a row with connector below\n if (orientation === 'horizontal') {\n return (\n <>\n <div className={cn(stepperStepContainerVariants({ orientation }), className)}>\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n aria-selected={status === 'active'}\n aria-disabled={!isClickable}\n aria-current={status === 'active' ? 'step' : undefined}\n data-value={stepValue}\n data-status={status}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onFocus={focusProps.onFocus}\n onBlur={focusProps.onBlur}\n disabled={!isClickable}\n className={cn(\n stepperIndicatorVariants({ size, variant }),\n !isClickable && 'cursor-not-allowed opacity-60',\n isClickable && 'cursor-pointer hover:scale-105',\n // Ensure minimum touch target\n 'min-w-[44px] min-h-[44px]'\n )}\n style={indicatorStyles}\n >\n {renderIndicatorContent()}\n </button>\n\n {label && (\n <div className=\"flex flex-col items-center\">\n <span\n className={cn(stepperLabelVariants({ size, orientation }))}\n style={labelStyles}\n >\n {label}\n </span>\n {description && (\n <span\n className={cn(stepperDescriptionVariants({ size, orientation }))}\n style={descriptionStyles}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Connector line between steps */}\n {!isLast && (\n <div\n className={cn(stepperConnectorVariants({ orientation }))}\n style={connectorStyles}\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n }\n\n // Vertical orientation\n return (\n <div className=\"flex flex-col\">\n <div className={cn(stepperStepContainerVariants({ orientation }), className)}>\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n aria-selected={status === 'active'}\n aria-disabled={!isClickable}\n aria-current={status === 'active' ? 'step' : undefined}\n data-value={stepValue}\n data-status={status}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onFocus={focusProps.onFocus}\n onBlur={focusProps.onBlur}\n disabled={!isClickable}\n className={cn(\n stepperIndicatorVariants({ size, variant }),\n !isClickable && 'cursor-not-allowed opacity-60',\n isClickable && 'cursor-pointer hover:scale-105',\n 'min-w-[44px] min-h-[44px]'\n )}\n style={indicatorStyles}\n >\n {renderIndicatorContent()}\n </button>\n\n {label && (\n <div className=\"flex flex-col justify-center\">\n <span className={cn(stepperLabelVariants({ size, orientation }))} style={labelStyles}>\n {label}\n </span>\n {description && (\n <span\n className={cn(stepperDescriptionVariants({ size, orientation }))}\n style={descriptionStyles}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Vertical connector */}\n {!isLast && (\n <div\n className={cn(stepperConnectorVariants({ orientation }))}\n style={connectorStyles}\n aria-hidden=\"true\"\n />\n )}\n </div>\n );\n }\n);\n\nStepperStep.displayName = 'StepperStep';\n\n// ========================================\n// CONTENT COMPONENT\n// ========================================\n\ninterface StepperContentProps {\n /** Value of the step this content belongs to */\n value: string;\n /** Content to display when step is active */\n children: ReactNode;\n /** Optional className */\n className?: string;\n}\n\nconst StepperContent: FC<StepperContentProps> = ({ value, children, className }) => {\n const { value: currentValue, orientation } = useStepperContext();\n const isActive = currentValue === value;\n\n if (!isActive) return null;\n\n return (\n <div\n role=\"tabpanel\"\n aria-hidden={!isActive}\n className={cn(stepperContentVariants({ orientation }), className)}\n >\n {children}\n </div>\n );\n};\n\n// ========================================\n// EXPORT COMPOUND COMPONENT\n// ========================================\n\nexport const StepperGlass = {\n Root: StepperRoot,\n List: StepperList,\n Step: StepperStep,\n Content: StepperContent,\n};\n\n// Also export individual components for flexibility\nexport { StepperRoot, StepperList, StepperStep, StepperContent };\n\n// Re-export types\nexport type {\n StepperRootProps,\n StepperListProps,\n StepperStepProps,\n StepperContentProps,\n StepperOrientation,\n StepperVariant,\n StepperSize,\n StepStatus,\n};\n","function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @fileOverview Default Legend Content\n */\nimport * as React from 'react';\nimport { clsx } from 'clsx';\nimport { Surface } from '../container/Surface';\nimport { Symbols } from '../shape/Symbols';\nimport { adaptEventsOfChild } from '../util/types';\nimport { resolveDefaultProps } from '../util/resolveDefaultProps';\nvar SIZE = 32;\nvar defaultLegendContentDefaultProps = {\n align: 'center',\n iconSize: 14,\n inactiveColor: '#ccc',\n layout: 'horizontal',\n verticalAlign: 'middle'\n};\nfunction Icon(_ref) {\n var {\n data,\n iconType,\n inactiveColor\n } = _ref;\n var halfSize = SIZE / 2;\n var sixthSize = SIZE / 6;\n var thirdSize = SIZE / 3;\n var color = data.inactive ? inactiveColor : data.color;\n var preferredIcon = iconType !== null && iconType !== void 0 ? iconType : data.type;\n if (preferredIcon === 'none') {\n return null;\n }\n if (preferredIcon === 'plainline') {\n var _data$payload;\n return /*#__PURE__*/React.createElement(\"line\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n strokeDasharray: (_data$payload = data.payload) === null || _data$payload === void 0 ? void 0 : _data$payload.strokeDasharray,\n x1: 0,\n y1: halfSize,\n x2: SIZE,\n y2: halfSize,\n className: \"recharts-legend-icon\"\n });\n }\n if (preferredIcon === 'line') {\n return /*#__PURE__*/React.createElement(\"path\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n d: \"M0,\".concat(halfSize, \"h\").concat(thirdSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n H\").concat(SIZE, \"M\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(thirdSize, \",\").concat(halfSize),\n className: \"recharts-legend-icon\"\n });\n }\n if (preferredIcon === 'rect') {\n return /*#__PURE__*/React.createElement(\"path\", {\n stroke: \"none\",\n fill: color,\n d: \"M0,\".concat(SIZE / 8, \"h\").concat(SIZE, \"v\").concat(SIZE * 3 / 4, \"h\").concat(-SIZE, \"z\"),\n className: \"recharts-legend-icon\"\n });\n }\n if (/*#__PURE__*/React.isValidElement(data.legendIcon)) {\n var iconProps = _objectSpread({}, data);\n delete iconProps.legendIcon;\n return /*#__PURE__*/React.cloneElement(data.legendIcon, iconProps);\n }\n return /*#__PURE__*/React.createElement(Symbols, {\n fill: color,\n cx: halfSize,\n cy: halfSize,\n size: SIZE,\n sizeType: \"diameter\",\n type: preferredIcon\n });\n}\nfunction Items(props) {\n var {\n payload,\n iconSize,\n layout,\n formatter,\n inactiveColor,\n iconType\n } = props;\n var viewBox = {\n x: 0,\n y: 0,\n width: SIZE,\n height: SIZE\n };\n var itemStyle = {\n display: layout === 'horizontal' ? 'inline-block' : 'block',\n marginRight: 10\n };\n var svgStyle = {\n display: 'inline-block',\n verticalAlign: 'middle',\n marginRight: 4\n };\n return payload.map((entry, i) => {\n var finalFormatter = entry.formatter || formatter;\n var className = clsx({\n 'recharts-legend-item': true,\n [\"legend-item-\".concat(i)]: true,\n inactive: entry.inactive\n });\n if (entry.type === 'none') {\n return null;\n }\n var color = entry.inactive ? inactiveColor : entry.color;\n var finalValue = finalFormatter ? finalFormatter(entry.value, entry, i) : entry.value;\n return /*#__PURE__*/React.createElement(\"li\", _extends({\n className: className,\n style: itemStyle,\n key: \"legend-item-\".concat(i)\n }, adaptEventsOfChild(props, entry, i)), /*#__PURE__*/React.createElement(Surface, {\n width: iconSize,\n height: iconSize,\n viewBox: viewBox,\n style: svgStyle,\n \"aria-label\": \"\".concat(finalValue, \" legend icon\")\n }, /*#__PURE__*/React.createElement(Icon, {\n data: entry,\n iconType: iconType,\n inactiveColor: inactiveColor\n })), /*#__PURE__*/React.createElement(\"span\", {\n className: \"recharts-legend-item-text\",\n style: {\n color\n }\n }, finalValue));\n });\n}\nexport var DefaultLegendContent = outsideProps => {\n var props = resolveDefaultProps(outsideProps, defaultLegendContentDefaultProps);\n var {\n payload,\n layout,\n align\n } = props;\n if (!payload || !payload.length) {\n return null;\n }\n var finalStyle = {\n padding: 0,\n margin: 0,\n textAlign: layout === 'horizontal' ? align : 'left'\n };\n return /*#__PURE__*/React.createElement(\"ul\", {\n className: \"recharts-default-legend\",\n style: finalStyle\n }, /*#__PURE__*/React.createElement(Items, _extends({}, props, {\n payload: payload\n })));\n};","import { useAppSelector } from '../state/hooks';\nimport { selectLegendPayload } from '../state/selectors/legendSelectors';\n\n/**\n * Use this hook in Legend, or anywhere else where you want to read the current Legend items.\n * @return all Legend items ready to be rendered\n */\nexport function useLegendPayload() {\n return useAppSelector(selectLegendPayload);\n}","var _excluded = [\"contextPayload\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\nimport * as React from 'react';\nimport { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLegendPortal } from '../context/legendPortalContext';\nimport { DefaultLegendContent } from './DefaultLegendContent';\nimport { isNumber } from '../util/DataUtils';\nimport { getUniqPayload } from '../util/payload/getUniqPayload';\nimport { useLegendPayload } from '../context/legendPayloadContext';\nimport { useElementOffset } from '../util/useElementOffset';\nimport { useChartHeight, useChartWidth, useMargin } from '../context/chartLayoutContext';\nimport { setLegendSettings, setLegendSize } from '../state/legendSlice';\nimport { useAppDispatch } from '../state/hooks';\nimport { resolveDefaultProps } from '../util/resolveDefaultProps';\nfunction defaultUniqBy(entry) {\n return entry.value;\n}\nfunction LegendContent(props) {\n var {\n contextPayload\n } = props,\n otherProps = _objectWithoutProperties(props, _excluded);\n var finalPayload = getUniqPayload(contextPayload, props.payloadUniqBy, defaultUniqBy);\n var contentProps = _objectSpread(_objectSpread({}, otherProps), {}, {\n payload: finalPayload\n });\n if (/*#__PURE__*/React.isValidElement(props.content)) {\n return /*#__PURE__*/React.cloneElement(props.content, contentProps);\n }\n if (typeof props.content === 'function') {\n return /*#__PURE__*/React.createElement(props.content, contentProps);\n }\n return /*#__PURE__*/React.createElement(DefaultLegendContent, contentProps);\n}\nfunction getDefaultPosition(style, props, margin, chartWidth, chartHeight, box) {\n var {\n layout,\n align,\n verticalAlign\n } = props;\n var hPos, vPos;\n if (!style || (style.left === undefined || style.left === null) && (style.right === undefined || style.right === null)) {\n if (align === 'center' && layout === 'vertical') {\n hPos = {\n left: ((chartWidth || 0) - box.width) / 2\n };\n } else {\n hPos = align === 'right' ? {\n right: margin && margin.right || 0\n } : {\n left: margin && margin.left || 0\n };\n }\n }\n if (!style || (style.top === undefined || style.top === null) && (style.bottom === undefined || style.bottom === null)) {\n if (verticalAlign === 'middle') {\n vPos = {\n top: ((chartHeight || 0) - box.height) / 2\n };\n } else {\n vPos = verticalAlign === 'bottom' ? {\n bottom: margin && margin.bottom || 0\n } : {\n top: margin && margin.top || 0\n };\n }\n }\n return _objectSpread(_objectSpread({}, hPos), vPos);\n}\nfunction LegendSettingsDispatcher(props) {\n var dispatch = useAppDispatch();\n useEffect(() => {\n dispatch(setLegendSettings(props));\n }, [dispatch, props]);\n return null;\n}\nfunction LegendSizeDispatcher(props) {\n var dispatch = useAppDispatch();\n useEffect(() => {\n dispatch(setLegendSize(props));\n return () => {\n dispatch(setLegendSize({\n width: 0,\n height: 0\n }));\n };\n }, [dispatch, props]);\n return null;\n}\nfunction getWidthOrHeight(layout, height, width, maxWidth) {\n if (layout === 'vertical' && isNumber(height)) {\n return {\n height\n };\n }\n if (layout === 'horizontal') {\n return {\n width: width || maxWidth\n };\n }\n return null;\n}\nexport var legendDefaultProps = {\n align: 'center',\n iconSize: 14,\n itemSorter: 'value',\n layout: 'horizontal',\n verticalAlign: 'bottom'\n};\nexport function Legend(outsideProps) {\n var props = resolveDefaultProps(outsideProps, legendDefaultProps);\n var contextPayload = useLegendPayload();\n var legendPortalFromContext = useLegendPortal();\n var margin = useMargin();\n var {\n width: widthFromProps,\n height: heightFromProps,\n wrapperStyle,\n portal: portalFromProps\n } = props;\n // The contextPayload is not used directly inside the hook, but we need the onBBoxUpdate call\n // when the payload changes, therefore it's here as a dependency.\n var [lastBoundingBox, updateBoundingBox] = useElementOffset([contextPayload]);\n var chartWidth = useChartWidth();\n var chartHeight = useChartHeight();\n if (chartWidth == null || chartHeight == null) {\n return null;\n }\n var maxWidth = chartWidth - ((margin === null || margin === void 0 ? void 0 : margin.left) || 0) - ((margin === null || margin === void 0 ? void 0 : margin.right) || 0);\n var widthOrHeight = getWidthOrHeight(props.layout, heightFromProps, widthFromProps, maxWidth);\n // if the user supplies their own portal, only use their defined wrapper styles\n var outerStyle = portalFromProps ? wrapperStyle : _objectSpread(_objectSpread({\n position: 'absolute',\n width: (widthOrHeight === null || widthOrHeight === void 0 ? void 0 : widthOrHeight.width) || widthFromProps || 'auto',\n height: (widthOrHeight === null || widthOrHeight === void 0 ? void 0 : widthOrHeight.height) || heightFromProps || 'auto'\n }, getDefaultPosition(wrapperStyle, props, margin, chartWidth, chartHeight, lastBoundingBox)), wrapperStyle);\n var legendPortal = portalFromProps !== null && portalFromProps !== void 0 ? portalFromProps : legendPortalFromContext;\n if (legendPortal == null || contextPayload == null) {\n return null;\n }\n var legendElement = /*#__PURE__*/React.createElement(\"div\", {\n className: \"recharts-legend-wrapper\",\n style: outerStyle,\n ref: updateBoundingBox\n }, /*#__PURE__*/React.createElement(LegendSettingsDispatcher, {\n layout: props.layout,\n align: props.align,\n verticalAlign: props.verticalAlign,\n itemSorter: props.itemSorter\n }), !portalFromProps && /*#__PURE__*/React.createElement(LegendSizeDispatcher, {\n width: lastBoundingBox.width,\n height: lastBoundingBox.height\n }), /*#__PURE__*/React.createElement(LegendContent, _extends({}, props, widthOrHeight, {\n margin: margin,\n chartWidth: chartWidth,\n chartHeight: chartHeight,\n contextPayload: contextPayload\n })));\n return /*#__PURE__*/createPortal(legendElement, legendPortal);\n}\nLegend.displayName = 'Legend';","/* eslint-disable react-refresh/only-export-components */\n// ========================================\n// CHART COMPONENTS (shadcn/ui pattern)\n// Base chart utilities following shadcn/ui Charts API\n// ========================================\n\nimport * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\n\nimport { cn } from '@/lib/utils';\n\n// ========================================\n// CHART CONFIG TYPE\n// ========================================\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: { light: string; dark: string } }\n );\n};\n\n// ========================================\n// CHART CONTEXT\n// ========================================\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\n// ========================================\n// CHART CONTAINER\n// ========================================\n\ninterface ChartContainerProps\n extends React.ComponentProps<'div'>, Pick<ChartContextProps, 'config'> {\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children'];\n}\n\nconst ChartContainer = React.forwardRef<HTMLDivElement, ChartContainerProps>(\n ({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-[var(--text-muted)] [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-[var(--glass-border)] [&_.recharts-curve.recharts-tooltip-cursor]:stroke-[var(--glass-border)] [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-[var(--glass-border)] [&_.recharts-radial-bar-background-sector]:fill-[var(--glass-frost-5)] [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-[var(--glass-frost-10)] [&_.recharts-reference-line_[stroke='#ccc']]:stroke-[var(--glass-border)] [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n }\n);\nChartContainer.displayName = 'ChartContainer';\n\n// ========================================\n// CHART STYLE (CSS Variables injection)\n// ========================================\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, itemConfig]) => itemConfig.color || itemConfig.theme\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: `\n[data-chart=\"${id}\"] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.color || itemConfig.theme?.light;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .filter(Boolean)\n .join('\\n')}\n}\n\n[data-theme=\"glass\"] [data-chart=\"${id}\"],\n.dark [data-chart=\"${id}\"] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.dark || itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .filter(Boolean)\n .join('\\n')}\n}\n`,\n }}\n />\n );\n};\n\n// ========================================\n// CHART TOOLTIP\n// ========================================\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\ninterface TooltipPayloadItem {\n dataKey?: string | number;\n name?: string;\n value?: number;\n color?: string;\n payload?: Record<string, unknown>;\n fill?: string;\n type?: string;\n}\n\ninterface ChartTooltipContentProps {\n active?: boolean;\n payload?: TooltipPayloadItem[];\n label?: string;\n className?: string;\n labelClassName?: string;\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: 'line' | 'dot' | 'dashed';\n nameKey?: string;\n labelKey?: string;\n labelFormatter?: (label: string, payload: TooltipPayloadItem[]) => React.ReactNode;\n valueFormatter?: (value: number) => string;\n}\n\nconst ChartTooltipContent = React.forwardRef<HTMLDivElement, ChartTooltipContentProps>(\n (\n {\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n nameKey,\n labelKey,\n valueFormatter,\n },\n ref\n ) => {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item?.dataKey || item?.name || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label;\n\n if (labelFormatter && typeof label === 'string') {\n return (\n <div className={cn('font-medium', labelClassName)}>{labelFormatter(label, payload)}</div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-[var(--glass-border)] bg-[var(--glass-bg)] px-2.5 py-1.5 text-xs shadow-xl backdrop-blur-md',\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item: TooltipPayloadItem, index: number) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = item.fill || item.color;\n\n return (\n <div\n key={`${item.dataKey}-${index}`}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-[var(--text-muted)]',\n indicator === 'dot' && 'items-center'\n )}\n >\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent': indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n }\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center'\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-[var(--text-muted)]\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value !== undefined && (\n <span className=\"font-mono font-medium tabular-nums text-[var(--text-primary)]\">\n {valueFormatter ? valueFormatter(item.value) : item.value.toLocaleString()}\n </span>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n);\nChartTooltipContent.displayName = 'ChartTooltipContent';\n\n// ========================================\n// CHART LEGEND\n// ========================================\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\ninterface LegendPayloadItem {\n value?: string;\n dataKey?: string | number;\n color?: string;\n}\n\ninterface ChartLegendContentProps extends React.ComponentProps<'div'> {\n payload?: LegendPayloadItem[];\n verticalAlign?: 'top' | 'bottom';\n hideIcon?: boolean;\n nameKey?: string;\n}\n\nconst ChartLegendContent = React.forwardRef<HTMLDivElement, ChartLegendContentProps>(\n ({ className, hideIcon = false, payload, verticalAlign = 'bottom', nameKey }, ref) => {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-center gap-4',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className\n )}\n >\n {payload.map((item: LegendPayloadItem) => {\n const key = `${nameKey || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-[var(--text-muted)]'\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n }\n);\nChartLegendContent.displayName = 'ChartLegendContent';\n\n// ========================================\n// HELPER FUNCTIONS\n// ========================================\n\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (key in config) {\n return config[key];\n }\n\n if (payloadPayload && key in payloadPayload) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key];\n}\n\n// ========================================\n// EXPORTS\n// ========================================\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n useChart,\n};\n","/**\n * DropdownGlass CVA Variants\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport type DropdownAlign = 'left' | 'right';\n\nexport const dropdownAlign = cva('absolute mt-2 min-w-[160px] md:min-w-[200px] rounded-2xl py-1.5 md:py-2', {\n variants: {\n align: {\n left: 'left-0',\n right: 'right-0',\n },\n },\n defaultVariants: {\n align: 'left',\n },\n});\n","/**\n * Alert CVA Variants (shadcn/ui)\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport const alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n","/**\n * Badge CVA Variants (shadcn/ui)\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport const badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n","/**\n * Button CVA Variants (shadcn/ui)\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport const buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n"],"x_google_ignoreList":[2,3,4],"mappings":"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AAI,OAAO,OACT,QAAO,OAAO;AAGhB,KAAI,kBAAkB,OAAO,eAC3B,kBAAiB,eAAe;AAGlC,QAAO,kBAAkB,SAAS,OAAO,kBAAkB,OAAO;;ACzWpE,MAAa,gBAAgB,IAAI,2EAA2E;CAC1G,UAAU,EACR,OAAO;EACL,MAAM;EACN,OAAO;EACR,EACF;CACD,iBAAiB,EACf,OAAO,QACR;CACF,CAAC;ACZF,MAAa,kBAAgB,IAC3B,qOACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;ACdD,MAAa,kBAAgB,IAC3B,oZACA;CACE,UAAU,EACR,SAAS;EACP,SACE;EACF,WACE;EACF,aACE;EACF,SACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;ACnBD,MAAa,iBAAiB,IAC5B,+bACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,aACE;GACF,SACE;GACF,WACE;GACF,OACE;GACF,MAAM;GACP;EACD,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;GACN,WAAW;GACX,WAAW;GACZ;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF"}
1
+ {"version":3,"file":"index.js","names":["StepperRoot: FC<StepperRootProps>","indicatorStyles: CSSProperties","connectorStyles: CSSProperties","labelStyles: CSSProperties","descriptionStyles: CSSProperties","StepperContent: FC<StepperContentProps>","_extends","ownKeys","r","_objectSpread","_defineProperty","_toPropertyKey","_toPrimitive","r","configLabelKey: string"],"sources":["../src/lib/variants/stepper-glass-variants.ts","../src/components/glass/ui/stepper-glass.tsx","../node_modules/recharts/es6/component/DefaultLegendContent.js","../node_modules/recharts/es6/context/legendPayloadContext.js","../node_modules/recharts/es6/component/Legend.js","../src/components/ui/chart.tsx","../src/lib/variants/dropdown-glass-variants.ts","../src/lib/variants/tooltip-glass-variants.ts","../src/lib/variants/alert-variants.ts","../src/lib/variants/badge-variants.ts","../src/lib/variants/button-variants.ts"],"sourcesContent":["/**\n * StepperGlass CVA Variants\n *\n * Type-safe variant definitions for the StepperGlass compound component.\n * Extracted for Fast Refresh compatibility and reusability.\n *\n * @module stepper-glass-variants\n */\n\nimport { cva } from 'class-variance-authority';\n\n// ========================================\n// TYPE DEFINITIONS\n// ========================================\n\nexport type StepperOrientation = 'horizontal' | 'vertical';\nexport type StepperVariant = 'numbered' | 'icon' | 'dots';\nexport type StepperSize = 'sm' | 'md' | 'lg';\nexport type StepStatus = 'pending' | 'active' | 'completed' | 'disabled';\n\n// ========================================\n// ROOT VARIANTS\n// ========================================\n\nexport const stepperRootVariants = cva('flex w-full', {\n variants: {\n orientation: {\n horizontal: 'flex-col',\n vertical: 'flex-col',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// LIST VARIANTS\n// ========================================\n\nexport const stepperListVariants = cva('flex', {\n variants: {\n orientation: {\n horizontal: 'flex-row items-center w-full',\n vertical: 'flex-col gap-0',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// STEP CONTAINER VARIANTS\n// ========================================\n\nexport const stepperStepContainerVariants = cva('relative flex transition-all duration-300', {\n variants: {\n orientation: {\n horizontal: 'flex-col items-center flex-1',\n vertical: 'flex-row items-start gap-3',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// STEP INDICATOR VARIANTS\n// ========================================\n\nexport const stepperIndicatorVariants = cva(\n 'relative flex items-center justify-center rounded-full font-medium transition-all duration-300 shrink-0',\n {\n variants: {\n size: {\n sm: 'w-8 h-8 text-xs',\n md: 'w-10 h-10 text-sm',\n lg: 'w-12 h-12 text-base',\n },\n variant: {\n numbered: '',\n icon: '',\n dots: '',\n },\n },\n defaultVariants: {\n size: 'md',\n variant: 'numbered',\n },\n compoundVariants: [\n // Dots variant has smaller indicators\n { variant: 'dots', size: 'sm', className: '!w-2.5 !h-2.5' },\n { variant: 'dots', size: 'md', className: '!w-3 !h-3' },\n { variant: 'dots', size: 'lg', className: '!w-4 !h-4' },\n ],\n }\n);\n\n// ========================================\n// CONNECTOR VARIANTS\n// ========================================\n\nexport const stepperConnectorVariants = cva('transition-all duration-500 ease-out', {\n variants: {\n orientation: {\n horizontal: 'h-0.5 flex-1 mx-2 md:mx-3',\n vertical: 'w-0.5 min-h-6 ml-5 my-1',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// LABEL VARIANTS\n// ========================================\n\nexport const stepperLabelVariants = cva(\n 'font-medium transition-colors duration-300 whitespace-nowrap',\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n orientation: {\n horizontal: 'mt-2 text-center',\n vertical: '',\n },\n },\n defaultVariants: {\n size: 'md',\n orientation: 'horizontal',\n },\n }\n);\n\n// ========================================\n// DESCRIPTION VARIANTS\n// ========================================\n\nexport const stepperDescriptionVariants = cva('transition-colors duration-300', {\n variants: {\n size: {\n sm: 'text-[10px]',\n md: 'text-xs',\n lg: 'text-sm',\n },\n orientation: {\n horizontal: 'text-center max-w-[100px] md:max-w-[120px]',\n vertical: 'max-w-[200px]',\n },\n },\n defaultVariants: {\n size: 'md',\n orientation: 'horizontal',\n },\n});\n\n// ========================================\n// CONTENT VARIANTS\n// ========================================\n\nexport const stepperContentVariants = cva('animate-in fade-in-0 duration-200', {\n variants: {\n orientation: {\n horizontal: 'mt-6',\n vertical: 'mt-4',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * StepperGlass Component (Compound API)\n *\n * Glass-themed step indicator with:\n * - Theme-aware styling (glass/light/aurora)\n * - Horizontal and vertical orientations\n * - Numbered, icon, and dots variants\n * - Linear mode (lock future steps)\n * - Animated connector lines\n * - Compound component API for advanced composition\n *\n * @example\n * ```tsx\n * <StepperGlass.Root value=\"step2\" onValueChange={setStep}>\n * <StepperGlass.List>\n * <StepperGlass.Step value=\"step1\" label=\"Account\" description=\"Create your account\" />\n * <StepperGlass.Step value=\"step2\" label=\"Profile\" description=\"Setup your profile\" />\n * <StepperGlass.Step value=\"step3\" label=\"Complete\" description=\"Finish setup\" />\n * </StepperGlass.List>\n * <StepperGlass.Content value=\"step1\">Step 1 content</StepperGlass.Content>\n * <StepperGlass.Content value=\"step2\">Step 2 content</StepperGlass.Content>\n * <StepperGlass.Content value=\"step3\">Step 3 content</StepperGlass.Content>\n * </StepperGlass.Root>\n * ```\n *\n * @accessibility\n * - **Keyboard Navigation:** Arrow keys navigate between steps (WCAG 2.1.1)\n * - **Focus Management:** Visible focus ring using `--focus-glow` (WCAG 2.4.7)\n * - **Screen Readers:** Uses `role=\"tablist\"`, `role=\"tab\"` (WCAG 4.1.3)\n * - **ARIA Attributes:** `aria-current=\"step\"`, `aria-disabled` for state\n * - **Touch Targets:** 44x44px minimum touch targets (WCAG 2.5.5)\n * - **Color Contrast:** All states meet WCAG AA 4.5:1 ratio\n * - **Motion:** Respects `prefers-reduced-motion`\n */\n\nimport {\n forwardRef,\n createContext,\n useContext,\n useMemo,\n useState,\n useCallback,\n useLayoutEffect,\n type CSSProperties,\n type FC,\n type ReactNode,\n} from 'react';\nimport { cn } from '@/lib/utils';\nimport { useFocus } from '@/lib/hooks/use-focus';\nimport { Check } from 'lucide-react';\nimport {\n stepperRootVariants,\n stepperListVariants,\n stepperStepContainerVariants,\n stepperIndicatorVariants,\n stepperConnectorVariants,\n stepperLabelVariants,\n stepperDescriptionVariants,\n stepperContentVariants,\n type StepperOrientation,\n type StepperVariant,\n type StepperSize,\n type StepStatus,\n} from '@/lib/variants/stepper-glass-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// CONTEXT\n// ========================================\n\ninterface StepperContextValue {\n value: string;\n onValueChange?: (value: string) => void;\n orientation: StepperOrientation;\n variant: StepperVariant;\n size: StepperSize;\n linear: boolean;\n steps: string[];\n registerStep: (value: string, index: number) => void;\n unregisterStep: (value: string) => void;\n}\n\nconst StepperContext = createContext<StepperContextValue | null>(null);\n\nconst useStepperContext = () => {\n const context = useContext(StepperContext);\n if (!context) {\n throw new Error('Stepper compound components must be used within StepperGlass.Root');\n }\n return context;\n};\n\n// ========================================\n// UTILITY: GET STEP STATUS\n// ========================================\n\nfunction getStepStatus(\n stepValue: string,\n currentValue: string,\n steps: string[],\n linear: boolean,\n disabled?: boolean\n): StepStatus {\n if (disabled) return 'disabled';\n\n const stepIndex = steps.indexOf(stepValue);\n const currentIndex = steps.indexOf(currentValue);\n\n if (stepIndex === -1 || currentIndex === -1) return 'pending';\n if (stepIndex === currentIndex) return 'active';\n if (stepIndex < currentIndex) return 'completed';\n if (linear && stepIndex > currentIndex) return 'disabled';\n return 'pending';\n}\n\n// ========================================\n// ROOT COMPONENT\n// ========================================\n\ninterface StepperRootProps {\n /** Current active step value */\n value: string;\n /** Callback when step value changes */\n onValueChange?: (value: string) => void;\n /** Orientation of the stepper */\n orientation?: StepperOrientation;\n /** Visual variant */\n variant?: StepperVariant;\n /** Size of step indicators */\n size?: StepperSize;\n /** Lock future steps (require sequential completion) */\n linear?: boolean;\n /** Child components */\n children: ReactNode;\n /** Optional className */\n className?: string;\n}\n\nconst StepperRoot: FC<StepperRootProps> = ({\n value,\n onValueChange,\n orientation = 'horizontal',\n variant = 'numbered',\n size = 'md',\n linear = false,\n children,\n className,\n}) => {\n const [steps, setSteps] = useState<string[]>([]);\n\n const registerStep = useCallback((stepValue: string, index: number) => {\n setSteps((prev) => {\n if (prev.includes(stepValue)) return prev;\n const newSteps = [...prev];\n // Insert at correct position to maintain order\n newSteps.splice(index, 0, stepValue);\n return newSteps;\n });\n }, []);\n\n const unregisterStep = useCallback((stepValue: string) => {\n setSteps((prev) => prev.filter((s) => s !== stepValue));\n }, []);\n\n const contextValue = useMemo(\n () => ({\n value,\n onValueChange,\n orientation,\n variant,\n size,\n linear,\n steps,\n registerStep,\n unregisterStep,\n }),\n [value, onValueChange, orientation, variant, size, linear, steps, registerStep, unregisterStep]\n );\n\n return (\n <StepperContext.Provider value={contextValue}>\n <div\n className={cn(stepperRootVariants({ orientation }), className)}\n aria-label=\"Progress steps\"\n >\n {children}\n </div>\n </StepperContext.Provider>\n );\n};\n\n// ========================================\n// LIST COMPONENT\n// ========================================\n\ninterface StepperListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n className?: string;\n}\n\nconst StepperList = forwardRef<HTMLDivElement, StepperListProps>(\n ({ children, className, ...props }, ref) => {\n const { orientation } = useStepperContext();\n\n return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cn(stepperListVariants({ orientation }), className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nStepperList.displayName = 'StepperList';\n\n// ========================================\n// STEP COMPONENT\n// ========================================\n\ninterface StepperStepProps {\n /** Unique value for this step */\n value: string;\n /** Step label (required for accessibility) */\n label: string;\n /** Optional description */\n description?: string;\n /** Custom icon (for icon variant) */\n icon?: ReactNode;\n /** Completed icon override */\n completedIcon?: ReactNode;\n /** Force disabled state */\n disabled?: boolean;\n /** Optional className */\n className?: string;\n /** Step index for ordering (auto-detected) */\n index?: number;\n}\n\nconst StepperStep = forwardRef<HTMLButtonElement, StepperStepProps>(\n (\n {\n value: stepValue,\n label,\n description,\n icon,\n completedIcon,\n disabled: forcedDisabled,\n className,\n index: providedIndex,\n },\n ref\n ) => {\n const {\n value: currentValue,\n onValueChange,\n orientation,\n variant,\n size,\n linear,\n steps,\n registerStep,\n unregisterStep,\n } = useStepperContext();\n\n const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n\n // Track mount order for step registration\n const [mountIndex] = useState(() => providedIndex ?? Date.now());\n\n // Register step on mount\n // Use useLayoutEffect to register before paint\n useLayoutEffect(() => {\n registerStep(stepValue, mountIndex);\n return () => unregisterStep(stepValue);\n }, [stepValue, mountIndex, registerStep, unregisterStep]);\n\n const status = getStepStatus(stepValue, currentValue, steps, linear, forcedDisabled);\n const stepIndex = steps.indexOf(stepValue);\n const isLast = stepIndex === steps.length - 1;\n const isClickable = status !== 'disabled';\n\n // Styles based on status\n const indicatorStyles: CSSProperties = {\n background:\n status === 'completed'\n ? 'var(--stepper-step-completed-bg)'\n : status === 'active'\n ? 'var(--stepper-step-active-bg)'\n : status === 'disabled'\n ? 'var(--stepper-step-disabled-bg)'\n : 'var(--stepper-step-bg)',\n border: `2px solid ${\n status === 'completed'\n ? 'var(--stepper-step-completed-border)'\n : status === 'active'\n ? 'var(--stepper-step-active-border)'\n : status === 'disabled'\n ? 'var(--stepper-step-disabled-border)'\n : 'var(--stepper-step-border)'\n }`,\n color:\n status === 'completed'\n ? 'var(--stepper-step-completed-text)'\n : status === 'active'\n ? 'var(--stepper-step-active-text)'\n : status === 'disabled'\n ? 'var(--stepper-step-disabled-text)'\n : 'var(--stepper-step-text)',\n boxShadow:\n status === 'active'\n ? 'var(--stepper-step-active-glow)'\n : status === 'completed'\n ? 'var(--stepper-step-glow)'\n : isFocusVisible\n ? 'var(--focus-glow)'\n : 'none',\n backdropFilter: 'blur(var(--blur-sm))',\n };\n\n const connectorStyles: CSSProperties = {\n background:\n stepIndex < steps.indexOf(currentValue)\n ? 'var(--stepper-connector-active-bg)'\n : 'var(--stepper-connector-bg)',\n };\n\n const labelStyles: CSSProperties = {\n color:\n status === 'active' || status === 'completed'\n ? 'var(--stepper-label-text)'\n : 'var(--stepper-description-text)',\n };\n\n const descriptionStyles: CSSProperties = {\n color: 'var(--stepper-description-text)',\n };\n\n // Render indicator content\n const renderIndicatorContent = () => {\n if (status === 'completed') {\n if (completedIcon) return completedIcon;\n return <Check className=\"w-4 h-4\" />;\n }\n if (variant === 'icon' && icon) return icon;\n if (variant === 'dots') return null;\n // Numbered variant\n return stepIndex >= 0 ? stepIndex + 1 : '';\n };\n\n const handleClick = () => {\n if (isClickable && onValueChange) {\n onValueChange(stepValue);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isClickable) return;\n\n const stepList = e.currentTarget.closest('[role=\"tablist\"]');\n if (!stepList) return;\n\n const allSteps = Array.from(\n stepList.querySelectorAll('[role=\"tab\"]:not([aria-disabled=\"true\"])')\n ) as HTMLButtonElement[];\n const currentIdx = allSteps.indexOf(e.currentTarget as HTMLButtonElement);\n\n let nextIdx = currentIdx;\n const isHorizontal = orientation === 'horizontal';\n\n switch (e.key) {\n case isHorizontal ? 'ArrowRight' : 'ArrowDown':\n e.preventDefault();\n nextIdx = (currentIdx + 1) % allSteps.length;\n break;\n case isHorizontal ? 'ArrowLeft' : 'ArrowUp':\n e.preventDefault();\n nextIdx = currentIdx - 1 < 0 ? allSteps.length - 1 : currentIdx - 1;\n break;\n case 'Home':\n e.preventDefault();\n nextIdx = 0;\n break;\n case 'End':\n e.preventDefault();\n nextIdx = allSteps.length - 1;\n break;\n default:\n return;\n }\n\n const nextStep = allSteps[nextIdx];\n if (nextStep) {\n nextStep.focus();\n const nextValue = nextStep.getAttribute('data-value');\n if (nextValue && onValueChange) {\n onValueChange(nextValue);\n }\n }\n };\n\n // For horizontal, we need step + connector inline\n // For vertical, step is a row with connector below\n if (orientation === 'horizontal') {\n return (\n <>\n <div className={cn(stepperStepContainerVariants({ orientation }), className)}>\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n aria-selected={status === 'active'}\n aria-disabled={!isClickable}\n aria-current={status === 'active' ? 'step' : undefined}\n data-value={stepValue}\n data-status={status}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onFocus={focusProps.onFocus}\n onBlur={focusProps.onBlur}\n disabled={!isClickable}\n className={cn(\n stepperIndicatorVariants({ size, variant }),\n !isClickable && 'cursor-not-allowed opacity-60',\n isClickable && 'cursor-pointer hover:scale-105',\n // Ensure minimum touch target\n 'min-w-[44px] min-h-[44px]'\n )}\n style={indicatorStyles}\n >\n {renderIndicatorContent()}\n </button>\n\n {label && (\n <div className=\"flex flex-col items-center\">\n <span\n className={cn(stepperLabelVariants({ size, orientation }))}\n style={labelStyles}\n >\n {label}\n </span>\n {description && (\n <span\n className={cn(stepperDescriptionVariants({ size, orientation }))}\n style={descriptionStyles}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Connector line between steps */}\n {!isLast && (\n <div\n className={cn(stepperConnectorVariants({ orientation }))}\n style={connectorStyles}\n aria-hidden=\"true\"\n />\n )}\n </>\n );\n }\n\n // Vertical orientation\n return (\n <div className=\"flex flex-col\">\n <div className={cn(stepperStepContainerVariants({ orientation }), className)}>\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n aria-selected={status === 'active'}\n aria-disabled={!isClickable}\n aria-current={status === 'active' ? 'step' : undefined}\n data-value={stepValue}\n data-status={status}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onFocus={focusProps.onFocus}\n onBlur={focusProps.onBlur}\n disabled={!isClickable}\n className={cn(\n stepperIndicatorVariants({ size, variant }),\n !isClickable && 'cursor-not-allowed opacity-60',\n isClickable && 'cursor-pointer hover:scale-105',\n 'min-w-[44px] min-h-[44px]'\n )}\n style={indicatorStyles}\n >\n {renderIndicatorContent()}\n </button>\n\n {label && (\n <div className=\"flex flex-col justify-center\">\n <span className={cn(stepperLabelVariants({ size, orientation }))} style={labelStyles}>\n {label}\n </span>\n {description && (\n <span\n className={cn(stepperDescriptionVariants({ size, orientation }))}\n style={descriptionStyles}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n\n {/* Vertical connector */}\n {!isLast && (\n <div\n className={cn(stepperConnectorVariants({ orientation }))}\n style={connectorStyles}\n aria-hidden=\"true\"\n />\n )}\n </div>\n );\n }\n);\n\nStepperStep.displayName = 'StepperStep';\n\n// ========================================\n// CONTENT COMPONENT\n// ========================================\n\ninterface StepperContentProps {\n /** Value of the step this content belongs to */\n value: string;\n /** Content to display when step is active */\n children: ReactNode;\n /** Optional className */\n className?: string;\n}\n\nconst StepperContent: FC<StepperContentProps> = ({ value, children, className }) => {\n const { value: currentValue, orientation } = useStepperContext();\n const isActive = currentValue === value;\n\n if (!isActive) return null;\n\n return (\n <div\n role=\"tabpanel\"\n aria-hidden={!isActive}\n className={cn(stepperContentVariants({ orientation }), className)}\n >\n {children}\n </div>\n );\n};\n\n// ========================================\n// EXPORT COMPOUND COMPONENT\n// ========================================\n\nexport const StepperGlass = {\n Root: StepperRoot,\n List: StepperList,\n Step: StepperStep,\n Content: StepperContent,\n};\n\n// Also export individual components for flexibility\nexport { StepperRoot, StepperList, StepperStep, StepperContent };\n\n// Re-export types\nexport type {\n StepperRootProps,\n StepperListProps,\n StepperStepProps,\n StepperContentProps,\n StepperOrientation,\n StepperVariant,\n StepperSize,\n StepStatus,\n};\n","function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @fileOverview Default Legend Content\n */\nimport * as React from 'react';\nimport { clsx } from 'clsx';\nimport { Surface } from '../container/Surface';\nimport { Symbols } from '../shape/Symbols';\nimport { adaptEventsOfChild } from '../util/types';\nimport { resolveDefaultProps } from '../util/resolveDefaultProps';\nvar SIZE = 32;\nvar defaultLegendContentDefaultProps = {\n align: 'center',\n iconSize: 14,\n inactiveColor: '#ccc',\n layout: 'horizontal',\n verticalAlign: 'middle'\n};\nfunction Icon(_ref) {\n var {\n data,\n iconType,\n inactiveColor\n } = _ref;\n var halfSize = SIZE / 2;\n var sixthSize = SIZE / 6;\n var thirdSize = SIZE / 3;\n var color = data.inactive ? inactiveColor : data.color;\n var preferredIcon = iconType !== null && iconType !== void 0 ? iconType : data.type;\n if (preferredIcon === 'none') {\n return null;\n }\n if (preferredIcon === 'plainline') {\n var _data$payload;\n return /*#__PURE__*/React.createElement(\"line\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n strokeDasharray: (_data$payload = data.payload) === null || _data$payload === void 0 ? void 0 : _data$payload.strokeDasharray,\n x1: 0,\n y1: halfSize,\n x2: SIZE,\n y2: halfSize,\n className: \"recharts-legend-icon\"\n });\n }\n if (preferredIcon === 'line') {\n return /*#__PURE__*/React.createElement(\"path\", {\n strokeWidth: 4,\n fill: \"none\",\n stroke: color,\n d: \"M0,\".concat(halfSize, \"h\").concat(thirdSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n H\").concat(SIZE, \"M\").concat(2 * thirdSize, \",\").concat(halfSize, \"\\n A\").concat(sixthSize, \",\").concat(sixthSize, \",0,1,1,\").concat(thirdSize, \",\").concat(halfSize),\n className: \"recharts-legend-icon\"\n });\n }\n if (preferredIcon === 'rect') {\n return /*#__PURE__*/React.createElement(\"path\", {\n stroke: \"none\",\n fill: color,\n d: \"M0,\".concat(SIZE / 8, \"h\").concat(SIZE, \"v\").concat(SIZE * 3 / 4, \"h\").concat(-SIZE, \"z\"),\n className: \"recharts-legend-icon\"\n });\n }\n if (/*#__PURE__*/React.isValidElement(data.legendIcon)) {\n var iconProps = _objectSpread({}, data);\n delete iconProps.legendIcon;\n return /*#__PURE__*/React.cloneElement(data.legendIcon, iconProps);\n }\n return /*#__PURE__*/React.createElement(Symbols, {\n fill: color,\n cx: halfSize,\n cy: halfSize,\n size: SIZE,\n sizeType: \"diameter\",\n type: preferredIcon\n });\n}\nfunction Items(props) {\n var {\n payload,\n iconSize,\n layout,\n formatter,\n inactiveColor,\n iconType\n } = props;\n var viewBox = {\n x: 0,\n y: 0,\n width: SIZE,\n height: SIZE\n };\n var itemStyle = {\n display: layout === 'horizontal' ? 'inline-block' : 'block',\n marginRight: 10\n };\n var svgStyle = {\n display: 'inline-block',\n verticalAlign: 'middle',\n marginRight: 4\n };\n return payload.map((entry, i) => {\n var finalFormatter = entry.formatter || formatter;\n var className = clsx({\n 'recharts-legend-item': true,\n [\"legend-item-\".concat(i)]: true,\n inactive: entry.inactive\n });\n if (entry.type === 'none') {\n return null;\n }\n var color = entry.inactive ? inactiveColor : entry.color;\n var finalValue = finalFormatter ? finalFormatter(entry.value, entry, i) : entry.value;\n return /*#__PURE__*/React.createElement(\"li\", _extends({\n className: className,\n style: itemStyle,\n key: \"legend-item-\".concat(i)\n }, adaptEventsOfChild(props, entry, i)), /*#__PURE__*/React.createElement(Surface, {\n width: iconSize,\n height: iconSize,\n viewBox: viewBox,\n style: svgStyle,\n \"aria-label\": \"\".concat(finalValue, \" legend icon\")\n }, /*#__PURE__*/React.createElement(Icon, {\n data: entry,\n iconType: iconType,\n inactiveColor: inactiveColor\n })), /*#__PURE__*/React.createElement(\"span\", {\n className: \"recharts-legend-item-text\",\n style: {\n color\n }\n }, finalValue));\n });\n}\nexport var DefaultLegendContent = outsideProps => {\n var props = resolveDefaultProps(outsideProps, defaultLegendContentDefaultProps);\n var {\n payload,\n layout,\n align\n } = props;\n if (!payload || !payload.length) {\n return null;\n }\n var finalStyle = {\n padding: 0,\n margin: 0,\n textAlign: layout === 'horizontal' ? align : 'left'\n };\n return /*#__PURE__*/React.createElement(\"ul\", {\n className: \"recharts-default-legend\",\n style: finalStyle\n }, /*#__PURE__*/React.createElement(Items, _extends({}, props, {\n payload: payload\n })));\n};","import { useAppSelector } from '../state/hooks';\nimport { selectLegendPayload } from '../state/selectors/legendSelectors';\n\n/**\n * Use this hook in Legend, or anywhere else where you want to read the current Legend items.\n * @return all Legend items ready to be rendered\n */\nexport function useLegendPayload() {\n return useAppSelector(selectLegendPayload);\n}","var _excluded = [\"contextPayload\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\nimport * as React from 'react';\nimport { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLegendPortal } from '../context/legendPortalContext';\nimport { DefaultLegendContent } from './DefaultLegendContent';\nimport { isNumber } from '../util/DataUtils';\nimport { getUniqPayload } from '../util/payload/getUniqPayload';\nimport { useLegendPayload } from '../context/legendPayloadContext';\nimport { useElementOffset } from '../util/useElementOffset';\nimport { useChartHeight, useChartWidth, useMargin } from '../context/chartLayoutContext';\nimport { setLegendSettings, setLegendSize } from '../state/legendSlice';\nimport { useAppDispatch } from '../state/hooks';\nimport { resolveDefaultProps } from '../util/resolveDefaultProps';\nfunction defaultUniqBy(entry) {\n return entry.value;\n}\nfunction LegendContent(props) {\n var {\n contextPayload\n } = props,\n otherProps = _objectWithoutProperties(props, _excluded);\n var finalPayload = getUniqPayload(contextPayload, props.payloadUniqBy, defaultUniqBy);\n var contentProps = _objectSpread(_objectSpread({}, otherProps), {}, {\n payload: finalPayload\n });\n if (/*#__PURE__*/React.isValidElement(props.content)) {\n return /*#__PURE__*/React.cloneElement(props.content, contentProps);\n }\n if (typeof props.content === 'function') {\n return /*#__PURE__*/React.createElement(props.content, contentProps);\n }\n return /*#__PURE__*/React.createElement(DefaultLegendContent, contentProps);\n}\nfunction getDefaultPosition(style, props, margin, chartWidth, chartHeight, box) {\n var {\n layout,\n align,\n verticalAlign\n } = props;\n var hPos, vPos;\n if (!style || (style.left === undefined || style.left === null) && (style.right === undefined || style.right === null)) {\n if (align === 'center' && layout === 'vertical') {\n hPos = {\n left: ((chartWidth || 0) - box.width) / 2\n };\n } else {\n hPos = align === 'right' ? {\n right: margin && margin.right || 0\n } : {\n left: margin && margin.left || 0\n };\n }\n }\n if (!style || (style.top === undefined || style.top === null) && (style.bottom === undefined || style.bottom === null)) {\n if (verticalAlign === 'middle') {\n vPos = {\n top: ((chartHeight || 0) - box.height) / 2\n };\n } else {\n vPos = verticalAlign === 'bottom' ? {\n bottom: margin && margin.bottom || 0\n } : {\n top: margin && margin.top || 0\n };\n }\n }\n return _objectSpread(_objectSpread({}, hPos), vPos);\n}\nfunction LegendSettingsDispatcher(props) {\n var dispatch = useAppDispatch();\n useEffect(() => {\n dispatch(setLegendSettings(props));\n }, [dispatch, props]);\n return null;\n}\nfunction LegendSizeDispatcher(props) {\n var dispatch = useAppDispatch();\n useEffect(() => {\n dispatch(setLegendSize(props));\n return () => {\n dispatch(setLegendSize({\n width: 0,\n height: 0\n }));\n };\n }, [dispatch, props]);\n return null;\n}\nfunction getWidthOrHeight(layout, height, width, maxWidth) {\n if (layout === 'vertical' && isNumber(height)) {\n return {\n height\n };\n }\n if (layout === 'horizontal') {\n return {\n width: width || maxWidth\n };\n }\n return null;\n}\nexport var legendDefaultProps = {\n align: 'center',\n iconSize: 14,\n itemSorter: 'value',\n layout: 'horizontal',\n verticalAlign: 'bottom'\n};\nexport function Legend(outsideProps) {\n var props = resolveDefaultProps(outsideProps, legendDefaultProps);\n var contextPayload = useLegendPayload();\n var legendPortalFromContext = useLegendPortal();\n var margin = useMargin();\n var {\n width: widthFromProps,\n height: heightFromProps,\n wrapperStyle,\n portal: portalFromProps\n } = props;\n // The contextPayload is not used directly inside the hook, but we need the onBBoxUpdate call\n // when the payload changes, therefore it's here as a dependency.\n var [lastBoundingBox, updateBoundingBox] = useElementOffset([contextPayload]);\n var chartWidth = useChartWidth();\n var chartHeight = useChartHeight();\n if (chartWidth == null || chartHeight == null) {\n return null;\n }\n var maxWidth = chartWidth - ((margin === null || margin === void 0 ? void 0 : margin.left) || 0) - ((margin === null || margin === void 0 ? void 0 : margin.right) || 0);\n var widthOrHeight = getWidthOrHeight(props.layout, heightFromProps, widthFromProps, maxWidth);\n // if the user supplies their own portal, only use their defined wrapper styles\n var outerStyle = portalFromProps ? wrapperStyle : _objectSpread(_objectSpread({\n position: 'absolute',\n width: (widthOrHeight === null || widthOrHeight === void 0 ? void 0 : widthOrHeight.width) || widthFromProps || 'auto',\n height: (widthOrHeight === null || widthOrHeight === void 0 ? void 0 : widthOrHeight.height) || heightFromProps || 'auto'\n }, getDefaultPosition(wrapperStyle, props, margin, chartWidth, chartHeight, lastBoundingBox)), wrapperStyle);\n var legendPortal = portalFromProps !== null && portalFromProps !== void 0 ? portalFromProps : legendPortalFromContext;\n if (legendPortal == null || contextPayload == null) {\n return null;\n }\n var legendElement = /*#__PURE__*/React.createElement(\"div\", {\n className: \"recharts-legend-wrapper\",\n style: outerStyle,\n ref: updateBoundingBox\n }, /*#__PURE__*/React.createElement(LegendSettingsDispatcher, {\n layout: props.layout,\n align: props.align,\n verticalAlign: props.verticalAlign,\n itemSorter: props.itemSorter\n }), !portalFromProps && /*#__PURE__*/React.createElement(LegendSizeDispatcher, {\n width: lastBoundingBox.width,\n height: lastBoundingBox.height\n }), /*#__PURE__*/React.createElement(LegendContent, _extends({}, props, widthOrHeight, {\n margin: margin,\n chartWidth: chartWidth,\n chartHeight: chartHeight,\n contextPayload: contextPayload\n })));\n return /*#__PURE__*/createPortal(legendElement, legendPortal);\n}\nLegend.displayName = 'Legend';","/* eslint-disable react-refresh/only-export-components */\n// ========================================\n// CHART COMPONENTS (shadcn/ui pattern)\n// Base chart utilities following shadcn/ui Charts API\n// ========================================\n\nimport * as React from 'react';\nimport * as RechartsPrimitive from 'recharts';\n\nimport { cn } from '@/lib/utils';\n\n// ========================================\n// CHART CONFIG TYPE\n// ========================================\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode;\n icon?: React.ComponentType;\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: { light: string; dark: string } }\n );\n};\n\n// ========================================\n// CHART CONTEXT\n// ========================================\n\ntype ChartContextProps = {\n config: ChartConfig;\n};\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null);\n\nfunction useChart() {\n const context = React.useContext(ChartContext);\n\n if (!context) {\n throw new Error('useChart must be used within a <ChartContainer />');\n }\n\n return context;\n}\n\n// ========================================\n// CHART CONTAINER\n// ========================================\n\ninterface ChartContainerProps\n extends React.ComponentProps<'div'>, Pick<ChartContextProps, 'config'> {\n children: React.ComponentProps<typeof RechartsPrimitive.ResponsiveContainer>['children'];\n}\n\nconst ChartContainer = React.forwardRef<HTMLDivElement, ChartContainerProps>(\n ({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId();\n const chartId = `chart-${id || uniqueId.replace(/:/g, '')}`;\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-[var(--text-muted)] [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-[var(--glass-border)] [&_.recharts-curve.recharts-tooltip-cursor]:stroke-[var(--glass-border)] [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-[var(--glass-border)] [&_.recharts-radial-bar-background-sector]:fill-[var(--glass-frost-5)] [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-[var(--glass-frost-10)] [&_.recharts-reference-line_[stroke='#ccc']]:stroke-[var(--glass-border)] [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>{children}</RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n );\n }\n);\nChartContainer.displayName = 'ChartContainer';\n\n// ========================================\n// CHART STYLE (CSS Variables injection)\n// ========================================\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, itemConfig]) => itemConfig.color || itemConfig.theme\n );\n\n if (!colorConfig.length) {\n return null;\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: `\n[data-chart=\"${id}\"] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.color || itemConfig.theme?.light;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .filter(Boolean)\n .join('\\n')}\n}\n\n[data-theme=\"glass\"] [data-chart=\"${id}\"],\n.dark [data-chart=\"${id}\"] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color = itemConfig.theme?.dark || itemConfig.color;\n return color ? ` --color-${key}: ${color};` : null;\n })\n .filter(Boolean)\n .join('\\n')}\n}\n`,\n }}\n />\n );\n};\n\n// ========================================\n// CHART TOOLTIP\n// ========================================\n\nconst ChartTooltip = RechartsPrimitive.Tooltip;\n\ninterface TooltipPayloadItem {\n dataKey?: string | number;\n name?: string;\n value?: number;\n color?: string;\n payload?: Record<string, unknown>;\n fill?: string;\n type?: string;\n}\n\ninterface ChartTooltipContentProps {\n active?: boolean;\n payload?: TooltipPayloadItem[];\n label?: string;\n className?: string;\n labelClassName?: string;\n hideLabel?: boolean;\n hideIndicator?: boolean;\n indicator?: 'line' | 'dot' | 'dashed';\n nameKey?: string;\n labelKey?: string;\n labelFormatter?: (label: string, payload: TooltipPayloadItem[]) => React.ReactNode;\n valueFormatter?: (value: number) => string;\n}\n\nconst ChartTooltipContent = React.forwardRef<HTMLDivElement, ChartTooltipContentProps>(\n (\n {\n active,\n payload,\n className,\n indicator = 'dot',\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n nameKey,\n labelKey,\n valueFormatter,\n },\n ref\n ) => {\n const { config } = useChart();\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null;\n }\n\n const [item] = payload;\n const key = `${labelKey || item?.dataKey || item?.name || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const value =\n !labelKey && typeof label === 'string'\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label;\n\n if (labelFormatter && typeof label === 'string') {\n return (\n <div className={cn('font-medium', labelClassName)}>{labelFormatter(label, payload)}</div>\n );\n }\n\n if (!value) {\n return null;\n }\n\n return <div className={cn('font-medium', labelClassName)}>{value}</div>;\n }, [label, labelFormatter, payload, hideLabel, labelClassName, config, labelKey]);\n\n if (!active || !payload?.length) {\n return null;\n }\n\n const nestLabel = payload.length === 1 && indicator !== 'dot';\n\n return (\n <div\n ref={ref}\n className={cn(\n 'grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-[var(--glass-border)] bg-[var(--glass-bg)] px-2.5 py-1.5 text-xs shadow-xl backdrop-blur-md',\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload.map((item: TooltipPayloadItem, index: number) => {\n const key = `${nameKey || item.name || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n const indicatorColor = item.fill || item.color;\n\n return (\n <div\n key={`${item.dataKey}-${index}`}\n className={cn(\n 'flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-[var(--text-muted)]',\n indicator === 'dot' && 'items-center'\n )}\n >\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n 'shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]',\n {\n 'h-2.5 w-2.5': indicator === 'dot',\n 'w-1': indicator === 'line',\n 'w-0 border-[1.5px] border-dashed bg-transparent': indicator === 'dashed',\n 'my-0.5': nestLabel && indicator === 'dashed',\n }\n )}\n style={\n {\n '--color-bg': indicatorColor,\n '--color-border': indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n 'flex flex-1 justify-between leading-none',\n nestLabel ? 'items-end' : 'items-center'\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-[var(--text-muted)]\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value !== undefined && (\n <span className=\"font-mono font-medium tabular-nums text-[var(--text-primary)]\">\n {valueFormatter ? valueFormatter(item.value) : item.value.toLocaleString()}\n </span>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n);\nChartTooltipContent.displayName = 'ChartTooltipContent';\n\n// ========================================\n// CHART LEGEND\n// ========================================\n\nconst ChartLegend = RechartsPrimitive.Legend;\n\ninterface LegendPayloadItem {\n value?: string;\n dataKey?: string | number;\n color?: string;\n}\n\ninterface ChartLegendContentProps extends React.ComponentProps<'div'> {\n payload?: LegendPayloadItem[];\n verticalAlign?: 'top' | 'bottom';\n hideIcon?: boolean;\n nameKey?: string;\n}\n\nconst ChartLegendContent = React.forwardRef<HTMLDivElement, ChartLegendContentProps>(\n ({ className, hideIcon = false, payload, verticalAlign = 'bottom', nameKey }, ref) => {\n const { config } = useChart();\n\n if (!payload?.length) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex items-center justify-center gap-4',\n verticalAlign === 'top' ? 'pb-3' : 'pt-3',\n className\n )}\n >\n {payload.map((item: LegendPayloadItem) => {\n const key = `${nameKey || item.dataKey || 'value'}`;\n const itemConfig = getPayloadConfigFromPayload(config, item, key);\n\n return (\n <div\n key={item.value}\n className={cn(\n 'flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-[var(--text-muted)]'\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n );\n })}\n </div>\n );\n }\n);\nChartLegendContent.displayName = 'ChartLegendContent';\n\n// ========================================\n// HELPER FUNCTIONS\n// ========================================\n\nfunction getPayloadConfigFromPayload(config: ChartConfig, payload: unknown, key: string) {\n if (typeof payload !== 'object' || payload === null) {\n return undefined;\n }\n\n const payloadPayload =\n 'payload' in payload && typeof payload.payload === 'object' && payload.payload !== null\n ? payload.payload\n : undefined;\n\n let configLabelKey: string = key;\n\n if (key in config) {\n return config[key];\n }\n\n if (payloadPayload && key in payloadPayload) {\n configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string;\n }\n\n return configLabelKey in config ? config[configLabelKey] : config[key];\n}\n\n// ========================================\n// EXPORTS\n// ========================================\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n useChart,\n};\n","/**\n * DropdownGlass CVA Variants\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport type DropdownAlign = 'left' | 'right';\n\nexport const dropdownAlign = cva('absolute mt-2 min-w-[160px] md:min-w-[200px] rounded-2xl py-1.5 md:py-2', {\n variants: {\n align: {\n left: 'left-0',\n right: 'right-0',\n },\n },\n defaultVariants: {\n align: 'left',\n },\n});\n","/**\n * TooltipGlass CVA Variants\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nexport const tooltipPositions = cva(\n 'absolute z-50 px-2 py-1 md:px-3 md:py-1.5 rounded-lg text-[10px] md:text-xs font-medium whitespace-nowrap transition-opacity duration-200',\n {\n variants: {\n position: {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',\n left: 'right-full top-1/2 -translate-y-1/2 mr-2',\n right: 'left-full top-1/2 -translate-y-1/2 ml-2',\n },\n },\n defaultVariants: {\n position: 'top',\n },\n }\n);\n","/**\n * Alert CVA Variants (shadcn/ui)\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport const alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n","/**\n * Badge CVA Variants (shadcn/ui)\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport const badgeVariants = cva(\n \"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n destructive:\n \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n","/**\n * Button CVA Variants (shadcn/ui)\n * Extracted for Fast Refresh compatibility\n */\n\nimport { cva } from 'class-variance-authority';\n\nexport const buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n \"icon-sm\": \"size-8\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n"],"x_google_ignoreList":[2,3,4],"mappings":"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AAI,OAAO,OACT,QAAO,OAAO;AAGhB,KAAI,kBAAkB,OAAO,eAC3B,kBAAiB,eAAe;AAGlC,QAAO,kBAAkB,SAAS,OAAO,kBAAkB,OAAO;;ACzWpE,MAAa,gBAAgB,IAAI,2EAA2E;CAC1G,UAAU,EACR,OAAO;EACL,MAAM;EACN,OAAO;EACR,EACF;CACD,iBAAiB,EACf,OAAO,QACR;CACF,CAAC;ACVF,MAAa,mBAAmB,IAC9B,6IACA;CACE,UAAU,EACR,UAAU;EACR,KAAK;EACL,QAAQ;EACR,MAAM;EACN,OAAO;EACR,EACF;CACD,iBAAiB,EACf,UAAU,OACX;CACF,CACF;ACjBD,MAAa,kBAAgB,IAC3B,qOACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;ACdD,MAAa,kBAAgB,IAC3B,oZACA;CACE,UAAU,EACR,SAAS;EACP,SACE;EACF,WACE;EACF,aACE;EACF,SACE;EACH,EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACF,CACF;ACnBD,MAAa,iBAAiB,IAC5B,+bACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,aACE;GACF,SACE;GACF,WACE;GACF,OACE;GACF,MAAM;GACP;EACD,MAAM;GACJ,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;GACN,WAAW;GACX,WAAW;GACZ;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF"}
@@ -6,6 +6,7 @@
6
6
  "description": "Glass-themed alert with:",
7
7
  "dependencies": [
8
8
  "class-variance-authority",
9
+ "lucide-react",
9
10
  "react"
10
11
  ],
11
12
  "registryDependencies": [
@@ -17,7 +18,7 @@
17
18
  {
18
19
  "path": "components/glass/ui/alert-glass.tsx",
19
20
  "type": "registry:component",
20
- "content": "/**\n * AlertGlass Component\n *\n * Glass-themed alert with:\n * - Theme-aware styling via CSS variables (glass/light/aurora)\n * - shadcn/ui compatible variants (default, destructive)\n * - Extended Glass UI variants (success, warning)\n * - Optional title\n * - Dismissible option\n * - Backdrop blur effect\n */\n\nimport { forwardRef, type ReactNode, type CSSProperties } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport {\n Info,\n CheckCircle,\n AlertTriangle,\n AlertCircle,\n X,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { alertVariants } from '@/lib/variants/alert-glass-variants';\nimport { ICON_SIZES } from '@/components/glass/primitives';\nimport '@/glass-theme.css';\n\nimport type { AlertVariant } from '@/lib/variants/alert-glass-variants';\n\n// ========================================\n// ICON MAP\n// ========================================\n\nconst iconMap: Record<AlertVariant, typeof Info> = {\n default: Info,\n destructive: AlertCircle,\n success: CheckCircle,\n warning: AlertTriangle,\n // Aliases\n info: Info,\n error: AlertCircle,\n};\n\n// ========================================\n// CSS VARIABLE HELPERS\n// ========================================\n\ntype AlertStyleVars = { bg: string; border: string; text: string };\n\nconst variantStyles: Record<AlertVariant, AlertStyleVars> = {\n // shadcn/ui compatible variants\n default: {\n bg: 'var(--alert-default-bg)',\n border: 'var(--alert-default-border)',\n text: 'var(--alert-default-text)',\n },\n destructive: {\n bg: 'var(--alert-destructive-bg)',\n border: 'var(--alert-destructive-border)',\n text: 'var(--alert-destructive-text)',\n },\n // Glass UI extended variants\n success: {\n bg: 'var(--alert-success-bg)',\n border: 'var(--alert-success-border)',\n text: 'var(--alert-success-text)',\n },\n warning: {\n bg: 'var(--alert-warning-bg)',\n border: 'var(--alert-warning-border)',\n text: 'var(--alert-warning-text)',\n },\n // Backward compatibility aliases\n info: {\n bg: 'var(--alert-default-bg)',\n border: 'var(--alert-default-border)',\n text: 'var(--alert-default-text)',\n },\n error: {\n bg: 'var(--alert-destructive-bg)',\n border: 'var(--alert-destructive-border)',\n text: 'var(--alert-destructive-text)',\n },\n};\n\nconst getAlertStyles = (variant: AlertVariant): CSSProperties => {\n const config = variantStyles[variant];\n return {\n background: config.bg,\n border: `1px solid ${config.border}`,\n };\n};\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the AlertGlass component\n *\n * A glass-themed alert with semantic variants, dismissible option, and automatic icon selection.\n * Features theme-aware styling and WCAG-compliant role attributes.\n *\n * @accessibility\n * - **Keyboard Navigation:** Dismissible alerts include a keyboard-accessible close button (Tab + Enter/Space)\n * - **Focus Management:** Close button receives visible focus ring (WCAG 2.4.7)\n * - **Screen Readers:** Uses `role=\"alert\"` for immediate announcement to screen readers (WCAG 4.1.3)\n * - **Icon Semantics:** Icons are decorative and hidden from screen readers with `aria-hidden=\"true\"`\n * - **Variant Semantics:** Each variant uses distinct colors and icons for multi-modal communication (color + icon)\n * - **Touch Targets:** Dismiss button meets minimum 44x44px touch target (WCAG 2.5.5)\n * - **Color Contrast:** All variant text and backgrounds meet WCAG AA contrast ratio 4.5:1\n * - **Motion:** Transitions respect `prefers-reduced-motion` settings\n *\n * @example\n * ```tsx\n * // Basic alert (info/default variant)\n * <AlertGlass title=\"Information\" variant=\"default\">\n * This is an informational message\n * </AlertGlass>\n *\n * // Error alert with aria-live for dynamic updates\n * <AlertGlass variant=\"destructive\" title=\"Error\" aria-live=\"assertive\">\n * Your session has expired. Please log in again.\n * </AlertGlass>\n *\n * // Success alert\n * <AlertGlass variant=\"success\" title=\"Success\">\n * Your changes have been saved successfully.\n * </AlertGlass>\n *\n * // Warning alert\n * <AlertGlass variant=\"warning\" title=\"Warning\">\n * Your subscription expires in 3 days.\n * </AlertGlass>\n *\n * // Dismissible alert with accessible close button\n * <AlertGlass\n * variant=\"default\"\n * title=\"Welcome\"\n * dismissible\n * onDismiss={() => setShowAlert(false)}\n * >\n * Check out our new features!\n * </AlertGlass>\n *\n * // Alert without title\n * <AlertGlass variant=\"destructive\">\n * Quick error message without title\n * </AlertGlass>\n *\n * // Form validation alert\n * <form onSubmit={handleSubmit}>\n * {formError && (\n * <AlertGlass variant=\"destructive\" title=\"Validation Error\" role=\"alert\">\n * {formError}\n * </AlertGlass>\n * )}\n * <InputGlass label=\"Email\" />\n * <ButtonGlass type=\"submit\">Submit</ButtonGlass>\n * </form>\n * ```\n */\nexport interface AlertGlassProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style' | 'title'>,\n VariantProps<typeof alertVariants> {\n readonly title?: string;\n readonly children: ReactNode;\n readonly dismissible?: boolean;\n readonly onDismiss?: () => void;\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const AlertGlass = forwardRef<HTMLDivElement, AlertGlassProps>(\n (\n {\n className,\n variant = 'default',\n title,\n children,\n dismissible,\n onDismiss,\n ...props\n },\n ref\n ) => {\n // Ensure variant is never null/undefined for type safety\n const effectiveVariant: AlertVariant = variant ?? 'default';\n\n const config = variantStyles[effectiveVariant];\n const Icon = iconMap[effectiveVariant];\n\n return (\n <div\n ref={ref}\n className={cn(alertVariants({ variant: effectiveVariant }), className)}\n style={getAlertStyles(effectiveVariant)}\n role=\"alert\"\n {...props}\n >\n <Icon\n className=\"w-4 h-4 md:w-5 md:h-5 flex-shrink-0 mt-0.5\"\n style={{ color: config.text }}\n />\n <div className=\"flex-1\">\n {title && (\n <p\n className=\"font-medium text-xs md:text-sm mb-0.5 md:mb-1\"\n style={{ color: config.text }}\n >\n {title}\n </p>\n )}\n <p className=\"text-xs md:text-sm opacity-80\" style={{ color: config.text }}>\n {children}\n </p>\n </div>\n {dismissible && (\n <button\n onClick={onDismiss}\n className=\"p-0.5 md:p-1 rounded transition-colors duration-200 hover:bg-black/5 flex-shrink-0\"\n aria-label=\"Dismiss alert\"\n >\n <X className={ICON_SIZES.md} style={{ color: config.text }} />\n </button>\n )}\n </div>\n );\n }\n);\n\nAlertGlass.displayName = 'AlertGlass';\n"
21
+ "content": "/**\n * AlertGlass Component\n *\n * Glass-themed alert with:\n * - Theme-aware styling via CSS variables (glass/light/aurora)\n * - shadcn/ui compatible variants (default, destructive)\n * - Extended Glass UI variants (success, warning)\n * - Compound component API for flexible composition\n * - Dismissible option\n * - Backdrop blur effect\n *\n * @example Compound API (recommended)\n * ```tsx\n * <AlertGlass variant=\"default\">\n * <AlertGlassTitle>Heads up!</AlertGlassTitle>\n * <AlertGlassDescription>\n * You can add components to your app using the cli.\n * </AlertGlassDescription>\n * </AlertGlass>\n * ```\n *\n * @example With dismiss button\n * ```tsx\n * <AlertGlass variant=\"destructive\" dismissible onDismiss={() => setShow(false)}>\n * <AlertGlassTitle>Error</AlertGlassTitle>\n * <AlertGlassDescription>\n * Your session has expired.\n * </AlertGlassDescription>\n * </AlertGlass>\n * ```\n */\n\n'use client';\n\nimport { forwardRef, type CSSProperties } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\nimport { Info, CheckCircle, AlertTriangle, AlertCircle, X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { alertVariants } from '@/lib/variants/alert-glass-variants';\nimport { ICON_SIZES } from '@/components/glass/primitives';\nimport '@/glass-theme.css';\n\nimport type { AlertVariant } from '@/lib/variants/alert-glass-variants';\n\n// ========================================\n// ICON MAP\n// ========================================\n\nconst iconMap: Record<AlertVariant, typeof Info> = {\n default: Info,\n destructive: AlertCircle,\n success: CheckCircle,\n warning: AlertTriangle,\n // Aliases\n info: Info,\n error: AlertCircle,\n};\n\n// ========================================\n// CSS VARIABLE HELPERS\n// ========================================\n\ntype AlertStyleVars = { bg: string; border: string; text: string };\n\nconst variantStyles: Record<AlertVariant, AlertStyleVars> = {\n // shadcn/ui compatible variants\n default: {\n bg: 'var(--alert-default-bg)',\n border: 'var(--alert-default-border)',\n text: 'var(--alert-default-text)',\n },\n destructive: {\n bg: 'var(--alert-destructive-bg)',\n border: 'var(--alert-destructive-border)',\n text: 'var(--alert-destructive-text)',\n },\n // Glass UI extended variants\n success: {\n bg: 'var(--alert-success-bg)',\n border: 'var(--alert-success-border)',\n text: 'var(--alert-success-text)',\n },\n warning: {\n bg: 'var(--alert-warning-bg)',\n border: 'var(--alert-warning-border)',\n text: 'var(--alert-warning-text)',\n },\n // Backward compatibility aliases\n info: {\n bg: 'var(--alert-default-bg)',\n border: 'var(--alert-default-border)',\n text: 'var(--alert-default-text)',\n },\n error: {\n bg: 'var(--alert-destructive-bg)',\n border: 'var(--alert-destructive-border)',\n text: 'var(--alert-destructive-text)',\n },\n};\n\nconst getAlertStyles = (variant: AlertVariant): CSSProperties => {\n const config = variantStyles[variant];\n return {\n background: config.bg,\n border: `1px solid ${config.border}`,\n color: config.text,\n };\n};\n\n// ========================================\n// COMPOUND COMPONENT: ROOT\n// ========================================\n\nexport interface AlertGlassProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>, VariantProps<typeof alertVariants> {\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nconst AlertGlassRoot = forwardRef<HTMLDivElement, AlertGlassProps>(\n ({ className, variant = 'default', dismissible, onDismiss, children, ...props }, ref) => {\n const effectiveVariant: AlertVariant = variant ?? 'default';\n const Icon = iconMap[effectiveVariant];\n const config = variantStyles[effectiveVariant];\n\n return (\n <div\n ref={ref}\n className={cn(alertVariants({ variant: effectiveVariant }), className)}\n style={getAlertStyles(effectiveVariant)}\n role=\"alert\"\n {...props}\n >\n <Icon\n className=\"w-4 h-4 md:w-5 md:h-5 shrink-0 mt-0.5\"\n style={{ color: config.text }}\n aria-hidden=\"true\"\n />\n <div className=\"flex-1\">{children}</div>\n {dismissible && (\n <button\n onClick={onDismiss}\n className=\"p-0.5 md:p-1 rounded transition-colors duration-200 hover:bg-black/5 shrink-0\"\n aria-label=\"Dismiss alert\"\n >\n <X className={ICON_SIZES.md} style={{ color: config.text }} />\n </button>\n )}\n </div>\n );\n }\n);\n\nAlertGlassRoot.displayName = 'AlertGlass';\n\n// ========================================\n// COMPOUND COMPONENT: TITLE\n// ========================================\n\nexport type AlertGlassTitleProps = React.HTMLAttributes<HTMLParagraphElement>;\n\nconst AlertGlassTitle = forwardRef<HTMLParagraphElement, AlertGlassTitleProps>(\n ({ className, style, ...props }, ref) => {\n return (\n <p\n ref={ref}\n className={cn('font-medium text-xs md:text-sm mb-0.5 md:mb-1', className)}\n style={{ color: 'inherit', ...style }}\n {...props}\n />\n );\n }\n);\n\nAlertGlassTitle.displayName = 'AlertGlassTitle';\n\n// ========================================\n// COMPOUND COMPONENT: DESCRIPTION\n// ========================================\n\nexport type AlertGlassDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\nconst AlertGlassDescription = forwardRef<HTMLParagraphElement, AlertGlassDescriptionProps>(\n ({ className, style, ...props }, ref) => {\n return (\n <p\n ref={ref}\n className={cn('text-xs md:text-sm opacity-80', className)}\n style={{ color: 'inherit', ...style }}\n {...props}\n />\n );\n }\n);\n\nAlertGlassDescription.displayName = 'AlertGlassDescription';\n\n// ========================================\n// EXPORTS\n// ========================================\n\n// Compound API (shadcn/ui pattern)\nexport const AlertGlass = AlertGlassRoot;\nexport { AlertGlassTitle, AlertGlassDescription };\n"
21
22
  }
22
23
  ],
23
24
  "categories": [
@@ -5,8 +5,7 @@
5
5
  "title": "Avatar Glass",
6
6
  "description": "Glass-themed avatar with:",
7
7
  "dependencies": [
8
- "@radix-ui/react-slot",
9
- "class-variance-authority",
8
+ "@radix-ui/react-avatar",
10
9
  "react"
11
10
  ],
12
11
  "registryDependencies": [
@@ -18,7 +17,7 @@
18
17
  {
19
18
  "path": "components/glass/ui/avatar-glass.tsx",
20
19
  "type": "registry:component",
21
- "content": "/**\n * AvatarGlass Component\n *\n * Glass-themed avatar with:\n * - Theme-aware styling (glass/light/aurora)\n * - Glow effect on hover\n * - Status indicator with glow\n * - Size variants\n */\n\nimport { forwardRef, type CSSProperties } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps } from 'class-variance-authority';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { avatarSizes, statusSizes } from '@/lib/variants/avatar-glass-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\n/**\n * Avatar status indicator type\n */\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the AvatarGlass component\n *\n * A glass-themed avatar component with status indicators and size variants.\n * Displays user initials with theme-aware styling and optional status badge.\n *\n * @example\n * ```tsx\n * // Basic avatar\n * <AvatarGlass name=\"John Doe\" />\n *\n * // With status indicator\n * <AvatarGlass name=\"Jane Smith\" status=\"online\" size=\"lg\" />\n *\n * // Different sizes\n * <AvatarGlass name=\"Alex\" size=\"sm\" />\n * <AvatarGlass name=\"Sam\" size=\"xl\" />\n *\n * // As a link (asChild pattern)\n * <AvatarGlass asChild name=\"Sarah Connor\" status=\"online\">\n * <a href=\"/profile/sarah\">View Profile</a>\n * </AvatarGlass>\n * ```\n */\nexport interface AvatarGlassProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>, VariantProps<typeof avatarSizes> {\n /**\n * Render as child element instead of div (polymorphic rendering).\n * Useful for making avatars clickable links.\n * @default false\n * @example\n * ```tsx\n * <AvatarGlass asChild name=\"John\">\n * <a href=\"/profile\">View Profile</a>\n * </AvatarGlass>\n * ```\n */\n readonly asChild?: boolean;\n\n /**\n * Full name of the user. Automatically generates initials (first 2 letters).\n * @example \"John Doe\" \"JD\"\n */\n readonly name: string;\n\n /**\n * Optional status indicator with glow effect\n * @default undefined\n */\n readonly status?: AvatarStatus;\n\n /**\n * Size variant of the avatar\n * @default \"md\"\n */\n readonly size?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\n// ========================================\n// HELPERS\n// ========================================\n\nconst getInitials = (name: string): string => {\n if (!name || name.trim().length === 0) return '?';\n return name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n};\n\n// ========================================\n// COMPONENT\n// ========================================\n\n// Status colors mapping to CSS variables\nconst getStatusVars = (statusType: AvatarStatus): { bg: string; glow: string } => {\n const statusVars: Record<AvatarStatus, { bg: string; glow: string }> = {\n online: { bg: 'var(--status-online)', glow: 'var(--status-online-glow)' },\n offline: { bg: 'var(--status-offline)', glow: 'none' },\n busy: { bg: 'var(--status-busy)', glow: 'var(--status-busy-glow)' },\n away: { bg: 'var(--status-away)', glow: 'var(--status-away-glow)' },\n };\n return statusVars[statusType];\n};\n\nexport const AvatarGlass = forwardRef<HTMLDivElement, AvatarGlassProps>(\n ({ asChild = false, name, size = 'md', status, className, ...props }, ref) => {\n const { isHovered, hoverProps } = useHover();\n\n const avatarStyles: CSSProperties = {\n background: 'var(--avatar-bg)',\n border: '2px solid var(--avatar-border)',\n boxShadow: isHovered ? 'var(--avatar-hover-glow)' : 'var(--avatar-shadow)',\n color: 'var(--text-inverse)',\n };\n\n const initials = getInitials(name);\n\n // Polymorphic component - render as Slot when asChild is true\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n className={cn('relative inline-flex', className)}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n {...props}\n >\n {/* Avatar circle */}\n <div\n className={cn(avatarSizes({ size }))}\n style={avatarStyles}\n role=\"img\"\n aria-label={`Avatar for ${name}`}\n >\n {initials}\n </div>\n\n {/* Status indicator */}\n {status && (\n <span\n className={cn(statusSizes({ size }))}\n style={{\n background: getStatusVars(status).bg,\n boxShadow: getStatusVars(status).glow,\n }}\n role=\"status\"\n aria-label={`Status: ${status}`}\n />\n )}\n </Comp>\n );\n }\n);\n\nAvatarGlass.displayName = 'AvatarGlass';\n"
20
+ "content": "/**\n * AvatarGlass Component\n *\n * Glass-themed avatar with:\n * - Theme-aware styling (glass/light/aurora)\n * - Glow effect on hover\n * - Optional glow-pulse animation\n * - Status indicator with glow\n * - Size variants\n * - Built on Radix UI primitives\n *\n * @example Compound API (recommended)\n * ```tsx\n * <AvatarGlass size=\"md\">\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n *\n * @example With status indicator\n * ```tsx\n * <AvatarGlass size=\"lg\" status=\"online\">\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n *\n * @example With glow animation\n * ```tsx\n * <AvatarGlass size=\"xl\" glowing>\n * <AvatarGlassImage src=\"/avatar.jpg\" alt=\"User\" />\n * <AvatarGlassFallback>JD</AvatarGlassFallback>\n * </AvatarGlass>\n * ```\n */\n\n'use client';\n\nimport * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { avatarSizes, statusSizes } from '@/lib/variants/avatar-glass-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport type AvatarStatus = 'online' | 'offline' | 'busy' | 'away';\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\n// ========================================\n// HELPERS\n// ========================================\n\nconst getStatusVars = (statusType: AvatarStatus): { bg: string; glow: string } => {\n const statusVars: Record<AvatarStatus, { bg: string; glow: string }> = {\n online: { bg: 'var(--status-online)', glow: 'var(--status-online-glow)' },\n offline: { bg: 'var(--status-offline)', glow: 'none' },\n busy: { bg: 'var(--status-busy)', glow: 'var(--status-busy-glow)' },\n away: { bg: 'var(--status-away)', glow: 'var(--status-away-glow)' },\n };\n return statusVars[statusType];\n};\n\n// ========================================\n// CONTEXT\n// ========================================\n\ninterface AvatarGlassContextValue {\n size: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n}\n\nconst AvatarGlassContext = React.createContext<AvatarGlassContextValue>({\n size: 'md',\n});\n\n// ========================================\n// COMPOUND COMPONENT: ROOT\n// ========================================\n\ninterface AvatarGlassRootProps extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> {\n size?: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n}\n\nconst AvatarGlassRoot = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n AvatarGlassRootProps\n>(({ className, size = 'md', status, glowing = false, children, ...props }, ref) => {\n const { isHovered, hoverProps } = useHover();\n\n const avatarStyles: React.CSSProperties = {\n background: 'var(--avatar-bg)',\n border: '3px solid var(--avatar-border)',\n boxShadow: isHovered ? 'var(--avatar-hover-glow)' : 'var(--avatar-shadow)',\n color: 'var(--text-inverse)',\n };\n\n return (\n <AvatarGlassContext.Provider value={{ size, status, glowing }}>\n <div\n className={cn('relative inline-flex', className)}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n >\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n avatarSizes({ size }),\n glowing && 'animate-[glow-pulse_2s_ease-in-out_infinite]'\n )}\n style={avatarStyles}\n {...props}\n >\n {children}\n </AvatarPrimitive.Root>\n\n {/* Status indicator */}\n {status && (\n <span\n className={cn(statusSizes({ size }))}\n style={{\n background: getStatusVars(status).bg,\n boxShadow: getStatusVars(status).glow,\n }}\n role=\"status\"\n aria-label={`Status: ${status}`}\n />\n )}\n </div>\n </AvatarGlassContext.Provider>\n );\n});\n\nAvatarGlassRoot.displayName = 'AvatarGlass';\n\n// ========================================\n// COMPOUND COMPONENT: IMAGE\n// ========================================\n\ntype AvatarGlassImageProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>;\n\nconst AvatarGlassImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n AvatarGlassImageProps\n>(({ className, ...props }, ref) => {\n return (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full object-cover', className)}\n {...props}\n />\n );\n});\n\nAvatarGlassImage.displayName = 'AvatarGlassImage';\n\n// ========================================\n// COMPOUND COMPONENT: FALLBACK\n// ========================================\n\ntype AvatarGlassFallbackProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>;\n\nconst AvatarGlassFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n AvatarGlassFallbackProps\n>(({ className, ...props }, ref) => {\n return (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center font-semibold uppercase',\n className\n )}\n {...props}\n />\n );\n});\n\nAvatarGlassFallback.displayName = 'AvatarGlassFallback';\n\n// ========================================\n// HELPER FUNCTION (for simple use cases)\n// ========================================\n\nconst getInitials = (name: string): string => {\n if (!name || name.trim().length === 0) return '?';\n return name\n .split(' ')\n .map((part) => part[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n};\n\n// ========================================\n// SIMPLE WRAPPER (backward compatibility)\n// ========================================\n\ninterface AvatarGlassSimpleProps {\n name: string;\n size?: AvatarSize;\n status?: AvatarStatus;\n glowing?: boolean;\n className?: string;\n}\n\nconst AvatarGlassSimple: React.FC<AvatarGlassSimpleProps> = ({\n name,\n size = 'md',\n status,\n glowing,\n className,\n}) => {\n return (\n <AvatarGlassRoot size={size} status={status} glowing={glowing} className={className}>\n <AvatarGlassFallback>{getInitials(name)}</AvatarGlassFallback>\n </AvatarGlassRoot>\n );\n};\n\n// ========================================\n// EXPORTS\n// ========================================\n\n// Compound API (shadcn/ui pattern)\nexport const AvatarGlass = AvatarGlassRoot;\nexport { AvatarGlassImage, AvatarGlassFallback };\n\n// Simple wrapper (backward compatibility)\nexport { AvatarGlassSimple };\n"
22
21
  }
23
22
  ],
24
23
  "categories": [
@@ -20,7 +20,7 @@
20
20
  {
21
21
  "path": "components/glass/ui/button-glass.tsx",
22
22
  "type": "registry:component",
23
- "content": "/**\n * ButtonGlass Component\n *\n * Glass-themed button with:\n * - Theme-aware styling via CSS variables (glass/light/aurora)\n * - Glow effects on hover\n * - Ripple effect on click (JS)\n * - Shine animation for primary variant (JS)\n * - Loading state with spinner\n * - Icon support (left/right position)\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useEffect,\n useRef,\n type MouseEvent,\n type CSSProperties,\n} from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps } from 'class-variance-authority';\nimport { RefreshCw, type LucideIcon } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { useFocus } from '@/lib/hooks/use-focus';\nimport { buttonGlassVariants, type ButtonGlassVariant } from '@/lib/variants/button-glass-variants';\nimport { ICON_SIZES } from '@/components/glass/primitives';\nimport '@/glass-theme.css';\n\n// ========================================\n// CSS VARIABLE STYLE MAPS\n// ========================================\n\nconst getVariantStyles = (\n variant: ButtonGlassVariant,\n isHovered: boolean,\n isFocusVisible: boolean\n): CSSProperties => {\n const baseStyles: Record<ButtonGlassVariant, CSSProperties> = {\n primary: {\n background: isHovered\n ? 'var(--btn-primary-hover-bg)'\n : 'var(--btn-primary-bg)',\n color: 'var(--btn-primary-text)',\n border: 'none',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-primary-glow)'\n : '0 4px 15px oklch(48.5% 0.26 283 / 0.25)',\n },\n secondary: {\n background: isHovered\n ? 'var(--btn-secondary-hover-bg)'\n : 'var(--btn-secondary-bg)',\n color: 'var(--btn-secondary-text)',\n border: '1px solid var(--btn-secondary-border)',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-secondary-glow)'\n : 'none',\n },\n ghost: {\n background: isHovered\n ? 'var(--btn-ghost-hover-bg)'\n : 'var(--btn-ghost-bg)',\n color: 'var(--btn-ghost-text)',\n border: 'none',\n boxShadow: isFocusVisible ? 'var(--focus-glow)' : 'none',\n },\n destructive: {\n background: 'var(--btn-destructive-bg)',\n color: 'var(--btn-destructive-text)',\n border: 'none',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-destructive-glow)'\n : '0 4px 15px oklch(62.8% 0.225 29 / 0.25)',\n },\n success: {\n background: 'var(--btn-success-bg)',\n color: 'var(--btn-success-text)',\n border: 'none',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-success-glow)'\n : '0 4px 15px oklch(70.7% 0.143 167 / 0.25)',\n },\n text: {\n background: 'transparent',\n color: 'var(--text-secondary)',\n border: 'none',\n boxShadow: isFocusVisible ? 'var(--focus-glow)' : 'none',\n },\n };\n\n return baseStyles[variant];\n};\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the ButtonGlass component\n *\n * A glass-themed button with ripple effects, loading states, and icon support.\n * Features theme-aware styling and hover animations.\n *\n * @accessibility\n * - **Keyboard Navigation:** Fully keyboard accessible with native `<button>` element\n * - **Focus Management:** Visible focus ring using `--focus-glow` CSS variable (WCAG 2.4.7)\n * - **Screen Readers:** Semantic `<button>` element, disabled state announced automatically\n * - **Loading State:** When loading=true, button is disabled and loading spinner is visible\n * - **Touch Targets:** Minimum 44x44px touch target (WCAG 2.5.5) via size variants\n * - **Color Contrast:** All variants meet WCAG AA contrast ratio 4.5:1 minimum\n * - **Motion:** Respects `prefers-reduced-motion` for ripple/shine animations\n *\n * @example\n * ```tsx\n * // Basic button\n * <ButtonGlass variant=\"primary\">Click me</ButtonGlass>\n *\n * // With icon and aria-label for icon-only buttons\n * <ButtonGlass icon={Check} iconPosition=\"left\">Save</ButtonGlass>\n * <ButtonGlass icon={X} size=\"icon\" aria-label=\"Close dialog\" />\n *\n * // Loading state (automatically disables and shows spinner)\n * <ButtonGlass loading aria-live=\"polite\">Processing...</ButtonGlass>\n *\n * // Different variants\n * <ButtonGlass variant=\"ghost\">Cancel</ButtonGlass>\n * <ButtonGlass variant=\"success\">Confirm</ButtonGlass>\n * <ButtonGlass variant=\"destructive\">Delete</ButtonGlass>\n *\n * // As a link (asChild pattern) - maintains semantic HTML\n * <ButtonGlass asChild variant=\"primary\">\n * <a href=\"/dashboard\">Go to Dashboard</a>\n * </ButtonGlass>\n *\n * // With Next.js Link\n * <ButtonGlass asChild variant=\"ghost\">\n * <Link href=\"/settings\">Settings</Link>\n * </ButtonGlass>\n *\n * // Form submit button\n * <ButtonGlass type=\"submit\" variant=\"primary\">\n * Submit Form\n * </ButtonGlass>\n * ```\n */\nexport interface ButtonGlassProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'style'>,\n VariantProps<typeof buttonGlassVariants> {\n /**\n * Render as child element instead of button (polymorphic rendering).\n * Useful for rendering buttons as links or other interactive elements.\n *\n * **Note:** When using `asChild`, decorative effects (ripple, shine, glow)\n * are disabled to maintain compatibility with Radix UI Slot.\n * Only styles and event handlers are passed to the child element.\n *\n * @default false\n * @example\n * ```tsx\n * <ButtonGlass asChild>\n * <a href=\"/about\">About Us</a>\n * </ButtonGlass>\n * ```\n */\n readonly asChild?: boolean;\n\n /**\n * Visual style variant of the button\n * @default \"primary\"\n */\n readonly variant?: ButtonGlassVariant;\n\n /**\n * Show loading spinner and disable interactions\n * @default false\n */\n readonly loading?: boolean;\n\n /**\n * Icon component from lucide-react to display\n * @example icon={Check}\n */\n readonly icon?: LucideIcon;\n\n /**\n * Position of the icon relative to button text\n * @default \"left\"\n */\n readonly iconPosition?: 'left' | 'right';\n\n /**\n * Size variant of the button\n * @default \"md\"\n */\n readonly size?: 'sm' | 'md' | 'lg' | 'icon';\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const ButtonGlass = forwardRef<HTMLButtonElement, ButtonGlassProps>(\n (\n {\n asChild = false,\n className,\n variant = 'primary',\n size = 'md',\n children,\n loading = false,\n disabled,\n icon: Icon,\n iconPosition = 'left',\n onClick,\n ...props\n },\n ref\n ) => {\n const { isHovered, hoverProps } = useHover();\n const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n const [ripple, setRipple] = useState<{ x: number; y: number } | null>(null);\n\n const isDisabled = disabled || loading;\n const rippleTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup ripple timeout on unmount\n useEffect(() => {\n return () => {\n if (rippleTimeoutRef.current) {\n clearTimeout(rippleTimeoutRef.current);\n }\n };\n }, []);\n\n // Ripple effect handler\n const handleClick = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n if (isDisabled) return;\n\n // Create ripple effect\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setRipple({ x, y });\n\n // Clear previous timeout if exists\n if (rippleTimeoutRef.current) {\n clearTimeout(rippleTimeoutRef.current);\n }\n\n rippleTimeoutRef.current = setTimeout(() => {\n setRipple(null);\n rippleTimeoutRef.current = null;\n }, 600);\n\n onClick?.(e);\n },\n [isDisabled, onClick]\n );\n\n // Polymorphic component - render as Slot when asChild is true\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={ref}\n className={cn(\n buttonGlassVariants({ variant, size }),\n isHovered && !isDisabled && 'scale-[1.02]',\n className\n )}\n style={{\n ...getVariantStyles(variant, isHovered && !isDisabled, isFocusVisible && !isDisabled),\n outline: 'none',\n }}\n type={asChild ? undefined : 'button'}\n disabled={isDisabled}\n onClick={handleClick}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n onFocus={focusProps.onFocus}\n onBlur={focusProps.onBlur}\n {...props}\n >\n {/* When asChild is true, only render children (Slot expects a single child) */}\n {asChild ? (\n children\n ) : (\n <>\n {/* Shine effect on hover for primary */}\n {isHovered && variant === 'primary' && !isDisabled && (\n <div\n className=\"absolute inset-0 overflow-hidden pointer-events-none\"\n style={{ borderRadius: 'inherit' }}\n >\n <div\n className=\"absolute top-0 h-full w-1/3 bg-linear-to-r from-transparent via-white/20 to-transparent\"\n style={{ animation: 'btn-shine 1.5s ease-in-out infinite' }}\n />\n </div>\n )}\n\n {/* Ripple effect */}\n {ripple && (\n <span\n className=\"absolute rounded-full bg-white/30 pointer-events-none\"\n style={{\n left: ripple.x,\n top: ripple.y,\n width: 10,\n height: 10,\n transform: 'translate(-50%, -50%)',\n animation: 'ripple 0.6s ease-out',\n }}\n />\n )}\n\n {/* Pulsing glow on hover */}\n {isHovered && variant === 'primary' && !isDisabled && (\n <div\n className=\"absolute inset-0 rounded-xl animate-glow-pulse pointer-events-none\"\n style={{\n background:\n 'radial-gradient(circle, oklch(100% 0 0 / 0.1) 0%, transparent 70%)',\n }}\n />\n )}\n\n {/* Loading spinner */}\n {loading && <RefreshCw className={cn(ICON_SIZES.md, 'animate-spin')} />}\n\n {/* Icon left */}\n {!loading && Icon && iconPosition === 'left' && (\n <Icon className={ICON_SIZES.md} />\n )}\n\n {/* Content */}\n {!loading && children}\n\n {/* Icon right */}\n {!loading && Icon && iconPosition === 'right' && (\n <Icon className={ICON_SIZES.md} />\n )}\n </>\n )}\n </Comp>\n );\n }\n);\n\nButtonGlass.displayName = 'ButtonGlass';\n"
23
+ "content": "/**\n * ButtonGlass Component\n *\n * Glass-themed button with:\n * - Theme-aware styling via CSS variables (glass/light/aurora)\n * - Glow effects on hover\n * - Ripple effect on click (JS)\n * - Shine animation for primary variant (JS)\n * - Loading state with spinner\n * - Icon support (left/right position)\n */\n\nimport {\n forwardRef,\n useState,\n useCallback,\n useEffect,\n useRef,\n type MouseEvent,\n type CSSProperties,\n} from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps } from 'class-variance-authority';\nimport { RefreshCw, type LucideIcon } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useHover } from '@/lib/hooks/use-hover';\nimport { useFocus } from '@/lib/hooks/use-focus';\nimport { buttonGlassVariants, type ButtonGlassVariant } from '@/lib/variants/button-glass-variants';\nimport { ICON_SIZES } from '@/components/glass/primitives';\nimport '@/glass-theme.css';\n\n// ========================================\n// CSS VARIABLE STYLE MAPS\n// ========================================\n\nconst getVariantStyles = (\n variant: ButtonGlassVariant,\n isHovered: boolean,\n isFocusVisible: boolean\n): CSSProperties => {\n const baseStyles: Record<ButtonGlassVariant, CSSProperties> = {\n primary: {\n background: isHovered ? 'var(--btn-primary-hover-bg)' : 'var(--btn-primary-bg)',\n color: 'var(--btn-primary-text)',\n border: 'none',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-primary-glow)'\n : 'var(--btn-primary-shadow)',\n },\n secondary: {\n background: isHovered ? 'var(--btn-secondary-hover-bg)' : 'var(--btn-secondary-bg)',\n color: 'var(--btn-secondary-text)',\n border: '1px solid var(--btn-secondary-border)',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-secondary-glow)'\n : 'none',\n },\n ghost: {\n background: isHovered ? 'var(--btn-ghost-hover-bg)' : 'var(--btn-ghost-bg)',\n color: 'var(--btn-ghost-text)',\n border: 'none',\n boxShadow: isFocusVisible ? 'var(--focus-glow)' : 'none',\n },\n destructive: {\n background: 'var(--btn-destructive-bg)',\n color: 'var(--btn-destructive-text)',\n border: 'none',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-destructive-glow)'\n : 'var(--btn-destructive-shadow)',\n },\n success: {\n background: 'var(--btn-success-bg)',\n color: 'var(--btn-success-text)',\n border: 'none',\n boxShadow: isFocusVisible\n ? 'var(--focus-glow)'\n : isHovered\n ? 'var(--btn-success-glow)'\n : 'var(--btn-success-shadow)',\n },\n text: {\n background: 'transparent',\n color: 'var(--text-secondary)',\n border: 'none',\n boxShadow: isFocusVisible ? 'var(--focus-glow)' : 'none',\n },\n };\n\n return baseStyles[variant];\n};\n\n// ========================================\n// PROPS INTERFACE\n// ========================================\n\n/**\n * Props for the ButtonGlass component\n *\n * A glass-themed button with ripple effects, loading states, and icon support.\n * Features theme-aware styling and hover animations.\n *\n * @accessibility\n * - **Keyboard Navigation:** Fully keyboard accessible with native `<button>` element\n * - **Focus Management:** Visible focus ring using `--focus-glow` CSS variable (WCAG 2.4.7)\n * - **Screen Readers:** Semantic `<button>` element, disabled state announced automatically\n * - **Loading State:** When loading=true, button is disabled and loading spinner is visible\n * - **Touch Targets:** Minimum 44x44px touch target (WCAG 2.5.5) via size variants\n * - **Color Contrast:** All variants meet WCAG AA contrast ratio 4.5:1 minimum\n * - **Motion:** Respects `prefers-reduced-motion` for ripple/shine animations\n *\n * @example\n * ```tsx\n * // Basic button\n * <ButtonGlass variant=\"primary\">Click me</ButtonGlass>\n *\n * // With icon and aria-label for icon-only buttons\n * <ButtonGlass icon={Check} iconPosition=\"left\">Save</ButtonGlass>\n * <ButtonGlass icon={X} size=\"icon\" aria-label=\"Close dialog\" />\n *\n * // Loading state (automatically disables and shows spinner)\n * <ButtonGlass loading aria-live=\"polite\">Processing...</ButtonGlass>\n *\n * // Different variants\n * <ButtonGlass variant=\"ghost\">Cancel</ButtonGlass>\n * <ButtonGlass variant=\"success\">Confirm</ButtonGlass>\n * <ButtonGlass variant=\"destructive\">Delete</ButtonGlass>\n *\n * // As a link (asChild pattern) - maintains semantic HTML\n * <ButtonGlass asChild variant=\"primary\">\n * <a href=\"/dashboard\">Go to Dashboard</a>\n * </ButtonGlass>\n *\n * // With Next.js Link\n * <ButtonGlass asChild variant=\"ghost\">\n * <Link href=\"/settings\">Settings</Link>\n * </ButtonGlass>\n *\n * // Form submit button\n * <ButtonGlass type=\"submit\" variant=\"primary\">\n * Submit Form\n * </ButtonGlass>\n * ```\n */\nexport interface ButtonGlassProps\n extends\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'style'>,\n VariantProps<typeof buttonGlassVariants> {\n /**\n * Render as child element instead of button (polymorphic rendering).\n * Useful for rendering buttons as links or other interactive elements.\n *\n * **Note:** When using `asChild`, decorative effects (ripple, shine, glow)\n * are disabled to maintain compatibility with Radix UI Slot.\n * Only styles and event handlers are passed to the child element.\n *\n * @default false\n * @example\n * ```tsx\n * <ButtonGlass asChild>\n * <a href=\"/about\">About Us</a>\n * </ButtonGlass>\n * ```\n */\n readonly asChild?: boolean;\n\n /**\n * Visual style variant of the button\n * @default \"primary\"\n */\n readonly variant?: ButtonGlassVariant;\n\n /**\n * Show loading spinner and disable interactions\n * @default false\n */\n readonly loading?: boolean;\n\n /**\n * Icon component from lucide-react to display\n * @example icon={Check}\n */\n readonly icon?: LucideIcon;\n\n /**\n * Position of the icon relative to button text\n * @default \"left\"\n */\n readonly iconPosition?: 'left' | 'right';\n\n /**\n * Size variant of the button\n * @default \"md\"\n */\n readonly size?: 'sm' | 'md' | 'lg' | 'icon';\n}\n\n// ========================================\n// COMPONENT\n// ========================================\n\nexport const ButtonGlass = forwardRef<HTMLButtonElement, ButtonGlassProps>(\n (\n {\n asChild = false,\n className,\n variant = 'primary',\n size = 'md',\n children,\n loading = false,\n disabled,\n icon: Icon,\n iconPosition = 'left',\n onClick,\n ...props\n },\n ref\n ) => {\n const { isHovered, hoverProps } = useHover();\n const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });\n const [ripple, setRipple] = useState<{ x: number; y: number } | null>(null);\n\n const isDisabled = disabled || loading;\n const rippleTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Cleanup ripple timeout on unmount\n useEffect(() => {\n return () => {\n if (rippleTimeoutRef.current) {\n clearTimeout(rippleTimeoutRef.current);\n }\n };\n }, []);\n\n // Ripple effect handler\n const handleClick = useCallback(\n (e: MouseEvent<HTMLButtonElement>) => {\n if (isDisabled) return;\n\n // Create ripple effect\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n setRipple({ x, y });\n\n // Clear previous timeout if exists\n if (rippleTimeoutRef.current) {\n clearTimeout(rippleTimeoutRef.current);\n }\n\n rippleTimeoutRef.current = setTimeout(() => {\n setRipple(null);\n rippleTimeoutRef.current = null;\n }, 600);\n\n onClick?.(e);\n },\n [isDisabled, onClick]\n );\n\n // Polymorphic component - render as Slot when asChild is true\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={ref}\n className={cn(\n buttonGlassVariants({ variant, size }),\n isHovered && !isDisabled && 'scale-[1.02]',\n className\n )}\n style={{\n ...getVariantStyles(variant, isHovered && !isDisabled, isFocusVisible && !isDisabled),\n outline: 'none',\n }}\n type={asChild ? undefined : 'button'}\n disabled={isDisabled}\n onClick={handleClick}\n onMouseEnter={hoverProps.onMouseEnter}\n onMouseLeave={hoverProps.onMouseLeave}\n onFocus={focusProps.onFocus}\n onBlur={focusProps.onBlur}\n {...props}\n >\n {/* When asChild is true, only render children (Slot expects a single child) */}\n {asChild ? (\n children\n ) : (\n <>\n {/* Shine effect on hover for primary */}\n {isHovered && variant === 'primary' && !isDisabled && (\n <div\n className=\"absolute inset-0 overflow-hidden pointer-events-none\"\n style={{ borderRadius: 'inherit' }}\n >\n <div\n className=\"absolute top-0 h-full w-1/3 bg-linear-to-r from-transparent via-white/20 to-transparent\"\n style={{ animation: 'btn-shine 1.5s ease-in-out infinite' }}\n />\n </div>\n )}\n\n {/* Ripple effect */}\n {ripple && (\n <span\n className=\"absolute rounded-full bg-white/30 pointer-events-none\"\n style={{\n left: ripple.x,\n top: ripple.y,\n width: 10,\n height: 10,\n transform: 'translate(-50%, -50%)',\n animation: 'ripple 0.6s ease-out',\n }}\n />\n )}\n\n {/* Pulsing glow on hover */}\n {isHovered && variant === 'primary' && !isDisabled && (\n <div\n className=\"absolute inset-0 rounded-xl animate-glow-pulse pointer-events-none\"\n style={{\n background: 'var(--btn-glow-radial)',\n }}\n />\n )}\n\n {/* Loading spinner */}\n {loading && <RefreshCw className={cn(ICON_SIZES.md, 'animate-spin')} />}\n\n {/* Icon left */}\n {!loading && Icon && iconPosition === 'left' && <Icon className={ICON_SIZES.md} />}\n\n {/* Content */}\n {!loading && children}\n\n {/* Icon right */}\n {!loading && Icon && iconPosition === 'right' && <Icon className={ICON_SIZES.md} />}\n </>\n )}\n </Comp>\n );\n }\n);\n\nButtonGlass.displayName = 'ButtonGlass';\n"
24
24
  }
25
25
  ],
26
26
  "categories": [