@tribepad/themis 1.9.0 → 1.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/elements/Checkbox/Checkbox.d.ts.map +1 -1
  3. package/dist/elements/Checkbox/index.js +1 -1
  4. package/dist/elements/Checkbox/index.js.map +1 -1
  5. package/dist/elements/Checkbox/index.mjs +1 -1
  6. package/dist/elements/Checkbox/index.mjs.map +1 -1
  7. package/dist/elements/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
  8. package/dist/elements/CheckboxGroup/index.js +1 -1
  9. package/dist/elements/CheckboxGroup/index.js.map +1 -1
  10. package/dist/elements/CheckboxGroup/index.mjs +1 -1
  11. package/dist/elements/CheckboxGroup/index.mjs.map +1 -1
  12. package/dist/elements/Filters/index.js +1 -1
  13. package/dist/elements/Filters/index.js.map +1 -1
  14. package/dist/elements/Filters/index.mjs +1 -1
  15. package/dist/elements/Filters/index.mjs.map +1 -1
  16. package/dist/elements/RadioGroup/RadioGroup.d.ts.map +1 -1
  17. package/dist/elements/RadioGroup/index.js +1 -1
  18. package/dist/elements/RadioGroup/index.js.map +1 -1
  19. package/dist/elements/RadioGroup/index.mjs +1 -1
  20. package/dist/elements/RadioGroup/index.mjs.map +1 -1
  21. package/dist/elements/Sidebar/Sidebar.styles.d.ts +4 -0
  22. package/dist/elements/Sidebar/Sidebar.styles.d.ts.map +1 -1
  23. package/dist/elements/Sidebar/index.js +1 -1
  24. package/dist/elements/Sidebar/index.js.map +1 -1
  25. package/dist/elements/Sidebar/index.mjs +1 -1
  26. package/dist/elements/Sidebar/index.mjs.map +1 -1
  27. package/dist/elements/SituationalJudgement/index.js +1 -1
  28. package/dist/elements/SituationalJudgement/index.js.map +1 -1
  29. package/dist/elements/SituationalJudgement/index.mjs +1 -1
  30. package/dist/elements/SituationalJudgement/index.mjs.map +1 -1
  31. package/dist/elements/Switch/Switch.d.ts.map +1 -1
  32. package/dist/elements/Switch/index.js +1 -1
  33. package/dist/elements/Switch/index.js.map +1 -1
  34. package/dist/elements/Switch/index.mjs +1 -1
  35. package/dist/elements/Switch/index.mjs.map +1 -1
  36. package/dist/elements/Table/index.js +1 -1
  37. package/dist/elements/Table/index.js.map +1 -1
  38. package/dist/elements/Table/index.mjs +1 -1
  39. package/dist/elements/Table/index.mjs.map +1 -1
  40. package/dist/elements/index.js +1 -1
  41. package/dist/elements/index.js.map +1 -1
  42. package/dist/elements/index.mjs +1 -1
  43. package/dist/elements/index.mjs.map +1 -1
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/index.mjs +1 -1
  47. package/dist/index.mjs.map +1 -1
  48. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useMediaQuery.ts","../../../src/utils/cn.ts","../../../src/styles/shared-variants.ts","../../../src/elements/Sidebar/Sidebar.styles.ts","../../../src/elements/Sidebar/SidebarRoot.tsx","../../../src/utils/browserExtensionOverlay.ts","../../../src/elements/Sidebar/SidebarMobileDrawer.tsx","../../../src/elements/Sidebar/SidebarCompound.tsx","../../../src/elements/Sidebar/SidebarRail.tsx","../../../src/elements/Sidebar/SidebarPopover.tsx","../../../src/elements/Sidebar/SidebarPanel.tsx","../../../src/elements/Sidebar/index.ts","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Sidebar/Sidebar.types.ts"],"names":["useMediaQuery","query","subscribe","useCallback","callback","mql","getSnapshot","getServerSnapshot","useSyncExternalStore","init_useMediaQuery","__esmMin","cn","inputs","twMerge","clsx","init_cn","combineStyles","styles","s","FOCUS_VISIBLE_RING","TOUCH_TARGET_MIN","FIELD_HEIGHTS","REDUCED_MOTION","TRANSITION_FAST","HOVER_ACCENT","init_shared_variants","sidebarRootVariants","sidebarRailVariants","sidebarRailToolbarVariants","sidebarRailItemVariants","sidebarRailItemIconVariants","sidebarRailItemLabelVariants","sidebarRailItemArrowVariants","sidebarRailItemBadgeVariants","sidebarPopoverVariants","sidebarPanelVariants","sidebarPanelHeaderVariants","sidebarPanelHeaderTitleVariants","sidebarCollapseButtonVariants","sidebarMobileOverlayVariants","sidebarMobileDrawerVariants","sidebarMobileDrawerHeaderVariants","sidebarMobileRailVariants","sidebarMobileRailItemVariants","sidebarMobileRailItemIconVariants","sidebarMobileRailItemLabelVariants","init_Sidebar_styles","cva","useSidebarLayout","ctx","useContext","SidebarLayoutContext","useSidebarState","SidebarStateContext","SidebarRoot","children","controlledCollapsed","defaultCollapsed","onCollapsedChange","controlledMobileOpen","onMobileOpenChange","mobileBreakpoint","className","testId","uncontrolledCollapsed","setUncontrolledCollapsed","useState","isCollapsedControlled","isCollapsed","setCollapsed","collapsed","toggleCollapsed","isMobileOpen","setMobileOpen","open","activePopoverId","setActivePopoverId","closeTimerRef","useRef","cancelPopoverClose","schedulePopoverClose","delayMs","useEffect","isMobile","uniqueId","useId","railId","panelId","layoutValue","useMemo","stateValue","jsx","init_SidebarRoot","createContext","isExtensionInjectedElement","element","node","depth","tag","root","custom","parent","createInteractOutsideGuard","consumerShouldClose","init_browserExtensionOverlay","SidebarMobileDrawer_exports","__export","SidebarMobileDrawer","formatBadge","count","extractRailItemPopover","railItem","popover","Children","child","isValidElement","extractContent","railItems","panelContent","railAriaLabel","displayName","railChild","typedChild","panelView","i","closeDrawer","AriaModalOverlay","AriaModal","jsxs","AriaDialog","AriaButton","X","props","hasPopover","isOpen","init_SidebarMobileDrawer","OPEN_DELAY","GRACE_PERIOD_MS","useHoverIntent","itemId","phase","openTimer","clearOpenTimer","onTriggerPointerEnter","e","onTriggerPointerLeave","SidebarPopoverInner","PopoverOverlay","overlayRef","handleKeyDown","handleFocusOut","overlay","relatedTarget","rail","PopoverContent","PopoverRegistryContext","usePopoverRegistry","PopoverRegistryProvider","entries","register","id","content","label","unregister","getContent","value","fwdRef","_props","ref","registry","entry","PANEL_TRANSITION_MS","PANEL_WIDTH_PX","SidebarPanel","forwardRef","width","ariaLabel","skeleton","panelRef","hasActivePopover","hasSettled","setHasSettled","timer","panelBody","panel","collapseBtn","setRefs","el","SidebarPanelHeader","title","icon","Heading","RailConfigContext","useRailConfig","SidebarRail","variant","showActiveIndicator","railConfig","collapseButtons","topItems","bottomItems","hasCollapseButton","Toolbar","extractPopover","rest","SidebarRailItemInner","href","badgeCount","isActive","currentType","isDisabled","onPress","railVariant","itemRef","isPopoverOpen","hoverHandlers","handlePress","resolvedTestId","itemClasses","Fragment","interactiveElement","AriaLink","SidebarRailItem","memo","prev","next","SidebarCollapseButton","ChevronsRight","ChevronsLeft","SidebarMobileDrawerLazy","lazy","mod","MobileDrawerBridge","Suspense","SidebarCompound","Sidebar","BaseComponentPropsSchema","z","SidebarRailVariantSchema","SidebarPanelWidthSchema","SidebarCurrentTypeSchema","SidebarPanelHeaderLevelSchema","SidebarRailItemPlacementSchema","SidebarPropsSchema","SidebarRailPropsSchema","SidebarRailItemPropsSchema","SidebarPopoverPropsSchema","SidebarPanelPropsSchema","SidebarPanelHeaderPropsSchema","SidebarCollapseButtonPropsSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { useCallback, useSyncExternalStore } from 'react';\n\n/**\n * SSR-safe media query hook using useSyncExternalStore.\n *\n * - No hydration mismatch flicker (getServerSnapshot returns false)\n * - Listener registered once per query value (no dependency bugs)\n * - Reacts to changes in real time\n *\n * @param query - CSS media query string, e.g. '(max-width: 767px)'\n * @returns Whether the media query currently matches\n */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = useCallback(\n (callback: () => void) => {\n const mql = window.matchMedia(query);\n mql.addEventListener('change', callback);\n return () => mql.removeEventListener('change', callback);\n },\n [query],\n );\n\n const getSnapshot = useCallback(\n () => window.matchMedia(query).matches,\n [query],\n );\n\n const getServerSnapshot = useCallback(() => false, []);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Shared CVA Variant Utilities\n *\n * Common patterns extracted from component variants for consistency and reduced bundle size.\n * Use these constants in CVA definitions to ensure consistent styling across Themis.\n *\n * @see interaction-states.ts for interaction-specific styles (focus, hover, pressed)\n */\n\n// =============================================================================\n// Focus Ring Patterns\n// =============================================================================\n\n/**\n * Focus-within ring (for container elements with focusable children)\n * Use when the container should show focus when any child is focused\n */\nexport const FOCUS_WITHIN_RING = [\n 'focus-within:outline-none',\n 'focus-within:ring-2',\n 'focus-within:ring-[var(--ring)]',\n 'focus-within:ring-offset-2',\n] as const;\n\n/**\n * Focus-visible ring (for directly focusable elements)\n * Use for buttons, inputs, and other interactive elements\n */\nexport const FOCUS_VISIBLE_RING = [\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n] as const;\n\n/**\n * Standard focus ring (for elements using :focus pseudo-class)\n * Prefer focus-visible when possible for better UX\n */\nexport const FOCUS_RING = [\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-[var(--ring)]',\n] as const;\n\n/**\n * Focus with background change (for segments, cells, menu items)\n */\nexport const FOCUS_HIGHLIGHT = [\n 'focus:outline-none',\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Disabled State Patterns\n// =============================================================================\n\n/**\n * Standard disabled state using disabled attribute\n */\nexport const DISABLED_STANDARD = [\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n] as const;\n\n/**\n * Disabled state using data attribute (React Aria pattern)\n */\nexport const DISABLED_DATA_ATTR = [\n 'data-[disabled]:pointer-events-none',\n 'data-[disabled]:opacity-50',\n 'data-[disabled]:cursor-not-allowed',\n] as const;\n\n// =============================================================================\n// Size-Based Text Variants\n// =============================================================================\n\n/**\n * Small text size scale (xs -> sm -> base)\n */\nexport const TEXT_SIZE_SMALL_SCALE = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n} as const;\n\n/**\n * Medium text size scale (sm -> base -> lg)\n */\nexport const TEXT_SIZE_MEDIUM_SCALE = {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n} as const;\n\n// =============================================================================\n// Touch Target Utilities\n// =============================================================================\n\n/**\n * WCAG 2.2 AAA minimum touch target (44x44px)\n */\nexport const TOUCH_TARGET_MIN = [\n 'min-h-[44px]',\n 'min-w-[44px]',\n] as const;\n\n/**\n * Common button/cell sizes with touch target compliance\n */\nexport const INTERACTIVE_SIZES = {\n sm: 'h-9 w-9', // 36px - desktop only, NOT AAA compliant\n default: 'h-11 w-11', // 44px - AAA compliant\n lg: 'h-14 w-14', // 56px - AAA compliant, enhanced\n} as const;\n\n/**\n * Height-only sizes for fields and inputs\n */\nexport const FIELD_HEIGHTS = {\n sm: 'h-9', // 36px\n default: 'h-10', // 40px\n lg: 'h-11', // 44px\n} as const;\n\n/**\n * Layer 2: Visual sizing for form field inputs (height + padding + font).\n * Use on the <input>, <select>, or trigger element itself.\n *\n * Components may append additional classes (e.g. gap-* for segmented fields, py-* for text inputs).\n */\nexport const FIELD_INPUT_SIZES = {\n sm: `${FIELD_HEIGHTS.sm} px-2 text-xs`,\n default: `${FIELD_HEIGHTS.default} px-3 text-sm`,\n lg: `${FIELD_HEIGHTS.lg} px-4 text-base`,\n} as const;\n\n/**\n * Layer 1: Invisible touch target wrapper for form fields.\n * Apply to a <label> (or wrapper div) around the input element.\n * The <label> natively routes clicks/taps to the contained input\n * without JavaScript — achieving a 44px touch target while the\n * input stays at its visual height (h-9/h-10/h-11).\n */\nexport const FIELD_TOUCH_TARGET = 'min-h-[44px] flex items-center' as const;\n\n// =============================================================================\n// Message/Feedback Patterns\n// =============================================================================\n\n/**\n * Error message styling\n */\nexport const ERROR_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--destructive-background)]',\n] as const;\n\n/**\n * Success message styling\n */\nexport const SUCCESS_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--success-background)]',\n] as const;\n\n/**\n * Description/helper text styling\n */\nexport const DESCRIPTION_BASE = [\n 'text-[var(--menu-muted)]',\n] as const;\n\n/**\n * Label base styling\n */\nexport const LABEL_BASE = [\n 'font-medium',\n 'text-[var(--content-foreground)]',\n] as const;\n\n/**\n * Required indicator pattern\n */\nexport const REQUIRED_INDICATOR = \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive-background)]\";\n\n// =============================================================================\n// Animation Patterns\n// =============================================================================\n\n/**\n * Popover/dropdown entry animation\n */\nexport const POPOVER_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n] as const;\n\n/**\n * Popover/dropdown exit animation\n */\nexport const POPOVER_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n] as const;\n\n/**\n * Modal content enter animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal content exit animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal slide enter animation (fade + slide up)\n */\nexport const MODAL_SLIDE_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:slide-in-from-bottom-4',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal slide exit animation (fade + slide down)\n */\nexport const MODAL_SLIDE_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:slide-out-to-bottom-4',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Directional slide animations for edge-anchored drawers (Modal `position` variant).\n *\n * Unitless `slide-in-from-*` / `slide-out-to-*` translate the full extent of the\n * element (100%), so the drawer slides all the way in from / out to its anchored\n * edge — distinct from `MODAL_SLIDE_*` above, which is the small 1rem nudge used by\n * the centred `slide` animation. No `fade` is paired here: a drawer slides, it\n * does not fade. Honour `prefers-reduced-motion` via REDUCED_MOTION on the element.\n */\nexport const MODAL_SLIDE_IN_LEFT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-left',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_LEFT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-left',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_RIGHT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-right',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_RIGHT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-right',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_TOP = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-top',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_TOP = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-top',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_BOTTOM = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-bottom',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_BOTTOM = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-bottom',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal overlay enter/exit animation (fade only)\n */\nexport const MODAL_OVERLAY_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:duration-200',\n] as const;\n\nexport const MODAL_OVERLAY_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:duration-150',\n] as const;\n\n/**\n * Reduced motion support (WCAG 2.2)\n */\nexport const REDUCED_MOTION = [\n 'motion-reduce:transition-none',\n 'motion-reduce:animate-none',\n] as const;\n\n/**\n * Standard transition for colors\n */\nexport const TRANSITION_COLORS = [\n 'transition-colors',\n 'duration-200',\n] as const;\n\n/**\n * Fast transition for interactions\n */\nexport const TRANSITION_FAST = [\n 'transition-colors',\n 'duration-150',\n] as const;\n\n// =============================================================================\n// Hover State Patterns\n// =============================================================================\n\n/**\n * Accent background on hover (for interactive items)\n */\nexport const HOVER_ACCENT = [\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Combines multiple style arrays into a flat array for CVA base styles\n */\nexport function combineStyles(...styles: (readonly string[] | string)[]): string[] {\n return styles.flatMap(s => Array.isArray(s) ? [...s] : [s]);\n}\n","import { cva } from 'class-variance-authority';\nimport {\n FOCUS_VISIBLE_RING,\n TOUCH_TARGET_MIN,\n HOVER_ACCENT,\n REDUCED_MOTION,\n TRANSITION_FAST,\n combineStyles,\n} from '../../styles/shared-variants';\n\n// =============================================================================\n// Root\n// =============================================================================\n\nexport const sidebarRootVariants = cva([\n 'flex',\n 'h-full',\n 'group/sidebar',\n]);\n\n// =============================================================================\n// Rail\n// =============================================================================\n\nexport const sidebarRailVariants = cva(\n [\n 'flex',\n 'flex-col',\n 'w-[80px]',\n 'shrink-0',\n 'pl-1',\n // `relative z-10` lifts the rail (and the active-item notch inside it) above\n // the panel, so the notch can straddle the divider and paint over the panel's\n // left edge. No internal x/y overflow clipping — a scroll container would clip\n // the notch on the perpendicular axis; the rail grows with its (few) items.\n 'relative',\n 'z-10',\n ],\n {\n variants: {\n variant: {\n // Default rail keeps its right-edge divider even when a Panel exists —\n // both surfaces are white, so the line (and the active-item notch that\n // sits on it) is what separates them.\n default: 'bg-[var(--menu-background)] border-r border-[var(--border)]',\n // Primary rail needs no divider: the purple/white colour edge separates it.\n primary: 'bg-[var(--primary-action)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\n// gap-0: rail items are contiguous so the hover highlight tracks item-to-item\n// with no dead-zone flash. Vertical rhythm comes from each item's own height.\nexport const sidebarRailToolbarVariants = cva([\n 'flex',\n 'flex-col',\n]);\n\n// =============================================================================\n// RailItem\n// =============================================================================\n\n/**\n * Rail item outer — the interactive element (link or button) and the Layer-1\n * touch target. Carries no background of its own: the visual treatment lives on\n * the icon chip (Layer 2). `min-h-[44px]` + full rail width keeps the 44x44 AAA\n * touch target regardless of the smaller chip/icon inside.\n */\nexport const sidebarRailItemVariants = cva(\n combineStyles(\n FOCUS_VISIBLE_RING,\n REDUCED_MOTION,\n TRANSITION_FAST,\n [\n 'group/railitem',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'w-full',\n 'min-h-[44px]',\n 'gap-1',\n 'py-1',\n 'rounded-[var(--radius-md)]',\n 'cursor-pointer',\n 'relative',\n 'select-none',\n ],\n ),\n {\n variants: {\n railVariant: {\n default: [],\n primary: [],\n },\n isActive: {\n true: [],\n false: [],\n },\n isDisabled: {\n true: [\n 'pointer-events-none',\n 'opacity-50',\n 'cursor-not-allowed',\n ],\n false: [],\n },\n },\n defaultVariants: {\n railVariant: 'default',\n isActive: false,\n isDisabled: false,\n },\n },\n);\n\n/**\n * Icon chip (Layer 2) — a fixed 30x30 rounded square. Hover keys off the\n * react-aria `data-hovered` attribute on the parent button (touch-safe), not\n * the `:hover` pseudo, so the tint never sticks on touch devices.\n */\nexport const sidebarRailItemIconVariants = cva(\n combineStyles(TRANSITION_FAST, [\n 'relative',\n 'flex',\n 'items-center',\n 'justify-center',\n 'shrink-0',\n 'size-[30px]',\n 'rounded-[9px]',\n '[&_svg]:size-4',\n '[&_svg]:shrink-0',\n '[&_svg]:pointer-events-none',\n ]),\n {\n variants: {\n railVariant: {\n default: [],\n primary: [],\n },\n isActive: {\n true: [],\n false: [],\n },\n },\n compoundVariants: [\n {\n railVariant: 'default',\n isActive: false,\n className: 'text-[var(--content-foreground)] group-data-[hovered]/railitem:bg-[var(--primary-action)]/10',\n },\n {\n railVariant: 'default',\n isActive: true,\n className: 'bg-[var(--primary-action)] text-[var(--primary-action-foreground)]',\n },\n {\n railVariant: 'primary',\n isActive: false,\n className: 'text-[var(--primary-action-foreground)] group-data-[hovered]/railitem:bg-white/10',\n },\n {\n railVariant: 'primary',\n isActive: true,\n className: 'bg-[var(--primary-action-foreground)] text-[var(--primary-action)]',\n },\n ],\n defaultVariants: {\n railVariant: 'default',\n isActive: false,\n },\n },\n);\n\nexport const sidebarRailItemLabelVariants = cva(\n [\n 'text-[11px]',\n 'font-normal',\n 'leading-tight',\n 'tracking-[0.165px]',\n 'text-center',\n 'max-w-full',\n 'truncate',\n ],\n {\n variants: {\n railVariant: {\n default: [],\n primary: 'text-[var(--primary-action-foreground)]',\n },\n isActive: {\n true: [],\n false: [],\n },\n },\n compoundVariants: [\n { railVariant: 'default', isActive: false, className: 'text-[var(--content-foreground)]' },\n { railVariant: 'default', isActive: true, className: 'text-[var(--primary-action)]' },\n ],\n defaultVariants: {\n railVariant: 'default',\n isActive: false,\n },\n },\n);\n\n/**\n * Active-item indicator — a left-pointing notch (`‹`) centred on the rail's\n * right-edge divider, at the active item's chip, pointing back at it. A 14px\n * square rotated 45° whose bottom + left borders form the left apex; the\n * panel-coloured fill (`--content-background`) masks the divider line behind it\n * so the line appears to bend into the notch (and reads as a white tab on the\n * purple primary rail). `translate-x-1/2` centres it on the divider; the rail's\n * `relative z-10` lets the right half paint over the panel's edge. Only shown\n * when a panel is present in the same root.\n */\nexport const sidebarRailItemArrowVariants = cva([\n 'absolute',\n 'right-0',\n 'top-1/2',\n 'z-10',\n 'size-[14px]',\n '-translate-y-1/2',\n 'translate-x-1/2',\n 'rotate-45',\n 'bg-[var(--content-background)]',\n 'border-b',\n 'border-l',\n 'border-[var(--border)]',\n 'hidden',\n 'group-has-[[data-sidebar-panel]]/sidebar:block',\n]);\n\nexport const sidebarRailItemBadgeVariants = cva([\n 'absolute',\n '-top-1.5',\n '-right-1.5',\n 'min-w-[18px]',\n 'h-[18px]',\n 'rounded-full',\n 'px-1',\n 'flex',\n 'items-center',\n 'justify-center',\n 'bg-[var(--destructive-background)]',\n 'text-[var(--destructive-foreground)]',\n 'text-[10px]',\n 'font-bold',\n 'leading-none',\n]);\n\n// =============================================================================\n// Popover\n// =============================================================================\n\n/**\n * Popover overlay — fills the panel area, same look as the panel.\n * Appears over the panel when a rail item with popover content is hovered/focused.\n */\nexport const sidebarPopoverVariants = cva([\n 'h-full',\n 'w-full',\n 'overflow-y-auto',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'text-sm',\n 'motion-safe:animate-in',\n 'motion-safe:fade-in-0',\n 'motion-safe:slide-in-from-bottom-1',\n 'motion-safe:duration-200',\n 'motion-safe:fill-mode-both',\n '[animation-delay:120ms]',\n]);\n\n// =============================================================================\n// Panel\n// =============================================================================\n\nexport const sidebarPanelVariants = cva(\n [\n 'flex',\n 'flex-col',\n 'h-full',\n 'overflow-hidden',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'motion-safe:transition-[max-width,opacity]',\n 'motion-safe:duration-[var(--transition-slow)]',\n ...REDUCED_MOTION,\n ],\n {\n variants: {\n width: {\n sm: 'max-w-[220px] w-[220px]',\n md: 'max-w-[260px] w-[260px]',\n lg: 'max-w-[340px] w-[340px]',\n xl: 'max-w-[420px] w-[420px]',\n },\n isCollapsed: {\n true: 'max-w-0 opacity-0 overflow-hidden',\n false: 'opacity-100',\n },\n },\n defaultVariants: {\n width: 'md',\n isCollapsed: false,\n },\n },\n);\n\nexport const sidebarPanelHeaderVariants = cva([\n 'flex',\n 'items-center',\n 'justify-between',\n 'px-3',\n 'py-2',\n 'shrink-0',\n]);\n\nexport const sidebarPanelHeaderTitleVariants = cva([\n 'text-base',\n 'font-semibold',\n 'text-[var(--content-foreground)]',\n 'truncate',\n]);\n\n// =============================================================================\n// CollapseButton\n// =============================================================================\n\nexport const sidebarCollapseButtonVariants = cva(\n combineStyles(\n TOUCH_TARGET_MIN,\n FOCUS_VISIBLE_RING,\n REDUCED_MOTION,\n TRANSITION_FAST,\n [\n 'inline-flex',\n 'items-center',\n 'justify-center',\n 'rounded-[var(--radius-md)]',\n '[&_svg]:size-4',\n '[&_svg]:shrink-0',\n 'cursor-pointer',\n 'mb-1',\n ],\n ),\n {\n variants: {\n railVariant: {\n default: [\n 'text-[var(--menu-foreground)]',\n ...HOVER_ACCENT,\n ],\n primary: [\n 'text-[var(--primary-action-foreground)]',\n 'hover:bg-white/10',\n ],\n },\n },\n defaultVariants: {\n railVariant: 'default',\n },\n },\n);\n\n// =============================================================================\n// Mobile Drawer\n// =============================================================================\n\nexport const sidebarMobileOverlayVariants = cva([\n 'fixed',\n 'inset-0',\n 'z-50',\n 'bg-black/50',\n]);\n\nexport const sidebarMobileDrawerVariants = cva([\n 'fixed',\n 'inset-y-0',\n 'left-0',\n 'z-50',\n 'flex',\n 'flex-col',\n 'w-[85vw]',\n 'max-w-[380px]',\n 'bg-[var(--content-background)]',\n]);\n\nexport const sidebarMobileDrawerHeaderVariants = cva([\n 'flex',\n 'items-center',\n 'justify-between',\n 'px-3',\n 'py-2',\n 'border-b',\n 'border-[var(--border)]',\n 'shrink-0',\n]);\n\nexport const sidebarMobileRailVariants = cva([\n 'flex',\n 'items-center',\n 'gap-1',\n 'px-2',\n 'py-2',\n 'overflow-x-auto',\n 'overflow-y-hidden',\n 'shrink-0',\n 'border-b',\n 'border-[var(--border)]',\n 'bg-[var(--menu-background)]',\n]);\n\nexport const sidebarMobileRailItemVariants = cva(\n combineStyles(\n TOUCH_TARGET_MIN,\n FOCUS_VISIBLE_RING,\n REDUCED_MOTION,\n TRANSITION_FAST,\n [\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'gap-0.5',\n 'px-2',\n 'py-1.5',\n 'rounded-[var(--radius-md)]',\n 'text-[var(--icon)]',\n 'shrink-0',\n 'cursor-pointer',\n ],\n ),\n {\n variants: {\n isActive: {\n true: [\n 'bg-[var(--primary-action)]',\n 'text-[var(--primary-action-foreground)]',\n ],\n false: [\n 'data-[hovered]:bg-[var(--primary-action)]/10',\n ],\n },\n },\n defaultVariants: {\n isActive: false,\n },\n },\n);\n\n/**\n * Mobile icon + label — unlike the desktop rail, the mobile item *itself* is the\n * coloured surface, so the icon and label inherit the button's text colour\n * (white when active) rather than carrying the desktop chip's own colours.\n */\nexport const sidebarMobileRailItemIconVariants = cva([\n 'relative',\n '[&_svg]:size-5',\n '[&_svg]:shrink-0',\n '[&_svg]:pointer-events-none',\n]);\n\nexport const sidebarMobileRailItemLabelVariants = cva(\n [\n 'text-[10px]',\n 'leading-tight',\n 'text-center',\n 'max-w-full',\n 'truncate',\n ],\n {\n variants: {\n isActive: {\n true: 'font-semibold',\n false: 'font-medium',\n },\n },\n defaultVariants: {\n isActive: false,\n },\n },\n);\n","'use client';\n\nimport {\n type ReactElement,\n createContext,\n useContext,\n useState,\n useId,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n} from 'react';\nimport { useMediaQuery } from '../../hooks/useMediaQuery';\nimport { cn } from '../../utils/cn';\nimport { sidebarRootVariants } from './Sidebar.styles';\nimport type { SidebarProps } from './Sidebar.types';\n\n// =============================================================================\n// Context — split into stable (layout) and volatile (state)\n// =============================================================================\n\nexport interface SidebarLayoutContextValue {\n isMobile: boolean;\n railId: string;\n panelId: string;\n}\n\nexport interface SidebarStateContextValue {\n isCollapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n toggleCollapsed: () => void;\n isMobileOpen: boolean;\n setMobileOpen: (open: boolean) => void;\n activePopoverId: string | null;\n setActivePopoverId: (id: string | null) => void;\n cancelPopoverClose: () => void;\n schedulePopoverClose: (delayMs?: number) => void;\n}\n\nconst SidebarLayoutContext = createContext<SidebarLayoutContextValue | null>(null);\nconst SidebarStateContext = createContext<SidebarStateContextValue | null>(null);\n\nexport function useSidebarLayout(): SidebarLayoutContextValue {\n const ctx = useContext(SidebarLayoutContext);\n if (!ctx) throw new Error('Sidebar compound components must be used within <Sidebar>');\n return ctx;\n}\n\nexport function useSidebarState(): SidebarStateContextValue {\n const ctx = useContext(SidebarStateContext);\n if (!ctx) throw new Error('Sidebar compound components must be used within <Sidebar>');\n return ctx;\n}\n\n// =============================================================================\n// SidebarRoot\n// =============================================================================\n\nfunction SidebarRoot({\n children,\n isCollapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n isMobileOpen: controlledMobileOpen,\n onMobileOpenChange,\n mobileBreakpoint = 768,\n className,\n 'data-testid': testId = 'sidebar',\n}: SidebarProps): ReactElement {\n // Controlled / uncontrolled collapse\n const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultCollapsed);\n const isCollapsedControlled = controlledCollapsed !== undefined;\n const isCollapsed = isCollapsedControlled ? controlledCollapsed : uncontrolledCollapsed;\n\n const setCollapsed = useCallback(\n (collapsed: boolean) => {\n if (!isCollapsedControlled) setUncontrolledCollapsed(collapsed);\n onCollapsedChange?.(collapsed);\n },\n [isCollapsedControlled, onCollapsedChange],\n );\n\n const toggleCollapsed = useCallback(\n () => setCollapsed(!isCollapsed),\n [setCollapsed, isCollapsed],\n );\n\n // Mobile open state (always controlled by consumer)\n const isMobileOpen = controlledMobileOpen ?? false;\n const setMobileOpen = useCallback(\n (open: boolean) => onMobileOpenChange?.(open),\n [onMobileOpenChange],\n );\n\n // Popover state\n const [activePopoverId, setActivePopoverId] = useState<string | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelPopoverClose = useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const schedulePopoverClose = useCallback((delayMs = 300) => {\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n setActivePopoverId(null);\n }, delayMs);\n }, []);\n\n useEffect(() => () => {\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n }, []);\n\n // Responsive\n const isMobile = useMediaQuery(`(max-width: ${mobileBreakpoint - 1}px)`);\n\n // IDs\n const uniqueId = useId();\n const railId = `sidebar-rail-${uniqueId}`;\n const panelId = `sidebar-panel-${uniqueId}`;\n\n // Memoised contexts\n const layoutValue = useMemo<SidebarLayoutContextValue>(\n () => ({ isMobile, railId, panelId }),\n [isMobile, railId, panelId],\n );\n\n const stateValue = useMemo<SidebarStateContextValue>(\n () => ({\n isCollapsed,\n setCollapsed,\n toggleCollapsed,\n isMobileOpen,\n setMobileOpen,\n activePopoverId,\n setActivePopoverId,\n cancelPopoverClose,\n schedulePopoverClose,\n }),\n [isCollapsed, setCollapsed, toggleCollapsed, isMobileOpen, setMobileOpen, activePopoverId, cancelPopoverClose, schedulePopoverClose],\n );\n\n // On mobile, render nothing inline — mobile drawer handles rendering\n if (isMobile) {\n return (\n <SidebarLayoutContext.Provider value={layoutValue}>\n <SidebarStateContext.Provider value={stateValue}>\n {children}\n </SidebarStateContext.Provider>\n </SidebarLayoutContext.Provider>\n );\n }\n\n return (\n <SidebarLayoutContext.Provider value={layoutValue}>\n <SidebarStateContext.Provider value={stateValue}>\n <div\n className={cn(sidebarRootVariants(), className)}\n data-testid={testId}\n >\n {children}\n </div>\n </SidebarStateContext.Provider>\n </SidebarLayoutContext.Provider>\n );\n}\n\nSidebarRoot.displayName = 'Sidebar';\n\nexport { SidebarRoot };\n","/**\n * Detection + dismissal guard for in-page writing-assistant browser extensions\n * (Grammarly, LanguageTool, Wordtune, …).\n *\n * These extensions inject their suggestion UI as elements appended to `<body>`,\n * outside any open overlay's DOM subtree. React Aria's `isDismissable` behaviour\n * treats a click on that injected UI as an \"outside click\" and dismisses the\n * overlay — so clicking a spelling suggestion silently closes the form pop-up\n * and discards the user's in-progress correction.\n *\n * The guard below lets overlays keep open when the interaction lands on an\n * extension-injected node, while every other outside click, Escape, and the\n * close button behave exactly as before.\n */\n\nconst MAX_ANCESTOR_DEPTH = 100;\n\n/**\n * Returns `true` when `element` belongs to an injected in-page writing\n * assistant (Grammarly, LanguageTool, Wordtune, …).\n *\n * UX-ONLY heuristic. This is a deliberately spoofable DOM sniff used solely to\n * keep a form pop-up open when a writing-assistant suggestion is clicked. It is\n * NOT a security/authorization control and must never gate access to data or\n * actions (the frontend is not a security boundary). Pure function — never log\n * the element (it can reference arbitrary DOM / user content).\n */\nexport function isExtensionInjectedElement(element: Element): boolean {\n if (!(element instanceof Element)) return false;\n\n // 1. Known-vendor markers (authoritative). Walk up via parentElement, and\n // climb shadow boundaries via getRootNode().host so detection still finds\n // the <grammarly-extension> host if React Aria's shadowDOM flag is ever\n // enabled (it defaults to false today → the document-level listener\n // already receives the retargeted host, so the parentElement walk alone\n // suffices currently). Depth-bounded as a defensive guard against a\n // crafted/overridden getRootNode/host returning a cycle (which would\n // otherwise hang the tab — a client-side DoS).\n let node: Element | null = element;\n for (let depth = 0; node && depth < MAX_ANCESTOR_DEPTH; depth++) {\n const tag = node.tagName?.toLowerCase() ?? '';\n if (tag.startsWith('grammarly-')) return true; // Grammarly\n if (tag.startsWith('lt-')) return true; // LanguageTool\n if (node.hasAttribute('data-grammarly-shadow-root')) return true;\n\n if (node.parentElement) {\n node = node.parentElement;\n } else {\n const root = node.getRootNode();\n node = root instanceof ShadowRoot ? root.host : null;\n }\n }\n\n // 2. Structural fallback (best-effort, future-proofs the long tail).\n // Extensions inject their UI as a custom element (hyphenated tag name)\n // mounted as a top-level sibling of the React root — i.e. a direct child\n // of <body>/<html>. Our app never renders body-level custom elements, and\n // React Aria portals render plain <div>s, so this stays safe for any\n // future first-party web component nested inside the app tree.\n let custom: Element | null = element;\n while (custom && !custom.tagName.includes('-')) {\n custom = custom.parentElement;\n }\n if (!custom) return false;\n\n const parent = custom.parentElement;\n return parent === document.body || parent === document.documentElement;\n}\n\n/**\n * Builds a `shouldCloseOnInteractOutside` predicate for React Aria overlays\n * that keeps the overlay open when the interaction targets an extension-injected\n * element, while preserving any consumer-supplied predicate.\n *\n * React Aria semantics: the predicate returns `true` ⇒ the overlay should\n * close. So we close only when the element is NOT extension-injected AND the\n * consumer (if any) also agrees it should close.\n */\nexport function createInteractOutsideGuard(\n consumerShouldClose?: (element: Element) => boolean,\n): (element: Element) => boolean {\n return (element: Element): boolean =>\n !isExtensionInjectedElement(element) && (consumerShouldClose?.(element) ?? true);\n}\n","'use client';\n\nimport {\n type ReactElement,\n type ReactNode,\n Children,\n isValidElement,\n} from 'react';\nimport {\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n Dialog as AriaDialog,\n} from 'react-aria-components';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { createInteractOutsideGuard } from '../../utils/browserExtensionOverlay';\nimport { useSidebarState } from './SidebarRoot';\nimport {\n sidebarMobileOverlayVariants,\n sidebarMobileDrawerVariants,\n sidebarMobileDrawerHeaderVariants,\n sidebarMobileRailVariants,\n sidebarMobileRailItemVariants,\n sidebarMobileRailItemIconVariants,\n sidebarMobileRailItemLabelVariants,\n sidebarRailItemBadgeVariants,\n sidebarCollapseButtonVariants,\n} from './Sidebar.styles';\nimport type { SidebarRailItemProps } from './Sidebar.types';\n\n// =============================================================================\n// Helper — extract rail items and panel content from Sidebar children\n// =============================================================================\n\ninterface ExtractedRailItem {\n props: SidebarRailItemProps;\n /** The `Sidebar.Popover` child inside the rail item, if any. */\n popover: ReactNode;\n}\n\ninterface ExtractedContent {\n railItems: ExtractedRailItem[];\n panelContent: ReactNode;\n railAriaLabel: string;\n}\n\nfunction formatBadge(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\n/**\n * Walks a rail item's children to find its `Sidebar.Popover` child so\n * the mobile drawer can surface it as the panel view when that rail\n * item is pressed — without needing the items to mount their\n * `SidebarRailItem` instances (which the desktop-only rail skips on\n * mobile).\n */\nfunction extractRailItemPopover(railItem: ReactElement<SidebarRailItemProps>): ReactNode {\n let popover: ReactNode = null;\n Children.forEach((railItem.props as { children?: ReactNode }).children, (child) => {\n if (!isValidElement(child)) return;\n if ((child.type as { displayName?: string }).displayName === 'SidebarPopover') {\n popover = child;\n }\n });\n return popover;\n}\n\nfunction extractContent(children: ReactNode): ExtractedContent {\n const railItems: ExtractedRailItem[] = [];\n let panelContent: ReactNode = null;\n let railAriaLabel = 'Navigation';\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n\n const displayName = (child.type as { displayName?: string }).displayName;\n\n if (displayName === 'SidebarRail') {\n railAriaLabel = (child.props as { 'aria-label'?: string })['aria-label'] ?? railAriaLabel;\n // Extract rail items from Rail's children\n Children.forEach((child.props as { children?: ReactNode }).children, (railChild) => {\n if (!isValidElement(railChild)) return;\n const railChildDisplayName = (railChild.type as { displayName?: string }).displayName;\n if (railChildDisplayName === 'SidebarRailItem') {\n const typedChild = railChild as ReactElement<SidebarRailItemProps>;\n railItems.push({\n props: typedChild.props,\n popover: extractRailItemPopover(typedChild),\n });\n }\n });\n } else if (displayName === 'SidebarPanel') {\n panelContent = (child.props as { children?: ReactNode }).children;\n }\n });\n\n return { railItems, panelContent, railAriaLabel };\n}\n\n// =============================================================================\n// MobileDrawer\n// =============================================================================\n\ninterface SidebarMobileDrawerProps {\n children: ReactNode;\n}\n\nexport function SidebarMobileDrawer({ children }: SidebarMobileDrawerProps): ReactElement | null {\n const { isMobileOpen, setMobileOpen, activePopoverId, setActivePopoverId } = useSidebarState();\n const { railItems, panelContent, railAriaLabel } = extractContent(children);\n\n // On mobile, a rail item with a popover opens that popover in the\n // panel area instead of navigating (so users can browse sub-nav for\n // a sibling zone without leaving the drawer). Rail items without a\n // popover still navigate via href.\n const activeRailItem = railItems.find((i) => i.props.id === activePopoverId);\n const panelView = activeRailItem?.popover ?? panelContent;\n\n const closeDrawer = (): void => {\n setActivePopoverId(null);\n setMobileOpen(false);\n };\n\n return (\n <AriaModalOverlay\n isDismissable\n shouldCloseOnInteractOutside={createInteractOutsideGuard()}\n isOpen={isMobileOpen}\n onOpenChange={(open) => { if (!open) closeDrawer(); }}\n className={sidebarMobileOverlayVariants()}\n >\n <AriaModal className={sidebarMobileDrawerVariants()}>\n <AriaDialog\n aria-label=\"Navigation menu\"\n className=\"flex flex-col h-full outline-none\"\n >\n {/* Header with close button */}\n <header className={sidebarMobileDrawerHeaderVariants()}>\n <span className=\"text-base font-semibold text-[var(--content-foreground)]\">\n Menu\n </span>\n <AriaButton\n aria-label=\"Close navigation\"\n className={cn(sidebarCollapseButtonVariants())}\n onPress={closeDrawer}\n >\n <X />\n </AriaButton>\n </header>\n\n {/* Horizontal rail */}\n {railItems.length > 0 && (\n <div\n role=\"toolbar\"\n aria-orientation=\"horizontal\"\n aria-label={railAriaLabel}\n tabIndex={0}\n className={sidebarMobileRailVariants()}\n >\n {railItems.map(({ props, popover }) => {\n const hasPopover = popover !== null && popover !== undefined;\n const isOpen = activePopoverId === props.id;\n return (\n <AriaButton\n key={props.id}\n aria-current={props.isActive ? (props.currentType ?? 'page') : undefined}\n aria-haspopup={hasPopover ? 'dialog' : undefined}\n aria-expanded={hasPopover ? isOpen : undefined}\n isDisabled={props.isDisabled}\n className={sidebarMobileRailItemVariants({ isActive: (props.isActive ?? false) || isOpen })}\n onPress={() => {\n props.onPress?.();\n if (hasPopover) {\n // Toggle the zone's sub-nav into the drawer\n // panel — stay in the drawer rather than\n // navigating.\n setActivePopoverId(isOpen ? null : props.id);\n return;\n }\n if (props.href) {\n // Real navigation — close the drawer on the\n // way out so it isn't left open behind the\n // next page.\n window.location.href = props.href;\n closeDrawer();\n return;\n }\n // No popover and no href: the press only\n // drives consumer state via `onPress` (above);\n // keep the drawer open so the user stays in\n // context.\n }}\n data-testid={`sidebar-mobile-rail-item-${props.id}`}\n >\n <span className={sidebarMobileRailItemIconVariants()} aria-hidden=\"true\">\n {props.icon}\n {props.badgeCount != null && props.badgeCount > 0 && (\n <span className={sidebarRailItemBadgeVariants()} aria-hidden=\"true\">\n {formatBadge(props.badgeCount)}\n </span>\n )}\n </span>\n <span className={sidebarMobileRailItemLabelVariants({ isActive: (props.isActive ?? false) || isOpen })}>\n {props.label}\n </span>\n {props.badgeCount != null && props.badgeCount > 0 && (\n <span className=\"sr-only\">{props.badgeCount} notifications</span>\n )}\n </AriaButton>\n );\n })}\n </div>\n )}\n\n {/* Panel content — either the active rail item's popover or\n the default Sidebar.Panel children. */}\n {panelView && (\n <div\n className=\"flex-1 overflow-y-auto bg-[var(--content-background)] text-[var(--content-foreground)]\"\n data-testid=\"sidebar-mobile-panel-content\"\n >\n {panelView}\n </div>\n )}\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n );\n}\n","'use client';\n\nimport { Suspense, lazy, type ReactElement } from 'react';\nimport { SidebarRoot, useSidebarLayout, useSidebarState } from './SidebarRoot';\nimport { SidebarRail, SidebarRailItem, SidebarCollapseButton } from './SidebarRail';\nimport { SidebarPanel, SidebarPanelHeader, PopoverRegistryProvider } from './SidebarPanel';\nimport { SidebarPopover } from './SidebarPopover';\nimport type { SidebarProps } from './Sidebar.types';\n\n// Lazy-load mobile drawer — desktop users never download it\nconst SidebarMobileDrawerLazy = lazy(() =>\n import('./SidebarMobileDrawer').then((mod) => ({ default: mod.SidebarMobileDrawer })),\n);\n\n/**\n * Mobile drawer bridge — rendered inside context, lazy-loads drawer component.\n * Only mounts when isMobile is true.\n */\nfunction MobileDrawerBridge({ children }: { children: React.ReactNode }): ReactElement | null {\n const { isMobile } = useSidebarLayout();\n const { isMobileOpen } = useSidebarState();\n\n if (!isMobile) return null;\n if (!isMobileOpen) return null;\n\n return (\n <Suspense fallback={null}>\n <SidebarMobileDrawerLazy>{children}</SidebarMobileDrawerLazy>\n </Suspense>\n );\n}\n\n/**\n * Sidebar compound wrapper — adds mobile drawer bridge around children.\n */\nfunction SidebarCompound(props: SidebarProps): ReactElement {\n return (\n <SidebarRoot {...props}>\n <PopoverRegistryProvider>\n {props.children}\n <MobileDrawerBridge>{props.children}</MobileDrawerBridge>\n </PopoverRegistryProvider>\n </SidebarRoot>\n );\n}\n\nSidebarCompound.displayName = 'Sidebar';\n\n/**\n * Sidebar compound component with dot-syntax sub-components.\n *\n * @example\n * ```tsx\n * <Sidebar>\n * <Sidebar.Rail aria-label=\"Main navigation\">\n * <Sidebar.CollapseButton />\n * <Sidebar.RailItem id=\"home\" icon={<Home />} label=\"Home\" isActive />\n * </Sidebar.Rail>\n * <Sidebar.Panel width=\"md\" aria-label=\"Details\">\n * <Sidebar.PanelHeader title=\"Home\" />\n * {content}\n * </Sidebar.Panel>\n * </Sidebar>\n * ```\n */\nexport const Sidebar = Object.assign(SidebarCompound, {\n Rail: SidebarRail,\n RailItem: SidebarRailItem,\n Popover: SidebarPopover,\n Panel: SidebarPanel,\n PanelHeader: SidebarPanelHeader,\n CollapseButton: SidebarCollapseButton,\n});\n","'use client';\n\nimport {\n forwardRef,\n memo,\n useMemo,\n useRef,\n useCallback,\n useEffect,\n createContext,\n useContext,\n type ReactElement,\n type ReactNode,\n Children,\n isValidElement,\n} from 'react';\nimport { Toolbar } from 'react-aria-components';\nimport { Button as AriaButton, Link as AriaLink } from 'react-aria-components';\nimport { ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useSidebarLayout, useSidebarState } from './SidebarRoot';\nimport { useHoverIntent } from './SidebarPopover';\nimport { usePopoverRegistry } from './SidebarPanel';\nimport {\n sidebarRailVariants,\n sidebarRailToolbarVariants,\n sidebarRailItemVariants,\n sidebarRailItemIconVariants,\n sidebarRailItemLabelVariants,\n sidebarRailItemBadgeVariants,\n sidebarRailItemArrowVariants,\n sidebarCollapseButtonVariants,\n} from './Sidebar.styles';\nimport type {\n SidebarRailProps,\n SidebarRailItemProps,\n SidebarCollapseButtonProps,\n} from './Sidebar.types';\n\n// =============================================================================\n// Rail variant context — scoped to Rail, read by RailItem + CollapseButton\n// =============================================================================\n\ntype RailVariant = 'default' | 'primary';\n\ninterface RailConfig {\n variant: RailVariant;\n showActiveIndicator: boolean;\n}\n\nconst RailConfigContext = createContext<RailConfig>({\n variant: 'default',\n showActiveIndicator: true,\n});\n\nfunction useRailConfig(): RailConfig {\n return useContext(RailConfigContext);\n}\n\n// =============================================================================\n// SidebarRail\n// =============================================================================\n\nconst SidebarRail = forwardRef<HTMLElement, SidebarRailProps>(\n ({ children, 'aria-label': ariaLabel, variant = 'default', showActiveIndicator = true, className, 'data-testid': testId = 'sidebar-rail' }, ref) => {\n const { isMobile } = useSidebarLayout();\n const railConfig = useMemo<RailConfig>(\n () => ({ variant, showActiveIndicator }),\n [variant, showActiveIndicator],\n );\n\n // On mobile, don't render inline — MobileDrawer handles it\n if (isMobile) return null;\n\n // Separate CollapseButton from RailItems, and split RailItems by placement\n const collapseButtons: ReactNode[] = [];\n const topItems: ReactNode[] = [];\n const bottomItems: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && (child.type as { displayName?: string }).displayName === 'SidebarCollapseButton') {\n collapseButtons.push(child);\n return;\n }\n const placement = isValidElement(child)\n ? ((child.props as { placement?: 'top' | 'bottom' }).placement ?? 'top')\n : 'top';\n if (placement === 'bottom') {\n bottomItems.push(child);\n } else {\n topItems.push(child);\n }\n });\n\n // Items sit flush (no inter-item gap), so the rail provides its own breathing\n // room: a bottom pad always, and a top pad only when there's no CollapseButton\n // to occupy the top edge.\n const hasCollapseButton = collapseButtons.length > 0;\n\n return (\n <RailConfigContext.Provider value={railConfig}>\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={cn(\n sidebarRailVariants({ variant }),\n 'pb-2',\n !hasCollapseButton && 'pt-2',\n className,\n )}\n data-testid={testId}\n >\n {collapseButtons}\n <Toolbar\n orientation=\"vertical\"\n aria-label=\"Navigation items\"\n className={sidebarRailToolbarVariants()}\n >\n {topItems}\n </Toolbar>\n {bottomItems.length > 0 && (\n <Toolbar\n orientation=\"vertical\"\n aria-label=\"Secondary navigation items\"\n className={cn(sidebarRailToolbarVariants(), 'mt-auto')}\n data-testid=\"sidebar-rail-bottom\"\n >\n {bottomItems}\n </Toolbar>\n )}\n </nav>\n </RailConfigContext.Provider>\n );\n },\n);\n\nSidebarRail.displayName = 'SidebarRail';\n\n// =============================================================================\n// SidebarRailItem\n// =============================================================================\n\n/** Extract Sidebar.Popover children from RailItem children */\nfunction extractPopover(children: ReactNode): { popover: ReactNode; rest: ReactNode } {\n let popover: ReactNode = null;\n const rest: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && (child.type as { displayName?: string }).displayName === 'SidebarPopover') {\n popover = child;\n } else {\n rest.push(child);\n }\n });\n\n return { popover, rest: rest.length > 0 ? rest : null };\n}\n\nfunction formatBadge(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\nconst SidebarRailItemInner = forwardRef<HTMLElement, SidebarRailItemProps>(\n (\n {\n id,\n label,\n icon,\n href,\n badgeCount,\n isActive = false,\n currentType = 'page',\n isDisabled = false,\n onPress,\n children,\n className,\n 'data-testid': testId,\n },\n ref,\n ) => {\n const { activePopoverId, setActivePopoverId } = useSidebarState();\n const { variant: railVariant, showActiveIndicator } = useRailConfig();\n const itemRef = useRef<HTMLElement | null>(null);\n const { popover } = extractPopover(children);\n const hasPopover = popover !== null;\n const isPopoverOpen = activePopoverId === id;\n\n // Hover intent for popover\n const hoverHandlers = useHoverIntent(id, hasPopover);\n\n // Register popover content so the Panel overlay can render it\n const registry = usePopoverRegistry();\n useEffect(() => {\n if (hasPopover && popover) {\n registry.register(id, popover, label);\n return () => registry.unregister(id);\n }\n }, [id, hasPopover, popover, label, registry]);\n\n const handlePress = useCallback(() => {\n if (hasPopover) {\n setActivePopoverId(isPopoverOpen ? null : id);\n }\n onPress?.();\n }, [hasPopover, isPopoverOpen, id, onPress, setActivePopoverId]);\n\n const setRefs = useCallback(\n (el: HTMLElement | null) => {\n itemRef.current = el;\n if (typeof ref === 'function') ref(el);\n else if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = el;\n },\n [ref],\n );\n\n const resolvedTestId = testId ?? `sidebar-rail-item-${id}`;\n const itemClasses = className\n ? cn(sidebarRailItemVariants({ railVariant, isActive, isDisabled }), className)\n : sidebarRailItemVariants({ railVariant, isActive, isDisabled });\n\n const content = (\n <>\n {/* Chip row — full width so the active-item notch can anchor to the\n rail's right-edge divider while staying centred on the chip. */}\n <span className=\"relative flex w-full items-center justify-center\">\n <span className={sidebarRailItemIconVariants({ railVariant, isActive })} aria-hidden=\"true\">\n {icon}\n {badgeCount != null && badgeCount > 0 && (\n <span className={sidebarRailItemBadgeVariants()} aria-hidden=\"true\">\n {formatBadge(badgeCount)}\n </span>\n )}\n </span>\n {showActiveIndicator && isActive && (\n <span className={sidebarRailItemArrowVariants()} aria-hidden=\"true\" />\n )}\n </span>\n <span className={sidebarRailItemLabelVariants({ railVariant, isActive })}>\n {label}\n </span>\n {badgeCount != null && badgeCount > 0 && (\n <span className=\"sr-only\">{badgeCount} notifications</span>\n )}\n </>\n );\n\n const interactiveElement = href && !isDisabled ? (\n <AriaLink\n ref={setRefs as React.Ref<HTMLAnchorElement>}\n href={href}\n aria-current={isActive ? currentType : undefined}\n aria-haspopup={hasPopover ? 'dialog' : undefined}\n aria-expanded={hasPopover ? isPopoverOpen : undefined}\n className={itemClasses}\n data-testid={resolvedTestId}\n onPress={handlePress}\n >\n {content}\n </AriaLink>\n ) : (\n <AriaButton\n ref={setRefs as React.Ref<HTMLButtonElement>}\n isDisabled={isDisabled}\n aria-current={isActive ? currentType : undefined}\n aria-haspopup={hasPopover ? 'dialog' : undefined}\n aria-expanded={hasPopover ? isPopoverOpen : undefined}\n className={itemClasses}\n data-testid={resolvedTestId}\n onPress={handlePress}\n >\n {content}\n </AriaButton>\n );\n\n return (\n <div\n onPointerEnter={hoverHandlers.onTriggerPointerEnter}\n onPointerLeave={hoverHandlers.onTriggerPointerLeave}\n >\n {interactiveElement}\n </div>\n );\n },\n);\n\nSidebarRailItemInner.displayName = 'SidebarRailItem';\n\nconst SidebarRailItem = memo(SidebarRailItemInner, (prev, next) => (\n prev.id === next.id &&\n prev.isActive === next.isActive &&\n prev.badgeCount === next.badgeCount &&\n prev.isDisabled === next.isDisabled &&\n prev.label === next.label &&\n prev.className === next.className &&\n prev.href === next.href\n));\n\n// Preserve displayName through memo\n(SidebarRailItem as unknown as { displayName: string }).displayName = 'SidebarRailItem';\n\n// =============================================================================\n// SidebarCollapseButton\n// =============================================================================\n\nfunction SidebarCollapseButton({\n className,\n 'data-testid': testId = 'sidebar-collapse-button',\n}: SidebarCollapseButtonProps): ReactElement {\n const { isCollapsed, toggleCollapsed } = useSidebarState();\n const { variant: railVariant } = useRailConfig();\n\n return (\n <AriaButton\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className={cn(sidebarCollapseButtonVariants({ railVariant }), className)}\n data-testid={testId}\n onPress={toggleCollapsed}\n >\n {isCollapsed ? <ChevronsRight /> : <ChevronsLeft />}\n </AriaButton>\n );\n}\n\nSidebarCollapseButton.displayName = 'SidebarCollapseButton';\n\nexport { SidebarRail, SidebarRailItem, SidebarCollapseButton };\n","'use client';\n\nimport {\n useRef,\n useCallback,\n useEffect,\n type ReactElement,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport { useSidebarState } from './SidebarRoot';\nimport { sidebarPopoverVariants } from './Sidebar.styles';\nimport type { SidebarPopoverProps } from './Sidebar.types';\n\n// =============================================================================\n// useHoverIntent — hover state machine with ref-based internals\n//\n// Only the `activePopoverId` in context triggers re-renders.\n// Internal phase (IDLE, HOVERING_TRIGGER, OPEN, GRACE_PERIOD) tracked via ref.\n// =============================================================================\n\ntype HoverPhase = 'IDLE' | 'HOVERING_TRIGGER' | 'OPEN';\n\nconst OPEN_DELAY = 200;\nconst GRACE_PERIOD_MS = 300;\n\nexport interface HoverIntentHandlers {\n onTriggerPointerEnter: (e: React.PointerEvent) => void;\n onTriggerPointerLeave: () => void;\n}\n\nexport function useHoverIntent(\n itemId: string,\n hasPopover: boolean,\n): HoverIntentHandlers {\n const { activePopoverId, setActivePopoverId, cancelPopoverClose, schedulePopoverClose } = useSidebarState();\n const phase = useRef<HoverPhase>('IDLE');\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearOpenTimer = useCallback(() => {\n if (openTimer.current) { clearTimeout(openTimer.current); openTimer.current = null; }\n }, []);\n\n // Reset phase when this item's popover closes externally\n const isOpen = activePopoverId === itemId;\n useEffect(() => {\n if (!isOpen && phase.current !== 'IDLE') {\n clearOpenTimer();\n phase.current = 'IDLE';\n } else if (isOpen) {\n phase.current = 'OPEN';\n }\n }, [isOpen, clearOpenTimer]);\n\n useEffect(() => clearOpenTimer, [clearOpenTimer]);\n\n const onTriggerPointerEnter = useCallback((e: React.PointerEvent) => {\n if (!hasPopover) return;\n if (e.pointerType !== 'mouse') return;\n\n clearOpenTimer();\n cancelPopoverClose();\n\n if (phase.current === 'OPEN') return;\n\n phase.current = 'HOVERING_TRIGGER';\n openTimer.current = setTimeout(() => {\n phase.current = 'OPEN';\n setActivePopoverId(itemId);\n }, OPEN_DELAY);\n }, [itemId, hasPopover, setActivePopoverId, clearOpenTimer, cancelPopoverClose]);\n\n const onTriggerPointerLeave = useCallback(() => {\n if (!hasPopover) return;\n clearOpenTimer();\n\n if (phase.current === 'HOVERING_TRIGGER') {\n phase.current = 'IDLE';\n setActivePopoverId(null);\n return;\n }\n\n if (phase.current === 'OPEN') {\n schedulePopoverClose(GRACE_PERIOD_MS);\n }\n }, [hasPopover, setActivePopoverId, clearOpenTimer, schedulePopoverClose]);\n\n return { onTriggerPointerEnter, onTriggerPointerLeave };\n}\n\n// =============================================================================\n// SidebarPopover — marker component used as child of RailItem\n// =============================================================================\n\nfunction SidebarPopoverInner({\n children,\n className,\n 'data-testid': testId = 'sidebar-popover',\n}: SidebarPopoverProps): ReactElement | null {\n return (\n <div\n className={cn(sidebarPopoverVariants(), className)}\n data-testid={testId}\n >\n {children}\n </div>\n );\n}\n\nSidebarPopoverInner.displayName = 'SidebarPopover';\n\nexport { SidebarPopoverInner as SidebarPopover };\n","'use client';\n\nimport {\n forwardRef,\n useRef,\n useEffect,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport { useSidebarLayout, useSidebarState } from './SidebarRoot';\nimport {\n sidebarPanelVariants,\n sidebarPanelHeaderVariants,\n sidebarPanelHeaderTitleVariants,\n sidebarPopoverVariants,\n} from './Sidebar.styles';\nimport type { SidebarPanelProps, SidebarPanelHeaderProps } from './Sidebar.types';\n\n// =============================================================================\n// PopoverOverlay — renders active popover content over the panel\n// =============================================================================\n\nfunction PopoverOverlay(): ReactElement | null {\n const { activePopoverId, setActivePopoverId } = useSidebarState();\n const { isMobile } = useSidebarLayout();\n const overlayRef = useRef<HTMLDivElement>(null);\n\n // Escape closes popover\n useEffect(() => {\n if (!activePopoverId) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setActivePopoverId(null);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [activePopoverId, setActivePopoverId]);\n\n // Close when focus leaves the overlay (and isn't in the rail)\n useEffect(() => {\n if (!activePopoverId) return;\n\n const handleFocusOut = (e: FocusEvent) => {\n const overlay = overlayRef.current;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n if (!relatedTarget || !overlay) return;\n\n // If focus moved outside overlay AND outside the rail, close\n const rail = document.querySelector('[data-testid=\"sidebar-rail\"]');\n if (!overlay.contains(relatedTarget) && !rail?.contains(relatedTarget)) {\n setActivePopoverId(null);\n }\n };\n\n const overlay = overlayRef.current;\n overlay?.addEventListener('focusout', handleFocusOut);\n return () => overlay?.removeEventListener('focusout', handleFocusOut);\n }, [activePopoverId, setActivePopoverId]);\n\n if (isMobile || !activePopoverId) return null;\n\n // Find the popover content from the rail item that's active.\n // The PopoverRegistry (below) provides this via context.\n return (\n <PopoverContent ref={overlayRef} />\n );\n}\n\n// =============================================================================\n// PopoverRegistry — stores popover content per rail item id\n// =============================================================================\n\nimport { createContext, useContext, useMemo, useCallback } from 'react';\n\ninterface PopoverRegistryContextValue {\n register: (id: string, content: ReactNode, label: string) => void;\n unregister: (id: string) => void;\n getContent: (id: string) => { content: ReactNode; label: string } | null;\n}\n\nconst PopoverRegistryContext = createContext<PopoverRegistryContextValue | null>(null);\n\nexport function usePopoverRegistry(): PopoverRegistryContextValue {\n const ctx = useContext(PopoverRegistryContext);\n if (!ctx) throw new Error('usePopoverRegistry must be used within SidebarPanel');\n return ctx;\n}\n\nexport function PopoverRegistryProvider({ children }: { children: ReactNode }): ReactElement {\n const entries = useRef<Map<string, { content: ReactNode; label: string }>>(new Map());\n\n const register = useCallback((id: string, content: ReactNode, label: string) => {\n entries.current.set(id, { content, label });\n }, []);\n\n const unregister = useCallback((id: string) => {\n entries.current.delete(id);\n }, []);\n\n const getContent = useCallback((id: string) => {\n return entries.current.get(id) ?? null;\n }, []);\n\n const value = useMemo(() => ({ register, unregister, getContent }), [register, unregister, getContent]);\n\n return (\n <PopoverRegistryContext.Provider value={value}>\n {children}\n </PopoverRegistryContext.Provider>\n );\n}\n\n// =============================================================================\n// PopoverContent — reads from registry and renders\n// =============================================================================\n\nimport { forwardRef as fwdRef } from 'react';\n\nconst PopoverContent = fwdRef<HTMLDivElement>((_props, ref) => {\n const { activePopoverId, cancelPopoverClose, schedulePopoverClose } = useSidebarState();\n const registry = usePopoverRegistry();\n\n if (!activePopoverId) return null;\n\n const entry = registry.getContent(activePopoverId);\n if (!entry) return null;\n\n return (\n <div\n ref={ref}\n role=\"dialog\"\n aria-label={`${entry.label} details`}\n className={sidebarPopoverVariants()}\n data-testid=\"sidebar-popover\"\n onPointerEnter={cancelPopoverClose}\n onPointerLeave={() => schedulePopoverClose(300)}\n >\n {entry.content}\n </div>\n );\n});\n\nPopoverContent.displayName = 'PopoverContent';\n\n// =============================================================================\n// SidebarPanel\n// =============================================================================\n\n/**\n * Matches `--transition-slow` in `src/styles/defaults.css`. Used to\n * gate the skeleton swap so children only return once the panel is\n * fully expanded — and the children's natural width can't reflow\n * while the panel's `max-width` animates.\n */\nconst PANEL_TRANSITION_MS = 300;\n\n/**\n * Pixel widths matching the `width` variant in `Sidebar.styles.ts`.\n * Used to give the popover overlay an explicit width so it still\n * has room to render when the panel itself is collapsed (the\n * wrapper div has shrunk to 0 with the panel `aside`).\n */\nconst PANEL_WIDTH_PX: Record<'sm' | 'md' | 'lg' | 'xl', number> = {\n sm: 220,\n md: 260,\n lg: 340,\n xl: 420,\n};\n\nconst SidebarPanel = forwardRef<HTMLElement, SidebarPanelProps>(\n (\n {\n children,\n width = 'md',\n 'aria-label': ariaLabel,\n skeleton,\n className,\n 'data-testid': testId = 'sidebar-panel',\n },\n ref,\n ) => {\n const { isMobile } = useSidebarLayout();\n const { isCollapsed, activePopoverId } = useSidebarState();\n const panelRef = useRef<HTMLElement | null>(null);\n const hasActivePopover = activePopoverId !== null;\n\n // Skeleton swap — only relevant if a `skeleton` prop is provided.\n // `hasSettled` becomes true once the open transition completes;\n // collapse flips it back to false synchronously via the effect.\n // `showRealChildren` is derived synchronously from `isCollapsed`\n // so the swap happens on the same render the collapse starts —\n // never one tick late, so children can't be caught mid-reflow.\n const [hasSettled, setHasSettled] = useState(!isCollapsed);\n useEffect(() => {\n if (isCollapsed) {\n setHasSettled(false);\n return;\n }\n const timer = window.setTimeout(() => setHasSettled(true), PANEL_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isCollapsed]);\n const showRealChildren = !isCollapsed && hasSettled;\n const panelBody = skeleton !== undefined && !showRealChildren ? skeleton : children;\n\n // Focus management: move focus out of panel when it collapses\n useEffect(() => {\n if (!isCollapsed) return;\n\n const panel = panelRef.current;\n if (!panel) return;\n\n if (panel.contains(document.activeElement)) {\n const collapseBtn = document.querySelector<HTMLElement>(\n '[data-testid=\"sidebar-collapse-button\"]',\n );\n if (collapseBtn) {\n window.requestAnimationFrame(() => collapseBtn.focus());\n }\n }\n }, [isCollapsed]);\n\n const setRefs = (el: HTMLElement | null) => {\n panelRef.current = el;\n if (typeof ref === 'function') ref(el);\n else if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = el;\n };\n\n if (isMobile) return null;\n\n return (\n <div\n className={cn(\n 'relative shrink-0',\n // Panel's own right border separates panel from main content. While\n // collapsed (width 0) it would stack onto the rail's right border and\n // read as a double line, so drop it — the rail's border is the divider.\n !isCollapsed && 'border-r border-[var(--border)]',\n )}\n data-sidebar-panel=\"\"\n >\n {/* Real panel content (or skeleton placeholder during transitions) */}\n <aside\n ref={setRefs}\n aria-label={ariaLabel}\n aria-hidden={isCollapsed}\n inert={isCollapsed || undefined}\n className={cn(sidebarPanelVariants({ width, isCollapsed }), className)}\n data-testid={testId}\n >\n {panelBody}\n </aside>\n\n {/*\n * Popover overlay — always rendered when a popover is active,\n * regardless of the panel's collapse state. An explicit pixel\n * width (matching the panel's `width` variant) guarantees the\n * overlay still has drawing space when the panel wrapper has\n * shrunk to 0 (forced-collapsed / rail-only layouts). This\n * lets users hover rail items and navigate away even when\n * the main panel is hidden.\n */}\n {hasActivePopover && (\n <div\n className={cn(\n 'absolute top-0 left-0 z-10 h-full',\n // When the panel is collapsed the popover extends out\n // past the panel wrapper's own border, so give it its\n // own right border to delineate from the main content.\n // When expanded, the wrapper's border is already\n // visible behind the overlay — no extra border needed.\n isCollapsed && 'border-r border-[var(--border)]',\n )}\n style={{ width: `${PANEL_WIDTH_PX[width]}px` }}\n >\n <PopoverOverlay />\n </div>\n )}\n </div>\n );\n },\n);\n\nSidebarPanel.displayName = 'SidebarPanel';\n\n// =============================================================================\n// SidebarPanelHeader\n// =============================================================================\n\nfunction SidebarPanelHeader({\n title,\n icon,\n children,\n as: Heading = 'h2',\n className,\n 'data-testid': testId = 'sidebar-panel-header',\n}: SidebarPanelHeaderProps): ReactElement {\n return (\n <header\n className={cn(sidebarPanelHeaderVariants(), className)}\n data-testid={testId}\n >\n {children ?? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex shrink-0 items-center justify-center text-[var(--icon)]\"\n data-testid={`${testId}-icon`}\n >\n {icon}\n </span>\n ) : null}\n <Heading className={sidebarPanelHeaderTitleVariants()}>\n {title}\n </Heading>\n </div>\n )}\n </header>\n );\n}\n\nSidebarPanelHeader.displayName = 'SidebarPanelHeader';\n\nexport { SidebarPanel, SidebarPanelHeader };\n","// Compound component\nexport { Sidebar } from './SidebarCompound';\n\n// CVA variants\nexport {\n sidebarRootVariants,\n sidebarRailVariants,\n sidebarRailToolbarVariants,\n sidebarRailItemVariants,\n sidebarRailItemIconVariants,\n sidebarRailItemLabelVariants,\n sidebarRailItemBadgeVariants,\n sidebarPopoverVariants,\n sidebarPanelVariants,\n sidebarPanelHeaderVariants,\n sidebarPanelHeaderTitleVariants,\n sidebarCollapseButtonVariants,\n sidebarMobileOverlayVariants,\n sidebarMobileDrawerVariants,\n sidebarMobileDrawerHeaderVariants,\n sidebarMobileRailVariants,\n sidebarMobileRailItemVariants,\n} from './Sidebar.styles';\n\n// Zod schemas\nexport {\n SidebarPropsSchema,\n SidebarRailPropsSchema,\n SidebarRailItemPropsSchema,\n SidebarPopoverPropsSchema,\n SidebarPanelPropsSchema,\n SidebarPanelHeaderPropsSchema,\n SidebarCollapseButtonPropsSchema,\n SidebarRailVariantSchema,\n SidebarPanelWidthSchema,\n SidebarCurrentTypeSchema,\n SidebarPanelHeaderLevelSchema,\n} from './Sidebar.types';\n\n// Types\nexport type {\n SidebarProps,\n SidebarRailProps,\n SidebarRailItemProps,\n SidebarPopoverProps,\n SidebarPanelProps,\n SidebarPanelHeaderProps,\n SidebarCollapseButtonProps,\n SidebarRailVariant,\n SidebarPanelWidth,\n SidebarCurrentType,\n SidebarPanelHeaderLevel,\n} from './Sidebar.types';\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, ReactElement } from 'react';\n\n// =============================================================================\n// Enum Schemas\n// =============================================================================\n\nexport const SidebarRailVariantSchema = z.enum(['default', 'primary']);\nexport type SidebarRailVariant = z.infer<typeof SidebarRailVariantSchema>;\n\nexport const SidebarPanelWidthSchema = z.enum(['sm', 'md', 'lg', 'xl']);\nexport type SidebarPanelWidth = z.infer<typeof SidebarPanelWidthSchema>;\n\nexport const SidebarCurrentTypeSchema = z.enum(['page', 'true', 'location']);\nexport type SidebarCurrentType = z.infer<typeof SidebarCurrentTypeSchema>;\n\nexport const SidebarPanelHeaderLevelSchema = z.enum(['h1', 'h2', 'h3', 'h4']);\nexport type SidebarPanelHeaderLevel = z.infer<typeof SidebarPanelHeaderLevelSchema>;\n\nexport const SidebarRailItemPlacementSchema = z.enum(['top', 'bottom']);\nexport type SidebarRailItemPlacement = z.infer<typeof SidebarRailItemPlacementSchema>;\n\n// =============================================================================\n// Sidebar Root\n// =============================================================================\n\nexport const SidebarPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n isCollapsed: z.boolean().optional(),\n defaultCollapsed: z.boolean().optional().default(false),\n onCollapsedChange: z.custom<(collapsed: boolean) => void>().optional(),\n isMobileOpen: z.boolean().optional(),\n onMobileOpenChange: z.custom<(open: boolean) => void>().optional(),\n mobileBreakpoint: z.number().optional().default(768),\n});\n\nexport interface SidebarProps {\n children: ReactNode;\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n isMobileOpen?: boolean;\n onMobileOpenChange?: (open: boolean) => void;\n mobileBreakpoint?: number;\n className?: string;\n 'aria-label'?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar Rail\n// =============================================================================\n\nexport const SidebarRailPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n 'aria-label': z.string(),\n variant: SidebarRailVariantSchema.optional().default('default'),\n showActiveIndicator: z.boolean().optional().default(true),\n});\n\nexport interface SidebarRailProps {\n children: ReactNode;\n 'aria-label': string;\n variant?: SidebarRailVariant;\n /**\n * Show the active-item arrow indicator — a notch on the rail/panel divider\n * that points at the active item. Defaults to `true`.\n */\n showActiveIndicator?: boolean;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar RailItem\n// =============================================================================\n\nexport const SidebarRailItemPropsSchema = BaseComponentPropsSchema.extend({\n id: z.string(),\n label: z.string(),\n icon: z.custom<ReactElement>(),\n href: z.string().optional(),\n badgeCount: z.number().optional(),\n isActive: z.boolean().optional(),\n currentType: SidebarCurrentTypeSchema.optional().default('page'),\n isDisabled: z.boolean().optional(),\n onPress: z.custom<() => void>().optional(),\n children: z.custom<ReactNode>().optional(),\n placement: SidebarRailItemPlacementSchema.optional().default('top'),\n});\n\nexport interface SidebarRailItemProps {\n id: string;\n label: string;\n icon: ReactElement;\n href?: string;\n badgeCount?: number;\n isActive?: boolean;\n currentType?: SidebarCurrentType;\n isDisabled?: boolean;\n onPress?: () => void;\n children?: ReactNode;\n className?: string;\n 'data-testid'?: string;\n /**\n * Where the item is rendered in the rail.\n * - `'top'` (default) — grouped with the primary navigation items at the top.\n * - `'bottom'` — pinned to the bottom of the rail; useful for low-frequency\n * destinations like Settings or Admin.\n *\n * Items keep their declared order within each group.\n */\n placement?: SidebarRailItemPlacement;\n}\n\n// =============================================================================\n// Sidebar Popover\n// =============================================================================\n\nexport const SidebarPopoverPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport interface SidebarPopoverProps {\n children: ReactNode;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar Panel\n// =============================================================================\n\nexport const SidebarPanelPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n width: SidebarPanelWidthSchema.optional().default('md'),\n 'aria-label': z.string(),\n skeleton: z.custom<ReactNode>().optional(),\n});\n\nexport interface SidebarPanelProps {\n children: ReactNode;\n width?: SidebarPanelWidth;\n 'aria-label': string;\n /**\n * Optional placeholder rendered in place of `children` while the panel\n * is collapsed or mid-transition (collapsing/expanding). When the\n * panel is fully expanded, real `children` are shown.\n *\n * Use this to prevent text reflow as the panel's `max-width` animates\n * — the skeleton can be a fixed-width layout (e.g. `Skeleton` blocks)\n * that won't wrap/unwrap as the panel resizes.\n *\n * If omitted, behaviour is unchanged: `children` are always rendered\n * directly inside the panel.\n */\n skeleton?: ReactNode;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar PanelHeader\n// =============================================================================\n\nexport const SidebarPanelHeaderPropsSchema = BaseComponentPropsSchema.extend({\n title: z.string().optional(),\n icon: z.custom<ReactElement>().optional(),\n children: z.custom<ReactNode>().optional(),\n as: SidebarPanelHeaderLevelSchema.optional().default('h2'),\n});\n\nexport interface SidebarPanelHeaderProps {\n /**\n * Title text for the simple form. Combined with the optional `icon` prop,\n * this renders an icon + heading. Ignored when `children` is provided.\n */\n title?: string;\n /**\n * Optional icon rendered before the title. Typically a 16–20px lucide\n * (or other) icon; sizing is caller-controlled via the element's own\n * className. Marked `aria-hidden` by Themis since the title conveys the\n * same meaning. Ignored when `children` is provided.\n */\n icon?: ReactElement;\n /**\n * Slot for fully-custom header content (e.g. icon + heading + badge).\n * When provided, replaces the default title block — the consumer is\n * responsible for any heading element. The header container still applies\n * its own flex layout, padding, and `justify-between`.\n */\n children?: ReactNode;\n as?: SidebarPanelHeaderLevel;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar CollapseButton\n// =============================================================================\n\nexport const SidebarCollapseButtonPropsSchema = BaseComponentPropsSchema.extend({});\n\nexport interface SidebarCollapseButtonProps {\n className?: string;\n 'data-testid'?: string;\n}\n"]}
1
+ {"version":3,"sources":["../../../src/hooks/useMediaQuery.ts","../../../src/utils/cn.ts","../../../src/styles/shared-variants.ts","../../../src/elements/Sidebar/Sidebar.styles.ts","../../../src/elements/Sidebar/SidebarRoot.tsx","../../../src/utils/browserExtensionOverlay.ts","../../../src/elements/Sidebar/SidebarMobileDrawer.tsx","../../../src/elements/Sidebar/SidebarCompound.tsx","../../../src/elements/Sidebar/SidebarRail.tsx","../../../src/elements/Sidebar/SidebarPopover.tsx","../../../src/elements/Sidebar/SidebarPanel.tsx","../../../src/elements/Sidebar/index.ts","../../../src/schemas/BaseComponentProps.ts","../../../src/elements/Sidebar/Sidebar.types.ts"],"names":["useMediaQuery","query","subscribe","useCallback","callback","mql","getSnapshot","getServerSnapshot","useSyncExternalStore","init_useMediaQuery","__esmMin","cn","inputs","twMerge","clsx","init_cn","combineStyles","styles","s","FOCUS_VISIBLE_RING","TOUCH_TARGET_MIN","FIELD_HEIGHTS","REDUCED_MOTION","TRANSITION_FAST","HOVER_ACCENT","init_shared_variants","sidebarRootVariants","sidebarRailVariants","sidebarRailToolbarVariants","sidebarRailItemVariants","sidebarRailItemIconVariants","sidebarRailItemLabelVariants","sidebarRailItemArrowVariants","sidebarRailItemBadgeVariants","sidebarPopoverVariants","sidebarPanelVariants","sidebarPanelHeaderVariants","sidebarPanelHeaderTitleVariants","sidebarCollapseButtonVariants","sidebarMobileOverlayVariants","sidebarMobileDrawerVariants","sidebarMobileDrawerHeaderVariants","sidebarMobileRailVariants","sidebarMobileRailItemVariants","sidebarMobileRailItemIconVariants","sidebarMobileRailItemLabelVariants","init_Sidebar_styles","cva","useSidebarLayout","ctx","useContext","SidebarLayoutContext","useSidebarState","SidebarStateContext","SidebarRoot","children","controlledCollapsed","defaultCollapsed","onCollapsedChange","controlledMobileOpen","onMobileOpenChange","mobileBreakpoint","className","testId","uncontrolledCollapsed","setUncontrolledCollapsed","useState","isCollapsedControlled","isCollapsed","setCollapsed","collapsed","toggleCollapsed","isMobileOpen","setMobileOpen","open","activePopoverId","setActivePopoverId","closeTimerRef","useRef","cancelPopoverClose","schedulePopoverClose","delayMs","useEffect","isMobile","uniqueId","useId","railId","panelId","layoutValue","useMemo","stateValue","jsx","init_SidebarRoot","createContext","isExtensionInjectedElement","element","node","depth","tag","root","custom","parent","createInteractOutsideGuard","consumerShouldClose","init_browserExtensionOverlay","SidebarMobileDrawer_exports","__export","SidebarMobileDrawer","formatBadge","count","extractRailItemPopover","railItem","popover","Children","child","isValidElement","extractContent","railItems","panelContent","railAriaLabel","displayName","railChild","typedChild","panelView","i","closeDrawer","AriaModalOverlay","AriaModal","jsxs","AriaDialog","AriaButton","X","props","hasPopover","isOpen","init_SidebarMobileDrawer","OPEN_DELAY","GRACE_PERIOD_MS","useHoverIntent","itemId","phase","openTimer","clearOpenTimer","onTriggerPointerEnter","e","onTriggerPointerLeave","SidebarPopoverInner","PopoverOverlay","overlayRef","handleKeyDown","handleFocusOut","overlay","relatedTarget","rail","PopoverContent","PopoverRegistryContext","usePopoverRegistry","PopoverRegistryProvider","entries","register","id","content","label","unregister","getContent","value","fwdRef","_props","ref","registry","entry","PANEL_TRANSITION_MS","PANEL_WIDTH_PX","SidebarPanel","forwardRef","width","ariaLabel","skeleton","panelRef","hasActivePopover","hasSettled","setHasSettled","timer","panelBody","panel","collapseBtn","setRefs","el","SidebarPanelHeader","title","icon","Heading","RailConfigContext","useRailConfig","SidebarRail","variant","showActiveIndicator","railConfig","collapseButtons","topItems","bottomItems","hasCollapseButton","Toolbar","extractPopover","rest","SidebarRailItemInner","href","badgeCount","isActive","currentType","isDisabled","onPress","railVariant","itemRef","isPopoverOpen","hoverHandlers","handlePress","resolvedTestId","itemClasses","Fragment","interactiveElement","AriaLink","SidebarRailItem","memo","prev","next","SidebarCollapseButton","ChevronsRight","ChevronsLeft","SidebarMobileDrawerLazy","lazy","mod","MobileDrawerBridge","Suspense","SidebarCompound","Sidebar","BaseComponentPropsSchema","z","SidebarRailVariantSchema","SidebarPanelWidthSchema","SidebarCurrentTypeSchema","SidebarPanelHeaderLevelSchema","SidebarRailItemPlacementSchema","SidebarPropsSchema","SidebarRailPropsSchema","SidebarRailItemPropsSchema","SidebarPopoverPropsSchema","SidebarPanelPropsSchema","SidebarPanelHeaderPropsSchema","SidebarCollapseButtonPropsSchema"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client';\n\nimport { useCallback, useSyncExternalStore } from 'react';\n\n/**\n * SSR-safe media query hook using useSyncExternalStore.\n *\n * - No hydration mismatch flicker (getServerSnapshot returns false)\n * - Listener registered once per query value (no dependency bugs)\n * - Reacts to changes in real time\n *\n * @param query - CSS media query string, e.g. '(max-width: 767px)'\n * @returns Whether the media query currently matches\n */\nexport function useMediaQuery(query: string): boolean {\n const subscribe = useCallback(\n (callback: () => void) => {\n const mql = window.matchMedia(query);\n mql.addEventListener('change', callback);\n return () => mql.removeEventListener('change', callback);\n },\n [query],\n );\n\n const getSnapshot = useCallback(\n () => window.matchMedia(query).matches,\n [query],\n );\n\n const getServerSnapshot = useCallback(() => false, []);\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Shared CVA Variant Utilities\n *\n * Common patterns extracted from component variants for consistency and reduced bundle size.\n * Use these constants in CVA definitions to ensure consistent styling across Themis.\n *\n * @see interaction-states.ts for interaction-specific styles (focus, hover, pressed)\n */\n\n// =============================================================================\n// Focus Ring Patterns\n// =============================================================================\n\n/**\n * Focus-within ring (for container elements with focusable children)\n * Use when the container should show focus when any child is focused\n */\nexport const FOCUS_WITHIN_RING = [\n 'focus-within:outline-none',\n 'focus-within:ring-2',\n 'focus-within:ring-[var(--ring)]',\n 'focus-within:ring-offset-2',\n] as const;\n\n/**\n * Focus-visible ring (for directly focusable elements)\n * Use for buttons, inputs, and other interactive elements\n */\nexport const FOCUS_VISIBLE_RING = [\n 'focus-visible:outline-none',\n 'focus-visible:ring-2',\n 'focus-visible:ring-[var(--ring)]',\n 'focus-visible:ring-offset-2',\n] as const;\n\n/**\n * Standard focus ring (for elements using :focus pseudo-class)\n * Prefer focus-visible when possible for better UX\n */\nexport const FOCUS_RING = [\n 'focus:outline-none',\n 'focus:ring-2',\n 'focus:ring-[var(--ring)]',\n] as const;\n\n/**\n * Focus with background change (for segments, cells, menu items)\n */\nexport const FOCUS_HIGHLIGHT = [\n 'focus:outline-none',\n 'focus:bg-[var(--accent)]',\n 'focus:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Disabled State Patterns\n// =============================================================================\n\n/**\n * Standard disabled state using disabled attribute\n */\nexport const DISABLED_STANDARD = [\n 'disabled:pointer-events-none',\n 'disabled:opacity-50',\n] as const;\n\n/**\n * Disabled state using data attribute (React Aria pattern)\n */\nexport const DISABLED_DATA_ATTR = [\n 'data-[disabled]:pointer-events-none',\n 'data-[disabled]:opacity-50',\n 'data-[disabled]:cursor-not-allowed',\n] as const;\n\n// =============================================================================\n// Size-Based Text Variants\n// =============================================================================\n\n/**\n * Small text size scale (xs -> sm -> base)\n */\nexport const TEXT_SIZE_SMALL_SCALE = {\n sm: 'text-xs',\n default: 'text-sm',\n lg: 'text-base',\n} as const;\n\n/**\n * Medium text size scale (sm -> base -> lg)\n */\nexport const TEXT_SIZE_MEDIUM_SCALE = {\n sm: 'text-sm',\n default: 'text-base',\n lg: 'text-lg',\n} as const;\n\n// =============================================================================\n// Touch Target Utilities\n// =============================================================================\n\n/**\n * WCAG 2.2 AAA minimum touch target (44x44px)\n */\nexport const TOUCH_TARGET_MIN = [\n 'min-h-[44px]',\n 'min-w-[44px]',\n] as const;\n\n/**\n * Common button/cell sizes with touch target compliance\n */\nexport const INTERACTIVE_SIZES = {\n sm: 'h-9 w-9', // 36px - desktop only, NOT AAA compliant\n default: 'h-11 w-11', // 44px - AAA compliant\n lg: 'h-14 w-14', // 56px - AAA compliant, enhanced\n} as const;\n\n/**\n * Height-only sizes for fields and inputs\n */\nexport const FIELD_HEIGHTS = {\n sm: 'h-9', // 36px\n default: 'h-10', // 40px\n lg: 'h-11', // 44px\n} as const;\n\n/**\n * Layer 2: Visual sizing for form field inputs (height + padding + font).\n * Use on the <input>, <select>, or trigger element itself.\n *\n * Components may append additional classes (e.g. gap-* for segmented fields, py-* for text inputs).\n */\nexport const FIELD_INPUT_SIZES = {\n sm: `${FIELD_HEIGHTS.sm} px-2 text-xs`,\n default: `${FIELD_HEIGHTS.default} px-3 text-sm`,\n lg: `${FIELD_HEIGHTS.lg} px-4 text-base`,\n} as const;\n\n/**\n * Layer 1: Invisible touch target wrapper for form fields.\n * Apply to a <label> (or wrapper div) around the input element.\n * The <label> natively routes clicks/taps to the contained input\n * without JavaScript — achieving a 44px touch target while the\n * input stays at its visual height (h-9/h-10/h-11).\n */\nexport const FIELD_TOUCH_TARGET = 'min-h-[44px] flex items-center' as const;\n\n// =============================================================================\n// Message/Feedback Patterns\n// =============================================================================\n\n/**\n * Error message styling\n */\nexport const ERROR_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--destructive-background)]',\n] as const;\n\n/**\n * Success message styling\n */\nexport const SUCCESS_MESSAGE_BASE = [\n 'flex',\n 'items-center',\n 'gap-1.5',\n 'text-[var(--success-background)]',\n] as const;\n\n/**\n * Description/helper text styling\n */\nexport const DESCRIPTION_BASE = [\n 'text-[var(--menu-muted)]',\n] as const;\n\n/**\n * Label base styling\n */\nexport const LABEL_BASE = [\n 'font-medium',\n 'text-[var(--content-foreground)]',\n] as const;\n\n/**\n * Required indicator pattern\n */\nexport const REQUIRED_INDICATOR = \"after:content-['*'] after:ml-0.5 after:text-[var(--destructive-background)]\";\n\n// =============================================================================\n// Animation Patterns\n// =============================================================================\n\n/**\n * Popover/dropdown entry animation\n */\nexport const POPOVER_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n] as const;\n\n/**\n * Popover/dropdown exit animation\n */\nexport const POPOVER_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n] as const;\n\n/**\n * Modal content enter animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:zoom-in-95',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal content exit animation (fade + zoom)\n * Uses React Aria data-[entering]/data-[exiting] attributes\n */\nexport const MODAL_ANIMATION_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:zoom-out-95',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal slide enter animation (fade + slide up)\n */\nexport const MODAL_SLIDE_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:slide-in-from-bottom-4',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\n/**\n * Modal slide exit animation (fade + slide down)\n */\nexport const MODAL_SLIDE_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:slide-out-to-bottom-4',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Directional slide animations for edge-anchored drawers (Modal `position` variant).\n *\n * Unitless `slide-in-from-*` / `slide-out-to-*` translate the full extent of the\n * element (100%), so the drawer slides all the way in from / out to its anchored\n * edge — distinct from `MODAL_SLIDE_*` above, which is the small 1rem nudge used by\n * the centred `slide` animation. No `fade` is paired here: a drawer slides, it\n * does not fade. Honour `prefers-reduced-motion` via REDUCED_MOTION on the element.\n */\nexport const MODAL_SLIDE_IN_LEFT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-left',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_LEFT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-left',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_RIGHT = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-right',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_RIGHT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-right',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_TOP = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-top',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_TOP = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-top',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\nexport const MODAL_SLIDE_IN_BOTTOM = [\n 'data-[entering]:animate-in',\n 'data-[entering]:slide-in-from-bottom',\n 'data-[entering]:duration-200',\n 'data-[entering]:ease-out',\n] as const;\n\nexport const MODAL_SLIDE_OUT_BOTTOM = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:slide-out-to-bottom',\n 'data-[exiting]:duration-150',\n 'data-[exiting]:ease-in',\n] as const;\n\n/**\n * Modal overlay enter/exit animation (fade only)\n */\nexport const MODAL_OVERLAY_IN = [\n 'data-[entering]:animate-in',\n 'data-[entering]:fade-in-0',\n 'data-[entering]:duration-200',\n] as const;\n\nexport const MODAL_OVERLAY_OUT = [\n 'data-[exiting]:animate-out',\n 'data-[exiting]:fade-out-0',\n 'data-[exiting]:duration-150',\n] as const;\n\n/**\n * Reduced motion support (WCAG 2.2)\n */\nexport const REDUCED_MOTION = [\n 'motion-reduce:transition-none',\n 'motion-reduce:animate-none',\n] as const;\n\n/**\n * Standard transition for colors\n */\nexport const TRANSITION_COLORS = [\n 'transition-colors',\n 'duration-200',\n] as const;\n\n/**\n * Fast transition for interactions\n */\nexport const TRANSITION_FAST = [\n 'transition-colors',\n 'duration-150',\n] as const;\n\n// =============================================================================\n// Hover State Patterns\n// =============================================================================\n\n/**\n * Accent background on hover (for interactive items)\n */\nexport const HOVER_ACCENT = [\n 'hover:bg-[var(--accent)]',\n 'hover:text-[var(--accent-foreground)]',\n] as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Combines multiple style arrays into a flat array for CVA base styles\n */\nexport function combineStyles(...styles: (readonly string[] | string)[]): string[] {\n return styles.flatMap(s => Array.isArray(s) ? [...s] : [s]);\n}\n","import { cva } from 'class-variance-authority';\nimport {\n FOCUS_VISIBLE_RING,\n TOUCH_TARGET_MIN,\n HOVER_ACCENT,\n REDUCED_MOTION,\n TRANSITION_FAST,\n combineStyles,\n} from '../../styles/shared-variants';\n\n// =============================================================================\n// Root\n// =============================================================================\n\nexport const sidebarRootVariants = cva([\n 'flex',\n 'h-full',\n 'group/sidebar',\n]);\n\n// =============================================================================\n// Rail\n// =============================================================================\n\nexport const sidebarRailVariants = cva(\n [\n 'flex',\n 'flex-col',\n 'w-[80px]',\n 'shrink-0',\n 'pl-1',\n // `relative z-10` lifts the rail (and the active-item notch inside it) above\n // the panel, so the notch can straddle the divider and paint over the panel's\n // left edge. No internal x/y overflow clipping — a scroll container would clip\n // the notch on the perpendicular axis; the rail grows with its (few) items.\n 'relative',\n 'z-10',\n ],\n {\n variants: {\n variant: {\n // Default rail keeps its right-edge divider even when a Panel exists —\n // both surfaces are white, so the line (and the active-item notch that\n // sits on it) is what separates them.\n default: 'bg-[var(--menu-background)] border-r border-[var(--border)]',\n // Primary rail needs no divider: the purple/white colour edge separates it.\n primary: 'bg-[var(--primary-action)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\n// gap-0: rail items are contiguous so the hover highlight tracks item-to-item\n// with no dead-zone flash. Vertical rhythm comes from each item's own height.\nexport const sidebarRailToolbarVariants = cva([\n 'flex',\n 'flex-col',\n]);\n\n// =============================================================================\n// RailItem\n// =============================================================================\n\n/**\n * Rail item outer — the interactive element (link or button) and the Layer-1\n * touch target. Carries no background of its own: the visual treatment lives on\n * the icon chip (Layer 2). `min-h-[44px]` + full rail width keeps the 44x44 AAA\n * touch target regardless of the smaller chip/icon inside.\n */\nexport const sidebarRailItemVariants = cva(\n combineStyles(\n FOCUS_VISIBLE_RING,\n REDUCED_MOTION,\n TRANSITION_FAST,\n [\n 'group/railitem',\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'w-full',\n 'min-h-[44px]',\n 'gap-1',\n 'py-1',\n 'rounded-[var(--radius-md)]',\n 'cursor-pointer',\n 'relative',\n 'select-none',\n ],\n ),\n {\n variants: {\n railVariant: {\n default: [],\n primary: [],\n },\n isActive: {\n true: [],\n false: [],\n },\n isDisabled: {\n true: [\n 'pointer-events-none',\n 'opacity-50',\n 'cursor-not-allowed',\n ],\n false: [],\n },\n },\n defaultVariants: {\n railVariant: 'default',\n isActive: false,\n isDisabled: false,\n },\n },\n);\n\n/**\n * Icon chip (Layer 2) — a fixed 30x30 rounded square. Hover keys off the\n * react-aria `data-hovered` attribute on the parent button (touch-safe), not\n * the `:hover` pseudo, so the tint never sticks on touch devices.\n */\nexport const sidebarRailItemIconVariants = cva(\n combineStyles(TRANSITION_FAST, [\n 'relative',\n 'flex',\n 'items-center',\n 'justify-center',\n 'shrink-0',\n 'size-[30px]',\n 'rounded-[9px]',\n '[&_svg]:size-4',\n '[&_svg]:shrink-0',\n '[&_svg]:pointer-events-none',\n ]),\n {\n variants: {\n railVariant: {\n default: [],\n primary: [],\n },\n isActive: {\n true: [],\n false: [],\n },\n },\n compoundVariants: [\n {\n railVariant: 'default',\n isActive: false,\n className: 'text-[var(--content-foreground)] group-data-[hovered]/railitem:bg-[var(--primary-action)]/10',\n },\n {\n railVariant: 'default',\n isActive: true,\n className: 'bg-[var(--primary-action)] text-[var(--primary-action-foreground)]',\n },\n {\n railVariant: 'primary',\n isActive: false,\n className: 'text-[var(--primary-action-foreground)] group-data-[hovered]/railitem:bg-white/10',\n },\n {\n railVariant: 'primary',\n isActive: true,\n className: 'bg-[var(--primary-action-foreground)] text-[var(--primary-action)]',\n },\n ],\n defaultVariants: {\n railVariant: 'default',\n isActive: false,\n },\n },\n);\n\nexport const sidebarRailItemLabelVariants = cva(\n [\n 'text-[11px]',\n 'font-normal',\n 'leading-tight',\n 'tracking-[0.165px]',\n 'text-center',\n 'max-w-full',\n 'truncate',\n ],\n {\n variants: {\n railVariant: {\n default: [],\n primary: 'text-[var(--primary-action-foreground)]',\n },\n isActive: {\n true: [],\n false: [],\n },\n },\n compoundVariants: [\n { railVariant: 'default', isActive: false, className: 'text-[var(--content-foreground)]' },\n { railVariant: 'default', isActive: true, className: 'text-[var(--primary-action)]' },\n ],\n defaultVariants: {\n railVariant: 'default',\n isActive: false,\n },\n },\n);\n\n/**\n * Active-item indicator — a left-pointing notch (`‹`) centred on the rail's\n * right-edge divider, at the active item's chip, pointing back at it. A 14px\n * square rotated 45° whose bottom + left borders form the left apex; the\n * panel-coloured fill (`--content-background`) masks the divider line behind it\n * so the line appears to bend into the notch (and reads as a white tab on the\n * purple primary rail). `translate-x-1/2` centres it on the divider; the rail's\n * `relative z-10` lets the right half paint over the panel's edge. Only shown\n * when a panel is present in the same root.\n */\nexport const sidebarRailItemArrowVariants = cva([\n 'absolute',\n 'right-0',\n 'top-1/2',\n 'z-10',\n 'size-[14px]',\n '-translate-y-1/2',\n 'translate-x-1/2',\n 'rotate-45',\n 'bg-[var(--content-background)]',\n 'border-b',\n 'border-l',\n 'border-[var(--border)]',\n 'hidden',\n 'group-has-[[data-sidebar-panel]]/sidebar:block',\n]);\n\nexport const sidebarRailItemBadgeVariants = cva([\n 'absolute',\n '-top-1.5',\n '-right-1.5',\n 'min-w-[18px]',\n 'h-[18px]',\n 'rounded-full',\n 'px-1',\n 'flex',\n 'items-center',\n 'justify-center',\n 'bg-[var(--destructive-background)]',\n 'text-[var(--destructive-foreground)]',\n 'text-[10px]',\n 'font-bold',\n 'leading-none',\n]);\n\n// =============================================================================\n// Popover\n// =============================================================================\n\n/**\n * Popover overlay — fills the panel area, same look as the panel.\n * Appears over the panel when a rail item with popover content is hovered/focused.\n *\n * No `[animation-delay:...]`: the overlay is statically positioned, so there's\n * no measure-then-place frame to mask. A delayed enter caused a visible\n * double-animation (flash at full opacity, then fade from 0). Start the fade at mount.\n */\nexport const sidebarPopoverVariants = cva([\n 'h-full',\n 'w-full',\n 'overflow-y-auto',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'text-sm',\n 'motion-safe:animate-in',\n 'motion-safe:fade-in-0',\n 'motion-safe:slide-in-from-bottom-1',\n 'motion-safe:duration-200',\n 'motion-safe:fill-mode-both',\n]);\n\n// =============================================================================\n// Panel\n// =============================================================================\n\nexport const sidebarPanelVariants = cva(\n [\n 'flex',\n 'flex-col',\n 'h-full',\n 'overflow-hidden',\n 'bg-[var(--content-background)]',\n 'text-[var(--content-foreground)]',\n 'motion-safe:transition-[max-width,opacity]',\n 'motion-safe:duration-[var(--transition-slow)]',\n ...REDUCED_MOTION,\n ],\n {\n variants: {\n width: {\n sm: 'max-w-[220px] w-[220px]',\n md: 'max-w-[260px] w-[260px]',\n lg: 'max-w-[340px] w-[340px]',\n xl: 'max-w-[420px] w-[420px]',\n },\n isCollapsed: {\n true: 'max-w-0 opacity-0 overflow-hidden',\n false: 'opacity-100',\n },\n },\n defaultVariants: {\n width: 'md',\n isCollapsed: false,\n },\n },\n);\n\nexport const sidebarPanelHeaderVariants = cva([\n 'flex',\n 'items-center',\n 'justify-between',\n 'px-3',\n 'py-2',\n 'shrink-0',\n]);\n\nexport const sidebarPanelHeaderTitleVariants = cva([\n 'text-base',\n 'font-semibold',\n 'text-[var(--content-foreground)]',\n 'truncate',\n]);\n\n// =============================================================================\n// CollapseButton\n// =============================================================================\n\nexport const sidebarCollapseButtonVariants = cva(\n combineStyles(\n TOUCH_TARGET_MIN,\n FOCUS_VISIBLE_RING,\n REDUCED_MOTION,\n TRANSITION_FAST,\n [\n 'inline-flex',\n 'items-center',\n 'justify-center',\n 'rounded-[var(--radius-md)]',\n '[&_svg]:size-4',\n '[&_svg]:shrink-0',\n 'cursor-pointer',\n 'mb-1',\n ],\n ),\n {\n variants: {\n railVariant: {\n default: [\n 'text-[var(--menu-foreground)]',\n ...HOVER_ACCENT,\n ],\n primary: [\n 'text-[var(--primary-action-foreground)]',\n 'hover:bg-white/10',\n ],\n },\n },\n defaultVariants: {\n railVariant: 'default',\n },\n },\n);\n\n// =============================================================================\n// Mobile Drawer\n// =============================================================================\n\nexport const sidebarMobileOverlayVariants = cva([\n 'fixed',\n 'inset-0',\n 'z-50',\n 'bg-black/50',\n]);\n\nexport const sidebarMobileDrawerVariants = cva([\n 'fixed',\n 'inset-y-0',\n 'left-0',\n 'z-50',\n 'flex',\n 'flex-col',\n 'w-[85vw]',\n 'max-w-[380px]',\n 'bg-[var(--content-background)]',\n]);\n\nexport const sidebarMobileDrawerHeaderVariants = cva([\n 'flex',\n 'items-center',\n 'justify-between',\n 'px-3',\n 'py-2',\n 'border-b',\n 'border-[var(--border)]',\n 'shrink-0',\n]);\n\nexport const sidebarMobileRailVariants = cva([\n 'flex',\n 'items-center',\n 'gap-1',\n 'px-2',\n 'py-2',\n 'overflow-x-auto',\n 'overflow-y-hidden',\n 'shrink-0',\n 'border-b',\n 'border-[var(--border)]',\n 'bg-[var(--menu-background)]',\n]);\n\nexport const sidebarMobileRailItemVariants = cva(\n combineStyles(\n TOUCH_TARGET_MIN,\n FOCUS_VISIBLE_RING,\n REDUCED_MOTION,\n TRANSITION_FAST,\n [\n 'flex',\n 'flex-col',\n 'items-center',\n 'justify-center',\n 'gap-0.5',\n 'px-2',\n 'py-1.5',\n 'rounded-[var(--radius-md)]',\n 'text-[var(--icon)]',\n 'shrink-0',\n 'cursor-pointer',\n ],\n ),\n {\n variants: {\n isActive: {\n true: [\n 'bg-[var(--primary-action)]',\n 'text-[var(--primary-action-foreground)]',\n ],\n false: [\n 'data-[hovered]:bg-[var(--primary-action)]/10',\n ],\n },\n },\n defaultVariants: {\n isActive: false,\n },\n },\n);\n\n/**\n * Mobile icon + label — unlike the desktop rail, the mobile item *itself* is the\n * coloured surface, so the icon and label inherit the button's text colour\n * (white when active) rather than carrying the desktop chip's own colours.\n */\nexport const sidebarMobileRailItemIconVariants = cva([\n 'relative',\n '[&_svg]:size-5',\n '[&_svg]:shrink-0',\n '[&_svg]:pointer-events-none',\n]);\n\nexport const sidebarMobileRailItemLabelVariants = cva(\n [\n 'text-[10px]',\n 'leading-tight',\n 'text-center',\n 'max-w-full',\n 'truncate',\n ],\n {\n variants: {\n isActive: {\n true: 'font-semibold',\n false: 'font-medium',\n },\n },\n defaultVariants: {\n isActive: false,\n },\n },\n);\n","'use client';\n\nimport {\n type ReactElement,\n createContext,\n useContext,\n useState,\n useId,\n useCallback,\n useMemo,\n useRef,\n useEffect,\n} from 'react';\nimport { useMediaQuery } from '../../hooks/useMediaQuery';\nimport { cn } from '../../utils/cn';\nimport { sidebarRootVariants } from './Sidebar.styles';\nimport type { SidebarProps } from './Sidebar.types';\n\n// =============================================================================\n// Context — split into stable (layout) and volatile (state)\n// =============================================================================\n\nexport interface SidebarLayoutContextValue {\n isMobile: boolean;\n railId: string;\n panelId: string;\n}\n\nexport interface SidebarStateContextValue {\n isCollapsed: boolean;\n setCollapsed: (collapsed: boolean) => void;\n toggleCollapsed: () => void;\n isMobileOpen: boolean;\n setMobileOpen: (open: boolean) => void;\n activePopoverId: string | null;\n setActivePopoverId: (id: string | null) => void;\n cancelPopoverClose: () => void;\n schedulePopoverClose: (delayMs?: number) => void;\n}\n\nconst SidebarLayoutContext = createContext<SidebarLayoutContextValue | null>(null);\nconst SidebarStateContext = createContext<SidebarStateContextValue | null>(null);\n\nexport function useSidebarLayout(): SidebarLayoutContextValue {\n const ctx = useContext(SidebarLayoutContext);\n if (!ctx) throw new Error('Sidebar compound components must be used within <Sidebar>');\n return ctx;\n}\n\nexport function useSidebarState(): SidebarStateContextValue {\n const ctx = useContext(SidebarStateContext);\n if (!ctx) throw new Error('Sidebar compound components must be used within <Sidebar>');\n return ctx;\n}\n\n// =============================================================================\n// SidebarRoot\n// =============================================================================\n\nfunction SidebarRoot({\n children,\n isCollapsed: controlledCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n isMobileOpen: controlledMobileOpen,\n onMobileOpenChange,\n mobileBreakpoint = 768,\n className,\n 'data-testid': testId = 'sidebar',\n}: SidebarProps): ReactElement {\n // Controlled / uncontrolled collapse\n const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultCollapsed);\n const isCollapsedControlled = controlledCollapsed !== undefined;\n const isCollapsed = isCollapsedControlled ? controlledCollapsed : uncontrolledCollapsed;\n\n const setCollapsed = useCallback(\n (collapsed: boolean) => {\n if (!isCollapsedControlled) setUncontrolledCollapsed(collapsed);\n onCollapsedChange?.(collapsed);\n },\n [isCollapsedControlled, onCollapsedChange],\n );\n\n const toggleCollapsed = useCallback(\n () => setCollapsed(!isCollapsed),\n [setCollapsed, isCollapsed],\n );\n\n // Mobile open state (always controlled by consumer)\n const isMobileOpen = controlledMobileOpen ?? false;\n const setMobileOpen = useCallback(\n (open: boolean) => onMobileOpenChange?.(open),\n [onMobileOpenChange],\n );\n\n // Popover state\n const [activePopoverId, setActivePopoverId] = useState<string | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelPopoverClose = useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const schedulePopoverClose = useCallback((delayMs = 300) => {\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n closeTimerRef.current = setTimeout(() => {\n closeTimerRef.current = null;\n setActivePopoverId(null);\n }, delayMs);\n }, []);\n\n useEffect(() => () => {\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n }, []);\n\n // Responsive\n const isMobile = useMediaQuery(`(max-width: ${mobileBreakpoint - 1}px)`);\n\n // IDs\n const uniqueId = useId();\n const railId = `sidebar-rail-${uniqueId}`;\n const panelId = `sidebar-panel-${uniqueId}`;\n\n // Memoised contexts\n const layoutValue = useMemo<SidebarLayoutContextValue>(\n () => ({ isMobile, railId, panelId }),\n [isMobile, railId, panelId],\n );\n\n const stateValue = useMemo<SidebarStateContextValue>(\n () => ({\n isCollapsed,\n setCollapsed,\n toggleCollapsed,\n isMobileOpen,\n setMobileOpen,\n activePopoverId,\n setActivePopoverId,\n cancelPopoverClose,\n schedulePopoverClose,\n }),\n [isCollapsed, setCollapsed, toggleCollapsed, isMobileOpen, setMobileOpen, activePopoverId, cancelPopoverClose, schedulePopoverClose],\n );\n\n // On mobile, render nothing inline — mobile drawer handles rendering\n if (isMobile) {\n return (\n <SidebarLayoutContext.Provider value={layoutValue}>\n <SidebarStateContext.Provider value={stateValue}>\n {children}\n </SidebarStateContext.Provider>\n </SidebarLayoutContext.Provider>\n );\n }\n\n return (\n <SidebarLayoutContext.Provider value={layoutValue}>\n <SidebarStateContext.Provider value={stateValue}>\n <div\n className={cn(sidebarRootVariants(), className)}\n data-testid={testId}\n >\n {children}\n </div>\n </SidebarStateContext.Provider>\n </SidebarLayoutContext.Provider>\n );\n}\n\nSidebarRoot.displayName = 'Sidebar';\n\nexport { SidebarRoot };\n","/**\n * Detection + dismissal guard for in-page writing-assistant browser extensions\n * (Grammarly, LanguageTool, Wordtune, …).\n *\n * These extensions inject their suggestion UI as elements appended to `<body>`,\n * outside any open overlay's DOM subtree. React Aria's `isDismissable` behaviour\n * treats a click on that injected UI as an \"outside click\" and dismisses the\n * overlay — so clicking a spelling suggestion silently closes the form pop-up\n * and discards the user's in-progress correction.\n *\n * The guard below lets overlays keep open when the interaction lands on an\n * extension-injected node, while every other outside click, Escape, and the\n * close button behave exactly as before.\n */\n\nconst MAX_ANCESTOR_DEPTH = 100;\n\n/**\n * Returns `true` when `element` belongs to an injected in-page writing\n * assistant (Grammarly, LanguageTool, Wordtune, …).\n *\n * UX-ONLY heuristic. This is a deliberately spoofable DOM sniff used solely to\n * keep a form pop-up open when a writing-assistant suggestion is clicked. It is\n * NOT a security/authorization control and must never gate access to data or\n * actions (the frontend is not a security boundary). Pure function — never log\n * the element (it can reference arbitrary DOM / user content).\n */\nexport function isExtensionInjectedElement(element: Element): boolean {\n if (!(element instanceof Element)) return false;\n\n // 1. Known-vendor markers (authoritative). Walk up via parentElement, and\n // climb shadow boundaries via getRootNode().host so detection still finds\n // the <grammarly-extension> host if React Aria's shadowDOM flag is ever\n // enabled (it defaults to false today → the document-level listener\n // already receives the retargeted host, so the parentElement walk alone\n // suffices currently). Depth-bounded as a defensive guard against a\n // crafted/overridden getRootNode/host returning a cycle (which would\n // otherwise hang the tab — a client-side DoS).\n let node: Element | null = element;\n for (let depth = 0; node && depth < MAX_ANCESTOR_DEPTH; depth++) {\n const tag = node.tagName?.toLowerCase() ?? '';\n if (tag.startsWith('grammarly-')) return true; // Grammarly\n if (tag.startsWith('lt-')) return true; // LanguageTool\n if (node.hasAttribute('data-grammarly-shadow-root')) return true;\n\n if (node.parentElement) {\n node = node.parentElement;\n } else {\n const root = node.getRootNode();\n node = root instanceof ShadowRoot ? root.host : null;\n }\n }\n\n // 2. Structural fallback (best-effort, future-proofs the long tail).\n // Extensions inject their UI as a custom element (hyphenated tag name)\n // mounted as a top-level sibling of the React root — i.e. a direct child\n // of <body>/<html>. Our app never renders body-level custom elements, and\n // React Aria portals render plain <div>s, so this stays safe for any\n // future first-party web component nested inside the app tree.\n let custom: Element | null = element;\n while (custom && !custom.tagName.includes('-')) {\n custom = custom.parentElement;\n }\n if (!custom) return false;\n\n const parent = custom.parentElement;\n return parent === document.body || parent === document.documentElement;\n}\n\n/**\n * Builds a `shouldCloseOnInteractOutside` predicate for React Aria overlays\n * that keeps the overlay open when the interaction targets an extension-injected\n * element, while preserving any consumer-supplied predicate.\n *\n * React Aria semantics: the predicate returns `true` ⇒ the overlay should\n * close. So we close only when the element is NOT extension-injected AND the\n * consumer (if any) also agrees it should close.\n */\nexport function createInteractOutsideGuard(\n consumerShouldClose?: (element: Element) => boolean,\n): (element: Element) => boolean {\n return (element: Element): boolean =>\n !isExtensionInjectedElement(element) && (consumerShouldClose?.(element) ?? true);\n}\n","'use client';\n\nimport {\n type ReactElement,\n type ReactNode,\n Children,\n isValidElement,\n} from 'react';\nimport {\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n Dialog as AriaDialog,\n} from 'react-aria-components';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { createInteractOutsideGuard } from '../../utils/browserExtensionOverlay';\nimport { useSidebarState } from './SidebarRoot';\nimport {\n sidebarMobileOverlayVariants,\n sidebarMobileDrawerVariants,\n sidebarMobileDrawerHeaderVariants,\n sidebarMobileRailVariants,\n sidebarMobileRailItemVariants,\n sidebarMobileRailItemIconVariants,\n sidebarMobileRailItemLabelVariants,\n sidebarRailItemBadgeVariants,\n sidebarCollapseButtonVariants,\n} from './Sidebar.styles';\nimport type { SidebarRailItemProps } from './Sidebar.types';\n\n// =============================================================================\n// Helper — extract rail items and panel content from Sidebar children\n// =============================================================================\n\ninterface ExtractedRailItem {\n props: SidebarRailItemProps;\n /** The `Sidebar.Popover` child inside the rail item, if any. */\n popover: ReactNode;\n}\n\ninterface ExtractedContent {\n railItems: ExtractedRailItem[];\n panelContent: ReactNode;\n railAriaLabel: string;\n}\n\nfunction formatBadge(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\n/**\n * Walks a rail item's children to find its `Sidebar.Popover` child so\n * the mobile drawer can surface it as the panel view when that rail\n * item is pressed — without needing the items to mount their\n * `SidebarRailItem` instances (which the desktop-only rail skips on\n * mobile).\n */\nfunction extractRailItemPopover(railItem: ReactElement<SidebarRailItemProps>): ReactNode {\n let popover: ReactNode = null;\n Children.forEach((railItem.props as { children?: ReactNode }).children, (child) => {\n if (!isValidElement(child)) return;\n if ((child.type as { displayName?: string }).displayName === 'SidebarPopover') {\n popover = child;\n }\n });\n return popover;\n}\n\nfunction extractContent(children: ReactNode): ExtractedContent {\n const railItems: ExtractedRailItem[] = [];\n let panelContent: ReactNode = null;\n let railAriaLabel = 'Navigation';\n\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n\n const displayName = (child.type as { displayName?: string }).displayName;\n\n if (displayName === 'SidebarRail') {\n railAriaLabel = (child.props as { 'aria-label'?: string })['aria-label'] ?? railAriaLabel;\n // Extract rail items from Rail's children\n Children.forEach((child.props as { children?: ReactNode }).children, (railChild) => {\n if (!isValidElement(railChild)) return;\n const railChildDisplayName = (railChild.type as { displayName?: string }).displayName;\n if (railChildDisplayName === 'SidebarRailItem') {\n const typedChild = railChild as ReactElement<SidebarRailItemProps>;\n railItems.push({\n props: typedChild.props,\n popover: extractRailItemPopover(typedChild),\n });\n }\n });\n } else if (displayName === 'SidebarPanel') {\n panelContent = (child.props as { children?: ReactNode }).children;\n }\n });\n\n return { railItems, panelContent, railAriaLabel };\n}\n\n// =============================================================================\n// MobileDrawer\n// =============================================================================\n\ninterface SidebarMobileDrawerProps {\n children: ReactNode;\n}\n\nexport function SidebarMobileDrawer({ children }: SidebarMobileDrawerProps): ReactElement | null {\n const { isMobileOpen, setMobileOpen, activePopoverId, setActivePopoverId } = useSidebarState();\n const { railItems, panelContent, railAriaLabel } = extractContent(children);\n\n // On mobile, a rail item with a popover opens that popover in the\n // panel area instead of navigating (so users can browse sub-nav for\n // a sibling zone without leaving the drawer). Rail items without a\n // popover still navigate via href.\n const activeRailItem = railItems.find((i) => i.props.id === activePopoverId);\n const panelView = activeRailItem?.popover ?? panelContent;\n\n const closeDrawer = (): void => {\n setActivePopoverId(null);\n setMobileOpen(false);\n };\n\n return (\n <AriaModalOverlay\n isDismissable\n shouldCloseOnInteractOutside={createInteractOutsideGuard()}\n isOpen={isMobileOpen}\n onOpenChange={(open) => { if (!open) closeDrawer(); }}\n className={sidebarMobileOverlayVariants()}\n >\n <AriaModal className={sidebarMobileDrawerVariants()}>\n <AriaDialog\n aria-label=\"Navigation menu\"\n className=\"flex flex-col h-full outline-none\"\n >\n {/* Header with close button */}\n <header className={sidebarMobileDrawerHeaderVariants()}>\n <span className=\"text-base font-semibold text-[var(--content-foreground)]\">\n Menu\n </span>\n <AriaButton\n aria-label=\"Close navigation\"\n className={cn(sidebarCollapseButtonVariants())}\n onPress={closeDrawer}\n >\n <X />\n </AriaButton>\n </header>\n\n {/* Horizontal rail */}\n {railItems.length > 0 && (\n <div\n role=\"toolbar\"\n aria-orientation=\"horizontal\"\n aria-label={railAriaLabel}\n tabIndex={0}\n className={sidebarMobileRailVariants()}\n >\n {railItems.map(({ props, popover }) => {\n const hasPopover = popover !== null && popover !== undefined;\n const isOpen = activePopoverId === props.id;\n return (\n <AriaButton\n key={props.id}\n aria-current={props.isActive ? (props.currentType ?? 'page') : undefined}\n aria-haspopup={hasPopover ? 'dialog' : undefined}\n aria-expanded={hasPopover ? isOpen : undefined}\n isDisabled={props.isDisabled}\n className={sidebarMobileRailItemVariants({ isActive: (props.isActive ?? false) || isOpen })}\n onPress={() => {\n props.onPress?.();\n if (hasPopover) {\n // Toggle the zone's sub-nav into the drawer\n // panel — stay in the drawer rather than\n // navigating.\n setActivePopoverId(isOpen ? null : props.id);\n return;\n }\n if (props.href) {\n // Real navigation — close the drawer on the\n // way out so it isn't left open behind the\n // next page.\n window.location.href = props.href;\n closeDrawer();\n return;\n }\n // No popover and no href: the press only\n // drives consumer state via `onPress` (above);\n // keep the drawer open so the user stays in\n // context.\n }}\n data-testid={`sidebar-mobile-rail-item-${props.id}`}\n >\n <span className={sidebarMobileRailItemIconVariants()} aria-hidden=\"true\">\n {props.icon}\n {props.badgeCount != null && props.badgeCount > 0 && (\n <span className={sidebarRailItemBadgeVariants()} aria-hidden=\"true\">\n {formatBadge(props.badgeCount)}\n </span>\n )}\n </span>\n <span className={sidebarMobileRailItemLabelVariants({ isActive: (props.isActive ?? false) || isOpen })}>\n {props.label}\n </span>\n {props.badgeCount != null && props.badgeCount > 0 && (\n <span className=\"sr-only\">{props.badgeCount} notifications</span>\n )}\n </AriaButton>\n );\n })}\n </div>\n )}\n\n {/* Panel content — either the active rail item's popover or\n the default Sidebar.Panel children. */}\n {panelView && (\n <div\n className=\"flex-1 overflow-y-auto bg-[var(--content-background)] text-[var(--content-foreground)]\"\n data-testid=\"sidebar-mobile-panel-content\"\n >\n {panelView}\n </div>\n )}\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n );\n}\n","'use client';\n\nimport { Suspense, lazy, type ReactElement } from 'react';\nimport { SidebarRoot, useSidebarLayout, useSidebarState } from './SidebarRoot';\nimport { SidebarRail, SidebarRailItem, SidebarCollapseButton } from './SidebarRail';\nimport { SidebarPanel, SidebarPanelHeader, PopoverRegistryProvider } from './SidebarPanel';\nimport { SidebarPopover } from './SidebarPopover';\nimport type { SidebarProps } from './Sidebar.types';\n\n// Lazy-load mobile drawer — desktop users never download it\nconst SidebarMobileDrawerLazy = lazy(() =>\n import('./SidebarMobileDrawer').then((mod) => ({ default: mod.SidebarMobileDrawer })),\n);\n\n/**\n * Mobile drawer bridge — rendered inside context, lazy-loads drawer component.\n * Only mounts when isMobile is true.\n */\nfunction MobileDrawerBridge({ children }: { children: React.ReactNode }): ReactElement | null {\n const { isMobile } = useSidebarLayout();\n const { isMobileOpen } = useSidebarState();\n\n if (!isMobile) return null;\n if (!isMobileOpen) return null;\n\n return (\n <Suspense fallback={null}>\n <SidebarMobileDrawerLazy>{children}</SidebarMobileDrawerLazy>\n </Suspense>\n );\n}\n\n/**\n * Sidebar compound wrapper — adds mobile drawer bridge around children.\n */\nfunction SidebarCompound(props: SidebarProps): ReactElement {\n return (\n <SidebarRoot {...props}>\n <PopoverRegistryProvider>\n {props.children}\n <MobileDrawerBridge>{props.children}</MobileDrawerBridge>\n </PopoverRegistryProvider>\n </SidebarRoot>\n );\n}\n\nSidebarCompound.displayName = 'Sidebar';\n\n/**\n * Sidebar compound component with dot-syntax sub-components.\n *\n * @example\n * ```tsx\n * <Sidebar>\n * <Sidebar.Rail aria-label=\"Main navigation\">\n * <Sidebar.CollapseButton />\n * <Sidebar.RailItem id=\"home\" icon={<Home />} label=\"Home\" isActive />\n * </Sidebar.Rail>\n * <Sidebar.Panel width=\"md\" aria-label=\"Details\">\n * <Sidebar.PanelHeader title=\"Home\" />\n * {content}\n * </Sidebar.Panel>\n * </Sidebar>\n * ```\n */\nexport const Sidebar = Object.assign(SidebarCompound, {\n Rail: SidebarRail,\n RailItem: SidebarRailItem,\n Popover: SidebarPopover,\n Panel: SidebarPanel,\n PanelHeader: SidebarPanelHeader,\n CollapseButton: SidebarCollapseButton,\n});\n","'use client';\n\nimport {\n forwardRef,\n memo,\n useMemo,\n useRef,\n useCallback,\n useEffect,\n createContext,\n useContext,\n type ReactElement,\n type ReactNode,\n Children,\n isValidElement,\n} from 'react';\nimport { Toolbar } from 'react-aria-components';\nimport { Button as AriaButton, Link as AriaLink } from 'react-aria-components';\nimport { ChevronsLeft, ChevronsRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useSidebarLayout, useSidebarState } from './SidebarRoot';\nimport { useHoverIntent } from './SidebarPopover';\nimport { usePopoverRegistry } from './SidebarPanel';\nimport {\n sidebarRailVariants,\n sidebarRailToolbarVariants,\n sidebarRailItemVariants,\n sidebarRailItemIconVariants,\n sidebarRailItemLabelVariants,\n sidebarRailItemBadgeVariants,\n sidebarRailItemArrowVariants,\n sidebarCollapseButtonVariants,\n} from './Sidebar.styles';\nimport type {\n SidebarRailProps,\n SidebarRailItemProps,\n SidebarCollapseButtonProps,\n} from './Sidebar.types';\n\n// =============================================================================\n// Rail variant context — scoped to Rail, read by RailItem + CollapseButton\n// =============================================================================\n\ntype RailVariant = 'default' | 'primary';\n\ninterface RailConfig {\n variant: RailVariant;\n showActiveIndicator: boolean;\n}\n\nconst RailConfigContext = createContext<RailConfig>({\n variant: 'default',\n showActiveIndicator: true,\n});\n\nfunction useRailConfig(): RailConfig {\n return useContext(RailConfigContext);\n}\n\n// =============================================================================\n// SidebarRail\n// =============================================================================\n\nconst SidebarRail = forwardRef<HTMLElement, SidebarRailProps>(\n ({ children, 'aria-label': ariaLabel, variant = 'default', showActiveIndicator = true, className, 'data-testid': testId = 'sidebar-rail' }, ref) => {\n const { isMobile } = useSidebarLayout();\n const railConfig = useMemo<RailConfig>(\n () => ({ variant, showActiveIndicator }),\n [variant, showActiveIndicator],\n );\n\n // On mobile, don't render inline — MobileDrawer handles it\n if (isMobile) return null;\n\n // Separate CollapseButton from RailItems, and split RailItems by placement\n const collapseButtons: ReactNode[] = [];\n const topItems: ReactNode[] = [];\n const bottomItems: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && (child.type as { displayName?: string }).displayName === 'SidebarCollapseButton') {\n collapseButtons.push(child);\n return;\n }\n const placement = isValidElement(child)\n ? ((child.props as { placement?: 'top' | 'bottom' }).placement ?? 'top')\n : 'top';\n if (placement === 'bottom') {\n bottomItems.push(child);\n } else {\n topItems.push(child);\n }\n });\n\n // Items sit flush (no inter-item gap), so the rail provides its own breathing\n // room: a bottom pad always, and a top pad only when there's no CollapseButton\n // to occupy the top edge.\n const hasCollapseButton = collapseButtons.length > 0;\n\n return (\n <RailConfigContext.Provider value={railConfig}>\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={cn(\n sidebarRailVariants({ variant }),\n 'pb-2',\n !hasCollapseButton && 'pt-2',\n className,\n )}\n data-testid={testId}\n >\n {collapseButtons}\n <Toolbar\n orientation=\"vertical\"\n aria-label=\"Navigation items\"\n className={sidebarRailToolbarVariants()}\n >\n {topItems}\n </Toolbar>\n {bottomItems.length > 0 && (\n <Toolbar\n orientation=\"vertical\"\n aria-label=\"Secondary navigation items\"\n className={cn(sidebarRailToolbarVariants(), 'mt-auto')}\n data-testid=\"sidebar-rail-bottom\"\n >\n {bottomItems}\n </Toolbar>\n )}\n </nav>\n </RailConfigContext.Provider>\n );\n },\n);\n\nSidebarRail.displayName = 'SidebarRail';\n\n// =============================================================================\n// SidebarRailItem\n// =============================================================================\n\n/** Extract Sidebar.Popover children from RailItem children */\nfunction extractPopover(children: ReactNode): { popover: ReactNode; rest: ReactNode } {\n let popover: ReactNode = null;\n const rest: ReactNode[] = [];\n\n Children.forEach(children, (child) => {\n if (isValidElement(child) && (child.type as { displayName?: string }).displayName === 'SidebarPopover') {\n popover = child;\n } else {\n rest.push(child);\n }\n });\n\n return { popover, rest: rest.length > 0 ? rest : null };\n}\n\nfunction formatBadge(count: number): string {\n return count > 99 ? '99+' : String(count);\n}\n\nconst SidebarRailItemInner = forwardRef<HTMLElement, SidebarRailItemProps>(\n (\n {\n id,\n label,\n icon,\n href,\n badgeCount,\n isActive = false,\n currentType = 'page',\n isDisabled = false,\n onPress,\n children,\n className,\n 'data-testid': testId,\n },\n ref,\n ) => {\n const { activePopoverId, setActivePopoverId } = useSidebarState();\n const { variant: railVariant, showActiveIndicator } = useRailConfig();\n const itemRef = useRef<HTMLElement | null>(null);\n const { popover } = extractPopover(children);\n const hasPopover = popover !== null;\n const isPopoverOpen = activePopoverId === id;\n\n // Hover intent for popover\n const hoverHandlers = useHoverIntent(id, hasPopover);\n\n // Register popover content so the Panel overlay can render it\n const registry = usePopoverRegistry();\n useEffect(() => {\n if (hasPopover && popover) {\n registry.register(id, popover, label);\n return () => registry.unregister(id);\n }\n }, [id, hasPopover, popover, label, registry]);\n\n const handlePress = useCallback(() => {\n if (hasPopover) {\n setActivePopoverId(isPopoverOpen ? null : id);\n }\n onPress?.();\n }, [hasPopover, isPopoverOpen, id, onPress, setActivePopoverId]);\n\n const setRefs = useCallback(\n (el: HTMLElement | null) => {\n itemRef.current = el;\n if (typeof ref === 'function') ref(el);\n else if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = el;\n },\n [ref],\n );\n\n const resolvedTestId = testId ?? `sidebar-rail-item-${id}`;\n const itemClasses = className\n ? cn(sidebarRailItemVariants({ railVariant, isActive, isDisabled }), className)\n : sidebarRailItemVariants({ railVariant, isActive, isDisabled });\n\n const content = (\n <>\n {/* Chip row — full width so the active-item notch can anchor to the\n rail's right-edge divider while staying centred on the chip. */}\n <span className=\"relative flex w-full items-center justify-center\">\n <span className={sidebarRailItemIconVariants({ railVariant, isActive })} aria-hidden=\"true\">\n {icon}\n {badgeCount != null && badgeCount > 0 && (\n <span className={sidebarRailItemBadgeVariants()} aria-hidden=\"true\">\n {formatBadge(badgeCount)}\n </span>\n )}\n </span>\n {showActiveIndicator && isActive && (\n <span className={sidebarRailItemArrowVariants()} aria-hidden=\"true\" />\n )}\n </span>\n <span className={sidebarRailItemLabelVariants({ railVariant, isActive })}>\n {label}\n </span>\n {badgeCount != null && badgeCount > 0 && (\n <span className=\"sr-only\">{badgeCount} notifications</span>\n )}\n </>\n );\n\n const interactiveElement = href && !isDisabled ? (\n <AriaLink\n ref={setRefs as React.Ref<HTMLAnchorElement>}\n href={href}\n aria-current={isActive ? currentType : undefined}\n aria-haspopup={hasPopover ? 'dialog' : undefined}\n aria-expanded={hasPopover ? isPopoverOpen : undefined}\n className={itemClasses}\n data-testid={resolvedTestId}\n onPress={handlePress}\n >\n {content}\n </AriaLink>\n ) : (\n <AriaButton\n ref={setRefs as React.Ref<HTMLButtonElement>}\n isDisabled={isDisabled}\n aria-current={isActive ? currentType : undefined}\n aria-haspopup={hasPopover ? 'dialog' : undefined}\n aria-expanded={hasPopover ? isPopoverOpen : undefined}\n className={itemClasses}\n data-testid={resolvedTestId}\n onPress={handlePress}\n >\n {content}\n </AriaButton>\n );\n\n return (\n <div\n onPointerEnter={hoverHandlers.onTriggerPointerEnter}\n onPointerLeave={hoverHandlers.onTriggerPointerLeave}\n >\n {interactiveElement}\n </div>\n );\n },\n);\n\nSidebarRailItemInner.displayName = 'SidebarRailItem';\n\nconst SidebarRailItem = memo(SidebarRailItemInner, (prev, next) => (\n prev.id === next.id &&\n prev.isActive === next.isActive &&\n prev.badgeCount === next.badgeCount &&\n prev.isDisabled === next.isDisabled &&\n prev.label === next.label &&\n prev.className === next.className &&\n prev.href === next.href\n));\n\n// Preserve displayName through memo\n(SidebarRailItem as unknown as { displayName: string }).displayName = 'SidebarRailItem';\n\n// =============================================================================\n// SidebarCollapseButton\n// =============================================================================\n\nfunction SidebarCollapseButton({\n className,\n 'data-testid': testId = 'sidebar-collapse-button',\n}: SidebarCollapseButtonProps): ReactElement {\n const { isCollapsed, toggleCollapsed } = useSidebarState();\n const { variant: railVariant } = useRailConfig();\n\n return (\n <AriaButton\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n className={cn(sidebarCollapseButtonVariants({ railVariant }), className)}\n data-testid={testId}\n onPress={toggleCollapsed}\n >\n {isCollapsed ? <ChevronsRight /> : <ChevronsLeft />}\n </AriaButton>\n );\n}\n\nSidebarCollapseButton.displayName = 'SidebarCollapseButton';\n\nexport { SidebarRail, SidebarRailItem, SidebarCollapseButton };\n","'use client';\n\nimport {\n useRef,\n useCallback,\n useEffect,\n type ReactElement,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport { useSidebarState } from './SidebarRoot';\nimport { sidebarPopoverVariants } from './Sidebar.styles';\nimport type { SidebarPopoverProps } from './Sidebar.types';\n\n// =============================================================================\n// useHoverIntent — hover state machine with ref-based internals\n//\n// Only the `activePopoverId` in context triggers re-renders.\n// Internal phase (IDLE, HOVERING_TRIGGER, OPEN, GRACE_PERIOD) tracked via ref.\n// =============================================================================\n\ntype HoverPhase = 'IDLE' | 'HOVERING_TRIGGER' | 'OPEN';\n\nconst OPEN_DELAY = 200;\nconst GRACE_PERIOD_MS = 300;\n\nexport interface HoverIntentHandlers {\n onTriggerPointerEnter: (e: React.PointerEvent) => void;\n onTriggerPointerLeave: () => void;\n}\n\nexport function useHoverIntent(\n itemId: string,\n hasPopover: boolean,\n): HoverIntentHandlers {\n const { activePopoverId, setActivePopoverId, cancelPopoverClose, schedulePopoverClose } = useSidebarState();\n const phase = useRef<HoverPhase>('IDLE');\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearOpenTimer = useCallback(() => {\n if (openTimer.current) { clearTimeout(openTimer.current); openTimer.current = null; }\n }, []);\n\n // Reset phase when this item's popover closes externally\n const isOpen = activePopoverId === itemId;\n useEffect(() => {\n if (!isOpen && phase.current !== 'IDLE') {\n clearOpenTimer();\n phase.current = 'IDLE';\n } else if (isOpen) {\n phase.current = 'OPEN';\n }\n }, [isOpen, clearOpenTimer]);\n\n useEffect(() => clearOpenTimer, [clearOpenTimer]);\n\n const onTriggerPointerEnter = useCallback((e: React.PointerEvent) => {\n if (!hasPopover) return;\n if (e.pointerType !== 'mouse') return;\n\n clearOpenTimer();\n cancelPopoverClose();\n\n if (phase.current === 'OPEN') return;\n\n phase.current = 'HOVERING_TRIGGER';\n openTimer.current = setTimeout(() => {\n phase.current = 'OPEN';\n setActivePopoverId(itemId);\n }, OPEN_DELAY);\n }, [itemId, hasPopover, setActivePopoverId, clearOpenTimer, cancelPopoverClose]);\n\n const onTriggerPointerLeave = useCallback(() => {\n if (!hasPopover) return;\n clearOpenTimer();\n\n if (phase.current === 'HOVERING_TRIGGER') {\n phase.current = 'IDLE';\n setActivePopoverId(null);\n return;\n }\n\n if (phase.current === 'OPEN') {\n schedulePopoverClose(GRACE_PERIOD_MS);\n }\n }, [hasPopover, setActivePopoverId, clearOpenTimer, schedulePopoverClose]);\n\n return { onTriggerPointerEnter, onTriggerPointerLeave };\n}\n\n// =============================================================================\n// SidebarPopover — marker component used as child of RailItem\n// =============================================================================\n\nfunction SidebarPopoverInner({\n children,\n className,\n 'data-testid': testId = 'sidebar-popover',\n}: SidebarPopoverProps): ReactElement | null {\n return (\n <div\n className={cn(sidebarPopoverVariants(), className)}\n data-testid={testId}\n >\n {children}\n </div>\n );\n}\n\nSidebarPopoverInner.displayName = 'SidebarPopover';\n\nexport { SidebarPopoverInner as SidebarPopover };\n","'use client';\n\nimport {\n forwardRef,\n useRef,\n useEffect,\n useState,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../utils/cn';\nimport { useSidebarLayout, useSidebarState } from './SidebarRoot';\nimport {\n sidebarPanelVariants,\n sidebarPanelHeaderVariants,\n sidebarPanelHeaderTitleVariants,\n sidebarPopoverVariants,\n} from './Sidebar.styles';\nimport type { SidebarPanelProps, SidebarPanelHeaderProps } from './Sidebar.types';\n\n// =============================================================================\n// PopoverOverlay — renders active popover content over the panel\n// =============================================================================\n\nfunction PopoverOverlay(): ReactElement | null {\n const { activePopoverId, setActivePopoverId } = useSidebarState();\n const { isMobile } = useSidebarLayout();\n const overlayRef = useRef<HTMLDivElement>(null);\n\n // Escape closes popover\n useEffect(() => {\n if (!activePopoverId) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n setActivePopoverId(null);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [activePopoverId, setActivePopoverId]);\n\n // Close when focus leaves the overlay (and isn't in the rail)\n useEffect(() => {\n if (!activePopoverId) return;\n\n const handleFocusOut = (e: FocusEvent) => {\n const overlay = overlayRef.current;\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n if (!relatedTarget || !overlay) return;\n\n // If focus moved outside overlay AND outside the rail, close\n const rail = document.querySelector('[data-testid=\"sidebar-rail\"]');\n if (!overlay.contains(relatedTarget) && !rail?.contains(relatedTarget)) {\n setActivePopoverId(null);\n }\n };\n\n const overlay = overlayRef.current;\n overlay?.addEventListener('focusout', handleFocusOut);\n return () => overlay?.removeEventListener('focusout', handleFocusOut);\n }, [activePopoverId, setActivePopoverId]);\n\n if (isMobile || !activePopoverId) return null;\n\n // Find the popover content from the rail item that's active.\n // The PopoverRegistry (below) provides this via context.\n return (\n <PopoverContent ref={overlayRef} />\n );\n}\n\n// =============================================================================\n// PopoverRegistry — stores popover content per rail item id\n// =============================================================================\n\nimport { createContext, useContext, useMemo, useCallback } from 'react';\n\ninterface PopoverRegistryContextValue {\n register: (id: string, content: ReactNode, label: string) => void;\n unregister: (id: string) => void;\n getContent: (id: string) => { content: ReactNode; label: string } | null;\n}\n\nconst PopoverRegistryContext = createContext<PopoverRegistryContextValue | null>(null);\n\nexport function usePopoverRegistry(): PopoverRegistryContextValue {\n const ctx = useContext(PopoverRegistryContext);\n if (!ctx) throw new Error('usePopoverRegistry must be used within SidebarPanel');\n return ctx;\n}\n\nexport function PopoverRegistryProvider({ children }: { children: ReactNode }): ReactElement {\n const entries = useRef<Map<string, { content: ReactNode; label: string }>>(new Map());\n\n const register = useCallback((id: string, content: ReactNode, label: string) => {\n entries.current.set(id, { content, label });\n }, []);\n\n const unregister = useCallback((id: string) => {\n entries.current.delete(id);\n }, []);\n\n const getContent = useCallback((id: string) => {\n return entries.current.get(id) ?? null;\n }, []);\n\n const value = useMemo(() => ({ register, unregister, getContent }), [register, unregister, getContent]);\n\n return (\n <PopoverRegistryContext.Provider value={value}>\n {children}\n </PopoverRegistryContext.Provider>\n );\n}\n\n// =============================================================================\n// PopoverContent — reads from registry and renders\n// =============================================================================\n\nimport { forwardRef as fwdRef } from 'react';\n\nconst PopoverContent = fwdRef<HTMLDivElement>((_props, ref) => {\n const { activePopoverId, cancelPopoverClose, schedulePopoverClose } = useSidebarState();\n const registry = usePopoverRegistry();\n\n if (!activePopoverId) return null;\n\n const entry = registry.getContent(activePopoverId);\n if (!entry) return null;\n\n return (\n <div\n ref={ref}\n role=\"dialog\"\n aria-label={`${entry.label} details`}\n className={sidebarPopoverVariants()}\n data-testid=\"sidebar-popover\"\n onPointerEnter={cancelPopoverClose}\n onPointerLeave={() => schedulePopoverClose(300)}\n >\n {entry.content}\n </div>\n );\n});\n\nPopoverContent.displayName = 'PopoverContent';\n\n// =============================================================================\n// SidebarPanel\n// =============================================================================\n\n/**\n * Matches `--transition-slow` in `src/styles/defaults.css`. Used to\n * gate the skeleton swap so children only return once the panel is\n * fully expanded — and the children's natural width can't reflow\n * while the panel's `max-width` animates.\n */\nconst PANEL_TRANSITION_MS = 300;\n\n/**\n * Pixel widths matching the `width` variant in `Sidebar.styles.ts`.\n * Used to give the popover overlay an explicit width so it still\n * has room to render when the panel itself is collapsed (the\n * wrapper div has shrunk to 0 with the panel `aside`).\n */\nconst PANEL_WIDTH_PX: Record<'sm' | 'md' | 'lg' | 'xl', number> = {\n sm: 220,\n md: 260,\n lg: 340,\n xl: 420,\n};\n\nconst SidebarPanel = forwardRef<HTMLElement, SidebarPanelProps>(\n (\n {\n children,\n width = 'md',\n 'aria-label': ariaLabel,\n skeleton,\n className,\n 'data-testid': testId = 'sidebar-panel',\n },\n ref,\n ) => {\n const { isMobile } = useSidebarLayout();\n const { isCollapsed, activePopoverId } = useSidebarState();\n const panelRef = useRef<HTMLElement | null>(null);\n const hasActivePopover = activePopoverId !== null;\n\n // Skeleton swap — only relevant if a `skeleton` prop is provided.\n // `hasSettled` becomes true once the open transition completes;\n // collapse flips it back to false synchronously via the effect.\n // `showRealChildren` is derived synchronously from `isCollapsed`\n // so the swap happens on the same render the collapse starts —\n // never one tick late, so children can't be caught mid-reflow.\n const [hasSettled, setHasSettled] = useState(!isCollapsed);\n useEffect(() => {\n if (isCollapsed) {\n setHasSettled(false);\n return;\n }\n const timer = window.setTimeout(() => setHasSettled(true), PANEL_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isCollapsed]);\n const showRealChildren = !isCollapsed && hasSettled;\n const panelBody = skeleton !== undefined && !showRealChildren ? skeleton : children;\n\n // Focus management: move focus out of panel when it collapses\n useEffect(() => {\n if (!isCollapsed) return;\n\n const panel = panelRef.current;\n if (!panel) return;\n\n if (panel.contains(document.activeElement)) {\n const collapseBtn = document.querySelector<HTMLElement>(\n '[data-testid=\"sidebar-collapse-button\"]',\n );\n if (collapseBtn) {\n window.requestAnimationFrame(() => collapseBtn.focus());\n }\n }\n }, [isCollapsed]);\n\n const setRefs = (el: HTMLElement | null) => {\n panelRef.current = el;\n if (typeof ref === 'function') ref(el);\n else if (ref) (ref as React.MutableRefObject<HTMLElement | null>).current = el;\n };\n\n if (isMobile) return null;\n\n return (\n <div\n className={cn(\n 'relative shrink-0',\n // Panel's own right border separates panel from main content. While\n // collapsed (width 0) it would stack onto the rail's right border and\n // read as a double line, so drop it — the rail's border is the divider.\n !isCollapsed && 'border-r border-[var(--border)]',\n )}\n data-sidebar-panel=\"\"\n >\n {/* Real panel content (or skeleton placeholder during transitions) */}\n <aside\n ref={setRefs}\n aria-label={ariaLabel}\n aria-hidden={isCollapsed}\n inert={isCollapsed || undefined}\n className={cn(sidebarPanelVariants({ width, isCollapsed }), className)}\n data-testid={testId}\n >\n {panelBody}\n </aside>\n\n {/*\n * Popover overlay — always rendered when a popover is active,\n * regardless of the panel's collapse state. An explicit pixel\n * width (matching the panel's `width` variant) guarantees the\n * overlay still has drawing space when the panel wrapper has\n * shrunk to 0 (forced-collapsed / rail-only layouts). This\n * lets users hover rail items and navigate away even when\n * the main panel is hidden.\n */}\n {hasActivePopover && (\n <div\n className={cn(\n 'absolute top-0 left-0 z-10 h-full',\n // When the panel is collapsed the popover extends out\n // past the panel wrapper's own border, so give it its\n // own right border to delineate from the main content.\n // When expanded, the wrapper's border is already\n // visible behind the overlay — no extra border needed.\n isCollapsed && 'border-r border-[var(--border)]',\n )}\n style={{ width: `${PANEL_WIDTH_PX[width]}px` }}\n >\n <PopoverOverlay />\n </div>\n )}\n </div>\n );\n },\n);\n\nSidebarPanel.displayName = 'SidebarPanel';\n\n// =============================================================================\n// SidebarPanelHeader\n// =============================================================================\n\nfunction SidebarPanelHeader({\n title,\n icon,\n children,\n as: Heading = 'h2',\n className,\n 'data-testid': testId = 'sidebar-panel-header',\n}: SidebarPanelHeaderProps): ReactElement {\n return (\n <header\n className={cn(sidebarPanelHeaderVariants(), className)}\n data-testid={testId}\n >\n {children ?? (\n <div className=\"flex min-w-0 items-center gap-2\">\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-flex shrink-0 items-center justify-center text-[var(--icon)]\"\n data-testid={`${testId}-icon`}\n >\n {icon}\n </span>\n ) : null}\n <Heading className={sidebarPanelHeaderTitleVariants()}>\n {title}\n </Heading>\n </div>\n )}\n </header>\n );\n}\n\nSidebarPanelHeader.displayName = 'SidebarPanelHeader';\n\nexport { SidebarPanel, SidebarPanelHeader };\n","// Compound component\nexport { Sidebar } from './SidebarCompound';\n\n// CVA variants\nexport {\n sidebarRootVariants,\n sidebarRailVariants,\n sidebarRailToolbarVariants,\n sidebarRailItemVariants,\n sidebarRailItemIconVariants,\n sidebarRailItemLabelVariants,\n sidebarRailItemBadgeVariants,\n sidebarPopoverVariants,\n sidebarPanelVariants,\n sidebarPanelHeaderVariants,\n sidebarPanelHeaderTitleVariants,\n sidebarCollapseButtonVariants,\n sidebarMobileOverlayVariants,\n sidebarMobileDrawerVariants,\n sidebarMobileDrawerHeaderVariants,\n sidebarMobileRailVariants,\n sidebarMobileRailItemVariants,\n} from './Sidebar.styles';\n\n// Zod schemas\nexport {\n SidebarPropsSchema,\n SidebarRailPropsSchema,\n SidebarRailItemPropsSchema,\n SidebarPopoverPropsSchema,\n SidebarPanelPropsSchema,\n SidebarPanelHeaderPropsSchema,\n SidebarCollapseButtonPropsSchema,\n SidebarRailVariantSchema,\n SidebarPanelWidthSchema,\n SidebarCurrentTypeSchema,\n SidebarPanelHeaderLevelSchema,\n} from './Sidebar.types';\n\n// Types\nexport type {\n SidebarProps,\n SidebarRailProps,\n SidebarRailItemProps,\n SidebarPopoverProps,\n SidebarPanelProps,\n SidebarPanelHeaderProps,\n SidebarCollapseButtonProps,\n SidebarRailVariant,\n SidebarPanelWidth,\n SidebarCurrentType,\n SidebarPanelHeaderLevel,\n} from './Sidebar.types';\n","import { z } from 'zod';\n\n/**\n * Base props schema for all Themis components\n * Ensures consistent accessibility and styling APIs across the library\n *\n * @see spec.md FR-009 to FR-014 (Accessibility Requirements)\n * @see constitution.md Principle IV (Accessibility First - WCAG 2.2 AA minimum)\n */\nexport const BaseComponentPropsSchema = z.object({\n // Styling\n className: z.string().optional(),\n\n // React\n children: z.any().optional(), // ReactNode not directly supported by Zod\n id: z.string().optional(),\n\n // Accessibility (WCAG 2.2 AA requirements)\n 'aria-label': z.string().optional(),\n 'aria-labelledby': z.string().optional(),\n 'aria-describedby': z.string().optional(),\n 'aria-live': z.enum(['off', 'polite', 'assertive']).optional(),\n 'aria-hidden': z.boolean().optional(),\n\n // Testing & Development\n 'data-testid': z.string().optional(),\n});\n\nexport type BaseComponentProps = z.infer<typeof BaseComponentPropsSchema>;\n","import { z } from 'zod';\nimport { BaseComponentPropsSchema } from '../../schemas/BaseComponentProps';\nimport type { ReactNode, ReactElement } from 'react';\n\n// =============================================================================\n// Enum Schemas\n// =============================================================================\n\nexport const SidebarRailVariantSchema = z.enum(['default', 'primary']);\nexport type SidebarRailVariant = z.infer<typeof SidebarRailVariantSchema>;\n\nexport const SidebarPanelWidthSchema = z.enum(['sm', 'md', 'lg', 'xl']);\nexport type SidebarPanelWidth = z.infer<typeof SidebarPanelWidthSchema>;\n\nexport const SidebarCurrentTypeSchema = z.enum(['page', 'true', 'location']);\nexport type SidebarCurrentType = z.infer<typeof SidebarCurrentTypeSchema>;\n\nexport const SidebarPanelHeaderLevelSchema = z.enum(['h1', 'h2', 'h3', 'h4']);\nexport type SidebarPanelHeaderLevel = z.infer<typeof SidebarPanelHeaderLevelSchema>;\n\nexport const SidebarRailItemPlacementSchema = z.enum(['top', 'bottom']);\nexport type SidebarRailItemPlacement = z.infer<typeof SidebarRailItemPlacementSchema>;\n\n// =============================================================================\n// Sidebar Root\n// =============================================================================\n\nexport const SidebarPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n isCollapsed: z.boolean().optional(),\n defaultCollapsed: z.boolean().optional().default(false),\n onCollapsedChange: z.custom<(collapsed: boolean) => void>().optional(),\n isMobileOpen: z.boolean().optional(),\n onMobileOpenChange: z.custom<(open: boolean) => void>().optional(),\n mobileBreakpoint: z.number().optional().default(768),\n});\n\nexport interface SidebarProps {\n children: ReactNode;\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n isMobileOpen?: boolean;\n onMobileOpenChange?: (open: boolean) => void;\n mobileBreakpoint?: number;\n className?: string;\n 'aria-label'?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar Rail\n// =============================================================================\n\nexport const SidebarRailPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n 'aria-label': z.string(),\n variant: SidebarRailVariantSchema.optional().default('default'),\n showActiveIndicator: z.boolean().optional().default(true),\n});\n\nexport interface SidebarRailProps {\n children: ReactNode;\n 'aria-label': string;\n variant?: SidebarRailVariant;\n /**\n * Show the active-item arrow indicator — a notch on the rail/panel divider\n * that points at the active item. Defaults to `true`.\n */\n showActiveIndicator?: boolean;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar RailItem\n// =============================================================================\n\nexport const SidebarRailItemPropsSchema = BaseComponentPropsSchema.extend({\n id: z.string(),\n label: z.string(),\n icon: z.custom<ReactElement>(),\n href: z.string().optional(),\n badgeCount: z.number().optional(),\n isActive: z.boolean().optional(),\n currentType: SidebarCurrentTypeSchema.optional().default('page'),\n isDisabled: z.boolean().optional(),\n onPress: z.custom<() => void>().optional(),\n children: z.custom<ReactNode>().optional(),\n placement: SidebarRailItemPlacementSchema.optional().default('top'),\n});\n\nexport interface SidebarRailItemProps {\n id: string;\n label: string;\n icon: ReactElement;\n href?: string;\n badgeCount?: number;\n isActive?: boolean;\n currentType?: SidebarCurrentType;\n isDisabled?: boolean;\n onPress?: () => void;\n children?: ReactNode;\n className?: string;\n 'data-testid'?: string;\n /**\n * Where the item is rendered in the rail.\n * - `'top'` (default) — grouped with the primary navigation items at the top.\n * - `'bottom'` — pinned to the bottom of the rail; useful for low-frequency\n * destinations like Settings or Admin.\n *\n * Items keep their declared order within each group.\n */\n placement?: SidebarRailItemPlacement;\n}\n\n// =============================================================================\n// Sidebar Popover\n// =============================================================================\n\nexport const SidebarPopoverPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n});\n\nexport interface SidebarPopoverProps {\n children: ReactNode;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar Panel\n// =============================================================================\n\nexport const SidebarPanelPropsSchema = BaseComponentPropsSchema.extend({\n children: z.custom<ReactNode>(),\n width: SidebarPanelWidthSchema.optional().default('md'),\n 'aria-label': z.string(),\n skeleton: z.custom<ReactNode>().optional(),\n});\n\nexport interface SidebarPanelProps {\n children: ReactNode;\n width?: SidebarPanelWidth;\n 'aria-label': string;\n /**\n * Optional placeholder rendered in place of `children` while the panel\n * is collapsed or mid-transition (collapsing/expanding). When the\n * panel is fully expanded, real `children` are shown.\n *\n * Use this to prevent text reflow as the panel's `max-width` animates\n * — the skeleton can be a fixed-width layout (e.g. `Skeleton` blocks)\n * that won't wrap/unwrap as the panel resizes.\n *\n * If omitted, behaviour is unchanged: `children` are always rendered\n * directly inside the panel.\n */\n skeleton?: ReactNode;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar PanelHeader\n// =============================================================================\n\nexport const SidebarPanelHeaderPropsSchema = BaseComponentPropsSchema.extend({\n title: z.string().optional(),\n icon: z.custom<ReactElement>().optional(),\n children: z.custom<ReactNode>().optional(),\n as: SidebarPanelHeaderLevelSchema.optional().default('h2'),\n});\n\nexport interface SidebarPanelHeaderProps {\n /**\n * Title text for the simple form. Combined with the optional `icon` prop,\n * this renders an icon + heading. Ignored when `children` is provided.\n */\n title?: string;\n /**\n * Optional icon rendered before the title. Typically a 16–20px lucide\n * (or other) icon; sizing is caller-controlled via the element's own\n * className. Marked `aria-hidden` by Themis since the title conveys the\n * same meaning. Ignored when `children` is provided.\n */\n icon?: ReactElement;\n /**\n * Slot for fully-custom header content (e.g. icon + heading + badge).\n * When provided, replaces the default title block — the consumer is\n * responsible for any heading element. The header container still applies\n * its own flex layout, padding, and `justify-between`.\n */\n children?: ReactNode;\n as?: SidebarPanelHeaderLevel;\n className?: string;\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Sidebar CollapseButton\n// =============================================================================\n\nexport const SidebarCollapseButtonPropsSchema = BaseComponentPropsSchema.extend({});\n\nexport interface SidebarCollapseButtonProps {\n className?: string;\n 'data-testid'?: string;\n}\n"]}