shadcn-glass-ui 2.2.3 → 2.3.0
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.
- package/CHANGELOG.md +57 -1
- package/dist/cli/commands/info.d.ts +15 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/list.d.ts +23 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/{index.js → index.mjs} +1 -1
- package/dist/cli/index.mjs.map +1 -0
- package/dist/cli/utils/format.d.ts +76 -0
- package/dist/cli/utils/format.d.ts.map +1 -0
- package/dist/cli/utils/fuzzy-search.d.ts +73 -0
- package/dist/cli/utils/fuzzy-search.d.ts.map +1 -0
- package/dist/cli/utils/load-exports.d.ts +141 -0
- package/dist/cli/utils/load-exports.d.ts.map +1 -0
- package/dist/components/blocks/avatar-gallery/index.d.ts +2 -0
- package/dist/components/blocks/avatar-gallery/index.d.ts.map +1 -0
- package/dist/components/blocks/avatar-gallery/page.d.ts +7 -0
- package/dist/components/blocks/avatar-gallery/page.d.ts.map +1 -0
- package/dist/components/blocks/badges/index.d.ts +2 -0
- package/dist/components/blocks/badges/index.d.ts.map +1 -0
- package/dist/components/blocks/badges/page.d.ts +7 -0
- package/dist/components/blocks/badges/page.d.ts.map +1 -0
- package/dist/components/blocks/buttons/index.d.ts +2 -0
- package/dist/components/blocks/buttons/index.d.ts.map +1 -0
- package/dist/components/blocks/buttons/page.d.ts +7 -0
- package/dist/components/blocks/buttons/page.d.ts.map +1 -0
- package/dist/components/blocks/form-elements/index.d.ts +2 -0
- package/dist/components/blocks/form-elements/index.d.ts.map +1 -0
- package/dist/components/blocks/form-elements/page.d.ts +7 -0
- package/dist/components/blocks/form-elements/page.d.ts.map +1 -0
- package/dist/components/blocks/index.d.ts +14 -0
- package/dist/components/blocks/index.d.ts.map +1 -0
- package/dist/components/blocks/notifications/index.d.ts +2 -0
- package/dist/components/blocks/notifications/index.d.ts.map +1 -0
- package/dist/components/blocks/notifications/page.d.ts +7 -0
- package/dist/components/blocks/notifications/page.d.ts.map +1 -0
- package/dist/components/blocks/progress/index.d.ts +2 -0
- package/dist/components/blocks/progress/index.d.ts.map +1 -0
- package/dist/components/blocks/progress/page.d.ts +7 -0
- package/dist/components/blocks/progress/page.d.ts.map +1 -0
- package/dist/components/blocks/registry.d.ts +16 -0
- package/dist/components/blocks/registry.d.ts.map +1 -0
- package/dist/components/demos/AnimatedBackground.d.ts +5 -0
- package/dist/components/demos/AnimatedBackground.d.ts.map +1 -0
- package/dist/components/demos/ComponentShowcase.d.ts +6 -0
- package/dist/components/demos/ComponentShowcase.d.ts.map +1 -0
- package/dist/components/demos/DesktopShowcase.d.ts +3 -0
- package/dist/components/demos/DesktopShowcase.d.ts.map +1 -0
- package/dist/components/demos/GlassFixesDemo.d.ts +6 -0
- package/dist/components/demos/GlassFixesDemo.d.ts.map +1 -0
- package/dist/components/demos/MobileShowcase.d.ts +3 -0
- package/dist/components/demos/MobileShowcase.d.ts.map +1 -0
- package/dist/components/glass/atomic/expandable-header-glass.d.ts +16 -0
- package/dist/components/glass/atomic/expandable-header-glass.d.ts.map +1 -0
- package/dist/components/glass/atomic/icon-button-glass.d.ts +18 -0
- package/dist/components/glass/atomic/icon-button-glass.d.ts.map +1 -0
- package/dist/components/glass/atomic/index.d.ts +14 -0
- package/dist/components/glass/atomic/index.d.ts.map +1 -0
- package/dist/components/glass/atomic/insight-card-glass.d.ts +22 -0
- package/dist/components/glass/atomic/insight-card-glass.d.ts.map +1 -0
- package/dist/components/glass/atomic/search-box-glass.d.ts +17 -0
- package/dist/components/glass/atomic/search-box-glass.d.ts.map +1 -0
- package/dist/components/glass/atomic/sort-dropdown-glass.d.ts +38 -0
- package/dist/components/glass/atomic/sort-dropdown-glass.d.ts.map +1 -0
- package/dist/components/glass/atomic/stat-item-glass.d.ts +22 -0
- package/dist/components/glass/atomic/stat-item-glass.d.ts.map +1 -0
- package/dist/components/glass/atomic/theme-toggle-glass.d.ts +11 -0
- package/dist/components/glass/atomic/theme-toggle-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/ai-card-glass.d.ts +7 -0
- package/dist/components/glass/composite/ai-card-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/career-stats-header-glass.d.ts +15 -0
- package/dist/components/glass/composite/career-stats-header-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/circular-metric-glass.d.ts +24 -0
- package/dist/components/glass/composite/circular-metric-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/contribution-metrics-glass.d.ts +15 -0
- package/dist/components/glass/composite/contribution-metrics-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/index.d.ts +22 -0
- package/dist/components/glass/composite/index.d.ts.map +1 -0
- package/dist/components/glass/composite/metric-card-glass.d.ts +96 -0
- package/dist/components/glass/composite/metric-card-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/metrics-grid-glass.d.ts +17 -0
- package/dist/components/glass/composite/metrics-grid-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/repository-card-glass.d.ts +16 -0
- package/dist/components/glass/composite/repository-card-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/repository-header-glass.d.ts +16 -0
- package/dist/components/glass/composite/repository-header-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/repository-metadata-glass.d.ts +13 -0
- package/dist/components/glass/composite/repository-metadata-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/split-layout-glass/index.d.ts +16 -0
- package/dist/components/glass/composite/split-layout-glass/index.d.ts.map +1 -0
- package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts +66 -0
- package/dist/components/glass/composite/split-layout-glass/split-layout-accordion.d.ts.map +1 -0
- package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts +122 -0
- package/dist/components/glass/composite/split-layout-glass/split-layout-context.d.ts.map +1 -0
- package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts +177 -0
- package/dist/components/glass/composite/split-layout-glass/split-layout-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/trust-score-display-glass.d.ts +15 -0
- package/dist/components/glass/composite/trust-score-display-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/user-info-glass.d.ts +15 -0
- package/dist/components/glass/composite/user-info-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/user-stats-line-glass.d.ts +15 -0
- package/dist/components/glass/composite/user-stats-line-glass.d.ts.map +1 -0
- package/dist/components/glass/composite/year-card-glass.d.ts +53 -0
- package/dist/components/glass/composite/year-card-glass.d.ts.map +1 -0
- package/dist/components/glass/index.d.ts +16 -0
- package/dist/components/glass/index.d.ts.map +1 -0
- package/dist/components/glass/primitives/form-field-wrapper.d.ts +69 -0
- package/dist/components/glass/primitives/form-field-wrapper.d.ts.map +1 -0
- package/dist/components/glass/primitives/index.d.ts +12 -0
- package/dist/components/glass/primitives/index.d.ts.map +1 -0
- package/dist/components/glass/primitives/interactive-card.d.ts +91 -0
- package/dist/components/glass/primitives/interactive-card.d.ts.map +1 -0
- package/dist/components/glass/primitives/style-utils.d.ts +147 -0
- package/dist/components/glass/primitives/style-utils.d.ts.map +1 -0
- package/dist/components/glass/primitives/touch-target.d.ts +46 -0
- package/dist/components/glass/primitives/touch-target.d.ts.map +1 -0
- package/dist/components/glass/sections/career-stats-glass.d.ts +17 -0
- package/dist/components/glass/sections/career-stats-glass.d.ts.map +1 -0
- package/dist/components/glass/sections/flags-section-glass.d.ts +13 -0
- package/dist/components/glass/sections/flags-section-glass.d.ts.map +1 -0
- package/dist/components/glass/sections/header-branding-glass.d.ts +16 -0
- package/dist/components/glass/sections/header-branding-glass.d.ts.map +1 -0
- package/dist/components/glass/sections/header-nav-glass.d.ts +7 -0
- package/dist/components/glass/sections/header-nav-glass.d.ts.map +1 -0
- package/dist/components/glass/sections/index.d.ts +13 -0
- package/dist/components/glass/sections/index.d.ts.map +1 -0
- package/dist/components/glass/sections/profile-header-glass.d.ts +16 -0
- package/dist/components/glass/sections/profile-header-glass.d.ts.map +1 -0
- package/dist/components/glass/sections/projects-list-glass.d.ts +42 -0
- package/dist/components/glass/sections/projects-list-glass.d.ts.map +1 -0
- package/dist/components/glass/sections/trust-score-card-glass.d.ts +12 -0
- package/dist/components/glass/sections/trust-score-card-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/base-progress-glass.d.ts +8 -0
- package/dist/components/glass/specialized/base-progress-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/flag-alert-glass.d.ts +8 -0
- package/dist/components/glass/specialized/flag-alert-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/index.d.ts +21 -0
- package/dist/components/glass/specialized/index.d.ts.map +1 -0
- package/dist/components/glass/specialized/language-bar-glass.d.ts +24 -0
- package/dist/components/glass/specialized/language-bar-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/profile-avatar-glass.d.ts +26 -0
- package/dist/components/glass/specialized/profile-avatar-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/progress-glass.d.ts +9 -0
- package/dist/components/glass/specialized/progress-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/rainbow-progress-glass.d.ts +8 -0
- package/dist/components/glass/specialized/rainbow-progress-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/segmented-control-glass.d.ts +11 -0
- package/dist/components/glass/specialized/segmented-control-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/sparkline-glass.d.ts +34 -0
- package/dist/components/glass/specialized/sparkline-glass.d.ts.map +1 -0
- package/dist/components/glass/specialized/status-indicator-glass.d.ts +8 -0
- package/dist/components/glass/specialized/status-indicator-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/alert-glass.d.ts +13 -0
- package/dist/components/glass/ui/alert-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/avatar-glass.d.ts +58 -0
- package/dist/components/glass/ui/avatar-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/badge-glass.d.ts +74 -0
- package/dist/components/glass/ui/badge-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/button-glass.d.ts +110 -0
- package/dist/components/glass/ui/button-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/card-glass.d.ts +115 -0
- package/dist/components/glass/ui/card-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/checkbox-glass.d.ts +113 -0
- package/dist/components/glass/ui/checkbox-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/circular-progress-glass.d.ts +36 -0
- package/dist/components/glass/ui/circular-progress-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/combobox-glass.d.ts +61 -0
- package/dist/components/glass/ui/combobox-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/dropdown-glass.d.ts +83 -0
- package/dist/components/glass/ui/dropdown-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/dropdown-menu-glass.d.ts +77 -0
- package/dist/components/glass/ui/dropdown-menu-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/glass-card.d.ts +78 -0
- package/dist/components/glass/ui/glass-card.d.ts.map +1 -0
- package/dist/components/glass/ui/index.d.ts +44 -0
- package/dist/components/glass/ui/index.d.ts.map +1 -0
- package/dist/components/glass/ui/input-glass.d.ts +98 -0
- package/dist/components/glass/ui/input-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/modal-glass.d.ts +180 -0
- package/dist/components/glass/ui/modal-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/notification-glass.d.ts +13 -0
- package/dist/components/glass/ui/notification-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/popover-glass.d.ts +71 -0
- package/dist/components/glass/ui/popover-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/sidebar-glass/index.d.ts +100 -0
- package/dist/components/glass/ui/sidebar-glass/index.d.ts.map +1 -0
- package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts +96 -0
- package/dist/components/glass/ui/sidebar-glass/sidebar-context.d.ts.map +1 -0
- package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts +88 -0
- package/dist/components/glass/ui/sidebar-glass/sidebar-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts +121 -0
- package/dist/components/glass/ui/sidebar-glass/sidebar-menu.d.ts.map +1 -0
- package/dist/components/glass/ui/skeleton-glass.d.ts +8 -0
- package/dist/components/glass/ui/skeleton-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/slider-glass.d.ts +38 -0
- package/dist/components/glass/ui/slider-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/stepper-glass.d.ts +63 -0
- package/dist/components/glass/ui/stepper-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/tabs-glass.d.ts +199 -0
- package/dist/components/glass/ui/tabs-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/toggle-glass.d.ts +27 -0
- package/dist/components/glass/ui/toggle-glass.d.ts.map +1 -0
- package/dist/components/glass/ui/tooltip-glass.d.ts +65 -0
- package/dist/components/glass/ui/tooltip-glass.d.ts.map +1 -0
- package/dist/components/ui/alert.d.ts +8 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/avatar.d.ts +7 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/badge.d.ts +8 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/button.d.ts +8 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/card.d.ts +10 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/chart.d.ts +69 -0
- package/dist/components/ui/chart.d.ts.map +1 -0
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/collapsible.d.ts +6 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/command.d.ts +19 -0
- package/dist/components/ui/command.d.ts.map +1 -0
- package/dist/components/ui/dialog.d.ts +16 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +26 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/popover.d.ts +8 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/progress.d.ts +5 -0
- package/dist/components/ui/progress.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +6 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/separator.d.ts +5 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/skeleton.d.ts +3 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/slider.d.ts +5 -0
- package/dist/components/ui/slider.d.ts.map +1 -0
- package/dist/components/ui/sonner.d.ts +4 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/switch.d.ts +5 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/tabs.d.ts +8 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tooltip.d.ts +8 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components.cjs +4 -4
- package/dist/components.d.ts +56 -1932
- package/dist/components.d.ts.map +1 -0
- package/dist/components.mjs +5 -0
- package/dist/hooks.cjs +2 -2
- package/dist/hooks.d.ts +5 -225
- package/dist/hooks.d.ts.map +1 -0
- package/dist/{hooks.js → hooks.mjs} +2 -2
- package/dist/index.cjs +48 -1109
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +83 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/{index.js → index.mjs} +29 -1115
- package/dist/index.mjs.map +1 -0
- package/dist/lib/config.d.ts +28 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/hooks/index.d.ts +11 -0
- package/dist/lib/hooks/index.d.ts.map +1 -0
- package/dist/lib/hooks/use-focus.d.ts +61 -0
- package/dist/lib/hooks/use-focus.d.ts.map +1 -0
- package/dist/lib/hooks/use-hover.d.ts +54 -0
- package/dist/lib/hooks/use-hover.d.ts.map +1 -0
- package/dist/lib/hooks/use-responsive.d.ts +44 -0
- package/dist/lib/hooks/use-responsive.d.ts.map +1 -0
- package/dist/lib/hooks/use-wallpaper-tint.d.ts +57 -0
- package/dist/lib/hooks/use-wallpaper-tint.d.ts.map +1 -0
- package/dist/lib/hooks.d.ts +92 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/theme/tokens.d.ts +441 -0
- package/dist/lib/theme/tokens.d.ts.map +1 -0
- package/dist/lib/theme-context.d.ts +115 -0
- package/dist/lib/theme-context.d.ts.map +1 -0
- package/dist/lib/types.d.ts +24 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +8 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/variants/alert-glass-variants.d.ts +10 -0
- package/dist/lib/variants/alert-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/alert-variants.d.ts +8 -0
- package/dist/lib/variants/alert-variants.d.ts.map +1 -0
- package/dist/lib/variants/avatar-glass-variants.d.ts +12 -0
- package/dist/lib/variants/avatar-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/badge-glass-variants.d.ts +10 -0
- package/dist/lib/variants/badge-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/badge-variants.d.ts +8 -0
- package/dist/lib/variants/badge-variants.d.ts.map +1 -0
- package/dist/lib/variants/button-glass-variants.d.ts +29 -0
- package/dist/lib/variants/button-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/button-variants.d.ts +9 -0
- package/dist/lib/variants/button-variants.d.ts.map +1 -0
- package/dist/lib/variants/dropdown-content-styles.d.ts +102 -0
- package/dist/lib/variants/dropdown-content-styles.d.ts.map +1 -0
- package/dist/lib/variants/dropdown-glass-variants.d.ts +9 -0
- package/dist/lib/variants/dropdown-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/glass-card-variants.d.ts +13 -0
- package/dist/lib/variants/glass-card-variants.d.ts.map +1 -0
- package/dist/lib/variants/index.d.ts +26 -0
- package/dist/lib/variants/index.d.ts.map +1 -0
- package/dist/lib/variants/input-glass-variants.d.ts +9 -0
- package/dist/lib/variants/input-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/insight-card-glass-variants.d.ts +11 -0
- package/dist/lib/variants/insight-card-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/modal-glass-variants.d.ts +9 -0
- package/dist/lib/variants/modal-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/notification-glass-variants.d.ts +9 -0
- package/dist/lib/variants/notification-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/progress-glass-variants.d.ts +10 -0
- package/dist/lib/variants/progress-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/skeleton-glass-variants.d.ts +9 -0
- package/dist/lib/variants/skeleton-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/sparkline-glass-variants.d.ts +10 -0
- package/dist/lib/variants/sparkline-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/stepper-glass-variants.d.ts +40 -0
- package/dist/lib/variants/stepper-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/toggle-glass-variants.d.ts +26 -0
- package/dist/lib/variants/toggle-glass-variants.d.ts.map +1 -0
- package/dist/lib/variants/tooltip-glass-variants.d.ts +9 -0
- package/dist/lib/variants/tooltip-glass-variants.d.ts.map +1 -0
- package/dist/r/checkbox-glass.json +3 -2
- package/dist/r/tabs-glass.json +4 -2
- package/dist/{theme-context-_T5r1KG4.js → theme-context-DLS2uAgJ.mjs} +1 -1
- package/dist/theme-context-DLS2uAgJ.mjs.map +1 -0
- package/dist/{theme-context-BEA8K_rq.cjs → theme-context-DmTETrFi.cjs} +2 -2
- package/dist/{theme-context-BEA8K_rq.cjs.map → theme-context-DmTETrFi.cjs.map} +1 -1
- package/dist/themes.cjs +1 -1
- package/dist/themes.d.ts +2 -124
- package/dist/themes.d.ts.map +1 -0
- package/dist/{themes.js → themes.mjs} +1 -1
- package/dist/trust-score-card-glass-3VBi9soW.cjs +4893 -0
- package/dist/trust-score-card-glass-3VBi9soW.cjs.map +1 -0
- package/dist/trust-score-card-glass-EfMB5l5J.mjs +4226 -0
- package/dist/trust-score-card-glass-EfMB5l5J.mjs.map +1 -0
- package/dist/{use-focus-CX0TJJIj.js → use-focus-C5kPAKr_.mjs} +1 -1
- package/dist/use-focus-C5kPAKr_.mjs.map +1 -0
- package/dist/{use-focus-CdoUzFQ8.cjs → use-focus-CswOSq71.cjs} +2 -2
- package/dist/{use-focus-CdoUzFQ8.cjs.map → use-focus-CswOSq71.cjs.map} +1 -1
- package/dist/{use-wallpaper-tint-DUgmytlY.js → use-wallpaper-tint-C0kYXNiN.mjs} +1 -1
- package/dist/use-wallpaper-tint-C0kYXNiN.mjs.map +1 -0
- package/dist/{use-wallpaper-tint-Rq5UgY9L.cjs → use-wallpaper-tint-WtRWtupA.cjs} +2 -2
- package/dist/{use-wallpaper-tint-Rq5UgY9L.cjs.map → use-wallpaper-tint-WtRWtupA.cjs.map} +1 -1
- package/dist/{utils-CcyeqpKQ.js → utils-B792GPM_.mjs} +1 -1
- package/dist/utils-B792GPM_.mjs.map +1 -0
- package/dist/{utils-NLnOCttr.cjs → utils-DX6rdBol.cjs} +2 -2
- package/dist/{utils-NLnOCttr.cjs.map → utils-DX6rdBol.cjs.map} +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.d.ts +2 -10
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.mjs +2 -0
- package/package.json +8 -8
- package/dist/cli/index.js.map +0 -1
- package/dist/components.js +0 -5
- package/dist/index.js.map +0 -1
- package/dist/theme-context-_T5r1KG4.js.map +0 -1
- package/dist/trust-score-card-glass-DTS1RdIt.cjs +0 -28660
- package/dist/trust-score-card-glass-DTS1RdIt.cjs.map +0 -1
- package/dist/trust-score-card-glass-Dg4_b_g_.js +0 -27660
- package/dist/trust-score-card-glass-Dg4_b_g_.js.map +0 -1
- package/dist/use-focus-CX0TJJIj.js.map +0 -1
- package/dist/use-wallpaper-tint-DUgmytlY.js.map +0 -1
- package/dist/utils-CcyeqpKQ.js.map +0 -1
- package/dist/utils.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["blurMap: Record<IntensityType, string>","bgVarMap: Record<IntensityType, string>","borderVarMap: Record<IntensityType, string>","glowVarMap: Record<string, string>","cardStyles: CSSProperties","StepperRoot: FC<StepperRootProps>","indicatorStyles: CSSProperties","connectorStyles: CSSProperties","labelStyles: CSSProperties","descriptionStyles: CSSProperties","StepperContent: FC<StepperContentProps>","SidebarProvider: FC<SidebarProviderProps>","menuButtonSizeClasses: Record<SidebarMenuButtonSize, string>","BREAKPOINT_VALUES: Record<Breakpoint, number>","SplitLayoutProvider: FC<SplitLayoutProviderProps>","configLabelKey: string"],"sources":["../src/components/glass/ui/card-glass.tsx","../src/lib/variants/stepper-glass-variants.ts","../src/components/glass/ui/stepper-glass.tsx","../src/components/glass/ui/sidebar-glass/sidebar-context.tsx","../src/components/glass/ui/sidebar-glass/sidebar-glass.tsx","../src/components/glass/ui/sidebar-glass/sidebar-menu.tsx","../src/components/glass/ui/sidebar-glass/index.ts","../src/components/ui/scroll-area.tsx","../src/components/glass/composite/split-layout-glass/split-layout-context.tsx","../src/components/glass/composite/split-layout-glass/split-layout-accordion.tsx","../src/components/glass/composite/split-layout-glass/split-layout-glass.tsx","../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":["/* eslint-disable react-refresh/only-export-components */\n/**\n * CardGlass Compound Component\n *\n * A glass-themed card with compound sub-components matching shadcn/ui Card API.\n * Provides structure (Header, Content, Footer) with glass visual effects.\n *\n * @example\n * ```tsx\n * // Object pattern (recommended)\n * <CardGlass.Root intensity=\"medium\" glow=\"blue\">\n * <CardGlass.Header>\n * <CardGlass.Title>Card Title</CardGlass.Title>\n * <CardGlass.Description>Card description</CardGlass.Description>\n * <CardGlass.Action>\n * <ButtonGlass size=\"sm\">Action</ButtonGlass>\n * </CardGlass.Action>\n * </CardGlass.Header>\n * <CardGlass.Content>\n * <p>Main content goes here</p>\n * </CardGlass.Content>\n * <CardGlass.Footer>\n * <ButtonGlass variant=\"ghost\">Cancel</ButtonGlass>\n * <ButtonGlass>Save</ButtonGlass>\n * </CardGlass.Footer>\n * </CardGlass.Root>\n *\n * // Named exports (shadcn/ui compatible)\n * import { CardGlassRoot, CardGlassHeader, CardGlassTitle } from '@/components/glass/ui';\n * ```\n *\n * @see GlassCard - Simple glass container without structure\n * @see Card (shadcn/ui) - Reference implementation\n */\n\nimport * as React from 'react';\nimport { type CSSProperties } from 'react';\nimport { cn } from '@/lib/utils';\nimport type { GlowType, IntensityType } from '@/lib/variants/glass-card-variants';\nimport '@/glass-theme.css';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport interface CardGlassRootProps extends React.ComponentProps<'div'> {\n /**\n * Glass blur intensity\n * @default 'medium'\n */\n intensity?: IntensityType;\n /**\n * Glow effect color\n * @default null\n */\n glow?: GlowType;\n /**\n * Enable hover effects\n * @default false\n */\n hover?: boolean;\n}\n\n// ========================================\n// STYLE MAPS (CSS Variables)\n// ========================================\n\nconst blurMap: Record<IntensityType, string> = {\n subtle: 'var(--blur-sm)', // 8px\n medium: 'var(--blur-md)', // 16px\n strong: 'var(--blur-lg)', // 24px\n};\n\nconst bgVarMap: Record<IntensityType, string> = {\n subtle: 'var(--card-subtle-bg)',\n medium: 'var(--card-medium-bg)',\n strong: 'var(--card-strong-bg)',\n};\n\nconst borderVarMap: Record<IntensityType, string> = {\n subtle: 'var(--card-subtle-border)',\n medium: 'var(--card-medium-border)',\n strong: 'var(--card-strong-border)',\n};\n\nconst glowVarMap: Record<string, string> = {\n blue: 'var(--glow-blue)',\n violet: 'var(--glow-violet)',\n cyan: 'var(--glow-cyan)',\n};\n\n// ========================================\n// COMPOUND COMPONENT: ROOT\n// ========================================\n\n/**\n * CardGlass Root - Glass-themed card container\n *\n * @accessibility\n * - Uses semantic div element\n * - Color contrast meets WCAG AA\n * - Hover effects are decorative only\n */\nfunction CardGlassRoot({\n className,\n intensity = 'medium',\n glow = null,\n hover = false,\n style,\n ...props\n}: CardGlassRootProps) {\n const cardStyles: CSSProperties = {\n background: bgVarMap[intensity],\n borderColor: borderVarMap[intensity],\n backdropFilter: `blur(${blurMap[intensity]})`,\n WebkitBackdropFilter: `blur(${blurMap[intensity]})`,\n boxShadow: glow ? glowVarMap[glow] : 'var(--glow-neutral)',\n ...style,\n };\n\n return (\n <div\n data-slot=\"card\"\n className={cn(\n 'flex flex-col gap-6 rounded-xl border py-6 transition-all duration-300',\n 'text-[var(--text-primary)]',\n hover && 'hover:shadow-lg hover:border-[var(--card-hover-border)] cursor-pointer',\n className\n )}\n style={cardStyles}\n {...props}\n />\n );\n}\n\n// ========================================\n// COMPOUND COMPONENT: HEADER\n// ========================================\n\n/**\n * CardGlass Header - Container for title, description, and action\n *\n * Uses CSS Grid for layout with automatic action positioning.\n */\nfunction CardGlassHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n '@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6',\n 'has-data-[slot=card-action]:grid-cols-[1fr_auto]',\n '[.border-b]:pb-6',\n className\n )}\n {...props}\n />\n );\n}\n\n// ========================================\n// COMPOUND COMPONENT: TITLE\n// ========================================\n\n/**\n * CardGlass Title - Card title text\n */\nfunction CardGlassTitle({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn('leading-none font-semibold text-[var(--text-primary)]', className)}\n {...props}\n />\n );\n}\n\n// ========================================\n// COMPOUND COMPONENT: DESCRIPTION\n// ========================================\n\n/**\n * CardGlass Description - Card description/subtitle text\n */\nfunction CardGlassDescription({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn('text-sm text-[var(--text-muted)]', className)}\n {...props}\n />\n );\n}\n\n// ========================================\n// COMPOUND COMPONENT: ACTION\n// ========================================\n\n/**\n * CardGlass Action - Positioned action slot in header\n *\n * Automatically positioned to the right of title/description.\n */\nfunction CardGlassAction({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', className)}\n {...props}\n />\n );\n}\n\n// ========================================\n// COMPOUND COMPONENT: CONTENT\n// ========================================\n\n/**\n * CardGlass Content - Main content area\n */\nfunction CardGlassContent({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"card-content\" className={cn('px-6', className)} {...props} />;\n}\n\n// ========================================\n// COMPOUND COMPONENT: FOOTER\n// ========================================\n\n/**\n * CardGlass Footer - Footer area with flex layout\n */\nfunction CardGlassFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn('flex items-center gap-2 px-6 [.border-t]:pt-6', className)}\n {...props}\n />\n );\n}\n\n// ========================================\n// EXPORTS: OBJECT PATTERN\n// ========================================\n\n/**\n * CardGlass - Compound Component API\n *\n * @example\n * ```tsx\n * <CardGlass.Root intensity=\"medium\">\n * <CardGlass.Header>\n * <CardGlass.Title>Title</CardGlass.Title>\n * <CardGlass.Description>Description</CardGlass.Description>\n * </CardGlass.Header>\n * <CardGlass.Content>Content</CardGlass.Content>\n * <CardGlass.Footer>Footer</CardGlass.Footer>\n * </CardGlass.Root>\n * ```\n */\nexport const CardGlass = {\n Root: CardGlassRoot,\n Header: CardGlassHeader,\n Title: CardGlassTitle,\n Description: CardGlassDescription,\n Action: CardGlassAction,\n Content: CardGlassContent,\n Footer: CardGlassFooter,\n};\n\n// ========================================\n// EXPORTS: NAMED (shadcn/ui compatible)\n// ========================================\n\nexport {\n CardGlassRoot,\n CardGlassHeader,\n CardGlassTitle,\n CardGlassDescription,\n CardGlassAction,\n CardGlassContent,\n CardGlassFooter,\n};\n","/**\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","/* eslint-disable react-refresh/only-export-components */\n/**\n * SidebarGlass Context\n *\n * Provides state management for SidebarGlass compound component.\n * 100% compatible with shadcn/ui Sidebar API.\n *\n * @module sidebar-context\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n type FC,\n type ReactNode,\n} from 'react';\n\n// ========================================\n// TYPES\n// ========================================\n\nexport type SidebarSide = 'left' | 'right';\nexport type SidebarVariant = 'sidebar' | 'floating' | 'inset';\nexport type SidebarCollapsible = 'offcanvas' | 'icon' | 'none';\n\n/**\n * Context value for SidebarGlass compound components\n * 100% compatible with shadcn/ui useSidebar() hook\n */\nexport interface SidebarContextValue {\n /** Sidebar state: \"expanded\" | \"collapsed\" */\n state: 'expanded' | 'collapsed';\n /** Whether sidebar is open (desktop) */\n open: boolean;\n /** Set sidebar open state */\n setOpen: (open: boolean) => void;\n /** Whether mobile drawer is open */\n openMobile: boolean;\n /** Set mobile drawer open state */\n setOpenMobile: (open: boolean) => void;\n /** Whether viewport is mobile */\n isMobile: boolean;\n /** Toggle sidebar open/close */\n toggleSidebar: () => void;\n\n // === CONFIG ===\n /** Which side the sidebar is on */\n side: SidebarSide;\n /** Sidebar variant */\n variant: SidebarVariant;\n /** Collapsible mode */\n collapsible: SidebarCollapsible;\n}\n\n// ========================================\n// CONSTANTS\n// ========================================\n\nconst MOBILE_BREAKPOINT = 768;\nconst SIDEBAR_COOKIE_NAME = 'sidebar:state';\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; // 7 days\n\n// ========================================\n// CONTEXT\n// ========================================\n\nconst SidebarContext = createContext<SidebarContextValue | null>(null);\n\n/**\n * Hook to access Sidebar context (100% shadcn compatible)\n *\n * @throws Error if used outside of SidebarGlass.Provider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { state, open, toggleSidebar, isMobile } = useSidebar();\n *\n * return (\n * <button onClick={toggleSidebar}>\n * {state === 'expanded' ? 'Collapse' : 'Expand'}\n * </button>\n * );\n * }\n * ```\n */\nexport function useSidebar(): SidebarContextValue {\n const context = useContext(SidebarContext);\n if (!context) {\n throw new Error(\n 'useSidebar must be used within SidebarGlass.Provider. ' +\n 'Wrap your component tree with <SidebarGlass.Provider>.'\n );\n }\n return context;\n}\n\n/**\n * Optional hook that returns null if outside provider (doesn't throw)\n */\nexport function useSidebarOptional(): SidebarContextValue | null {\n return useContext(SidebarContext);\n}\n\n// ========================================\n// PROVIDER\n// ========================================\n\n/**\n * Props for SidebarGlass.Provider (100% shadcn compatible)\n */\nexport interface SidebarProviderProps {\n children: ReactNode;\n\n /** Controlled open state */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Default open state (uncontrolled) @default true */\n defaultOpen?: boolean;\n\n /** Which side the sidebar is on @default \"left\" */\n side?: SidebarSide;\n /** Sidebar variant @default \"sidebar\" */\n variant?: SidebarVariant;\n /** Collapsible mode @default \"offcanvas\" */\n collapsible?: SidebarCollapsible;\n\n /** Cookie name for persistence @default \"sidebar:state\" */\n cookieName?: string;\n /** Keyboard shortcut key (Cmd/Ctrl + key) @default \"b\" */\n keyboardShortcut?: string | false;\n}\n\n/**\n * Provider component for SidebarGlass compound components\n *\n * @example\n * ```tsx\n * <SidebarGlass.Provider defaultOpen>\n * <SidebarGlass.Root>\n * <SidebarGlass.Header />\n * <SidebarGlass.Content>\n * <SidebarGlass.Menu>...</SidebarGlass.Menu>\n * </SidebarGlass.Content>\n * <SidebarGlass.Footer />\n * </SidebarGlass.Root>\n * <SidebarGlass.Inset>\n * <main>Main content</main>\n * </SidebarGlass.Inset>\n * </SidebarGlass.Provider>\n * ```\n */\nexport const SidebarProvider: FC<SidebarProviderProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n defaultOpen = true,\n side = 'left',\n variant = 'sidebar',\n collapsible = 'offcanvas',\n cookieName = SIDEBAR_COOKIE_NAME,\n keyboardShortcut = 'b',\n}) => {\n // === OPEN STATE (controlled/uncontrolled with cookie persistence) ===\n const [internalOpen, setInternalOpen] = useState(() => {\n // Try to read from cookie\n if (typeof document !== 'undefined') {\n const cookies = document.cookie.split(';');\n const sidebarCookie = cookies.find((c) => c.trim().startsWith(`${cookieName}=`));\n if (sidebarCookie) {\n return sidebarCookie.split('=')[1] === 'true';\n }\n }\n return defaultOpen;\n });\n\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalOpen(value);\n }\n onOpenChange?.(value);\n\n // Persist to cookie\n if (typeof document !== 'undefined') {\n document.cookie = `${cookieName}=${value}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;\n }\n },\n [isControlled, onOpenChange, cookieName]\n );\n\n // === MOBILE STATE ===\n const [openMobile, setOpenMobile] = useState(false);\n\n // === RESPONSIVE DETECTION ===\n const [isMobile, setIsMobile] = useState(() => {\n if (typeof window === 'undefined') return false;\n return window.innerWidth < MOBILE_BREAKPOINT;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const checkMobile = () => {\n const mobile = window.innerWidth < MOBILE_BREAKPOINT;\n setIsMobile(mobile);\n // Close mobile drawer when switching to desktop (in same callback)\n if (!mobile) {\n setOpenMobile(false);\n }\n };\n\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // === TOGGLE ACTION ===\n const toggleSidebar = useCallback(() => {\n if (isMobile) {\n setOpenMobile((prev) => !prev);\n } else {\n setOpen(!open);\n }\n }, [isMobile, open, setOpen]);\n\n // === KEYBOARD NAVIGATION ===\n useEffect(() => {\n if (!keyboardShortcut) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Cmd/Ctrl + key - toggle sidebar\n if (e.key === keyboardShortcut && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n toggleSidebar();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [keyboardShortcut, toggleSidebar]);\n\n // === CONTEXT VALUE ===\n const value = useMemo<SidebarContextValue>(\n () => ({\n state: open ? 'expanded' : 'collapsed',\n open,\n setOpen,\n openMobile,\n setOpenMobile,\n isMobile,\n toggleSidebar,\n side,\n variant,\n collapsible,\n }),\n [open, setOpen, openMobile, isMobile, toggleSidebar, side, variant, collapsible]\n );\n\n return <SidebarContext.Provider value={value}>{children}</SidebarContext.Provider>;\n};\n\nSidebarProvider.displayName = 'SidebarGlass.Provider';\n","/**\n * SidebarGlass Core Components\n *\n * Layout components for building sidebars with glassmorphism effects.\n * 100% API compatible with shadcn/ui Sidebar.\n *\n * @module sidebar-glass\n */\n\nimport {\n forwardRef,\n type ReactNode,\n type CSSProperties,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { PanelLeft } from 'lucide-react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '@/lib/utils';\nimport {\n useSidebar,\n type SidebarSide,\n type SidebarVariant,\n type SidebarCollapsible,\n} from './sidebar-context';\nimport { ModalGlass } from '@/components/glass/ui/modal-glass';\nimport '@/glass-theme.css';\n\n// ========================================\n// SIDEBAR ROOT\n// ========================================\n\nexport interface SidebarRootProps extends ComponentPropsWithoutRef<'aside'> {\n children: ReactNode;\n /** Override side from provider */\n side?: SidebarSide;\n /** Override variant from provider */\n variant?: SidebarVariant;\n /** Override collapsible from provider */\n collapsible?: SidebarCollapsible;\n}\n\n/**\n * SidebarGlass.Root - Main sidebar container\n *\n * @example\n * ```tsx\n * <SidebarGlass.Root>\n * <SidebarGlass.Header />\n * <SidebarGlass.Content>...</SidebarGlass.Content>\n * <SidebarGlass.Footer />\n * </SidebarGlass.Root>\n * ```\n */\nexport const SidebarRoot = forwardRef<HTMLElement, SidebarRootProps>(\n (\n {\n children,\n side: sideProp,\n variant: variantProp,\n collapsible: collapsibleProp,\n className,\n ...props\n },\n ref\n ) => {\n const context = useSidebar();\n const side = sideProp ?? context.side;\n const variant = variantProp ?? context.variant;\n const collapsible = collapsibleProp ?? context.collapsible;\n const { state, open, openMobile, isMobile, setOpenMobile } = context;\n\n // Mobile: render as Sheet/Drawer\n if (isMobile) {\n return (\n <ModalGlass.Root open={openMobile} onOpenChange={setOpenMobile}>\n <ModalGlass.Overlay />\n <aside\n ref={ref}\n data-sidebar=\"sidebar\"\n data-side={side}\n data-variant={variant}\n data-collapsible={collapsible}\n data-state=\"expanded\"\n data-mobile=\"true\"\n className={cn(\n 'fixed inset-y-0 z-50 flex flex-col',\n 'w-[var(--sidebar-width-mobile)]',\n side === 'left' ? 'left-0' : 'right-0',\n className\n )}\n style={\n {\n background: 'var(--sidebar-bg)',\n color: 'var(--sidebar-foreground)',\n borderRight: side === 'left' ? '1px solid var(--sidebar-border)' : undefined,\n borderLeft: side === 'right' ? '1px solid var(--sidebar-border)' : undefined,\n backdropFilter: 'blur(var(--sidebar-backdrop-blur))',\n WebkitBackdropFilter: 'blur(var(--sidebar-backdrop-blur))',\n boxShadow: 'var(--sidebar-glow)',\n } as CSSProperties\n }\n {...props}\n >\n {children}\n </aside>\n </ModalGlass.Root>\n );\n }\n\n // Desktop: collapsible sidebar\n const isCollapsed = !open && collapsible !== 'none';\n const width =\n isCollapsed && collapsible === 'icon' ? 'var(--sidebar-width-icon)' : 'var(--sidebar-width)';\n\n return (\n <aside\n ref={ref}\n data-sidebar=\"sidebar\"\n data-side={side}\n data-variant={variant}\n data-collapsible={collapsible}\n data-state={state}\n className={cn(\n 'group/sidebar relative flex flex-col',\n 'transition-[width] duration-300 ease-in-out',\n // Offcanvas: completely hidden when collapsed\n collapsible === 'offcanvas' && !open && 'w-0 overflow-hidden',\n // Variant-specific styles\n variant === 'floating' && 'rounded-xl m-2',\n variant === 'inset' && 'rounded-xl',\n className\n )}\n style={\n {\n width: collapsible === 'offcanvas' && !open ? 0 : width,\n background: 'var(--sidebar-bg)',\n color: 'var(--sidebar-foreground)',\n borderRight:\n side === 'left' && variant !== 'floating'\n ? '1px solid var(--sidebar-border)'\n : undefined,\n borderLeft:\n side === 'right' && variant !== 'floating'\n ? '1px solid var(--sidebar-border)'\n : undefined,\n border: variant === 'floating' ? '1px solid var(--sidebar-border)' : undefined,\n backdropFilter: 'blur(var(--sidebar-backdrop-blur))',\n WebkitBackdropFilter: 'blur(var(--sidebar-backdrop-blur))',\n boxShadow: variant === 'floating' ? 'var(--sidebar-glow)' : undefined,\n } as CSSProperties\n }\n {...props}\n >\n {children}\n </aside>\n );\n }\n);\n\nSidebarRoot.displayName = 'SidebarGlass.Root';\n\n// ========================================\n// SIDEBAR HEADER\n// ========================================\n\nexport interface SidebarHeaderProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.Header - Sticky header section\n */\nexport const SidebarHeader = forwardRef<HTMLDivElement, SidebarHeaderProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"header\"\n className={cn('flex shrink-0 flex-col gap-2 p-4', 'border-b', className)}\n style={{\n borderColor: 'var(--sidebar-border)',\n }}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSidebarHeader.displayName = 'SidebarGlass.Header';\n\n// ========================================\n// SIDEBAR CONTENT\n// ========================================\n\nexport interface SidebarContentProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.Content - Scrollable content area\n */\nexport const SidebarContent = forwardRef<HTMLDivElement, SidebarContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"content\"\n className={cn(\n 'flex flex-1 flex-col gap-4 overflow-auto p-4',\n // Hide scrollbar but allow scrolling\n '[&::-webkit-scrollbar]:w-1.5',\n '[&::-webkit-scrollbar-track]:bg-transparent',\n '[&::-webkit-scrollbar-thumb]:rounded-full',\n '[&::-webkit-scrollbar-thumb]:bg-white/10',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSidebarContent.displayName = 'SidebarGlass.Content';\n\n// ========================================\n// SIDEBAR FOOTER\n// ========================================\n\nexport interface SidebarFooterProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.Footer - Sticky footer section\n */\nexport const SidebarFooter = forwardRef<HTMLDivElement, SidebarFooterProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"footer\"\n className={cn('flex shrink-0 flex-col gap-2 p-4', 'border-t', className)}\n style={{\n borderColor: 'var(--sidebar-border)',\n }}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSidebarFooter.displayName = 'SidebarGlass.Footer';\n\n// ========================================\n// SIDEBAR RAIL\n// ========================================\n\nexport type SidebarRailProps = ComponentPropsWithoutRef<'button'>;\n\n/**\n * SidebarGlass.Rail - Interactive rail for toggling sidebar\n *\n * Shows on hover and allows click to toggle collapsed/expanded state.\n */\nexport const SidebarRail = forwardRef<HTMLButtonElement, SidebarRailProps>(\n ({ className, ...props }, ref) => {\n const { toggleSidebar, side } = useSidebar();\n\n return (\n <button\n ref={ref}\n data-sidebar=\"rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n className={cn(\n 'absolute inset-y-0 z-20 w-4',\n 'hidden group-hover/sidebar:block',\n '-translate-x-1/2 transition-all ease-linear',\n 'after:absolute after:inset-y-0 after:left-1/2 after:w-[2px]',\n 'hover:after:bg-[var(--sidebar-border)]',\n 'cursor-col-resize',\n side === 'left' ? '-right-2' : '-left-2',\n className\n )}\n {...props}\n />\n );\n }\n);\n\nSidebarRail.displayName = 'SidebarGlass.Rail';\n\n// ========================================\n// SIDEBAR INSET\n// ========================================\n\nexport interface SidebarInsetProps extends ComponentPropsWithoutRef<'main'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.Inset - Main content area next to sidebar\n *\n * Use this for the main content that sits beside the sidebar.\n */\nexport const SidebarInset = forwardRef<HTMLElement, SidebarInsetProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <main\n ref={ref}\n data-sidebar=\"inset\"\n className={cn('flex flex-1 flex-col', 'min-h-screen', className)}\n {...props}\n >\n {children}\n </main>\n );\n }\n);\n\nSidebarInset.displayName = 'SidebarGlass.Inset';\n\n// ========================================\n// SIDEBAR TRIGGER\n// ========================================\n\nexport interface SidebarTriggerProps extends ComponentPropsWithoutRef<'button'> {\n /** Render as child element */\n asChild?: boolean;\n}\n\n/**\n * SidebarGlass.Trigger - Toggle button for sidebar\n *\n * @example\n * ```tsx\n * // Default button\n * <SidebarGlass.Trigger />\n *\n * // Custom trigger\n * <SidebarGlass.Trigger asChild>\n * <ButtonGlass variant=\"ghost\" size=\"icon\">\n * <Menu />\n * </ButtonGlass>\n * </SidebarGlass.Trigger>\n * ```\n */\nexport const SidebarTrigger = forwardRef<HTMLButtonElement, SidebarTriggerProps>(\n ({ asChild = false, className, children, ...props }, ref) => {\n const { toggleSidebar } = useSidebar();\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"trigger\"\n onClick={toggleSidebar}\n className={cn(\n 'inline-flex items-center justify-center',\n 'h-9 w-9 rounded-lg',\n 'text-sm font-medium',\n 'transition-colors',\n 'text-[var(--sidebar-foreground)]/60',\n 'hover:bg-[var(--sidebar-accent)]',\n 'hover:text-[var(--sidebar-accent-foreground)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'focus-visible:ring-[var(--sidebar-ring)]',\n 'disabled:pointer-events-none disabled:opacity-50',\n className\n )}\n {...props}\n >\n {children ?? <PanelLeft className=\"h-6 w-6\" />}\n {!children && <span className=\"sr-only\">Toggle Sidebar</span>}\n </Comp>\n );\n }\n);\n\nSidebarTrigger.displayName = 'SidebarGlass.Trigger';\n\n// ========================================\n// SIDEBAR SEPARATOR\n// ========================================\n\nexport type SidebarSeparatorProps = ComponentPropsWithoutRef<'hr'>;\n\n/**\n * SidebarGlass.Separator - Visual divider\n */\nexport const SidebarSeparator = forwardRef<HTMLHRElement, SidebarSeparatorProps>(\n ({ className, ...props }, ref) => {\n return (\n <hr\n ref={ref}\n data-sidebar=\"separator\"\n className={cn('mx-4 my-2 h-px border-0', className)}\n style={{\n background: 'var(--sidebar-border)',\n }}\n {...props}\n />\n );\n }\n);\n\nSidebarSeparator.displayName = 'SidebarGlass.Separator';\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * SidebarGlass Menu Components\n *\n * Menu components for building navigation within the sidebar.\n * 100% API compatible with shadcn/ui Sidebar menu components.\n *\n * @module sidebar-menu\n */\n\nimport {\n forwardRef,\n type ReactNode,\n type CSSProperties,\n type ComponentPropsWithoutRef,\n createContext,\n useContext,\n} from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '@/lib/utils';\nimport { useSidebar } from './sidebar-context';\nimport { TooltipGlassSimple } from '@/components/glass/ui/tooltip-glass';\nimport { SkeletonGlass } from '@/components/glass/ui/skeleton-glass';\n\n// ========================================\n// SIDEBAR GROUP\n// ========================================\n\nexport interface SidebarGroupProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.Group - Container for a group of menu items\n */\nexport const SidebarGroup = forwardRef<HTMLDivElement, SidebarGroupProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group\"\n className={cn('flex flex-col gap-2 p-2', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSidebarGroup.displayName = 'SidebarGlass.Group';\n\n// ========================================\n// SIDEBAR GROUP LABEL\n// ========================================\n\nexport interface SidebarGroupLabelProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n /** Render as child element */\n asChild?: boolean;\n}\n\n/**\n * SidebarGlass.GroupLabel - Label for a group of menu items\n */\nexport const SidebarGroupLabel = forwardRef<HTMLDivElement, SidebarGroupLabelProps>(\n ({ children, asChild = false, className, ...props }, ref) => {\n const { state } = useSidebar();\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-label\"\n data-state={state}\n className={cn(\n 'flex h-8 shrink-0 items-center px-2',\n 'text-xs font-medium text-[var(--sidebar-foreground)]/60',\n 'transition-[margin,opacity] duration-200 ease-linear',\n // Collapsed state\n 'group-data-[state=collapsed]/sidebar:h-0 group-data-[state=collapsed]/sidebar:overflow-hidden',\n 'group-data-[state=collapsed]/sidebar:opacity-0',\n className\n )}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nSidebarGroupLabel.displayName = 'SidebarGlass.GroupLabel';\n\n// ========================================\n// SIDEBAR GROUP ACTION\n// ========================================\n\nexport interface SidebarGroupActionProps extends ComponentPropsWithoutRef<'button'> {\n /** Render as child element */\n asChild?: boolean;\n}\n\n/**\n * SidebarGlass.GroupAction - Action button in group header\n */\nexport const SidebarGroupAction = forwardRef<HTMLButtonElement, SidebarGroupActionProps>(\n ({ asChild = false, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"group-action\"\n className={cn(\n 'absolute right-2 top-2.5',\n 'flex aspect-square w-5 items-center justify-center',\n 'rounded-md p-0 text-[var(--sidebar-foreground)]/60',\n 'ring-[var(--sidebar-ring)]',\n 'transition-transform hover:bg-[var(--sidebar-accent)]',\n 'hover:text-[var(--sidebar-foreground)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n '[&>svg]:size-4 [&>svg]:shrink-0',\n // Hide when collapsed\n 'group-data-[state=collapsed]/sidebar:hidden',\n // Show on hover\n 'after:absolute after:-inset-2 after:md:hidden',\n className\n )}\n {...props}\n />\n );\n }\n);\n\nSidebarGroupAction.displayName = 'SidebarGlass.GroupAction';\n\n// ========================================\n// SIDEBAR GROUP CONTENT\n// ========================================\n\nexport interface SidebarGroupContentProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.GroupContent - Content wrapper for group items\n */\nexport const SidebarGroupContent = forwardRef<HTMLDivElement, SidebarGroupContentProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"group-content\"\n className={cn('flex flex-col gap-1', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSidebarGroupContent.displayName = 'SidebarGlass.GroupContent';\n\n// ========================================\n// SIDEBAR MENU\n// ========================================\n\nexport interface SidebarMenuProps extends ComponentPropsWithoutRef<'ul'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.Menu - Container for menu items\n */\nexport const SidebarMenu = forwardRef<HTMLUListElement, SidebarMenuProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <ul\n ref={ref}\n data-sidebar=\"menu\"\n className={cn('flex w-full flex-col gap-1', className)}\n {...props}\n >\n {children}\n </ul>\n );\n }\n);\n\nSidebarMenu.displayName = 'SidebarGlass.Menu';\n\n// ========================================\n// SIDEBAR MENU ITEM\n// ========================================\n\nexport interface SidebarMenuItemProps extends ComponentPropsWithoutRef<'li'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.MenuItem - Container for a single menu item\n */\nexport const SidebarMenuItem = forwardRef<HTMLLIElement, SidebarMenuItemProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <li\n ref={ref}\n data-sidebar=\"menu-item\"\n className={cn('group/menu-item relative text-[var(--sidebar-foreground)]/60', className)}\n {...props}\n >\n {children}\n </li>\n );\n }\n);\n\nSidebarMenuItem.displayName = 'SidebarGlass.MenuItem';\n\n// ========================================\n// SIDEBAR MENU BUTTON\n// ========================================\n\nexport type SidebarMenuButtonSize = 'default' | 'sm' | 'lg';\nexport type SidebarMenuButtonVariant = 'default' | 'outline';\n\nexport interface SidebarMenuButtonProps extends ComponentPropsWithoutRef<'button'> {\n /** Render as child element */\n asChild?: boolean;\n /** Whether this item is active */\n isActive?: boolean;\n /** Tooltip text when collapsed */\n tooltip?: string | ReactNode;\n /** Button size */\n size?: SidebarMenuButtonSize;\n /** Button variant */\n variant?: SidebarMenuButtonVariant;\n}\n\nconst menuButtonSizeClasses: Record<SidebarMenuButtonSize, string> = {\n default: 'h-8 text-sm',\n sm: 'h-7 text-xs',\n lg: 'h-10 text-sm group-data-[state=collapsed]/sidebar:!p-0',\n};\n\n/**\n * SidebarGlass.MenuButton - Interactive menu button\n */\nexport const SidebarMenuButton = forwardRef<HTMLButtonElement, SidebarMenuButtonProps>(\n (\n {\n asChild = false,\n isActive = false,\n tooltip,\n size = 'default',\n variant = 'default',\n className,\n children,\n ...props\n },\n ref\n ) => {\n const { state, isMobile } = useSidebar();\n const Comp = asChild ? Slot : 'button';\n\n const button = (\n <Comp\n ref={ref}\n data-sidebar=\"menu-button\"\n data-active={isActive}\n data-size={size}\n className={cn(\n 'peer/menu-button flex w-full items-center gap-2',\n 'overflow-hidden rounded-md px-2',\n 'ring-[var(--sidebar-ring)]',\n 'transition-[width,height,padding] duration-200 ease-linear',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'active:bg-[var(--sidebar-accent)] active:text-[var(--sidebar-accent-foreground)]',\n 'disabled:pointer-events-none disabled:opacity-50',\n 'aria-disabled:pointer-events-none aria-disabled:opacity-50',\n '[&>span:last-child]:truncate',\n '[&>svg]:size-4 [&>svg]:shrink-0',\n // Size variants\n menuButtonSizeClasses[size],\n // Variant styles\n variant === 'default' && [\n 'hover:bg-[var(--sidebar-accent)] hover:text-[var(--sidebar-accent-foreground)]',\n ],\n variant === 'outline' && [\n 'bg-transparent shadow-none',\n 'hover:bg-[var(--sidebar-accent)] hover:text-[var(--sidebar-accent-foreground)]',\n 'hover:shadow-[0_0_0_1px_var(--sidebar-border)]',\n ],\n // Active state\n isActive && [\n 'bg-[var(--sidebar-primary)] text-[var(--sidebar-primary-foreground)]',\n 'hover:bg-[var(--sidebar-primary)] hover:text-[var(--sidebar-primary-foreground)]',\n ],\n // Collapsed state - icon only\n 'group-data-[state=collapsed]/sidebar:w-8 group-data-[state=collapsed]/sidebar:!px-0',\n 'group-data-[state=collapsed]/sidebar:justify-center',\n className\n )}\n {...props}\n >\n {children}\n </Comp>\n );\n\n // No tooltip on mobile or expanded state\n if (!tooltip || isMobile || state === 'expanded') {\n return button;\n }\n\n return (\n <TooltipGlassSimple\n content={typeof tooltip === 'string' ? tooltip : String(tooltip)}\n side=\"right\"\n >\n {button}\n </TooltipGlassSimple>\n );\n }\n);\n\nSidebarMenuButton.displayName = 'SidebarGlass.MenuButton';\n\n// ========================================\n// SIDEBAR MENU ACTION\n// ========================================\n\nexport interface SidebarMenuActionProps extends ComponentPropsWithoutRef<'button'> {\n /** Render as child element */\n asChild?: boolean;\n /** Only show on hover */\n showOnHover?: boolean;\n}\n\n/**\n * SidebarGlass.MenuAction - Action button within menu item\n */\nexport const SidebarMenuAction = forwardRef<HTMLButtonElement, SidebarMenuActionProps>(\n ({ asChild = false, showOnHover = false, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-action\"\n className={cn(\n 'absolute right-1 top-1.5',\n 'flex aspect-square w-5 items-center justify-center',\n 'rounded-md p-0 text-[var(--sidebar-foreground)]/60',\n 'ring-[var(--sidebar-ring)]',\n 'transition-transform hover:bg-[var(--sidebar-accent)]',\n 'hover:text-[var(--sidebar-foreground)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n '[&>svg]:size-4 [&>svg]:shrink-0',\n // Hide when collapsed\n 'group-data-[state=collapsed]/sidebar:hidden',\n // Show on hover\n showOnHover &&\n 'peer-hover/menu-button:opacity-100 group-focus-within/menu-item:opacity-100',\n showOnHover && 'data-[state=open]:opacity-100 md:opacity-0',\n // Tap area for touch\n 'after:absolute after:-inset-2 after:md:hidden',\n className\n )}\n {...props}\n />\n );\n }\n);\n\nSidebarMenuAction.displayName = 'SidebarGlass.MenuAction';\n\n// ========================================\n// SIDEBAR MENU BADGE\n// ========================================\n\nexport interface SidebarMenuBadgeProps extends ComponentPropsWithoutRef<'div'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.MenuBadge - Badge within menu item\n */\nexport const SidebarMenuBadge = forwardRef<HTMLDivElement, SidebarMenuBadgeProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-badge\"\n className={cn(\n 'pointer-events-none absolute right-1 flex h-5 min-w-5',\n 'select-none items-center justify-center',\n 'rounded-md px-1 text-xs font-medium tabular-nums',\n 'text-[var(--sidebar-foreground)]/60',\n // Hide when collapsed\n 'group-data-[state=collapsed]/sidebar:hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSidebarMenuBadge.displayName = 'SidebarGlass.MenuBadge';\n\n// ========================================\n// SIDEBAR MENU SKELETON\n// ========================================\n\nexport interface SidebarMenuSkeletonProps extends ComponentPropsWithoutRef<'div'> {\n /** Show icon placeholder */\n showIcon?: boolean;\n}\n\n/**\n * SidebarGlass.MenuSkeleton - Loading skeleton for menu items\n */\nexport const SidebarMenuSkeleton = forwardRef<HTMLDivElement, SidebarMenuSkeletonProps>(\n ({ showIcon = false, className, ...props }, ref) => {\n // Fixed width for consistent appearance (avoids Math.random during render)\n const width = '70%';\n\n return (\n <div\n ref={ref}\n data-sidebar=\"menu-skeleton\"\n className={cn('flex h-8 items-center gap-2 rounded-md px-2', className)}\n {...props}\n >\n {showIcon && <SkeletonGlass className=\"size-4 rounded-md\" />}\n <SkeletonGlass\n className=\"h-4 max-w-[var(--skeleton-width)] flex-1\"\n style={{ '--skeleton-width': width } as CSSProperties}\n />\n </div>\n );\n }\n);\n\nSidebarMenuSkeleton.displayName = 'SidebarGlass.MenuSkeleton';\n\n// ========================================\n// SIDEBAR MENU SUB (SUBMENU CONTAINER)\n// ========================================\n\n// Context for submenu state\ninterface SidebarMenuSubContextValue {\n open: boolean;\n}\n\nconst SidebarMenuSubContext = createContext<SidebarMenuSubContextValue | null>(null);\n\nexport interface SidebarMenuSubProps extends ComponentPropsWithoutRef<'ul'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.MenuSub - Container for submenu items\n */\nexport const SidebarMenuSub = forwardRef<HTMLUListElement, SidebarMenuSubProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <SidebarMenuSubContext.Provider value={{ open: true }}>\n <ul\n ref={ref}\n data-sidebar=\"menu-sub\"\n className={cn(\n 'flex min-w-0 flex-col gap-1',\n 'mx-3.5 border-l border-[var(--sidebar-border)] px-2.5 py-0.5',\n // Hide when collapsed\n 'group-data-[state=collapsed]/sidebar:hidden',\n className\n )}\n {...props}\n >\n {children}\n </ul>\n </SidebarMenuSubContext.Provider>\n );\n }\n);\n\nSidebarMenuSub.displayName = 'SidebarGlass.MenuSub';\n\n// ========================================\n// SIDEBAR MENU SUB ITEM\n// ========================================\n\nexport interface SidebarMenuSubItemProps extends ComponentPropsWithoutRef<'li'> {\n children: ReactNode;\n}\n\n/**\n * SidebarGlass.MenuSubItem - Container for a submenu item\n */\nexport const SidebarMenuSubItem = forwardRef<HTMLLIElement, SidebarMenuSubItemProps>(\n ({ children, className, ...props }, ref) => {\n return (\n <li ref={ref} data-sidebar=\"menu-sub-item\" className={cn(className)} {...props}>\n {children}\n </li>\n );\n }\n);\n\nSidebarMenuSubItem.displayName = 'SidebarGlass.MenuSubItem';\n\n// ========================================\n// SIDEBAR MENU SUB BUTTON\n// ========================================\n\nexport interface SidebarMenuSubButtonProps extends ComponentPropsWithoutRef<'a'> {\n /** Render as child element */\n asChild?: boolean;\n /** Whether this item is active */\n isActive?: boolean;\n /** Button size */\n size?: 'sm' | 'md';\n}\n\n/**\n * SidebarGlass.MenuSubButton - Interactive submenu button\n */\nexport const SidebarMenuSubButton = forwardRef<HTMLAnchorElement, SidebarMenuSubButtonProps>(\n ({ asChild = false, isActive = false, size = 'md', className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n ref={ref}\n data-sidebar=\"menu-sub-button\"\n data-active={isActive}\n data-size={size}\n className={cn(\n 'flex min-w-0 items-center gap-2',\n '-ml-px rounded-md border-l border-transparent',\n 'text-[var(--sidebar-foreground)]/60',\n 'ring-[var(--sidebar-ring)]',\n 'transition-colors',\n 'hover:border-[var(--sidebar-border)]',\n 'hover:bg-[var(--sidebar-accent)]',\n 'hover:text-[var(--sidebar-accent-foreground)]',\n 'focus-visible:outline-none focus-visible:ring-2',\n 'active:bg-[var(--sidebar-accent)] active:text-[var(--sidebar-accent-foreground)]',\n 'disabled:pointer-events-none disabled:opacity-50',\n '[&>span:last-child]:truncate',\n '[&>svg]:size-4 [&>svg]:shrink-0',\n // Size variants\n size === 'sm' && 'h-7 px-2 text-xs',\n size === 'md' && 'h-8 px-2 text-sm',\n // Active state\n isActive && ['border-[var(--sidebar-primary)]', 'text-[var(--sidebar-foreground)]'],\n className\n )}\n {...props}\n />\n );\n }\n);\n\nSidebarMenuSubButton.displayName = 'SidebarGlass.MenuSubButton';\n\n// Export hook for submenu context (optional use)\nexport function useSidebarMenuSub() {\n const context = useContext(SidebarMenuSubContext);\n return context;\n}\n","/**\n * SidebarGlass Component\n *\n * A glassmorphism sidebar component with 100% shadcn/ui Sidebar API compatibility.\n * Supports collapsible modes (offcanvas/icon/none), variants (sidebar/floating/inset),\n * mobile drawer, keyboard shortcuts, and cookie persistence.\n *\n * @example\n * ```tsx\n * import { SidebarGlass, useSidebar } from '@/components/glass/ui/sidebar-glass';\n *\n * function App() {\n * return (\n * <SidebarGlass.Provider>\n * <SidebarGlass.Root>\n * <SidebarGlass.Header>\n * <Logo />\n * </SidebarGlass.Header>\n * <SidebarGlass.Content>\n * <SidebarGlass.Group>\n * <SidebarGlass.GroupLabel>Navigation</SidebarGlass.GroupLabel>\n * <SidebarGlass.GroupContent>\n * <SidebarGlass.Menu>\n * <SidebarGlass.MenuItem>\n * <SidebarGlass.MenuButton isActive>\n * <Home /> Dashboard\n * </SidebarGlass.MenuButton>\n * </SidebarGlass.MenuItem>\n * </SidebarGlass.Menu>\n * </SidebarGlass.GroupContent>\n * </SidebarGlass.Group>\n * </SidebarGlass.Content>\n * <SidebarGlass.Footer>\n * <UserMenu />\n * </SidebarGlass.Footer>\n * <SidebarGlass.Rail />\n * </SidebarGlass.Root>\n * <SidebarGlass.Inset>\n * <main>Content</main>\n * </SidebarGlass.Inset>\n * </SidebarGlass.Provider>\n * );\n * }\n * ```\n *\n * @module sidebar-glass\n */\n\n// Context exports\nexport {\n SidebarProvider,\n useSidebar,\n type SidebarContextValue,\n type SidebarProviderProps,\n type SidebarSide,\n type SidebarVariant,\n type SidebarCollapsible,\n} from './sidebar-context';\n\n// Core component exports\nexport {\n SidebarRoot,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarRail,\n SidebarInset,\n SidebarTrigger,\n SidebarSeparator,\n type SidebarRootProps,\n type SidebarHeaderProps,\n type SidebarContentProps,\n type SidebarFooterProps,\n type SidebarRailProps,\n type SidebarInsetProps,\n type SidebarTriggerProps,\n type SidebarSeparatorProps,\n} from './sidebar-glass';\n\n// Menu component exports\nexport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubItem,\n SidebarMenuSubButton,\n useSidebarMenuSub,\n type SidebarGroupProps,\n type SidebarGroupLabelProps,\n type SidebarGroupActionProps,\n type SidebarGroupContentProps,\n type SidebarMenuProps,\n type SidebarMenuItemProps,\n type SidebarMenuButtonProps,\n type SidebarMenuButtonSize,\n type SidebarMenuButtonVariant,\n type SidebarMenuActionProps,\n type SidebarMenuBadgeProps,\n type SidebarMenuSkeletonProps,\n type SidebarMenuSubProps,\n type SidebarMenuSubItemProps,\n type SidebarMenuSubButtonProps,\n} from './sidebar-menu';\n\n// Import all components for compound export\nimport { SidebarProvider } from './sidebar-context';\nimport {\n SidebarRoot,\n SidebarHeader,\n SidebarContent,\n SidebarFooter,\n SidebarRail,\n SidebarInset,\n SidebarTrigger,\n SidebarSeparator,\n} from './sidebar-glass';\nimport {\n SidebarGroup,\n SidebarGroupLabel,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarMenu,\n SidebarMenuItem,\n SidebarMenuButton,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubItem,\n SidebarMenuSubButton,\n} from './sidebar-menu';\n\n/**\n * SidebarGlass compound component\n *\n * 100% API compatible with shadcn/ui Sidebar.\n *\n * @example\n * ```tsx\n * <SidebarGlass.Provider>\n * <SidebarGlass.Root>\n * <SidebarGlass.Header />\n * <SidebarGlass.Content>\n * <SidebarGlass.Menu>\n * <SidebarGlass.MenuItem>\n * <SidebarGlass.MenuButton>Item</SidebarGlass.MenuButton>\n * </SidebarGlass.MenuItem>\n * </SidebarGlass.Menu>\n * </SidebarGlass.Content>\n * <SidebarGlass.Footer />\n * </SidebarGlass.Root>\n * <SidebarGlass.Inset>\n * <main>Content</main>\n * </SidebarGlass.Inset>\n * </SidebarGlass.Provider>\n * ```\n */\nexport const SidebarGlass = {\n // Context\n Provider: SidebarProvider,\n\n // Layout\n Root: SidebarRoot,\n Header: SidebarHeader,\n Content: SidebarContent,\n Footer: SidebarFooter,\n Rail: SidebarRail,\n Inset: SidebarInset,\n Trigger: SidebarTrigger,\n Separator: SidebarSeparator,\n\n // Groups\n Group: SidebarGroup,\n GroupLabel: SidebarGroupLabel,\n GroupAction: SidebarGroupAction,\n GroupContent: SidebarGroupContent,\n\n // Menu\n Menu: SidebarMenu,\n MenuItem: SidebarMenuItem,\n MenuButton: SidebarMenuButton,\n MenuAction: SidebarMenuAction,\n MenuBadge: SidebarMenuBadge,\n MenuSkeleton: SidebarMenuSkeleton,\n\n // Submenu\n MenuSub: SidebarMenuSub,\n MenuSubItem: SidebarMenuSubItem,\n MenuSubButton: SidebarMenuSubButton,\n};\n","import * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none p-px transition-colors select-none\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent\",\n className\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"bg-border relative flex-1 rounded-full\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * SplitLayoutGlass Context\n *\n * Provides state management for compound SplitLayoutGlass component.\n * Handles selection state, mobile detection, and toggle functionality.\n *\n * @module split-layout-context\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n type FC,\n type ReactNode,\n} from 'react';\n\n// ========================================\n// TYPES\n// ========================================\n\nimport type { IntensityType } from '@/lib/variants/glass-card-variants';\n\nexport type Breakpoint = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\nexport type MobileMode = 'stack' | 'accordion' | 'drawer';\n\n/**\n * Context value for SplitLayoutGlass compound components\n *\n * API is designed to be consistent with shadcn/ui Sidebar patterns.\n */\nexport interface SplitLayoutContextValue {\n // === STATE ===\n /** Currently selected key for master-detail pattern */\n selectedKey: string | null;\n /** Set selected key */\n setSelectedKey: (key: string | null) => void;\n\n /** Sidebar open state (desktop) */\n isOpen: boolean;\n /** Set sidebar open state */\n setIsOpen: (open: boolean) => void;\n\n /** Mobile drawer/accordion open state */\n isMobileOpen: boolean;\n /** Set mobile open state */\n setMobileOpen: (open: boolean) => void;\n\n // === SHADCN ALIASES ===\n /** Sidebar state: \"expanded\" | \"collapsed\" (shadcn pattern) */\n state: 'expanded' | 'collapsed';\n /** Alias for isOpen (shadcn naming) */\n open: boolean;\n /** Alias for setIsOpen (shadcn naming) */\n setOpen: (open: boolean) => void;\n /** Alias for isMobileOpen (shadcn naming) */\n openMobile: boolean;\n /** Alias for setMobileOpen (shadcn naming) */\n setOpenMobile: (open: boolean) => void;\n /** Alias for toggle (shadcn naming) */\n toggleSidebar: () => void;\n\n // === RESPONSIVE ===\n /** Current viewport is below breakpoint */\n isMobile: boolean;\n\n // === CONFIG ===\n /** Breakpoint for desktop layout */\n breakpoint: Breakpoint;\n /** Mobile layout mode */\n mobileMode: MobileMode;\n /** Glass intensity for panels */\n intensity: IntensityType;\n /** Sticky offset from viewport top */\n stickyOffset: number;\n\n // === ACTIONS ===\n /** Toggle sidebar (desktop) or drawer (mobile) */\n toggle: () => void;\n}\n\n// ========================================\n// CONTEXT\n// ========================================\n\nconst SplitLayoutContext = createContext<SplitLayoutContextValue | null>(null);\n\n/**\n * Hook to access SplitLayout context\n *\n * @throws Error if used outside of SplitLayoutGlass.Provider\n *\n * @example\n * ```tsx\n * function YearCard({ year }) {\n * const { selectedKey, setSelectedKey, isMobile } = useSplitLayout();\n * const isSelected = selectedKey === year.id;\n *\n * return (\n * <button\n * onClick={() => setSelectedKey(year.id)}\n * className={cn('p-3', isSelected && 'bg-primary/10')}\n * >\n * {year.year}\n * </button>\n * );\n * }\n * ```\n */\nexport function useSplitLayout(): SplitLayoutContextValue {\n const context = useContext(SplitLayoutContext);\n if (!context) {\n throw new Error(\n 'useSplitLayout must be used within SplitLayoutGlass.Provider. ' +\n 'Wrap your component tree with <SplitLayoutGlass.Provider>.'\n );\n }\n return context;\n}\n\n/**\n * Optional hook that returns null if outside provider (doesn't throw)\n */\nexport function useSplitLayoutOptional(): SplitLayoutContextValue | null {\n return useContext(SplitLayoutContext);\n}\n\n// ========================================\n// BREAKPOINT MAP\n// ========================================\n\nconst BREAKPOINT_VALUES: Record<Breakpoint, number> = {\n sm: 640,\n md: 768,\n lg: 1024,\n xl: 1440,\n '2xl': 1536,\n};\n\n// ========================================\n// PROVIDER\n// ========================================\n\n/**\n * Props for SplitLayoutGlass.Provider\n */\nexport interface SplitLayoutProviderProps {\n children: ReactNode;\n\n // === SELECTION STATE ===\n /** Controlled selected key */\n selectedKey?: string | null;\n /** Callback when selected key changes */\n onSelectedKeyChange?: (key: string | null) => void;\n /** Default selected key (uncontrolled) */\n defaultSelectedKey?: string | null;\n\n // === OPEN STATE ===\n /** Controlled open state (desktop) */\n open?: boolean;\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Default open state */\n defaultOpen?: boolean;\n\n // === CONFIG ===\n /** Breakpoint for mobile/desktop switch @default \"md\" */\n breakpoint?: Breakpoint;\n /** Mobile layout mode @default \"stack\" */\n mobileMode?: MobileMode;\n /** Glass intensity for panels @default \"medium\" */\n intensity?: IntensityType;\n /** Sticky offset from viewport top @default 24 */\n stickyOffset?: number;\n\n // === PERSISTENCE ===\n /** URL param name for selectedKey persistence */\n urlParamName?: string;\n\n // === KEYBOARD ===\n /** Keyboard shortcut key for toggle (Cmd/Ctrl + key) @default \"b\" */\n keyboardShortcut?: string | false;\n}\n\n/**\n * Provider component for SplitLayoutGlass compound components\n *\n * @example\n * ```tsx\n * <SplitLayoutGlass.Provider\n * defaultSelectedKey=\"2024\"\n * mobileMode=\"accordion\"\n * onSelectedKeyChange={(key) => console.log('Selected:', key)}\n * >\n * <SplitLayoutGlass.Root>\n * ...\n * </SplitLayoutGlass.Root>\n * </SplitLayoutGlass.Provider>\n * ```\n */\nexport const SplitLayoutProvider: FC<SplitLayoutProviderProps> = ({\n children,\n selectedKey: controlledSelectedKey,\n onSelectedKeyChange,\n defaultSelectedKey = null,\n open: controlledOpen,\n onOpenChange,\n defaultOpen = true,\n breakpoint = 'md',\n mobileMode = 'stack',\n intensity = 'medium',\n stickyOffset = 24,\n urlParamName,\n keyboardShortcut = 'b',\n}) => {\n // === SELECTION STATE (controlled/uncontrolled) ===\n const [internalSelectedKey, setInternalSelectedKey] = useState<string | null>(() => {\n // Try to read from URL if urlParamName is provided\n if (urlParamName && typeof window !== 'undefined') {\n const params = new URLSearchParams(window.location.search);\n const urlValue = params.get(urlParamName);\n if (urlValue) return urlValue;\n }\n return defaultSelectedKey;\n });\n\n const isSelectedKeyControlled = controlledSelectedKey !== undefined;\n const selectedKey = isSelectedKeyControlled ? controlledSelectedKey : internalSelectedKey;\n\n const setSelectedKey = useCallback(\n (key: string | null) => {\n if (!isSelectedKeyControlled) {\n setInternalSelectedKey(key);\n }\n onSelectedKeyChange?.(key);\n\n // Update URL if urlParamName is provided\n if (urlParamName && typeof window !== 'undefined') {\n const url = new URL(window.location.href);\n if (key) {\n url.searchParams.set(urlParamName, key);\n } else {\n url.searchParams.delete(urlParamName);\n }\n window.history.replaceState({}, '', url.toString());\n }\n },\n [isSelectedKeyControlled, onSelectedKeyChange, urlParamName]\n );\n\n // === OPEN STATE (controlled/uncontrolled) ===\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const isOpenControlled = controlledOpen !== undefined;\n const isOpen = isOpenControlled ? controlledOpen : internalOpen;\n\n const setIsOpen = useCallback(\n (open: boolean) => {\n if (!isOpenControlled) {\n setInternalOpen(open);\n }\n onOpenChange?.(open);\n },\n [isOpenControlled, onOpenChange]\n );\n\n // === MOBILE OPEN STATE ===\n const [isMobileOpen, setMobileOpen] = useState(false);\n\n // === RESPONSIVE DETECTION ===\n const [isMobile, setIsMobile] = useState(() => {\n if (typeof window === 'undefined') return false;\n return window.innerWidth < BREAKPOINT_VALUES[breakpoint];\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const checkMobile = () => {\n setIsMobile(window.innerWidth < BREAKPOINT_VALUES[breakpoint]);\n };\n\n // Check on mount\n checkMobile();\n\n // Listen for resize\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, [breakpoint]);\n\n // === TOGGLE ACTION ===\n const toggle = useCallback(() => {\n if (isMobile) {\n setMobileOpen((prev) => !prev);\n } else {\n setIsOpen(!isOpen);\n }\n }, [isMobile, isOpen, setIsOpen]);\n\n // === KEYBOARD NAVIGATION ===\n useEffect(() => {\n if (!keyboardShortcut) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Escape - close mobile drawer/accordion\n if (e.key === 'Escape' && isMobile && isMobileOpen) {\n e.preventDefault();\n setMobileOpen(false);\n return;\n }\n\n // Cmd/Ctrl + key - toggle sidebar\n if (e.key === keyboardShortcut && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n toggle();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [keyboardShortcut, isMobile, isMobileOpen, toggle]);\n\n // === CONTEXT VALUE ===\n const value = useMemo<SplitLayoutContextValue>(\n () => ({\n // Original API\n selectedKey,\n setSelectedKey,\n isOpen,\n setIsOpen,\n isMobileOpen,\n setMobileOpen,\n isMobile,\n breakpoint,\n mobileMode,\n intensity,\n stickyOffset,\n toggle,\n\n // shadcn aliases\n state: isOpen ? 'expanded' : 'collapsed',\n open: isOpen,\n setOpen: setIsOpen,\n openMobile: isMobileOpen,\n setOpenMobile: setMobileOpen,\n toggleSidebar: toggle,\n }),\n [\n selectedKey,\n setSelectedKey,\n isOpen,\n setIsOpen,\n isMobileOpen,\n isMobile,\n breakpoint,\n mobileMode,\n intensity,\n stickyOffset,\n toggle,\n ]\n );\n\n return <SplitLayoutContext.Provider value={value}>{children}</SplitLayoutContext.Provider>;\n};\n\nSplitLayoutProvider.displayName = 'SplitLayoutGlass.Provider';\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * SplitLayoutGlass Accordion Components\n *\n * Mobile-specific components that render content in accordion pattern.\n * Details expand below the selected item instead of showing in a separate panel.\n *\n * @module split-layout-accordion\n */\n\nimport { forwardRef, type ReactNode, useId, useRef, useEffect, useCallback, useState } from 'react';\nimport { ChevronDown } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { GlassCard } from '@/components/glass/ui/glass-card';\nimport { useSplitLayout, useSplitLayoutOptional } from './split-layout-context';\n\n// ========================================\n// ACCORDION ROOT\n// ========================================\n\n/**\n * Props for SplitLayoutAccordion.Root component\n * Container for accordion items in mobile view\n */\nexport interface SplitLayoutAccordionRootProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /**\n * ARIA label for the accordion region\n * @default \"Content accordion\"\n */\n label?: string;\n}\n\nconst SplitLayoutAccordionRoot = forwardRef<HTMLDivElement, SplitLayoutAccordionRootProps>(\n ({ children, label = 'Content accordion', className, ...props }, ref) => {\n const context = useSplitLayoutOptional();\n const intensity = context?.intensity ?? 'medium';\n\n return (\n <GlassCard\n asChild\n intensity={intensity}\n padding=\"none\"\n className={cn('divide-y divide-white/10', className)}\n >\n <div ref={ref} role=\"region\" aria-label={label} data-split-accordion=\"\" {...props}>\n {children}\n </div>\n </GlassCard>\n );\n }\n);\n\nSplitLayoutAccordionRoot.displayName = 'SplitLayoutAccordion.Root';\n\n// ========================================\n// ACCORDION ITEM\n// ========================================\n\n/**\n * Props for SplitLayoutAccordion.Item component\n * A single accordion item with trigger and collapsible content\n */\nexport interface SplitLayoutAccordionItemProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n> {\n /**\n * Unique key for this item (used for selection)\n */\n itemKey: string;\n /**\n * Content shown in the trigger/header area\n */\n trigger: ReactNode;\n /**\n * Content shown when expanded (details)\n */\n children: ReactNode;\n /**\n * Disable this item\n * @default false\n */\n disabled?: boolean;\n}\n\nconst SplitLayoutAccordionItem = forwardRef<HTMLDivElement, SplitLayoutAccordionItemProps>(\n ({ itemKey, trigger, children, disabled = false, className, ...props }, ref) => {\n const { selectedKey, setSelectedKey } = useSplitLayout();\n const isExpanded = selectedKey === itemKey;\n const contentRef = useRef<HTMLDivElement>(null);\n const [contentHeight, setContentHeight] = useState<number | null>(null);\n const triggerId = useId();\n const contentId = useId();\n\n // Measure content height for smooth animation\n useEffect(() => {\n if (contentRef.current) {\n setContentHeight(contentRef.current.scrollHeight);\n }\n }, [children, isExpanded]);\n\n const handleToggle = useCallback(() => {\n if (disabled) return;\n setSelectedKey(isExpanded ? null : itemKey);\n }, [disabled, isExpanded, itemKey, setSelectedKey]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n handleToggle();\n break;\n case 'ArrowDown': {\n e.preventDefault();\n // Focus next item trigger\n const next = (e.currentTarget as HTMLElement).parentElement?.nextElementSibling;\n const nextTrigger = next?.querySelector('[data-accordion-trigger]') as HTMLElement;\n nextTrigger?.focus();\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n // Focus previous item trigger\n const prev = (e.currentTarget as HTMLElement).parentElement?.previousElementSibling;\n const prevTrigger = prev?.querySelector('[data-accordion-trigger]') as HTMLElement;\n prevTrigger?.focus();\n break;\n }\n case 'Home': {\n e.preventDefault();\n // Focus first item trigger\n const first = (e.currentTarget as HTMLElement)\n .closest('[data-split-accordion]')\n ?.querySelector('[data-accordion-trigger]') as HTMLElement;\n first?.focus();\n break;\n }\n case 'End': {\n e.preventDefault();\n // Focus last item trigger\n const triggers = (e.currentTarget as HTMLElement)\n .closest('[data-split-accordion]')\n ?.querySelectorAll('[data-accordion-trigger]');\n const last = triggers?.[triggers.length - 1] as HTMLElement;\n last?.focus();\n break;\n }\n }\n },\n [disabled, handleToggle]\n );\n\n return (\n <div\n ref={ref}\n data-accordion-item=\"\"\n data-state={isExpanded ? 'open' : 'closed'}\n data-disabled={disabled || undefined}\n className={cn('overflow-hidden', disabled && 'opacity-50 cursor-not-allowed', className)}\n {...props}\n >\n {/* Trigger/Header */}\n <button\n type=\"button\"\n id={triggerId}\n data-accordion-trigger=\"\"\n aria-expanded={isExpanded}\n aria-controls={contentId}\n aria-disabled={disabled}\n disabled={disabled}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n className={cn(\n 'flex w-full items-center justify-between gap-4',\n 'p-4 text-left',\n 'transition-colors duration-200',\n 'hover:bg-white/5 focus-visible:bg-white/5',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20 focus-visible:ring-inset',\n disabled && 'pointer-events-none'\n )}\n >\n <div className=\"flex-1\">{trigger}</div>\n <ChevronDown\n className={cn(\n 'h-4 w-4 shrink-0 text-white/60',\n 'transition-transform duration-300 ease-out',\n isExpanded && 'rotate-180'\n )}\n />\n </button>\n\n {/* Content */}\n <div\n id={contentId}\n ref={contentRef}\n role=\"region\"\n aria-labelledby={triggerId}\n data-accordion-content=\"\"\n data-state={isExpanded ? 'open' : 'closed'}\n className={cn('overflow-hidden', 'transition-[max-height,opacity] duration-300 ease-out')}\n style={{\n maxHeight: isExpanded ? (contentHeight ?? 'auto') : 0,\n opacity: isExpanded ? 1 : 0,\n }}\n >\n <div className=\"p-4 pt-0 border-t border-white/5\">{children}</div>\n </div>\n </div>\n );\n }\n);\n\nSplitLayoutAccordionItem.displayName = 'SplitLayoutAccordion.Item';\n\n// ========================================\n// COMPOUND EXPORT\n// ========================================\n\n/**\n * SplitLayoutAccordion compound component for mobile accordion view\n *\n * @example\n * ```tsx\n * // Use with mobileMode=\"accordion\" in Provider\n * <SplitLayoutGlass.Provider mobileMode=\"accordion\">\n * {isMobile ? (\n * <SplitLayoutAccordion.Root>\n * {years.map((year) => (\n * <SplitLayoutAccordion.Item\n * key={year.id}\n * itemKey={year.id}\n * trigger={<YearTitle year={year} />}\n * >\n * <YearDetails year={year} />\n * </SplitLayoutAccordion.Item>\n * ))}\n * </SplitLayoutAccordion.Root>\n * ) : (\n * <SplitLayoutGlass.Root>...</SplitLayoutGlass.Root>\n * )}\n * </SplitLayoutGlass.Provider>\n * ```\n */\nexport const SplitLayoutAccordion = {\n Root: SplitLayoutAccordionRoot,\n Item: SplitLayoutAccordionItem,\n};\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * SplitLayoutGlass Component (Compound API only)\n *\n * A responsive two-column layout with sticky scroll behavior and glassmorphism styling.\n * Features independent scrolling in each panel after sticky positioning activates.\n *\n * @pattern MDN, GitHub Docs, Linear, shadcn Sidebar\n *\n * @example\n * ```tsx\n * <SplitLayoutGlass.Provider defaultSelectedKey=\"2024\">\n * <SplitLayoutGlass.Root ratio={{ sidebar: 1, main: 2 }}>\n * <SplitLayoutGlass.Sidebar>\n * <SplitLayoutGlass.SidebarHeader>Header</SplitLayoutGlass.SidebarHeader>\n * <SplitLayoutGlass.SidebarContent>Content</SplitLayoutGlass.SidebarContent>\n * </SplitLayoutGlass.Sidebar>\n * <SplitLayoutGlass.Main>\n * <SplitLayoutGlass.MainContent>Content</SplitLayoutGlass.MainContent>\n * </SplitLayoutGlass.Main>\n * </SplitLayoutGlass.Root>\n * </SplitLayoutGlass.Provider>\n * ```\n *\n * @since v2.2.0 - Legacy props API removed, Compound API only\n * @module split-layout-glass\n */\n\nimport { forwardRef, type CSSProperties, type ReactNode } from 'react';\nimport { Menu, X, PanelLeftClose, PanelLeftOpen } from 'lucide-react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '@/lib/utils';\nimport { GlassCard } from '@/components/glass/ui/glass-card';\nimport { ButtonGlass } from '@/components/glass/ui/button-glass';\nimport { ScrollArea } from '@/components/ui/scroll-area';\n\n// Import context\nimport {\n SplitLayoutProvider,\n useSplitLayout,\n useSplitLayoutOptional,\n type SplitLayoutProviderProps,\n type SplitLayoutContextValue,\n type Breakpoint,\n type MobileMode,\n} from './split-layout-context';\n\nimport '@/glass-theme.css';\n\n// ========================================\n// GRID STYLES HOOK\n// ========================================\n\ninterface GridStylesConfig {\n ratio?: { sidebar: number; main: number };\n minSidebarWidth?: string;\n maxSidebarWidth?: string;\n gap?: number | { mobile?: number; desktop?: number };\n stickyOffset?: number;\n}\n\nfunction useGridStyles(config: GridStylesConfig) {\n const {\n ratio = { sidebar: 1, main: 2 },\n minSidebarWidth = '280px',\n maxSidebarWidth,\n gap = { mobile: 16, desktop: 24 },\n stickyOffset = 24,\n } = config;\n\n const gapMobile = typeof gap === 'number' ? gap : (gap.mobile ?? 16);\n const gapDesktop = typeof gap === 'number' ? gap : (gap.desktop ?? 24);\n\n const gridTemplate = maxSidebarWidth\n ? `minmax(${minSidebarWidth}, ${maxSidebarWidth}) ${ratio.main}fr`\n : `minmax(${minSidebarWidth}, ${ratio.sidebar}fr) ${ratio.main}fr`;\n\n const cssVars = {\n '--grid-template': gridTemplate,\n '--sticky-offset': `${stickyOffset}px`,\n '--sticky-max-height': `calc(100vh - calc(${stickyOffset}px * 2))`,\n '--gap-mobile': `${gapMobile}px`,\n '--gap-desktop': `${gapDesktop}px`,\n } as CSSProperties;\n\n return { cssVars };\n}\n\n// ========================================\n// ROOT COMPONENT\n// ========================================\n\n/**\n * Props for SplitLayoutGlass.Root component\n */\nexport interface SplitLayoutRootProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /**\n * Sidebar to main ratio in fr units\n * @default { sidebar: 1, main: 2 } (33% / 67%)\n * @example { sidebar: 1, main: 3 } = 25% / 75%\n */\n ratio?: { sidebar: number; main: number };\n /**\n * Minimum sidebar width (CSS value)\n * Prevents sidebar from shrinking below this on tablet\n * @default \"280px\"\n */\n minSidebarWidth?: string;\n /**\n * Maximum sidebar width (CSS value)\n * @example \"400px\" - sidebar won't exceed 400px\n */\n maxSidebarWidth?: string;\n /**\n * Gap between panels\n * @default { mobile: 16, desktop: 24 }\n */\n gap?: number | { mobile?: number; desktop?: number };\n /**\n * Breakpoint for desktop layout (overrides Provider's breakpoint)\n * @default \"md\" (768px)\n */\n breakpoint?: Breakpoint;\n /**\n * Mobile layout mode (below breakpoint)\n * - \"stack\": sidebar above main\n * - \"main-only\": hide sidebar\n * - \"sidebar-only\": hide main\n * @default \"stack\"\n */\n mobileLayout?: 'stack' | 'main-only' | 'sidebar-only';\n}\n\nconst SplitLayoutRoot = forwardRef<HTMLDivElement, SplitLayoutRootProps>(\n (\n {\n children,\n ratio = { sidebar: 1, main: 2 },\n minSidebarWidth = '300px',\n maxSidebarWidth,\n gap = { mobile: 16, desktop: 24 },\n breakpoint: breakpointProp,\n mobileLayout = 'stack',\n className,\n ...props\n },\n ref\n ) => {\n const context = useSplitLayoutOptional();\n const breakpoint = breakpointProp ?? context?.breakpoint ?? 'md';\n const stickyOffset = context?.stickyOffset ?? 24;\n\n const { cssVars } = useGridStyles({\n ratio,\n minSidebarWidth,\n maxSidebarWidth,\n gap,\n stickyOffset,\n });\n\n const bp = breakpoint;\n\n // Build gap classes based on breakpoint\n const gapClasses = {\n sm: 'gap-[var(--gap-mobile)] sm:gap-[var(--gap-desktop)]',\n md: 'gap-[var(--gap-mobile)] md:gap-[var(--gap-desktop)]',\n lg: 'gap-[var(--gap-mobile)] lg:gap-[var(--gap-desktop)]',\n xl: 'gap-[var(--gap-mobile)] xl:gap-[var(--gap-desktop)]',\n '2xl': 'gap-[var(--gap-mobile)] 2xl:gap-[var(--gap-desktop)]',\n };\n\n const gridClasses = {\n sm: 'sm:grid-cols-(--grid-template)',\n md: 'md:grid-cols-(--grid-template)',\n lg: 'lg:grid-cols-(--grid-template)',\n xl: 'xl:grid-cols-(--grid-template)',\n '2xl': '2xl:grid-cols-(--grid-template)',\n };\n\n return (\n <div\n ref={ref}\n data-split-layout-root=\"\"\n data-state={context?.state ?? 'expanded'}\n className={cn(\n 'grid',\n // Align items to start so each column has height based on content\n 'items-start',\n mobileLayout === 'stack' && 'grid-cols-1',\n mobileLayout === 'main-only' && 'grid-cols-1 *:data-split-sidebar:hidden',\n mobileLayout === 'sidebar-only' && 'grid-cols-1 *:data-split-main:hidden',\n gridClasses[bp],\n gapClasses[bp],\n className\n )}\n style={cssVars}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSplitLayoutRoot.displayName = 'SplitLayoutGlass.Root';\n\n// ========================================\n// SIDEBAR COMPONENTS\n// ========================================\n\n/**\n * Props for SplitLayoutGlass.Sidebar component\n */\nexport interface SplitLayoutSidebarProps extends React.HTMLAttributes<HTMLElement> {\n children: ReactNode;\n /**\n * ARIA label for accessibility\n * @default \"Sidebar navigation\"\n */\n label?: string;\n}\n\nconst SplitLayoutSidebar = forwardRef<HTMLElement, SplitLayoutSidebarProps>(\n ({ children, label = 'Sidebar navigation', className, ...props }, ref) => {\n const context = useSplitLayoutOptional();\n const breakpoint = context?.breakpoint ?? 'md';\n const intensity = context?.intensity ?? 'medium';\n const bp = breakpoint;\n\n return (\n <GlassCard\n asChild\n intensity={intensity}\n padding=\"none\"\n className={cn(\n 'overflow-hidden rounded-xl',\n `${bp}:sticky`,\n `${bp}:top-[var(--sticky-offset)]`,\n `${bp}:max-h-[var(--sticky-max-height)]`,\n `${bp}:flex`,\n `${bp}:flex-col`,\n className\n )}\n >\n <aside ref={ref} data-split-sidebar=\"\" aria-label={label} {...props}>\n {children}\n </aside>\n </GlassCard>\n );\n }\n);\n\nSplitLayoutSidebar.displayName = 'SplitLayoutGlass.Sidebar';\n\n/**\n * Props for SplitLayoutGlass.SidebarHeader component\n * Header stays pinned at top when sidebar content scrolls\n */\nexport interface SplitLayoutSidebarHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nconst SplitLayoutSidebarHeader = forwardRef<HTMLDivElement, SplitLayoutSidebarHeaderProps>(\n ({ children, className, ...props }, ref) => (\n <div\n ref={ref}\n data-split-sidebar-header=\"\"\n className={cn('shrink-0 p-4 border-b border-white/10', className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nSplitLayoutSidebarHeader.displayName = 'SplitLayoutGlass.SidebarHeader';\n\n/**\n * Props for SplitLayoutGlass.SidebarContent component\n * Scrollable area for sidebar items\n */\nexport interface SplitLayoutSidebarContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /**\n * Auto-wrap in ScrollArea for independent scrolling\n * @default true\n */\n scrollable?: boolean;\n}\n\nconst SplitLayoutSidebarContent = forwardRef<HTMLDivElement, SplitLayoutSidebarContentProps>(\n ({ children, scrollable = true, className, ...props }, ref) => {\n if (scrollable) {\n // Extract only div-compatible props (ScrollArea doesn't accept all HTML div props)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { dir, ...divProps } = props;\n return (\n <ScrollArea\n ref={ref as React.Ref<HTMLDivElement>}\n data-split-sidebar-content=\"\"\n className={cn('flex-1 min-h-0', className)}\n {...divProps}\n >\n <div className=\"p-4\">{children}</div>\n </ScrollArea>\n );\n }\n\n return (\n <div\n ref={ref}\n data-split-sidebar-content=\"\"\n className={cn('flex-1 min-h-0 overflow-auto p-4', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSplitLayoutSidebarContent.displayName = 'SplitLayoutGlass.SidebarContent';\n\n/**\n * Props for SplitLayoutGlass.SidebarFooter component\n * Footer stays pinned at bottom when sidebar content scrolls\n */\nexport interface SplitLayoutSidebarFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nconst SplitLayoutSidebarFooter = forwardRef<HTMLDivElement, SplitLayoutSidebarFooterProps>(\n ({ children, className, ...props }, ref) => (\n <div\n ref={ref}\n data-split-sidebar-footer=\"\"\n className={cn('shrink-0 p-4 border-t border-white/10', className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nSplitLayoutSidebarFooter.displayName = 'SplitLayoutGlass.SidebarFooter';\n\n// ========================================\n// MAIN COMPONENTS\n// ========================================\n\n/**\n * Props for SplitLayoutGlass.Main component\n */\nexport interface SplitLayoutMainProps extends React.HTMLAttributes<HTMLElement> {\n children: ReactNode;\n /**\n * ARIA label for accessibility\n * @default \"Main content\"\n */\n label?: string;\n}\n\nconst SplitLayoutMain = forwardRef<HTMLElement, SplitLayoutMainProps>(\n ({ children, label = 'Main content', className, ...props }, ref) => {\n const context = useSplitLayoutOptional();\n const breakpoint = context?.breakpoint ?? 'md';\n const intensity = context?.intensity ?? 'medium';\n const bp = breakpoint;\n\n return (\n <GlassCard\n asChild\n intensity={intensity}\n padding=\"none\"\n className={cn(\n 'overflow-hidden rounded-xl',\n `${bp}:sticky`,\n `${bp}:top-[var(--sticky-offset)]`,\n `${bp}:max-h-[var(--sticky-max-height)]`,\n `${bp}:flex`,\n `${bp}:flex-col`,\n className\n )}\n >\n <main ref={ref} data-split-main=\"\" aria-label={label} {...props}>\n {children}\n </main>\n </GlassCard>\n );\n }\n);\n\nSplitLayoutMain.displayName = 'SplitLayoutGlass.Main';\n\n/**\n * Props for SplitLayoutGlass.MainHeader component\n * Header stays pinned at top when main content scrolls\n */\nexport interface SplitLayoutMainHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nconst SplitLayoutMainHeader = forwardRef<HTMLDivElement, SplitLayoutMainHeaderProps>(\n ({ children, className, ...props }, ref) => (\n <div\n ref={ref}\n data-split-main-header=\"\"\n className={cn('shrink-0 p-6 border-b border-white/10', className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nSplitLayoutMainHeader.displayName = 'SplitLayoutGlass.MainHeader';\n\n/**\n * Props for SplitLayoutGlass.MainContent component\n * Scrollable area for main content\n */\nexport interface SplitLayoutMainContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n /**\n * Auto-wrap in ScrollArea for independent scrolling\n * @default true\n */\n scrollable?: boolean;\n}\n\nconst SplitLayoutMainContent = forwardRef<HTMLDivElement, SplitLayoutMainContentProps>(\n ({ children, scrollable = true, className, ...props }, ref) => {\n if (scrollable) {\n // Extract only div-compatible props (ScrollArea doesn't accept all HTML div props)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { dir, ...divProps } = props;\n return (\n <ScrollArea\n ref={ref as React.Ref<HTMLDivElement>}\n data-split-main-content=\"\"\n className={cn('flex-1 min-h-0', className)}\n {...divProps}\n >\n <div className=\"p-6\">{children}</div>\n </ScrollArea>\n );\n }\n\n return (\n <div\n ref={ref}\n data-split-main-content=\"\"\n className={cn('flex-1 min-h-0 overflow-auto p-6', className)}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nSplitLayoutMainContent.displayName = 'SplitLayoutGlass.MainContent';\n\n/**\n * Props for SplitLayoutGlass.MainFooter component\n * Footer stays pinned at bottom when main content scrolls\n */\nexport interface SplitLayoutMainFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nconst SplitLayoutMainFooter = forwardRef<HTMLDivElement, SplitLayoutMainFooterProps>(\n ({ children, className, ...props }, ref) => (\n <div\n ref={ref}\n data-split-main-footer=\"\"\n className={cn('shrink-0 p-6 border-t border-white/10', className)}\n {...props}\n >\n {children}\n </div>\n )\n);\n\nSplitLayoutMainFooter.displayName = 'SplitLayoutGlass.MainFooter';\n\n// ========================================\n// TRIGGER COMPONENT\n// ========================================\n\n/**\n * Props for SplitLayoutGlass.Trigger component\n * Toggle button for sidebar collapse/expand\n */\nexport interface SplitLayoutTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Use Radix Slot for custom trigger elements\n * @default false\n */\n asChild?: boolean;\n /**\n * Show on desktop (hidden by default)\n * @default false\n */\n showOnDesktop?: boolean;\n /**\n * Icon variant\n * - \"menu\": hamburger/X icons\n * - \"panel\": panel collapse/expand icons\n * @default \"menu\"\n */\n variant?: 'menu' | 'panel';\n}\n\nconst SplitLayoutTrigger = forwardRef<HTMLButtonElement, SplitLayoutTriggerProps>(\n (\n { asChild = false, showOnDesktop = false, variant = 'menu', className, children, ...props },\n ref\n ) => {\n const { toggle, isOpen, isMobileOpen, isMobile, breakpoint } = useSplitLayout();\n\n const currentOpen = isMobile ? isMobileOpen : isOpen;\n\n const Icon =\n variant === 'menu' ? (currentOpen ? X : Menu) : currentOpen ? PanelLeftClose : PanelLeftOpen;\n\n const bp = breakpoint;\n const visibilityClass = showOnDesktop ? '' : `${bp}:hidden`;\n\n if (asChild) {\n return (\n <Slot\n ref={ref}\n onClick={toggle}\n aria-label={currentOpen ? 'Close sidebar' : 'Open sidebar'}\n aria-expanded={currentOpen}\n data-state={currentOpen ? 'open' : 'closed'}\n className={cn(visibilityClass, className)}\n {...props}\n >\n {children}\n </Slot>\n );\n }\n\n return (\n <ButtonGlass\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n onClick={toggle}\n aria-label={currentOpen ? 'Close sidebar' : 'Open sidebar'}\n aria-expanded={currentOpen}\n data-state={currentOpen ? 'open' : 'closed'}\n className={cn(visibilityClass, className)}\n {...props}\n >\n {children ?? <Icon className=\"h-5 w-5\" />}\n </ButtonGlass>\n );\n }\n);\n\nSplitLayoutTrigger.displayName = 'SplitLayoutGlass.Trigger';\n\n// ========================================\n// COMPOUND COMPONENT EXPORT\n// ========================================\n\n/**\n * SplitLayoutGlass compound component\n *\n * @example\n * ```tsx\n * <SplitLayoutGlass.Provider>\n * <SplitLayoutGlass.Root>\n * <SplitLayoutGlass.Sidebar>...</SplitLayoutGlass.Sidebar>\n * <SplitLayoutGlass.Main>...</SplitLayoutGlass.Main>\n * </SplitLayoutGlass.Root>\n * </SplitLayoutGlass.Provider>\n * ```\n */\nexport const SplitLayoutGlass = {\n Provider: SplitLayoutProvider,\n Root: SplitLayoutRoot,\n Sidebar: SplitLayoutSidebar,\n SidebarHeader: SplitLayoutSidebarHeader,\n SidebarContent: SplitLayoutSidebarContent,\n SidebarFooter: SplitLayoutSidebarFooter,\n Main: SplitLayoutMain,\n MainHeader: SplitLayoutMainHeader,\n MainContent: SplitLayoutMainContent,\n MainFooter: SplitLayoutMainFooter,\n Trigger: SplitLayoutTrigger,\n};\n\n// ========================================\n// ACCORDION EXPORT (re-export from separate file)\n// ========================================\n\nexport { SplitLayoutAccordion } from './split-layout-accordion';\nexport type {\n SplitLayoutAccordionRootProps,\n SplitLayoutAccordionItemProps,\n} from './split-layout-accordion';\n\n// ========================================\n// TYPE EXPORTS\n// ========================================\n\nexport type { SplitLayoutProviderProps, SplitLayoutContextValue, Breakpoint, MobileMode };\n\nexport { useSplitLayout, useSplitLayoutOptional };\n","/* 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"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animation durations in milliseconds
|
|
3
|
+
*/
|
|
4
|
+
export declare const ANIMATION_DURATION: {
|
|
5
|
+
readonly fast: 200;
|
|
6
|
+
readonly base: 300;
|
|
7
|
+
readonly slow: 500;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Z-index layers
|
|
11
|
+
*/
|
|
12
|
+
export declare const Z_INDEX: {
|
|
13
|
+
readonly dropdown: 50;
|
|
14
|
+
readonly modal: 50;
|
|
15
|
+
readonly tooltip: 60;
|
|
16
|
+
readonly toast: 70;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Breakpoints for responsive design
|
|
20
|
+
*/
|
|
21
|
+
export declare const BREAKPOINTS: {
|
|
22
|
+
readonly sm: 640;
|
|
23
|
+
readonly md: 768;
|
|
24
|
+
readonly lg: 1024;
|
|
25
|
+
readonly xl: 1280;
|
|
26
|
+
readonly "2xl": 1536;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,OAAO;;;;;CAKV,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom Hooks for Glass UI Library
|
|
3
|
+
*
|
|
4
|
+
* These hooks replace repeated patterns across components,
|
|
5
|
+
* reducing code duplication and ensuring consistency.
|
|
6
|
+
*/
|
|
7
|
+
export { useHover, type UseHoverOptions, type UseHoverReturn } from './use-hover';
|
|
8
|
+
export { useFocus, type UseFocusOptions, type UseFocusReturn } from './use-focus';
|
|
9
|
+
export { useResponsive, type UseResponsiveReturn, type Breakpoint } from './use-responsive';
|
|
10
|
+
export { useWallpaperTint, type WallpaperTintOptions, type WallpaperTintResult, } from './use-wallpaper-tint';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EACL,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { FocusEvent, KeyboardEvent } from 'react';
|
|
2
|
+
export interface UseFocusOptions {
|
|
3
|
+
/** Callback when focus state changes */
|
|
4
|
+
onFocusChange?: (isFocused: boolean) => void;
|
|
5
|
+
/** Include focus-visible behavior (keyboard focus only) */
|
|
6
|
+
focusVisible?: boolean;
|
|
7
|
+
/** Callback for keyboard events while focused */
|
|
8
|
+
onKeyDown?: (e: KeyboardEvent) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface UseFocusReturn {
|
|
11
|
+
/** Current focus state */
|
|
12
|
+
isFocused: boolean;
|
|
13
|
+
/** True only when focused via keyboard (if focusVisible enabled) */
|
|
14
|
+
isFocusVisible: boolean;
|
|
15
|
+
/** Props to spread on the target element */
|
|
16
|
+
focusProps: {
|
|
17
|
+
onFocus: (e: FocusEvent) => void;
|
|
18
|
+
onBlur: (e: FocusEvent) => void;
|
|
19
|
+
onKeyDown?: (e: KeyboardEvent) => void;
|
|
20
|
+
};
|
|
21
|
+
/** Manually set focus state */
|
|
22
|
+
setIsFocused: (value: boolean) => void;
|
|
23
|
+
/** Reference to track if last focus was from keyboard */
|
|
24
|
+
focusRef: React.RefObject<boolean>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Hook for managing focus state with optional focus-visible support.
|
|
28
|
+
*
|
|
29
|
+
* @example Basic usage
|
|
30
|
+
* ```tsx
|
|
31
|
+
* const { isFocused, focusProps } = useFocus();
|
|
32
|
+
*
|
|
33
|
+
* return (
|
|
34
|
+
* <input
|
|
35
|
+
* {...focusProps}
|
|
36
|
+
* style={{
|
|
37
|
+
* borderColor: isFocused ? 'violet' : 'gray',
|
|
38
|
+
* }}
|
|
39
|
+
* />
|
|
40
|
+
* );
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @example Focus-visible for keyboard navigation
|
|
44
|
+
* ```tsx
|
|
45
|
+
* const { isFocusVisible, focusProps } = useFocus({ focusVisible: true });
|
|
46
|
+
*
|
|
47
|
+
* return (
|
|
48
|
+
* <button
|
|
49
|
+
* {...focusProps}
|
|
50
|
+
* style={{
|
|
51
|
+
* outline: isFocusVisible ? '2px solid violet' : 'none',
|
|
52
|
+
* }}
|
|
53
|
+
* >
|
|
54
|
+
* Click or Tab to me
|
|
55
|
+
* </button>
|
|
56
|
+
* );
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
export declare function useFocus(options?: UseFocusOptions): UseFocusReturn;
|
|
60
|
+
export default useFocus;
|
|
61
|
+
//# sourceMappingURL=use-focus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-focus.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/use-focus.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AAsCf,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,2DAA2D;IAC3D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iDAAiD;IACjD,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,4CAA4C;IAC5C,UAAU,EAAE;QACV,OAAO,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;QACjC,MAAM,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;QAChC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;KACxC,CAAC;IACF,+BAA+B;IAC/B,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,yDAAyD;IACzD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CAmEtE;AAED,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { MouseEvent, FocusEvent } from 'react';
|
|
2
|
+
export interface UseHoverOptions {
|
|
3
|
+
/** Delay before hover state becomes true (ms) */
|
|
4
|
+
enterDelay?: number;
|
|
5
|
+
/** Delay before hover state becomes false (ms) */
|
|
6
|
+
leaveDelay?: number;
|
|
7
|
+
/** Include focus events for accessibility */
|
|
8
|
+
includeFocus?: boolean;
|
|
9
|
+
/** Callback when hover state changes */
|
|
10
|
+
onHoverChange?: (isHovered: boolean) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface UseHoverReturn {
|
|
13
|
+
/** Current hover state */
|
|
14
|
+
isHovered: boolean;
|
|
15
|
+
/** Props to spread on the target element */
|
|
16
|
+
hoverProps: {
|
|
17
|
+
onMouseEnter: (e: MouseEvent) => void;
|
|
18
|
+
onMouseLeave: (e: MouseEvent) => void;
|
|
19
|
+
onFocus?: (e: FocusEvent) => void;
|
|
20
|
+
onBlur?: (e: FocusEvent) => void;
|
|
21
|
+
};
|
|
22
|
+
/** Manually set hover state */
|
|
23
|
+
setIsHovered: (value: boolean) => void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Hook for managing hover state with optional delays and focus support.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* const { isHovered, hoverProps } = useHover();
|
|
31
|
+
*
|
|
32
|
+
* return (
|
|
33
|
+
* <div
|
|
34
|
+
* {...hoverProps}
|
|
35
|
+
* style={{ opacity: isHovered ? 1 : 0.8 }}
|
|
36
|
+
* >
|
|
37
|
+
* Hover me
|
|
38
|
+
* </div>
|
|
39
|
+
* );
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @example With options
|
|
43
|
+
* ```tsx
|
|
44
|
+
* const { isHovered, hoverProps } = useHover({
|
|
45
|
+
* enterDelay: 100,
|
|
46
|
+
* leaveDelay: 200,
|
|
47
|
+
* includeFocus: true,
|
|
48
|
+
* onHoverChange: (hover) => console.log('Hovered:', hover),
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare function useHover(options?: UseHoverOptions): UseHoverReturn;
|
|
53
|
+
export default useHover;
|
|
54
|
+
//# sourceMappingURL=use-hover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-hover.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/use-hover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAyB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC;AAEhF,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wCAAwC;IACxC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,UAAU,EAAE;QACV,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;QACtC,YAAY,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;QACtC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;KAClC,CAAC;IACF,+BAA+B;IAC/B,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,cAAc,CA4FtE;AAED,eAAe,QAAQ,CAAC"}
|