@keboola/design 13.0.0 → 13.0.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.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +18 -0
- package/dist/{AIKit-DcOlHIBr.js → AIKit-DDIi0r4w.js} +3 -3
- package/dist/AIKit-DDIi0r4w.js.map +1 -0
- package/dist/{Badge-DIjhwPvh.js → Badge-Dz0cj6rj.js} +2 -2
- package/dist/{Badge-DIjhwPvh.js.map → Badge-Dz0cj6rj.js.map} +1 -1
- package/dist/{BrandEditor-Bkd6dhb8.js → BrandEditor-P8OZX2hi.js} +2 -2
- package/dist/{BrandEditor-Bkd6dhb8.js.map → BrandEditor-P8OZX2hi.js.map} +1 -1
- package/dist/{ColorModeSwitch-Bw9wMyoL.js → ColorModeSwitch-D8Cki137.js} +2 -2
- package/dist/{ColorModeSwitch-Bw9wMyoL.js.map → ColorModeSwitch-D8Cki137.js.map} +1 -1
- package/dist/{Combobox-C_MTpQ1l.js → Combobox-BNhW0TDB.js} +2 -2
- package/dist/{Combobox-C_MTpQ1l.js.map → Combobox-BNhW0TDB.js.map} +1 -1
- package/dist/{DropdownMenu-gRM-A8qU.js → DropdownMenu-BJGLjpVc.js} +14 -26
- package/dist/DropdownMenu-BJGLjpVc.js.map +1 -0
- package/dist/{PageToolbar-CIW0VmKe.js → PageToolbar-C06RKIif.js} +2 -2
- package/dist/{PageToolbar-CIW0VmKe.js.map → PageToolbar-C06RKIif.js.map} +1 -1
- package/dist/{RadioGroup-CBPRLRN0.js → RadioGroup-CYEp8Wnx.js} +3 -116
- package/dist/RadioGroup-CYEp8Wnx.js.map +1 -0
- package/dist/{SectionNav-TU5i3JeM.js → SectionNav-I2p2uXTd.js} +3 -3
- package/dist/{SectionNav-TU5i3JeM.js.map → SectionNav-I2p2uXTd.js.map} +1 -1
- package/dist/{Sidebar-ZLMNIbg5.js → Sidebar-D9ytIs8V.js} +2 -2
- package/dist/{Sidebar-ZLMNIbg5.js.map → Sidebar-D9ytIs8V.js.map} +1 -1
- package/dist/index.js +10 -10
- package/dist/internal/blocks/AIKit.js +1 -1
- package/dist/internal/blocks/BrandEditor.js +1 -1
- package/dist/internal/blocks/ChipEditor.js +1 -1
- package/dist/internal/blocks/ColorModeSwitch.js +1 -1
- package/dist/internal/blocks/ExportMenu.js +1 -1
- package/dist/internal/blocks/Form/connectors/ComboboxField.js +1 -1
- package/dist/internal/blocks/MultiCombobox.js +1 -1
- package/dist/internal/blocks/PageToolbar.js +1 -1
- package/dist/internal/blocks/SectionNav.js +1 -1
- package/dist/internal/blocks/SplitButton.js +1 -1
- package/dist/internal/components/Badge.js +1 -1
- package/dist/internal/components/Combobox.js +1 -1
- package/dist/internal/components/DropdownMenu.js +1 -1
- package/dist/internal/components/RadioGroup.js +1 -1
- package/dist/internal/components/Sidebar.js +1 -1
- package/dist/markdown-editor.js +1 -1
- package/dist/rjsf.js +2 -2
- package/dist/styles-DBGXH5-_.js +127 -0
- package/dist/styles-DBGXH5-_.js.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/AIKit-DcOlHIBr.js.map +0 -1
- package/dist/DropdownMenu-gRM-A8qU.js.map +0 -1
- package/dist/RadioGroup-CBPRLRN0.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar-ZLMNIbg5.js","names":[],"sources":["../src/components/Sidebar/SidebarProvider/useTransitionPresence.ts","../src/components/Sidebar/SidebarContent.tsx","../src/hooks/useMediaQuery.ts","../src/components/Sidebar/utils.ts","../src/components/Sidebar/SidebarProvider/context.ts","../src/components/Sidebar/SidebarProvider/useHoverTracking.ts","../src/components/Sidebar/SidebarProvider/useSidebarState.ts","../src/components/Sidebar/SidebarProvider/SidebarProvider.tsx","../src/components/Sidebar/SidebarFillTrigger.tsx","../src/components/Sidebar/SidebarFooter.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroup.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupContent.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupAction.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupLabel.tsx","../src/components/Sidebar/SidebarInstanceContext.ts","../src/components/Sidebar/SidebarHeader.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenu.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuIcon.tsx","../src/components/Sidebar/SidebarMenu/useDestinationDismiss.ts","../src/components/Sidebar/SidebarMenu/SidebarMenuButton.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuItem.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuAction.tsx","../src/components/Sidebar/SidebarMenu/SidebarSearchInput.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuCard.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuBadge.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuSub.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuSubItem.tsx","../src/components/Sidebar/useResizeSidebar.ts","../src/components/Sidebar/SidebarResizeHandle.tsx","../src/components/Sidebar/SidebarSeparator.tsx","../src/components/Sidebar/SidebarTrigger.tsx","../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useMemo, useReducer } from 'react';\n\ntype MountState = 'mounted' | 'enterSuspended' | 'unmountSuspended' | 'unmounted';\ntype MountEvent = 'MOUNT' | 'ENTER' | 'TRANSITION_OUT' | 'TRANSITION_END';\n\ntype UseTransitionPresenceOptions = {\n mounted: boolean;\n keepMounted?: boolean;\n /** Hold the subtree back until the enter transition ends — a heavy mount in the same commit blocks every frame of it. */\n mountAfterEnter?: boolean;\n};\n\nconst FALLBACK_TIMEOUT_MS = 500;\n\n/** Under reduced motion there is no `transitionend` to wait for, so the mount is not deferred. */\nconst prefersReducedMotion = () =>\n typeof window !== 'undefined' &&\n (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false);\n\nconst reducer = (state: MountState, event: MountEvent): MountState => {\n switch (event) {\n case 'MOUNT':\n return 'mounted';\n case 'ENTER':\n // Already-mounted content stays put; only a cold open waits.\n return state === 'unmounted' ? 'enterSuspended' : 'mounted';\n case 'TRANSITION_OUT':\n // Closed before the content arrived: nothing to animate out.\n if (state === 'enterSuspended') return 'unmounted';\n return state === 'mounted' ? 'unmountSuspended' : state;\n case 'TRANSITION_END':\n if (state === 'unmountSuspended') return 'unmounted';\n if (state === 'enterSuspended') return 'mounted';\n return state;\n default:\n return state;\n }\n};\n\nexport const useTransitionPresence = ({\n mounted,\n keepMounted = false,\n mountAfterEnter = false,\n}: UseTransitionPresenceOptions) => {\n const [state, send] = useReducer(reducer, mounted ? 'mounted' : 'unmounted');\n\n useLayoutEffect(() => {\n if (keepMounted) return;\n if (!mounted) {\n send('TRANSITION_OUT');\n return;\n }\n send(mountAfterEnter && !prefersReducedMotion() ? 'ENTER' : 'MOUNT');\n }, [mounted, keepMounted, mountAfterEnter]);\n\n // Fallback for both suspensions when `onTransitionEnd` never fires.\n useEffect(() => {\n if (state !== 'unmountSuspended' && state !== 'enterSuspended') return;\n\n const id = setTimeout(() => send('TRANSITION_END'), FALLBACK_TIMEOUT_MS);\n return () => clearTimeout(id);\n }, [state]);\n\n return useMemo(\n () => ({\n isMounted: keepMounted || state === 'mounted' || state === 'unmountSuspended',\n /** Resolves whichever transition the subtree is waiting on. */\n completeUnmount: () => send('TRANSITION_END'),\n }),\n [state, keepMounted],\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { useScrollbarPosition } from '../../hooks/useScrollbarPosition';\nimport { cn, mergeRefs } from '../../utils';\nimport { ScrollArea } from '../ScrollArea';\n\ntype Props = {\n className?: string;\n children?: ReactNode;\n contentRef?: ComponentProps<'div'>['ref'];\n ref?: ComponentProps<'div'>['ref'];\n};\n\nexport const SidebarContent = ({ ref, className, children, contentRef }: Props) => {\n const { setElement, isBottom, isTop, isMiddle } = useScrollbarPosition();\n const mergedRefs = mergeRefs(ref ?? null, (ref) => setElement(ref));\n\n return (\n <ScrollArea\n ref={mergedRefs}\n type=\"scroll\"\n className=\"tw:group/sidebar-content tw:flex-1\"\n data-slot=\"sidebar-content\"\n scrollBarClassName=\"tw:w-1.5\"\n viewPortClassName={cn(\n 'tw:overflow-x-hidden',\n 'tw:overscroll-contain',\n 'tw:[&>div]:!flex', // overflow fix for scrollbar\n // Hide scroll-position-based borders (top/bottom) if SidebarHeader or SidebarFooter is omitted.\n 'tw:group-first/sidebar-content:before:hidden',\n 'tw:group-last/sidebar-content:after:hidden',\n 'tw:!box-border',\n {\n 'tw:before:absolute tw:before:top-0 tw:before:left-0 tw:before:right-0 tw:before:h-px tw:before:bg-sidebar-border tw:before:z-10 tw:before:content-[\"\"]':\n isBottom || isMiddle,\n 'tw:after:absolute tw:after:bottom-0 tw:after:left-0 tw:after:right-0 tw:after:h-px tw:after:bg-sidebar-border tw:after:z-10 tw:after:content-[\"\"]':\n isTop || isMiddle,\n },\n )}\n >\n <div\n ref={contentRef}\n className={cn(\n 'tw:flex',\n 'tw:flex-1',\n 'tw:flex-col',\n 'tw:gap-1',\n 'tw:overflow-x-hidden',\n 'tw:p-2',\n className,\n )}\n >\n {children}\n </div>\n </ScrollArea>\n );\n};\n","import { useCallback, useSyncExternalStore } from 'react';\n\n/**\n * Whether a CSS media query currently matches, re-rendering when it flips.\n *\n * - `false` wherever `matchMedia` is absent (SSR, a stubbed test environment), so the\n * caller renders its desktop branch rather than crashing.\n * - The subscription is the query's own `change` event — no resize listener, no polling.\n */\nexport const useMediaQuery = (query: string) => {\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const list = globalThis.matchMedia?.(query);\n list?.addEventListener?.('change', onStoreChange);\n\n return () => list?.removeEventListener?.('change', onStoreChange);\n },\n [query],\n );\n\n const getSnapshot = useCallback(() => globalThis.matchMedia?.(query).matches ?? false, [query]);\n\n return useSyncExternalStore(subscribe, getSnapshot, () => false);\n};\n","import type { SidebarCollapsible, SidebarMode, SidebarState, SidebarVariant } from './types';\n\nexport const SidebarWidthInPx = {\n MIN_DEFAULT: 256,\n\n // 8 px / 36 px / 8 px = 52 px\n // left padding / icon width / right padding\n COLLAPSED_ICON: 52,\n\n // padding from every side for floating variant (see --sidebar-floating-padding)\n FLOATING_VARIANT_PADDING: 8,\n} as const;\n\n/**\n * The default viewport width under which a rail stops being a column and opens as a sheet.\n *\n * - Matches Tailwind's `md`, so a call site's own `tw:md:*` breakpoint utilities flip\n * in the same frame as the rail.\n */\nexport const SIDEBAR_MOBILE_BREAKPOINT_PX = 768;\n\n/**\n * The query a rail watches to know whether it is a sheet.\n *\n * - `max-width`, so it is exclusive of the breakpoint itself — the width passed in is the\n * first one at which the rail is a column again.\n * - Per side, because the width at which a rail stops fitting is the rail's own: a 320px\n * panel beside a capped reading column runs out of room long before a navigation rail does.\n */\nexport const sidebarMobileMediaQuery = (breakpointPx: number) =>\n `(max-width: ${breakpointPx - 0.02}px)`;\n\nconst floatingSideCount: Record<SidebarVariant, number> = {\n 'sided-floating': 1,\n floating: 2,\n inset: 0,\n none: 0,\n};\n\ntype Input = {\n variant: SidebarVariant;\n width?: number;\n collapsible: SidebarCollapsible;\n mode: SidebarMode;\n state: SidebarState;\n /** Below the breakpoint the rail is a sheet, so it occupies no column. */\n isMobile?: boolean;\n};\n\ntype EffectiveWidths = {\n sidebar: number;\n gap: number;\n fill: number;\n};\n\nexport const calcEffectiveWidths = ({\n variant,\n width: customWidth,\n collapsible,\n state,\n mode,\n isMobile = false,\n}: Input) => {\n if (variant === 'none' || isMobile) return { sidebar: 0, gap: 0, fill: 0 };\n\n const padding = floatingSideCount[variant] * SidebarWidthInPx.FLOATING_VARIANT_PADDING;\n const width = Math.max(customWidth ?? 0, SidebarWidthInPx.MIN_DEFAULT) + padding;\n const iconWidth = SidebarWidthInPx.COLLAPSED_ICON + padding;\n const isExpanded = state === 'expanded';\n\n // Only compensate for floating padding when this sidebar itself has padding,\n // so the opposite filled sidebar doesn't double-count the gap.\n const reduction = variant === 'inset' ? 0 : SidebarWidthInPx.FLOATING_VARIANT_PADDING;\n\n const iconWidths = ((): EffectiveWidths => {\n const sidebar = isExpanded ? width : iconWidth;\n const gap = mode === 'expand-on-hover' ? iconWidth : sidebar;\n // Use gap (not sidebar) so the opposite filled sidebar stays stable\n // during expand-on-hover — gap stays at iconWidth while sidebar grows\n const fill = gap - reduction;\n return { sidebar, gap, fill };\n })();\n\n const offCanvasWidths = ((): EffectiveWidths => {\n const sidebar = width; //We use CSS translate to hide elements because it allows for transitions without shrinking the width.\n const gap = isExpanded ? width : SidebarWidthInPx.FLOATING_VARIANT_PADDING; // The gap is invisible and needs to be shrunk to move the content to its place.\n const fill = gap - reduction;\n return { sidebar, gap, fill };\n })();\n\n return collapsible === 'icon' ? iconWidths : offCanvasWidths;\n};\n","import { createContext, use } from 'react';\n\nimport type { SidebarCollapsible, SidebarSide, SidebarVariant } from '../types';\nimport type { calcEffectiveWidths } from '../utils';\n\nimport type { useSidebarState } from './useSidebarState';\n\ntype SidebarWidths = ReturnType<typeof calcEffectiveWidths>;\ntype SidebarState = ReturnType<typeof useSidebarState>;\n\ntype SidebarSideValue = SidebarState & {\n /**\n * Below the breakpoint: a sheet, not a column.\n * `mode` / `state` report `expanded`; `toggle` opens the sheet, not `mode`.\n */\n isMobile: boolean;\n /** Always `false` above the breakpoint. */\n isMobileOpen: boolean;\n /** Opening one side's sheet closes the other. */\n setMobileOpen: (open: boolean) => void;\n isFill: boolean;\n toggleFill: () => void;\n /** Idempotent counterpart to `toggleFill`. */\n setFill: (fill: boolean) => void;\n widths: SidebarWidths;\n collapsible: SidebarCollapsible;\n variant: SidebarVariant;\n baseWidth: number | undefined;\n onWidthChange: ((width: number) => void) | undefined;\n setDragWidth: (width: number | null) => void;\n isDragging: boolean;\n setIsDragging: (dragging: boolean) => void;\n};\n\nexport type SidebarContextValue = {\n left: SidebarSideValue;\n right: SidebarSideValue;\n};\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null);\n\n/** `useSidebar` that returns `null` outside a `SidebarProvider` instead of throwing. */\nexport const useOptionalSidebar = (side: SidebarSide = 'left'): SidebarSideValue | null =>\n use(SidebarContext)?.[side] ?? null;\n\nexport const useSidebar = (side: SidebarSide = 'left'): SidebarSideValue => {\n const context = use(SidebarContext);\n if (context === null) throw new Error('useSidebar must be used within a SidebarProvider.');\n return context[side];\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * CSS selectors matching portal-based overlay triggers in their open state.\n *\n * The sidebar's hover tracking ignores `mouseleave` while any of these selectors\n * match inside the sidebar DOM — preventing the sidebar from collapsing while the\n * user interacts with portal content rendered outside the sidebar tree.\n *\n * Update this list when changing or adding new components:\n */\nconst PORTAL_OPEN_SELECTORS = [\n '[aria-haspopup=\"menu\"][aria-expanded=true]', // DropdownMenu\n '[aria-haspopup=\"dialog\"][aria-expanded=true]', // Popover, Dialogs (Modal, Sheet)\n];\n\nconst PORTAL_OPEN_SELECTORS_STRING = PORTAL_OPEN_SELECTORS.join(',');\n\nexport const useHoverTracking = (sidebarElement: HTMLElement | null) => {\n // Which element the pointer is over, rather than a bare boolean. The tracked element is\n // replaced when the rail changes branch — crossing the mobile breakpoint does it — and a\n // boolean would carry the old element's hover onto the new one, leaving an\n // `expand-on-hover` rail expanded with the pointer somewhere else entirely.\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null);\n const isLockedRef = useRef(false);\n\n // Release an element the pointer can no longer be over: the rail swapped branch, or it\n // became a sheet and there is no rail to track at all. Holding the detached node would\n // keep its subtree alive for as long as the provider is mounted, and hand the hover\n // straight back if the same rail is mounted again.\n //\n // - Done during render rather than in an effect: it converges (the value it clears is the\n // one that no longer matches) and lands before the listeners below are re-bound.\n if (hoveredElement !== null && hoveredElement !== sidebarElement) setHoveredElement(null);\n\n const isHovered = hoveredElement !== null;\n\n useEffect(() => {\n if (!sidebarElement) return;\n\n const handleMouseEnter = () => setHoveredElement(sidebarElement);\n const handleMouseLeave = () => {\n if (isLockedRef.current) return;\n setHoveredElement(null);\n };\n\n sidebarElement.addEventListener('mouseenter', handleMouseEnter);\n sidebarElement.addEventListener('mouseleave', handleMouseLeave);\n\n return () => {\n sidebarElement.removeEventListener('mouseenter', handleMouseEnter);\n sidebarElement.removeEventListener('mouseleave', handleMouseLeave);\n };\n }, [sidebarElement]);\n\n useEffect(() => {\n if (!sidebarElement) return;\n let animationFrameId: number;\n\n const observer = new MutationObserver(() => {\n const hasOpenPortal = sidebarElement.querySelector(PORTAL_OPEN_SELECTORS_STRING) !== null;\n isLockedRef.current = hasOpenPortal;\n\n if (hasOpenPortal) return;\n\n animationFrameId = requestAnimationFrame(() => {\n setHoveredElement(sidebarElement.matches(':hover') ? sidebarElement : null);\n });\n });\n\n // Sync lock state immediately in case a portal trigger is already open on mount.\n isLockedRef.current = sidebarElement.querySelector(PORTAL_OPEN_SELECTORS_STRING) !== null;\n\n observer.observe(sidebarElement, {\n attributes: true,\n attributeFilter: ['aria-expanded'],\n subtree: true,\n });\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n observer.disconnect();\n };\n }, [sidebarElement]);\n\n return isHovered;\n};\n","import { useCallback, useMemo, useState } from 'react';\n\nimport { useElement } from '../../../hooks/useElement';\nimport type { SidebarMode, SidebarState } from '../types';\n\nimport { useHoverTracking } from './useHoverTracking';\n\ntype Props = {\n defaultMode?: SidebarMode;\n mode?: SidebarMode;\n onModeChange?: (state: SidebarMode) => void;\n};\n\nexport const useSidebarState = ({ defaultMode, mode: modeProp, onModeChange }: Props) => {\n const [sidebarElement, setSidebarElement] = useElement();\n const isHovered = useHoverTracking(sidebarElement);\n const [_mode, _setMode] = useState(defaultMode ?? 'expanded');\n const mode = modeProp ?? _mode;\n\n const setMode = useCallback(\n (dispatch: Parameters<typeof _setMode>[0]) => {\n const newState = typeof dispatch === 'function' ? dispatch(mode) : dispatch;\n const set = onModeChange ?? _setMode;\n set(newState);\n },\n [onModeChange, mode],\n );\n\n const toggle = useCallback(() => {\n setMode((currState) => (currState === 'expanded' ? 'collapsed' : 'expanded'));\n }, [setMode]);\n\n const state: SidebarState = (() => {\n if (mode === 'expand-on-hover') return isHovered ? 'expanded' : 'collapsed';\n return mode;\n })();\n\n return useMemo(\n () => ({\n isHovered,\n toggle,\n setMode,\n mode,\n state,\n sidebarElement,\n setSidebarElement,\n }),\n [isHovered, toggle, setMode, mode, state, sidebarElement, setSidebarElement],\n );\n};\n","import { type ReactNode, useCallback, useMemo, useState } from 'react';\n\nimport { useMediaQuery } from '../../../hooks/useMediaQuery';\nimport type { SidebarCollapsible, SidebarMode, SidebarSide, SidebarVariant } from '../types';\nimport {\n calcEffectiveWidths,\n SIDEBAR_MOBILE_BREAKPOINT_PX,\n sidebarMobileMediaQuery,\n} from '../utils';\n\nimport type { SidebarContextValue } from './context';\nimport { SidebarContext } from './context';\nimport { useSidebarState } from './useSidebarState';\n\nconst DEFAULT_SIDEBAR_VARIANT: SidebarVariant = 'none';\nconst DEFAULT_SIDEBAR_MODE: SidebarMode = 'expanded';\nconst DEFAULT_SIDEBAR_COLLAPSIBLE: SidebarCollapsible = 'off-canvas';\n\n/** A sheet's `setMode`: no-op, so `Sidebar.SearchInput` focus keeps a desktop `collapsed`. */\nconst ignoreModeChange = () => {};\n\n/** The side's own breakpoint, or the default for `true`. */\nconst mobileBreakpointOf = (mobileSheet: boolean | number) =>\n typeof mobileSheet === 'number' ? mobileSheet : SIDEBAR_MOBILE_BREAKPOINT_PX;\n\ntype Props = {\n children?: ReactNode;\n defaultLeftMode?: SidebarMode;\n leftMode?: SidebarMode;\n onLeftModeChange?: (mode: SidebarMode) => void;\n\n defaultRightMode?: SidebarMode;\n rightMode?: SidebarMode;\n onRightModeChange?: (mode: SidebarMode) => void;\n\n /**\n * Below a breakpoint (`true` = 768px, or px) the left rail is a `Sheet` that unmounts on close,\n * so keep panel state above the panel; needs a `Sidebar.Trigger` in the app.\n */\n leftMobileSheet?: boolean | number;\n /** `leftMobileSheet` for the right rail. */\n rightMobileSheet?: boolean | number;\n\n leftVariant?: SidebarVariant;\n leftWidth?: number;\n leftCollapsible?: SidebarCollapsible;\n\n rightVariant?: SidebarVariant;\n rightWidth?: number;\n rightCollapsible?: SidebarCollapsible;\n\n onLeftWidthChange?: (width: number) => void;\n onRightWidthChange?: (width: number) => void;\n\n defaultFilledSide?: SidebarSide | null;\n};\n\nexport const SidebarProvider = ({\n children,\n defaultLeftMode = DEFAULT_SIDEBAR_MODE,\n leftMode,\n onLeftModeChange,\n\n defaultRightMode = DEFAULT_SIDEBAR_MODE,\n rightMode,\n onRightModeChange,\n\n leftMobileSheet = false,\n rightMobileSheet = false,\n\n leftCollapsible = DEFAULT_SIDEBAR_COLLAPSIBLE,\n leftVariant = DEFAULT_SIDEBAR_VARIANT,\n leftWidth,\n\n rightCollapsible = DEFAULT_SIDEBAR_COLLAPSIBLE,\n rightVariant = DEFAULT_SIDEBAR_VARIANT,\n rightWidth,\n\n onLeftWidthChange,\n onRightWidthChange,\n\n defaultFilledSide = null,\n}: Props) => {\n // Hooks can't be skipped: an opted-out side still queries and is gated by the flag below.\n const isLeftNarrow = useMediaQuery(sidebarMobileMediaQuery(mobileBreakpointOf(leftMobileSheet)));\n const isRightNarrow = useMediaQuery(\n sidebarMobileMediaQuery(mobileBreakpointOf(rightMobileSheet)),\n );\n // `variant: 'none'` is never mobile, which also clears a stale open sheet below.\n const isLeftMobile = isLeftNarrow && leftMobileSheet !== false && leftVariant !== 'none';\n const isRightMobile = isRightNarrow && rightMobileSheet !== false && rightVariant !== 'none';\n const [filledSide, setFilledSide] = useState<SidebarSide | null>(defaultFilledSide);\n // One slot: one sheet open at a time.\n const [openMobileSide, setOpenMobileSide] = useState<SidebarSide | null>(null);\n const [isLeftDragging, setIsLeftDragging] = useState(false);\n const [isRightDragging, setIsRightDragging] = useState(false);\n const [leftDragWidth, setLeftDragWidth] = useState<number | null>(null);\n const [rightDragWidth, setRightDragWidth] = useState<number | null>(null);\n\n // Drop the drag override once the prop catches up, so later width props aren't masked.\n // Render-safe: it becomes null, so no loop.\n if (leftDragWidth !== null && leftWidth === leftDragWidth) setLeftDragWidth(null);\n if (rightDragWidth !== null && rightWidth === rightDragWidth) setRightDragWidth(null);\n\n // Past the breakpoint the rail is a column again; close its sheet.\n if (openMobileSide === 'left' && !isLeftMobile) setOpenMobileSide(null);\n if (openMobileSide === 'right' && !isRightMobile) setOpenMobileSide(null);\n\n const leftState = useSidebarState({\n defaultMode: defaultLeftMode,\n mode: leftMode,\n onModeChange: onLeftModeChange,\n });\n\n const rightState = useSidebarState({\n defaultMode: defaultRightMode,\n mode: rightMode,\n onModeChange: onRightModeChange,\n });\n\n const toggleLeftMobile = useCallback(\n () => setOpenMobileSide((prev) => (prev === 'left' ? null : 'left')),\n [],\n );\n const toggleRightMobile = useCallback(\n () => setOpenMobileSide((prev) => (prev === 'right' ? null : 'right')),\n [],\n );\n const setLeftMobileOpen = useCallback(\n (open: boolean) => setOpenMobileSide((prev) => (open ? 'left' : prev === 'left' ? null : prev)),\n [],\n );\n const setRightMobileOpen = useCallback(\n (open: boolean) =>\n setOpenMobileSide((prev) => (open ? 'right' : prev === 'right' ? null : prev)),\n [],\n );\n\n const toggleLeftFill = useCallback(\n () => setFilledSide((prev) => (prev === 'left' ? null : 'left')),\n [],\n );\n const toggleRightFill = useCallback(\n () => setFilledSide((prev) => (prev === 'right' ? null : 'right')),\n [],\n );\n\n // Idempotent per side; fill is one slot, so two sides at once race (last write wins).\n const setLeftFill = useCallback(\n (fill: boolean) => setFilledSide((prev) => (fill ? 'left' : prev === 'left' ? null : prev)),\n [],\n );\n const setRightFill = useCallback(\n (fill: boolean) => setFilledSide((prev) => (fill ? 'right' : prev === 'right' ? null : prev)),\n [],\n );\n\n const value = useMemo<SidebarContextValue>(\n () => ({\n left: {\n ...leftState,\n // A sheet reports `expanded`; `mode` is untouched so the desktop preference survives.\n ...(isLeftMobile\n ? {\n mode: 'expanded' as const,\n state: 'expanded' as const,\n toggle: toggleLeftMobile,\n setMode: ignoreModeChange,\n }\n : null),\n isMobile: isLeftMobile,\n isMobileOpen: openMobileSide === 'left',\n setMobileOpen: setLeftMobileOpen,\n isFill: filledSide === 'left',\n toggleFill: toggleLeftFill,\n setFill: setLeftFill,\n widths: calcEffectiveWidths({\n variant: leftVariant,\n width: leftDragWidth ?? leftWidth,\n collapsible: leftCollapsible,\n state: leftState.state,\n mode: leftState.mode,\n isMobile: isLeftMobile,\n }),\n collapsible: leftCollapsible,\n variant: leftVariant,\n baseWidth: leftDragWidth ?? leftWidth,\n onWidthChange: onLeftWidthChange,\n setDragWidth: setLeftDragWidth,\n isDragging: isLeftDragging,\n setIsDragging: setIsLeftDragging,\n },\n right: {\n ...rightState,\n ...(isRightMobile\n ? {\n mode: 'expanded' as const,\n state: 'expanded' as const,\n toggle: toggleRightMobile,\n setMode: ignoreModeChange,\n }\n : null),\n isMobile: isRightMobile,\n isMobileOpen: openMobileSide === 'right',\n setMobileOpen: setRightMobileOpen,\n isFill: filledSide === 'right',\n toggleFill: toggleRightFill,\n setFill: setRightFill,\n widths: calcEffectiveWidths({\n variant: rightVariant,\n width: rightDragWidth ?? rightWidth,\n collapsible: rightCollapsible,\n state: rightState.state,\n mode: rightState.mode,\n isMobile: isRightMobile,\n }),\n collapsible: rightCollapsible,\n variant: rightVariant,\n baseWidth: rightDragWidth ?? rightWidth,\n onWidthChange: onRightWidthChange,\n setDragWidth: setRightDragWidth,\n isDragging: isRightDragging,\n setIsDragging: setIsRightDragging,\n },\n }),\n [\n isLeftMobile,\n isRightMobile,\n openMobileSide,\n toggleLeftMobile,\n setLeftMobileOpen,\n toggleRightMobile,\n setRightMobileOpen,\n leftState,\n filledSide,\n toggleLeftFill,\n setLeftFill,\n leftVariant,\n leftWidth,\n leftDragWidth,\n leftCollapsible,\n onLeftWidthChange,\n isLeftDragging,\n rightState,\n toggleRightFill,\n setRightFill,\n rightVariant,\n rightWidth,\n rightDragWidth,\n rightCollapsible,\n onRightWidthChange,\n isRightDragging,\n ],\n );\n\n return <SidebarContext value={value}>{children}</SidebarContext>;\n};\n","import type { ComponentProps, MouseEventHandler } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\n\ntype Props = ComponentProps<typeof Slot> & {\n side?: SidebarSide;\n};\n\nexport const SidebarFillTrigger = ({ ref, side = 'left', onClick, ...rest }: Props) => {\n const { toggleFill, isFill } = useSidebar(side);\n\n const handleOnClick: MouseEventHandler<HTMLElement> = (event) => {\n toggleFill();\n onClick?.(event);\n };\n\n return <Slot {...rest} ref={ref} onClick={handleOnClick} aria-selected={isFill} />;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarFooter = ({ className, ...props }: Props) => (\n <div\n data-slot=\"sidebar-footer\"\n className={cn('tw:flex', 'tw:flex-col', 'tw:gap-2', 'tw:p-2', className)}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroup = ({ className, ...props }: Props) => (\n <div\n className={cn(\n 'tw:group/sidebar-group',\n 'tw:relative',\n 'tw:w-full',\n\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:min-w-0',\n 'tw:rounded-lg',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroupContent = ({ className, ...props }: Props) => (\n <div\n className={cn(\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-2',\n\n 'tw:w-full',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'button'>;\n\nexport const SidebarGroupAction = ({\n ref,\n className,\n type = 'button',\n children,\n ...props\n}: Props) => (\n <button\n {...props}\n type={type}\n ref={ref}\n className={cn(\n 'tw:group-data-[state=collapsed]/sidebar:hidden',\n\n // positioning\n 'tw:absolute',\n 'tw:right-1.5',\n 'tw:top-2',\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n\n // sizing\n 'tw:size-5',\n\n // styles\n 'tw:text-neutral-800',\n 'tw:rounded-full',\n\n // svg defaults: size + colour\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n 'tw:[&_svg]:text-neutral-400',\n 'tw:hover:[&_svg]:text-secondary-600',\n\n 'tw:hover:bg-neutral-100',\n\n 'tw:focus-visible:ring-4',\n 'tw:focus-visible:ring-ring/30',\n 'tw:focus-visible:outline',\n 'tw:focus-visible:outline-1',\n 'tw:focus-visible:outline-ring',\n className,\n )}\n >\n {children}\n </button>\n);\n","import type { ComponentProps, Ref } from 'react';\n\nimport { cn } from '../../../utils';\nimport { Separator } from '../../Separator';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroupLabel = ({\n ref,\n className,\n children,\n ...props\n}: Props & { ref?: Ref<HTMLDivElement> }) => (\n <div\n ref={ref}\n className={cn(\n 'tw:relative',\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:shrink-0',\n\n // styling\n 'tw:h-8',\n 'tw:px-2',\n 'tw:-mb-1',\n 'tw:rounded-lg',\n\n // text\n 'tw:uppercase',\n 'tw:font-sans',\n 'tw:text-xs',\n 'tw:tracking-[1px]',\n className,\n )}\n {...props}\n >\n <Separator\n orientation=\"horizontal\"\n size=\"3/4\"\n className={cn(\n 'tw:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:opacity-100',\n\n // positioning\n 'tw:absolute',\n 'tw:w-full',\n 'tw:left-0',\n 'tw:top-1/2 tw:-translate-y-1/2',\n\n 'tw:transition-opacity',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n />\n\n <span\n className={cn(\n 'tw:flex',\n 'tw:group-data-[state=collapsed]/sidebar:opacity-0',\n\n 'tw:items-center',\n 'tw:flex-1',\n 'tw:text-muted-foreground',\n 'tw:whitespace-nowrap',\n\n // transition\n 'tw:transition-opacity',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n >\n {children}\n </span>\n </div>\n);\n","import { createContext, use } from 'react';\n\nimport type { SidebarMode, SidebarSide, SidebarState } from './types';\n\ntype SidebarInstanceContextValue = {\n state: SidebarState;\n mode: SidebarMode;\n side: SidebarSide;\n};\n\nexport const SidebarInstanceContext = createContext<SidebarInstanceContextValue | null>(null);\n\nexport const useSidebarInstance = () => {\n const context = use(SidebarInstanceContext);\n if (context === null)\n throw new Error('useSidebarInstance must be used within a SidebarInstanceContext.');\n return context;\n};\n","import { type ComponentProps, use } from 'react';\n\nimport { cn } from '../../utils';\nimport { BrandLogo } from '../BrandLogo';\n\nimport { SidebarInstanceContext } from './SidebarInstanceContext';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarHeader = ({ className, children, ...props }: Props) => {\n const instance = use(SidebarInstanceContext);\n // BrandLogo reads the nearest ThemeProvider (or the default context) and renders\n // null when the active brand ships no logo, so no provider gate is needed.\n const variant = instance?.state === 'collapsed' ? 'mark' : 'wordmark';\n const fallback = <BrandLogo variant={variant} className=\"tw:h-7\" />;\n\n return (\n <div\n data-slot=\"sidebar-header\"\n className={cn(\n 'tw:peer/sidebar-header',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-2',\n 'tw:p-2',\n className,\n )}\n {...props}\n >\n {children ?? fallback}\n </div>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'ul'>;\n\nexport const SidebarMenu = ({ className, ...props }: Props) => (\n <ul\n data-sidebar=\"menu\"\n className={cn(\n 'tw:flex',\n 'tw:w-full',\n 'tw:min-w-0',\n 'tw:flex-col',\n 'tw:gap-1',\n\n // transition\n 'tw:transition-[margin,opacity]',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n\n // TODO: remove when boostrap is gone\n 'tw:pl-0',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'span'>;\n\nexport const SidebarMenuIcon = ({ ref, className, children, ...rest }: Props) => (\n <span\n {...rest}\n ref={ref}\n className={cn(\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:aspect-square',\n 'tw:shrink-0',\n 'tw:p-0.5',\n 'tw:text-sidebar-primary',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n className,\n )}\n >\n {children}\n </span>\n);\n","import type { AriaAttributes, MouseEvent, MouseEventHandler } from 'react';\n\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\n/**\n * Props a click is checked against before it counts as a destination.\n *\n * - Injected by wrappers (Radix `Slot` / `cloneElement`), so they arrive as ordinary props.\n */\ntype Props = Pick<AriaAttributes, 'aria-haspopup' | 'aria-expanded'> & {\n 'data-sidebar-trigger'?: string;\n};\n\n/**\n * A menu item's click handler: the caller's own, then (on a phone) dismissing the sheet.\n *\n * - Not a destination, so no dismissal:\n * - A popup opener (`aria-haspopup` / `aria-expanded`) — closing would take the popup too.\n * - `data-sidebar-trigger` — its `toggle` runs after this and would reopen the sheet.\n */\nexport const useDestinationDismiss = <T extends HTMLElement>(\n props: Props,\n onClick: MouseEventHandler<T> | undefined,\n): MouseEventHandler<T> => {\n const { side } = useSidebarInstance();\n const { isMobile, setMobileOpen } = useSidebar(side);\n\n const isDestination =\n props['aria-haspopup'] === undefined &&\n props['aria-expanded'] === undefined &&\n props['data-sidebar-trigger'] === undefined;\n\n return (event: MouseEvent<T>) => {\n onClick?.(event);\n if (isMobile && isDestination) setMobileOpen(false);\n };\n};\n","import type { ComponentProps, ReactNode, Ref } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\nimport { Tooltip } from '../../Tooltip';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { SidebarMenuIcon } from './SidebarMenuIcon';\nimport { useDestinationDismiss } from './useDestinationDismiss';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n tooltip?: ReactNode;\n icon?: ReactNode;\n /** Set by `Sidebar.Trigger` on the child it wraps — not part of a call site's API. */\n 'data-sidebar-trigger'?: string;\n};\n\nexport const SidebarMenuButton = ({\n ref,\n 'aria-selected': selected,\n className,\n children,\n asChild = false,\n icon,\n tooltip,\n onClick,\n ...props\n}: Props & { ref?: Ref<HTMLButtonElement> }) => {\n const Component = asChild ? Root : 'button';\n const { state, mode, side } = useSidebarInstance();\n const handleClick = useDestinationDismiss<HTMLButtonElement>(props, onClick);\n\n const button = (\n <Component\n {...props}\n onClick={handleClick}\n ref={ref}\n data-slot=\"sidebar-menu-button\"\n // `type` and `aria-selected` belong to a real <button>. With `asChild` the slot is\n // usually an <a> (the canonical nav item), where both are invalid — axe flags\n // `aria-selected` on a link as a critical violation. Mark the active link with\n // `aria-current=\"page\"` instead; it is styled identically below. `aria-selected`\n // is still forwarded when a caller passes it explicitly.\n {...(asChild ? {} : { type: 'button' as const })}\n {...(selected === undefined ? {} : { 'aria-selected': selected })}\n className={cn(\n 'tw:peer/sidebar-menu-button',\n 'tw:group/sidebar-menu-button',\n\n // if <SidebarMenuAction /> visible, prevent the text from being under the action button.\n 'tw:group-data-[state=expanded]/sidebar:group-has-[[data-slot=sidebar-menu-action][data-hover-only=false]]/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"])]:group-hover/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"])]:group-focus-within/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"][data-hover-only=true][data-state=open])]:pr-8',\n\n 'tw:flex',\n 'tw:w-full',\n 'tw:gap-2',\n 'tw:items-center',\n 'tw:z-10',\n 'tw:font-normal',\n 'tw:text-sidebar-foreground',\n 'tw:p-2',\n 'tw:whitespace-nowrap',\n 'tw:overflow-hidden',\n 'tw:rounded-lg',\n 'tw:text-start',\n 'tw:no-underline',\n 'tw:select-none',\n\n // hover\n 'tw:hover:not-disabled:bg-sidebar-accent',\n 'tw:hover:text-sidebar-accent-foreground',\n 'tw:focus:text-sidebar-accent-foreground', // anchor override\n 'tw:data-[slot=dropdown-menu-trigger]:data-[state=open]:bg-sidebar-accent',\n\n // disabled\n 'tw:disabled:opacity-50',\n 'tw:disabled:cursor-not-allowed',\n\n // active\n 'tw:aria-selected:font-medium',\n 'tw:aria-selected:bg-sidebar-accent',\n 'tw:aria-selected:cursor-default',\n // active for links https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-current\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:font-medium',\n 'tw:aria-[current=page]:focus:text-sidebar-accent-foreground',\n\n // focus-visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:z-10',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n 'tw:focus-visible:text-sidebar-foreground', // anchor override\n className,\n )}\n // Explicitly set the tabIndex to 0 to ensure the button is focusable; in Safari, anchors are not focusable by default.\n tabIndex={0}\n >\n {icon && <SidebarMenuIcon>{icon}</SidebarMenuIcon>}\n <Slottable>{children}</Slottable>\n </Component>\n );\n\n const shouldShowTooltip = state === 'collapsed' && mode !== 'expand-on-hover' && tooltip;\n\n if (shouldShowTooltip) {\n const tooltipPlacement = side === 'right' ? 'left' : 'right';\n\n return (\n <Tooltip tooltip={tooltip} placement={tooltipPlacement} triggerAsChild>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'li'>;\n\nexport const SidebarMenuItem = ({ className, ...props }: Props) => (\n <li className={cn('tw:group/sidebar-menu-item', 'tw:relative', className)} {...props} />\n);\n","import type { ComponentProps } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n};\n\nexport const SidebarMenuAction = ({\n ref,\n className,\n asChild = false,\n showOnHover = false,\n children,\n ...props\n}: Props) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n {...props}\n data-slot=\"sidebar-menu-action\"\n data-hover-only={showOnHover}\n ref={ref}\n className={cn(\n 'tw:absolute',\n 'tw:top-1/2',\n 'tw:-translate-y-1/2',\n 'tw:right-3',\n 'tw:z-10',\n 'tw:p-0.5',\n\n // display\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:aspect-square',\n\n // hiding\n 'tw:data-[hover-only=true]:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:hidden',\n\n 'tw:group-data-[state=expanded]/sidebar:group-hover/sidebar-menu-item:opacity-100',\n 'tw:group-data-[state=expanded]/sidebar:group-focus-within/sidebar-menu-item:opacity-100', // keyboard navigation\n\n 'tw:group-data-[state=expanded]/sidebar:data-[hover-only=true]:data-[state=open]:opacity-100', // for triggers (dropdown, tooltip, popover)\n\n 'tw:size-4',\n 'tw:rounded',\n\n // icon styling\n 'tw:[&_svg]:shrink-0',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3.5',\n 'tw:[&_svg]:text-sidebar-accent-foreground',\n\n // focus visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:z-10',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n 'tw:focus-visible:text-sidebar-foreground',\n className,\n )}\n >\n {children}\n </Comp>\n );\n};\n","import { useRef } from 'react';\nimport type { ComponentProps } from 'react';\n\nimport { Search } from '../../../icons';\nimport { cn, mergeRefs } from '../../../utils';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\nconst wrapperClassnames = cn(\n 'tw:group/search-input',\n 'tw:relative',\n 'tw:flex',\n 'tw:items-center',\n 'tw:min-h-9',\n 'tw:rounded-lg',\n 'tw:border',\n 'tw:transition-all',\n\n // collapsed state - transparent border/bg, hover like search button\n 'tw:group-data-[state=collapsed]/sidebar:cursor-pointer',\n 'tw:group-data-[state=collapsed]/sidebar:border-transparent',\n 'tw:group-data-[state=collapsed]/sidebar:hover:bg-sidebar-accent',\n\n // expanded state - visible border/bg, padding for input, text cursor\n 'tw:group-data-[state=expanded]/sidebar:cursor-text',\n 'tw:group-data-[state=expanded]/sidebar:px-2',\n 'tw:group-data-[state=expanded]/sidebar:border-neutral-200',\n\n // focus styles (only relevant when expanded)\n 'tw:focus-within:ring-2',\n 'tw:focus-within:ring-sidebar-ring/50',\n 'tw:focus-within:text-sidebar-foreground',\n);\n\ntype Props = Omit<ComponentProps<'input'>, 'prefix'>;\n\nexport const SidebarSearchInput = ({ ref: forwardedRef, className, ...inputProps }: Props) => {\n const { side } = useSidebarInstance();\n const { setMode } = useSidebar(side);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFocus = () => {\n setMode('expanded');\n };\n\n return (\n <div className={cn(wrapperClassnames, className)}>\n <Search\n className={cn(\n 'tw:pointer-events-none',\n 'tw:absolute',\n 'tw:left-2',\n 'tw:size-4',\n\n 'tw:text-sidebar-primary',\n 'tw:group-data-[state=expanded]/sidebar:text-neutral-400',\n )}\n />\n <input\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n {...inputProps}\n onFocus={(e) => {\n handleFocus();\n inputProps.onFocus?.(e);\n }}\n className={cn(\n 'tw:w-full',\n 'tw:bg-transparent',\n 'tw:text-sm',\n 'tw:font-sans',\n 'tw:outline-hidden',\n 'tw:placeholder:text-neutral-400',\n\n // collapsed state - visually hidden but still focusable for a11y\n 'tw:group-data-[state=collapsed]/sidebar:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:cursor-pointer',\n\n // expanded state\n 'tw:group-data-[state=expanded]/sidebar:pl-6',\n )}\n />\n </div>\n );\n};\n","import { useCallback, useState } from 'react';\nimport type { ComponentProps, HTMLAttributes, ReactNode } from 'react';\n\nimport { cn } from '../../../utils';\nimport { HoverCard } from '../../HoverCard';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\nimport { SidebarMenuIcon } from './SidebarMenuIcon';\n\nconst Title = ({ children }: { children: ReactNode }) => (\n <div className=\"tw:flex tw:select-none tw:gap-2 tw:text-sm tw:font-semibold\">{children}</div>\n);\n\nconst Content = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div\n className={cn(\n 'tw:whitespace-pre-line',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:invisible',\n className,\n )}\n >\n {children}\n </div>\n);\n\ntype Props = HTMLAttributes<HTMLDivElement> & {\n icon: ReactNode;\n title: ReactNode;\n};\n\nexport const SidebarMenuCard = ({ children, className, icon, title, ...rest }: Props) => {\n const [isOpen, setIsOpen] = useState(false);\n const { side = 'left' } = useSidebarInstance();\n const { state, isFill } = useSidebar(side);\n const isExpanded = state === 'expanded' || isFill;\n\n const handleOnOpenChange: ComponentProps<typeof HoverCard>['onOpenChange'] = useCallback(\n (open: boolean) => {\n setIsOpen(isExpanded || document.hidden ? false : open);\n },\n [isExpanded],\n );\n\n return (\n <HoverCard open={isOpen} onOpenChange={handleOnOpenChange}>\n <HoverCard.Trigger asChild>\n <div\n {...rest}\n data-slot=\"sidebar-menu-card\"\n tabIndex={isExpanded ? -1 : 0}\n className={cn(\n 'tw:group/sidebar-menu-card',\n 'tw:peer/sidebar-menu-card',\n\n 'tw:overflow-hidden',\n\n 'tw:border',\n 'tw:border-sidebar-border',\n 'tw:rounded-2xl',\n\n // layout\n 'tw:grid',\n 'tw:grid-rows-[1fr]',\n 'tw:flex-1',\n 'tw:p-4',\n\n // icon collapsed\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:p-2',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:border-transparent',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:grid-rows-[18px]',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:rounded-md',\n\n // focus-visible\n 'tw:outline-hidden',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:hover:bg-sidebar-accent',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:focus-visible:ring-2',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:focus-visible:ring-sidebar-ring/50',\n\n // transition\n 'tw:transition-[padding,border]',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n >\n <div className=\"tw:flex tw:flex-col tw:gap-2\">\n <Title>\n <SidebarMenuIcon className=\"tw:p-px\">{icon}</SidebarMenuIcon>\n {title}\n </Title>\n <Content className={className}>{children}</Content>\n </div>\n </div>\n </HoverCard.Trigger>\n\n <HoverCard.Content\n sideOffset={10}\n align=\"center\"\n side={side === 'left' ? 'right' : 'left'}\n className=\"tw:flex tw:flex-col tw:gap-2\"\n >\n <Title>{title}</Title>\n <Content className={className}>{children}</Content>\n </HoverCard.Content>\n </HoverCard>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarMenuBadge = ({ ref, className, ...props }: Props) => {\n return (\n <div\n ref={ref}\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:z-20',\n\n 'tw:absolute',\n\n // menu button position\n 'tw:peer-[]/sidebar-menu-button:right-2',\n // menu card position\n 'tw:peer-[]/sidebar-menu-card:right-4',\n 'tw:peer-[]/sidebar-menu-card:top-4',\n\n // icon collapsed position\n 'tw:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:right-0',\n 'tw:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:-top-1',\n\n 'tw:text-xs',\n 'tw:text-sidebar-primary-foreground',\n 'tw:bg-sidebar-primary',\n 'tw:px-1',\n 'tw:min-w-5',\n 'tw:h-5',\n 'tw:rounded-full',\n 'tw:pointer-events-none',\n 'tw:font-medium',\n 'tw:tabular-nums',\n 'tw:select-none',\n\n 'tw:transition-[top,right]',\n 'tw:delay-50',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n className,\n )}\n {...props}\n />\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { ChevronDown } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { Collapsible } from '../../Collapsible';\nimport { DropdownMenu } from '../../DropdownMenu';\nimport { Tooltip } from '../../Tooltip';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { SidebarMenuButton } from './SidebarMenuButton';\n\ntype Props = {\n children: ReactNode;\n icon: ReactNode;\n isActive?: boolean;\n label: string;\n} & Pick<ComponentProps<typeof Collapsible>, 'defaultOpen' | 'open' | 'onOpenChange'>;\n\nexport const SidebarMenuSub = ({\n children,\n icon,\n isActive = false,\n label,\n\n // collapsible props\n defaultOpen = false,\n open: openProp,\n onOpenChange,\n}: Props) => {\n const { state, side, mode } = useSidebarInstance();\n const [open, setOpen] = useState<'open-tooltip' | 'open-dropdown-menu' | null>(null);\n const [innerCollapsibleOpen, setInnerCollapsibleOpen] = useState(defaultOpen);\n\n const isCollapsibleOpen = (() => {\n // In the collapsed sidebar state, it is always closed.\n if (state === 'collapsed') return false;\n return openProp ?? innerCollapsibleOpen;\n })();\n\n const isDropdownMenu = mode === 'expand-on-hover' || mode === 'collapsed';\n\n const handleCollapsibleOpenChange = (open: boolean) => {\n if (openProp === undefined) setInnerCollapsibleOpen(open);\n\n onOpenChange?.(open);\n };\n\n const handleDropdownOpenChange = (open: boolean) => {\n setOpen(open ? 'open-dropdown-menu' : null);\n };\n\n const handleTooltipOpenChange = (open: boolean) => {\n setOpen((currentOpen) => {\n // dropdown menu has higher priority than tooltip, if it's open, keep it open\n if (currentOpen === 'open-dropdown-menu') return 'open-dropdown-menu';\n // no need to show tooltip in expanded state, so return null\n if (state === 'expanded') return null;\n return open ? 'open-tooltip' : null;\n });\n };\n\n if (isDropdownMenu) {\n return (\n <DropdownMenu open={open === 'open-dropdown-menu'} onOpenChange={handleDropdownOpenChange}>\n <Tooltip.Root open={open === 'open-tooltip'} onOpenChange={handleTooltipOpenChange}>\n <Tooltip.Trigger asChild>\n <DropdownMenu.Trigger asChild>\n <SidebarMenuButton\n icon={icon}\n data-active={isActive}\n className={cn(\n 'tw:data-[active=true]:bg-sidebar-accent',\n 'tw:data-[active=true]:font-medium',\n )}\n >\n {label}\n </SidebarMenuButton>\n </DropdownMenu.Trigger>\n </Tooltip.Trigger>\n <Tooltip.Content variant=\"action\" placement={side}>\n {label}\n </Tooltip.Content>\n </Tooltip.Root>\n\n <DropdownMenu.Content side={side} align=\"start\">\n <DropdownMenu.Label>{label}</DropdownMenu.Label>\n {children}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n }\n\n return (\n <Collapsible open={isCollapsibleOpen} onOpenChange={handleCollapsibleOpenChange}>\n <Collapsible.Trigger asChild>\n <SidebarMenuButton\n icon={icon}\n data-active={isActive && !isCollapsibleOpen}\n className={cn(\n 'tw:group',\n 'tw:data-[active=true]:bg-sidebar-accent',\n 'tw:data-[active=true]:font-medium',\n )}\n >\n {label}\n <ChevronDown className=\"tw:ml-auto tw:size-5 tw:transition-transform tw:duration-200 tw:group-data-[state=open]:rotate-180\" />\n </SidebarMenuButton>\n </Collapsible.Trigger>\n <Collapsible.Content>\n <ul\n data-sidebar=\"menu-sub\"\n className={cn(\n 'tw:ml-3.5',\n 'tw:flex',\n 'tw:min-w-0',\n 'tw:translate-x-px',\n 'tw:flex-col',\n 'tw:gap-1',\n 'tw:border-l',\n 'tw:border-sidebar-border',\n 'tw:py-0.5',\n 'tw:pl-2.5',\n 'tw:pr-0',\n\n // TODO: remove when bootstrap is gone\n 'tw:list-none',\n )}\n >\n {children}\n </ul>\n </Collapsible.Content>\n </Collapsible>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\nimport { DropdownMenu } from '../../DropdownMenu';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { useDestinationDismiss } from './useDestinationDismiss';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n /** Set by `Sidebar.Trigger` on the child it wraps — not part of a call site's API. */\n 'data-sidebar-trigger'?: string;\n};\n\nexport const SidebarMenuSubItem = ({\n ref,\n className,\n asChild = false,\n children,\n disabled,\n onClick,\n 'aria-current': ariaCurrent,\n ...props\n}: Props) => {\n const { mode } = useSidebarInstance();\n // A nested destination is a destination: an expanded `Sidebar.SubMenu` renders its children\n // here, and choosing one navigates the page the sheet is sitting on top of.\n const handleClick = useDestinationDismiss<HTMLButtonElement>(props, onClick);\n const isDropdownMenu = mode === 'collapsed' || mode === 'expand-on-hover';\n\n if (isDropdownMenu) {\n return (\n <DropdownMenu.Item\n aria-current={ariaCurrent}\n asChild={asChild}\n disabled={disabled}\n className={cn(\n // use sidebar colors for active and focus states\n 'tw:focus:!bg-sidebar-accent',\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:focus:text-sidebar-accent-foreground',\n className,\n )}\n >\n {children}\n </DropdownMenu.Item>\n );\n }\n\n const Component = asChild ? Root : 'button';\n\n return (\n <li className=\"tw:group/sidebar-menu-sub-item tw:relative\">\n <Component\n {...props}\n onClick={handleClick}\n ref={ref}\n aria-current={ariaCurrent}\n data-slot=\"sidebar-menu-sub-button\"\n type=\"button\"\n disabled={disabled}\n className={cn(\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-2',\n\n // sizing\n 'tw:h-7',\n 'tw:w-full',\n 'tw:min-w-0',\n 'tw:px-2',\n\n //font\n 'tw:text-sidebar-foreground',\n 'tw:text-sm',\n 'tw:font-normal',\n 'tw:text-start',\n 'tw:whitespace-nowrap',\n\n 'tw:overflow-hidden',\n 'tw:rounded-md',\n 'tw:no-underline',\n\n 'tw:select-none',\n 'tw:outline-hidden',\n\n // hover\n 'tw:hover:not-disabled:bg-sidebar-accent',\n 'tw:hover:text-sidebar-accent-foreground',\n 'tw:focus:text-sidebar-accent-foreground',\n\n // active\n 'tw:aria-selected:font-medium',\n 'tw:aria-selected:bg-sidebar-accent',\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:font-medium',\n\n // disabled\n 'tw:disabled:opacity-50',\n 'tw:disabled:cursor-not-allowed',\n\n // focus-visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n className,\n )}\n >\n <Slottable>{children}</Slottable>\n </Component>\n </li>\n );\n};\n","import { type MouseEventHandler, useCallback, useEffect, useRef } from 'react';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\nimport { SidebarWidthInPx } from './utils';\n\nconst DEFAULT_MIN_WIDTH = 384;\nconst DEFAULT_MAX_WIDTH = 800;\n\ntype UseResizeSidebarInput = {\n side: SidebarSide;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport const useResizeSidebar = ({\n side,\n minWidth = DEFAULT_MIN_WIDTH,\n maxWidth = DEFAULT_MAX_WIDTH,\n}: UseResizeSidebarInput) => {\n const { onWidthChange, baseWidth, isFill, state, isDragging, setIsDragging, setDragWidth } =\n useSidebar(side);\n const isResizable = state === 'expanded' && !isFill && onWidthChange !== undefined;\n const startXRef = useRef(0);\n const startWidthRef = useRef(0);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n return () => {\n cleanupRef.current?.();\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, []);\n\n const clampToRange = useCallback(\n (width: number) => {\n const effectiveMax = Math.max(minWidth, Math.min(maxWidth, window.innerWidth * 0.5));\n return Math.round(Math.min(effectiveMax, Math.max(minWidth, width)));\n },\n [minWidth, maxWidth],\n );\n\n const handleMouseDown: MouseEventHandler = useCallback(\n (e) => {\n if (!isResizable || isDragging) return;\n\n cleanupRef.current?.();\n setIsDragging(true);\n\n startWidthRef.current = baseWidth ?? SidebarWidthInPx.MIN_DEFAULT;\n startXRef.current = e.clientX;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const delta =\n side === 'right'\n ? startXRef.current - moveEvent.clientX\n : moveEvent.clientX - startXRef.current;\n setDragWidth(clampToRange(startWidthRef.current + delta));\n };\n\n const handleMouseUp = (upEvent: MouseEvent) => {\n const delta =\n side === 'right'\n ? startXRef.current - upEvent.clientX\n : upEvent.clientX - startXRef.current;\n onWidthChange?.(clampToRange(startWidthRef.current + delta));\n setIsDragging(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n cleanupRef.current = null;\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n cleanupRef.current = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n setIsDragging(false);\n setDragWidth(null);\n };\n },\n [\n isResizable,\n isDragging,\n side,\n onWidthChange,\n baseWidth,\n setIsDragging,\n setDragWidth,\n clampToRange,\n ],\n );\n\n const handleDoubleClick = useCallback(() => {\n onWidthChange?.(minWidth);\n }, [onWidthChange, minWidth]);\n\n return {\n handleProps: {\n onMouseDown: handleMouseDown,\n onDoubleClick: handleDoubleClick,\n },\n isDragging,\n isResizable,\n };\n};\n","import { cn } from '../../utils';\n\nimport type { SidebarSide } from './types';\nimport { useResizeSidebar } from './useResizeSidebar';\n\ntype Props = {\n side: SidebarSide;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport const SidebarResizeHandle = ({ side, minWidth, maxWidth }: Props) => {\n const { handleProps, isResizable } = useResizeSidebar({ side, minWidth, maxWidth });\n\n if (!isResizable) return null;\n\n return (\n <div\n {...handleProps}\n aria-hidden\n className={cn(\n 'tw:absolute tw:inset-y-0 tw:z-10 tw:w-3',\n side === 'right' ? 'tw:left-0' : 'tw:right-0',\n 'tw:cursor-col-resize',\n )}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\nimport { Separator } from '../Separator';\n\ntype Props = Omit<ComponentProps<typeof Separator>, 'orientation' | 'size'>;\n\nexport const SidebarSeparator = ({ className, ...props }: Props) => (\n <Separator\n {...props}\n orientation=\"horizontal\"\n size=\"full\"\n className={cn('tw:before:bg-sidebar-border tw:p-2', className)}\n />\n);\n","import type { ComponentProps, MouseEventHandler } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../utils';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\n\ntype Props = ComponentProps<typeof Slot> & {\n side?: SidebarSide;\n hideWhenCollapsed?: boolean;\n};\n\nexport const SidebarTrigger = ({\n side = 'left',\n onClick,\n hideWhenCollapsed = false,\n className,\n ...rest\n}: Props) => {\n const { toggle, state, isMobile, isMobileOpen } = useSidebar(side);\n\n const handleOnClick: MouseEventHandler<HTMLElement> = (event) => {\n toggle();\n onClick?.(event);\n };\n\n return (\n <Slot\n {...rest}\n // Set here: a child's `aria-expanded` would win the slot merge. Only a sheet is a dialog.\n aria-expanded={isMobile ? isMobileOpen : state === 'expanded'}\n {...(isMobile ? { 'aria-haspopup': 'dialog' as const } : null)}\n // A child `Sidebar.MenuButton` skips its mobile dismissal, else `toggle` reopens the sheet.\n data-sidebar-trigger=\"\"\n onClick={handleOnClick}\n className={cn(\n {\n 'tw:group-data-[state=collapsed]/sidebar:hidden': hideWhenCollapsed,\n },\n className,\n )}\n />\n );\n};\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { ComponentProps, CSSProperties, ReactNode, TransitionEventHandler } from 'react';\n\nimport { cn } from '../../utils';\nimport { Sheet } from '../Sheet';\nimport { useThemeScopeContainer } from '../ThemeProvider/ThemeScope';\nimport { TooltipProvider } from '../Tooltip';\n\nimport { useTransitionPresence } from './SidebarProvider/useTransitionPresence';\nimport { SidebarContent } from './SidebarContent';\nimport { SidebarFillTrigger } from './SidebarFillTrigger';\nimport { SidebarFooter } from './SidebarFooter';\nimport {\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n} from './SidebarGroup';\nimport { SidebarHeader } from './SidebarHeader';\nimport { SidebarInstanceContext } from './SidebarInstanceContext';\nimport {\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuCard,\n SidebarMenuIcon,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubItem,\n SidebarSearchInput,\n} from './SidebarMenu';\nimport { useSidebar } from './SidebarProvider';\nimport { SidebarResizeHandle } from './SidebarResizeHandle';\nimport { SidebarSeparator } from './SidebarSeparator';\nimport { SidebarTrigger } from './SidebarTrigger';\nimport type { SidebarSide } from './types';\nimport { SidebarWidthInPx } from './utils';\n\n/**\n * `className` and `style` land on the rail's inner box; other props on the outer element, so a\n * `ThemeScope` reaches it.\n */\ntype Props = Omit<ComponentProps<'div'>, 'children' | 'className' | 'style' | 'id'> & {\n children: ReactNode;\n className?: string;\n id?: string;\n side?: SidebarSide;\n style?: CSSProperties;\n container?: boolean;\n keepMounted?: boolean;\n /** Hold the panel's content back until it has finished sliding in. */\n mountAfterEnter?: boolean;\n resizable?: boolean;\n /** Visually hidden name of the mobile sheet; defaults to `Navigation` / `Side panel` by side. */\n mobileTitle?: string;\n};\n\nexport const Sidebar = ({\n children,\n className,\n id,\n side = 'left',\n style,\n container = false,\n keepMounted,\n mountAfterEnter,\n resizable = false,\n mobileTitle,\n ...rest\n}: Props) => {\n const oppositeSide = side === 'left' ? 'right' : 'left';\n const {\n setSidebarElement,\n state,\n mode,\n isFill,\n widths,\n collapsible,\n variant,\n isDragging,\n isMobile,\n isMobileOpen,\n setMobileOpen,\n } = useSidebar(side);\n\n // Where the sheet is portalled.\n // - A `ThemeScope`'s container, so the sheet gets the scope's scheme and tokens.\n // - `null` outside a scope (Radix's default: <body>).\n const themeScopeContainer = useThemeScopeContainer();\n\n const { isMounted, completeUnmount } = useTransitionPresence({\n mounted: collapsible !== 'off-canvas' || mode !== 'collapsed',\n keepMounted,\n mountAfterEnter,\n });\n const { widths: oppositeWidths } = useSidebar(oppositeSide);\n const sidebarInstanceContextValue = useMemo(() => ({ state, mode, side }), [state, mode, side]);\n\n // Where focus goes when the sheet closes.\n // - The sheet has no `Dialog.Trigger`, so Radix would drop focus onto <body>.\n // - Recorded only while closed, so focus inside the sheet does not overwrite it.\n // - Re-checked on close, as the opener may have unmounted.\n const focusOriginRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isMobile || isMobileOpen) return;\n\n const remember = (event: FocusEvent) => {\n if (event.target instanceof HTMLElement) focusOriginRef.current = event.target;\n };\n\n document.addEventListener('focusin', remember);\n\n return () => document.removeEventListener('focusin', remember);\n }, [isMobile, isMobileOpen]);\n\n // Returns focus to the opener when the viewport grows out from under an open sheet.\n // - The sheet unmounts rather than closes, so `onCloseAutoFocus` never runs.\n // - A trigger hidden above the breakpoint makes `.focus()` a harmless no-op.\n const wasSheetUpRef = useRef(false);\n\n useEffect(() => {\n const wasSheetUp = wasSheetUpRef.current;\n wasSheetUpRef.current = isMobile && isMobileOpen;\n\n if (!wasSheetUp || isMobile) return;\n\n const origin = focusOriginRef.current;\n if (origin?.isConnected) origin.focus();\n }, [isMobile, isMobileOpen]);\n\n const handleTransitionEnd: TransitionEventHandler<HTMLDivElement> = (event) => {\n if (event.target !== event.currentTarget) return;\n completeUnmount();\n };\n\n const styles = {\n // Caller vars first (a `ThemeScope`'s tokens), so the geometry vars below win.\n ...style,\n '--sidebar-floating-padding': `${SidebarWidthInPx.FLOATING_VARIANT_PADDING}px`,\n '--sidebar-width': `${widths.sidebar}px`,\n '--sidebar-width-gap': `${widths.gap}px`,\n '--opposite-sidebar-width': `${oppositeWidths.fill}px`,\n } as CSSProperties;\n\n if (variant === 'none') return null;\n\n // The rail's data attributes without the geometry, so child `group-data-*` selectors resolve in the sheet.\n const railAttributes = {\n 'data-state': state,\n 'data-side': side,\n 'data-mode': mode,\n 'data-collapsible': collapsible,\n 'data-variant': variant,\n 'data-fill': isFill,\n } as const;\n\n // `keepMounted` / `mountAfterEnter` are ignored: the sheet mounts on open and unmounts on close.\n if (isMobile) {\n return (\n <TooltipProvider>\n <SidebarInstanceContext value={sidebarInstanceContextValue}>\n <Sheet open={isMobileOpen} onOpenChange={setMobileOpen}>\n <Sheet.Content\n side={side}\n container={themeScopeContainer ?? undefined}\n // Sheet chrome only; the caller's `style` stays on the rail.\n className=\"tw:w-[min(20rem,85vw)] tw:bg-sidebar tw:text-sidebar-foreground tw:p-0\"\n onCloseAutoFocus={(event) => {\n const origin = focusOriginRef.current;\n if (!origin?.isConnected) return;\n event.preventDefault();\n origin.focus();\n }}\n >\n <Sheet.Title visuallyHidden>\n {mobileTitle ?? (side === 'left' ? 'Navigation' : 'Side panel')}\n </Sheet.Title>\n {/* No `ref={setSidebarElement}`: it only drives `expand-on-hover`. */}\n <div\n {...rest}\n {...railAttributes}\n id={id}\n // `className` and `style` stay, so a `ThemeScope`'s class still applies.\n style={style}\n className={cn(\n 'tw:flex tw:min-h-0 tw:flex-1 tw:flex-col',\n { 'tw:group/sidebar tw:peer/sidebar': !container },\n className,\n )}\n >\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'tw:bg-sidebar',\n 'tw:relative',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:size-full',\n 'tw:overflow-hidden',\n 'tw:border-sidebar-border',\n 'tw:group-[]/sidebar:pt-2',\n )}\n >\n {children}\n </div>\n </div>\n </Sheet.Content>\n </Sheet>\n </SidebarInstanceContext>\n </TooltipProvider>\n );\n }\n\n return (\n <TooltipProvider>\n <SidebarInstanceContext value={sidebarInstanceContextValue}>\n <div\n {...rest}\n {...railAttributes}\n id={id}\n ref={setSidebarElement}\n style={styles}\n className={cn(\n 'tailwindcss-preflight',\n 'tw:flex',\n 'tw:relative',\n // Expand-on-hover overlaps the opposite filled sidebar.\n mode === 'expand-on-hover' ? 'tw:z-[51]' : 'tw:z-50',\n {\n // Page-level only; nested container sidebars must not clash with the outer one.\n 'tw:group/sidebar tw:peer/sidebar': !container,\n },\n\n // ── GAP DIV ──\n 'tw:[&>[data-slot=gap]]:w-(--sidebar-width-gap)',\n 'tw:[&[data-side=right]>[data-slot=gap]]:rotate-180',\n\n // ── SIDEBAR-WRAPPER DIV ──\n 'tw:[&>[data-slot=sidebar-wrapper]]:w-(--sidebar-width)',\n 'tw:[&[data-side=left]>[data-slot=sidebar-wrapper]]:left-0',\n 'tw:[&[data-side=right]>[data-slot=sidebar-wrapper]]:right-0',\n // `translate-x-*` sets `translate`, not `transform`; the transition list must name it.\n 'tw:[&[data-state=collapsed][data-collapsible=off-canvas][data-side=left]>[data-slot=sidebar-wrapper]]:-translate-x-full',\n 'tw:[&[data-state=collapsed][data-collapsible=off-canvas][data-side=right]>[data-slot=sidebar-wrapper]]:translate-x-full',\n\n // floating variants styles\n 'tw:[&[data-variant=sided-floating]>[data-slot=sidebar-wrapper]]:pt-(--sidebar-floating-padding)',\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]]:pr-(--sidebar-floating-padding)',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]]:pl-(--sidebar-floating-padding)',\n\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]]:p-(--sidebar-floating-padding)',\n\n // fill state\n 'tw:[&[data-fill=true]>[data-slot=sidebar-wrapper]]:!w-[calc(100svw-var(--opposite-sidebar-width))]',\n 'tw:[&[data-fill=true][data-variant=floating]>[data-slot=sidebar-wrapper]]:!p-(--sidebar-floating-padding)',\n 'tw:[&[data-fill=true][data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:!rounded-tr-xl',\n 'tw:[&[data-fill=true][data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:!rounded-tl-xl',\n\n // ── SIDEBAR DIV (INNERMOST) ──\n 'tw:[&[data-variant=inset][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-r',\n 'tw:[&[data-variant=inset][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-l',\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:shadow',\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-xl',\n 'tw:[&[data-variant=sided-floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:shadow',\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-tr-xl',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-tl-xl',\n // Inner edge border: on the dark scheme the shadow has no lighter ground to show on.\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-r',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-l',\n\n // Ease-out; linear reads as choppy.\n isDragging\n ? 'tw:transition-none'\n : 'tw:transition-[width,translate,transform] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n )}\n >\n <div\n data-slot=\"gap\"\n className={cn(\n 'tw:bg-transparent',\n isDragging\n ? ''\n : 'tw:transition-[width] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n )}\n />\n\n <div\n data-slot=\"sidebar-wrapper\"\n onTransitionEnd={handleTransitionEnd}\n className={cn(\n 'tw:fixed',\n 'tw:inset-y-0',\n 'tw:border-border',\n\n isDragging\n ? 'tw:transition-none'\n : 'tw:transition-[width,translate,transform] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n // Composite the slide.\n 'tw:transform-gpu',\n className,\n )}\n style={style}\n >\n {resizable && <SidebarResizeHandle side={side} />}\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'tw:bg-sidebar',\n 'tw:overflow-hidden',\n 'tw:relative',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:size-full',\n 'tw:border-sidebar-border',\n 'tw:group-[]/sidebar:pt-2',\n )}\n >\n {isMounted ? children : null}\n </div>\n </div>\n </div>\n </SidebarInstanceContext>\n </TooltipProvider>\n );\n};\n\n// main layout\nSidebar.Header = SidebarHeader;\nSidebar.Content = SidebarContent;\nSidebar.Footer = SidebarFooter;\nSidebar.Trigger = SidebarTrigger;\nSidebar.FillTrigger = SidebarFillTrigger;\nSidebar.Separator = SidebarSeparator;\nSidebar.MenuIcon = SidebarMenuIcon;\n\n// group features\nSidebar.Group = SidebarGroup;\nSidebar.GroupLabel = SidebarGroupLabel;\nSidebar.GroupContent = SidebarGroupContent;\nSidebar.GroupAction = SidebarGroupAction;\n\n// menu features\nSidebar.Menu = SidebarMenu;\nSidebar.MenuItem = SidebarMenuItem;\nSidebar.MenuButton = SidebarMenuButton;\nSidebar.MenuAction = SidebarMenuAction;\nSidebar.SearchInput = SidebarSearchInput;\nSidebar.MenuCard = SidebarMenuCard;\nSidebar.MenuBadge = SidebarMenuBadge;\n\n// sub-menu features\nSidebar.SubMenu = SidebarMenuSub;\nSidebar.SubItem = SidebarMenuSubItem;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Sidebar-D9ytIs8V.js","names":[],"sources":["../src/components/Sidebar/SidebarProvider/useTransitionPresence.ts","../src/components/Sidebar/SidebarContent.tsx","../src/hooks/useMediaQuery.ts","../src/components/Sidebar/utils.ts","../src/components/Sidebar/SidebarProvider/context.ts","../src/components/Sidebar/SidebarProvider/useHoverTracking.ts","../src/components/Sidebar/SidebarProvider/useSidebarState.ts","../src/components/Sidebar/SidebarProvider/SidebarProvider.tsx","../src/components/Sidebar/SidebarFillTrigger.tsx","../src/components/Sidebar/SidebarFooter.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroup.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupContent.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupAction.tsx","../src/components/Sidebar/SidebarGroup/SidebarGroupLabel.tsx","../src/components/Sidebar/SidebarInstanceContext.ts","../src/components/Sidebar/SidebarHeader.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenu.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuIcon.tsx","../src/components/Sidebar/SidebarMenu/useDestinationDismiss.ts","../src/components/Sidebar/SidebarMenu/SidebarMenuButton.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuItem.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuAction.tsx","../src/components/Sidebar/SidebarMenu/SidebarSearchInput.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuCard.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuBadge.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuSub.tsx","../src/components/Sidebar/SidebarMenu/SidebarMenuSubItem.tsx","../src/components/Sidebar/useResizeSidebar.ts","../src/components/Sidebar/SidebarResizeHandle.tsx","../src/components/Sidebar/SidebarSeparator.tsx","../src/components/Sidebar/SidebarTrigger.tsx","../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect, useMemo, useReducer } from 'react';\n\ntype MountState = 'mounted' | 'enterSuspended' | 'unmountSuspended' | 'unmounted';\ntype MountEvent = 'MOUNT' | 'ENTER' | 'TRANSITION_OUT' | 'TRANSITION_END';\n\ntype UseTransitionPresenceOptions = {\n mounted: boolean;\n keepMounted?: boolean;\n /** Hold the subtree back until the enter transition ends — a heavy mount in the same commit blocks every frame of it. */\n mountAfterEnter?: boolean;\n};\n\nconst FALLBACK_TIMEOUT_MS = 500;\n\n/** Under reduced motion there is no `transitionend` to wait for, so the mount is not deferred. */\nconst prefersReducedMotion = () =>\n typeof window !== 'undefined' &&\n (window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false);\n\nconst reducer = (state: MountState, event: MountEvent): MountState => {\n switch (event) {\n case 'MOUNT':\n return 'mounted';\n case 'ENTER':\n // Already-mounted content stays put; only a cold open waits.\n return state === 'unmounted' ? 'enterSuspended' : 'mounted';\n case 'TRANSITION_OUT':\n // Closed before the content arrived: nothing to animate out.\n if (state === 'enterSuspended') return 'unmounted';\n return state === 'mounted' ? 'unmountSuspended' : state;\n case 'TRANSITION_END':\n if (state === 'unmountSuspended') return 'unmounted';\n if (state === 'enterSuspended') return 'mounted';\n return state;\n default:\n return state;\n }\n};\n\nexport const useTransitionPresence = ({\n mounted,\n keepMounted = false,\n mountAfterEnter = false,\n}: UseTransitionPresenceOptions) => {\n const [state, send] = useReducer(reducer, mounted ? 'mounted' : 'unmounted');\n\n useLayoutEffect(() => {\n if (keepMounted) return;\n if (!mounted) {\n send('TRANSITION_OUT');\n return;\n }\n send(mountAfterEnter && !prefersReducedMotion() ? 'ENTER' : 'MOUNT');\n }, [mounted, keepMounted, mountAfterEnter]);\n\n // Fallback for both suspensions when `onTransitionEnd` never fires.\n useEffect(() => {\n if (state !== 'unmountSuspended' && state !== 'enterSuspended') return;\n\n const id = setTimeout(() => send('TRANSITION_END'), FALLBACK_TIMEOUT_MS);\n return () => clearTimeout(id);\n }, [state]);\n\n return useMemo(\n () => ({\n isMounted: keepMounted || state === 'mounted' || state === 'unmountSuspended',\n /** Resolves whichever transition the subtree is waiting on. */\n completeUnmount: () => send('TRANSITION_END'),\n }),\n [state, keepMounted],\n );\n};\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { useScrollbarPosition } from '../../hooks/useScrollbarPosition';\nimport { cn, mergeRefs } from '../../utils';\nimport { ScrollArea } from '../ScrollArea';\n\ntype Props = {\n className?: string;\n children?: ReactNode;\n contentRef?: ComponentProps<'div'>['ref'];\n ref?: ComponentProps<'div'>['ref'];\n};\n\nexport const SidebarContent = ({ ref, className, children, contentRef }: Props) => {\n const { setElement, isBottom, isTop, isMiddle } = useScrollbarPosition();\n const mergedRefs = mergeRefs(ref ?? null, (ref) => setElement(ref));\n\n return (\n <ScrollArea\n ref={mergedRefs}\n type=\"scroll\"\n className=\"tw:group/sidebar-content tw:flex-1\"\n data-slot=\"sidebar-content\"\n scrollBarClassName=\"tw:w-1.5\"\n viewPortClassName={cn(\n 'tw:overflow-x-hidden',\n 'tw:overscroll-contain',\n 'tw:[&>div]:!flex', // overflow fix for scrollbar\n // Hide scroll-position-based borders (top/bottom) if SidebarHeader or SidebarFooter is omitted.\n 'tw:group-first/sidebar-content:before:hidden',\n 'tw:group-last/sidebar-content:after:hidden',\n 'tw:!box-border',\n {\n 'tw:before:absolute tw:before:top-0 tw:before:left-0 tw:before:right-0 tw:before:h-px tw:before:bg-sidebar-border tw:before:z-10 tw:before:content-[\"\"]':\n isBottom || isMiddle,\n 'tw:after:absolute tw:after:bottom-0 tw:after:left-0 tw:after:right-0 tw:after:h-px tw:after:bg-sidebar-border tw:after:z-10 tw:after:content-[\"\"]':\n isTop || isMiddle,\n },\n )}\n >\n <div\n ref={contentRef}\n className={cn(\n 'tw:flex',\n 'tw:flex-1',\n 'tw:flex-col',\n 'tw:gap-1',\n 'tw:overflow-x-hidden',\n 'tw:p-2',\n className,\n )}\n >\n {children}\n </div>\n </ScrollArea>\n );\n};\n","import { useCallback, useSyncExternalStore } from 'react';\n\n/**\n * Whether a CSS media query currently matches, re-rendering when it flips.\n *\n * - `false` wherever `matchMedia` is absent (SSR, a stubbed test environment), so the\n * caller renders its desktop branch rather than crashing.\n * - The subscription is the query's own `change` event — no resize listener, no polling.\n */\nexport const useMediaQuery = (query: string) => {\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const list = globalThis.matchMedia?.(query);\n list?.addEventListener?.('change', onStoreChange);\n\n return () => list?.removeEventListener?.('change', onStoreChange);\n },\n [query],\n );\n\n const getSnapshot = useCallback(() => globalThis.matchMedia?.(query).matches ?? false, [query]);\n\n return useSyncExternalStore(subscribe, getSnapshot, () => false);\n};\n","import type { SidebarCollapsible, SidebarMode, SidebarState, SidebarVariant } from './types';\n\nexport const SidebarWidthInPx = {\n MIN_DEFAULT: 256,\n\n // 8 px / 36 px / 8 px = 52 px\n // left padding / icon width / right padding\n COLLAPSED_ICON: 52,\n\n // padding from every side for floating variant (see --sidebar-floating-padding)\n FLOATING_VARIANT_PADDING: 8,\n} as const;\n\n/**\n * The default viewport width under which a rail stops being a column and opens as a sheet.\n *\n * - Matches Tailwind's `md`, so a call site's own `tw:md:*` breakpoint utilities flip\n * in the same frame as the rail.\n */\nexport const SIDEBAR_MOBILE_BREAKPOINT_PX = 768;\n\n/**\n * The query a rail watches to know whether it is a sheet.\n *\n * - `max-width`, so it is exclusive of the breakpoint itself — the width passed in is the\n * first one at which the rail is a column again.\n * - Per side, because the width at which a rail stops fitting is the rail's own: a 320px\n * panel beside a capped reading column runs out of room long before a navigation rail does.\n */\nexport const sidebarMobileMediaQuery = (breakpointPx: number) =>\n `(max-width: ${breakpointPx - 0.02}px)`;\n\nconst floatingSideCount: Record<SidebarVariant, number> = {\n 'sided-floating': 1,\n floating: 2,\n inset: 0,\n none: 0,\n};\n\ntype Input = {\n variant: SidebarVariant;\n width?: number;\n collapsible: SidebarCollapsible;\n mode: SidebarMode;\n state: SidebarState;\n /** Below the breakpoint the rail is a sheet, so it occupies no column. */\n isMobile?: boolean;\n};\n\ntype EffectiveWidths = {\n sidebar: number;\n gap: number;\n fill: number;\n};\n\nexport const calcEffectiveWidths = ({\n variant,\n width: customWidth,\n collapsible,\n state,\n mode,\n isMobile = false,\n}: Input) => {\n if (variant === 'none' || isMobile) return { sidebar: 0, gap: 0, fill: 0 };\n\n const padding = floatingSideCount[variant] * SidebarWidthInPx.FLOATING_VARIANT_PADDING;\n const width = Math.max(customWidth ?? 0, SidebarWidthInPx.MIN_DEFAULT) + padding;\n const iconWidth = SidebarWidthInPx.COLLAPSED_ICON + padding;\n const isExpanded = state === 'expanded';\n\n // Only compensate for floating padding when this sidebar itself has padding,\n // so the opposite filled sidebar doesn't double-count the gap.\n const reduction = variant === 'inset' ? 0 : SidebarWidthInPx.FLOATING_VARIANT_PADDING;\n\n const iconWidths = ((): EffectiveWidths => {\n const sidebar = isExpanded ? width : iconWidth;\n const gap = mode === 'expand-on-hover' ? iconWidth : sidebar;\n // Use gap (not sidebar) so the opposite filled sidebar stays stable\n // during expand-on-hover — gap stays at iconWidth while sidebar grows\n const fill = gap - reduction;\n return { sidebar, gap, fill };\n })();\n\n const offCanvasWidths = ((): EffectiveWidths => {\n const sidebar = width; //We use CSS translate to hide elements because it allows for transitions without shrinking the width.\n const gap = isExpanded ? width : SidebarWidthInPx.FLOATING_VARIANT_PADDING; // The gap is invisible and needs to be shrunk to move the content to its place.\n const fill = gap - reduction;\n return { sidebar, gap, fill };\n })();\n\n return collapsible === 'icon' ? iconWidths : offCanvasWidths;\n};\n","import { createContext, use } from 'react';\n\nimport type { SidebarCollapsible, SidebarSide, SidebarVariant } from '../types';\nimport type { calcEffectiveWidths } from '../utils';\n\nimport type { useSidebarState } from './useSidebarState';\n\ntype SidebarWidths = ReturnType<typeof calcEffectiveWidths>;\ntype SidebarState = ReturnType<typeof useSidebarState>;\n\ntype SidebarSideValue = SidebarState & {\n /**\n * Below the breakpoint: a sheet, not a column.\n * `mode` / `state` report `expanded`; `toggle` opens the sheet, not `mode`.\n */\n isMobile: boolean;\n /** Always `false` above the breakpoint. */\n isMobileOpen: boolean;\n /** Opening one side's sheet closes the other. */\n setMobileOpen: (open: boolean) => void;\n isFill: boolean;\n toggleFill: () => void;\n /** Idempotent counterpart to `toggleFill`. */\n setFill: (fill: boolean) => void;\n widths: SidebarWidths;\n collapsible: SidebarCollapsible;\n variant: SidebarVariant;\n baseWidth: number | undefined;\n onWidthChange: ((width: number) => void) | undefined;\n setDragWidth: (width: number | null) => void;\n isDragging: boolean;\n setIsDragging: (dragging: boolean) => void;\n};\n\nexport type SidebarContextValue = {\n left: SidebarSideValue;\n right: SidebarSideValue;\n};\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null);\n\n/** `useSidebar` that returns `null` outside a `SidebarProvider` instead of throwing. */\nexport const useOptionalSidebar = (side: SidebarSide = 'left'): SidebarSideValue | null =>\n use(SidebarContext)?.[side] ?? null;\n\nexport const useSidebar = (side: SidebarSide = 'left'): SidebarSideValue => {\n const context = use(SidebarContext);\n if (context === null) throw new Error('useSidebar must be used within a SidebarProvider.');\n return context[side];\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * CSS selectors matching portal-based overlay triggers in their open state.\n *\n * The sidebar's hover tracking ignores `mouseleave` while any of these selectors\n * match inside the sidebar DOM — preventing the sidebar from collapsing while the\n * user interacts with portal content rendered outside the sidebar tree.\n *\n * Update this list when changing or adding new components:\n */\nconst PORTAL_OPEN_SELECTORS = [\n '[aria-haspopup=\"menu\"][aria-expanded=true]', // DropdownMenu\n '[aria-haspopup=\"dialog\"][aria-expanded=true]', // Popover, Dialogs (Modal, Sheet)\n];\n\nconst PORTAL_OPEN_SELECTORS_STRING = PORTAL_OPEN_SELECTORS.join(',');\n\nexport const useHoverTracking = (sidebarElement: HTMLElement | null) => {\n // Which element the pointer is over, rather than a bare boolean. The tracked element is\n // replaced when the rail changes branch — crossing the mobile breakpoint does it — and a\n // boolean would carry the old element's hover onto the new one, leaving an\n // `expand-on-hover` rail expanded with the pointer somewhere else entirely.\n const [hoveredElement, setHoveredElement] = useState<HTMLElement | null>(null);\n const isLockedRef = useRef(false);\n\n // Release an element the pointer can no longer be over: the rail swapped branch, or it\n // became a sheet and there is no rail to track at all. Holding the detached node would\n // keep its subtree alive for as long as the provider is mounted, and hand the hover\n // straight back if the same rail is mounted again.\n //\n // - Done during render rather than in an effect: it converges (the value it clears is the\n // one that no longer matches) and lands before the listeners below are re-bound.\n if (hoveredElement !== null && hoveredElement !== sidebarElement) setHoveredElement(null);\n\n const isHovered = hoveredElement !== null;\n\n useEffect(() => {\n if (!sidebarElement) return;\n\n const handleMouseEnter = () => setHoveredElement(sidebarElement);\n const handleMouseLeave = () => {\n if (isLockedRef.current) return;\n setHoveredElement(null);\n };\n\n sidebarElement.addEventListener('mouseenter', handleMouseEnter);\n sidebarElement.addEventListener('mouseleave', handleMouseLeave);\n\n return () => {\n sidebarElement.removeEventListener('mouseenter', handleMouseEnter);\n sidebarElement.removeEventListener('mouseleave', handleMouseLeave);\n };\n }, [sidebarElement]);\n\n useEffect(() => {\n if (!sidebarElement) return;\n let animationFrameId: number;\n\n const observer = new MutationObserver(() => {\n const hasOpenPortal = sidebarElement.querySelector(PORTAL_OPEN_SELECTORS_STRING) !== null;\n isLockedRef.current = hasOpenPortal;\n\n if (hasOpenPortal) return;\n\n animationFrameId = requestAnimationFrame(() => {\n setHoveredElement(sidebarElement.matches(':hover') ? sidebarElement : null);\n });\n });\n\n // Sync lock state immediately in case a portal trigger is already open on mount.\n isLockedRef.current = sidebarElement.querySelector(PORTAL_OPEN_SELECTORS_STRING) !== null;\n\n observer.observe(sidebarElement, {\n attributes: true,\n attributeFilter: ['aria-expanded'],\n subtree: true,\n });\n\n return () => {\n cancelAnimationFrame(animationFrameId);\n observer.disconnect();\n };\n }, [sidebarElement]);\n\n return isHovered;\n};\n","import { useCallback, useMemo, useState } from 'react';\n\nimport { useElement } from '../../../hooks/useElement';\nimport type { SidebarMode, SidebarState } from '../types';\n\nimport { useHoverTracking } from './useHoverTracking';\n\ntype Props = {\n defaultMode?: SidebarMode;\n mode?: SidebarMode;\n onModeChange?: (state: SidebarMode) => void;\n};\n\nexport const useSidebarState = ({ defaultMode, mode: modeProp, onModeChange }: Props) => {\n const [sidebarElement, setSidebarElement] = useElement();\n const isHovered = useHoverTracking(sidebarElement);\n const [_mode, _setMode] = useState(defaultMode ?? 'expanded');\n const mode = modeProp ?? _mode;\n\n const setMode = useCallback(\n (dispatch: Parameters<typeof _setMode>[0]) => {\n const newState = typeof dispatch === 'function' ? dispatch(mode) : dispatch;\n const set = onModeChange ?? _setMode;\n set(newState);\n },\n [onModeChange, mode],\n );\n\n const toggle = useCallback(() => {\n setMode((currState) => (currState === 'expanded' ? 'collapsed' : 'expanded'));\n }, [setMode]);\n\n const state: SidebarState = (() => {\n if (mode === 'expand-on-hover') return isHovered ? 'expanded' : 'collapsed';\n return mode;\n })();\n\n return useMemo(\n () => ({\n isHovered,\n toggle,\n setMode,\n mode,\n state,\n sidebarElement,\n setSidebarElement,\n }),\n [isHovered, toggle, setMode, mode, state, sidebarElement, setSidebarElement],\n );\n};\n","import { type ReactNode, useCallback, useMemo, useState } from 'react';\n\nimport { useMediaQuery } from '../../../hooks/useMediaQuery';\nimport type { SidebarCollapsible, SidebarMode, SidebarSide, SidebarVariant } from '../types';\nimport {\n calcEffectiveWidths,\n SIDEBAR_MOBILE_BREAKPOINT_PX,\n sidebarMobileMediaQuery,\n} from '../utils';\n\nimport type { SidebarContextValue } from './context';\nimport { SidebarContext } from './context';\nimport { useSidebarState } from './useSidebarState';\n\nconst DEFAULT_SIDEBAR_VARIANT: SidebarVariant = 'none';\nconst DEFAULT_SIDEBAR_MODE: SidebarMode = 'expanded';\nconst DEFAULT_SIDEBAR_COLLAPSIBLE: SidebarCollapsible = 'off-canvas';\n\n/** A sheet's `setMode`: no-op, so `Sidebar.SearchInput` focus keeps a desktop `collapsed`. */\nconst ignoreModeChange = () => {};\n\n/** The side's own breakpoint, or the default for `true`. */\nconst mobileBreakpointOf = (mobileSheet: boolean | number) =>\n typeof mobileSheet === 'number' ? mobileSheet : SIDEBAR_MOBILE_BREAKPOINT_PX;\n\ntype Props = {\n children?: ReactNode;\n defaultLeftMode?: SidebarMode;\n leftMode?: SidebarMode;\n onLeftModeChange?: (mode: SidebarMode) => void;\n\n defaultRightMode?: SidebarMode;\n rightMode?: SidebarMode;\n onRightModeChange?: (mode: SidebarMode) => void;\n\n /**\n * Below a breakpoint (`true` = 768px, or px) the left rail is a `Sheet` that unmounts on close,\n * so keep panel state above the panel; needs a `Sidebar.Trigger` in the app.\n */\n leftMobileSheet?: boolean | number;\n /** `leftMobileSheet` for the right rail. */\n rightMobileSheet?: boolean | number;\n\n leftVariant?: SidebarVariant;\n leftWidth?: number;\n leftCollapsible?: SidebarCollapsible;\n\n rightVariant?: SidebarVariant;\n rightWidth?: number;\n rightCollapsible?: SidebarCollapsible;\n\n onLeftWidthChange?: (width: number) => void;\n onRightWidthChange?: (width: number) => void;\n\n defaultFilledSide?: SidebarSide | null;\n};\n\nexport const SidebarProvider = ({\n children,\n defaultLeftMode = DEFAULT_SIDEBAR_MODE,\n leftMode,\n onLeftModeChange,\n\n defaultRightMode = DEFAULT_SIDEBAR_MODE,\n rightMode,\n onRightModeChange,\n\n leftMobileSheet = false,\n rightMobileSheet = false,\n\n leftCollapsible = DEFAULT_SIDEBAR_COLLAPSIBLE,\n leftVariant = DEFAULT_SIDEBAR_VARIANT,\n leftWidth,\n\n rightCollapsible = DEFAULT_SIDEBAR_COLLAPSIBLE,\n rightVariant = DEFAULT_SIDEBAR_VARIANT,\n rightWidth,\n\n onLeftWidthChange,\n onRightWidthChange,\n\n defaultFilledSide = null,\n}: Props) => {\n // Hooks can't be skipped: an opted-out side still queries and is gated by the flag below.\n const isLeftNarrow = useMediaQuery(sidebarMobileMediaQuery(mobileBreakpointOf(leftMobileSheet)));\n const isRightNarrow = useMediaQuery(\n sidebarMobileMediaQuery(mobileBreakpointOf(rightMobileSheet)),\n );\n // `variant: 'none'` is never mobile, which also clears a stale open sheet below.\n const isLeftMobile = isLeftNarrow && leftMobileSheet !== false && leftVariant !== 'none';\n const isRightMobile = isRightNarrow && rightMobileSheet !== false && rightVariant !== 'none';\n const [filledSide, setFilledSide] = useState<SidebarSide | null>(defaultFilledSide);\n // One slot: one sheet open at a time.\n const [openMobileSide, setOpenMobileSide] = useState<SidebarSide | null>(null);\n const [isLeftDragging, setIsLeftDragging] = useState(false);\n const [isRightDragging, setIsRightDragging] = useState(false);\n const [leftDragWidth, setLeftDragWidth] = useState<number | null>(null);\n const [rightDragWidth, setRightDragWidth] = useState<number | null>(null);\n\n // Drop the drag override once the prop catches up, so later width props aren't masked.\n // Render-safe: it becomes null, so no loop.\n if (leftDragWidth !== null && leftWidth === leftDragWidth) setLeftDragWidth(null);\n if (rightDragWidth !== null && rightWidth === rightDragWidth) setRightDragWidth(null);\n\n // Past the breakpoint the rail is a column again; close its sheet.\n if (openMobileSide === 'left' && !isLeftMobile) setOpenMobileSide(null);\n if (openMobileSide === 'right' && !isRightMobile) setOpenMobileSide(null);\n\n const leftState = useSidebarState({\n defaultMode: defaultLeftMode,\n mode: leftMode,\n onModeChange: onLeftModeChange,\n });\n\n const rightState = useSidebarState({\n defaultMode: defaultRightMode,\n mode: rightMode,\n onModeChange: onRightModeChange,\n });\n\n const toggleLeftMobile = useCallback(\n () => setOpenMobileSide((prev) => (prev === 'left' ? null : 'left')),\n [],\n );\n const toggleRightMobile = useCallback(\n () => setOpenMobileSide((prev) => (prev === 'right' ? null : 'right')),\n [],\n );\n const setLeftMobileOpen = useCallback(\n (open: boolean) => setOpenMobileSide((prev) => (open ? 'left' : prev === 'left' ? null : prev)),\n [],\n );\n const setRightMobileOpen = useCallback(\n (open: boolean) =>\n setOpenMobileSide((prev) => (open ? 'right' : prev === 'right' ? null : prev)),\n [],\n );\n\n const toggleLeftFill = useCallback(\n () => setFilledSide((prev) => (prev === 'left' ? null : 'left')),\n [],\n );\n const toggleRightFill = useCallback(\n () => setFilledSide((prev) => (prev === 'right' ? null : 'right')),\n [],\n );\n\n // Idempotent per side; fill is one slot, so two sides at once race (last write wins).\n const setLeftFill = useCallback(\n (fill: boolean) => setFilledSide((prev) => (fill ? 'left' : prev === 'left' ? null : prev)),\n [],\n );\n const setRightFill = useCallback(\n (fill: boolean) => setFilledSide((prev) => (fill ? 'right' : prev === 'right' ? null : prev)),\n [],\n );\n\n const value = useMemo<SidebarContextValue>(\n () => ({\n left: {\n ...leftState,\n // A sheet reports `expanded`; `mode` is untouched so the desktop preference survives.\n ...(isLeftMobile\n ? {\n mode: 'expanded' as const,\n state: 'expanded' as const,\n toggle: toggleLeftMobile,\n setMode: ignoreModeChange,\n }\n : null),\n isMobile: isLeftMobile,\n isMobileOpen: openMobileSide === 'left',\n setMobileOpen: setLeftMobileOpen,\n isFill: filledSide === 'left',\n toggleFill: toggleLeftFill,\n setFill: setLeftFill,\n widths: calcEffectiveWidths({\n variant: leftVariant,\n width: leftDragWidth ?? leftWidth,\n collapsible: leftCollapsible,\n state: leftState.state,\n mode: leftState.mode,\n isMobile: isLeftMobile,\n }),\n collapsible: leftCollapsible,\n variant: leftVariant,\n baseWidth: leftDragWidth ?? leftWidth,\n onWidthChange: onLeftWidthChange,\n setDragWidth: setLeftDragWidth,\n isDragging: isLeftDragging,\n setIsDragging: setIsLeftDragging,\n },\n right: {\n ...rightState,\n ...(isRightMobile\n ? {\n mode: 'expanded' as const,\n state: 'expanded' as const,\n toggle: toggleRightMobile,\n setMode: ignoreModeChange,\n }\n : null),\n isMobile: isRightMobile,\n isMobileOpen: openMobileSide === 'right',\n setMobileOpen: setRightMobileOpen,\n isFill: filledSide === 'right',\n toggleFill: toggleRightFill,\n setFill: setRightFill,\n widths: calcEffectiveWidths({\n variant: rightVariant,\n width: rightDragWidth ?? rightWidth,\n collapsible: rightCollapsible,\n state: rightState.state,\n mode: rightState.mode,\n isMobile: isRightMobile,\n }),\n collapsible: rightCollapsible,\n variant: rightVariant,\n baseWidth: rightDragWidth ?? rightWidth,\n onWidthChange: onRightWidthChange,\n setDragWidth: setRightDragWidth,\n isDragging: isRightDragging,\n setIsDragging: setIsRightDragging,\n },\n }),\n [\n isLeftMobile,\n isRightMobile,\n openMobileSide,\n toggleLeftMobile,\n setLeftMobileOpen,\n toggleRightMobile,\n setRightMobileOpen,\n leftState,\n filledSide,\n toggleLeftFill,\n setLeftFill,\n leftVariant,\n leftWidth,\n leftDragWidth,\n leftCollapsible,\n onLeftWidthChange,\n isLeftDragging,\n rightState,\n toggleRightFill,\n setRightFill,\n rightVariant,\n rightWidth,\n rightDragWidth,\n rightCollapsible,\n onRightWidthChange,\n isRightDragging,\n ],\n );\n\n return <SidebarContext value={value}>{children}</SidebarContext>;\n};\n","import type { ComponentProps, MouseEventHandler } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\n\ntype Props = ComponentProps<typeof Slot> & {\n side?: SidebarSide;\n};\n\nexport const SidebarFillTrigger = ({ ref, side = 'left', onClick, ...rest }: Props) => {\n const { toggleFill, isFill } = useSidebar(side);\n\n const handleOnClick: MouseEventHandler<HTMLElement> = (event) => {\n toggleFill();\n onClick?.(event);\n };\n\n return <Slot {...rest} ref={ref} onClick={handleOnClick} aria-selected={isFill} />;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarFooter = ({ className, ...props }: Props) => (\n <div\n data-slot=\"sidebar-footer\"\n className={cn('tw:flex', 'tw:flex-col', 'tw:gap-2', 'tw:p-2', className)}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroup = ({ className, ...props }: Props) => (\n <div\n className={cn(\n 'tw:group/sidebar-group',\n 'tw:relative',\n 'tw:w-full',\n\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:min-w-0',\n 'tw:rounded-lg',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroupContent = ({ className, ...props }: Props) => (\n <div\n className={cn(\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-2',\n\n 'tw:w-full',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'button'>;\n\nexport const SidebarGroupAction = ({\n ref,\n className,\n type = 'button',\n children,\n ...props\n}: Props) => (\n <button\n {...props}\n type={type}\n ref={ref}\n className={cn(\n 'tw:group-data-[state=collapsed]/sidebar:hidden',\n\n // positioning\n 'tw:absolute',\n 'tw:right-1.5',\n 'tw:top-2',\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n\n // sizing\n 'tw:size-5',\n\n // styles\n 'tw:text-neutral-800',\n 'tw:rounded-full',\n\n // svg defaults: size + colour\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n 'tw:[&_svg]:text-neutral-400',\n 'tw:hover:[&_svg]:text-secondary-600',\n\n 'tw:hover:bg-neutral-100',\n\n 'tw:focus-visible:ring-4',\n 'tw:focus-visible:ring-ring/30',\n 'tw:focus-visible:outline',\n 'tw:focus-visible:outline-1',\n 'tw:focus-visible:outline-ring',\n className,\n )}\n >\n {children}\n </button>\n);\n","import type { ComponentProps, Ref } from 'react';\n\nimport { cn } from '../../../utils';\nimport { Separator } from '../../Separator';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarGroupLabel = ({\n ref,\n className,\n children,\n ...props\n}: Props & { ref?: Ref<HTMLDivElement> }) => (\n <div\n ref={ref}\n className={cn(\n 'tw:relative',\n // positioning\n 'tw:flex',\n 'tw:flex-col',\n 'tw:shrink-0',\n\n // styling\n 'tw:h-8',\n 'tw:px-2',\n 'tw:-mb-1',\n 'tw:rounded-lg',\n\n // text\n 'tw:uppercase',\n 'tw:font-sans',\n 'tw:text-xs',\n 'tw:tracking-[1px]',\n className,\n )}\n {...props}\n >\n <Separator\n orientation=\"horizontal\"\n size=\"3/4\"\n className={cn(\n 'tw:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:opacity-100',\n\n // positioning\n 'tw:absolute',\n 'tw:w-full',\n 'tw:left-0',\n 'tw:top-1/2 tw:-translate-y-1/2',\n\n 'tw:transition-opacity',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n />\n\n <span\n className={cn(\n 'tw:flex',\n 'tw:group-data-[state=collapsed]/sidebar:opacity-0',\n\n 'tw:items-center',\n 'tw:flex-1',\n 'tw:text-muted-foreground',\n 'tw:whitespace-nowrap',\n\n // transition\n 'tw:transition-opacity',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n >\n {children}\n </span>\n </div>\n);\n","import { createContext, use } from 'react';\n\nimport type { SidebarMode, SidebarSide, SidebarState } from './types';\n\ntype SidebarInstanceContextValue = {\n state: SidebarState;\n mode: SidebarMode;\n side: SidebarSide;\n};\n\nexport const SidebarInstanceContext = createContext<SidebarInstanceContextValue | null>(null);\n\nexport const useSidebarInstance = () => {\n const context = use(SidebarInstanceContext);\n if (context === null)\n throw new Error('useSidebarInstance must be used within a SidebarInstanceContext.');\n return context;\n};\n","import { type ComponentProps, use } from 'react';\n\nimport { cn } from '../../utils';\nimport { BrandLogo } from '../BrandLogo';\n\nimport { SidebarInstanceContext } from './SidebarInstanceContext';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarHeader = ({ className, children, ...props }: Props) => {\n const instance = use(SidebarInstanceContext);\n // BrandLogo reads the nearest ThemeProvider (or the default context) and renders\n // null when the active brand ships no logo, so no provider gate is needed.\n const variant = instance?.state === 'collapsed' ? 'mark' : 'wordmark';\n const fallback = <BrandLogo variant={variant} className=\"tw:h-7\" />;\n\n return (\n <div\n data-slot=\"sidebar-header\"\n className={cn(\n 'tw:peer/sidebar-header',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-2',\n 'tw:p-2',\n className,\n )}\n {...props}\n >\n {children ?? fallback}\n </div>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'ul'>;\n\nexport const SidebarMenu = ({ className, ...props }: Props) => (\n <ul\n data-sidebar=\"menu\"\n className={cn(\n 'tw:flex',\n 'tw:w-full',\n 'tw:min-w-0',\n 'tw:flex-col',\n 'tw:gap-1',\n\n // transition\n 'tw:transition-[margin,opacity]',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n\n // TODO: remove when boostrap is gone\n 'tw:pl-0',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'span'>;\n\nexport const SidebarMenuIcon = ({ ref, className, children, ...rest }: Props) => (\n <span\n {...rest}\n ref={ref}\n className={cn(\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:aspect-square',\n 'tw:shrink-0',\n 'tw:p-0.5',\n 'tw:text-sidebar-primary',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-4',\n className,\n )}\n >\n {children}\n </span>\n);\n","import type { AriaAttributes, MouseEvent, MouseEventHandler } from 'react';\n\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\n/**\n * Props a click is checked against before it counts as a destination.\n *\n * - Injected by wrappers (Radix `Slot` / `cloneElement`), so they arrive as ordinary props.\n */\ntype Props = Pick<AriaAttributes, 'aria-haspopup' | 'aria-expanded'> & {\n 'data-sidebar-trigger'?: string;\n};\n\n/**\n * A menu item's click handler: the caller's own, then (on a phone) dismissing the sheet.\n *\n * - Not a destination, so no dismissal:\n * - A popup opener (`aria-haspopup` / `aria-expanded`) — closing would take the popup too.\n * - `data-sidebar-trigger` — its `toggle` runs after this and would reopen the sheet.\n */\nexport const useDestinationDismiss = <T extends HTMLElement>(\n props: Props,\n onClick: MouseEventHandler<T> | undefined,\n): MouseEventHandler<T> => {\n const { side } = useSidebarInstance();\n const { isMobile, setMobileOpen } = useSidebar(side);\n\n const isDestination =\n props['aria-haspopup'] === undefined &&\n props['aria-expanded'] === undefined &&\n props['data-sidebar-trigger'] === undefined;\n\n return (event: MouseEvent<T>) => {\n onClick?.(event);\n if (isMobile && isDestination) setMobileOpen(false);\n };\n};\n","import type { ComponentProps, ReactNode, Ref } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\nimport { Tooltip } from '../../Tooltip';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { SidebarMenuIcon } from './SidebarMenuIcon';\nimport { useDestinationDismiss } from './useDestinationDismiss';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n tooltip?: ReactNode;\n icon?: ReactNode;\n /** Set by `Sidebar.Trigger` on the child it wraps — not part of a call site's API. */\n 'data-sidebar-trigger'?: string;\n};\n\nexport const SidebarMenuButton = ({\n ref,\n 'aria-selected': selected,\n className,\n children,\n asChild = false,\n icon,\n tooltip,\n onClick,\n ...props\n}: Props & { ref?: Ref<HTMLButtonElement> }) => {\n const Component = asChild ? Root : 'button';\n const { state, mode, side } = useSidebarInstance();\n const handleClick = useDestinationDismiss<HTMLButtonElement>(props, onClick);\n\n const button = (\n <Component\n {...props}\n onClick={handleClick}\n ref={ref}\n data-slot=\"sidebar-menu-button\"\n // `type` and `aria-selected` belong to a real <button>. With `asChild` the slot is\n // usually an <a> (the canonical nav item), where both are invalid — axe flags\n // `aria-selected` on a link as a critical violation. Mark the active link with\n // `aria-current=\"page\"` instead; it is styled identically below. `aria-selected`\n // is still forwarded when a caller passes it explicitly.\n {...(asChild ? {} : { type: 'button' as const })}\n {...(selected === undefined ? {} : { 'aria-selected': selected })}\n className={cn(\n 'tw:peer/sidebar-menu-button',\n 'tw:group/sidebar-menu-button',\n\n // if <SidebarMenuAction /> visible, prevent the text from being under the action button.\n 'tw:group-data-[state=expanded]/sidebar:group-has-[[data-slot=sidebar-menu-action][data-hover-only=false]]/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"])]:group-hover/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"])]:group-focus-within/sidebar-menu-item:pr-8',\n 'tw:group-data-[state=expanded]/sidebar:[&:has(+[data-slot=\"sidebar-menu-action\"][data-hover-only=true][data-state=open])]:pr-8',\n\n 'tw:flex',\n 'tw:w-full',\n 'tw:gap-2',\n 'tw:items-center',\n 'tw:z-10',\n 'tw:font-normal',\n 'tw:text-sidebar-foreground',\n 'tw:p-2',\n 'tw:whitespace-nowrap',\n 'tw:overflow-hidden',\n 'tw:rounded-lg',\n 'tw:text-start',\n 'tw:no-underline',\n 'tw:select-none',\n\n // hover\n 'tw:hover:not-disabled:bg-sidebar-accent',\n 'tw:hover:text-sidebar-accent-foreground',\n 'tw:focus:text-sidebar-accent-foreground', // anchor override\n 'tw:data-[slot=dropdown-menu-trigger]:data-[state=open]:bg-sidebar-accent',\n\n // disabled\n 'tw:disabled:opacity-50',\n 'tw:disabled:cursor-not-allowed',\n\n // active\n 'tw:aria-selected:font-medium',\n 'tw:aria-selected:bg-sidebar-accent',\n 'tw:aria-selected:cursor-default',\n // active for links https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-current\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:font-medium',\n 'tw:aria-[current=page]:focus:text-sidebar-accent-foreground',\n\n // focus-visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:z-10',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n 'tw:focus-visible:text-sidebar-foreground', // anchor override\n className,\n )}\n // Explicitly set the tabIndex to 0 to ensure the button is focusable; in Safari, anchors are not focusable by default.\n tabIndex={0}\n >\n {icon && <SidebarMenuIcon>{icon}</SidebarMenuIcon>}\n <Slottable>{children}</Slottable>\n </Component>\n );\n\n const shouldShowTooltip = state === 'collapsed' && mode !== 'expand-on-hover' && tooltip;\n\n if (shouldShowTooltip) {\n const tooltipPlacement = side === 'right' ? 'left' : 'right';\n\n return (\n <Tooltip tooltip={tooltip} placement={tooltipPlacement} triggerAsChild>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'li'>;\n\nexport const SidebarMenuItem = ({ className, ...props }: Props) => (\n <li className={cn('tw:group/sidebar-menu-item', 'tw:relative', className)} {...props} />\n);\n","import type { ComponentProps } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n showOnHover?: boolean;\n};\n\nexport const SidebarMenuAction = ({\n ref,\n className,\n asChild = false,\n showOnHover = false,\n children,\n ...props\n}: Props) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n {...props}\n data-slot=\"sidebar-menu-action\"\n data-hover-only={showOnHover}\n ref={ref}\n className={cn(\n 'tw:absolute',\n 'tw:top-1/2',\n 'tw:-translate-y-1/2',\n 'tw:right-3',\n 'tw:z-10',\n 'tw:p-0.5',\n\n // display\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:aspect-square',\n\n // hiding\n 'tw:data-[hover-only=true]:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:hidden',\n\n 'tw:group-data-[state=expanded]/sidebar:group-hover/sidebar-menu-item:opacity-100',\n 'tw:group-data-[state=expanded]/sidebar:group-focus-within/sidebar-menu-item:opacity-100', // keyboard navigation\n\n 'tw:group-data-[state=expanded]/sidebar:data-[hover-only=true]:data-[state=open]:opacity-100', // for triggers (dropdown, tooltip, popover)\n\n 'tw:size-4',\n 'tw:rounded',\n\n // icon styling\n 'tw:[&_svg]:shrink-0',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3.5',\n 'tw:[&_svg]:text-sidebar-accent-foreground',\n\n // focus visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:z-10',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n 'tw:focus-visible:text-sidebar-foreground',\n className,\n )}\n >\n {children}\n </Comp>\n );\n};\n","import { useRef } from 'react';\nimport type { ComponentProps } from 'react';\n\nimport { Search } from '../../../icons';\nimport { cn, mergeRefs } from '../../../utils';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\nconst wrapperClassnames = cn(\n 'tw:group/search-input',\n 'tw:relative',\n 'tw:flex',\n 'tw:items-center',\n 'tw:min-h-9',\n 'tw:rounded-lg',\n 'tw:border',\n 'tw:transition-all',\n\n // collapsed state - transparent border/bg, hover like search button\n 'tw:group-data-[state=collapsed]/sidebar:cursor-pointer',\n 'tw:group-data-[state=collapsed]/sidebar:border-transparent',\n 'tw:group-data-[state=collapsed]/sidebar:hover:bg-sidebar-accent',\n\n // expanded state - visible border/bg, padding for input, text cursor\n 'tw:group-data-[state=expanded]/sidebar:cursor-text',\n 'tw:group-data-[state=expanded]/sidebar:px-2',\n 'tw:group-data-[state=expanded]/sidebar:border-neutral-200',\n\n // focus styles (only relevant when expanded)\n 'tw:focus-within:ring-2',\n 'tw:focus-within:ring-sidebar-ring/50',\n 'tw:focus-within:text-sidebar-foreground',\n);\n\ntype Props = Omit<ComponentProps<'input'>, 'prefix'>;\n\nexport const SidebarSearchInput = ({ ref: forwardedRef, className, ...inputProps }: Props) => {\n const { side } = useSidebarInstance();\n const { setMode } = useSidebar(side);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleFocus = () => {\n setMode('expanded');\n };\n\n return (\n <div className={cn(wrapperClassnames, className)}>\n <Search\n className={cn(\n 'tw:pointer-events-none',\n 'tw:absolute',\n 'tw:left-2',\n 'tw:size-4',\n\n 'tw:text-sidebar-primary',\n 'tw:group-data-[state=expanded]/sidebar:text-neutral-400',\n )}\n />\n <input\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n {...inputProps}\n onFocus={(e) => {\n handleFocus();\n inputProps.onFocus?.(e);\n }}\n className={cn(\n 'tw:w-full',\n 'tw:bg-transparent',\n 'tw:text-sm',\n 'tw:font-sans',\n 'tw:outline-hidden',\n 'tw:placeholder:text-neutral-400',\n\n // collapsed state - visually hidden but still focusable for a11y\n 'tw:group-data-[state=collapsed]/sidebar:opacity-0',\n 'tw:group-data-[state=collapsed]/sidebar:cursor-pointer',\n\n // expanded state\n 'tw:group-data-[state=expanded]/sidebar:pl-6',\n )}\n />\n </div>\n );\n};\n","import { useCallback, useState } from 'react';\nimport type { ComponentProps, HTMLAttributes, ReactNode } from 'react';\n\nimport { cn } from '../../../utils';\nimport { HoverCard } from '../../HoverCard';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\nimport { useSidebar } from '../SidebarProvider';\n\nimport { SidebarMenuIcon } from './SidebarMenuIcon';\n\nconst Title = ({ children }: { children: ReactNode }) => (\n <div className=\"tw:flex tw:select-none tw:gap-2 tw:text-sm tw:font-semibold\">{children}</div>\n);\n\nconst Content = ({ children, className }: { children: ReactNode; className?: string }) => (\n <div\n className={cn(\n 'tw:whitespace-pre-line',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:invisible',\n className,\n )}\n >\n {children}\n </div>\n);\n\ntype Props = HTMLAttributes<HTMLDivElement> & {\n icon: ReactNode;\n title: ReactNode;\n};\n\nexport const SidebarMenuCard = ({ children, className, icon, title, ...rest }: Props) => {\n const [isOpen, setIsOpen] = useState(false);\n const { side = 'left' } = useSidebarInstance();\n const { state, isFill } = useSidebar(side);\n const isExpanded = state === 'expanded' || isFill;\n\n const handleOnOpenChange: ComponentProps<typeof HoverCard>['onOpenChange'] = useCallback(\n (open: boolean) => {\n setIsOpen(isExpanded || document.hidden ? false : open);\n },\n [isExpanded],\n );\n\n return (\n <HoverCard open={isOpen} onOpenChange={handleOnOpenChange}>\n <HoverCard.Trigger asChild>\n <div\n {...rest}\n data-slot=\"sidebar-menu-card\"\n tabIndex={isExpanded ? -1 : 0}\n className={cn(\n 'tw:group/sidebar-menu-card',\n 'tw:peer/sidebar-menu-card',\n\n 'tw:overflow-hidden',\n\n 'tw:border',\n 'tw:border-sidebar-border',\n 'tw:rounded-2xl',\n\n // layout\n 'tw:grid',\n 'tw:grid-rows-[1fr]',\n 'tw:flex-1',\n 'tw:p-4',\n\n // icon collapsed\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:p-2',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:border-transparent',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:grid-rows-[18px]',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:rounded-md',\n\n // focus-visible\n 'tw:outline-hidden',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:hover:bg-sidebar-accent',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:focus-visible:ring-2',\n 'tw:group-data-[fill=false]/sidebar:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:focus-visible:ring-sidebar-ring/50',\n\n // transition\n 'tw:transition-[padding,border]',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n )}\n >\n <div className=\"tw:flex tw:flex-col tw:gap-2\">\n <Title>\n <SidebarMenuIcon className=\"tw:p-px\">{icon}</SidebarMenuIcon>\n {title}\n </Title>\n <Content className={className}>{children}</Content>\n </div>\n </div>\n </HoverCard.Trigger>\n\n <HoverCard.Content\n sideOffset={10}\n align=\"center\"\n side={side === 'left' ? 'right' : 'left'}\n className=\"tw:flex tw:flex-col tw:gap-2\"\n >\n <Title>{title}</Title>\n <Content className={className}>{children}</Content>\n </HoverCard.Content>\n </HoverCard>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../../utils';\n\ntype Props = ComponentProps<'div'>;\n\nexport const SidebarMenuBadge = ({ ref, className, ...props }: Props) => {\n return (\n <div\n ref={ref}\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:z-20',\n\n 'tw:absolute',\n\n // menu button position\n 'tw:peer-[]/sidebar-menu-button:right-2',\n // menu card position\n 'tw:peer-[]/sidebar-menu-card:right-4',\n 'tw:peer-[]/sidebar-menu-card:top-4',\n\n // icon collapsed position\n 'tw:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:right-0',\n 'tw:group-data-[state=collapsed]/sidebar:group-data-[collapsible=icon]/sidebar:-top-1',\n\n 'tw:text-xs',\n 'tw:text-sidebar-primary-foreground',\n 'tw:bg-sidebar-primary',\n 'tw:px-1',\n 'tw:min-w-5',\n 'tw:h-5',\n 'tw:rounded-full',\n 'tw:pointer-events-none',\n 'tw:font-medium',\n 'tw:tabular-nums',\n 'tw:select-none',\n\n 'tw:transition-[top,right]',\n 'tw:delay-50',\n 'tw:duration-(--sidebar-motion-duration)',\n 'tw:ease-(--sidebar-motion-easing)',\n 'tw:motion-reduce:transition-none',\n className,\n )}\n {...props}\n />\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { ChevronDown } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { Collapsible } from '../../Collapsible';\nimport { DropdownMenu } from '../../DropdownMenu';\nimport { Tooltip } from '../../Tooltip';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { SidebarMenuButton } from './SidebarMenuButton';\n\ntype Props = {\n children: ReactNode;\n icon: ReactNode;\n isActive?: boolean;\n label: string;\n} & Pick<ComponentProps<typeof Collapsible>, 'defaultOpen' | 'open' | 'onOpenChange'>;\n\nexport const SidebarMenuSub = ({\n children,\n icon,\n isActive = false,\n label,\n\n // collapsible props\n defaultOpen = false,\n open: openProp,\n onOpenChange,\n}: Props) => {\n const { state, side, mode } = useSidebarInstance();\n const [open, setOpen] = useState<'open-tooltip' | 'open-dropdown-menu' | null>(null);\n const [innerCollapsibleOpen, setInnerCollapsibleOpen] = useState(defaultOpen);\n\n const isCollapsibleOpen = (() => {\n // In the collapsed sidebar state, it is always closed.\n if (state === 'collapsed') return false;\n return openProp ?? innerCollapsibleOpen;\n })();\n\n const isDropdownMenu = mode === 'expand-on-hover' || mode === 'collapsed';\n\n const handleCollapsibleOpenChange = (open: boolean) => {\n if (openProp === undefined) setInnerCollapsibleOpen(open);\n\n onOpenChange?.(open);\n };\n\n const handleDropdownOpenChange = (open: boolean) => {\n setOpen(open ? 'open-dropdown-menu' : null);\n };\n\n const handleTooltipOpenChange = (open: boolean) => {\n setOpen((currentOpen) => {\n // dropdown menu has higher priority than tooltip, if it's open, keep it open\n if (currentOpen === 'open-dropdown-menu') return 'open-dropdown-menu';\n // no need to show tooltip in expanded state, so return null\n if (state === 'expanded') return null;\n return open ? 'open-tooltip' : null;\n });\n };\n\n if (isDropdownMenu) {\n return (\n <DropdownMenu open={open === 'open-dropdown-menu'} onOpenChange={handleDropdownOpenChange}>\n <Tooltip.Root open={open === 'open-tooltip'} onOpenChange={handleTooltipOpenChange}>\n <Tooltip.Trigger asChild>\n <DropdownMenu.Trigger asChild>\n <SidebarMenuButton\n icon={icon}\n data-active={isActive}\n className={cn(\n 'tw:data-[active=true]:bg-sidebar-accent',\n 'tw:data-[active=true]:font-medium',\n )}\n >\n {label}\n </SidebarMenuButton>\n </DropdownMenu.Trigger>\n </Tooltip.Trigger>\n <Tooltip.Content variant=\"action\" placement={side}>\n {label}\n </Tooltip.Content>\n </Tooltip.Root>\n\n <DropdownMenu.Content side={side} align=\"start\">\n <DropdownMenu.Label>{label}</DropdownMenu.Label>\n {children}\n </DropdownMenu.Content>\n </DropdownMenu>\n );\n }\n\n return (\n <Collapsible open={isCollapsibleOpen} onOpenChange={handleCollapsibleOpenChange}>\n <Collapsible.Trigger asChild>\n <SidebarMenuButton\n icon={icon}\n data-active={isActive && !isCollapsibleOpen}\n className={cn(\n 'tw:group',\n 'tw:data-[active=true]:bg-sidebar-accent',\n 'tw:data-[active=true]:font-medium',\n )}\n >\n {label}\n <ChevronDown className=\"tw:ml-auto tw:size-5 tw:transition-transform tw:duration-200 tw:group-data-[state=open]:rotate-180\" />\n </SidebarMenuButton>\n </Collapsible.Trigger>\n <Collapsible.Content>\n <ul\n data-sidebar=\"menu-sub\"\n className={cn(\n 'tw:ml-3.5',\n 'tw:flex',\n 'tw:min-w-0',\n 'tw:translate-x-px',\n 'tw:flex-col',\n 'tw:gap-1',\n 'tw:border-l',\n 'tw:border-sidebar-border',\n 'tw:py-0.5',\n 'tw:pl-2.5',\n 'tw:pr-0',\n\n // TODO: remove when bootstrap is gone\n 'tw:list-none',\n )}\n >\n {children}\n </ul>\n </Collapsible.Content>\n </Collapsible>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root, Slottable } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../utils';\nimport { DropdownMenu } from '../../DropdownMenu';\nimport { useSidebarInstance } from '../SidebarInstanceContext';\n\nimport { useDestinationDismiss } from './useDestinationDismiss';\n\ntype Props = ComponentProps<'button'> & {\n asChild?: boolean;\n /** Set by `Sidebar.Trigger` on the child it wraps — not part of a call site's API. */\n 'data-sidebar-trigger'?: string;\n};\n\nexport const SidebarMenuSubItem = ({\n ref,\n className,\n asChild = false,\n children,\n disabled,\n onClick,\n 'aria-current': ariaCurrent,\n ...props\n}: Props) => {\n const { mode } = useSidebarInstance();\n // A nested destination is a destination: an expanded `Sidebar.SubMenu` renders its children\n // here, and choosing one navigates the page the sheet is sitting on top of.\n const handleClick = useDestinationDismiss<HTMLButtonElement>(props, onClick);\n const isDropdownMenu = mode === 'collapsed' || mode === 'expand-on-hover';\n\n if (isDropdownMenu) {\n return (\n <DropdownMenu.Item\n aria-current={ariaCurrent}\n asChild={asChild}\n disabled={disabled}\n className={cn(\n // use sidebar colors for active and focus states\n 'tw:focus:!bg-sidebar-accent',\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:focus:text-sidebar-accent-foreground',\n className,\n )}\n >\n {children}\n </DropdownMenu.Item>\n );\n }\n\n const Component = asChild ? Root : 'button';\n\n return (\n <li className=\"tw:group/sidebar-menu-sub-item tw:relative\">\n <Component\n {...props}\n onClick={handleClick}\n ref={ref}\n aria-current={ariaCurrent}\n data-slot=\"sidebar-menu-sub-button\"\n type=\"button\"\n disabled={disabled}\n className={cn(\n // layout\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-2',\n\n // sizing\n 'tw:h-7',\n 'tw:w-full',\n 'tw:min-w-0',\n 'tw:px-2',\n\n //font\n 'tw:text-sidebar-foreground',\n 'tw:text-sm',\n 'tw:font-normal',\n 'tw:text-start',\n 'tw:whitespace-nowrap',\n\n 'tw:overflow-hidden',\n 'tw:rounded-md',\n 'tw:no-underline',\n\n 'tw:select-none',\n 'tw:outline-hidden',\n\n // hover\n 'tw:hover:not-disabled:bg-sidebar-accent',\n 'tw:hover:text-sidebar-accent-foreground',\n 'tw:focus:text-sidebar-accent-foreground',\n\n // active\n 'tw:aria-selected:font-medium',\n 'tw:aria-selected:bg-sidebar-accent',\n 'tw:aria-[current=page]:bg-sidebar-accent',\n 'tw:aria-[current=page]:font-medium',\n\n // disabled\n 'tw:disabled:opacity-50',\n 'tw:disabled:cursor-not-allowed',\n\n // focus-visible\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-sidebar-ring/50',\n className,\n )}\n >\n <Slottable>{children}</Slottable>\n </Component>\n </li>\n );\n};\n","import { type MouseEventHandler, useCallback, useEffect, useRef } from 'react';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\nimport { SidebarWidthInPx } from './utils';\n\nconst DEFAULT_MIN_WIDTH = 384;\nconst DEFAULT_MAX_WIDTH = 800;\n\ntype UseResizeSidebarInput = {\n side: SidebarSide;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport const useResizeSidebar = ({\n side,\n minWidth = DEFAULT_MIN_WIDTH,\n maxWidth = DEFAULT_MAX_WIDTH,\n}: UseResizeSidebarInput) => {\n const { onWidthChange, baseWidth, isFill, state, isDragging, setIsDragging, setDragWidth } =\n useSidebar(side);\n const isResizable = state === 'expanded' && !isFill && onWidthChange !== undefined;\n const startXRef = useRef(0);\n const startWidthRef = useRef(0);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n return () => {\n cleanupRef.current?.();\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n }, []);\n\n const clampToRange = useCallback(\n (width: number) => {\n const effectiveMax = Math.max(minWidth, Math.min(maxWidth, window.innerWidth * 0.5));\n return Math.round(Math.min(effectiveMax, Math.max(minWidth, width)));\n },\n [minWidth, maxWidth],\n );\n\n const handleMouseDown: MouseEventHandler = useCallback(\n (e) => {\n if (!isResizable || isDragging) return;\n\n cleanupRef.current?.();\n setIsDragging(true);\n\n startWidthRef.current = baseWidth ?? SidebarWidthInPx.MIN_DEFAULT;\n startXRef.current = e.clientX;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const delta =\n side === 'right'\n ? startXRef.current - moveEvent.clientX\n : moveEvent.clientX - startXRef.current;\n setDragWidth(clampToRange(startWidthRef.current + delta));\n };\n\n const handleMouseUp = (upEvent: MouseEvent) => {\n const delta =\n side === 'right'\n ? startXRef.current - upEvent.clientX\n : upEvent.clientX - startXRef.current;\n onWidthChange?.(clampToRange(startWidthRef.current + delta));\n setIsDragging(false);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n cleanupRef.current = null;\n };\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n cleanupRef.current = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n setIsDragging(false);\n setDragWidth(null);\n };\n },\n [\n isResizable,\n isDragging,\n side,\n onWidthChange,\n baseWidth,\n setIsDragging,\n setDragWidth,\n clampToRange,\n ],\n );\n\n const handleDoubleClick = useCallback(() => {\n onWidthChange?.(minWidth);\n }, [onWidthChange, minWidth]);\n\n return {\n handleProps: {\n onMouseDown: handleMouseDown,\n onDoubleClick: handleDoubleClick,\n },\n isDragging,\n isResizable,\n };\n};\n","import { cn } from '../../utils';\n\nimport type { SidebarSide } from './types';\nimport { useResizeSidebar } from './useResizeSidebar';\n\ntype Props = {\n side: SidebarSide;\n minWidth?: number;\n maxWidth?: number;\n};\n\nexport const SidebarResizeHandle = ({ side, minWidth, maxWidth }: Props) => {\n const { handleProps, isResizable } = useResizeSidebar({ side, minWidth, maxWidth });\n\n if (!isResizable) return null;\n\n return (\n <div\n {...handleProps}\n aria-hidden\n className={cn(\n 'tw:absolute tw:inset-y-0 tw:z-10 tw:w-3',\n side === 'right' ? 'tw:left-0' : 'tw:right-0',\n 'tw:cursor-col-resize',\n )}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\nimport { Separator } from '../Separator';\n\ntype Props = Omit<ComponentProps<typeof Separator>, 'orientation' | 'size'>;\n\nexport const SidebarSeparator = ({ className, ...props }: Props) => (\n <Separator\n {...props}\n orientation=\"horizontal\"\n size=\"full\"\n className={cn('tw:before:bg-sidebar-border tw:p-2', className)}\n />\n);\n","import type { ComponentProps, MouseEventHandler } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../utils';\n\nimport { useSidebar } from './SidebarProvider';\nimport type { SidebarSide } from './types';\n\ntype Props = ComponentProps<typeof Slot> & {\n side?: SidebarSide;\n hideWhenCollapsed?: boolean;\n};\n\nexport const SidebarTrigger = ({\n side = 'left',\n onClick,\n hideWhenCollapsed = false,\n className,\n ...rest\n}: Props) => {\n const { toggle, state, isMobile, isMobileOpen } = useSidebar(side);\n\n const handleOnClick: MouseEventHandler<HTMLElement> = (event) => {\n toggle();\n onClick?.(event);\n };\n\n return (\n <Slot\n {...rest}\n // Set here: a child's `aria-expanded` would win the slot merge. Only a sheet is a dialog.\n aria-expanded={isMobile ? isMobileOpen : state === 'expanded'}\n {...(isMobile ? { 'aria-haspopup': 'dialog' as const } : null)}\n // A child `Sidebar.MenuButton` skips its mobile dismissal, else `toggle` reopens the sheet.\n data-sidebar-trigger=\"\"\n onClick={handleOnClick}\n className={cn(\n {\n 'tw:group-data-[state=collapsed]/sidebar:hidden': hideWhenCollapsed,\n },\n className,\n )}\n />\n );\n};\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { ComponentProps, CSSProperties, ReactNode, TransitionEventHandler } from 'react';\n\nimport { cn } from '../../utils';\nimport { Sheet } from '../Sheet';\nimport { useThemeScopeContainer } from '../ThemeProvider/ThemeScope';\nimport { TooltipProvider } from '../Tooltip';\n\nimport { useTransitionPresence } from './SidebarProvider/useTransitionPresence';\nimport { SidebarContent } from './SidebarContent';\nimport { SidebarFillTrigger } from './SidebarFillTrigger';\nimport { SidebarFooter } from './SidebarFooter';\nimport {\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n} from './SidebarGroup';\nimport { SidebarHeader } from './SidebarHeader';\nimport { SidebarInstanceContext } from './SidebarInstanceContext';\nimport {\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuCard,\n SidebarMenuIcon,\n SidebarMenuItem,\n SidebarMenuSub,\n SidebarMenuSubItem,\n SidebarSearchInput,\n} from './SidebarMenu';\nimport { useSidebar } from './SidebarProvider';\nimport { SidebarResizeHandle } from './SidebarResizeHandle';\nimport { SidebarSeparator } from './SidebarSeparator';\nimport { SidebarTrigger } from './SidebarTrigger';\nimport type { SidebarSide } from './types';\nimport { SidebarWidthInPx } from './utils';\n\n/**\n * `className` and `style` land on the rail's inner box; other props on the outer element, so a\n * `ThemeScope` reaches it.\n */\ntype Props = Omit<ComponentProps<'div'>, 'children' | 'className' | 'style' | 'id'> & {\n children: ReactNode;\n className?: string;\n id?: string;\n side?: SidebarSide;\n style?: CSSProperties;\n container?: boolean;\n keepMounted?: boolean;\n /** Hold the panel's content back until it has finished sliding in. */\n mountAfterEnter?: boolean;\n resizable?: boolean;\n /** Visually hidden name of the mobile sheet; defaults to `Navigation` / `Side panel` by side. */\n mobileTitle?: string;\n};\n\nexport const Sidebar = ({\n children,\n className,\n id,\n side = 'left',\n style,\n container = false,\n keepMounted,\n mountAfterEnter,\n resizable = false,\n mobileTitle,\n ...rest\n}: Props) => {\n const oppositeSide = side === 'left' ? 'right' : 'left';\n const {\n setSidebarElement,\n state,\n mode,\n isFill,\n widths,\n collapsible,\n variant,\n isDragging,\n isMobile,\n isMobileOpen,\n setMobileOpen,\n } = useSidebar(side);\n\n // Where the sheet is portalled.\n // - A `ThemeScope`'s container, so the sheet gets the scope's scheme and tokens.\n // - `null` outside a scope (Radix's default: <body>).\n const themeScopeContainer = useThemeScopeContainer();\n\n const { isMounted, completeUnmount } = useTransitionPresence({\n mounted: collapsible !== 'off-canvas' || mode !== 'collapsed',\n keepMounted,\n mountAfterEnter,\n });\n const { widths: oppositeWidths } = useSidebar(oppositeSide);\n const sidebarInstanceContextValue = useMemo(() => ({ state, mode, side }), [state, mode, side]);\n\n // Where focus goes when the sheet closes.\n // - The sheet has no `Dialog.Trigger`, so Radix would drop focus onto <body>.\n // - Recorded only while closed, so focus inside the sheet does not overwrite it.\n // - Re-checked on close, as the opener may have unmounted.\n const focusOriginRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!isMobile || isMobileOpen) return;\n\n const remember = (event: FocusEvent) => {\n if (event.target instanceof HTMLElement) focusOriginRef.current = event.target;\n };\n\n document.addEventListener('focusin', remember);\n\n return () => document.removeEventListener('focusin', remember);\n }, [isMobile, isMobileOpen]);\n\n // Returns focus to the opener when the viewport grows out from under an open sheet.\n // - The sheet unmounts rather than closes, so `onCloseAutoFocus` never runs.\n // - A trigger hidden above the breakpoint makes `.focus()` a harmless no-op.\n const wasSheetUpRef = useRef(false);\n\n useEffect(() => {\n const wasSheetUp = wasSheetUpRef.current;\n wasSheetUpRef.current = isMobile && isMobileOpen;\n\n if (!wasSheetUp || isMobile) return;\n\n const origin = focusOriginRef.current;\n if (origin?.isConnected) origin.focus();\n }, [isMobile, isMobileOpen]);\n\n const handleTransitionEnd: TransitionEventHandler<HTMLDivElement> = (event) => {\n if (event.target !== event.currentTarget) return;\n completeUnmount();\n };\n\n const styles = {\n // Caller vars first (a `ThemeScope`'s tokens), so the geometry vars below win.\n ...style,\n '--sidebar-floating-padding': `${SidebarWidthInPx.FLOATING_VARIANT_PADDING}px`,\n '--sidebar-width': `${widths.sidebar}px`,\n '--sidebar-width-gap': `${widths.gap}px`,\n '--opposite-sidebar-width': `${oppositeWidths.fill}px`,\n } as CSSProperties;\n\n if (variant === 'none') return null;\n\n // The rail's data attributes without the geometry, so child `group-data-*` selectors resolve in the sheet.\n const railAttributes = {\n 'data-state': state,\n 'data-side': side,\n 'data-mode': mode,\n 'data-collapsible': collapsible,\n 'data-variant': variant,\n 'data-fill': isFill,\n } as const;\n\n // `keepMounted` / `mountAfterEnter` are ignored: the sheet mounts on open and unmounts on close.\n if (isMobile) {\n return (\n <TooltipProvider>\n <SidebarInstanceContext value={sidebarInstanceContextValue}>\n <Sheet open={isMobileOpen} onOpenChange={setMobileOpen}>\n <Sheet.Content\n side={side}\n container={themeScopeContainer ?? undefined}\n // Sheet chrome only; the caller's `style` stays on the rail.\n className=\"tw:w-[min(20rem,85vw)] tw:bg-sidebar tw:text-sidebar-foreground tw:p-0\"\n onCloseAutoFocus={(event) => {\n const origin = focusOriginRef.current;\n if (!origin?.isConnected) return;\n event.preventDefault();\n origin.focus();\n }}\n >\n <Sheet.Title visuallyHidden>\n {mobileTitle ?? (side === 'left' ? 'Navigation' : 'Side panel')}\n </Sheet.Title>\n {/* No `ref={setSidebarElement}`: it only drives `expand-on-hover`. */}\n <div\n {...rest}\n {...railAttributes}\n id={id}\n // `className` and `style` stay, so a `ThemeScope`'s class still applies.\n style={style}\n className={cn(\n 'tw:flex tw:min-h-0 tw:flex-1 tw:flex-col',\n { 'tw:group/sidebar tw:peer/sidebar': !container },\n className,\n )}\n >\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'tw:bg-sidebar',\n 'tw:relative',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:size-full',\n 'tw:overflow-hidden',\n 'tw:border-sidebar-border',\n 'tw:group-[]/sidebar:pt-2',\n )}\n >\n {children}\n </div>\n </div>\n </Sheet.Content>\n </Sheet>\n </SidebarInstanceContext>\n </TooltipProvider>\n );\n }\n\n return (\n <TooltipProvider>\n <SidebarInstanceContext value={sidebarInstanceContextValue}>\n <div\n {...rest}\n {...railAttributes}\n id={id}\n ref={setSidebarElement}\n style={styles}\n className={cn(\n 'tailwindcss-preflight',\n 'tw:flex',\n 'tw:relative',\n // Expand-on-hover overlaps the opposite filled sidebar.\n mode === 'expand-on-hover' ? 'tw:z-[51]' : 'tw:z-50',\n {\n // Page-level only; nested container sidebars must not clash with the outer one.\n 'tw:group/sidebar tw:peer/sidebar': !container,\n },\n\n // ── GAP DIV ──\n 'tw:[&>[data-slot=gap]]:w-(--sidebar-width-gap)',\n 'tw:[&[data-side=right]>[data-slot=gap]]:rotate-180',\n\n // ── SIDEBAR-WRAPPER DIV ──\n 'tw:[&>[data-slot=sidebar-wrapper]]:w-(--sidebar-width)',\n 'tw:[&[data-side=left]>[data-slot=sidebar-wrapper]]:left-0',\n 'tw:[&[data-side=right]>[data-slot=sidebar-wrapper]]:right-0',\n // `translate-x-*` sets `translate`, not `transform`; the transition list must name it.\n 'tw:[&[data-state=collapsed][data-collapsible=off-canvas][data-side=left]>[data-slot=sidebar-wrapper]]:-translate-x-full',\n 'tw:[&[data-state=collapsed][data-collapsible=off-canvas][data-side=right]>[data-slot=sidebar-wrapper]]:translate-x-full',\n\n // floating variants styles\n 'tw:[&[data-variant=sided-floating]>[data-slot=sidebar-wrapper]]:pt-(--sidebar-floating-padding)',\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]]:pr-(--sidebar-floating-padding)',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]]:pl-(--sidebar-floating-padding)',\n\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]]:p-(--sidebar-floating-padding)',\n\n // fill state\n 'tw:[&[data-fill=true]>[data-slot=sidebar-wrapper]]:!w-[calc(100svw-var(--opposite-sidebar-width))]',\n 'tw:[&[data-fill=true][data-variant=floating]>[data-slot=sidebar-wrapper]]:!p-(--sidebar-floating-padding)',\n 'tw:[&[data-fill=true][data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:!rounded-tr-xl',\n 'tw:[&[data-fill=true][data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:!rounded-tl-xl',\n\n // ── SIDEBAR DIV (INNERMOST) ──\n 'tw:[&[data-variant=inset][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-r',\n 'tw:[&[data-variant=inset][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-l',\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:shadow',\n 'tw:[&[data-variant=floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-xl',\n 'tw:[&[data-variant=sided-floating]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:shadow',\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-tr-xl',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:rounded-tl-xl',\n // Inner edge border: on the dark scheme the shadow has no lighter ground to show on.\n 'tw:[&[data-variant=sided-floating][data-side=left]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-r',\n 'tw:[&[data-variant=sided-floating][data-side=right]>[data-slot=sidebar-wrapper]>[data-slot=sidebar]]:border-l',\n\n // Ease-out; linear reads as choppy.\n isDragging\n ? 'tw:transition-none'\n : 'tw:transition-[width,translate,transform] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n )}\n >\n <div\n data-slot=\"gap\"\n className={cn(\n 'tw:bg-transparent',\n isDragging\n ? ''\n : 'tw:transition-[width] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n )}\n />\n\n <div\n data-slot=\"sidebar-wrapper\"\n onTransitionEnd={handleTransitionEnd}\n className={cn(\n 'tw:fixed',\n 'tw:inset-y-0',\n 'tw:border-border',\n\n isDragging\n ? 'tw:transition-none'\n : 'tw:transition-[width,translate,transform] tw:duration-(--sidebar-motion-duration) tw:ease-(--sidebar-motion-easing) tw:motion-reduce:transition-none',\n // Composite the slide.\n 'tw:transform-gpu',\n className,\n )}\n style={style}\n >\n {resizable && <SidebarResizeHandle side={side} />}\n <div\n data-slot=\"sidebar\"\n className={cn(\n 'tw:bg-sidebar',\n 'tw:overflow-hidden',\n 'tw:relative',\n 'tw:flex',\n 'tw:flex-col',\n 'tw:size-full',\n 'tw:border-sidebar-border',\n 'tw:group-[]/sidebar:pt-2',\n )}\n >\n {isMounted ? children : null}\n </div>\n </div>\n </div>\n </SidebarInstanceContext>\n </TooltipProvider>\n );\n};\n\n// main layout\nSidebar.Header = SidebarHeader;\nSidebar.Content = SidebarContent;\nSidebar.Footer = SidebarFooter;\nSidebar.Trigger = SidebarTrigger;\nSidebar.FillTrigger = SidebarFillTrigger;\nSidebar.Separator = SidebarSeparator;\nSidebar.MenuIcon = SidebarMenuIcon;\n\n// group features\nSidebar.Group = SidebarGroup;\nSidebar.GroupLabel = SidebarGroupLabel;\nSidebar.GroupContent = SidebarGroupContent;\nSidebar.GroupAction = SidebarGroupAction;\n\n// menu features\nSidebar.Menu = SidebarMenu;\nSidebar.MenuItem = SidebarMenuItem;\nSidebar.MenuButton = SidebarMenuButton;\nSidebar.MenuAction = SidebarMenuAction;\nSidebar.SearchInput = SidebarSearchInput;\nSidebar.MenuCard = SidebarMenuCard;\nSidebar.MenuBadge = SidebarMenuBadge;\n\n// sub-menu features\nSidebar.SubMenu = SidebarMenuSub;\nSidebar.SubItem = SidebarMenuSubItem;\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { findLiteralMatches, hasLiteralMatch } from "./findLiteralMatches-DgGLzy
|
|
|
6
6
|
import { mergeRefs } from "./internal/utils/mergeRefs.js";
|
|
7
7
|
import { Button, ButtonInline, argoVariants } from "./Button-B21oVcPU.js";
|
|
8
8
|
import { ButtonGroup } from "./internal/components/ButtonGroup.js";
|
|
9
|
-
import { DropdownMenu } from "./DropdownMenu-
|
|
9
|
+
import { DropdownMenu } from "./DropdownMenu-BJGLjpVc.js";
|
|
10
10
|
import { ScrollArea, ScrollBar } from "./internal/components/ScrollArea.js";
|
|
11
11
|
import { SplitButton } from "./internal/blocks/SplitButton.js";
|
|
12
12
|
import { MultiActionButtonGroup } from "./MultiActionButtonGroup-AWLj1Tg7.js";
|
|
@@ -39,14 +39,14 @@ import { DatePicker } from "./DatePicker-CtSa9b3V.js";
|
|
|
39
39
|
import { TimePicker } from "./TimePicker-CDGYrRxi.js";
|
|
40
40
|
import { DateRangePicker } from "./DateRangePicker-BAnuz6vO.js";
|
|
41
41
|
import { Switch } from "./Switch-DZvNePOm.js";
|
|
42
|
-
import { RadioGroup } from "./RadioGroup-
|
|
42
|
+
import { RadioGroup } from "./RadioGroup-CYEp8Wnx.js";
|
|
43
43
|
import { Slider } from "./Slider-B0ou9r0B.js";
|
|
44
44
|
import { Search, SearchForm } from "./Search-DmkQo716.js";
|
|
45
45
|
import { forwardAccessibleName } from "./internal/utils/accessibleName.js";
|
|
46
46
|
import { Select } from "./Select-B4uK0QVm.js";
|
|
47
47
|
import { Checkbox } from "./Checkbox-8yIIgY7g.js";
|
|
48
|
-
import { BLANK_VALUES, Combobox, filterByWords, matchByWords, namedLabel, withBlankValues } from "./Combobox-
|
|
49
|
-
import { Badge } from "./Badge-
|
|
48
|
+
import { BLANK_VALUES, Combobox, filterByWords, matchByWords, namedLabel, withBlankValues } from "./Combobox-BNhW0TDB.js";
|
|
49
|
+
import { Badge } from "./Badge-Dz0cj6rj.js";
|
|
50
50
|
import { MultiCombobox } from "./internal/blocks/MultiCombobox.js";
|
|
51
51
|
import { FormGroup } from "./FormGroup-CmCppxOn.js";
|
|
52
52
|
import { ColorInput } from "./ColorInput-B3gBZ8Ya.js";
|
|
@@ -57,7 +57,7 @@ import { ComboboxField } from "./internal/blocks/Form/connectors/ComboboxField.j
|
|
|
57
57
|
import { MultiComboboxField } from "./internal/blocks/Form/connectors/MultiComboboxField.js";
|
|
58
58
|
import { ChipEditor } from "./internal/blocks/ChipEditor.js";
|
|
59
59
|
import { AutoSaveTextarea } from "./AutoSaveTextarea-C5iIr2Ts.js";
|
|
60
|
-
import { ColorModeSwitch } from "./ColorModeSwitch-
|
|
60
|
+
import { ColorModeSwitch } from "./ColorModeSwitch-D8Cki137.js";
|
|
61
61
|
import { DateInput } from "./DateInput-D0nWUasV.js";
|
|
62
62
|
import { PasswordInput } from "./internal/blocks/PasswordInput.js";
|
|
63
63
|
import { TimeInput } from "./internal/blocks/TimeInput.js";
|
|
@@ -66,7 +66,7 @@ import { OtpInput, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND
|
|
|
66
66
|
import { SearchInput } from "./SearchInput-D3qMkHaW.js";
|
|
67
67
|
import { SearchInputWithNavigation } from "./internal/blocks/SearchInputWithNavigation.js";
|
|
68
68
|
import { FileUpload, useFileDropTarget, useFileUploadRejections } from "./FileUpload-Ch2hrIWq.js";
|
|
69
|
-
import { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, FileDownloadChip, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PROMPT_INPUT_CONTAINER, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, findMentionToken, findSlashToken, formatPercentage, getChatInlineIconName } from "./AIKit-
|
|
69
|
+
import { AnswerActions, AnswerSummary, ChatInlineIcon, CollapsibleStepHeader, DIAGRAM_LANGUAGES, FileDownloadChip, InlineStepDetail, InlineStepGroup, InlineStepLabel, Markdown, MarkdownTable, MessageBubble, PROMPT_INPUT_CONTAINER, PlanApproval, PlanRewritingIndicator, PromptInput, Question, QuestionBlock, SuggestedPrompt, ThinkingIndicator, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, UsageBar, UsageStats, UsageStatsRing, clampPercentage, findMentionToken, findSlashToken, formatPercentage, getChatInlineIconName } from "./AIKit-DDIi0r4w.js";
|
|
70
70
|
import { Table, tableAriaSort } from "./Table-BaVT5Tkn.js";
|
|
71
71
|
import { Skeleton } from "./internal/components/Skeleton/Skeleton.js";
|
|
72
72
|
import { DiagramSkeleton } from "./internal/blocks/DiagramShared/DiagramSkeleton.js";
|
|
@@ -90,10 +90,10 @@ import { BrandLogo } from "./BrandLogo-CKpVSZb6.js";
|
|
|
90
90
|
import { AuthLayout } from "./internal/blocks/AuthLayout.js";
|
|
91
91
|
import { PageLayout } from "./PageLayout-DiAAILuS.js";
|
|
92
92
|
import { PageHeader } from "./PageHeader-CgfyXpf1.js";
|
|
93
|
-
import { PageToolbar } from "./PageToolbar-
|
|
94
|
-
import { SectionNav } from "./SectionNav-
|
|
93
|
+
import { PageToolbar } from "./PageToolbar-C06RKIif.js";
|
|
94
|
+
import { SectionNav } from "./SectionNav-I2p2uXTd.js";
|
|
95
95
|
import { ResizableHandle, ResizablePanel, ResizablePanelGroup, useDefaultLayout } from "./Resizable-D3vYToZH.js";
|
|
96
|
-
import { Sidebar, SidebarProvider, useOptionalSidebar, useSidebar } from "./Sidebar-
|
|
96
|
+
import { Sidebar, SidebarProvider, useOptionalSidebar, useSidebar } from "./Sidebar-D9ytIs8V.js";
|
|
97
97
|
import { useScrollbarPosition } from "./internal/hooks/useScrollbarPosition.js";
|
|
98
98
|
import { Navbar } from "./Navbar-B_DNpv5s.js";
|
|
99
99
|
import { DEFAULT_WORKBENCH_BAR_HEIGHT_IN_REM, DEFAULT_WORKBENCH_PANEL_HEIGHT_IN_PX, MIN_WORKBENCH_PANEL_HEIGHT_IN_PX, Workbench, useWorkbench } from "./Workbench-DmZzpkj7.js";
|
|
@@ -115,6 +115,6 @@ import { ChartPanel } from "./internal/blocks/ChartPanel.js";
|
|
|
115
115
|
import { setServerFieldErrors, setSubmitError, useAppForm, withForm } from "./Form-VkzfVPyT.js";
|
|
116
116
|
import { useAutosizeInput } from "./internal/hooks/useAutosizeInput.js";
|
|
117
117
|
import { ZoomableSvg, svgToPngBlob, toSvgFileContent } from "./ZoomableSvg-C65nta_r.js";
|
|
118
|
-
import { BrandEditor, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, channelsToHex, contrastRatio, hexToChannels, wcagLevel } from "./BrandEditor-
|
|
118
|
+
import { BrandEditor, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, channelsToHex, contrastRatio, hexToChannels, wcagLevel } from "./BrandEditor-P8OZX2hi.js";
|
|
119
119
|
import { Slot } from "@radix-ui/react-slot";
|
|
120
120
|
export { Alert, AlertModal, AnswerActions, AnswerSummary, AppShell, ArgoDesignContext, AuthLayout, AutoSaveTextarea, Avatar, BLANK_VALUES, Badge, BrandEditor, BrandLogo, Breadcrumb, Button, ButtonGroup, ButtonInline, Calendar, Card, ChartPanel, ChatInlineIcon, Checkbox, ChipEditor, Clipboard, ClipboardButton, ClipboardInline, Collapsible, CollapsiblePanel, CollapsibleStepHeader, ColorInput, ColorModeSwitch, Combobox, ComboboxField, Command, CommandGroup, CommandInput, CommandItem, CommandList, ConflictStatusIndicator, CopyField, DEFAULT_COLOR_SCHEME, DEFAULT_FALLBACK_FONT, DEFAULT_FONT_OPTIONS, DEFAULT_BRAND_ID as DEFAULT_KEBOOLA_BRAND_ID, DEFAULT_WORKBENCH_BAR_HEIGHT_IN_REM, DEFAULT_WORKBENCH_PANEL_HEIGHT_IN_PX, DIAGRAM_LANGUAGES, DashboardHero, DateInput, DatePicker, DateRangeInput, DateRangePicker, DiagramSkeleton, DiffType, DiffView, DotsLoader, DropdownMenu, EmptyConfigurationActionCard, EmptySearchContent, EmptyState, ErrorState, ExportMenu, FileDownloadChip, FileUpload, FormGroup, FullScreenModal, FullScreenModalBody, FullScreenModalHeader, GoogleButton, HINT_UNDERLINE_CLASS_NAME, HelpBlock, HoverCard, InlineStepDetail, InlineStepGroup, InlineStepLabel, InputGroup, Kbd, Label, Link, MIN_WORKBENCH_PANEL_HEIGHT_IN_PX, Markdown, MarkdownTable, MarkedText, MessageBubble, MicrosoftButton, Modal, MultiActionButtonGroup, MultiCombobox, MultiComboboxField, Navbar, NumberInput, OtpInput, PROMPT_INPUT_CONTAINER, PageHeader, PageLayout, PageToolbar, Pagination, PaneHeader, PanelWithDetails, PasswordInput, PlanApproval, PlanRewritingIndicator, Popconfirm, Popover, Progress, PromptInput, Question, QuestionBlock, REGEXP_ONLY_CHARS, REGEXP_ONLY_DIGITS, REGEXP_ONLY_DIGITS_AND_CHARS, RadioGroup, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Search, SearchForm, SearchInput, SearchInputWithNavigation, SectionNav, Select, Separator, Sheet, Sidebar, SidebarProvider, Skeleton, SkeletonList, Slider, Slot, SplitButton, SpotlightBackdrop, StatCard, StatCardGrid, Stepper, SuggestedPrompt, Switch, Table, Tabs, TabsContent, TextInput, Textarea, ThemeProvider, ThemeScope, ThinkingIndicator, TimeInput, TimePicker, Timeline, Toaster, Toggle, ToggleGroup, ToolCallApproval, ToolCallChip, ToolCallStatusHeader, Tooltip, TooltipProvider, Truncated, UsageBar, UsageStats, UsageStatsRing, Workbench, ZoomableSvg, agnes, appShellSlotSelector, argoVariants, brandSchema, channelsToHex, clampPercentage, cn, computeDiffRows, computeLineInformation, contrastRatio, copyToClipboard, defaultFilter, exampleCustomer, filterByWords, findLiteralMatches, findMentionToken, findSlashToken, formatPercentage, forwardAccessibleName, getChatInlineIconName, harbor, hasLiteralMatch, hexToChannels, isMac, kbdVariants, keboola, keboolaLegacySidebar, keys, matchByWords, mergeRefs, namedLabel, setServerFieldErrors, setSubmitError, svgToPngBlob, tableAriaSort, toSvgFileContent, toast, useAppForm, useArgoDesign, useAutosizeInput, useCommandState, useDefaultLayout, useFileDropTarget, useFileUploadRejections, useMergeDiff, useNotification, useOptionalSidebar, useScrollbarPosition, useSidebar, useStableCallback, useTargetRect, useTheme, useThemeScopeContainer, useWorkbench, wcagLevel, withBlankValues, withForm };
|