bruv-ui 0.2.0 → 0.3.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/cn.ts","../src/components/breadcrumb/breadcrumb.tsx","../src/components/hover/hover.tsx","../src/components/combobox/combobox.tsx","../src/components/button/button.tsx","../src/components/spinner/spinner.tsx","../src/components/spinner/pixel-spinner.tsx","../src/components/menu/menu.tsx","../src/components/toggle/toggle.tsx","../src/components/checkbox/checkbox.tsx","../src/components/color-picker/color-picker.tsx","../src/components/card/card.tsx","../src/components/nav-link/nav-link.tsx","../src/components/app-header/app-header.tsx","../src/components/avatar/avatar.tsx","../src/components/settings-card/settings-card.tsx","../src/components/tooltip/tooltip.tsx","../src/components/page-layout/page-layout.tsx","../src/components/sidebar/sidebar.tsx","../src/components/drawer/drawer.tsx","../src/components/skeleton/skeleton.tsx","../src/components/flickering-grid/flickering-grid.tsx","../src/components/sidebar/sidebar-context.tsx","../src/components/select/select.tsx","../src/components/separator/separator.tsx","../src/components/badge/badge.tsx","../src/components/kbd/kbd.tsx","../src/components/form/form.tsx","../src/components/status-dot/status-dot.tsx","../src/components/dropdown-menu/dropdown-menu.tsx","../src/components/dialog/dialog.tsx","../src/components/data-table/data-table.tsx","../src/components/table/table.tsx","../src/components/table/truncated-cell.tsx","../src/components/pagination/pagination.tsx","../src/components/empty-state/empty-state.tsx","../src/components/data-table/data-table-toolbar.tsx","../src/components/data-table/data-table-search.tsx","../src/components/data-table/data-table-columns-button.tsx","../src/components/action-bar/action-bar.tsx","../src/components/data-table/data-table-bulk-bar.tsx","../src/components/filter/multi-select.tsx","../src/components/popover/popover.tsx","../src/components/filter/trigger.tsx","../src/components/filter/single-select.tsx","../src/components/filter/toggle.tsx","../src/components/filter/date-range.tsx","../src/lib/date.ts","../src/components/calendar/calendar.tsx","../src/components/filter/numeric-range.tsx","../src/components/filter/text.tsx","../src/components/filter/date.tsx","../src/components/filter/slider.tsx","../src/components/slider/slider.tsx","../src/components/filter/filter.tsx","../src/components/filter/date-presets.ts","../src/components/date-picker/date-picker.tsx","../src/components/date-range-picker/date-range-picker.tsx","../src/components/time-picker/time-picker.tsx","../src/components/number-input/number-input.tsx","../src/components/progress/progress.tsx","../src/components/scroll-area/scroll-area.tsx","../src/components/stepper/stepper.tsx","../src/components/tree-view/tree-view.tsx","../src/components/context-menu/context-menu.tsx","../src/components/tags-input/tags-input.tsx","../src/components/otp/otp.tsx","../src/components/toolbar/toolbar.tsx","../src/components/resizable/resizable.tsx","../src/components/segmented-control/segmented-control.tsx","../src/components/segmented-group/segmented-group.tsx","../src/components/user-menu/user-menu.tsx","../src/components/alert/alert.tsx","../src/components/alert-dialog/alert-dialog.tsx","../src/components/accordion/accordion.tsx","../src/components/tabs/tabs.tsx","../src/components/command/command.tsx","../src/components/toggle-button/toggle-button.tsx","../src/components/button-group/button-group.tsx","../src/components/radio-group/radio-group.tsx","../src/components/save-bar/save-bar.tsx","../src/components/fab/fab.tsx","../src/components/settings-page/settings-page.tsx","../src/components/toast/toast.tsx","../src/lib/use-dirty-state.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [{ \"text-cui\": [\"sm\", \"base\", \"lg\", \"xl\"] }],\n\t\t\t\"text-color\": [\n\t\t\t\t{\n\t\t\t\t\t\"text-cui\": [\n\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\"secondary\",\n\t\t\t\t\t\t\"tertiary\",\n\t\t\t\t\t\t\"inverse\",\n\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\"accent-on\",\n\t\t\t\t\t\t\"danger\",\n\t\t\t\t\t\t\"danger-on\",\n\t\t\t\t\t\t\"warn\",\n\t\t\t\t\t\t\"warn-on\",\n\t\t\t\t\t\t\"success\",\n\t\t\t\t\t\t\"success-on\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n})\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import type { ComponentType, ReactNode } from \"react\"\nimport { ChevronUpDownIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Hover } from \"../hover\"\nimport { Combobox, ComboboxTrigger, ComboboxContent } from \"../combobox\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype LinkComponent = ComponentType<{\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}>\n\nfunction DefaultLink({\n\tto,\n\thref,\n\tclassName,\n\tchildren,\n}: {\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}) {\n\treturn (\n\t\t<a href={to ?? href} className={className}>\n\t\t\t{children}\n\t\t</a>\n\t)\n}\n\nexport interface BreadcrumbOption {\n\treadonly value: string\n\treadonly label: string\n\treadonly icon?: ReactNode\n\treadonly [key: string]: unknown\n}\n\nexport interface BreadcrumbItem {\n\t/** Display label for this segment */\n\treadonly label: string\n\t/** Optional icon rendered before the label */\n\treadonly icon?: ReactNode\n\t/** Link URL — makes the label a clickable link */\n\treadonly href?: string\n\t/** Enable a dropdown selector (ChevronUpDown trigger) */\n\treadonly selector?: boolean\n\t/** Options for the selector dropdown */\n\treadonly options?: BreadcrumbOption[]\n\t/** Callback when a selector option is chosen */\n\treadonly onSelect?: (value: string) => void\n\t/** Currently selected value for the selector */\n\treadonly value?: string\n}\n\nexport interface BreadcrumbProps {\n\t/** Breadcrumb segments */\n\treadonly items: BreadcrumbItem[]\n\t/** Custom link component (e.g. TanStack Router's Link, Next.js Link). Defaults to <a>. */\n\treadonly linkComponent?: LinkComponent\n\treadonly className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Internal — Separator\n// ---------------------------------------------------------------------------\n\nfunction Separator() {\n\treturn (\n\t\t<div className=\"flex w-4 shrink-0 items-center justify-center self-stretch\">\n\t\t\t<div className=\"bg-bruv-tertiary h-4 w-px rotate-[20deg] opacity-50\" />\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Internal — BreadcrumbLabel\n// ---------------------------------------------------------------------------\n\nfunction BreadcrumbLabel({\n\titem,\n\tasLink,\n\tLinkEl,\n}: {\n\titem: BreadcrumbItem\n\tasLink?: boolean\n\tLinkEl: LinkComponent\n}) {\n\tconst className = cn(\n\t\t\"flex items-center gap-2 h-8 px-2 text-bruv-base text-bruv-primary select-none\",\n\t\tasLink &&\n\t\t\t\"outline-none rounded focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t)\n\tconst content = (\n\t\t<>\n\t\t\t{item.icon && (\n\t\t\t\t<span className=\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t{item.icon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<span>{item.label}</span>\n\t\t</>\n\t)\n\n\tif (asLink && item.href) {\n\t\treturn (\n\t\t\t<LinkEl to={item.href} href={item.href} className={className}>\n\t\t\t\t{content}\n\t\t\t</LinkEl>\n\t\t)\n\t}\n\treturn <span className={className}>{content}</span>\n}\n\n// ---------------------------------------------------------------------------\n// Internal — SelectorChevron\n// ---------------------------------------------------------------------------\n\nfunction SelectorChevron() {\n\treturn (\n\t\t<ComboboxTrigger className=\"rounded-bruv-sm\">\n\t\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t\t<span className=\"flex h-8 items-center justify-center px-0.5 select-none\">\n\t\t\t\t\t<ChevronUpDownIcon className=\"text-bruv-tertiary size-4\" />\n\t\t\t\t</span>\n\t\t\t</Hover>\n\t\t</ComboboxTrigger>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Internal — BreadcrumbSegment\n// ---------------------------------------------------------------------------\n\nfunction BreadcrumbSegment({\n\titem,\n\tLinkEl,\n}: {\n\titem: BreadcrumbItem\n\tLinkEl: LinkComponent\n}) {\n\tif (item.selector && item.options) {\n\t\treturn (\n\t\t\t<Combobox\n\t\t\t\tvalue={item.value}\n\t\t\t\tonValueChange={item.onSelect}\n\t\t\t\titems={item.options}\n\t\t\t>\n\t\t\t\t<span className=\"flex items-center\">\n\t\t\t\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t\t\t\t<BreadcrumbLabel item={item} asLink={!!item.href} LinkEl={LinkEl} />\n\t\t\t\t\t</Hover>\n\t\t\t\t\t<SelectorChevron />\n\t\t\t\t</span>\n\t\t\t\t<ComboboxContent searchPlaceholder=\"Search...\" />\n\t\t\t</Combobox>\n\t\t)\n\t}\n\n\tif (item.href) {\n\t\treturn (\n\t\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t\t<BreadcrumbLabel item={item} asLink LinkEl={LinkEl} />\n\t\t\t</Hover>\n\t\t)\n\t}\n\n\treturn (\n\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t<BreadcrumbLabel item={item} LinkEl={LinkEl} />\n\t\t</Hover>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Breadcrumb — standalone breadcrumb navigation\n// ---------------------------------------------------------------------------\n\n/**\n * Breadcrumb navigation with support for links, selectors, and icons.\n *\n * Each segment can be:\n * - **Static text** — plain label (last segment, current page)\n * - **Link** — clickable label that navigates to a parent page\n * - **Selector** — label + chevron dropdown to switch between siblings\n * (e.g. switch repos). The label can also be a link independently.\n *\n * Usage:\n * ```tsx\n * <Breadcrumb\n * items={[\n * { label: \"Repositories\", href: \"/repositories\" },\n * { label: \"landing\", href: \"/repos/landing\", selector: true, options: repos, value: \"landing\" },\n * { label: \"Settings\" },\n * ]}\n * />\n * ```\n */\nexport function Breadcrumb({\n\titems,\n\tlinkComponent: LinkEl = DefaultLink,\n\tclassName,\n}: BreadcrumbProps) {\n\treturn (\n\t\t<nav className={cn(\"flex items-center\", className)}>\n\t\t\t{items.map((item, index) => (\n\t\t\t\t<span key={item.label} className=\"flex items-center\">\n\t\t\t\t\t{index > 0 && <Separator />}\n\t\t\t\t\t<BreadcrumbSegment item={item} LinkEl={LinkEl} />\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</nav>\n\t)\n}\n","import {\n\ttype ComponentProps,\n\ttype CSSProperties,\n\ttype ReactNode,\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Group context\n// ---------------------------------------------------------------------------\n\ninterface HoverRect {\n\tleft: number\n\ttop: number\n\twidth: number\n\theight: number\n}\n\ninterface HoverGroupCtx {\n\tregisterItem: (id: number, el: HTMLElement | null) => void\n\tonItemHover: (id: number) => void\n\tdismissHover: () => void\n}\n\nconst GroupCtx = createContext<HoverGroupCtx | null>(null)\n\n// ---------------------------------------------------------------------------\n// Hover.Group\n// ---------------------------------------------------------------------------\n\nexport interface HoverGroupProps {\n\tchildren: ReactNode\n\t/** Background class for the sliding pill */\n\tbackground?: string\n\t/** Border radius class for the sliding pill */\n\tborderRadius?: string\n\tclassName?: string\n}\n\nfunction measureElement(el: HTMLElement): HoverRect {\n\treturn {\n\t\tleft: el.offsetLeft,\n\t\ttop: el.offsetTop,\n\t\twidth: el.offsetWidth,\n\t\theight: el.offsetHeight,\n\t}\n}\n\n/**\n * Groups Hover items so they share a single sliding hover indicator.\n *\n * The indicator is hover-only - it slides between items on hover and\n * fades out when the pointer leaves the group. On press, the indicator\n * background shrinks by 1px on all sides (same feel as standalone Hover).\n *\n * Active items render their own static background via the standalone\n * Hover background layer (with its own press inset effect).\n *\n * Works for both horizontal and vertical layouts automatically.\n */\ntype PillMode = \"idle\" | \"fade\" | \"slide\"\n\nexport function HoverGroup({\n\tchildren,\n\tbackground = \"bg-bruv-subtle\",\n\tborderRadius = \"rounded-bruv-sm\",\n\tclassName,\n}: HoverGroupProps) {\n\tconst itemElements = useRef<Map<number, HTMLElement>>(new Map())\n\n\tconst [hoverRect, setHoverRect] = useState<HoverRect | null>(null)\n\tconst lastRectRef = useRef<HoverRect | null>(null)\n\tconst [pillMode, setPillMode] = useState<PillMode>(\"idle\")\n\n\tconst registerItem = useCallback((id: number, el: HTMLElement | null) => {\n\t\tif (el) itemElements.current.set(id, el)\n\t\telse itemElements.current.delete(id)\n\t}, [])\n\n\tconst onItemHover = useCallback((id: number) => {\n\t\tconst el = itemElements.current.get(id)\n\t\tif (!el) return\n\t\tconst rect = measureElement(el)\n\n\t\tsetPillMode(prev => (prev === \"idle\" ? \"fade\" : \"slide\"))\n\t\tsetHoverRect(rect)\n\t}, [])\n\n\tconst onGroupLeave = useCallback(() => {\n\t\tsetPillMode(\"idle\")\n\t\tsetHoverRect(null)\n\t}, [])\n\n\t// Entering an active item = leaving the hover group conceptually.\n\t// Reset to idle so the next non-active item gets a fresh fade-in.\n\tconst dismissHover = useCallback(() => {\n\t\tsetPillMode(\"idle\")\n\t\tsetHoverRect(null)\n\t}, [])\n\n\tconst isVisible = hoverRect !== null\n\tconst displayRect = hoverRect ?? lastRectRef.current\n\n\t// Track the last rect for fade-out position\n\tif (hoverRect) {\n\t\tlastRectRef.current = hoverRect\n\t}\n\n\tconst ctxValue = useMemo(\n\t\t() => ({ registerItem, onItemHover, dismissHover }),\n\t\t[registerItem, onItemHover, dismissHover],\n\t)\n\n\treturn (\n\t\t<GroupCtx.Provider value={ctxValue}>\n\t\t\t<div\n\t\t\t\tonPointerLeave={onGroupLeave}\n\t\t\t\tclassName={cn(\"group/h relative flex items-center\", className)}\n\t\t\t>\n\t\t\t\t{/* Hover pill positioner */}\n\t\t\t\t<div\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"pointer-events-none absolute left-0 top-0 z-0\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t// Slide mode: transition everything for smooth sliding\n\t\t\t\t\t\t// Fade/idle: only transition opacity + scale (translate snaps)\n\t\t\t\t\t\tpillMode === \"slide\"\n\t\t\t\t\t\t\t? \"transition-[translate,width,height,opacity,scale] duration-200 ease-bruv-out-expo\"\n\t\t\t\t\t\t\t: \"transition-[opacity,scale] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\tisVisible ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\tdisplayRect\n\t\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t\twidth: displayRect.width,\n\t\t\t\t\t\t\t\t\theight: displayRect.height,\n\t\t\t\t\t\t\t\t\ttranslate: `${displayRect.left}px ${displayRect.top}px`,\n\t\t\t\t\t\t\t\t} as CSSProperties)\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{/* Pill visible background - press inset */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute inset-0\",\n\t\t\t\t\t\t\tbackground,\n\t\t\t\t\t\t\tborderRadius,\n\t\t\t\t\t\t\t\"transition-[inset] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\t\t\"group-active/h:inset-px\",\n\t\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</GroupCtx.Provider>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Hover\n// ---------------------------------------------------------------------------\n\nexport interface HoverProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n\tchildren: ReactNode\n\t/** Force the hover background visible (e.g. active/selected state) */\n\tactive?: boolean\n\t/** Background class applied to the hover layer */\n\tbackground?: string\n\t/** Additional classes on the animated background layer (border, shadow, hover color shifts, etc.) */\n\tbackgroundClassName?: string\n\t/** Border radius class */\n\tborderRadius?: string\n\t/** Enable focus ring */\n\tfocus?: boolean\n\t/** Enable active/press shrink effect */\n\tinteractive?: boolean\n\t/** When true, hover bg appears instantly (no opacity/inset transition).\n\t * Only the press effect (inset shrink) animates. Useful for menus. */\n\tinstantHover?: boolean\n\t/** Disable all hover/focus effects */\n\tdisabled?: boolean\n\t/** Stretch to full width */\n\tfullWidth?: boolean\n}\n\n/**\n * Animated hover/focus wrapper.\n *\n * **Standalone**: renders an absolutely-positioned background layer behind its\n * children that transitions in on hover/focus. On press, the background shrinks\n * by 1px on all sides.\n *\n * **Inside Hover.Group**: registers for the shared sliding hover pill.\n * When `active`, renders its own static background with the press inset\n * effect (same as standalone active state). The group pill handles hover.\n */\nexport function Hover({\n\tchildren,\n\tactive = false,\n\tbackground = \"bg-bruv-subtle\",\n\tbackgroundClassName,\n\tborderRadius = \"rounded\",\n\tfocus = true,\n\tinteractive = true,\n\tinstantHover = false,\n\tdisabled = false,\n\tfullWidth = false,\n\tclassName,\n\t...rest\n}: HoverProps) {\n\tconst group = useContext(GroupCtx)\n\n\tif (group) {\n\t\treturn (\n\t\t\t<HoverGrouped\n\t\t\t\tgroup={group}\n\t\t\t\tactive={active}\n\t\t\t\tbackground={background}\n\t\t\t\tbackgroundClassName={backgroundClassName}\n\t\t\t\tborderRadius={borderRadius}\n\t\t\t\tinteractive={interactive}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfullWidth={fullWidth}\n\t\t\t\tclassName={className}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</HoverGrouped>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\t{...rest}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/h relative flex min-w-0 items-center text-bruv-primary text-bruv-base\",\n\t\t\t\tfullWidth ? \"w-full\" : \"w-fit\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Background layer */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute\",\n\t\t\t\t\tinstantHover\n\t\t\t\t\t\t? \"transition-[inset] duration-150 ease-bruv-out-expo motion-reduce:transition-none\"\n\t\t\t\t\t\t: \"transition-[inset,opacity,background-color] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\tbackground,\n\t\t\t\t\tbackgroundClassName,\n\t\t\t\t\tborderRadius,\n\t\t\t\t\t// hover\n\t\t\t\t\t!disabled && \"group-hover/h:inset-0 group-hover/h:opacity-100\",\n\t\t\t\t\t// active/press\n\t\t\t\t\tinteractive && !disabled && \"group-active/h:inset-px\",\n\t\t\t\t\t// active state (forced visible)\n\t\t\t\t\tactive\n\t\t\t\t\t\t? \"opacity-100 inset-0\"\n\t\t\t\t\t\t: instantHover\n\t\t\t\t\t\t\t? \"opacity-0 inset-0\"\n\t\t\t\t\t\t\t: \"opacity-0 inset-1\",\n\t\t\t\t\t// focus\n\t\t\t\t\tfocus &&\n\t\t\t\t\t\t!disabled &&\n\t\t\t\t\t\t\"group-has-focus-visible/h:inset-0 group-has-focus-visible/h:opacity-100 group-has-focus-visible/h:ring-bruv-focus group-has-focus-visible/h:ring-2 group-has-focus-visible/h:ring-offset-2\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{/* Content */}\n\t\t\t<div className=\"relative z-[2] flex w-full min-w-0 items-center gap-2\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// HoverGrouped\n//\n// Registers in the group for the shared hover pill. When active, renders\n// a static background with the same inset press effect as standalone Hover.\n// ---------------------------------------------------------------------------\n\nfunction HoverGrouped({\n\tchildren,\n\tgroup,\n\tactive,\n\tbackground,\n\tbackgroundClassName,\n\tborderRadius,\n\tinteractive,\n\tdisabled,\n\tfullWidth,\n\tclassName,\n\t...rest\n}: {\n\tchildren: ReactNode\n\tgroup: HoverGroupCtx\n\tactive: boolean\n\tbackground: string\n\tbackgroundClassName?: string\n\tborderRadius: string\n\tinteractive: boolean\n\tdisabled: boolean\n\tfullWidth: boolean\n\tclassName?: string\n} & Omit<ComponentProps<\"div\">, \"children\">) {\n\tconst ref = useRef<HTMLDivElement>(null)\n\tconst idRef = useRef<number | null>(null)\n\tif (idRef.current === null) {\n\t\tidRef.current = Math.random()\n\t}\n\tconst id = idRef.current\n\tconst groupRef = useRef(group)\n\tgroupRef.current = group\n\n\tuseLayoutEffect(() => {\n\t\tconst g = groupRef.current\n\t\tg.registerItem(id, ref.current)\n\t\treturn () => g.registerItem(id, null)\n\t}, [id])\n\n\tconst prevActiveRef = useRef(active)\n\tuseLayoutEffect(() => {\n\t\tif (active && !prevActiveRef.current) {\n\t\t\tgroup.dismissHover()\n\t\t}\n\t\tprevActiveRef.current = active\n\t}, [active, group])\n\n\treturn (\n\t\t<div\n\t\t\t{...rest}\n\t\t\tref={ref}\n\t\t\tonPointerEnter={e => {\n\t\t\t\trest.onPointerEnter?.(e)\n\t\t\t\tif (disabled || active) {\n\t\t\t\t\tgroup.dismissHover()\n\t\t\t\t} else {\n\t\t\t\t\tgroup.onItemHover(id)\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/hi relative z-[1] flex items-center text-bruv-primary text-bruv-base\",\n\t\t\t\tfullWidth ? \"w-full\" : \"w-fit\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Active background - always mounted, fades/scales in and out */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute\",\n\t\t\t\t\tbackground,\n\t\t\t\t\tbackgroundClassName,\n\t\t\t\t\tborderRadius,\n\t\t\t\t\t\"transition-[inset,opacity,scale] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\tinteractive && !disabled && \"group-active/hi:inset-px\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tactive\n\t\t\t\t\t\t? \"inset-0 scale-100 opacity-100\"\n\t\t\t\t\t\t: \"inset-1 scale-95 opacity-0\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{/* Content */}\n\t\t\t<div className=\"relative z-[2] flex w-full min-w-0 items-center gap-2\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import { forwardRef, type ReactElement, type ReactNode, useState } from \"react\"\nimport { Combobox as BaseCombobox } from \"@base-ui/react/combobox\"\nimport { ChevronUpDownIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button, type ButtonSize } from \"../button\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxItem {\n\treadonly value: string\n\treadonly label: string\n\treadonly icon?: ReactNode\n\treadonly [key: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Combobox (Root)\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxProps {\n\t/** Controlled value */\n\treadonly value?: string\n\t/** Uncontrolled default value */\n\treadonly defaultValue?: string\n\t/** Called when a value is selected */\n\treadonly onValueChange?: (value: string) => void\n\t/** Item data for filtering and rendering */\n\treadonly items: ComboboxItem[]\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Searchable combobox with filtering.\n *\n * Wraps Base UI Combobox.Root with shared Menu visual primitives.\n * For non-searchable dropdowns, use Select instead.\n *\n * Supports both controlled (`value` + `onValueChange`)\n * and uncontrolled (`defaultValue`) usage.\n */\nexport function Combobox({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\titems,\n\tchildren,\n\tclassName,\n}: ComboboxProps): ReactElement {\n\tconst [inputValue, setInputValue] = useState(\"\")\n\n\treturn (\n\t\t<BaseCombobox.Root\n\t\t\tvalue={value}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tonValueChange={\n\t\t\t\tonValueChange\n\t\t\t\t\t? val => {\n\t\t\t\t\t\t\tif (val != null) onValueChange(val)\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\titems={items}\n\t\t\tinputValue={inputValue}\n\t\t\tonInputValueChange={setInputValue}\n\t\t\tonOpenChange={open => {\n\t\t\t\tif (open) setInputValue(\"\")\n\t\t\t}}\n\t\t\tautoHighlight\n\t\t>\n\t\t\t{className ? <div className={className}>{children}</div> : children}\n\t\t</BaseCombobox.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// ComboboxTrigger — composable\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxTriggerProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Fully composable trigger. Renders whatever children you give it as the\n * element that opens the combobox popup.\n *\n * Use ComboboxButton for button-based triggers so BaseCombobox.Trigger does\n * not wrap a Button in another native button.\n */\nexport const ComboboxTrigger = forwardRef<\n\tHTMLButtonElement,\n\tComboboxTriggerProps\n>(function ComboboxTrigger({ children, className }, ref) {\n\treturn (\n\t\t<BaseCombobox.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2 rounded\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</BaseCombobox.Trigger>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// ComboboxButton — pre-styled trigger\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxButtonProps {\n\t/** Placeholder text shown when no value is selected */\n\tplaceholder?: string\n\t/** Size of the button */\n\tsize?: ButtonSize\n\tclassName?: string\n}\n\n/**\n * Pre-styled trigger for form contexts.\n * Renders as a Button with the selected value + chevron icon.\n * For fully custom triggers, use ComboboxTrigger instead.\n */\nexport const ComboboxButton = forwardRef<\n\tHTMLButtonElement,\n\tComboboxButtonProps\n>(function ComboboxButton({ placeholder, size, className }, ref) {\n\treturn (\n\t\t<BaseCombobox.Trigger\n\t\t\tref={ref}\n\t\t\trender={\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize={size}\n\t\t\t\t\ticonRight={<ChevronUpDownIcon />}\n\t\t\t\t\tclassName={className}\n\t\t\t\t>\n\t\t\t\t\t<BaseCombobox.Value placeholder={placeholder} />\n\t\t\t\t</Button>\n\t\t\t}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// ComboboxContent — popup with search + list\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxContentProps {\n\t/** Alignment relative to trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Placeholder text for the search input */\n\tsearchPlaceholder?: string\n\t/** Empty state message */\n\temptyMessage?: string\n\t/** Minimum width of the popup */\n\tminWidth?: string\n\t/**\n\t * Render function for each item. Receives a ComboboxItem and should return\n\t * a ComboboxOption element. When not provided, renders a default option\n\t * with optional icon + label + checkmark.\n\t */\n\tchildren?: (item: ComboboxItem) => ReactNode\n\tclassName?: string\n}\n\n/**\n * Popup with search input and a scrollable list of filtered options.\n * Uses Base UI's render function pattern for automatic filtering.\n */\nexport function ComboboxContent({\n\talign = \"start\",\n\tsearchPlaceholder = \"Search...\",\n\temptyMessage = \"No results found.\",\n\tminWidth = \"min-w-[220px]\",\n\tchildren,\n\tclassName,\n}: ComboboxContentProps): ReactElement {\n\tconst renderItem =\n\t\tchildren ??\n\t\t((item: ComboboxItem) => (\n\t\t\t<ComboboxOption key={item.value} value={item.value} icon={item.icon}>\n\t\t\t\t{item.label}\n\t\t\t</ComboboxOption>\n\t\t))\n\n\treturn (\n\t\t<BaseCombobox.Portal>\n\t\t\t<BaseCombobox.Positioner\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={4}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseCombobox.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t<Menu.SearchInput>\n\t\t\t\t\t\t<BaseCombobox.Input\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Menu.SearchInput>\n\t\t\t\t\t<BaseCombobox.Empty render={<Menu.Empty />}>\n\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t</BaseCombobox.Empty>\n\t\t\t\t\t<BaseCombobox.List render={<Menu.List />}>\n\t\t\t\t\t\t{renderItem}\n\t\t\t\t\t</BaseCombobox.List>\n\t\t\t\t</BaseCombobox.Popup>\n\t\t\t</BaseCombobox.Positioner>\n\t\t</BaseCombobox.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// ComboboxOption\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxOptionProps {\n\t/** Value for this option */\n\treadonly value: string\n\t/** Icon element rendered before the label */\n\treadonly icon?: ReactNode\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Individual option in the combobox popup.\n * Automatically includes a checkmark indicator when selected.\n */\nexport const ComboboxOption = forwardRef<HTMLDivElement, ComboboxOptionProps>(\n\tfunction ComboboxOption({ value, icon, children, className }, ref) {\n\t\treturn (\n\t\t\t<BaseCombobox.Item\n\t\t\t\tref={ref}\n\t\t\t\tvalue={value}\n\t\t\t\trender={<Menu.Item icon={icon} className={className} />}\n\t\t\t>\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t\t<BaseCombobox.ItemIndicator render={<Menu.ItemIndicator />} />\n\t\t\t</BaseCombobox.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// ComboboxGroup — groups related items with a label\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxGroupProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Groups related combobox items with an optional label.\n * Wraps Base UI's Combobox.Group.\n */\nexport const ComboboxGroup = forwardRef<HTMLDivElement, ComboboxGroupProps>(\n\tfunction ComboboxGroup({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseCombobox.Group ref={ref} className={cn(\"flex flex-col\", className)}>\n\t\t\t\t{children}\n\t\t\t</BaseCombobox.Group>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// ComboboxGroupLabel — accessible label for a group\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxGroupLabelProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Accessible label automatically associated with its parent group.\n * Renders via Menu.GroupLabel for consistent styling.\n */\nexport const ComboboxGroupLabel = forwardRef<\n\tHTMLDivElement,\n\tComboboxGroupLabelProps\n>(function ComboboxGroupLabel({ className, children }, ref) {\n\treturn (\n\t\t<BaseCombobox.GroupLabel\n\t\t\tref={ref}\n\t\t\trender={<Menu.GroupLabel className={className} />}\n\t\t>\n\t\t\t{children}\n\t\t</BaseCombobox.GroupLabel>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// ComboboxSeparator — divider between groups\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxSeparatorProps {\n\treadonly className?: string\n}\n\n/**\n * Visual separator between combobox groups.\n * Renders via Menu.Separator for consistent styling.\n */\nexport const ComboboxSeparator = forwardRef<\n\tHTMLDivElement,\n\tComboboxSeparatorProps\n>(function ComboboxSeparator({ className }, ref) {\n\treturn (\n\t\t<BaseCombobox.Separator\n\t\t\tref={ref}\n\t\t\trender={<Menu.Separator className={className} />}\n\t\t/>\n\t)\n})\n","import { Button as BaseButton } from \"@base-ui/react/button\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Spinner } from \"../spinner\"\n\nconst variantConfig = {\n\tprimary: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-inverse\",\n\t\tbgClassName:\n\t\t\t\"shadow-xs inset-shadow-bruv-primary group-hover/btn:bg-bruv-inverse/90\",\n\t\ttext: \"text-bruv-inverse\",\n\t},\n\toutline: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-base-2\",\n\t\tbgClassName:\n\t\t\t\"border border-bruv-neutral shadow-xs group-hover/btn:bg-bruv-subtle group-active/btn:bg-bruv-subtle\",\n\t\ttext: \"text-bruv-primary\",\n\t},\n\tsecondary: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-subtle\",\n\t\tbgClassName: \"group-hover/btn:bg-bruv-subtle/70\",\n\t\ttext: \"text-bruv-primary\",\n\t},\n\ttransparent: {\n\t\tactive: false,\n\t\tbg: \"\",\n\t\tbgClassName:\n\t\t\t\"group-hover/btn:bg-bruv-subtle group-active/btn:bg-bruv-subtle\",\n\t\ttext: \"text-bruv-secondary\",\n\t},\n\tdanger: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-danger\",\n\t\tbgClassName:\n\t\t\t\"border border-bruv-danger shadow-xs group-hover/btn:bg-bruv-danger-strong group-active/btn:bg-bruv-danger-strong\",\n\t\ttext: \"text-bruv-danger-on\",\n\t},\n\t\"danger-light\": {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-danger-subtle\",\n\t\tbgClassName:\n\t\t\t\"group-hover/btn:bg-bruv-danger/30 group-active/btn:bg-bruv-danger/50\",\n\t\ttext: \"text-bruv-danger\",\n\t},\n} as const\n\nconst sizeStyles = {\n\txs: { height: \"h-6\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-6\" },\n\tsm: { height: \"h-7\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-7\" },\n\tmd: { height: \"h-8\", padding: \"px-2\", textPadding: \"px-1\", icon: \"w-8\" },\n} as const\n\nexport type ButtonVariant = keyof typeof variantConfig\nexport type ButtonSize = keyof typeof sizeStyles\n\nexport interface ButtonProps extends ComponentProps<typeof BaseButton> {\n\t/** Visual style variant */\n\tvariant?: ButtonVariant\n\t/** Size of the button */\n\tsize?: ButtonSize\n\t/** Icon element rendered before the label */\n\ticonLeft?: ReactNode\n\t/** Icon element rendered after the label */\n\ticonRight?: ReactNode\n\t/** Free-form content rendered after the label, before iconRight */\n\ttrailing?: ReactNode\n\t/** Show a loading spinner overlay */\n\tloading?: boolean\n}\n\n/**\n * Button component built on Base UI with Tailwind CSS styling.\n *\n * All variants use an animated hover layer for consistent press/hover\n * feedback. The layer handles bg, border, and shadow - the outer button\n * is just a layout shell.\n */\nexport const Button = forwardRef<HTMLElement, ButtonProps>(function Button(\n\t{\n\t\tvariant = \"outline\",\n\t\tsize = \"md\",\n\t\ticonLeft,\n\t\ticonRight,\n\t\ttrailing,\n\t\tloading = false,\n\t\tdisabled,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst config = variantConfig[variant]\n\tconst s = sizeStyles[size]\n\tconst isIconOnly = !children && !iconRight\n\tconst sizeClass = isIconOnly\n\t\t? cn(s.height, s.icon)\n\t\t: cn(s.height, s.padding, \"w-fit\")\n\n\treturn (\n\t\t<BaseButton\n\t\t\tref={ref}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/btn relative inline-flex min-w-fit cursor-pointer items-center justify-center\",\n\t\t\t\t\"rounded-bruv-md text-bruv-base whitespace-pre select-none\",\n\t\t\t\t\"ring-bruv-focus outline-none focus-visible:ring-2 focus-visible:ring-offset-2 \",\n\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\tconfig.text,\n\t\t\t\tsizeClass,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{/* Hover/bg layer */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute rounded-[inherit]\",\n\t\t\t\t\tconfig.bg,\n\t\t\t\t\tconfig.bgClassName,\n\t\t\t\t\tconfig.active ? \"opacity-100 inset-0\" : \"opacity-0 inset-1\",\n\t\t\t\t\t!disabled && [\n\t\t\t\t\t\t\"transition-[inset,opacity,background-color] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\t\"group-hover/btn:inset-0 group-hover/btn:opacity-100\",\n\t\t\t\t\t\t\"group-active/btn:inset-px\",\n\t\t\t\t\t],\n\t\t\t\t)}\n\t\t\t/>\n\n\t\t\t{iconLeft && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] size-5 shrink-0 flex items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\tloading && \"opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{iconLeft}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{children && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] inline\",\n\t\t\t\t\t\ts.textPadding,\n\t\t\t\t\t\tloading && \"opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{trailing && (\n\t\t\t\t<span className={cn(\"relative z-[1] ml-3\", loading && \"opacity-0\")}>\n\t\t\t\t\t{trailing}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{iconRight && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] size-5 shrink-0 flex items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\tloading && \"opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{iconRight}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{loading && (\n\t\t\t\t<span className=\"absolute inset-0 z-[2] flex items-center justify-center\">\n\t\t\t\t\t<Spinner showDots={false} size=\"sm\" />\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</BaseButton>\n\t)\n})\n","import { forwardRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { PixelSpinner } from \"./pixel-spinner\"\nimport type { PixelSpinnerVariant } from \"./pixel-spinner\"\n\nexport interface SpinnerProps {\n\t/** Text label shown next to the spinner. */\n\tlabel?: string\n\t/** Show the animated dots after the label. */\n\tshowDots?: boolean\n\t/** Show the pixel spinner glyph. */\n\tshowSpinner?: boolean\n\t/** Size variant. */\n\tsize?: \"sm\" | \"md\"\n\t/** Animation variant for the pixel spinner. Defaults to `wave`. */\n\tvariant?: PixelSpinnerVariant\n\tclassName?: string\n}\n\nconst spinnerPxBySize = {\n\tsm: 10,\n\tmd: 12,\n} as const\n\n/**\n * Text loading indicator with a 3x3 pixel spinner and animated dots.\n *\n * Uses `PixelSpinner` for the animated glyph and a CSS animation to cycle\n * an animated dots suffix on the label text.\n */\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(\n\tfunction Spinner(\n\t\t{\n\t\t\tlabel,\n\t\t\tshowDots = true,\n\t\t\tshowSpinner = true,\n\t\t\tsize = \"md\",\n\t\t\tvariant = \"wave\",\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst textSize = size === \"sm\" ? \"text-bruv-sm\" : \"text-[13px]\"\n\t\tconst spinnerPx = spinnerPxBySize[size]\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"inline-flex items-center gap-1.5\", className)}\n\t\t\t>\n\t\t\t\t{showSpinner && (\n\t\t\t\t\t<PixelSpinner variant={variant} size={spinnerPx} duration={1.2} />\n\t\t\t\t)}\n\t\t\t\t{label && (\n\t\t\t\t\t<span className={cn(\"text-current\", textSize)}>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\t{showDots && (\n\t\t\t\t\t\t\t<span className=\"after:animate-bruv-dot-cycle inline-block w-[2ch] text-left after:content-['.']\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t)\n\t},\n)\n","import { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// 3x3 Pixel Spinner\n//\n// A square pixel spinner with multiple animation variants. All 9 cells are\n// animated — the variant determines the pattern.\n//\n// Grid position indices:\n// 0 1 2\n// 3 4 5\n// 6 7 8\n// ---------------------------------------------------------------------------\n\n/**\n * Perimeter ring (clockwise from top-left), excluding center (4).\n * Used by variants that rotate around the edge.\n */\nconst RING_ORDER = [0, 1, 2, 5, 8, 7, 6, 3] as const\n\n/**\n * Diagonal sweep order (top-left to bottom-right, anti-diagonal lines).\n * Cells on the same anti-diagonal share the same index.\n * 0: top-left only\n * 1: anti-diagonal through (0,1) & (1,0)\n * ...\n * 4: bottom-right only\n */\nconst DIAGONAL_INDEX = [0, 1, 2, 1, 2, 3, 2, 3, 4] as const\n\nexport type PixelSpinnerVariant =\n\t/** One dim cell rotates around a bright ring; center bright */\n\t| \"hole\"\n\t/** Trail of 5 fading cells chases around the ring; center dim */\n\t| \"trail\"\n\t/** Diagonal wave sweeps from top-left to bottom-right */\n\t| \"wave\"\n\t/** Rings expand outward: center to middle to corners, repeating */\n\t| \"radiate\"\n\t/** All cells pulse together */\n\t| \"pulse\"\n\t/** All cells flicker independently (TV static) */\n\t| \"static\"\n\nexport type PixelSpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\"\n\nconst sizeMap: Record<PixelSpinnerSize, number> = {\n\txs: 10,\n\tsm: 14,\n\tmd: 20,\n\tlg: 32,\n}\n\nexport interface PixelSpinnerProps {\n\t/** Animation variant */\n\tvariant?: PixelSpinnerVariant\n\t/**\n\t * Size preset or raw px value.\n\t * Presets: `xs` = 10px, `sm` = 14px, `md` = 20px, `lg` = 32px.\n\t * Default is `xs`.\n\t */\n\tsize?: PixelSpinnerSize | number\n\t/** Gap between pixels as a fraction of pixel size (0-1). Default 0.25. */\n\tgap?: number\n\t/** Cycle duration in seconds. Default 1.2. */\n\tduration?: number\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Keyframe injection — done once per page, shared across all spinners\n// ---------------------------------------------------------------------------\n\nlet styleInjected = false\nfunction injectKeyframes() {\n\tif (styleInjected) return\n\tif (typeof document === \"undefined\") return\n\n\tconst css = `\n@keyframes pxs-ring-on {\n 0% { opacity: var(--hi); }\n 12.5%, 100% { opacity: var(--lo); }\n}\n@keyframes pxs-ring-off {\n 0% { opacity: var(--lo); }\n 12.5%, 100% { opacity: var(--hi); }\n}\n@keyframes pxs-trail-5 {\n 0% { opacity: var(--hi); }\n 12.5% { opacity: 0.75; }\n 25% { opacity: var(--mid); }\n 37.5% { opacity: 0.25; }\n 50% { opacity: var(--lo); }\n 100% { opacity: var(--lo); }\n}\n@keyframes pxs-wave {\n 0%, 100% { opacity: var(--lo); }\n 40%, 60% { opacity: var(--hi); }\n}\n@keyframes pxs-radiate {\n 0%, 100% { opacity: var(--lo); }\n 20%, 40% { opacity: var(--hi); }\n}\n@keyframes pxs-pulse {\n 0%, 100% { opacity: var(--lo); }\n 50% { opacity: var(--hi); }\n}\n@keyframes pxs-flicker-a { 0%, 100% { opacity: var(--hi); } 33% { opacity: var(--lo); } 66% { opacity: var(--mid); } }\n@keyframes pxs-flicker-b { 0%, 100% { opacity: var(--lo); } 25% { opacity: var(--hi); } 75% { opacity: var(--mid); } }\n@keyframes pxs-flicker-c { 0%, 100% { opacity: var(--mid); } 40% { opacity: var(--hi); } 80% { opacity: var(--lo); } }\n@media (prefers-reduced-motion: reduce) {\n .pxs-cell { animation: none !important; opacity: var(--mid) !important; }\n}\n`\n\tconst style = document.createElement(\"style\")\n\tstyle.setAttribute(\"data-pxs\", \"\")\n\tstyle.textContent = css\n\tdocument.head.appendChild(style)\n\tstyleInjected = true\n}\n\n// ---------------------------------------------------------------------------\n// Per-cell animation resolution\n// ---------------------------------------------------------------------------\n\n/** Returns a CSS `animation` shorthand for the given cell and variant. */\nfunction getCellAnim(\n\tvariant: PixelSpinnerVariant,\n\tcellIndex: number,\n\tduration: number,\n): string | null {\n\tconst d = `${duration}s`\n\n\tswitch (variant) {\n\t\tcase \"hole\": {\n\t\t\t// Center stays bright, perimeter cells take turns being dim\n\t\t\tif (cellIndex === 4) return null\n\t\t\tconst ringIndex = RING_ORDER.indexOf(\n\t\t\t\tcellIndex as 0 | 1 | 2 | 3 | 5 | 6 | 7 | 8,\n\t\t\t)\n\t\t\tconst delay = -(ringIndex / 8) * duration\n\t\t\treturn `pxs-ring-off ${d} ${delay.toFixed(3)}s steps(1) infinite`\n\t\t}\n\t\tcase \"trail\": {\n\t\t\t// Trail of 5 cells chases around the ring\n\t\t\tif (cellIndex === 4) return null\n\t\t\tconst ringIndex = RING_ORDER.indexOf(\n\t\t\t\tcellIndex as 0 | 1 | 2 | 3 | 5 | 6 | 7 | 8,\n\t\t\t)\n\t\t\tconst delay = -(ringIndex / 8) * duration\n\t\t\treturn `pxs-trail-5 ${d} ${delay.toFixed(3)}s linear infinite`\n\t\t}\n\t\tcase \"wave\": {\n\t\t\t// Anti-diagonal sweep: each diagonal peaks at a different time\n\t\t\tconst diag = DIAGONAL_INDEX[cellIndex] ?? 0\n\t\t\t// 5 diagonals → stagger across 80% of the cycle, 20% gap between sweeps\n\t\t\tconst delay = -(diag / 5) * duration\n\t\t\treturn `pxs-wave ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t\tcase \"radiate\": {\n\t\t\t// Center → middle cross (not in 3x3 so we use edges: 1,3,5,7) → corners (0,2,6,8)\n\t\t\tconst ringTier =\n\t\t\t\tcellIndex === 4 ? 0 : [1, 3, 5, 7].includes(cellIndex) ? 1 : 2\n\t\t\tconst delay = -(ringTier / 3) * duration\n\t\t\treturn `pxs-radiate ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t\tcase \"pulse\": {\n\t\t\t// Subtle stagger so the pulse has a gentle ripple\n\t\t\tconst delay = -(cellIndex / 9) * duration * 0.3\n\t\t\treturn `pxs-pulse ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t\tcase \"static\": {\n\t\t\tconst anims = [\"pxs-flicker-a\", \"pxs-flicker-b\", \"pxs-flicker-c\"]\n\t\t\tconst anim = anims[cellIndex % 3]\n\t\t\tconst delay = -((cellIndex * 0.17) % 1) * duration\n\t\t\treturn `${anim} ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t}\n}\n\n/** Returns the resting opacity for a non-animated cell in a given variant. */\nfunction getRestOpacity(\n\tvariant: PixelSpinnerVariant,\n\tcellIndex: number,\n): number {\n\t// Only hole/trail have a non-animated center\n\tif (cellIndex !== 4) return 0\n\tif (variant === \"hole\") return 1 // bright center\n\tif (variant === \"trail\") return 0 // invisible center\n\treturn 0\n}\n\n// ---------------------------------------------------------------------------\n// PixelSpinner\n// ---------------------------------------------------------------------------\n\n/**\n * A 3x3 pixel-grid spinner with configurable animation variants.\n *\n * All 9 cells render; the `variant` controls how they animate:\n *\n * - `hole` One dim cell rotates around a bright ring (center bright)\n * - `trail` A fading 5-cell trail chases around the ring\n * - `wave` Anti-diagonal wave sweeps top-left to bottom-right\n * - `radiate` Rings expand outward: center to edges to corners\n * - `pulse` All cells breathe together with a subtle ripple\n * - `static` Cells flicker independently (TV static)\n */\nexport function PixelSpinner({\n\tvariant = \"wave\",\n\tsize = \"xs\",\n\tgap = 0.25,\n\tduration = 1.2,\n\tclassName,\n}: PixelSpinnerProps) {\n\tif (typeof document !== \"undefined\") injectKeyframes()\n\n\tconst px = typeof size === \"number\" ? size : sizeMap[size]\n\n\t// Compute pixel + gap layout\n\t// Total size = 3 * pixel + 2 * (pixel * gap), so pixel = px / (3 + 2*gap)\n\tconst pixel = px / (3 + 2 * gap)\n\tconst step = pixel * (1 + gap)\n\n\tconst cells = Array.from({ length: 9 }, (_, i) => ({\n\t\trow: Math.floor(i / 3),\n\t\tcol: i % 3,\n\t\tcellIndex: i,\n\t}))\n\n\treturn (\n\t\t<span\n\t\t\taria-label=\"Loading\"\n\t\t\trole=\"status\"\n\t\t\tclassName={cn(\"inline-block text-current\", className)}\n\t\t\tstyle={{\n\t\t\t\twidth: px,\n\t\t\t\theight: px,\n\t\t\t\t// CSS vars consumed by the keyframes\n\t\t\t\t[\"--lo\" as string]: \"0\",\n\t\t\t\t[\"--mid\" as string]: \"0.5\",\n\t\t\t\t[\"--hi\" as string]: \"1\",\n\t\t\t}}\n\t\t>\n\t\t\t<svg\n\t\t\t\twidth={px}\n\t\t\t\theight={px}\n\t\t\t\tviewBox={`0 0 ${px} ${px}`}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t{cells.map(({ row, col, cellIndex }) => {\n\t\t\t\t\tconst anim = getCellAnim(variant, cellIndex, duration)\n\t\t\t\t\tconst restOpacity = getRestOpacity(variant, cellIndex)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tkey={cellIndex}\n\t\t\t\t\t\t\tclassName=\"pxs-cell\"\n\t\t\t\t\t\t\tx={col * step}\n\t\t\t\t\t\t\ty={row * step}\n\t\t\t\t\t\t\twidth={pixel}\n\t\t\t\t\t\t\theight={pixel}\n\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\topacity: restOpacity,\n\t\t\t\t\t\t\t\tanimation: anim ?? \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</svg>\n\t\t</span>\n\t)\n}\n","import { forwardRef, type ReactNode, type ComponentProps } from \"react\"\nimport { MagnifyingGlassIcon, CheckIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Menu.Panel — Popup container\n// ---------------------------------------------------------------------------\n\nexport interface MenuPanelProps extends ComponentProps<\"div\"> {\n\t/** Minimum width utility class */\n\tminWidth?: string\n}\n\nconst MenuPanel = forwardRef<HTMLDivElement, MenuPanelProps>(function MenuPanel(\n\t{ minWidth, className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col overflow-hidden bg-bruv-base-2 border border-bruv-neutral rounded-bruv-lg shadow-md p-1\",\n\t\t\t\tminWidth,\n\t\t\t\t// Animation (works with Base UI data attributes)\n\t\t\t\t\"origin-[var(--transform-origin)] will-change-[transform,opacity]\",\n\t\t\t\t\"transition-[transform,scale,opacity] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\"data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0\",\n\t\t\t\t\"data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0 data-[ending-style]:duration-150\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Menu.Item — Option row with hover overlay + press squish\n// ---------------------------------------------------------------------------\n\nexport interface MenuItemProps extends ComponentProps<\"div\"> {\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\t/** Indicator element rendered after the label (e.g. checkmark) */\n\tindicator?: ReactNode\n\t/** Danger styling (red text) */\n\tvariant?: \"default\" | \"danger\"\n}\n\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(function MenuItem(\n\t{ icon, indicator, variant = \"default\", className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center gap-2 px-2 py-1.5 text-bruv-base cursor-pointer rounded-bruv-sm select-none outline-none\",\n\t\t\t\tvariant === \"danger\"\n\t\t\t\t\t? \"text-bruv-danger data-[highlighted]:text-bruv-danger\"\n\t\t\t\t\t: \"text-bruv-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{/* Hover + press overlay */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute inset-0 rounded-[inherit] bg-bruv-subtle opacity-0\",\n\t\t\t\t\t// Base UI Menu + Combobox\n\t\t\t\t\t\"group-data-[highlighted]:opacity-100\",\n\t\t\t\t\t// Base UI Select\n\t\t\t\t\t\"group-data-[selected]:opacity-100\",\n\t\t\t\t\t// cmdk\n\t\t\t\t\t\"group-data-[selected=true]:opacity-100\",\n\t\t\t\t\t// Squish on press\n\t\t\t\t\t\"transition-[inset] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\"group-active:inset-px\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{icon && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\tvariant === \"danger\"\n\t\t\t\t\t\t\t? \"text-bruv-danger\"\n\t\t\t\t\t\t\t: \"text-bruv-tertiary group-data-[highlighted]:text-bruv-primary group-data-[selected]:text-bruv-primary group-data-[selected=true]:text-bruv-primary\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{icon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{children}\n\t\t\t{indicator && (\n\t\t\t\t<span className=\"text-bruv-accent relative z-[1] ml-auto [&>svg]:size-4\">\n\t\t\t\t\t{indicator}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Menu.ItemIndicator — Checkmark icon for selected items\n// ---------------------------------------------------------------------------\n\nexport interface MenuItemIndicatorProps {\n\tclassName?: string\n}\n\nconst MenuItemIndicator = forwardRef<HTMLSpanElement, MenuItemIndicatorProps>(\n\tfunction MenuItemIndicator({ className }, ref) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative z-[1] ml-auto text-bruv-secondary [&>svg]:size-4\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CheckIcon />\n\t\t\t</span>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.List — Scrollable list container\n// ---------------------------------------------------------------------------\n\nexport interface MenuListProps extends ComponentProps<\"div\"> {}\n\nconst MenuList = forwardRef<HTMLDivElement, MenuListProps>(function MenuList(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex max-h-[min(var(--available-height),280px)] flex-col gap-0.5 overflow-y-auto overscroll-contain outline-none\",\n\t\t\t\t\"[scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Menu.Separator — Divider line\n// ---------------------------------------------------------------------------\n\nexport interface MenuSeparatorProps extends ComponentProps<\"div\"> {}\n\nconst MenuSeparator = forwardRef<HTMLDivElement, MenuSeparatorProps>(\n\tfunction MenuSeparator({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"my-1 border-t border-bruv-neutral\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.GroupLabel — Section heading\n// ---------------------------------------------------------------------------\n\nexport interface MenuGroupLabelProps extends ComponentProps<\"div\"> {}\n\nconst MenuGroupLabel = forwardRef<HTMLDivElement, MenuGroupLabelProps>(\n\tfunction MenuGroupLabel({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"px-2 py-1.5 text-bruv-sm font-medium text-bruv-tertiary select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.Positioner — z-index wrapper\n// ---------------------------------------------------------------------------\n\nexport interface MenuPositionerProps extends ComponentProps<\"div\"> {}\n\nconst MenuPositioner = forwardRef<HTMLDivElement, MenuPositionerProps>(\n\tfunction MenuPositioner({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"z-50 outline-none\", className)} {...props}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.SearchInput — Search field container (icon + input slot)\n// ---------------------------------------------------------------------------\n\nexport interface MenuSearchInputProps extends ComponentProps<\"div\"> {}\n\nconst MenuSearchInput = forwardRef<HTMLDivElement, MenuSearchInputProps>(\n\tfunction MenuSearchInput({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"mb-0.5 flex items-center gap-2 rounded-bruv-sm px-2 py-1.5\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<MagnifyingGlassIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.Empty — Empty state message\n// ---------------------------------------------------------------------------\n\nexport interface MenuEmptyProps extends ComponentProps<\"div\"> {}\n\nconst MenuEmpty = forwardRef<HTMLDivElement, MenuEmptyProps>(function MenuEmpty(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"text-bruv-secondary px-2 py-4 text-center text-bruv-base empty:hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Menu = {\n\tPanel: MenuPanel,\n\tItem: MenuItem,\n\tItemIndicator: MenuItemIndicator,\n\tList: MenuList,\n\tSeparator: MenuSeparator,\n\tGroupLabel: MenuGroupLabel,\n\tPositioner: MenuPositioner,\n\tSearchInput: MenuSearchInput,\n\tEmpty: MenuEmpty,\n}\n","import { forwardRef, type ComponentPropsWithoutRef } from \"react\"\nimport { Switch } from \"@base-ui/react/switch\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: { track: \"w-9 h-5\", thumb: \"h-4 w-4 group-active/toggle:w-5\" },\n\tmd: { track: \"w-11 h-6\", thumb: \"h-5 w-5 group-active/toggle:w-6\" },\n} as const\n\nexport type ToggleSize = keyof typeof sizeStyles\n\nexport interface ToggleProps extends ComponentPropsWithoutRef<\n\ttypeof Switch.Root\n> {\n\t/** Size of the toggle. */\n\tsize?: ToggleSize\n}\n\n/**\n * Toggle switch component built on Base UI Switch with Tailwind CSS styling.\n */\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(\n\tfunction Toggle(\n\t\t{\n\t\t\tchecked,\n\t\t\tdefaultChecked,\n\t\t\tonCheckedChange,\n\t\t\tdisabled,\n\t\t\tsize = \"md\",\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\n\t\treturn (\n\t\t\t<Switch.Root\n\t\t\t\tref={ref}\n\t\t\t\tchecked={checked}\n\t\t\t\tdefaultChecked={defaultChecked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/toggle relative inline-flex shrink-0 cursor-pointer items-center rounded-full\",\n\t\t\t\t\t\"bg-bruv-subtle data-[checked]:bg-bruv-accent\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"transition-colors duration-150 ease-bruv-out-expo\",\n\t\t\t\t\tdisabled && \"opacity-50 pointer-events-none\",\n\t\t\t\t\ts.track,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<Switch.Thumb\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"block rounded-full bg-bruv-accent-on shadow-sm\",\n\t\t\t\t\t\t\"translate-x-0.5 transition-all duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\tsize === \"sm\" &&\n\t\t\t\t\t\t\t\"data-[checked]:translate-x-[18px] data-[checked]:group-active/toggle:translate-x-[14px]\",\n\t\t\t\t\t\tsize === \"md\" &&\n\t\t\t\t\t\t\t\"data-[checked]:translate-x-[22px] data-[checked]:group-active/toggle:translate-x-[18px]\",\n\t\t\t\t\t\ts.thumb,\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</Switch.Root>\n\t\t)\n\t},\n)\n","import {\n\tforwardRef,\n\ttype ComponentPropsWithoutRef,\n\ttype ReactNode,\n} from \"react\"\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\"\nimport { CheckIcon, MinusIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: { root: \"size-4 rounded-[4px]\", icon: \"size-3\", label: \"text-bruv-sm\" },\n\tmd: {\n\t\troot: \"size-[18px] rounded-[5px]\",\n\t\ticon: \"size-3.5\",\n\t\tlabel: \"text-bruv-base\",\n\t},\n} as const\n\nexport type CheckboxSize = keyof typeof sizeStyles\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxProps extends ComponentPropsWithoutRef<\n\ttypeof BaseCheckbox.Root\n> {\n\t/** Size of the checkbox. */\n\tsize?: CheckboxSize\n\t/** Optional label rendered beside the checkbox. */\n\tlabel?: ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// Checkbox\n// ---------------------------------------------------------------------------\n\n/**\n * Checkbox component built on Base UI Checkbox with Tailwind CSS styling.\n *\n * Supports controlled/uncontrolled usage, indeterminate state, disabled\n * state, and an optional label. The label is clickable and toggles the\n * checkbox. An expanded hit area (32px) makes the checkbox easier to click.\n *\n * Checked state uses accent color. Indeterminate state uses neutral gray\n * to visually distinguish it from a deliberate selection.\n */\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n\tfunction Checkbox(\n\t\t{\n\t\t\tchecked,\n\t\t\tdefaultChecked,\n\t\t\tonCheckedChange,\n\t\t\tindeterminate = false,\n\t\t\tdisabled = false,\n\t\t\trequired,\n\t\t\tsize = \"md\",\n\t\t\tlabel,\n\t\t\tname,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\n\t\tconst root = (\n\t\t\t<BaseCheckbox.Root\n\t\t\t\tref={ref}\n\t\t\t\tchecked={checked}\n\t\t\t\tdefaultChecked={defaultChecked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t\tindeterminate={indeterminate}\n\t\t\t\tdisabled={disabled}\n\t\t\t\trequired={required}\n\t\t\t\tname={name}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/checkbox relative inline-flex shrink-0 items-center justify-center\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"transition-colors duration-150 ease-out\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t// Expanded 32px hit area via ::before pseudo-element\n\t\t\t\t\t\"before:absolute before:inset-1/2 before:size-8 before:-translate-1/2\",\n\t\t\t\t\tdisabled\n\t\t\t\t\t\t? \"pointer-events-none cursor-not-allowed border border-bruv-neutral bg-bruv-subtle\"\n\t\t\t\t\t\t: \"cursor-pointer border border-bruv-neutral bg-bruv-base-2 data-[checked]:border-bruv-accent data-[checked]:bg-bruv-accent data-[indeterminate]:border-bruv-neutral-strong data-[indeterminate]:bg-bruv-subtle\",\n\t\t\t\t\ts.root,\n\t\t\t\t\t!label && className,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseCheckbox.Indicator\n\t\t\t\t\tkeepMounted\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t? \"text-bruv-tertiary\"\n\t\t\t\t\t\t\t: \"data-[checked]:text-bruv-accent-on data-[indeterminate]:text-bruv-secondary\",\n\t\t\t\t\t\t// Default visible state for checked/indeterminate\n\t\t\t\t\t\t\"scale-100 opacity-100\",\n\t\t\t\t\t\t// Hidden while unchecked (stable state, no transition running)\n\t\t\t\t\t\t\"data-[unchecked]:scale-50 data-[unchecked]:opacity-0\",\n\t\t\t\t\t\t// Briefly applied by Base UI during enter/exit so the\n\t\t\t\t\t\t// transition has a start/end point.\n\t\t\t\t\t\t\"data-[starting-style]:scale-50 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-50 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t\"transition-[scale,opacity] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{indeterminate ? (\n\t\t\t\t\t\t<MinusIcon className={s.icon} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<CheckIcon className={s.icon} />\n\t\t\t\t\t)}\n\t\t\t\t</BaseCheckbox.Indicator>\n\t\t\t</BaseCheckbox.Root>\n\t\t)\n\n\t\tif (!label) return root\n\n\t\treturn (\n\t\t\t<label\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center gap-2 select-none\",\n\t\t\t\t\tdisabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{root}\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\ts.label,\n\t\t\t\t\t\tdisabled ? \"text-bruv-tertiary\" : \"text-bruv-primary\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t)\n\t},\n)\n","import { forwardRef, useState } from \"react\"\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\"\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: \"size-6\",\n\tmd: \"size-7\",\n} as const\n\nexport type ColorPickerSize = keyof typeof sizeStyles\n\nexport interface ColorPickerOption {\n\treadonly value: string\n\treadonly label: string\n\treadonly color: string\n}\n\nexport interface ColorPickerProps {\n\treadonly options: readonly ColorPickerOption[]\n\treadonly label?: string\n\treadonly value?: string\n\treadonly defaultValue?: string\n\treadonly onValueChange?: (value: string) => void\n\treadonly size?: ColorPickerSize\n\treadonly className?: string\n\treadonly disabled?: boolean\n\treadonly \"aria-label\"?: string\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(\n\tfunction ColorPicker(\n\t\t{\n\t\t\toptions,\n\t\t\tlabel,\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\tsize = \"md\",\n\t\t\tclassName,\n\t\t\tdisabled,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internalValue, setInternalValue] = useState(\n\t\t\t() => defaultValue ?? options[0]?.value ?? \"\",\n\t\t)\n\t\tconst isControlled = controlledValue !== undefined\n\t\tconst activeValue = isControlled ? controlledValue : internalValue\n\t\tconst groupLabel = label ?? ariaLabel\n\n\t\tfunction handleValueChange(next: string) {\n\t\t\tif (!isControlled) setInternalValue(next)\n\t\t\tonValueChange?.(next)\n\t\t}\n\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex flex-col gap-2\", className)}>\n\t\t\t\t{label ? (\n\t\t\t\t\t<span className=\"text-bruv-secondary text-bruv-sm font-medium\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t\t<BaseRadioGroup\n\t\t\t\t\tvalue={activeValue}\n\t\t\t\t\tonValueChange={handleValueChange}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\taria-label={groupLabel}\n\t\t\t\t\tclassName=\"flex flex-wrap gap-2\"\n\t\t\t\t>\n\t\t\t\t\t{options.map(option => (\n\t\t\t\t\t\t<BaseRadio.Root\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\taria-label={option.label}\n\t\t\t\t\t\t\ttitle={option.label}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\t\t\t\t\"shrink-0 cursor-pointer rounded-full outline-none transition-shadow\",\n\t\t\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bruv-base-1\",\n\t\t\t\t\t\t\t\t\"ring-1 ring-bruv-neutral hover:ring-bruv-neutral-strong\",\n\t\t\t\t\t\t\t\t\"data-[checked]:ring-2 data-[checked]:ring-bruv-inverse data-[checked]:ring-offset-2 data-[checked]:ring-offset-bruv-base-1\",\n\t\t\t\t\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ backgroundColor: option.color }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</BaseRadioGroup>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst variantStyles = {\n\tdefault: \"bg-bruv-base-1 rounded-bruv-lg shadow-xs ring-1 ring-bruv-neutral\",\n\tnested:\n\t\t\"bg-bruv-base-2 rounded-bruv-sm shadow-sm ring-1 ring-bruv-neutral/50\",\n} as const\n\nexport type CardVariant = keyof typeof variantStyles\n\nexport interface CardProps {\n\t/** Visual style variant */\n\tvariant?: CardVariant\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardContentProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardHeaderProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardBodyProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardSectionProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Inner wrapper that provides consistent padding inside a Card.\n * Put Card.Header, Card.Body, nested Cards, etc. inside this.\n */\nconst CardContent = forwardRef<HTMLDivElement, CardContentProps>(\n\tfunction CardContent({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex flex-col gap-1 p-1\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nconst CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(\n\tfunction CardHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"px-4 py-3\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nconst CardBody = forwardRef<HTMLDivElement, CardBodyProps>(function CardBody(\n\t{ className, children },\n\tref,\n) {\n\treturn (\n\t\t<div ref={ref} className={cn(\"p-4\", className)}>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\nconst CardSection = forwardRef<HTMLDivElement, CardSectionProps>(\n\tfunction CardSection({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-b border-bruv-neutral last:border-b-0 p-4\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n/**\n * Card compound component.\n *\n * Use Card.Content as the first child to get consistent inner padding,\n * then place Card.Header, Card.Body, Card.Section, or nested Cards inside it.\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n\t{ variant = \"default\", className, children },\n\tref,\n) {\n\treturn (\n\t\t<div ref={ref} className={cn(variantStyles[variant], className)}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}) as ReturnType<typeof forwardRef<HTMLDivElement, CardProps>> & {\n\tContent: typeof CardContent\n\tHeader: typeof CardHeader\n\tBody: typeof CardBody\n\tSection: typeof CardSection\n}\n\nCard.Content = CardContent\nCard.Header = CardHeader\nCard.Body = CardBody\nCard.Section = CardSection\n","import type { ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Hover, HoverGroup } from \"../hover\"\n\nconst sizeStyles = {\n\tsm: \"h-7 px-1.5\",\n\tmd: \"h-8 px-1.5\",\n} as const\n\nexport type NavLinkSize = keyof typeof sizeStyles\n\nexport interface NavLinksProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface NavLinkProps {\n\t/** Whether this link is the currently active/selected item */\n\tactive?: boolean\n\t/** Optional icon rendered before the label */\n\ticon?: ReactNode\n\t/** When provided, renders an <a> tag instead of <button> */\n\thref?: string\n\t/** Click handler */\n\tonClick?: () => void\n\t/** Size of the nav link */\n\tsize?: NavLinkSize\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Container for a horizontal group of navigation links.\n *\n * Wraps children in a HoverGroup so the sliding indicator\n * is shared across all NavLink items.\n */\nexport function NavLinks({ className, children }: NavLinksProps) {\n\treturn (\n\t\t<HoverGroup\n\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\tclassName={cn(\"gap-1 p-2 flex-nowrap\", className)}\n\t\t>\n\t\t\t{children}\n\t\t</HoverGroup>\n\t)\n}\n\n/**\n * Individual navigation link item.\n *\n * Inside a NavLinks (HoverGroup), automatically gets the shared sliding\n * indicator on hover and a press shrink effect on click.\n * Renders a `<button>` by default - when `href` is provided,\n * renders an `<a>` tag instead.\n */\nexport function NavLink({\n\tactive = false,\n\ticon,\n\thref,\n\tonClick,\n\tsize = \"md\",\n\tclassName,\n\tchildren,\n}: NavLinkProps) {\n\tconst Tag = href ? \"a\" : \"button\"\n\tconst tagProps = href\n\t\t? { href, onClick }\n\t\t: { type: \"button\" as const, onClick }\n\n\treturn (\n\t\t<Hover active={active} background=\"bg-bruv-subtle\" className={className}>\n\t\t\t<Tag\n\t\t\t\t{...tagProps}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center text-bruv-base font-medium cursor-pointer select-none whitespace-nowrap\",\n\t\t\t\t\t\"outline-none\",\n\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\tactive ? \"text-bruv-primary\" : \"text-bruv-secondary\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className=\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"px-1\">{children}</span>\n\t\t\t</Tag>\n\t\t</Hover>\n\t)\n}\n","import { forwardRef, type ComponentType, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Avatar } from \"../avatar\"\nimport {\n\tBreadcrumb,\n\ttype BreadcrumbItem,\n\ttype BreadcrumbOption,\n} from \"../breadcrumb\"\n\n// Generic link component type — accepts `to` or `href` + children + className\ntype LinkComponent = ComponentType<{\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}>\n\nfunction DefaultLink({\n\tto,\n\thref,\n\tclassName,\n\tchildren,\n}: {\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}) {\n\treturn (\n\t\t<a href={to ?? href} className={className}>\n\t\t\t{children}\n\t\t</a>\n\t)\n}\n\nexport interface AppHeaderProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/** @deprecated Use BreadcrumbOption instead */\nexport type AppHeaderBreadcrumbOption = BreadcrumbOption\n\n/** @deprecated Use BreadcrumbItem instead */\nexport type AppHeaderBreadcrumbItem = BreadcrumbItem\n\nexport interface AppHeaderBreadcrumbProps {\n\titems: BreadcrumbItem[]\n\t/** Optional leading logo/mark rendered before the first breadcrumb segment. */\n\tlogo?: ReactNode\n\t/** Optional href the logo links to. Defaults to \"/\". */\n\tlogoHref?: string\n\t/** Custom link component (e.g. TanStack Router's Link, Next.js Link, etc.). Defaults to <a>. */\n\tlinkComponent?: LinkComponent\n\tclassName?: string\n}\n\nexport interface AppHeaderActionsProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\nfunction Separator() {\n\treturn (\n\t\t<div className=\"flex w-4 shrink-0 items-center justify-center self-stretch\">\n\t\t\t<div className=\"bg-bruv-tertiary h-4 w-px rotate-[20deg] opacity-50\" />\n\t\t</div>\n\t)\n}\n\n/**\n * AppHeader breadcrumb — optionally renders a leading logo link followed by\n * breadcrumb segments. Delegates to the standalone Breadcrumb component for\n * segment rendering.\n */\nfunction AppHeaderBreadcrumb({\n\titems,\n\tlogo,\n\tlogoHref = \"/\",\n\tlinkComponent: LinkEl = DefaultLink,\n\tclassName,\n}: AppHeaderBreadcrumbProps) {\n\treturn (\n\t\t<nav className={cn(\"flex items-center\", className)}>\n\t\t\t{logo && (\n\t\t\t\t<>\n\t\t\t\t\t<LinkEl\n\t\t\t\t\t\tto={logoHref}\n\t\t\t\t\t\thref={logoHref}\n\t\t\t\t\t\tclassName=\"focus-visible:ring-bruv-focus flex size-8 shrink-0 items-center justify-center rounded outline-none focus-visible:ring-2 focus-visible:ring-offset-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{logo}\n\t\t\t\t\t</LinkEl>\n\t\t\t\t\t<Separator />\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t<Breadcrumb items={items} linkComponent={LinkEl} />\n\t\t</nav>\n\t)\n}\n\nconst AppHeaderActions = forwardRef<HTMLDivElement, AppHeaderActionsProps>(\n\tfunction AppHeaderActions({ children, className }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex items-center gap-2\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport const AppHeader = forwardRef<HTMLElement, AppHeaderProps>(\n\tfunction AppHeader({ children, className }, ref) {\n\t\treturn (\n\t\t\t<header\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex items-center justify-between px-3 py-2\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</header>\n\t\t)\n\t},\n) as ReturnType<typeof forwardRef<HTMLElement, AppHeaderProps>> & {\n\tBreadcrumb: typeof AppHeaderBreadcrumb\n\tActions: typeof AppHeaderActions\n\tAvatar: typeof Avatar\n}\n\nAppHeader.Breadcrumb = AppHeaderBreadcrumb\nAppHeader.Actions = AppHeaderActions\nAppHeader.Avatar = Avatar\n","import { forwardRef, useMemo } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type AvatarVariant = \"circle\" | \"square\"\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\nexport type AvatarColor = \"neutral\" | \"accent\" | \"danger\" | \"warn\" | \"success\"\n\nexport type AvatarGenerativePattern =\n\t| \"grid\"\n\t| \"symmetric\"\n\t| \"dense\"\n\t| \"quad\"\n\t| \"quad-dense\"\n\t| \"diagonal\"\n\t| \"sierpinski\"\n\n// ---------------------------------------------------------------------------\n// Style maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\txs: { outer: \"size-5\", text: \"text-[8px]\", px: 20 },\n\tsm: { outer: \"size-6\", text: \"text-[10px]\", px: 24 },\n\tmd: { outer: \"size-8\", text: \"text-bruv-sm\", px: 32 },\n\tlg: { outer: \"size-10\", text: \"text-bruv-base\", px: 40 },\n\txl: { outer: \"size-16\", text: \"text-bruv-lg\", px: 64 },\n} as const\n\nconst variantStyles = {\n\tcircle: \"rounded-full\",\n\tsquare: \"rounded-bruv-md\",\n} as const\n\nconst colorStyles = {\n\tneutral: \"bg-bruv-subtle text-bruv-primary\",\n\taccent: \"bg-bruv-accent text-bruv-accent-on\",\n\tdanger: \"bg-bruv-danger text-bruv-danger-on\",\n\twarn: \"bg-bruv-warn text-bruv-warn-on\",\n\tsuccess: \"bg-bruv-success text-bruv-success-on\",\n} as const\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AvatarProps {\n\t/** Image URL */\n\tsrc?: string\n\t/** Fallback initials (1-2 characters) */\n\tinitials?: string\n\t/**\n\t * Seed string for generative pixel-grid fallback.\n\t * Used when no `src` or `initials` are provided.\n\t * Each seed produces a unique deterministic pattern and color.\n\t */\n\tseed?: string\n\t/**\n\t * Pattern variant for the generative fallback.\n\t * Only used when rendering from `seed`.\n\t */\n\tgenerativePattern?: AvatarGenerativePattern\n\t/** Alt text for the image */\n\talt?: string\n\t/** Shape variant */\n\tvariant?: AvatarVariant\n\t/** Size */\n\tsize?: AvatarSize\n\t/** Color preset — automatically sets matching background and text color */\n\tcolor?: AvatarColor\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Hash function — cyrb53 (53-bit, good distribution)\n// ---------------------------------------------------------------------------\n\nfunction cyrb53(str: string, seed = 0): number {\n\tlet h1 = 0xdeadbeef ^ seed\n\tlet h2 = 0x41c6ce57 ^ seed\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst ch = str.charCodeAt(i)\n\t\th1 = Math.imul(h1 ^ ch, 2654435761)\n\t\th2 = Math.imul(h2 ^ ch, 1597334677)\n\t}\n\th1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507)\n\th1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909)\n\th2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507)\n\th2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909)\n\treturn 4294967296 * (2097151 & h2) + (h1 >>> 0)\n}\n\nfunction hashValues(str: string): number[] {\n\treturn [cyrb53(str, 0), cyrb53(str, 1), cyrb53(str, 2), cyrb53(str, 3)]\n}\n\n// ---------------------------------------------------------------------------\n// Generative pattern grid\n// ---------------------------------------------------------------------------\n\ninterface GridConfig {\n\treadonly cols: number\n\treadonly rows: number\n\treadonly cells: readonly boolean[]\n}\n\n/**\n * Ensures a grid has at least `minFill` fraction of cells turned on.\n * If too sparse, force-enables cells using a secondary hash.\n */\nfunction ensureMinFill(\n\tcells: boolean[],\n\ttotal: number,\n\tminFill: number,\n\thash: number,\n): void {\n\tconst count = cells.filter(Boolean).length\n\tconst needed = Math.ceil(total * minFill)\n\tif (count >= needed) return\n\t// Turn on additional cells deterministically\n\tlet toAdd = needed - count\n\tlet bit = 0\n\tfor (let i = 0; i < total && toAdd > 0; i++) {\n\t\t// Walk cells in hash-scrambled order\n\t\tconst idx = (i * 7 + (hash & 0xf)) % total\n\t\tif (!cells[idx]) {\n\t\t\tcells[idx] = true\n\t\t\ttoAdd--\n\t\t}\n\t\tbit++\n\t}\n}\n\nfunction generateGrid(\n\tseed: string,\n\tpattern: AvatarGenerativePattern,\n): GridConfig {\n\tconst hashes = hashValues(seed)\n\tconst firstHash = hashes[0] ?? 0\n\tconst secondHash = hashes[1] ?? firstHash\n\tconst thirdHash = hashes[2] ?? firstHash\n\tconst hashAt = (index: number) => hashes[index % hashes.length] ?? firstHash\n\n\tswitch (pattern) {\n\t\tcase \"grid\": {\n\t\t\tconst cols = 5\n\t\t\tconst rows = 5\n\t\t\tconst cells: boolean[] = []\n\t\t\tfor (let i = 0; i < cols * rows; i++) {\n\t\t\t\tconst hash = hashAt(Math.floor(i / 26))\n\t\t\t\tcells.push(((hash >> (i % 26)) & 1) === 1)\n\t\t\t}\n\t\t\tensureMinFill(cells, cols * rows, 0.3, thirdHash)\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"symmetric\": {\n\t\t\t// 5x5 mirrored horizontally — generate left half + center, mirror right\n\t\t\tconst cols = 5\n\t\t\tconst rows = 5\n\t\t\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\t\tconst hash = hashAt(attempt)\n\t\t\t\tlet bit = 0\n\t\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\t\tfor (let x = 0; x <= 2; x++) {\n\t\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\t\tbit++\n\t\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fill = cells.filter(Boolean).length / (cols * rows)\n\t\t\t\tif (fill >= 0.3 && fill <= 0.8) return { cols, rows, cells }\n\t\t\t}\n\t\t\t// Fallback\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\tfor (let x = 0; x <= 2; x++) {\n\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"dense\": {\n\t\t\tconst cols = 7\n\t\t\tconst rows = 7\n\t\t\tconst cells: boolean[] = []\n\t\t\tfor (let i = 0; i < cols * rows; i++) {\n\t\t\t\tconst hash = hashAt(Math.floor(i / 26))\n\t\t\t\tcells.push(((hash >> (i % 26)) & 1) === 1)\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"quad\": {\n\t\t\t// 6x6 with 4-way symmetry: generate top-left quadrant, mirror H+V\n\t\t\t// Retry with different hash offsets if too sparse\n\t\t\tconst cols = 6\n\t\t\tconst rows = 6\n\t\t\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\t\tconst hash = hashAt(attempt)\n\t\t\t\tlet bit = 0\n\t\t\t\tfor (let y = 0; y < 3; y++) {\n\t\t\t\t\tfor (let x = 0; x < 3; x++) {\n\t\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\t\tbit++\n\t\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fill = cells.filter(Boolean).length / (cols * rows)\n\t\t\t\tif (fill >= 0.25 && fill <= 0.8) return { cols, rows, cells }\n\t\t\t}\n\t\t\t// Fallback: use first attempt regardless\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y < 3; y++) {\n\t\t\t\tfor (let x = 0; x < 3; x++) {\n\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"quad-dense\": {\n\t\t\t// 7x7 with 4-way symmetry: generate top-left quadrant + center, mirror H+V\n\t\t\tconst cols = 7\n\t\t\tconst rows = 7\n\t\t\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\t\tconst hash = hashAt(attempt)\n\t\t\t\tlet bit = 0\n\t\t\t\tfor (let y = 0; y <= 3; y++) {\n\t\t\t\t\tfor (let x = 0; x <= 3; x++) {\n\t\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\t\tbit++\n\t\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fill = cells.filter(Boolean).length / (cols * rows)\n\t\t\t\tif (fill >= 0.25 && fill <= 0.8) return { cols, rows, cells }\n\t\t\t}\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y <= 3; y++) {\n\t\t\t\tfor (let x = 0; x <= 3; x++) {\n\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"diagonal\": {\n\t\t\t// 6x6 mirrored along main diagonal (top-left to bottom-right)\n\t\t\tconst cols = 6\n\t\t\tconst rows = 6\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tconst hash2 = secondHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\tfor (let x = 0; x <= y; x++) {\n\t\t\t\t\tconst b1 = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tconst b2 = ((hash2 >> (bit % 26)) & 1) === 1\n\t\t\t\t\tconst on = b1 || b2\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[x * cols + y] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"sierpinski\": {\n\t\t\t// 7x7 Sierpinski-triangle-inspired — cell is ON if (row & col) === 0\n\t\t\t// but shifted/rotated by hash bits for variation\n\t\t\tconst cols = 7\n\t\t\tconst rows = 7\n\t\t\tconst hash = firstHash\n\t\t\tconst xOff = hash & 7\n\t\t\tconst yOff = (hash >> 3) & 7\n\t\t\tconst invert = ((hash >> 6) & 1) === 1\n\t\t\tconst cells: boolean[] = []\n\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\tfor (let x = 0; x < cols; x++) {\n\t\t\t\t\tconst sy = (y + yOff) & 7\n\t\t\t\t\tconst sx = (x + xOff) & 7\n\t\t\t\t\tconst on = (sy & sx) === 0\n\t\t\t\t\tcells.push(invert ? !on : on)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Generative color derivation\n//\n// Uses two lightness levels per theme so pixels are visible on the bg.\n// Dark mode: dark tinted bg, medium-bright pixels\n// Light mode: light tinted bg, medium-dark pixels\n// We set CSS custom properties on the SVG so the browser resolves\n// the correct value based on the active theme.\n// ---------------------------------------------------------------------------\n\nfunction deriveHue(seed: string): number {\n\treturn cyrb53(seed, 42) % 360\n}\n\n/** CSS custom properties applied to the SVG root for theme-aware colors */\nfunction colorVars(hue: number): Record<string, string> {\n\treturn {\n\t\t// Pixel color — vibrant, visible on the bg\n\t\t\"--ga-pixel\": `light-dark(oklch(0.55 0.15 ${hue}), oklch(0.7 0.14 ${hue}))`,\n\t\t// Background — subtle tint\n\t\t\"--ga-bg\": `light-dark(oklch(0.92 0.03 ${hue}), oklch(0.25 0.03 ${hue}))`,\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Generative SVG renderer\n// ---------------------------------------------------------------------------\n\nconst GenerativeFallback = forwardRef<\n\tSVGSVGElement,\n\t{\n\t\treadonly seed: string\n\t\treadonly pattern: AvatarGenerativePattern\n\t\treadonly px: number\n\t\treadonly isCircle: boolean\n\t\treadonly className?: string\n\t}\n>(function GenerativeFallback({ seed, pattern, px, isCircle, className }, ref) {\n\tconst { grid, hue } = useMemo(\n\t\t() => ({ grid: generateGrid(seed, pattern), hue: deriveHue(seed) }),\n\t\t[seed, pattern],\n\t)\n\n\tconst { cols, rows, cells } = grid\n\tconst gap = 3\n\tconst padding = pattern === \"dense\" || pattern === \"quad-dense\" ? 3 : 4\n\tconst cellSize = (100 - padding * 2 - gap * (cols - 1)) / cols\n\tconst gridHeight = rows * cellSize + (rows - 1) * gap\n\tconst gridWidth = cols * cellSize + (cols - 1) * gap\n\tconst offsetY = padding + (100 - padding * 2 - gridHeight) / 2\n\tconst offsetX = padding + (100 - padding * 2 - gridWidth) / 2\n\n\tconst opacityHash = cyrb53(seed, 99)\n\tconst cellOpacity = (index: number): number => {\n\t\tconst bits = (opacityHash >> (index % 26)) & 3\n\t\treturn 0.55 + bits * 0.15\n\t}\n\n\t// Unique clip ID to avoid collisions when multiple avatars render\n\tconst clipId = `av-${cyrb53(seed + pattern, 7) >>> 0}`\n\n\tconst vars = colorVars(hue)\n\n\t// Derive per-cell flicker timing from hash for organic randomness\n\tconst flickerHash = cyrb53(seed, 77)\n\tconst cellFlicker = (index: number) => {\n\t\t// Each cell gets a unique duration (1.5-4s) and delay (0-3s)\n\t\tconst bits1 = (flickerHash >> (index % 26)) & 7 // 0-7\n\t\tconst bits2 = (opacityHash >> ((index + 5) % 26)) & 7\n\t\tconst duration = 1.5 + bits1 * 0.35 // 1.5s to 3.95s\n\t\tconst delay = bits2 * 0.4 // 0s to 2.8s\n\t\treturn { duration, delay }\n\t}\n\n\t// Scoped keyframe name\n\tconst animName = `ga-flk-${clipId}`\n\n\t// Use a CSS variable to toggle the animation name.\n\t// Hover: set --ga-anim to the keyframe name → cells flicker.\n\t// Leave: set --ga-anim to \"none\" → animation removed, cells\n\t// transition smoothly back to their base opacity.\n\treturn (\n\t\t<svg\n\t\t\tref={ref}\n\t\t\twidth={px}\n\t\t\theight={px}\n\t\t\tviewBox=\"0 0 100 100\"\n\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\tstyle={{ ...vars, \"--ga-anim\": \"none\" } as React.CSSProperties}\n\t\t\tonMouseEnter={e =>\n\t\t\t\te.currentTarget.style.setProperty(\"--ga-anim\", animName)\n\t\t\t}\n\t\t\tonMouseLeave={e => e.currentTarget.style.setProperty(\"--ga-anim\", \"none\")}\n\t\t\trole=\"img\"\n\t\t\taria-label={`Avatar for ${seed}`}\n\t\t>\n\t\t\t<style>{`\n\t\t\t\t@keyframes ${animName} {\n\t\t\t\t\t0%, 100% { opacity: var(--ga-o); }\n\t\t\t\t\t50% { opacity: calc(var(--ga-o) * 0.25); }\n\t\t\t\t}\n\t\t\t`}</style>\n\n\t\t\t{isCircle ? (\n\t\t\t\t<circle cx={50} cy={50} r={50} fill=\"var(--ga-bg)\" />\n\t\t\t) : (\n\t\t\t\t<rect x={0} y={0} width={100} height={100} rx={8} fill=\"var(--ga-bg)\" />\n\t\t\t)}\n\n\t\t\t<defs>\n\t\t\t\t<clipPath id={clipId}>\n\t\t\t\t\t{isCircle ? (\n\t\t\t\t\t\t<circle cx={50} cy={50} r={50} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<rect x={0} y={0} width={100} height={100} rx={8} />\n\t\t\t\t\t)}\n\t\t\t\t</clipPath>\n\t\t\t</defs>\n\n\t\t\t<g clipPath={`url(#${clipId})`}>\n\t\t\t\t{cells.map((on, i) => {\n\t\t\t\t\tif (!on) return null\n\t\t\t\t\tconst col = i % cols\n\t\t\t\t\tconst row = Math.floor(i / cols)\n\t\t\t\t\tconst opacity = cellOpacity(i)\n\t\t\t\t\tconst { duration, delay } = cellFlicker(i)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tkey={`${col}-${row}`}\n\t\t\t\t\t\t\tx={offsetX + col * (cellSize + gap)}\n\t\t\t\t\t\t\ty={offsetY + row * (cellSize + gap)}\n\t\t\t\t\t\t\twidth={cellSize}\n\t\t\t\t\t\t\theight={cellSize}\n\t\t\t\t\t\t\tfill=\"var(--ga-pixel)\"\n\t\t\t\t\t\t\topacity={opacity}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t[\"--ga-o\" as string]: opacity,\n\t\t\t\t\t\t\t\t[\"animation-name\" as string]: \"var(--ga-anim)\",\n\t\t\t\t\t\t\t\t[\"animation-duration\" as string]: `${duration}s`,\n\t\t\t\t\t\t\t\t[\"animation-timing-function\" as string]: \"ease-in-out\",\n\t\t\t\t\t\t\t\t[\"animation-delay\" as string]: `${delay}s`,\n\t\t\t\t\t\t\t\t[\"animation-iteration-count\" as string]: \"infinite\",\n\t\t\t\t\t\t\t\ttransition: \"opacity 0.6s ease-out\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</g>\n\t\t</svg>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Avatar\n// ---------------------------------------------------------------------------\n\n/**\n * Avatar component with image, initials, or generative pixel-grid fallback.\n *\n * Fallback priority: `src` > `initials` > `seed` (generative) > empty\n *\n * - `circle` variant for users (fully rounded)\n * - `square` variant for organizations/workspaces (rounded corners)\n */\nexport const Avatar = forwardRef<HTMLElement, AvatarProps>(function Avatar(\n\t{\n\t\tsrc,\n\t\tinitials,\n\t\tseed,\n\t\tgenerativePattern = \"grid\",\n\t\talt,\n\t\tvariant = \"circle\",\n\t\tsize = \"md\",\n\t\tcolor = \"neutral\",\n\t\tclassName,\n\t},\n\tref,\n) {\n\tconst s = sizeStyles[size]\n\tconst shape = variantStyles[variant]\n\n\t// Priority 1: Image\n\tif (src) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tref={ref as React.Ref<HTMLImageElement>}\n\t\t\t\tsrc={src}\n\t\t\t\talt={alt ?? initials ?? seed ?? \"\"}\n\t\t\t\tclassName={cn(\"shrink-0 object-cover\", s.outer, shape, className)}\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Priority 2: Initials\n\tif (initials) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref as React.Ref<HTMLSpanElement>}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center justify-center font-semibold select-none\",\n\t\t\t\t\ts.outer,\n\t\t\t\t\ts.text,\n\t\t\t\t\tshape,\n\t\t\t\t\tcolorStyles[color],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{initials}\n\t\t\t</span>\n\t\t)\n\t}\n\n\t// Priority 3: Generative pixel grid\n\tif (seed) {\n\t\treturn (\n\t\t\t<GenerativeFallback\n\t\t\t\tref={ref as React.Ref<SVGSVGElement>}\n\t\t\t\tseed={seed}\n\t\t\t\tpattern={generativePattern}\n\t\t\t\tpx={s.px}\n\t\t\t\tisCircle={variant === \"circle\"}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Priority 4: Empty placeholder\n\treturn (\n\t\t<span\n\t\t\tref={ref as React.Ref<HTMLSpanElement>}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex shrink-0 items-center justify-center font-semibold select-none\",\n\t\t\t\ts.outer,\n\t\t\t\ts.text,\n\t\t\t\tshape,\n\t\t\t\tcolorStyles[color],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t/>\n\t)\n})\n","import {\n\ttype ComponentProps,\n\ttype ReactNode,\n\tforwardRef,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Card } from \"../card\"\nimport { Toggle } from \"../toggle\"\nimport { Tooltip } from \"../tooltip\"\n\n// ---------------------------------------------------------------------------\n// SettingsCard\n// ---------------------------------------------------------------------------\n\nexport interface SettingsCardProps {\n\t/** Title displayed in the card header */\n\ttitle?: string\n\t/** Description displayed below the title */\n\tdescription?: string\n\t/**\n\t * When true, renders a Toggle in the header. Toggling it on disables (mutes)\n\t * the card's rows - useful for \"Use Organization Settings\" patterns.\n\t */\n\ttoggle?: boolean\n\t/** Controlled toggle state */\n\ttoggled?: boolean\n\t/** Callback when toggle state changes */\n\tonToggleChange?: (toggled: boolean) => void\n\t/** Initial toggle state for uncontrolled usage */\n\tdefaultToggled?: boolean\n\t/** Settings rows or other content */\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * A specialized card for settings pages. Uses the Card component internally\n * with an optional header and a nested card for the settings rows.\n *\n * Pass `toggle` to show a toggle in the header. When toggled on, the child\n * rows are visually disabled (muted + non-interactive).\n */\nexport const SettingsCard = forwardRef<HTMLDivElement, SettingsCardProps>(\n\tfunction SettingsCard(\n\t\t{\n\t\t\ttitle,\n\t\t\tdescription,\n\t\t\ttoggle,\n\t\t\ttoggled: controlledToggled,\n\t\t\tonToggleChange,\n\t\t\tdefaultToggled = false,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internalToggled, setInternalToggled] = useState(defaultToggled)\n\t\tconst isControlled = controlledToggled !== undefined\n\t\tconst toggled = isControlled ? controlledToggled : internalToggled\n\t\tconst disabled = toggle && toggled\n\n\t\tfunction handleToggleChange(value: boolean) {\n\t\t\tif (!isControlled) setInternalToggled(value)\n\t\t\tonToggleChange?.(value)\n\t\t}\n\n\t\treturn (\n\t\t\t<Card ref={ref} className={cn(\"w-full\", className)}>\n\t\t\t\t<Card.Content>\n\t\t\t\t\t{(title || description || toggle) && (\n\t\t\t\t\t\t<Card.Header>\n\t\t\t\t\t\t\t<div className=\"flex items-start justify-between gap-4\">\n\t\t\t\t\t\t\t\t<div className=\"flex flex-1 flex-col\">\n\t\t\t\t\t\t\t\t\t{title && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-bruv-secondary text-bruv-base mt-1 leading-relaxed\">\n\t\t\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{toggle && (\n\t\t\t\t\t\t\t\t\t<div className=\"shrink-0 pt-0.5\">\n\t\t\t\t\t\t\t\t\t\t<Toggle\n\t\t\t\t\t\t\t\t\t\t\tchecked={toggled}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={handleToggleChange}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Card.Header>\n\t\t\t\t\t)}\n\t\t\t\t\t<Card\n\t\t\t\t\t\tvariant=\"nested\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"transition-opacity duration-150 ease-out\",\n\t\t\t\t\t\t\tdisabled && \"pointer-events-none select-none opacity-50\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Card>\n\t\t\t\t</Card.Content>\n\t\t\t</Card>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SettingsRow — composable compound component\n// ---------------------------------------------------------------------------\n\n// SettingsRow.Root\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowRootProps extends ComponentProps<\"div\"> {\n\tchildren: ReactNode\n}\n\n/**\n * Outer wrapper for a settings row. Renders as a `Card.Section` with a\n * bottom border separator between siblings. Passes through all div props\n * (`id`, `onClick`, `data-*`, `className`, etc.).\n */\nconst SettingsRowRoot = forwardRef<HTMLDivElement, SettingsRowRootProps>(\n\tfunction SettingsRowRoot({ className, children, ...rest }, ref) {\n\t\treturn (\n\t\t\t<Card.Section\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex flex-col gap-3\", className)}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Card.Section>\n\t\t)\n\t},\n)\n\n// SettingsRow.Header\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowHeaderProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Header area of a settings row. Lays out label/description on the left and\n * a control or action on the right.\n */\nconst SettingsRowHeader = forwardRef<HTMLDivElement, SettingsRowHeaderProps>(\n\tfunction SettingsRowHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-start justify-between gap-4 [&>:first-child]:min-w-0 [&>:first-child]:flex-1\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// SettingsRow.Label\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowLabelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Label slot. Accepts `ReactNode` so consumers can place badges, icons, or\n * other elements alongside the text.\n */\nconst SettingsRowLabel = forwardRef<HTMLDivElement, SettingsRowLabelProps>(\n\tfunction SettingsRowLabel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t)\n\t},\n)\n\n// SettingsRow.Description\n// ---------------------------------------------------------------------------\n\nconst DESCRIPTION_LINE_HEIGHT = 20\nconst DESCRIPTION_CLAMP_LINES = 2\nconst DESCRIPTION_CLAMP_HEIGHT =\n\tDESCRIPTION_LINE_HEIGHT * DESCRIPTION_CLAMP_LINES\n\nexport interface SettingsRowDescriptionProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Description text, clamped to 2 lines. When the text overflows, a tooltip\n * displays the full content on hover.\n */\nconst SettingsRowDescription = forwardRef<\n\tHTMLDivElement,\n\tSettingsRowDescriptionProps\n>(function SettingsRowDescription({ className, children }, ref) {\n\tconst measureRef = useRef<HTMLSpanElement>(null)\n\tconst [isTruncated, setIsTruncated] = useState(false)\n\n\tuseLayoutEffect(() => {\n\t\tif (measureRef.current) {\n\t\t\tsetIsTruncated(measureRef.current.scrollHeight > DESCRIPTION_CLAMP_HEIGHT)\n\t\t}\n\t}, [children])\n\n\tconst content = (\n\t\t<span ref={ref} className={cn(\"relative block\", className)}>\n\t\t\t{/* Hidden full-height measurer */}\n\t\t\t<span\n\t\t\t\tref={measureRef}\n\t\t\t\taria-hidden\n\t\t\t\tclassName=\"text-bruv-base pointer-events-none invisible absolute inset-x-0 leading-relaxed\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t<span className=\"text-bruv-secondary text-bruv-base line-clamp-2 leading-relaxed\">\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t</span>\n\t)\n\n\tif (!isTruncated) return content\n\n\treturn (\n\t\t<Tooltip.Provider>\n\t\t\t<Tooltip.Root>\n\t\t\t\t<Tooltip.Trigger render={content} />\n\t\t\t\t<Tooltip.Content side=\"bottom\" className=\"max-w-sm\">\n\t\t\t\t\t{children}\n\t\t\t\t</Tooltip.Content>\n\t\t\t</Tooltip.Root>\n\t\t</Tooltip.Provider>\n\t)\n})\n\n// SettingsRow.Control\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowControlProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Right-aligned control slot for inline settings rows (toggles, selects, etc.).\n */\nconst SettingsRowControl = forwardRef<HTMLDivElement, SettingsRowControlProps>(\n\tfunction SettingsRowControl({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex shrink-0 items-center\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// SettingsRow.Action\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowActionProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Right-aligned action slot in the header (for rows with content below).\n */\nconst SettingsRowAction = forwardRef<HTMLDivElement, SettingsRowActionProps>(\n\tfunction SettingsRowAction({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex shrink-0 items-center\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// SettingsRow.Content\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowContentProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Content rendered below the header (textareas, tables, instruction lists, etc.).\n */\nconst SettingsRowContent = forwardRef<HTMLDivElement, SettingsRowContentProps>(\n\tfunction SettingsRowContent({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={className}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\n/**\n * Composable settings row for use inside `SettingsCard`.\n *\n * ```tsx\n * <SettingsRow.Root>\n * <SettingsRow.Header>\n * <div>\n * <SettingsRow.Label>Language</SettingsRow.Label>\n * <SettingsRow.Description>\n * Set the language for reviews.\n * </SettingsRow.Description>\n * </div>\n * <SettingsRow.Control>\n * <Select />\n * </SettingsRow.Control>\n * </SettingsRow.Header>\n * </SettingsRow.Root>\n *\n * // With content below\n * <SettingsRow.Root>\n * <SettingsRow.Header>\n * <div>\n * <SettingsRow.Label>Instructions</SettingsRow.Label>\n * <SettingsRow.Description>\n * Custom review instructions.\n * </SettingsRow.Description>\n * </div>\n * <SettingsRow.Action>\n * <Button>Add</Button>\n * </SettingsRow.Action>\n * </SettingsRow.Header>\n * <SettingsRow.Content>\n * <Textarea />\n * </SettingsRow.Content>\n * </SettingsRow.Root>\n * ```\n */\nexport const SettingsRow = {\n\tRoot: SettingsRowRoot,\n\tHeader: SettingsRowHeader,\n\tLabel: SettingsRowLabel,\n\tDescription: SettingsRowDescription,\n\tControl: SettingsRowControl,\n\tAction: SettingsRowAction,\n\tContent: SettingsRowContent,\n}\n","import { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Tooltip.Provider\n// ---------------------------------------------------------------------------\n\nexport interface TooltipProviderProps extends ComponentProps<\n\ttypeof BaseTooltip.Provider\n> {}\n\nfunction TooltipProvider(props: TooltipProviderProps) {\n\treturn <BaseTooltip.Provider {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip.Root\n// ---------------------------------------------------------------------------\n\nexport interface TooltipRootProps extends ComponentProps<\n\ttypeof BaseTooltip.Root\n> {}\n\nfunction TooltipRoot(props: TooltipRootProps) {\n\treturn <BaseTooltip.Root {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface TooltipTriggerProps extends ComponentProps<\n\ttypeof BaseTooltip.Trigger\n> {}\n\nconst TooltipTrigger = forwardRef<HTMLButtonElement, TooltipTriggerProps>(\n\tfunction TooltipTrigger({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseTooltip.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"outline-none\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Tooltip.Content\n//\n// Positioner sizing: w-(--positioner-width) / h-(--positioner-height)\n// gives the positioner real dimensions so align=\"center\" works with\n// detached/handle triggers. Position transitions use left/top/right/bottom\n// and are disabled on initial open via data-[instant]:transition-none.\n//\n// Popup entrance: scale+fade via data-[starting-style]/data-[ending-style],\n// also disabled during group transfers via data-[instant]:transition-none\n// so the pill stays visible while only its position and content change.\n// ---------------------------------------------------------------------------\n\nexport interface TooltipContentProps extends ComponentProps<\n\ttypeof BaseTooltip.Popup\n> {\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\t/** Content to display */\n\tchildren: ReactNode\n}\n\nfunction TooltipContent({\n\tside = \"top\",\n\talign = \"center\",\n\tsideOffset = 6,\n\tclassName,\n\tchildren,\n\t...props\n}: TooltipContentProps) {\n\treturn (\n\t\t<BaseTooltip.Portal>\n\t\t\t<BaseTooltip.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"z-50 outline-none\",\n\t\t\t\t\t// Give positioner real dimensions for proper centering\n\t\t\t\t\t\"h-[var(--positioner-height)] w-[var(--positioner-width)] max-w-[var(--available-width)]\",\n\t\t\t\t\t// Smooth position transition during group transfer\n\t\t\t\t\t\"transition-[top,left,right,bottom,transform] duration-350 ease-bruv-out-expo\",\n\t\t\t\t\t// Skip position transition on initial open / close\n\t\t\t\t\t\"data-[instant]:transition-none\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<BaseTooltip.Popup\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-inverse text-bruv-inverse rounded px-2 py-1 text-bruv-sm font-medium\",\n\t\t\t\t\t\t\"max-w-[280px]\",\n\t\t\t\t\t\t\"origin-[var(--transform-origin)]\",\n\t\t\t\t\t\t// Entrance/exit animation\n\t\t\t\t\t\t\"transition-[transform,scale,opacity] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-95 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t// Skip entrance animation during group transfer (pill stays visible)\n\t\t\t\t\t\t\"data-[instant]:transition-none\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseTooltip.Popup>\n\t\t\t</BaseTooltip.Positioner>\n\t\t</BaseTooltip.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip.Viewport\n//\n// Wraps content inside Tooltip.Content for direction-aware transfer\n// animations. Base UI sets `data-activation-direction` on this element\n// (e.g. \"right down\") and renders `[data-current]` / `[data-previous]`\n// child wrappers with `data-starting-style` / `data-ending-style`.\n//\n// Uses `~=` (word match) via `*=` (contains) selectors on the\n// space-separated activation direction value. Transitions use\n// translate + opacity on the children, matching the official Base UI\n// pattern from their detached-triggers-full demo.\n// ---------------------------------------------------------------------------\n\nexport interface TooltipViewportProps extends ComponentProps<\n\ttypeof BaseTooltip.Viewport\n> {}\n\nconst TooltipViewport = forwardRef<HTMLDivElement, TooltipViewportProps>(\n\tfunction TooltipViewport({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseTooltip.Viewport\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative h-full w-full overflow-clip\",\n\t\t\t\t\t// Children: translate + opacity transition\n\t\t\t\t\t\"[&_[data-previous]]:transition-[translate,opacity] [&_[data-previous]]:duration-350 [&_[data-previous]]:ease-bruv-out-expo\",\n\t\t\t\t\t\"[&_[data-current]]:transition-[translate,opacity] [&_[data-current]]:duration-350 [&_[data-current]]:ease-bruv-out-expo\",\n\t\t\t\t\t// Skip animation when instant (first open)\n\t\t\t\t\t\"[&_[data-instant]_[data-current]]:transition-none [&_[data-instant]_[data-previous]]:transition-none\",\n\t\t\t\t\t// Current: slides in from activation direction\n\t\t\t\t\t\"[&[data-activation-direction*=left]_[data-current][data-starting-style]]:-translate-x-1/2 [&[data-activation-direction*=left]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=right]_[data-current][data-starting-style]]:translate-x-1/2 [&[data-activation-direction*=right]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=up]_[data-current][data-starting-style]]:-translate-y-1/2 [&[data-activation-direction*=up]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=down]_[data-current][data-starting-style]]:translate-y-1/2 [&[data-activation-direction*=down]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t// Previous: slides out opposite to activation direction\n\t\t\t\t\t\"[&[data-activation-direction*=left]_[data-previous][data-ending-style]]:translate-x-1/2 [&[data-activation-direction*=left]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=right]_[data-previous][data-ending-style]]:-translate-x-1/2 [&[data-activation-direction*=right]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=up]_[data-previous][data-ending-style]]:translate-y-1/2 [&[data-activation-direction*=up]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=down]_[data-previous][data-ending-style]]:-translate-y-1/2 [&[data-activation-direction*=down]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t// Reduced motion\n\t\t\t\t\t\"motion-reduce:[&_[data-current]]:!transition-none motion-reduce:[&_[data-previous]]:!transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// createHandle - re-export for shared tooltip pattern\n// ---------------------------------------------------------------------------\n\nexport const createTooltipHandle = BaseTooltip.createHandle\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tooltip = {\n\tProvider: TooltipProvider,\n\tRoot: TooltipRoot,\n\tTrigger: TooltipTrigger,\n\tContent: TooltipContent,\n\tViewport: TooltipViewport,\n\tcreateHandle: BaseTooltip.createHandle,\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// PageLayout.Header — breadcrumb bar inside content panel\n// ---------------------------------------------------------------------------\n\nexport interface PageLayoutHeaderProps extends ComponentProps<\"div\"> {}\n\nconst PageLayoutHeader = forwardRef<HTMLDivElement, PageLayoutHeaderProps>(\n\tfunction PageLayoutHeader({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center gap-6 px-1.5 py-1.5\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// PageLayout.Body — scrollable content area\n// ---------------------------------------------------------------------------\n\nexport interface PageLayoutBodyProps extends ComponentProps<\"div\"> {}\n\nconst PageLayoutBody = forwardRef<HTMLDivElement, PageLayoutBodyProps>(\n\tfunction PageLayoutBody({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex min-h-0 flex-1 gap-6 overflow-auto px-3.5 py-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// PageLayout — root shell\n// ---------------------------------------------------------------------------\n\nexport interface PageLayoutProps {\n\t/** Sidebar content */\n\treadonly sidebar?: ReactNode\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Full-page layout shell with a sidebar and content area.\n *\n * Structure: sidebar (fixed width) + content panel (flex-1).\n * The content panel renders as a rounded card on bg-bruv-base-0.\n */\nexport const PageLayout = Object.assign(\n\tforwardRef<HTMLDivElement, PageLayoutProps>(function PageLayout(\n\t\t{ sidebar, className, children },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex h-screen bg-bruv-base-0\", className)}>\n\t\t\t\t{sidebar}\n\t\t\t\t<div className=\"flex min-h-0 flex-1 flex-col pt-1 pr-1 pb-1\">\n\t\t\t\t\t<div className=\"bg-bruv-base-1 ring-bruv-neutral flex min-h-0 flex-1 flex-col rounded shadow-sm ring-1\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}),\n\t{\n\t\tHeader: PageLayoutHeader,\n\t\tBody: PageLayoutBody,\n\t},\n)\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseSyncExternalStore,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport { AnimatePresence, motion } from \"motion/react\"\nimport {\n\tArrowLeftIcon,\n\tChevronRightIcon,\n\tArrowTopRightOnSquareIcon,\n\tXMarkIcon,\n} from \"@heroicons/react/16/solid\"\nimport { Button } from \"../button\"\nimport { cn } from \"../../lib/cn\"\nimport { Drawer } from \"../drawer\"\nimport { Hover, HoverGroup } from \"../hover\"\nimport { Skeleton } from \"../skeleton\"\nimport { Tooltip } from \"../tooltip\"\nimport {\n\tSidebarContext,\n\tuseSidebar,\n\tuseSidebarOptional,\n\ttype SidebarContextValue,\n\ttype SidebarLinkComponent,\n} from \"./sidebar-context\"\n\n// ---------------------------------------------------------------------------\n// useMediaQuery — subscribe to a CSS media query\n// ---------------------------------------------------------------------------\n\nconst MOBILE_QUERY = \"(max-width: 767px)\"\n\nfunction subscribeMediaQuery(callback: () => void) {\n\tconst mql = window.matchMedia(MOBILE_QUERY)\n\tmql.addEventListener(\"change\", callback)\n\treturn () => mql.removeEventListener(\"change\", callback)\n}\n\nfunction getMediaSnapshot() {\n\treturn window.matchMedia(MOBILE_QUERY).matches\n}\n\nfunction getMediaServerSnapshot() {\n\treturn false\n}\n\nfunction useIsMobile() {\n\treturn useSyncExternalStore(\n\t\tsubscribeMediaQuery,\n\t\tgetMediaSnapshot,\n\t\tgetMediaServerSnapshot,\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Provider — context-only wrapper (no visual output)\n// ---------------------------------------------------------------------------\n\nexport interface SidebarProviderProps {\n\t/** Start in collapsed state (uncontrolled) */\n\treadonly defaultCollapsed?: boolean\n\t/** Controlled collapsed state */\n\treadonly collapsed?: boolean\n\t/** Callback when collapsed state changes (controlled mode) */\n\treadonly onCollapsedChange?: (collapsed: boolean) => void\n\t/** Custom link component for client-side navigation */\n\treadonly linkComponent?: SidebarLinkComponent\n\treadonly children: ReactNode\n}\n\n/**\n * Context-only provider for sidebar state — no visual output.\n *\n * Wrap your entire page layout with this when you need `useSidebar()`\n * outside the visual `<Sidebar>` container (e.g. in the page header\n * or in portaled components).\n *\n * When `<Sidebar>` is rendered inside a `<Sidebar.Provider>`, it\n * skips creating its own context and uses the provider's state.\n *\n * ```tsx\n * <Sidebar.Provider collapsed={collapsed} onCollapsedChange={setCollapsed}>\n * <PageLayout sidebar={<Sidebar>...</Sidebar>}>\n * <MyHeader />\n * </PageLayout>\n * </Sidebar.Provider>\n * ```\n */\nfunction SidebarProvider({\n\tdefaultCollapsed = false,\n\tcollapsed: controlledCollapsed,\n\tonCollapsedChange,\n\tlinkComponent,\n\tchildren,\n}: SidebarProviderProps) {\n\tconst mobile = useIsMobile()\n\tconst [uncontrolledCollapsed, setUncontrolledCollapsed] =\n\t\tuseState(defaultCollapsed)\n\tconst [mobileOpen, setMobileOpen] = useState(false)\n\tconst isControlled = controlledCollapsed !== undefined\n\tconst collapsed = isControlled ? controlledCollapsed : uncontrolledCollapsed\n\tconst toggle = useCallback(() => {\n\t\tconst next = !collapsed\n\t\tif (isControlled) {\n\t\t\tonCollapsedChange?.(next)\n\t\t} else {\n\t\t\tsetUncontrolledCollapsed(next)\n\t\t}\n\t}, [collapsed, isControlled, onCollapsedChange])\n\n\t// Close mobile drawer when resizing to desktop\n\tuseEffect(() => {\n\t\tif (!mobile && mobileOpen) {\n\t\t\tsetMobileOpen(false)\n\t\t}\n\t}, [mobile, mobileOpen])\n\n\tconst ctx = useMemo(\n\t\t() => ({\n\t\t\tcollapsed: mobile ? true : collapsed,\n\t\t\ttoggle,\n\t\t\tlinkComponent,\n\t\t\tmobile,\n\t\t\tmobileOpen,\n\t\t\tsetMobileOpen,\n\t\t}),\n\t\t[collapsed, toggle, linkComponent, mobile, mobileOpen],\n\t)\n\n\treturn (\n\t\t<SidebarContext.Provider value={ctx}>{children}</SidebarContext.Provider>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar — root container\n// ---------------------------------------------------------------------------\n\nexport interface SidebarRootProps {\n\t/** Start in collapsed state (uncontrolled). Ignored when inside a Sidebar.Provider. */\n\treadonly defaultCollapsed?: boolean\n\t/** Controlled collapsed state. Ignored when inside a Sidebar.Provider. */\n\treadonly collapsed?: boolean\n\t/** Callback when collapsed state changes. Ignored when inside a Sidebar.Provider. */\n\treadonly onCollapsedChange?: (collapsed: boolean) => void\n\t/** Custom link component for client-side navigation. Ignored when inside a Sidebar.Provider. */\n\treadonly linkComponent?: SidebarLinkComponent\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Responsive sidebar with collapsible state and directional layer transitions.\n *\n * When rendered inside a `<Sidebar.Provider>`, uses the provider's context\n * and only renders the visual shell. Otherwise, creates its own context.\n *\n * **Desktop** (`md:` and up): renders inline with collapse/expand animation.\n * **Mobile** (below `md:`): shows collapsed icons inline. Tapping an icon\n * or the collapse button opens the full sidebar in a left-side Drawer.\n */\nfunction SidebarRoot({\n\tdefaultCollapsed = false,\n\tcollapsed: controlledCollapsed,\n\tonCollapsedChange,\n\tlinkComponent,\n\tclassName,\n\tchildren,\n}: SidebarRootProps) {\n\tconst existingCtx = useSidebarOptional()\n\n\t// If inside a Sidebar.Provider, just render the visual shell\n\tif (existingCtx) {\n\t\treturn (\n\t\t\t<SidebarVisual className={className} ctx={existingCtx}>\n\t\t\t\t{children}\n\t\t\t</SidebarVisual>\n\t\t)\n\t}\n\n\t// Otherwise, create context + visual shell together\n\treturn (\n\t\t<SidebarProvider\n\t\t\tdefaultCollapsed={defaultCollapsed}\n\t\t\tcollapsed={controlledCollapsed}\n\t\t\tonCollapsedChange={onCollapsedChange}\n\t\t\tlinkComponent={linkComponent}\n\t\t>\n\t\t\t<SidebarVisualFromCtx className={className}>\n\t\t\t\t{children}\n\t\t\t</SidebarVisualFromCtx>\n\t\t</SidebarProvider>\n\t)\n}\n\n/** Internal: reads ctx from useSidebar and renders the visual shell. */\nfunction SidebarVisualFromCtx({\n\tclassName,\n\tchildren,\n}: {\n\treadonly className?: string\n\treadonly children: ReactNode\n}) {\n\tconst ctx = useSidebar()\n\treturn (\n\t\t<SidebarVisual className={className} ctx={ctx}>\n\t\t\t{children}\n\t\t</SidebarVisual>\n\t)\n}\n\n/** Internal: renders the sidebar visual shell + mobile drawer. */\nfunction SidebarVisual({\n\tclassName,\n\tctx,\n\tchildren,\n}: {\n\treadonly className?: string\n\treadonly ctx: SidebarContextValue\n\treadonly children: ReactNode\n}) {\n\tconst { collapsed, mobile, mobileOpen, setMobileOpen } = ctx\n\n\t// Separate context for the drawer — always expanded\n\tconst drawerCtx = useMemo(() => ({ ...ctx, collapsed: false }), [ctx])\n\n\treturn (\n\t\t<>\n\t\t\t<Tooltip.Provider delay={0} closeDelay={0}>\n\t\t\t\t{/* Inline sidebar — collapsed (icon-only) on mobile, collapsible on desktop */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex h-full shrink-0 flex-col justify-between overflow-hidden px-2 py-1 transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\t\tmobile || collapsed ? \"w-12\" : \"w-[264px]\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</Tooltip.Provider>\n\n\t\t\t{/* Mobile: portaled drawer with the full expanded sidebar */}\n\t\t\t{mobile && (\n\t\t\t\t<Drawer.Root\n\t\t\t\t\topen={mobileOpen}\n\t\t\t\t\tonOpenChange={setMobileOpen}\n\t\t\t\t\tside=\"left\"\n\t\t\t\t\tresponsive={false}\n\t\t\t\t>\n\t\t\t\t\t<Drawer.Content side=\"left\" responsive={false}>\n\t\t\t\t\t\t<SidebarContext.Provider value={drawerCtx}>\n\t\t\t\t\t\t\t<Tooltip.Provider delay={0} closeDelay={0}>\n\t\t\t\t\t\t\t\t<div className=\"flex h-full w-full flex-col justify-between px-2 py-1\">\n\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Tooltip.Provider>\n\t\t\t\t\t\t</SidebarContext.Provider>\n\t\t\t\t\t</Drawer.Content>\n\t\t\t\t</Drawer.Root>\n\t\t\t)}\n\t\t</>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Section — group container\n// ---------------------------------------------------------------------------\n\nexport interface SidebarSectionProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\nfunction SidebarSection({ className, children }: SidebarSectionProps) {\n\treturn (\n\t\t<HoverGroup\n\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\tborderRadius=\"rounded\"\n\t\t\tclassName={cn(\"w-full flex-col items-stretch gap-0.5\", className)}\n\t\t>\n\t\t\t{children}\n\t\t</HoverGroup>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Label — section label with collapse animation\n// ---------------------------------------------------------------------------\n\nexport interface SidebarLabelProps extends ComponentProps<\"div\"> {}\n\n/**\n * Section label that collapses smoothly via grid-rows animation.\n *\n * Matches the Vue DSidebarLabel: grid-rows-[1fr] → grid-rows-[0fr]\n * with inner translate + scale + opacity fade.\n */\nconst SidebarLabel = forwardRef<HTMLDivElement, SidebarLabelProps>(\n\tfunction SidebarLabel({ className, children, ...props }, ref) {\n\t\tconst { collapsed } = useSidebar()\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid transition-all duration-400 ease-bruv-out-expo\",\n\t\t\t\t\tcollapsed ? \"grid-rows-[0fr]\" : \"grid-rows-[1fr]\",\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div className=\"overflow-hidden\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex h-6 items-center px-2 text-bruv-sm text-bruv-secondary transition-all duration-400 ease-bruv-out-expo\",\n\t\t\t\t\t\t\tcollapsed ? \"-translate-x-5 scale-80 opacity-0\" : \"opacity-100\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Sidebar.Header — header row with AnimatePresence popLayout for logo area\n// ---------------------------------------------------------------------------\n\nexport interface SidebarHeaderProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Header row that smoothly hides its children when the sidebar collapses.\n *\n * Matches the Vue DSidebar header pattern:\n * - `AnimatePresence mode=\"popLayout\"` keeps CollapseButton stable in layout\n * - Children slide out with `x: -320, scale: 0.5` spring animation\n * - Row uses `justify-center` so CollapseButton centers when collapsed\n * - Padding `px-2` only applied when expanded\n *\n * Usage:\n * ```tsx\n * <Sidebar.Header>\n * <YourLogo />\n * <span>Your App</span>\n * </Sidebar.Header>\n * ```\n * The `CollapseButton` is rendered automatically at the end of the row.\n */\nfunction SidebarHeader({ className, children }: SidebarHeaderProps) {\n\tconst { collapsed } = useSidebar()\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center py-1.5 transition-all duration-400 ease-bruv-out-expo\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t{!collapsed && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, x: -320, scale: 0.5 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, x: 0, scale: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0, x: -320, scale: 0.5 }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, type: \"spring\", bounce: 0 }}\n\t\t\t\t\t\tclassName=\"flex min-w-0 flex-1 items-center gap-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t\t<SidebarCollapseButton />\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Link — nav link with Hover + Tooltip + AnimatePresence\n// ---------------------------------------------------------------------------\n\nexport interface SidebarLinkProps extends Omit<\n\tComponentProps<\"div\">,\n\t\"children\"\n> {\n\t/** Display name */\n\treadonly name: string\n\t/** Link URL — renders via `linkComponent` (or native `<a>` if none provided) */\n\treadonly href?: string\n\t/** Render as \"div\" when nested inside an interactive container (e.g. DropdownMenu.Trigger) to avoid nested `<button>` */\n\treadonly as?: \"div\"\n\t/** Whether this link is currently active */\n\treadonly active?: boolean\n\t/** Icon component rendered before the name */\n\treadonly icon?: ReactNode\n\t/** Show a trailing chevron indicating navigation to a nested layer */\n\treadonly nested?: boolean\n\t/** Show an external link arrow and open in new tab */\n\treadonly external?: boolean\n\t/** Show a pulsing activity indicator dot */\n\treadonly showIndicator?: boolean\n\t/** Arbitrary trailing content rendered after the name (e.g. badges, lock icons) */\n\treadonly trailing?: ReactNode\n\t/** Disable the link — reduces opacity and prevents clicks */\n\treadonly disabled?: boolean\n\t/** Show a skeleton placeholder instead of the link content */\n\treadonly loading?: boolean\n\t/** Click handler */\n\treadonly onClick?: () => void\n}\n\nfunction SidebarLink({\n\tname,\n\thref,\n\tas,\n\tactive = false,\n\ticon,\n\tnested = false,\n\texternal = false,\n\tshowIndicator = false,\n\ttrailing,\n\tdisabled = false,\n\tloading = false,\n\tonClick,\n\tclassName,\n\t...rest\n}: SidebarLinkProps) {\n\tconst {\n\t\tcollapsed,\n\t\tlinkComponent: LinkComponent,\n\t\tmobile,\n\t\tsetMobileOpen,\n\t} = useSidebar()\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex h-8 w-full items-center gap-2 p-2 transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\tcollapsed ? \"w-8\" : \"w-full\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Skeleton className=\"size-4 shrink-0\" />\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{!collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex-1 origin-left\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// Determine the rendered tag\n\tconst usesLinkComponent = !!href && !external && !!LinkComponent\n\tconst Tag = as ?? (usesLinkComponent ? LinkComponent : href ? \"a\" : \"button\")\n\n\tconst handleClick = disabled\n\t\t? (e: React.MouseEvent) => {\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\t\t\t}\n\t\t: mobile && collapsed\n\t\t\t? (e: React.MouseEvent) => {\n\t\t\t\t\t// On mobile collapsed (inline icons), open the drawer\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tsetMobileOpen(true)\n\t\t\t\t}\n\t\t\t: () => {\n\t\t\t\t\tonClick?.()\n\t\t\t\t\tsetMobileOpen(false)\n\t\t\t\t}\n\n\tconst tagProps = usesLinkComponent\n\t\t? { to: href, href, onClick: handleClick }\n\t\t: as === \"div\"\n\t\t\t? { onClick: handleClick }\n\t\t\t: href\n\t\t\t\t? {\n\t\t\t\t\t\thref,\n\t\t\t\t\t\tonClick: handleClick,\n\t\t\t\t\t\ttarget: external ? (\"_blank\" as const) : undefined,\n\t\t\t\t\t\trel: external ? \"noopener noreferrer\" : undefined,\n\t\t\t\t\t}\n\t\t\t\t: { type: \"button\" as const, onClick: handleClick }\n\n\tconst link = (\n\t\t<Hover\n\t\t\tactive={active}\n\t\t\tdisabled={disabled}\n\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\tborderRadius=\"rounded\"\n\t\t\tfullWidth\n\t\t\tclassName={cn(\n\t\t\t\t\"overflow-hidden transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\tcollapsed ? \"w-8\" : \"w-full\",\n\t\t\t)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t<Tag\n\t\t\t\t{...tagProps}\n\t\t\t\taria-label={collapsed ? name : undefined}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/link flex h-8 w-full select-none items-center gap-2 p-2 text-left text-bruv-base text-bruv-secondary outline-none\",\n\t\t\t\t\t!disabled && \"cursor-pointer hover:text-bruv-primary\",\n\t\t\t\t\tactive && \"text-bruv-primary\",\n\t\t\t\t\tdisabled && \"cursor-default opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className=\"relative shrink-0\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex size-4 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t? \"text-bruv-primary\"\n\t\t\t\t\t\t\t\t\t: disabled\n\t\t\t\t\t\t\t\t\t\t? \"text-bruv-tertiary\"\n\t\t\t\t\t\t\t\t\t\t: \"text-bruv-secondary group-hover/link:text-bruv-primary\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{showIndicator && collapsed && (\n\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong absolute -top-0.5 -right-0.5 size-2 rounded-full\">\n\t\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong absolute inset-0 animate-ping rounded-full opacity-75\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{!collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex-1 origin-left truncate\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{showIndicator && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex shrink-0 origin-left items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"relative flex size-2\">\n\t\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong absolute inline-flex size-full animate-ping rounded-full opacity-75\" />\n\t\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong relative inline-flex size-2 rounded-full\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{trailing && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex shrink-0 origin-left items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{trailing}\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{external && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"origin-left\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ArrowTopRightOnSquareIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{nested && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"origin-left\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronRightIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</Tag>\n\t\t</Hover>\n\t)\n\n\treturn (\n\t\t<Tooltip.Root disabled={!collapsed || mobile}>\n\t\t\t<Tooltip.Trigger className=\"w-full outline-none\" render={<div />}>\n\t\t\t\t{link}\n\t\t\t</Tooltip.Trigger>\n\t\t\t<Tooltip.Content side=\"right\">{name}</Tooltip.Content>\n\t\t</Tooltip.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.BackLink — back navigation with icon\n// ---------------------------------------------------------------------------\n\nexport interface SidebarBackLinkProps {\n\t/** Display name */\n\treadonly name: string\n\t/** Click handler */\n\treadonly onClick?: () => void\n\treadonly className?: string\n}\n\nfunction SidebarBackLink({ name, onClick, className }: SidebarBackLinkProps) {\n\tconst { collapsed } = useSidebar()\n\n\treturn (\n\t\t<Tooltip.Root disabled={!collapsed}>\n\t\t\t<Tooltip.Trigger className=\"w-full outline-none\" render={<div />}>\n\t\t\t\t<div className=\"flex items-center py-1.5\">\n\t\t\t\t\t<Hover\n\t\t\t\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\t\t\t\tborderRadius=\"rounded\"\n\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"overflow-hidden transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\t\t\tcollapsed ? \"w-8\" : \"w-full\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onClick}\n\t\t\t\t\t\t\taria-label={collapsed ? name : undefined}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex h-8 w-full cursor-pointer select-none items-center gap-2 p-2 text-left text-bruv-base text-bruv-secondary hover:text-bruv-primary outline-none\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t\t\t<ArrowLeftIcon />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t\t\t\t{!collapsed && (\n\t\t\t\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 origin-left truncate\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Hover>\n\t\t\t\t</div>\n\t\t\t</Tooltip.Trigger>\n\t\t\t<Tooltip.Content side=\"right\">{name}</Tooltip.Content>\n\t\t</Tooltip.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.CollapseButton — toggle collapse/expand\n// ---------------------------------------------------------------------------\n\nexport interface SidebarCollapseButtonProps {\n\treadonly className?: string\n}\n\nfunction SidebarCollapseIcon({ collapsed }: { readonly collapsed: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"16\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t\tclassName=\"size-4\"\n\t\t>\n\t\t\t{/* Panel outline */}\n\t\t\t<rect\n\t\t\t\tx={2}\n\t\t\t\ty={3}\n\t\t\t\twidth={12}\n\t\t\t\theight={10}\n\t\t\t\trx={2}\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t/>\n\t\t\t{/* Sidebar indicator — fixed position, width changes */}\n\t\t\t<rect\n\t\t\t\tx={4}\n\t\t\t\ty={5}\n\t\t\t\theight={6}\n\t\t\t\trx={0.75}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"transition-[width] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\tcollapsed\n\t\t\t\t\t\t? \"[width:1.5px] group-hover/btn:[width:3px]\"\n\t\t\t\t\t\t: \"[width:4px] group-hover/btn:[width:2.5px]\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\nfunction SidebarCollapseButton({ className }: SidebarCollapseButtonProps) {\n\tconst { collapsed, toggle, mobile, setMobileOpen } = useSidebar()\n\n\t// Mobile drawer (expanded): show close button\n\tif (mobile && !collapsed) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tvariant=\"transparent\"\n\t\t\t\tsize=\"md\"\n\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\tonClick={() => setMobileOpen(false)}\n\t\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\t\taria-label=\"Close menu\"\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Mobile inline (collapsed): open the drawer\n\tif (mobile) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tvariant=\"transparent\"\n\t\t\t\tsize=\"md\"\n\t\t\t\ticonLeft={<SidebarCollapseIcon collapsed={collapsed} />}\n\t\t\t\tonClick={() => setMobileOpen(true)}\n\t\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\t\taria-label=\"Open menu\"\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Desktop: toggle collapse\n\treturn (\n\t\t<Button\n\t\t\tvariant=\"transparent\"\n\t\t\tsize=\"md\"\n\t\t\ticonLeft={<SidebarCollapseIcon collapsed={collapsed} />}\n\t\t\tonClick={toggle}\n\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\taria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n\t\t/>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Layers — directional animation container\n// ---------------------------------------------------------------------------\n\nexport interface SidebarLayersProps {\n\t/** Unique key for the current layer — changes trigger the animation */\n\treadonly activeKey: string\n\t/** Direction of the transition: forward drills in, back goes up */\n\treadonly direction?: \"forward\" | \"back\"\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Wraps sidebar content in directional slide animations.\n *\n * When `activeKey` changes, the old content slides out and new content\n * slides in. `direction=\"forward\"` slides left (drilling in),\n * `direction=\"back\"` slides right (going up).\n *\n * Usage:\n * ```tsx\n * <Sidebar.Layers activeKey={currentSection} direction={navDirection}>\n * {currentSection === \"main\" ? <MainNav /> : <SettingsNav />}\n * </Sidebar.Layers>\n * ```\n */\nfunction SidebarLayers({\n\tactiveKey,\n\tdirection = \"forward\",\n\tclassName,\n\tchildren,\n}: SidebarLayersProps) {\n\tconst slideDistance = 40\n\n\tconst variants = {\n\t\tenter: (d: string) => ({\n\t\t\topacity: 0,\n\t\t\tx: d === \"forward\" ? slideDistance : -slideDistance,\n\t\t}),\n\t\tcenter: { opacity: 1, x: 0 },\n\t\texit: (d: string) => ({\n\t\t\topacity: 0,\n\t\t\tx: d === \"forward\" ? -slideDistance : slideDistance,\n\t\t}),\n\t}\n\n\treturn (\n\t\t<div className={cn(\"relative min-h-0 flex-1\", className)}>\n\t\t\t<AnimatePresence mode=\"popLayout\" initial={false} custom={direction}>\n\t\t\t\t<motion.div\n\t\t\t\t\tkey={activeKey}\n\t\t\t\t\tcustom={direction}\n\t\t\t\t\tvariants={variants}\n\t\t\t\t\tinitial=\"enter\"\n\t\t\t\t\tanimate=\"center\"\n\t\t\t\t\texit=\"exit\"\n\t\t\t\t\ttransition={{ duration: 0.25, type: \"spring\", bounce: 0 }}\n\t\t\t\t\tclassName=\"flex h-full flex-col\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</motion.div>\n\t\t\t</AnimatePresence>\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Group — collapsible nav group with indented children\n// ---------------------------------------------------------------------------\n\nexport interface SidebarGroupProps {\n\t/** Group label */\n\treadonly name: string\n\t/** Icon rendered before the label */\n\treadonly icon?: ReactNode\n\t/** Whether a child link is currently active — makes the label bold */\n\treadonly active?: boolean\n\t/** Start collapsed */\n\treadonly defaultCollapsed?: boolean\n\t/** Called when the group header is clicked (in addition to toggling collapse) */\n\treadonly onClick?: () => void\n\t/** Nested links rendered when expanded */\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\nfunction SidebarGroup({\n\tname,\n\ticon,\n\tactive = false,\n\tdefaultCollapsed = false,\n\tonClick,\n\tchildren,\n\tclassName,\n}: SidebarGroupProps) {\n\tconst { collapsed: sidebarCollapsed } = useSidebar()\n\tconst [isCollapsed, setIsCollapsed] = useState(defaultCollapsed)\n\n\treturn (\n\t\t<div className={cn(\"flex flex-col gap-0.5\", className)}>\n\t\t\t<Hover\n\t\t\t\tactive={active}\n\t\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\t\tborderRadius=\"rounded\"\n\t\t\t\tfullWidth\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"overflow-hidden transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\tsidebarCollapsed ? \"w-8\" : \"w-full\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetIsCollapsed(prev => !prev)\n\t\t\t\t\t\tonClick?.()\n\t\t\t\t\t}}\n\t\t\t\t\taria-expanded={!isCollapsed}\n\t\t\t\t\taria-label={sidebarCollapsed ? name : undefined}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"group/grp flex h-8 w-full items-center gap-2 p-2 text-left text-bruv-base text-bruv-primary select-none\",\n\t\t\t\t\t\tactive && \"font-medium\",\n\t\t\t\t\t\t\"cursor-pointer\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-inset\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{icon && (\n\t\t\t\t\t\t<span className=\"relative flex size-4 shrink-0 items-center justify-center\">\n\t\t\t\t\t\t\t<span className=\"text-bruv-secondary flex items-center justify-center transition-opacity duration-150 group-hover/grp:opacity-0 [&>svg]:size-4\">\n\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"absolute inset-0 size-4 text-bruv-secondary opacity-0 group-hover/grp:opacity-100 transition-all duration-150\",\n\t\t\t\t\t\t\t\t\t!isCollapsed && \"rotate-90\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t\t{!sidebarCollapsed && (\n\t\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\tclassName=\"flex-1 origin-left truncate\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</button>\n\t\t\t</Hover>\n\n\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t{!isCollapsed && !sidebarCollapsed && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ height: 0, opacity: 0 }}\n\t\t\t\t\t\tanimate={{ height: \"auto\", opacity: 1 }}\n\t\t\t\t\t\texit={{ height: 0, opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2, ease: [0.25, 0.1, 0.25, 1] }}\n\t\t\t\t\t\tclassName=\"overflow-hidden\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5 pb-1 pl-6\">{children}</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n\tProvider: SidebarProvider,\n\tSection: SidebarSection,\n\tHeader: SidebarHeader,\n\tLabel: SidebarLabel,\n\tLink: SidebarLink,\n\tBackLink: SidebarBackLink,\n\tCollapseButton: SidebarCollapseButton,\n\tLayers: SidebarLayers,\n\tGroup: SidebarGroup,\n})\n","import { Drawer as BaseDrawer } from \"@base-ui/react/drawer\"\nimport { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Side / swipe direction mapping\n// ---------------------------------------------------------------------------\n\ntype DrawerSide = \"right\" | \"left\" | \"bottom\" | \"top\"\n\nconst swipeDirectionMap = {\n\tright: \"right\",\n\tleft: \"left\",\n\tbottom: \"down\",\n\ttop: \"up\",\n} as const satisfies Record<DrawerSide, \"right\" | \"left\" | \"down\" | \"up\">\n\n/**\n * Position classes for the transparent Popup wrapper.\n * The Popup itself is invisible - it just reserves space and\n * carries the slide animation. The visible card floats inside it.\n */\nconst popupPositionStyles = {\n\tright: \"inset-y-0 right-0 w-[min(420px,90vw)] p-2\",\n\tleft: \"inset-y-0 left-0 w-[min(420px,90vw)] p-2\",\n\tbottom: \"inset-x-0 bottom-0 max-h-[85vh] p-2\",\n\ttop: \"inset-x-0 top-0 max-h-[85vh] p-2\",\n} as const\n\n// ---------------------------------------------------------------------------\n// Drawer.Root\n// ---------------------------------------------------------------------------\n\nexport interface DrawerRootProps extends Omit<\n\tComponentProps<typeof BaseDrawer.Root>,\n\t\"swipeDirection\"\n> {\n\t/** Which edge the drawer slides in from. Default: \"right\". */\n\tside?: DrawerSide\n\t/**\n\t * When true (default), automatically switches to \"bottom\" on small viewports.\n\t * The CSS handles this via media queries on the Popup element.\n\t */\n\tresponsive?: boolean\n\tchildren: ReactNode\n}\n\nfunction DrawerRoot({\n\tside = \"right\",\n\tresponsive: _responsive,\n\tchildren,\n\t...props\n}: DrawerRootProps) {\n\treturn (\n\t\t<BaseDrawer.Root swipeDirection={swipeDirectionMap[side]} {...props}>\n\t\t\t{children}\n\t\t</BaseDrawer.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Drawer.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface DrawerTriggerProps extends ComponentProps<\n\ttypeof BaseDrawer.Trigger\n> {}\n\nconst DrawerTrigger = forwardRef<HTMLButtonElement, DrawerTriggerProps>(\n\tfunction DrawerTrigger({ className, ...props }, ref) {\n\t\treturn <BaseDrawer.Trigger ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Backdrop\n// ---------------------------------------------------------------------------\n\nexport interface DrawerBackdropProps extends ComponentProps<\n\ttypeof BaseDrawer.Backdrop\n> {}\n\nconst DrawerBackdrop = forwardRef<HTMLDivElement, DrawerBackdropProps>(\n\tfunction DrawerBackdrop({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDrawer.Backdrop\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\t\"transition-opacity duration-200\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Content\n// ---------------------------------------------------------------------------\n\nexport interface DrawerContentProps extends ComponentProps<\n\ttypeof BaseDrawer.Popup\n> {\n\t/** Which edge. Must match the Root side. Default: \"right\". */\n\tside?: DrawerSide\n\t/** When true, switches to bottom on mobile. Default: true. */\n\tresponsive?: boolean\n}\n\nfunction DrawerContent({\n\tside = \"right\",\n\tresponsive = true,\n\tclassName,\n\tchildren,\n\t...props\n}: DrawerContentProps) {\n\treturn (\n\t\t<BaseDrawer.Portal>\n\t\t\t<DrawerBackdrop />\n\t\t\t<BaseDrawer.Popup\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Transparent positioning frame - slides in from the edge\n\t\t\t\t\t\"group/drawer fixed z-50 flex outline-none\",\n\t\t\t\t\tpopupPositionStyles[side],\n\t\t\t\t\t// Slide animation on the Popup\n\t\t\t\t\t\"transition-transform duration-500 ease-bruv-out-expo\",\n\t\t\t\t\tside === \"right\" && [\n\t\t\t\t\t\t\"data-[starting-style]:translate-x-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:translate-x-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\tside === \"left\" && [\n\t\t\t\t\t\t\"data-[starting-style]:-translate-x-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:-translate-x-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\tside === \"bottom\" && [\n\t\t\t\t\t\t\"data-[starting-style]:translate-y-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:translate-y-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\tside === \"top\" && [\n\t\t\t\t\t\t\"data-[starting-style]:-translate-y-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:-translate-y-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t// Responsive: force bottom on mobile\n\t\t\t\t\tresponsive && [\n\t\t\t\t\t\t\"max-md:inset-x-0 max-md:inset-y-auto max-md:bottom-0 max-md:right-auto max-md:left-auto\",\n\t\t\t\t\t\t\"max-md:w-full max-md:max-h-[85vh]\",\n\t\t\t\t\t\t\"max-md:data-[starting-style]:translate-x-0 max-md:data-[starting-style]:translate-y-[20%]\",\n\t\t\t\t\t\t\"max-md:data-[ending-style]:translate-x-0 max-md:data-[ending-style]:translate-y-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{/* Visible shell - scale + fade animation */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-1 flex min-h-0 flex-1 rounded-bruv-lg p-0.5 shadow-xl\",\n\t\t\t\t\t\t\"transition-[opacity,scale] duration-500 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"group-data-[starting-style]/drawer:scale-95 group-data-[starting-style]/drawer:opacity-0\",\n\t\t\t\t\t\t\"group-data-[ending-style]/drawer:scale-95 group-data-[ending-style]/drawer:opacity-0\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* Inner panel - content container */}\n\t\t\t\t\t<div className=\"bg-bruv-base-2 border-bruv-neutral rounded-bruv-md flex min-h-0 flex-1 flex-col overflow-hidden border\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</BaseDrawer.Popup>\n\t\t</BaseDrawer.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Drawer.Header\n// ---------------------------------------------------------------------------\n\nexport interface DrawerHeaderProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DrawerHeader = forwardRef<HTMLDivElement, DrawerHeaderProps>(\n\tfunction DrawerHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral flex items-center justify-between border-b px-4 py-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Title\n// ---------------------------------------------------------------------------\n\nexport interface DrawerTitleProps extends ComponentProps<\n\ttypeof BaseDrawer.Title\n> {}\n\nconst DrawerTitle = forwardRef<HTMLHeadingElement, DrawerTitleProps>(\n\tfunction DrawerTitle({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDrawer.Title\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Description\n// ---------------------------------------------------------------------------\n\nexport interface DrawerDescriptionProps extends ComponentProps<\n\ttypeof BaseDrawer.Description\n> {}\n\nconst DrawerDescription = forwardRef<\n\tHTMLParagraphElement,\n\tDrawerDescriptionProps\n>(function DrawerDescription({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseDrawer.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-bruv-secondary text-bruv-base\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Drawer.Body\n// ---------------------------------------------------------------------------\n\nexport interface DrawerBodyProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DrawerBody = forwardRef<HTMLDivElement, DrawerBodyProps>(\n\tfunction DrawerBody({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex-1 overflow-y-auto p-4\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Footer\n// ---------------------------------------------------------------------------\n\nexport interface DrawerFooterProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DrawerFooter = forwardRef<HTMLDivElement, DrawerFooterProps>(\n\tfunction DrawerFooter({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral flex items-center justify-end gap-2 border-t p-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Close\n// ---------------------------------------------------------------------------\n\nexport interface DrawerCloseProps extends ComponentProps<\n\ttypeof BaseDrawer.Close\n> {\n\t/** Show default XMarkIcon icon. Default: true when no children. */\n\tasIcon?: boolean\n}\n\nconst DrawerClose = forwardRef<HTMLButtonElement, DrawerCloseProps>(\n\tfunction DrawerClose({ asIcon, className, children, ...props }, ref) {\n\t\tconst showIcon = asIcon ?? !children\n\n\t\tif (showIcon) {\n\t\t\treturn (\n\t\t\t\t<BaseDrawer.Close\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-bruv-tertiary hover:text-bruv-primary -m-1 flex size-7 cursor-pointer items-center justify-center rounded-bruv-sm outline-none\",\n\t\t\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<XMarkIcon className=\"size-4\" />\n\t\t\t\t</BaseDrawer.Close>\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t<BaseDrawer.Close ref={ref} className={cn(className)} {...props}>\n\t\t\t\t{children}\n\t\t\t</BaseDrawer.Close>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Drawer = {\n\tRoot: DrawerRoot,\n\tTrigger: DrawerTrigger,\n\tContent: DrawerContent,\n\tHeader: DrawerHeader,\n\tTitle: DrawerTitle,\n\tDescription: DrawerDescription,\n\tBody: DrawerBody,\n\tFooter: DrawerFooter,\n\tClose: DrawerClose,\n}\n","import { forwardRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { FlickeringGrid } from \"../flickering-grid\"\n\nexport interface SkeletonProps {\n\t/** Use rounded-full instead of rounded-bruv-md (for avatar placeholders) */\n\tcircular?: boolean\n\tclassName?: string\n}\n\n/**\n * Skeleton loading placeholder with a sweeping pixel wave.\n *\n * Uses the `sweepOnly` mode of FlickeringGrid: pixels light up purely\n * based on the sweep wave position, with a per-pixel noise offset\n * creating a fuzzy, fringing edge on the wave front. No random flicker,\n * so the effect reads as a single directional motion rather than noise.\n */\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n\tfunction Skeleton({ circular, className }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative overflow-hidden bg-bruv-subtle\",\n\t\t\t\t\tcircular ? \"rounded-full\" : \"rounded-xs\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<FlickeringGrid\n\t\t\t\t\tsquareSize={4}\n\t\t\t\t\tgridGap={2}\n\t\t\t\t\tcolor=\"var(--text-color-bruv-secondary)\"\n\t\t\t\t\tmaxOpacity={0.05}\n\t\t\t\t\tsweep\n\t\t\t\t\tsweepOnly\n\t\t\t\t\tsweepDirection=\"right\"\n\t\t\t\t\tsweepDuration={1.5}\n\t\t\t\t\tsweepWidth={0.4}\n\t\t\t\t\tsweepNoise={0.1}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { useEffect, useRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// FlickeringGrid\n//\n// Canvas-based pixel grid that either flickers randomly, sweeps a wave of\n// brightness across, or both. Designed for loading states and decorative\n// backgrounds.\n//\n// Performance: one canvas draw call per frame regardless of pixel count.\n// Uses IntersectionObserver to pause when offscreen and ResizeObserver\n// to adapt to container size changes. DPR-aware for retina sharpness.\n// ---------------------------------------------------------------------------\n\nexport interface FlickeringGridProps {\n\t/** Size of each square pixel in px */\n\tsquareSize?: number\n\t/** Gap between squares in px */\n\tgridGap?: number\n\t/** Probability per second that a pixel changes opacity (0-1) */\n\tflickerChance?: number\n\t/** Pixel color — CSS color string. Use `currentColor` to inherit from text */\n\tcolor?: string\n\t/** Max opacity for any pixel (0-1) */\n\tmaxOpacity?: number\n\t/**\n\t * Enable a sweeping wave of brightness across the grid.\n\t * When enabled, pixels near the wave front appear brighter.\n\t */\n\tsweep?: boolean\n\t/** Sweep direction */\n\tsweepDirection?: \"left\" | \"right\"\n\t/** Duration of one sweep cycle in seconds */\n\tsweepDuration?: number\n\t/** Width of the sweep band as a fraction of total width (0-1) */\n\tsweepWidth?: number\n\t/**\n\t * When true, disables random flicker and drives pixel opacity purely\n\t * from the sweep wave. Each pixel gets a fixed noise offset so the\n\t * wave front has a fuzzy, fringing edge instead of a clean line.\n\t */\n\tsweepOnly?: boolean\n\t/**\n\t * Magnitude of the per-pixel noise offset (0-1) when `sweepOnly` is true.\n\t * Higher values produce fuzzier, more chaotic edges.\n\t */\n\tsweepNoise?: number\n\tclassName?: string\n}\n\n/**\n * Resolves a CSS color string (hex, rgb, currentColor, var(--token), etc.)\n * into whatever the browser returns for `getComputedStyle().color`.\n *\n * We set the color inline on the element, read the computed value, then\n * restore the previous inline color. Using the real element ensures\n * proper cascade resolution for CSS variables.\n *\n * The returned string is passed directly to `ctx.fillStyle`; opacity\n * is applied via `ctx.globalAlpha` at draw time, which sidesteps any\n * need to parse color-space strings like `rgb()`, `oklch()`, or `color()`.\n */\nfunction resolveColor(el: HTMLElement, color: string): string {\n\tconst previous = el.style.color\n\tel.style.color = color\n\tconst computed = getComputedStyle(el).color\n\tel.style.color = previous\n\t// Guard against empty or `inherit` that would fall back to canvas default.\n\treturn computed || \"#000\"\n}\n\nexport function FlickeringGrid({\n\tsquareSize = 6,\n\tgridGap = 0,\n\tflickerChance = 0.3,\n\tcolor = \"currentColor\",\n\tmaxOpacity = 0.3,\n\tsweep = false,\n\tsweepDirection = \"left\",\n\tsweepDuration = 2.5,\n\tsweepWidth = 0.15,\n\tsweepOnly = false,\n\tsweepNoise = 0.12,\n\tclassName,\n}: FlickeringGridProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\tconst canvasRef = useRef<HTMLCanvasElement>(null)\n\n\tuseEffect(() => {\n\t\tconst container = containerRef.current\n\t\tconst canvas = canvasRef.current\n\t\tif (!container || !canvas) return\n\n\t\tconst ctx = canvas.getContext(\"2d\")\n\t\tif (!ctx) return\n\n\t\tlet resolvedColor = resolveColor(container, color)\n\n\t\tlet cols = 0\n\t\tlet rows = 0\n\t\tlet squares = new Float32Array(0)\n\t\tlet noise = new Float32Array(0)\n\t\tlet dpr = 1\n\t\tlet width = 0\n\t\tlet height = 0\n\n\t\t// Sweep state\n\t\tconst startTime = performance.now()\n\n\t\tfunction setupCanvas() {\n\t\t\tif (!canvas || !container) return\n\t\t\tdpr = window.devicePixelRatio || 1\n\t\t\twidth = container.clientWidth\n\t\t\theight = container.clientHeight\n\t\t\tcanvas.width = width * dpr\n\t\t\tcanvas.height = height * dpr\n\t\t\tcanvas.style.width = `${width}px`\n\t\t\tcanvas.style.height = `${height}px`\n\n\t\t\tconst step = squareSize + gridGap\n\t\t\t// N rows fit when N*squareSize + (N-1)*gap ≤ height\n\t\t\t// Rearranged: N ≤ (height + gap) / step\n\t\t\tcols = Math.max(1, Math.floor((width + gridGap) / step))\n\t\t\trows = Math.max(1, Math.floor((height + gridGap) / step))\n\n\t\t\tsquares = new Float32Array(cols * rows)\n\t\t\tnoise = new Float32Array(cols * rows)\n\t\t\tfor (let i = 0; i < squares.length; i++) {\n\t\t\t\tsquares[i] = Math.random() * maxOpacity\n\t\t\t\t// Per-pixel noise offset in [-sweepNoise, +sweepNoise]\n\t\t\t\tnoise[i] = (Math.random() - 0.5) * 2 * sweepNoise\n\t\t\t}\n\t\t}\n\n\t\tfunction updateSquares(deltaTime: number) {\n\t\t\t// Skip random flicker when sweepOnly is enabled\n\t\t\tif (sweepOnly) return\n\t\t\tfor (let i = 0; i < squares.length; i++) {\n\t\t\t\tif (Math.random() < flickerChance * deltaTime) {\n\t\t\t\t\tsquares[i] = Math.random() * maxOpacity\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction drawGrid(time: number) {\n\t\t\tif (!ctx || !canvas) return\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height)\n\t\t\t// Set the fill to the resolved color once. We modulate per-pixel\n\t\t\t// visibility via globalAlpha, which works with any color space\n\t\t\t// the browser returns (rgb, oklch, color()).\n\t\t\tctx.fillStyle = resolvedColor\n\n\t\t\tconst step = squareSize + gridGap\n\n\t\t\t// Sweep position: 0 to 1+sweepWidth so the band fully exits the frame\n\t\t\tlet sweepPos = 0\n\t\t\tif (sweep) {\n\t\t\t\tconst cycle = ((time - startTime) / 1000 / sweepDuration) % 1\n\t\t\t\tsweepPos = sweepDirection === \"left\" ? 1 - cycle : cycle\n\t\t\t\t// Extend range slightly so the sweep fully enters and exits\n\t\t\t\tsweepPos = sweepPos * (1 + sweepWidth * 2) - sweepWidth\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < cols; i++) {\n\t\t\t\tfor (let j = 0; j < rows; j++) {\n\t\t\t\t\tconst idx = i * rows + j\n\t\t\t\t\tlet opacity: number\n\n\t\t\t\t\tif (sweepOnly && sweep) {\n\t\t\t\t\t\t// Opacity is driven purely by the sweep wave.\n\t\t\t\t\t\t// Each pixel's position in the wave is shifted by its\n\t\t\t\t\t\t// per-pixel noise offset, creating a fuzzy edge.\n\t\t\t\t\t\tconst colFrac = cols > 1 ? i / (cols - 1) : 0\n\t\t\t\t\t\tconst shifted = colFrac + (noise[idx] ?? 0)\n\t\t\t\t\t\tconst dist = Math.abs(shifted - sweepPos)\n\t\t\t\t\t\tconst boost = Math.max(0, 1 - dist / sweepWidth)\n\t\t\t\t\t\t// Smoothstep for a soft falloff\n\t\t\t\t\t\tconst smooth = boost * boost * (3 - 2 * boost)\n\t\t\t\t\t\topacity = smooth * maxOpacity\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Base opacity from the random flicker buffer\n\t\t\t\t\t\topacity = squares[idx] ?? 0\n\n\t\t\t\t\t\t// Apply sweep boost if enabled: pixels near the wave\n\t\t\t\t\t\t// front get brighter on top of their base opacity.\n\t\t\t\t\t\tif (sweep) {\n\t\t\t\t\t\t\tconst colFrac = cols > 1 ? i / (cols - 1) : 0\n\t\t\t\t\t\t\tconst dist = Math.abs(colFrac - sweepPos)\n\t\t\t\t\t\t\tconst boost = Math.max(0, 1 - dist / sweepWidth)\n\t\t\t\t\t\t\tconst smooth = boost * boost * (3 - 2 * boost)\n\t\t\t\t\t\t\topacity = Math.min(\n\t\t\t\t\t\t\t\tmaxOpacity * 1.5,\n\t\t\t\t\t\t\t\topacity + smooth * maxOpacity,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opacity < 0.01) continue\n\n\t\t\t\t\tctx.globalAlpha = opacity\n\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\ti * step * dpr,\n\t\t\t\t\t\tj * step * dpr,\n\t\t\t\t\t\tsquareSize * dpr,\n\t\t\t\t\t\tsquareSize * dpr,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.globalAlpha = 1\n\t\t}\n\n\t\tsetupCanvas()\n\n\t\tlet rafId = 0\n\t\tlet lastTime = performance.now()\n\t\tlet inView = true\n\n\t\tfunction frame(time: number) {\n\t\t\tif (!inView) return\n\t\t\tconst deltaTime = (time - lastTime) / 1000\n\t\t\tlastTime = time\n\t\t\tupdateSquares(deltaTime)\n\t\t\tdrawGrid(time)\n\t\t\trafId = requestAnimationFrame(frame)\n\t\t}\n\n\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\tsetupCanvas()\n\t\t})\n\t\tresizeObserver.observe(container)\n\n\t\tconst intersectionObserver = new IntersectionObserver(\n\t\t\t([entry]) => {\n\t\t\t\tinView = entry?.isIntersecting ?? false\n\t\t\t\tif (inView) {\n\t\t\t\t\tlastTime = performance.now()\n\t\t\t\t\trafId = requestAnimationFrame(frame)\n\t\t\t\t} else {\n\t\t\t\t\tcancelAnimationFrame(rafId)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ threshold: 0 },\n\t\t)\n\t\tintersectionObserver.observe(canvas)\n\n\t\t// Re-resolve the color when the theme changes so CSS variables\n\t\t// (like var(--text-color-bruv-secondary)) pick up new values.\n\t\tconst themeObserver = new MutationObserver(() => {\n\t\t\tresolvedColor = resolveColor(container, color)\n\t\t})\n\t\tthemeObserver.observe(document.documentElement, {\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\"data-theme\", \"class\"],\n\t\t})\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(rafId)\n\t\t\tresizeObserver.disconnect()\n\t\t\tintersectionObserver.disconnect()\n\t\t\tthemeObserver.disconnect()\n\t\t}\n\t}, [\n\t\tsquareSize,\n\t\tgridGap,\n\t\tflickerChance,\n\t\tcolor,\n\t\tmaxOpacity,\n\t\tsweep,\n\t\tsweepDirection,\n\t\tsweepDuration,\n\t\tsweepWidth,\n\t\tsweepOnly,\n\t\tsweepNoise,\n\t])\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"pointer-events-none size-full\", className)}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<canvas ref={canvasRef} />\n\t\t</div>\n\t)\n}\n","import {\n\tcreateContext,\n\tuseContext,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\"\n\nexport type SidebarLinkComponent = ComponentType<{\n\treadonly to?: string\n\treadonly href?: string\n\treadonly className?: string\n\treadonly children?: ReactNode\n}>\n\nexport interface SidebarContextValue {\n\treadonly collapsed: boolean\n\treadonly toggle: () => void\n\treadonly linkComponent?: SidebarLinkComponent\n\treadonly mobile: boolean\n\treadonly mobileOpen: boolean\n\treadonly setMobileOpen: (open: boolean) => void\n}\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null)\n\nexport function useSidebar(): SidebarContextValue {\n\tconst ctx = useContext(SidebarContext)\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"useSidebar must be used within a <Sidebar> or <Sidebar.Provider>\",\n\t\t)\n\t}\n\treturn ctx\n}\n\n/** Returns the sidebar context if available, or null. */\nexport function useSidebarOptional(): SidebarContextValue | null {\n\treturn useContext(SidebarContext)\n}\n","import { forwardRef, type ReactElement, type ReactNode } from \"react\"\nimport { Select as BaseSelect } from \"@base-ui/react/select\"\nimport { ChevronUpDownIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button, type ButtonSize } from \"../button\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SelectItem {\n\tvalue: string\n\tlabel: string\n\ticon?: ReactNode\n\t[key: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Select (Root)\n// ---------------------------------------------------------------------------\n\nexport interface SelectProps {\n\t/** Controlled value */\n\tvalue?: string\n\t/** Uncontrolled default value */\n\tdefaultValue?: string\n\t/** Called when a value is selected */\n\tonValueChange?: (value: string) => void\n\t/** Item data for rendering and value display */\n\titems: SelectItem[]\n\t/** Whether the select is disabled */\n\tdisabled?: boolean\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Select component for choosing from a list of predefined options.\n *\n * For searchable/filterable lists, use Combobox instead.\n *\n * Wraps Base UI Select.Root with shared Menu visual primitives.\n */\nexport function Select({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\titems,\n\tdisabled,\n\tchildren,\n\tclassName,\n}: SelectProps): ReactElement {\n\treturn (\n\t\t<BaseSelect.Root\n\t\t\tvalue={value}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tonValueChange={\n\t\t\t\tonValueChange\n\t\t\t\t\t? val => {\n\t\t\t\t\t\t\tif (val != null) onValueChange(val)\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\titems={items}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t{className ? <div className={className}>{children}</div> : children}\n\t\t</BaseSelect.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// SelectTrigger — composable\n// ---------------------------------------------------------------------------\n\nexport interface SelectTriggerProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Fully composable trigger. Renders whatever children you give it as the\n * element that opens the select popup.\n */\nexport const SelectTrigger = forwardRef<HTMLButtonElement, SelectTriggerProps>(\n\tfunction SelectTrigger({ children, className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"cursor-pointer rounded-bruv-md outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseSelect.Trigger>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectButton — pre-styled trigger\n// ---------------------------------------------------------------------------\n\nexport interface SelectButtonProps {\n\t/** Placeholder text shown when no value is selected */\n\tplaceholder?: string\n\t/** Size of the button */\n\tsize?: ButtonSize\n\tclassName?: string\n}\n\n/**\n * Pre-styled trigger for form contexts.\n * Renders as a Button with the selected value + chevron icon.\n */\nexport const SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(\n\tfunction SelectButton({ placeholder, size, className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Trigger\n\t\t\t\tref={ref}\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\ticonRight={<ChevronUpDownIcon />}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseSelect.Value placeholder={placeholder} />\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectContent — popup with list\n// ---------------------------------------------------------------------------\n\nexport interface SelectContentProps {\n\t/** Alignment relative to trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\t/** Minimum width */\n\tminWidth?: string\n\t/** SelectOption elements */\n\tchildren?: ReactNode\n\tclassName?: string\n}\n\n/**\n * Popup with a scrollable list of options.\n * Uses Base UI Select primitives with shared Menu visuals.\n */\nexport function SelectContent({\n\talign = \"start\",\n\tside = \"bottom\",\n\tsideOffset = 4,\n\tminWidth = \"min-w-[220px]\",\n\tchildren,\n\tclassName,\n}: SelectContentProps): ReactElement {\n\treturn (\n\t\t<BaseSelect.Portal>\n\t\t\t<BaseSelect.Positioner\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\talignItemWithTrigger={false}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseSelect.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t<BaseSelect.List render={<Menu.List />}>{children}</BaseSelect.List>\n\t\t\t\t</BaseSelect.Popup>\n\t\t\t</BaseSelect.Positioner>\n\t\t</BaseSelect.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// SelectOption\n// ---------------------------------------------------------------------------\n\nexport interface SelectOptionProps {\n\t/** Value for this option */\n\tvalue: string\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Individual option in the select popup.\n * Automatically includes a checkmark indicator when selected.\n */\nexport const SelectOption = forwardRef<HTMLDivElement, SelectOptionProps>(\n\tfunction SelectOption({ value, icon, children, className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Item\n\t\t\t\tref={ref}\n\t\t\t\tvalue={value}\n\t\t\t\trender={<Menu.Item icon={icon} className={className} />}\n\t\t\t>\n\t\t\t\t<BaseSelect.ItemText className=\"relative z-[1] flex-1\">\n\t\t\t\t\t{children}\n\t\t\t\t</BaseSelect.ItemText>\n\t\t\t\t<BaseSelect.ItemIndicator render={<Menu.ItemIndicator />} />\n\t\t\t</BaseSelect.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectSeparator\n// ---------------------------------------------------------------------------\n\nexport interface SelectSeparatorProps {\n\tclassName?: string\n}\n\nexport const SelectSeparator = forwardRef<HTMLDivElement, SelectSeparatorProps>(\n\tfunction SelectSeparator({ className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Separator\n\t\t\t\tref={ref}\n\t\t\t\trender={<Menu.Separator className={className} />}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectGroup / SelectGroupLabel\n// ---------------------------------------------------------------------------\n\nexport interface SelectGroupProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const SelectGroup = forwardRef<HTMLDivElement, SelectGroupProps>(\n\tfunction SelectGroup({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Group ref={ref} className={cn(\"flex flex-col\", className)}>\n\t\t\t\t{children}\n\t\t\t</BaseSelect.Group>\n\t\t)\n\t},\n)\n\nexport interface SelectGroupLabelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const SelectGroupLabel = forwardRef<\n\tHTMLDivElement,\n\tSelectGroupLabelProps\n>(function SelectGroupLabel({ className, children }, ref) {\n\treturn (\n\t\t<BaseSelect.GroupLabel\n\t\t\tref={ref}\n\t\t\trender={<Menu.GroupLabel className={className} />}\n\t\t>\n\t\t\t{children}\n\t\t</BaseSelect.GroupLabel>\n\t)\n})\n","import { forwardRef } from \"react\"\nimport { Separator as BaseSeparator } from \"@base-ui/react/separator\"\nimport type { ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface SeparatorProps extends ComponentProps<typeof BaseSeparator> {\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\nexport const Separator = forwardRef<HTMLHRElement, SeparatorProps>(\n\tfunction Separator({ orientation = \"horizontal\", className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseSeparator\n\t\t\t\tref={ref}\n\t\t\t\torientation={orientation}\n\t\t\t\tclassName={cn(\n\t\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t\t? \"w-full border-t border-bruv-neutral\"\n\t\t\t\t\t\t: \"self-stretch border-l border-bruv-neutral\",\n\t\t\t\t\t\"shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n","import { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport {\n\tforwardRef,\n\ttype ComponentPropsWithoutRef,\n\ttype MouseEvent,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst filledVariantStyles = {\n\tneutral: \"bg-bruv-subtle text-bruv-secondary\",\n\taccent: \"bg-bruv-accent-subtle text-bruv-accent\",\n\tdanger: \"bg-bruv-danger-subtle text-bruv-danger\",\n\twarn: \"bg-bruv-warn-subtle text-bruv-warn\",\n\tsuccess: \"bg-bruv-success-subtle text-bruv-success\",\n} as const\n\nconst borderVariantStyles = {\n\tneutral: \"border border-current text-bruv-secondary\",\n\taccent: \"border border-current text-bruv-accent\",\n\tdanger: \"border border-current text-bruv-danger\",\n\twarn: \"border border-current text-bruv-warn\",\n\tsuccess: \"border border-current text-bruv-success\",\n} as const\n\nconst sizeStyles = {\n\tsm: \"px-1.5 py-0.5 text-bruv-sm\",\n\tmd: \"px-2 py-0.5 text-bruv-base\",\n} as const\n\nconst gapStyles = {\n\tsm: \"gap-1\",\n\tmd: \"gap-1.5\",\n} as const\n\nconst dotSizeStyles = {\n\tsm: \"size-1.5\",\n\tmd: \"size-2\",\n} as const\n\nconst dotVariantStyles = {\n\tneutral: \"bg-bruv-tertiary\",\n\taccent: \"bg-bruv-accent\",\n\tdanger: \"bg-bruv-danger\",\n\twarn: \"bg-bruv-warn\",\n\tsuccess: \"bg-bruv-success\",\n} as const\n\nconst dismissIconSizeStyles = {\n\tsm: \"size-3\",\n\tmd: \"size-3.5\",\n} as const\n\nexport type BadgeVariant = keyof typeof filledVariantStyles\nexport type BadgeSize = keyof typeof sizeStyles\nexport type BadgeDotPosition = \"leading\" | \"trailing\"\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<\"span\"> {\n\t/** Semantic intent (color). */\n\tvariant?: BadgeVariant\n\t/** Size of the badge. */\n\tsize?: BadgeSize\n\t/**\n\t * Render with a border instead of a filled (subtle) background.\n\t * Border color is bound to the variant's text color so contrast\n\t * passes WCAG in both light and dark mode.\n\t */\n\tborder?: boolean\n\t/** Show a status dot whose color follows `variant`. */\n\tdot?: boolean\n\t/** Where the dot sits relative to the label. Default `\"leading\"`. */\n\tdotPosition?: BadgeDotPosition\n\t/**\n\t * Render a trailing dismiss (×) button and call this on click.\n\t * Receives the event so callers can `stopPropagation()` when the\n\t * badge sits inside an interactive parent.\n\t */\n\tonDismiss?: (event: MouseEvent<HTMLButtonElement>) => void\n\t/** Accessible label for the dismiss button. */\n\tdismissLabel?: string\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n\t{\n\t\tvariant = \"neutral\",\n\t\tsize = \"sm\",\n\t\tborder = false,\n\t\tdot = false,\n\t\tdotPosition = \"leading\",\n\t\tonDismiss,\n\t\tdismissLabel = \"Dismiss\",\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst variantStyles = border ? borderVariantStyles : filledVariantStyles\n\tconst hasAdornment = dot || onDismiss != null\n\n\tconst dotNode = dot ? (\n\t\t<span\n\t\t\taria-hidden\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex shrink-0 rounded-full\",\n\t\t\t\tdotSizeStyles[size],\n\t\t\t\tdotVariantStyles[variant],\n\t\t\t)}\n\t\t/>\n\t) : null\n\n\treturn (\n\t\t<span\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex items-center rounded-bruv-md font-medium leading-tight\",\n\t\t\t\tsizeStyles[size],\n\t\t\t\thasAdornment && gapStyles[size],\n\t\t\t\tvariantStyles[variant],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{dot && dotPosition === \"leading\" && dotNode}\n\t\t\t{children}\n\t\t\t{dot && dotPosition === \"trailing\" && dotNode}\n\t\t\t{onDismiss && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={dismissLabel}\n\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"-mr-0.5 inline-flex shrink-0 cursor-pointer items-center justify-center rounded-bruv-sm\",\n\t\t\t\t\t\t\"opacity-70 transition-opacity hover:opacity-100\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-1\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<XMarkIcon className={dismissIconSizeStyles[size]} />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</span>\n\t)\n})\n","import {\n\tforwardRef,\n\tuseSyncExternalStore,\n\ttype ComponentPropsWithoutRef,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction getIsMac(): boolean {\n\tif (typeof navigator === \"undefined\") return true\n\tconst nav: Navigator & {\n\t\treadonly userAgentData?: { readonly platform?: string }\n\t} = navigator\n\tconst platform = nav.userAgentData?.platform ?? nav.platform\n\treturn /(Mac|iPhone|iPad|iPod)/i.test(platform ?? \"\")\n}\n\n/** Cached result — platform never changes within a session. */\nlet cachedIsMac: boolean | undefined\n\nfunction subscribe() {\n\treturn () => {}\n}\n\nfunction getSnapshot(): boolean {\n\tif (cachedIsMac === undefined) cachedIsMac = getIsMac()\n\treturn cachedIsMac\n}\n\nfunction getServerSnapshot(): boolean {\n\treturn true\n}\n\n/**\n * Returns `true` on macOS / iOS, `false` on Windows / Linux.\n * SSR-safe (defaults to Mac).\n */\nexport function useIsMac(): boolean {\n\treturn useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n\n// ---------------------------------------------------------------------------\n// Key mapping\n// ---------------------------------------------------------------------------\n\nconst MAC_KEYS: Record<string, string> = {\n\tmod: \"\\u2318\",\n\tctrl: \"\\u2303\",\n\talt: \"\\u2325\",\n\tshift: \"\\u21E7\",\n\tenter: \"\\u21B5\",\n\tescape: \"Esc\",\n\tbackspace: \"\\u232B\",\n\tdelete: \"\\u2326\",\n\ttab: \"\\u21E5\",\n\tspace: \"Space\",\n\tup: \"\\u2191\",\n\tdown: \"\\u2193\",\n\tleft: \"\\u2190\",\n\tright: \"\\u2192\",\n}\n\nconst WIN_KEYS: Record<string, string> = {\n\tmod: \"Ctrl\",\n\tctrl: \"Ctrl\",\n\talt: \"Alt\",\n\tshift: \"Shift\",\n\tenter: \"\\u21B5\",\n\tescape: \"Esc\",\n\tbackspace: \"\\u232B\",\n\tdelete: \"Del\",\n\ttab: \"Tab\",\n\tspace: \"Space\",\n\tup: \"\\u2191\",\n\tdown: \"\\u2193\",\n\tleft: \"\\u2190\",\n\tright: \"\\u2192\",\n}\n\nfunction resolveKey(token: string, isMac: boolean): string {\n\tconst lower = token.toLowerCase()\n\tconst map = isMac ? MAC_KEYS : WIN_KEYS\n\treturn map[lower] ?? token.toUpperCase()\n}\n\nfunction formatKeys(raw: string, isMac: boolean): string {\n\treturn raw\n\t\t.split(\"+\")\n\t\t.map(t => resolveKey(t.trim(), isMac))\n\t\t.join(\" \")\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport interface KbdProps extends ComponentPropsWithoutRef<\"kbd\"> {\n\t/**\n\t * A `+`-separated shortcut string using abstract key names.\n\t *\n\t * Tokens are mapped per-platform and rendered together\n\t * inside a single key cap, separated by spaces:\n\t * `\"mod+shift+k\"` → `⌘ ⇧ K` (Mac) / `Ctrl Shift K` (Win)\n\t *\n\t * - `mod` → ⌘ (Mac) / Ctrl (Win)\n\t * - `alt` → ⌥ (Mac) / Alt (Win)\n\t * - `shift` → ⇧ (Mac) / Shift (Win)\n\t * - `ctrl` → ⌃ (Mac) / Ctrl (Win)\n\t * - `enter`, `escape`, `backspace`, `delete`, `tab`, `space`\n\t * - `up`, `down`, `left`, `right`\n\t * - Any other token is uppercased as-is.\n\t *\n\t * @example \"mod+k\" → ⌘ K (Mac) or Ctrl K (Win)\n\t * @example \"mod+shift+s\" → ⌘ ⇧ S (Mac) or Ctrl Shift S (Win)\n\t */\n\tkeys?: string\n}\n\n/**\n * Renders keyboard keys or shortcuts in a single styled `<kbd>` element.\n *\n * When `keys` is provided, parses the `+`-separated string and renders\n * all tokens inside one key cap with platform-aware symbols.\n * All tokens are joined with spaces inside one key cap.\n *\n * When `children` is provided (without `keys`), renders a single `<kbd>`\n * with the raw content — useful for one-off custom key caps.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(function Kbd(\n\t{ keys, className, children, ...props },\n\tref,\n) {\n\tconst isMac = useIsMac()\n\n\treturn (\n\t\t<kbd\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex h-5 min-w-5 items-center justify-center gap-1 rounded border border-bruv-neutral bg-bruv-base-1 px-1.5 font-bruv-sans text-xs font-medium leading-tight text-bruv-secondary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{keys ? formatKeys(keys, isMac) : children}\n\t\t</kbd>\n\t)\n})\n","import { Field } from \"@base-ui/react/field\"\nimport {\n\tforwardRef,\n\ttype ComponentProps,\n\ttype FormHTMLAttributes,\n\ttype ReactNode,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst inputSizeStyles = {\n\tsm: \"px-2.5 py-1 text-bruv-sm min-h-7\",\n\tmd: \"px-3 py-1.5 text-bruv-base min-h-8\",\n} as const\n\nexport type FormInputSize = keyof typeof inputSizeStyles\n\nexport interface FormRootProps extends FormHTMLAttributes<HTMLFormElement> {}\n\nexport const FormRoot = forwardRef<HTMLFormElement, FormRootProps>(\n\tfunction FormRoot({ className, noValidate = true, ...props }, ref) {\n\t\treturn (\n\t\t\t<form\n\t\t\t\tref={ref}\n\t\t\t\tnoValidate={noValidate}\n\t\t\t\tclassName={cn(\"flex flex-col gap-4\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormFieldProps extends ComponentProps<typeof Field.Root> {}\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n\tfunction FormField({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Root\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex flex-col gap-1.5\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormLabelProps extends ComponentProps<typeof Field.Label> {\n\trequired?: boolean\n}\n\nexport const FormLabel = forwardRef<HTMLLabelElement, FormLabelProps>(\n\tfunction FormLabel({ required, className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Label\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-base font-medium text-bruv-primary\",\n\t\t\t\t\t\"data-[disabled]:text-bruv-tertiary data-[disabled]:cursor-not-allowed\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{required && (\n\t\t\t\t\t<span className=\"text-bruv-danger ml-0.5\" aria-hidden=\"true\">\n\t\t\t\t\t\t*\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</Field.Label>\n\t\t)\n\t},\n)\n\n/** Shared visual styles for standalone input (no icons) */\nconst inputStyles = [\n\t\"w-full rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 text-bruv-primary\",\n\t\"outline-none\",\n\t\"placeholder:text-bruv-tertiary\",\n\t\"ring-bruv-neutral ring-0 transition-[box-shadow,color,border-color] duration-150 ease-out\",\n\t\"focus:ring-2 focus:border-bruv-neutral-strong\",\n\t\"motion-reduce:transition-none\",\n\t\"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n\t\"data-[invalid]:border-bruv-danger data-[invalid]:focus:ring-bruv-danger/30\",\n\t\"data-[valid]:border-bruv-success\",\n]\n\n/** Wrapper styles when icons are present - mirrors inputStyles but uses has-[:focus] */\nconst wrapperStyles = [\n\t\"rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 py-1.5 text-bruv-base\",\n\t\"ring-bruv-neutral ring-0 transition-[box-shadow,color,border-color] duration-150 ease-out\",\n\t\"has-[:focus]:ring-2 has-[:focus]:border-bruv-neutral-strong\",\n\t\"motion-reduce:transition-none\",\n\t\"has-[*[data-disabled]]:cursor-not-allowed has-[*[data-disabled]]:opacity-50\",\n\t\"has-[*[data-invalid]]:border-bruv-danger has-[*[data-invalid]:focus]:ring-bruv-danger/30\",\n\t\"has-[*[data-valid]]:border-bruv-success\",\n]\n\nexport interface FormInputProps extends Omit<\n\tComponentProps<typeof Field.Control>,\n\t\"size\"\n> {\n\tsize?: FormInputSize\n\t/** Icon element rendered before the input */\n\ticonLeft?: ReactNode\n\t/** Icon element rendered after the input */\n\ticonRight?: ReactNode\n\t/** Additional classes on the outer wrapper (only when icons are present) */\n\twrapperClassName?: string\n}\n\nexport const FormInput = forwardRef<HTMLInputElement, FormInputProps>(\n\tfunction FormInput(\n\t\t{ size = \"md\", iconLeft, iconRight, wrapperClassName, className, ...props },\n\t\tref,\n\t) {\n\t\tconst hasIcon = !!iconLeft || !!iconRight\n\t\tconst sizeClass = inputSizeStyles[size]\n\n\t\tif (!hasIcon) {\n\t\t\treturn (\n\t\t\t\t<Field.Control\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(inputStyles, sizeClass, className)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center gap-2\",\n\t\t\t\t\tsize === \"sm\" ? \"px-2\" : \"px-2.5\",\n\t\t\t\t\twrapperStyles,\n\t\t\t\t\twrapperClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{iconLeft && (\n\t\t\t\t\t<span className=\"text-bruv-tertiary flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconLeft}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<Field.Control\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex-1 min-w-0 h-full bg-transparent text-bruv-primary outline-none placeholder:text-bruv-tertiary\",\n\t\t\t\t\t\tsize === \"sm\" ? \"text-bruv-sm\" : \"text-bruv-base\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t{iconRight && (\n\t\t\t\t\t<span className=\"text-bruv-tertiary flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconRight}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface FormTextareaProps extends Omit<\n\tComponentProps<typeof Field.Control>,\n\t\"size\"\n> {\n\tsize?: FormInputSize\n}\n\nexport const FormTextarea = forwardRef<HTMLTextAreaElement, FormTextareaProps>(\n\tfunction FormTextarea({ size = \"md\", className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Control\n\t\t\t\tref={ref}\n\t\t\t\trender={<textarea />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tinputStyles,\n\t\t\t\t\tinputSizeStyles[size],\n\t\t\t\t\t\"min-h-20 resize-y\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormHintProps extends ComponentProps<\n\ttypeof Field.Description\n> {}\n\nexport const FormHint = forwardRef<HTMLParagraphElement, FormHintProps>(\n\tfunction FormHint({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Description\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"text-bruv-sm text-bruv-tertiary\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormErrorProps extends ComponentProps<typeof Field.Error> {}\n\nexport const FormError = forwardRef<HTMLParagraphElement, FormErrorProps>(\n\tfunction FormError({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Error\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"text-bruv-sm text-bruv-danger\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport const Form = {\n\tRoot: FormRoot,\n\tField: FormField,\n\tLabel: FormLabel,\n\tInput: FormInput,\n\tTextarea: FormTextarea,\n\tHint: FormHint,\n\tError: FormError,\n}\n","import { forwardRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst variantStyles = {\n\tneutral: \"bg-bruv-tertiary\",\n\taccent: \"bg-bruv-accent\",\n\tsuccess: \"bg-bruv-success\",\n\twarn: \"bg-bruv-warn\",\n\tdanger: \"bg-bruv-danger\",\n} as const\n\nconst sizeStyles = {\n\tsm: \"size-1.5\",\n\tmd: \"size-2\",\n\tlg: \"size-2.5\",\n} as const\n\nexport type StatusDotVariant = keyof typeof variantStyles\nexport type StatusDotSize = keyof typeof sizeStyles\n\nexport interface StatusDotProps {\n\t/** Color variant */\n\tvariant?: StatusDotVariant\n\t/** Dot size */\n\tsize?: StatusDotSize\n\t/** Accessible label (required for meaningful status indicators) */\n\tlabel?: string\n\tclassName?: string\n}\n\n/**\n * Small circular status indicator dot.\n *\n * Use alongside text labels, avatars, or table cells\n * to convey online/offline, severity, or activity state.\n */\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(\n\tfunction StatusDot(\n\t\t{ variant = \"neutral\", size = \"md\", label, className },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\trole={label ? \"status\" : undefined}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex shrink-0 rounded-full\",\n\t\t\t\t\tvariantStyles[variant],\n\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t/>\n\t\t)\n\t},\n)\n","import { forwardRef, type ReactNode, type ComponentProps } from \"react\"\nimport { Menu as BaseMenu } from \"@base-ui/react/menu\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Root\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuRootProps {\n\t/** Controlled open state */\n\topen?: boolean\n\t/** Uncontrolled default open state */\n\tdefaultOpen?: boolean\n\t/** Called when open state changes */\n\tonOpenChange?: (open: boolean) => void\n\t/** Whether the menu is modal (locks scroll + traps focus). Default true. */\n\tmodal?: boolean\n\tchildren: ReactNode\n}\n\nfunction DropdownMenuRoot({\n\topen,\n\tdefaultOpen,\n\tonOpenChange,\n\tmodal = true,\n\tchildren,\n}: DropdownMenuRootProps) {\n\treturn (\n\t\t<BaseMenu.Root\n\t\t\topen={open}\n\t\t\tdefaultOpen={defaultOpen}\n\t\t\tonOpenChange={onOpenChange ? o => onOpenChange(o) : undefined}\n\t\t\tmodal={modal}\n\t\t>\n\t\t\t{children}\n\t\t</BaseMenu.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuTriggerProps extends ComponentProps<\n\ttypeof BaseMenu.Trigger\n> {}\n\nconst DropdownMenuTrigger = forwardRef<\n\tHTMLButtonElement,\n\tDropdownMenuTriggerProps\n>(function DropdownMenuTrigger({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseMenu.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"cursor-pointer outline-none\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Content\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuContentProps {\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\t/** Minimum width */\n\tminWidth?: string\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nfunction DropdownMenuContent({\n\tside = \"bottom\",\n\talign = \"end\",\n\tsideOffset = 4,\n\tminWidth = \"min-w-[180px]\",\n\tclassName,\n\tchildren,\n}: DropdownMenuContentProps) {\n\treturn (\n\t\t<BaseMenu.Portal>\n\t\t\t<BaseMenu.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseMenu.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseMenu.Popup>\n\t\t\t</BaseMenu.Positioner>\n\t\t</BaseMenu.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Item\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuItemProps {\n\t/** Danger styling (red text) */\n\tvariant?: \"default\" | \"danger\"\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\t/** Called when the item is clicked */\n\tonClick?: () => void\n\t/** Close menu on click. Default true. */\n\tcloseOnClick?: boolean\n\t/** Whether the item is disabled */\n\tdisabled?: boolean\n\tclassName?: string\n\tchildren?: ReactNode\n}\n\nconst DropdownMenuItem = forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n\tfunction DropdownMenuItem(\n\t\t{\n\t\t\tvariant = \"default\",\n\t\t\ticon,\n\t\t\tonClick,\n\t\t\tcloseOnClick,\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t},\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<BaseMenu.Item\n\t\t\t\tref={ref}\n\t\t\t\tonClick={onClick}\n\t\t\t\tcloseOnClick={closeOnClick}\n\t\t\t\tdisabled={disabled}\n\t\t\t\trender={\n\t\t\t\t\t<Menu.Item icon={icon} variant={variant} className={className} />\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t</BaseMenu.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Separator\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuSeparatorProps {\n\tclassName?: string\n}\n\nconst DropdownMenuSeparator = forwardRef<\n\tHTMLDivElement,\n\tDropdownMenuSeparatorProps\n>(function DropdownMenuSeparator({ className }, ref) {\n\treturn (\n\t\t<BaseMenu.Separator\n\t\t\tref={ref}\n\t\t\trender={<Menu.Separator className={className} />}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Label\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuLabelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DropdownMenuLabel = forwardRef<HTMLDivElement, DropdownMenuLabelProps>(\n\tfunction DropdownMenuLabel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseMenu.GroupLabel\n\t\t\t\tref={ref}\n\t\t\t\trender={<Menu.GroupLabel className={className} />}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseMenu.GroupLabel>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Group\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuGroupProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DropdownMenuGroup = forwardRef<HTMLDivElement, DropdownMenuGroupProps>(\n\tfunction DropdownMenuGroup({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseMenu.Group ref={ref} className={cn(\"flex flex-col\", className)}>\n\t\t\t\t{children}\n\t\t\t</BaseMenu.Group>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const DropdownMenu = {\n\tRoot: DropdownMenuRoot,\n\tTrigger: DropdownMenuTrigger,\n\tContent: DropdownMenuContent,\n\tItem: DropdownMenuItem,\n\tSeparator: DropdownMenuSeparator,\n\tLabel: DropdownMenuLabel,\n\tGroup: DropdownMenuGroup,\n}\n","import { Dialog as BaseDialog } from \"@base-ui/react/dialog\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface DialogRootProps extends ComponentProps<\n\ttypeof BaseDialog.Root\n> {}\n\nexport function DialogRoot({ ...props }: DialogRootProps) {\n\treturn <BaseDialog.Root {...props} />\n}\n\nexport interface DialogTriggerProps extends ComponentProps<\n\ttypeof BaseDialog.Trigger\n> {}\n\nexport const DialogTrigger = forwardRef<HTMLButtonElement, DialogTriggerProps>(\n\tfunction DialogTrigger({ className, ...props }, ref) {\n\t\treturn <BaseDialog.Trigger ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\nexport interface DialogBackdropProps extends ComponentProps<\n\ttypeof BaseDialog.Backdrop\n> {}\n\nexport const DialogBackdrop = forwardRef<HTMLDivElement, DialogBackdropProps>(\n\tfunction DialogBackdrop({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDialog.Backdrop\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\t\"transition-opacity duration-150\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nconst sizeStyles = {\n\tmd: \"max-w-[450px]\",\n\tlg: \"max-w-[550px]\",\n} as const\n\nexport type DialogSize = keyof typeof sizeStyles\n\nexport interface DialogContentProps extends ComponentProps<\n\ttypeof BaseDialog.Popup\n> {\n\tsize?: DialogSize\n}\n\nexport function DialogContent({\n\tsize = \"md\",\n\tclassName,\n\tchildren,\n\t...props\n}: DialogContentProps) {\n\treturn (\n\t\t<BaseDialog.Portal>\n\t\t\t<DialogBackdrop />\n\t\t\t<BaseDialog.Popup\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-1 fixed top-1/2 left-1/2 z-50 max-h-[85vh] w-[90vw] -translate-x-1/2 -translate-y-1/2 rounded-bruv-lg p-0.5 shadow-xl\",\n\t\t\t\t\t\"transition-[opacity,scale] duration-150 ease-out\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0 data-[starting-style]:scale-[0.96]\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0 data-[ending-style]:scale-[0.98]\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseDialog.Popup>\n\t\t</BaseDialog.Portal>\n\t)\n}\n\nexport interface DialogPanelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const DialogPanel = forwardRef<HTMLDivElement, DialogPanelProps>(\n\tfunction DialogPanel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral rounded-bruv-md border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface DialogTitleProps extends ComponentProps<\n\ttypeof BaseDialog.Title\n> {}\n\nexport const DialogTitle = forwardRef<HTMLHeadingElement, DialogTitleProps>(\n\tfunction DialogTitle({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDialog.Title\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary border-bruv-neutral border-b px-4 py-3 text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface DialogBodyProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const DialogBody = forwardRef<HTMLDivElement, DialogBodyProps>(\n\tfunction DialogBody({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"p-4\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface DialogFooterProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const DialogFooter = forwardRef<HTMLDivElement, DialogFooterProps>(\n\tfunction DialogFooter({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex items-center justify-between p-2\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface DialogCloseProps extends ComponentProps<\n\ttypeof BaseDialog.Close\n> {}\n\nexport const DialogClose = forwardRef<HTMLButtonElement, DialogCloseProps>(\n\tfunction DialogClose({ className, ...props }, ref) {\n\t\treturn <BaseDialog.Close ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\n/**\n * @deprecated Use a plain `<p>` inside Dialog.Body instead.\n * Kept as an alias around BaseDialog.Description for mono compatibility.\n */\nconst DialogDescription = BaseDialog.Description\n\nexport const Dialog = {\n\tRoot: DialogRoot,\n\tTrigger: DialogTrigger,\n\tContent: DialogContent,\n\tPanel: DialogPanel,\n\tTitle: DialogTitle,\n\t/** @deprecated Use a plain `<p>` inside Dialog.Body instead. */\n\tDescription: DialogDescription,\n\tBody: DialogBody,\n\tFooter: DialogFooter,\n\tClose: DialogClose,\n}\n","import { forwardRef, useRef, useState } from \"react\"\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\"\nimport {\n\tuseReactTable,\n\tgetCoreRowModel,\n\tgetSortedRowModel,\n\tgetFilteredRowModel,\n\tgetPaginationRowModel,\n\tgetExpandedRowModel,\n\tflexRender,\n} from \"@tanstack/react-table\"\nimport { useVirtualizer } from \"@tanstack/react-virtual\"\nimport type {\n\tColumnDef,\n\tSortingState,\n\tColumnFiltersState,\n\tVisibilityState,\n\tRowSelectionState,\n\tTableOptions,\n\tRow,\n} from \"@tanstack/react-table\"\nimport {\n\tChevronUpIcon,\n\tChevronDownIcon,\n\tChevronUpDownIcon,\n\tChevronRightIcon,\n} from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Checkbox } from \"../checkbox\"\nimport { Skeleton } from \"../skeleton\"\nimport { Table } from \"../table\"\nimport { Pagination } from \"../pagination\"\nimport { EmptyState } from \"../empty-state\"\nimport { Button } from \"../button\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<TData> {\n\t/** Column definitions - see @tanstack/react-table ColumnDef */\n\tcolumns: ColumnDef<TData, unknown>[]\n\t/** Data array */\n\tdata: TData[]\n\t/** Enable column sorting. Default false. */\n\tsortable?: boolean\n\t/** Enable pagination. Default false. */\n\tpaginated?: boolean\n\t/** Rows per page when paginated. Default 10. */\n\tpageSize?: number\n\t/** Available page size options. Default [10, 25, 50]. */\n\tpageSizeOptions?: number[]\n\t/** Enable row selection with checkboxes. Default false. */\n\tselectable?: boolean\n\t/** Controlled row selection state */\n\trowSelection?: RowSelectionState\n\t/** Called when row selection changes */\n\tonRowSelectionChange?: (selection: RowSelectionState) => void\n\t/** Called when a row is clicked */\n\tonRowClick?: (row: Row<TData>) => void\n\t/** Show skeleton loading state. Default false. */\n\tloading?: boolean\n\t/** Number of skeleton rows to show when loading. Default 5. */\n\tloadingRows?: number\n\t/** Message shown when data is empty. Default \"No results.\" */\n\temptyMessage?: string | ReactNode\n\t/** Enable expandable rows via TanStack `getSubRows` */\n\texpandable?: boolean\n\t/** Resolve child rows for expandable tables */\n\tgetSubRows?: (row: TData) => TData[] | undefined\n\t/** Pin the first data column while scrolling horizontally */\n\tstickyFirstColumn?: boolean\n\t/** Pin the last data column while scrolling horizontally */\n\tstickyLastColumn?: boolean\n\t/** Virtualize row rendering for large datasets */\n\tvirtualized?: boolean\n\t/** Estimated row height when virtualized. Default 44 */\n\testimateRowHeight?: number\n\t/** Additional class on the outer wrapper */\n\tclassName?: string\n\t/** Additional TanStack Table options for advanced use cases */\n\ttableOptions?: Partial<TableOptions<TData>>\n}\n\n// ---------------------------------------------------------------------------\n// Sort indicator\n// ---------------------------------------------------------------------------\n\nfunction SortIndicator({ direction }: { direction: \"asc\" | \"desc\" | false }) {\n\tif (direction === \"asc\") {\n\t\treturn <ChevronUpIcon className=\"text-bruv-primary size-3.5\" />\n\t}\n\tif (direction === \"desc\") {\n\t\treturn <ChevronDownIcon className=\"text-bruv-primary size-3.5\" />\n\t}\n\treturn (\n\t\t<ChevronUpDownIcon className=\"text-bruv-tertiary size-3.5 opacity-0 transition-opacity group-hover:opacity-100\" />\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// ActionCell\n// ---------------------------------------------------------------------------\n\nexport type DataTableActionCellProps = ComponentProps<\"div\">\n\n/**\n * Wrapper for interactive content inside a DataTable cell.\n *\n * Stops click and keyboard events from propagating to the parent row so that\n * buttons, dropdown menus, and other interactive elements do not trigger\n * `onRowClick`.\n *\n * ```tsx\n * {\n * id: \"actions\",\n * header: \"\",\n * cell: ({ row }) => (\n * <DataTableActionCell>\n * <Button size=\"sm\" onClick={() => handleEdit(row.original)}>\n * Edit\n * </Button>\n * </DataTableActionCell>\n * ),\n * }\n * ```\n */\nexport const DataTableActionCell = forwardRef<\n\tHTMLDivElement,\n\tDataTableActionCellProps\n>(function DataTableActionCell(\n\t{ className, onClick, onKeyDown, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\trole=\"none\"\n\t\t\tclassName={cn(\"flex items-center\", className)}\n\t\t\tonClick={e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tonClick?.(e)\n\t\t\t}}\n\t\t\tonKeyDown={e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tonKeyDown?.(e)\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// DataTable\n// ---------------------------------------------------------------------------\n\n/**\n * Data table powered by TanStack Table.\n *\n * Renders using the existing `Table` primitives (Table.Header, Table.Body,\n * Table.Row, Table.Cell) for visual consistency. TanStack Table provides the\n * headless logic for sorting, filtering, pagination, and row selection.\n *\n * Filtering is handled externally -- use `<DataTableToolbar />` with\n * `<DataTableSearch />`, `<Select />`, or `<Combobox />` above the table.\n * Pass filter state via `tableOptions` or pre-filtered `data`.\n *\n * For simple static tables, use `Table` directly. Use `DataTable` when you\n * need interactive features.\n */\nexport function DataTable<TData>({\n\tcolumns,\n\tdata,\n\tsortable = false,\n\tpaginated = false,\n\tpageSize = 10,\n\tpageSizeOptions = [10, 25, 50],\n\tselectable = false,\n\trowSelection: controlledRowSelection,\n\tonRowSelectionChange,\n\tonRowClick,\n\tloading = false,\n\tloadingRows = 5,\n\temptyMessage = \"No results.\",\n\texpandable = false,\n\tgetSubRows,\n\tstickyFirstColumn = false,\n\tstickyLastColumn = false,\n\tvirtualized = false,\n\testimateRowHeight = 44,\n\tclassName,\n\ttableOptions,\n}: DataTableProps<TData>) {\n\tconst scrollRef = useRef<HTMLDivElement>(null)\n\tconst [sorting, setSorting] = useState<SortingState>([])\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n\tconst [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n\tconst [expanded, setExpanded] = useState({})\n\tconst [internalRowSelection, setInternalRowSelection] =\n\t\tuseState<RowSelectionState>({})\n\n\tconst rowSelection = controlledRowSelection ?? internalRowSelection\n\tconst handleRowSelectionChange = onRowSelectionChange\n\t\t? (\n\t\t\t\tupdater:\n\t\t\t\t\t| RowSelectionState\n\t\t\t\t\t| ((old: RowSelectionState) => RowSelectionState),\n\t\t\t) => {\n\t\t\t\tconst next =\n\t\t\t\t\ttypeof updater === \"function\" ? updater(rowSelection) : updater\n\t\t\t\tonRowSelectionChange(next)\n\t\t\t}\n\t\t: setInternalRowSelection\n\n\tconst expandColumn: ColumnDef<TData, unknown> | null = expandable\n\t\t? {\n\t\t\t\tid: \"_expand\",\n\t\t\t\theader: () => null,\n\t\t\t\tcell: ({ row }) =>\n\t\t\t\t\trow.getCanExpand() ? (\n\t\t\t\t\t\t<DataTableActionCell>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ticonLeft={\n\t\t\t\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"transition-transform duration-150\",\n\t\t\t\t\t\t\t\t\t\t\trow.getIsExpanded() && \"rotate-90\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonClick={() => row.toggleExpanded()}\n\t\t\t\t\t\t\t\taria-label={row.getIsExpanded() ? \"Collapse row\" : \"Expand row\"}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</DataTableActionCell>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span className=\"inline-block w-6\" />\n\t\t\t\t\t),\n\t\t\t\tenableSorting: false,\n\t\t\t\tenableHiding: false,\n\t\t\t\tsize: 40,\n\t\t\t}\n\t\t: null\n\n\tconst allColumns: ColumnDef<TData, unknown>[] = [\n\t\t...(selectable\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"_select\",\n\t\t\t\t\t\theader: ({ table }) => (\n\t\t\t\t\t\t\t<DataTableActionCell>\n\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\t\t\t\t\t\tindeterminate={table.getIsSomePageRowsSelected()}\n\t\t\t\t\t\t\t\t\tonCheckedChange={checked =>\n\t\t\t\t\t\t\t\t\t\ttable.toggleAllPageRowsSelected(checked)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</DataTableActionCell>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcell: ({ row }) => (\n\t\t\t\t\t\t\t<DataTableActionCell>\n\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\t\t\t\t\t\tdisabled={!row.getCanSelect()}\n\t\t\t\t\t\t\t\t\tonCheckedChange={checked => row.toggleSelected(checked)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</DataTableActionCell>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tenableSorting: false,\n\t\t\t\t\t\tenableHiding: false,\n\t\t\t\t\t\tsize: 40,\n\t\t\t\t\t} satisfies ColumnDef<TData, unknown>,\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(expandColumn ? [expandColumn] : []),\n\t\t...columns,\n\t]\n\n\t// -- Table instance --\n\t// Deep-merge state so consumer tableOptions.state doesn't clobber internal state\n\tconst { state: externalState, ...restTableOptions } = tableOptions ?? {}\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: allColumns,\n\t\tstate: {\n\t\t\tsorting,\n\t\t\tcolumnFilters,\n\t\t\tcolumnVisibility,\n\t\t\trowSelection,\n\t\t\texpanded,\n\t\t\t...externalState,\n\t\t},\n\t\tonSortingChange: setSorting,\n\t\tonColumnFiltersChange: setColumnFilters,\n\t\tonColumnVisibilityChange: setColumnVisibility,\n\t\tonExpandedChange: setExpanded,\n\t\tonRowSelectionChange: handleRowSelectionChange,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetSortedRowModel: getSortedRowModel(),\n\t\tgetFilteredRowModel: getFilteredRowModel(),\n\t\t...(expandable && {\n\t\t\tgetExpandedRowModel: getExpandedRowModel(),\n\t\t\tgetSubRows: getSubRows ?? (() => undefined),\n\t\t}),\n\t\t...(paginated && { getPaginationRowModel: getPaginationRowModel() }),\n\t\tenableRowSelection: selectable,\n\t\tinitialState: {\n\t\t\tpagination: {\n\t\t\t\tpageSize,\n\t\t\t},\n\t\t},\n\t\t...restTableOptions,\n\t})\n\n\tconst pageCount = table.getPageCount()\n\tconst currentPage = table.getState().pagination.pageIndex + 1\n\tconst currentPageSize = table.getState().pagination.pageSize\n\tconst rows = table.getRowModel().rows\n\n\tconst virtualizer = useVirtualizer({\n\t\tcount: rows.length,\n\t\tgetScrollElement: () => scrollRef.current,\n\t\testimateSize: () => estimateRowHeight,\n\t\tenabled: virtualized && !loading && rows.length > 0,\n\t})\n\n\tconst stickyCellClass = (index: number, total: number) =>\n\t\tcn(\n\t\t\tstickyFirstColumn && index === 0 && \"sticky left-0 z-10 bg-bruv-base-2\",\n\t\t\tstickyLastColumn &&\n\t\t\t\tindex === total - 1 &&\n\t\t\t\t\"sticky right-0 z-10 bg-bruv-base-2\",\n\t\t)\n\n\tconst renderRow = (row: (typeof rows)[number], style?: CSSProperties) => (\n\t\t<Table.Row\n\t\t\tkey={row.id}\n\t\t\tstyle={style}\n\t\t\tonClick={onRowClick ? () => onRowClick(row) : undefined}\n\t\t\tclassName={cn(row.getIsSelected() && \"bg-bruv-subtle\")}\n\t\t>\n\t\t\t{row.getVisibleCells().map((cell, cellIndex, cells) => (\n\t\t\t\t<Table.Cell\n\t\t\t\t\tkey={cell.id}\n\t\t\t\t\twidth={\n\t\t\t\t\t\tcell.column.getSize() !== 150 ? cell.column.getSize() : undefined\n\t\t\t\t\t}\n\t\t\t\t\tclassName={stickyCellClass(cellIndex, cells.length)}\n\t\t\t\t>\n\t\t\t\t\t{flexRender(cell.column.columnDef.cell, cell.getContext())}\n\t\t\t\t</Table.Cell>\n\t\t\t))}\n\t\t</Table.Row>\n\t)\n\n\treturn (\n\t\t<div className={cn(\"flex flex-col gap-3\", className)}>\n\t\t\t<div\n\t\t\t\tref={virtualized ? scrollRef : undefined}\n\t\t\t\tclassName={cn(virtualized && \"max-h-[480px] overflow-auto\")}\n\t\t\t>\n\t\t\t\t<Table>\n\t\t\t\t\t<Table.Header>\n\t\t\t\t\t\t{table.getHeaderGroups().map(headerGroup => (\n\t\t\t\t\t\t\t<Table.Row key={headerGroup.id}>\n\t\t\t\t\t\t\t\t{headerGroup.headers.map((header, headerIndex, headers) => {\n\t\t\t\t\t\t\t\t\tconst canSort = sortable && header.column.getCanSort()\n\t\t\t\t\t\t\t\t\tconst sorted = header.column.getIsSorted()\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Table.HeaderCell\n\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\twidth={\n\t\t\t\t\t\t\t\t\t\t\t\theader.getSize() !== 150 ? header.getSize() : undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\tcanSort && \"cursor-pointer select-none group\",\n\t\t\t\t\t\t\t\t\t\t\t\tstickyCellClass(headerIndex, headers.length),\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{header.isPlaceholder ? null : (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcanSort && \"cursor-pointer\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcanSort\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? header.column.getToggleSortingHandler()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={canSort ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{flexRender(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theader.column.columnDef.header,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theader.getContext(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{canSort && <SortIndicator direction={sorted} />}\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</Table.HeaderCell>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Table.Header>\n\t\t\t\t\t<Table.Body>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\tArray.from({ length: loadingRows }, (_, i) => (\n\t\t\t\t\t\t\t\t<Table.Row key={`skeleton-${String(i)}`}>\n\t\t\t\t\t\t\t\t\t{table.getVisibleLeafColumns().map((_, j) => (\n\t\t\t\t\t\t\t\t\t\t<Table.Cell key={`skeleton-${String(i)}-${String(j)}`}>\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t\t\t\t\t\t\t\t\t</Table.Cell>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t) : rows.length > 0 ? (\n\t\t\t\t\t\t\tvirtualized ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t{virtualizer.getVirtualItems().length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<Table.Row aria-hidden>\n\t\t\t\t\t\t\t\t\t\t\t<Table.Cell\n\t\t\t\t\t\t\t\t\t\t\t\tcolSpan={allColumns.length}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: virtualizer.getVirtualItems()[0]?.start,\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t{virtualizer.getVirtualItems().map(virtualRow => {\n\t\t\t\t\t\t\t\t\t\tconst row = rows[virtualRow.index]\n\t\t\t\t\t\t\t\t\t\tif (!row) return null\n\t\t\t\t\t\t\t\t\t\treturn renderRow(row, { height: virtualRow.size })\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t{virtualizer.getVirtualItems().length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<Table.Row aria-hidden>\n\t\t\t\t\t\t\t\t\t\t\t<Table.Cell\n\t\t\t\t\t\t\t\t\t\t\t\tcolSpan={allColumns.length}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\theight:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvirtualizer.getTotalSize() -\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(virtualizer.getVirtualItems().at(-1)?.end ?? 0),\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\trows.map(row => renderRow(row))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Table.Row>\n\t\t\t\t\t\t\t\t<Table.Cell colSpan={allColumns.length} className=\"p-0\">\n\t\t\t\t\t\t\t\t\t{typeof emptyMessage === \"string\" ? (\n\t\t\t\t\t\t\t\t\t\t<EmptyState title={emptyMessage} />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\temptyMessage\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Table.Cell>\n\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Table.Body>\n\t\t\t\t</Table>\n\t\t\t</div>\n\n\t\t\t{/* Pagination + selected count */}\n\t\t\t{paginated && pageCount > 0 && (\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t{selectable && (\n\t\t\t\t\t\t<span className=\"text-bruv-secondary text-bruv-base\">\n\t\t\t\t\t\t\t{table.getFilteredSelectedRowModel().rows.length} of{\" \"}\n\t\t\t\t\t\t\t{table.getFilteredRowModel().rows.length} row(s) selected\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className={cn(!selectable && \"ml-auto\")}>\n\t\t\t\t\t\t<Pagination\n\t\t\t\t\t\t\tpage={currentPage}\n\t\t\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\t\t\tonPageChange={p => table.setPageIndex(p - 1)}\n\t\t\t\t\t\t\ttotalItems={table.getFilteredRowModel().rows.length}\n\t\t\t\t\t\t\trowsPerPage={currentPageSize}\n\t\t\t\t\t\t\tonRowsPerPageChange={size => table.setPageSize(size)}\n\t\t\t\t\t\t\trowOptions={pageSizeOptions}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import {\n\tforwardRef,\n\ttype CSSProperties,\n\ttype ReactNode,\n\ttype ComponentProps,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Skeleton } from \"../skeleton\"\nimport { TruncatedCell } from \"./truncated-cell\"\n\n// ---------------------------------------------------------------------------\n// Table - outer container\n// ---------------------------------------------------------------------------\n\nexport interface TableProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Lightweight list-table container.\n *\n * Wraps a semantic `<table>` in a rounded, bordered container.\n * Designed for simple list-style data displays - not a full data-table.\n */\nexport const Table = forwardRef<HTMLDivElement, TableProps>(function Table(\n\t{ className, children },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"overflow-x-auto rounded ring-1 ring-bruv-neutral\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<table className=\"w-full border-separate border-spacing-0\">\n\t\t\t\t{children}\n\t\t\t</table>\n\t\t</div>\n\t)\n}) as ReturnType<typeof forwardRef<HTMLDivElement, TableProps>> & {\n\tHeader: typeof TableHeader\n\tBody: typeof TableBody\n\tRow: typeof TableRow\n\tHeaderCell: typeof TableHeaderCell\n\tCell: typeof TableCell\n\tTruncatedCell: typeof TruncatedCell\n\tSkeleton: typeof TableSkeleton\n}\n\n// ---------------------------------------------------------------------------\n// Table.Header - header row\n// ---------------------------------------------------------------------------\n\nexport interface TableHeaderProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\nconst TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n\tfunction TableHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<thead\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"[&>tr]:text-bruv-sm [&>tr]:font-medium [&>tr]:text-bruv-secondary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</thead>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Body - wraps rows\n// ---------------------------------------------------------------------------\n\nexport interface TableBodyProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\nconst TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(\n\tfunction TableBody({ className, children }, ref) {\n\t\treturn (\n\t\t\t<tbody\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Every row except the last gets a bottom border via its cells\n\t\t\t\t\t\"[&>tr:not(:last-child)>td]:border-b [&>tr:not(:last-child)>td]:border-bruv-neutral\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</tbody>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Row - data row (optionally clickable)\n// ---------------------------------------------------------------------------\n\nexport interface TableRowProps extends Omit<ComponentProps<\"tr\">, \"children\"> {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(\n\tfunction TableRow({ className, children, onClick, ...props }, ref) {\n\t\treturn (\n\t\t\t<tr\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 hover:bg-bruv-subtle\",\n\t\t\t\t\t\"transition-colors duration-100 ease-out motion-reduce:transition-none\",\n\t\t\t\t\tonClick && \"cursor-pointer\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={onClick}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</tr>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.HeaderCell - <th> cell\n// ---------------------------------------------------------------------------\n\nexport interface TableHeaderCellProps {\n\t/** Fixed width in pixels or CSS value */\n\twidth?: number | string\n\t/** Column span */\n\tcolSpan?: number\n\t/** Truncate content with ellipsis and show tooltip on overflow */\n\ttruncate?: boolean\n\tclassName?: string\n\tchildren?: ReactNode\n}\n\nconst TableHeaderCell = forwardRef<HTMLTableCellElement, TableHeaderCellProps>(\n\tfunction TableHeaderCell(\n\t\t{ width, colSpan, truncate, className, children },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<th\n\t\t\t\tref={ref}\n\t\t\t\tstyle={width != null ? { width } : undefined}\n\t\t\t\tcolSpan={colSpan}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"px-3 py-2 text-left text-bruv-sm font-medium border-b border-bruv-neutral overflow-hidden whitespace-nowrap truncate\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{truncate ? <TruncatedCell>{children}</TruncatedCell> : children}\n\t\t\t</th>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Cell - <td> cell\n// ---------------------------------------------------------------------------\n\nexport interface TableCellProps {\n\t/** Fixed width in pixels or CSS value */\n\twidth?: number | string\n\t/** Column span */\n\tcolSpan?: number\n\t/** Truncate content with ellipsis and show tooltip on overflow */\n\ttruncate?: boolean\n\tclassName?: string\n\tstyle?: CSSProperties\n\tchildren?: ReactNode\n}\n\nconst TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(\n\tfunction TableCell(\n\t\t{ width, colSpan, truncate, className, style, children },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<td\n\t\t\t\tref={ref}\n\t\t\t\tstyle={{ ...(width != null ? { width } : {}), ...style }}\n\t\t\t\tcolSpan={colSpan}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"px-3 py-2 text-bruv-base overflow-hidden whitespace-nowrap truncate\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{truncate ? <TruncatedCell>{children}</TruncatedCell> : children}\n\t\t\t</td>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Skeleton - loading placeholder rows\n// ---------------------------------------------------------------------------\n\nexport interface TableSkeletonProps {\n\t/** Number of columns to render */\n\treadonly columns: number\n\t/** Number of skeleton rows. Default 5. */\n\treadonly rows?: number\n\treadonly className?: string\n}\n\n/**\n * Skeleton loading rows for the Table.\n * Renders inside a `<tbody>` with the specified number of rows and columns.\n *\n * ```tsx\n * <Table>\n * <Table.Header>...</Table.Header>\n * {loading ? <Table.Skeleton columns={3} /> : <Table.Body>...</Table.Body>}\n * </Table>\n * ```\n */\nfunction TableSkeleton({ columns, rows = 5, className }: TableSkeletonProps) {\n\treturn (\n\t\t<tbody className={className}>\n\t\t\t{Array.from({ length: rows }, (_, i) => (\n\t\t\t\t<tr key={`skel-row-${String(i)}`} className=\"bg-bruv-base-2\">\n\t\t\t\t\t{Array.from({ length: columns }, (_, j) => (\n\t\t\t\t\t\t<td\n\t\t\t\t\t\t\tkey={`skel-cell-${String(i)}-${String(j)}`}\n\t\t\t\t\t\t\tclassName=\"px-3 py-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))}\n\t\t</tbody>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nTable.Header = TableHeader\nTable.Body = TableBody\nTable.Row = TableRow\nTable.HeaderCell = TableHeaderCell\nTable.Cell = TableCell\nTable.TruncatedCell = TruncatedCell\nTable.Skeleton = TableSkeleton\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype ReactNode,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Tooltip } from \"../tooltip\"\n\n// ---------------------------------------------------------------------------\n// TruncatedCell — cell content with ellipsis + tooltip on overflow\n// ---------------------------------------------------------------------------\n\nexport interface TruncatedCellProps {\n\t/** Content to render and use as tooltip text when truncated */\n\treadonly children: ReactNode\n\t/** Override tooltip content (defaults to children if string) */\n\treadonly tooltip?: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Renders inline text with `truncate` (ellipsis).\n * When the text overflows, a Tooltip shows the full content on hover.\n * When it fits, no tooltip is rendered.\n */\nexport const TruncatedCell = forwardRef<HTMLSpanElement, TruncatedCellProps>(\n\tfunction TruncatedCell({ children, tooltip, className }, ref) {\n\t\tconst innerRef = useRef<HTMLSpanElement>(null)\n\t\tconst [truncated, setTruncated] = useState(false)\n\n\t\tconst checkTruncation = useCallback(() => {\n\t\t\tconst el = innerRef.current\n\t\t\tif (!el) return\n\t\t\tsetTruncated(el.scrollWidth > el.clientWidth)\n\t\t}, [])\n\n\t\tuseEffect(() => {\n\t\t\tconst el = innerRef.current\n\t\t\tif (!el) return\n\n\t\t\tcheckTruncation()\n\n\t\t\tconst observer = new ResizeObserver(checkTruncation)\n\t\t\tobserver.observe(el)\n\t\t\treturn () => observer.disconnect()\n\t\t}, [checkTruncation, children])\n\n\t\tconst span = (\n\t\t\t<span\n\t\t\t\tref={node => {\n\t\t\t\t\t;(\n\t\t\t\t\t\tinnerRef as React.MutableRefObject<HTMLSpanElement | null>\n\t\t\t\t\t).current = node\n\t\t\t\t\tif (typeof ref === \"function\") ref(node)\n\t\t\t\t\telse if (ref)\n\t\t\t\t\t\t(ref as React.MutableRefObject<HTMLSpanElement | null>).current =\n\t\t\t\t\t\t\tnode\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\"block w-full truncate\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t)\n\n\t\tif (!truncated) return span\n\n\t\tconst tooltipContent =\n\t\t\ttooltip ?? (typeof children === \"string\" ? children : null)\n\t\tif (!tooltipContent) return span\n\n\t\treturn (\n\t\t\t<Tooltip.Root>\n\t\t\t\t<Tooltip.Trigger\n\t\t\t\t\trender={<span className=\"block w-full min-w-0\" tabIndex={0} />}\n\t\t\t\t>\n\t\t\t\t\t{span}\n\t\t\t\t</Tooltip.Trigger>\n\t\t\t\t<Tooltip.Content side=\"top\">{tooltipContent}</Tooltip.Content>\n\t\t\t</Tooltip.Root>\n\t\t)\n\t},\n)\n","import { forwardRef } from \"react\"\nimport {\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tChevronUpDownIcon,\n} from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { DropdownMenu } from \"../dropdown-menu\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\tsm: { button: \"size-7\", icon: \"size-4\", strip: \"h-9\" },\n\tmd: { button: \"size-8\", icon: \"size-4\", strip: \"h-10\" },\n} as const\n\nexport type PaginationSize = keyof typeof sizeStyles\n\nexport interface PaginationProps {\n\t/** Current page (1-indexed) */\n\tpage: number\n\t/** Total number of pages */\n\tpageCount: number\n\t/** Called when the page changes */\n\tonPageChange?: (page: number) => void\n\t/** Total item count - shows \"1–10 of XMarkIcon\" when provided */\n\ttotalItems?: number\n\t/** Rows per page - shows selector when provided with onRowsPerPageChange */\n\trowsPerPage?: number\n\t/** Called when rows per page changes */\n\tonRowsPerPageChange?: (rows: number) => void\n\t/** Available row count options. Default [10, 25, 50] */\n\trowOptions?: number[]\n\t/** Number of sibling pages to show around active page. Default 1 */\n\tsiblingCount?: number\n\t/** Size of the pagination controls */\n\tsize?: PaginationSize\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Page number generation\n// ---------------------------------------------------------------------------\n\ntype PageItem = number | \"ellipsis-start\" | \"ellipsis-end\"\n\nfunction range(start: number, end: number): number[] {\n\tconst result: number[] = []\n\tfor (let i = start; i <= end; i++) result.push(i)\n\treturn result\n}\n\n/**\n * Generates an array of page numbers and ellipsis markers for pagination.\n *\n * - When `pageCount <= maxVisible` (2 * siblingCount + 5), shows all pages.\n * - Otherwise truncates with ellipsis, always showing first and last page.\n */\nfunction getPageNumbers(\n\tpage: number,\n\tpageCount: number,\n\tsiblingCount: number,\n): PageItem[] {\n\t// Total visible page buttons: first + last + current + 2*siblings + 2 ellipsis slots\n\tconst maxVisible = siblingCount * 2 + 5\n\n\t// Show all pages if they fit\n\tif (pageCount <= maxVisible) {\n\t\treturn range(1, pageCount)\n\t}\n\n\tconst leftSiblingIndex = Math.max(page - siblingCount, 1)\n\tconst rightSiblingIndex = Math.min(page + siblingCount, pageCount)\n\n\tconst showLeftEllipsis = leftSiblingIndex > 2\n\tconst showRightEllipsis = rightSiblingIndex < pageCount - 1\n\n\tif (!showLeftEllipsis && showRightEllipsis) {\n\t\t// Near the start: 1 2 3 4 5 ... last\n\t\tconst leftCount = siblingCount * 2 + 3\n\t\treturn [...range(1, leftCount), \"ellipsis-end\", pageCount]\n\t}\n\n\tif (showLeftEllipsis && !showRightEllipsis) {\n\t\t// Near the end: 1 ... last-4 last-3 last-2 last-1 last\n\t\tconst rightCount = siblingCount * 2 + 3\n\t\treturn [\n\t\t\t1,\n\t\t\t\"ellipsis-start\",\n\t\t\t...range(pageCount - rightCount + 1, pageCount),\n\t\t]\n\t}\n\n\t// Middle: 1 ... p-1 p p+1 ... last\n\treturn [\n\t\t1,\n\t\t\"ellipsis-start\",\n\t\t...range(leftSiblingIndex, rightSiblingIndex),\n\t\t\"ellipsis-end\",\n\t\tpageCount,\n\t]\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction PageButton({\n\tpage,\n\tactive,\n\tonClick,\n\tbuttonSize,\n}: {\n\tpage: number\n\tactive: boolean\n\tonClick: () => void\n\tbuttonSize: string\n}) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tonClick={onClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-bruv-sm flex items-center justify-center text-bruv-base tabular-nums select-none cursor-pointer\",\n\t\t\t\tbuttonSize,\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150 motion-reduce:transition-none\",\n\t\t\t\tactive\n\t\t\t\t\t? \"bg-bruv-base-2 text-bruv-primary font-medium shadow-sm\"\n\t\t\t\t\t: \"text-bruv-secondary hover:text-bruv-primary hover:bg-bruv-subtle\",\n\t\t\t)}\n\t\t>\n\t\t\t{page}\n\t\t</button>\n\t)\n}\n\nfunction Ellipsis({ buttonSize }: { buttonSize: string }) {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"text-bruv-tertiary flex items-center justify-center text-bruv-base select-none\",\n\t\t\t\tbuttonSize,\n\t\t\t)}\n\t\t>\n\t\t\t...\n\t\t</span>\n\t)\n}\n\nfunction NavArrow({\n\tdirection,\n\tdisabled,\n\tonClick,\n\tbuttonSize,\n\ticonSize,\n}: {\n\tdirection: \"prev\" | \"next\"\n\tdisabled: boolean\n\tonClick: () => void\n\tbuttonSize: string\n\ticonSize: string\n}) {\n\tconst Icon = direction === \"prev\" ? ChevronLeftIcon : ChevronRightIcon\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={direction === \"prev\" ? \"Previous page\" : \"Next page\"}\n\t\t\tdisabled={disabled}\n\t\t\tonClick={onClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-bruv-sm flex items-center justify-center cursor-pointer select-none\",\n\t\t\t\tbuttonSize,\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150 motion-reduce:transition-none\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"text-bruv-tertiary pointer-events-none\"\n\t\t\t\t\t: \"text-bruv-secondary hover:text-bruv-primary hover:bg-bruv-subtle\",\n\t\t\t)}\n\t\t>\n\t\t\t<Icon className={iconSize} />\n\t\t</button>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Pagination\n// ---------------------------------------------------------------------------\n\n/**\n * Pagination toolbar with clickable page numbers, optional rows-per-page\n * selector, and optional result count.\n *\n * Renders as a cohesive strip - pass `rowsPerPage` + `onRowsPerPageChange`\n * to show the rows-per-page selector, and `totalItems` to show the result count.\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n\tfunction Pagination(\n\t\t{\n\t\t\tpage,\n\t\t\tpageCount,\n\t\t\tonPageChange,\n\t\t\ttotalItems,\n\t\t\trowsPerPage = 10,\n\t\t\tonRowsPerPageChange,\n\t\t\trowOptions = [10, 25, 50],\n\t\t\tsiblingCount = 1,\n\t\t\tsize = \"sm\",\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\t\tconst showRowsPerPage = onRowsPerPageChange !== undefined\n\t\tconst showTotalItems = totalItems !== undefined\n\t\tconst showPageNumbers = pageCount > 1\n\n\t\t// Result range: \"1–10 of 115\"\n\t\tconst rangeStart = (page - 1) * rowsPerPage + 1\n\t\tconst rangeEnd = totalItems\n\t\t\t? Math.min(page * rowsPerPage, totalItems)\n\t\t\t: page * rowsPerPage\n\n\t\t// If only 1 page and nothing else to show, render nothing\n\t\tif (!showPageNumbers && !showRowsPerPage && !showTotalItems) return null\n\n\t\tconst pages = showPageNumbers\n\t\t\t? getPageNumbers(page, pageCount, siblingCount)\n\t\t\t: []\n\n\t\treturn (\n\t\t\t<nav\n\t\t\t\tref={ref as React.Ref<HTMLElement>}\n\t\t\t\taria-label=\"Pagination\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center bg-bruv-subtle rounded-bruv-md ring-1 ring-bruv-neutral\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Rows per page */}\n\t\t\t\t{showRowsPerPage && (\n\t\t\t\t\t<div className={cn(\"flex items-center gap-2 px-3\", s.strip)}>\n\t\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-base whitespace-nowrap\">\n\t\t\t\t\t\t\tRows per page\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<DropdownMenu.Root>\n\t\t\t\t\t\t\t<DropdownMenu.Trigger>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex items-center gap-1 h-6 px-1.5 rounded-bruv-sm text-bruv-base text-bruv-primary tabular-nums cursor-pointer select-none\",\n\t\t\t\t\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\t\t\t\t\t\"hover:bg-bruv-subtle transition-colors duration-150 motion-reduce:transition-none\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{rowsPerPage}\n\t\t\t\t\t\t\t\t\t<ChevronUpDownIcon className=\"text-bruv-tertiary size-3.5\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</DropdownMenu.Trigger>\n\t\t\t\t\t\t\t<DropdownMenu.Content\n\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\t\tminWidth=\"min-w-[80px]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{rowOptions.map(opt => (\n\t\t\t\t\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\t\t\t\t\tkey={opt}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRowsPerPageChange?.(opt)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{opt}\n\t\t\t\t\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</DropdownMenu.Content>\n\t\t\t\t\t\t</DropdownMenu.Root>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Divider */}\n\t\t\t\t{showRowsPerPage && showPageNumbers && (\n\t\t\t\t\t<div className=\"bg-bruv-neutral w-px self-stretch\" />\n\t\t\t\t)}\n\n\t\t\t\t{/* Page numbers */}\n\t\t\t\t{showPageNumbers && (\n\t\t\t\t\t<div className={cn(\"flex items-center gap-0.5 px-1.5\", s.strip)}>\n\t\t\t\t\t\t<NavArrow\n\t\t\t\t\t\t\tdirection=\"prev\"\n\t\t\t\t\t\t\tdisabled={page <= 1}\n\t\t\t\t\t\t\tonClick={() => onPageChange?.(page - 1)}\n\t\t\t\t\t\t\tbuttonSize={s.button}\n\t\t\t\t\t\t\ticonSize={s.icon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{pages.map(item =>\n\t\t\t\t\t\t\ttypeof item === \"number\" ? (\n\t\t\t\t\t\t\t\t<PageButton\n\t\t\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\t\t\tpage={item}\n\t\t\t\t\t\t\t\t\tactive={item === page}\n\t\t\t\t\t\t\t\t\tonClick={() => onPageChange?.(item)}\n\t\t\t\t\t\t\t\t\tbuttonSize={s.button}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Ellipsis key={item} buttonSize={s.button} />\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<NavArrow\n\t\t\t\t\t\t\tdirection=\"next\"\n\t\t\t\t\t\t\tdisabled={page >= pageCount}\n\t\t\t\t\t\t\tonClick={() => onPageChange?.(page + 1)}\n\t\t\t\t\t\t\tbuttonSize={s.button}\n\t\t\t\t\t\t\ticonSize={s.icon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Divider */}\n\t\t\t\t{showTotalItems && (showPageNumbers || showRowsPerPage) && (\n\t\t\t\t\t<div className=\"bg-bruv-neutral w-px self-stretch\" />\n\t\t\t\t)}\n\n\t\t\t\t{/* Result count */}\n\t\t\t\t{showTotalItems && (\n\t\t\t\t\t<div className={cn(\"flex items-center px-3\", s.strip)}>\n\t\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-base whitespace-nowrap tabular-nums\">\n\t\t\t\t\t\t\t{rangeStart}&ndash;{rangeEnd} / {totalItems}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</nav>\n\t\t)\n\t},\n)\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface EmptyStateProps extends Omit<ComponentProps<\"div\">, \"title\"> {\n\ttitle?: ReactNode\n\tdescription?: ReactNode\n\ticon?: ReactNode\n\taction?: ReactNode\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n\tfunction EmptyState(\n\t\t{ title, description, icon, action, className, children, ...props },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{icon ? (\n\t\t\t\t\t<div className=\"text-bruv-tertiary flex size-10 items-center justify-center [&>svg]:size-8\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t{title ? (\n\t\t\t\t\t<p className=\"text-bruv-base text-bruv-primary font-medium\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</p>\n\t\t\t\t) : null}\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"text-bruv-sm text-bruv-secondary max-w-sm\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</p>\n\t\t\t\t) : null}\n\t\t\t\t{children}\n\t\t\t\t{action ? <div className=\"mt-1\">{action}</div> : null}\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DataTableToolbarProps {\n\t/** Toolbar contents -- typically DataTableSearch, Select, Combobox, Button, etc. */\n\tchildren: ReactNode\n\t/** Additional class on the outer wrapper */\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// DataTableToolbar\n// ---------------------------------------------------------------------------\n\n/**\n * Layout container for controls above a DataTable.\n *\n * Renders a horizontal flex row that wraps on small screens. Compose with\n * any combination of `DataTableSearch`, `Select`, `Combobox`, `Button`,\n * or custom elements.\n *\n * ```tsx\n * <DataTableToolbar>\n * <DataTableSearch value={search} onChange={setSearch} />\n * <Select value={status} onValueChange={setStatus} items={statusOptions}>\n * <SelectButton placeholder=\"Status\" />\n * <SelectContent>\n * <SelectOption value=\"all\">All</SelectOption>\n * <SelectOption value=\"active\">Active</SelectOption>\n * </SelectContent>\n * </Select>\n * </DataTableToolbar>\n * ```\n */\nexport const DataTableToolbar = forwardRef<\n\tHTMLDivElement,\n\tDataTableToolbarProps\n>(function DataTableToolbar({ children, className }, ref) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"flex flex-wrap items-center gap-2\", className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n","import { forwardRef, useRef, useCallback } from \"react\"\nimport { MagnifyingGlassIcon, XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DataTableSearchProps {\n\t/** Current search value */\n\tvalue: string\n\t/** Called when the search value changes */\n\tonChange: (value: string) => void\n\t/** Placeholder text. Default \"Search...\" */\n\tplaceholder?: string\n\t/** Additional class on the outer wrapper */\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// DataTableSearch\n// ---------------------------------------------------------------------------\n\n/**\n * A standalone search input for DataTable.\n *\n * Controlled component -- wire `value` and `onChange` to your own state.\n * For server-side search, use `onChange` to trigger an API call (with\n * debounce if needed). For client-side, pass the value to TanStack Table's\n * `globalFilter` or a column-specific filter.\n *\n * ```tsx\n * const [search, setSearch] = useState(\"\")\n *\n * <DataTableSearch value={search} onChange={setSearch} placeholder=\"Search repositories...\" />\n * <DataTable\n * columns={columns}\n * data={data}\n * tableOptions={{\n * state: { globalFilter: search },\n * onGlobalFilterChange: setSearch,\n * }}\n * />\n * ```\n */\nexport const DataTableSearch = forwardRef<HTMLDivElement, DataTableSearchProps>(\n\tfunction DataTableSearch(\n\t\t{ value, onChange, placeholder = \"Search...\", className },\n\t\tref,\n\t) {\n\t\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\t\tconst handleClear = useCallback(() => {\n\t\t\tonChange(\"\")\n\t\t\tinputRef.current?.focus()\n\t\t}, [onChange])\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral bg-bruv-base-2 flex h-8 max-w-sm items-center gap-2 rounded-bruv-md border px-2.5\",\n\t\t\t\t\t\"ring-bruv-neutral ring-0 transition-[box-shadow,border-color] duration-150 ease-out\",\n\t\t\t\t\t\"has-[:focus]:ring-2 has-[:focus]:border-bruv-neutral-strong\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<MagnifyingGlassIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t<input\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={e => onChange(e.target.value)}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base min-w-0 flex-1 bg-transparent outline-none\"\n\t\t\t\t/>\n\t\t\t\t{value && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\tclassName=\"text-bruv-tertiary hover:text-bruv-secondary rounded-bruv-sm shrink-0 p-0.5 transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XMarkIcon className=\"size-3.5\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { TableCellsIcon } from \"@heroicons/react/16/solid\"\nimport type { Table } from \"@tanstack/react-table\"\nimport { Button } from \"../button\"\nimport { Checkbox } from \"../checkbox\"\nimport { DropdownMenu } from \"../dropdown-menu\"\n\nexport interface DataTableColumnsButtonProps<TData> {\n\ttable: Table<TData>\n\tlabel?: string\n}\n\nexport function DataTableColumnsButton<TData>({\n\ttable,\n\tlabel = \"Columns\",\n}: DataTableColumnsButtonProps<TData>) {\n\tconst hideable = table\n\t\t.getAllLeafColumns()\n\t\t.filter(column => column.getCanHide())\n\n\tif (hideable.length === 0) return null\n\n\treturn (\n\t\t<DropdownMenu.Root>\n\t\t\t<DropdownMenu.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" iconLeft={<TableCellsIcon />}>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenu.Content align=\"end\" minWidth=\"min-w-[200px]\">\n\t\t\t\t{hideable.map(column => (\n\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\tcloseOnClick={false}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tcolumn.toggleVisibility()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tchecked={column.getIsVisible()}\n\t\t\t\t\t\t\tonCheckedChange={() => column.toggleVisibility()}\n\t\t\t\t\t\t\tclassName=\"pointer-events-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t{typeof column.columnDef.header === \"string\"\n\t\t\t\t\t\t\t\t? column.columnDef.header\n\t\t\t\t\t\t\t\t: column.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t))}\n\t\t\t</DropdownMenu.Content>\n\t\t</DropdownMenu.Root>\n\t)\n}\n","import { forwardRef, type ReactNode } from \"react\"\nimport { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\n\nexport type ActionBarPosition = \"bottom\" | \"top\"\n\nexport interface ActionBarProps {\n\t/** Whether the bar is visible. Triggers the slide animation. */\n\tshow: boolean\n\t/** Selection count. Renders as `\"{count} selected\"` when no `message` is provided. */\n\tcount?: number\n\t/** Overrides the count-derived message. */\n\tmessage?: ReactNode\n\t/** Anchor edge of the viewport. Defaults to `\"bottom\"`. */\n\tposition?: ActionBarPosition\n\t/** When set, renders an X clear button on the left and calls this on click. */\n\tonClear?: () => void\n\t/** Accessible label for the clear button. */\n\tclearLabel?: string\n\t/** Action buttons rendered on the right. */\n\tactions?: ReactNode\n\tclassName?: string\n}\n\n/**\n * Floating pill anchored to the bottom (or top) of the viewport. Designed\n * to surface bulk actions when items in a list or table are selected.\n *\n * The consumer controls visibility via `show`; the bar slides and fades\n * in/out using the same motion recipe as `SaveBar`.\n */\nexport const ActionBar = forwardRef<HTMLDivElement, ActionBarProps>(\n\tfunction ActionBar(\n\t\t{\n\t\t\tshow,\n\t\t\tcount,\n\t\t\tmessage,\n\t\t\tposition = \"bottom\",\n\t\t\tonClear,\n\t\t\tclearLabel = \"Clear selection\",\n\t\t\tactions,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst resolvedMessage =\n\t\t\tmessage ?? (typeof count === \"number\" ? `${count} selected` : null)\n\t\tconst hiddenTransform =\n\t\t\tposition === \"bottom\" ? \"translate-y-4\" : \"-translate-y-4\"\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\taria-live=\"polite\"\n\t\t\t\taria-hidden={!show}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none fixed inset-x-0 z-50 flex justify-center px-6\",\n\t\t\t\t\tposition === \"bottom\" ? \"bottom-0 pb-6\" : \"top-0 pt-6\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\taria-label={\n\t\t\t\t\t\ttypeof resolvedMessage === \"string\"\n\t\t\t\t\t\t\t? resolvedMessage\n\t\t\t\t\t\t\t: \"Bulk actions\"\n\t\t\t\t\t}\n\t\t\t\t\tinert={!show}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"pointer-events-auto\",\n\t\t\t\t\t\t\"flex items-center rounded-bruv-xl border py-1.5 pr-1.5 pl-1.5 shadow-lg\",\n\t\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral\",\n\t\t\t\t\t\t\"transition-all duration-500 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tshow\n\t\t\t\t\t\t\t? \"translate-y-0 scale-100 opacity-100\"\n\t\t\t\t\t\t\t: cn(\"pointer-events-none scale-95 opacity-0\", hiddenTransform),\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{onClear && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\t\tonClick={onClear}\n\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{resolvedMessage && (\n\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base min-w-0 pr-3 pl-1 font-medium\">\n\t\t\t\t\t\t\t{resolvedMessage}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{actions && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1.5\">{actions}</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import type { RowSelectionState, Table } from \"@tanstack/react-table\"\nimport type { ReactNode } from \"react\"\nimport { ActionBar } from \"../action-bar\"\n\nexport interface DataTableBulkBarProps<TData> {\n\ttable: Table<TData>\n\t/** Controlled selection — defaults to table row selection state */\n\trowSelection?: RowSelectionState\n\tshow?: boolean\n\tmessage?: ReactNode\n\tactions?: ReactNode\n\tonClear?: () => void\n\tposition?: \"bottom\" | \"top\"\n}\n\nexport function DataTableBulkBar<TData>({\n\ttable,\n\trowSelection,\n\tshow,\n\tmessage,\n\tactions,\n\tonClear,\n\tposition = \"bottom\",\n}: DataTableBulkBarProps<TData>) {\n\tconst count = Object.keys(\n\t\trowSelection ?? table.getState().rowSelection,\n\t).length\n\tconst visible = show ?? count > 0\n\n\tconst handleClear =\n\t\tonClear ??\n\t\t(() => {\n\t\t\ttable.resetRowSelection()\n\t\t})\n\n\treturn (\n\t\t<ActionBar\n\t\t\tshow={visible}\n\t\t\tcount={count}\n\t\t\tmessage={message}\n\t\t\tactions={actions}\n\t\t\tonClear={handleClear}\n\t\t\tposition={position}\n\t\t/>\n\t)\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\"\nimport { CheckIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Spinner } from \"../spinner\"\nimport { FilterChips, FilterTrigger } from \"./trigger\"\nimport type { FilterOption } from \"./types\"\n\nexport interface FilterMultiSelectProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Available filter options. */\n\toptions: readonly FilterOption[]\n\t/** Controlled selected values. */\n\tvalue?: readonly string[]\n\t/** Uncontrolled initial selected values. */\n\tdefaultValue?: readonly string[]\n\t/** Called when the selection changes. */\n\tonValueChange?: (values: string[]) => void\n\t/** Show the search input. Defaults to `true`. */\n\tsearchable?: boolean\n\t/** Placeholder for the search input. Defaults to the `title`. */\n\tsearchPlaceholder?: string\n\t/** Optional per-option counts rendered as a trailing badge in the dropdown. */\n\tfacets?: Map<string, number>\n\t/**\n\t * Async option loader. When provided, options are fetched as the user\n\t * types instead of filtering the static `options` array client-side.\n\t * The static `options` prop is still shown when the search is empty\n\t * (e.g. \"recently used\") and seeds the label cache for already-selected\n\t * values.\n\t */\n\tloadOptions?: (query: string) => Promise<readonly FilterOption[]>\n\t/** Debounce delay for `loadOptions` in ms. Defaults to 200. */\n\tloadDebounceMs?: number\n\t/** Label shown while `loadOptions` is in flight. Defaults to \"Searching...\". */\n\tloadingLabel?: string\n\t/** Label shown when `loadOptions` rejects. Defaults to \"Failed to load options.\". */\n\terrorLabel?: string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Searchable multi-select filter. Renders a dashed pill until at least one\n * option is selected, then a solid pill with chips showing the selection.\n * \"Clear filters\" row appears when anything is selected.\n *\n * When `loadOptions` is provided, options are fetched async per query and\n * a label cache keeps trigger badges intact even when selected values\n * aren't in the currently-displayed list.\n */\nexport function FilterMultiSelect({\n\ttitle,\n\ticon,\n\toptions,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tsearchable = true,\n\tsearchPlaceholder,\n\tfacets,\n\tloadOptions,\n\tloadDebounceMs = 200,\n\tloadingLabel = \"Searching...\",\n\terrorLabel = \"Failed to load options.\",\n\tdisabled,\n\tclassName,\n}: FilterMultiSelectProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<readonly string[]>(\n\t\tdefaultValue ?? [],\n\t)\n\tconst currentValues = isControlled ? controlledValue : internalValue\n\tconst selected = new Set(currentValues)\n\tconst hasSelection = selected.size > 0\n\n\tconst [search, setSearch] = useState(\"\")\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\t// Label cache so selected values from outside the current option list\n\t// (e.g. picked from a previous loadOptions response) still render\n\t// labels on the trigger badge.\n\tconst labelCacheRef = useRef<Map<string, string>>(new Map())\n\tfor (const opt of options) labelCacheRef.current.set(opt.value, opt.label)\n\n\t// Async option loading state. `loadedOptions` is bound to `loadedQuery`\n\t// so a stale result from a previous query can't render against the new\n\t// search input.\n\tconst [loadedOptions, setLoadedOptions] = useState<\n\t\treadonly FilterOption[] | null\n\t>(null)\n\tconst [loadedQuery, setLoadedQuery] = useState<string | null>(null)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [loadError, setLoadError] = useState(false)\n\tconst requestIdRef = useRef(0)\n\n\tuseEffect(() => {\n\t\tif (!loadOptions) return\n\t\tif (search === \"\") {\n\t\t\tsetLoadedOptions(null)\n\t\t\tsetLoadedQuery(null)\n\t\t\tsetIsLoading(false)\n\t\t\tsetLoadError(false)\n\t\t\treturn\n\t\t}\n\t\tconst id = ++requestIdRef.current\n\t\tsetIsLoading(true)\n\t\tsetLoadError(false)\n\t\tconst handle = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await loadOptions(search)\n\t\t\t\tif (id !== requestIdRef.current) return\n\t\t\t\tfor (const opt of result)\n\t\t\t\t\tlabelCacheRef.current.set(opt.value, opt.label)\n\t\t\t\tsetLoadedOptions(result)\n\t\t\t\tsetLoadedQuery(search)\n\t\t\t\tsetLoadError(false)\n\t\t\t} catch {\n\t\t\t\tif (id !== requestIdRef.current) return\n\t\t\t\tsetLoadError(true)\n\t\t\t} finally {\n\t\t\t\tif (id === requestIdRef.current) setIsLoading(false)\n\t\t\t}\n\t\t}, loadDebounceMs)\n\t\treturn () => {\n\t\t\tclearTimeout(handle)\n\t\t}\n\t}, [search, loadOptions, loadDebounceMs])\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\t// Invalidate any in-flight request on unmount\n\t\t\trequestIdRef.current++\n\t\t}\n\t}, [])\n\n\t// Async path: only show loadedOptions when they match the current\n\t// search; otherwise we'd flash stale results between keystrokes.\n\tconst asyncOptions: readonly FilterOption[] =\n\t\tloadedOptions !== null && loadedQuery === search ? loadedOptions : []\n\n\tconst displayedOptions: readonly FilterOption[] = loadOptions\n\t\t? search === \"\"\n\t\t\t? options\n\t\t\t: asyncOptions\n\t\t: search\n\t\t\t? options.filter(opt =>\n\t\t\t\t\topt.label.toLowerCase().includes(search.toLowerCase()),\n\t\t\t\t)\n\t\t\t: options\n\n\tfunction commit(next: string[]) {\n\t\tif (!isControlled) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tfunction toggle(value: string) {\n\t\tconst next = new Set(selected)\n\t\tif (next.has(value)) next.delete(value)\n\t\telse next.add(value)\n\t\tcommit(Array.from(next))\n\t}\n\n\tconst selectedLabels = Array.from(selected).map(\n\t\tvalue => labelCacheRef.current.get(value) ?? value,\n\t)\n\n\treturn (\n\t\t<Popover.Root\n\t\t\tonOpenChange={open => {\n\t\t\t\tif (open && searchable) {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true })\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (!open) setSearch(\"\")\n\t\t\t}}\n\t\t>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={<FilterChips labels={selectedLabels} />}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[220px] p-1\"\n\t\t\t>\n\t\t\t\t{searchable && (\n\t\t\t\t\t<Menu.SearchInput className=\"mx-0 mt-0\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\tonChange={e => setSearch(e.target.value)}\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder ?? title}\n\t\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Menu.SearchInput>\n\t\t\t\t)}\n\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex h-20 items-center justify-center\">\n\t\t\t\t\t\t<Spinner label={loadingLabel} size=\"sm\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : loadError ? (\n\t\t\t\t\t<Menu.Empty>\n\t\t\t\t\t\t<span className=\"text-bruv-danger\">{errorLabel}</span>\n\t\t\t\t\t</Menu.Empty>\n\t\t\t\t) : (\n\t\t\t\t\t<Menu.List>\n\t\t\t\t\t\t{displayedOptions.length === 0 && (\n\t\t\t\t\t\t\t<Menu.Empty>No results found.</Menu.Empty>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{displayedOptions.map(option => {\n\t\t\t\t\t\t\tconst isSelected = selected.has(option.value)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\t\trole=\"menuitemcheckbox\"\n\t\t\t\t\t\t\t\t\taria-checked={isSelected}\n\t\t\t\t\t\t\t\t\tonClick={() => toggle(option.value)}\n\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex size-4 items-center justify-center rounded border\",\n\t\t\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"border-bruv-accent bg-bruv-accent text-bruv-inverse\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"border-bruv-neutral [&_svg]:invisible\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CheckIcon className=\"size-3\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tindicator={\n\t\t\t\t\t\t\t\t\t\tfacets?.get(option.value) != null ? (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-tertiary font-bruv-mono text-bruv-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{facets.get(option.value)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option.icon && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary flex size-4 shrink-0 items-center justify-center [&>svg]:size-3.5\">\n\t\t\t\t\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span className=\"relative z-[1]\">{option.label}</span>\n\t\t\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Menu.List>\n\t\t\t\t)}\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Menu.Separator />\n\t\t\t\t\t\t<Menu.Item onClick={() => commit([])} className=\"justify-center\">\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear filters</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { Popover as BasePopover } from \"@base-ui/react/popover\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Popover.Root\n// ---------------------------------------------------------------------------\n\nexport interface PopoverRootProps extends ComponentProps<\n\ttypeof BasePopover.Root\n> {}\n\nfunction PopoverRoot(props: PopoverRootProps) {\n\treturn <BasePopover.Root {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Popover.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface PopoverTriggerProps extends ComponentProps<\n\ttypeof BasePopover.Trigger\n> {}\n\nconst PopoverTrigger = forwardRef<HTMLButtonElement, PopoverTriggerProps>(\n\tfunction PopoverTrigger({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BasePopover.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"cursor-pointer outline-none\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Content\n// ---------------------------------------------------------------------------\n\nexport interface PopoverContentProps extends ComponentProps<\n\ttypeof BasePopover.Popup\n> {\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\tchildren: ReactNode\n}\n\nfunction PopoverContent({\n\tside = \"bottom\",\n\talign = \"center\",\n\tsideOffset = 4,\n\tclassName,\n\tchildren,\n\t...props\n}: PopoverContentProps) {\n\treturn (\n\t\t<BasePopover.Portal>\n\t\t\t<BasePopover.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName=\"z-50 outline-none\"\n\t\t\t>\n\t\t\t\t<BasePopover.Popup\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-2 border border-bruv-neutral rounded-bruv-md shadow-md p-3\",\n\t\t\t\t\t\t\"origin-[var(--transform-origin)] will-change-[transform,opacity]\",\n\t\t\t\t\t\t\"transition-[transform,scale,opacity] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0 data-[ending-style]:duration-150\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BasePopover.Popup>\n\t\t\t</BasePopover.Positioner>\n\t\t</BasePopover.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Popover.Arrow\n// ---------------------------------------------------------------------------\n\nexport interface PopoverArrowProps extends ComponentProps<\n\ttypeof BasePopover.Arrow\n> {}\n\nconst PopoverArrow = forwardRef<HTMLDivElement, PopoverArrowProps>(\n\tfunction PopoverArrow({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BasePopover.Arrow\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fill-bruv-base-2 stroke-bruv-neutral [stroke-width:1px]\",\n\t\t\t\t\t\"data-[side=top]:bottom-[-5px]\",\n\t\t\t\t\t\"data-[side=bottom]:top-[-5px]\",\n\t\t\t\t\t\"data-[side=left]:right-[-5px]\",\n\t\t\t\t\t\"data-[side=right]:left-[-5px]\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Close\n// ---------------------------------------------------------------------------\n\nexport interface PopoverCloseProps extends ComponentProps<\n\ttypeof BasePopover.Close\n> {}\n\nconst PopoverClose = forwardRef<HTMLButtonElement, PopoverCloseProps>(\n\tfunction PopoverClose({ className, ...props }, ref) {\n\t\treturn <BasePopover.Close ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Title\n// ---------------------------------------------------------------------------\n\nexport interface PopoverTitleProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst PopoverTitle = forwardRef<HTMLParagraphElement, PopoverTitleProps>(\n\tfunction PopoverTitle({ className, children }, ref) {\n\t\treturn (\n\t\t\t<p\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</p>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Description\n// ---------------------------------------------------------------------------\n\nexport interface PopoverDescriptionProps extends ComponentProps<\n\ttypeof BasePopover.Description\n> {}\n\nconst PopoverDescription = forwardRef<\n\tHTMLParagraphElement,\n\tPopoverDescriptionProps\n>(function PopoverDescription({ className, ...props }, ref) {\n\treturn (\n\t\t<BasePopover.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-bruv-secondary mt-1 text-bruv-base\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Popover = {\n\tRoot: PopoverRoot,\n\tTrigger: PopoverTrigger,\n\tContent: PopoverContent,\n\tArrow: PopoverArrow,\n\tClose: PopoverClose,\n\tTitle: PopoverTitle,\n\tDescription: PopoverDescription,\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { PlusCircleIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Badge } from \"../badge\"\n\nexport interface FilterTriggerProps extends Omit<\n\tComponentProps<\"button\">,\n\t\"title\" | \"children\"\n> {\n\ttitle: string\n\ticon?: ReactNode\n\t/** When true, the pill renders in its solid \"active\" style. */\n\tactive?: boolean\n\t/**\n\t * Chips rendered on the right side of the pill when `active`. Pass an\n\t * already-collapsed `Badge` (e.g. \"N selected\") or a list of label badges.\n\t */\n\tchips?: ReactNode\n}\n\n/**\n * Shared trigger pill used by every Filter.* variant. Renders a dashed\n * placeholder when inactive and a solid pill with chips when active.\n */\nexport const FilterTrigger = forwardRef<HTMLButtonElement, FilterTriggerProps>(\n\tfunction FilterTrigger(\n\t\t{ title, icon, active, chips, disabled, className, ...rest },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"button\"\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral text-bruv-base inline-flex h-8 items-center rounded-bruv-md border\",\n\t\t\t\t\tactive\n\t\t\t\t\t\t? \"gap-1 border-solid py-1 pl-2.5 pr-2.5\"\n\t\t\t\t\t\t: \"gap-1.5 border-dashed px-3\",\n\t\t\t\t\t\"hover:bg-bruv-subtle cursor-pointer transition-colors\",\n\t\t\t\t\t\"ring-bruv-focus outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t<span className=\"text-bruv-tertiary flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t{icon ?? <PlusCircleIcon />}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-bruv-primary\">{title}</span>\n\t\t\t\t{active && chips && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"border-bruv-neutral mx-0.5 h-4 w-px border-l\"\n\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{chips}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t)\n\t},\n)\n\n/** Convenience renderer for the selection chips on multi/single triggers. */\nexport function FilterChips({\n\tlabels,\n\tcollapseAt = 2,\n}: {\n\tlabels: string[]\n\tcollapseAt?: number\n}) {\n\tif (labels.length === 0) return null\n\tif (labels.length > collapseAt) {\n\t\treturn (\n\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t{labels.length} selected\n\t\t\t</Badge>\n\t\t)\n\t}\n\treturn (\n\t\t<>\n\t\t\t{/* Mobile: show count only */}\n\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium lg:hidden\">\n\t\t\t\t{labels.length}\n\t\t\t</Badge>\n\t\t\t{/* Desktop: show labels */}\n\t\t\t<span className=\"hidden items-center gap-1 lg:flex\">\n\t\t\t\t{labels.map(label => (\n\t\t\t\t\t<Badge key={label} className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</Badge>\n\t\t\t\t))}\n\t\t\t</span>\n\t\t</>\n\t)\n}\n","import { useRef, useState, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { FilterTrigger } from \"./trigger\"\nimport type { FilterOption } from \"./types\"\nimport { Badge } from \"../badge\"\n\nexport interface FilterSingleSelectProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Available filter options. */\n\toptions: readonly FilterOption[]\n\t/** Controlled selected value. */\n\tvalue?: string\n\t/** Uncontrolled initial selected value. */\n\tdefaultValue?: string\n\t/** Called when the selection changes. Receives `undefined` when cleared. */\n\tonValueChange?: (value: string | undefined) => void\n\t/** Show the search input. Defaults to `true`. */\n\tsearchable?: boolean\n\t/** Placeholder for the search input. Defaults to the `title`. */\n\tsearchPlaceholder?: string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Searchable single-select filter. Picking an option closes the popover and\n * updates the trigger to show the selected label. \"Clear\" row appears when a\n * value is set.\n */\nexport function FilterSingleSelect({\n\ttitle,\n\ticon,\n\toptions,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tsearchable = true,\n\tsearchPlaceholder,\n\tdisabled,\n\tclassName,\n}: FilterSingleSelectProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<string | undefined>(\n\t\tdefaultValue,\n\t)\n\tconst currentValue = isControlled ? controlledValue : internalValue\n\tconst hasSelection = currentValue !== undefined && currentValue !== \"\"\n\n\tconst [open, setOpen] = useState(false)\n\tconst [search, setSearch] = useState(\"\")\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\tconst filtered = search\n\t\t? options.filter(opt =>\n\t\t\t\topt.label.toLowerCase().includes(search.toLowerCase()),\n\t\t\t)\n\t\t: options\n\n\tconst selectedOption = options.find(opt => opt.value === currentValue)\n\n\tfunction commit(next: string | undefined) {\n\t\tif (!isControlled) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tfunction pick(value: string) {\n\t\tcommit(value)\n\t\tsetOpen(false)\n\t}\n\n\treturn (\n\t\t<Popover.Root\n\t\t\topen={open}\n\t\t\tonOpenChange={next => {\n\t\t\t\tsetOpen(next)\n\t\t\t\tif (next && searchable) {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true })\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (!next) setSearch(\"\")\n\t\t\t}}\n\t\t>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tselectedOption ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{selectedOption.label}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[220px] p-1\"\n\t\t\t>\n\t\t\t\t{searchable && (\n\t\t\t\t\t<Menu.SearchInput className=\"mx-0 mt-0\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\tonChange={e => setSearch(e.target.value)}\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder ?? title}\n\t\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Menu.SearchInput>\n\t\t\t\t)}\n\n\t\t\t\t<Menu.List>\n\t\t\t\t\t{filtered.length === 0 && <Menu.Empty>No results found.</Menu.Empty>}\n\n\t\t\t\t\t{filtered.map(option => {\n\t\t\t\t\t\tconst isSelected = option.value === currentValue\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\tonClick={() => pick(option.value)}\n\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"flex size-4 items-center justify-center rounded-full border\",\n\t\t\t\t\t\t\t\t\t\t\tisSelected ? \"border-bruv-accent\" : \"border-bruv-neutral\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"size-2 rounded-full\",\n\t\t\t\t\t\t\t\t\t\t\t\tisSelected ? \"bg-bruv-accent\" : \"bg-transparent\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{option.icon && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary flex size-4 shrink-0 items-center justify-center [&>svg]:size-3.5\">\n\t\t\t\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span className=\"relative z-[1]\">{option.label}</span>\n\t\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</Menu.List>\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Menu.Separator />\n\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tcommit(undefined)\n\t\t\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"justify-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterToggleProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Controlled pressed state. */\n\tpressed?: boolean\n\t/** Uncontrolled initial pressed state. */\n\tdefaultPressed?: boolean\n\t/** Called when the pressed state flips. */\n\tonPressedChange?: (pressed: boolean) => void\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Boolean filter pill — no popover. Clicking the trigger flips the pressed\n * state; the trigger styling switches between dashed-empty and solid-active.\n * Useful for \"Show archived\", \"Only mine\", etc.\n */\nexport function FilterToggle({\n\ttitle,\n\ticon,\n\tpressed: controlledPressed,\n\tdefaultPressed = false,\n\tonPressedChange,\n\tdisabled,\n\tclassName,\n}: FilterToggleProps) {\n\tconst isControlled = controlledPressed !== undefined\n\tconst [internalPressed, setInternalPressed] = useState(defaultPressed)\n\tconst pressed = isControlled ? controlledPressed : internalPressed\n\n\tfunction handleClick() {\n\t\tconst next = !pressed\n\t\tif (!isControlled) setInternalPressed(next)\n\t\tonPressedChange?.(next)\n\t}\n\n\treturn (\n\t\t<FilterTrigger\n\t\t\ttitle={title}\n\t\t\ticon={icon}\n\t\t\tactive={pressed}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={className}\n\t\t\tonClick={handleClick}\n\t\t\taria-pressed={pressed}\n\t\t/>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport { Calendar } from \"../calendar\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { Button } from \"../button\"\nimport { FilterTrigger } from \"./trigger\"\nimport type { FilterDateRangePreset } from \"./date-presets\"\n\nexport interface FilterDateRangeValue {\n\t/** ISO date string (yyyy-mm-dd). */\n\tfrom?: string\n\t/** ISO date string (yyyy-mm-dd). */\n\tto?: string\n}\n\nexport interface FilterDateRangeProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. Defaults to a calendar icon. */\n\ticon?: ReactNode\n\t/** Controlled value. */\n\tvalue?: FilterDateRangeValue\n\t/** Uncontrolled initial value. */\n\tdefaultValue?: FilterDateRangeValue\n\t/** Called when the range changes. */\n\tonValueChange?: (value: FilterDateRangeValue) => void\n\t/**\n\t * Quick-pick presets rendered above the from/to inputs. Clicking a\n\t * preset resolves its `value()` at click time, commits the result, and\n\t * closes the popover. See `dateRangePresets` for a sensible default.\n\t */\n\tpresets?: readonly FilterDateRangePreset[]\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nconst dateFormatter = new Intl.DateTimeFormat(undefined, {\n\tmonth: \"short\",\n\tday: \"numeric\",\n})\n\nfunction formatRange(value: FilterDateRangeValue | undefined): string | null {\n\tif (!value) return null\n\tconst fromDate = parseLocalDate(value.from)\n\tconst toDate = parseLocalDate(value.to)\n\tif (fromDate && toDate) {\n\t\treturn `${dateFormatter.format(fromDate)} – ${dateFormatter.format(toDate)}`\n\t}\n\tif (fromDate) return `From ${dateFormatter.format(fromDate)}`\n\tif (toDate) return `Until ${dateFormatter.format(toDate)}`\n\treturn null\n}\n\n/**\n * Date range filter with an inline Calendar in the popover.\n */\nexport function FilterDateRange({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tpresets,\n\tdisabled,\n\tclassName,\n}: FilterDateRangeProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<FilterDateRangeValue>(\n\t\tdefaultValue ?? {},\n\t)\n\tconst [open, setOpen] = useState(false)\n\tconst currentValue = isControlled\n\t\t? (controlledValue as FilterDateRangeValue)\n\t\t: internalValue\n\tconst formatted = formatRange(currentValue)\n\tconst hasSelection = formatted !== null\n\n\tfunction commit(next: FilterDateRangeValue) {\n\t\tconst normalized: FilterDateRangeValue = {\n\t\t\tfrom: next.from || undefined,\n\t\t\tto: next.to || undefined,\n\t\t}\n\t\tif (!isControlled) setInternalValue(normalized)\n\t\tonValueChange?.(normalized)\n\t}\n\n\tfunction applyPreset(preset: FilterDateRangePreset) {\n\t\tcommit(preset.value())\n\t\tsetOpen(false)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <CalendarIcon />}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tformatted ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-auto p-0\"\n\t\t\t>\n\t\t\t\t{presets && presets.length > 0 && (\n\t\t\t\t\t<div className=\"border-bruv-neutral flex flex-wrap gap-1 border-b p-2\">\n\t\t\t\t\t\t{presets.map(preset => {\n\t\t\t\t\t\t\tconst presetValue = preset.value()\n\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\tpresetValue.from === currentValue.from &&\n\t\t\t\t\t\t\t\tpresetValue.to === currentValue.to\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tkey={preset.label}\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\tvariant={isActive ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\t\t\t\tonClick={() => applyPreset(preset)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{preset.label}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"range\"\n\t\t\t\t\trangeValue={{\n\t\t\t\t\t\tfrom: parseLocalDate(currentValue.from) ?? undefined,\n\t\t\t\t\t\tto: parseLocalDate(currentValue.to) ?? undefined,\n\t\t\t\t\t}}\n\t\t\t\t\tonRangeValueChange={range => {\n\t\t\t\t\t\tconst next: FilterDateRangeValue = {\n\t\t\t\t\t\t\tfrom: range.from ? formatIsoDate(range.from) : undefined,\n\t\t\t\t\t\t\tto: range.to ? formatIsoDate(range.to) : undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcommit(next)\n\t\t\t\t\t\tif (next.from && next.to) setOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"border-0 shadow-none\"\n\t\t\t\t/>\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<div className=\"border-bruv-neutral border-t p-1\">\n\t\t\t\t\t\t<Menu.Item onClick={() => commit({})} className=\"justify-center\">\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","export function parseLocalDate(iso: string | undefined): Date | null {\n\tif (!iso) return null\n\tconst match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso)\n\tif (!match) return null\n\tconst year = Number(match[1])\n\tconst month = Number(match[2])\n\tconst day = Number(match[3])\n\tconst date = new Date(year, month - 1, day)\n\tif (!Number.isFinite(date.getTime())) return null\n\tif (\n\t\tdate.getFullYear() !== year ||\n\t\tdate.getMonth() !== month - 1 ||\n\t\tdate.getDate() !== day\n\t) {\n\t\treturn null\n\t}\n\treturn date\n}\n\nexport function formatIsoDate(date: Date): string {\n\tconst y = date.getFullYear()\n\tconst m = String(date.getMonth() + 1).padStart(2, \"0\")\n\tconst d = String(date.getDate()).padStart(2, \"0\")\n\treturn `${y}-${m}-${d}`\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n\treturn (\n\t\ta.getFullYear() === b.getFullYear() &&\n\t\ta.getMonth() === b.getMonth() &&\n\t\ta.getDate() === b.getDate()\n\t)\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n\treturn a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth()\n}\n\nexport function startOfMonth(date: Date): Date {\n\treturn new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nexport function addMonths(date: Date, months: number): Date {\n\treturn new Date(date.getFullYear(), date.getMonth() + months, 1)\n}\n\nexport function getDaysInMonth(date: Date): number {\n\treturn new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()\n}\n\nexport function getWeekdayOffset(date: Date): number {\n\treturn new Date(date.getFullYear(), date.getMonth(), 1).getDay()\n}\n\nexport function isDateInRange(\n\tdate: Date,\n\tfrom: Date | null,\n\tto: Date | null,\n): boolean {\n\tif (from && date < from) return false\n\tif (to && date > to) return false\n\treturn true\n}\n\nexport function isBetweenInclusive(date: Date, from: Date, to: Date): boolean {\n\tconst time = date.getTime()\n\treturn time >= from.getTime() && time <= to.getTime()\n}\n","import { useState, type ComponentProps } from \"react\"\nimport { ChevronLeftIcon, ChevronRightIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport {\n\taddMonths,\n\tformatIsoDate,\n\tgetDaysInMonth,\n\tgetWeekdayOffset,\n\tisBetweenInclusive,\n\tisSameDay,\n\tisSameMonth,\n\tparseLocalDate,\n\tstartOfMonth,\n} from \"../../lib/date\"\nimport { Button } from \"../button\"\n\nconst WEEKDAYS = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"] as const\n\nexport type CalendarMode = \"single\" | \"range\"\n\nexport interface CalendarRangeValue {\n\tfrom?: Date\n\tto?: Date\n}\n\nexport interface CalendarProps extends Omit<\n\tComponentProps<\"div\">,\n\t\"onChange\" | \"defaultValue\"\n> {\n\tmode?: CalendarMode\n\tvalue?: Date | null\n\tdefaultValue?: Date | null\n\tonValueChange?: (value: Date | null) => void\n\trangeValue?: CalendarRangeValue\n\tdefaultRangeValue?: CalendarRangeValue\n\tonRangeValueChange?: (value: CalendarRangeValue) => void\n\tmonth?: Date\n\tdefaultMonth?: Date\n\tonMonthChange?: (month: Date) => void\n\tminDate?: Date\n\tmaxDate?: Date\n\tdisabled?: (date: Date) => boolean\n}\n\nfunction dateAtMidnight(date: Date): Date {\n\treturn new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction isDisabledDate(\n\tdate: Date,\n\tminDate?: Date,\n\tmaxDate?: Date,\n\tdisabled?: (date: Date) => boolean,\n): boolean {\n\tconst d = dateAtMidnight(date)\n\tif (minDate && d < dateAtMidnight(minDate)) return true\n\tif (maxDate && d > dateAtMidnight(maxDate)) return true\n\treturn disabled?.(date) ?? false\n}\n\nexport function Calendar({\n\tmode = \"single\",\n\tvalue: controlledValue,\n\tdefaultValue = null,\n\tonValueChange,\n\trangeValue: controlledRange,\n\tdefaultRangeValue,\n\tonRangeValueChange,\n\tmonth: controlledMonth,\n\tdefaultMonth,\n\tonMonthChange,\n\tminDate,\n\tmaxDate,\n\tdisabled,\n\tclassName,\n\t...props\n}: CalendarProps) {\n\tconst [internalValue, setInternalValue] = useState<Date | null>(defaultValue)\n\tconst [internalRange, setInternalRange] = useState<CalendarRangeValue>(\n\t\tdefaultRangeValue ?? {},\n\t)\n\tconst [internalMonth, setInternalMonth] = useState<Date>(\n\t\tdefaultMonth ?? startOfMonth(new Date()),\n\t)\n\tconst [hoverDate, setHoverDate] = useState<Date | null>(null)\n\n\tconst value = controlledValue !== undefined ? controlledValue : internalValue\n\tconst range = controlledRange !== undefined ? controlledRange : internalRange\n\tconst visibleMonth =\n\t\tcontrolledMonth !== undefined ? controlledMonth : internalMonth\n\n\tconst setMonth = (next: Date) => {\n\t\tif (controlledMonth === undefined) setInternalMonth(next)\n\t\tonMonthChange?.(next)\n\t}\n\n\tconst setValue = (next: Date | null) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tconst setRange = (next: CalendarRangeValue) => {\n\t\tif (controlledRange === undefined) setInternalRange(next)\n\t\tonRangeValueChange?.(next)\n\t}\n\n\tconst today = dateAtMidnight(new Date())\n\tconst daysInMonth = getDaysInMonth(visibleMonth)\n\tconst offset = getWeekdayOffset(visibleMonth)\n\n\tconst handleSelect = (date: Date) => {\n\t\tif (isDisabledDate(date, minDate, maxDate, disabled)) return\n\n\t\tif (mode === \"single\") {\n\t\t\tsetValue(date)\n\t\t\treturn\n\t\t}\n\n\t\tconst from = range.from\n\t\tconst to = range.to\n\t\tif (!from || (from && to)) {\n\t\t\tsetRange({ from: date, to: undefined })\n\t\t\treturn\n\t\t}\n\t\tif (date < from) {\n\t\t\tsetRange({ from: date, to: from })\n\t\t\treturn\n\t\t}\n\t\tsetRange({ from, to: date })\n\t}\n\n\tconst rangeEnd =\n\t\tmode === \"range\" && range.from && !range.to && hoverDate\n\t\t\t? hoverDate\n\t\t\t: range.to\n\n\tconst monthLabel = new Intl.DateTimeFormat(undefined, {\n\t\tmonth: \"long\",\n\t\tyear: \"numeric\",\n\t}).format(visibleMonth)\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"w-[280px] rounded-bruv-lg border border-bruv-neutral bg-bruv-base-2 p-3 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className=\"mb-3 flex items-center justify-between gap-2\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\ticonLeft={<ChevronLeftIcon />}\n\t\t\t\t\taria-label=\"Previous month\"\n\t\t\t\t\tonClick={() => setMonth(addMonths(visibleMonth, -1))}\n\t\t\t\t/>\n\t\t\t\t<span className=\"text-bruv-sm text-bruv-primary font-medium\">\n\t\t\t\t\t{monthLabel}\n\t\t\t\t</span>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\ticonLeft={<ChevronRightIcon />}\n\t\t\t\t\taria-label=\"Next month\"\n\t\t\t\t\tonClick={() => setMonth(addMonths(visibleMonth, 1))}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-7 gap-0.5\">\n\t\t\t\t{WEEKDAYS.map(day => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={day}\n\t\t\t\t\t\tclassName=\"text-bruv-xs text-bruv-tertiary flex h-8 items-center justify-center font-medium\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{day}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\n\t\t\t\t{Array.from({ length: offset }, (_, i) => (\n\t\t\t\t\t<div key={`pad-${String(i)}`} aria-hidden=\"true\" />\n\t\t\t\t))}\n\n\t\t\t\t{Array.from({ length: daysInMonth }, (_, i) => {\n\t\t\t\t\tconst day = i + 1\n\t\t\t\t\tconst date = new Date(\n\t\t\t\t\t\tvisibleMonth.getFullYear(),\n\t\t\t\t\t\tvisibleMonth.getMonth(),\n\t\t\t\t\t\tday,\n\t\t\t\t\t)\n\t\t\t\t\tconst isToday = isSameDay(date, today)\n\t\t\t\t\tconst isSelected =\n\t\t\t\t\t\tmode === \"single\" && value ? isSameDay(date, value) : false\n\t\t\t\t\tconst inRange =\n\t\t\t\t\t\tmode === \"range\" &&\n\t\t\t\t\t\trange.from &&\n\t\t\t\t\t\trangeEnd &&\n\t\t\t\t\t\tisBetweenInclusive(date, range.from, rangeEnd)\n\t\t\t\t\tconst isRangeStart =\n\t\t\t\t\t\tmode === \"range\" && range.from && isSameDay(date, range.from)\n\t\t\t\t\tconst isRangeEnd =\n\t\t\t\t\t\tmode === \"range\" && rangeEnd && isSameDay(date, rangeEnd)\n\t\t\t\t\tconst isOutsideMonth = !isSameMonth(date, visibleMonth)\n\t\t\t\t\tconst isDisabled = isDisabledDate(date, minDate, maxDate, disabled)\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={formatIsoDate(date)}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\tonClick={() => handleSelect(date)}\n\t\t\t\t\t\t\tonMouseEnter={() =>\n\t\t\t\t\t\t\t\tmode === \"range\" ? setHoverDate(date) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonMouseLeave={() =>\n\t\t\t\t\t\t\t\tmode === \"range\" ? setHoverDate(null) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-bruv-sm relative flex h-8 w-full items-center justify-center rounded-bruv-md transition-colors\",\n\t\t\t\t\t\t\t\t\"hover:bg-bruv-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\t\t\tisDisabled && \"pointer-events-none opacity-40\",\n\t\t\t\t\t\t\t\tisOutsideMonth && \"text-bruv-tertiary\",\n\t\t\t\t\t\t\t\tisToday && !isSelected && !inRange && \"font-semibold\",\n\t\t\t\t\t\t\t\tinRange && \"bg-bruv-accent-subtle text-bruv-accent\",\n\t\t\t\t\t\t\t\t(isSelected || isRangeStart || isRangeEnd) &&\n\t\t\t\t\t\t\t\t\t\"bg-bruv-accent text-bruv-accent-on hover:bg-bruv-accent\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nexport { parseLocalDate, formatIsoDate }\n","import { useState, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterNumericRangeValue {\n\tmin?: number\n\tmax?: number\n}\n\nexport interface FilterNumericRangeProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Controlled value. */\n\tvalue?: FilterNumericRangeValue\n\t/** Uncontrolled initial value. */\n\tdefaultValue?: FilterNumericRangeValue\n\t/** Called when the range changes. */\n\tonValueChange?: (value: FilterNumericRangeValue) => void\n\t/** Lower bound for the input controls (doesn't appear in the badge). */\n\tmin?: number\n\t/** Upper bound for the input controls (doesn't appear in the badge). */\n\tmax?: number\n\t/** Step for the input controls. */\n\tstep?: number\n\t/** Prefix shown next to each value in the trigger badge (e.g. \"$\", \"★\"). */\n\tunit?: string\n\t/** Custom badge formatter. Falls back to `Intl.NumberFormat` + unit. */\n\tformat?: (n: number) => string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nconst numberFormatter = new Intl.NumberFormat()\n\nfunction defaultFormat(n: number, unit?: string): string {\n\tconst formatted = numberFormatter.format(n)\n\treturn unit ? `${unit}${formatted}` : formatted\n}\n\nfunction formatRange(\n\tvalue: FilterNumericRangeValue,\n\tunit?: string,\n\tformat?: (n: number) => string,\n): string | null {\n\tconst formatter = (n: number) => (format ? format(n) : defaultFormat(n, unit))\n\tconst hasMin = value.min !== undefined && !Number.isNaN(value.min)\n\tconst hasMax = value.max !== undefined && !Number.isNaN(value.max)\n\tif (hasMin && hasMax) {\n\t\treturn `${formatter(value.min as number)} – ${formatter(value.max as number)}`\n\t}\n\tif (hasMin) return `≥ ${formatter(value.min as number)}`\n\tif (hasMax) return `≤ ${formatter(value.max as number)}`\n\treturn null\n}\n\n/**\n * Numeric range filter. Paired `<input type=\"number\">` controls in the\n * popover; trigger shows the formatted range when active.\n */\nexport function FilterNumericRange({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tmin,\n\tmax,\n\tstep,\n\tunit,\n\tformat,\n\tdisabled,\n\tclassName,\n}: FilterNumericRangeProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<FilterNumericRangeValue>(\n\t\tdefaultValue ?? {},\n\t)\n\tconst currentValue = isControlled\n\t\t? (controlledValue as FilterNumericRangeValue)\n\t\t: internalValue\n\tconst formatted = formatRange(currentValue, unit, format)\n\tconst hasSelection = formatted !== null\n\n\tfunction commit(next: FilterNumericRangeValue) {\n\t\tconst normalized: FilterNumericRangeValue = {\n\t\t\tmin:\n\t\t\t\tnext.min === undefined || Number.isNaN(next.min) ? undefined : next.min,\n\t\t\tmax:\n\t\t\t\tnext.max === undefined || Number.isNaN(next.max) ? undefined : next.max,\n\t\t}\n\t\tif (!isControlled) setInternalValue(normalized)\n\t\tonValueChange?.(normalized)\n\t}\n\n\treturn (\n\t\t<Popover.Root>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tformatted ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[260px] p-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<NumericField\n\t\t\t\t\t\tlabel=\"Min\"\n\t\t\t\t\t\tvalue={currentValue.min}\n\t\t\t\t\t\tmax={currentValue.max ?? max}\n\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tunit={unit}\n\t\t\t\t\t\tonChange={value => commit({ ...currentValue, min: value })}\n\t\t\t\t\t/>\n\t\t\t\t\t<NumericField\n\t\t\t\t\t\tlabel=\"Max\"\n\t\t\t\t\t\tvalue={currentValue.max}\n\t\t\t\t\t\tmin={currentValue.min ?? min}\n\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tunit={unit}\n\t\t\t\t\t\tonChange={value => commit({ ...currentValue, max: value })}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Menu.Separator className=\"mt-2\" />\n\t\t\t\t\t\t<Menu.Item onClick={() => commit({})} className=\"justify-center\">\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n\nfunction NumericField({\n\tlabel,\n\tvalue,\n\tmin,\n\tmax,\n\tstep,\n\tunit,\n\tonChange,\n}: {\n\tlabel: string\n\tvalue: number | undefined\n\tmin?: number\n\tmax?: number\n\tstep?: number\n\tunit?: string\n\tonChange: (value: number | undefined) => void\n}) {\n\treturn (\n\t\t<label className=\"flex flex-col gap-1\">\n\t\t\t<span className=\"text-bruv-secondary text-bruv-sm\">{label}</span>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-1 border-bruv-neutral text-bruv-primary\",\n\t\t\t\t\t\"flex h-8 items-center gap-1 rounded-bruv-md border px-2\",\n\t\t\t\t\t\"focus-within:ring-bruv-focus focus-within:ring-2 focus-within:ring-offset-2\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{unit && (\n\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-base\">{unit}</span>\n\t\t\t\t)}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\tvalue={value ?? \"\"}\n\t\t\t\t\tmin={min}\n\t\t\t\t\tmax={max}\n\t\t\t\t\tstep={step}\n\t\t\t\t\tonChange={e => {\n\t\t\t\t\t\tconst raw = e.target.value\n\t\t\t\t\t\tif (raw === \"\") onChange(undefined)\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tconst n = Number(raw)\n\t\t\t\t\t\t\tonChange(Number.isNaN(n) ? undefined : n)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</label>\n\t)\n}\n","import { useRef, useState, type KeyboardEvent, type ReactNode } from \"react\"\nimport { MagnifyingGlassIcon, XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterTextProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Controlled value. */\n\tvalue?: string\n\t/** Uncontrolled initial value. */\n\tdefaultValue?: string\n\t/** Called on every keystroke. */\n\tonValueChange?: (value: string) => void\n\t/** Placeholder for the popover input. Defaults to `title`. */\n\tplaceholder?: string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Single-text-input filter. The popover hosts an auto-focused input with an\n * inline clear button. Commits on every keystroke; consumers can wrap\n * `onValueChange` if they need to debounce server-side filtering.\n */\nexport function FilterText({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tplaceholder,\n\tdisabled,\n\tclassName,\n}: FilterTextProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState(defaultValue ?? \"\")\n\tconst currentValue = isControlled\n\t\t? (controlledValue as string)\n\t\t: internalValue\n\tconst hasSelection = currentValue.length > 0\n\n\tconst [open, setOpen] = useState(false)\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\tfunction commit(next: string) {\n\t\tif (!isControlled) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tfunction handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault()\n\t\t\tsetOpen(false)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Popover.Root\n\t\t\topen={open}\n\t\t\tonOpenChange={next => {\n\t\t\t\tsetOpen(next)\n\t\t\t\tif (next) {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true })\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <MagnifyingGlassIcon />}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\thasSelection ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t<span className=\"block max-w-[12ch] truncate\">\n\t\t\t\t\t\t\t\t\t\t{`\"${currentValue}\"`}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[240px] p-1\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-1 border-bruv-neutral text-bruv-primary\",\n\t\t\t\t\t\t\"flex h-8 items-center gap-1 rounded-bruv-md border px-2\",\n\t\t\t\t\t\t\"focus-within:ring-bruv-focus focus-within:ring-2 focus-within:ring-offset-2\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<MagnifyingGlassIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\tvalue={currentValue}\n\t\t\t\t\t\tonChange={e => commit(e.target.value)}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tplaceholder={placeholder ?? title}\n\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t/>\n\t\t\t\t\t{hasSelection && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tcommit(\"\")\n\t\t\t\t\t\t\t\tinputRef.current?.focus()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label=\"Clear\"\n\t\t\t\t\t\t\tclassName=\"text-bruv-tertiary hover:text-bruv-primary cursor-pointer\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<XMarkIcon className=\"size-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport { Calendar } from \"../calendar\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterDateProps {\n\ttitle: string\n\ticon?: ReactNode\n\tvalue?: string\n\tdefaultValue?: string\n\tonValueChange?: (value: string | undefined) => void\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nconst dateFormatter = new Intl.DateTimeFormat(undefined, {\n\tmonth: \"short\",\n\tday: \"numeric\",\n\tyear: \"numeric\",\n})\n\nexport function FilterDate({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tdisabled,\n\tclassName,\n}: FilterDateProps) {\n\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\tconst [open, setOpen] = useState(false)\n\n\tconst iso = controlledValue !== undefined ? controlledValue : internalValue\n\tconst selected = parseLocalDate(iso)\n\tconst formatted = selected ? dateFormatter.format(selected) : null\n\n\tconst commit = (next: string | undefined) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <CalendarIcon />}\n\t\t\t\t\t\tactive={!!formatted}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tformatted ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content side=\"bottom\" align=\"start\" className=\"w-auto p-0\">\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"single\"\n\t\t\t\t\tvalue={selected}\n\t\t\t\t\tonValueChange={date => {\n\t\t\t\t\t\tcommit(date ? formatIsoDate(date) : undefined)\n\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"border-0 shadow-none\"\n\t\t\t\t/>\n\t\t\t\t{formatted ? (\n\t\t\t\t\t<div className=\"border-bruv-neutral border-t p-1\">\n\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tcommit(undefined)\n\t\t\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"justify-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { AdjustmentsHorizontalIcon } from \"@heroicons/react/16/solid\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { Slider } from \"../slider\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterSliderValue {\n\tmin: number\n\tmax: number\n}\n\nexport interface FilterSliderProps {\n\ttitle: string\n\ticon?: ReactNode\n\tmin?: number\n\tmax?: number\n\tstep?: number\n\tvalue?: FilterSliderValue\n\tdefaultValue?: FilterSliderValue\n\tonValueChange?: (value: FilterSliderValue) => void\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nexport function FilterSlider({\n\ttitle,\n\ticon,\n\tmin = 0,\n\tmax = 100,\n\tstep = 1,\n\tvalue: controlledValue,\n\tdefaultValue = { min, max },\n\tonValueChange,\n\tdisabled,\n\tclassName,\n}: FilterSliderProps) {\n\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\tconst [open, setOpen] = useState(false)\n\n\tconst current =\n\t\tcontrolledValue !== undefined ? controlledValue : internalValue\n\tconst formatted = `${current.min} – ${current.max}`\n\n\tconst commit = (next: FilterSliderValue) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <AdjustmentsHorizontalIcon />}\n\t\t\t\t\t\tactive\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content side=\"bottom\" align=\"start\" className=\"w-[240px]\">\n\t\t\t\t<Slider\n\t\t\t\t\tmin={min}\n\t\t\t\t\tmax={max}\n\t\t\t\t\tstep={step}\n\t\t\t\t\tvalue={[current.min, current.max]}\n\t\t\t\t\tonValueChange={values => {\n\t\t\t\t\t\tconst [a, b] = values as number[]\n\t\t\t\t\t\tcommit({ min: a ?? min, max: b ?? max })\n\t\t\t\t\t}}\n\t\t\t\t\tshowValue\n\t\t\t\t/>\n\t\t\t\t<Menu.Separator className=\"my-2\" />\n\t\t\t\t<Menu.Item\n\t\t\t\t\tonClick={() => commit({ min, max })}\n\t\t\t\t\tclassName=\"justify-center\"\n\t\t\t\t>\n\t\t\t\t\t<span className=\"relative z-[1]\">Reset</span>\n\t\t\t\t</Menu.Item>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { Slider as BaseSlider } from \"@base-ui/react/slider\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst thumbClassName = cn(\n\t\"block size-4 rounded-full border-2 border-bruv-accent bg-bruv-base-2 shadow-xs\",\n\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\"transition-transform duration-150 ease-bruv-out-expo\",\n\t\"data-[disabled]:opacity-50\",\n)\n\nexport interface SliderProps extends ComponentProps<typeof BaseSlider.Root> {\n\tshowValue?: boolean\n}\n\nfunction getThumbCount(\n\tvalue: SliderProps[\"value\"],\n\tdefaultValue: SliderProps[\"defaultValue\"],\n): number {\n\tconst resolved = value ?? defaultValue\n\tif (Array.isArray(resolved)) return resolved.length\n\treturn 1\n}\n\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(function Slider(\n\t{\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\tmin = 0,\n\t\tmax = 100,\n\t\tstep = 1,\n\t\tdisabled,\n\t\tshowValue = false,\n\t\tclassName,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst thumbCount = getThumbCount(value, defaultValue)\n\n\treturn (\n\t\t<BaseSlider.Root\n\t\t\tref={ref}\n\t\t\tvalue={value}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tonValueChange={onValueChange}\n\t\t\tmin={min}\n\t\t\tmax={max}\n\t\t\tstep={step}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex w-full touch-none flex-col gap-2 select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<BaseSlider.Control className=\"relative flex h-5 w-full items-center py-2\">\n\t\t\t\t<BaseSlider.Track className=\"bg-bruv-subtle relative h-1.5 w-full grow rounded-full\">\n\t\t\t\t\t<BaseSlider.Indicator className=\"bg-bruv-accent absolute h-full rounded-full\" />\n\t\t\t\t</BaseSlider.Track>\n\t\t\t\t{Array.from({ length: thumbCount }, (_, index) => (\n\t\t\t\t\t<BaseSlider.Thumb\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t{...(thumbCount > 1 ? { index } : {})}\n\t\t\t\t\t\tclassName={thumbClassName}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</BaseSlider.Control>\n\t\t\t{showValue ? (\n\t\t\t\t<BaseSlider.Value className=\"text-bruv-xs text-bruv-secondary tabular-nums\">\n\t\t\t\t\t{(_formatted, values) => values.join(\" – \")}\n\t\t\t\t</BaseSlider.Value>\n\t\t\t) : null}\n\t\t</BaseSlider.Root>\n\t)\n})\n","import { FilterMultiSelect } from \"./multi-select\"\nimport { FilterSingleSelect } from \"./single-select\"\nimport { FilterToggle } from \"./toggle\"\nimport { FilterDateRange } from \"./date-range\"\nimport { FilterNumericRange } from \"./numeric-range\"\nimport { FilterText } from \"./text\"\nimport { FilterDate } from \"./date\"\nimport { FilterSlider } from \"./slider\"\n\n/**\n * Filter pills for lists and tables. Drop the appropriate sub-variant\n * onto your toolbar:\n *\n * - `Filter.MultiSelect` — searchable checkbox list (with optional async loader)\n * - `Filter.SingleSelect` — searchable radio list (picking closes)\n * - `Filter.Toggle` — boolean on/off pill, no popover\n * - `Filter.Date` — single date with Calendar\n * - `Filter.DateRange` — date range with Calendar, optional presets\n * - `Filter.NumericRange` — paired numeric inputs with optional unit prefix\n * - `Filter.Slider` — numeric range slider\n * - `Filter.Text` — single text input\n */\nexport const Filter = {\n\tMultiSelect: FilterMultiSelect,\n\tSingleSelect: FilterSingleSelect,\n\tToggle: FilterToggle,\n\tDate: FilterDate,\n\tDateRange: FilterDateRange,\n\tNumericRange: FilterNumericRange,\n\tSlider: FilterSlider,\n\tText: FilterText,\n}\n","import type { FilterDateRangeValue } from \"./date-range\"\n\nexport interface FilterDateRangePreset {\n\t/** Label rendered on the preset button. */\n\treadonly label: string\n\t/**\n\t * Resolved at click time so relative presets like \"Last 7 days\" stay\n\t * accurate as the day rolls over.\n\t */\n\treadonly value: () => FilterDateRangeValue\n}\n\nfunction isoDate(d: Date): string {\n\tconst year = d.getFullYear()\n\tconst month = String(d.getMonth() + 1).padStart(2, \"0\")\n\tconst day = String(d.getDate()).padStart(2, \"0\")\n\treturn `${year}-${month}-${day}`\n}\n\nfunction addDays(d: Date, n: number): Date {\n\tconst next = new Date(d)\n\tnext.setDate(next.getDate() + n)\n\treturn next\n}\n\nfunction startOfMonth(d: Date): Date {\n\treturn new Date(d.getFullYear(), d.getMonth(), 1)\n}\n\n/**\n * The five date-range presets most apps need. Pass to\n * `<Filter.DateRange presets={...} />`.\n */\nexport const dateRangePresets: readonly FilterDateRangePreset[] = [\n\t{\n\t\tlabel: \"Today\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(today), to: isoDate(today) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"Yesterday\",\n\t\tvalue: () => {\n\t\t\tconst yesterday = addDays(new Date(), -1)\n\t\t\treturn { from: isoDate(yesterday), to: isoDate(yesterday) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"Last 7 days\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(addDays(today, -6)), to: isoDate(today) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"Last 30 days\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(addDays(today, -29)), to: isoDate(today) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"This month\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(startOfMonth(today)), to: isoDate(today) }\n\t\t},\n\t},\n]\n","import { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { useState } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport { Calendar } from \"../calendar\"\nimport { Form } from \"../form\"\nimport { Popover } from \"../popover\"\n\nexport interface DatePickerProps {\n\tvalue?: string\n\tdefaultValue?: string\n\tonValueChange?: (value: string | undefined) => void\n\tplaceholder?: string\n\tdisabled?: boolean\n\tsize?: \"sm\" | \"md\"\n\tclassName?: string\n\tminDate?: Date\n\tmaxDate?: Date\n}\n\nexport function DatePicker({\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tplaceholder = \"Pick a date\",\n\tdisabled,\n\tsize = \"md\",\n\tclassName,\n\tminDate,\n\tmaxDate,\n}: DatePickerProps) {\n\tconst [open, setOpen] = useState(false)\n\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\n\tconst iso = controlledValue !== undefined ? controlledValue : internalValue\n\tconst selected = parseLocalDate(iso)\n\n\tconst setIso = (next: string | undefined) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tconst display = selected\n\t\t? new Intl.DateTimeFormat(undefined, {\n\t\t\t\tmonth: \"short\",\n\t\t\t\tday: \"numeric\",\n\t\t\t\tyear: \"numeric\",\n\t\t\t}).format(selected)\n\t\t: \"\"\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\"w-full text-left\", className)}\n\t\t\t\trender={\n\t\t\t\t\t<button type=\"button\" className=\"w-full\">\n\t\t\t\t\t\t<Form.Input\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\tvalue={display}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\ticonRight={<CalendarIcon />}\n\t\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content align=\"start\" className=\"p-0\">\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"single\"\n\t\t\t\t\tvalue={selected}\n\t\t\t\t\tonValueChange={date => {\n\t\t\t\t\t\tsetIso(date ? formatIsoDate(date) : undefined)\n\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t/>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { useState } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport type { CalendarRangeValue } from \"../calendar\"\nimport { Calendar } from \"../calendar\"\nimport { Form } from \"../form\"\nimport { Popover } from \"../popover\"\n\nexport interface DateRangePickerValue {\n\tfrom?: string\n\tto?: string\n}\n\nexport interface DateRangePickerProps {\n\tvalue?: DateRangePickerValue\n\tdefaultValue?: DateRangePickerValue\n\tonValueChange?: (value: DateRangePickerValue) => void\n\tplaceholder?: string\n\tdisabled?: boolean\n\tsize?: \"sm\" | \"md\"\n\tclassName?: string\n\tminDate?: Date\n\tmaxDate?: Date\n}\n\nfunction formatDisplay(value: DateRangePickerValue | undefined): string {\n\tif (!value) return \"\"\n\tconst from = parseLocalDate(value.from)\n\tconst to = parseLocalDate(value.to)\n\tconst fmt = new Intl.DateTimeFormat(undefined, {\n\t\tmonth: \"short\",\n\t\tday: \"numeric\",\n\t})\n\tif (from && to) return `${fmt.format(from)} – ${fmt.format(to)}`\n\tif (from) return `From ${fmt.format(from)}`\n\tif (to) return `Until ${fmt.format(to)}`\n\treturn \"\"\n}\n\nfunction toCalendarRange(\n\tvalue: DateRangePickerValue | undefined,\n): CalendarRangeValue {\n\treturn {\n\t\tfrom: parseLocalDate(value?.from) ?? undefined,\n\t\tto: parseLocalDate(value?.to) ?? undefined,\n\t}\n}\n\nfunction fromCalendarRange(range: CalendarRangeValue): DateRangePickerValue {\n\treturn {\n\t\tfrom: range.from ? formatIsoDate(range.from) : undefined,\n\t\tto: range.to ? formatIsoDate(range.to) : undefined,\n\t}\n}\n\nexport function DateRangePicker({\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tplaceholder = \"Pick a date range\",\n\tdisabled,\n\tsize = \"md\",\n\tclassName,\n\tminDate,\n\tmaxDate,\n}: DateRangePickerProps) {\n\tconst [open, setOpen] = useState(false)\n\tconst [internalValue, setInternalValue] = useState<DateRangePickerValue>(\n\t\tdefaultValue ?? {},\n\t)\n\n\tconst value = controlledValue !== undefined ? controlledValue : internalValue\n\n\tconst setValue = (next: DateRangePickerValue) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\"w-full text-left\", className)}\n\t\t\t\trender={\n\t\t\t\t\t<button type=\"button\" className=\"w-full\">\n\t\t\t\t\t\t<Form.Input\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\tvalue={formatDisplay(value)}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\ticonRight={<CalendarIcon />}\n\t\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content align=\"start\" className=\"p-0\">\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"range\"\n\t\t\t\t\trangeValue={toCalendarRange(value)}\n\t\t\t\t\tonRangeValueChange={range => {\n\t\t\t\t\t\tconst next = fromCalendarRange(range)\n\t\t\t\t\t\tsetValue(next)\n\t\t\t\t\t\tif (next.from && next.to) setOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t/>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { forwardRef, useState } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { NumberInput } from \"../number-input\"\n\nexport interface TimePickerProps {\n\tvalue?: string\n\tdefaultValue?: string\n\tonValueChange?: (value: string | undefined) => void\n\tdisabled?: boolean\n\tsize?: \"sm\" | \"md\"\n\tclassName?: string\n}\n\nfunction parseTime(value: string | undefined): {\n\thours: number\n\tminutes: number\n} | null {\n\tif (!value) return null\n\tconst match = /^(\\d{1,2}):(\\d{2})$/.exec(value)\n\tif (!match) return null\n\tconst hours = Number(match[1])\n\tconst minutes = Number(match[2])\n\tif (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null\n\treturn { hours, minutes }\n}\n\nfunction formatTime(hours: number, minutes: number): string {\n\treturn `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}`\n}\n\nfunction clampHours(value: number): number {\n\treturn Math.min(23, Math.max(0, value))\n}\n\nfunction clampMinutes(value: number): number {\n\treturn Math.min(59, Math.max(0, value))\n}\n\nexport const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n\tfunction TimePicker(\n\t\t{\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\tdisabled,\n\t\t\tsize = \"md\",\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\t\tconst timeString =\n\t\t\tcontrolledValue !== undefined ? controlledValue : internalValue\n\t\tconst parsed = parseTime(timeString)\n\t\tconst hours = parsed?.hours ?? 0\n\t\tconst minutes = parsed?.minutes ?? 0\n\n\t\tconst commit = (nextHours: number, nextMinutes: number) => {\n\t\t\tconst next = formatTime(clampHours(nextHours), clampMinutes(nextMinutes))\n\t\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\t\tonValueChange?.(next)\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"inline-flex items-center gap-2\", className)}\n\t\t\t>\n\t\t\t\t<NumberInput\n\t\t\t\t\tsize={size}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={23}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tvalue={hours}\n\t\t\t\t\tonValueChange={v => commit(v ?? 0, minutes)}\n\t\t\t\t\taria-label=\"Hours\"\n\t\t\t\t/>\n\t\t\t\t<span className=\"text-bruv-secondary text-bruv-base font-medium\">\n\t\t\t\t\t:\n\t\t\t\t</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tsize={size}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={59}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tvalue={minutes}\n\t\t\t\t\tonValueChange={v => commit(hours, v ?? 0)}\n\t\t\t\t\taria-label=\"Minutes\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { NumberField as BaseNumberField } from \"@base-ui/react/number-field\"\nimport { ChevronDownIcon, ChevronUpIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: { input: \"h-7 text-bruv-sm px-2.5\", button: \"w-7\" },\n\tmd: { input: \"h-8 text-bruv-base px-3\", button: \"w-8\" },\n} as const\n\nexport type NumberInputSize = keyof typeof sizeStyles\n\nexport interface NumberInputProps extends ComponentProps<\n\ttypeof BaseNumberField.Root\n> {\n\tsize?: NumberInputSize\n}\n\nexport const NumberInput = forwardRef<HTMLDivElement, NumberInputProps>(\n\tfunction NumberInput(\n\t\t{\n\t\t\tsize = \"md\",\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\tmin,\n\t\t\tmax,\n\t\t\tstep = 1,\n\t\t\tvalue,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\n\t\treturn (\n\t\t\t<BaseNumberField.Root\n\t\t\t\tref={ref}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tstep={step}\n\t\t\t\tvalue={value}\n\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\tonValueChange={onValueChange}\n\t\t\t\tclassName={cn(\"inline-flex\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseNumberField.Group\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-stretch overflow-hidden rounded-bruv-md border border-bruv-neutral bg-bruv-base-2\",\n\t\t\t\t\t\t\"focus-within:ring-2 focus-within:ring-bruv-focus focus-within:border-bruv-neutral-strong\",\n\t\t\t\t\t\t\"data-[disabled]:opacity-50 data-[disabled]:pointer-events-none\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<BaseNumberField.Decrement\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex shrink-0 items-center justify-center border-r border-bruv-neutral text-bruv-secondary\",\n\t\t\t\t\t\t\t\"hover:bg-bruv-subtle active:bg-bruv-subtle\",\n\t\t\t\t\t\t\ts.button,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronDownIcon className=\"size-3.5\" />\n\t\t\t\t\t</BaseNumberField.Decrement>\n\t\t\t\t\t<BaseNumberField.Input\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"min-w-0 flex-1 bg-transparent text-center text-bruv-primary outline-none tabular-nums\",\n\t\t\t\t\t\t\ts.input,\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t\t<BaseNumberField.Increment\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex shrink-0 items-center justify-center border-l border-bruv-neutral text-bruv-secondary\",\n\t\t\t\t\t\t\t\"hover:bg-bruv-subtle active:bg-bruv-subtle\",\n\t\t\t\t\t\t\ts.button,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronUpIcon className=\"size-3.5\" />\n\t\t\t\t\t</BaseNumberField.Increment>\n\t\t\t\t</BaseNumberField.Group>\n\t\t\t</BaseNumberField.Root>\n\t\t)\n\t},\n)\n","import { Progress as BaseProgress } from \"@base-ui/react/progress\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ProgressProps extends ComponentProps<\n\ttypeof BaseProgress.Root\n> {\n\t/** Show value label below the bar */\n\tshowValue?: boolean\n}\n\nconst ProgressRoot = forwardRef<HTMLDivElement, ProgressProps>(\n\tfunction Progress(\n\t\t{ value, max = 100, min = 0, showValue = false, className, ...props },\n\t\tref,\n\t) {\n\t\tconst percent =\n\t\t\tvalue === null || value === undefined\n\t\t\t\t? null\n\t\t\t\t: Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100))\n\n\t\treturn (\n\t\t\t<div className={cn(\"flex w-full flex-col gap-1.5\", className)}>\n\t\t\t\t<BaseProgress.Root ref={ref} value={value} max={max} {...props}>\n\t\t\t\t\t<BaseProgress.Track\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"h-2 w-full overflow-hidden rounded-full bg-bruv-subtle\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseProgress.Indicator\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"h-full rounded-full bg-bruv-accent transition-[width] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\t\tvalue === null && \"w-1/3 animate-pulse\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={percent !== null ? { width: `${percent}%` } : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</BaseProgress.Track>\n\t\t\t\t</BaseProgress.Root>\n\t\t\t\t{showValue && value !== null ? (\n\t\t\t\t\t<span className=\"text-bruv-xs text-bruv-secondary tabular-nums\">\n\t\t\t\t\t\t{Math.round(percent ?? 0)}%\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface ProgressCircularProps extends ComponentProps<\"div\"> {\n\tvalue: number | null\n\tmax?: number\n\tsize?: number\n\tstrokeWidth?: number\n}\n\nexport const ProgressCircular = forwardRef<\n\tHTMLDivElement,\n\tProgressCircularProps\n>(function ProgressCircular(\n\t{ value, max = 100, size = 40, strokeWidth = 3, className, ...props },\n\tref,\n) {\n\tconst radius = (size - strokeWidth) / 2\n\tconst circumference = 2 * Math.PI * radius\n\tconst percent =\n\t\tvalue === null ? null : Math.min(100, Math.max(0, (value / max) * 100))\n\tconst offset =\n\t\tpercent === null\n\t\t\t? circumference * 0.75\n\t\t\t: circumference - (percent / 100) * circumference\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\trole=\"progressbar\"\n\t\t\taria-valuenow={value ?? undefined}\n\t\t\taria-valuemin={0}\n\t\t\taria-valuemax={max}\n\t\t\tclassName={cn(\"inline-flex\", className)}\n\t\t\tstyle={{ width: size, height: size }}\n\t\t\t{...props}\n\t\t>\n\t\t\t<svg width={size} height={size} className=\"-rotate-90\">\n\t\t\t\t<circle\n\t\t\t\t\tcx={size / 2}\n\t\t\t\t\tcy={size / 2}\n\t\t\t\t\tr={radius}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tclassName=\"stroke-bruv-subtle\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tcx={size / 2}\n\t\t\t\t\tcy={size / 2}\n\t\t\t\t\tr={radius}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"stroke-bruv-accent transition-[stroke-dashoffset] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tvalue === null && \"animate-pulse\",\n\t\t\t\t\t)}\n\t\t\t\t\tstrokeDasharray={circumference}\n\t\t\t\t\tstrokeDashoffset={offset}\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t)\n})\n\nexport const Progress = Object.assign(ProgressRoot, {\n\tCircular: ProgressCircular,\n})\n","import { ScrollArea as BaseScrollArea } from \"@base-ui/react/scroll-area\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ScrollAreaProps extends ComponentProps<\n\ttypeof BaseScrollArea.Root\n> {\n\tchildren: ReactNode\n\torientation?: \"vertical\" | \"horizontal\" | \"both\"\n}\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n\tfunction ScrollArea(\n\t\t{ children, orientation = \"vertical\", className, ...props },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<BaseScrollArea.Root\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"relative overflow-hidden\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseScrollArea.Viewport className=\"size-full max-h-[inherit] rounded-[inherit] outline-none\">\n\t\t\t\t\t<BaseScrollArea.Content>{children}</BaseScrollArea.Content>\n\t\t\t\t</BaseScrollArea.Viewport>\n\t\t\t\t{(orientation === \"vertical\" || orientation === \"both\") && (\n\t\t\t\t\t<BaseScrollArea.Scrollbar\n\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-2 touch-none select-none p-0.5\",\n\t\t\t\t\t\t\t\"data-[hovering]:bg-bruv-subtle/50\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseScrollArea.Thumb className=\"bg-bruv-neutral-strong relative flex-1 rounded-full\" />\n\t\t\t\t\t</BaseScrollArea.Scrollbar>\n\t\t\t\t)}\n\t\t\t\t{(orientation === \"horizontal\" || orientation === \"both\") && (\n\t\t\t\t\t<BaseScrollArea.Scrollbar\n\t\t\t\t\t\torientation=\"horizontal\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex h-2 touch-none select-none p-0.5\",\n\t\t\t\t\t\t\t\"data-[hovering]:bg-bruv-subtle/50\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseScrollArea.Thumb className=\"bg-bruv-neutral-strong relative flex-1 rounded-full\" />\n\t\t\t\t\t</BaseScrollArea.Scrollbar>\n\t\t\t\t)}\n\t\t\t\t<BaseScrollArea.Corner />\n\t\t\t</BaseScrollArea.Root>\n\t\t)\n\t},\n)\n","import { CheckIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface StepperStep {\n\tid: string\n\tlabel: ReactNode\n\tdescription?: ReactNode\n}\n\nexport interface StepperProps extends ComponentProps<\"nav\"> {\n\tsteps: readonly StepperStep[]\n\tcurrentStep: string\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\nexport const Stepper = forwardRef<HTMLElement, StepperProps>(function Stepper(\n\t{ steps, currentStep, orientation = \"horizontal\", className, ...props },\n\tref,\n) {\n\tconst currentIndex = steps.findIndex(s => s.id === currentStep)\n\n\treturn (\n\t\t<nav\n\t\t\tref={ref}\n\t\t\taria-label=\"Progress\"\n\t\t\tclassName={cn(\n\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t? \"flex w-full items-start gap-2\"\n\t\t\t\t\t: \"flex flex-col gap-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{steps.map((step, index) => {\n\t\t\t\tconst isComplete = index < currentIndex\n\t\t\t\tconst isCurrent = step.id === currentStep\n\t\t\t\tconst isUpcoming = index > currentIndex\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={step.id}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex gap-3\",\n\t\t\t\t\t\t\torientation === \"horizontal\" &&\n\t\t\t\t\t\t\t\t\"min-w-0 flex-1 flex-col items-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center gap-3\",\n\t\t\t\t\t\t\t\torientation === \"horizontal\" && \"w-full flex-col\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex size-7 shrink-0 items-center justify-center rounded-full border text-bruv-sm font-medium\",\n\t\t\t\t\t\t\t\t\tisComplete &&\n\t\t\t\t\t\t\t\t\t\t\"border-bruv-accent bg-bruv-accent text-bruv-accent-on\",\n\t\t\t\t\t\t\t\t\tisCurrent &&\n\t\t\t\t\t\t\t\t\t\t\"border-bruv-accent bg-bruv-accent-subtle text-bruv-accent\",\n\t\t\t\t\t\t\t\t\tisUpcoming &&\n\t\t\t\t\t\t\t\t\t\t\"border-bruv-neutral bg-bruv-base-2 text-bruv-tertiary\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-current={isCurrent ? \"step\" : undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isComplete ? <CheckIcon className=\"size-3.5\" /> : index + 1}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{orientation === \"horizontal\" && index < steps.length - 1 ? (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"hidden h-px flex-1 bg-bruv-neutral sm:block\",\n\t\t\t\t\t\t\t\t\t\torientation === \"horizontal\" && \"absolute top-3.5 hidden\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(orientation === \"horizontal\" && \"text-center\")}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"text-bruv-sm font-medium\",\n\t\t\t\t\t\t\t\t\t\tisCurrent ? \"text-bruv-primary\" : \"text-bruv-secondary\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{step.label}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t{step.description ? (\n\t\t\t\t\t\t\t\t\t<p className=\"text-bruv-xs text-bruv-tertiary mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t{step.description}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\t})}\n\t\t</nav>\n\t)\n})\n","import { ChevronRightIcon } from \"@heroicons/react/16/solid\"\nimport { useState, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface TreeViewItem {\n\tid: string\n\tlabel: ReactNode\n\tchildren?: readonly TreeViewItem[]\n\tdisabled?: boolean\n}\n\nexport interface TreeViewProps {\n\titems: readonly TreeViewItem[]\n\tselectedId?: string\n\tdefaultSelectedId?: string\n\tonSelectedIdChange?: (id: string) => void\n\tdefaultExpandedIds?: readonly string[]\n\texpandedIds?: readonly string[]\n\tonExpandedIdsChange?: (ids: string[]) => void\n\tclassName?: string\n}\n\nfunction TreeNode({\n\titem,\n\tlevel,\n\tselectedId,\n\tonSelect,\n\texpandedIds,\n\tonToggle,\n}: {\n\titem: TreeViewItem\n\tlevel: number\n\tselectedId?: string\n\tonSelect: (id: string) => void\n\texpandedIds: Set<string>\n\tonToggle: (id: string) => void\n}) {\n\tconst children = item.children\n\tconst hasChildren = (children?.length ?? 0) > 0\n\tconst isExpanded = expandedIds.has(item.id)\n\tconst isSelected = selectedId === item.id\n\n\treturn (\n\t\t<li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center gap-1 rounded-bruv-md py-1 pr-2\",\n\t\t\t\t\t\"hover:bg-bruv-subtle\",\n\t\t\t\t\tisSelected && \"bg-bruv-subtle text-bruv-primary\",\n\t\t\t\t\titem.disabled && \"pointer-events-none opacity-50\",\n\t\t\t\t)}\n\t\t\t\tstyle={{ paddingLeft: `${level * 12 + 8}px` }}\n\t\t\t>\n\t\t\t\t{hasChildren ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"text-bruv-tertiary rounded-bruv-md focus-visible:ring-bruv-focus flex size-6 shrink-0 items-center justify-center outline-none focus-visible:ring-2\"\n\t\t\t\t\t\tonClick={() => onToggle(item.id)}\n\t\t\t\t\t\taria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"size-3.5 transition-transform duration-150\",\n\t\t\t\t\t\t\t\tisExpanded && \"rotate-90\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<span className=\"size-6 shrink-0\" aria-hidden />\n\t\t\t\t)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\tclassName=\"text-bruv-sm text-bruv-primary focus-visible:ring-bruv-focus flex-1 truncate text-left outline-none focus-visible:ring-2\"\n\t\t\t\t\tonClick={() => onSelect(item.id)}\n\t\t\t\t>\n\t\t\t\t\t{item.label}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{hasChildren && isExpanded && children ? (\n\t\t\t\t<ul role=\"group\" className=\"flex flex-col\">\n\t\t\t\t\t{children.map(child => (\n\t\t\t\t\t\t<TreeNode\n\t\t\t\t\t\t\tkey={child.id}\n\t\t\t\t\t\t\titem={child}\n\t\t\t\t\t\t\tlevel={level + 1}\n\t\t\t\t\t\t\tselectedId={selectedId}\n\t\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\t\texpandedIds={expandedIds}\n\t\t\t\t\t\t\tonToggle={onToggle}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t) : null}\n\t\t</li>\n\t)\n}\n\nexport function TreeView({\n\titems,\n\tselectedId: controlledSelected,\n\tdefaultSelectedId,\n\tonSelectedIdChange,\n\tdefaultExpandedIds = [],\n\texpandedIds: controlledExpanded,\n\tonExpandedIdsChange,\n\tclassName,\n}: TreeViewProps) {\n\tconst [internalSelected, setInternalSelected] = useState(defaultSelectedId)\n\tconst [internalExpanded, setInternalExpanded] = useState<Set<string>>(\n\t\t() => new Set(defaultExpandedIds),\n\t)\n\n\tconst selectedId =\n\t\tcontrolledSelected !== undefined ? controlledSelected : internalSelected\n\tconst expandedIds =\n\t\tcontrolledExpanded !== undefined\n\t\t\t? new Set(controlledExpanded)\n\t\t\t: internalExpanded\n\n\tconst setSelected = (id: string) => {\n\t\tif (controlledSelected === undefined) setInternalSelected(id)\n\t\tonSelectedIdChange?.(id)\n\t}\n\n\tconst toggleExpanded = (id: string) => {\n\t\tconst next = new Set(expandedIds)\n\t\tif (next.has(id)) next.delete(id)\n\t\telse next.add(id)\n\t\tif (controlledExpanded === undefined) setInternalExpanded(next)\n\t\tonExpandedIdsChange?.([...next])\n\t}\n\n\treturn (\n\t\t<ul role=\"tree\" className={cn(\"flex flex-col gap-0.5\", className)}>\n\t\t\t{items.map(item => (\n\t\t\t\t<TreeNode\n\t\t\t\t\tkey={item.id}\n\t\t\t\t\titem={item}\n\t\t\t\t\tlevel={0}\n\t\t\t\t\tselectedId={selectedId}\n\t\t\t\t\tonSelect={setSelected}\n\t\t\t\t\texpandedIds={expandedIds}\n\t\t\t\t\tonToggle={toggleExpanded}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</ul>\n\t)\n}\n","import { ContextMenu as BaseContextMenu } from \"@base-ui/react/context-menu\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\n\nexport interface ContextMenuRootProps extends ComponentProps<\n\ttypeof BaseContextMenu.Root\n> {}\n\nfunction ContextMenuRoot(props: ContextMenuRootProps) {\n\treturn <BaseContextMenu.Root {...props} />\n}\n\nexport interface ContextMenuTriggerProps extends ComponentProps<\n\ttypeof BaseContextMenu.Trigger\n> {}\n\nconst ContextMenuTrigger = forwardRef<HTMLDivElement, ContextMenuTriggerProps>(\n\tfunction ContextMenuTrigger({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseContextMenu.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"outline-none\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface ContextMenuContentProps {\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\talign?: \"start\" | \"center\" | \"end\"\n\tsideOffset?: number\n\tminWidth?: string\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nfunction ContextMenuContent({\n\tside = \"bottom\",\n\talign = \"start\",\n\tsideOffset = 4,\n\tminWidth = \"min-w-[180px]\",\n\tclassName,\n\tchildren,\n}: ContextMenuContentProps) {\n\treturn (\n\t\t<BaseContextMenu.Portal>\n\t\t\t<BaseContextMenu.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseContextMenu.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseContextMenu.Popup>\n\t\t\t</BaseContextMenu.Positioner>\n\t\t</BaseContextMenu.Portal>\n\t)\n}\n\nexport interface ContextMenuItemProps extends ComponentProps<\n\ttypeof BaseContextMenu.Item\n> {}\n\nconst ContextMenuItem = forwardRef<HTMLDivElement, ContextMenuItemProps>(\n\tfunction ContextMenuItem({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseContextMenu.Item\n\t\t\t\tref={ref}\n\t\t\t\trender={<Menu.Item className={cn(className)} />}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t</BaseContextMenu.Item>\n\t\t)\n\t},\n)\n\nexport interface ContextMenuSeparatorProps extends ComponentProps<\n\ttypeof BaseContextMenu.Separator\n> {}\n\nfunction ContextMenuSeparator(props: ContextMenuSeparatorProps) {\n\treturn <BaseContextMenu.Separator render={<Menu.Separator />} {...props} />\n}\n\nexport interface ContextMenuLabelProps extends ComponentProps<\n\ttypeof BaseContextMenu.GroupLabel\n> {}\n\nfunction ContextMenuLabel({ className, ...props }: ContextMenuLabelProps) {\n\treturn (\n\t\t<BaseContextMenu.GroupLabel\n\t\t\trender={<Menu.GroupLabel className={cn(className)} />}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport const ContextMenu = {\n\tRoot: ContextMenuRoot,\n\tTrigger: ContextMenuTrigger,\n\tContent: ContextMenuContent,\n\tItem: ContextMenuItem,\n\tSeparator: ContextMenuSeparator,\n\tLabel: ContextMenuLabel,\n}\n","import { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport {\n\tforwardRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype KeyboardEvent,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Badge } from \"../badge\"\n\nexport interface TagsInputProps extends Omit<\n\tComponentProps<\"div\">,\n\t\"onChange\"\n> {\n\tvalue?: string[]\n\tdefaultValue?: string[]\n\tonValueChange?: (value: string[]) => void\n\tplaceholder?: string\n\tdisabled?: boolean\n}\n\nexport const TagsInput = forwardRef<HTMLDivElement, TagsInputProps>(\n\tfunction TagsInput(\n\t\t{\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue = [],\n\t\t\tonValueChange,\n\t\t\tplaceholder = \"Add tag…\",\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internal, setInternal] = useState<string[]>(defaultValue)\n\t\tconst [draft, setDraft] = useState(\"\")\n\n\t\tconst tags = controlledValue !== undefined ? controlledValue : internal\n\n\t\tconst setTags = (next: string[]) => {\n\t\t\tif (controlledValue === undefined) setInternal(next)\n\t\t\tonValueChange?.(next)\n\t\t}\n\n\t\tconst addTag = (raw: string) => {\n\t\t\tconst tag = raw.trim()\n\t\t\tif (!tag || tags.includes(tag)) return\n\t\t\tsetTags([...tags, tag])\n\t\t\tsetDraft(\"\")\n\t\t}\n\n\t\tconst removeTag = (tag: string) => {\n\t\t\tsetTags(tags.filter(t => t !== tag))\n\t\t}\n\n\t\tconst onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === \"Enter\" || e.key === \",\") {\n\t\t\t\te.preventDefault()\n\t\t\t\taddTag(draft)\n\t\t\t}\n\t\t\tif (e.key === \"Backspace\" && !draft && tags.length > 0) {\n\t\t\t\tsetTags(tags.slice(0, -1))\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex min-h-8 flex-wrap items-center gap-1.5 rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 px-2 py-1.5\",\n\t\t\t\t\t\"focus-within:ring-2 focus-within:ring-bruv-focus focus-within:border-bruv-neutral-strong\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{tags.map(tag => (\n\t\t\t\t\t<Badge key={tag} variant=\"neutral\" size=\"sm\" className=\"gap-1 pr-1\">\n\t\t\t\t\t\t{tag}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"text-bruv-tertiary hover:text-bruv-primary rounded-bruv-sm focus-visible:ring-bruv-focus outline-none focus-visible:ring-1\"\n\t\t\t\t\t\t\tonClick={() => removeTag(tag)}\n\t\t\t\t\t\t\taria-label={`Remove ${tag}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<XMarkIcon className=\"size-3\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Badge>\n\t\t\t\t))}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={draft}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tplaceholder={tags.length === 0 ? placeholder : undefined}\n\t\t\t\t\tonChange={e => setDraft(e.target.value)}\n\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\tonBlur={() => addTag(draft)}\n\t\t\t\t\tclassName=\"text-bruv-base text-bruv-primary placeholder:text-bruv-tertiary min-w-[80px] flex-1 bg-transparent outline-none\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { OTPFieldPreview as BaseOTP } from \"@base-ui/react/otp-field\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface OTPProps extends Omit<\n\tComponentProps<typeof BaseOTP.Root>,\n\t\"length\"\n> {\n\tlength?: number\n}\n\nexport const OTP = forwardRef<HTMLDivElement, OTPProps>(function OTP(\n\t{ length = 6, disabled, className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseOTP.Root\n\t\t\tref={ref}\n\t\t\tlength={length}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\"flex gap-2\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{Array.from({ length }, (_, i) => (\n\t\t\t\t<BaseOTP.Input\n\t\t\t\t\tkey={String(i)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"size-10 rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 text-center text-bruv-lg font-medium text-bruv-primary tabular-nums\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:border-bruv-neutral-strong\",\n\t\t\t\t\t\t\"data-[disabled]:opacity-50\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</BaseOTP.Root>\n\t)\n})\n","import { Toolbar as BaseToolbar } from \"@base-ui/react/toolbar\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ToolbarProps extends ComponentProps<typeof BaseToolbar.Root> {\n\tchildren: ReactNode\n}\n\nconst ToolbarRoot = forwardRef<HTMLDivElement, ToolbarProps>(function Toolbar(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseToolbar.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-1 rounded-bruv-lg border border-bruv-neutral bg-bruv-base-2 p-1\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</BaseToolbar.Root>\n\t)\n})\n\nexport interface ToolbarButtonProps extends ComponentProps<\n\ttypeof BaseToolbar.Button\n> {}\n\nexport const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n\tfunction ToolbarButton({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseToolbar.Button\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex size-8 items-center justify-center rounded-bruv-md text-bruv-secondary\",\n\t\t\t\t\t\"hover:bg-bruv-subtle hover:text-bruv-primary\",\n\t\t\t\t\t\"data-[pressed]:bg-bruv-subtle data-[pressed]:text-bruv-primary\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\"data-[disabled]:opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface ToolbarSeparatorProps extends ComponentProps<\n\ttypeof BaseToolbar.Separator\n> {}\n\nexport const ToolbarSeparator = forwardRef<\n\tHTMLDivElement,\n\tToolbarSeparatorProps\n>(function ToolbarSeparator({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseToolbar.Separator\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"mx-0.5 h-5 w-px bg-bruv-neutral\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n\tButton: ToolbarButton,\n\tSeparator: ToolbarSeparator,\n})\n","import {\n\tuseCallback,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype PointerEvent,\n\ttype ReactNode,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ResizablePanelProps extends ComponentProps<\"div\"> {\n\tdefaultSize?: number\n\tminSize?: number\n\tmaxSize?: number\n\tchildren: ReactNode\n}\n\nexport function ResizablePanel({\n\tdefaultSize = 50,\n\tminSize = 20,\n\tmaxSize = 80,\n\tclassName,\n\tchildren,\n\t...props\n}: ResizablePanelProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"min-h-0 min-w-0 overflow-auto\", className)}\n\t\t\tstyle={{\n\t\t\t\tflexBasis: `${defaultSize}%`,\n\t\t\t\tflexGrow: 0,\n\t\t\t\tflexShrink: 0,\n\t\t\t\tminWidth: `${minSize}%`,\n\t\t\t\tmaxWidth: `${maxSize}%`,\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nexport interface ResizableHandleProps extends ComponentProps<\"div\"> {\n\tonResize?: (delta: number) => void\n}\n\nexport function ResizableHandle({\n\tclassName,\n\tonResize,\n\t...props\n}: ResizableHandleProps) {\n\tconst dragging = useRef(false)\n\n\tconst onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n\t\tdragging.current = true\n\t\te.currentTarget.setPointerCapture(e.pointerId)\n\t}\n\n\tconst onPointerMove = (e: PointerEvent<HTMLDivElement>) => {\n\t\tif (!dragging.current) return\n\t\tonResize?.(e.movementX)\n\t}\n\n\tconst onPointerUp = (e: PointerEvent<HTMLDivElement>) => {\n\t\tdragging.current = false\n\t\te.currentTarget.releasePointerCapture(e.pointerId)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\trole=\"separator\"\n\t\t\taria-orientation=\"vertical\"\n\t\t\ttabIndex={0}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonPointerMove={onPointerMove}\n\t\t\tonPointerUp={onPointerUp}\n\t\t\tclassName={cn(\n\t\t\t\t\"w-1 shrink-0 cursor-col-resize bg-bruv-neutral hover:bg-bruv-neutral-strong\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport interface ResizableProps extends ComponentProps<\"div\"> {\n\tchildren: ReactNode\n\tdirection?: \"horizontal\" | \"vertical\"\n}\n\nexport function Resizable({\n\tchildren,\n\tdirection = \"horizontal\",\n\tclassName,\n\t...props\n}: ResizableProps) {\n\tconst [leftPercent, setLeftPercent] = useState(50)\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\n\tconst handleResize = useCallback((deltaX: number) => {\n\t\tconst el = containerRef.current\n\t\tif (!el) return\n\t\tconst width = el.getBoundingClientRect().width\n\t\tif (width <= 0) return\n\t\tsetLeftPercent(prev =>\n\t\t\tMath.min(80, Math.max(20, prev + (deltaX / width) * 100)),\n\t\t)\n\t}, [])\n\n\tconst childArray = Array.isArray(children) ? children : [children]\n\tconst [first, second] = childArray\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex min-h-0 min-w-0\",\n\t\t\t\tdirection === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"min-h-0 min-w-0 overflow-auto\"\n\t\t\t\tstyle={\n\t\t\t\t\tdirection === \"horizontal\"\n\t\t\t\t\t\t? { width: `${leftPercent}%`, flexShrink: 0 }\n\t\t\t\t\t\t: { height: `${leftPercent}%`, flexShrink: 0 }\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{first}\n\t\t\t</div>\n\t\t\t<ResizableHandle onResize={handleResize} />\n\t\t\t<div className=\"min-h-0 min-w-0 flex-1 overflow-auto\">{second}</div>\n\t\t</div>\n\t)\n}\n\nResizable.Panel = ResizablePanel\nResizable.Handle = ResizableHandle\n","import React, { type ReactNode, forwardRef, useState } from \"react\"\nimport { SegmentedGroup, SegmentedGroupItem } from \"../segmented-group\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\tsm: \"h-7 px-2.5\",\n\tmd: \"h-8 px-3\",\n} as const\n\nexport type SegmentedControlSize = keyof typeof sizeStyles\n\nexport interface SegmentedControlOption<T extends string = string> {\n\tvalue: T\n\tlabel?: string\n\ticon?: ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n\t/** Options to display as segments */\n\toptions: SegmentedControlOption<T>[]\n\t/** Controlled value */\n\tvalue?: T\n\t/** Uncontrolled default value */\n\tdefaultValue?: T\n\t/** Called when the selected segment changes */\n\tonValueChange?: (value: T) => void\n\t/**\n\t * Layout mode:\n\t * - `fill` - segments divide space equally (default)\n\t * - `fit` - segments hug their content\n\t */\n\tlayout?: \"fill\" | \"fit\"\n\t/** Size of the segmented control items */\n\tsize?: SegmentedControlSize\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedControl\n// ---------------------------------------------------------------------------\n\n/**\n * Segmented control with a sliding indicator that animates between options.\n *\n * Two layout modes:\n * - `fill` (default) - equal-width segments via CSS grid, indicator positioned with translateX\n * - `fit` - segments size to content, indicator position/width measured from DOM\n */\nexport const SegmentedControl = forwardRef<\n\tHTMLDivElement,\n\tSegmentedControlProps<string>\n>(function SegmentedControl(\n\t{\n\t\toptions,\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\tlayout = \"fill\",\n\t\tsize = \"sm\",\n\t\tclassName,\n\t},\n\tref,\n) {\n\tconst [internalValue, setInternalValue] = useState<string>(\n\t\t() => defaultValue ?? options[0]?.value ?? \"\",\n\t)\n\tconst isControlled = controlledValue !== undefined\n\tconst activeValue = isControlled ? controlledValue : internalValue\n\tconst activeIndex = options.findIndex(o => o.value === activeValue)\n\n\tfunction handleSelect(value: string) {\n\t\tif (!isControlled) setInternalValue(value)\n\t\tonValueChange?.(value)\n\t}\n\n\treturn (\n\t\t<SegmentedGroup\n\t\t\tref={ref}\n\t\t\tactiveIndex={activeIndex}\n\t\t\titemCount={options.length}\n\t\t\tlayout={layout}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{options.map(option => (\n\t\t\t\t<SegmentedGroupItem\n\t\t\t\t\tkey={option.value}\n\t\t\t\t\tactive={option.value === activeValue}\n\t\t\t\t\taria-pressed={option.value === activeValue}\n\t\t\t\t\tonClick={() => handleSelect(option.value)}\n\t\t\t\t\tclassName={sizeStyles[size]}\n\t\t\t\t>\n\t\t\t\t\t{option.icon && (\n\t\t\t\t\t\t<span className=\"flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{option.label && <span>{option.label}</span>}\n\t\t\t\t</SegmentedGroupItem>\n\t\t\t))}\n\t\t</SegmentedGroup>\n\t)\n}) as <T extends string = string>(\n\tprops: SegmentedControlProps<T> & React.RefAttributes<HTMLDivElement>,\n) => React.ReactElement | null\n","/**\n * SegmentedGroup — shared visual primitive for segmented pill controls.\n *\n * Provides the container, sliding indicator, and item styling used by\n * both SegmentedControl (standalone value picker) and Tabs (panel switcher).\n *\n * This component owns the visual only — it renders no interactive behaviour.\n * Consumers wire their own click handlers and active-state tracking, then\n * pass `activeIndex` so the indicator knows where to slide.\n */\n\nimport {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tforwardRef,\n\tuseCallback,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedGroupProps {\n\t/** Index of the currently active item (drives the indicator position) */\n\tactiveIndex: number\n\t/** Total number of items (needed for fill layout grid) */\n\titemCount: number\n\t/**\n\t * Layout mode:\n\t * - `fill` — items divide space equally via CSS grid (default)\n\t * - `fit` — items hug their content, indicator measured from DOM\n\t */\n\tlayout?: \"fill\" | \"fit\"\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface SegmentedGroupItemProps {\n\tactive?: boolean\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedGroup (container + sliding indicator)\n// ---------------------------------------------------------------------------\n\nexport const SegmentedGroup = forwardRef<HTMLDivElement, SegmentedGroupProps>(\n\tfunction SegmentedGroup(\n\t\t{ activeIndex, itemCount, layout = \"fill\", className, children },\n\t\tref,\n\t) {\n\t\tconst isFill = layout === \"fill\"\n\n\t\t// Refs for fit-mode DOM measurement\n\t\tconst containerRef = useRef<HTMLDivElement>(null)\n\t\tconst [indicator, setIndicator] = useState<{\n\t\t\tleft: number\n\t\t\twidth: number\n\t\t} | null>(null)\n\t\tconst hasMeasuredRef = useRef(false)\n\n\t\tconst measure = useCallback(() => {\n\t\t\tif (layout !== \"fit\") return\n\t\t\tconst container = containerRef.current\n\t\t\tif (!container) return\n\n\t\t\t// Find the active item by its data attribute\n\t\t\tconst items = container.querySelectorAll(\"[data-segmented-item]\")\n\t\t\tconst btn = items[activeIndex] as HTMLElement | undefined\n\t\t\tif (!btn) return\n\n\t\t\tconst wasFirst = !hasMeasuredRef.current\n\t\t\thasMeasuredRef.current = true\n\t\t\tsetIndicator({ left: btn.offsetLeft, width: btn.offsetWidth })\n\t\t\tif (wasFirst) {\n\t\t\t\tvoid btn.offsetHeight\n\t\t\t}\n\t\t}, [activeIndex, layout])\n\n\t\tuseLayoutEffect(() => {\n\t\t\tmeasure()\n\n\t\t\tconst container = containerRef.current\n\t\t\tif (!container || layout !== \"fit\") return\n\n\t\t\tconst ro = new ResizeObserver(measure)\n\t\t\tro.observe(container)\n\t\t\treturn () => ro.disconnect()\n\t\t}, [measure, layout])\n\n\t\t// Indicator styles\n\t\tconst indicatorStyle: CSSProperties = isFill\n\t\t\t? {\n\t\t\t\t\twidth: `calc(100% / ${itemCount})`,\n\t\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t\t}\n\t\t\t: indicator\n\t\t\t\t? {\n\t\t\t\t\t\tleft: indicator.left,\n\t\t\t\t\t\twidth: indicator.width,\n\t\t\t\t\t\ttransition: hasMeasuredRef.current ? undefined : \"none\",\n\t\t\t\t\t}\n\t\t\t\t: { opacity: 0 }\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={(node: HTMLDivElement | null) => {\n\t\t\t\t\t// Merge refs\n\t\t\t\t\tcontainerRef.current = node\n\t\t\t\t\tif (typeof ref === \"function\") ref(node)\n\t\t\t\t\telse if (ref) ref.current = node\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative bg-bruv-base-0 rounded-bruv-md ring-1 ring-bruv-neutral\",\n\t\t\t\t\tisFill ? \"grid\" : \"inline-flex\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={\n\t\t\t\t\tisFill\n\t\t\t\t\t\t? { gridTemplateColumns: `repeat(${itemCount}, 1fr)` }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{/* Sliding indicator */}\n\t\t\t\t<div\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute inset-y-0 p-0.5\",\n\t\t\t\t\t\t\"transition-all duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t!isFill && !hasMeasuredRef.current && \"transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={indicatorStyle}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"bg-bruv-base-2 rounded-bruv-sm h-full shadow-sm\" />\n\t\t\t\t</div>\n\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SegmentedGroup.Item (shared item styling)\n// ---------------------------------------------------------------------------\n\nexport const SegmentedGroupItem = forwardRef<\n\tHTMLButtonElement,\n\tSegmentedGroupItemProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function SegmentedGroupItem(\n\t{ active = false, className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\tdata-segmented-item=\"\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative z-10 flex items-center justify-center gap-1.5 px-2.5 h-7 rounded-bruv-sm\",\n\t\t\t\t\"text-bruv-base font-medium select-none cursor-pointer\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\tactive\n\t\t\t\t\t? \"text-bruv-primary\"\n\t\t\t\t\t: \"text-bruv-tertiary hover:text-bruv-secondary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t)\n})\n","import type { ReactNode } from \"react\"\nimport {\n\tSunIcon,\n\tMoonIcon,\n\tComputerDesktopIcon,\n\tArrowRightStartOnRectangleIcon,\n} from \"@heroicons/react/16/solid\"\nimport { Avatar } from \"../avatar\"\nimport { DropdownMenu } from \"../dropdown-menu\"\nimport { SegmentedControl } from \"../segmented-control\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\"\n\nexport interface UserMenuUser {\n\t/** Display name */\n\tname: string\n\t/** Organization or team name */\n\torg?: string\n\t/** Avatar image URL */\n\tavatarUrl?: string\n\t/** Fallback initials when no image (e.g. \"AM\") */\n\tinitials?: string\n}\n\nexport interface UserMenuItem {\n\tlabel: string\n\ticon?: ReactNode\n\tonClick?: () => void\n}\n\nexport interface UserMenuProps {\n\t/** User information displayed in the header */\n\tuser: UserMenuUser\n\t/** Current theme mode */\n\ttheme?: ThemeMode\n\t/** Called when the theme is changed */\n\tonThemeChange?: (theme: ThemeMode) => void\n\t/** Menu items rendered between the theme toggle and log out */\n\titems?: UserMenuItem[]\n\t/** Called when \"Log out\" is clicked */\n\tonLogout?: () => void\n\t/** Custom trigger content. Defaults to a bare Avatar. */\n\tchildren?: ReactNode\n\t/** Which side the dropdown opens on */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment of the dropdown relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst themeOptions = [\n\t{ value: \"light\" as const, icon: <SunIcon /> },\n\t{ value: \"dark\" as const, icon: <MoonIcon /> },\n\t{ value: \"system\" as const, icon: <ComputerDesktopIcon /> },\n]\n\n// ---------------------------------------------------------------------------\n// UserMenu\n// ---------------------------------------------------------------------------\n\n/**\n * User menu dropdown - shows user info, theme toggle, navigation items,\n * and a log out action.\n *\n * Theme state is passed as props so the component stays decoupled from\n * any specific theme hook.\n */\nexport function UserMenu({\n\tuser,\n\ttheme = \"system\",\n\tonThemeChange,\n\titems,\n\tonLogout,\n\tchildren,\n\tside = \"bottom\",\n\talign = \"end\",\n\tclassName,\n}: UserMenuProps) {\n\treturn (\n\t\t<DropdownMenu.Root>\n\t\t\t<DropdownMenu.Trigger className={className}>\n\t\t\t\t{children ?? (\n\t\t\t\t\t<Avatar\n\t\t\t\t\t\tinitials={user.initials}\n\t\t\t\t\t\tsrc={user.avatarUrl}\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</DropdownMenu.Trigger>\n\n\t\t\t<DropdownMenu.Content\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={8}\n\t\t\t\tminWidth=\"min-w-[max(var(--anchor-width),220px)]\"\n\t\t\t>\n\t\t\t\t{/* User info header */}\n\t\t\t\t<div className=\"flex items-center gap-2 px-2 py-1.5\">\n\t\t\t\t\t<Avatar initials={user.initials} src={user.avatarUrl} size=\"md\" />\n\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-semibold\">\n\t\t\t\t\t\t\t{user.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{user.org && (\n\t\t\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-sm\">\n\t\t\t\t\t\t\t\t{user.org}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<DropdownMenu.Separator />\n\n\t\t\t\t{/* Theme toggle */}\n\t\t\t\t<div className=\"flex items-center justify-between px-2 py-1.5\">\n\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base\">Theme</span>\n\t\t\t\t\t<SegmentedControl<ThemeMode>\n\t\t\t\t\t\toptions={themeOptions}\n\t\t\t\t\t\tvalue={theme}\n\t\t\t\t\t\tonValueChange={onThemeChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Menu items */}\n\t\t\t\t{items && items.length > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DropdownMenu.Separator />\n\t\t\t\t\t\t{items.map(item => (\n\t\t\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\ticon={item.icon}\n\t\t\t\t\t\t\t\tonClick={item.onClick}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{/* Log out */}\n\t\t\t\t{onLogout && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DropdownMenu.Separator />\n\t\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\t\ticon={<ArrowRightStartOnRectangleIcon />}\n\t\t\t\t\t\t\tonClick={onLogout}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLog out\n\t\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</DropdownMenu.Content>\n\t\t</DropdownMenu.Root>\n\t)\n}\n","import { forwardRef, type ReactNode } from \"react\"\nimport {\n\tInformationCircleIcon,\n\tCheckCircleIcon,\n\tExclamationTriangleIcon,\n\tXCircleIcon,\n\tXMarkIcon,\n} from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\nimport { FlickeringGrid } from \"../flickering-grid\"\n\n// ---------------------------------------------------------------------------\n// Variant config\n// ---------------------------------------------------------------------------\n\nconst variantConfig = {\n\taccent: {\n\t\tcontainer: \"bg-bruv-accent-subtle\",\n\t\ticon: \"text-bruv-accent\",\n\t\ttext: \"text-bruv-accent [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-accent\",\n\t\tdefaultIcon: InformationCircleIcon,\n\t},\n\tsuccess: {\n\t\tcontainer: \"bg-bruv-success-subtle\",\n\t\ticon: \"text-bruv-success\",\n\t\ttext: \"text-bruv-success [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-success\",\n\t\tdefaultIcon: CheckCircleIcon,\n\t},\n\twarn: {\n\t\tcontainer: \"bg-bruv-warn-subtle\",\n\t\ticon: \"text-bruv-warn\",\n\t\ttext: \"text-bruv-warn [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-warn\",\n\t\tdefaultIcon: ExclamationTriangleIcon,\n\t},\n\tdanger: {\n\t\tcontainer: \"bg-bruv-danger-subtle\",\n\t\ticon: \"text-bruv-danger\",\n\t\ttext: \"text-bruv-danger [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-danger\",\n\t\tdefaultIcon: XCircleIcon,\n\t},\n} as const\n\nexport type AlertVariant = keyof typeof variantConfig\nexport type AlertLayout = \"inline\" | \"banner\"\n\n// ---------------------------------------------------------------------------\n// Alert\n// ---------------------------------------------------------------------------\n\nexport interface AlertProps {\n\t/** Visual style variant */\n\tvariant?: AlertVariant\n\t/**\n\t * Layout mode:\n\t * - `inline` (default) — horizontal bar with icon left, text center, action right\n\t * - `banner` — full-width centered layout for page-level announcements\n\t */\n\tlayout?: AlertLayout\n\t/** Override the default icon */\n\ticon?: ReactNode\n\t/** Action element rendered beside the text (e.g. a Button) */\n\taction?: ReactNode\n\t/** Called when the dismiss button is clicked. When provided, a close button appears. */\n\tonDismiss?: () => void\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n// Mask gradient: fades the pixel grid from right (full) to left (invisible),\n// so the pattern appears concentrated on the right side of the alert.\nconst patternMaskStyle = {\n\tmaskImage: \"linear-gradient(to left, black, transparent)\",\n\tWebkitMaskImage: \"linear-gradient(to left, black, transparent)\",\n}\n\n/**\n * Alert component for important messages.\n *\n * Two layouts:\n * - `inline` — horizontal bar with icon, text, and optional action. Features\n * a flickering pixel grid on the right side.\n * - `banner` — full-width centered layout for page-level announcements.\n * Content is centered with the icon above the text.\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n\t{\n\t\tvariant = \"accent\",\n\t\tlayout = \"inline\",\n\t\ticon,\n\t\taction,\n\t\tonDismiss,\n\t\tclassName,\n\t\tchildren,\n\t},\n\tref,\n) {\n\tconst config = variantConfig[variant]\n\tconst DefaultIcon = config.defaultIcon\n\n\tif (layout === \"banner\") {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"alert\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative flex w-full items-center justify-center overflow-hidden px-4 py-3\",\n\t\t\t\t\tconfig.container,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Pixel grid pattern — full width, fades from edges */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\"pointer-events-none absolute inset-0\", config.pattern)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tmaskImage:\n\t\t\t\t\t\t\t\"linear-gradient(to right, transparent, black 30%, black 70%, transparent)\",\n\t\t\t\t\t\tWebkitMaskImage:\n\t\t\t\t\t\t\t\"linear-gradient(to right, transparent, black 30%, black 70%, transparent)\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<FlickeringGrid\n\t\t\t\t\t\tsquareSize={4}\n\t\t\t\t\t\tgridGap={2}\n\t\t\t\t\t\tflickerChance={0.4}\n\t\t\t\t\t\tmaxOpacity={0.15}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"relative flex items-center gap-3\">\n\t\t\t\t\t{/* Icon */}\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\tconfig.icon,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon ?? <DefaultIcon />}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Text */}\n\t\t\t\t\t<span className={cn(\"text-bruv-base font-medium\", config.text)}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Action */}\n\t\t\t\t\t{action && <div className=\"shrink-0\">{action}</div>}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Dismiss — positioned at the right edge */}\n\t\t\t\t{onDismiss && (\n\t\t\t\t\t<div className=\"absolute right-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t\t\taria-label=\"Dismiss\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex min-h-10 items-center gap-3 overflow-hidden rounded-bruv-md py-1.5 pl-3 pr-1.5\",\n\t\t\t\tconfig.container,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Pixel grid pattern — right half, fades toward the left */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none absolute top-0 right-0 h-full w-1/2\",\n\t\t\t\t\tconfig.pattern,\n\t\t\t\t)}\n\t\t\t\tstyle={patternMaskStyle}\n\t\t\t>\n\t\t\t\t<FlickeringGrid\n\t\t\t\t\tsquareSize={4}\n\t\t\t\t\tgridGap={2}\n\t\t\t\t\tflickerChance={0.4}\n\t\t\t\t\tmaxOpacity={0.2}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* Icon */}\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\tconfig.icon,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{icon ?? <DefaultIcon />}\n\t\t\t</span>\n\n\t\t\t{/* Text */}\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative flex-1 text-bruv-base font-medium\",\n\t\t\t\t\tconfig.text,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\n\t\t\t{/* Action */}\n\t\t\t{action && <div className=\"relative ml-auto shrink-0\">{action}</div>}\n\n\t\t\t{/* Dismiss */}\n\t\t\t{onDismiss && (\n\t\t\t\t<div className=\"relative ml-auto shrink-0\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t\taria-label=\"Dismiss\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n","import { AlertDialog as BaseAlertDialog } from \"@base-ui/react/alert-dialog\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Root\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogRootProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Root\n> {}\n\nfunction AlertDialogRoot(props: AlertDialogRootProps) {\n\treturn <BaseAlertDialog.Root {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogTriggerProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Trigger\n> {}\n\nconst AlertDialogTrigger = forwardRef<\n\tHTMLButtonElement,\n\tAlertDialogTriggerProps\n>(function AlertDialogTrigger({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseAlertDialog.Trigger ref={ref} className={cn(className)} {...props} />\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Backdrop\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogBackdropProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Backdrop\n> {}\n\nconst AlertDialogBackdrop = forwardRef<\n\tHTMLDivElement,\n\tAlertDialogBackdropProps\n>(function AlertDialogBackdrop({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseAlertDialog.Backdrop\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\"transition-opacity duration-150\",\n\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Content\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogContentProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Popup\n> {}\n\nfunction AlertDialogContent({\n\tclassName,\n\tchildren,\n\t...props\n}: AlertDialogContentProps) {\n\treturn (\n\t\t<BaseAlertDialog.Portal>\n\t\t\t<AlertDialogBackdrop />\n\t\t\t<BaseAlertDialog.Popup\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-1 fixed top-1/2 left-1/2 z-50 max-h-[85vh] w-[90vw] max-w-[450px] -translate-x-1/2 -translate-y-1/2 rounded-bruv-lg p-0.5 shadow-xl\",\n\t\t\t\t\t\"transition-[opacity,scale] duration-150 ease-out\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0 data-[starting-style]:scale-[0.96]\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0 data-[ending-style]:scale-[0.98]\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseAlertDialog.Popup>\n\t\t</BaseAlertDialog.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Panel\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogPanelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst AlertDialogPanel = forwardRef<HTMLDivElement, AlertDialogPanelProps>(\n\tfunction AlertDialogPanel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral rounded-bruv-md border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Title\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogTitleProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Title\n> {}\n\nconst AlertDialogTitle = forwardRef<HTMLHeadingElement, AlertDialogTitleProps>(\n\tfunction AlertDialogTitle({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAlertDialog.Title\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary border-bruv-neutral border-b px-4 py-3 text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Description\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogDescriptionProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Description\n> {}\n\nconst AlertDialogDescription = forwardRef<\n\tHTMLParagraphElement,\n\tAlertDialogDescriptionProps\n>(function AlertDialogDescription({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseAlertDialog.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-bruv-secondary p-4 text-bruv-base\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Actions\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogActionsProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst AlertDialogActions = forwardRef<HTMLDivElement, AlertDialogActionsProps>(\n\tfunction AlertDialogActions({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex items-center justify-end gap-2 p-2\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Close\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogCloseProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Close\n> {}\n\nconst AlertDialogClose = forwardRef<HTMLButtonElement, AlertDialogCloseProps>(\n\tfunction AlertDialogClose({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAlertDialog.Close ref={ref} className={cn(className)} {...props} />\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const AlertDialog = {\n\tRoot: AlertDialogRoot,\n\tTrigger: AlertDialogTrigger,\n\tContent: AlertDialogContent,\n\tPanel: AlertDialogPanel,\n\tTitle: AlertDialogTitle,\n\tDescription: AlertDialogDescription,\n\tActions: AlertDialogActions,\n\tClose: AlertDialogClose,\n}\n","import { Accordion as BaseAccordion } from \"@base-ui/react/accordion\"\nimport { ChevronRightIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Accordion.Root\n// ---------------------------------------------------------------------------\n\nexport interface AccordionRootProps extends ComponentProps<\n\ttypeof BaseAccordion.Root\n> {}\n\nconst AccordionRoot = forwardRef<HTMLDivElement, AccordionRootProps>(\n\tfunction AccordionRoot({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Root\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex flex-col\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Accordion.Item\n// ---------------------------------------------------------------------------\n\nexport interface AccordionItemProps extends ComponentProps<\n\ttypeof BaseAccordion.Item\n> {}\n\nconst AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(\n\tfunction AccordionItem({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Item\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral border-b last:border-b-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Accordion.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface AccordionTriggerProps extends ComponentProps<\n\ttypeof BaseAccordion.Trigger\n> {\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n}\n\nconst AccordionTrigger = forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n\tfunction AccordionTrigger({ icon, className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group flex w-full cursor-pointer items-center gap-2 rounded-bruv-sm py-3 text-bruv-base font-medium\",\n\t\t\t\t\t\"text-bruv-primary hover:text-bruv-primary\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ChevronRightIcon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-bruv-tertiary size-4 shrink-0\",\n\t\t\t\t\t\t\"transition-transform duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"group-data-[panel-open]:rotate-90\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className=\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"flex-1 text-left\">{children}</span>\n\t\t\t</BaseAccordion.Trigger>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Accordion.Content\n// ---------------------------------------------------------------------------\n\nexport interface AccordionContentProps extends ComponentProps<\n\ttypeof BaseAccordion.Panel\n> {}\n\nconst AccordionContent = forwardRef<HTMLDivElement, AccordionContentProps>(\n\tfunction AccordionContent({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Panel\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\"h-[var(--accordion-panel-height)]\",\n\t\t\t\t\t\"transition-[height] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\"data-[starting-style]:h-0\",\n\t\t\t\t\t\"data-[ending-style]:h-0\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div className=\"text-bruv-secondary text-bruv-base pb-3\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</BaseAccordion.Panel>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Accordion = {\n\tRoot: AccordionRoot,\n\tItem: AccordionItem,\n\tTrigger: AccordionTrigger,\n\tContent: AccordionContent,\n}\n","import { Tabs as BaseTabs } from \"@base-ui/react/tabs\"\nimport {\n\tforwardRef,\n\tuseCallback,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { SegmentedGroup } from \"../segmented-group\"\n\n// ---------------------------------------------------------------------------\n// Tabs.Root\n// ---------------------------------------------------------------------------\n\nexport interface TabsRootProps extends ComponentProps<typeof BaseTabs.Root> {}\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(function TabsRoot(\n\t{ className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseTabs.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"flex flex-col\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Tabs.List\n//\n// Delegates visual rendering to SegmentedGroup. Observes Base UI's\n// data-active attribute to track which tab is active and passes the\n// activeIndex to SegmentedGroup for indicator positioning.\n// ---------------------------------------------------------------------------\n\nexport interface TabsListProps extends ComponentProps<typeof BaseTabs.List> {\n\t/**\n\t * Layout mode:\n\t * - `fit` — tabs hug their content (default)\n\t * - `fill` — tabs divide space equally via CSS grid\n\t */\n\tlayout?: \"fill\" | \"fit\"\n}\n\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(function TabsList(\n\t{ className, layout = \"fit\", children, ...props },\n\tref,\n) {\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\tconst [itemCount, setItemCount] = useState(0)\n\tconst [activeIndex, setActiveIndex] = useState(0)\n\n\tconst measure = useCallback(() => {\n\t\tconst container = containerRef.current\n\t\tif (!container) return\n\n\t\tconst tabs = container.querySelectorAll<HTMLElement>(\"[role='tab']\")\n\t\tsetItemCount(tabs.length)\n\n\t\tlet foundIndex = -1\n\t\ttabs.forEach((tab, i) => {\n\t\t\tif (\n\t\t\t\ttab.getAttribute(\"data-active\") !== null ||\n\t\t\t\ttab.getAttribute(\"aria-selected\") === \"true\"\n\t\t\t) {\n\t\t\t\tfoundIndex = i\n\t\t\t}\n\t\t})\n\t\tif (foundIndex < 0) foundIndex = 0\n\t\tsetActiveIndex(foundIndex)\n\t}, [])\n\n\tuseLayoutEffect(() => {\n\t\tmeasure()\n\n\t\tconst container = containerRef.current\n\t\tif (!container) return\n\n\t\t// Re-measure when the active tab changes (Base UI toggles data-active)\n\t\tconst observer = new MutationObserver(measure)\n\t\tobserver.observe(container, {\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\"data-active\", \"aria-selected\"],\n\t\t\tsubtree: true,\n\t\t})\n\n\t\t// Re-measure on resize\n\t\tconst ro = new ResizeObserver(measure)\n\t\tro.observe(container)\n\n\t\treturn () => {\n\t\t\tobserver.disconnect()\n\t\t\tro.disconnect()\n\t\t}\n\t}, [measure])\n\n\treturn (\n\t\t<SegmentedGroup\n\t\t\tref={(node: HTMLDivElement | null) => {\n\t\t\t\tcontainerRef.current = node\n\t\t\t\tif (typeof ref === \"function\") ref(node)\n\t\t\t\telse if (ref) ref.current = node\n\t\t\t}}\n\t\t\tactiveIndex={activeIndex}\n\t\t\titemCount={itemCount}\n\t\t\tlayout={layout}\n\t\t\tclassName={typeof className === \"string\" ? className : undefined}\n\t\t>\n\t\t\t<BaseTabs.List className=\"contents\" {...props}>\n\t\t\t\t{children}\n\t\t\t</BaseTabs.List>\n\t\t</SegmentedGroup>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Tabs.Tab\n//\n// Styled to match SegmentedGroupItem — no individual hover wrapper,\n// the SegmentedGroup's sliding indicator handles the active visual.\n// ---------------------------------------------------------------------------\n\nconst tabSizeStyles = {\n\tsm: \"h-7 px-2.5\",\n\tmd: \"h-8 px-3\",\n} as const\n\nexport type TabsTabSize = keyof typeof tabSizeStyles\n\nexport interface TabsTabProps extends ComponentProps<typeof BaseTabs.Tab> {\n\t/** Size of the tab */\n\tsize?: TabsTabSize\n}\n\nconst TabsTab = forwardRef<HTMLButtonElement, TabsTabProps>(function TabsTab(\n\t{ size = \"sm\", className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseTabs.Tab\n\t\t\tref={ref}\n\t\t\tdata-segmented-item=\"\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative z-10 flex items-center justify-center gap-1.5 rounded-bruv-sm\",\n\t\t\t\ttabSizeStyles[size],\n\t\t\t\t\"text-bruv-base font-medium select-none cursor-pointer\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\"text-bruv-tertiary hover:text-bruv-secondary\",\n\t\t\t\t\"data-[active]:text-bruv-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</BaseTabs.Tab>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Tabs.Panel\n// ---------------------------------------------------------------------------\n\nexport interface TabsPanelProps extends ComponentProps<typeof BaseTabs.Panel> {}\n\nconst TabsPanel = forwardRef<HTMLDivElement, TabsPanelProps>(function TabsPanel(\n\t{ className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseTabs.Panel\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-bruv-sm pt-3 outline-none\",\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tabs = {\n\tRoot: TabsRoot,\n\tList: TabsList,\n\tTab: TabsTab,\n\tPanel: TabsPanel,\n}\n","import { Command as CommandPrimitive } from \"cmdk\"\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Kbd } from \"../kbd\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// Command.Root\n// ---------------------------------------------------------------------------\n\nexport interface CommandRootProps extends ComponentProps<\n\ttypeof CommandPrimitive\n> {}\n\nconst CommandRoot = forwardRef<HTMLDivElement, CommandRootProps>(\n\tfunction CommandRoot({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral flex h-full w-full flex-col overflow-hidden rounded-bruv-md border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Input\n// ---------------------------------------------------------------------------\n\nexport interface CommandInputProps extends ComponentProps<\n\ttypeof CommandPrimitive.Input\n> {}\n\nconst CommandInput = forwardRef<HTMLInputElement, CommandInputProps>(\n\tfunction CommandInput({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Menu.SearchInput className=\"mb-0 bg-transparent px-2\">\n\t\t\t\t<CommandPrimitive.Input\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-bruv-primary placeholder:text-bruv-tertiary flex-1 bg-transparent py-1.5 text-bruv-base outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</Menu.SearchInput>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.List\n// ---------------------------------------------------------------------------\n\nexport interface CommandListProps extends ComponentProps<\n\ttypeof CommandPrimitive.List\n> {}\n\nconst CommandList = forwardRef<HTMLDivElement, CommandListProps>(\n\tfunction CommandList({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.List\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"max-h-[300px] overflow-y-auto overscroll-contain p-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Empty\n// ---------------------------------------------------------------------------\n\nexport interface CommandEmptyProps extends ComponentProps<\n\ttypeof CommandPrimitive.Empty\n> {}\n\nconst CommandEmpty = forwardRef<HTMLDivElement, CommandEmptyProps>(\n\tfunction CommandEmpty({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Empty\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-secondary px-2 py-4 text-center text-bruv-base\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Group\n// ---------------------------------------------------------------------------\n\nexport interface CommandGroupProps extends ComponentProps<\n\ttypeof CommandPrimitive.Group\n> {}\n\nconst CommandGroup = forwardRef<HTMLDivElement, CommandGroupProps>(\n\tfunction CommandGroup({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Group\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col gap-0.5\",\n\t\t\t\t\t\"[&_[cmdk-group-heading]]:text-bruv-tertiary [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1 [&_[cmdk-group-heading]]:text-bruv-sm [&_[cmdk-group-heading]]:font-normal [&_[cmdk-group-heading]]:select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Item\n// ---------------------------------------------------------------------------\n\nexport interface CommandItemProps extends ComponentProps<\n\ttypeof CommandPrimitive.Item\n> {\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\t/** Keyboard shortcut hint rendered on the right */\n\tshortcut?: string\n}\n\nconst CommandItem = forwardRef<HTMLDivElement, CommandItemProps>(\n\tfunction CommandItem({ icon, shortcut, className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Item\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group relative flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-bruv-base select-none outline-none\",\n\t\t\t\t\t\"text-bruv-primary\",\n\t\t\t\t\t\"data-[disabled=true]:pointer-events-none data-[disabled=true]:text-bruv-tertiary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{/* Hover overlay with squish — matches Menu.Item */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute inset-0 rounded-[inherit] bg-bruv-subtle opacity-0\",\n\t\t\t\t\t\t\"group-data-[selected=true]:opacity-100\",\n\t\t\t\t\t\t\"transition-[inset] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\t\"group-active:inset-px\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\t\"text-bruv-tertiary group-data-[selected=true]:text-bruv-primary\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t\t{shortcut && (\n\t\t\t\t\t<Kbd\n\t\t\t\t\t\tkeys={shortcut}\n\t\t\t\t\t\tclassName=\"pointer-events-none relative z-[1] ml-auto\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</CommandPrimitive.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Separator\n// ---------------------------------------------------------------------------\n\nexport interface CommandSeparatorProps extends ComponentProps<\n\ttypeof CommandPrimitive.Separator\n> {}\n\nconst CommandSeparator = forwardRef<HTMLDivElement, CommandSeparatorProps>(\n\tfunction CommandSeparator({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Separator\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"border-bruv-neutral mx-2 my-1 border-t\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Dialog - Convenience wrapper using Base UI Dialog\n// ---------------------------------------------------------------------------\n\nexport interface CommandDialogProps {\n\t/** Controlled open state */\n\topen?: boolean\n\t/** Called when open state changes */\n\tonOpenChange?: (open: boolean) => void\n\t/** Content for the command palette */\n\tchildren: ReactNode\n\tclassName?: string\n}\n\nfunction CommandDialog({\n\topen,\n\tonOpenChange,\n\tchildren,\n\tclassName,\n}: CommandDialogProps) {\n\treturn (\n\t\t<BaseDialog.Root open={open} onOpenChange={onOpenChange}>\n\t\t\t<BaseDialog.Portal>\n\t\t\t\t<BaseDialog.Backdrop\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\t\t\"transition-opacity duration-150\",\n\t\t\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t<BaseDialog.Popup\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-1 fixed top-[20%] left-1/2 z-50 w-[90vw] max-w-[520px] -translate-x-1/2 rounded-[10px] p-1 shadow-lg\",\n\t\t\t\t\t\t\"transition-[opacity,scale] duration-150 ease-out\",\n\t\t\t\t\t\t\"data-[starting-style]:opacity-0 data-[starting-style]:scale-[0.96]\",\n\t\t\t\t\t\t\"data-[ending-style]:opacity-0 data-[ending-style]:scale-[0.98]\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseDialog.Popup>\n\t\t\t</BaseDialog.Portal>\n\t\t</BaseDialog.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Command = {\n\tRoot: CommandRoot,\n\tInput: CommandInput,\n\tList: CommandList,\n\tEmpty: CommandEmpty,\n\tGroup: CommandGroup,\n\tItem: CommandItem,\n\tSeparator: CommandSeparator,\n\tDialog: CommandDialog,\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { Toggle } from \"@base-ui/react/toggle\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\txs: { height: \"h-6\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-6\" },\n\tsm: { height: \"h-7\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-7\" },\n\tmd: { height: \"h-8\", padding: \"px-2\", textPadding: \"px-1\", icon: \"w-8\" },\n} as const\n\nexport type ToggleButtonSize = keyof typeof sizeStyles\n\nexport interface ToggleButtonProps extends ComponentProps<typeof Toggle> {\n\t/** Size of the toggle button */\n\tsize?: ToggleButtonSize\n\t/** Icon element rendered before the label */\n\ticonLeft?: ReactNode\n\t/** Icon element rendered after the label */\n\ticonRight?: ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// ToggleButton\n// ---------------------------------------------------------------------------\n\n/**\n * A two-state button that can be pressed or unpressed.\n *\n * Built on Base UI Toggle. Visually matches the Button component but\n * toggles between pressed/unpressed states. Uses `data-[pressed]` for\n * the active visual.\n *\n * Use standalone for single toggles (like a bold button in a toolbar).\n * Use inside a `ToggleButtonGroup` for mutually exclusive or multi-select\n * button groups.\n */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(\n\tfunction ToggleButton(\n\t\t{\n\t\t\tsize = \"md\",\n\t\t\ticonLeft,\n\t\t\ticonRight,\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\t\tconst isIconOnly = !children && !iconRight\n\n\t\treturn (\n\t\t\t<Toggle\n\t\t\t\tref={ref}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/toggle-btn relative inline-flex cursor-pointer items-center justify-center\",\n\t\t\t\t\t\"rounded text-bruv-base whitespace-pre select-none\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"text-bruv-secondary\",\n\t\t\t\t\t\"data-[pressed]:text-bruv-primary\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t\tisIconOnly ? cn(s.height, s.icon) : cn(s.height, s.padding, \"w-fit\"),\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{/* Hover/bg layer — outline style matching Button */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute rounded-[inherit] inset-0 opacity-100\",\n\t\t\t\t\t\t\"bg-bruv-base-2 border border-bruv-neutral shadow-xs\",\n\t\t\t\t\t\t\"group-data-[pressed]/toggle-btn:bg-bruv-subtle group-data-[pressed]/toggle-btn:border-bruv-neutral\",\n\t\t\t\t\t\t!disabled && [\n\t\t\t\t\t\t\t\"transition-[inset,opacity,background-color] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\t\t\"group-hover/toggle-btn:bg-bruv-subtle\",\n\t\t\t\t\t\t\t\"group-active/toggle-btn:inset-px\",\n\t\t\t\t\t\t],\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t{iconLeft && (\n\t\t\t\t\t<span className=\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconLeft}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{children && (\n\t\t\t\t\t<span className={cn(\"relative z-[1] inline\", s.textPadding)}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{iconRight && (\n\t\t\t\t\t<span className=\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconRight}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</Toggle>\n\t\t)\n\t},\n)\n","import { forwardRef, type ComponentPropsWithoutRef } from \"react\"\nimport { ToggleGroup } from \"@base-ui/react/toggle-group\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// ButtonGroup (static layout container)\n// ---------------------------------------------------------------------------\n\nexport interface ButtonGroupProps extends ComponentPropsWithoutRef<\"div\"> {\n\t/** Orientation of the group */\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\n/**\n * Groups buttons together visually by merging their borders.\n *\n * Use for static button groups (e.g. a split button with a dropdown trigger).\n * For toggle button groups with selection state, use `ToggleButtonGroup`.\n *\n * Children should be `Button` or `ToggleButton` components. The group\n * removes inner border radii and collapses adjacent borders so the buttons\n * read as a single connected surface.\n */\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n\tfunction ButtonGroup(\n\t\t{ orientation = \"horizontal\", className, ...props },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"group\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex\",\n\t\t\t\t\torientation === \"vertical\" ? \"flex-col\" : \"flex-row\",\n\t\t\t\t\t// Merge child button borders and radii\n\t\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-l [&>*:last-child]:rounded-r\",\n\t\t\t\t\t\t\t\t\"[&>*+*]:-ml-px\",\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-t [&>*:last-child]:rounded-b\",\n\t\t\t\t\t\t\t\t\"[&>*+*]:-mt-px\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// ToggleButtonGroup (stateful, wraps Base UI ToggleGroup)\n// ---------------------------------------------------------------------------\n\nexport interface ToggleButtonGroupProps<\n\tValue extends string = string,\n> extends Omit<\n\tComponentPropsWithoutRef<typeof ToggleGroup>,\n\t\"value\" | \"defaultValue\" | \"onValueChange\"\n> {\n\t/** Controlled pressed values */\n\tvalue?: readonly Value[]\n\t/** Uncontrolled default pressed values */\n\tdefaultValue?: readonly Value[]\n\t/** Called when the pressed states change */\n\tonValueChange?: (value: Value[]) => void\n\t/** When false, only one toggle can be pressed at a time */\n\tmultiple?: boolean\n\t/** Orientation of the group */\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\n/**\n * Groups toggle buttons with shared selection state.\n *\n * Built on Base UI ToggleGroup. When `multiple` is false (default),\n * pressing one button unpresses the others. When true, any combination\n * of buttons can be pressed.\n *\n * Children should be `ToggleButton` components with `value` props.\n */\nexport const ToggleButtonGroup = forwardRef<\n\tHTMLDivElement,\n\tToggleButtonGroupProps\n>(function ToggleButtonGroup(\n\t{ orientation = \"horizontal\", className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<ToggleGroup\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex\",\n\t\t\t\torientation === \"vertical\" ? \"flex-col\" : \"flex-row\",\n\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-l [&>*:last-child]:rounded-r\",\n\t\t\t\t\t\t\t\"[&>*+*]:-ml-px\",\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-t [&>*:last-child]:rounded-b\",\n\t\t\t\t\t\t\t\"[&>*+*]:-mt-px\",\n\t\t\t\t\t\t],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\"\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// RadioGroup.Root\n// ---------------------------------------------------------------------------\n\nexport interface RadioGroupRootProps extends ComponentProps<\n\ttypeof BaseRadioGroup\n> {\n\t/** Layout direction. Default \"vertical\". */\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\nconst Root = forwardRef<HTMLDivElement, RadioGroupRootProps>(function Root(\n\t{ orientation = \"vertical\", className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseRadioGroup\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex gap-2\",\n\t\t\t\torientation === \"horizontal\" ? \"flex-row items-center\" : \"flex-col\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// RadioGroup.Item\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\tsm: { radio: \"size-4\", indicator: \"size-1.5\", label: \"text-bruv-sm\" },\n\tmd: { radio: \"size-[18px]\", indicator: \"size-2\", label: \"text-bruv-base\" },\n} as const\n\nexport type RadioGroupItemSize = keyof typeof sizeStyles\n\nexport interface RadioGroupItemProps extends ComponentProps<\n\ttypeof BaseRadio.Root\n> {\n\t/** Size of the radio indicator */\n\tsize?: RadioGroupItemSize\n\t/** Label text rendered beside the radio */\n\tlabel?: string\n}\n\nconst Item = forwardRef<HTMLSpanElement, RadioGroupItemProps>(function Item(\n\t{ size = \"md\", label, className, value, ...props },\n\tref,\n) {\n\tconst s = sizeStyles[size]\n\n\tconst radio = (\n\t\t<BaseRadio.Root\n\t\t\tref={ref}\n\t\t\tvalue={value}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/radio relative inline-flex shrink-0 items-center justify-center rounded-full\",\n\t\t\t\t\"border border-bruv-neutral bg-bruv-base-2\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\"transition-colors duration-150 ease-out\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\"cursor-pointer\",\n\t\t\t\t\"data-[checked]:border-bruv-accent data-[checked]:bg-bruv-accent\",\n\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\t// Expanded hit area\n\t\t\t\t\"before:absolute before:inset-1/2 before:size-8 before:-translate-1/2\",\n\t\t\t\ts.radio,\n\t\t\t\t!label && className,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<BaseRadio.Indicator\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-full bg-bruv-accent-on\",\n\t\t\t\t\t// Default visible state\n\t\t\t\t\t\"scale-100 opacity-100\",\n\t\t\t\t\t// Hidden when unchecked\n\t\t\t\t\t\"data-[unchecked]:scale-0 data-[unchecked]:opacity-0\",\n\t\t\t\t\t// Transition start/end points for Base UI\n\t\t\t\t\t\"data-[starting-style]:scale-0 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\"data-[ending-style]:scale-0 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\"transition-[scale,opacity] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\ts.indicator,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</BaseRadio.Root>\n\t)\n\n\tif (!label) return radio\n\n\treturn (\n\t\t<label\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex items-center gap-2 select-none\",\n\t\t\t\t\"cursor-pointer data-[disabled]:cursor-not-allowed\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{radio}\n\t\t\t<span className={cn(\"text-bruv-primary\", s.label)}>{label}</span>\n\t\t</label>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// RadioGroup.Card — selectable card radio item\n// ---------------------------------------------------------------------------\n\nexport interface RadioGroupCardProps {\n\t/** Unique value identifying this card */\n\treadonly value: string\n\t/** Card title */\n\treadonly title: string\n\t/** Optional description below the title */\n\treadonly description?: string\n\t/** Optional icon rendered to the left of the text */\n\treadonly icon?: ReactNode\n\t/** Disable this card */\n\treadonly disabled?: boolean\n\treadonly className?: string\n}\n\nfunction Card({\n\tvalue,\n\ttitle,\n\tdescription,\n\ticon,\n\tdisabled,\n\tclassName,\n}: RadioGroupCardProps) {\n\treturn (\n\t\t<label\n\t\t\tclassName={cn(\n\t\t\t\t\"group/card relative flex cursor-pointer items-start gap-3 rounded-bruv-lg p-3 ring-1 ring-bruv-neutral select-none\",\n\t\t\t\t\"transition-all duration-150 ease-out\",\n\t\t\t\t\"hover:bg-bruv-subtle/50\",\n\t\t\t\t\"has-[span[data-checked]]:ring-2 has-[span[data-checked]]:ring-bruv-accent has-[span[data-checked]]:bg-bruv-subtle\",\n\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{icon && (\n\t\t\t\t<span className=\"text-bruv-secondary flex size-5 shrink-0 items-center justify-center [&>svg]:size-5\">\n\t\t\t\t\t{icon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-1 flex-col gap-0.5\">\n\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-medium\">\n\t\t\t\t\t{title}\n\t\t\t\t</span>\n\t\t\t\t{description && (\n\t\t\t\t\t<span className=\"text-bruv-secondary text-bruv-sm\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<BaseRadio.Root\n\t\t\t\tvalue={value}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/radio relative mt-0.5 inline-flex size-[18px] shrink-0 items-center justify-center rounded-full\",\n\t\t\t\t\t\"border border-bruv-neutral bg-bruv-base-2\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"transition-colors duration-150 ease-out\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\"data-[checked]:border-bruv-accent data-[checked]:bg-bruv-accent\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<BaseRadio.Indicator\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"size-2 rounded-full bg-bruv-accent-on\",\n\t\t\t\t\t\t\"scale-100 opacity-100\",\n\t\t\t\t\t\t\"data-[unchecked]:scale-0 data-[unchecked]:opacity-0\",\n\t\t\t\t\t\t\"data-[starting-style]:scale-0 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-0 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t\"transition-[scale,opacity] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</BaseRadio.Root>\n\t\t</label>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const RadioGroup = { Root, Item, Card }\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\n\nexport interface SaveBarProps {\n\t/** Whether the bar is visible (typically bound to a dirty flag). */\n\tshow: boolean\n\t/** Message shown inside the pill. Defaults to \"You have unsaved changes\". */\n\tmessage?: ReactNode\n\t/** Label for the discard button. Defaults to \"Reset\". */\n\tdiscardLabel?: string\n\t/** Label for the save button. Defaults to \"Save changes\". */\n\tsaveLabel?: string\n\t/** Called when the user clicks discard. */\n\tonDiscard: () => void\n\t/** Called when the user clicks save. */\n\tonSave: () => void\n\t/** Show a loading spinner on the save button. */\n\tsaving?: boolean\n\t/** Disable the save button (e.g. validation failure). */\n\tsaveDisabled?: boolean\n\t/** Trigger a shake animation to draw attention (e.g. when navigation is blocked). */\n\tshake?: boolean\n\tclassName?: string\n}\n\n/**\n * Floating pill pinned to the bottom of the viewport.\n * Slides up when a form has unsaved changes.\n */\nexport const SaveBar = forwardRef<HTMLDivElement, SaveBarProps>(\n\tfunction SaveBar(\n\t\t{\n\t\t\tshow,\n\t\t\tmessage = \"You have unsaved changes\",\n\t\t\tdiscardLabel = \"Reset\",\n\t\t\tsaveLabel = \"Save changes\",\n\t\t\tonDiscard,\n\t\t\tonSave,\n\t\t\tsaving = false,\n\t\t\tsaveDisabled = false,\n\t\t\tshake = false,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\taria-live=\"polite\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none fixed inset-x-0 bottom-0 z-50 flex justify-center pb-6\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// Pill shape and appearance\n\t\t\t\t\t\t\"pointer-events-auto\",\n\t\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral shadow-lg\",\n\t\t\t\t\t\t\"flex items-center gap-5 rounded-bruv-xl border py-1.5 pr-1.5 pl-3.5\",\n\t\t\t\t\t\t// Animation: slide + fade + scale\n\t\t\t\t\t\t\"transition-all duration-500 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tshow\n\t\t\t\t\t\t\t? \"translate-y-0 scale-100 opacity-100\"\n\t\t\t\t\t\t\t: \"pointer-events-none translate-y-4 scale-95 opacity-0\",\n\t\t\t\t\t\tshake && \"animate-bruv-shake\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-medium\">\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<div className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t<Button variant=\"danger-light\" size=\"sm\" onClick={onDiscard}>\n\t\t\t\t\t\t\t{discardLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={onSave}\n\t\t\t\t\t\t\tloading={saving}\n\t\t\t\t\t\t\tdisabled={saveDisabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{saveLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { Button as BaseButton } from \"@base-ui/react/button\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst variantConfig = {\n\tprimary:\n\t\t\"bg-bruv-accent text-bruv-accent-on hover:bg-bruv-accent-strong active:bg-bruv-accent-strong\",\n\tsecondary:\n\t\t\"bg-bruv-base-2 text-bruv-primary ring-1 ring-bruv-neutral hover:bg-bruv-subtle active:bg-bruv-subtle\",\n\tdanger:\n\t\t\"bg-bruv-danger text-bruv-danger-on hover:bg-bruv-danger-strong active:bg-bruv-danger-strong\",\n} as const\n\nconst sizeConfig = {\n\tmd: {\n\t\tcircular: \"size-12\",\n\t\textended: \"h-12 gap-2.5 px-5\",\n\t\ticon: \"[&>svg]:size-5\",\n\t},\n\tlg: {\n\t\tcircular: \"size-14\",\n\t\textended: \"h-14 gap-3 px-6\",\n\t\ticon: \"[&>svg]:size-6\",\n\t},\n} as const\n\nconst positionConfig = {\n\t\"bottom-right\": \"bottom-6 right-6\",\n\t\"bottom-left\": \"bottom-6 left-6\",\n\t\"top-right\": \"top-6 right-6\",\n\t\"top-left\": \"top-6 left-6\",\n} as const\n\nexport type FabVariant = keyof typeof variantConfig\nexport type FabSize = keyof typeof sizeConfig\nexport type FabPosition = keyof typeof positionConfig\nexport type FabAnchor = \"viewport\" | \"container\"\n\nexport interface FabProps extends Omit<\n\tComponentProps<typeof BaseButton>,\n\t\"children\" | \"aria-label\"\n> {\n\t/**\n\t * Accessible name. Required so icon-only FABs always expose a label\n\t * to assistive tech; extended FABs should typically mirror their\n\t * `children` text.\n\t */\n\t\"aria-label\": string\n\t/** Icon element rendered inside the FAB. Required. */\n\ticon: ReactNode\n\t/** Visual style variant. */\n\tvariant?: FabVariant\n\t/** Size variant. */\n\tsize?: FabSize\n\t/** Corner of the anchoring box to pin to. */\n\tposition?: FabPosition\n\t/**\n\t * What the FAB is positioned relative to:\n\t * - `\"viewport\"` (default) — `position: fixed`, pinned to the browser\n\t * window. The natural choice for a production app.\n\t * - `\"container\"` — `position: absolute`, pinned to the nearest\n\t * positioned ancestor. Useful inside cards, drawers, or previews\n\t * where you don't want the FAB to escape its panel.\n\t */\n\tanchor?: FabAnchor\n\t/** Render as an extended pill with the icon and a label. */\n\textended?: boolean\n\t/** Label rendered beside the icon when `extended`. */\n\tchildren?: ReactNode\n\t/** Whether the FAB is visible. Triggers the scale-in animation. */\n\tshow?: boolean\n}\n\n/**\n * Floating action button anchored to a viewport corner. Use for a single\n * primary action on a screen — e.g. \"Compose\", \"Create\", \"Add\".\n *\n * Set `extended` to widen the button into a pill with both icon and label.\n */\nexport const Fab = forwardRef<HTMLElement, FabProps>(function Fab(\n\t{\n\t\ticon,\n\t\tvariant = \"primary\",\n\t\tsize = \"md\",\n\t\tposition = \"bottom-right\",\n\t\tanchor = \"viewport\",\n\t\textended = false,\n\t\tshow = true,\n\t\tdisabled,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst sizes = sizeConfig[size]\n\n\treturn (\n\t\t<BaseButton\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tdisabled={disabled}\n\t\t\ttabIndex={show ? 0 : -1}\n\t\t\taria-hidden={!show}\n\t\t\tclassName={cn(\n\t\t\t\t\"z-30 inline-flex cursor-pointer items-center justify-center select-none\",\n\t\t\t\tanchor === \"viewport\" ? \"fixed\" : \"absolute\",\n\t\t\t\t\"text-bruv-base font-medium shadow-lg hover:shadow-xl\",\n\t\t\t\t\"transition-all duration-300 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\"active:scale-95\",\n\t\t\t\textended\n\t\t\t\t\t? cn(sizes.extended, \"rounded-full\")\n\t\t\t\t\t: cn(sizes.circular, \"rounded-full\"),\n\t\t\t\tsizes.icon,\n\t\t\t\tvariantConfig[variant],\n\t\t\t\tpositionConfig[position],\n\t\t\t\tshow\n\t\t\t\t\t? \"scale-100 opacity-100\"\n\t\t\t\t\t: \"pointer-events-none scale-0 opacity-0\",\n\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span\n\t\t\t\tclassName={cn(\"flex shrink-0 items-center justify-center\", sizes.icon)}\n\t\t\t>\n\t\t\t\t{icon}\n\t\t\t</span>\n\t\t\t{extended && children && <span className=\"truncate\">{children}</span>}\n\t\t</BaseButton>\n\t)\n})\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport type SettingsPageMaxWidth = \"narrow\" | \"wide\"\n\nexport interface SettingsPageProps {\n\t/** Page title displayed at the top. */\n\ttitle?: ReactNode\n\t/**\n\t * Maximum content width.\n\t * - `\"narrow\"` (default): 800px — for settings forms\n\t * - `\"wide\"`: 1100px — for tables, permissions, dashboards\n\t */\n\tmaxWidth?: SettingsPageMaxWidth\n\t/** Optional leading content rendered above the title (e.g. a back button). */\n\tleading?: ReactNode\n\t/** Main page content (cards, forms, tables, etc.). */\n\tchildren: ReactNode\n\tclassName?: string\n}\n\nconst maxWidthStyles = {\n\tnarrow: \"max-w-[800px]\",\n\twide: \"max-w-[1100px]\",\n} as const\n\n/**\n * Content shell for settings pages.\n *\n * Centers content with a max-width constraint, provides consistent\n * vertical spacing, and renders an optional page title. Designed\n * to sit inside a `PageLayout` content area.\n *\n * ```tsx\n * <SettingsPage title=\"General\">\n * <SettingsCard title=\"Basic settings\">\n * ...\n * </SettingsCard>\n * </SettingsPage>\n * ```\n */\nexport const SettingsPage = forwardRef<HTMLDivElement, SettingsPageProps>(\n\tfunction SettingsPage(\n\t\t{ title, maxWidth = \"narrow\", leading, children, className },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div ref={ref} className=\"flex flex-1 flex-col items-center gap-6 py-6\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex w-full flex-col gap-6 px-8\",\n\t\t\t\t\t\tmaxWidthStyles[maxWidth],\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{leading}\n\t\t\t\t\t{title && (\n\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-lg font-semibold\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import {\n\tCheckCircleIcon,\n\tExclamationTriangleIcon,\n\tInformationCircleIcon,\n\tXCircleIcon,\n\tXMarkIcon,\n} from \"@heroicons/react/16/solid\"\nimport {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ReactNode,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\nimport { FlickeringGrid } from \"../flickering-grid\"\nimport { Spinner } from \"../spinner\"\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TOAST_LIFETIME = 4000\nconst TIME_BEFORE_UNMOUNT = 200\nconst VISIBLE_TOASTS_AMOUNT = 3\nconst GAP = 8\nconst TOAST_WIDTH = 356\nconst VIEWPORT_OFFSET = 24\nconst SWIPE_THRESHOLD = 45\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ToastVariant = \"default\" | \"success\" | \"danger\" | \"warn\" | \"accent\"\nexport type ToastPosition =\n\t| \"top-left\"\n\t| \"top-right\"\n\t| \"top-center\"\n\t| \"bottom-left\"\n\t| \"bottom-right\"\n\t| \"bottom-center\"\n\nexport interface ToastData {\n\treadonly id: string | number\n\treadonly title?: ReactNode\n\treadonly description?: ReactNode\n\treadonly variant?: ToastVariant\n\treadonly action?: ReactNode\n\treadonly duration?: number\n\treadonly dismissible?: boolean\n\treadonly position?: ToastPosition\n\treadonly onDismiss?: () => void\n\treadonly onAutoClose?: () => void\n\t/** @internal */\n\treadonly delete?: boolean\n\t/** @internal Promise state tracking */\n\treadonly promiseState?: \"loading\" | \"success\" | \"error\"\n}\n\ninterface HeightEntry {\n\treadonly toastId: string | number\n\treadonly height: number\n}\n\n// ---------------------------------------------------------------------------\n// Variant config\n// ---------------------------------------------------------------------------\n\nconst variantConfig = {\n\tdefault: {\n\t\tcontainer: \"bg-bruv-base-2 border-bruv-neutral border\",\n\t\ticon: \"text-bruv-secondary\",\n\t\ttext: \"text-bruv-primary\",\n\t\tdescription: \"text-bruv-secondary\",\n\t\tpattern: \"text-bruv-tertiary\",\n\t\tdefaultIcon: null,\n\t},\n\tsuccess: {\n\t\tcontainer: \"bg-bruv-success-subtle border border-bruv-success/20\",\n\t\ticon: \"text-bruv-success\",\n\t\ttext: \"text-bruv-success\",\n\t\tdescription: \"text-bruv-success\",\n\t\tpattern: \"text-bruv-success\",\n\t\tdefaultIcon: CheckCircleIcon,\n\t},\n\tdanger: {\n\t\tcontainer: \"bg-bruv-danger-subtle border border-bruv-danger/20\",\n\t\ticon: \"text-bruv-danger\",\n\t\ttext: \"text-bruv-danger\",\n\t\tdescription: \"text-bruv-danger\",\n\t\tpattern: \"text-bruv-danger\",\n\t\tdefaultIcon: XCircleIcon,\n\t},\n\twarn: {\n\t\tcontainer: \"bg-bruv-warn-subtle border border-bruv-warn/20\",\n\t\ticon: \"text-bruv-warn\",\n\t\ttext: \"text-bruv-warn\",\n\t\tdescription: \"text-bruv-warn\",\n\t\tpattern: \"text-bruv-warn\",\n\t\tdefaultIcon: ExclamationTriangleIcon,\n\t},\n\taccent: {\n\t\tcontainer: \"bg-bruv-accent-subtle border border-bruv-accent/20\",\n\t\ticon: \"text-bruv-accent\",\n\t\ttext: \"text-bruv-accent\",\n\t\tdescription: \"text-bruv-accent\",\n\t\tpattern: \"text-bruv-accent\",\n\t\tdefaultIcon: InformationCircleIcon,\n\t},\n} as const\n\n// ---------------------------------------------------------------------------\n// State — Singleton observer (works outside React)\n// ---------------------------------------------------------------------------\n\ntype Subscriber = (toast: ToastData) => void\n\nlet toastCounter = 0\n\nclass ToastObserver {\n\tprivate subscribers: Subscriber[] = []\n\tprivate toasts: ToastData[] = []\n\n\tsubscribe(subscriber: Subscriber): () => void {\n\t\tthis.subscribers.push(subscriber)\n\t\treturn () => {\n\t\t\tconst index = this.subscribers.indexOf(subscriber)\n\t\t\tif (index > -1) this.subscribers.splice(index, 1)\n\t\t}\n\t}\n\n\tprivate publish(data: ToastData): void {\n\t\tfor (const subscriber of this.subscribers) {\n\t\t\tsubscriber(data)\n\t\t}\n\t}\n\n\tcreate(data: ToastData): string | number {\n\t\tconst existing = this.toasts.find(t => t.id === data.id)\n\t\tif (existing) {\n\t\t\t// Update in place (used by promise toasts)\n\t\t\tthis.toasts = this.toasts.map(t =>\n\t\t\t\tt.id === data.id ? { ...t, ...data } : t,\n\t\t\t)\n\t\t\tthis.publish({ ...existing, ...data })\n\t\t} else {\n\t\t\tthis.toasts = [data, ...this.toasts]\n\t\t\tthis.publish(data)\n\t\t}\n\t\treturn data.id\n\t}\n\n\tdismiss(id?: string | number): void {\n\t\tif (id === undefined) {\n\t\t\t// Dismiss all\n\t\t\tfor (const t of this.toasts) {\n\t\t\t\tthis.publish({ ...t, delete: true })\n\t\t\t}\n\t\t\tthis.toasts = []\n\t\t} else {\n\t\t\tconst toast = this.toasts.find(t => t.id === id)\n\t\t\tif (toast) {\n\t\t\t\tthis.publish({ ...toast, delete: true })\n\t\t\t\tthis.toasts = this.toasts.filter(t => t.id !== id)\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst toastState = new ToastObserver()\n\nfunction createToast(\n\tmessage: ReactNode,\n\tvariant: ToastVariant,\n\toptions?: Partial<ToastData>,\n): string | number {\n\tconst id = options?.id ?? ++toastCounter\n\treturn toastState.create({\n\t\t...options,\n\t\tid,\n\t\ttitle: message,\n\t\tvariant,\n\t})\n}\n\n// ---------------------------------------------------------------------------\n// Public imperative API\n// ---------------------------------------------------------------------------\n\nexport interface ExternalToastOptions extends Partial<\n\tOmit<ToastData, \"id\" | \"title\" | \"variant\" | \"promiseState\">\n> {\n\tid?: string | number\n}\n\nexport interface PromiseData<T = unknown> {\n\treadonly loading: ReactNode\n\treadonly success: ReactNode | ((data: T) => ReactNode)\n\treadonly error: ReactNode | ((error: unknown) => ReactNode)\n\treadonly description?: ReactNode | ((data: T) => ReactNode)\n\treadonly finally?: () => void\n}\n\nfunction toastFn(message: ReactNode, options?: ExternalToastOptions) {\n\treturn createToast(message, \"default\", options)\n}\n\n/**\n * Imperative toast API. Call from anywhere — no hooks required.\n *\n * ```ts\n * toast(\"Hello\")\n * toast.success(\"Saved!\")\n * toast.error(\"Failed\", { description: \"Check your connection\" })\n * toast.promise(asyncFn, { loading: \"...\", success: \"...\", error: \"...\" })\n * toast.dismiss(id)\n * ```\n */\nexport const toast = Object.assign(toastFn, {\n\tsuccess(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"success\", options)\n\t},\n\terror(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"danger\", options)\n\t},\n\twarning(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"warn\", options)\n\t},\n\tinfo(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"accent\", options)\n\t},\n\tloading(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"default\", {\n\t\t\t...options,\n\t\t\tduration: Infinity,\n\t\t\tpromiseState: \"loading\",\n\t\t})\n\t},\n\tpromise<T>(\n\t\tpromise: Promise<T> | (() => Promise<T>),\n\t\tdata: PromiseData<T>,\n\t\toptions?: ExternalToastOptions,\n\t): string | number {\n\t\tconst id = options?.id ?? ++toastCounter\n\t\ttoastState.create({\n\t\t\t...options,\n\t\t\tid,\n\t\t\ttitle: data.loading,\n\t\t\tvariant: \"default\",\n\t\t\tduration: Infinity,\n\t\t\tpromiseState: \"loading\",\n\t\t})\n\n\t\tconst p = promise instanceof Function ? promise() : promise\n\n\t\tp.then(response => {\n\t\t\tconst title =\n\t\t\t\ttypeof data.success === \"function\"\n\t\t\t\t\t? data.success(response)\n\t\t\t\t\t: data.success\n\t\t\tconst description =\n\t\t\t\ttypeof data.description === \"function\"\n\t\t\t\t\t? data.description(response)\n\t\t\t\t\t: data.description\n\t\t\ttoastState.create({\n\t\t\t\t...options,\n\t\t\t\tid,\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tvariant: \"success\",\n\t\t\t\tduration: options?.duration ?? TOAST_LIFETIME,\n\t\t\t\tpromiseState: \"success\",\n\t\t\t})\n\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconst title =\n\t\t\t\t\ttypeof data.error === \"function\" ? data.error(error) : data.error\n\t\t\t\ttoastState.create({\n\t\t\t\t\t...options,\n\t\t\t\t\tid,\n\t\t\t\t\ttitle,\n\t\t\t\t\t// Only use static description on error — function form expects resolved data\n\t\t\t\t\tdescription:\n\t\t\t\t\t\ttypeof data.description === \"function\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: data.description,\n\t\t\t\t\tvariant: \"danger\",\n\t\t\t\t\tduration: options?.duration ?? TOAST_LIFETIME,\n\t\t\t\t\tpromiseState: \"error\",\n\t\t\t\t})\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tdata.finally?.()\n\t\t\t})\n\n\t\treturn id\n\t},\n\tdismiss(id?: string | number) {\n\t\ttoastState.dismiss(id)\n\t},\n})\n\n// ---------------------------------------------------------------------------\n// useIsDocumentHidden\n// ---------------------------------------------------------------------------\n\nfunction useIsDocumentHidden(): boolean {\n\tconst [hidden, setHidden] = useState(false)\n\n\tuseEffect(() => {\n\t\tconst handler = () => setHidden(document.hidden)\n\t\tdocument.addEventListener(\"visibilitychange\", handler)\n\t\treturn () => document.removeEventListener(\"visibilitychange\", handler)\n\t}, [])\n\n\treturn hidden\n}\n\n// ---------------------------------------------------------------------------\n// Individual Toast item\n// ---------------------------------------------------------------------------\n\ninterface ToastItemProps {\n\treadonly toast: ToastData\n\treadonly index: number\n\treadonly expanded: boolean\n\treadonly heights: readonly HeightEntry[]\n\treadonly setHeights: React.Dispatch<React.SetStateAction<HeightEntry[]>>\n\treadonly position: ToastPosition\n\treadonly defaultDuration: number\n\treadonly closeButton: boolean\n\treadonly visibleToasts: number\n\treadonly gap: number\n\treadonly onRemove: (id: string | number) => void\n\treadonly toastCount: number\n}\n\nfunction ToastItem({\n\ttoast: t,\n\tindex,\n\texpanded,\n\theights,\n\tsetHeights,\n\tposition,\n\tdefaultDuration,\n\tcloseButton,\n\tvisibleToasts,\n\tgap,\n\tonRemove,\n\ttoastCount,\n}: ToastItemProps) {\n\tconst ref = useRef<HTMLLIElement>(null)\n\tconst [mounted, setMounted] = useState(false)\n\tconst [removed, setRemoved] = useState(false)\n\tconst [swiping, setSwiping] = useState(false)\n\tconst [swipeOut, setSwipeOut] = useState(false)\n\tconst [offsetBeforeRemove, setOffsetBeforeRemove] = useState(0)\n\n\t// Swipe state\n\tconst pointerStartRef = useRef<{ x: number; y: number } | null>(null)\n\tconst swipeAmountRef = useRef(0)\n\tconst dragStartTimeRef = useRef<Date | null>(null)\n\n\t// Timer state\n\tconst remainingTime = useRef(t.duration ?? defaultDuration ?? TOAST_LIFETIME)\n\tconst closeTimerStartRef = useRef(0)\n\tconst lastCloseTimerStartRef = useRef(0)\n\tconst isDocumentHidden = useIsDocumentHidden()\n\n\tconst isFront = index === 0\n\tconst isVisible = index < visibleToasts\n\tconst variant = t.variant ?? \"default\"\n\tconst config = variantConfig[variant]\n\tconst DefaultIcon = config.defaultIcon\n\tconst dismissible = t.dismissible !== false\n\n\tconst [y, x] = position.split(\"-\") as [\"top\" | \"bottom\", string]\n\tconst isTop = y === \"top\"\n\n\t// ── Mount animation ──\n\tuseEffect(() => {\n\t\tsetMounted(true)\n\t}, [])\n\n\t// ── Height tracking ──\n\tuseLayoutEffect(() => {\n\t\tconst node = ref.current\n\t\tif (!node) return\n\n\t\tconst height = node.getBoundingClientRect().height\n\t\tsetHeights(prev => [\n\t\t\t{ toastId: t.id, height },\n\t\t\t...prev.filter(h => h.toastId !== t.id),\n\t\t])\n\n\t\treturn () => {\n\t\t\tsetHeights(prev => prev.filter(h => h.toastId !== t.id))\n\t\t}\n\t}, [t.id, setHeights])\n\n\t// Re-measure on content change\n\tuseLayoutEffect(() => {\n\t\tif (!mounted) return\n\t\tconst node = ref.current\n\t\tif (!node) return\n\n\t\tconst original = node.style.height\n\t\tnode.style.height = \"auto\"\n\t\tconst newHeight = node.getBoundingClientRect().height\n\t\tnode.style.height = original\n\n\t\tsetHeights(prev => {\n\t\t\tconst exists = prev.find(h => h.toastId === t.id)\n\t\t\tif (!exists) {\n\t\t\t\treturn [{ toastId: t.id, height: newHeight }, ...prev]\n\t\t\t}\n\t\t\treturn prev.map(h =>\n\t\t\t\th.toastId === t.id ? { ...h, height: newHeight } : h,\n\t\t\t)\n\t\t})\n\t}, [mounted, t.title, t.description, t.action, t.id, setHeights])\n\n\t// ── Offset calculation ──\n\tconst heightIndex = useMemo(() => {\n\t\tconst idx = heights.findIndex(h => h.toastId === t.id)\n\t\treturn idx < 0 ? 0 : idx\n\t}, [heights, t.id])\n\n\tconst toastsHeightBefore = useMemo(() => {\n\t\treturn heights.reduce((acc, curr, i) => {\n\t\t\tif (i >= heightIndex) return acc\n\t\t\treturn acc + curr.height\n\t\t}, 0)\n\t}, [heights, heightIndex])\n\n\tconst offset = useMemo(\n\t\t() => heightIndex * gap + toastsHeightBefore,\n\t\t[heightIndex, gap, toastsHeightBefore],\n\t)\n\n\t// ── Auto-dismiss timer ──\n\tuseEffect(() => {\n\t\tif (t.promiseState === \"loading\") return\n\t\tif (t.duration === Infinity) return\n\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\tconst pauseTimer = () => {\n\t\t\tif (lastCloseTimerStartRef.current < closeTimerStartRef.current) {\n\t\t\t\tconst elapsed = Date.now() - closeTimerStartRef.current\n\t\t\t\tremainingTime.current = remainingTime.current - elapsed\n\t\t\t}\n\t\t\tlastCloseTimerStartRef.current = Date.now()\n\t\t}\n\n\t\tconst startTimer = () => {\n\t\t\tif (remainingTime.current === Infinity) return\n\t\t\tcloseTimerStartRef.current = Date.now()\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tt.onAutoClose?.()\n\t\t\t\tdeleteToast()\n\t\t\t}, remainingTime.current)\n\t\t}\n\n\t\tif (expanded || isDocumentHidden) {\n\t\t\tpauseTimer()\n\t\t} else {\n\t\t\tstartTimer()\n\t\t}\n\n\t\treturn () => clearTimeout(timeoutId)\n\t}, [expanded, isDocumentHidden, t.promiseState]) // eslint-disable-line react-hooks/exhaustive-deps -- deleteToast uses a ref for offset; remaining timer state is intentionally ref-based to avoid restarting on every render\n\n\t// Reset timer when promise resolves/rejects\n\tuseEffect(() => {\n\t\tif (t.promiseState === \"success\" || t.promiseState === \"error\") {\n\t\t\tremainingTime.current = t.duration ?? defaultDuration ?? TOAST_LIFETIME\n\t\t\tcloseTimerStartRef.current = 0\n\t\t\tlastCloseTimerStartRef.current = 0\n\t\t}\n\t}, [t.promiseState, t.duration, defaultDuration])\n\n\t// ── Dismiss logic ──\n\tconst offsetRef = useRef(offset)\n\toffsetRef.current = offset\n\n\tconst deleteToast = useCallback(() => {\n\t\tsetRemoved(true)\n\t\tsetOffsetBeforeRemove(offsetRef.current)\n\t\tsetTimeout(() => {\n\t\t\tt.onDismiss?.()\n\t\t\tonRemove(t.id)\n\t\t}, TIME_BEFORE_UNMOUNT)\n\t}, [t.onDismiss, t.id, onRemove])\n\n\t// Handle external dismiss\n\tuseEffect(() => {\n\t\tif (t.delete) {\n\t\t\tdeleteToast()\n\t\t}\n\t}, [t.delete]) // eslint-disable-line react-hooks/exhaustive-deps -- deleteToast is stable via useCallback with ref-based offset; adding it would cause unnecessary re-fires\n\n\t// ── Swipe handlers ──\n\tconst onPointerDown = (event: React.PointerEvent) => {\n\t\tif (event.button === 2) return // ignore right-click\n\t\tif (!dismissible) return\n\t\tdragStartTimeRef.current = new Date()\n\t\tsetOffsetBeforeRemove(offset)\n\t\t;(event.target as HTMLElement).setPointerCapture(event.pointerId)\n\t\tif ((event.target as HTMLElement).tagName === \"BUTTON\") return\n\t\tsetSwiping(true)\n\t\tpointerStartRef.current = { x: event.clientX, y: event.clientY }\n\t}\n\n\tconst onPointerMove = (event: React.PointerEvent) => {\n\t\tif (!pointerStartRef.current || !swiping) return\n\n\t\tconst xDelta = event.clientX - pointerStartRef.current.x\n\t\tconst yDelta = event.clientY - pointerStartRef.current.y\n\n\t\t// Only allow horizontal swipe\n\t\tconst isHorizontal = Math.abs(xDelta) > Math.abs(yDelta)\n\t\tif (!isHorizontal && Math.abs(yDelta) > 2) {\n\t\t\tsetSwiping(false)\n\t\t\treturn\n\t\t}\n\n\t\tswipeAmountRef.current = xDelta\n\t\tif (ref.current) {\n\t\t\tref.current.style.setProperty(\"--swipe-amount\", `${xDelta}px`)\n\t\t}\n\t}\n\n\tconst onPointerUp = () => {\n\t\tif (!swiping || !pointerStartRef.current) return\n\n\t\tconst swipeAmount = swipeAmountRef.current\n\t\tconst timeTaken = dragStartTimeRef.current\n\t\t\t? new Date().getTime() - dragStartTimeRef.current.getTime()\n\t\t\t: 0\n\t\tconst velocity = Math.abs(swipeAmount) / timeTaken\n\n\t\tif (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n\t\t\tsetSwipeOut(true)\n\t\t\tsetOffsetBeforeRemove(offset)\n\t\t\tsetTimeout(() => {\n\t\t\t\tdeleteToast()\n\t\t\t}, TIME_BEFORE_UNMOUNT)\n\t\t} else {\n\t\t\tif (ref.current) {\n\t\t\t\tref.current.style.setProperty(\"--swipe-amount\", \"0px\")\n\t\t\t}\n\t\t}\n\n\t\tsetSwiping(false)\n\t\tpointerStartRef.current = null\n\t\tswipeAmountRef.current = 0\n\t}\n\n\t// ── Styles ──\n\tconst initialHeight = heights.find(h => h.toastId === t.id)?.height ?? 0\n\n\tconst style: React.CSSProperties = {\n\t\t\"--index\": index,\n\t\t\"--toasts-before\": index,\n\t\t\"--z-index\": toastCount - index,\n\t\t\"--offset\": `${removed ? offsetBeforeRemove : offset}px`,\n\t\t\"--initial-height\": `${initialHeight}px`,\n\t\t\"--swipe-amount\": \"0px\",\n\t} as React.CSSProperties\n\n\tconst isLoading = t.promiseState === \"loading\"\n\n\treturn (\n\t\t<li\n\t\t\tref={ref}\n\t\t\trole=\"status\"\n\t\t\taria-live=\"off\"\n\t\t\taria-atomic=\"true\"\n\t\t\ttabIndex={0}\n\t\t\tdata-mounted={mounted}\n\t\t\tdata-removed={removed}\n\t\t\tdata-expanded={expanded}\n\t\t\tdata-front={isFront}\n\t\t\tdata-visible={isVisible}\n\t\t\tdata-swiping={swiping}\n\t\t\tdata-swipe-out={swipeOut}\n\t\t\tdata-y-position={y}\n\t\t\tdata-promise-state={t.promiseState}\n\t\t\tstyle={style}\n\t\t\tclassName={cn(\n\t\t\t\t// Base layout\n\t\t\t\t\"bruv-toast\",\n\t\t\t\t\"pointer-events-auto absolute w-[var(--toast-width)] outline-none\",\n\t\t\t\t\"rounded-bruv-md shadow-lg\",\n\t\t\t\t\"transition-[background-color,border-color] duration-300\",\n\t\t\t\tconfig.container,\n\t\t\t\t// Positioning\n\t\t\t\tisTop ? \"top-0\" : \"bottom-0\",\n\t\t\t\tx === \"right\" && \"right-0\",\n\t\t\t\tx === \"left\" && \"left-0\",\n\t\t\t\tx === \"center\" && \"left-1/2 -translate-x-1/2\",\n\t\t\t\t// Focus\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t)}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonPointerMove={onPointerMove}\n\t\t\tonPointerUp={onPointerUp}\n\t\t>\n\t\t\t{/* Inner shell — clips the FlickeringGrid, preserves rounded corners */}\n\t\t\t<div className=\"relative overflow-hidden rounded-[inherit]\">\n\t\t\t\t{/* Pixel grid pattern — right half, fades toward the left */}\n\t\t\t\t{variant !== \"default\" && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"pointer-events-none absolute top-0 right-0 h-full w-1/2\",\n\t\t\t\t\t\t\tconfig.pattern,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmaskImage: \"linear-gradient(to left, black, transparent)\",\n\t\t\t\t\t\t\tWebkitMaskImage: \"linear-gradient(to left, black, transparent)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FlickeringGrid\n\t\t\t\t\t\t\tsquareSize={4}\n\t\t\t\t\t\t\tgridGap={2}\n\t\t\t\t\t\t\tflickerChance={0.4}\n\t\t\t\t\t\t\tmaxOpacity={0.2}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"relative flex flex-col gap-1 py-1.5 pr-1.5 pl-3\">\n\t\t\t\t\t{/* Top row: icon + title + action/close — all centered */}\n\t\t\t\t\t<div className=\"flex min-h-7 items-center gap-3\">\n\t\t\t\t\t\t{(DefaultIcon || isLoading) && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"bruv-toast-icon flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\t\t\t\"transition-colors duration-300\",\n\t\t\t\t\t\t\t\t\tconfig.icon,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t<Spinner showDots={false} size=\"sm\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tDefaultIcon && <DefaultIcon />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{t.title && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"min-w-0 flex-1 text-bruv-base font-medium\",\n\t\t\t\t\t\t\t\t\tconfig.text,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t.title}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Action / Close */}\n\t\t\t\t\t\t<div className=\"flex shrink-0 items-center gap-1\">\n\t\t\t\t\t\t\t{t.action}\n\t\t\t\t\t\t\t{closeButton && dismissible && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tdeleteToast()\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\taria-label=\"Close toast\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Description — below the top row, indented to align with title */}\n\t\t\t\t\t{t.description && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-bruv-base pb-1\",\n\t\t\t\t\t\t\t\tDefaultIcon || isLoading ? \"pl-8\" : \"\",\n\t\t\t\t\t\t\t\tconfig.description,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t.description}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</li>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Toaster (Provider) — renders the toast viewport\n// ---------------------------------------------------------------------------\n\nexport interface ToasterProps {\n\t/** Position of the toast stack. Default: `\"bottom-right\"` */\n\tposition?: ToastPosition\n\t/** Default duration in ms. Default: `4000` */\n\tduration?: number\n\t/** Show close button on each toast. Default: `true` */\n\tcloseButton?: boolean\n\t/** Maximum number of visible toasts. Default: `3` */\n\tvisibleToasts?: number\n\t/** Gap between expanded toasts in px. Default: `14` */\n\tgap?: number\n\t/** Distance from viewport edge in px. Default: `24` */\n\toffset?: number\n\t/** Width of each toast in px. Default: `356` */\n\twidth?: number\n\t/** Additional className for the toaster container */\n\tclassName?: string\n}\n\nexport const Toaster = forwardRef<HTMLElement, ToasterProps>(function Toaster(\n\t{\n\t\tposition = \"bottom-right\",\n\t\tduration = TOAST_LIFETIME,\n\t\tcloseButton = true,\n\t\tvisibleToasts = VISIBLE_TOASTS_AMOUNT,\n\t\tgap = GAP,\n\t\toffset: viewportOffset = VIEWPORT_OFFSET,\n\t\twidth = TOAST_WIDTH,\n\t\tclassName,\n\t},\n\tref,\n) {\n\tconst [toasts, setToasts] = useState<ToastData[]>([])\n\tconst [heights, setHeights] = useState<HeightEntry[]>([])\n\tconst [expanded, setExpanded] = useState(false)\n\tconst interactingRef = useRef(false)\n\tconst listRef = useRef<HTMLOListElement>(null)\n\tconst lastFocusedRef = useRef<HTMLElement | null>(null)\n\tconst isFocusWithinRef = useRef(false)\n\n\tconst [y, x] = position.split(\"-\") as [string, string]\n\n\t// ── Subscribe to toast state ──\n\tuseEffect(() => {\n\t\treturn toastState.subscribe(incoming => {\n\t\t\tif (incoming.delete) {\n\t\t\t\tsetToasts(prev =>\n\t\t\t\t\tprev.map(t => (t.id === incoming.id ? { ...t, delete: true } : t)),\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsetToasts(prev => {\n\t\t\t\tconst existingIndex = prev.findIndex(t => t.id === incoming.id)\n\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\tconst updated = [...prev]\n\t\t\t\t\tupdated[existingIndex] = {\n\t\t\t\t\t\t...prev[existingIndex],\n\t\t\t\t\t\t...incoming,\n\t\t\t\t\t}\n\t\t\t\t\treturn updated\n\t\t\t\t}\n\t\t\t\treturn [incoming, ...prev]\n\t\t\t})\n\t\t})\n\t}, [])\n\n\tconst removeToast = useCallback((id: string | number) => {\n\t\tsetToasts(prev => prev.filter(t => t.id !== id))\n\t\tsetHeights(prev => prev.filter(h => h.toastId !== id))\n\t}, [])\n\n\t// ── Focus management ──\n\tconst onFocus = useCallback((event: React.FocusEvent) => {\n\t\tif (!isFocusWithinRef.current) {\n\t\t\tisFocusWithinRef.current = true\n\t\t\tlastFocusedRef.current = event.relatedTarget as HTMLElement | null\n\t\t}\n\t}, [])\n\n\tconst onBlur = useCallback((event: React.FocusEvent) => {\n\t\tif (\n\t\t\tisFocusWithinRef.current &&\n\t\t\t!event.currentTarget.contains(event.relatedTarget)\n\t\t) {\n\t\t\tisFocusWithinRef.current = false\n\t\t\tif (lastFocusedRef.current) {\n\t\t\t\tlastFocusedRef.current.focus({ preventScroll: true })\n\t\t\t\tlastFocusedRef.current = null\n\t\t\t}\n\t\t}\n\t}, [])\n\n\tif (toasts.length === 0) return null\n\n\treturn createPortal(\n\t\t<section\n\t\t\tref={ref}\n\t\t\taria-label=\"Notifications\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-relevant=\"additions text\"\n\t\t\taria-atomic=\"false\"\n\t\t\ttabIndex={-1}\n\t\t>\n\t\t\t<ol\n\t\t\t\tref={listRef}\n\t\t\t\tdata-sonner-toaster=\"\"\n\t\t\t\tdata-y-position={y}\n\t\t\t\tdata-x-position={x}\n\t\t\t\tclassName={cn(\"bruv-toaster\", className)}\n\t\t\t\tstyle={\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition: \"fixed\",\n\t\t\t\t\t\t\tzIndex: 999999999,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\t\"--toast-width\": `${width}px`,\n\t\t\t\t\t\t\t\"--gap\": `${gap}px`,\n\t\t\t\t\t\t\t\"--front-toast-height\": `${heights[0]?.height ?? 0}px`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ty === \"top\" ? { top: viewportOffset } : { bottom: viewportOffset },\n\t\t\t\t\t\tx === \"right\" && { right: viewportOffset },\n\t\t\t\t\t\tx === \"left\" && { left: viewportOffset },\n\t\t\t\t\t\tx === \"center\" && {\n\t\t\t\t\t\t\tleft: \"50%\",\n\t\t\t\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t\t\t\t},\n\t\t\t\t\t) as React.CSSProperties\n\t\t\t\t}\n\t\t\t\tonMouseEnter={() => setExpanded(true)}\n\t\t\t\tonMouseMove={() => setExpanded(true)}\n\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\tif (!interactingRef.current) {\n\t\t\t\t\t\tsetExpanded(false)\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonPointerDown={() => {\n\t\t\t\t\tinteractingRef.current = true\n\t\t\t\t}}\n\t\t\t\tonPointerUp={() => {\n\t\t\t\t\tinteractingRef.current = false\n\t\t\t\t}}\n\t\t\t\tonFocus={onFocus}\n\t\t\t\tonBlur={onBlur}\n\t\t\t>\n\t\t\t\t{toasts.map((t, index) => (\n\t\t\t\t\t<ToastItem\n\t\t\t\t\t\tkey={t.id}\n\t\t\t\t\t\ttoast={t}\n\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\texpanded={expanded}\n\t\t\t\t\t\theights={heights}\n\t\t\t\t\t\tsetHeights={setHeights}\n\t\t\t\t\t\tposition={position}\n\t\t\t\t\t\tdefaultDuration={duration}\n\t\t\t\t\t\tcloseButton={closeButton}\n\t\t\t\t\t\tvisibleToasts={visibleToasts}\n\t\t\t\t\t\tgap={gap}\n\t\t\t\t\t\tonRemove={removeToast}\n\t\t\t\t\t\ttoastCount={toasts.length}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</ol>\n\t\t</section>,\n\t\tdocument.body,\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Toast = {\n\tProvider: Toaster,\n}\n","import { useCallback, useMemo, useState } from \"react\"\n\n/**\n * Return type for `useDirtyState`.\n *\n * Provides a draft/saved state pair with helpers for detecting changes,\n * updating individual fields, discarding edits, and persisting them.\n */\nexport interface DirtyState<T extends object> {\n\t/** The current in-flight draft (may differ from saved). */\n\treadonly draft: T\n\t/** The last-saved snapshot. */\n\treadonly saved: T\n\t/** `true` when draft differs from saved. */\n\treadonly dirty: boolean\n\t/** Replace the entire draft. */\n\treadonly setDraft: React.Dispatch<React.SetStateAction<T>>\n\t/** Update a single field on the draft. */\n\treadonly update: <K extends keyof T>(key: K, value: T[K]) => void\n\t/** Reset draft back to the saved snapshot. */\n\treadonly discard: () => void\n\t/** Promote the current draft to saved (optimistic save). */\n\treadonly save: () => void\n}\n\n/**\n * Manages a draft / saved state pair with built-in dirty detection.\n *\n * Replaces the repeated pattern across settings pages of:\n * ```ts\n * const [saved, setSaved] = useState(initial)\n * const [draft, setDraft] = useState(initial)\n * const dirty = JSON.stringify(draft) !== JSON.stringify(saved)\n * const update = (key, value) => setDraft(prev => ({ ...prev, [key]: value }))\n * ```\n *\n * @param initial – The starting state for both draft and saved.\n */\nexport function useDirtyState<T extends object>(initial: T): DirtyState<T> {\n\tconst [saved, setSaved] = useState<T>(initial)\n\tconst [draft, setDraft] = useState<T>(initial)\n\n\tconst dirty = useMemo(\n\t\t() => JSON.stringify(draft) !== JSON.stringify(saved),\n\t\t[draft, saved],\n\t)\n\n\tconst update = useCallback(<K extends keyof T>(key: K, value: T[K]) => {\n\t\tsetDraft(prev => ({ ...prev, [key]: value }))\n\t}, [])\n\n\tconst discard = useCallback(() => {\n\t\tsetDraft(saved)\n\t}, [saved])\n\n\tconst save = useCallback(() => {\n\t\tsetSaved(draft)\n\t}, [draft])\n\n\treturn { draft, saved, dirty, setDraft, update, discard, save }\n}\n"],"mappings":"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","names":["ChevronUpDownIcon","forwardRef","useState","forwardRef","jsx","jsx","jsxs","Spinner","jsx","jsxs","forwardRef","Button","forwardRef","jsx","jsxs","forwardRef","MenuPanel","MenuItem","MenuItemIndicator","MenuList","MenuSeparator","MenuGroupLabel","MenuPositioner","MenuSearchInput","MenuEmpty","jsx","jsxs","useState","forwardRef","ComboboxTrigger","ComboboxButton","ComboboxOption","ComboboxGroup","ComboboxGroupLabel","ComboboxSeparator","jsx","jsxs","ChevronUpDownIcon","forwardRef","jsx","sizeStyles","forwardRef","Toggle","forwardRef","CheckIcon","jsx","jsxs","sizeStyles","forwardRef","Checkbox","CheckIcon","forwardRef","useState","jsx","jsxs","sizeStyles","forwardRef","ColorPicker","useState","forwardRef","jsx","forwardRef","CardContent","CardHeader","CardBody","CardSection","Card","jsx","jsxs","sizeStyles","forwardRef","forwardRef","useMemo","jsx","jsxs","sizeStyles","variantStyles","cells","hash","bit","forwardRef","GenerativeFallback","useMemo","Avatar","Fragment","jsx","jsxs","DefaultLink","Separator","forwardRef","AppHeaderActions","AppHeader","forwardRef","useLayoutEffect","useRef","useState","forwardRef","jsx","forwardRef","TooltipTrigger","TooltipViewport","jsx","jsxs","forwardRef","SettingsCard","useState","SettingsRowRoot","SettingsRowHeader","SettingsRowLabel","SettingsRowDescription","useRef","useLayoutEffect","SettingsRowControl","SettingsRowAction","SettingsRowContent","forwardRef","jsx","jsxs","forwardRef","PageLayoutHeader","PageLayoutBody","PageLayout","forwardRef","useCallback","useEffect","useMemo","useState","XMarkIcon","forwardRef","jsx","jsxs","forwardRef","DrawerTrigger","DrawerBackdrop","DrawerHeader","DrawerTitle","DrawerDescription","DrawerBody","DrawerFooter","DrawerClose","forwardRef","useRef","jsx","useRef","jsx","forwardRef","Skeleton","createContext","useContext","Fragment","jsx","jsxs","useState","useCallback","useEffect","useMemo","forwardRef","SidebarLabel","XMarkIcon","forwardRef","ChevronUpDownIcon","jsx","jsxs","forwardRef","SelectTrigger","SelectButton","ChevronUpDownIcon","SelectOption","SelectSeparator","SelectGroup","SelectGroupLabel","forwardRef","jsx","Separator","forwardRef","XMarkIcon","forwardRef","jsx","jsxs","sizeStyles","forwardRef","Badge","variantStyles","XMarkIcon","forwardRef","useSyncExternalStore","jsx","useSyncExternalStore","forwardRef","Kbd","forwardRef","jsx","jsxs","forwardRef","FormRoot","FormField","FormLabel","FormInput","FormTextarea","FormHint","FormError","forwardRef","jsx","variantStyles","sizeStyles","forwardRef","StatusDot","forwardRef","jsx","forwardRef","DropdownMenuTrigger","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuGroup","forwardRef","jsx","jsxs","forwardRef","DialogTrigger","DialogBackdrop","sizeStyles","DialogPanel","DialogTitle","DialogBody","DialogFooter","DialogClose","forwardRef","useRef","useState","ChevronUpDownIcon","ChevronRightIcon","forwardRef","forwardRef","useCallback","useEffect","useRef","useState","jsx","jsxs","forwardRef","TruncatedCell","useRef","useState","useCallback","useEffect","jsx","forwardRef","Table","TableHeader","TableBody","TableRow","TableHeaderCell","TableCell","_","forwardRef","ChevronRightIcon","ChevronUpDownIcon","jsx","jsxs","sizeStyles","ChevronRightIcon","forwardRef","Pagination","ChevronUpDownIcon","forwardRef","jsx","jsxs","forwardRef","EmptyState","Fragment","jsx","jsxs","ChevronUpDownIcon","forwardRef","DataTableActionCell","useRef","useState","ChevronRightIcon","table","_","forwardRef","jsx","forwardRef","DataTableToolbar","forwardRef","useRef","useCallback","MagnifyingGlassIcon","XMarkIcon","jsx","jsxs","forwardRef","DataTableSearch","useRef","useCallback","MagnifyingGlassIcon","XMarkIcon","jsx","jsxs","forwardRef","XMarkIcon","jsx","jsxs","forwardRef","ActionBar","XMarkIcon","jsx","useEffect","useRef","useState","CheckIcon","forwardRef","jsx","forwardRef","PopoverTrigger","PopoverArrow","PopoverClose","PopoverTitle","PopoverDescription","forwardRef","Fragment","jsx","jsxs","forwardRef","FilterTrigger","Fragment","jsx","jsxs","useState","useRef","useEffect","CheckIcon","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useState","jsx","useState","useState","useState","ChevronLeftIcon","ChevronRightIcon","jsx","jsxs","useState","range","ChevronLeftIcon","ChevronRightIcon","jsx","jsxs","useState","range","useState","Fragment","jsx","jsxs","formatRange","useState","useRef","useState","MagnifyingGlassIcon","XMarkIcon","jsx","jsxs","useState","useRef","MagnifyingGlassIcon","XMarkIcon","useState","CalendarIcon","jsx","jsxs","dateFormatter","useState","CalendarIcon","useState","forwardRef","jsx","jsxs","forwardRef","Slider","jsx","jsxs","useState","startOfMonth","CalendarIcon","useState","jsx","jsxs","useState","CalendarIcon","CalendarIcon","useState","jsx","jsxs","range","useState","CalendarIcon","forwardRef","useState","ChevronDownIcon","ChevronUpIcon","forwardRef","jsx","jsxs","sizeStyles","forwardRef","NumberInput","ChevronDownIcon","ChevronUpIcon","jsx","jsxs","forwardRef","TimePicker","useState","forwardRef","jsx","jsxs","forwardRef","ProgressCircular","Progress","forwardRef","jsx","jsxs","forwardRef","ScrollArea","CheckIcon","forwardRef","jsx","jsxs","forwardRef","Stepper","CheckIcon","ChevronRightIcon","useState","jsx","jsxs","ChevronRightIcon","useState","forwardRef","jsx","forwardRef","ContextMenuTrigger","ContextMenuItem","XMarkIcon","forwardRef","useState","jsx","jsxs","forwardRef","TagsInput","useState","XMarkIcon","forwardRef","jsx","forwardRef","OTP","forwardRef","jsx","forwardRef","ToolbarButton","ToolbarSeparator","Toolbar","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useCallback","forwardRef","useState","forwardRef","useCallback","useLayoutEffect","useRef","useState","jsx","jsxs","forwardRef","SegmentedGroup","useRef","useState","useCallback","useLayoutEffect","SegmentedGroupItem","jsx","jsxs","sizeStyles","forwardRef","SegmentedControl","useState","Fragment","jsx","jsxs","forwardRef","XMarkIcon","jsx","jsxs","variantConfig","forwardRef","Alert","XMarkIcon","forwardRef","jsx","jsxs","forwardRef","AlertDialogTrigger","AlertDialogBackdrop","AlertDialogPanel","AlertDialogTitle","AlertDialogDescription","AlertDialogActions","AlertDialogClose","ChevronRightIcon","forwardRef","jsx","jsxs","forwardRef","AccordionRoot","AccordionItem","AccordionTrigger","ChevronRightIcon","AccordionContent","forwardRef","useCallback","useLayoutEffect","useRef","useState","jsx","forwardRef","TabsRoot","TabsList","useRef","useState","useCallback","useLayoutEffect","TabsTab","TabsPanel","BaseDialog","forwardRef","jsx","jsxs","forwardRef","CommandRoot","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","CommandSeparator","BaseDialog","forwardRef","Toggle","jsx","jsxs","sizeStyles","forwardRef","ToggleButton","Toggle","forwardRef","jsx","forwardRef","ButtonGroup","ToggleButtonGroup","forwardRef","BaseRadioGroup","BaseRadio","jsx","jsxs","forwardRef","Root","BaseRadioGroup","sizeStyles","Item","BaseRadio","Card","forwardRef","jsx","jsxs","forwardRef","SaveBar","BaseButton","forwardRef","jsx","jsxs","variantConfig","forwardRef","Fab","BaseButton","forwardRef","jsx","jsxs","forwardRef","SettingsPage","CheckCircleIcon","ExclamationTriangleIcon","InformationCircleIcon","XCircleIcon","XMarkIcon","forwardRef","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","variantConfig","CheckCircleIcon","XCircleIcon","ExclamationTriangleIcon","InformationCircleIcon","toast","useState","useEffect","useRef","useLayoutEffect","useMemo","useCallback","XMarkIcon","forwardRef","Toaster","useCallback","useMemo","useState"]}
1
+ {"version":3,"sources":["../src/lib/cn.ts","../src/components/input/input.tsx","../src/components/collapsible/collapsible.tsx","../src/components/breadcrumb/breadcrumb.tsx","../src/components/hover/hover.tsx","../src/components/combobox/combobox.tsx","../src/components/button/button.tsx","../src/components/spinner/spinner.tsx","../src/components/spinner/pixel-spinner.tsx","../src/components/menu/menu.tsx","../src/components/toggle/toggle.tsx","../src/components/checkbox/checkbox.tsx","../src/components/color-picker/color-picker.tsx","../src/components/card/card.tsx","../src/components/nav-link/nav-link.tsx","../src/components/app-header/app-header.tsx","../src/components/avatar/avatar.tsx","../src/components/settings-card/settings-card.tsx","../src/components/tooltip/tooltip.tsx","../src/components/page-layout/page-layout.tsx","../src/components/sidebar/sidebar.tsx","../src/components/drawer/drawer.tsx","../src/components/skeleton/skeleton.tsx","../src/components/flickering-grid/flickering-grid.tsx","../src/components/sidebar/sidebar-context.tsx","../src/components/select/select.tsx","../src/components/separator/separator.tsx","../src/components/badge/badge.tsx","../src/components/kbd/kbd.tsx","../src/components/form/form.tsx","../src/components/status-dot/status-dot.tsx","../src/components/dropdown-menu/dropdown-menu.tsx","../src/components/dialog/dialog.tsx","../src/components/data-table/data-table.tsx","../src/components/table/table.tsx","../src/components/table/truncated-cell.tsx","../src/components/pagination/pagination.tsx","../src/components/empty-state/empty-state.tsx","../src/components/data-table/data-table-toolbar.tsx","../src/components/data-table/data-table-search.tsx","../src/components/data-table/data-table-columns-button.tsx","../src/components/action-bar/action-bar.tsx","../src/components/data-table/data-table-bulk-bar.tsx","../src/components/filter/multi-select.tsx","../src/components/popover/popover.tsx","../src/components/filter/trigger.tsx","../src/components/filter/single-select.tsx","../src/components/filter/toggle.tsx","../src/components/filter/date-range.tsx","../src/lib/date.ts","../src/components/calendar/calendar.tsx","../src/components/filter/numeric-range.tsx","../src/components/filter/text.tsx","../src/components/filter/date.tsx","../src/components/filter/slider.tsx","../src/components/slider/slider.tsx","../src/components/filter/filter.tsx","../src/components/filter/date-presets.ts","../src/components/date-picker/date-picker.tsx","../src/components/date-range-picker/date-range-picker.tsx","../src/components/time-picker/time-picker.tsx","../src/components/number-input/number-input.tsx","../src/components/progress/progress.tsx","../src/components/scroll-area/scroll-area.tsx","../src/components/stepper/stepper.tsx","../src/components/tree-view/tree-view.tsx","../src/components/context-menu/context-menu.tsx","../src/components/tags-input/tags-input.tsx","../src/components/otp/otp.tsx","../src/components/toolbar/toolbar.tsx","../src/components/resizable/resizable.tsx","../src/components/segmented-control/segmented-control.tsx","../src/components/segmented-group/segmented-group.tsx","../src/components/user-menu/user-menu.tsx","../src/components/alert/alert.tsx","../src/components/alert-dialog/alert-dialog.tsx","../src/components/accordion/accordion.tsx","../src/components/tabs/tabs.tsx","../src/components/command/command.tsx","../src/components/toggle-button/toggle-button.tsx","../src/components/button-group/button-group.tsx","../src/components/radio-group/radio-group.tsx","../src/components/save-bar/save-bar.tsx","../src/components/fab/fab.tsx","../src/components/settings-page/settings-page.tsx","../src/components/toast/toast.tsx","../src/lib/use-dirty-state.ts"],"sourcesContent":["import { type ClassValue, clsx } from \"clsx\"\nimport { extendTailwindMerge } from \"tailwind-merge\"\n\nconst twMerge = extendTailwindMerge({\n\textend: {\n\t\tclassGroups: {\n\t\t\t\"font-size\": [{ \"text-cui\": [\"sm\", \"base\", \"lg\", \"xl\"] }],\n\t\t\t\"text-color\": [\n\t\t\t\t{\n\t\t\t\t\t\"text-cui\": [\n\t\t\t\t\t\t\"primary\",\n\t\t\t\t\t\t\"secondary\",\n\t\t\t\t\t\t\"tertiary\",\n\t\t\t\t\t\t\"inverse\",\n\t\t\t\t\t\t\"accent\",\n\t\t\t\t\t\t\"accent-on\",\n\t\t\t\t\t\t\"danger\",\n\t\t\t\t\t\t\"danger-on\",\n\t\t\t\t\t\t\"warn\",\n\t\t\t\t\t\t\"warn-on\",\n\t\t\t\t\t\t\"success\",\n\t\t\t\t\t\t\"success-on\",\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t},\n})\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs))\n}\n","import {\n\tforwardRef,\n\ttype ComponentPropsWithoutRef,\n\ttype ReactNode,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst fieldSizeStyles = {\n\tsm: \"px-2.5 py-1 text-bruv-sm min-h-7\",\n\tmd: \"px-3 py-1.5 text-bruv-base min-h-8\",\n} as const\n\nexport type InputSize = keyof typeof fieldSizeStyles\n\nconst fieldBase = [\n\t\"w-full rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 text-bruv-primary\",\n\t\"outline-none placeholder:text-bruv-tertiary\",\n\t\"ring-bruv-neutral ring-0 transition-[box-shadow,color,border-color] duration-150 ease-out\",\n\t\"focus:ring-2 focus:border-bruv-neutral-strong\",\n\t\"motion-reduce:transition-none\",\n\t\"disabled:cursor-not-allowed disabled:opacity-50\",\n\t\"aria-invalid:border-bruv-danger aria-invalid:focus:ring-bruv-danger/30\",\n]\n\nexport interface InputProps extends Omit<\n\tComponentPropsWithoutRef<\"input\">,\n\t\"size\"\n> {\n\tsize?: InputSize\n\ticonLeft?: ReactNode\n\ticonRight?: ReactNode\n\twrapperClassName?: string\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n\t{ size = \"md\", iconLeft, iconRight, wrapperClassName, className, ...props },\n\tref,\n) {\n\tconst hasIcon = !!iconLeft || !!iconRight\n\n\tif (!hasIcon) {\n\t\treturn (\n\t\t\t<input\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(fieldBase, fieldSizeStyles[size], className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2\",\n\t\t\t\tsize === \"sm\" ? \"px-2 min-h-7\" : \"px-2.5 min-h-8\",\n\t\t\t\tfieldBase.filter(c => !c.includes(\"placeholder\")),\n\t\t\t\twrapperClassName,\n\t\t\t)}\n\t\t>\n\t\t\t{iconLeft && (\n\t\t\t\t<span className=\"text-bruv-tertiary flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t{iconLeft}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<input\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex-1 min-w-0 bg-transparent text-bruv-primary outline-none placeholder:text-bruv-tertiary\",\n\t\t\t\t\tsize === \"sm\" ? \"text-bruv-sm\" : \"text-bruv-base\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t\t{iconRight && (\n\t\t\t\t<span className=\"text-bruv-tertiary flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t{iconRight}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n\nexport interface TextareaProps extends Omit<\n\tComponentPropsWithoutRef<\"textarea\">,\n\t\"size\"\n> {\n\tsize?: InputSize\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n\tfunction Textarea({ size = \"md\", className, ...props }, ref) {\n\t\treturn (\n\t\t\t<textarea\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tfieldBase,\n\t\t\t\t\tfieldSizeStyles[size],\n\t\t\t\t\t\"min-h-20 resize-y\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface LabelProps extends ComponentPropsWithoutRef<\"label\"> {}\n\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n\t{ className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<label\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-2 text-bruv-base font-medium text-bruv-primary select-none\",\n\t\t\t\t\"peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n","import { Collapsible as BaseCollapsible } from \"@base-ui/react/collapsible\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface CollapsibleRootProps extends ComponentProps<\n\ttypeof BaseCollapsible.Root\n> {}\n\nfunction CollapsibleRoot({ className, ...props }: CollapsibleRootProps) {\n\treturn (\n\t\t<BaseCollapsible.Root\n\t\t\tclassName={cn(\"flex flex-col\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport interface CollapsibleTriggerProps extends ComponentProps<\n\ttypeof BaseCollapsible.Trigger\n> {}\n\nconst CollapsibleTrigger = forwardRef<\n\tHTMLButtonElement,\n\tCollapsibleTriggerProps\n>(function CollapsibleTrigger({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseCollapsible.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/collapsible flex items-center gap-1.5 outline-none\",\n\t\t\t\t\"focus-visible:ring-bruv-focus rounded-bruv-md focus-visible:ring-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\nexport interface CollapsiblePanelProps extends ComponentProps<\n\ttypeof BaseCollapsible.Panel\n> {}\n\nconst CollapsiblePanel = forwardRef<HTMLDivElement, CollapsiblePanelProps>(\n\tfunction CollapsiblePanel({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseCollapsible.Panel\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\"data-[starting-style]:h-0 data-[ending-style]:h-0\",\n\t\t\t\t\t\"h-[var(--collapsible-panel-height)]\",\n\t\t\t\t\t\"transition-[height] duration-200 ease-out motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport const Collapsible = {\n\tRoot: CollapsibleRoot,\n\tTrigger: CollapsibleTrigger,\n\tPanel: CollapsiblePanel,\n}\n","import type { ComponentType, ReactNode } from \"react\"\nimport { ChevronUpDownIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Hover } from \"../hover\"\nimport { Combobox, ComboboxTrigger, ComboboxContent } from \"../combobox\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype LinkComponent = ComponentType<{\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}>\n\nfunction DefaultLink({\n\tto,\n\thref,\n\tclassName,\n\tchildren,\n}: {\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}) {\n\treturn (\n\t\t<a href={to ?? href} className={className}>\n\t\t\t{children}\n\t\t</a>\n\t)\n}\n\nexport interface BreadcrumbOption {\n\treadonly value: string\n\treadonly label: string\n\treadonly icon?: ReactNode\n\treadonly [key: string]: unknown\n}\n\nexport interface BreadcrumbItem {\n\t/** Display label for this segment */\n\treadonly label: string\n\t/** Optional icon rendered before the label */\n\treadonly icon?: ReactNode\n\t/** Link URL — makes the label a clickable link */\n\treadonly href?: string\n\t/** Enable a dropdown selector (ChevronUpDown trigger) */\n\treadonly selector?: boolean\n\t/** Options for the selector dropdown */\n\treadonly options?: BreadcrumbOption[]\n\t/** Callback when a selector option is chosen */\n\treadonly onSelect?: (value: string) => void\n\t/** Currently selected value for the selector */\n\treadonly value?: string\n}\n\nexport interface BreadcrumbProps {\n\t/** Breadcrumb segments */\n\treadonly items: BreadcrumbItem[]\n\t/** Custom link component (e.g. TanStack Router's Link, Next.js Link). Defaults to <a>. */\n\treadonly linkComponent?: LinkComponent\n\treadonly className?: string\n}\n\n// ---------------------------------------------------------------------------\n// Internal — Separator\n// ---------------------------------------------------------------------------\n\nfunction Separator() {\n\treturn (\n\t\t<div className=\"flex w-4 shrink-0 items-center justify-center self-stretch\">\n\t\t\t<div className=\"bg-bruv-tertiary h-4 w-px rotate-[20deg] opacity-50\" />\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Internal — BreadcrumbLabel\n// ---------------------------------------------------------------------------\n\nfunction BreadcrumbLabel({\n\titem,\n\tasLink,\n\tLinkEl,\n}: {\n\titem: BreadcrumbItem\n\tasLink?: boolean\n\tLinkEl: LinkComponent\n}) {\n\tconst className = cn(\n\t\t\"flex items-center gap-2 h-8 px-2 text-bruv-base text-bruv-primary select-none\",\n\t\tasLink &&\n\t\t\t\"outline-none rounded focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t)\n\tconst content = (\n\t\t<>\n\t\t\t{item.icon && (\n\t\t\t\t<span className=\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t{item.icon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<span>{item.label}</span>\n\t\t</>\n\t)\n\n\tif (asLink && item.href) {\n\t\treturn (\n\t\t\t<LinkEl to={item.href} href={item.href} className={className}>\n\t\t\t\t{content}\n\t\t\t</LinkEl>\n\t\t)\n\t}\n\treturn <span className={className}>{content}</span>\n}\n\n// ---------------------------------------------------------------------------\n// Internal — SelectorChevron\n// ---------------------------------------------------------------------------\n\nfunction SelectorChevron() {\n\treturn (\n\t\t<ComboboxTrigger className=\"rounded-bruv-sm\">\n\t\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t\t<span className=\"flex h-8 items-center justify-center px-0.5 select-none\">\n\t\t\t\t\t<ChevronUpDownIcon className=\"text-bruv-tertiary size-4\" />\n\t\t\t\t</span>\n\t\t\t</Hover>\n\t\t</ComboboxTrigger>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Internal — BreadcrumbSegment\n// ---------------------------------------------------------------------------\n\nfunction BreadcrumbSegment({\n\titem,\n\tLinkEl,\n}: {\n\titem: BreadcrumbItem\n\tLinkEl: LinkComponent\n}) {\n\tif (item.selector && item.options) {\n\t\treturn (\n\t\t\t<Combobox\n\t\t\t\tvalue={item.value}\n\t\t\t\tonValueChange={item.onSelect}\n\t\t\t\titems={item.options}\n\t\t\t>\n\t\t\t\t<span className=\"flex items-center\">\n\t\t\t\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t\t\t\t<BreadcrumbLabel item={item} asLink={!!item.href} LinkEl={LinkEl} />\n\t\t\t\t\t</Hover>\n\t\t\t\t\t<SelectorChevron />\n\t\t\t\t</span>\n\t\t\t\t<ComboboxContent searchPlaceholder=\"Search...\" />\n\t\t\t</Combobox>\n\t\t)\n\t}\n\n\tif (item.href) {\n\t\treturn (\n\t\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t\t<BreadcrumbLabel item={item} asLink LinkEl={LinkEl} />\n\t\t\t</Hover>\n\t\t)\n\t}\n\n\treturn (\n\t\t<Hover background=\"bg-bruv-subtle\" interactive>\n\t\t\t<BreadcrumbLabel item={item} LinkEl={LinkEl} />\n\t\t</Hover>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Breadcrumb — standalone breadcrumb navigation\n// ---------------------------------------------------------------------------\n\n/**\n * Breadcrumb navigation with support for links, selectors, and icons.\n *\n * Each segment can be:\n * - **Static text** — plain label (last segment, current page)\n * - **Link** — clickable label that navigates to a parent page\n * - **Selector** — label + chevron dropdown to switch between siblings\n * (e.g. switch repos). The label can also be a link independently.\n *\n * Usage:\n * ```tsx\n * <Breadcrumb\n * items={[\n * { label: \"Repositories\", href: \"/repositories\" },\n * { label: \"landing\", href: \"/repos/landing\", selector: true, options: repos, value: \"landing\" },\n * { label: \"Settings\" },\n * ]}\n * />\n * ```\n */\nexport function Breadcrumb({\n\titems,\n\tlinkComponent: LinkEl = DefaultLink,\n\tclassName,\n}: BreadcrumbProps) {\n\treturn (\n\t\t<nav className={cn(\"flex items-center\", className)}>\n\t\t\t{items.map((item, index) => (\n\t\t\t\t<span key={item.label} className=\"flex items-center\">\n\t\t\t\t\t{index > 0 && <Separator />}\n\t\t\t\t\t<BreadcrumbSegment item={item} LinkEl={LinkEl} />\n\t\t\t\t</span>\n\t\t\t))}\n\t\t</nav>\n\t)\n}\n","import {\n\ttype ComponentProps,\n\ttype CSSProperties,\n\ttype ReactNode,\n\tcreateContext,\n\tuseCallback,\n\tuseContext,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Group context\n// ---------------------------------------------------------------------------\n\ninterface HoverRect {\n\tleft: number\n\ttop: number\n\twidth: number\n\theight: number\n}\n\ninterface HoverGroupCtx {\n\tregisterItem: (id: number, el: HTMLElement | null) => void\n\tonItemHover: (id: number) => void\n\tdismissHover: () => void\n}\n\nconst GroupCtx = createContext<HoverGroupCtx | null>(null)\n\n// ---------------------------------------------------------------------------\n// Hover.Group\n// ---------------------------------------------------------------------------\n\nexport interface HoverGroupProps {\n\tchildren: ReactNode\n\t/** Background class for the sliding pill */\n\tbackground?: string\n\t/** Border radius class for the sliding pill */\n\tborderRadius?: string\n\tclassName?: string\n}\n\nfunction measureElement(el: HTMLElement): HoverRect {\n\treturn {\n\t\tleft: el.offsetLeft,\n\t\ttop: el.offsetTop,\n\t\twidth: el.offsetWidth,\n\t\theight: el.offsetHeight,\n\t}\n}\n\n/**\n * Groups Hover items so they share a single sliding hover indicator.\n *\n * The indicator is hover-only - it slides between items on hover and\n * fades out when the pointer leaves the group. On press, the indicator\n * background shrinks by 1px on all sides (same feel as standalone Hover).\n *\n * Active items render their own static background via the standalone\n * Hover background layer (with its own press inset effect).\n *\n * Works for both horizontal and vertical layouts automatically.\n */\ntype PillMode = \"idle\" | \"fade\" | \"slide\"\n\nexport function HoverGroup({\n\tchildren,\n\tbackground = \"bg-bruv-subtle\",\n\tborderRadius = \"rounded-bruv-sm\",\n\tclassName,\n}: HoverGroupProps) {\n\tconst itemElements = useRef<Map<number, HTMLElement>>(new Map())\n\n\tconst [hoverRect, setHoverRect] = useState<HoverRect | null>(null)\n\tconst lastRectRef = useRef<HoverRect | null>(null)\n\tconst [pillMode, setPillMode] = useState<PillMode>(\"idle\")\n\n\tconst registerItem = useCallback((id: number, el: HTMLElement | null) => {\n\t\tif (el) itemElements.current.set(id, el)\n\t\telse itemElements.current.delete(id)\n\t}, [])\n\n\tconst onItemHover = useCallback((id: number) => {\n\t\tconst el = itemElements.current.get(id)\n\t\tif (!el) return\n\t\tconst rect = measureElement(el)\n\n\t\tsetPillMode(prev => (prev === \"idle\" ? \"fade\" : \"slide\"))\n\t\tsetHoverRect(rect)\n\t}, [])\n\n\tconst onGroupLeave = useCallback(() => {\n\t\tsetPillMode(\"idle\")\n\t\tsetHoverRect(null)\n\t}, [])\n\n\t// Entering an active item = leaving the hover group conceptually.\n\t// Reset to idle so the next non-active item gets a fresh fade-in.\n\tconst dismissHover = useCallback(() => {\n\t\tsetPillMode(\"idle\")\n\t\tsetHoverRect(null)\n\t}, [])\n\n\tconst isVisible = hoverRect !== null\n\tconst displayRect = hoverRect ?? lastRectRef.current\n\n\t// Track the last rect for fade-out position\n\tif (hoverRect) {\n\t\tlastRectRef.current = hoverRect\n\t}\n\n\tconst ctxValue = useMemo(\n\t\t() => ({ registerItem, onItemHover, dismissHover }),\n\t\t[registerItem, onItemHover, dismissHover],\n\t)\n\n\treturn (\n\t\t<GroupCtx.Provider value={ctxValue}>\n\t\t\t<div\n\t\t\t\tonPointerLeave={onGroupLeave}\n\t\t\t\tclassName={cn(\"group/h relative flex items-center\", className)}\n\t\t\t>\n\t\t\t\t{/* Hover pill positioner */}\n\t\t\t\t<div\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"pointer-events-none absolute left-0 top-0 z-0\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t// Slide mode: transition everything for smooth sliding\n\t\t\t\t\t\t// Fade/idle: only transition opacity + scale (translate snaps)\n\t\t\t\t\t\tpillMode === \"slide\"\n\t\t\t\t\t\t\t? \"transition-[translate,width,height,opacity,scale] duration-200 ease-bruv-out-expo\"\n\t\t\t\t\t\t\t: \"transition-[opacity,scale] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\tisVisible ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={\n\t\t\t\t\t\tdisplayRect\n\t\t\t\t\t\t\t? ({\n\t\t\t\t\t\t\t\t\twidth: displayRect.width,\n\t\t\t\t\t\t\t\t\theight: displayRect.height,\n\t\t\t\t\t\t\t\t\ttranslate: `${displayRect.left}px ${displayRect.top}px`,\n\t\t\t\t\t\t\t\t} as CSSProperties)\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{/* Pill visible background - press inset */}\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"absolute inset-0\",\n\t\t\t\t\t\t\tbackground,\n\t\t\t\t\t\t\tborderRadius,\n\t\t\t\t\t\t\t\"transition-[inset] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\t\t\"group-active/h:inset-px\",\n\t\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</GroupCtx.Provider>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Hover\n// ---------------------------------------------------------------------------\n\nexport interface HoverProps extends Omit<ComponentProps<\"div\">, \"children\"> {\n\tchildren: ReactNode\n\t/** Force the hover background visible (e.g. active/selected state) */\n\tactive?: boolean\n\t/** Background class applied to the hover layer */\n\tbackground?: string\n\t/** Additional classes on the animated background layer (border, shadow, hover color shifts, etc.) */\n\tbackgroundClassName?: string\n\t/** Border radius class */\n\tborderRadius?: string\n\t/** Enable focus ring */\n\tfocus?: boolean\n\t/** Enable active/press shrink effect */\n\tinteractive?: boolean\n\t/** When true, hover bg appears instantly (no opacity/inset transition).\n\t * Only the press effect (inset shrink) animates. Useful for menus. */\n\tinstantHover?: boolean\n\t/** Disable all hover/focus effects */\n\tdisabled?: boolean\n\t/** Stretch to full width */\n\tfullWidth?: boolean\n}\n\n/**\n * Animated hover/focus wrapper.\n *\n * **Standalone**: renders an absolutely-positioned background layer behind its\n * children that transitions in on hover/focus. On press, the background shrinks\n * by 1px on all sides.\n *\n * **Inside Hover.Group**: registers for the shared sliding hover pill.\n * When `active`, renders its own static background with the press inset\n * effect (same as standalone active state). The group pill handles hover.\n */\nexport function Hover({\n\tchildren,\n\tactive = false,\n\tbackground = \"bg-bruv-subtle\",\n\tbackgroundClassName,\n\tborderRadius = \"rounded\",\n\tfocus = true,\n\tinteractive = true,\n\tinstantHover = false,\n\tdisabled = false,\n\tfullWidth = false,\n\tclassName,\n\t...rest\n}: HoverProps) {\n\tconst group = useContext(GroupCtx)\n\n\tif (group) {\n\t\treturn (\n\t\t\t<HoverGrouped\n\t\t\t\tgroup={group}\n\t\t\t\tactive={active}\n\t\t\t\tbackground={background}\n\t\t\t\tbackgroundClassName={backgroundClassName}\n\t\t\t\tborderRadius={borderRadius}\n\t\t\t\tinteractive={interactive}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tfullWidth={fullWidth}\n\t\t\t\tclassName={className}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</HoverGrouped>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\t{...rest}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/h relative flex min-w-0 items-center text-bruv-primary text-bruv-base\",\n\t\t\t\tfullWidth ? \"w-full\" : \"w-fit\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Background layer */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute\",\n\t\t\t\t\tinstantHover\n\t\t\t\t\t\t? \"transition-[inset] duration-150 ease-bruv-out-expo motion-reduce:transition-none\"\n\t\t\t\t\t\t: \"transition-[inset,opacity,background-color] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\tbackground,\n\t\t\t\t\tbackgroundClassName,\n\t\t\t\t\tborderRadius,\n\t\t\t\t\t// hover\n\t\t\t\t\t!disabled && \"group-hover/h:inset-0 group-hover/h:opacity-100\",\n\t\t\t\t\t// active/press\n\t\t\t\t\tinteractive && !disabled && \"group-active/h:inset-px\",\n\t\t\t\t\t// active state (forced visible)\n\t\t\t\t\tactive\n\t\t\t\t\t\t? \"opacity-100 inset-0\"\n\t\t\t\t\t\t: instantHover\n\t\t\t\t\t\t\t? \"opacity-0 inset-0\"\n\t\t\t\t\t\t\t: \"opacity-0 inset-1\",\n\t\t\t\t\t// focus\n\t\t\t\t\tfocus &&\n\t\t\t\t\t\t!disabled &&\n\t\t\t\t\t\t\"group-has-focus-visible/h:inset-0 group-has-focus-visible/h:opacity-100 group-has-focus-visible/h:ring-bruv-focus group-has-focus-visible/h:ring-2 group-has-focus-visible/h:ring-offset-2\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{/* Content */}\n\t\t\t<div className=\"relative z-[2] flex w-full min-w-0 items-center gap-2\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// HoverGrouped\n//\n// Registers in the group for the shared hover pill. When active, renders\n// a static background with the same inset press effect as standalone Hover.\n// ---------------------------------------------------------------------------\n\nfunction HoverGrouped({\n\tchildren,\n\tgroup,\n\tactive,\n\tbackground,\n\tbackgroundClassName,\n\tborderRadius,\n\tinteractive,\n\tdisabled,\n\tfullWidth,\n\tclassName,\n\t...rest\n}: {\n\tchildren: ReactNode\n\tgroup: HoverGroupCtx\n\tactive: boolean\n\tbackground: string\n\tbackgroundClassName?: string\n\tborderRadius: string\n\tinteractive: boolean\n\tdisabled: boolean\n\tfullWidth: boolean\n\tclassName?: string\n} & Omit<ComponentProps<\"div\">, \"children\">) {\n\tconst ref = useRef<HTMLDivElement>(null)\n\tconst idRef = useRef<number | null>(null)\n\tif (idRef.current === null) {\n\t\tidRef.current = Math.random()\n\t}\n\tconst id = idRef.current\n\tconst groupRef = useRef(group)\n\tgroupRef.current = group\n\n\tuseLayoutEffect(() => {\n\t\tconst g = groupRef.current\n\t\tg.registerItem(id, ref.current)\n\t\treturn () => g.registerItem(id, null)\n\t}, [id])\n\n\tconst prevActiveRef = useRef(active)\n\tuseLayoutEffect(() => {\n\t\tif (active && !prevActiveRef.current) {\n\t\t\tgroup.dismissHover()\n\t\t}\n\t\tprevActiveRef.current = active\n\t}, [active, group])\n\n\treturn (\n\t\t<div\n\t\t\t{...rest}\n\t\t\tref={ref}\n\t\t\tonPointerEnter={e => {\n\t\t\t\trest.onPointerEnter?.(e)\n\t\t\t\tif (disabled || active) {\n\t\t\t\t\tgroup.dismissHover()\n\t\t\t\t} else {\n\t\t\t\t\tgroup.onItemHover(id)\n\t\t\t\t}\n\t\t\t}}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/hi relative z-[1] flex items-center text-bruv-primary text-bruv-base\",\n\t\t\t\tfullWidth ? \"w-full\" : \"w-fit\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Active background - always mounted, fades/scales in and out */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute\",\n\t\t\t\t\tbackground,\n\t\t\t\t\tbackgroundClassName,\n\t\t\t\t\tborderRadius,\n\t\t\t\t\t\"transition-[inset,opacity,scale] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\tinteractive && !disabled && \"group-active/hi:inset-px\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tactive\n\t\t\t\t\t\t? \"inset-0 scale-100 opacity-100\"\n\t\t\t\t\t\t: \"inset-1 scale-95 opacity-0\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{/* Content */}\n\t\t\t<div className=\"relative z-[2] flex w-full min-w-0 items-center gap-2\">\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n","import { forwardRef, type ReactElement, type ReactNode, useState } from \"react\"\nimport { Combobox as BaseCombobox } from \"@base-ui/react/combobox\"\nimport { ChevronUpDownIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button, type ButtonSize } from \"../button\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxItem {\n\treadonly value: string\n\treadonly label: string\n\treadonly icon?: ReactNode\n\treadonly [key: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Combobox (Root)\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxProps {\n\t/** Controlled value */\n\treadonly value?: string\n\t/** Uncontrolled default value */\n\treadonly defaultValue?: string\n\t/** Called when a value is selected */\n\treadonly onValueChange?: (value: string) => void\n\t/** Item data for filtering and rendering */\n\treadonly items: ComboboxItem[]\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Searchable combobox with filtering.\n *\n * Wraps Base UI Combobox.Root with shared Menu visual primitives.\n * For non-searchable dropdowns, use Select instead.\n *\n * Supports both controlled (`value` + `onValueChange`)\n * and uncontrolled (`defaultValue`) usage.\n */\nexport function Combobox({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\titems,\n\tchildren,\n\tclassName,\n}: ComboboxProps): ReactElement {\n\tconst [inputValue, setInputValue] = useState(\"\")\n\n\treturn (\n\t\t<BaseCombobox.Root\n\t\t\tvalue={value}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tonValueChange={\n\t\t\t\tonValueChange\n\t\t\t\t\t? val => {\n\t\t\t\t\t\t\tif (val != null) onValueChange(val)\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\titems={items}\n\t\t\tinputValue={inputValue}\n\t\t\tonInputValueChange={setInputValue}\n\t\t\tonOpenChange={open => {\n\t\t\t\tif (open) setInputValue(\"\")\n\t\t\t}}\n\t\t\tautoHighlight\n\t\t>\n\t\t\t{className ? <div className={className}>{children}</div> : children}\n\t\t</BaseCombobox.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// ComboboxTrigger — composable\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxTriggerProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Fully composable trigger. Renders whatever children you give it as the\n * element that opens the combobox popup.\n *\n * Use ComboboxButton for button-based triggers so BaseCombobox.Trigger does\n * not wrap a Button in another native button.\n */\nexport const ComboboxTrigger = forwardRef<\n\tHTMLButtonElement,\n\tComboboxTriggerProps\n>(function ComboboxTrigger({ children, className }, ref) {\n\treturn (\n\t\t<BaseCombobox.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2 rounded\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{children}\n\t\t</BaseCombobox.Trigger>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// ComboboxButton — pre-styled trigger\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxButtonProps {\n\t/** Placeholder text shown when no value is selected */\n\tplaceholder?: string\n\t/** Size of the button */\n\tsize?: ButtonSize\n\tclassName?: string\n}\n\n/**\n * Pre-styled trigger for form contexts.\n * Renders as a Button with the selected value + chevron icon.\n * For fully custom triggers, use ComboboxTrigger instead.\n */\nexport const ComboboxButton = forwardRef<\n\tHTMLButtonElement,\n\tComboboxButtonProps\n>(function ComboboxButton({ placeholder, size, className }, ref) {\n\treturn (\n\t\t<BaseCombobox.Trigger\n\t\t\tref={ref}\n\t\t\trender={\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize={size}\n\t\t\t\t\ticonRight={<ChevronUpDownIcon />}\n\t\t\t\t\tclassName={className}\n\t\t\t\t>\n\t\t\t\t\t<BaseCombobox.Value placeholder={placeholder} />\n\t\t\t\t</Button>\n\t\t\t}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// ComboboxContent — popup with search + list\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxContentProps {\n\t/** Alignment relative to trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Placeholder text for the search input */\n\tsearchPlaceholder?: string\n\t/** Empty state message */\n\temptyMessage?: string\n\t/** Minimum width of the popup */\n\tminWidth?: string\n\t/**\n\t * Render function for each item. Receives a ComboboxItem and should return\n\t * a ComboboxOption element. When not provided, renders a default option\n\t * with optional icon + label + checkmark.\n\t */\n\tchildren?: (item: ComboboxItem) => ReactNode\n\tclassName?: string\n}\n\n/**\n * Popup with search input and a scrollable list of filtered options.\n * Uses Base UI's render function pattern for automatic filtering.\n */\nexport function ComboboxContent({\n\talign = \"start\",\n\tsearchPlaceholder = \"Search...\",\n\temptyMessage = \"No results found.\",\n\tminWidth = \"min-w-[220px]\",\n\tchildren,\n\tclassName,\n}: ComboboxContentProps): ReactElement {\n\tconst renderItem =\n\t\tchildren ??\n\t\t((item: ComboboxItem) => (\n\t\t\t<ComboboxOption key={item.value} value={item.value} icon={item.icon}>\n\t\t\t\t{item.label}\n\t\t\t</ComboboxOption>\n\t\t))\n\n\treturn (\n\t\t<BaseCombobox.Portal>\n\t\t\t<BaseCombobox.Positioner\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={4}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseCombobox.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t<Menu.SearchInput>\n\t\t\t\t\t\t<BaseCombobox.Input\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Menu.SearchInput>\n\t\t\t\t\t<BaseCombobox.Empty render={<Menu.Empty />}>\n\t\t\t\t\t\t{emptyMessage}\n\t\t\t\t\t</BaseCombobox.Empty>\n\t\t\t\t\t<BaseCombobox.List render={<Menu.List />}>\n\t\t\t\t\t\t{renderItem}\n\t\t\t\t\t</BaseCombobox.List>\n\t\t\t\t</BaseCombobox.Popup>\n\t\t\t</BaseCombobox.Positioner>\n\t\t</BaseCombobox.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// ComboboxOption\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxOptionProps {\n\t/** Value for this option */\n\treadonly value: string\n\t/** Icon element rendered before the label */\n\treadonly icon?: ReactNode\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Individual option in the combobox popup.\n * Automatically includes a checkmark indicator when selected.\n */\nexport const ComboboxOption = forwardRef<HTMLDivElement, ComboboxOptionProps>(\n\tfunction ComboboxOption({ value, icon, children, className }, ref) {\n\t\treturn (\n\t\t\t<BaseCombobox.Item\n\t\t\t\tref={ref}\n\t\t\t\tvalue={value}\n\t\t\t\trender={<Menu.Item icon={icon} className={className} />}\n\t\t\t>\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t\t<BaseCombobox.ItemIndicator render={<Menu.ItemIndicator />} />\n\t\t\t</BaseCombobox.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// ComboboxGroup — groups related items with a label\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxGroupProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Groups related combobox items with an optional label.\n * Wraps Base UI's Combobox.Group.\n */\nexport const ComboboxGroup = forwardRef<HTMLDivElement, ComboboxGroupProps>(\n\tfunction ComboboxGroup({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseCombobox.Group ref={ref} className={cn(\"flex flex-col\", className)}>\n\t\t\t\t{children}\n\t\t\t</BaseCombobox.Group>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// ComboboxGroupLabel — accessible label for a group\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxGroupLabelProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Accessible label automatically associated with its parent group.\n * Renders via Menu.GroupLabel for consistent styling.\n */\nexport const ComboboxGroupLabel = forwardRef<\n\tHTMLDivElement,\n\tComboboxGroupLabelProps\n>(function ComboboxGroupLabel({ className, children }, ref) {\n\treturn (\n\t\t<BaseCombobox.GroupLabel\n\t\t\tref={ref}\n\t\t\trender={<Menu.GroupLabel className={className} />}\n\t\t>\n\t\t\t{children}\n\t\t</BaseCombobox.GroupLabel>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// ComboboxSeparator — divider between groups\n// ---------------------------------------------------------------------------\n\nexport interface ComboboxSeparatorProps {\n\treadonly className?: string\n}\n\n/**\n * Visual separator between combobox groups.\n * Renders via Menu.Separator for consistent styling.\n */\nexport const ComboboxSeparator = forwardRef<\n\tHTMLDivElement,\n\tComboboxSeparatorProps\n>(function ComboboxSeparator({ className }, ref) {\n\treturn (\n\t\t<BaseCombobox.Separator\n\t\t\tref={ref}\n\t\t\trender={<Menu.Separator className={className} />}\n\t\t/>\n\t)\n})\n","import { Button as BaseButton } from \"@base-ui/react/button\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Spinner } from \"../spinner\"\n\nconst variantConfig = {\n\tprimary: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-inverse\",\n\t\tbgClassName:\n\t\t\t\"shadow-xs inset-shadow-bruv-primary group-hover/btn:bg-bruv-inverse/90\",\n\t\ttext: \"text-bruv-inverse\",\n\t},\n\toutline: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-base-2\",\n\t\tbgClassName:\n\t\t\t\"border border-bruv-neutral shadow-xs group-hover/btn:bg-bruv-subtle group-active/btn:bg-bruv-subtle\",\n\t\ttext: \"text-bruv-primary\",\n\t},\n\tsecondary: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-subtle\",\n\t\tbgClassName: \"group-hover/btn:bg-bruv-subtle/70\",\n\t\ttext: \"text-bruv-primary\",\n\t},\n\ttransparent: {\n\t\tactive: false,\n\t\tbg: \"\",\n\t\tbgClassName:\n\t\t\t\"group-hover/btn:bg-bruv-subtle group-active/btn:bg-bruv-subtle\",\n\t\ttext: \"text-bruv-secondary\",\n\t},\n\tdanger: {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-danger\",\n\t\tbgClassName:\n\t\t\t\"border border-bruv-danger shadow-xs group-hover/btn:bg-bruv-danger-strong group-active/btn:bg-bruv-danger-strong\",\n\t\ttext: \"text-bruv-danger-on\",\n\t},\n\t\"danger-light\": {\n\t\tactive: true,\n\t\tbg: \"bg-bruv-danger-subtle\",\n\t\tbgClassName:\n\t\t\t\"group-hover/btn:bg-bruv-danger/30 group-active/btn:bg-bruv-danger/50\",\n\t\ttext: \"text-bruv-danger\",\n\t},\n} as const\n\nconst sizeStyles = {\n\txs: { height: \"h-6\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-6\" },\n\tsm: { height: \"h-7\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-7\" },\n\tmd: { height: \"h-8\", padding: \"px-2\", textPadding: \"px-1\", icon: \"w-8\" },\n} as const\n\nexport type ButtonVariant = keyof typeof variantConfig\nexport type ButtonSize = keyof typeof sizeStyles\n\nexport interface ButtonProps extends ComponentProps<typeof BaseButton> {\n\t/** Visual style variant */\n\tvariant?: ButtonVariant\n\t/** Size of the button */\n\tsize?: ButtonSize\n\t/** Icon element rendered before the label */\n\ticonLeft?: ReactNode\n\t/** Icon element rendered after the label */\n\ticonRight?: ReactNode\n\t/** Free-form content rendered after the label, before iconRight */\n\ttrailing?: ReactNode\n\t/** Show a loading spinner overlay */\n\tloading?: boolean\n}\n\n/**\n * Button component built on Base UI with Tailwind CSS styling.\n *\n * All variants use an animated hover layer for consistent press/hover\n * feedback. The layer handles bg, border, and shadow - the outer button\n * is just a layout shell.\n */\nexport const Button = forwardRef<HTMLElement, ButtonProps>(function Button(\n\t{\n\t\tvariant = \"outline\",\n\t\tsize = \"md\",\n\t\ticonLeft,\n\t\ticonRight,\n\t\ttrailing,\n\t\tloading = false,\n\t\tdisabled,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst config = variantConfig[variant]\n\tconst s = sizeStyles[size]\n\tconst isIconOnly = !children && !iconRight\n\tconst sizeClass = isIconOnly\n\t\t? cn(s.height, s.icon)\n\t\t: cn(s.height, s.padding, \"w-fit\")\n\n\treturn (\n\t\t<BaseButton\n\t\t\tref={ref}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/btn relative inline-flex min-w-fit cursor-pointer items-center justify-center\",\n\t\t\t\t\"rounded-bruv-md text-bruv-base whitespace-pre select-none\",\n\t\t\t\t\"ring-bruv-focus outline-none focus-visible:ring-2 focus-visible:ring-offset-2 \",\n\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\tconfig.text,\n\t\t\t\tsizeClass,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{/* Hover/bg layer */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute rounded-[inherit]\",\n\t\t\t\t\tconfig.bg,\n\t\t\t\t\tconfig.bgClassName,\n\t\t\t\t\tconfig.active ? \"opacity-100 inset-0\" : \"opacity-0 inset-1\",\n\t\t\t\t\t!disabled && [\n\t\t\t\t\t\t\"transition-[inset,opacity,background-color] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\t\"group-hover/btn:inset-0 group-hover/btn:opacity-100\",\n\t\t\t\t\t\t\"group-active/btn:inset-px\",\n\t\t\t\t\t],\n\t\t\t\t)}\n\t\t\t/>\n\n\t\t\t{iconLeft && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] size-5 shrink-0 flex items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\tloading && \"opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{iconLeft}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{children && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] inline\",\n\t\t\t\t\t\ts.textPadding,\n\t\t\t\t\t\tloading && \"opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{trailing && (\n\t\t\t\t<span className={cn(\"relative z-[1] ml-3\", loading && \"opacity-0\")}>\n\t\t\t\t\t{trailing}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{iconRight && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] size-5 shrink-0 flex items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\tloading && \"opacity-0\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{iconRight}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{loading && (\n\t\t\t\t<span className=\"absolute inset-0 z-[2] flex items-center justify-center\">\n\t\t\t\t\t<Spinner showDots={false} size=\"sm\" />\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</BaseButton>\n\t)\n})\n","import { forwardRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { PixelSpinner } from \"./pixel-spinner\"\nimport type { PixelSpinnerVariant } from \"./pixel-spinner\"\n\nexport interface SpinnerProps {\n\t/** Text label shown next to the spinner. */\n\tlabel?: string\n\t/** Show the animated dots after the label. */\n\tshowDots?: boolean\n\t/** Show the pixel spinner glyph. */\n\tshowSpinner?: boolean\n\t/** Size variant. */\n\tsize?: \"sm\" | \"md\"\n\t/** Animation variant for the pixel spinner. Defaults to `wave`. */\n\tvariant?: PixelSpinnerVariant\n\tclassName?: string\n}\n\nconst spinnerPxBySize = {\n\tsm: 10,\n\tmd: 12,\n} as const\n\n/**\n * Text loading indicator with a 3x3 pixel spinner and animated dots.\n *\n * Uses `PixelSpinner` for the animated glyph and a CSS animation to cycle\n * an animated dots suffix on the label text.\n */\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(\n\tfunction Spinner(\n\t\t{\n\t\t\tlabel,\n\t\t\tshowDots = true,\n\t\t\tshowSpinner = true,\n\t\t\tsize = \"md\",\n\t\t\tvariant = \"wave\",\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst textSize = size === \"sm\" ? \"text-bruv-sm\" : \"text-[13px]\"\n\t\tconst spinnerPx = spinnerPxBySize[size]\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"inline-flex items-center gap-1.5\", className)}\n\t\t\t>\n\t\t\t\t{showSpinner && (\n\t\t\t\t\t<PixelSpinner variant={variant} size={spinnerPx} duration={1.2} />\n\t\t\t\t)}\n\t\t\t\t{label && (\n\t\t\t\t\t<span className={cn(\"text-current\", textSize)}>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\t{showDots && (\n\t\t\t\t\t\t\t<span className=\"after:animate-bruv-dot-cycle inline-block w-[2ch] text-left after:content-['.']\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t)\n\t},\n)\n","import { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// 3x3 Pixel Spinner\n//\n// A square pixel spinner with multiple animation variants. All 9 cells are\n// animated — the variant determines the pattern.\n//\n// Grid position indices:\n// 0 1 2\n// 3 4 5\n// 6 7 8\n// ---------------------------------------------------------------------------\n\n/**\n * Perimeter ring (clockwise from top-left), excluding center (4).\n * Used by variants that rotate around the edge.\n */\nconst RING_ORDER = [0, 1, 2, 5, 8, 7, 6, 3] as const\n\n/**\n * Diagonal sweep order (top-left to bottom-right, anti-diagonal lines).\n * Cells on the same anti-diagonal share the same index.\n * 0: top-left only\n * 1: anti-diagonal through (0,1) & (1,0)\n * ...\n * 4: bottom-right only\n */\nconst DIAGONAL_INDEX = [0, 1, 2, 1, 2, 3, 2, 3, 4] as const\n\nexport type PixelSpinnerVariant =\n\t/** One dim cell rotates around a bright ring; center bright */\n\t| \"hole\"\n\t/** Trail of 5 fading cells chases around the ring; center dim */\n\t| \"trail\"\n\t/** Diagonal wave sweeps from top-left to bottom-right */\n\t| \"wave\"\n\t/** Rings expand outward: center to middle to corners, repeating */\n\t| \"radiate\"\n\t/** All cells pulse together */\n\t| \"pulse\"\n\t/** All cells flicker independently (TV static) */\n\t| \"static\"\n\nexport type PixelSpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\"\n\nconst sizeMap: Record<PixelSpinnerSize, number> = {\n\txs: 10,\n\tsm: 14,\n\tmd: 20,\n\tlg: 32,\n}\n\nexport interface PixelSpinnerProps {\n\t/** Animation variant */\n\tvariant?: PixelSpinnerVariant\n\t/**\n\t * Size preset or raw px value.\n\t * Presets: `xs` = 10px, `sm` = 14px, `md` = 20px, `lg` = 32px.\n\t * Default is `xs`.\n\t */\n\tsize?: PixelSpinnerSize | number\n\t/** Gap between pixels as a fraction of pixel size (0-1). Default 0.25. */\n\tgap?: number\n\t/** Cycle duration in seconds. Default 1.2. */\n\tduration?: number\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Keyframe injection — done once per page, shared across all spinners\n// ---------------------------------------------------------------------------\n\nlet styleInjected = false\nfunction injectKeyframes() {\n\tif (styleInjected) return\n\tif (typeof document === \"undefined\") return\n\n\tconst css = `\n@keyframes pxs-ring-on {\n 0% { opacity: var(--hi); }\n 12.5%, 100% { opacity: var(--lo); }\n}\n@keyframes pxs-ring-off {\n 0% { opacity: var(--lo); }\n 12.5%, 100% { opacity: var(--hi); }\n}\n@keyframes pxs-trail-5 {\n 0% { opacity: var(--hi); }\n 12.5% { opacity: 0.75; }\n 25% { opacity: var(--mid); }\n 37.5% { opacity: 0.25; }\n 50% { opacity: var(--lo); }\n 100% { opacity: var(--lo); }\n}\n@keyframes pxs-wave {\n 0%, 100% { opacity: var(--lo); }\n 40%, 60% { opacity: var(--hi); }\n}\n@keyframes pxs-radiate {\n 0%, 100% { opacity: var(--lo); }\n 20%, 40% { opacity: var(--hi); }\n}\n@keyframes pxs-pulse {\n 0%, 100% { opacity: var(--lo); }\n 50% { opacity: var(--hi); }\n}\n@keyframes pxs-flicker-a { 0%, 100% { opacity: var(--hi); } 33% { opacity: var(--lo); } 66% { opacity: var(--mid); } }\n@keyframes pxs-flicker-b { 0%, 100% { opacity: var(--lo); } 25% { opacity: var(--hi); } 75% { opacity: var(--mid); } }\n@keyframes pxs-flicker-c { 0%, 100% { opacity: var(--mid); } 40% { opacity: var(--hi); } 80% { opacity: var(--lo); } }\n@media (prefers-reduced-motion: reduce) {\n .pxs-cell { animation: none !important; opacity: var(--mid) !important; }\n}\n`\n\tconst style = document.createElement(\"style\")\n\tstyle.setAttribute(\"data-pxs\", \"\")\n\tstyle.textContent = css\n\tdocument.head.appendChild(style)\n\tstyleInjected = true\n}\n\n// ---------------------------------------------------------------------------\n// Per-cell animation resolution\n// ---------------------------------------------------------------------------\n\n/** Returns a CSS `animation` shorthand for the given cell and variant. */\nfunction getCellAnim(\n\tvariant: PixelSpinnerVariant,\n\tcellIndex: number,\n\tduration: number,\n): string | null {\n\tconst d = `${duration}s`\n\n\tswitch (variant) {\n\t\tcase \"hole\": {\n\t\t\t// Center stays bright, perimeter cells take turns being dim\n\t\t\tif (cellIndex === 4) return null\n\t\t\tconst ringIndex = RING_ORDER.indexOf(\n\t\t\t\tcellIndex as 0 | 1 | 2 | 3 | 5 | 6 | 7 | 8,\n\t\t\t)\n\t\t\tconst delay = -(ringIndex / 8) * duration\n\t\t\treturn `pxs-ring-off ${d} ${delay.toFixed(3)}s steps(1) infinite`\n\t\t}\n\t\tcase \"trail\": {\n\t\t\t// Trail of 5 cells chases around the ring\n\t\t\tif (cellIndex === 4) return null\n\t\t\tconst ringIndex = RING_ORDER.indexOf(\n\t\t\t\tcellIndex as 0 | 1 | 2 | 3 | 5 | 6 | 7 | 8,\n\t\t\t)\n\t\t\tconst delay = -(ringIndex / 8) * duration\n\t\t\treturn `pxs-trail-5 ${d} ${delay.toFixed(3)}s linear infinite`\n\t\t}\n\t\tcase \"wave\": {\n\t\t\t// Anti-diagonal sweep: each diagonal peaks at a different time\n\t\t\tconst diag = DIAGONAL_INDEX[cellIndex] ?? 0\n\t\t\t// 5 diagonals → stagger across 80% of the cycle, 20% gap between sweeps\n\t\t\tconst delay = -(diag / 5) * duration\n\t\t\treturn `pxs-wave ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t\tcase \"radiate\": {\n\t\t\t// Center → middle cross (not in 3x3 so we use edges: 1,3,5,7) → corners (0,2,6,8)\n\t\t\tconst ringTier =\n\t\t\t\tcellIndex === 4 ? 0 : [1, 3, 5, 7].includes(cellIndex) ? 1 : 2\n\t\t\tconst delay = -(ringTier / 3) * duration\n\t\t\treturn `pxs-radiate ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t\tcase \"pulse\": {\n\t\t\t// Subtle stagger so the pulse has a gentle ripple\n\t\t\tconst delay = -(cellIndex / 9) * duration * 0.3\n\t\t\treturn `pxs-pulse ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t\tcase \"static\": {\n\t\t\tconst anims = [\"pxs-flicker-a\", \"pxs-flicker-b\", \"pxs-flicker-c\"]\n\t\t\tconst anim = anims[cellIndex % 3]\n\t\t\tconst delay = -((cellIndex * 0.17) % 1) * duration\n\t\t\treturn `${anim} ${d} ${delay.toFixed(3)}s ease-in-out infinite`\n\t\t}\n\t}\n}\n\n/** Returns the resting opacity for a non-animated cell in a given variant. */\nfunction getRestOpacity(\n\tvariant: PixelSpinnerVariant,\n\tcellIndex: number,\n): number {\n\t// Only hole/trail have a non-animated center\n\tif (cellIndex !== 4) return 0\n\tif (variant === \"hole\") return 1 // bright center\n\tif (variant === \"trail\") return 0 // invisible center\n\treturn 0\n}\n\n// ---------------------------------------------------------------------------\n// PixelSpinner\n// ---------------------------------------------------------------------------\n\n/**\n * A 3x3 pixel-grid spinner with configurable animation variants.\n *\n * All 9 cells render; the `variant` controls how they animate:\n *\n * - `hole` One dim cell rotates around a bright ring (center bright)\n * - `trail` A fading 5-cell trail chases around the ring\n * - `wave` Anti-diagonal wave sweeps top-left to bottom-right\n * - `radiate` Rings expand outward: center to edges to corners\n * - `pulse` All cells breathe together with a subtle ripple\n * - `static` Cells flicker independently (TV static)\n */\nexport function PixelSpinner({\n\tvariant = \"wave\",\n\tsize = \"xs\",\n\tgap = 0.25,\n\tduration = 1.2,\n\tclassName,\n}: PixelSpinnerProps) {\n\tif (typeof document !== \"undefined\") injectKeyframes()\n\n\tconst px = typeof size === \"number\" ? size : sizeMap[size]\n\n\t// Compute pixel + gap layout\n\t// Total size = 3 * pixel + 2 * (pixel * gap), so pixel = px / (3 + 2*gap)\n\tconst pixel = px / (3 + 2 * gap)\n\tconst step = pixel * (1 + gap)\n\n\tconst cells = Array.from({ length: 9 }, (_, i) => ({\n\t\trow: Math.floor(i / 3),\n\t\tcol: i % 3,\n\t\tcellIndex: i,\n\t}))\n\n\treturn (\n\t\t<span\n\t\t\taria-label=\"Loading\"\n\t\t\trole=\"status\"\n\t\t\tclassName={cn(\"inline-block text-current\", className)}\n\t\t\tstyle={{\n\t\t\t\twidth: px,\n\t\t\t\theight: px,\n\t\t\t\t// CSS vars consumed by the keyframes\n\t\t\t\t[\"--lo\" as string]: \"0\",\n\t\t\t\t[\"--mid\" as string]: \"0.5\",\n\t\t\t\t[\"--hi\" as string]: \"1\",\n\t\t\t}}\n\t\t>\n\t\t\t<svg\n\t\t\t\twidth={px}\n\t\t\t\theight={px}\n\t\t\t\tviewBox={`0 0 ${px} ${px}`}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t{cells.map(({ row, col, cellIndex }) => {\n\t\t\t\t\tconst anim = getCellAnim(variant, cellIndex, duration)\n\t\t\t\t\tconst restOpacity = getRestOpacity(variant, cellIndex)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tkey={cellIndex}\n\t\t\t\t\t\t\tclassName=\"pxs-cell\"\n\t\t\t\t\t\t\tx={col * step}\n\t\t\t\t\t\t\ty={row * step}\n\t\t\t\t\t\t\twidth={pixel}\n\t\t\t\t\t\t\theight={pixel}\n\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\topacity: restOpacity,\n\t\t\t\t\t\t\t\tanimation: anim ?? \"none\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</svg>\n\t\t</span>\n\t)\n}\n","import { forwardRef, type ReactNode, type ComponentProps } from \"react\"\nimport { MagnifyingGlassIcon, CheckIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Menu.Panel — Popup container\n// ---------------------------------------------------------------------------\n\nexport interface MenuPanelProps extends ComponentProps<\"div\"> {\n\t/** Minimum width utility class */\n\tminWidth?: string\n}\n\nconst MenuPanel = forwardRef<HTMLDivElement, MenuPanelProps>(function MenuPanel(\n\t{ minWidth, className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex flex-col overflow-hidden bg-bruv-base-2 border border-bruv-neutral rounded-bruv-lg shadow-md p-1\",\n\t\t\t\tminWidth,\n\t\t\t\t// Animation (works with Base UI data attributes)\n\t\t\t\t\"origin-[var(--transform-origin)] will-change-[transform,opacity]\",\n\t\t\t\t\"transition-[transform,scale,opacity] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\"data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0\",\n\t\t\t\t\"data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0 data-[ending-style]:duration-150\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Menu.Item — Option row with hover overlay + press squish\n// ---------------------------------------------------------------------------\n\nexport interface MenuItemProps extends ComponentProps<\"div\"> {\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\t/** Indicator element rendered after the label (e.g. checkmark) */\n\tindicator?: ReactNode\n\t/** Danger styling (red text) */\n\tvariant?: \"default\" | \"danger\"\n}\n\nconst MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(function MenuItem(\n\t{ icon, indicator, variant = \"default\", className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"group relative flex items-center gap-2 px-2 py-1.5 text-bruv-base cursor-pointer rounded-bruv-sm select-none outline-none\",\n\t\t\t\tvariant === \"danger\"\n\t\t\t\t\t? \"text-bruv-danger data-[highlighted]:text-bruv-danger\"\n\t\t\t\t\t: \"text-bruv-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{/* Hover + press overlay */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"absolute inset-0 rounded-[inherit] bg-bruv-subtle opacity-0\",\n\t\t\t\t\t// Base UI Menu + Combobox\n\t\t\t\t\t\"group-data-[highlighted]:opacity-100\",\n\t\t\t\t\t// Base UI Select\n\t\t\t\t\t\"group-data-[selected]:opacity-100\",\n\t\t\t\t\t// cmdk\n\t\t\t\t\t\"group-data-[selected=true]:opacity-100\",\n\t\t\t\t\t// Squish on press\n\t\t\t\t\t\"transition-[inset] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\"group-active:inset-px\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t{icon && (\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\tvariant === \"danger\"\n\t\t\t\t\t\t\t? \"text-bruv-danger\"\n\t\t\t\t\t\t\t: \"text-bruv-tertiary group-data-[highlighted]:text-bruv-primary group-data-[selected]:text-bruv-primary group-data-[selected=true]:text-bruv-primary\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{icon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{children}\n\t\t\t{indicator && (\n\t\t\t\t<span className=\"text-bruv-accent relative z-[1] ml-auto [&>svg]:size-4\">\n\t\t\t\t\t{indicator}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Menu.ItemIndicator — Checkmark icon for selected items\n// ---------------------------------------------------------------------------\n\nexport interface MenuItemIndicatorProps {\n\tclassName?: string\n}\n\nconst MenuItemIndicator = forwardRef<HTMLSpanElement, MenuItemIndicatorProps>(\n\tfunction MenuItemIndicator({ className }, ref) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative z-[1] ml-auto text-bruv-secondary [&>svg]:size-4\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<CheckIcon />\n\t\t\t</span>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.List — Scrollable list container\n// ---------------------------------------------------------------------------\n\nexport interface MenuListProps extends ComponentProps<\"div\"> {}\n\nconst MenuList = forwardRef<HTMLDivElement, MenuListProps>(function MenuList(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex max-h-[min(var(--available-height),280px)] flex-col gap-0.5 overflow-y-auto overscroll-contain outline-none\",\n\t\t\t\t\"[scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Menu.Separator — Divider line\n// ---------------------------------------------------------------------------\n\nexport interface MenuSeparatorProps extends ComponentProps<\"div\"> {}\n\nconst MenuSeparator = forwardRef<HTMLDivElement, MenuSeparatorProps>(\n\tfunction MenuSeparator({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"my-1 border-t border-bruv-neutral\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.GroupLabel — Section heading\n// ---------------------------------------------------------------------------\n\nexport interface MenuGroupLabelProps extends ComponentProps<\"div\"> {}\n\nconst MenuGroupLabel = forwardRef<HTMLDivElement, MenuGroupLabelProps>(\n\tfunction MenuGroupLabel({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"px-2 py-1.5 text-bruv-sm font-medium text-bruv-tertiary select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.Positioner — z-index wrapper\n// ---------------------------------------------------------------------------\n\nexport interface MenuPositionerProps extends ComponentProps<\"div\"> {}\n\nconst MenuPositioner = forwardRef<HTMLDivElement, MenuPositionerProps>(\n\tfunction MenuPositioner({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"z-50 outline-none\", className)} {...props}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.SearchInput — Search field container (icon + input slot)\n// ---------------------------------------------------------------------------\n\nexport interface MenuSearchInputProps extends ComponentProps<\"div\"> {}\n\nconst MenuSearchInput = forwardRef<HTMLDivElement, MenuSearchInputProps>(\n\tfunction MenuSearchInput({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"mb-0.5 flex items-center gap-2 rounded-bruv-sm px-2 py-1.5\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<MagnifyingGlassIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Menu.Empty — Empty state message\n// ---------------------------------------------------------------------------\n\nexport interface MenuEmptyProps extends ComponentProps<\"div\"> {}\n\nconst MenuEmpty = forwardRef<HTMLDivElement, MenuEmptyProps>(function MenuEmpty(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"text-bruv-secondary px-2 py-4 text-center text-bruv-base empty:hidden\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Menu = {\n\tPanel: MenuPanel,\n\tItem: MenuItem,\n\tItemIndicator: MenuItemIndicator,\n\tList: MenuList,\n\tSeparator: MenuSeparator,\n\tGroupLabel: MenuGroupLabel,\n\tPositioner: MenuPositioner,\n\tSearchInput: MenuSearchInput,\n\tEmpty: MenuEmpty,\n}\n","import { forwardRef, type ComponentPropsWithoutRef } from \"react\"\nimport { Switch } from \"@base-ui/react/switch\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: { track: \"w-9 h-5\", thumb: \"h-4 w-4 group-active/toggle:w-5\" },\n\tmd: { track: \"w-11 h-6\", thumb: \"h-5 w-5 group-active/toggle:w-6\" },\n} as const\n\nexport type ToggleSize = keyof typeof sizeStyles\n\nexport interface ToggleProps extends ComponentPropsWithoutRef<\n\ttypeof Switch.Root\n> {\n\t/** Size of the toggle. */\n\tsize?: ToggleSize\n}\n\n/**\n * Toggle switch component built on Base UI Switch with Tailwind CSS styling.\n */\nexport const Toggle = forwardRef<HTMLButtonElement, ToggleProps>(\n\tfunction Toggle(\n\t\t{\n\t\t\tchecked,\n\t\t\tdefaultChecked,\n\t\t\tonCheckedChange,\n\t\t\tdisabled,\n\t\t\tsize = \"md\",\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\n\t\treturn (\n\t\t\t<Switch.Root\n\t\t\t\tref={ref}\n\t\t\t\tchecked={checked}\n\t\t\t\tdefaultChecked={defaultChecked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/toggle relative inline-flex shrink-0 cursor-pointer items-center rounded-full\",\n\t\t\t\t\t\"bg-bruv-subtle data-[checked]:bg-bruv-accent\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"transition-colors duration-150 ease-bruv-out-expo\",\n\t\t\t\t\tdisabled && \"opacity-50 pointer-events-none\",\n\t\t\t\t\ts.track,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<Switch.Thumb\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"block rounded-full bg-bruv-accent-on shadow-sm\",\n\t\t\t\t\t\t\"translate-x-0.5 transition-all duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\tsize === \"sm\" &&\n\t\t\t\t\t\t\t\"data-[checked]:translate-x-[18px] data-[checked]:group-active/toggle:translate-x-[14px]\",\n\t\t\t\t\t\tsize === \"md\" &&\n\t\t\t\t\t\t\t\"data-[checked]:translate-x-[22px] data-[checked]:group-active/toggle:translate-x-[18px]\",\n\t\t\t\t\t\ts.thumb,\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</Switch.Root>\n\t\t)\n\t},\n)\n","import {\n\tforwardRef,\n\ttype ComponentPropsWithoutRef,\n\ttype ReactNode,\n} from \"react\"\nimport { Checkbox as BaseCheckbox } from \"@base-ui/react/checkbox\"\nimport { CheckIcon, MinusIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: { root: \"size-4 rounded-[4px]\", icon: \"size-3\", label: \"text-bruv-sm\" },\n\tmd: {\n\t\troot: \"size-[18px] rounded-[5px]\",\n\t\ticon: \"size-3.5\",\n\t\tlabel: \"text-bruv-base\",\n\t},\n} as const\n\nexport type CheckboxSize = keyof typeof sizeStyles\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CheckboxProps extends ComponentPropsWithoutRef<\n\ttypeof BaseCheckbox.Root\n> {\n\t/** Size of the checkbox. */\n\tsize?: CheckboxSize\n\t/** Optional label rendered beside the checkbox. */\n\tlabel?: ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// Checkbox\n// ---------------------------------------------------------------------------\n\n/**\n * Checkbox component built on Base UI Checkbox with Tailwind CSS styling.\n *\n * Supports controlled/uncontrolled usage, indeterminate state, disabled\n * state, and an optional label. The label is clickable and toggles the\n * checkbox. An expanded hit area (32px) makes the checkbox easier to click.\n *\n * Checked state uses accent color. Indeterminate state uses neutral gray\n * to visually distinguish it from a deliberate selection.\n */\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(\n\tfunction Checkbox(\n\t\t{\n\t\t\tchecked,\n\t\t\tdefaultChecked,\n\t\t\tonCheckedChange,\n\t\t\tindeterminate = false,\n\t\t\tdisabled = false,\n\t\t\trequired,\n\t\t\tsize = \"md\",\n\t\t\tlabel,\n\t\t\tname,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\n\t\tconst root = (\n\t\t\t<BaseCheckbox.Root\n\t\t\t\tref={ref}\n\t\t\t\tchecked={checked}\n\t\t\t\tdefaultChecked={defaultChecked}\n\t\t\t\tonCheckedChange={onCheckedChange}\n\t\t\t\tindeterminate={indeterminate}\n\t\t\t\tdisabled={disabled}\n\t\t\t\trequired={required}\n\t\t\t\tname={name}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/checkbox relative inline-flex shrink-0 items-center justify-center\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"transition-colors duration-150 ease-out\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t// Expanded 32px hit area via ::before pseudo-element\n\t\t\t\t\t\"before:absolute before:inset-1/2 before:size-8 before:-translate-1/2\",\n\t\t\t\t\tdisabled\n\t\t\t\t\t\t? \"pointer-events-none cursor-not-allowed border border-bruv-neutral bg-bruv-subtle\"\n\t\t\t\t\t\t: \"cursor-pointer border border-bruv-neutral bg-bruv-base-2 data-[checked]:border-bruv-accent data-[checked]:bg-bruv-accent data-[indeterminate]:border-bruv-neutral-strong data-[indeterminate]:bg-bruv-subtle\",\n\t\t\t\t\ts.root,\n\t\t\t\t\t!label && className,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseCheckbox.Indicator\n\t\t\t\t\tkeepMounted\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-center justify-center\",\n\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t? \"text-bruv-tertiary\"\n\t\t\t\t\t\t\t: \"data-[checked]:text-bruv-accent-on data-[indeterminate]:text-bruv-secondary\",\n\t\t\t\t\t\t// Default visible state for checked/indeterminate\n\t\t\t\t\t\t\"scale-100 opacity-100\",\n\t\t\t\t\t\t// Hidden while unchecked (stable state, no transition running)\n\t\t\t\t\t\t\"data-[unchecked]:scale-50 data-[unchecked]:opacity-0\",\n\t\t\t\t\t\t// Briefly applied by Base UI during enter/exit so the\n\t\t\t\t\t\t// transition has a start/end point.\n\t\t\t\t\t\t\"data-[starting-style]:scale-50 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-50 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t\"transition-[scale,opacity] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{indeterminate ? (\n\t\t\t\t\t\t<MinusIcon className={s.icon} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<CheckIcon className={s.icon} />\n\t\t\t\t\t)}\n\t\t\t\t</BaseCheckbox.Indicator>\n\t\t\t</BaseCheckbox.Root>\n\t\t)\n\n\t\tif (!label) return root\n\n\t\treturn (\n\t\t\t<label\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex items-center gap-2 select-none\",\n\t\t\t\t\tdisabled ? \"cursor-not-allowed\" : \"cursor-pointer\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{root}\n\t\t\t\t<span\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\ts.label,\n\t\t\t\t\t\tdisabled ? \"text-bruv-tertiary\" : \"text-bruv-primary\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{label}\n\t\t\t\t</span>\n\t\t\t</label>\n\t\t)\n\t},\n)\n","import { forwardRef, useState } from \"react\"\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\"\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: \"size-6\",\n\tmd: \"size-7\",\n} as const\n\nexport type ColorPickerSize = keyof typeof sizeStyles\n\nexport interface ColorPickerOption {\n\treadonly value: string\n\treadonly label: string\n\treadonly color: string\n}\n\nexport interface ColorPickerProps {\n\treadonly options: readonly ColorPickerOption[]\n\treadonly label?: string\n\treadonly value?: string\n\treadonly defaultValue?: string\n\treadonly onValueChange?: (value: string) => void\n\treadonly size?: ColorPickerSize\n\treadonly className?: string\n\treadonly disabled?: boolean\n\treadonly \"aria-label\"?: string\n}\n\nexport const ColorPicker = forwardRef<HTMLDivElement, ColorPickerProps>(\n\tfunction ColorPicker(\n\t\t{\n\t\t\toptions,\n\t\t\tlabel,\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\tsize = \"md\",\n\t\t\tclassName,\n\t\t\tdisabled,\n\t\t\t\"aria-label\": ariaLabel,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internalValue, setInternalValue] = useState(\n\t\t\t() => defaultValue ?? options[0]?.value ?? \"\",\n\t\t)\n\t\tconst isControlled = controlledValue !== undefined\n\t\tconst activeValue = isControlled ? controlledValue : internalValue\n\t\tconst groupLabel = label ?? ariaLabel\n\n\t\tfunction handleValueChange(next: string) {\n\t\t\tif (!isControlled) setInternalValue(next)\n\t\t\tonValueChange?.(next)\n\t\t}\n\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex flex-col gap-2\", className)}>\n\t\t\t\t{label ? (\n\t\t\t\t\t<span className=\"text-bruv-secondary text-bruv-sm font-medium\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t\t<BaseRadioGroup\n\t\t\t\t\tvalue={activeValue}\n\t\t\t\t\tonValueChange={handleValueChange}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\taria-label={groupLabel}\n\t\t\t\t\tclassName=\"flex flex-wrap gap-2\"\n\t\t\t\t>\n\t\t\t\t\t{options.map(option => (\n\t\t\t\t\t\t<BaseRadio.Root\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\taria-label={option.label}\n\t\t\t\t\t\t\ttitle={option.label}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\t\t\t\t\"shrink-0 cursor-pointer rounded-full outline-none transition-shadow\",\n\t\t\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bruv-base-1\",\n\t\t\t\t\t\t\t\t\"ring-1 ring-bruv-neutral hover:ring-bruv-neutral-strong\",\n\t\t\t\t\t\t\t\t\"data-[checked]:ring-2 data-[checked]:ring-bruv-inverse data-[checked]:ring-offset-2 data-[checked]:ring-offset-bruv-base-1\",\n\t\t\t\t\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={{ backgroundColor: option.color }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</BaseRadioGroup>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst variantStyles = {\n\tdefault: \"bg-bruv-base-1 rounded-bruv-lg shadow-xs ring-1 ring-bruv-neutral\",\n\tnested:\n\t\t\"bg-bruv-base-2 rounded-bruv-sm shadow-sm ring-1 ring-bruv-neutral/50\",\n} as const\n\nexport type CardVariant = keyof typeof variantStyles\n\nexport interface CardProps {\n\t/** Visual style variant */\n\tvariant?: CardVariant\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardContentProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardHeaderProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardBodyProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface CardSectionProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Inner wrapper that provides consistent padding inside a Card.\n * Put Card.Header, Card.Body, nested Cards, etc. inside this.\n */\nconst CardContent = forwardRef<HTMLDivElement, CardContentProps>(\n\tfunction CardContent({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex flex-col gap-1 p-1\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nconst CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(\n\tfunction CardHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"px-4 py-3\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nconst CardBody = forwardRef<HTMLDivElement, CardBodyProps>(function CardBody(\n\t{ className, children },\n\tref,\n) {\n\treturn (\n\t\t<div ref={ref} className={cn(\"p-4\", className)}>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n\nconst CardSection = forwardRef<HTMLDivElement, CardSectionProps>(\n\tfunction CardSection({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-b border-bruv-neutral last:border-b-0 p-4\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n/**\n * Card compound component.\n *\n * Use Card.Content as the first child to get consistent inner padding,\n * then place Card.Header, Card.Body, Card.Section, or nested Cards inside it.\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n\t{ variant = \"default\", className, children },\n\tref,\n) {\n\treturn (\n\t\t<div ref={ref} className={cn(variantStyles[variant], className)}>\n\t\t\t{children}\n\t\t</div>\n\t)\n}) as ReturnType<typeof forwardRef<HTMLDivElement, CardProps>> & {\n\tContent: typeof CardContent\n\tHeader: typeof CardHeader\n\tBody: typeof CardBody\n\tSection: typeof CardSection\n}\n\nCard.Content = CardContent\nCard.Header = CardHeader\nCard.Body = CardBody\nCard.Section = CardSection\n","import type { ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Hover, HoverGroup } from \"../hover\"\n\nconst sizeStyles = {\n\tsm: \"h-7 px-1.5\",\n\tmd: \"h-8 px-1.5\",\n} as const\n\nexport type NavLinkSize = keyof typeof sizeStyles\n\nexport interface NavLinksProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface NavLinkProps {\n\t/** Whether this link is the currently active/selected item */\n\tactive?: boolean\n\t/** Optional icon rendered before the label */\n\ticon?: ReactNode\n\t/** When provided, renders an <a> tag instead of <button> */\n\thref?: string\n\t/** Click handler */\n\tonClick?: () => void\n\t/** Size of the nav link */\n\tsize?: NavLinkSize\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Container for a horizontal group of navigation links.\n *\n * Wraps children in a HoverGroup so the sliding indicator\n * is shared across all NavLink items.\n */\nexport function NavLinks({ className, children }: NavLinksProps) {\n\treturn (\n\t\t<HoverGroup\n\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\tclassName={cn(\"gap-1 p-2 flex-nowrap\", className)}\n\t\t>\n\t\t\t{children}\n\t\t</HoverGroup>\n\t)\n}\n\n/**\n * Individual navigation link item.\n *\n * Inside a NavLinks (HoverGroup), automatically gets the shared sliding\n * indicator on hover and a press shrink effect on click.\n * Renders a `<button>` by default - when `href` is provided,\n * renders an `<a>` tag instead.\n */\nexport function NavLink({\n\tactive = false,\n\ticon,\n\thref,\n\tonClick,\n\tsize = \"md\",\n\tclassName,\n\tchildren,\n}: NavLinkProps) {\n\tconst Tag = href ? \"a\" : \"button\"\n\tconst tagProps = href\n\t\t? { href, onClick }\n\t\t: { type: \"button\" as const, onClick }\n\n\treturn (\n\t\t<Hover active={active} background=\"bg-bruv-subtle\" className={className}>\n\t\t\t<Tag\n\t\t\t\t{...tagProps}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center text-bruv-base font-medium cursor-pointer select-none whitespace-nowrap\",\n\t\t\t\t\t\"outline-none\",\n\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\tactive ? \"text-bruv-primary\" : \"text-bruv-secondary\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className=\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"px-1\">{children}</span>\n\t\t\t</Tag>\n\t\t</Hover>\n\t)\n}\n","import { forwardRef, type ComponentType, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Avatar } from \"../avatar\"\nimport {\n\tBreadcrumb,\n\ttype BreadcrumbItem,\n\ttype BreadcrumbOption,\n} from \"../breadcrumb\"\n\n// Generic link component type — accepts `to` or `href` + children + className\ntype LinkComponent = ComponentType<{\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}>\n\nfunction DefaultLink({\n\tto,\n\thref,\n\tclassName,\n\tchildren,\n}: {\n\tto?: string\n\thref?: string\n\tclassName?: string\n\tchildren?: ReactNode\n}) {\n\treturn (\n\t\t<a href={to ?? href} className={className}>\n\t\t\t{children}\n\t\t</a>\n\t)\n}\n\nexport interface AppHeaderProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/** @deprecated Use BreadcrumbOption instead */\nexport type AppHeaderBreadcrumbOption = BreadcrumbOption\n\n/** @deprecated Use BreadcrumbItem instead */\nexport type AppHeaderBreadcrumbItem = BreadcrumbItem\n\nexport interface AppHeaderBreadcrumbProps {\n\titems: BreadcrumbItem[]\n\t/** Optional leading logo/mark rendered before the first breadcrumb segment. */\n\tlogo?: ReactNode\n\t/** Optional href the logo links to. Defaults to \"/\". */\n\tlogoHref?: string\n\t/** Custom link component (e.g. TanStack Router's Link, Next.js Link, etc.). Defaults to <a>. */\n\tlinkComponent?: LinkComponent\n\tclassName?: string\n}\n\nexport interface AppHeaderActionsProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\nfunction Separator() {\n\treturn (\n\t\t<div className=\"flex w-4 shrink-0 items-center justify-center self-stretch\">\n\t\t\t<div className=\"bg-bruv-tertiary h-4 w-px rotate-[20deg] opacity-50\" />\n\t\t</div>\n\t)\n}\n\n/**\n * AppHeader breadcrumb — optionally renders a leading logo link followed by\n * breadcrumb segments. Delegates to the standalone Breadcrumb component for\n * segment rendering.\n */\nfunction AppHeaderBreadcrumb({\n\titems,\n\tlogo,\n\tlogoHref = \"/\",\n\tlinkComponent: LinkEl = DefaultLink,\n\tclassName,\n}: AppHeaderBreadcrumbProps) {\n\treturn (\n\t\t<nav className={cn(\"flex items-center\", className)}>\n\t\t\t{logo && (\n\t\t\t\t<>\n\t\t\t\t\t<LinkEl\n\t\t\t\t\t\tto={logoHref}\n\t\t\t\t\t\thref={logoHref}\n\t\t\t\t\t\tclassName=\"focus-visible:ring-bruv-focus flex size-8 shrink-0 items-center justify-center rounded outline-none focus-visible:ring-2 focus-visible:ring-offset-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{logo}\n\t\t\t\t\t</LinkEl>\n\t\t\t\t\t<Separator />\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t<Breadcrumb items={items} linkComponent={LinkEl} />\n\t\t</nav>\n\t)\n}\n\nconst AppHeaderActions = forwardRef<HTMLDivElement, AppHeaderActionsProps>(\n\tfunction AppHeaderActions({ children, className }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex items-center gap-2\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport const AppHeader = forwardRef<HTMLElement, AppHeaderProps>(\n\tfunction AppHeader({ children, className }, ref) {\n\t\treturn (\n\t\t\t<header\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex items-center justify-between px-3 py-2\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</header>\n\t\t)\n\t},\n) as ReturnType<typeof forwardRef<HTMLElement, AppHeaderProps>> & {\n\tBreadcrumb: typeof AppHeaderBreadcrumb\n\tActions: typeof AppHeaderActions\n\tAvatar: typeof Avatar\n}\n\nAppHeader.Breadcrumb = AppHeaderBreadcrumb\nAppHeader.Actions = AppHeaderActions\nAppHeader.Avatar = Avatar\n","import { forwardRef, useMemo } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type AvatarVariant = \"circle\" | \"square\"\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\"\nexport type AvatarColor = \"neutral\" | \"accent\" | \"danger\" | \"warn\" | \"success\"\n\nexport type AvatarGenerativePattern =\n\t| \"grid\"\n\t| \"symmetric\"\n\t| \"dense\"\n\t| \"quad\"\n\t| \"quad-dense\"\n\t| \"diagonal\"\n\t| \"sierpinski\"\n\n// ---------------------------------------------------------------------------\n// Style maps\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\txs: { outer: \"size-5\", text: \"text-[8px]\", px: 20 },\n\tsm: { outer: \"size-6\", text: \"text-[10px]\", px: 24 },\n\tmd: { outer: \"size-8\", text: \"text-bruv-sm\", px: 32 },\n\tlg: { outer: \"size-10\", text: \"text-bruv-base\", px: 40 },\n\txl: { outer: \"size-16\", text: \"text-bruv-lg\", px: 64 },\n} as const\n\nconst variantStyles = {\n\tcircle: \"rounded-full\",\n\tsquare: \"rounded-bruv-md\",\n} as const\n\nconst colorStyles = {\n\tneutral: \"bg-bruv-subtle text-bruv-primary\",\n\taccent: \"bg-bruv-accent text-bruv-accent-on\",\n\tdanger: \"bg-bruv-danger text-bruv-danger-on\",\n\twarn: \"bg-bruv-warn text-bruv-warn-on\",\n\tsuccess: \"bg-bruv-success text-bruv-success-on\",\n} as const\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface AvatarProps {\n\t/** Image URL */\n\tsrc?: string\n\t/** Fallback initials (1-2 characters) */\n\tinitials?: string\n\t/**\n\t * Seed string for generative pixel-grid fallback.\n\t * Used when no `src` or `initials` are provided.\n\t * Each seed produces a unique deterministic pattern and color.\n\t */\n\tseed?: string\n\t/**\n\t * Pattern variant for the generative fallback.\n\t * Only used when rendering from `seed`.\n\t */\n\tgenerativePattern?: AvatarGenerativePattern\n\t/** Alt text for the image */\n\talt?: string\n\t/** Shape variant */\n\tvariant?: AvatarVariant\n\t/** Size */\n\tsize?: AvatarSize\n\t/** Color preset — automatically sets matching background and text color */\n\tcolor?: AvatarColor\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Hash function — cyrb53 (53-bit, good distribution)\n// ---------------------------------------------------------------------------\n\nfunction cyrb53(str: string, seed = 0): number {\n\tlet h1 = 0xdeadbeef ^ seed\n\tlet h2 = 0x41c6ce57 ^ seed\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst ch = str.charCodeAt(i)\n\t\th1 = Math.imul(h1 ^ ch, 2654435761)\n\t\th2 = Math.imul(h2 ^ ch, 1597334677)\n\t}\n\th1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507)\n\th1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909)\n\th2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507)\n\th2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909)\n\treturn 4294967296 * (2097151 & h2) + (h1 >>> 0)\n}\n\nfunction hashValues(str: string): number[] {\n\treturn [cyrb53(str, 0), cyrb53(str, 1), cyrb53(str, 2), cyrb53(str, 3)]\n}\n\n// ---------------------------------------------------------------------------\n// Generative pattern grid\n// ---------------------------------------------------------------------------\n\ninterface GridConfig {\n\treadonly cols: number\n\treadonly rows: number\n\treadonly cells: readonly boolean[]\n}\n\n/**\n * Ensures a grid has at least `minFill` fraction of cells turned on.\n * If too sparse, force-enables cells using a secondary hash.\n */\nfunction ensureMinFill(\n\tcells: boolean[],\n\ttotal: number,\n\tminFill: number,\n\thash: number,\n): void {\n\tconst count = cells.filter(Boolean).length\n\tconst needed = Math.ceil(total * minFill)\n\tif (count >= needed) return\n\t// Turn on additional cells deterministically\n\tlet toAdd = needed - count\n\tlet bit = 0\n\tfor (let i = 0; i < total && toAdd > 0; i++) {\n\t\t// Walk cells in hash-scrambled order\n\t\tconst idx = (i * 7 + (hash & 0xf)) % total\n\t\tif (!cells[idx]) {\n\t\t\tcells[idx] = true\n\t\t\ttoAdd--\n\t\t}\n\t\tbit++\n\t}\n}\n\nfunction generateGrid(\n\tseed: string,\n\tpattern: AvatarGenerativePattern,\n): GridConfig {\n\tconst hashes = hashValues(seed)\n\tconst firstHash = hashes[0] ?? 0\n\tconst secondHash = hashes[1] ?? firstHash\n\tconst thirdHash = hashes[2] ?? firstHash\n\tconst hashAt = (index: number) => hashes[index % hashes.length] ?? firstHash\n\n\tswitch (pattern) {\n\t\tcase \"grid\": {\n\t\t\tconst cols = 5\n\t\t\tconst rows = 5\n\t\t\tconst cells: boolean[] = []\n\t\t\tfor (let i = 0; i < cols * rows; i++) {\n\t\t\t\tconst hash = hashAt(Math.floor(i / 26))\n\t\t\t\tcells.push(((hash >> (i % 26)) & 1) === 1)\n\t\t\t}\n\t\t\tensureMinFill(cells, cols * rows, 0.3, thirdHash)\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"symmetric\": {\n\t\t\t// 5x5 mirrored horizontally — generate left half + center, mirror right\n\t\t\tconst cols = 5\n\t\t\tconst rows = 5\n\t\t\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\t\tconst hash = hashAt(attempt)\n\t\t\t\tlet bit = 0\n\t\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\t\tfor (let x = 0; x <= 2; x++) {\n\t\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\t\tbit++\n\t\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fill = cells.filter(Boolean).length / (cols * rows)\n\t\t\t\tif (fill >= 0.3 && fill <= 0.8) return { cols, rows, cells }\n\t\t\t}\n\t\t\t// Fallback\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\tfor (let x = 0; x <= 2; x++) {\n\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"dense\": {\n\t\t\tconst cols = 7\n\t\t\tconst rows = 7\n\t\t\tconst cells: boolean[] = []\n\t\t\tfor (let i = 0; i < cols * rows; i++) {\n\t\t\t\tconst hash = hashAt(Math.floor(i / 26))\n\t\t\t\tcells.push(((hash >> (i % 26)) & 1) === 1)\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"quad\": {\n\t\t\t// 6x6 with 4-way symmetry: generate top-left quadrant, mirror H+V\n\t\t\t// Retry with different hash offsets if too sparse\n\t\t\tconst cols = 6\n\t\t\tconst rows = 6\n\t\t\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\t\tconst hash = hashAt(attempt)\n\t\t\t\tlet bit = 0\n\t\t\t\tfor (let y = 0; y < 3; y++) {\n\t\t\t\t\tfor (let x = 0; x < 3; x++) {\n\t\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\t\tbit++\n\t\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fill = cells.filter(Boolean).length / (cols * rows)\n\t\t\t\tif (fill >= 0.25 && fill <= 0.8) return { cols, rows, cells }\n\t\t\t}\n\t\t\t// Fallback: use first attempt regardless\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y < 3; y++) {\n\t\t\t\tfor (let x = 0; x < 3; x++) {\n\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"quad-dense\": {\n\t\t\t// 7x7 with 4-way symmetry: generate top-left quadrant + center, mirror H+V\n\t\t\tconst cols = 7\n\t\t\tconst rows = 7\n\t\t\tfor (let attempt = 0; attempt < 4; attempt++) {\n\t\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\t\tconst hash = hashAt(attempt)\n\t\t\t\tlet bit = 0\n\t\t\t\tfor (let y = 0; y <= 3; y++) {\n\t\t\t\t\tfor (let x = 0; x <= 3; x++) {\n\t\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\t\tbit++\n\t\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fill = cells.filter(Boolean).length / (cols * rows)\n\t\t\t\tif (fill >= 0.25 && fill <= 0.8) return { cols, rows, cells }\n\t\t\t}\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y <= 3; y++) {\n\t\t\t\tfor (let x = 0; x <= 3; x++) {\n\t\t\t\t\tconst on = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[y * cols + (cols - 1 - x)] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + x] = on\n\t\t\t\t\tcells[(rows - 1 - y) * cols + (cols - 1 - x)] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"diagonal\": {\n\t\t\t// 6x6 mirrored along main diagonal (top-left to bottom-right)\n\t\t\tconst cols = 6\n\t\t\tconst rows = 6\n\t\t\tconst cells: boolean[] = new Array(cols * rows).fill(false) as boolean[]\n\t\t\tconst hash = firstHash\n\t\t\tconst hash2 = secondHash\n\t\t\tlet bit = 0\n\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\tfor (let x = 0; x <= y; x++) {\n\t\t\t\t\tconst b1 = ((hash >> (bit % 26)) & 1) === 1\n\t\t\t\t\tconst b2 = ((hash2 >> (bit % 26)) & 1) === 1\n\t\t\t\t\tconst on = b1 || b2\n\t\t\t\t\tbit++\n\t\t\t\t\tcells[y * cols + x] = on\n\t\t\t\t\tcells[x * cols + y] = on\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\n\t\tcase \"sierpinski\": {\n\t\t\t// 7x7 Sierpinski-triangle-inspired — cell is ON if (row & col) === 0\n\t\t\t// but shifted/rotated by hash bits for variation\n\t\t\tconst cols = 7\n\t\t\tconst rows = 7\n\t\t\tconst hash = firstHash\n\t\t\tconst xOff = hash & 7\n\t\t\tconst yOff = (hash >> 3) & 7\n\t\t\tconst invert = ((hash >> 6) & 1) === 1\n\t\t\tconst cells: boolean[] = []\n\t\t\tfor (let y = 0; y < rows; y++) {\n\t\t\t\tfor (let x = 0; x < cols; x++) {\n\t\t\t\t\tconst sy = (y + yOff) & 7\n\t\t\t\t\tconst sx = (x + xOff) & 7\n\t\t\t\t\tconst on = (sy & sx) === 0\n\t\t\t\t\tcells.push(invert ? !on : on)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { cols, rows, cells }\n\t\t}\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Generative color derivation\n//\n// Uses two lightness levels per theme so pixels are visible on the bg.\n// Dark mode: dark tinted bg, medium-bright pixels\n// Light mode: light tinted bg, medium-dark pixels\n// We set CSS custom properties on the SVG so the browser resolves\n// the correct value based on the active theme.\n// ---------------------------------------------------------------------------\n\nfunction deriveHue(seed: string): number {\n\treturn cyrb53(seed, 42) % 360\n}\n\n/** CSS custom properties applied to the SVG root for theme-aware colors */\nfunction colorVars(hue: number): Record<string, string> {\n\treturn {\n\t\t// Pixel color — vibrant, visible on the bg\n\t\t\"--ga-pixel\": `light-dark(oklch(0.55 0.15 ${hue}), oklch(0.7 0.14 ${hue}))`,\n\t\t// Background — subtle tint\n\t\t\"--ga-bg\": `light-dark(oklch(0.92 0.03 ${hue}), oklch(0.25 0.03 ${hue}))`,\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Generative SVG renderer\n// ---------------------------------------------------------------------------\n\nconst GenerativeFallback = forwardRef<\n\tSVGSVGElement,\n\t{\n\t\treadonly seed: string\n\t\treadonly pattern: AvatarGenerativePattern\n\t\treadonly px: number\n\t\treadonly isCircle: boolean\n\t\treadonly className?: string\n\t}\n>(function GenerativeFallback({ seed, pattern, px, isCircle, className }, ref) {\n\tconst { grid, hue } = useMemo(\n\t\t() => ({ grid: generateGrid(seed, pattern), hue: deriveHue(seed) }),\n\t\t[seed, pattern],\n\t)\n\n\tconst { cols, rows, cells } = grid\n\tconst gap = 3\n\tconst padding = pattern === \"dense\" || pattern === \"quad-dense\" ? 3 : 4\n\tconst cellSize = (100 - padding * 2 - gap * (cols - 1)) / cols\n\tconst gridHeight = rows * cellSize + (rows - 1) * gap\n\tconst gridWidth = cols * cellSize + (cols - 1) * gap\n\tconst offsetY = padding + (100 - padding * 2 - gridHeight) / 2\n\tconst offsetX = padding + (100 - padding * 2 - gridWidth) / 2\n\n\tconst opacityHash = cyrb53(seed, 99)\n\tconst cellOpacity = (index: number): number => {\n\t\tconst bits = (opacityHash >> (index % 26)) & 3\n\t\treturn 0.55 + bits * 0.15\n\t}\n\n\t// Unique clip ID to avoid collisions when multiple avatars render\n\tconst clipId = `av-${cyrb53(seed + pattern, 7) >>> 0}`\n\n\tconst vars = colorVars(hue)\n\n\t// Derive per-cell flicker timing from hash for organic randomness\n\tconst flickerHash = cyrb53(seed, 77)\n\tconst cellFlicker = (index: number) => {\n\t\t// Each cell gets a unique duration (1.5-4s) and delay (0-3s)\n\t\tconst bits1 = (flickerHash >> (index % 26)) & 7 // 0-7\n\t\tconst bits2 = (opacityHash >> ((index + 5) % 26)) & 7\n\t\tconst duration = 1.5 + bits1 * 0.35 // 1.5s to 3.95s\n\t\tconst delay = bits2 * 0.4 // 0s to 2.8s\n\t\treturn { duration, delay }\n\t}\n\n\t// Scoped keyframe name\n\tconst animName = `ga-flk-${clipId}`\n\n\t// Use a CSS variable to toggle the animation name.\n\t// Hover: set --ga-anim to the keyframe name → cells flicker.\n\t// Leave: set --ga-anim to \"none\" → animation removed, cells\n\t// transition smoothly back to their base opacity.\n\treturn (\n\t\t<svg\n\t\t\tref={ref}\n\t\t\twidth={px}\n\t\t\theight={px}\n\t\t\tviewBox=\"0 0 100 100\"\n\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\tstyle={{ ...vars, \"--ga-anim\": \"none\" } as React.CSSProperties}\n\t\t\tonMouseEnter={e =>\n\t\t\t\te.currentTarget.style.setProperty(\"--ga-anim\", animName)\n\t\t\t}\n\t\t\tonMouseLeave={e => e.currentTarget.style.setProperty(\"--ga-anim\", \"none\")}\n\t\t\trole=\"img\"\n\t\t\taria-label={`Avatar for ${seed}`}\n\t\t>\n\t\t\t<style>{`\n\t\t\t\t@keyframes ${animName} {\n\t\t\t\t\t0%, 100% { opacity: var(--ga-o); }\n\t\t\t\t\t50% { opacity: calc(var(--ga-o) * 0.25); }\n\t\t\t\t}\n\t\t\t`}</style>\n\n\t\t\t{isCircle ? (\n\t\t\t\t<circle cx={50} cy={50} r={50} fill=\"var(--ga-bg)\" />\n\t\t\t) : (\n\t\t\t\t<rect x={0} y={0} width={100} height={100} rx={8} fill=\"var(--ga-bg)\" />\n\t\t\t)}\n\n\t\t\t<defs>\n\t\t\t\t<clipPath id={clipId}>\n\t\t\t\t\t{isCircle ? (\n\t\t\t\t\t\t<circle cx={50} cy={50} r={50} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<rect x={0} y={0} width={100} height={100} rx={8} />\n\t\t\t\t\t)}\n\t\t\t\t</clipPath>\n\t\t\t</defs>\n\n\t\t\t<g clipPath={`url(#${clipId})`}>\n\t\t\t\t{cells.map((on, i) => {\n\t\t\t\t\tif (!on) return null\n\t\t\t\t\tconst col = i % cols\n\t\t\t\t\tconst row = Math.floor(i / cols)\n\t\t\t\t\tconst opacity = cellOpacity(i)\n\t\t\t\t\tconst { duration, delay } = cellFlicker(i)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tkey={`${col}-${row}`}\n\t\t\t\t\t\t\tx={offsetX + col * (cellSize + gap)}\n\t\t\t\t\t\t\ty={offsetY + row * (cellSize + gap)}\n\t\t\t\t\t\t\twidth={cellSize}\n\t\t\t\t\t\t\theight={cellSize}\n\t\t\t\t\t\t\tfill=\"var(--ga-pixel)\"\n\t\t\t\t\t\t\topacity={opacity}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t[\"--ga-o\" as string]: opacity,\n\t\t\t\t\t\t\t\t[\"animation-name\" as string]: \"var(--ga-anim)\",\n\t\t\t\t\t\t\t\t[\"animation-duration\" as string]: `${duration}s`,\n\t\t\t\t\t\t\t\t[\"animation-timing-function\" as string]: \"ease-in-out\",\n\t\t\t\t\t\t\t\t[\"animation-delay\" as string]: `${delay}s`,\n\t\t\t\t\t\t\t\t[\"animation-iteration-count\" as string]: \"infinite\",\n\t\t\t\t\t\t\t\ttransition: \"opacity 0.6s ease-out\",\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</g>\n\t\t</svg>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Avatar\n// ---------------------------------------------------------------------------\n\n/**\n * Avatar component with image, initials, or generative pixel-grid fallback.\n *\n * Fallback priority: `src` > `initials` > `seed` (generative) > empty\n *\n * - `circle` variant for users (fully rounded)\n * - `square` variant for organizations/workspaces (rounded corners)\n */\nexport const Avatar = forwardRef<HTMLElement, AvatarProps>(function Avatar(\n\t{\n\t\tsrc,\n\t\tinitials,\n\t\tseed,\n\t\tgenerativePattern = \"grid\",\n\t\talt,\n\t\tvariant = \"circle\",\n\t\tsize = \"md\",\n\t\tcolor = \"neutral\",\n\t\tclassName,\n\t},\n\tref,\n) {\n\tconst s = sizeStyles[size]\n\tconst shape = variantStyles[variant]\n\n\t// Priority 1: Image\n\tif (src) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tref={ref as React.Ref<HTMLImageElement>}\n\t\t\t\tsrc={src}\n\t\t\t\talt={alt ?? initials ?? seed ?? \"\"}\n\t\t\t\tclassName={cn(\"shrink-0 object-cover\", s.outer, shape, className)}\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Priority 2: Initials\n\tif (initials) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref as React.Ref<HTMLSpanElement>}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center justify-center font-semibold select-none\",\n\t\t\t\t\ts.outer,\n\t\t\t\t\ts.text,\n\t\t\t\t\tshape,\n\t\t\t\t\tcolorStyles[color],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{initials}\n\t\t\t</span>\n\t\t)\n\t}\n\n\t// Priority 3: Generative pixel grid\n\tif (seed) {\n\t\treturn (\n\t\t\t<GenerativeFallback\n\t\t\t\tref={ref as React.Ref<SVGSVGElement>}\n\t\t\t\tseed={seed}\n\t\t\t\tpattern={generativePattern}\n\t\t\t\tpx={s.px}\n\t\t\t\tisCircle={variant === \"circle\"}\n\t\t\t\tclassName={className}\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Priority 4: Empty placeholder\n\treturn (\n\t\t<span\n\t\t\tref={ref as React.Ref<HTMLSpanElement>}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex shrink-0 items-center justify-center font-semibold select-none\",\n\t\t\t\ts.outer,\n\t\t\t\ts.text,\n\t\t\t\tshape,\n\t\t\t\tcolorStyles[color],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t/>\n\t)\n})\n","import {\n\ttype ComponentProps,\n\ttype ReactNode,\n\tforwardRef,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Card } from \"../card\"\nimport { Toggle } from \"../toggle\"\nimport { Tooltip } from \"../tooltip\"\n\n// ---------------------------------------------------------------------------\n// SettingsCard\n// ---------------------------------------------------------------------------\n\nexport interface SettingsCardProps {\n\t/** Title displayed in the card header */\n\ttitle?: string\n\t/** Description displayed below the title */\n\tdescription?: string\n\t/**\n\t * When true, renders a Toggle in the header. Toggling it on disables (mutes)\n\t * the card's rows - useful for \"Use Organization Settings\" patterns.\n\t */\n\ttoggle?: boolean\n\t/** Controlled toggle state */\n\ttoggled?: boolean\n\t/** Callback when toggle state changes */\n\tonToggleChange?: (toggled: boolean) => void\n\t/** Initial toggle state for uncontrolled usage */\n\tdefaultToggled?: boolean\n\t/** Settings rows or other content */\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * A specialized card for settings pages. Uses the Card component internally\n * with an optional header and a nested card for the settings rows.\n *\n * Pass `toggle` to show a toggle in the header. When toggled on, the child\n * rows are visually disabled (muted + non-interactive).\n */\nexport const SettingsCard = forwardRef<HTMLDivElement, SettingsCardProps>(\n\tfunction SettingsCard(\n\t\t{\n\t\t\ttitle,\n\t\t\tdescription,\n\t\t\ttoggle,\n\t\t\ttoggled: controlledToggled,\n\t\t\tonToggleChange,\n\t\t\tdefaultToggled = false,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internalToggled, setInternalToggled] = useState(defaultToggled)\n\t\tconst isControlled = controlledToggled !== undefined\n\t\tconst toggled = isControlled ? controlledToggled : internalToggled\n\t\tconst disabled = toggle && toggled\n\n\t\tfunction handleToggleChange(value: boolean) {\n\t\t\tif (!isControlled) setInternalToggled(value)\n\t\t\tonToggleChange?.(value)\n\t\t}\n\n\t\treturn (\n\t\t\t<Card ref={ref} className={cn(\"w-full\", className)}>\n\t\t\t\t<Card.Content>\n\t\t\t\t\t{(title || description || toggle) && (\n\t\t\t\t\t\t<Card.Header>\n\t\t\t\t\t\t\t<div className=\"flex items-start justify-between gap-4\">\n\t\t\t\t\t\t\t\t<div className=\"flex flex-1 flex-col\">\n\t\t\t\t\t\t\t\t\t{title && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-bruv-secondary text-bruv-base mt-1 leading-relaxed\">\n\t\t\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{toggle && (\n\t\t\t\t\t\t\t\t\t<div className=\"shrink-0 pt-0.5\">\n\t\t\t\t\t\t\t\t\t\t<Toggle\n\t\t\t\t\t\t\t\t\t\t\tchecked={toggled}\n\t\t\t\t\t\t\t\t\t\t\tonCheckedChange={handleToggleChange}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Card.Header>\n\t\t\t\t\t)}\n\t\t\t\t\t<Card\n\t\t\t\t\t\tvariant=\"nested\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"transition-opacity duration-150 ease-out\",\n\t\t\t\t\t\t\tdisabled && \"pointer-events-none select-none opacity-50\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Card>\n\t\t\t\t</Card.Content>\n\t\t\t</Card>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SettingsRow — composable compound component\n// ---------------------------------------------------------------------------\n\n// SettingsRow.Root\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowRootProps extends ComponentProps<\"div\"> {\n\tchildren: ReactNode\n}\n\n/**\n * Outer wrapper for a settings row. Renders as a `Card.Section` with a\n * bottom border separator between siblings. Passes through all div props\n * (`id`, `onClick`, `data-*`, `className`, etc.).\n */\nconst SettingsRowRoot = forwardRef<HTMLDivElement, SettingsRowRootProps>(\n\tfunction SettingsRowRoot({ className, children, ...rest }, ref) {\n\t\treturn (\n\t\t\t<Card.Section\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex flex-col gap-3\", className)}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Card.Section>\n\t\t)\n\t},\n)\n\n// SettingsRow.Header\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowHeaderProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Header area of a settings row. Lays out label/description on the left and\n * a control or action on the right.\n */\nconst SettingsRowHeader = forwardRef<HTMLDivElement, SettingsRowHeaderProps>(\n\tfunction SettingsRowHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-start justify-between gap-4 [&>:first-child]:min-w-0 [&>:first-child]:flex-1\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// SettingsRow.Label\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowLabelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Label slot. Accepts `ReactNode` so consumers can place badges, icons, or\n * other elements alongside the text.\n */\nconst SettingsRowLabel = forwardRef<HTMLDivElement, SettingsRowLabelProps>(\n\tfunction SettingsRowLabel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t)\n\t},\n)\n\n// SettingsRow.Description\n// ---------------------------------------------------------------------------\n\nconst DESCRIPTION_LINE_HEIGHT = 20\nconst DESCRIPTION_CLAMP_LINES = 2\nconst DESCRIPTION_CLAMP_HEIGHT =\n\tDESCRIPTION_LINE_HEIGHT * DESCRIPTION_CLAMP_LINES\n\nexport interface SettingsRowDescriptionProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Description text, clamped to 2 lines. When the text overflows, a tooltip\n * displays the full content on hover.\n */\nconst SettingsRowDescription = forwardRef<\n\tHTMLDivElement,\n\tSettingsRowDescriptionProps\n>(function SettingsRowDescription({ className, children }, ref) {\n\tconst measureRef = useRef<HTMLSpanElement>(null)\n\tconst [isTruncated, setIsTruncated] = useState(false)\n\n\tuseLayoutEffect(() => {\n\t\tif (measureRef.current) {\n\t\t\tsetIsTruncated(measureRef.current.scrollHeight > DESCRIPTION_CLAMP_HEIGHT)\n\t\t}\n\t}, [children])\n\n\tconst content = (\n\t\t<span ref={ref} className={cn(\"relative block\", className)}>\n\t\t\t{/* Hidden full-height measurer */}\n\t\t\t<span\n\t\t\t\tref={measureRef}\n\t\t\t\taria-hidden\n\t\t\t\tclassName=\"text-bruv-base pointer-events-none invisible absolute inset-x-0 leading-relaxed\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t<span className=\"text-bruv-secondary text-bruv-base line-clamp-2 leading-relaxed\">\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t</span>\n\t)\n\n\tif (!isTruncated) return content\n\n\treturn (\n\t\t<Tooltip.Provider>\n\t\t\t<Tooltip.Root>\n\t\t\t\t<Tooltip.Trigger render={content} />\n\t\t\t\t<Tooltip.Content side=\"bottom\" className=\"max-w-sm\">\n\t\t\t\t\t{children}\n\t\t\t\t</Tooltip.Content>\n\t\t\t</Tooltip.Root>\n\t\t</Tooltip.Provider>\n\t)\n})\n\n// SettingsRow.Control\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowControlProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Right-aligned control slot for inline settings rows (toggles, selects, etc.).\n */\nconst SettingsRowControl = forwardRef<HTMLDivElement, SettingsRowControlProps>(\n\tfunction SettingsRowControl({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex shrink-0 items-center\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// SettingsRow.Action\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowActionProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Right-aligned action slot in the header (for rows with content below).\n */\nconst SettingsRowAction = forwardRef<HTMLDivElement, SettingsRowActionProps>(\n\tfunction SettingsRowAction({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex shrink-0 items-center\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// SettingsRow.Content\n// ---------------------------------------------------------------------------\n\nexport interface SettingsRowContentProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n/**\n * Content rendered below the header (textareas, tables, instruction lists, etc.).\n */\nconst SettingsRowContent = forwardRef<HTMLDivElement, SettingsRowContentProps>(\n\tfunction SettingsRowContent({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={className}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\n/**\n * Composable settings row for use inside `SettingsCard`.\n *\n * ```tsx\n * <SettingsRow.Root>\n * <SettingsRow.Header>\n * <div>\n * <SettingsRow.Label>Language</SettingsRow.Label>\n * <SettingsRow.Description>\n * Set the language for reviews.\n * </SettingsRow.Description>\n * </div>\n * <SettingsRow.Control>\n * <Select />\n * </SettingsRow.Control>\n * </SettingsRow.Header>\n * </SettingsRow.Root>\n *\n * // With content below\n * <SettingsRow.Root>\n * <SettingsRow.Header>\n * <div>\n * <SettingsRow.Label>Instructions</SettingsRow.Label>\n * <SettingsRow.Description>\n * Custom review instructions.\n * </SettingsRow.Description>\n * </div>\n * <SettingsRow.Action>\n * <Button>Add</Button>\n * </SettingsRow.Action>\n * </SettingsRow.Header>\n * <SettingsRow.Content>\n * <Textarea />\n * </SettingsRow.Content>\n * </SettingsRow.Root>\n * ```\n */\nexport const SettingsRow = {\n\tRoot: SettingsRowRoot,\n\tHeader: SettingsRowHeader,\n\tLabel: SettingsRowLabel,\n\tDescription: SettingsRowDescription,\n\tControl: SettingsRowControl,\n\tAction: SettingsRowAction,\n\tContent: SettingsRowContent,\n}\n","import { Tooltip as BaseTooltip } from \"@base-ui/react/tooltip\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Tooltip.Provider\n// ---------------------------------------------------------------------------\n\nexport interface TooltipProviderProps extends ComponentProps<\n\ttypeof BaseTooltip.Provider\n> {}\n\nfunction TooltipProvider(props: TooltipProviderProps) {\n\treturn <BaseTooltip.Provider {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip.Root\n// ---------------------------------------------------------------------------\n\nexport interface TooltipRootProps extends ComponentProps<\n\ttypeof BaseTooltip.Root\n> {}\n\nfunction TooltipRoot(props: TooltipRootProps) {\n\treturn <BaseTooltip.Root {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface TooltipTriggerProps extends ComponentProps<\n\ttypeof BaseTooltip.Trigger\n> {}\n\nconst TooltipTrigger = forwardRef<HTMLButtonElement, TooltipTriggerProps>(\n\tfunction TooltipTrigger({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseTooltip.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"outline-none\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Tooltip.Content\n//\n// Positioner sizing: w-(--positioner-width) / h-(--positioner-height)\n// gives the positioner real dimensions so align=\"center\" works with\n// detached/handle triggers. Position transitions use left/top/right/bottom\n// and are disabled on initial open via data-[instant]:transition-none.\n//\n// Popup entrance: scale+fade via data-[starting-style]/data-[ending-style],\n// also disabled during group transfers via data-[instant]:transition-none\n// so the pill stays visible while only its position and content change.\n// ---------------------------------------------------------------------------\n\nexport interface TooltipContentProps extends ComponentProps<\n\ttypeof BaseTooltip.Popup\n> {\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\t/** Content to display */\n\tchildren: ReactNode\n}\n\nfunction TooltipContent({\n\tside = \"top\",\n\talign = \"center\",\n\tsideOffset = 6,\n\tclassName,\n\tchildren,\n\t...props\n}: TooltipContentProps) {\n\treturn (\n\t\t<BaseTooltip.Portal>\n\t\t\t<BaseTooltip.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"z-50 outline-none\",\n\t\t\t\t\t// Give positioner real dimensions for proper centering\n\t\t\t\t\t\"h-[var(--positioner-height)] w-[var(--positioner-width)] max-w-[var(--available-width)]\",\n\t\t\t\t\t// Smooth position transition during group transfer\n\t\t\t\t\t\"transition-[top,left,right,bottom,transform] duration-350 ease-bruv-out-expo\",\n\t\t\t\t\t// Skip position transition on initial open / close\n\t\t\t\t\t\"data-[instant]:transition-none\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<BaseTooltip.Popup\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-inverse text-bruv-inverse rounded px-2 py-1 text-bruv-sm font-medium\",\n\t\t\t\t\t\t\"max-w-[280px]\",\n\t\t\t\t\t\t\"origin-[var(--transform-origin)]\",\n\t\t\t\t\t\t// Entrance/exit animation\n\t\t\t\t\t\t\"transition-[transform,scale,opacity] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"data-[starting-style]:scale-95 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-95 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t// Skip entrance animation during group transfer (pill stays visible)\n\t\t\t\t\t\t\"data-[instant]:transition-none\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseTooltip.Popup>\n\t\t\t</BaseTooltip.Positioner>\n\t\t</BaseTooltip.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip.Viewport\n//\n// Wraps content inside Tooltip.Content for direction-aware transfer\n// animations. Base UI sets `data-activation-direction` on this element\n// (e.g. \"right down\") and renders `[data-current]` / `[data-previous]`\n// child wrappers with `data-starting-style` / `data-ending-style`.\n//\n// Uses `~=` (word match) via `*=` (contains) selectors on the\n// space-separated activation direction value. Transitions use\n// translate + opacity on the children, matching the official Base UI\n// pattern from their detached-triggers-full demo.\n// ---------------------------------------------------------------------------\n\nexport interface TooltipViewportProps extends ComponentProps<\n\ttypeof BaseTooltip.Viewport\n> {}\n\nconst TooltipViewport = forwardRef<HTMLDivElement, TooltipViewportProps>(\n\tfunction TooltipViewport({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseTooltip.Viewport\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative h-full w-full overflow-clip\",\n\t\t\t\t\t// Children: translate + opacity transition\n\t\t\t\t\t\"[&_[data-previous]]:transition-[translate,opacity] [&_[data-previous]]:duration-350 [&_[data-previous]]:ease-bruv-out-expo\",\n\t\t\t\t\t\"[&_[data-current]]:transition-[translate,opacity] [&_[data-current]]:duration-350 [&_[data-current]]:ease-bruv-out-expo\",\n\t\t\t\t\t// Skip animation when instant (first open)\n\t\t\t\t\t\"[&_[data-instant]_[data-current]]:transition-none [&_[data-instant]_[data-previous]]:transition-none\",\n\t\t\t\t\t// Current: slides in from activation direction\n\t\t\t\t\t\"[&[data-activation-direction*=left]_[data-current][data-starting-style]]:-translate-x-1/2 [&[data-activation-direction*=left]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=right]_[data-current][data-starting-style]]:translate-x-1/2 [&[data-activation-direction*=right]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=up]_[data-current][data-starting-style]]:-translate-y-1/2 [&[data-activation-direction*=up]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=down]_[data-current][data-starting-style]]:translate-y-1/2 [&[data-activation-direction*=down]_[data-current][data-starting-style]]:opacity-0\",\n\t\t\t\t\t// Previous: slides out opposite to activation direction\n\t\t\t\t\t\"[&[data-activation-direction*=left]_[data-previous][data-ending-style]]:translate-x-1/2 [&[data-activation-direction*=left]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=right]_[data-previous][data-ending-style]]:-translate-x-1/2 [&[data-activation-direction*=right]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=up]_[data-previous][data-ending-style]]:translate-y-1/2 [&[data-activation-direction*=up]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t\"[&[data-activation-direction*=down]_[data-previous][data-ending-style]]:-translate-y-1/2 [&[data-activation-direction*=down]_[data-previous][data-ending-style]]:opacity-0\",\n\t\t\t\t\t// Reduced motion\n\t\t\t\t\t\"motion-reduce:[&_[data-current]]:!transition-none motion-reduce:[&_[data-previous]]:!transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// createHandle - re-export for shared tooltip pattern\n// ---------------------------------------------------------------------------\n\nexport const createTooltipHandle = BaseTooltip.createHandle\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tooltip = {\n\tProvider: TooltipProvider,\n\tRoot: TooltipRoot,\n\tTrigger: TooltipTrigger,\n\tContent: TooltipContent,\n\tViewport: TooltipViewport,\n\tcreateHandle: BaseTooltip.createHandle,\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// PageLayout.Header — breadcrumb bar inside content panel\n// ---------------------------------------------------------------------------\n\nexport interface PageLayoutHeaderProps extends ComponentProps<\"div\"> {}\n\nconst PageLayoutHeader = forwardRef<HTMLDivElement, PageLayoutHeaderProps>(\n\tfunction PageLayoutHeader({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex shrink-0 items-center gap-6 px-1.5 py-1.5\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// PageLayout.Body — scrollable content area\n// ---------------------------------------------------------------------------\n\nexport interface PageLayoutBodyProps extends ComponentProps<\"div\"> {}\n\nconst PageLayoutBody = forwardRef<HTMLDivElement, PageLayoutBodyProps>(\n\tfunction PageLayoutBody({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex min-h-0 flex-1 gap-6 overflow-auto px-3.5 py-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// PageLayout — root shell\n// ---------------------------------------------------------------------------\n\nexport interface PageLayoutProps {\n\t/** Sidebar content */\n\treadonly sidebar?: ReactNode\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Full-page layout shell with a sidebar and content area.\n *\n * Structure: sidebar (fixed width) + content panel (flex-1).\n * The content panel renders as a rounded card on bg-bruv-base-0.\n */\nexport const PageLayout = Object.assign(\n\tforwardRef<HTMLDivElement, PageLayoutProps>(function PageLayout(\n\t\t{ sidebar, className, children },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex h-screen bg-bruv-base-0\", className)}>\n\t\t\t\t{sidebar}\n\t\t\t\t<div className=\"flex min-h-0 flex-1 flex-col pt-1 pr-1 pb-1\">\n\t\t\t\t\t<div className=\"bg-bruv-base-1 ring-bruv-neutral flex min-h-0 flex-1 flex-col rounded shadow-sm ring-1\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t}),\n\t{\n\t\tHeader: PageLayoutHeader,\n\t\tBody: PageLayoutBody,\n\t},\n)\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseState,\n\tuseSyncExternalStore,\n\ttype ComponentProps,\n\ttype ReactNode,\n} from \"react\"\nimport { AnimatePresence, motion } from \"motion/react\"\nimport {\n\tArrowLeftIcon,\n\tChevronRightIcon,\n\tArrowTopRightOnSquareIcon,\n\tXMarkIcon,\n} from \"@heroicons/react/16/solid\"\nimport { Button } from \"../button\"\nimport { cn } from \"../../lib/cn\"\nimport { Drawer } from \"../drawer\"\nimport { Hover, HoverGroup } from \"../hover\"\nimport { Skeleton } from \"../skeleton\"\nimport { Tooltip } from \"../tooltip\"\nimport {\n\tSidebarContext,\n\tuseSidebar,\n\tuseSidebarOptional,\n\ttype SidebarContextValue,\n\ttype SidebarLinkComponent,\n} from \"./sidebar-context\"\n\n// ---------------------------------------------------------------------------\n// useMediaQuery — subscribe to a CSS media query\n// ---------------------------------------------------------------------------\n\nconst MOBILE_QUERY = \"(max-width: 767px)\"\n\nfunction subscribeMediaQuery(callback: () => void) {\n\tconst mql = window.matchMedia(MOBILE_QUERY)\n\tmql.addEventListener(\"change\", callback)\n\treturn () => mql.removeEventListener(\"change\", callback)\n}\n\nfunction getMediaSnapshot() {\n\treturn window.matchMedia(MOBILE_QUERY).matches\n}\n\nfunction getMediaServerSnapshot() {\n\treturn false\n}\n\nfunction useIsMobile() {\n\treturn useSyncExternalStore(\n\t\tsubscribeMediaQuery,\n\t\tgetMediaSnapshot,\n\t\tgetMediaServerSnapshot,\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Provider — context-only wrapper (no visual output)\n// ---------------------------------------------------------------------------\n\nexport interface SidebarProviderProps {\n\t/** Start in collapsed state (uncontrolled) */\n\treadonly defaultCollapsed?: boolean\n\t/** Controlled collapsed state */\n\treadonly collapsed?: boolean\n\t/** Callback when collapsed state changes (controlled mode) */\n\treadonly onCollapsedChange?: (collapsed: boolean) => void\n\t/** Custom link component for client-side navigation */\n\treadonly linkComponent?: SidebarLinkComponent\n\treadonly children: ReactNode\n}\n\n/**\n * Context-only provider for sidebar state — no visual output.\n *\n * Wrap your entire page layout with this when you need `useSidebar()`\n * outside the visual `<Sidebar>` container (e.g. in the page header\n * or in portaled components).\n *\n * When `<Sidebar>` is rendered inside a `<Sidebar.Provider>`, it\n * skips creating its own context and uses the provider's state.\n *\n * ```tsx\n * <Sidebar.Provider collapsed={collapsed} onCollapsedChange={setCollapsed}>\n * <PageLayout sidebar={<Sidebar>...</Sidebar>}>\n * <MyHeader />\n * </PageLayout>\n * </Sidebar.Provider>\n * ```\n */\nfunction SidebarProvider({\n\tdefaultCollapsed = false,\n\tcollapsed: controlledCollapsed,\n\tonCollapsedChange,\n\tlinkComponent,\n\tchildren,\n}: SidebarProviderProps) {\n\tconst mobile = useIsMobile()\n\tconst [uncontrolledCollapsed, setUncontrolledCollapsed] =\n\t\tuseState(defaultCollapsed)\n\tconst [mobileOpen, setMobileOpen] = useState(false)\n\tconst isControlled = controlledCollapsed !== undefined\n\tconst collapsed = isControlled ? controlledCollapsed : uncontrolledCollapsed\n\tconst toggle = useCallback(() => {\n\t\tconst next = !collapsed\n\t\tif (isControlled) {\n\t\t\tonCollapsedChange?.(next)\n\t\t} else {\n\t\t\tsetUncontrolledCollapsed(next)\n\t\t}\n\t}, [collapsed, isControlled, onCollapsedChange])\n\n\t// Close mobile drawer when resizing to desktop\n\tuseEffect(() => {\n\t\tif (!mobile && mobileOpen) {\n\t\t\tsetMobileOpen(false)\n\t\t}\n\t}, [mobile, mobileOpen])\n\n\tconst ctx = useMemo(\n\t\t() => ({\n\t\t\tcollapsed: mobile ? true : collapsed,\n\t\t\ttoggle,\n\t\t\tlinkComponent,\n\t\t\tmobile,\n\t\t\tmobileOpen,\n\t\t\tsetMobileOpen,\n\t\t}),\n\t\t[collapsed, toggle, linkComponent, mobile, mobileOpen],\n\t)\n\n\treturn (\n\t\t<SidebarContext.Provider value={ctx}>{children}</SidebarContext.Provider>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar — root container\n// ---------------------------------------------------------------------------\n\nexport interface SidebarRootProps {\n\t/** Start in collapsed state (uncontrolled). Ignored when inside a Sidebar.Provider. */\n\treadonly defaultCollapsed?: boolean\n\t/** Controlled collapsed state. Ignored when inside a Sidebar.Provider. */\n\treadonly collapsed?: boolean\n\t/** Callback when collapsed state changes. Ignored when inside a Sidebar.Provider. */\n\treadonly onCollapsedChange?: (collapsed: boolean) => void\n\t/** Custom link component for client-side navigation. Ignored when inside a Sidebar.Provider. */\n\treadonly linkComponent?: SidebarLinkComponent\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Responsive sidebar with collapsible state and directional layer transitions.\n *\n * When rendered inside a `<Sidebar.Provider>`, uses the provider's context\n * and only renders the visual shell. Otherwise, creates its own context.\n *\n * **Desktop** (`md:` and up): renders inline with collapse/expand animation.\n * **Mobile** (below `md:`): shows collapsed icons inline. Tapping an icon\n * or the collapse button opens the full sidebar in a left-side Drawer.\n */\nfunction SidebarRoot({\n\tdefaultCollapsed = false,\n\tcollapsed: controlledCollapsed,\n\tonCollapsedChange,\n\tlinkComponent,\n\tclassName,\n\tchildren,\n}: SidebarRootProps) {\n\tconst existingCtx = useSidebarOptional()\n\n\t// If inside a Sidebar.Provider, just render the visual shell\n\tif (existingCtx) {\n\t\treturn (\n\t\t\t<SidebarVisual className={className} ctx={existingCtx}>\n\t\t\t\t{children}\n\t\t\t</SidebarVisual>\n\t\t)\n\t}\n\n\t// Otherwise, create context + visual shell together\n\treturn (\n\t\t<SidebarProvider\n\t\t\tdefaultCollapsed={defaultCollapsed}\n\t\t\tcollapsed={controlledCollapsed}\n\t\t\tonCollapsedChange={onCollapsedChange}\n\t\t\tlinkComponent={linkComponent}\n\t\t>\n\t\t\t<SidebarVisualFromCtx className={className}>\n\t\t\t\t{children}\n\t\t\t</SidebarVisualFromCtx>\n\t\t</SidebarProvider>\n\t)\n}\n\n/** Internal: reads ctx from useSidebar and renders the visual shell. */\nfunction SidebarVisualFromCtx({\n\tclassName,\n\tchildren,\n}: {\n\treadonly className?: string\n\treadonly children: ReactNode\n}) {\n\tconst ctx = useSidebar()\n\treturn (\n\t\t<SidebarVisual className={className} ctx={ctx}>\n\t\t\t{children}\n\t\t</SidebarVisual>\n\t)\n}\n\n/** Internal: renders the sidebar visual shell + mobile drawer. */\nfunction SidebarVisual({\n\tclassName,\n\tctx,\n\tchildren,\n}: {\n\treadonly className?: string\n\treadonly ctx: SidebarContextValue\n\treadonly children: ReactNode\n}) {\n\tconst { collapsed, mobile, mobileOpen, setMobileOpen } = ctx\n\n\t// Separate context for the drawer — always expanded\n\tconst drawerCtx = useMemo(() => ({ ...ctx, collapsed: false }), [ctx])\n\n\treturn (\n\t\t<>\n\t\t\t<Tooltip.Provider delay={0} closeDelay={0}>\n\t\t\t\t{/* Inline sidebar — collapsed (icon-only) on mobile, collapsible on desktop */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"relative flex h-full shrink-0 flex-col justify-between overflow-hidden px-2 py-1 transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\t\tmobile || collapsed ? \"w-12\" : \"w-[264px]\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</Tooltip.Provider>\n\n\t\t\t{/* Mobile: portaled drawer with the full expanded sidebar */}\n\t\t\t{mobile && (\n\t\t\t\t<Drawer.Root\n\t\t\t\t\topen={mobileOpen}\n\t\t\t\t\tonOpenChange={setMobileOpen}\n\t\t\t\t\tside=\"left\"\n\t\t\t\t\tresponsive={false}\n\t\t\t\t>\n\t\t\t\t\t<Drawer.Content side=\"left\" responsive={false}>\n\t\t\t\t\t\t<SidebarContext.Provider value={drawerCtx}>\n\t\t\t\t\t\t\t<Tooltip.Provider delay={0} closeDelay={0}>\n\t\t\t\t\t\t\t\t<div className=\"flex h-full w-full flex-col justify-between px-2 py-1\">\n\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Tooltip.Provider>\n\t\t\t\t\t\t</SidebarContext.Provider>\n\t\t\t\t\t</Drawer.Content>\n\t\t\t\t</Drawer.Root>\n\t\t\t)}\n\t\t</>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Section — group container\n// ---------------------------------------------------------------------------\n\nexport interface SidebarSectionProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\nfunction SidebarSection({ className, children }: SidebarSectionProps) {\n\treturn (\n\t\t<HoverGroup\n\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\tborderRadius=\"rounded\"\n\t\t\tclassName={cn(\"w-full flex-col items-stretch gap-0.5\", className)}\n\t\t>\n\t\t\t{children}\n\t\t</HoverGroup>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Label — section label with collapse animation\n// ---------------------------------------------------------------------------\n\nexport interface SidebarLabelProps extends ComponentProps<\"div\"> {}\n\n/**\n * Section label that collapses smoothly via grid-rows animation.\n *\n * Matches the Vue DSidebarLabel: grid-rows-[1fr] → grid-rows-[0fr]\n * with inner translate + scale + opacity fade.\n */\nconst SidebarLabel = forwardRef<HTMLDivElement, SidebarLabelProps>(\n\tfunction SidebarLabel({ className, children, ...props }, ref) {\n\t\tconst { collapsed } = useSidebar()\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid transition-all duration-400 ease-bruv-out-expo\",\n\t\t\t\t\tcollapsed ? \"grid-rows-[0fr]\" : \"grid-rows-[1fr]\",\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div className=\"overflow-hidden\">\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex h-6 items-center px-2 text-bruv-sm text-bruv-secondary transition-all duration-400 ease-bruv-out-expo\",\n\t\t\t\t\t\t\tcollapsed ? \"-translate-x-5 scale-80 opacity-0\" : \"opacity-100\",\n\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Sidebar.Header — header row with AnimatePresence popLayout for logo area\n// ---------------------------------------------------------------------------\n\nexport interface SidebarHeaderProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Header row that smoothly hides its children when the sidebar collapses.\n *\n * Matches the Vue DSidebar header pattern:\n * - `AnimatePresence mode=\"popLayout\"` keeps CollapseButton stable in layout\n * - Children slide out with `x: -320, scale: 0.5` spring animation\n * - Row uses `justify-center` so CollapseButton centers when collapsed\n * - Padding `px-2` only applied when expanded\n *\n * Usage:\n * ```tsx\n * <Sidebar.Header>\n * <YourLogo />\n * <span>Your App</span>\n * </Sidebar.Header>\n * ```\n * The `CollapseButton` is rendered automatically at the end of the row.\n */\nfunction SidebarHeader({ className, children }: SidebarHeaderProps) {\n\tconst { collapsed } = useSidebar()\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center justify-center py-1.5 transition-all duration-400 ease-bruv-out-expo\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t{!collapsed && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ opacity: 0, x: -320, scale: 0.5 }}\n\t\t\t\t\t\tanimate={{ opacity: 1, x: 0, scale: 1 }}\n\t\t\t\t\t\texit={{ opacity: 0, x: -320, scale: 0.5 }}\n\t\t\t\t\t\ttransition={{ duration: 0.4, type: \"spring\", bounce: 0 }}\n\t\t\t\t\t\tclassName=\"flex min-w-0 flex-1 items-center gap-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t\t<SidebarCollapseButton />\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Link — nav link with Hover + Tooltip + AnimatePresence\n// ---------------------------------------------------------------------------\n\nexport interface SidebarLinkProps extends Omit<\n\tComponentProps<\"div\">,\n\t\"children\"\n> {\n\t/** Display name */\n\treadonly name: string\n\t/** Link URL — renders via `linkComponent` (or native `<a>` if none provided) */\n\treadonly href?: string\n\t/** Render as \"div\" when nested inside an interactive container (e.g. DropdownMenu.Trigger) to avoid nested `<button>` */\n\treadonly as?: \"div\"\n\t/** Whether this link is currently active */\n\treadonly active?: boolean\n\t/** Icon component rendered before the name */\n\treadonly icon?: ReactNode\n\t/** Show a trailing chevron indicating navigation to a nested layer */\n\treadonly nested?: boolean\n\t/** Show an external link arrow and open in new tab */\n\treadonly external?: boolean\n\t/** Show a pulsing activity indicator dot */\n\treadonly showIndicator?: boolean\n\t/** Arbitrary trailing content rendered after the name (e.g. badges, lock icons) */\n\treadonly trailing?: ReactNode\n\t/** Disable the link — reduces opacity and prevents clicks */\n\treadonly disabled?: boolean\n\t/** Show a skeleton placeholder instead of the link content */\n\treadonly loading?: boolean\n\t/** Click handler */\n\treadonly onClick?: () => void\n}\n\nfunction SidebarLink({\n\tname,\n\thref,\n\tas,\n\tactive = false,\n\ticon,\n\tnested = false,\n\texternal = false,\n\tshowIndicator = false,\n\ttrailing,\n\tdisabled = false,\n\tloading = false,\n\tonClick,\n\tclassName,\n\t...rest\n}: SidebarLinkProps) {\n\tconst {\n\t\tcollapsed,\n\t\tlinkComponent: LinkComponent,\n\t\tmobile,\n\t\tsetMobileOpen,\n\t} = useSidebar()\n\n\tif (loading) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex h-8 w-full items-center gap-2 p-2 transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\tcollapsed ? \"w-8\" : \"w-full\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<Skeleton className=\"size-4 shrink-0\" />\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{!collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex-1 origin-left\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</div>\n\t\t)\n\t}\n\n\t// Determine the rendered tag\n\tconst usesLinkComponent = !!href && !external && !!LinkComponent\n\tconst Tag = as ?? (usesLinkComponent ? LinkComponent : href ? \"a\" : \"button\")\n\n\tconst handleClick = disabled\n\t\t? (e: React.MouseEvent) => {\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\t\t\t}\n\t\t: mobile && collapsed\n\t\t\t? (e: React.MouseEvent) => {\n\t\t\t\t\t// On mobile collapsed (inline icons), open the drawer\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\tsetMobileOpen(true)\n\t\t\t\t}\n\t\t\t: () => {\n\t\t\t\t\tonClick?.()\n\t\t\t\t\tsetMobileOpen(false)\n\t\t\t\t}\n\n\tconst tagProps = usesLinkComponent\n\t\t? { to: href, href, onClick: handleClick }\n\t\t: as === \"div\"\n\t\t\t? { onClick: handleClick }\n\t\t\t: href\n\t\t\t\t? {\n\t\t\t\t\t\thref,\n\t\t\t\t\t\tonClick: handleClick,\n\t\t\t\t\t\ttarget: external ? (\"_blank\" as const) : undefined,\n\t\t\t\t\t\trel: external ? \"noopener noreferrer\" : undefined,\n\t\t\t\t\t}\n\t\t\t\t: { type: \"button\" as const, onClick: handleClick }\n\n\tconst link = (\n\t\t<Hover\n\t\t\tactive={active}\n\t\t\tdisabled={disabled}\n\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\tborderRadius=\"rounded\"\n\t\t\tfullWidth\n\t\t\tclassName={cn(\n\t\t\t\t\"overflow-hidden transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\tcollapsed ? \"w-8\" : \"w-full\",\n\t\t\t)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t<Tag\n\t\t\t\t{...tagProps}\n\t\t\t\taria-label={collapsed ? name : undefined}\n\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/link flex h-8 w-full select-none items-center gap-2 p-2 text-left text-bruv-base text-bruv-secondary outline-none\",\n\t\t\t\t\t!disabled && \"cursor-pointer hover:text-bruv-primary\",\n\t\t\t\t\tactive && \"text-bruv-primary\",\n\t\t\t\t\tdisabled && \"cursor-default opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className=\"relative shrink-0\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex size-4 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\t\tactive\n\t\t\t\t\t\t\t\t\t? \"text-bruv-primary\"\n\t\t\t\t\t\t\t\t\t: disabled\n\t\t\t\t\t\t\t\t\t\t? \"text-bruv-tertiary\"\n\t\t\t\t\t\t\t\t\t\t: \"text-bruv-secondary group-hover/link:text-bruv-primary\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{showIndicator && collapsed && (\n\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong absolute -top-0.5 -right-0.5 size-2 rounded-full\">\n\t\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong absolute inset-0 animate-ping rounded-full opacity-75\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{!collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex-1 origin-left truncate\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{showIndicator && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex shrink-0 origin-left items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"relative flex size-2\">\n\t\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong absolute inline-flex size-full animate-ping rounded-full opacity-75\" />\n\t\t\t\t\t\t\t\t<span className=\"bg-bruv-accent-strong relative inline-flex size-2 rounded-full\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{trailing && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"flex shrink-0 origin-left items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{trailing}\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{external && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"origin-left\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ArrowTopRightOnSquareIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t{nested && !collapsed && (\n\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\tclassName=\"origin-left\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronRightIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t)}\n\t\t\t\t</AnimatePresence>\n\t\t\t</Tag>\n\t\t</Hover>\n\t)\n\n\treturn (\n\t\t<Tooltip.Root disabled={!collapsed || mobile}>\n\t\t\t<Tooltip.Trigger className=\"w-full outline-none\" render={<div />}>\n\t\t\t\t{link}\n\t\t\t</Tooltip.Trigger>\n\t\t\t<Tooltip.Content side=\"right\">{name}</Tooltip.Content>\n\t\t</Tooltip.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.BackLink — back navigation with icon\n// ---------------------------------------------------------------------------\n\nexport interface SidebarBackLinkProps {\n\t/** Display name */\n\treadonly name: string\n\t/** Click handler */\n\treadonly onClick?: () => void\n\treadonly className?: string\n}\n\nfunction SidebarBackLink({ name, onClick, className }: SidebarBackLinkProps) {\n\tconst { collapsed } = useSidebar()\n\n\treturn (\n\t\t<Tooltip.Root disabled={!collapsed}>\n\t\t\t<Tooltip.Trigger className=\"w-full outline-none\" render={<div />}>\n\t\t\t\t<div className=\"flex items-center py-1.5\">\n\t\t\t\t\t<Hover\n\t\t\t\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\t\t\t\tborderRadius=\"rounded\"\n\t\t\t\t\t\tfullWidth\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"overflow-hidden transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\t\t\tcollapsed ? \"w-8\" : \"w-full\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onClick}\n\t\t\t\t\t\t\taria-label={collapsed ? name : undefined}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex h-8 w-full cursor-pointer select-none items-center gap-2 p-2 text-left text-bruv-base text-bruv-secondary hover:text-bruv-primary outline-none\",\n\t\t\t\t\t\t\t\tclassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t\t\t<ArrowLeftIcon />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t\t\t\t{!collapsed && (\n\t\t\t\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 origin-left truncate\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</AnimatePresence>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Hover>\n\t\t\t\t</div>\n\t\t\t</Tooltip.Trigger>\n\t\t\t<Tooltip.Content side=\"right\">{name}</Tooltip.Content>\n\t\t</Tooltip.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.CollapseButton — toggle collapse/expand\n// ---------------------------------------------------------------------------\n\nexport interface SidebarCollapseButtonProps {\n\treadonly className?: string\n}\n\nfunction SidebarCollapseIcon({ collapsed }: { readonly collapsed: boolean }) {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"16\"\n\t\t\theight=\"16\"\n\t\t\tviewBox=\"0 0 16 16\"\n\t\t\tfill=\"none\"\n\t\t\tclassName=\"size-4\"\n\t\t>\n\t\t\t{/* Panel outline */}\n\t\t\t<rect\n\t\t\t\tx={2}\n\t\t\t\ty={3}\n\t\t\t\twidth={12}\n\t\t\t\theight={10}\n\t\t\t\trx={2}\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeWidth={1.5}\n\t\t\t/>\n\t\t\t{/* Sidebar indicator — fixed position, width changes */}\n\t\t\t<rect\n\t\t\t\tx={4}\n\t\t\t\ty={5}\n\t\t\t\theight={6}\n\t\t\t\trx={0.75}\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"transition-[width] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\tcollapsed\n\t\t\t\t\t\t? \"[width:1.5px] group-hover/btn:[width:3px]\"\n\t\t\t\t\t\t: \"[width:4px] group-hover/btn:[width:2.5px]\",\n\t\t\t\t)}\n\t\t\t/>\n\t\t</svg>\n\t)\n}\n\nfunction SidebarCollapseButton({ className }: SidebarCollapseButtonProps) {\n\tconst { collapsed, toggle, mobile, setMobileOpen } = useSidebar()\n\n\t// Mobile drawer (expanded): show close button\n\tif (mobile && !collapsed) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tvariant=\"transparent\"\n\t\t\t\tsize=\"md\"\n\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\tonClick={() => setMobileOpen(false)}\n\t\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\t\taria-label=\"Close menu\"\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Mobile inline (collapsed): open the drawer\n\tif (mobile) {\n\t\treturn (\n\t\t\t<Button\n\t\t\t\tvariant=\"transparent\"\n\t\t\t\tsize=\"md\"\n\t\t\t\ticonLeft={<SidebarCollapseIcon collapsed={collapsed} />}\n\t\t\t\tonClick={() => setMobileOpen(true)}\n\t\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\t\taria-label=\"Open menu\"\n\t\t\t/>\n\t\t)\n\t}\n\n\t// Desktop: toggle collapse\n\treturn (\n\t\t<Button\n\t\t\tvariant=\"transparent\"\n\t\t\tsize=\"md\"\n\t\t\ticonLeft={<SidebarCollapseIcon collapsed={collapsed} />}\n\t\t\tonClick={toggle}\n\t\t\tclassName={cn(\"shrink-0\", className)}\n\t\t\taria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n\t\t/>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Layers — directional animation container\n// ---------------------------------------------------------------------------\n\nexport interface SidebarLayersProps {\n\t/** Unique key for the current layer — changes trigger the animation */\n\treadonly activeKey: string\n\t/** Direction of the transition: forward drills in, back goes up */\n\treadonly direction?: \"forward\" | \"back\"\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Wraps sidebar content in directional slide animations.\n *\n * When `activeKey` changes, the old content slides out and new content\n * slides in. `direction=\"forward\"` slides left (drilling in),\n * `direction=\"back\"` slides right (going up).\n *\n * Usage:\n * ```tsx\n * <Sidebar.Layers activeKey={currentSection} direction={navDirection}>\n * {currentSection === \"main\" ? <MainNav /> : <SettingsNav />}\n * </Sidebar.Layers>\n * ```\n */\nfunction SidebarLayers({\n\tactiveKey,\n\tdirection = \"forward\",\n\tclassName,\n\tchildren,\n}: SidebarLayersProps) {\n\tconst slideDistance = 40\n\n\tconst variants = {\n\t\tenter: (d: string) => ({\n\t\t\topacity: 0,\n\t\t\tx: d === \"forward\" ? slideDistance : -slideDistance,\n\t\t}),\n\t\tcenter: { opacity: 1, x: 0 },\n\t\texit: (d: string) => ({\n\t\t\topacity: 0,\n\t\t\tx: d === \"forward\" ? -slideDistance : slideDistance,\n\t\t}),\n\t}\n\n\treturn (\n\t\t<div className={cn(\"relative min-h-0 flex-1\", className)}>\n\t\t\t<AnimatePresence mode=\"popLayout\" initial={false} custom={direction}>\n\t\t\t\t<motion.div\n\t\t\t\t\tkey={activeKey}\n\t\t\t\t\tcustom={direction}\n\t\t\t\t\tvariants={variants}\n\t\t\t\t\tinitial=\"enter\"\n\t\t\t\t\tanimate=\"center\"\n\t\t\t\t\texit=\"exit\"\n\t\t\t\t\ttransition={{ duration: 0.25, type: \"spring\", bounce: 0 }}\n\t\t\t\t\tclassName=\"flex h-full flex-col\"\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</motion.div>\n\t\t\t</AnimatePresence>\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Sidebar.Group — collapsible nav group with indented children\n// ---------------------------------------------------------------------------\n\nexport interface SidebarGroupProps {\n\t/** Group label */\n\treadonly name: string\n\t/** Icon rendered before the label */\n\treadonly icon?: ReactNode\n\t/** Whether a child link is currently active — makes the label bold */\n\treadonly active?: boolean\n\t/** Start collapsed */\n\treadonly defaultCollapsed?: boolean\n\t/** Called when the group header is clicked (in addition to toggling collapse) */\n\treadonly onClick?: () => void\n\t/** Nested links rendered when expanded */\n\treadonly children: ReactNode\n\treadonly className?: string\n}\n\nfunction SidebarGroup({\n\tname,\n\ticon,\n\tactive = false,\n\tdefaultCollapsed = false,\n\tonClick,\n\tchildren,\n\tclassName,\n}: SidebarGroupProps) {\n\tconst { collapsed: sidebarCollapsed } = useSidebar()\n\tconst [isCollapsed, setIsCollapsed] = useState(defaultCollapsed)\n\n\treturn (\n\t\t<div className={cn(\"flex flex-col gap-0.5\", className)}>\n\t\t\t<Hover\n\t\t\t\tactive={active}\n\t\t\t\tbackground=\"bg-bruv-subtle\"\n\t\t\t\tborderRadius=\"rounded\"\n\t\t\t\tfullWidth\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"overflow-hidden transition-[width] duration-400 ease-bruv-out-expo\",\n\t\t\t\t\tsidebarCollapsed ? \"w-8\" : \"w-full\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tsetIsCollapsed(prev => !prev)\n\t\t\t\t\t\tonClick?.()\n\t\t\t\t\t}}\n\t\t\t\t\taria-expanded={!isCollapsed}\n\t\t\t\t\taria-label={sidebarCollapsed ? name : undefined}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"group/grp flex h-8 w-full items-center gap-2 p-2 text-left text-bruv-base text-bruv-primary select-none\",\n\t\t\t\t\t\tactive && \"font-medium\",\n\t\t\t\t\t\t\"cursor-pointer\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-inset\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{icon && (\n\t\t\t\t\t\t<span className=\"relative flex size-4 shrink-0 items-center justify-center\">\n\t\t\t\t\t\t\t<span className=\"text-bruv-secondary flex items-center justify-center transition-opacity duration-150 group-hover/grp:opacity-0 [&>svg]:size-4\">\n\t\t\t\t\t\t\t\t{icon}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"absolute inset-0 size-4 text-bruv-secondary opacity-0 group-hover/grp:opacity-100 transition-all duration-150\",\n\t\t\t\t\t\t\t\t\t!isCollapsed && \"rotate-90\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<AnimatePresence mode=\"popLayout\" initial={false}>\n\t\t\t\t\t\t{!sidebarCollapsed && (\n\t\t\t\t\t\t\t<motion.span\n\t\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.8 }}\n\t\t\t\t\t\t\t\ttransition={{ duration: 0.2, ease: \"easeOut\" }}\n\t\t\t\t\t\t\t\tclassName=\"flex-1 origin-left truncate\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t</motion.span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</AnimatePresence>\n\t\t\t\t</button>\n\t\t\t</Hover>\n\n\t\t\t<AnimatePresence initial={false}>\n\t\t\t\t{!isCollapsed && !sidebarCollapsed && (\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tinitial={{ height: 0, opacity: 0 }}\n\t\t\t\t\t\tanimate={{ height: \"auto\", opacity: 1 }}\n\t\t\t\t\t\texit={{ height: 0, opacity: 0 }}\n\t\t\t\t\t\ttransition={{ duration: 0.2, ease: [0.25, 0.1, 0.25, 1] }}\n\t\t\t\t\t\tclassName=\"overflow-hidden\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5 pb-1 pl-6\">{children}</div>\n\t\t\t\t\t</motion.div>\n\t\t\t\t)}\n\t\t\t</AnimatePresence>\n\t\t</div>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n\tProvider: SidebarProvider,\n\tSection: SidebarSection,\n\tHeader: SidebarHeader,\n\tLabel: SidebarLabel,\n\tLink: SidebarLink,\n\tBackLink: SidebarBackLink,\n\tCollapseButton: SidebarCollapseButton,\n\tLayers: SidebarLayers,\n\tGroup: SidebarGroup,\n})\n","import { Drawer as BaseDrawer } from \"@base-ui/react/drawer\"\nimport { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Side / swipe direction mapping\n// ---------------------------------------------------------------------------\n\ntype DrawerSide = \"right\" | \"left\" | \"bottom\" | \"top\"\n\nconst swipeDirectionMap = {\n\tright: \"right\",\n\tleft: \"left\",\n\tbottom: \"down\",\n\ttop: \"up\",\n} as const satisfies Record<DrawerSide, \"right\" | \"left\" | \"down\" | \"up\">\n\n/**\n * Position classes for the transparent Popup wrapper.\n * The Popup itself is invisible - it just reserves space and\n * carries the slide animation. The visible card floats inside it.\n */\nconst popupPositionStyles = {\n\tright: \"inset-y-0 right-0 w-[min(420px,90vw)] p-2\",\n\tleft: \"inset-y-0 left-0 w-[min(420px,90vw)] p-2\",\n\tbottom: \"inset-x-0 bottom-0 max-h-[85vh] p-2\",\n\ttop: \"inset-x-0 top-0 max-h-[85vh] p-2\",\n} as const\n\n// ---------------------------------------------------------------------------\n// Drawer.Root\n// ---------------------------------------------------------------------------\n\nexport interface DrawerRootProps extends Omit<\n\tComponentProps<typeof BaseDrawer.Root>,\n\t\"swipeDirection\"\n> {\n\t/** Which edge the drawer slides in from. Default: \"right\". */\n\tside?: DrawerSide\n\t/**\n\t * When true (default), automatically switches to \"bottom\" on small viewports.\n\t * The CSS handles this via media queries on the Popup element.\n\t */\n\tresponsive?: boolean\n\tchildren: ReactNode\n}\n\nfunction DrawerRoot({\n\tside = \"right\",\n\tresponsive: _responsive,\n\tchildren,\n\t...props\n}: DrawerRootProps) {\n\treturn (\n\t\t<BaseDrawer.Root swipeDirection={swipeDirectionMap[side]} {...props}>\n\t\t\t{children}\n\t\t</BaseDrawer.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Drawer.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface DrawerTriggerProps extends ComponentProps<\n\ttypeof BaseDrawer.Trigger\n> {}\n\nconst DrawerTrigger = forwardRef<HTMLButtonElement, DrawerTriggerProps>(\n\tfunction DrawerTrigger({ className, ...props }, ref) {\n\t\treturn <BaseDrawer.Trigger ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Backdrop\n// ---------------------------------------------------------------------------\n\nexport interface DrawerBackdropProps extends ComponentProps<\n\ttypeof BaseDrawer.Backdrop\n> {}\n\nconst DrawerBackdrop = forwardRef<HTMLDivElement, DrawerBackdropProps>(\n\tfunction DrawerBackdrop({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDrawer.Backdrop\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\t\"transition-opacity duration-200\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Content\n// ---------------------------------------------------------------------------\n\nexport interface DrawerContentProps extends ComponentProps<\n\ttypeof BaseDrawer.Popup\n> {\n\t/** Which edge. Must match the Root side. Default: \"right\". */\n\tside?: DrawerSide\n\t/** When true, switches to bottom on mobile. Default: true. */\n\tresponsive?: boolean\n}\n\nfunction DrawerContent({\n\tside = \"right\",\n\tresponsive = true,\n\tclassName,\n\tchildren,\n\t...props\n}: DrawerContentProps) {\n\treturn (\n\t\t<BaseDrawer.Portal>\n\t\t\t<DrawerBackdrop />\n\t\t\t<BaseDrawer.Popup\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Transparent positioning frame - slides in from the edge\n\t\t\t\t\t\"group/drawer fixed z-50 flex outline-none\",\n\t\t\t\t\tpopupPositionStyles[side],\n\t\t\t\t\t// Slide animation on the Popup\n\t\t\t\t\t\"transition-transform duration-500 ease-bruv-out-expo\",\n\t\t\t\t\tside === \"right\" && [\n\t\t\t\t\t\t\"data-[starting-style]:translate-x-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:translate-x-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\tside === \"left\" && [\n\t\t\t\t\t\t\"data-[starting-style]:-translate-x-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:-translate-x-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\tside === \"bottom\" && [\n\t\t\t\t\t\t\"data-[starting-style]:translate-y-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:translate-y-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\tside === \"top\" && [\n\t\t\t\t\t\t\"data-[starting-style]:-translate-y-[20%]\",\n\t\t\t\t\t\t\"data-[ending-style]:-translate-y-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t// Responsive: force bottom on mobile\n\t\t\t\t\tresponsive && [\n\t\t\t\t\t\t\"max-md:inset-x-0 max-md:inset-y-auto max-md:bottom-0 max-md:right-auto max-md:left-auto\",\n\t\t\t\t\t\t\"max-md:w-full max-md:max-h-[85vh]\",\n\t\t\t\t\t\t\"max-md:data-[starting-style]:translate-x-0 max-md:data-[starting-style]:translate-y-[20%]\",\n\t\t\t\t\t\t\"max-md:data-[ending-style]:translate-x-0 max-md:data-[ending-style]:translate-y-[20%]\",\n\t\t\t\t\t],\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{/* Visible shell - scale + fade animation */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-1 flex min-h-0 flex-1 rounded-bruv-lg p-0.5 shadow-xl\",\n\t\t\t\t\t\t\"transition-[opacity,scale] duration-500 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"group-data-[starting-style]/drawer:scale-95 group-data-[starting-style]/drawer:opacity-0\",\n\t\t\t\t\t\t\"group-data-[ending-style]/drawer:scale-95 group-data-[ending-style]/drawer:opacity-0\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{/* Inner panel - content container */}\n\t\t\t\t\t<div className=\"bg-bruv-base-2 border-bruv-neutral rounded-bruv-md flex min-h-0 flex-1 flex-col overflow-hidden border\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</BaseDrawer.Popup>\n\t\t</BaseDrawer.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Drawer.Header\n// ---------------------------------------------------------------------------\n\nexport interface DrawerHeaderProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DrawerHeader = forwardRef<HTMLDivElement, DrawerHeaderProps>(\n\tfunction DrawerHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral flex items-center justify-between border-b px-4 py-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Title\n// ---------------------------------------------------------------------------\n\nexport interface DrawerTitleProps extends ComponentProps<\n\ttypeof BaseDrawer.Title\n> {}\n\nconst DrawerTitle = forwardRef<HTMLHeadingElement, DrawerTitleProps>(\n\tfunction DrawerTitle({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDrawer.Title\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Description\n// ---------------------------------------------------------------------------\n\nexport interface DrawerDescriptionProps extends ComponentProps<\n\ttypeof BaseDrawer.Description\n> {}\n\nconst DrawerDescription = forwardRef<\n\tHTMLParagraphElement,\n\tDrawerDescriptionProps\n>(function DrawerDescription({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseDrawer.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-bruv-secondary text-bruv-base\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Drawer.Body\n// ---------------------------------------------------------------------------\n\nexport interface DrawerBodyProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DrawerBody = forwardRef<HTMLDivElement, DrawerBodyProps>(\n\tfunction DrawerBody({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"flex-1 overflow-y-auto p-4\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Footer\n// ---------------------------------------------------------------------------\n\nexport interface DrawerFooterProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DrawerFooter = forwardRef<HTMLDivElement, DrawerFooterProps>(\n\tfunction DrawerFooter({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral flex items-center justify-end gap-2 border-t p-3\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Drawer.Close\n// ---------------------------------------------------------------------------\n\nexport interface DrawerCloseProps extends ComponentProps<\n\ttypeof BaseDrawer.Close\n> {\n\t/** Show default XMarkIcon icon. Default: true when no children. */\n\tasIcon?: boolean\n}\n\nconst DrawerClose = forwardRef<HTMLButtonElement, DrawerCloseProps>(\n\tfunction DrawerClose({ asIcon, className, children, ...props }, ref) {\n\t\tconst showIcon = asIcon ?? !children\n\n\t\tif (showIcon) {\n\t\t\treturn (\n\t\t\t\t<BaseDrawer.Close\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-bruv-tertiary hover:text-bruv-primary -m-1 flex size-7 cursor-pointer items-center justify-center rounded-bruv-sm outline-none\",\n\t\t\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<XMarkIcon className=\"size-4\" />\n\t\t\t\t</BaseDrawer.Close>\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t<BaseDrawer.Close ref={ref} className={cn(className)} {...props}>\n\t\t\t\t{children}\n\t\t\t</BaseDrawer.Close>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Drawer = {\n\tRoot: DrawerRoot,\n\tTrigger: DrawerTrigger,\n\tContent: DrawerContent,\n\tHeader: DrawerHeader,\n\tTitle: DrawerTitle,\n\tDescription: DrawerDescription,\n\tBody: DrawerBody,\n\tFooter: DrawerFooter,\n\tClose: DrawerClose,\n}\n","import { forwardRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { FlickeringGrid } from \"../flickering-grid\"\n\nexport interface SkeletonProps {\n\t/** Use rounded-full instead of rounded-bruv-md (for avatar placeholders) */\n\tcircular?: boolean\n\tclassName?: string\n}\n\n/**\n * Skeleton loading placeholder with a sweeping pixel wave.\n *\n * Uses the `sweepOnly` mode of FlickeringGrid: pixels light up purely\n * based on the sweep wave position, with a per-pixel noise offset\n * creating a fuzzy, fringing edge on the wave front. No random flicker,\n * so the effect reads as a single directional motion rather than noise.\n */\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n\tfunction Skeleton({ circular, className }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative overflow-hidden bg-bruv-subtle\",\n\t\t\t\t\tcircular ? \"rounded-full\" : \"rounded-xs\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<FlickeringGrid\n\t\t\t\t\tsquareSize={4}\n\t\t\t\t\tgridGap={2}\n\t\t\t\t\tcolor=\"var(--text-color-bruv-secondary)\"\n\t\t\t\t\tmaxOpacity={0.05}\n\t\t\t\t\tsweep\n\t\t\t\t\tsweepOnly\n\t\t\t\t\tsweepDirection=\"right\"\n\t\t\t\t\tsweepDuration={1.5}\n\t\t\t\t\tsweepWidth={0.4}\n\t\t\t\t\tsweepNoise={0.1}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { useEffect, useRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// FlickeringGrid\n//\n// Canvas-based pixel grid that either flickers randomly, sweeps a wave of\n// brightness across, or both. Designed for loading states and decorative\n// backgrounds.\n//\n// Performance: one canvas draw call per frame regardless of pixel count.\n// Uses IntersectionObserver to pause when offscreen and ResizeObserver\n// to adapt to container size changes. DPR-aware for retina sharpness.\n// ---------------------------------------------------------------------------\n\nexport interface FlickeringGridProps {\n\t/** Size of each square pixel in px */\n\tsquareSize?: number\n\t/** Gap between squares in px */\n\tgridGap?: number\n\t/** Probability per second that a pixel changes opacity (0-1) */\n\tflickerChance?: number\n\t/** Pixel color — CSS color string. Use `currentColor` to inherit from text */\n\tcolor?: string\n\t/** Max opacity for any pixel (0-1) */\n\tmaxOpacity?: number\n\t/**\n\t * Enable a sweeping wave of brightness across the grid.\n\t * When enabled, pixels near the wave front appear brighter.\n\t */\n\tsweep?: boolean\n\t/** Sweep direction */\n\tsweepDirection?: \"left\" | \"right\"\n\t/** Duration of one sweep cycle in seconds */\n\tsweepDuration?: number\n\t/** Width of the sweep band as a fraction of total width (0-1) */\n\tsweepWidth?: number\n\t/**\n\t * When true, disables random flicker and drives pixel opacity purely\n\t * from the sweep wave. Each pixel gets a fixed noise offset so the\n\t * wave front has a fuzzy, fringing edge instead of a clean line.\n\t */\n\tsweepOnly?: boolean\n\t/**\n\t * Magnitude of the per-pixel noise offset (0-1) when `sweepOnly` is true.\n\t * Higher values produce fuzzier, more chaotic edges.\n\t */\n\tsweepNoise?: number\n\tclassName?: string\n}\n\n/**\n * Resolves a CSS color string (hex, rgb, currentColor, var(--token), etc.)\n * into whatever the browser returns for `getComputedStyle().color`.\n *\n * We set the color inline on the element, read the computed value, then\n * restore the previous inline color. Using the real element ensures\n * proper cascade resolution for CSS variables.\n *\n * The returned string is passed directly to `ctx.fillStyle`; opacity\n * is applied via `ctx.globalAlpha` at draw time, which sidesteps any\n * need to parse color-space strings like `rgb()`, `oklch()`, or `color()`.\n */\nfunction resolveColor(el: HTMLElement, color: string): string {\n\tconst previous = el.style.color\n\tel.style.color = color\n\tconst computed = getComputedStyle(el).color\n\tel.style.color = previous\n\t// Guard against empty or `inherit` that would fall back to canvas default.\n\treturn computed || \"#000\"\n}\n\nexport function FlickeringGrid({\n\tsquareSize = 6,\n\tgridGap = 0,\n\tflickerChance = 0.3,\n\tcolor = \"currentColor\",\n\tmaxOpacity = 0.3,\n\tsweep = false,\n\tsweepDirection = \"left\",\n\tsweepDuration = 2.5,\n\tsweepWidth = 0.15,\n\tsweepOnly = false,\n\tsweepNoise = 0.12,\n\tclassName,\n}: FlickeringGridProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\tconst canvasRef = useRef<HTMLCanvasElement>(null)\n\n\tuseEffect(() => {\n\t\tconst container = containerRef.current\n\t\tconst canvas = canvasRef.current\n\t\tif (!container || !canvas) return\n\n\t\tconst ctx = canvas.getContext(\"2d\")\n\t\tif (!ctx) return\n\n\t\tlet resolvedColor = resolveColor(container, color)\n\n\t\tlet cols = 0\n\t\tlet rows = 0\n\t\tlet squares = new Float32Array(0)\n\t\tlet noise = new Float32Array(0)\n\t\tlet dpr = 1\n\t\tlet width = 0\n\t\tlet height = 0\n\n\t\t// Sweep state\n\t\tconst startTime = performance.now()\n\n\t\tfunction setupCanvas() {\n\t\t\tif (!canvas || !container) return\n\t\t\tdpr = window.devicePixelRatio || 1\n\t\t\twidth = container.clientWidth\n\t\t\theight = container.clientHeight\n\t\t\tcanvas.width = width * dpr\n\t\t\tcanvas.height = height * dpr\n\t\t\tcanvas.style.width = `${width}px`\n\t\t\tcanvas.style.height = `${height}px`\n\n\t\t\tconst step = squareSize + gridGap\n\t\t\t// N rows fit when N*squareSize + (N-1)*gap ≤ height\n\t\t\t// Rearranged: N ≤ (height + gap) / step\n\t\t\tcols = Math.max(1, Math.floor((width + gridGap) / step))\n\t\t\trows = Math.max(1, Math.floor((height + gridGap) / step))\n\n\t\t\tsquares = new Float32Array(cols * rows)\n\t\t\tnoise = new Float32Array(cols * rows)\n\t\t\tfor (let i = 0; i < squares.length; i++) {\n\t\t\t\tsquares[i] = Math.random() * maxOpacity\n\t\t\t\t// Per-pixel noise offset in [-sweepNoise, +sweepNoise]\n\t\t\t\tnoise[i] = (Math.random() - 0.5) * 2 * sweepNoise\n\t\t\t}\n\t\t}\n\n\t\tfunction updateSquares(deltaTime: number) {\n\t\t\t// Skip random flicker when sweepOnly is enabled\n\t\t\tif (sweepOnly) return\n\t\t\tfor (let i = 0; i < squares.length; i++) {\n\t\t\t\tif (Math.random() < flickerChance * deltaTime) {\n\t\t\t\t\tsquares[i] = Math.random() * maxOpacity\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction drawGrid(time: number) {\n\t\t\tif (!ctx || !canvas) return\n\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height)\n\t\t\t// Set the fill to the resolved color once. We modulate per-pixel\n\t\t\t// visibility via globalAlpha, which works with any color space\n\t\t\t// the browser returns (rgb, oklch, color()).\n\t\t\tctx.fillStyle = resolvedColor\n\n\t\t\tconst step = squareSize + gridGap\n\n\t\t\t// Sweep position: 0 to 1+sweepWidth so the band fully exits the frame\n\t\t\tlet sweepPos = 0\n\t\t\tif (sweep) {\n\t\t\t\tconst cycle = ((time - startTime) / 1000 / sweepDuration) % 1\n\t\t\t\tsweepPos = sweepDirection === \"left\" ? 1 - cycle : cycle\n\t\t\t\t// Extend range slightly so the sweep fully enters and exits\n\t\t\t\tsweepPos = sweepPos * (1 + sweepWidth * 2) - sweepWidth\n\t\t\t}\n\n\t\t\tfor (let i = 0; i < cols; i++) {\n\t\t\t\tfor (let j = 0; j < rows; j++) {\n\t\t\t\t\tconst idx = i * rows + j\n\t\t\t\t\tlet opacity: number\n\n\t\t\t\t\tif (sweepOnly && sweep) {\n\t\t\t\t\t\t// Opacity is driven purely by the sweep wave.\n\t\t\t\t\t\t// Each pixel's position in the wave is shifted by its\n\t\t\t\t\t\t// per-pixel noise offset, creating a fuzzy edge.\n\t\t\t\t\t\tconst colFrac = cols > 1 ? i / (cols - 1) : 0\n\t\t\t\t\t\tconst shifted = colFrac + (noise[idx] ?? 0)\n\t\t\t\t\t\tconst dist = Math.abs(shifted - sweepPos)\n\t\t\t\t\t\tconst boost = Math.max(0, 1 - dist / sweepWidth)\n\t\t\t\t\t\t// Smoothstep for a soft falloff\n\t\t\t\t\t\tconst smooth = boost * boost * (3 - 2 * boost)\n\t\t\t\t\t\topacity = smooth * maxOpacity\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Base opacity from the random flicker buffer\n\t\t\t\t\t\topacity = squares[idx] ?? 0\n\n\t\t\t\t\t\t// Apply sweep boost if enabled: pixels near the wave\n\t\t\t\t\t\t// front get brighter on top of their base opacity.\n\t\t\t\t\t\tif (sweep) {\n\t\t\t\t\t\t\tconst colFrac = cols > 1 ? i / (cols - 1) : 0\n\t\t\t\t\t\t\tconst dist = Math.abs(colFrac - sweepPos)\n\t\t\t\t\t\t\tconst boost = Math.max(0, 1 - dist / sweepWidth)\n\t\t\t\t\t\t\tconst smooth = boost * boost * (3 - 2 * boost)\n\t\t\t\t\t\t\topacity = Math.min(\n\t\t\t\t\t\t\t\tmaxOpacity * 1.5,\n\t\t\t\t\t\t\t\topacity + smooth * maxOpacity,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opacity < 0.01) continue\n\n\t\t\t\t\tctx.globalAlpha = opacity\n\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\ti * step * dpr,\n\t\t\t\t\t\tj * step * dpr,\n\t\t\t\t\t\tsquareSize * dpr,\n\t\t\t\t\t\tsquareSize * dpr,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.globalAlpha = 1\n\t\t}\n\n\t\tsetupCanvas()\n\n\t\tlet rafId = 0\n\t\tlet lastTime = performance.now()\n\t\tlet inView = true\n\n\t\tfunction frame(time: number) {\n\t\t\tif (!inView) return\n\t\t\tconst deltaTime = (time - lastTime) / 1000\n\t\t\tlastTime = time\n\t\t\tupdateSquares(deltaTime)\n\t\t\tdrawGrid(time)\n\t\t\trafId = requestAnimationFrame(frame)\n\t\t}\n\n\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\tsetupCanvas()\n\t\t})\n\t\tresizeObserver.observe(container)\n\n\t\tconst intersectionObserver = new IntersectionObserver(\n\t\t\t([entry]) => {\n\t\t\t\tinView = entry?.isIntersecting ?? false\n\t\t\t\tif (inView) {\n\t\t\t\t\tlastTime = performance.now()\n\t\t\t\t\trafId = requestAnimationFrame(frame)\n\t\t\t\t} else {\n\t\t\t\t\tcancelAnimationFrame(rafId)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ threshold: 0 },\n\t\t)\n\t\tintersectionObserver.observe(canvas)\n\n\t\t// Re-resolve the color when the theme changes so CSS variables\n\t\t// (like var(--text-color-bruv-secondary)) pick up new values.\n\t\tconst themeObserver = new MutationObserver(() => {\n\t\t\tresolvedColor = resolveColor(container, color)\n\t\t})\n\t\tthemeObserver.observe(document.documentElement, {\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\"data-theme\", \"class\"],\n\t\t})\n\n\t\treturn () => {\n\t\t\tcancelAnimationFrame(rafId)\n\t\t\tresizeObserver.disconnect()\n\t\t\tintersectionObserver.disconnect()\n\t\t\tthemeObserver.disconnect()\n\t\t}\n\t}, [\n\t\tsquareSize,\n\t\tgridGap,\n\t\tflickerChance,\n\t\tcolor,\n\t\tmaxOpacity,\n\t\tsweep,\n\t\tsweepDirection,\n\t\tsweepDuration,\n\t\tsweepWidth,\n\t\tsweepOnly,\n\t\tsweepNoise,\n\t])\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\"pointer-events-none size-full\", className)}\n\t\t\taria-hidden=\"true\"\n\t\t>\n\t\t\t<canvas ref={canvasRef} />\n\t\t</div>\n\t)\n}\n","import {\n\tcreateContext,\n\tuseContext,\n\ttype ComponentType,\n\ttype ReactNode,\n} from \"react\"\n\nexport type SidebarLinkComponent = ComponentType<{\n\treadonly to?: string\n\treadonly href?: string\n\treadonly className?: string\n\treadonly children?: ReactNode\n}>\n\nexport interface SidebarContextValue {\n\treadonly collapsed: boolean\n\treadonly toggle: () => void\n\treadonly linkComponent?: SidebarLinkComponent\n\treadonly mobile: boolean\n\treadonly mobileOpen: boolean\n\treadonly setMobileOpen: (open: boolean) => void\n}\n\nexport const SidebarContext = createContext<SidebarContextValue | null>(null)\n\nexport function useSidebar(): SidebarContextValue {\n\tconst ctx = useContext(SidebarContext)\n\tif (!ctx) {\n\t\tthrow new Error(\n\t\t\t\"useSidebar must be used within a <Sidebar> or <Sidebar.Provider>\",\n\t\t)\n\t}\n\treturn ctx\n}\n\n/** Returns the sidebar context if available, or null. */\nexport function useSidebarOptional(): SidebarContextValue | null {\n\treturn useContext(SidebarContext)\n}\n","import { forwardRef, type ReactElement, type ReactNode } from \"react\"\nimport { Select as BaseSelect } from \"@base-ui/react/select\"\nimport { ChevronUpDownIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button, type ButtonSize } from \"../button\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SelectItem {\n\tvalue: string\n\tlabel: string\n\ticon?: ReactNode\n\t[key: string]: unknown\n}\n\n// ---------------------------------------------------------------------------\n// Select (Root)\n// ---------------------------------------------------------------------------\n\nexport interface SelectProps {\n\t/** Controlled value */\n\tvalue?: string\n\t/** Uncontrolled default value */\n\tdefaultValue?: string\n\t/** Called when a value is selected */\n\tonValueChange?: (value: string) => void\n\t/** Item data for rendering and value display */\n\titems: SelectItem[]\n\t/** Whether the select is disabled */\n\tdisabled?: boolean\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Select component for choosing from a list of predefined options.\n *\n * For searchable/filterable lists, use Combobox instead.\n *\n * Wraps Base UI Select.Root with shared Menu visual primitives.\n */\nexport function Select({\n\tvalue,\n\tdefaultValue,\n\tonValueChange,\n\titems,\n\tdisabled,\n\tchildren,\n\tclassName,\n}: SelectProps): ReactElement {\n\treturn (\n\t\t<BaseSelect.Root\n\t\t\tvalue={value}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tonValueChange={\n\t\t\t\tonValueChange\n\t\t\t\t\t? val => {\n\t\t\t\t\t\t\tif (val != null) onValueChange(val)\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\titems={items}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t{className ? <div className={className}>{children}</div> : children}\n\t\t</BaseSelect.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// SelectTrigger — composable\n// ---------------------------------------------------------------------------\n\nexport interface SelectTriggerProps {\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Fully composable trigger. Renders whatever children you give it as the\n * element that opens the select popup.\n */\nexport const SelectTrigger = forwardRef<HTMLButtonElement, SelectTriggerProps>(\n\tfunction SelectTrigger({ children, className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"cursor-pointer rounded-bruv-md outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseSelect.Trigger>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectButton — pre-styled trigger\n// ---------------------------------------------------------------------------\n\nexport interface SelectButtonProps {\n\t/** Placeholder text shown when no value is selected */\n\tplaceholder?: string\n\t/** Size of the button */\n\tsize?: ButtonSize\n\tclassName?: string\n}\n\n/**\n * Pre-styled trigger for form contexts.\n * Renders as a Button with the selected value + chevron icon.\n */\nexport const SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(\n\tfunction SelectButton({ placeholder, size, className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Trigger\n\t\t\t\tref={ref}\n\t\t\t\trender={\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\ticonRight={<ChevronUpDownIcon />}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseSelect.Value placeholder={placeholder} />\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectContent — popup with list\n// ---------------------------------------------------------------------------\n\nexport interface SelectContentProps {\n\t/** Alignment relative to trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\t/** Minimum width */\n\tminWidth?: string\n\t/** SelectOption elements */\n\tchildren?: ReactNode\n\tclassName?: string\n}\n\n/**\n * Popup with a scrollable list of options.\n * Uses Base UI Select primitives with shared Menu visuals.\n */\nexport function SelectContent({\n\talign = \"start\",\n\tside = \"bottom\",\n\tsideOffset = 4,\n\tminWidth = \"min-w-[220px]\",\n\tchildren,\n\tclassName,\n}: SelectContentProps): ReactElement {\n\treturn (\n\t\t<BaseSelect.Portal>\n\t\t\t<BaseSelect.Positioner\n\t\t\t\talign={align}\n\t\t\t\tside={side}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\talignItemWithTrigger={false}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseSelect.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t<BaseSelect.List render={<Menu.List />}>{children}</BaseSelect.List>\n\t\t\t\t</BaseSelect.Popup>\n\t\t\t</BaseSelect.Positioner>\n\t\t</BaseSelect.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// SelectOption\n// ---------------------------------------------------------------------------\n\nexport interface SelectOptionProps {\n\t/** Value for this option */\n\tvalue: string\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\tchildren: ReactNode\n\tclassName?: string\n}\n\n/**\n * Individual option in the select popup.\n * Automatically includes a checkmark indicator when selected.\n */\nexport const SelectOption = forwardRef<HTMLDivElement, SelectOptionProps>(\n\tfunction SelectOption({ value, icon, children, className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Item\n\t\t\t\tref={ref}\n\t\t\t\tvalue={value}\n\t\t\t\trender={<Menu.Item icon={icon} className={className} />}\n\t\t\t>\n\t\t\t\t<BaseSelect.ItemText className=\"relative z-[1] flex-1\">\n\t\t\t\t\t{children}\n\t\t\t\t</BaseSelect.ItemText>\n\t\t\t\t<BaseSelect.ItemIndicator render={<Menu.ItemIndicator />} />\n\t\t\t</BaseSelect.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectSeparator\n// ---------------------------------------------------------------------------\n\nexport interface SelectSeparatorProps {\n\tclassName?: string\n}\n\nexport const SelectSeparator = forwardRef<HTMLDivElement, SelectSeparatorProps>(\n\tfunction SelectSeparator({ className }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Separator\n\t\t\t\tref={ref}\n\t\t\t\trender={<Menu.Separator className={className} />}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SelectGroup / SelectGroupLabel\n// ---------------------------------------------------------------------------\n\nexport interface SelectGroupProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const SelectGroup = forwardRef<HTMLDivElement, SelectGroupProps>(\n\tfunction SelectGroup({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseSelect.Group ref={ref} className={cn(\"flex flex-col\", className)}>\n\t\t\t\t{children}\n\t\t\t</BaseSelect.Group>\n\t\t)\n\t},\n)\n\nexport interface SelectGroupLabelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const SelectGroupLabel = forwardRef<\n\tHTMLDivElement,\n\tSelectGroupLabelProps\n>(function SelectGroupLabel({ className, children }, ref) {\n\treturn (\n\t\t<BaseSelect.GroupLabel\n\t\t\tref={ref}\n\t\t\trender={<Menu.GroupLabel className={className} />}\n\t\t>\n\t\t\t{children}\n\t\t</BaseSelect.GroupLabel>\n\t)\n})\n","import { forwardRef } from \"react\"\nimport { Separator as BaseSeparator } from \"@base-ui/react/separator\"\nimport type { ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface SeparatorProps extends ComponentProps<typeof BaseSeparator> {\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\nexport const Separator = forwardRef<HTMLHRElement, SeparatorProps>(\n\tfunction Separator({ orientation = \"horizontal\", className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseSeparator\n\t\t\t\tref={ref}\n\t\t\t\torientation={orientation}\n\t\t\t\tclassName={cn(\n\t\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t\t? \"w-full border-t border-bruv-neutral\"\n\t\t\t\t\t\t: \"self-stretch border-l border-bruv-neutral\",\n\t\t\t\t\t\"shrink-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n","import { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport {\n\tforwardRef,\n\ttype ComponentPropsWithoutRef,\n\ttype MouseEvent,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst filledVariantStyles = {\n\tneutral: \"bg-bruv-subtle text-bruv-secondary\",\n\taccent: \"bg-bruv-accent-subtle text-bruv-accent\",\n\tdanger: \"bg-bruv-danger-subtle text-bruv-danger\",\n\twarn: \"bg-bruv-warn-subtle text-bruv-warn\",\n\tsuccess: \"bg-bruv-success-subtle text-bruv-success\",\n} as const\n\nconst borderVariantStyles = {\n\tneutral: \"border border-current text-bruv-secondary\",\n\taccent: \"border border-current text-bruv-accent\",\n\tdanger: \"border border-current text-bruv-danger\",\n\twarn: \"border border-current text-bruv-warn\",\n\tsuccess: \"border border-current text-bruv-success\",\n} as const\n\nconst sizeStyles = {\n\tsm: \"px-1.5 py-0.5 text-bruv-sm\",\n\tmd: \"px-2 py-0.5 text-bruv-base\",\n} as const\n\nconst gapStyles = {\n\tsm: \"gap-1\",\n\tmd: \"gap-1.5\",\n} as const\n\nconst dotSizeStyles = {\n\tsm: \"size-1.5\",\n\tmd: \"size-2\",\n} as const\n\nconst dotVariantStyles = {\n\tneutral: \"bg-bruv-tertiary\",\n\taccent: \"bg-bruv-accent\",\n\tdanger: \"bg-bruv-danger\",\n\twarn: \"bg-bruv-warn\",\n\tsuccess: \"bg-bruv-success\",\n} as const\n\nconst dismissIconSizeStyles = {\n\tsm: \"size-3\",\n\tmd: \"size-3.5\",\n} as const\n\nexport type BadgeVariant = keyof typeof filledVariantStyles\nexport type BadgeSize = keyof typeof sizeStyles\nexport type BadgeDotPosition = \"leading\" | \"trailing\"\n\nexport interface BadgeProps extends ComponentPropsWithoutRef<\"span\"> {\n\t/** Semantic intent (color). */\n\tvariant?: BadgeVariant\n\t/** Size of the badge. */\n\tsize?: BadgeSize\n\t/**\n\t * Render with a border instead of a filled (subtle) background.\n\t * Border color is bound to the variant's text color so contrast\n\t * passes WCAG in both light and dark mode.\n\t */\n\tborder?: boolean\n\t/** Show a status dot whose color follows `variant`. */\n\tdot?: boolean\n\t/** Where the dot sits relative to the label. Default `\"leading\"`. */\n\tdotPosition?: BadgeDotPosition\n\t/**\n\t * Render a trailing dismiss (×) button and call this on click.\n\t * Receives the event so callers can `stopPropagation()` when the\n\t * badge sits inside an interactive parent.\n\t */\n\tonDismiss?: (event: MouseEvent<HTMLButtonElement>) => void\n\t/** Accessible label for the dismiss button. */\n\tdismissLabel?: string\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n\t{\n\t\tvariant = \"neutral\",\n\t\tsize = \"sm\",\n\t\tborder = false,\n\t\tdot = false,\n\t\tdotPosition = \"leading\",\n\t\tonDismiss,\n\t\tdismissLabel = \"Dismiss\",\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst variantStyles = border ? borderVariantStyles : filledVariantStyles\n\tconst hasAdornment = dot || onDismiss != null\n\n\tconst dotNode = dot ? (\n\t\t<span\n\t\t\taria-hidden\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex shrink-0 rounded-full\",\n\t\t\t\tdotSizeStyles[size],\n\t\t\t\tdotVariantStyles[variant],\n\t\t\t)}\n\t\t/>\n\t) : null\n\n\treturn (\n\t\t<span\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex items-center rounded-bruv-md font-medium leading-tight\",\n\t\t\t\tsizeStyles[size],\n\t\t\t\thasAdornment && gapStyles[size],\n\t\t\t\tvariantStyles[variant],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{dot && dotPosition === \"leading\" && dotNode}\n\t\t\t{children}\n\t\t\t{dot && dotPosition === \"trailing\" && dotNode}\n\t\t\t{onDismiss && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label={dismissLabel}\n\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"-mr-0.5 inline-flex shrink-0 cursor-pointer items-center justify-center rounded-bruv-sm\",\n\t\t\t\t\t\t\"opacity-70 transition-opacity hover:opacity-100\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-1\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<XMarkIcon className={dismissIconSizeStyles[size]} />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</span>\n\t)\n})\n","import {\n\tforwardRef,\n\tuseSyncExternalStore,\n\ttype ComponentPropsWithoutRef,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Platform detection\n// ---------------------------------------------------------------------------\n\nfunction getIsMac(): boolean {\n\tif (typeof navigator === \"undefined\") return true\n\tconst nav: Navigator & {\n\t\treadonly userAgentData?: { readonly platform?: string }\n\t} = navigator\n\tconst platform = nav.userAgentData?.platform ?? nav.platform\n\treturn /(Mac|iPhone|iPad|iPod)/i.test(platform ?? \"\")\n}\n\n/** Cached result — platform never changes within a session. */\nlet cachedIsMac: boolean | undefined\n\nfunction subscribe() {\n\treturn () => {}\n}\n\nfunction getSnapshot(): boolean {\n\tif (cachedIsMac === undefined) cachedIsMac = getIsMac()\n\treturn cachedIsMac\n}\n\nfunction getServerSnapshot(): boolean {\n\treturn true\n}\n\n/**\n * Returns `true` on macOS / iOS, `false` on Windows / Linux.\n * SSR-safe (defaults to Mac).\n */\nexport function useIsMac(): boolean {\n\treturn useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n\n// ---------------------------------------------------------------------------\n// Key mapping\n// ---------------------------------------------------------------------------\n\nconst MAC_KEYS: Record<string, string> = {\n\tmod: \"\\u2318\",\n\tctrl: \"\\u2303\",\n\talt: \"\\u2325\",\n\tshift: \"\\u21E7\",\n\tenter: \"\\u21B5\",\n\tescape: \"Esc\",\n\tbackspace: \"\\u232B\",\n\tdelete: \"\\u2326\",\n\ttab: \"\\u21E5\",\n\tspace: \"Space\",\n\tup: \"\\u2191\",\n\tdown: \"\\u2193\",\n\tleft: \"\\u2190\",\n\tright: \"\\u2192\",\n}\n\nconst WIN_KEYS: Record<string, string> = {\n\tmod: \"Ctrl\",\n\tctrl: \"Ctrl\",\n\talt: \"Alt\",\n\tshift: \"Shift\",\n\tenter: \"\\u21B5\",\n\tescape: \"Esc\",\n\tbackspace: \"\\u232B\",\n\tdelete: \"Del\",\n\ttab: \"Tab\",\n\tspace: \"Space\",\n\tup: \"\\u2191\",\n\tdown: \"\\u2193\",\n\tleft: \"\\u2190\",\n\tright: \"\\u2192\",\n}\n\nfunction resolveKey(token: string, isMac: boolean): string {\n\tconst lower = token.toLowerCase()\n\tconst map = isMac ? MAC_KEYS : WIN_KEYS\n\treturn map[lower] ?? token.toUpperCase()\n}\n\nfunction formatKeys(raw: string, isMac: boolean): string {\n\treturn raw\n\t\t.split(\"+\")\n\t\t.map(t => resolveKey(t.trim(), isMac))\n\t\t.join(\" \")\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport interface KbdProps extends ComponentPropsWithoutRef<\"kbd\"> {\n\t/**\n\t * A `+`-separated shortcut string using abstract key names.\n\t *\n\t * Tokens are mapped per-platform and rendered together\n\t * inside a single key cap, separated by spaces:\n\t * `\"mod+shift+k\"` → `⌘ ⇧ K` (Mac) / `Ctrl Shift K` (Win)\n\t *\n\t * - `mod` → ⌘ (Mac) / Ctrl (Win)\n\t * - `alt` → ⌥ (Mac) / Alt (Win)\n\t * - `shift` → ⇧ (Mac) / Shift (Win)\n\t * - `ctrl` → ⌃ (Mac) / Ctrl (Win)\n\t * - `enter`, `escape`, `backspace`, `delete`, `tab`, `space`\n\t * - `up`, `down`, `left`, `right`\n\t * - Any other token is uppercased as-is.\n\t *\n\t * @example \"mod+k\" → ⌘ K (Mac) or Ctrl K (Win)\n\t * @example \"mod+shift+s\" → ⌘ ⇧ S (Mac) or Ctrl Shift S (Win)\n\t */\n\tkeys?: string\n}\n\n/**\n * Renders keyboard keys or shortcuts in a single styled `<kbd>` element.\n *\n * When `keys` is provided, parses the `+`-separated string and renders\n * all tokens inside one key cap with platform-aware symbols.\n * All tokens are joined with spaces inside one key cap.\n *\n * When `children` is provided (without `keys`), renders a single `<kbd>`\n * with the raw content — useful for one-off custom key caps.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(function Kbd(\n\t{ keys, className, children, ...props },\n\tref,\n) {\n\tconst isMac = useIsMac()\n\n\treturn (\n\t\t<kbd\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex h-5 min-w-5 items-center justify-center gap-1 rounded border border-bruv-neutral bg-bruv-base-1 px-1.5 font-bruv-sans text-xs font-medium leading-tight text-bruv-secondary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{keys ? formatKeys(keys, isMac) : children}\n\t\t</kbd>\n\t)\n})\n","import { Field } from \"@base-ui/react/field\"\nimport {\n\tforwardRef,\n\ttype ComponentProps,\n\ttype FormHTMLAttributes,\n\ttype ReactNode,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst inputSizeStyles = {\n\tsm: \"px-2.5 py-1 text-bruv-sm min-h-7\",\n\tmd: \"px-3 py-1.5 text-bruv-base min-h-8\",\n} as const\n\nexport type FormInputSize = keyof typeof inputSizeStyles\n\nexport interface FormRootProps extends FormHTMLAttributes<HTMLFormElement> {}\n\nexport const FormRoot = forwardRef<HTMLFormElement, FormRootProps>(\n\tfunction FormRoot({ className, noValidate = true, ...props }, ref) {\n\t\treturn (\n\t\t\t<form\n\t\t\t\tref={ref}\n\t\t\t\tnoValidate={noValidate}\n\t\t\t\tclassName={cn(\"flex flex-col gap-4\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormFieldProps extends ComponentProps<typeof Field.Root> {}\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n\tfunction FormField({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Root\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex flex-col gap-1.5\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormLabelProps extends ComponentProps<typeof Field.Label> {\n\trequired?: boolean\n}\n\nexport const FormLabel = forwardRef<HTMLLabelElement, FormLabelProps>(\n\tfunction FormLabel({ required, className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Label\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-base font-medium text-bruv-primary\",\n\t\t\t\t\t\"data-[disabled]:text-bruv-tertiary data-[disabled]:cursor-not-allowed\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{required && (\n\t\t\t\t\t<span className=\"text-bruv-danger ml-0.5\" aria-hidden=\"true\">\n\t\t\t\t\t\t*\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</Field.Label>\n\t\t)\n\t},\n)\n\n/** Shared visual styles for standalone input (no icons) */\nconst inputStyles = [\n\t\"w-full rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 text-bruv-primary\",\n\t\"outline-none\",\n\t\"placeholder:text-bruv-tertiary\",\n\t\"ring-bruv-neutral ring-0 transition-[box-shadow,color,border-color] duration-150 ease-out\",\n\t\"focus:ring-2 focus:border-bruv-neutral-strong\",\n\t\"motion-reduce:transition-none\",\n\t\"data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n\t\"data-[invalid]:border-bruv-danger data-[invalid]:focus:ring-bruv-danger/30\",\n\t\"data-[valid]:border-bruv-success\",\n]\n\n/** Wrapper styles when icons are present - mirrors inputStyles but uses has-[:focus] */\nconst wrapperStyles = [\n\t\"rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 py-1.5 text-bruv-base\",\n\t\"ring-bruv-neutral ring-0 transition-[box-shadow,color,border-color] duration-150 ease-out\",\n\t\"has-[:focus]:ring-2 has-[:focus]:border-bruv-neutral-strong\",\n\t\"motion-reduce:transition-none\",\n\t\"has-[*[data-disabled]]:cursor-not-allowed has-[*[data-disabled]]:opacity-50\",\n\t\"has-[*[data-invalid]]:border-bruv-danger has-[*[data-invalid]:focus]:ring-bruv-danger/30\",\n\t\"has-[*[data-valid]]:border-bruv-success\",\n]\n\nexport interface FormInputProps extends Omit<\n\tComponentProps<typeof Field.Control>,\n\t\"size\"\n> {\n\tsize?: FormInputSize\n\t/** Icon element rendered before the input */\n\ticonLeft?: ReactNode\n\t/** Icon element rendered after the input */\n\ticonRight?: ReactNode\n\t/** Additional classes on the outer wrapper (only when icons are present) */\n\twrapperClassName?: string\n}\n\nexport const FormInput = forwardRef<HTMLInputElement, FormInputProps>(\n\tfunction FormInput(\n\t\t{ size = \"md\", iconLeft, iconRight, wrapperClassName, className, ...props },\n\t\tref,\n\t) {\n\t\tconst hasIcon = !!iconLeft || !!iconRight\n\t\tconst sizeClass = inputSizeStyles[size]\n\n\t\tif (!hasIcon) {\n\t\t\treturn (\n\t\t\t\t<Field.Control\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(inputStyles, sizeClass, className)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t)\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center gap-2\",\n\t\t\t\t\tsize === \"sm\" ? \"px-2\" : \"px-2.5\",\n\t\t\t\t\twrapperStyles,\n\t\t\t\t\twrapperClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{iconLeft && (\n\t\t\t\t\t<span className=\"text-bruv-tertiary flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconLeft}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<Field.Control\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex-1 min-w-0 h-full bg-transparent text-bruv-primary outline-none placeholder:text-bruv-tertiary\",\n\t\t\t\t\t\tsize === \"sm\" ? \"text-bruv-sm\" : \"text-bruv-base\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t\t{iconRight && (\n\t\t\t\t\t<span className=\"text-bruv-tertiary flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconRight}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface FormTextareaProps extends Omit<\n\tComponentProps<typeof Field.Control>,\n\t\"size\"\n> {\n\tsize?: FormInputSize\n}\n\nexport const FormTextarea = forwardRef<HTMLTextAreaElement, FormTextareaProps>(\n\tfunction FormTextarea({ size = \"md\", className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Control\n\t\t\t\tref={ref}\n\t\t\t\trender={<textarea />}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tinputStyles,\n\t\t\t\t\tinputSizeStyles[size],\n\t\t\t\t\t\"min-h-20 resize-y\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormHintProps extends ComponentProps<\n\ttypeof Field.Description\n> {}\n\nexport const FormHint = forwardRef<HTMLParagraphElement, FormHintProps>(\n\tfunction FormHint({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Description\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"text-bruv-sm text-bruv-tertiary\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface FormErrorProps extends ComponentProps<typeof Field.Error> {}\n\nexport const FormError = forwardRef<HTMLParagraphElement, FormErrorProps>(\n\tfunction FormError({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Field.Error\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"text-bruv-sm text-bruv-danger\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport const Form = {\n\tRoot: FormRoot,\n\tField: FormField,\n\tLabel: FormLabel,\n\tInput: FormInput,\n\tTextarea: FormTextarea,\n\tHint: FormHint,\n\tError: FormError,\n}\n","import { forwardRef } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst variantStyles = {\n\tneutral: \"bg-bruv-tertiary\",\n\taccent: \"bg-bruv-accent\",\n\tsuccess: \"bg-bruv-success\",\n\twarn: \"bg-bruv-warn\",\n\tdanger: \"bg-bruv-danger\",\n} as const\n\nconst sizeStyles = {\n\tsm: \"size-1.5\",\n\tmd: \"size-2\",\n\tlg: \"size-2.5\",\n} as const\n\nexport type StatusDotVariant = keyof typeof variantStyles\nexport type StatusDotSize = keyof typeof sizeStyles\n\nexport interface StatusDotProps {\n\t/** Color variant */\n\tvariant?: StatusDotVariant\n\t/** Dot size */\n\tsize?: StatusDotSize\n\t/** Accessible label (required for meaningful status indicators) */\n\tlabel?: string\n\tclassName?: string\n}\n\n/**\n * Small circular status indicator dot.\n *\n * Use alongside text labels, avatars, or table cells\n * to convey online/offline, severity, or activity state.\n */\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(\n\tfunction StatusDot(\n\t\t{ variant = \"neutral\", size = \"md\", label, className },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\trole={label ? \"status\" : undefined}\n\t\t\t\taria-label={label}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex shrink-0 rounded-full\",\n\t\t\t\t\tvariantStyles[variant],\n\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t/>\n\t\t)\n\t},\n)\n","import { forwardRef, type ReactNode, type ComponentProps } from \"react\"\nimport { Menu as BaseMenu } from \"@base-ui/react/menu\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Root\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuRootProps {\n\t/** Controlled open state */\n\topen?: boolean\n\t/** Uncontrolled default open state */\n\tdefaultOpen?: boolean\n\t/** Called when open state changes */\n\tonOpenChange?: (open: boolean) => void\n\t/** Whether the menu is modal (locks scroll + traps focus). Default true. */\n\tmodal?: boolean\n\tchildren: ReactNode\n}\n\nfunction DropdownMenuRoot({\n\topen,\n\tdefaultOpen,\n\tonOpenChange,\n\tmodal = true,\n\tchildren,\n}: DropdownMenuRootProps) {\n\treturn (\n\t\t<BaseMenu.Root\n\t\t\topen={open}\n\t\t\tdefaultOpen={defaultOpen}\n\t\t\tonOpenChange={onOpenChange ? o => onOpenChange(o) : undefined}\n\t\t\tmodal={modal}\n\t\t>\n\t\t\t{children}\n\t\t</BaseMenu.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuTriggerProps extends ComponentProps<\n\ttypeof BaseMenu.Trigger\n> {}\n\nconst DropdownMenuTrigger = forwardRef<\n\tHTMLButtonElement,\n\tDropdownMenuTriggerProps\n>(function DropdownMenuTrigger({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseMenu.Trigger\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"cursor-pointer outline-none\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Content\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuContentProps {\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\t/** Minimum width */\n\tminWidth?: string\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nfunction DropdownMenuContent({\n\tside = \"bottom\",\n\talign = \"end\",\n\tsideOffset = 4,\n\tminWidth = \"min-w-[180px]\",\n\tclassName,\n\tchildren,\n}: DropdownMenuContentProps) {\n\treturn (\n\t\t<BaseMenu.Portal>\n\t\t\t<BaseMenu.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseMenu.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseMenu.Popup>\n\t\t\t</BaseMenu.Positioner>\n\t\t</BaseMenu.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Item\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuItemProps {\n\t/** Danger styling (red text) */\n\tvariant?: \"default\" | \"danger\"\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\t/** Called when the item is clicked */\n\tonClick?: () => void\n\t/** Close menu on click. Default true. */\n\tcloseOnClick?: boolean\n\t/** Whether the item is disabled */\n\tdisabled?: boolean\n\tclassName?: string\n\tchildren?: ReactNode\n}\n\nconst DropdownMenuItem = forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n\tfunction DropdownMenuItem(\n\t\t{\n\t\t\tvariant = \"default\",\n\t\t\ticon,\n\t\t\tonClick,\n\t\t\tcloseOnClick,\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t},\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<BaseMenu.Item\n\t\t\t\tref={ref}\n\t\t\t\tonClick={onClick}\n\t\t\t\tcloseOnClick={closeOnClick}\n\t\t\t\tdisabled={disabled}\n\t\t\t\trender={\n\t\t\t\t\t<Menu.Item icon={icon} variant={variant} className={className} />\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t</BaseMenu.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Separator\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuSeparatorProps {\n\tclassName?: string\n}\n\nconst DropdownMenuSeparator = forwardRef<\n\tHTMLDivElement,\n\tDropdownMenuSeparatorProps\n>(function DropdownMenuSeparator({ className }, ref) {\n\treturn (\n\t\t<BaseMenu.Separator\n\t\t\tref={ref}\n\t\t\trender={<Menu.Separator className={className} />}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Label\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuLabelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DropdownMenuLabel = forwardRef<HTMLDivElement, DropdownMenuLabelProps>(\n\tfunction DropdownMenuLabel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseMenu.GroupLabel\n\t\t\t\tref={ref}\n\t\t\t\trender={<Menu.GroupLabel className={className} />}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseMenu.GroupLabel>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// DropdownMenu.Group\n// ---------------------------------------------------------------------------\n\nexport interface DropdownMenuGroupProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst DropdownMenuGroup = forwardRef<HTMLDivElement, DropdownMenuGroupProps>(\n\tfunction DropdownMenuGroup({ className, children }, ref) {\n\t\treturn (\n\t\t\t<BaseMenu.Group ref={ref} className={cn(\"flex flex-col\", className)}>\n\t\t\t\t{children}\n\t\t\t</BaseMenu.Group>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const DropdownMenu = {\n\tRoot: DropdownMenuRoot,\n\tTrigger: DropdownMenuTrigger,\n\tContent: DropdownMenuContent,\n\tItem: DropdownMenuItem,\n\tSeparator: DropdownMenuSeparator,\n\tLabel: DropdownMenuLabel,\n\tGroup: DropdownMenuGroup,\n}\n","import { Dialog as BaseDialog } from \"@base-ui/react/dialog\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface DialogRootProps extends ComponentProps<\n\ttypeof BaseDialog.Root\n> {}\n\nexport function DialogRoot({ ...props }: DialogRootProps) {\n\treturn <BaseDialog.Root {...props} />\n}\n\nexport interface DialogTriggerProps extends ComponentProps<\n\ttypeof BaseDialog.Trigger\n> {}\n\nexport const DialogTrigger = forwardRef<HTMLButtonElement, DialogTriggerProps>(\n\tfunction DialogTrigger({ className, ...props }, ref) {\n\t\treturn <BaseDialog.Trigger ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\nexport interface DialogBackdropProps extends ComponentProps<\n\ttypeof BaseDialog.Backdrop\n> {}\n\nexport const DialogBackdrop = forwardRef<HTMLDivElement, DialogBackdropProps>(\n\tfunction DialogBackdrop({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDialog.Backdrop\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\t\"transition-opacity duration-150\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nconst sizeStyles = {\n\tmd: \"max-w-[450px]\",\n\tlg: \"max-w-[550px]\",\n} as const\n\nexport type DialogSize = keyof typeof sizeStyles\n\nexport interface DialogContentProps extends ComponentProps<\n\ttypeof BaseDialog.Popup\n> {\n\tsize?: DialogSize\n}\n\nexport function DialogContent({\n\tsize = \"md\",\n\tclassName,\n\tchildren,\n\t...props\n}: DialogContentProps) {\n\treturn (\n\t\t<BaseDialog.Portal>\n\t\t\t<DialogBackdrop />\n\t\t\t<BaseDialog.Popup\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-1 fixed top-1/2 left-1/2 z-50 max-h-[85vh] w-[90vw] -translate-x-1/2 -translate-y-1/2 rounded-bruv-lg p-0.5 shadow-xl\",\n\t\t\t\t\t\"transition-[opacity,scale] duration-150 ease-out\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0 data-[starting-style]:scale-[0.96]\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0 data-[ending-style]:scale-[0.98]\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\tsizeStyles[size],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseDialog.Popup>\n\t\t</BaseDialog.Portal>\n\t)\n}\n\nexport interface DialogPanelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const DialogPanel = forwardRef<HTMLDivElement, DialogPanelProps>(\n\tfunction DialogPanel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral rounded-bruv-md border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface DialogTitleProps extends ComponentProps<\n\ttypeof BaseDialog.Title\n> {}\n\nexport const DialogTitle = forwardRef<HTMLHeadingElement, DialogTitleProps>(\n\tfunction DialogTitle({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseDialog.Title\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary border-bruv-neutral border-b px-4 py-3 text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface DialogBodyProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const DialogBody = forwardRef<HTMLDivElement, DialogBodyProps>(\n\tfunction DialogBody({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"p-4\", className)}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface DialogFooterProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport const DialogFooter = forwardRef<HTMLDivElement, DialogFooterProps>(\n\tfunction DialogFooter({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex items-center justify-between p-2\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface DialogCloseProps extends ComponentProps<\n\ttypeof BaseDialog.Close\n> {}\n\nexport const DialogClose = forwardRef<HTMLButtonElement, DialogCloseProps>(\n\tfunction DialogClose({ className, ...props }, ref) {\n\t\treturn <BaseDialog.Close ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\n/**\n * @deprecated Use a plain `<p>` inside Dialog.Body instead.\n * Kept as an alias around BaseDialog.Description for mono compatibility.\n */\nconst DialogDescription = BaseDialog.Description\n\nexport const Dialog = {\n\tRoot: DialogRoot,\n\tTrigger: DialogTrigger,\n\tContent: DialogContent,\n\tPanel: DialogPanel,\n\tTitle: DialogTitle,\n\t/** @deprecated Use a plain `<p>` inside Dialog.Body instead. */\n\tDescription: DialogDescription,\n\tBody: DialogBody,\n\tFooter: DialogFooter,\n\tClose: DialogClose,\n}\n","import { forwardRef, useRef, useState } from \"react\"\nimport type { ComponentProps, CSSProperties, ReactNode } from \"react\"\nimport {\n\tuseReactTable,\n\tgetCoreRowModel,\n\tgetSortedRowModel,\n\tgetFilteredRowModel,\n\tgetPaginationRowModel,\n\tgetExpandedRowModel,\n\tflexRender,\n} from \"@tanstack/react-table\"\nimport { useVirtualizer } from \"@tanstack/react-virtual\"\nimport type {\n\tColumnDef,\n\tSortingState,\n\tColumnFiltersState,\n\tVisibilityState,\n\tRowSelectionState,\n\tTableOptions,\n\tRow,\n} from \"@tanstack/react-table\"\nimport {\n\tChevronUpIcon,\n\tChevronDownIcon,\n\tChevronUpDownIcon,\n\tChevronRightIcon,\n} from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Checkbox } from \"../checkbox\"\nimport { Skeleton } from \"../skeleton\"\nimport { Table } from \"../table\"\nimport { Pagination } from \"../pagination\"\nimport { EmptyState } from \"../empty-state\"\nimport { Button } from \"../button\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DataTableProps<TData> {\n\t/** Column definitions - see @tanstack/react-table ColumnDef */\n\tcolumns: ColumnDef<TData, unknown>[]\n\t/** Data array */\n\tdata: TData[]\n\t/** Enable column sorting. Default false. */\n\tsortable?: boolean\n\t/** Enable pagination. Default false. */\n\tpaginated?: boolean\n\t/** Rows per page when paginated. Default 10. */\n\tpageSize?: number\n\t/** Available page size options. Default [10, 25, 50]. */\n\tpageSizeOptions?: number[]\n\t/** Enable row selection with checkboxes. Default false. */\n\tselectable?: boolean\n\t/** Controlled row selection state */\n\trowSelection?: RowSelectionState\n\t/** Called when row selection changes */\n\tonRowSelectionChange?: (selection: RowSelectionState) => void\n\t/** Called when a row is clicked */\n\tonRowClick?: (row: Row<TData>) => void\n\t/** Show skeleton loading state. Default false. */\n\tloading?: boolean\n\t/** Number of skeleton rows to show when loading. Default 5. */\n\tloadingRows?: number\n\t/** Message shown when data is empty. Default \"No results.\" */\n\temptyMessage?: string | ReactNode\n\t/** Enable expandable rows via TanStack `getSubRows` */\n\texpandable?: boolean\n\t/** Resolve child rows for expandable tables */\n\tgetSubRows?: (row: TData) => TData[] | undefined\n\t/** Pin the first data column while scrolling horizontally */\n\tstickyFirstColumn?: boolean\n\t/** Pin the last data column while scrolling horizontally */\n\tstickyLastColumn?: boolean\n\t/** Virtualize row rendering for large datasets */\n\tvirtualized?: boolean\n\t/** Estimated row height when virtualized. Default 44 */\n\testimateRowHeight?: number\n\t/** Additional class on the outer wrapper */\n\tclassName?: string\n\t/** Additional TanStack Table options for advanced use cases */\n\ttableOptions?: Partial<TableOptions<TData>>\n}\n\n// ---------------------------------------------------------------------------\n// Sort indicator\n// ---------------------------------------------------------------------------\n\nfunction SortIndicator({ direction }: { direction: \"asc\" | \"desc\" | false }) {\n\tif (direction === \"asc\") {\n\t\treturn <ChevronUpIcon className=\"text-bruv-primary size-3.5\" />\n\t}\n\tif (direction === \"desc\") {\n\t\treturn <ChevronDownIcon className=\"text-bruv-primary size-3.5\" />\n\t}\n\treturn (\n\t\t<ChevronUpDownIcon className=\"text-bruv-tertiary size-3.5 opacity-0 transition-opacity group-hover:opacity-100\" />\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// ActionCell\n// ---------------------------------------------------------------------------\n\nexport type DataTableActionCellProps = ComponentProps<\"div\">\n\n/**\n * Wrapper for interactive content inside a DataTable cell.\n *\n * Stops click and keyboard events from propagating to the parent row so that\n * buttons, dropdown menus, and other interactive elements do not trigger\n * `onRowClick`.\n *\n * ```tsx\n * {\n * id: \"actions\",\n * header: \"\",\n * cell: ({ row }) => (\n * <DataTableActionCell>\n * <Button size=\"sm\" onClick={() => handleEdit(row.original)}>\n * Edit\n * </Button>\n * </DataTableActionCell>\n * ),\n * }\n * ```\n */\nexport const DataTableActionCell = forwardRef<\n\tHTMLDivElement,\n\tDataTableActionCellProps\n>(function DataTableActionCell(\n\t{ className, onClick, onKeyDown, ...props },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\trole=\"none\"\n\t\t\tclassName={cn(\"flex items-center\", className)}\n\t\t\tonClick={e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tonClick?.(e)\n\t\t\t}}\n\t\t\tonKeyDown={e => {\n\t\t\t\te.stopPropagation()\n\t\t\t\tonKeyDown?.(e)\n\t\t\t}}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// DataTable\n// ---------------------------------------------------------------------------\n\n/**\n * Data table powered by TanStack Table.\n *\n * Renders using the existing `Table` primitives (Table.Header, Table.Body,\n * Table.Row, Table.Cell) for visual consistency. TanStack Table provides the\n * headless logic for sorting, filtering, pagination, and row selection.\n *\n * Filtering is handled externally -- use `<DataTableToolbar />` with\n * `<DataTableSearch />`, `<Select />`, or `<Combobox />` above the table.\n * Pass filter state via `tableOptions` or pre-filtered `data`.\n *\n * For simple static tables, use `Table` directly. Use `DataTable` when you\n * need interactive features.\n */\nexport function DataTable<TData>({\n\tcolumns,\n\tdata,\n\tsortable = false,\n\tpaginated = false,\n\tpageSize = 10,\n\tpageSizeOptions = [10, 25, 50],\n\tselectable = false,\n\trowSelection: controlledRowSelection,\n\tonRowSelectionChange,\n\tonRowClick,\n\tloading = false,\n\tloadingRows = 5,\n\temptyMessage = \"No results.\",\n\texpandable = false,\n\tgetSubRows,\n\tstickyFirstColumn = false,\n\tstickyLastColumn = false,\n\tvirtualized = false,\n\testimateRowHeight = 44,\n\tclassName,\n\ttableOptions,\n}: DataTableProps<TData>) {\n\tconst scrollRef = useRef<HTMLDivElement>(null)\n\tconst [sorting, setSorting] = useState<SortingState>([])\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])\n\tconst [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})\n\tconst [expanded, setExpanded] = useState({})\n\tconst [internalRowSelection, setInternalRowSelection] =\n\t\tuseState<RowSelectionState>({})\n\n\tconst rowSelection = controlledRowSelection ?? internalRowSelection\n\tconst handleRowSelectionChange = onRowSelectionChange\n\t\t? (\n\t\t\t\tupdater:\n\t\t\t\t\t| RowSelectionState\n\t\t\t\t\t| ((old: RowSelectionState) => RowSelectionState),\n\t\t\t) => {\n\t\t\t\tconst next =\n\t\t\t\t\ttypeof updater === \"function\" ? updater(rowSelection) : updater\n\t\t\t\tonRowSelectionChange(next)\n\t\t\t}\n\t\t: setInternalRowSelection\n\n\tconst expandColumn: ColumnDef<TData, unknown> | null = expandable\n\t\t? {\n\t\t\t\tid: \"_expand\",\n\t\t\t\theader: () => null,\n\t\t\t\tcell: ({ row }) =>\n\t\t\t\t\trow.getCanExpand() ? (\n\t\t\t\t\t\t<DataTableActionCell>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\ticonLeft={\n\t\t\t\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"transition-transform duration-150\",\n\t\t\t\t\t\t\t\t\t\t\trow.getIsExpanded() && \"rotate-90\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonClick={() => row.toggleExpanded()}\n\t\t\t\t\t\t\t\taria-label={row.getIsExpanded() ? \"Collapse row\" : \"Expand row\"}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</DataTableActionCell>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span className=\"inline-block w-6\" />\n\t\t\t\t\t),\n\t\t\t\tenableSorting: false,\n\t\t\t\tenableHiding: false,\n\t\t\t\tsize: 40,\n\t\t\t}\n\t\t: null\n\n\tconst allColumns: ColumnDef<TData, unknown>[] = [\n\t\t...(selectable\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"_select\",\n\t\t\t\t\t\theader: ({ table }) => (\n\t\t\t\t\t\t\t<DataTableActionCell>\n\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\t\t\t\t\t\t\tindeterminate={table.getIsSomePageRowsSelected()}\n\t\t\t\t\t\t\t\t\tonCheckedChange={checked =>\n\t\t\t\t\t\t\t\t\t\ttable.toggleAllPageRowsSelected(checked)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</DataTableActionCell>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcell: ({ row }) => (\n\t\t\t\t\t\t\t<DataTableActionCell>\n\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\tchecked={row.getIsSelected()}\n\t\t\t\t\t\t\t\t\tdisabled={!row.getCanSelect()}\n\t\t\t\t\t\t\t\t\tonCheckedChange={checked => row.toggleSelected(checked)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</DataTableActionCell>\n\t\t\t\t\t\t),\n\t\t\t\t\t\tenableSorting: false,\n\t\t\t\t\t\tenableHiding: false,\n\t\t\t\t\t\tsize: 40,\n\t\t\t\t\t} satisfies ColumnDef<TData, unknown>,\n\t\t\t\t]\n\t\t\t: []),\n\t\t...(expandColumn ? [expandColumn] : []),\n\t\t...columns,\n\t]\n\n\t// -- Table instance --\n\t// Deep-merge state so consumer tableOptions.state doesn't clobber internal state\n\tconst { state: externalState, ...restTableOptions } = tableOptions ?? {}\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: allColumns,\n\t\tstate: {\n\t\t\tsorting,\n\t\t\tcolumnFilters,\n\t\t\tcolumnVisibility,\n\t\t\trowSelection,\n\t\t\texpanded,\n\t\t\t...externalState,\n\t\t},\n\t\tonSortingChange: setSorting,\n\t\tonColumnFiltersChange: setColumnFilters,\n\t\tonColumnVisibilityChange: setColumnVisibility,\n\t\tonExpandedChange: setExpanded,\n\t\tonRowSelectionChange: handleRowSelectionChange,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetSortedRowModel: getSortedRowModel(),\n\t\tgetFilteredRowModel: getFilteredRowModel(),\n\t\t...(expandable && {\n\t\t\tgetExpandedRowModel: getExpandedRowModel(),\n\t\t\tgetSubRows: getSubRows ?? (() => undefined),\n\t\t}),\n\t\t...(paginated && { getPaginationRowModel: getPaginationRowModel() }),\n\t\tenableRowSelection: selectable,\n\t\tinitialState: {\n\t\t\tpagination: {\n\t\t\t\tpageSize,\n\t\t\t},\n\t\t},\n\t\t...restTableOptions,\n\t})\n\n\tconst pageCount = table.getPageCount()\n\tconst currentPage = table.getState().pagination.pageIndex + 1\n\tconst currentPageSize = table.getState().pagination.pageSize\n\tconst rows = table.getRowModel().rows\n\n\tconst virtualizer = useVirtualizer({\n\t\tcount: rows.length,\n\t\tgetScrollElement: () => scrollRef.current,\n\t\testimateSize: () => estimateRowHeight,\n\t\tenabled: virtualized && !loading && rows.length > 0,\n\t})\n\n\tconst stickyCellClass = (index: number, total: number) =>\n\t\tcn(\n\t\t\tstickyFirstColumn && index === 0 && \"sticky left-0 z-10 bg-bruv-base-2\",\n\t\t\tstickyLastColumn &&\n\t\t\t\tindex === total - 1 &&\n\t\t\t\t\"sticky right-0 z-10 bg-bruv-base-2\",\n\t\t)\n\n\tconst renderRow = (row: (typeof rows)[number], style?: CSSProperties) => (\n\t\t<Table.Row\n\t\t\tkey={row.id}\n\t\t\tstyle={style}\n\t\t\tonClick={onRowClick ? () => onRowClick(row) : undefined}\n\t\t\tclassName={cn(row.getIsSelected() && \"bg-bruv-subtle\")}\n\t\t>\n\t\t\t{row.getVisibleCells().map((cell, cellIndex, cells) => (\n\t\t\t\t<Table.Cell\n\t\t\t\t\tkey={cell.id}\n\t\t\t\t\twidth={\n\t\t\t\t\t\tcell.column.getSize() !== 150 ? cell.column.getSize() : undefined\n\t\t\t\t\t}\n\t\t\t\t\tclassName={stickyCellClass(cellIndex, cells.length)}\n\t\t\t\t>\n\t\t\t\t\t{flexRender(cell.column.columnDef.cell, cell.getContext())}\n\t\t\t\t</Table.Cell>\n\t\t\t))}\n\t\t</Table.Row>\n\t)\n\n\treturn (\n\t\t<div className={cn(\"flex flex-col gap-3\", className)}>\n\t\t\t<div\n\t\t\t\tref={virtualized ? scrollRef : undefined}\n\t\t\t\tclassName={cn(virtualized && \"max-h-[480px] overflow-auto\")}\n\t\t\t>\n\t\t\t\t<Table>\n\t\t\t\t\t<Table.Header>\n\t\t\t\t\t\t{table.getHeaderGroups().map(headerGroup => (\n\t\t\t\t\t\t\t<Table.Row key={headerGroup.id}>\n\t\t\t\t\t\t\t\t{headerGroup.headers.map((header, headerIndex, headers) => {\n\t\t\t\t\t\t\t\t\tconst canSort = sortable && header.column.getCanSort()\n\t\t\t\t\t\t\t\t\tconst sorted = header.column.getIsSorted()\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Table.HeaderCell\n\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\twidth={\n\t\t\t\t\t\t\t\t\t\t\t\theader.getSize() !== 150 ? header.getSize() : undefined\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\tcanSort && \"cursor-pointer select-none group\",\n\t\t\t\t\t\t\t\t\t\t\t\tstickyCellClass(headerIndex, headers.length),\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{header.isPlaceholder ? null : (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"flex items-center gap-1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcanSort && \"cursor-pointer\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcanSort\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? header.column.getToggleSortingHandler()\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttabIndex={canSort ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{flexRender(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theader.column.columnDef.header,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theader.getContext(),\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{canSort && <SortIndicator direction={sorted} />}\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</Table.HeaderCell>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Table.Header>\n\t\t\t\t\t<Table.Body>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\tArray.from({ length: loadingRows }, (_, i) => (\n\t\t\t\t\t\t\t\t<Table.Row key={`skeleton-${String(i)}`}>\n\t\t\t\t\t\t\t\t\t{table.getVisibleLeafColumns().map((_, j) => (\n\t\t\t\t\t\t\t\t\t\t<Table.Cell key={`skeleton-${String(i)}-${String(j)}`}>\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t\t\t\t\t\t\t\t\t</Table.Cell>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t\t))\n\t\t\t\t\t\t) : rows.length > 0 ? (\n\t\t\t\t\t\t\tvirtualized ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t{virtualizer.getVirtualItems().length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<Table.Row aria-hidden>\n\t\t\t\t\t\t\t\t\t\t\t<Table.Cell\n\t\t\t\t\t\t\t\t\t\t\t\tcolSpan={allColumns.length}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: virtualizer.getVirtualItems()[0]?.start,\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t{virtualizer.getVirtualItems().map(virtualRow => {\n\t\t\t\t\t\t\t\t\t\tconst row = rows[virtualRow.index]\n\t\t\t\t\t\t\t\t\t\tif (!row) return null\n\t\t\t\t\t\t\t\t\t\treturn renderRow(row, { height: virtualRow.size })\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t{virtualizer.getVirtualItems().length > 0 ? (\n\t\t\t\t\t\t\t\t\t\t<Table.Row aria-hidden>\n\t\t\t\t\t\t\t\t\t\t\t<Table.Cell\n\t\t\t\t\t\t\t\t\t\t\t\tcolSpan={allColumns.length}\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\t\theight:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvirtualizer.getTotalSize() -\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(virtualizer.getVirtualItems().at(-1)?.end ?? 0),\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t\tborder: 0,\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\trows.map(row => renderRow(row))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Table.Row>\n\t\t\t\t\t\t\t\t<Table.Cell colSpan={allColumns.length} className=\"p-0\">\n\t\t\t\t\t\t\t\t\t{typeof emptyMessage === \"string\" ? (\n\t\t\t\t\t\t\t\t\t\t<EmptyState title={emptyMessage} />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\temptyMessage\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</Table.Cell>\n\t\t\t\t\t\t\t</Table.Row>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Table.Body>\n\t\t\t\t</Table>\n\t\t\t</div>\n\n\t\t\t{/* Pagination + selected count */}\n\t\t\t{paginated && pageCount > 0 && (\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t{selectable && (\n\t\t\t\t\t\t<span className=\"text-bruv-secondary text-bruv-base\">\n\t\t\t\t\t\t\t{table.getFilteredSelectedRowModel().rows.length} of{\" \"}\n\t\t\t\t\t\t\t{table.getFilteredRowModel().rows.length} row(s) selected\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className={cn(!selectable && \"ml-auto\")}>\n\t\t\t\t\t\t<Pagination\n\t\t\t\t\t\t\tpage={currentPage}\n\t\t\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\t\t\tonPageChange={p => table.setPageIndex(p - 1)}\n\t\t\t\t\t\t\ttotalItems={table.getFilteredRowModel().rows.length}\n\t\t\t\t\t\t\trowsPerPage={currentPageSize}\n\t\t\t\t\t\t\tonRowsPerPageChange={size => table.setPageSize(size)}\n\t\t\t\t\t\t\trowOptions={pageSizeOptions}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n}\n","import {\n\tforwardRef,\n\ttype CSSProperties,\n\ttype ReactNode,\n\ttype ComponentProps,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Skeleton } from \"../skeleton\"\nimport { TruncatedCell } from \"./truncated-cell\"\n\n// ---------------------------------------------------------------------------\n// Table - outer container\n// ---------------------------------------------------------------------------\n\nexport interface TableProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\n/**\n * Lightweight list-table container.\n *\n * Wraps a semantic `<table>` in a rounded, bordered container.\n * Designed for simple list-style data displays - not a full data-table.\n */\nexport const Table = forwardRef<HTMLDivElement, TableProps>(function Table(\n\t{ className, children },\n\tref,\n) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"overflow-x-auto rounded ring-1 ring-bruv-neutral\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<table className=\"w-full border-separate border-spacing-0\">\n\t\t\t\t{children}\n\t\t\t</table>\n\t\t</div>\n\t)\n}) as ReturnType<typeof forwardRef<HTMLDivElement, TableProps>> & {\n\tHeader: typeof TableHeader\n\tBody: typeof TableBody\n\tRow: typeof TableRow\n\tHeaderCell: typeof TableHeaderCell\n\tCell: typeof TableCell\n\tTruncatedCell: typeof TruncatedCell\n\tSkeleton: typeof TableSkeleton\n}\n\n// ---------------------------------------------------------------------------\n// Table.Header - header row\n// ---------------------------------------------------------------------------\n\nexport interface TableHeaderProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\nconst TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n\tfunction TableHeader({ className, children }, ref) {\n\t\treturn (\n\t\t\t<thead\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"[&>tr]:text-bruv-sm [&>tr]:font-medium [&>tr]:text-bruv-secondary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</thead>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Body - wraps rows\n// ---------------------------------------------------------------------------\n\nexport interface TableBodyProps {\n\treadonly className?: string\n\treadonly children: ReactNode\n}\n\nconst TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(\n\tfunction TableBody({ className, children }, ref) {\n\t\treturn (\n\t\t\t<tbody\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t// Every row except the last gets a bottom border via its cells\n\t\t\t\t\t\"[&>tr:not(:last-child)>td]:border-b [&>tr:not(:last-child)>td]:border-bruv-neutral\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</tbody>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Row - data row (optionally clickable)\n// ---------------------------------------------------------------------------\n\nexport interface TableRowProps extends Omit<ComponentProps<\"tr\">, \"children\"> {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(\n\tfunction TableRow({ className, children, onClick, ...props }, ref) {\n\t\treturn (\n\t\t\t<tr\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 hover:bg-bruv-subtle\",\n\t\t\t\t\t\"transition-colors duration-100 ease-out motion-reduce:transition-none\",\n\t\t\t\t\tonClick && \"cursor-pointer\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tonClick={onClick}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</tr>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.HeaderCell - <th> cell\n// ---------------------------------------------------------------------------\n\nexport interface TableHeaderCellProps {\n\t/** Fixed width in pixels or CSS value */\n\twidth?: number | string\n\t/** Column span */\n\tcolSpan?: number\n\t/** Truncate content with ellipsis and show tooltip on overflow */\n\ttruncate?: boolean\n\tclassName?: string\n\tchildren?: ReactNode\n}\n\nconst TableHeaderCell = forwardRef<HTMLTableCellElement, TableHeaderCellProps>(\n\tfunction TableHeaderCell(\n\t\t{ width, colSpan, truncate, className, children },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<th\n\t\t\t\tref={ref}\n\t\t\t\tstyle={width != null ? { width } : undefined}\n\t\t\t\tcolSpan={colSpan}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"px-3 py-2 text-left text-bruv-sm font-medium border-b border-bruv-neutral overflow-hidden whitespace-nowrap truncate\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{truncate ? <TruncatedCell>{children}</TruncatedCell> : children}\n\t\t\t</th>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Cell - <td> cell\n// ---------------------------------------------------------------------------\n\nexport interface TableCellProps {\n\t/** Fixed width in pixels or CSS value */\n\twidth?: number | string\n\t/** Column span */\n\tcolSpan?: number\n\t/** Truncate content with ellipsis and show tooltip on overflow */\n\ttruncate?: boolean\n\tclassName?: string\n\tstyle?: CSSProperties\n\tchildren?: ReactNode\n}\n\nconst TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(\n\tfunction TableCell(\n\t\t{ width, colSpan, truncate, className, style, children },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<td\n\t\t\t\tref={ref}\n\t\t\t\tstyle={{ ...(width != null ? { width } : {}), ...style }}\n\t\t\t\tcolSpan={colSpan}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"px-3 py-2 text-bruv-base overflow-hidden whitespace-nowrap truncate\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{truncate ? <TruncatedCell>{children}</TruncatedCell> : children}\n\t\t\t</td>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Table.Skeleton - loading placeholder rows\n// ---------------------------------------------------------------------------\n\nexport interface TableSkeletonProps {\n\t/** Number of columns to render */\n\treadonly columns: number\n\t/** Number of skeleton rows. Default 5. */\n\treadonly rows?: number\n\treadonly className?: string\n}\n\n/**\n * Skeleton loading rows for the Table.\n * Renders inside a `<tbody>` with the specified number of rows and columns.\n *\n * ```tsx\n * <Table>\n * <Table.Header>...</Table.Header>\n * {loading ? <Table.Skeleton columns={3} /> : <Table.Body>...</Table.Body>}\n * </Table>\n * ```\n */\nfunction TableSkeleton({ columns, rows = 5, className }: TableSkeletonProps) {\n\treturn (\n\t\t<tbody className={className}>\n\t\t\t{Array.from({ length: rows }, (_, i) => (\n\t\t\t\t<tr key={`skel-row-${String(i)}`} className=\"bg-bruv-base-2\">\n\t\t\t\t\t{Array.from({ length: columns }, (_, j) => (\n\t\t\t\t\t\t<td\n\t\t\t\t\t\t\tkey={`skel-cell-${String(i)}-${String(j)}`}\n\t\t\t\t\t\t\tclassName=\"px-3 py-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t\t\t\t\t</td>\n\t\t\t\t\t))}\n\t\t\t\t</tr>\n\t\t\t))}\n\t\t</tbody>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nTable.Header = TableHeader\nTable.Body = TableBody\nTable.Row = TableRow\nTable.HeaderCell = TableHeaderCell\nTable.Cell = TableCell\nTable.TruncatedCell = TruncatedCell\nTable.Skeleton = TableSkeleton\n","import {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tuseState,\n\ttype ReactNode,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Tooltip } from \"../tooltip\"\n\n// ---------------------------------------------------------------------------\n// TruncatedCell — cell content with ellipsis + tooltip on overflow\n// ---------------------------------------------------------------------------\n\nexport interface TruncatedCellProps {\n\t/** Content to render and use as tooltip text when truncated */\n\treadonly children: ReactNode\n\t/** Override tooltip content (defaults to children if string) */\n\treadonly tooltip?: ReactNode\n\treadonly className?: string\n}\n\n/**\n * Renders inline text with `truncate` (ellipsis).\n * When the text overflows, a Tooltip shows the full content on hover.\n * When it fits, no tooltip is rendered.\n */\nexport const TruncatedCell = forwardRef<HTMLSpanElement, TruncatedCellProps>(\n\tfunction TruncatedCell({ children, tooltip, className }, ref) {\n\t\tconst innerRef = useRef<HTMLSpanElement>(null)\n\t\tconst [truncated, setTruncated] = useState(false)\n\n\t\tconst checkTruncation = useCallback(() => {\n\t\t\tconst el = innerRef.current\n\t\t\tif (!el) return\n\t\t\tsetTruncated(el.scrollWidth > el.clientWidth)\n\t\t}, [])\n\n\t\tuseEffect(() => {\n\t\t\tconst el = innerRef.current\n\t\t\tif (!el) return\n\n\t\t\tcheckTruncation()\n\n\t\t\tconst observer = new ResizeObserver(checkTruncation)\n\t\t\tobserver.observe(el)\n\t\t\treturn () => observer.disconnect()\n\t\t}, [checkTruncation, children])\n\n\t\tconst span = (\n\t\t\t<span\n\t\t\t\tref={node => {\n\t\t\t\t\t;(\n\t\t\t\t\t\tinnerRef as React.MutableRefObject<HTMLSpanElement | null>\n\t\t\t\t\t).current = node\n\t\t\t\t\tif (typeof ref === \"function\") ref(node)\n\t\t\t\t\telse if (ref)\n\t\t\t\t\t\t(ref as React.MutableRefObject<HTMLSpanElement | null>).current =\n\t\t\t\t\t\t\tnode\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\"block w-full truncate\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t)\n\n\t\tif (!truncated) return span\n\n\t\tconst tooltipContent =\n\t\t\ttooltip ?? (typeof children === \"string\" ? children : null)\n\t\tif (!tooltipContent) return span\n\n\t\treturn (\n\t\t\t<Tooltip.Root>\n\t\t\t\t<Tooltip.Trigger\n\t\t\t\t\trender={<span className=\"block w-full min-w-0\" tabIndex={0} />}\n\t\t\t\t>\n\t\t\t\t\t{span}\n\t\t\t\t</Tooltip.Trigger>\n\t\t\t\t<Tooltip.Content side=\"top\">{tooltipContent}</Tooltip.Content>\n\t\t\t</Tooltip.Root>\n\t\t)\n\t},\n)\n","import { forwardRef } from \"react\"\nimport {\n\tChevronLeftIcon,\n\tChevronRightIcon,\n\tChevronUpDownIcon,\n} from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { DropdownMenu } from \"../dropdown-menu\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\tsm: { button: \"size-7\", icon: \"size-4\", strip: \"h-9\" },\n\tmd: { button: \"size-8\", icon: \"size-4\", strip: \"h-10\" },\n} as const\n\nexport type PaginationSize = keyof typeof sizeStyles\n\nexport interface PaginationProps {\n\t/** Current page (1-indexed) */\n\tpage: number\n\t/** Total number of pages */\n\tpageCount: number\n\t/** Called when the page changes */\n\tonPageChange?: (page: number) => void\n\t/** Total item count - shows \"1–10 of XMarkIcon\" when provided */\n\ttotalItems?: number\n\t/** Rows per page - shows selector when provided with onRowsPerPageChange */\n\trowsPerPage?: number\n\t/** Called when rows per page changes */\n\tonRowsPerPageChange?: (rows: number) => void\n\t/** Available row count options. Default [10, 25, 50] */\n\trowOptions?: number[]\n\t/** Number of sibling pages to show around active page. Default 1 */\n\tsiblingCount?: number\n\t/** Size of the pagination controls */\n\tsize?: PaginationSize\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Page number generation\n// ---------------------------------------------------------------------------\n\ntype PageItem = number | \"ellipsis-start\" | \"ellipsis-end\"\n\nfunction range(start: number, end: number): number[] {\n\tconst result: number[] = []\n\tfor (let i = start; i <= end; i++) result.push(i)\n\treturn result\n}\n\n/**\n * Generates an array of page numbers and ellipsis markers for pagination.\n *\n * - When `pageCount <= maxVisible` (2 * siblingCount + 5), shows all pages.\n * - Otherwise truncates with ellipsis, always showing first and last page.\n */\nfunction getPageNumbers(\n\tpage: number,\n\tpageCount: number,\n\tsiblingCount: number,\n): PageItem[] {\n\t// Total visible page buttons: first + last + current + 2*siblings + 2 ellipsis slots\n\tconst maxVisible = siblingCount * 2 + 5\n\n\t// Show all pages if they fit\n\tif (pageCount <= maxVisible) {\n\t\treturn range(1, pageCount)\n\t}\n\n\tconst leftSiblingIndex = Math.max(page - siblingCount, 1)\n\tconst rightSiblingIndex = Math.min(page + siblingCount, pageCount)\n\n\tconst showLeftEllipsis = leftSiblingIndex > 2\n\tconst showRightEllipsis = rightSiblingIndex < pageCount - 1\n\n\tif (!showLeftEllipsis && showRightEllipsis) {\n\t\t// Near the start: 1 2 3 4 5 ... last\n\t\tconst leftCount = siblingCount * 2 + 3\n\t\treturn [...range(1, leftCount), \"ellipsis-end\", pageCount]\n\t}\n\n\tif (showLeftEllipsis && !showRightEllipsis) {\n\t\t// Near the end: 1 ... last-4 last-3 last-2 last-1 last\n\t\tconst rightCount = siblingCount * 2 + 3\n\t\treturn [\n\t\t\t1,\n\t\t\t\"ellipsis-start\",\n\t\t\t...range(pageCount - rightCount + 1, pageCount),\n\t\t]\n\t}\n\n\t// Middle: 1 ... p-1 p p+1 ... last\n\treturn [\n\t\t1,\n\t\t\"ellipsis-start\",\n\t\t...range(leftSiblingIndex, rightSiblingIndex),\n\t\t\"ellipsis-end\",\n\t\tpageCount,\n\t]\n}\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\nfunction PageButton({\n\tpage,\n\tactive,\n\tonClick,\n\tbuttonSize,\n}: {\n\tpage: number\n\tactive: boolean\n\tonClick: () => void\n\tbuttonSize: string\n}) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-current={active ? \"page\" : undefined}\n\t\t\tonClick={onClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-bruv-sm flex items-center justify-center text-bruv-base tabular-nums select-none cursor-pointer\",\n\t\t\t\tbuttonSize,\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150 motion-reduce:transition-none\",\n\t\t\t\tactive\n\t\t\t\t\t? \"bg-bruv-base-2 text-bruv-primary font-medium shadow-sm\"\n\t\t\t\t\t: \"text-bruv-secondary hover:text-bruv-primary hover:bg-bruv-subtle\",\n\t\t\t)}\n\t\t>\n\t\t\t{page}\n\t\t</button>\n\t)\n}\n\nfunction Ellipsis({ buttonSize }: { buttonSize: string }) {\n\treturn (\n\t\t<span\n\t\t\tclassName={cn(\n\t\t\t\t\"text-bruv-tertiary flex items-center justify-center text-bruv-base select-none\",\n\t\t\t\tbuttonSize,\n\t\t\t)}\n\t\t>\n\t\t\t...\n\t\t</span>\n\t)\n}\n\nfunction NavArrow({\n\tdirection,\n\tdisabled,\n\tonClick,\n\tbuttonSize,\n\ticonSize,\n}: {\n\tdirection: \"prev\" | \"next\"\n\tdisabled: boolean\n\tonClick: () => void\n\tbuttonSize: string\n\ticonSize: string\n}) {\n\tconst Icon = direction === \"prev\" ? ChevronLeftIcon : ChevronRightIcon\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\taria-label={direction === \"prev\" ? \"Previous page\" : \"Next page\"}\n\t\t\tdisabled={disabled}\n\t\t\tonClick={onClick}\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-bruv-sm flex items-center justify-center cursor-pointer select-none\",\n\t\t\t\tbuttonSize,\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150 motion-reduce:transition-none\",\n\t\t\t\tdisabled\n\t\t\t\t\t? \"text-bruv-tertiary pointer-events-none\"\n\t\t\t\t\t: \"text-bruv-secondary hover:text-bruv-primary hover:bg-bruv-subtle\",\n\t\t\t)}\n\t\t>\n\t\t\t<Icon className={iconSize} />\n\t\t</button>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Pagination\n// ---------------------------------------------------------------------------\n\n/**\n * Pagination toolbar with clickable page numbers, optional rows-per-page\n * selector, and optional result count.\n *\n * Renders as a cohesive strip - pass `rowsPerPage` + `onRowsPerPageChange`\n * to show the rows-per-page selector, and `totalItems` to show the result count.\n */\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(\n\tfunction Pagination(\n\t\t{\n\t\t\tpage,\n\t\t\tpageCount,\n\t\t\tonPageChange,\n\t\t\ttotalItems,\n\t\t\trowsPerPage = 10,\n\t\t\tonRowsPerPageChange,\n\t\t\trowOptions = [10, 25, 50],\n\t\t\tsiblingCount = 1,\n\t\t\tsize = \"sm\",\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\t\tconst showRowsPerPage = onRowsPerPageChange !== undefined\n\t\tconst showTotalItems = totalItems !== undefined\n\t\tconst showPageNumbers = pageCount > 1\n\n\t\t// Result range: \"1–10 of 115\"\n\t\tconst rangeStart = (page - 1) * rowsPerPage + 1\n\t\tconst rangeEnd = totalItems\n\t\t\t? Math.min(page * rowsPerPage, totalItems)\n\t\t\t: page * rowsPerPage\n\n\t\t// If only 1 page and nothing else to show, render nothing\n\t\tif (!showPageNumbers && !showRowsPerPage && !showTotalItems) return null\n\n\t\tconst pages = showPageNumbers\n\t\t\t? getPageNumbers(page, pageCount, siblingCount)\n\t\t\t: []\n\n\t\treturn (\n\t\t\t<nav\n\t\t\t\tref={ref as React.Ref<HTMLElement>}\n\t\t\t\taria-label=\"Pagination\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center bg-bruv-subtle rounded-bruv-md ring-1 ring-bruv-neutral\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Rows per page */}\n\t\t\t\t{showRowsPerPage && (\n\t\t\t\t\t<div className={cn(\"flex items-center gap-2 px-3\", s.strip)}>\n\t\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-base whitespace-nowrap\">\n\t\t\t\t\t\t\tRows per page\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<DropdownMenu.Root>\n\t\t\t\t\t\t\t<DropdownMenu.Trigger>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"flex items-center gap-1 h-6 px-1.5 rounded-bruv-sm text-bruv-base text-bruv-primary tabular-nums cursor-pointer select-none\",\n\t\t\t\t\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\t\t\t\t\t\"hover:bg-bruv-subtle transition-colors duration-150 motion-reduce:transition-none\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{rowsPerPage}\n\t\t\t\t\t\t\t\t\t<ChevronUpDownIcon className=\"text-bruv-tertiary size-3.5\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</DropdownMenu.Trigger>\n\t\t\t\t\t\t\t<DropdownMenu.Content\n\t\t\t\t\t\t\t\talign=\"start\"\n\t\t\t\t\t\t\t\tsideOffset={4}\n\t\t\t\t\t\t\t\tminWidth=\"min-w-[80px]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{rowOptions.map(opt => (\n\t\t\t\t\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\t\t\t\t\tkey={opt}\n\t\t\t\t\t\t\t\t\t\tonClick={() => onRowsPerPageChange?.(opt)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{opt}\n\t\t\t\t\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</DropdownMenu.Content>\n\t\t\t\t\t\t</DropdownMenu.Root>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Divider */}\n\t\t\t\t{showRowsPerPage && showPageNumbers && (\n\t\t\t\t\t<div className=\"bg-bruv-neutral w-px self-stretch\" />\n\t\t\t\t)}\n\n\t\t\t\t{/* Page numbers */}\n\t\t\t\t{showPageNumbers && (\n\t\t\t\t\t<div className={cn(\"flex items-center gap-0.5 px-1.5\", s.strip)}>\n\t\t\t\t\t\t<NavArrow\n\t\t\t\t\t\t\tdirection=\"prev\"\n\t\t\t\t\t\t\tdisabled={page <= 1}\n\t\t\t\t\t\t\tonClick={() => onPageChange?.(page - 1)}\n\t\t\t\t\t\t\tbuttonSize={s.button}\n\t\t\t\t\t\t\ticonSize={s.icon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{pages.map(item =>\n\t\t\t\t\t\t\ttypeof item === \"number\" ? (\n\t\t\t\t\t\t\t\t<PageButton\n\t\t\t\t\t\t\t\t\tkey={item}\n\t\t\t\t\t\t\t\t\tpage={item}\n\t\t\t\t\t\t\t\t\tactive={item === page}\n\t\t\t\t\t\t\t\t\tonClick={() => onPageChange?.(item)}\n\t\t\t\t\t\t\t\t\tbuttonSize={s.button}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Ellipsis key={item} buttonSize={s.button} />\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<NavArrow\n\t\t\t\t\t\t\tdirection=\"next\"\n\t\t\t\t\t\t\tdisabled={page >= pageCount}\n\t\t\t\t\t\t\tonClick={() => onPageChange?.(page + 1)}\n\t\t\t\t\t\t\tbuttonSize={s.button}\n\t\t\t\t\t\t\ticonSize={s.icon}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{/* Divider */}\n\t\t\t\t{showTotalItems && (showPageNumbers || showRowsPerPage) && (\n\t\t\t\t\t<div className=\"bg-bruv-neutral w-px self-stretch\" />\n\t\t\t\t)}\n\n\t\t\t\t{/* Result count */}\n\t\t\t\t{showTotalItems && (\n\t\t\t\t\t<div className={cn(\"flex items-center px-3\", s.strip)}>\n\t\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-base whitespace-nowrap tabular-nums\">\n\t\t\t\t\t\t\t{rangeStart}&ndash;{rangeEnd} / {totalItems}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</nav>\n\t\t)\n\t},\n)\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface EmptyStateProps extends Omit<ComponentProps<\"div\">, \"title\"> {\n\ttitle?: ReactNode\n\tdescription?: ReactNode\n\ticon?: ReactNode\n\taction?: ReactNode\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(\n\tfunction EmptyState(\n\t\t{ title, description, icon, action, className, children, ...props },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{icon ? (\n\t\t\t\t\t<div className=\"text-bruv-tertiary flex size-10 items-center justify-center [&>svg]:size-8\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t\t{title ? (\n\t\t\t\t\t<p className=\"text-bruv-base text-bruv-primary font-medium\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</p>\n\t\t\t\t) : null}\n\t\t\t\t{description ? (\n\t\t\t\t\t<p className=\"text-bruv-sm text-bruv-secondary max-w-sm\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</p>\n\t\t\t\t) : null}\n\t\t\t\t{children}\n\t\t\t\t{action ? <div className=\"mt-1\">{action}</div> : null}\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DataTableToolbarProps {\n\t/** Toolbar contents -- typically DataTableSearch, Select, Combobox, Button, etc. */\n\tchildren: ReactNode\n\t/** Additional class on the outer wrapper */\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// DataTableToolbar\n// ---------------------------------------------------------------------------\n\n/**\n * Layout container for controls above a DataTable.\n *\n * Renders a horizontal flex row that wraps on small screens. Compose with\n * any combination of `DataTableSearch`, `Select`, `Combobox`, `Button`,\n * or custom elements.\n *\n * ```tsx\n * <DataTableToolbar>\n * <DataTableSearch value={search} onChange={setSearch} />\n * <Select value={status} onValueChange={setStatus} items={statusOptions}>\n * <SelectButton placeholder=\"Status\" />\n * <SelectContent>\n * <SelectOption value=\"all\">All</SelectOption>\n * <SelectOption value=\"active\">Active</SelectOption>\n * </SelectContent>\n * </Select>\n * </DataTableToolbar>\n * ```\n */\nexport const DataTableToolbar = forwardRef<\n\tHTMLDivElement,\n\tDataTableToolbarProps\n>(function DataTableToolbar({ children, className }, ref) {\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"flex flex-wrap items-center gap-2\", className)}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n})\n","import { forwardRef, useRef, useCallback } from \"react\"\nimport { MagnifyingGlassIcon, XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DataTableSearchProps {\n\t/** Current search value */\n\tvalue: string\n\t/** Called when the search value changes */\n\tonChange: (value: string) => void\n\t/** Placeholder text. Default \"Search...\" */\n\tplaceholder?: string\n\t/** Additional class on the outer wrapper */\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// DataTableSearch\n// ---------------------------------------------------------------------------\n\n/**\n * A standalone search input for DataTable.\n *\n * Controlled component -- wire `value` and `onChange` to your own state.\n * For server-side search, use `onChange` to trigger an API call (with\n * debounce if needed). For client-side, pass the value to TanStack Table's\n * `globalFilter` or a column-specific filter.\n *\n * ```tsx\n * const [search, setSearch] = useState(\"\")\n *\n * <DataTableSearch value={search} onChange={setSearch} placeholder=\"Search repositories...\" />\n * <DataTable\n * columns={columns}\n * data={data}\n * tableOptions={{\n * state: { globalFilter: search },\n * onGlobalFilterChange: setSearch,\n * }}\n * />\n * ```\n */\nexport const DataTableSearch = forwardRef<HTMLDivElement, DataTableSearchProps>(\n\tfunction DataTableSearch(\n\t\t{ value, onChange, placeholder = \"Search...\", className },\n\t\tref,\n\t) {\n\t\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\t\tconst handleClear = useCallback(() => {\n\t\t\tonChange(\"\")\n\t\t\tinputRef.current?.focus()\n\t\t}, [onChange])\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral bg-bruv-base-2 flex h-8 max-w-sm items-center gap-2 rounded-bruv-md border px-2.5\",\n\t\t\t\t\t\"ring-bruv-neutral ring-0 transition-[box-shadow,border-color] duration-150 ease-out\",\n\t\t\t\t\t\"has-[:focus]:ring-2 has-[:focus]:border-bruv-neutral-strong\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<MagnifyingGlassIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t<input\n\t\t\t\t\tref={inputRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={e => onChange(e.target.value)}\n\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base min-w-0 flex-1 bg-transparent outline-none\"\n\t\t\t\t/>\n\t\t\t\t{value && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\tclassName=\"text-bruv-tertiary hover:text-bruv-secondary rounded-bruv-sm shrink-0 p-0.5 transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<XMarkIcon className=\"size-3.5\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { TableCellsIcon } from \"@heroicons/react/16/solid\"\nimport type { Table } from \"@tanstack/react-table\"\nimport { Button } from \"../button\"\nimport { Checkbox } from \"../checkbox\"\nimport { DropdownMenu } from \"../dropdown-menu\"\n\nexport interface DataTableColumnsButtonProps<TData> {\n\ttable: Table<TData>\n\tlabel?: string\n}\n\nexport function DataTableColumnsButton<TData>({\n\ttable,\n\tlabel = \"Columns\",\n}: DataTableColumnsButtonProps<TData>) {\n\tconst hideable = table\n\t\t.getAllLeafColumns()\n\t\t.filter(column => column.getCanHide())\n\n\tif (hideable.length === 0) return null\n\n\treturn (\n\t\t<DropdownMenu.Root>\n\t\t\t<DropdownMenu.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" iconLeft={<TableCellsIcon />}>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</Button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<DropdownMenu.Content align=\"end\" minWidth=\"min-w-[200px]\">\n\t\t\t\t{hideable.map(column => (\n\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\tcloseOnClick={false}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tcolumn.toggleVisibility()\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tchecked={column.getIsVisible()}\n\t\t\t\t\t\t\tonCheckedChange={() => column.toggleVisibility()}\n\t\t\t\t\t\t\tclassName=\"pointer-events-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t{typeof column.columnDef.header === \"string\"\n\t\t\t\t\t\t\t\t? column.columnDef.header\n\t\t\t\t\t\t\t\t: column.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t))}\n\t\t\t</DropdownMenu.Content>\n\t\t</DropdownMenu.Root>\n\t)\n}\n","import { forwardRef, type ReactNode } from \"react\"\nimport { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\n\nexport type ActionBarPosition = \"bottom\" | \"top\"\n\nexport interface ActionBarProps {\n\t/** Whether the bar is visible. Triggers the slide animation. */\n\tshow: boolean\n\t/** Selection count. Renders as `\"{count} selected\"` when no `message` is provided. */\n\tcount?: number\n\t/** Overrides the count-derived message. */\n\tmessage?: ReactNode\n\t/** Anchor edge of the viewport. Defaults to `\"bottom\"`. */\n\tposition?: ActionBarPosition\n\t/** When set, renders an X clear button on the left and calls this on click. */\n\tonClear?: () => void\n\t/** Accessible label for the clear button. */\n\tclearLabel?: string\n\t/** Action buttons rendered on the right. */\n\tactions?: ReactNode\n\tclassName?: string\n}\n\n/**\n * Floating pill anchored to the bottom (or top) of the viewport. Designed\n * to surface bulk actions when items in a list or table are selected.\n *\n * The consumer controls visibility via `show`; the bar slides and fades\n * in/out using the same motion recipe as `SaveBar`.\n */\nexport const ActionBar = forwardRef<HTMLDivElement, ActionBarProps>(\n\tfunction ActionBar(\n\t\t{\n\t\t\tshow,\n\t\t\tcount,\n\t\t\tmessage,\n\t\t\tposition = \"bottom\",\n\t\t\tonClear,\n\t\t\tclearLabel = \"Clear selection\",\n\t\t\tactions,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst resolvedMessage =\n\t\t\tmessage ?? (typeof count === \"number\" ? `${count} selected` : null)\n\t\tconst hiddenTransform =\n\t\t\tposition === \"bottom\" ? \"translate-y-4\" : \"-translate-y-4\"\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\taria-live=\"polite\"\n\t\t\t\taria-hidden={!show}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none fixed inset-x-0 z-50 flex justify-center px-6\",\n\t\t\t\t\tposition === \"bottom\" ? \"bottom-0 pb-6\" : \"top-0 pt-6\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\trole=\"toolbar\"\n\t\t\t\t\taria-label={\n\t\t\t\t\t\ttypeof resolvedMessage === \"string\"\n\t\t\t\t\t\t\t? resolvedMessage\n\t\t\t\t\t\t\t: \"Bulk actions\"\n\t\t\t\t\t}\n\t\t\t\t\tinert={!show}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"pointer-events-auto\",\n\t\t\t\t\t\t\"flex items-center rounded-bruv-xl border py-1.5 pr-1.5 pl-1.5 shadow-lg\",\n\t\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral\",\n\t\t\t\t\t\t\"transition-all duration-500 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tshow\n\t\t\t\t\t\t\t? \"translate-y-0 scale-100 opacity-100\"\n\t\t\t\t\t\t\t: cn(\"pointer-events-none scale-95 opacity-0\", hiddenTransform),\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{onClear && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\t\tonClick={onClear}\n\t\t\t\t\t\t\taria-label={clearLabel}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{resolvedMessage && (\n\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base min-w-0 pr-3 pl-1 font-medium\">\n\t\t\t\t\t\t\t{resolvedMessage}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{actions && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1.5\">{actions}</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import type { RowSelectionState, Table } from \"@tanstack/react-table\"\nimport type { ReactNode } from \"react\"\nimport { ActionBar } from \"../action-bar\"\n\nexport interface DataTableBulkBarProps<TData> {\n\ttable: Table<TData>\n\t/** Controlled selection — defaults to table row selection state */\n\trowSelection?: RowSelectionState\n\tshow?: boolean\n\tmessage?: ReactNode\n\tactions?: ReactNode\n\tonClear?: () => void\n\tposition?: \"bottom\" | \"top\"\n}\n\nexport function DataTableBulkBar<TData>({\n\ttable,\n\trowSelection,\n\tshow,\n\tmessage,\n\tactions,\n\tonClear,\n\tposition = \"bottom\",\n}: DataTableBulkBarProps<TData>) {\n\tconst count = Object.keys(\n\t\trowSelection ?? table.getState().rowSelection,\n\t).length\n\tconst visible = show ?? count > 0\n\n\tconst handleClear =\n\t\tonClear ??\n\t\t(() => {\n\t\t\ttable.resetRowSelection()\n\t\t})\n\n\treturn (\n\t\t<ActionBar\n\t\t\tshow={visible}\n\t\t\tcount={count}\n\t\t\tmessage={message}\n\t\t\tactions={actions}\n\t\t\tonClear={handleClear}\n\t\t\tposition={position}\n\t\t/>\n\t)\n}\n","import { useEffect, useRef, useState, type ReactNode } from \"react\"\nimport { CheckIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Spinner } from \"../spinner\"\nimport { FilterChips, FilterTrigger } from \"./trigger\"\nimport type { FilterOption } from \"./types\"\n\nexport interface FilterMultiSelectProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Available filter options. */\n\toptions: readonly FilterOption[]\n\t/** Controlled selected values. */\n\tvalue?: readonly string[]\n\t/** Uncontrolled initial selected values. */\n\tdefaultValue?: readonly string[]\n\t/** Called when the selection changes. */\n\tonValueChange?: (values: string[]) => void\n\t/** Show the search input. Defaults to `true`. */\n\tsearchable?: boolean\n\t/** Placeholder for the search input. Defaults to the `title`. */\n\tsearchPlaceholder?: string\n\t/** Optional per-option counts rendered as a trailing badge in the dropdown. */\n\tfacets?: Map<string, number>\n\t/**\n\t * Async option loader. When provided, options are fetched as the user\n\t * types instead of filtering the static `options` array client-side.\n\t * The static `options` prop is still shown when the search is empty\n\t * (e.g. \"recently used\") and seeds the label cache for already-selected\n\t * values.\n\t */\n\tloadOptions?: (query: string) => Promise<readonly FilterOption[]>\n\t/** Debounce delay for `loadOptions` in ms. Defaults to 200. */\n\tloadDebounceMs?: number\n\t/** Label shown while `loadOptions` is in flight. Defaults to \"Searching...\". */\n\tloadingLabel?: string\n\t/** Label shown when `loadOptions` rejects. Defaults to \"Failed to load options.\". */\n\terrorLabel?: string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Searchable multi-select filter. Renders a dashed pill until at least one\n * option is selected, then a solid pill with chips showing the selection.\n * \"Clear filters\" row appears when anything is selected.\n *\n * When `loadOptions` is provided, options are fetched async per query and\n * a label cache keeps trigger badges intact even when selected values\n * aren't in the currently-displayed list.\n */\nexport function FilterMultiSelect({\n\ttitle,\n\ticon,\n\toptions,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tsearchable = true,\n\tsearchPlaceholder,\n\tfacets,\n\tloadOptions,\n\tloadDebounceMs = 200,\n\tloadingLabel = \"Searching...\",\n\terrorLabel = \"Failed to load options.\",\n\tdisabled,\n\tclassName,\n}: FilterMultiSelectProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<readonly string[]>(\n\t\tdefaultValue ?? [],\n\t)\n\tconst currentValues = isControlled ? controlledValue : internalValue\n\tconst selected = new Set(currentValues)\n\tconst hasSelection = selected.size > 0\n\n\tconst [search, setSearch] = useState(\"\")\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\t// Label cache so selected values from outside the current option list\n\t// (e.g. picked from a previous loadOptions response) still render\n\t// labels on the trigger badge.\n\tconst labelCacheRef = useRef<Map<string, string>>(new Map())\n\tfor (const opt of options) labelCacheRef.current.set(opt.value, opt.label)\n\n\t// Async option loading state. `loadedOptions` is bound to `loadedQuery`\n\t// so a stale result from a previous query can't render against the new\n\t// search input.\n\tconst [loadedOptions, setLoadedOptions] = useState<\n\t\treadonly FilterOption[] | null\n\t>(null)\n\tconst [loadedQuery, setLoadedQuery] = useState<string | null>(null)\n\tconst [isLoading, setIsLoading] = useState(false)\n\tconst [loadError, setLoadError] = useState(false)\n\tconst requestIdRef = useRef(0)\n\n\tuseEffect(() => {\n\t\tif (!loadOptions) return\n\t\tif (search === \"\") {\n\t\t\tsetLoadedOptions(null)\n\t\t\tsetLoadedQuery(null)\n\t\t\tsetIsLoading(false)\n\t\t\tsetLoadError(false)\n\t\t\treturn\n\t\t}\n\t\tconst id = ++requestIdRef.current\n\t\tsetIsLoading(true)\n\t\tsetLoadError(false)\n\t\tconst handle = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tconst result = await loadOptions(search)\n\t\t\t\tif (id !== requestIdRef.current) return\n\t\t\t\tfor (const opt of result)\n\t\t\t\t\tlabelCacheRef.current.set(opt.value, opt.label)\n\t\t\t\tsetLoadedOptions(result)\n\t\t\t\tsetLoadedQuery(search)\n\t\t\t\tsetLoadError(false)\n\t\t\t} catch {\n\t\t\t\tif (id !== requestIdRef.current) return\n\t\t\t\tsetLoadError(true)\n\t\t\t} finally {\n\t\t\t\tif (id === requestIdRef.current) setIsLoading(false)\n\t\t\t}\n\t\t}, loadDebounceMs)\n\t\treturn () => {\n\t\t\tclearTimeout(handle)\n\t\t}\n\t}, [search, loadOptions, loadDebounceMs])\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\t// Invalidate any in-flight request on unmount\n\t\t\trequestIdRef.current++\n\t\t}\n\t}, [])\n\n\t// Async path: only show loadedOptions when they match the current\n\t// search; otherwise we'd flash stale results between keystrokes.\n\tconst asyncOptions: readonly FilterOption[] =\n\t\tloadedOptions !== null && loadedQuery === search ? loadedOptions : []\n\n\tconst displayedOptions: readonly FilterOption[] = loadOptions\n\t\t? search === \"\"\n\t\t\t? options\n\t\t\t: asyncOptions\n\t\t: search\n\t\t\t? options.filter(opt =>\n\t\t\t\t\topt.label.toLowerCase().includes(search.toLowerCase()),\n\t\t\t\t)\n\t\t\t: options\n\n\tfunction commit(next: string[]) {\n\t\tif (!isControlled) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tfunction toggle(value: string) {\n\t\tconst next = new Set(selected)\n\t\tif (next.has(value)) next.delete(value)\n\t\telse next.add(value)\n\t\tcommit(Array.from(next))\n\t}\n\n\tconst selectedLabels = Array.from(selected).map(\n\t\tvalue => labelCacheRef.current.get(value) ?? value,\n\t)\n\n\treturn (\n\t\t<Popover.Root\n\t\t\tonOpenChange={open => {\n\t\t\t\tif (open && searchable) {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true })\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (!open) setSearch(\"\")\n\t\t\t}}\n\t\t>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={<FilterChips labels={selectedLabels} />}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[220px] p-1\"\n\t\t\t>\n\t\t\t\t{searchable && (\n\t\t\t\t\t<Menu.SearchInput className=\"mx-0 mt-0\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\tonChange={e => setSearch(e.target.value)}\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder ?? title}\n\t\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Menu.SearchInput>\n\t\t\t\t)}\n\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex h-20 items-center justify-center\">\n\t\t\t\t\t\t<Spinner label={loadingLabel} size=\"sm\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : loadError ? (\n\t\t\t\t\t<Menu.Empty>\n\t\t\t\t\t\t<span className=\"text-bruv-danger\">{errorLabel}</span>\n\t\t\t\t\t</Menu.Empty>\n\t\t\t\t) : (\n\t\t\t\t\t<Menu.List>\n\t\t\t\t\t\t{displayedOptions.length === 0 && (\n\t\t\t\t\t\t\t<Menu.Empty>No results found.</Menu.Empty>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{displayedOptions.map(option => {\n\t\t\t\t\t\t\tconst isSelected = selected.has(option.value)\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\t\trole=\"menuitemcheckbox\"\n\t\t\t\t\t\t\t\t\taria-checked={isSelected}\n\t\t\t\t\t\t\t\t\tonClick={() => toggle(option.value)}\n\t\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"flex size-4 items-center justify-center rounded border\",\n\t\t\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"border-bruv-accent bg-bruv-accent text-bruv-inverse\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"border-bruv-neutral [&_svg]:invisible\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CheckIcon className=\"size-3\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tindicator={\n\t\t\t\t\t\t\t\t\t\tfacets?.get(option.value) != null ? (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-tertiary font-bruv-mono text-bruv-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t{facets.get(option.value)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t) : undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option.icon && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary flex size-4 shrink-0 items-center justify-center [&>svg]:size-3.5\">\n\t\t\t\t\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<span className=\"relative z-[1]\">{option.label}</span>\n\t\t\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Menu.List>\n\t\t\t\t)}\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Menu.Separator />\n\t\t\t\t\t\t<Menu.Item onClick={() => commit([])} className=\"justify-center\">\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear filters</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { Popover as BasePopover } from \"@base-ui/react/popover\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Popover.Root\n// ---------------------------------------------------------------------------\n\nexport interface PopoverRootProps extends ComponentProps<\n\ttypeof BasePopover.Root\n> {}\n\nfunction PopoverRoot(props: PopoverRootProps) {\n\treturn <BasePopover.Root {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// Popover.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface PopoverTriggerProps extends ComponentProps<\n\ttypeof BasePopover.Trigger\n> {}\n\nconst PopoverTrigger = forwardRef<HTMLButtonElement, PopoverTriggerProps>(\n\tfunction PopoverTrigger({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BasePopover.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"cursor-pointer outline-none\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Content\n// ---------------------------------------------------------------------------\n\nexport interface PopoverContentProps extends ComponentProps<\n\ttypeof BasePopover.Popup\n> {\n\t/** Side relative to the trigger */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\t/** Offset from the trigger in px */\n\tsideOffset?: number\n\tchildren: ReactNode\n}\n\nfunction PopoverContent({\n\tside = \"bottom\",\n\talign = \"center\",\n\tsideOffset = 4,\n\tclassName,\n\tchildren,\n\t...props\n}: PopoverContentProps) {\n\treturn (\n\t\t<BasePopover.Portal>\n\t\t\t<BasePopover.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\tclassName=\"z-50 outline-none\"\n\t\t\t>\n\t\t\t\t<BasePopover.Popup\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-2 border border-bruv-neutral rounded-bruv-md shadow-md p-3\",\n\t\t\t\t\t\t\"origin-[var(--transform-origin)] will-change-[transform,opacity]\",\n\t\t\t\t\t\t\"transition-[transform,scale,opacity] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"data-[starting-style]:scale-[0.96] data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-[0.96] data-[ending-style]:opacity-0 data-[ending-style]:duration-150\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BasePopover.Popup>\n\t\t\t</BasePopover.Positioner>\n\t\t</BasePopover.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Popover.Arrow\n// ---------------------------------------------------------------------------\n\nexport interface PopoverArrowProps extends ComponentProps<\n\ttypeof BasePopover.Arrow\n> {}\n\nconst PopoverArrow = forwardRef<HTMLDivElement, PopoverArrowProps>(\n\tfunction PopoverArrow({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BasePopover.Arrow\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"fill-bruv-base-2 stroke-bruv-neutral [stroke-width:1px]\",\n\t\t\t\t\t\"data-[side=top]:bottom-[-5px]\",\n\t\t\t\t\t\"data-[side=bottom]:top-[-5px]\",\n\t\t\t\t\t\"data-[side=left]:right-[-5px]\",\n\t\t\t\t\t\"data-[side=right]:left-[-5px]\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Close\n// ---------------------------------------------------------------------------\n\nexport interface PopoverCloseProps extends ComponentProps<\n\ttypeof BasePopover.Close\n> {}\n\nconst PopoverClose = forwardRef<HTMLButtonElement, PopoverCloseProps>(\n\tfunction PopoverClose({ className, ...props }, ref) {\n\t\treturn <BasePopover.Close ref={ref} className={cn(className)} {...props} />\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Title\n// ---------------------------------------------------------------------------\n\nexport interface PopoverTitleProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst PopoverTitle = forwardRef<HTMLParagraphElement, PopoverTitleProps>(\n\tfunction PopoverTitle({ className, children }, ref) {\n\t\treturn (\n\t\t\t<p\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</p>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Popover.Description\n// ---------------------------------------------------------------------------\n\nexport interface PopoverDescriptionProps extends ComponentProps<\n\ttypeof BasePopover.Description\n> {}\n\nconst PopoverDescription = forwardRef<\n\tHTMLParagraphElement,\n\tPopoverDescriptionProps\n>(function PopoverDescription({ className, ...props }, ref) {\n\treturn (\n\t\t<BasePopover.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-bruv-secondary mt-1 text-bruv-base\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Popover = {\n\tRoot: PopoverRoot,\n\tTrigger: PopoverTrigger,\n\tContent: PopoverContent,\n\tArrow: PopoverArrow,\n\tClose: PopoverClose,\n\tTitle: PopoverTitle,\n\tDescription: PopoverDescription,\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { PlusCircleIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Badge } from \"../badge\"\n\nexport interface FilterTriggerProps extends Omit<\n\tComponentProps<\"button\">,\n\t\"title\" | \"children\"\n> {\n\ttitle: string\n\ticon?: ReactNode\n\t/** When true, the pill renders in its solid \"active\" style. */\n\tactive?: boolean\n\t/**\n\t * Chips rendered on the right side of the pill when `active`. Pass an\n\t * already-collapsed `Badge` (e.g. \"N selected\") or a list of label badges.\n\t */\n\tchips?: ReactNode\n}\n\n/**\n * Shared trigger pill used by every Filter.* variant. Renders a dashed\n * placeholder when inactive and a solid pill with chips when active.\n */\nexport const FilterTrigger = forwardRef<HTMLButtonElement, FilterTriggerProps>(\n\tfunction FilterTrigger(\n\t\t{ title, icon, active, chips, disabled, className, ...rest },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\tref={ref}\n\t\t\t\ttype=\"button\"\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral text-bruv-base inline-flex h-8 items-center rounded-bruv-md border\",\n\t\t\t\t\tactive\n\t\t\t\t\t\t? \"gap-1 border-solid py-1 pl-2.5 pr-2.5\"\n\t\t\t\t\t\t: \"gap-1.5 border-dashed px-3\",\n\t\t\t\t\t\"hover:bg-bruv-subtle cursor-pointer transition-colors\",\n\t\t\t\t\t\"ring-bruv-focus outline-none focus-visible:ring-2 focus-visible:ring-offset-2\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...rest}\n\t\t\t>\n\t\t\t\t<span className=\"text-bruv-tertiary flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t{icon ?? <PlusCircleIcon />}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-bruv-primary\">{title}</span>\n\t\t\t\t{active && chips && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"border-bruv-neutral mx-0.5 h-4 w-px border-l\"\n\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{chips}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t)\n\t},\n)\n\n/** Convenience renderer for the selection chips on multi/single triggers. */\nexport function FilterChips({\n\tlabels,\n\tcollapseAt = 2,\n}: {\n\tlabels: string[]\n\tcollapseAt?: number\n}) {\n\tif (labels.length === 0) return null\n\tif (labels.length > collapseAt) {\n\t\treturn (\n\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t{labels.length} selected\n\t\t\t</Badge>\n\t\t)\n\t}\n\treturn (\n\t\t<>\n\t\t\t{/* Mobile: show count only */}\n\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium lg:hidden\">\n\t\t\t\t{labels.length}\n\t\t\t</Badge>\n\t\t\t{/* Desktop: show labels */}\n\t\t\t<span className=\"hidden items-center gap-1 lg:flex\">\n\t\t\t\t{labels.map(label => (\n\t\t\t\t\t<Badge key={label} className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</Badge>\n\t\t\t\t))}\n\t\t\t</span>\n\t\t</>\n\t)\n}\n","import { useRef, useState, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { FilterTrigger } from \"./trigger\"\nimport type { FilterOption } from \"./types\"\nimport { Badge } from \"../badge\"\n\nexport interface FilterSingleSelectProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Available filter options. */\n\toptions: readonly FilterOption[]\n\t/** Controlled selected value. */\n\tvalue?: string\n\t/** Uncontrolled initial selected value. */\n\tdefaultValue?: string\n\t/** Called when the selection changes. Receives `undefined` when cleared. */\n\tonValueChange?: (value: string | undefined) => void\n\t/** Show the search input. Defaults to `true`. */\n\tsearchable?: boolean\n\t/** Placeholder for the search input. Defaults to the `title`. */\n\tsearchPlaceholder?: string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Searchable single-select filter. Picking an option closes the popover and\n * updates the trigger to show the selected label. \"Clear\" row appears when a\n * value is set.\n */\nexport function FilterSingleSelect({\n\ttitle,\n\ticon,\n\toptions,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tsearchable = true,\n\tsearchPlaceholder,\n\tdisabled,\n\tclassName,\n}: FilterSingleSelectProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<string | undefined>(\n\t\tdefaultValue,\n\t)\n\tconst currentValue = isControlled ? controlledValue : internalValue\n\tconst hasSelection = currentValue !== undefined && currentValue !== \"\"\n\n\tconst [open, setOpen] = useState(false)\n\tconst [search, setSearch] = useState(\"\")\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\tconst filtered = search\n\t\t? options.filter(opt =>\n\t\t\t\topt.label.toLowerCase().includes(search.toLowerCase()),\n\t\t\t)\n\t\t: options\n\n\tconst selectedOption = options.find(opt => opt.value === currentValue)\n\n\tfunction commit(next: string | undefined) {\n\t\tif (!isControlled) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tfunction pick(value: string) {\n\t\tcommit(value)\n\t\tsetOpen(false)\n\t}\n\n\treturn (\n\t\t<Popover.Root\n\t\t\topen={open}\n\t\t\tonOpenChange={next => {\n\t\t\t\tsetOpen(next)\n\t\t\t\tif (next && searchable) {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true })\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (!next) setSearch(\"\")\n\t\t\t}}\n\t\t>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tselectedOption ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{selectedOption.label}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[220px] p-1\"\n\t\t\t>\n\t\t\t\t{searchable && (\n\t\t\t\t\t<Menu.SearchInput className=\"mx-0 mt-0\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\tonChange={e => setSearch(e.target.value)}\n\t\t\t\t\t\t\tplaceholder={searchPlaceholder ?? title}\n\t\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Menu.SearchInput>\n\t\t\t\t)}\n\n\t\t\t\t<Menu.List>\n\t\t\t\t\t{filtered.length === 0 && <Menu.Empty>No results found.</Menu.Empty>}\n\n\t\t\t\t\t{filtered.map(option => {\n\t\t\t\t\t\tconst isSelected = option.value === currentValue\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\tonClick={() => pick(option.value)}\n\t\t\t\t\t\t\t\ticon={\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"flex size-4 items-center justify-center rounded-full border\",\n\t\t\t\t\t\t\t\t\t\t\tisSelected ? \"border-bruv-accent\" : \"border-bruv-neutral\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\"size-2 rounded-full\",\n\t\t\t\t\t\t\t\t\t\t\t\tisSelected ? \"bg-bruv-accent\" : \"bg-transparent\",\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{option.icon && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-bruv-secondary flex size-4 shrink-0 items-center justify-center [&>svg]:size-3.5\">\n\t\t\t\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<span className=\"relative z-[1]\">{option.label}</span>\n\t\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t\t)\n\t\t\t\t\t})}\n\t\t\t\t</Menu.List>\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Menu.Separator />\n\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tcommit(undefined)\n\t\t\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"justify-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterToggleProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Controlled pressed state. */\n\tpressed?: boolean\n\t/** Uncontrolled initial pressed state. */\n\tdefaultPressed?: boolean\n\t/** Called when the pressed state flips. */\n\tonPressedChange?: (pressed: boolean) => void\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Boolean filter pill — no popover. Clicking the trigger flips the pressed\n * state; the trigger styling switches between dashed-empty and solid-active.\n * Useful for \"Show archived\", \"Only mine\", etc.\n */\nexport function FilterToggle({\n\ttitle,\n\ticon,\n\tpressed: controlledPressed,\n\tdefaultPressed = false,\n\tonPressedChange,\n\tdisabled,\n\tclassName,\n}: FilterToggleProps) {\n\tconst isControlled = controlledPressed !== undefined\n\tconst [internalPressed, setInternalPressed] = useState(defaultPressed)\n\tconst pressed = isControlled ? controlledPressed : internalPressed\n\n\tfunction handleClick() {\n\t\tconst next = !pressed\n\t\tif (!isControlled) setInternalPressed(next)\n\t\tonPressedChange?.(next)\n\t}\n\n\treturn (\n\t\t<FilterTrigger\n\t\t\ttitle={title}\n\t\t\ticon={icon}\n\t\t\tactive={pressed}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={className}\n\t\t\tonClick={handleClick}\n\t\t\taria-pressed={pressed}\n\t\t/>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport { Calendar } from \"../calendar\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { Button } from \"../button\"\nimport { FilterTrigger } from \"./trigger\"\nimport type { FilterDateRangePreset } from \"./date-presets\"\n\nexport interface FilterDateRangeValue {\n\t/** ISO date string (yyyy-mm-dd). */\n\tfrom?: string\n\t/** ISO date string (yyyy-mm-dd). */\n\tto?: string\n}\n\nexport interface FilterDateRangeProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. Defaults to a calendar icon. */\n\ticon?: ReactNode\n\t/** Controlled value. */\n\tvalue?: FilterDateRangeValue\n\t/** Uncontrolled initial value. */\n\tdefaultValue?: FilterDateRangeValue\n\t/** Called when the range changes. */\n\tonValueChange?: (value: FilterDateRangeValue) => void\n\t/**\n\t * Quick-pick presets rendered above the from/to inputs. Clicking a\n\t * preset resolves its `value()` at click time, commits the result, and\n\t * closes the popover. See `dateRangePresets` for a sensible default.\n\t */\n\tpresets?: readonly FilterDateRangePreset[]\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nconst dateFormatter = new Intl.DateTimeFormat(undefined, {\n\tmonth: \"short\",\n\tday: \"numeric\",\n})\n\nfunction formatRange(value: FilterDateRangeValue | undefined): string | null {\n\tif (!value) return null\n\tconst fromDate = parseLocalDate(value.from)\n\tconst toDate = parseLocalDate(value.to)\n\tif (fromDate && toDate) {\n\t\treturn `${dateFormatter.format(fromDate)} – ${dateFormatter.format(toDate)}`\n\t}\n\tif (fromDate) return `From ${dateFormatter.format(fromDate)}`\n\tif (toDate) return `Until ${dateFormatter.format(toDate)}`\n\treturn null\n}\n\n/**\n * Date range filter with an inline Calendar in the popover.\n */\nexport function FilterDateRange({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tpresets,\n\tdisabled,\n\tclassName,\n}: FilterDateRangeProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<FilterDateRangeValue>(\n\t\tdefaultValue ?? {},\n\t)\n\tconst [open, setOpen] = useState(false)\n\tconst currentValue = isControlled\n\t\t? (controlledValue as FilterDateRangeValue)\n\t\t: internalValue\n\tconst formatted = formatRange(currentValue)\n\tconst hasSelection = formatted !== null\n\n\tfunction commit(next: FilterDateRangeValue) {\n\t\tconst normalized: FilterDateRangeValue = {\n\t\t\tfrom: next.from || undefined,\n\t\t\tto: next.to || undefined,\n\t\t}\n\t\tif (!isControlled) setInternalValue(normalized)\n\t\tonValueChange?.(normalized)\n\t}\n\n\tfunction applyPreset(preset: FilterDateRangePreset) {\n\t\tcommit(preset.value())\n\t\tsetOpen(false)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <CalendarIcon />}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tformatted ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-auto p-0\"\n\t\t\t>\n\t\t\t\t{presets && presets.length > 0 && (\n\t\t\t\t\t<div className=\"border-bruv-neutral flex flex-wrap gap-1 border-b p-2\">\n\t\t\t\t\t\t{presets.map(preset => {\n\t\t\t\t\t\t\tconst presetValue = preset.value()\n\t\t\t\t\t\t\tconst isActive =\n\t\t\t\t\t\t\t\tpresetValue.from === currentValue.from &&\n\t\t\t\t\t\t\t\tpresetValue.to === currentValue.to\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tkey={preset.label}\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\tvariant={isActive ? \"primary\" : \"secondary\"}\n\t\t\t\t\t\t\t\t\tonClick={() => applyPreset(preset)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{preset.label}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"range\"\n\t\t\t\t\trangeValue={{\n\t\t\t\t\t\tfrom: parseLocalDate(currentValue.from) ?? undefined,\n\t\t\t\t\t\tto: parseLocalDate(currentValue.to) ?? undefined,\n\t\t\t\t\t}}\n\t\t\t\t\tonRangeValueChange={range => {\n\t\t\t\t\t\tconst next: FilterDateRangeValue = {\n\t\t\t\t\t\t\tfrom: range.from ? formatIsoDate(range.from) : undefined,\n\t\t\t\t\t\t\tto: range.to ? formatIsoDate(range.to) : undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcommit(next)\n\t\t\t\t\t\tif (next.from && next.to) setOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"border-0 shadow-none\"\n\t\t\t\t/>\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<div className=\"border-bruv-neutral border-t p-1\">\n\t\t\t\t\t\t<Menu.Item onClick={() => commit({})} className=\"justify-center\">\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","export function parseLocalDate(iso: string | undefined): Date | null {\n\tif (!iso) return null\n\tconst match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso)\n\tif (!match) return null\n\tconst year = Number(match[1])\n\tconst month = Number(match[2])\n\tconst day = Number(match[3])\n\tconst date = new Date(year, month - 1, day)\n\tif (!Number.isFinite(date.getTime())) return null\n\tif (\n\t\tdate.getFullYear() !== year ||\n\t\tdate.getMonth() !== month - 1 ||\n\t\tdate.getDate() !== day\n\t) {\n\t\treturn null\n\t}\n\treturn date\n}\n\nexport function formatIsoDate(date: Date): string {\n\tconst y = date.getFullYear()\n\tconst m = String(date.getMonth() + 1).padStart(2, \"0\")\n\tconst d = String(date.getDate()).padStart(2, \"0\")\n\treturn `${y}-${m}-${d}`\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n\treturn (\n\t\ta.getFullYear() === b.getFullYear() &&\n\t\ta.getMonth() === b.getMonth() &&\n\t\ta.getDate() === b.getDate()\n\t)\n}\n\nexport function isSameMonth(a: Date, b: Date): boolean {\n\treturn a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth()\n}\n\nexport function startOfMonth(date: Date): Date {\n\treturn new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nexport function addMonths(date: Date, months: number): Date {\n\treturn new Date(date.getFullYear(), date.getMonth() + months, 1)\n}\n\nexport function getDaysInMonth(date: Date): number {\n\treturn new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()\n}\n\nexport function getWeekdayOffset(date: Date): number {\n\treturn new Date(date.getFullYear(), date.getMonth(), 1).getDay()\n}\n\nexport function isDateInRange(\n\tdate: Date,\n\tfrom: Date | null,\n\tto: Date | null,\n): boolean {\n\tif (from && date < from) return false\n\tif (to && date > to) return false\n\treturn true\n}\n\nexport function isBetweenInclusive(date: Date, from: Date, to: Date): boolean {\n\tconst time = date.getTime()\n\treturn time >= from.getTime() && time <= to.getTime()\n}\n","import { useState, type ComponentProps } from \"react\"\nimport { ChevronLeftIcon, ChevronRightIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport {\n\taddMonths,\n\tformatIsoDate,\n\tgetDaysInMonth,\n\tgetWeekdayOffset,\n\tisBetweenInclusive,\n\tisSameDay,\n\tisSameMonth,\n\tparseLocalDate,\n\tstartOfMonth,\n} from \"../../lib/date\"\nimport { Button } from \"../button\"\n\nconst WEEKDAYS = [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"] as const\n\nexport type CalendarMode = \"single\" | \"range\"\n\nexport interface CalendarRangeValue {\n\tfrom?: Date\n\tto?: Date\n}\n\nexport interface CalendarProps extends Omit<\n\tComponentProps<\"div\">,\n\t\"onChange\" | \"defaultValue\"\n> {\n\tmode?: CalendarMode\n\tvalue?: Date | null\n\tdefaultValue?: Date | null\n\tonValueChange?: (value: Date | null) => void\n\trangeValue?: CalendarRangeValue\n\tdefaultRangeValue?: CalendarRangeValue\n\tonRangeValueChange?: (value: CalendarRangeValue) => void\n\tmonth?: Date\n\tdefaultMonth?: Date\n\tonMonthChange?: (month: Date) => void\n\tminDate?: Date\n\tmaxDate?: Date\n\tdisabled?: (date: Date) => boolean\n}\n\nfunction dateAtMidnight(date: Date): Date {\n\treturn new Date(date.getFullYear(), date.getMonth(), date.getDate())\n}\n\nfunction isDisabledDate(\n\tdate: Date,\n\tminDate?: Date,\n\tmaxDate?: Date,\n\tdisabled?: (date: Date) => boolean,\n): boolean {\n\tconst d = dateAtMidnight(date)\n\tif (minDate && d < dateAtMidnight(minDate)) return true\n\tif (maxDate && d > dateAtMidnight(maxDate)) return true\n\treturn disabled?.(date) ?? false\n}\n\nexport function Calendar({\n\tmode = \"single\",\n\tvalue: controlledValue,\n\tdefaultValue = null,\n\tonValueChange,\n\trangeValue: controlledRange,\n\tdefaultRangeValue,\n\tonRangeValueChange,\n\tmonth: controlledMonth,\n\tdefaultMonth,\n\tonMonthChange,\n\tminDate,\n\tmaxDate,\n\tdisabled,\n\tclassName,\n\t...props\n}: CalendarProps) {\n\tconst [internalValue, setInternalValue] = useState<Date | null>(defaultValue)\n\tconst [internalRange, setInternalRange] = useState<CalendarRangeValue>(\n\t\tdefaultRangeValue ?? {},\n\t)\n\tconst [internalMonth, setInternalMonth] = useState<Date>(\n\t\tdefaultMonth ?? startOfMonth(new Date()),\n\t)\n\tconst [hoverDate, setHoverDate] = useState<Date | null>(null)\n\n\tconst value = controlledValue !== undefined ? controlledValue : internalValue\n\tconst range = controlledRange !== undefined ? controlledRange : internalRange\n\tconst visibleMonth =\n\t\tcontrolledMonth !== undefined ? controlledMonth : internalMonth\n\n\tconst setMonth = (next: Date) => {\n\t\tif (controlledMonth === undefined) setInternalMonth(next)\n\t\tonMonthChange?.(next)\n\t}\n\n\tconst setValue = (next: Date | null) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tconst setRange = (next: CalendarRangeValue) => {\n\t\tif (controlledRange === undefined) setInternalRange(next)\n\t\tonRangeValueChange?.(next)\n\t}\n\n\tconst today = dateAtMidnight(new Date())\n\tconst daysInMonth = getDaysInMonth(visibleMonth)\n\tconst offset = getWeekdayOffset(visibleMonth)\n\n\tconst handleSelect = (date: Date) => {\n\t\tif (isDisabledDate(date, minDate, maxDate, disabled)) return\n\n\t\tif (mode === \"single\") {\n\t\t\tsetValue(date)\n\t\t\treturn\n\t\t}\n\n\t\tconst from = range.from\n\t\tconst to = range.to\n\t\tif (!from || (from && to)) {\n\t\t\tsetRange({ from: date, to: undefined })\n\t\t\treturn\n\t\t}\n\t\tif (date < from) {\n\t\t\tsetRange({ from: date, to: from })\n\t\t\treturn\n\t\t}\n\t\tsetRange({ from, to: date })\n\t}\n\n\tconst rangeEnd =\n\t\tmode === \"range\" && range.from && !range.to && hoverDate\n\t\t\t? hoverDate\n\t\t\t: range.to\n\n\tconst monthLabel = new Intl.DateTimeFormat(undefined, {\n\t\tmonth: \"long\",\n\t\tyear: \"numeric\",\n\t}).format(visibleMonth)\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t\"w-[280px] rounded-bruv-lg border border-bruv-neutral bg-bruv-base-2 p-3 shadow-xs\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div className=\"mb-3 flex items-center justify-between gap-2\">\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\ticonLeft={<ChevronLeftIcon />}\n\t\t\t\t\taria-label=\"Previous month\"\n\t\t\t\t\tonClick={() => setMonth(addMonths(visibleMonth, -1))}\n\t\t\t\t/>\n\t\t\t\t<span className=\"text-bruv-sm text-bruv-primary font-medium\">\n\t\t\t\t\t{monthLabel}\n\t\t\t\t</span>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\ticonLeft={<ChevronRightIcon />}\n\t\t\t\t\taria-label=\"Next month\"\n\t\t\t\t\tonClick={() => setMonth(addMonths(visibleMonth, 1))}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-7 gap-0.5\">\n\t\t\t\t{WEEKDAYS.map(day => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={day}\n\t\t\t\t\t\tclassName=\"text-bruv-xs text-bruv-tertiary flex h-8 items-center justify-center font-medium\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{day}\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\n\t\t\t\t{Array.from({ length: offset }, (_, i) => (\n\t\t\t\t\t<div key={`pad-${String(i)}`} aria-hidden=\"true\" />\n\t\t\t\t))}\n\n\t\t\t\t{Array.from({ length: daysInMonth }, (_, i) => {\n\t\t\t\t\tconst day = i + 1\n\t\t\t\t\tconst date = new Date(\n\t\t\t\t\t\tvisibleMonth.getFullYear(),\n\t\t\t\t\t\tvisibleMonth.getMonth(),\n\t\t\t\t\t\tday,\n\t\t\t\t\t)\n\t\t\t\t\tconst isToday = isSameDay(date, today)\n\t\t\t\t\tconst isSelected =\n\t\t\t\t\t\tmode === \"single\" && value ? isSameDay(date, value) : false\n\t\t\t\t\tconst inRange =\n\t\t\t\t\t\tmode === \"range\" &&\n\t\t\t\t\t\trange.from &&\n\t\t\t\t\t\trangeEnd &&\n\t\t\t\t\t\tisBetweenInclusive(date, range.from, rangeEnd)\n\t\t\t\t\tconst isRangeStart =\n\t\t\t\t\t\tmode === \"range\" && range.from && isSameDay(date, range.from)\n\t\t\t\t\tconst isRangeEnd =\n\t\t\t\t\t\tmode === \"range\" && rangeEnd && isSameDay(date, rangeEnd)\n\t\t\t\t\tconst isOutsideMonth = !isSameMonth(date, visibleMonth)\n\t\t\t\t\tconst isDisabled = isDisabledDate(date, minDate, maxDate, disabled)\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tkey={formatIsoDate(date)}\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tdisabled={isDisabled}\n\t\t\t\t\t\t\tonClick={() => handleSelect(date)}\n\t\t\t\t\t\t\tonMouseEnter={() =>\n\t\t\t\t\t\t\t\tmode === \"range\" ? setHoverDate(date) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonMouseLeave={() =>\n\t\t\t\t\t\t\t\tmode === \"range\" ? setHoverDate(null) : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-bruv-sm relative flex h-8 w-full items-center justify-center rounded-bruv-md transition-colors\",\n\t\t\t\t\t\t\t\t\"hover:bg-bruv-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\t\t\tisDisabled && \"pointer-events-none opacity-40\",\n\t\t\t\t\t\t\t\tisOutsideMonth && \"text-bruv-tertiary\",\n\t\t\t\t\t\t\t\tisToday && !isSelected && !inRange && \"font-semibold\",\n\t\t\t\t\t\t\t\tinRange && \"bg-bruv-accent-subtle text-bruv-accent\",\n\t\t\t\t\t\t\t\t(isSelected || isRangeStart || isRangeEnd) &&\n\t\t\t\t\t\t\t\t\t\"bg-bruv-accent text-bruv-accent-on hover:bg-bruv-accent\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{day}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t)\n}\n\nexport { parseLocalDate, formatIsoDate }\n","import { useState, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterNumericRangeValue {\n\tmin?: number\n\tmax?: number\n}\n\nexport interface FilterNumericRangeProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Controlled value. */\n\tvalue?: FilterNumericRangeValue\n\t/** Uncontrolled initial value. */\n\tdefaultValue?: FilterNumericRangeValue\n\t/** Called when the range changes. */\n\tonValueChange?: (value: FilterNumericRangeValue) => void\n\t/** Lower bound for the input controls (doesn't appear in the badge). */\n\tmin?: number\n\t/** Upper bound for the input controls (doesn't appear in the badge). */\n\tmax?: number\n\t/** Step for the input controls. */\n\tstep?: number\n\t/** Prefix shown next to each value in the trigger badge (e.g. \"$\", \"★\"). */\n\tunit?: string\n\t/** Custom badge formatter. Falls back to `Intl.NumberFormat` + unit. */\n\tformat?: (n: number) => string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nconst numberFormatter = new Intl.NumberFormat()\n\nfunction defaultFormat(n: number, unit?: string): string {\n\tconst formatted = numberFormatter.format(n)\n\treturn unit ? `${unit}${formatted}` : formatted\n}\n\nfunction formatRange(\n\tvalue: FilterNumericRangeValue,\n\tunit?: string,\n\tformat?: (n: number) => string,\n): string | null {\n\tconst formatter = (n: number) => (format ? format(n) : defaultFormat(n, unit))\n\tconst hasMin = value.min !== undefined && !Number.isNaN(value.min)\n\tconst hasMax = value.max !== undefined && !Number.isNaN(value.max)\n\tif (hasMin && hasMax) {\n\t\treturn `${formatter(value.min as number)} – ${formatter(value.max as number)}`\n\t}\n\tif (hasMin) return `≥ ${formatter(value.min as number)}`\n\tif (hasMax) return `≤ ${formatter(value.max as number)}`\n\treturn null\n}\n\n/**\n * Numeric range filter. Paired `<input type=\"number\">` controls in the\n * popover; trigger shows the formatted range when active.\n */\nexport function FilterNumericRange({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tmin,\n\tmax,\n\tstep,\n\tunit,\n\tformat,\n\tdisabled,\n\tclassName,\n}: FilterNumericRangeProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState<FilterNumericRangeValue>(\n\t\tdefaultValue ?? {},\n\t)\n\tconst currentValue = isControlled\n\t\t? (controlledValue as FilterNumericRangeValue)\n\t\t: internalValue\n\tconst formatted = formatRange(currentValue, unit, format)\n\tconst hasSelection = formatted !== null\n\n\tfunction commit(next: FilterNumericRangeValue) {\n\t\tconst normalized: FilterNumericRangeValue = {\n\t\t\tmin:\n\t\t\t\tnext.min === undefined || Number.isNaN(next.min) ? undefined : next.min,\n\t\t\tmax:\n\t\t\t\tnext.max === undefined || Number.isNaN(next.max) ? undefined : next.max,\n\t\t}\n\t\tif (!isControlled) setInternalValue(normalized)\n\t\tonValueChange?.(normalized)\n\t}\n\n\treturn (\n\t\t<Popover.Root>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tformatted ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[260px] p-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<NumericField\n\t\t\t\t\t\tlabel=\"Min\"\n\t\t\t\t\t\tvalue={currentValue.min}\n\t\t\t\t\t\tmax={currentValue.max ?? max}\n\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tunit={unit}\n\t\t\t\t\t\tonChange={value => commit({ ...currentValue, min: value })}\n\t\t\t\t\t/>\n\t\t\t\t\t<NumericField\n\t\t\t\t\t\tlabel=\"Max\"\n\t\t\t\t\t\tvalue={currentValue.max}\n\t\t\t\t\t\tmin={currentValue.min ?? min}\n\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tunit={unit}\n\t\t\t\t\t\tonChange={value => commit({ ...currentValue, max: value })}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{hasSelection && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Menu.Separator className=\"mt-2\" />\n\t\t\t\t\t\t<Menu.Item onClick={() => commit({})} className=\"justify-center\">\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n\nfunction NumericField({\n\tlabel,\n\tvalue,\n\tmin,\n\tmax,\n\tstep,\n\tunit,\n\tonChange,\n}: {\n\tlabel: string\n\tvalue: number | undefined\n\tmin?: number\n\tmax?: number\n\tstep?: number\n\tunit?: string\n\tonChange: (value: number | undefined) => void\n}) {\n\treturn (\n\t\t<label className=\"flex flex-col gap-1\">\n\t\t\t<span className=\"text-bruv-secondary text-bruv-sm\">{label}</span>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-1 border-bruv-neutral text-bruv-primary\",\n\t\t\t\t\t\"flex h-8 items-center gap-1 rounded-bruv-md border px-2\",\n\t\t\t\t\t\"focus-within:ring-bruv-focus focus-within:ring-2 focus-within:ring-offset-2\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{unit && (\n\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-base\">{unit}</span>\n\t\t\t\t)}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"number\"\n\t\t\t\t\tvalue={value ?? \"\"}\n\t\t\t\t\tmin={min}\n\t\t\t\t\tmax={max}\n\t\t\t\t\tstep={step}\n\t\t\t\t\tonChange={e => {\n\t\t\t\t\t\tconst raw = e.target.value\n\t\t\t\t\t\tif (raw === \"\") onChange(undefined)\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tconst n = Number(raw)\n\t\t\t\t\t\t\tonChange(Number.isNaN(n) ? undefined : n)\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</label>\n\t)\n}\n","import { useRef, useState, type KeyboardEvent, type ReactNode } from \"react\"\nimport { MagnifyingGlassIcon, XMarkIcon } from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterTextProps {\n\t/** Label shown on the trigger pill. */\n\ttitle: string\n\t/** Override the leading icon on the trigger. */\n\ticon?: ReactNode\n\t/** Controlled value. */\n\tvalue?: string\n\t/** Uncontrolled initial value. */\n\tdefaultValue?: string\n\t/** Called on every keystroke. */\n\tonValueChange?: (value: string) => void\n\t/** Placeholder for the popover input. Defaults to `title`. */\n\tplaceholder?: string\n\tdisabled?: boolean\n\tclassName?: string\n}\n\n/**\n * Single-text-input filter. The popover hosts an auto-focused input with an\n * inline clear button. Commits on every keystroke; consumers can wrap\n * `onValueChange` if they need to debounce server-side filtering.\n */\nexport function FilterText({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tplaceholder,\n\tdisabled,\n\tclassName,\n}: FilterTextProps) {\n\tconst isControlled = controlledValue !== undefined\n\tconst [internalValue, setInternalValue] = useState(defaultValue ?? \"\")\n\tconst currentValue = isControlled\n\t\t? (controlledValue as string)\n\t\t: internalValue\n\tconst hasSelection = currentValue.length > 0\n\n\tconst [open, setOpen] = useState(false)\n\tconst inputRef = useRef<HTMLInputElement>(null)\n\n\tfunction commit(next: string) {\n\t\tif (!isControlled) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tfunction handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n\t\tif (event.key === \"Enter\") {\n\t\t\tevent.preventDefault()\n\t\t\tsetOpen(false)\n\t\t}\n\t}\n\n\treturn (\n\t\t<Popover.Root\n\t\t\topen={open}\n\t\t\tonOpenChange={next => {\n\t\t\t\tsetOpen(next)\n\t\t\t\tif (next) {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tinputRef.current?.focus({ preventScroll: true })\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <MagnifyingGlassIcon />}\n\t\t\t\t\t\tactive={hasSelection}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\thasSelection ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t<span className=\"block max-w-[12ch] truncate\">\n\t\t\t\t\t\t\t\t\t\t{`\"${currentValue}\"`}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content\n\t\t\t\tside=\"bottom\"\n\t\t\t\talign=\"start\"\n\t\t\t\tsideOffset={4}\n\t\t\t\tclassName=\"w-[240px] p-1\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-1 border-bruv-neutral text-bruv-primary\",\n\t\t\t\t\t\t\"flex h-8 items-center gap-1 rounded-bruv-md border px-2\",\n\t\t\t\t\t\t\"focus-within:ring-bruv-focus focus-within:ring-2 focus-within:ring-offset-2\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<MagnifyingGlassIcon className=\"text-bruv-tertiary size-4 shrink-0\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\tvalue={currentValue}\n\t\t\t\t\t\tonChange={e => commit(e.target.value)}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tplaceholder={placeholder ?? title}\n\t\t\t\t\t\tclassName=\"text-bruv-primary placeholder:text-bruv-tertiary text-bruv-base flex-1 bg-transparent outline-none\"\n\t\t\t\t\t/>\n\t\t\t\t\t{hasSelection && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tcommit(\"\")\n\t\t\t\t\t\t\t\tinputRef.current?.focus()\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-label=\"Clear\"\n\t\t\t\t\t\t\tclassName=\"text-bruv-tertiary hover:text-bruv-primary cursor-pointer\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<XMarkIcon className=\"size-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport { Calendar } from \"../calendar\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterDateProps {\n\ttitle: string\n\ticon?: ReactNode\n\tvalue?: string\n\tdefaultValue?: string\n\tonValueChange?: (value: string | undefined) => void\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nconst dateFormatter = new Intl.DateTimeFormat(undefined, {\n\tmonth: \"short\",\n\tday: \"numeric\",\n\tyear: \"numeric\",\n})\n\nexport function FilterDate({\n\ttitle,\n\ticon,\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tdisabled,\n\tclassName,\n}: FilterDateProps) {\n\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\tconst [open, setOpen] = useState(false)\n\n\tconst iso = controlledValue !== undefined ? controlledValue : internalValue\n\tconst selected = parseLocalDate(iso)\n\tconst formatted = selected ? dateFormatter.format(selected) : null\n\n\tconst commit = (next: string | undefined) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <CalendarIcon />}\n\t\t\t\t\t\tactive={!!formatted}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\tformatted ? (\n\t\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t) : null\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content side=\"bottom\" align=\"start\" className=\"w-auto p-0\">\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"single\"\n\t\t\t\t\tvalue={selected}\n\t\t\t\t\tonValueChange={date => {\n\t\t\t\t\t\tcommit(date ? formatIsoDate(date) : undefined)\n\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"border-0 shadow-none\"\n\t\t\t\t/>\n\t\t\t\t{formatted ? (\n\t\t\t\t\t<div className=\"border-bruv-neutral border-t p-1\">\n\t\t\t\t\t\t<Menu.Item\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tcommit(undefined)\n\t\t\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"justify-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"relative z-[1]\">Clear</span>\n\t\t\t\t\t\t</Menu.Item>\n\t\t\t\t\t</div>\n\t\t\t\t) : null}\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { useState, type ReactNode } from \"react\"\nimport { AdjustmentsHorizontalIcon } from \"@heroicons/react/16/solid\"\nimport { Menu } from \"../menu\"\nimport { Popover } from \"../popover\"\nimport { Badge } from \"../badge\"\nimport { Slider } from \"../slider\"\nimport { FilterTrigger } from \"./trigger\"\n\nexport interface FilterSliderValue {\n\tmin: number\n\tmax: number\n}\n\nexport interface FilterSliderProps {\n\ttitle: string\n\ticon?: ReactNode\n\tmin?: number\n\tmax?: number\n\tstep?: number\n\tvalue?: FilterSliderValue\n\tdefaultValue?: FilterSliderValue\n\tonValueChange?: (value: FilterSliderValue) => void\n\tdisabled?: boolean\n\tclassName?: string\n}\n\nexport function FilterSlider({\n\ttitle,\n\ticon,\n\tmin = 0,\n\tmax = 100,\n\tstep = 1,\n\tvalue: controlledValue,\n\tdefaultValue = { min, max },\n\tonValueChange,\n\tdisabled,\n\tclassName,\n}: FilterSliderProps) {\n\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\tconst [open, setOpen] = useState(false)\n\n\tconst current =\n\t\tcontrolledValue !== undefined ? controlledValue : internalValue\n\tconst formatted = `${current.min} – ${current.max}`\n\n\tconst commit = (next: FilterSliderValue) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\trender={\n\t\t\t\t\t<FilterTrigger\n\t\t\t\t\t\ttitle={title}\n\t\t\t\t\t\ticon={icon ?? <AdjustmentsHorizontalIcon />}\n\t\t\t\t\t\tactive\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tchips={\n\t\t\t\t\t\t\t<Badge className=\"rounded-bruv-sm px-1 font-medium\">\n\t\t\t\t\t\t\t\t{formatted}\n\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content side=\"bottom\" align=\"start\" className=\"w-[240px]\">\n\t\t\t\t<Slider\n\t\t\t\t\tmin={min}\n\t\t\t\t\tmax={max}\n\t\t\t\t\tstep={step}\n\t\t\t\t\tvalue={[current.min, current.max]}\n\t\t\t\t\tonValueChange={values => {\n\t\t\t\t\t\tconst [a, b] = values as number[]\n\t\t\t\t\t\tcommit({ min: a ?? min, max: b ?? max })\n\t\t\t\t\t}}\n\t\t\t\t\tshowValue\n\t\t\t\t/>\n\t\t\t\t<Menu.Separator className=\"my-2\" />\n\t\t\t\t<Menu.Item\n\t\t\t\t\tonClick={() => commit({ min, max })}\n\t\t\t\t\tclassName=\"justify-center\"\n\t\t\t\t>\n\t\t\t\t\t<span className=\"relative z-[1]\">Reset</span>\n\t\t\t\t</Menu.Item>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { Slider as BaseSlider } from \"@base-ui/react/slider\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst thumbClassName = cn(\n\t\"block size-4 rounded-full border-2 border-bruv-accent bg-bruv-base-2 shadow-xs\",\n\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\"transition-transform duration-150 ease-bruv-out-expo\",\n\t\"data-[disabled]:opacity-50\",\n)\n\nexport interface SliderProps extends ComponentProps<typeof BaseSlider.Root> {\n\tshowValue?: boolean\n}\n\nfunction getThumbCount(\n\tvalue: SliderProps[\"value\"],\n\tdefaultValue: SliderProps[\"defaultValue\"],\n): number {\n\tconst resolved = value ?? defaultValue\n\tif (Array.isArray(resolved)) return resolved.length\n\treturn 1\n}\n\nexport const Slider = forwardRef<HTMLDivElement, SliderProps>(function Slider(\n\t{\n\t\tvalue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\tmin = 0,\n\t\tmax = 100,\n\t\tstep = 1,\n\t\tdisabled,\n\t\tshowValue = false,\n\t\tclassName,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst thumbCount = getThumbCount(value, defaultValue)\n\n\treturn (\n\t\t<BaseSlider.Root\n\t\t\tref={ref}\n\t\t\tvalue={value}\n\t\t\tdefaultValue={defaultValue}\n\t\t\tonValueChange={onValueChange}\n\t\t\tmin={min}\n\t\t\tmax={max}\n\t\t\tstep={step}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex w-full touch-none flex-col gap-2 select-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<BaseSlider.Control className=\"relative flex h-5 w-full items-center py-2\">\n\t\t\t\t<BaseSlider.Track className=\"bg-bruv-subtle relative h-1.5 w-full grow rounded-full\">\n\t\t\t\t\t<BaseSlider.Indicator className=\"bg-bruv-accent absolute h-full rounded-full\" />\n\t\t\t\t</BaseSlider.Track>\n\t\t\t\t{Array.from({ length: thumbCount }, (_, index) => (\n\t\t\t\t\t<BaseSlider.Thumb\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t{...(thumbCount > 1 ? { index } : {})}\n\t\t\t\t\t\tclassName={thumbClassName}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</BaseSlider.Control>\n\t\t\t{showValue ? (\n\t\t\t\t<BaseSlider.Value className=\"text-bruv-xs text-bruv-secondary tabular-nums\">\n\t\t\t\t\t{(_formatted, values) => values.join(\" – \")}\n\t\t\t\t</BaseSlider.Value>\n\t\t\t) : null}\n\t\t</BaseSlider.Root>\n\t)\n})\n","import { FilterMultiSelect } from \"./multi-select\"\nimport { FilterSingleSelect } from \"./single-select\"\nimport { FilterToggle } from \"./toggle\"\nimport { FilterDateRange } from \"./date-range\"\nimport { FilterNumericRange } from \"./numeric-range\"\nimport { FilterText } from \"./text\"\nimport { FilterDate } from \"./date\"\nimport { FilterSlider } from \"./slider\"\n\n/**\n * Filter pills for lists and tables. Drop the appropriate sub-variant\n * onto your toolbar:\n *\n * - `Filter.MultiSelect` — searchable checkbox list (with optional async loader)\n * - `Filter.SingleSelect` — searchable radio list (picking closes)\n * - `Filter.Toggle` — boolean on/off pill, no popover\n * - `Filter.Date` — single date with Calendar\n * - `Filter.DateRange` — date range with Calendar, optional presets\n * - `Filter.NumericRange` — paired numeric inputs with optional unit prefix\n * - `Filter.Slider` — numeric range slider\n * - `Filter.Text` — single text input\n */\nexport const Filter = {\n\tMultiSelect: FilterMultiSelect,\n\tSingleSelect: FilterSingleSelect,\n\tToggle: FilterToggle,\n\tDate: FilterDate,\n\tDateRange: FilterDateRange,\n\tNumericRange: FilterNumericRange,\n\tSlider: FilterSlider,\n\tText: FilterText,\n}\n","import type { FilterDateRangeValue } from \"./date-range\"\n\nexport interface FilterDateRangePreset {\n\t/** Label rendered on the preset button. */\n\treadonly label: string\n\t/**\n\t * Resolved at click time so relative presets like \"Last 7 days\" stay\n\t * accurate as the day rolls over.\n\t */\n\treadonly value: () => FilterDateRangeValue\n}\n\nfunction isoDate(d: Date): string {\n\tconst year = d.getFullYear()\n\tconst month = String(d.getMonth() + 1).padStart(2, \"0\")\n\tconst day = String(d.getDate()).padStart(2, \"0\")\n\treturn `${year}-${month}-${day}`\n}\n\nfunction addDays(d: Date, n: number): Date {\n\tconst next = new Date(d)\n\tnext.setDate(next.getDate() + n)\n\treturn next\n}\n\nfunction startOfMonth(d: Date): Date {\n\treturn new Date(d.getFullYear(), d.getMonth(), 1)\n}\n\n/**\n * The five date-range presets most apps need. Pass to\n * `<Filter.DateRange presets={...} />`.\n */\nexport const dateRangePresets: readonly FilterDateRangePreset[] = [\n\t{\n\t\tlabel: \"Today\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(today), to: isoDate(today) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"Yesterday\",\n\t\tvalue: () => {\n\t\t\tconst yesterday = addDays(new Date(), -1)\n\t\t\treturn { from: isoDate(yesterday), to: isoDate(yesterday) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"Last 7 days\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(addDays(today, -6)), to: isoDate(today) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"Last 30 days\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(addDays(today, -29)), to: isoDate(today) }\n\t\t},\n\t},\n\t{\n\t\tlabel: \"This month\",\n\t\tvalue: () => {\n\t\t\tconst today = new Date()\n\t\t\treturn { from: isoDate(startOfMonth(today)), to: isoDate(today) }\n\t\t},\n\t},\n]\n","import { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { useState } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport { Calendar } from \"../calendar\"\nimport { Form } from \"../form\"\nimport { Popover } from \"../popover\"\n\nexport interface DatePickerProps {\n\tvalue?: string\n\tdefaultValue?: string\n\tonValueChange?: (value: string | undefined) => void\n\tplaceholder?: string\n\tdisabled?: boolean\n\tsize?: \"sm\" | \"md\"\n\tclassName?: string\n\tminDate?: Date\n\tmaxDate?: Date\n}\n\nexport function DatePicker({\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tplaceholder = \"Pick a date\",\n\tdisabled,\n\tsize = \"md\",\n\tclassName,\n\tminDate,\n\tmaxDate,\n}: DatePickerProps) {\n\tconst [open, setOpen] = useState(false)\n\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\n\tconst iso = controlledValue !== undefined ? controlledValue : internalValue\n\tconst selected = parseLocalDate(iso)\n\n\tconst setIso = (next: string | undefined) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\tconst display = selected\n\t\t? new Intl.DateTimeFormat(undefined, {\n\t\t\t\tmonth: \"short\",\n\t\t\t\tday: \"numeric\",\n\t\t\t\tyear: \"numeric\",\n\t\t\t}).format(selected)\n\t\t: \"\"\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\"w-full text-left\", className)}\n\t\t\t\trender={\n\t\t\t\t\t<button type=\"button\" className=\"w-full\">\n\t\t\t\t\t\t<Form.Input\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\tvalue={display}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\ticonRight={<CalendarIcon />}\n\t\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content align=\"start\" className=\"p-0\">\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"single\"\n\t\t\t\t\tvalue={selected}\n\t\t\t\t\tonValueChange={date => {\n\t\t\t\t\t\tsetIso(date ? formatIsoDate(date) : undefined)\n\t\t\t\t\t\tsetOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t/>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { CalendarIcon } from \"@heroicons/react/16/solid\"\nimport { useState } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { formatIsoDate, parseLocalDate } from \"../../lib/date\"\nimport type { CalendarRangeValue } from \"../calendar\"\nimport { Calendar } from \"../calendar\"\nimport { Form } from \"../form\"\nimport { Popover } from \"../popover\"\n\nexport interface DateRangePickerValue {\n\tfrom?: string\n\tto?: string\n}\n\nexport interface DateRangePickerProps {\n\tvalue?: DateRangePickerValue\n\tdefaultValue?: DateRangePickerValue\n\tonValueChange?: (value: DateRangePickerValue) => void\n\tplaceholder?: string\n\tdisabled?: boolean\n\tsize?: \"sm\" | \"md\"\n\tclassName?: string\n\tminDate?: Date\n\tmaxDate?: Date\n}\n\nfunction formatDisplay(value: DateRangePickerValue | undefined): string {\n\tif (!value) return \"\"\n\tconst from = parseLocalDate(value.from)\n\tconst to = parseLocalDate(value.to)\n\tconst fmt = new Intl.DateTimeFormat(undefined, {\n\t\tmonth: \"short\",\n\t\tday: \"numeric\",\n\t})\n\tif (from && to) return `${fmt.format(from)} – ${fmt.format(to)}`\n\tif (from) return `From ${fmt.format(from)}`\n\tif (to) return `Until ${fmt.format(to)}`\n\treturn \"\"\n}\n\nfunction toCalendarRange(\n\tvalue: DateRangePickerValue | undefined,\n): CalendarRangeValue {\n\treturn {\n\t\tfrom: parseLocalDate(value?.from) ?? undefined,\n\t\tto: parseLocalDate(value?.to) ?? undefined,\n\t}\n}\n\nfunction fromCalendarRange(range: CalendarRangeValue): DateRangePickerValue {\n\treturn {\n\t\tfrom: range.from ? formatIsoDate(range.from) : undefined,\n\t\tto: range.to ? formatIsoDate(range.to) : undefined,\n\t}\n}\n\nexport function DateRangePicker({\n\tvalue: controlledValue,\n\tdefaultValue,\n\tonValueChange,\n\tplaceholder = \"Pick a date range\",\n\tdisabled,\n\tsize = \"md\",\n\tclassName,\n\tminDate,\n\tmaxDate,\n}: DateRangePickerProps) {\n\tconst [open, setOpen] = useState(false)\n\tconst [internalValue, setInternalValue] = useState<DateRangePickerValue>(\n\t\tdefaultValue ?? {},\n\t)\n\n\tconst value = controlledValue !== undefined ? controlledValue : internalValue\n\n\tconst setValue = (next: DateRangePickerValue) => {\n\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\tonValueChange?.(next)\n\t}\n\n\treturn (\n\t\t<Popover.Root open={open} onOpenChange={setOpen}>\n\t\t\t<Popover.Trigger\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\"w-full text-left\", className)}\n\t\t\t\trender={\n\t\t\t\t\t<button type=\"button\" className=\"w-full\">\n\t\t\t\t\t\t<Form.Input\n\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t\tsize={size}\n\t\t\t\t\t\t\tvalue={formatDisplay(value)}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\ticonRight={<CalendarIcon />}\n\t\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t<Popover.Content align=\"start\" className=\"p-0\">\n\t\t\t\t<Calendar\n\t\t\t\t\tmode=\"range\"\n\t\t\t\t\trangeValue={toCalendarRange(value)}\n\t\t\t\t\tonRangeValueChange={range => {\n\t\t\t\t\t\tconst next = fromCalendarRange(range)\n\t\t\t\t\t\tsetValue(next)\n\t\t\t\t\t\tif (next.from && next.to) setOpen(false)\n\t\t\t\t\t}}\n\t\t\t\t\tminDate={minDate}\n\t\t\t\t\tmaxDate={maxDate}\n\t\t\t\t/>\n\t\t\t</Popover.Content>\n\t\t</Popover.Root>\n\t)\n}\n","import { forwardRef, useState } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { NumberInput } from \"../number-input\"\n\nexport interface TimePickerProps {\n\tvalue?: string\n\tdefaultValue?: string\n\tonValueChange?: (value: string | undefined) => void\n\tdisabled?: boolean\n\tsize?: \"sm\" | \"md\"\n\tclassName?: string\n}\n\nfunction parseTime(value: string | undefined): {\n\thours: number\n\tminutes: number\n} | null {\n\tif (!value) return null\n\tconst match = /^(\\d{1,2}):(\\d{2})$/.exec(value)\n\tif (!match) return null\n\tconst hours = Number(match[1])\n\tconst minutes = Number(match[2])\n\tif (hours < 0 || hours > 23 || minutes < 0 || minutes > 59) return null\n\treturn { hours, minutes }\n}\n\nfunction formatTime(hours: number, minutes: number): string {\n\treturn `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}`\n}\n\nfunction clampHours(value: number): number {\n\treturn Math.min(23, Math.max(0, value))\n}\n\nfunction clampMinutes(value: number): number {\n\treturn Math.min(59, Math.max(0, value))\n}\n\nexport const TimePicker = forwardRef<HTMLDivElement, TimePickerProps>(\n\tfunction TimePicker(\n\t\t{\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\tdisabled,\n\t\t\tsize = \"md\",\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internalValue, setInternalValue] = useState(defaultValue)\n\t\tconst timeString =\n\t\t\tcontrolledValue !== undefined ? controlledValue : internalValue\n\t\tconst parsed = parseTime(timeString)\n\t\tconst hours = parsed?.hours ?? 0\n\t\tconst minutes = parsed?.minutes ?? 0\n\n\t\tconst commit = (nextHours: number, nextMinutes: number) => {\n\t\t\tconst next = formatTime(clampHours(nextHours), clampMinutes(nextMinutes))\n\t\t\tif (controlledValue === undefined) setInternalValue(next)\n\t\t\tonValueChange?.(next)\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"inline-flex items-center gap-2\", className)}\n\t\t\t>\n\t\t\t\t<NumberInput\n\t\t\t\t\tsize={size}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={23}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tvalue={hours}\n\t\t\t\t\tonValueChange={v => commit(v ?? 0, minutes)}\n\t\t\t\t\taria-label=\"Hours\"\n\t\t\t\t/>\n\t\t\t\t<span className=\"text-bruv-secondary text-bruv-base font-medium\">\n\t\t\t\t\t:\n\t\t\t\t</span>\n\t\t\t\t<NumberInput\n\t\t\t\t\tsize={size}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tmin={0}\n\t\t\t\t\tmax={59}\n\t\t\t\t\tstep={1}\n\t\t\t\t\tvalue={minutes}\n\t\t\t\t\tonValueChange={v => commit(hours, v ?? 0)}\n\t\t\t\t\taria-label=\"Minutes\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { NumberField as BaseNumberField } from \"@base-ui/react/number-field\"\nimport { ChevronDownIcon, ChevronUpIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst sizeStyles = {\n\tsm: { input: \"h-7 text-bruv-sm px-2.5\", button: \"w-7\" },\n\tmd: { input: \"h-8 text-bruv-base px-3\", button: \"w-8\" },\n} as const\n\nexport type NumberInputSize = keyof typeof sizeStyles\n\nexport interface NumberInputProps extends ComponentProps<\n\ttypeof BaseNumberField.Root\n> {\n\tsize?: NumberInputSize\n}\n\nexport const NumberInput = forwardRef<HTMLDivElement, NumberInputProps>(\n\tfunction NumberInput(\n\t\t{\n\t\t\tsize = \"md\",\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\tmin,\n\t\t\tmax,\n\t\t\tstep = 1,\n\t\t\tvalue,\n\t\t\tdefaultValue,\n\t\t\tonValueChange,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\n\t\treturn (\n\t\t\t<BaseNumberField.Root\n\t\t\t\tref={ref}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tmin={min}\n\t\t\t\tmax={max}\n\t\t\t\tstep={step}\n\t\t\t\tvalue={value}\n\t\t\t\tdefaultValue={defaultValue}\n\t\t\t\tonValueChange={onValueChange}\n\t\t\t\tclassName={cn(\"inline-flex\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseNumberField.Group\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex items-stretch overflow-hidden rounded-bruv-md border border-bruv-neutral bg-bruv-base-2\",\n\t\t\t\t\t\t\"focus-within:ring-2 focus-within:ring-bruv-focus focus-within:border-bruv-neutral-strong\",\n\t\t\t\t\t\t\"data-[disabled]:opacity-50 data-[disabled]:pointer-events-none\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<BaseNumberField.Decrement\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex shrink-0 items-center justify-center border-r border-bruv-neutral text-bruv-secondary\",\n\t\t\t\t\t\t\t\"hover:bg-bruv-subtle active:bg-bruv-subtle\",\n\t\t\t\t\t\t\ts.button,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronDownIcon className=\"size-3.5\" />\n\t\t\t\t\t</BaseNumberField.Decrement>\n\t\t\t\t\t<BaseNumberField.Input\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"min-w-0 flex-1 bg-transparent text-center text-bruv-primary outline-none tabular-nums\",\n\t\t\t\t\t\t\ts.input,\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t\t<BaseNumberField.Increment\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex shrink-0 items-center justify-center border-l border-bruv-neutral text-bruv-secondary\",\n\t\t\t\t\t\t\t\"hover:bg-bruv-subtle active:bg-bruv-subtle\",\n\t\t\t\t\t\t\ts.button,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronUpIcon className=\"size-3.5\" />\n\t\t\t\t\t</BaseNumberField.Increment>\n\t\t\t\t</BaseNumberField.Group>\n\t\t\t</BaseNumberField.Root>\n\t\t)\n\t},\n)\n","import { Progress as BaseProgress } from \"@base-ui/react/progress\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ProgressProps extends ComponentProps<\n\ttypeof BaseProgress.Root\n> {\n\t/** Show value label below the bar */\n\tshowValue?: boolean\n}\n\nconst ProgressRoot = forwardRef<HTMLDivElement, ProgressProps>(\n\tfunction Progress(\n\t\t{ value, max = 100, min = 0, showValue = false, className, ...props },\n\t\tref,\n\t) {\n\t\tconst percent =\n\t\t\tvalue === null || value === undefined\n\t\t\t\t? null\n\t\t\t\t: Math.min(100, Math.max(0, ((value - min) / (max - min)) * 100))\n\n\t\treturn (\n\t\t\t<div className={cn(\"flex w-full flex-col gap-1.5\", className)}>\n\t\t\t\t<BaseProgress.Root ref={ref} value={value} max={max} {...props}>\n\t\t\t\t\t<BaseProgress.Track\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"h-2 w-full overflow-hidden rounded-full bg-bruv-subtle\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseProgress.Indicator\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"h-full rounded-full bg-bruv-accent transition-[width] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\t\tvalue === null && \"w-1/3 animate-pulse\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tstyle={percent !== null ? { width: `${percent}%` } : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</BaseProgress.Track>\n\t\t\t\t</BaseProgress.Root>\n\t\t\t\t{showValue && value !== null ? (\n\t\t\t\t\t<span className=\"text-bruv-xs text-bruv-secondary tabular-nums\">\n\t\t\t\t\t\t{Math.round(percent ?? 0)}%\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\nexport interface ProgressCircularProps extends ComponentProps<\"div\"> {\n\tvalue: number | null\n\tmax?: number\n\tsize?: number\n\tstrokeWidth?: number\n}\n\nexport const ProgressCircular = forwardRef<\n\tHTMLDivElement,\n\tProgressCircularProps\n>(function ProgressCircular(\n\t{ value, max = 100, size = 40, strokeWidth = 3, className, ...props },\n\tref,\n) {\n\tconst radius = (size - strokeWidth) / 2\n\tconst circumference = 2 * Math.PI * radius\n\tconst percent =\n\t\tvalue === null ? null : Math.min(100, Math.max(0, (value / max) * 100))\n\tconst offset =\n\t\tpercent === null\n\t\t\t? circumference * 0.75\n\t\t\t: circumference - (percent / 100) * circumference\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\trole=\"progressbar\"\n\t\t\taria-valuenow={value ?? undefined}\n\t\t\taria-valuemin={0}\n\t\t\taria-valuemax={max}\n\t\t\tclassName={cn(\"inline-flex\", className)}\n\t\t\tstyle={{ width: size, height: size }}\n\t\t\t{...props}\n\t\t>\n\t\t\t<svg width={size} height={size} className=\"-rotate-90\">\n\t\t\t\t<circle\n\t\t\t\t\tcx={size / 2}\n\t\t\t\t\tcy={size / 2}\n\t\t\t\t\tr={radius}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tclassName=\"stroke-bruv-subtle\"\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tcx={size / 2}\n\t\t\t\t\tcy={size / 2}\n\t\t\t\t\tr={radius}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"stroke-bruv-accent transition-[stroke-dashoffset] duration-300 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tvalue === null && \"animate-pulse\",\n\t\t\t\t\t)}\n\t\t\t\t\tstrokeDasharray={circumference}\n\t\t\t\t\tstrokeDashoffset={offset}\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t)\n})\n\nexport const Progress = Object.assign(ProgressRoot, {\n\tCircular: ProgressCircular,\n})\n","import { ScrollArea as BaseScrollArea } from \"@base-ui/react/scroll-area\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ScrollAreaProps extends ComponentProps<\n\ttypeof BaseScrollArea.Root\n> {\n\tchildren: ReactNode\n\torientation?: \"vertical\" | \"horizontal\" | \"both\"\n}\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n\tfunction ScrollArea(\n\t\t{ children, orientation = \"vertical\", className, ...props },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<BaseScrollArea.Root\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"relative overflow-hidden\", className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<BaseScrollArea.Viewport className=\"size-full max-h-[inherit] rounded-[inherit] outline-none\">\n\t\t\t\t\t<BaseScrollArea.Content>{children}</BaseScrollArea.Content>\n\t\t\t\t</BaseScrollArea.Viewport>\n\t\t\t\t{(orientation === \"vertical\" || orientation === \"both\") && (\n\t\t\t\t\t<BaseScrollArea.Scrollbar\n\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-2 touch-none select-none p-0.5\",\n\t\t\t\t\t\t\t\"data-[hovering]:bg-bruv-subtle/50\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseScrollArea.Thumb className=\"bg-bruv-neutral-strong relative flex-1 rounded-full\" />\n\t\t\t\t\t</BaseScrollArea.Scrollbar>\n\t\t\t\t)}\n\t\t\t\t{(orientation === \"horizontal\" || orientation === \"both\") && (\n\t\t\t\t\t<BaseScrollArea.Scrollbar\n\t\t\t\t\t\torientation=\"horizontal\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex h-2 touch-none select-none p-0.5\",\n\t\t\t\t\t\t\t\"data-[hovering]:bg-bruv-subtle/50\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<BaseScrollArea.Thumb className=\"bg-bruv-neutral-strong relative flex-1 rounded-full\" />\n\t\t\t\t\t</BaseScrollArea.Scrollbar>\n\t\t\t\t)}\n\t\t\t\t<BaseScrollArea.Corner />\n\t\t\t</BaseScrollArea.Root>\n\t\t)\n\t},\n)\n","import { CheckIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface StepperStep {\n\tid: string\n\tlabel: ReactNode\n\tdescription?: ReactNode\n}\n\nexport interface StepperProps extends ComponentProps<\"nav\"> {\n\tsteps: readonly StepperStep[]\n\tcurrentStep: string\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\nexport const Stepper = forwardRef<HTMLElement, StepperProps>(function Stepper(\n\t{ steps, currentStep, orientation = \"horizontal\", className, ...props },\n\tref,\n) {\n\tconst currentIndex = steps.findIndex(s => s.id === currentStep)\n\n\treturn (\n\t\t<nav\n\t\t\tref={ref}\n\t\t\taria-label=\"Progress\"\n\t\t\tclassName={cn(\n\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t? \"flex w-full items-start gap-2\"\n\t\t\t\t\t: \"flex flex-col gap-4\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{steps.map((step, index) => {\n\t\t\t\tconst isComplete = index < currentIndex\n\t\t\t\tconst isCurrent = step.id === currentStep\n\t\t\t\tconst isUpcoming = index > currentIndex\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={step.id}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex gap-3\",\n\t\t\t\t\t\t\torientation === \"horizontal\" &&\n\t\t\t\t\t\t\t\t\"min-w-0 flex-1 flex-col items-center\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"flex items-center gap-3\",\n\t\t\t\t\t\t\t\torientation === \"horizontal\" && \"w-full flex-col\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"flex size-7 shrink-0 items-center justify-center rounded-full border text-bruv-sm font-medium\",\n\t\t\t\t\t\t\t\t\tisComplete &&\n\t\t\t\t\t\t\t\t\t\t\"border-bruv-accent bg-bruv-accent text-bruv-accent-on\",\n\t\t\t\t\t\t\t\t\tisCurrent &&\n\t\t\t\t\t\t\t\t\t\t\"border-bruv-accent bg-bruv-accent-subtle text-bruv-accent\",\n\t\t\t\t\t\t\t\t\tisUpcoming &&\n\t\t\t\t\t\t\t\t\t\t\"border-bruv-neutral bg-bruv-base-2 text-bruv-tertiary\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\taria-current={isCurrent ? \"step\" : undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isComplete ? <CheckIcon className=\"size-3.5\" /> : index + 1}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{orientation === \"horizontal\" && index < steps.length - 1 ? (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"hidden h-px flex-1 bg-bruv-neutral sm:block\",\n\t\t\t\t\t\t\t\t\t\torientation === \"horizontal\" && \"absolute top-3.5 hidden\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\taria-hidden\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(orientation === \"horizontal\" && \"text-center\")}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"text-bruv-sm font-medium\",\n\t\t\t\t\t\t\t\t\t\tisCurrent ? \"text-bruv-primary\" : \"text-bruv-secondary\",\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{step.label}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t{step.description ? (\n\t\t\t\t\t\t\t\t\t<p className=\"text-bruv-xs text-bruv-tertiary mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t{step.description}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)\n\t\t\t})}\n\t\t</nav>\n\t)\n})\n","import { ChevronRightIcon } from \"@heroicons/react/16/solid\"\nimport { useState, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface TreeViewItem {\n\tid: string\n\tlabel: ReactNode\n\tchildren?: readonly TreeViewItem[]\n\tdisabled?: boolean\n}\n\nexport interface TreeViewProps {\n\titems: readonly TreeViewItem[]\n\tselectedId?: string\n\tdefaultSelectedId?: string\n\tonSelectedIdChange?: (id: string) => void\n\tdefaultExpandedIds?: readonly string[]\n\texpandedIds?: readonly string[]\n\tonExpandedIdsChange?: (ids: string[]) => void\n\tclassName?: string\n}\n\nfunction TreeNode({\n\titem,\n\tlevel,\n\tselectedId,\n\tonSelect,\n\texpandedIds,\n\tonToggle,\n}: {\n\titem: TreeViewItem\n\tlevel: number\n\tselectedId?: string\n\tonSelect: (id: string) => void\n\texpandedIds: Set<string>\n\tonToggle: (id: string) => void\n}) {\n\tconst children = item.children\n\tconst hasChildren = (children?.length ?? 0) > 0\n\tconst isExpanded = expandedIds.has(item.id)\n\tconst isSelected = selectedId === item.id\n\n\treturn (\n\t\t<li role=\"treeitem\" aria-expanded={hasChildren ? isExpanded : undefined}>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center gap-1 rounded-bruv-md py-1 pr-2\",\n\t\t\t\t\t\"hover:bg-bruv-subtle\",\n\t\t\t\t\tisSelected && \"bg-bruv-subtle text-bruv-primary\",\n\t\t\t\t\titem.disabled && \"pointer-events-none opacity-50\",\n\t\t\t\t)}\n\t\t\t\tstyle={{ paddingLeft: `${level * 12 + 8}px` }}\n\t\t\t>\n\t\t\t\t{hasChildren ? (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"text-bruv-tertiary rounded-bruv-md focus-visible:ring-bruv-focus flex size-6 shrink-0 items-center justify-center outline-none focus-visible:ring-2\"\n\t\t\t\t\t\tonClick={() => onToggle(item.id)}\n\t\t\t\t\t\taria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronRightIcon\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"size-3.5 transition-transform duration-150\",\n\t\t\t\t\t\t\t\tisExpanded && \"rotate-90\",\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</button>\n\t\t\t\t) : (\n\t\t\t\t\t<span className=\"size-6 shrink-0\" aria-hidden />\n\t\t\t\t)}\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tdisabled={item.disabled}\n\t\t\t\t\tclassName=\"text-bruv-sm text-bruv-primary focus-visible:ring-bruv-focus flex-1 truncate text-left outline-none focus-visible:ring-2\"\n\t\t\t\t\tonClick={() => onSelect(item.id)}\n\t\t\t\t>\n\t\t\t\t\t{item.label}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t{hasChildren && isExpanded && children ? (\n\t\t\t\t<ul role=\"group\" className=\"flex flex-col\">\n\t\t\t\t\t{children.map(child => (\n\t\t\t\t\t\t<TreeNode\n\t\t\t\t\t\t\tkey={child.id}\n\t\t\t\t\t\t\titem={child}\n\t\t\t\t\t\t\tlevel={level + 1}\n\t\t\t\t\t\t\tselectedId={selectedId}\n\t\t\t\t\t\t\tonSelect={onSelect}\n\t\t\t\t\t\t\texpandedIds={expandedIds}\n\t\t\t\t\t\t\tonToggle={onToggle}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t) : null}\n\t\t</li>\n\t)\n}\n\nexport function TreeView({\n\titems,\n\tselectedId: controlledSelected,\n\tdefaultSelectedId,\n\tonSelectedIdChange,\n\tdefaultExpandedIds = [],\n\texpandedIds: controlledExpanded,\n\tonExpandedIdsChange,\n\tclassName,\n}: TreeViewProps) {\n\tconst [internalSelected, setInternalSelected] = useState(defaultSelectedId)\n\tconst [internalExpanded, setInternalExpanded] = useState<Set<string>>(\n\t\t() => new Set(defaultExpandedIds),\n\t)\n\n\tconst selectedId =\n\t\tcontrolledSelected !== undefined ? controlledSelected : internalSelected\n\tconst expandedIds =\n\t\tcontrolledExpanded !== undefined\n\t\t\t? new Set(controlledExpanded)\n\t\t\t: internalExpanded\n\n\tconst setSelected = (id: string) => {\n\t\tif (controlledSelected === undefined) setInternalSelected(id)\n\t\tonSelectedIdChange?.(id)\n\t}\n\n\tconst toggleExpanded = (id: string) => {\n\t\tconst next = new Set(expandedIds)\n\t\tif (next.has(id)) next.delete(id)\n\t\telse next.add(id)\n\t\tif (controlledExpanded === undefined) setInternalExpanded(next)\n\t\tonExpandedIdsChange?.([...next])\n\t}\n\n\treturn (\n\t\t<ul role=\"tree\" className={cn(\"flex flex-col gap-0.5\", className)}>\n\t\t\t{items.map(item => (\n\t\t\t\t<TreeNode\n\t\t\t\t\tkey={item.id}\n\t\t\t\t\titem={item}\n\t\t\t\t\tlevel={0}\n\t\t\t\t\tselectedId={selectedId}\n\t\t\t\t\tonSelect={setSelected}\n\t\t\t\t\texpandedIds={expandedIds}\n\t\t\t\t\tonToggle={toggleExpanded}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</ul>\n\t)\n}\n","import { ContextMenu as BaseContextMenu } from \"@base-ui/react/context-menu\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Menu } from \"../menu\"\n\nexport interface ContextMenuRootProps extends ComponentProps<\n\ttypeof BaseContextMenu.Root\n> {}\n\nfunction ContextMenuRoot(props: ContextMenuRootProps) {\n\treturn <BaseContextMenu.Root {...props} />\n}\n\nexport interface ContextMenuTriggerProps extends ComponentProps<\n\ttypeof BaseContextMenu.Trigger\n> {}\n\nconst ContextMenuTrigger = forwardRef<HTMLDivElement, ContextMenuTriggerProps>(\n\tfunction ContextMenuTrigger({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseContextMenu.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"outline-none\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface ContextMenuContentProps {\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\talign?: \"start\" | \"center\" | \"end\"\n\tsideOffset?: number\n\tminWidth?: string\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nfunction ContextMenuContent({\n\tside = \"bottom\",\n\talign = \"start\",\n\tsideOffset = 4,\n\tminWidth = \"min-w-[180px]\",\n\tclassName,\n\tchildren,\n}: ContextMenuContentProps) {\n\treturn (\n\t\t<BaseContextMenu.Portal>\n\t\t\t<BaseContextMenu.Positioner\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={sideOffset}\n\t\t\t\trender={<Menu.Positioner />}\n\t\t\t>\n\t\t\t\t<BaseContextMenu.Popup\n\t\t\t\t\trender={<Menu.Panel minWidth={minWidth} className={className} />}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseContextMenu.Popup>\n\t\t\t</BaseContextMenu.Positioner>\n\t\t</BaseContextMenu.Portal>\n\t)\n}\n\nexport interface ContextMenuItemProps extends ComponentProps<\n\ttypeof BaseContextMenu.Item\n> {}\n\nconst ContextMenuItem = forwardRef<HTMLDivElement, ContextMenuItemProps>(\n\tfunction ContextMenuItem({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseContextMenu.Item\n\t\t\t\tref={ref}\n\t\t\t\trender={<Menu.Item className={cn(className)} />}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t</BaseContextMenu.Item>\n\t\t)\n\t},\n)\n\nexport interface ContextMenuSeparatorProps extends ComponentProps<\n\ttypeof BaseContextMenu.Separator\n> {}\n\nfunction ContextMenuSeparator(props: ContextMenuSeparatorProps) {\n\treturn <BaseContextMenu.Separator render={<Menu.Separator />} {...props} />\n}\n\nexport interface ContextMenuLabelProps extends ComponentProps<\n\ttypeof BaseContextMenu.GroupLabel\n> {}\n\nfunction ContextMenuLabel({ className, ...props }: ContextMenuLabelProps) {\n\treturn (\n\t\t<BaseContextMenu.GroupLabel\n\t\t\trender={<Menu.GroupLabel className={cn(className)} />}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport const ContextMenu = {\n\tRoot: ContextMenuRoot,\n\tTrigger: ContextMenuTrigger,\n\tContent: ContextMenuContent,\n\tItem: ContextMenuItem,\n\tSeparator: ContextMenuSeparator,\n\tLabel: ContextMenuLabel,\n}\n","import { XMarkIcon } from \"@heroicons/react/16/solid\"\nimport {\n\tforwardRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype KeyboardEvent,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Badge } from \"../badge\"\n\nexport interface TagsInputProps extends Omit<\n\tComponentProps<\"div\">,\n\t\"onChange\"\n> {\n\tvalue?: string[]\n\tdefaultValue?: string[]\n\tonValueChange?: (value: string[]) => void\n\tplaceholder?: string\n\tdisabled?: boolean\n}\n\nexport const TagsInput = forwardRef<HTMLDivElement, TagsInputProps>(\n\tfunction TagsInput(\n\t\t{\n\t\t\tvalue: controlledValue,\n\t\t\tdefaultValue = [],\n\t\t\tonValueChange,\n\t\t\tplaceholder = \"Add tag…\",\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [internal, setInternal] = useState<string[]>(defaultValue)\n\t\tconst [draft, setDraft] = useState(\"\")\n\n\t\tconst tags = controlledValue !== undefined ? controlledValue : internal\n\n\t\tconst setTags = (next: string[]) => {\n\t\t\tif (controlledValue === undefined) setInternal(next)\n\t\t\tonValueChange?.(next)\n\t\t}\n\n\t\tconst addTag = (raw: string) => {\n\t\t\tconst tag = raw.trim()\n\t\t\tif (!tag || tags.includes(tag)) return\n\t\t\tsetTags([...tags, tag])\n\t\t\tsetDraft(\"\")\n\t\t}\n\n\t\tconst removeTag = (tag: string) => {\n\t\t\tsetTags(tags.filter(t => t !== tag))\n\t\t}\n\n\t\tconst onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n\t\t\tif (e.key === \"Enter\" || e.key === \",\") {\n\t\t\t\te.preventDefault()\n\t\t\t\taddTag(draft)\n\t\t\t}\n\t\t\tif (e.key === \"Backspace\" && !draft && tags.length > 0) {\n\t\t\t\tsetTags(tags.slice(0, -1))\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex min-h-8 flex-wrap items-center gap-1.5 rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 px-2 py-1.5\",\n\t\t\t\t\t\"focus-within:ring-2 focus-within:ring-bruv-focus focus-within:border-bruv-neutral-strong\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{tags.map(tag => (\n\t\t\t\t\t<Badge key={tag} variant=\"neutral\" size=\"sm\" className=\"gap-1 pr-1\">\n\t\t\t\t\t\t{tag}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"text-bruv-tertiary hover:text-bruv-primary rounded-bruv-sm focus-visible:ring-bruv-focus outline-none focus-visible:ring-1\"\n\t\t\t\t\t\t\tonClick={() => removeTag(tag)}\n\t\t\t\t\t\t\taria-label={`Remove ${tag}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<XMarkIcon className=\"size-3\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</Badge>\n\t\t\t\t))}\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={draft}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tplaceholder={tags.length === 0 ? placeholder : undefined}\n\t\t\t\t\tonChange={e => setDraft(e.target.value)}\n\t\t\t\t\tonKeyDown={onKeyDown}\n\t\t\t\t\tonBlur={() => addTag(draft)}\n\t\t\t\t\tclassName=\"text-bruv-base text-bruv-primary placeholder:text-bruv-tertiary min-w-[80px] flex-1 bg-transparent outline-none\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { OTPFieldPreview as BaseOTP } from \"@base-ui/react/otp-field\"\nimport { forwardRef, type ComponentProps } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface OTPProps extends Omit<\n\tComponentProps<typeof BaseOTP.Root>,\n\t\"length\"\n> {\n\tlength?: number\n}\n\nexport const OTP = forwardRef<HTMLDivElement, OTPProps>(function OTP(\n\t{ length = 6, disabled, className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseOTP.Root\n\t\t\tref={ref}\n\t\t\tlength={length}\n\t\t\tdisabled={disabled}\n\t\t\tclassName={cn(\"flex gap-2\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{Array.from({ length }, (_, i) => (\n\t\t\t\t<BaseOTP.Input\n\t\t\t\t\tkey={String(i)}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"size-10 rounded-bruv-md border border-bruv-neutral bg-bruv-base-2 text-center text-bruv-lg font-medium text-bruv-primary tabular-nums\",\n\t\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:border-bruv-neutral-strong\",\n\t\t\t\t\t\t\"data-[disabled]:opacity-50\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</BaseOTP.Root>\n\t)\n})\n","import { Toolbar as BaseToolbar } from \"@base-ui/react/toolbar\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ToolbarProps extends ComponentProps<typeof BaseToolbar.Root> {\n\tchildren: ReactNode\n}\n\nconst ToolbarRoot = forwardRef<HTMLDivElement, ToolbarProps>(function Toolbar(\n\t{ className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseToolbar.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex items-center gap-1 rounded-bruv-lg border border-bruv-neutral bg-bruv-base-2 p-1\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</BaseToolbar.Root>\n\t)\n})\n\nexport interface ToolbarButtonProps extends ComponentProps<\n\ttypeof BaseToolbar.Button\n> {}\n\nexport const ToolbarButton = forwardRef<HTMLButtonElement, ToolbarButtonProps>(\n\tfunction ToolbarButton({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseToolbar.Button\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex size-8 items-center justify-center rounded-bruv-md text-bruv-secondary\",\n\t\t\t\t\t\"hover:bg-bruv-subtle hover:text-bruv-primary\",\n\t\t\t\t\t\"data-[pressed]:bg-bruv-subtle data-[pressed]:text-bruv-primary\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\t\"data-[disabled]:opacity-50\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\nexport interface ToolbarSeparatorProps extends ComponentProps<\n\ttypeof BaseToolbar.Separator\n> {}\n\nexport const ToolbarSeparator = forwardRef<\n\tHTMLDivElement,\n\tToolbarSeparatorProps\n>(function ToolbarSeparator({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseToolbar.Separator\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"mx-0.5 h-5 w-px bg-bruv-neutral\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\nexport const Toolbar = Object.assign(ToolbarRoot, {\n\tButton: ToolbarButton,\n\tSeparator: ToolbarSeparator,\n})\n","import {\n\tuseCallback,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n\ttype PointerEvent,\n\ttype ReactNode,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport interface ResizablePanelProps extends ComponentProps<\"div\"> {\n\tdefaultSize?: number\n\tminSize?: number\n\tmaxSize?: number\n\tchildren: ReactNode\n}\n\nexport function ResizablePanel({\n\tdefaultSize = 50,\n\tminSize = 20,\n\tmaxSize = 80,\n\tclassName,\n\tchildren,\n\t...props\n}: ResizablePanelProps) {\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\"min-h-0 min-w-0 overflow-auto\", className)}\n\t\t\tstyle={{\n\t\t\t\tflexBasis: `${defaultSize}%`,\n\t\t\t\tflexGrow: 0,\n\t\t\t\tflexShrink: 0,\n\t\t\t\tminWidth: `${minSize}%`,\n\t\t\t\tmaxWidth: `${maxSize}%`,\n\t\t\t}}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</div>\n\t)\n}\n\nexport interface ResizableHandleProps extends ComponentProps<\"div\"> {\n\tonResize?: (delta: number) => void\n}\n\nexport function ResizableHandle({\n\tclassName,\n\tonResize,\n\t...props\n}: ResizableHandleProps) {\n\tconst dragging = useRef(false)\n\n\tconst onPointerDown = (e: PointerEvent<HTMLDivElement>) => {\n\t\tdragging.current = true\n\t\te.currentTarget.setPointerCapture(e.pointerId)\n\t}\n\n\tconst onPointerMove = (e: PointerEvent<HTMLDivElement>) => {\n\t\tif (!dragging.current) return\n\t\tonResize?.(e.movementX)\n\t}\n\n\tconst onPointerUp = (e: PointerEvent<HTMLDivElement>) => {\n\t\tdragging.current = false\n\t\te.currentTarget.releasePointerCapture(e.pointerId)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\trole=\"separator\"\n\t\t\taria-orientation=\"vertical\"\n\t\t\ttabIndex={0}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonPointerMove={onPointerMove}\n\t\t\tonPointerUp={onPointerUp}\n\t\t\tclassName={cn(\n\t\t\t\t\"w-1 shrink-0 cursor-col-resize bg-bruv-neutral hover:bg-bruv-neutral-strong\",\n\t\t\t\t\"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n}\n\nexport interface ResizableProps extends ComponentProps<\"div\"> {\n\tchildren: ReactNode\n\tdirection?: \"horizontal\" | \"vertical\"\n}\n\nexport function Resizable({\n\tchildren,\n\tdirection = \"horizontal\",\n\tclassName,\n\t...props\n}: ResizableProps) {\n\tconst [leftPercent, setLeftPercent] = useState(50)\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\n\tconst handleResize = useCallback((deltaX: number) => {\n\t\tconst el = containerRef.current\n\t\tif (!el) return\n\t\tconst width = el.getBoundingClientRect().width\n\t\tif (width <= 0) return\n\t\tsetLeftPercent(prev =>\n\t\t\tMath.min(80, Math.max(20, prev + (deltaX / width) * 100)),\n\t\t)\n\t}, [])\n\n\tconst childArray = Array.isArray(children) ? children : [children]\n\tconst [first, second] = childArray\n\n\treturn (\n\t\t<div\n\t\t\tref={containerRef}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex min-h-0 min-w-0\",\n\t\t\t\tdirection === \"horizontal\" ? \"flex-row\" : \"flex-col\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"min-h-0 min-w-0 overflow-auto\"\n\t\t\t\tstyle={\n\t\t\t\t\tdirection === \"horizontal\"\n\t\t\t\t\t\t? { width: `${leftPercent}%`, flexShrink: 0 }\n\t\t\t\t\t\t: { height: `${leftPercent}%`, flexShrink: 0 }\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{first}\n\t\t\t</div>\n\t\t\t<ResizableHandle onResize={handleResize} />\n\t\t\t<div className=\"min-h-0 min-w-0 flex-1 overflow-auto\">{second}</div>\n\t\t</div>\n\t)\n}\n\nResizable.Panel = ResizablePanel\nResizable.Handle = ResizableHandle\n","import React, { type ReactNode, forwardRef, useState } from \"react\"\nimport { SegmentedGroup, SegmentedGroupItem } from \"../segmented-group\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\tsm: \"h-7 px-2.5\",\n\tmd: \"h-8 px-3\",\n} as const\n\nexport type SegmentedControlSize = keyof typeof sizeStyles\n\nexport interface SegmentedControlOption<T extends string = string> {\n\tvalue: T\n\tlabel?: string\n\ticon?: ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n\t/** Options to display as segments */\n\toptions: SegmentedControlOption<T>[]\n\t/** Controlled value */\n\tvalue?: T\n\t/** Uncontrolled default value */\n\tdefaultValue?: T\n\t/** Called when the selected segment changes */\n\tonValueChange?: (value: T) => void\n\t/**\n\t * Layout mode:\n\t * - `fill` - segments divide space equally (default)\n\t * - `fit` - segments hug their content\n\t */\n\tlayout?: \"fill\" | \"fit\"\n\t/** Size of the segmented control items */\n\tsize?: SegmentedControlSize\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedControl\n// ---------------------------------------------------------------------------\n\n/**\n * Segmented control with a sliding indicator that animates between options.\n *\n * Two layout modes:\n * - `fill` (default) - equal-width segments via CSS grid, indicator positioned with translateX\n * - `fit` - segments size to content, indicator position/width measured from DOM\n */\nexport const SegmentedControl = forwardRef<\n\tHTMLDivElement,\n\tSegmentedControlProps<string>\n>(function SegmentedControl(\n\t{\n\t\toptions,\n\t\tvalue: controlledValue,\n\t\tdefaultValue,\n\t\tonValueChange,\n\t\tlayout = \"fill\",\n\t\tsize = \"sm\",\n\t\tclassName,\n\t},\n\tref,\n) {\n\tconst [internalValue, setInternalValue] = useState<string>(\n\t\t() => defaultValue ?? options[0]?.value ?? \"\",\n\t)\n\tconst isControlled = controlledValue !== undefined\n\tconst activeValue = isControlled ? controlledValue : internalValue\n\tconst activeIndex = options.findIndex(o => o.value === activeValue)\n\n\tfunction handleSelect(value: string) {\n\t\tif (!isControlled) setInternalValue(value)\n\t\tonValueChange?.(value)\n\t}\n\n\treturn (\n\t\t<SegmentedGroup\n\t\t\tref={ref}\n\t\t\tactiveIndex={activeIndex}\n\t\t\titemCount={options.length}\n\t\t\tlayout={layout}\n\t\t\tclassName={className}\n\t\t>\n\t\t\t{options.map(option => (\n\t\t\t\t<SegmentedGroupItem\n\t\t\t\t\tkey={option.value}\n\t\t\t\t\tactive={option.value === activeValue}\n\t\t\t\t\taria-pressed={option.value === activeValue}\n\t\t\t\t\tonClick={() => handleSelect(option.value)}\n\t\t\t\t\tclassName={sizeStyles[size]}\n\t\t\t\t>\n\t\t\t\t\t{option.icon && (\n\t\t\t\t\t\t<span className=\"flex size-4 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t\t{option.icon}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{option.label && <span>{option.label}</span>}\n\t\t\t\t</SegmentedGroupItem>\n\t\t\t))}\n\t\t</SegmentedGroup>\n\t)\n}) as <T extends string = string>(\n\tprops: SegmentedControlProps<T> & React.RefAttributes<HTMLDivElement>,\n) => React.ReactElement | null\n","/**\n * SegmentedGroup — shared visual primitive for segmented pill controls.\n *\n * Provides the container, sliding indicator, and item styling used by\n * both SegmentedControl (standalone value picker) and Tabs (panel switcher).\n *\n * This component owns the visual only — it renders no interactive behaviour.\n * Consumers wire their own click handlers and active-state tracking, then\n * pass `activeIndex` so the indicator knows where to slide.\n */\n\nimport {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tforwardRef,\n\tuseCallback,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SegmentedGroupProps {\n\t/** Index of the currently active item (drives the indicator position) */\n\tactiveIndex: number\n\t/** Total number of items (needed for fill layout grid) */\n\titemCount: number\n\t/**\n\t * Layout mode:\n\t * - `fill` — items divide space equally via CSS grid (default)\n\t * - `fit` — items hug their content, indicator measured from DOM\n\t */\n\tlayout?: \"fill\" | \"fit\"\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nexport interface SegmentedGroupItemProps {\n\tactive?: boolean\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// SegmentedGroup (container + sliding indicator)\n// ---------------------------------------------------------------------------\n\nexport const SegmentedGroup = forwardRef<HTMLDivElement, SegmentedGroupProps>(\n\tfunction SegmentedGroup(\n\t\t{ activeIndex, itemCount, layout = \"fill\", className, children },\n\t\tref,\n\t) {\n\t\tconst isFill = layout === \"fill\"\n\n\t\t// Refs for fit-mode DOM measurement\n\t\tconst containerRef = useRef<HTMLDivElement>(null)\n\t\tconst [indicator, setIndicator] = useState<{\n\t\t\tleft: number\n\t\t\twidth: number\n\t\t} | null>(null)\n\t\tconst hasMeasuredRef = useRef(false)\n\n\t\tconst measure = useCallback(() => {\n\t\t\tif (layout !== \"fit\") return\n\t\t\tconst container = containerRef.current\n\t\t\tif (!container) return\n\n\t\t\t// Find the active item by its data attribute\n\t\t\tconst items = container.querySelectorAll(\"[data-segmented-item]\")\n\t\t\tconst btn = items[activeIndex] as HTMLElement | undefined\n\t\t\tif (!btn) return\n\n\t\t\tconst wasFirst = !hasMeasuredRef.current\n\t\t\thasMeasuredRef.current = true\n\t\t\tsetIndicator({ left: btn.offsetLeft, width: btn.offsetWidth })\n\t\t\tif (wasFirst) {\n\t\t\t\tvoid btn.offsetHeight\n\t\t\t}\n\t\t}, [activeIndex, layout])\n\n\t\tuseLayoutEffect(() => {\n\t\t\tmeasure()\n\n\t\t\tconst container = containerRef.current\n\t\t\tif (!container || layout !== \"fit\") return\n\n\t\t\tconst ro = new ResizeObserver(measure)\n\t\t\tro.observe(container)\n\t\t\treturn () => ro.disconnect()\n\t\t}, [measure, layout])\n\n\t\t// Indicator styles\n\t\tconst indicatorStyle: CSSProperties = isFill\n\t\t\t? {\n\t\t\t\t\twidth: `calc(100% / ${itemCount})`,\n\t\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t\t}\n\t\t\t: indicator\n\t\t\t\t? {\n\t\t\t\t\t\tleft: indicator.left,\n\t\t\t\t\t\twidth: indicator.width,\n\t\t\t\t\t\ttransition: hasMeasuredRef.current ? undefined : \"none\",\n\t\t\t\t\t}\n\t\t\t\t: { opacity: 0 }\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={(node: HTMLDivElement | null) => {\n\t\t\t\t\t// Merge refs\n\t\t\t\t\tcontainerRef.current = node\n\t\t\t\t\tif (typeof ref === \"function\") ref(node)\n\t\t\t\t\telse if (ref) ref.current = node\n\t\t\t\t}}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative bg-bruv-base-0 rounded-bruv-md ring-1 ring-bruv-neutral\",\n\t\t\t\t\tisFill ? \"grid\" : \"inline-flex\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\tstyle={\n\t\t\t\t\tisFill\n\t\t\t\t\t\t? { gridTemplateColumns: `repeat(${itemCount}, 1fr)` }\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t{/* Sliding indicator */}\n\t\t\t\t<div\n\t\t\t\t\taria-hidden\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute inset-y-0 p-0.5\",\n\t\t\t\t\t\t\"transition-all duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t!isFill && !hasMeasuredRef.current && \"transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t\tstyle={indicatorStyle}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"bg-bruv-base-2 rounded-bruv-sm h-full shadow-sm\" />\n\t\t\t\t</div>\n\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// SegmentedGroup.Item (shared item styling)\n// ---------------------------------------------------------------------------\n\nexport const SegmentedGroupItem = forwardRef<\n\tHTMLButtonElement,\n\tSegmentedGroupItemProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function SegmentedGroupItem(\n\t{ active = false, className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\tdata-segmented-item=\"\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative z-10 flex items-center justify-center gap-1.5 px-2.5 h-7 rounded-bruv-sm\",\n\t\t\t\t\"text-bruv-base font-medium select-none cursor-pointer\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\tactive\n\t\t\t\t\t? \"text-bruv-primary\"\n\t\t\t\t\t: \"text-bruv-tertiary hover:text-bruv-secondary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t)\n})\n","import type { ReactNode } from \"react\"\nimport {\n\tSunIcon,\n\tMoonIcon,\n\tComputerDesktopIcon,\n\tArrowRightStartOnRectangleIcon,\n} from \"@heroicons/react/16/solid\"\nimport { Avatar } from \"../avatar\"\nimport { DropdownMenu } from \"../dropdown-menu\"\nimport { SegmentedControl } from \"../segmented-control\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ThemeMode = \"light\" | \"dark\" | \"system\"\n\nexport interface UserMenuUser {\n\t/** Display name */\n\tname: string\n\t/** Organization or team name */\n\torg?: string\n\t/** Avatar image URL */\n\tavatarUrl?: string\n\t/** Fallback initials when no image (e.g. \"AM\") */\n\tinitials?: string\n}\n\nexport interface UserMenuItem {\n\tlabel: string\n\ticon?: ReactNode\n\tonClick?: () => void\n}\n\nexport interface UserMenuProps {\n\t/** User information displayed in the header */\n\tuser: UserMenuUser\n\t/** Current theme mode */\n\ttheme?: ThemeMode\n\t/** Called when the theme is changed */\n\tonThemeChange?: (theme: ThemeMode) => void\n\t/** Menu items rendered between the theme toggle and log out */\n\titems?: UserMenuItem[]\n\t/** Called when \"Log out\" is clicked */\n\tonLogout?: () => void\n\t/** Custom trigger content. Defaults to a bare Avatar. */\n\tchildren?: ReactNode\n\t/** Which side the dropdown opens on */\n\tside?: \"top\" | \"bottom\" | \"left\" | \"right\"\n\t/** Alignment of the dropdown relative to the trigger */\n\talign?: \"start\" | \"center\" | \"end\"\n\tclassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst themeOptions = [\n\t{ value: \"light\" as const, icon: <SunIcon /> },\n\t{ value: \"dark\" as const, icon: <MoonIcon /> },\n\t{ value: \"system\" as const, icon: <ComputerDesktopIcon /> },\n]\n\n// ---------------------------------------------------------------------------\n// UserMenu\n// ---------------------------------------------------------------------------\n\n/**\n * User menu dropdown - shows user info, theme toggle, navigation items,\n * and a log out action.\n *\n * Theme state is passed as props so the component stays decoupled from\n * any specific theme hook.\n */\nexport function UserMenu({\n\tuser,\n\ttheme = \"system\",\n\tonThemeChange,\n\titems,\n\tonLogout,\n\tchildren,\n\tside = \"bottom\",\n\talign = \"end\",\n\tclassName,\n}: UserMenuProps) {\n\treturn (\n\t\t<DropdownMenu.Root>\n\t\t\t<DropdownMenu.Trigger className={className}>\n\t\t\t\t{children ?? (\n\t\t\t\t\t<Avatar\n\t\t\t\t\t\tinitials={user.initials}\n\t\t\t\t\t\tsrc={user.avatarUrl}\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</DropdownMenu.Trigger>\n\n\t\t\t<DropdownMenu.Content\n\t\t\t\tside={side}\n\t\t\t\talign={align}\n\t\t\t\tsideOffset={8}\n\t\t\t\tminWidth=\"min-w-[max(var(--anchor-width),220px)]\"\n\t\t\t>\n\t\t\t\t{/* User info header */}\n\t\t\t\t<div className=\"flex items-center gap-2 px-2 py-1.5\">\n\t\t\t\t\t<Avatar initials={user.initials} src={user.avatarUrl} size=\"md\" />\n\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-semibold\">\n\t\t\t\t\t\t\t{user.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{user.org && (\n\t\t\t\t\t\t\t<span className=\"text-bruv-tertiary text-bruv-sm\">\n\t\t\t\t\t\t\t\t{user.org}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<DropdownMenu.Separator />\n\n\t\t\t\t{/* Theme toggle */}\n\t\t\t\t<div className=\"flex items-center justify-between px-2 py-1.5\">\n\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base\">Theme</span>\n\t\t\t\t\t<SegmentedControl<ThemeMode>\n\t\t\t\t\t\toptions={themeOptions}\n\t\t\t\t\t\tvalue={theme}\n\t\t\t\t\t\tonValueChange={onThemeChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Menu items */}\n\t\t\t\t{items && items.length > 0 && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DropdownMenu.Separator />\n\t\t\t\t\t\t{items.map(item => (\n\t\t\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\ticon={item.icon}\n\t\t\t\t\t\t\t\tonClick={item.onClick}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{/* Log out */}\n\t\t\t\t{onLogout && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<DropdownMenu.Separator />\n\t\t\t\t\t\t<DropdownMenu.Item\n\t\t\t\t\t\t\ticon={<ArrowRightStartOnRectangleIcon />}\n\t\t\t\t\t\t\tonClick={onLogout}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tLog out\n\t\t\t\t\t\t</DropdownMenu.Item>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</DropdownMenu.Content>\n\t\t</DropdownMenu.Root>\n\t)\n}\n","import { forwardRef, type ReactNode } from \"react\"\nimport {\n\tInformationCircleIcon,\n\tCheckCircleIcon,\n\tExclamationTriangleIcon,\n\tXCircleIcon,\n\tXMarkIcon,\n} from \"@heroicons/react/16/solid\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\nimport { FlickeringGrid } from \"../flickering-grid\"\n\n// ---------------------------------------------------------------------------\n// Variant config\n// ---------------------------------------------------------------------------\n\nconst variantConfig = {\n\taccent: {\n\t\tcontainer: \"bg-bruv-accent-subtle\",\n\t\ticon: \"text-bruv-accent\",\n\t\ttext: \"text-bruv-accent [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-accent\",\n\t\tdefaultIcon: InformationCircleIcon,\n\t},\n\tsuccess: {\n\t\tcontainer: \"bg-bruv-success-subtle\",\n\t\ticon: \"text-bruv-success\",\n\t\ttext: \"text-bruv-success [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-success\",\n\t\tdefaultIcon: CheckCircleIcon,\n\t},\n\twarn: {\n\t\tcontainer: \"bg-bruv-warn-subtle\",\n\t\ticon: \"text-bruv-warn\",\n\t\ttext: \"text-bruv-warn [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-warn\",\n\t\tdefaultIcon: ExclamationTriangleIcon,\n\t},\n\tdanger: {\n\t\tcontainer: \"bg-bruv-danger-subtle\",\n\t\ticon: \"text-bruv-danger\",\n\t\ttext: \"text-bruv-danger [&_a]:underline [&_a]:underline-offset-2 [&_a]:hover:opacity-80\",\n\t\tpattern: \"text-bruv-danger\",\n\t\tdefaultIcon: XCircleIcon,\n\t},\n} as const\n\nexport type AlertVariant = keyof typeof variantConfig\nexport type AlertLayout = \"inline\" | \"banner\"\n\n// ---------------------------------------------------------------------------\n// Alert\n// ---------------------------------------------------------------------------\n\nexport interface AlertProps {\n\t/** Visual style variant */\n\tvariant?: AlertVariant\n\t/**\n\t * Layout mode:\n\t * - `inline` (default) — horizontal bar with icon left, text center, action right\n\t * - `banner` — full-width centered layout for page-level announcements\n\t */\n\tlayout?: AlertLayout\n\t/** Override the default icon */\n\ticon?: ReactNode\n\t/** Action element rendered beside the text (e.g. a Button) */\n\taction?: ReactNode\n\t/** Called when the dismiss button is clicked. When provided, a close button appears. */\n\tonDismiss?: () => void\n\tclassName?: string\n\tchildren: ReactNode\n}\n\n// Mask gradient: fades the pixel grid from right (full) to left (invisible),\n// so the pattern appears concentrated on the right side of the alert.\nconst patternMaskStyle = {\n\tmaskImage: \"linear-gradient(to left, black, transparent)\",\n\tWebkitMaskImage: \"linear-gradient(to left, black, transparent)\",\n}\n\n/**\n * Alert component for important messages.\n *\n * Two layouts:\n * - `inline` — horizontal bar with icon, text, and optional action. Features\n * a flickering pixel grid on the right side.\n * - `banner` — full-width centered layout for page-level announcements.\n * Content is centered with the icon above the text.\n */\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n\t{\n\t\tvariant = \"accent\",\n\t\tlayout = \"inline\",\n\t\ticon,\n\t\taction,\n\t\tonDismiss,\n\t\tclassName,\n\t\tchildren,\n\t},\n\tref,\n) {\n\tconst config = variantConfig[variant]\n\tconst DefaultIcon = config.defaultIcon\n\n\tif (layout === \"banner\") {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"alert\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative flex w-full items-center justify-center overflow-hidden px-4 py-3\",\n\t\t\t\t\tconfig.container,\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{/* Pixel grid pattern — full width, fades from edges */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\"pointer-events-none absolute inset-0\", config.pattern)}\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tmaskImage:\n\t\t\t\t\t\t\t\"linear-gradient(to right, transparent, black 30%, black 70%, transparent)\",\n\t\t\t\t\t\tWebkitMaskImage:\n\t\t\t\t\t\t\t\"linear-gradient(to right, transparent, black 30%, black 70%, transparent)\",\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<FlickeringGrid\n\t\t\t\t\t\tsquareSize={4}\n\t\t\t\t\t\tgridGap={2}\n\t\t\t\t\t\tflickerChance={0.4}\n\t\t\t\t\t\tmaxOpacity={0.15}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"relative flex items-center gap-3\">\n\t\t\t\t\t{/* Icon */}\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\tconfig.icon,\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon ?? <DefaultIcon />}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Text */}\n\t\t\t\t\t<span className={cn(\"text-bruv-base font-medium\", config.text)}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t{/* Action */}\n\t\t\t\t\t{action && <div className=\"shrink-0\">{action}</div>}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Dismiss — positioned at the right edge */}\n\t\t\t\t{onDismiss && (\n\t\t\t\t\t<div className=\"absolute right-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t\t\taria-label=\"Dismiss\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t)\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\trole=\"alert\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative flex min-h-10 items-center gap-3 overflow-hidden rounded-bruv-md py-1.5 pl-3 pr-1.5\",\n\t\t\t\tconfig.container,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{/* Pixel grid pattern — right half, fades toward the left */}\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none absolute top-0 right-0 h-full w-1/2\",\n\t\t\t\t\tconfig.pattern,\n\t\t\t\t)}\n\t\t\t\tstyle={patternMaskStyle}\n\t\t\t>\n\t\t\t\t<FlickeringGrid\n\t\t\t\t\tsquareSize={4}\n\t\t\t\t\tgridGap={2}\n\t\t\t\t\tflickerChance={0.4}\n\t\t\t\t\tmaxOpacity={0.2}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t{/* Icon */}\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\tconfig.icon,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{icon ?? <DefaultIcon />}\n\t\t\t</span>\n\n\t\t\t{/* Text */}\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"relative flex-1 text-bruv-base font-medium\",\n\t\t\t\t\tconfig.text,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\n\t\t\t{/* Action */}\n\t\t\t{action && <div className=\"relative ml-auto shrink-0\">{action}</div>}\n\n\t\t\t{/* Dismiss */}\n\t\t\t{onDismiss && (\n\t\t\t\t<div className=\"relative ml-auto shrink-0\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\tonClick={onDismiss}\n\t\t\t\t\t\taria-label=\"Dismiss\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t)\n})\n","import { AlertDialog as BaseAlertDialog } from \"@base-ui/react/alert-dialog\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Root\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogRootProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Root\n> {}\n\nfunction AlertDialogRoot(props: AlertDialogRootProps) {\n\treturn <BaseAlertDialog.Root {...props} />\n}\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogTriggerProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Trigger\n> {}\n\nconst AlertDialogTrigger = forwardRef<\n\tHTMLButtonElement,\n\tAlertDialogTriggerProps\n>(function AlertDialogTrigger({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseAlertDialog.Trigger ref={ref} className={cn(className)} {...props} />\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Backdrop\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogBackdropProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Backdrop\n> {}\n\nconst AlertDialogBackdrop = forwardRef<\n\tHTMLDivElement,\n\tAlertDialogBackdropProps\n>(function AlertDialogBackdrop({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseAlertDialog.Backdrop\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\"transition-opacity duration-150\",\n\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Content\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogContentProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Popup\n> {}\n\nfunction AlertDialogContent({\n\tclassName,\n\tchildren,\n\t...props\n}: AlertDialogContentProps) {\n\treturn (\n\t\t<BaseAlertDialog.Portal>\n\t\t\t<AlertDialogBackdrop />\n\t\t\t<BaseAlertDialog.Popup\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-1 fixed top-1/2 left-1/2 z-50 max-h-[85vh] w-[90vw] max-w-[450px] -translate-x-1/2 -translate-y-1/2 rounded-bruv-lg p-0.5 shadow-xl\",\n\t\t\t\t\t\"transition-[opacity,scale] duration-150 ease-out\",\n\t\t\t\t\t\"data-[starting-style]:opacity-0 data-[starting-style]:scale-[0.96]\",\n\t\t\t\t\t\"data-[ending-style]:opacity-0 data-[ending-style]:scale-[0.98]\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</BaseAlertDialog.Popup>\n\t\t</BaseAlertDialog.Portal>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Panel\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogPanelProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst AlertDialogPanel = forwardRef<HTMLDivElement, AlertDialogPanelProps>(\n\tfunction AlertDialogPanel({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral rounded-bruv-md border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Title\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogTitleProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Title\n> {}\n\nconst AlertDialogTitle = forwardRef<HTMLHeadingElement, AlertDialogTitleProps>(\n\tfunction AlertDialogTitle({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAlertDialog.Title\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-primary border-bruv-neutral border-b px-4 py-3 text-bruv-base font-medium\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Description\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogDescriptionProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Description\n> {}\n\nconst AlertDialogDescription = forwardRef<\n\tHTMLParagraphElement,\n\tAlertDialogDescriptionProps\n>(function AlertDialogDescription({ className, ...props }, ref) {\n\treturn (\n\t\t<BaseAlertDialog.Description\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"text-bruv-secondary p-4 text-bruv-base\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Actions\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogActionsProps {\n\tclassName?: string\n\tchildren: ReactNode\n}\n\nconst AlertDialogActions = forwardRef<HTMLDivElement, AlertDialogActionsProps>(\n\tfunction AlertDialogActions({ className, children }, ref) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex items-center justify-end gap-2 p-2\", className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// AlertDialog.Close\n// ---------------------------------------------------------------------------\n\nexport interface AlertDialogCloseProps extends ComponentProps<\n\ttypeof BaseAlertDialog.Close\n> {}\n\nconst AlertDialogClose = forwardRef<HTMLButtonElement, AlertDialogCloseProps>(\n\tfunction AlertDialogClose({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAlertDialog.Close ref={ref} className={cn(className)} {...props} />\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const AlertDialog = {\n\tRoot: AlertDialogRoot,\n\tTrigger: AlertDialogTrigger,\n\tContent: AlertDialogContent,\n\tPanel: AlertDialogPanel,\n\tTitle: AlertDialogTitle,\n\tDescription: AlertDialogDescription,\n\tActions: AlertDialogActions,\n\tClose: AlertDialogClose,\n}\n","import { Accordion as BaseAccordion } from \"@base-ui/react/accordion\"\nimport { ChevronRightIcon } from \"@heroicons/react/16/solid\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Accordion.Root\n// ---------------------------------------------------------------------------\n\nexport interface AccordionRootProps extends ComponentProps<\n\ttypeof BaseAccordion.Root\n> {}\n\nconst AccordionRoot = forwardRef<HTMLDivElement, AccordionRootProps>(\n\tfunction AccordionRoot({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Root\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"flex flex-col\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Accordion.Item\n// ---------------------------------------------------------------------------\n\nexport interface AccordionItemProps extends ComponentProps<\n\ttypeof BaseAccordion.Item\n> {}\n\nconst AccordionItem = forwardRef<HTMLDivElement, AccordionItemProps>(\n\tfunction AccordionItem({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Item\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"border-bruv-neutral border-b last:border-b-0\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Accordion.Trigger\n// ---------------------------------------------------------------------------\n\nexport interface AccordionTriggerProps extends ComponentProps<\n\ttypeof BaseAccordion.Trigger\n> {\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n}\n\nconst AccordionTrigger = forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n\tfunction AccordionTrigger({ icon, className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Trigger\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group flex w-full cursor-pointer items-center gap-2 rounded-bruv-sm py-3 text-bruv-base font-medium\",\n\t\t\t\t\t\"text-bruv-primary hover:text-bruv-primary\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<ChevronRightIcon\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-bruv-tertiary size-4 shrink-0\",\n\t\t\t\t\t\t\"transition-transform duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"group-data-[panel-open]:rotate-90\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span className=\"flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"flex-1 text-left\">{children}</span>\n\t\t\t</BaseAccordion.Trigger>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Accordion.Content\n// ---------------------------------------------------------------------------\n\nexport interface AccordionContentProps extends ComponentProps<\n\ttypeof BaseAccordion.Panel\n> {}\n\nconst AccordionContent = forwardRef<HTMLDivElement, AccordionContentProps>(\n\tfunction AccordionContent({ className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<BaseAccordion.Panel\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"overflow-hidden\",\n\t\t\t\t\t\"h-[var(--accordion-panel-height)]\",\n\t\t\t\t\t\"transition-[height] duration-200 ease-bruv-out-expo\",\n\t\t\t\t\t\"data-[starting-style]:h-0\",\n\t\t\t\t\t\"data-[ending-style]:h-0\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div className=\"text-bruv-secondary text-bruv-base pb-3\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</BaseAccordion.Panel>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Accordion = {\n\tRoot: AccordionRoot,\n\tItem: AccordionItem,\n\tTrigger: AccordionTrigger,\n\tContent: AccordionContent,\n}\n","import { Tabs as BaseTabs } from \"@base-ui/react/tabs\"\nimport {\n\tforwardRef,\n\tuseCallback,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n\ttype ComponentProps,\n} from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { SegmentedGroup } from \"../segmented-group\"\n\n// ---------------------------------------------------------------------------\n// Tabs.Root\n// ---------------------------------------------------------------------------\n\nexport interface TabsRootProps extends ComponentProps<typeof BaseTabs.Root> {}\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsRootProps>(function TabsRoot(\n\t{ className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseTabs.Root\n\t\t\tref={ref}\n\t\t\tclassName={cn(\"flex flex-col\", className)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Tabs.List\n//\n// Delegates visual rendering to SegmentedGroup. Observes Base UI's\n// data-active attribute to track which tab is active and passes the\n// activeIndex to SegmentedGroup for indicator positioning.\n// ---------------------------------------------------------------------------\n\nexport interface TabsListProps extends ComponentProps<typeof BaseTabs.List> {\n\t/**\n\t * Layout mode:\n\t * - `fit` — tabs hug their content (default)\n\t * - `fill` — tabs divide space equally via CSS grid\n\t */\n\tlayout?: \"fill\" | \"fit\"\n}\n\nconst TabsList = forwardRef<HTMLDivElement, TabsListProps>(function TabsList(\n\t{ className, layout = \"fit\", children, ...props },\n\tref,\n) {\n\tconst containerRef = useRef<HTMLDivElement>(null)\n\tconst [itemCount, setItemCount] = useState(0)\n\tconst [activeIndex, setActiveIndex] = useState(0)\n\n\tconst measure = useCallback(() => {\n\t\tconst container = containerRef.current\n\t\tif (!container) return\n\n\t\tconst tabs = container.querySelectorAll<HTMLElement>(\"[role='tab']\")\n\t\tsetItemCount(tabs.length)\n\n\t\tlet foundIndex = -1\n\t\ttabs.forEach((tab, i) => {\n\t\t\tif (\n\t\t\t\ttab.getAttribute(\"data-active\") !== null ||\n\t\t\t\ttab.getAttribute(\"aria-selected\") === \"true\"\n\t\t\t) {\n\t\t\t\tfoundIndex = i\n\t\t\t}\n\t\t})\n\t\tif (foundIndex < 0) foundIndex = 0\n\t\tsetActiveIndex(foundIndex)\n\t}, [])\n\n\tuseLayoutEffect(() => {\n\t\tmeasure()\n\n\t\tconst container = containerRef.current\n\t\tif (!container) return\n\n\t\t// Re-measure when the active tab changes (Base UI toggles data-active)\n\t\tconst observer = new MutationObserver(measure)\n\t\tobserver.observe(container, {\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\"data-active\", \"aria-selected\"],\n\t\t\tsubtree: true,\n\t\t})\n\n\t\t// Re-measure on resize\n\t\tconst ro = new ResizeObserver(measure)\n\t\tro.observe(container)\n\n\t\treturn () => {\n\t\t\tobserver.disconnect()\n\t\t\tro.disconnect()\n\t\t}\n\t}, [measure])\n\n\treturn (\n\t\t<SegmentedGroup\n\t\t\tref={(node: HTMLDivElement | null) => {\n\t\t\t\tcontainerRef.current = node\n\t\t\t\tif (typeof ref === \"function\") ref(node)\n\t\t\t\telse if (ref) ref.current = node\n\t\t\t}}\n\t\t\tactiveIndex={activeIndex}\n\t\t\titemCount={itemCount}\n\t\t\tlayout={layout}\n\t\t\tclassName={typeof className === \"string\" ? className : undefined}\n\t\t>\n\t\t\t<BaseTabs.List className=\"contents\" {...props}>\n\t\t\t\t{children}\n\t\t\t</BaseTabs.List>\n\t\t</SegmentedGroup>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Tabs.Tab\n//\n// Styled to match SegmentedGroupItem — no individual hover wrapper,\n// the SegmentedGroup's sliding indicator handles the active visual.\n// ---------------------------------------------------------------------------\n\nconst tabSizeStyles = {\n\tsm: \"h-7 px-2.5\",\n\tmd: \"h-8 px-3\",\n} as const\n\nexport type TabsTabSize = keyof typeof tabSizeStyles\n\nexport interface TabsTabProps extends ComponentProps<typeof BaseTabs.Tab> {\n\t/** Size of the tab */\n\tsize?: TabsTabSize\n}\n\nconst TabsTab = forwardRef<HTMLButtonElement, TabsTabProps>(function TabsTab(\n\t{ size = \"sm\", className, children, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseTabs.Tab\n\t\t\tref={ref}\n\t\t\tdata-segmented-item=\"\"\n\t\t\tclassName={cn(\n\t\t\t\t\"relative z-10 flex items-center justify-center gap-1.5 rounded-bruv-sm\",\n\t\t\t\ttabSizeStyles[size],\n\t\t\t\t\"text-bruv-base font-medium select-none cursor-pointer\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus\",\n\t\t\t\t\"transition-colors duration-150\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\"text-bruv-tertiary hover:text-bruv-secondary\",\n\t\t\t\t\"data-[active]:text-bruv-primary\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</BaseTabs.Tab>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Tabs.Panel\n// ---------------------------------------------------------------------------\n\nexport interface TabsPanelProps extends ComponentProps<typeof BaseTabs.Panel> {}\n\nconst TabsPanel = forwardRef<HTMLDivElement, TabsPanelProps>(function TabsPanel(\n\t{ className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseTabs.Panel\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"rounded-bruv-sm pt-3 outline-none\",\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Tabs = {\n\tRoot: TabsRoot,\n\tList: TabsList,\n\tTab: TabsTab,\n\tPanel: TabsPanel,\n}\n","import { Command as CommandPrimitive } from \"cmdk\"\nimport { Dialog as BaseDialog } from \"@base-ui/react/dialog\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Kbd } from \"../kbd\"\nimport { Menu } from \"../menu\"\n\n// ---------------------------------------------------------------------------\n// Command.Root\n// ---------------------------------------------------------------------------\n\nexport interface CommandRootProps extends ComponentProps<\n\ttypeof CommandPrimitive\n> {}\n\nconst CommandRoot = forwardRef<HTMLDivElement, CommandRootProps>(\n\tfunction CommandRoot({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral flex h-full w-full flex-col overflow-hidden rounded-bruv-md border\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Input\n// ---------------------------------------------------------------------------\n\nexport interface CommandInputProps extends ComponentProps<\n\ttypeof CommandPrimitive.Input\n> {}\n\nconst CommandInput = forwardRef<HTMLInputElement, CommandInputProps>(\n\tfunction CommandInput({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<Menu.SearchInput className=\"mb-0 bg-transparent px-2\">\n\t\t\t\t<CommandPrimitive.Input\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"text-bruv-primary placeholder:text-bruv-tertiary flex-1 bg-transparent py-1.5 text-bruv-base outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</Menu.SearchInput>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.List\n// ---------------------------------------------------------------------------\n\nexport interface CommandListProps extends ComponentProps<\n\ttypeof CommandPrimitive.List\n> {}\n\nconst CommandList = forwardRef<HTMLDivElement, CommandListProps>(\n\tfunction CommandList({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.List\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"max-h-[300px] overflow-y-auto overscroll-contain p-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Empty\n// ---------------------------------------------------------------------------\n\nexport interface CommandEmptyProps extends ComponentProps<\n\ttypeof CommandPrimitive.Empty\n> {}\n\nconst CommandEmpty = forwardRef<HTMLDivElement, CommandEmptyProps>(\n\tfunction CommandEmpty({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Empty\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"text-bruv-secondary px-2 py-4 text-center text-bruv-base\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Group\n// ---------------------------------------------------------------------------\n\nexport interface CommandGroupProps extends ComponentProps<\n\ttypeof CommandPrimitive.Group\n> {}\n\nconst CommandGroup = forwardRef<HTMLDivElement, CommandGroupProps>(\n\tfunction CommandGroup({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Group\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex flex-col gap-0.5\",\n\t\t\t\t\t\"[&_[cmdk-group-heading]]:text-bruv-tertiary [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1 [&_[cmdk-group-heading]]:text-bruv-sm [&_[cmdk-group-heading]]:font-normal [&_[cmdk-group-heading]]:select-none\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Item\n// ---------------------------------------------------------------------------\n\nexport interface CommandItemProps extends ComponentProps<\n\ttypeof CommandPrimitive.Item\n> {\n\t/** Icon element rendered before the label */\n\ticon?: ReactNode\n\t/** Keyboard shortcut hint rendered on the right */\n\tshortcut?: string\n}\n\nconst CommandItem = forwardRef<HTMLDivElement, CommandItemProps>(\n\tfunction CommandItem({ icon, shortcut, className, children, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Item\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group relative flex cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-bruv-base select-none outline-none\",\n\t\t\t\t\t\"text-bruv-primary\",\n\t\t\t\t\t\"data-[disabled=true]:pointer-events-none data-[disabled=true]:text-bruv-tertiary\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{/* Hover overlay with squish — matches Menu.Item */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute inset-0 rounded-[inherit] bg-bruv-subtle opacity-0\",\n\t\t\t\t\t\t\"group-data-[selected=true]:opacity-100\",\n\t\t\t\t\t\t\"transition-[inset] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\t\"group-active:inset-px\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t{icon && (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\t\"text-bruv-tertiary group-data-[selected=true]:text-bruv-primary\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{icon}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"relative z-[1] flex-1\">{children}</span>\n\t\t\t\t{shortcut && (\n\t\t\t\t\t<Kbd\n\t\t\t\t\t\tkeys={shortcut}\n\t\t\t\t\t\tclassName=\"pointer-events-none relative z-[1] ml-auto\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</CommandPrimitive.Item>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Separator\n// ---------------------------------------------------------------------------\n\nexport interface CommandSeparatorProps extends ComponentProps<\n\ttypeof CommandPrimitive.Separator\n> {}\n\nconst CommandSeparator = forwardRef<HTMLDivElement, CommandSeparatorProps>(\n\tfunction CommandSeparator({ className, ...props }, ref) {\n\t\treturn (\n\t\t\t<CommandPrimitive.Separator\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\"border-bruv-neutral mx-2 my-1 border-t\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// Command.Dialog - Convenience wrapper using Base UI Dialog\n// ---------------------------------------------------------------------------\n\nexport interface CommandDialogProps {\n\t/** Controlled open state */\n\topen?: boolean\n\t/** Called when open state changes */\n\tonOpenChange?: (open: boolean) => void\n\t/** Content for the command palette */\n\tchildren: ReactNode\n\tclassName?: string\n}\n\nfunction CommandDialog({\n\topen,\n\tonOpenChange,\n\tchildren,\n\tclassName,\n}: CommandDialogProps) {\n\treturn (\n\t\t<BaseDialog.Root open={open} onOpenChange={onOpenChange}>\n\t\t\t<BaseDialog.Portal>\n\t\t\t\t<BaseDialog.Backdrop\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"fixed inset-0 z-40 bg-bruv-overlay backdrop-blur-[2px]\",\n\t\t\t\t\t\t\"transition-opacity duration-150\",\n\t\t\t\t\t\t\"data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t<BaseDialog.Popup\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"bg-bruv-base-1 fixed top-[20%] left-1/2 z-50 w-[90vw] max-w-[520px] -translate-x-1/2 rounded-[10px] p-1 shadow-lg\",\n\t\t\t\t\t\t\"transition-[opacity,scale] duration-150 ease-out\",\n\t\t\t\t\t\t\"data-[starting-style]:opacity-0 data-[starting-style]:scale-[0.96]\",\n\t\t\t\t\t\t\"data-[ending-style]:opacity-0 data-[ending-style]:scale-[0.98]\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\t\"focus:outline-none\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</BaseDialog.Popup>\n\t\t\t</BaseDialog.Portal>\n\t\t</BaseDialog.Root>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Command = {\n\tRoot: CommandRoot,\n\tInput: CommandInput,\n\tList: CommandList,\n\tEmpty: CommandEmpty,\n\tGroup: CommandGroup,\n\tItem: CommandItem,\n\tSeparator: CommandSeparator,\n\tDialog: CommandDialog,\n}\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { Toggle } from \"@base-ui/react/toggle\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\txs: { height: \"h-6\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-6\" },\n\tsm: { height: \"h-7\", padding: \"px-1.5\", textPadding: \"px-1\", icon: \"w-7\" },\n\tmd: { height: \"h-8\", padding: \"px-2\", textPadding: \"px-1\", icon: \"w-8\" },\n} as const\n\nexport type ToggleButtonSize = keyof typeof sizeStyles\n\nexport interface ToggleButtonProps extends ComponentProps<typeof Toggle> {\n\t/** Size of the toggle button */\n\tsize?: ToggleButtonSize\n\t/** Icon element rendered before the label */\n\ticonLeft?: ReactNode\n\t/** Icon element rendered after the label */\n\ticonRight?: ReactNode\n}\n\n// ---------------------------------------------------------------------------\n// ToggleButton\n// ---------------------------------------------------------------------------\n\n/**\n * A two-state button that can be pressed or unpressed.\n *\n * Built on Base UI Toggle. Visually matches the Button component but\n * toggles between pressed/unpressed states. Uses `data-[pressed]` for\n * the active visual.\n *\n * Use standalone for single toggles (like a bold button in a toolbar).\n * Use inside a `ToggleButtonGroup` for mutually exclusive or multi-select\n * button groups.\n */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(\n\tfunction ToggleButton(\n\t\t{\n\t\t\tsize = \"md\",\n\t\t\ticonLeft,\n\t\t\ticonRight,\n\t\t\tdisabled,\n\t\t\tclassName,\n\t\t\tchildren,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst s = sizeStyles[size]\n\t\tconst isIconOnly = !children && !iconRight\n\n\t\treturn (\n\t\t\t<Toggle\n\t\t\t\tref={ref}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/toggle-btn relative inline-flex cursor-pointer items-center justify-center\",\n\t\t\t\t\t\"rounded text-bruv-base whitespace-pre select-none\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"text-bruv-secondary\",\n\t\t\t\t\t\"data-[pressed]:text-bruv-primary\",\n\t\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\t\tisIconOnly ? cn(s.height, s.icon) : cn(s.height, s.padding, \"w-fit\"),\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{/* Hover/bg layer — outline style matching Button */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"absolute rounded-[inherit] inset-0 opacity-100\",\n\t\t\t\t\t\t\"bg-bruv-base-2 border border-bruv-neutral shadow-xs\",\n\t\t\t\t\t\t\"group-data-[pressed]/toggle-btn:bg-bruv-subtle group-data-[pressed]/toggle-btn:border-bruv-neutral\",\n\t\t\t\t\t\t!disabled && [\n\t\t\t\t\t\t\t\"transition-[inset,opacity,background-color] duration-150 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\t\t\t\"group-hover/toggle-btn:bg-bruv-subtle\",\n\t\t\t\t\t\t\t\"group-active/toggle-btn:inset-px\",\n\t\t\t\t\t\t],\n\t\t\t\t\t)}\n\t\t\t\t/>\n\n\t\t\t\t{iconLeft && (\n\t\t\t\t\t<span className=\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconLeft}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{children && (\n\t\t\t\t\t<span className={cn(\"relative z-[1] inline\", s.textPadding)}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{iconRight && (\n\t\t\t\t\t<span className=\"relative z-[1] flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\">\n\t\t\t\t\t\t{iconRight}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</Toggle>\n\t\t)\n\t},\n)\n","import { forwardRef, type ComponentPropsWithoutRef } from \"react\"\nimport { ToggleGroup } from \"@base-ui/react/toggle-group\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// ButtonGroup (static layout container)\n// ---------------------------------------------------------------------------\n\nexport interface ButtonGroupProps extends ComponentPropsWithoutRef<\"div\"> {\n\t/** Orientation of the group */\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\n/**\n * Groups buttons together visually by merging their borders.\n *\n * Use for static button groups (e.g. a split button with a dropdown trigger).\n * For toggle button groups with selection state, use `ToggleButtonGroup`.\n *\n * Children should be `Button` or `ToggleButton` components. The group\n * removes inner border radii and collapses adjacent borders so the buttons\n * read as a single connected surface.\n */\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n\tfunction ButtonGroup(\n\t\t{ orientation = \"horizontal\", className, ...props },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\trole=\"group\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"inline-flex\",\n\t\t\t\t\torientation === \"vertical\" ? \"flex-col\" : \"flex-row\",\n\t\t\t\t\t// Merge child button borders and radii\n\t\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-l [&>*:last-child]:rounded-r\",\n\t\t\t\t\t\t\t\t\"[&>*+*]:-ml-px\",\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [\n\t\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-t [&>*:last-child]:rounded-b\",\n\t\t\t\t\t\t\t\t\"[&>*+*]:-mt-px\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t)\n\t},\n)\n\n// ---------------------------------------------------------------------------\n// ToggleButtonGroup (stateful, wraps Base UI ToggleGroup)\n// ---------------------------------------------------------------------------\n\nexport interface ToggleButtonGroupProps<\n\tValue extends string = string,\n> extends Omit<\n\tComponentPropsWithoutRef<typeof ToggleGroup>,\n\t\"value\" | \"defaultValue\" | \"onValueChange\"\n> {\n\t/** Controlled pressed values */\n\tvalue?: readonly Value[]\n\t/** Uncontrolled default pressed values */\n\tdefaultValue?: readonly Value[]\n\t/** Called when the pressed states change */\n\tonValueChange?: (value: Value[]) => void\n\t/** When false, only one toggle can be pressed at a time */\n\tmultiple?: boolean\n\t/** Orientation of the group */\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\n/**\n * Groups toggle buttons with shared selection state.\n *\n * Built on Base UI ToggleGroup. When `multiple` is false (default),\n * pressing one button unpresses the others. When true, any combination\n * of buttons can be pressed.\n *\n * Children should be `ToggleButton` components with `value` props.\n */\nexport const ToggleButtonGroup = forwardRef<\n\tHTMLDivElement,\n\tToggleButtonGroupProps\n>(function ToggleButtonGroup(\n\t{ orientation = \"horizontal\", className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<ToggleGroup\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex\",\n\t\t\t\torientation === \"vertical\" ? \"flex-col\" : \"flex-row\",\n\t\t\t\torientation === \"horizontal\"\n\t\t\t\t\t? [\n\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-l [&>*:last-child]:rounded-r\",\n\t\t\t\t\t\t\t\"[&>*+*]:-ml-px\",\n\t\t\t\t\t\t]\n\t\t\t\t\t: [\n\t\t\t\t\t\t\t\"[&>*]:rounded-none [&>*:first-child]:rounded-t [&>*:last-child]:rounded-b\",\n\t\t\t\t\t\t\t\"[&>*+*]:-mt-px\",\n\t\t\t\t\t\t],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n","import { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { RadioGroup as BaseRadioGroup } from \"@base-ui/react/radio-group\"\nimport { Radio as BaseRadio } from \"@base-ui/react/radio\"\nimport { cn } from \"../../lib/cn\"\n\n// ---------------------------------------------------------------------------\n// RadioGroup.Root\n// ---------------------------------------------------------------------------\n\nexport interface RadioGroupRootProps extends ComponentProps<\n\ttypeof BaseRadioGroup\n> {\n\t/** Layout direction. Default \"vertical\". */\n\torientation?: \"horizontal\" | \"vertical\"\n}\n\nconst Root = forwardRef<HTMLDivElement, RadioGroupRootProps>(function Root(\n\t{ orientation = \"vertical\", className, ...props },\n\tref,\n) {\n\treturn (\n\t\t<BaseRadioGroup\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"flex gap-2\",\n\t\t\t\torientation === \"horizontal\" ? \"flex-row items-center\" : \"flex-col\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// RadioGroup.Item\n// ---------------------------------------------------------------------------\n\nconst sizeStyles = {\n\tsm: { radio: \"size-4\", indicator: \"size-1.5\", label: \"text-bruv-sm\" },\n\tmd: { radio: \"size-[18px]\", indicator: \"size-2\", label: \"text-bruv-base\" },\n} as const\n\nexport type RadioGroupItemSize = keyof typeof sizeStyles\n\nexport interface RadioGroupItemProps extends ComponentProps<\n\ttypeof BaseRadio.Root\n> {\n\t/** Size of the radio indicator */\n\tsize?: RadioGroupItemSize\n\t/** Label text rendered beside the radio */\n\tlabel?: string\n}\n\nconst Item = forwardRef<HTMLSpanElement, RadioGroupItemProps>(function Item(\n\t{ size = \"md\", label, className, value, ...props },\n\tref,\n) {\n\tconst s = sizeStyles[size]\n\n\tconst radio = (\n\t\t<BaseRadio.Root\n\t\t\tref={ref}\n\t\t\tvalue={value}\n\t\t\tclassName={cn(\n\t\t\t\t\"group/radio relative inline-flex shrink-0 items-center justify-center rounded-full\",\n\t\t\t\t\"border border-bruv-neutral bg-bruv-base-2\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\"transition-colors duration-150 ease-out\",\n\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\"cursor-pointer\",\n\t\t\t\t\"data-[checked]:border-bruv-accent data-[checked]:bg-bruv-accent\",\n\t\t\t\t\"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n\t\t\t\t// Expanded hit area\n\t\t\t\t\"before:absolute before:inset-1/2 before:size-8 before:-translate-1/2\",\n\t\t\t\ts.radio,\n\t\t\t\t!label && className,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<BaseRadio.Indicator\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"rounded-full bg-bruv-accent-on\",\n\t\t\t\t\t// Default visible state\n\t\t\t\t\t\"scale-100 opacity-100\",\n\t\t\t\t\t// Hidden when unchecked\n\t\t\t\t\t\"data-[unchecked]:scale-0 data-[unchecked]:opacity-0\",\n\t\t\t\t\t// Transition start/end points for Base UI\n\t\t\t\t\t\"data-[starting-style]:scale-0 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\"data-[ending-style]:scale-0 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\"transition-[scale,opacity] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\ts.indicator,\n\t\t\t\t)}\n\t\t\t/>\n\t\t</BaseRadio.Root>\n\t)\n\n\tif (!label) return radio\n\n\treturn (\n\t\t<label\n\t\t\tclassName={cn(\n\t\t\t\t\"inline-flex items-center gap-2 select-none\",\n\t\t\t\t\"cursor-pointer data-[disabled]:cursor-not-allowed\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{radio}\n\t\t\t<span className={cn(\"text-bruv-primary\", s.label)}>{label}</span>\n\t\t</label>\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// RadioGroup.Card — selectable card radio item\n// ---------------------------------------------------------------------------\n\nexport interface RadioGroupCardProps {\n\t/** Unique value identifying this card */\n\treadonly value: string\n\t/** Card title */\n\treadonly title: string\n\t/** Optional description below the title */\n\treadonly description?: string\n\t/** Optional icon rendered to the left of the text */\n\treadonly icon?: ReactNode\n\t/** Disable this card */\n\treadonly disabled?: boolean\n\treadonly className?: string\n}\n\nfunction Card({\n\tvalue,\n\ttitle,\n\tdescription,\n\ticon,\n\tdisabled,\n\tclassName,\n}: RadioGroupCardProps) {\n\treturn (\n\t\t<label\n\t\t\tclassName={cn(\n\t\t\t\t\"group/card relative flex cursor-pointer items-start gap-3 rounded-bruv-lg p-3 ring-1 ring-bruv-neutral select-none\",\n\t\t\t\t\"transition-all duration-150 ease-out\",\n\t\t\t\t\"hover:bg-bruv-subtle/50\",\n\t\t\t\t\"has-[span[data-checked]]:ring-2 has-[span[data-checked]]:ring-bruv-accent has-[span[data-checked]]:bg-bruv-subtle\",\n\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t{icon && (\n\t\t\t\t<span className=\"text-bruv-secondary flex size-5 shrink-0 items-center justify-center [&>svg]:size-5\">\n\t\t\t\t\t{icon}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-1 flex-col gap-0.5\">\n\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-medium\">\n\t\t\t\t\t{title}\n\t\t\t\t</span>\n\t\t\t\t{description && (\n\t\t\t\t\t<span className=\"text-bruv-secondary text-bruv-sm\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<BaseRadio.Root\n\t\t\t\tvalue={value}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"group/radio relative mt-0.5 inline-flex size-[18px] shrink-0 items-center justify-center rounded-full\",\n\t\t\t\t\t\"border border-bruv-neutral bg-bruv-base-2\",\n\t\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\t\"transition-colors duration-150 ease-out\",\n\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\"data-[checked]:border-bruv-accent data-[checked]:bg-bruv-accent\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<BaseRadio.Indicator\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"size-2 rounded-full bg-bruv-accent-on\",\n\t\t\t\t\t\t\"scale-100 opacity-100\",\n\t\t\t\t\t\t\"data-[unchecked]:scale-0 data-[unchecked]:opacity-0\",\n\t\t\t\t\t\t\"data-[starting-style]:scale-0 data-[starting-style]:opacity-0\",\n\t\t\t\t\t\t\"data-[ending-style]:scale-0 data-[ending-style]:opacity-0\",\n\t\t\t\t\t\t\"transition-[scale,opacity] duration-150 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</BaseRadio.Root>\n\t\t</label>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const RadioGroup = { Root, Item, Card }\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\n\nexport interface SaveBarProps {\n\t/** Whether the bar is visible (typically bound to a dirty flag). */\n\tshow: boolean\n\t/** Message shown inside the pill. Defaults to \"You have unsaved changes\". */\n\tmessage?: ReactNode\n\t/** Label for the discard button. Defaults to \"Reset\". */\n\tdiscardLabel?: string\n\t/** Label for the save button. Defaults to \"Save changes\". */\n\tsaveLabel?: string\n\t/** Called when the user clicks discard. */\n\tonDiscard: () => void\n\t/** Called when the user clicks save. */\n\tonSave: () => void\n\t/** Show a loading spinner on the save button. */\n\tsaving?: boolean\n\t/** Disable the save button (e.g. validation failure). */\n\tsaveDisabled?: boolean\n\t/** Trigger a shake animation to draw attention (e.g. when navigation is blocked). */\n\tshake?: boolean\n\tclassName?: string\n}\n\n/**\n * Floating pill pinned to the bottom of the viewport.\n * Slides up when a form has unsaved changes.\n */\nexport const SaveBar = forwardRef<HTMLDivElement, SaveBarProps>(\n\tfunction SaveBar(\n\t\t{\n\t\t\tshow,\n\t\t\tmessage = \"You have unsaved changes\",\n\t\t\tdiscardLabel = \"Reset\",\n\t\t\tsaveLabel = \"Save changes\",\n\t\t\tonDiscard,\n\t\t\tonSave,\n\t\t\tsaving = false,\n\t\t\tsaveDisabled = false,\n\t\t\tshake = false,\n\t\t\tclassName,\n\t\t},\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\taria-live=\"polite\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"pointer-events-none fixed inset-x-0 bottom-0 z-50 flex justify-center pb-6\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t// Pill shape and appearance\n\t\t\t\t\t\t\"pointer-events-auto\",\n\t\t\t\t\t\t\"bg-bruv-base-2 border-bruv-neutral shadow-lg\",\n\t\t\t\t\t\t\"flex items-center gap-5 rounded-bruv-xl border py-1.5 pr-1.5 pl-3.5\",\n\t\t\t\t\t\t// Animation: slide + fade + scale\n\t\t\t\t\t\t\"transition-all duration-500 ease-bruv-out-expo\",\n\t\t\t\t\t\t\"motion-reduce:transition-none\",\n\t\t\t\t\t\tshow\n\t\t\t\t\t\t\t? \"translate-y-0 scale-100 opacity-100\"\n\t\t\t\t\t\t\t: \"pointer-events-none translate-y-4 scale-95 opacity-0\",\n\t\t\t\t\t\tshake && \"animate-bruv-shake\",\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-base font-medium\">\n\t\t\t\t\t\t{message}\n\t\t\t\t\t</span>\n\n\t\t\t\t\t<div className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t<Button variant=\"danger-light\" size=\"sm\" onClick={onDiscard}>\n\t\t\t\t\t\t\t{discardLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={onSave}\n\t\t\t\t\t\t\tloading={saving}\n\t\t\t\t\t\t\tdisabled={saveDisabled}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{saveLabel}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import { Button as BaseButton } from \"@base-ui/react/button\"\nimport { forwardRef, type ComponentProps, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nconst variantConfig = {\n\tprimary:\n\t\t\"bg-bruv-accent text-bruv-accent-on hover:bg-bruv-accent-strong active:bg-bruv-accent-strong\",\n\tsecondary:\n\t\t\"bg-bruv-base-2 text-bruv-primary ring-1 ring-bruv-neutral hover:bg-bruv-subtle active:bg-bruv-subtle\",\n\tdanger:\n\t\t\"bg-bruv-danger text-bruv-danger-on hover:bg-bruv-danger-strong active:bg-bruv-danger-strong\",\n} as const\n\nconst sizeConfig = {\n\tmd: {\n\t\tcircular: \"size-12\",\n\t\textended: \"h-12 gap-2.5 px-5\",\n\t\ticon: \"[&>svg]:size-5\",\n\t},\n\tlg: {\n\t\tcircular: \"size-14\",\n\t\textended: \"h-14 gap-3 px-6\",\n\t\ticon: \"[&>svg]:size-6\",\n\t},\n} as const\n\nconst positionConfig = {\n\t\"bottom-right\": \"bottom-6 right-6\",\n\t\"bottom-left\": \"bottom-6 left-6\",\n\t\"top-right\": \"top-6 right-6\",\n\t\"top-left\": \"top-6 left-6\",\n} as const\n\nexport type FabVariant = keyof typeof variantConfig\nexport type FabSize = keyof typeof sizeConfig\nexport type FabPosition = keyof typeof positionConfig\nexport type FabAnchor = \"viewport\" | \"container\"\n\nexport interface FabProps extends Omit<\n\tComponentProps<typeof BaseButton>,\n\t\"children\" | \"aria-label\"\n> {\n\t/**\n\t * Accessible name. Required so icon-only FABs always expose a label\n\t * to assistive tech; extended FABs should typically mirror their\n\t * `children` text.\n\t */\n\t\"aria-label\": string\n\t/** Icon element rendered inside the FAB. Required. */\n\ticon: ReactNode\n\t/** Visual style variant. */\n\tvariant?: FabVariant\n\t/** Size variant. */\n\tsize?: FabSize\n\t/** Corner of the anchoring box to pin to. */\n\tposition?: FabPosition\n\t/**\n\t * What the FAB is positioned relative to:\n\t * - `\"viewport\"` (default) — `position: fixed`, pinned to the browser\n\t * window. The natural choice for a production app.\n\t * - `\"container\"` — `position: absolute`, pinned to the nearest\n\t * positioned ancestor. Useful inside cards, drawers, or previews\n\t * where you don't want the FAB to escape its panel.\n\t */\n\tanchor?: FabAnchor\n\t/** Render as an extended pill with the icon and a label. */\n\textended?: boolean\n\t/** Label rendered beside the icon when `extended`. */\n\tchildren?: ReactNode\n\t/** Whether the FAB is visible. Triggers the scale-in animation. */\n\tshow?: boolean\n}\n\n/**\n * Floating action button anchored to a viewport corner. Use for a single\n * primary action on a screen — e.g. \"Compose\", \"Create\", \"Add\".\n *\n * Set `extended` to widen the button into a pill with both icon and label.\n */\nexport const Fab = forwardRef<HTMLElement, FabProps>(function Fab(\n\t{\n\t\ticon,\n\t\tvariant = \"primary\",\n\t\tsize = \"md\",\n\t\tposition = \"bottom-right\",\n\t\tanchor = \"viewport\",\n\t\textended = false,\n\t\tshow = true,\n\t\tdisabled,\n\t\tclassName,\n\t\tchildren,\n\t\t...props\n\t},\n\tref,\n) {\n\tconst sizes = sizeConfig[size]\n\n\treturn (\n\t\t<BaseButton\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tdisabled={disabled}\n\t\t\ttabIndex={show ? 0 : -1}\n\t\t\taria-hidden={!show}\n\t\t\tclassName={cn(\n\t\t\t\t\"z-30 inline-flex cursor-pointer items-center justify-center select-none\",\n\t\t\t\tanchor === \"viewport\" ? \"fixed\" : \"absolute\",\n\t\t\t\t\"text-bruv-base font-medium shadow-lg hover:shadow-xl\",\n\t\t\t\t\"transition-all duration-300 ease-bruv-out-expo motion-reduce:transition-none\",\n\t\t\t\t\"outline-none focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t\t\"active:scale-95\",\n\t\t\t\textended\n\t\t\t\t\t? cn(sizes.extended, \"rounded-full\")\n\t\t\t\t\t: cn(sizes.circular, \"rounded-full\"),\n\t\t\t\tsizes.icon,\n\t\t\t\tvariantConfig[variant],\n\t\t\t\tpositionConfig[position],\n\t\t\t\tshow\n\t\t\t\t\t? \"scale-100 opacity-100\"\n\t\t\t\t\t: \"pointer-events-none scale-0 opacity-0\",\n\t\t\t\tdisabled && \"pointer-events-none opacity-50\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<span\n\t\t\t\tclassName={cn(\"flex shrink-0 items-center justify-center\", sizes.icon)}\n\t\t\t>\n\t\t\t\t{icon}\n\t\t\t</span>\n\t\t\t{extended && children && <span className=\"truncate\">{children}</span>}\n\t\t</BaseButton>\n\t)\n})\n","import { forwardRef, type ReactNode } from \"react\"\nimport { cn } from \"../../lib/cn\"\n\nexport type SettingsPageMaxWidth = \"narrow\" | \"wide\"\n\nexport interface SettingsPageProps {\n\t/** Page title displayed at the top. */\n\ttitle?: ReactNode\n\t/**\n\t * Maximum content width.\n\t * - `\"narrow\"` (default): 800px — for settings forms\n\t * - `\"wide\"`: 1100px — for tables, permissions, dashboards\n\t */\n\tmaxWidth?: SettingsPageMaxWidth\n\t/** Optional leading content rendered above the title (e.g. a back button). */\n\tleading?: ReactNode\n\t/** Main page content (cards, forms, tables, etc.). */\n\tchildren: ReactNode\n\tclassName?: string\n}\n\nconst maxWidthStyles = {\n\tnarrow: \"max-w-[800px]\",\n\twide: \"max-w-[1100px]\",\n} as const\n\n/**\n * Content shell for settings pages.\n *\n * Centers content with a max-width constraint, provides consistent\n * vertical spacing, and renders an optional page title. Designed\n * to sit inside a `PageLayout` content area.\n *\n * ```tsx\n * <SettingsPage title=\"General\">\n * <SettingsCard title=\"Basic settings\">\n * ...\n * </SettingsCard>\n * </SettingsPage>\n * ```\n */\nexport const SettingsPage = forwardRef<HTMLDivElement, SettingsPageProps>(\n\tfunction SettingsPage(\n\t\t{ title, maxWidth = \"narrow\", leading, children, className },\n\t\tref,\n\t) {\n\t\treturn (\n\t\t\t<div ref={ref} className=\"flex flex-1 flex-col items-center gap-6 py-6\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"flex w-full flex-col gap-6 px-8\",\n\t\t\t\t\t\tmaxWidthStyles[maxWidth],\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{leading}\n\t\t\t\t\t{title && (\n\t\t\t\t\t\t<span className=\"text-bruv-primary text-bruv-lg font-semibold\">\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t)\n\t},\n)\n","import {\n\tCheckCircleIcon,\n\tExclamationTriangleIcon,\n\tInformationCircleIcon,\n\tXCircleIcon,\n\tXMarkIcon,\n} from \"@heroicons/react/16/solid\"\nimport {\n\tforwardRef,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n\ttype ReactNode,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { cn } from \"../../lib/cn\"\nimport { Button } from \"../button\"\nimport { FlickeringGrid } from \"../flickering-grid\"\nimport { Spinner } from \"../spinner\"\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst TOAST_LIFETIME = 4000\nconst TIME_BEFORE_UNMOUNT = 200\nconst VISIBLE_TOASTS_AMOUNT = 3\nconst GAP = 8\nconst TOAST_WIDTH = 356\nconst VIEWPORT_OFFSET = 24\nconst SWIPE_THRESHOLD = 45\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ToastVariant = \"default\" | \"success\" | \"danger\" | \"warn\" | \"accent\"\nexport type ToastPosition =\n\t| \"top-left\"\n\t| \"top-right\"\n\t| \"top-center\"\n\t| \"bottom-left\"\n\t| \"bottom-right\"\n\t| \"bottom-center\"\n\nexport interface ToastData {\n\treadonly id: string | number\n\treadonly title?: ReactNode\n\treadonly description?: ReactNode\n\treadonly variant?: ToastVariant\n\treadonly action?: ReactNode\n\treadonly duration?: number\n\treadonly dismissible?: boolean\n\treadonly position?: ToastPosition\n\treadonly onDismiss?: () => void\n\treadonly onAutoClose?: () => void\n\t/** @internal */\n\treadonly delete?: boolean\n\t/** @internal Promise state tracking */\n\treadonly promiseState?: \"loading\" | \"success\" | \"error\"\n}\n\ninterface HeightEntry {\n\treadonly toastId: string | number\n\treadonly height: number\n}\n\n// ---------------------------------------------------------------------------\n// Variant config\n// ---------------------------------------------------------------------------\n\nconst variantConfig = {\n\tdefault: {\n\t\tcontainer: \"bg-bruv-base-2 border-bruv-neutral border\",\n\t\ticon: \"text-bruv-secondary\",\n\t\ttext: \"text-bruv-primary\",\n\t\tdescription: \"text-bruv-secondary\",\n\t\tpattern: \"text-bruv-tertiary\",\n\t\tdefaultIcon: null,\n\t},\n\tsuccess: {\n\t\tcontainer: \"bg-bruv-success-subtle border border-bruv-success/20\",\n\t\ticon: \"text-bruv-success\",\n\t\ttext: \"text-bruv-success\",\n\t\tdescription: \"text-bruv-success\",\n\t\tpattern: \"text-bruv-success\",\n\t\tdefaultIcon: CheckCircleIcon,\n\t},\n\tdanger: {\n\t\tcontainer: \"bg-bruv-danger-subtle border border-bruv-danger/20\",\n\t\ticon: \"text-bruv-danger\",\n\t\ttext: \"text-bruv-danger\",\n\t\tdescription: \"text-bruv-danger\",\n\t\tpattern: \"text-bruv-danger\",\n\t\tdefaultIcon: XCircleIcon,\n\t},\n\twarn: {\n\t\tcontainer: \"bg-bruv-warn-subtle border border-bruv-warn/20\",\n\t\ticon: \"text-bruv-warn\",\n\t\ttext: \"text-bruv-warn\",\n\t\tdescription: \"text-bruv-warn\",\n\t\tpattern: \"text-bruv-warn\",\n\t\tdefaultIcon: ExclamationTriangleIcon,\n\t},\n\taccent: {\n\t\tcontainer: \"bg-bruv-accent-subtle border border-bruv-accent/20\",\n\t\ticon: \"text-bruv-accent\",\n\t\ttext: \"text-bruv-accent\",\n\t\tdescription: \"text-bruv-accent\",\n\t\tpattern: \"text-bruv-accent\",\n\t\tdefaultIcon: InformationCircleIcon,\n\t},\n} as const\n\n// ---------------------------------------------------------------------------\n// State — Singleton observer (works outside React)\n// ---------------------------------------------------------------------------\n\ntype Subscriber = (toast: ToastData) => void\n\nlet toastCounter = 0\n\nclass ToastObserver {\n\tprivate subscribers: Subscriber[] = []\n\tprivate toasts: ToastData[] = []\n\n\tsubscribe(subscriber: Subscriber): () => void {\n\t\tthis.subscribers.push(subscriber)\n\t\treturn () => {\n\t\t\tconst index = this.subscribers.indexOf(subscriber)\n\t\t\tif (index > -1) this.subscribers.splice(index, 1)\n\t\t}\n\t}\n\n\tprivate publish(data: ToastData): void {\n\t\tfor (const subscriber of this.subscribers) {\n\t\t\tsubscriber(data)\n\t\t}\n\t}\n\n\tcreate(data: ToastData): string | number {\n\t\tconst existing = this.toasts.find(t => t.id === data.id)\n\t\tif (existing) {\n\t\t\t// Update in place (used by promise toasts)\n\t\t\tthis.toasts = this.toasts.map(t =>\n\t\t\t\tt.id === data.id ? { ...t, ...data } : t,\n\t\t\t)\n\t\t\tthis.publish({ ...existing, ...data })\n\t\t} else {\n\t\t\tthis.toasts = [data, ...this.toasts]\n\t\t\tthis.publish(data)\n\t\t}\n\t\treturn data.id\n\t}\n\n\tdismiss(id?: string | number): void {\n\t\tif (id === undefined) {\n\t\t\t// Dismiss all\n\t\t\tfor (const t of this.toasts) {\n\t\t\t\tthis.publish({ ...t, delete: true })\n\t\t\t}\n\t\t\tthis.toasts = []\n\t\t} else {\n\t\t\tconst toast = this.toasts.find(t => t.id === id)\n\t\t\tif (toast) {\n\t\t\t\tthis.publish({ ...toast, delete: true })\n\t\t\t\tthis.toasts = this.toasts.filter(t => t.id !== id)\n\t\t\t}\n\t\t}\n\t}\n}\n\nconst toastState = new ToastObserver()\n\nfunction createToast(\n\tmessage: ReactNode,\n\tvariant: ToastVariant,\n\toptions?: Partial<ToastData>,\n): string | number {\n\tconst id = options?.id ?? ++toastCounter\n\treturn toastState.create({\n\t\t...options,\n\t\tid,\n\t\ttitle: message,\n\t\tvariant,\n\t})\n}\n\n// ---------------------------------------------------------------------------\n// Public imperative API\n// ---------------------------------------------------------------------------\n\nexport interface ExternalToastOptions extends Partial<\n\tOmit<ToastData, \"id\" | \"title\" | \"variant\" | \"promiseState\">\n> {\n\tid?: string | number\n}\n\nexport interface PromiseData<T = unknown> {\n\treadonly loading: ReactNode\n\treadonly success: ReactNode | ((data: T) => ReactNode)\n\treadonly error: ReactNode | ((error: unknown) => ReactNode)\n\treadonly description?: ReactNode | ((data: T) => ReactNode)\n\treadonly finally?: () => void\n}\n\nfunction toastFn(message: ReactNode, options?: ExternalToastOptions) {\n\treturn createToast(message, \"default\", options)\n}\n\n/**\n * Imperative toast API. Call from anywhere — no hooks required.\n *\n * ```ts\n * toast(\"Hello\")\n * toast.success(\"Saved!\")\n * toast.error(\"Failed\", { description: \"Check your connection\" })\n * toast.promise(asyncFn, { loading: \"...\", success: \"...\", error: \"...\" })\n * toast.dismiss(id)\n * ```\n */\nexport const toast = Object.assign(toastFn, {\n\tsuccess(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"success\", options)\n\t},\n\terror(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"danger\", options)\n\t},\n\twarning(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"warn\", options)\n\t},\n\tinfo(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"accent\", options)\n\t},\n\tloading(message: ReactNode, options?: ExternalToastOptions) {\n\t\treturn createToast(message, \"default\", {\n\t\t\t...options,\n\t\t\tduration: Infinity,\n\t\t\tpromiseState: \"loading\",\n\t\t})\n\t},\n\tpromise<T>(\n\t\tpromise: Promise<T> | (() => Promise<T>),\n\t\tdata: PromiseData<T>,\n\t\toptions?: ExternalToastOptions,\n\t): string | number {\n\t\tconst id = options?.id ?? ++toastCounter\n\t\ttoastState.create({\n\t\t\t...options,\n\t\t\tid,\n\t\t\ttitle: data.loading,\n\t\t\tvariant: \"default\",\n\t\t\tduration: Infinity,\n\t\t\tpromiseState: \"loading\",\n\t\t})\n\n\t\tconst p = promise instanceof Function ? promise() : promise\n\n\t\tp.then(response => {\n\t\t\tconst title =\n\t\t\t\ttypeof data.success === \"function\"\n\t\t\t\t\t? data.success(response)\n\t\t\t\t\t: data.success\n\t\t\tconst description =\n\t\t\t\ttypeof data.description === \"function\"\n\t\t\t\t\t? data.description(response)\n\t\t\t\t\t: data.description\n\t\t\ttoastState.create({\n\t\t\t\t...options,\n\t\t\t\tid,\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tvariant: \"success\",\n\t\t\t\tduration: options?.duration ?? TOAST_LIFETIME,\n\t\t\t\tpromiseState: \"success\",\n\t\t\t})\n\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconst title =\n\t\t\t\t\ttypeof data.error === \"function\" ? data.error(error) : data.error\n\t\t\t\ttoastState.create({\n\t\t\t\t\t...options,\n\t\t\t\t\tid,\n\t\t\t\t\ttitle,\n\t\t\t\t\t// Only use static description on error — function form expects resolved data\n\t\t\t\t\tdescription:\n\t\t\t\t\t\ttypeof data.description === \"function\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: data.description,\n\t\t\t\t\tvariant: \"danger\",\n\t\t\t\t\tduration: options?.duration ?? TOAST_LIFETIME,\n\t\t\t\t\tpromiseState: \"error\",\n\t\t\t\t})\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tdata.finally?.()\n\t\t\t})\n\n\t\treturn id\n\t},\n\tdismiss(id?: string | number) {\n\t\ttoastState.dismiss(id)\n\t},\n})\n\n// ---------------------------------------------------------------------------\n// useIsDocumentHidden\n// ---------------------------------------------------------------------------\n\nfunction useIsDocumentHidden(): boolean {\n\tconst [hidden, setHidden] = useState(false)\n\n\tuseEffect(() => {\n\t\tconst handler = () => setHidden(document.hidden)\n\t\tdocument.addEventListener(\"visibilitychange\", handler)\n\t\treturn () => document.removeEventListener(\"visibilitychange\", handler)\n\t}, [])\n\n\treturn hidden\n}\n\n// ---------------------------------------------------------------------------\n// Individual Toast item\n// ---------------------------------------------------------------------------\n\ninterface ToastItemProps {\n\treadonly toast: ToastData\n\treadonly index: number\n\treadonly expanded: boolean\n\treadonly heights: readonly HeightEntry[]\n\treadonly setHeights: React.Dispatch<React.SetStateAction<HeightEntry[]>>\n\treadonly position: ToastPosition\n\treadonly defaultDuration: number\n\treadonly closeButton: boolean\n\treadonly visibleToasts: number\n\treadonly gap: number\n\treadonly onRemove: (id: string | number) => void\n\treadonly toastCount: number\n}\n\nfunction ToastItem({\n\ttoast: t,\n\tindex,\n\texpanded,\n\theights,\n\tsetHeights,\n\tposition,\n\tdefaultDuration,\n\tcloseButton,\n\tvisibleToasts,\n\tgap,\n\tonRemove,\n\ttoastCount,\n}: ToastItemProps) {\n\tconst ref = useRef<HTMLLIElement>(null)\n\tconst [mounted, setMounted] = useState(false)\n\tconst [removed, setRemoved] = useState(false)\n\tconst [swiping, setSwiping] = useState(false)\n\tconst [swipeOut, setSwipeOut] = useState(false)\n\tconst [offsetBeforeRemove, setOffsetBeforeRemove] = useState(0)\n\n\t// Swipe state\n\tconst pointerStartRef = useRef<{ x: number; y: number } | null>(null)\n\tconst swipeAmountRef = useRef(0)\n\tconst dragStartTimeRef = useRef<Date | null>(null)\n\n\t// Timer state\n\tconst remainingTime = useRef(t.duration ?? defaultDuration ?? TOAST_LIFETIME)\n\tconst closeTimerStartRef = useRef(0)\n\tconst lastCloseTimerStartRef = useRef(0)\n\tconst isDocumentHidden = useIsDocumentHidden()\n\n\tconst isFront = index === 0\n\tconst isVisible = index < visibleToasts\n\tconst variant = t.variant ?? \"default\"\n\tconst config = variantConfig[variant]\n\tconst DefaultIcon = config.defaultIcon\n\tconst dismissible = t.dismissible !== false\n\n\tconst [y, x] = position.split(\"-\") as [\"top\" | \"bottom\", string]\n\tconst isTop = y === \"top\"\n\n\t// ── Mount animation ──\n\tuseEffect(() => {\n\t\tsetMounted(true)\n\t}, [])\n\n\t// ── Height tracking ──\n\tuseLayoutEffect(() => {\n\t\tconst node = ref.current\n\t\tif (!node) return\n\n\t\tconst height = node.getBoundingClientRect().height\n\t\tsetHeights(prev => [\n\t\t\t{ toastId: t.id, height },\n\t\t\t...prev.filter(h => h.toastId !== t.id),\n\t\t])\n\n\t\treturn () => {\n\t\t\tsetHeights(prev => prev.filter(h => h.toastId !== t.id))\n\t\t}\n\t}, [t.id, setHeights])\n\n\t// Re-measure on content change\n\tuseLayoutEffect(() => {\n\t\tif (!mounted) return\n\t\tconst node = ref.current\n\t\tif (!node) return\n\n\t\tconst original = node.style.height\n\t\tnode.style.height = \"auto\"\n\t\tconst newHeight = node.getBoundingClientRect().height\n\t\tnode.style.height = original\n\n\t\tsetHeights(prev => {\n\t\t\tconst exists = prev.find(h => h.toastId === t.id)\n\t\t\tif (!exists) {\n\t\t\t\treturn [{ toastId: t.id, height: newHeight }, ...prev]\n\t\t\t}\n\t\t\treturn prev.map(h =>\n\t\t\t\th.toastId === t.id ? { ...h, height: newHeight } : h,\n\t\t\t)\n\t\t})\n\t}, [mounted, t.title, t.description, t.action, t.id, setHeights])\n\n\t// ── Offset calculation ──\n\tconst heightIndex = useMemo(() => {\n\t\tconst idx = heights.findIndex(h => h.toastId === t.id)\n\t\treturn idx < 0 ? 0 : idx\n\t}, [heights, t.id])\n\n\tconst toastsHeightBefore = useMemo(() => {\n\t\treturn heights.reduce((acc, curr, i) => {\n\t\t\tif (i >= heightIndex) return acc\n\t\t\treturn acc + curr.height\n\t\t}, 0)\n\t}, [heights, heightIndex])\n\n\tconst offset = useMemo(\n\t\t() => heightIndex * gap + toastsHeightBefore,\n\t\t[heightIndex, gap, toastsHeightBefore],\n\t)\n\n\t// ── Auto-dismiss timer ──\n\tuseEffect(() => {\n\t\tif (t.promiseState === \"loading\") return\n\t\tif (t.duration === Infinity) return\n\n\t\tlet timeoutId: ReturnType<typeof setTimeout>\n\n\t\tconst pauseTimer = () => {\n\t\t\tif (lastCloseTimerStartRef.current < closeTimerStartRef.current) {\n\t\t\t\tconst elapsed = Date.now() - closeTimerStartRef.current\n\t\t\t\tremainingTime.current = remainingTime.current - elapsed\n\t\t\t}\n\t\t\tlastCloseTimerStartRef.current = Date.now()\n\t\t}\n\n\t\tconst startTimer = () => {\n\t\t\tif (remainingTime.current === Infinity) return\n\t\t\tcloseTimerStartRef.current = Date.now()\n\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\tt.onAutoClose?.()\n\t\t\t\tdeleteToast()\n\t\t\t}, remainingTime.current)\n\t\t}\n\n\t\tif (expanded || isDocumentHidden) {\n\t\t\tpauseTimer()\n\t\t} else {\n\t\t\tstartTimer()\n\t\t}\n\n\t\treturn () => clearTimeout(timeoutId)\n\t}, [expanded, isDocumentHidden, t.promiseState]) // eslint-disable-line react-hooks/exhaustive-deps -- deleteToast uses a ref for offset; remaining timer state is intentionally ref-based to avoid restarting on every render\n\n\t// Reset timer when promise resolves/rejects\n\tuseEffect(() => {\n\t\tif (t.promiseState === \"success\" || t.promiseState === \"error\") {\n\t\t\tremainingTime.current = t.duration ?? defaultDuration ?? TOAST_LIFETIME\n\t\t\tcloseTimerStartRef.current = 0\n\t\t\tlastCloseTimerStartRef.current = 0\n\t\t}\n\t}, [t.promiseState, t.duration, defaultDuration])\n\n\t// ── Dismiss logic ──\n\tconst offsetRef = useRef(offset)\n\toffsetRef.current = offset\n\n\tconst deleteToast = useCallback(() => {\n\t\tsetRemoved(true)\n\t\tsetOffsetBeforeRemove(offsetRef.current)\n\t\tsetTimeout(() => {\n\t\t\tt.onDismiss?.()\n\t\t\tonRemove(t.id)\n\t\t}, TIME_BEFORE_UNMOUNT)\n\t}, [t.onDismiss, t.id, onRemove])\n\n\t// Handle external dismiss\n\tuseEffect(() => {\n\t\tif (t.delete) {\n\t\t\tdeleteToast()\n\t\t}\n\t}, [t.delete]) // eslint-disable-line react-hooks/exhaustive-deps -- deleteToast is stable via useCallback with ref-based offset; adding it would cause unnecessary re-fires\n\n\t// ── Swipe handlers ──\n\tconst onPointerDown = (event: React.PointerEvent) => {\n\t\tif (event.button === 2) return // ignore right-click\n\t\tif (!dismissible) return\n\t\tdragStartTimeRef.current = new Date()\n\t\tsetOffsetBeforeRemove(offset)\n\t\t;(event.target as HTMLElement).setPointerCapture(event.pointerId)\n\t\tif ((event.target as HTMLElement).tagName === \"BUTTON\") return\n\t\tsetSwiping(true)\n\t\tpointerStartRef.current = { x: event.clientX, y: event.clientY }\n\t}\n\n\tconst onPointerMove = (event: React.PointerEvent) => {\n\t\tif (!pointerStartRef.current || !swiping) return\n\n\t\tconst xDelta = event.clientX - pointerStartRef.current.x\n\t\tconst yDelta = event.clientY - pointerStartRef.current.y\n\n\t\t// Only allow horizontal swipe\n\t\tconst isHorizontal = Math.abs(xDelta) > Math.abs(yDelta)\n\t\tif (!isHorizontal && Math.abs(yDelta) > 2) {\n\t\t\tsetSwiping(false)\n\t\t\treturn\n\t\t}\n\n\t\tswipeAmountRef.current = xDelta\n\t\tif (ref.current) {\n\t\t\tref.current.style.setProperty(\"--swipe-amount\", `${xDelta}px`)\n\t\t}\n\t}\n\n\tconst onPointerUp = () => {\n\t\tif (!swiping || !pointerStartRef.current) return\n\n\t\tconst swipeAmount = swipeAmountRef.current\n\t\tconst timeTaken = dragStartTimeRef.current\n\t\t\t? new Date().getTime() - dragStartTimeRef.current.getTime()\n\t\t\t: 0\n\t\tconst velocity = Math.abs(swipeAmount) / timeTaken\n\n\t\tif (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n\t\t\tsetSwipeOut(true)\n\t\t\tsetOffsetBeforeRemove(offset)\n\t\t\tsetTimeout(() => {\n\t\t\t\tdeleteToast()\n\t\t\t}, TIME_BEFORE_UNMOUNT)\n\t\t} else {\n\t\t\tif (ref.current) {\n\t\t\t\tref.current.style.setProperty(\"--swipe-amount\", \"0px\")\n\t\t\t}\n\t\t}\n\n\t\tsetSwiping(false)\n\t\tpointerStartRef.current = null\n\t\tswipeAmountRef.current = 0\n\t}\n\n\t// ── Styles ──\n\tconst initialHeight = heights.find(h => h.toastId === t.id)?.height ?? 0\n\n\tconst style: React.CSSProperties = {\n\t\t\"--index\": index,\n\t\t\"--toasts-before\": index,\n\t\t\"--z-index\": toastCount - index,\n\t\t\"--offset\": `${removed ? offsetBeforeRemove : offset}px`,\n\t\t\"--initial-height\": `${initialHeight}px`,\n\t\t\"--swipe-amount\": \"0px\",\n\t} as React.CSSProperties\n\n\tconst isLoading = t.promiseState === \"loading\"\n\n\treturn (\n\t\t<li\n\t\t\tref={ref}\n\t\t\trole=\"status\"\n\t\t\taria-live=\"off\"\n\t\t\taria-atomic=\"true\"\n\t\t\ttabIndex={0}\n\t\t\tdata-mounted={mounted}\n\t\t\tdata-removed={removed}\n\t\t\tdata-expanded={expanded}\n\t\t\tdata-front={isFront}\n\t\t\tdata-visible={isVisible}\n\t\t\tdata-swiping={swiping}\n\t\t\tdata-swipe-out={swipeOut}\n\t\t\tdata-y-position={y}\n\t\t\tdata-promise-state={t.promiseState}\n\t\t\tstyle={style}\n\t\t\tclassName={cn(\n\t\t\t\t// Base layout\n\t\t\t\t\"bruv-toast\",\n\t\t\t\t\"pointer-events-auto absolute w-[var(--toast-width)] outline-none\",\n\t\t\t\t\"rounded-bruv-md shadow-lg\",\n\t\t\t\t\"transition-[background-color,border-color] duration-300\",\n\t\t\t\tconfig.container,\n\t\t\t\t// Positioning\n\t\t\t\tisTop ? \"top-0\" : \"bottom-0\",\n\t\t\t\tx === \"right\" && \"right-0\",\n\t\t\t\tx === \"left\" && \"left-0\",\n\t\t\t\tx === \"center\" && \"left-1/2 -translate-x-1/2\",\n\t\t\t\t// Focus\n\t\t\t\t\"focus-visible:ring-2 focus-visible:ring-bruv-focus focus-visible:ring-offset-2\",\n\t\t\t)}\n\t\t\tonPointerDown={onPointerDown}\n\t\t\tonPointerMove={onPointerMove}\n\t\t\tonPointerUp={onPointerUp}\n\t\t>\n\t\t\t{/* Inner shell — clips the FlickeringGrid, preserves rounded corners */}\n\t\t\t<div className=\"relative overflow-hidden rounded-[inherit]\">\n\t\t\t\t{/* Pixel grid pattern — right half, fades toward the left */}\n\t\t\t\t{variant !== \"default\" && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"pointer-events-none absolute top-0 right-0 h-full w-1/2\",\n\t\t\t\t\t\t\tconfig.pattern,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tmaskImage: \"linear-gradient(to left, black, transparent)\",\n\t\t\t\t\t\t\tWebkitMaskImage: \"linear-gradient(to left, black, transparent)\",\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<FlickeringGrid\n\t\t\t\t\t\t\tsquareSize={4}\n\t\t\t\t\t\t\tgridGap={2}\n\t\t\t\t\t\t\tflickerChance={0.4}\n\t\t\t\t\t\t\tmaxOpacity={0.2}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"relative flex flex-col gap-1 py-1.5 pr-1.5 pl-3\">\n\t\t\t\t\t{/* Top row: icon + title + action/close — all centered */}\n\t\t\t\t\t<div className=\"flex min-h-7 items-center gap-3\">\n\t\t\t\t\t\t{(DefaultIcon || isLoading) && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"bruv-toast-icon flex size-5 shrink-0 items-center justify-center [&>svg]:size-4\",\n\t\t\t\t\t\t\t\t\t\"transition-colors duration-300\",\n\t\t\t\t\t\t\t\t\tconfig.icon,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t<Spinner showDots={false} size=\"sm\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\tDefaultIcon && <DefaultIcon />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{t.title && (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\"min-w-0 flex-1 text-bruv-base font-medium\",\n\t\t\t\t\t\t\t\t\tconfig.text,\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{t.title}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Action / Close */}\n\t\t\t\t\t\t<div className=\"flex shrink-0 items-center gap-1\">\n\t\t\t\t\t\t\t{t.action}\n\t\t\t\t\t\t\t{closeButton && dismissible && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"transparent\"\n\t\t\t\t\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\t\t\t\t\ticonLeft={<XMarkIcon />}\n\t\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\t\t\t\t\tdeleteToast()\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\taria-label=\"Close toast\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Description — below the top row, indented to align with title */}\n\t\t\t\t\t{t.description && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\"text-bruv-base pb-1\",\n\t\t\t\t\t\t\t\tDefaultIcon || isLoading ? \"pl-8\" : \"\",\n\t\t\t\t\t\t\t\tconfig.description,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{t.description}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</li>\n\t)\n}\n\n// ---------------------------------------------------------------------------\n// Toaster (Provider) — renders the toast viewport\n// ---------------------------------------------------------------------------\n\nexport interface ToasterProps {\n\t/** Position of the toast stack. Default: `\"bottom-right\"` */\n\tposition?: ToastPosition\n\t/** Default duration in ms. Default: `4000` */\n\tduration?: number\n\t/** Show close button on each toast. Default: `true` */\n\tcloseButton?: boolean\n\t/** Maximum number of visible toasts. Default: `3` */\n\tvisibleToasts?: number\n\t/** Gap between expanded toasts in px. Default: `14` */\n\tgap?: number\n\t/** Distance from viewport edge in px. Default: `24` */\n\toffset?: number\n\t/** Width of each toast in px. Default: `356` */\n\twidth?: number\n\t/** Additional className for the toaster container */\n\tclassName?: string\n}\n\nexport const Toaster = forwardRef<HTMLElement, ToasterProps>(function Toaster(\n\t{\n\t\tposition = \"bottom-right\",\n\t\tduration = TOAST_LIFETIME,\n\t\tcloseButton = true,\n\t\tvisibleToasts = VISIBLE_TOASTS_AMOUNT,\n\t\tgap = GAP,\n\t\toffset: viewportOffset = VIEWPORT_OFFSET,\n\t\twidth = TOAST_WIDTH,\n\t\tclassName,\n\t},\n\tref,\n) {\n\tconst [toasts, setToasts] = useState<ToastData[]>([])\n\tconst [heights, setHeights] = useState<HeightEntry[]>([])\n\tconst [expanded, setExpanded] = useState(false)\n\tconst interactingRef = useRef(false)\n\tconst listRef = useRef<HTMLOListElement>(null)\n\tconst lastFocusedRef = useRef<HTMLElement | null>(null)\n\tconst isFocusWithinRef = useRef(false)\n\n\tconst [y, x] = position.split(\"-\") as [string, string]\n\n\t// ── Subscribe to toast state ──\n\tuseEffect(() => {\n\t\treturn toastState.subscribe(incoming => {\n\t\t\tif (incoming.delete) {\n\t\t\t\tsetToasts(prev =>\n\t\t\t\t\tprev.map(t => (t.id === incoming.id ? { ...t, delete: true } : t)),\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tsetToasts(prev => {\n\t\t\t\tconst existingIndex = prev.findIndex(t => t.id === incoming.id)\n\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\tconst updated = [...prev]\n\t\t\t\t\tupdated[existingIndex] = {\n\t\t\t\t\t\t...prev[existingIndex],\n\t\t\t\t\t\t...incoming,\n\t\t\t\t\t}\n\t\t\t\t\treturn updated\n\t\t\t\t}\n\t\t\t\treturn [incoming, ...prev]\n\t\t\t})\n\t\t})\n\t}, [])\n\n\tconst removeToast = useCallback((id: string | number) => {\n\t\tsetToasts(prev => prev.filter(t => t.id !== id))\n\t\tsetHeights(prev => prev.filter(h => h.toastId !== id))\n\t}, [])\n\n\t// ── Focus management ──\n\tconst onFocus = useCallback((event: React.FocusEvent) => {\n\t\tif (!isFocusWithinRef.current) {\n\t\t\tisFocusWithinRef.current = true\n\t\t\tlastFocusedRef.current = event.relatedTarget as HTMLElement | null\n\t\t}\n\t}, [])\n\n\tconst onBlur = useCallback((event: React.FocusEvent) => {\n\t\tif (\n\t\t\tisFocusWithinRef.current &&\n\t\t\t!event.currentTarget.contains(event.relatedTarget)\n\t\t) {\n\t\t\tisFocusWithinRef.current = false\n\t\t\tif (lastFocusedRef.current) {\n\t\t\t\tlastFocusedRef.current.focus({ preventScroll: true })\n\t\t\t\tlastFocusedRef.current = null\n\t\t\t}\n\t\t}\n\t}, [])\n\n\tif (toasts.length === 0) return null\n\n\treturn createPortal(\n\t\t<section\n\t\t\tref={ref}\n\t\t\taria-label=\"Notifications\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-relevant=\"additions text\"\n\t\t\taria-atomic=\"false\"\n\t\t\ttabIndex={-1}\n\t\t>\n\t\t\t<ol\n\t\t\t\tref={listRef}\n\t\t\t\tdata-sonner-toaster=\"\"\n\t\t\t\tdata-y-position={y}\n\t\t\t\tdata-x-position={x}\n\t\t\t\tclassName={cn(\"bruv-toaster\", className)}\n\t\t\t\tstyle={\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tposition: \"fixed\",\n\t\t\t\t\t\t\tzIndex: 999999999,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\t\"--toast-width\": `${width}px`,\n\t\t\t\t\t\t\t\"--gap\": `${gap}px`,\n\t\t\t\t\t\t\t\"--front-toast-height\": `${heights[0]?.height ?? 0}px`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ty === \"top\" ? { top: viewportOffset } : { bottom: viewportOffset },\n\t\t\t\t\t\tx === \"right\" && { right: viewportOffset },\n\t\t\t\t\t\tx === \"left\" && { left: viewportOffset },\n\t\t\t\t\t\tx === \"center\" && {\n\t\t\t\t\t\t\tleft: \"50%\",\n\t\t\t\t\t\t\ttransform: \"translateX(-50%)\",\n\t\t\t\t\t\t},\n\t\t\t\t\t) as React.CSSProperties\n\t\t\t\t}\n\t\t\t\tonMouseEnter={() => setExpanded(true)}\n\t\t\t\tonMouseMove={() => setExpanded(true)}\n\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\tif (!interactingRef.current) {\n\t\t\t\t\t\tsetExpanded(false)\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\tonPointerDown={() => {\n\t\t\t\t\tinteractingRef.current = true\n\t\t\t\t}}\n\t\t\t\tonPointerUp={() => {\n\t\t\t\t\tinteractingRef.current = false\n\t\t\t\t}}\n\t\t\t\tonFocus={onFocus}\n\t\t\t\tonBlur={onBlur}\n\t\t\t>\n\t\t\t\t{toasts.map((t, index) => (\n\t\t\t\t\t<ToastItem\n\t\t\t\t\t\tkey={t.id}\n\t\t\t\t\t\ttoast={t}\n\t\t\t\t\t\tindex={index}\n\t\t\t\t\t\texpanded={expanded}\n\t\t\t\t\t\theights={heights}\n\t\t\t\t\t\tsetHeights={setHeights}\n\t\t\t\t\t\tposition={position}\n\t\t\t\t\t\tdefaultDuration={duration}\n\t\t\t\t\t\tcloseButton={closeButton}\n\t\t\t\t\t\tvisibleToasts={visibleToasts}\n\t\t\t\t\t\tgap={gap}\n\t\t\t\t\t\tonRemove={removeToast}\n\t\t\t\t\t\ttoastCount={toasts.length}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</ol>\n\t\t</section>,\n\t\tdocument.body,\n\t)\n})\n\n// ---------------------------------------------------------------------------\n// Compound export\n// ---------------------------------------------------------------------------\n\nexport const Toast = {\n\tProvider: Toaster,\n}\n","import { useCallback, useMemo, useState } from \"react\"\n\n/**\n * Return type for `useDirtyState`.\n *\n * Provides a draft/saved state pair with helpers for detecting changes,\n * updating individual fields, discarding edits, and persisting them.\n */\nexport interface DirtyState<T extends object> {\n\t/** The current in-flight draft (may differ from saved). */\n\treadonly draft: T\n\t/** The last-saved snapshot. */\n\treadonly saved: T\n\t/** `true` when draft differs from saved. */\n\treadonly dirty: boolean\n\t/** Replace the entire draft. */\n\treadonly setDraft: React.Dispatch<React.SetStateAction<T>>\n\t/** Update a single field on the draft. */\n\treadonly update: <K extends keyof T>(key: K, value: T[K]) => void\n\t/** Reset draft back to the saved snapshot. */\n\treadonly discard: () => void\n\t/** Promote the current draft to saved (optimistic save). */\n\treadonly save: () => void\n}\n\n/**\n * Manages a draft / saved state pair with built-in dirty detection.\n *\n * Replaces the repeated pattern across settings pages of:\n * ```ts\n * const [saved, setSaved] = useState(initial)\n * const [draft, setDraft] = useState(initial)\n * const dirty = JSON.stringify(draft) !== JSON.stringify(saved)\n * const update = (key, value) => setDraft(prev => ({ ...prev, [key]: value }))\n * ```\n *\n * @param initial – The starting state for both draft and saved.\n */\nexport function useDirtyState<T extends object>(initial: T): DirtyState<T> {\n\tconst [saved, setSaved] = useState<T>(initial)\n\tconst [draft, setDraft] = useState<T>(initial)\n\n\tconst dirty = useMemo(\n\t\t() => JSON.stringify(draft) !== JSON.stringify(saved),\n\t\t[draft, saved],\n\t)\n\n\tconst update = useCallback(<K extends keyof T>(key: K, value: T[K]) => {\n\t\tsetDraft(prev => ({ ...prev, [key]: value }))\n\t}, [])\n\n\tconst discard = useCallback(() => {\n\t\tsetDraft(saved)\n\t}, [saved])\n\n\tconst save = useCallback(() => {\n\t\tsetSaved(draft)\n\t}, [draft])\n\n\treturn { draft, saved, dirty, setDraft, update, discard, save }\n}\n"],"mappings":"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","names":["Input","Textarea","Label","forwardRef","jsx","forwardRef","CollapsibleTrigger","CollapsiblePanel","ChevronUpDownIcon","jsx","jsxs","forwardRef","useState","forwardRef","forwardRef","jsx","jsx","jsxs","forwardRef","Spinner","jsx","jsxs","forwardRef","Button","forwardRef","jsx","jsxs","forwardRef","MenuPanel","MenuItem","MenuItemIndicator","MenuList","MenuSeparator","MenuGroupLabel","MenuPositioner","MenuSearchInput","MenuEmpty","jsx","jsxs","useState","forwardRef","ComboboxTrigger","ComboboxButton","ComboboxOption","ComboboxGroup","ComboboxGroupLabel","ComboboxSeparator","jsx","jsxs","ChevronUpDownIcon","forwardRef","jsx","sizeStyles","forwardRef","Toggle","forwardRef","CheckIcon","jsx","jsxs","sizeStyles","forwardRef","Checkbox","CheckIcon","forwardRef","useState","jsx","jsxs","sizeStyles","forwardRef","ColorPicker","useState","forwardRef","jsx","forwardRef","CardContent","CardHeader","CardBody","CardSection","Card","jsx","jsxs","sizeStyles","forwardRef","forwardRef","useMemo","jsx","jsxs","sizeStyles","variantStyles","cells","hash","bit","forwardRef","GenerativeFallback","useMemo","Avatar","Fragment","jsx","jsxs","DefaultLink","Separator","forwardRef","AppHeaderActions","AppHeader","forwardRef","useLayoutEffect","useRef","useState","forwardRef","jsx","forwardRef","TooltipTrigger","TooltipViewport","jsx","jsxs","forwardRef","SettingsCard","useState","SettingsRowRoot","SettingsRowHeader","SettingsRowLabel","SettingsRowDescription","useRef","useLayoutEffect","SettingsRowControl","SettingsRowAction","SettingsRowContent","forwardRef","jsx","jsxs","forwardRef","PageLayoutHeader","PageLayoutBody","PageLayout","forwardRef","useCallback","useEffect","useMemo","useState","XMarkIcon","forwardRef","jsx","jsxs","forwardRef","DrawerTrigger","DrawerBackdrop","DrawerHeader","DrawerTitle","DrawerDescription","DrawerBody","DrawerFooter","DrawerClose","forwardRef","useRef","jsx","useRef","jsx","forwardRef","Skeleton","createContext","useContext","Fragment","jsx","jsxs","useState","useCallback","useEffect","useMemo","forwardRef","SidebarLabel","XMarkIcon","forwardRef","ChevronUpDownIcon","jsx","jsxs","forwardRef","SelectTrigger","SelectButton","ChevronUpDownIcon","SelectOption","SelectSeparator","SelectGroup","SelectGroupLabel","forwardRef","jsx","Separator","forwardRef","XMarkIcon","forwardRef","jsx","jsxs","sizeStyles","forwardRef","Badge","variantStyles","XMarkIcon","forwardRef","useSyncExternalStore","jsx","useSyncExternalStore","forwardRef","Kbd","forwardRef","jsx","jsxs","forwardRef","FormRoot","FormField","FormLabel","FormInput","FormTextarea","FormHint","FormError","forwardRef","jsx","variantStyles","sizeStyles","forwardRef","StatusDot","forwardRef","jsx","forwardRef","DropdownMenuTrigger","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuLabel","DropdownMenuGroup","forwardRef","jsx","jsxs","forwardRef","DialogTrigger","DialogBackdrop","sizeStyles","DialogPanel","DialogTitle","DialogBody","DialogFooter","DialogClose","forwardRef","useRef","useState","ChevronUpDownIcon","ChevronRightIcon","forwardRef","forwardRef","useCallback","useEffect","useRef","useState","jsx","jsxs","forwardRef","TruncatedCell","useRef","useState","useCallback","useEffect","jsx","forwardRef","Table","TableHeader","TableBody","TableRow","TableHeaderCell","TableCell","_","forwardRef","ChevronRightIcon","ChevronUpDownIcon","jsx","jsxs","sizeStyles","ChevronRightIcon","forwardRef","Pagination","ChevronUpDownIcon","forwardRef","jsx","jsxs","forwardRef","EmptyState","Fragment","jsx","jsxs","ChevronUpDownIcon","forwardRef","DataTableActionCell","useRef","useState","ChevronRightIcon","table","_","forwardRef","jsx","forwardRef","DataTableToolbar","forwardRef","useRef","useCallback","MagnifyingGlassIcon","XMarkIcon","jsx","jsxs","forwardRef","DataTableSearch","useRef","useCallback","MagnifyingGlassIcon","XMarkIcon","jsx","jsxs","forwardRef","XMarkIcon","jsx","jsxs","forwardRef","ActionBar","XMarkIcon","jsx","useEffect","useRef","useState","CheckIcon","forwardRef","jsx","forwardRef","PopoverTrigger","PopoverArrow","PopoverClose","PopoverTitle","PopoverDescription","forwardRef","Fragment","jsx","jsxs","forwardRef","FilterTrigger","Fragment","jsx","jsxs","useState","useRef","useEffect","CheckIcon","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useState","jsx","useState","useState","useState","ChevronLeftIcon","ChevronRightIcon","jsx","jsxs","useState","range","ChevronLeftIcon","ChevronRightIcon","jsx","jsxs","useState","range","useState","Fragment","jsx","jsxs","formatRange","useState","useRef","useState","MagnifyingGlassIcon","XMarkIcon","jsx","jsxs","useState","useRef","MagnifyingGlassIcon","XMarkIcon","useState","CalendarIcon","jsx","jsxs","dateFormatter","useState","CalendarIcon","useState","forwardRef","jsx","jsxs","forwardRef","Slider","jsx","jsxs","useState","startOfMonth","CalendarIcon","useState","jsx","jsxs","useState","CalendarIcon","CalendarIcon","useState","jsx","jsxs","range","useState","CalendarIcon","forwardRef","useState","ChevronDownIcon","ChevronUpIcon","forwardRef","jsx","jsxs","sizeStyles","forwardRef","NumberInput","ChevronDownIcon","ChevronUpIcon","jsx","jsxs","forwardRef","TimePicker","useState","forwardRef","jsx","jsxs","forwardRef","ProgressCircular","Progress","forwardRef","jsx","jsxs","forwardRef","ScrollArea","CheckIcon","forwardRef","jsx","jsxs","forwardRef","Stepper","CheckIcon","ChevronRightIcon","useState","jsx","jsxs","ChevronRightIcon","useState","forwardRef","jsx","forwardRef","ContextMenuTrigger","ContextMenuItem","XMarkIcon","forwardRef","useState","jsx","jsxs","forwardRef","TagsInput","useState","XMarkIcon","forwardRef","jsx","forwardRef","OTP","forwardRef","jsx","forwardRef","ToolbarButton","ToolbarSeparator","Toolbar","useCallback","useRef","useState","jsx","jsxs","useRef","useState","useCallback","forwardRef","useState","forwardRef","useCallback","useLayoutEffect","useRef","useState","jsx","jsxs","forwardRef","SegmentedGroup","useRef","useState","useCallback","useLayoutEffect","SegmentedGroupItem","jsx","jsxs","sizeStyles","forwardRef","SegmentedControl","useState","Fragment","jsx","jsxs","forwardRef","XMarkIcon","jsx","jsxs","variantConfig","forwardRef","Alert","XMarkIcon","forwardRef","jsx","jsxs","forwardRef","AlertDialogTrigger","AlertDialogBackdrop","AlertDialogPanel","AlertDialogTitle","AlertDialogDescription","AlertDialogActions","AlertDialogClose","ChevronRightIcon","forwardRef","jsx","jsxs","forwardRef","AccordionRoot","AccordionItem","AccordionTrigger","ChevronRightIcon","AccordionContent","forwardRef","useCallback","useLayoutEffect","useRef","useState","jsx","forwardRef","TabsRoot","TabsList","useRef","useState","useCallback","useLayoutEffect","TabsTab","TabsPanel","BaseDialog","forwardRef","jsx","jsxs","forwardRef","CommandRoot","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","CommandSeparator","BaseDialog","forwardRef","Toggle","jsx","jsxs","sizeStyles","forwardRef","ToggleButton","Toggle","forwardRef","jsx","forwardRef","ButtonGroup","ToggleButtonGroup","forwardRef","BaseRadioGroup","BaseRadio","jsx","jsxs","forwardRef","Root","BaseRadioGroup","sizeStyles","Item","BaseRadio","Card","forwardRef","jsx","jsxs","forwardRef","SaveBar","BaseButton","forwardRef","jsx","jsxs","variantConfig","forwardRef","Fab","BaseButton","forwardRef","jsx","jsxs","forwardRef","SettingsPage","CheckCircleIcon","ExclamationTriangleIcon","InformationCircleIcon","XCircleIcon","XMarkIcon","forwardRef","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","variantConfig","CheckCircleIcon","XCircleIcon","ExclamationTriangleIcon","InformationCircleIcon","toast","useState","useEffect","useRef","useLayoutEffect","useMemo","useCallback","XMarkIcon","forwardRef","Toaster","useCallback","useMemo","useState"]}