@revealui/presentation 0.3.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +14 -0
  2. package/dist/Text-mMOCv1lF.js +204 -0
  3. package/dist/Text-mMOCv1lF.js.map +1 -0
  4. package/dist/client.d.ts +3 -2
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +92 -266
  7. package/dist/client.js.map +1 -1
  8. package/dist/components/BuiltWithRevealUI.d.ts +6 -3
  9. package/dist/components/BuiltWithRevealUI.d.ts.map +1 -1
  10. package/dist/components/Button.d.ts +6 -3
  11. package/dist/components/Button.d.ts.map +1 -1
  12. package/dist/components/Card.d.ts.map +1 -1
  13. package/dist/components/Input.d.ts.map +1 -1
  14. package/dist/components/accordion.d.ts.map +1 -1
  15. package/dist/components/alert.d.ts.map +1 -1
  16. package/dist/components/avatar.d.ts.map +1 -1
  17. package/dist/components/badge.d.ts.map +1 -1
  18. package/dist/components/breadcrumb.d.ts.map +1 -1
  19. package/dist/components/button-headless.d.ts.map +1 -1
  20. package/dist/components/callout.d.ts.map +1 -1
  21. package/dist/components/checkbox-headless.d.ts.map +1 -1
  22. package/dist/components/combobox.d.ts.map +1 -1
  23. package/dist/components/dialog.d.ts.map +1 -1
  24. package/dist/components/drawer.d.ts.map +1 -1
  25. package/dist/components/dropdown.d.ts.map +1 -1
  26. package/dist/components/empty-state.d.ts.map +1 -1
  27. package/dist/components/fieldset.d.ts.map +1 -1
  28. package/dist/components/form-field.d.ts +23 -0
  29. package/dist/components/form-field.d.ts.map +1 -0
  30. package/dist/components/icon.d.ts +53 -0
  31. package/dist/components/icon.d.ts.map +1 -0
  32. package/dist/components/index.d.ts +1 -0
  33. package/dist/components/index.d.ts.map +1 -1
  34. package/dist/components/input-headless.d.ts.map +1 -1
  35. package/dist/components/kbd.d.ts.map +1 -1
  36. package/dist/components/listbox.d.ts.map +1 -1
  37. package/dist/components/navbar.d.ts.map +1 -1
  38. package/dist/components/radio.d.ts.map +1 -1
  39. package/dist/components/select-headless.d.ts.map +1 -1
  40. package/dist/components/sidebar.d.ts.map +1 -1
  41. package/dist/components/skeleton.d.ts.map +1 -1
  42. package/dist/components/stat.d.ts.map +1 -1
  43. package/dist/components/switch.d.ts.map +1 -1
  44. package/dist/components/table.d.ts.map +1 -1
  45. package/dist/components/tabs.d.ts.map +1 -1
  46. package/dist/components/textarea-headless.d.ts.map +1 -1
  47. package/dist/components/timeline.d.ts.map +1 -1
  48. package/dist/components/toast.d.ts.map +1 -1
  49. package/dist/components/tooltip.d.ts.map +1 -1
  50. package/dist/hooks/index.d.ts +1 -0
  51. package/dist/hooks/index.d.ts.map +1 -1
  52. package/dist/hooks/use-theme.d.ts +26 -0
  53. package/dist/hooks/use-theme.d.ts.map +1 -0
  54. package/dist/index.js +65 -224
  55. package/dist/index.js.map +1 -1
  56. package/dist/server.d.ts +5 -0
  57. package/dist/server.d.ts.map +1 -1
  58. package/dist/server.js +402 -32
  59. package/dist/server.js.map +1 -1
  60. package/dist/skeleton-CHPpiyJj.js +472 -0
  61. package/dist/skeleton-CHPpiyJj.js.map +1 -0
  62. package/dist/tokens.css +265 -0
  63. package/dist/use-theme-QxeZadnD.js +4024 -0
  64. package/dist/use-theme-QxeZadnD.js.map +1 -0
  65. package/dist/utils/cn.d.ts +21 -4
  66. package/dist/utils/cn.d.ts.map +1 -1
  67. package/package.json +13 -15
  68. package/dist/Box-DC3F8eRf.js +0 -430
  69. package/dist/Box-DC3F8eRf.js.map +0 -1
  70. package/dist/Text-jQVi12Hi.js +0 -218
  71. package/dist/Text-jQVi12Hi.js.map +0 -1
  72. package/dist/tooltip-DQYjYWbe.js +0 -5085
  73. package/dist/tooltip-DQYjYWbe.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-theme-QxeZadnD.js","names":[],"sources":["../src/components/accordion.tsx","../src/hooks/use-escape-key.ts","../src/hooks/use-focus-trap.ts","../src/hooks/use-scroll-lock.ts","../src/hooks/use-transition.ts","../src/hooks/use-data-interactive.ts","../src/components/link.tsx","../src/components/text.tsx","../src/components/alert.tsx","../src/components/button-headless.tsx","../src/components/avatar.tsx","../src/components/avatar-group.tsx","../src/components/badge.tsx","../src/components/Checkbox.tsx","../src/components/callout.tsx","../src/hooks/use-field-context.tsx","../src/hooks/use-controllable-state.ts","../src/hooks/use-toggle.ts","../src/components/checkbox-headless.tsx","../src/components/code-block.tsx","../src/hooks/use-click-outside.ts","../src/hooks/use-popover.ts","../src/components/combobox.tsx","../src/components/description-list.tsx","../src/components/dialog.tsx","../src/components/divider.tsx","../src/components/drawer.tsx","../src/hooks/use-roving-tabindex.ts","../src/hooks/use-type-ahead.ts","../src/components/dropdown.tsx","../src/components/fieldset.tsx","../src/components/input-headless.tsx","../src/components/kbd.tsx","../src/components/listbox.tsx","../src/hooks/use-layout-animation.tsx","../src/components/navbar.tsx","../src/components/progress.tsx","../src/components/radio.tsx","../src/components/rating.tsx","../src/components/Select.tsx","../src/components/select-headless.tsx","../src/hooks/use-close-context.ts","../src/components/sidebar.tsx","../src/components/sidebar-layout.tsx","../src/components/slider.tsx","../src/components/stacked-layout.tsx","../src/components/stat.tsx","../src/components/stepper.tsx","../src/components/switch.tsx","../src/components/tabs.tsx","../src/components/textarea-headless.tsx","../src/components/timeline.tsx","../src/components/toast.tsx","../src/components/tooltip.tsx","../src/hooks/use-theme.ts"],"sourcesContent":["'use client';\n\nimport type React from 'react';\nimport { useId, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport function Accordion({\n className,\n children,\n}: {\n className?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className={cn('divide-y divide-zinc-200 dark:divide-zinc-700', className)}>{children}</div>\n );\n}\n\nexport function AccordionItem({\n title,\n defaultOpen = false,\n className,\n children,\n}: {\n title: React.ReactNode;\n defaultOpen?: boolean;\n className?: string;\n children: React.ReactNode;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n const id = useId();\n\n return (\n <div className={className}>\n <button\n type=\"button\"\n id={`${id}-trigger`}\n aria-expanded={open}\n aria-controls={`${id}-content`}\n onClick={() => setOpen((prev) => !prev)}\n className=\"flex w-full items-center justify-between gap-4 py-4 text-left text-sm font-medium text-zinc-950 transition-colors hover:text-zinc-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500 dark:text-white dark:hover:text-zinc-300\"\n >\n <span>{title}</span>\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={cn(\n 'size-4 shrink-0 text-zinc-400 transition-transform duration-200',\n open && 'rotate-180',\n )}\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n {open && (\n <section\n id={`${id}-content`}\n aria-labelledby={`${id}-trigger`}\n className=\"pb-4 text-sm text-zinc-600 dark:text-zinc-400\"\n >\n {children}\n </section>\n )}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\n\nexport function useEscapeKey(onEscape: () => void, enabled = true): void {\n const callbackRef = useRef(onEscape);\n callbackRef.current = onEscape;\n\n useEffect(() => {\n if (!enabled) return;\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.stopPropagation();\n callbackRef.current();\n }\n }\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [enabled]);\n}\n","import { type RefObject, useEffect } from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'textarea:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\nfunction getFocusableElements(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n}\n\nexport function useFocusTrap(containerRef: RefObject<HTMLElement | null>, enabled = true): void {\n useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n // Store the element that had focus before trapping\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n // Focus first focusable element within the container\n const focusableElements = getFocusableElements(container);\n if (focusableElements.length > 0) {\n focusableElements[0]?.focus();\n } else {\n // If no focusable elements, make container focusable and focus it\n container.setAttribute('tabindex', '-1');\n container.focus();\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key !== 'Tab' || !container) return;\n\n const focusable = getFocusableElements(container);\n if (focusable.length === 0) {\n e.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last?.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first?.focus();\n }\n }\n\n // Listen on the document to catch all Tab presses\n document.addEventListener('keydown', handleKeyDown, true);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown, true);\n // Restore focus when trap is disabled\n previouslyFocused?.focus();\n };\n }, [containerRef, enabled]);\n}\n","import { useEffect } from 'react';\n\nexport function useScrollLock(enabled = true): void {\n useEffect(() => {\n if (!enabled) return;\n\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n // Account for scrollbar width to prevent layout shift\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n document.body.style.overflow = 'hidden';\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }, [enabled]);\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseTransitionReturn {\n /** Whether the element should be rendered in the DOM */\n mounted: boolean;\n /** Ref to attach to the transitioning element (listens for transitionend) */\n nodeRef: React.RefObject<HTMLElement | null>;\n /** Data attributes to spread on the transitioning element */\n transitionProps: {\n 'data-closed'?: string;\n 'data-enter'?: string;\n 'data-leave'?: string;\n 'data-transition'?: string;\n };\n}\n\n/**\n * Manages CSS transition lifecycle using data attributes.\n *\n * Enter sequence:\n * 1. Mount with `data-closed` + `data-enter` (element in hidden state)\n * 2. Next frame: remove `data-closed` (CSS transition triggers)\n * 3. On transitionend: remove `data-enter`\n *\n * Leave sequence:\n * 1. Add `data-closed` + `data-leave` (CSS transition to hidden state)\n * 2. On transitionend: unmount\n */\nexport function useTransition(show: boolean): UseTransitionReturn {\n const nodeRef = useRef<HTMLElement | null>(null);\n const [, setTick] = useState(0);\n const rerender = useCallback(() => setTick((t) => t + 1), []);\n\n // Phase tracks the transition state\n // Uses ref for synchronous access during rAF callbacks\n const phase = useRef<'hidden' | 'enter-from' | 'enter-to' | 'visible' | 'leave'>(\n show ? 'visible' : 'hidden',\n );\n\n const prevShow = useRef(show);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n // Clean up previous transition\n cleanupRef.current?.();\n cleanupRef.current = null;\n\n if (show && !prevShow.current) {\n // === ENTER ===\n phase.current = 'enter-from';\n rerender();\n\n const frame1 = requestAnimationFrame(() => {\n const frame2 = requestAnimationFrame(() => {\n if (phase.current !== 'enter-from') return;\n phase.current = 'enter-to';\n rerender();\n\n const node = nodeRef.current;\n if (!node) {\n phase.current = 'visible';\n rerender();\n return;\n }\n\n let cleaned = false;\n const done = () => {\n if (cleaned) return;\n cleaned = true;\n phase.current = 'visible';\n rerender();\n };\n\n node.addEventListener('transitionend', done, { once: true });\n const fallback = setTimeout(done, 500);\n\n cleanupRef.current = () => {\n cleaned = true;\n node.removeEventListener('transitionend', done);\n clearTimeout(fallback);\n };\n });\n\n cleanupRef.current = () => cancelAnimationFrame(frame2);\n });\n\n cleanupRef.current = () => cancelAnimationFrame(frame1);\n } else if (!show && prevShow.current) {\n // === LEAVE ===\n phase.current = 'leave';\n rerender();\n\n const node = nodeRef.current;\n if (!node) {\n phase.current = 'hidden';\n rerender();\n prevShow.current = show;\n return;\n }\n\n let cleaned = false;\n const done = () => {\n if (cleaned) return;\n cleaned = true;\n phase.current = 'hidden';\n rerender();\n };\n\n node.addEventListener('transitionend', done, { once: true });\n const fallback = setTimeout(done, 500);\n\n cleanupRef.current = () => {\n cleaned = true;\n node.removeEventListener('transitionend', done);\n clearTimeout(fallback);\n };\n }\n\n prevShow.current = show;\n }, [show, rerender]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupRef.current?.();\n };\n }, []);\n\n const p = phase.current;\n\n return {\n mounted: p !== 'hidden',\n nodeRef,\n transitionProps: {\n 'data-closed': p === 'enter-from' || p === 'leave' || p === 'hidden' ? '' : undefined,\n 'data-enter': p === 'enter-from' || p === 'enter-to' ? '' : undefined,\n 'data-leave': p === 'leave' ? '' : undefined,\n 'data-transition': p === 'enter-from' || p === 'enter-to' || p === 'leave' ? '' : undefined,\n },\n };\n}\n","import { useCallback, useState } from 'react';\n\ninterface UseDataInteractiveOptions {\n disabled?: boolean;\n}\n\ninterface DataInteractiveProps {\n 'data-hover'?: string;\n 'data-focus'?: string;\n 'data-active'?: string;\n 'data-disabled'?: string;\n onPointerEnter: () => void;\n onPointerLeave: () => void;\n onPointerDown: () => void;\n onPointerUp: () => void;\n onFocus: (e: React.FocusEvent<HTMLElement>) => void;\n onBlur: () => void;\n}\n\nexport function useDataInteractive({\n disabled = false,\n}: UseDataInteractiveOptions = {}): DataInteractiveProps {\n const [hover, setHover] = useState(false);\n const [focus, setFocus] = useState(false);\n const [active, setActive] = useState(false);\n\n const onPointerEnter = useCallback(() => {\n if (!disabled) setHover(true);\n }, [disabled]);\n\n const onPointerLeave = useCallback(() => {\n setHover(false);\n setActive(false);\n }, []);\n\n const onPointerDown = useCallback(() => {\n if (!disabled) setActive(true);\n }, [disabled]);\n\n const onPointerUp = useCallback(() => {\n setActive(false);\n }, []);\n\n const onFocus = useCallback(\n (e: React.FocusEvent<HTMLElement>) => {\n if (!disabled && e.currentTarget.matches(':focus-visible')) {\n setFocus(true);\n }\n },\n [disabled],\n );\n\n const onBlur = useCallback(() => {\n setFocus(false);\n }, []);\n\n return {\n 'data-hover': hover ? '' : undefined,\n 'data-focus': focus ? '' : undefined,\n 'data-active': active ? '' : undefined,\n 'data-disabled': disabled ? '' : undefined,\n onPointerEnter,\n onPointerLeave,\n onPointerDown,\n onPointerUp,\n onFocus,\n onBlur,\n };\n}\n","/**\n * Link component - Framework-agnostic link component\n *\n * This is a generic Link component that works with any framework.\n * For framework-specific implementations:\n * - Next.js: Use Next.js Link component (see apps/cms/src/lib/components/Link)\n * - Other frameworks: Wrap this component with your framework's Link\n *\n * See Catalyst documentation for framework-specific examples:\n * https://catalyst.tailwindui.com/docs#client-side-router-integration\n */\n\nimport type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\n\nexport function Link({\n ref,\n ...props\n}: { href: string; ref?: React.Ref<HTMLAnchorElement> } & React.ComponentPropsWithoutRef<'a'>) {\n const interactiveProps = useDataInteractive();\n\n return <a {...props} {...interactiveProps} ref={ref} />;\n}\n","import { cn } from '../utils/cn.js';\nimport { Link } from './link.js';\n\nexport function Text({ className, ...props }: React.ComponentPropsWithoutRef<'p'>) {\n return (\n <p\n data-slot=\"text\"\n {...props}\n className={cn(className, 'text-base/6 text-zinc-500 sm:text-sm/6 dark:text-zinc-400')}\n />\n );\n}\n\nexport function TextLink({ className, ...props }: React.ComponentPropsWithoutRef<typeof Link>) {\n return (\n <Link\n {...props}\n className={cn(\n className,\n 'text-zinc-950 underline decoration-zinc-950/50 data-hover:decoration-zinc-950 dark:text-white dark:decoration-white/50 dark:data-hover:decoration-white',\n )}\n />\n );\n}\n\nexport function Strong({ className, ...props }: React.ComponentPropsWithoutRef<'strong'>) {\n return (\n <strong {...props} className={cn(className, 'font-medium text-zinc-950 dark:text-white')} />\n );\n}\n\nexport function Code({ className, ...props }: React.ComponentPropsWithoutRef<'code'>) {\n return (\n <code\n {...props}\n className={cn(\n className,\n 'rounded-sm border border-zinc-950/10 bg-zinc-950/2.5 px-0.5 text-sm font-medium text-zinc-950 sm:text-[0.8125rem] dark:border-white/20 dark:bg-white/5 dark:text-white',\n )}\n />\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { useId, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { useFocusTrap } from '../hooks/use-focus-trap.js';\nimport { useScrollLock } from '../hooks/use-scroll-lock.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { cn } from '../utils/cn.js';\nimport { Text } from './text.js';\n\nconst sizes = {\n xs: 'sm:max-w-xs',\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n '4xl': 'sm:max-w-4xl',\n '5xl': 'sm:max-w-5xl',\n};\n\nexport function Alert({\n size = 'md',\n className,\n children,\n open,\n onClose,\n}: {\n size?: keyof typeof sizes;\n className?: string;\n children: React.ReactNode;\n open: boolean;\n onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n\n const backdrop = useTransition(open);\n const panel = useTransition(open);\n\n useScrollLock(open);\n useFocusTrap(panelRef, open);\n useEscapeKey(onClose, open);\n\n if (!(backdrop.mounted || panel.mounted)) return null;\n\n return createPortal(\n <div role=\"alertdialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n {/* Backdrop */}\n {backdrop.mounted && (\n <button\n type=\"button\"\n aria-label=\"Close alert\"\n ref={backdrop.nodeRef as React.RefObject<HTMLButtonElement>}\n {...backdrop.transitionProps}\n onClick={onClose}\n className=\"fixed inset-0 flex w-screen justify-center overflow-y-auto bg-zinc-950/15 px-2 py-2 transition duration-100 focus:outline-0 data-closed:opacity-0 data-enter:ease-out data-leave:ease-in sm:px-6 sm:py-8 lg:px-8 lg:py-16 dark:bg-zinc-950/50\"\n />\n )}\n\n {/* Panel container */}\n {panel.mounted && (\n <div className=\"fixed inset-0 w-screen overflow-y-auto pt-6 sm:pt-0\">\n <div className=\"grid min-h-full grid-rows-[1fr_auto_1fr] justify-items-center p-8 sm:grid-rows-[1fr_auto_3fr] sm:p-4\">\n <div\n ref={(node) => {\n (panelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n (panel.nodeRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n {...panel.transitionProps}\n className={cn(\n className,\n sizes[size],\n 'row-start-2 w-full rounded-2xl bg-white p-8 shadow-lg ring-1 ring-zinc-950/10 sm:rounded-2xl sm:p-6 dark:bg-zinc-900 dark:ring-white/10 forced-colors:outline',\n 'transition duration-100 will-change-transform data-closed:opacity-0 data-enter:ease-out data-closed:data-enter:scale-95 data-leave:ease-in',\n )}\n >\n {children}\n </div>\n </div>\n </div>\n )}\n </div>,\n document.body,\n );\n}\n\nexport function AlertTitle({\n className,\n ...props\n}: { className?: string } & React.ComponentPropsWithoutRef<'h2'>) {\n return (\n <h2\n {...props}\n className={cn(\n className,\n 'text-center text-base/6 font-semibold text-balance text-zinc-950 sm:text-left sm:text-sm/6 sm:text-wrap dark:text-white',\n )}\n />\n );\n}\n\nexport function AlertDescription({\n className,\n ...props\n}: { className?: string } & React.ComponentPropsWithoutRef<typeof Text>) {\n return <Text {...props} className={cn(className, 'mt-2 text-center text-pretty sm:text-left')} />;\n}\n\nexport function AlertBody({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div {...props} className={cn(className, 'mt-4')} />;\n}\n\nexport function AlertActions({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n {...props}\n className={cn(\n className,\n 'mt-6 flex flex-col-reverse items-center justify-end gap-3 *:w-full sm:mt-4 sm:flex-row sm:*:w-auto',\n )}\n />\n );\n}\n","import type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { cn } from '../utils/cn.js';\nimport { Link } from './link.js';\n\nconst styles = {\n base: [\n // Base\n 'relative isolate inline-flex items-baseline justify-center gap-x-2 rounded-lg border text-base/6 font-semibold',\n // Sizing\n 'px-[calc(--spacing(3.5)-1px)] py-[calc(--spacing(2.5)-1px)] sm:px-[calc(--spacing(3)-1px)] sm:py-[calc(--spacing(1.5)-1px)] sm:text-sm/6',\n // Focus\n 'focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',\n // Disabled\n 'data-disabled:opacity-50',\n // Icon\n '*:data-[slot=icon]:-mx-0.5 *:data-[slot=icon]:my-0.5 *:data-[slot=icon]:size-5 *:data-[slot=icon]:shrink-0 *:data-[slot=icon]:self-center *:data-[slot=icon]:text-(--btn-icon) sm:*:data-[slot=icon]:my-1 sm:*:data-[slot=icon]:size-4 forced-colors:[--btn-icon:ButtonText] forced-colors:data-hover:[--btn-icon:ButtonText]',\n ],\n solid: [\n // Optical border, implemented as the button background to avoid corner artifacts\n 'border-transparent bg-(--btn-border)',\n // Dark mode: border is rendered on `after` so background is set to button background\n 'dark:bg-(--btn-bg)',\n // Button background, implemented as foreground layer to stack on top of pseudo-border layer\n 'before:absolute before:inset-0 before:-z-10 before:rounded-[calc(var(--radius-lg)-1px)] before:bg-(--btn-bg)',\n // Drop shadow, applied to the inset `before` layer so it blends with the border\n 'before:shadow-sm',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Dark mode: Subtle white outline is applied using a border\n 'dark:border-white/5',\n // Shim/overlay, inset to match button foreground and used for hover state + highlight shadow\n 'after:absolute after:inset-0 after:-z-10 after:rounded-[calc(var(--radius-lg)-1px)]',\n // Inner highlight shadow\n 'after:shadow-[inset_0_1px_--theme(--color-white/15%)]',\n // White overlay on hover\n 'data-active:after:bg-(--btn-hover-overlay) data-hover:after:bg-(--btn-hover-overlay)',\n // Dark mode: `after` layer expands to cover entire button\n 'dark:after:-inset-px dark:after:rounded-lg',\n // Disabled\n 'data-disabled:before:shadow-none data-disabled:after:shadow-none',\n ],\n outline: [\n // Base\n 'border-zinc-950/10 text-zinc-950 data-active:bg-zinc-950/2.5 data-hover:bg-zinc-950/2.5',\n // Dark mode\n 'dark:border-white/15 dark:text-white dark:[--btn-bg:transparent] dark:data-active:bg-white/5 dark:data-hover:bg-white/5',\n // Icon\n '[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n plain: [\n // Base\n 'border-transparent text-zinc-950 data-active:bg-zinc-950/5 data-hover:bg-zinc-950/5',\n // Dark mode\n 'dark:text-white dark:data-active:bg-white/10 dark:data-hover:bg-white/10',\n // Icon\n '[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n colors: {\n 'dark/zinc': [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:text-white dark:[--btn-bg:var(--color-zinc-600)] dark:[--btn-hover-overlay:var(--color-white)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n light: [\n 'text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15',\n 'dark:text-white dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',\n '[--btn-icon:var(--color-zinc-500)] data-active:[--btn-icon:var(--color-zinc-700)] data-hover:[--btn-icon:var(--color-zinc-700)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n 'dark/white': [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:text-zinc-950 dark:[--btn-bg:white] dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)] dark:[--btn-icon:var(--color-zinc-500)] dark:data-active:[--btn-icon:var(--color-zinc-400)] dark:data-hover:[--btn-icon:var(--color-zinc-400)]',\n ],\n dark: [\n 'text-white [--btn-bg:var(--color-zinc-900)] [--btn-border:var(--color-zinc-950)]/90 [--btn-hover-overlay:var(--color-white)]/10',\n 'dark:[--btn-hover-overlay:var(--color-white)]/5 dark:[--btn-bg:var(--color-zinc-800)]',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n white: [\n 'text-zinc-950 [--btn-bg:white] [--btn-border:var(--color-zinc-950)]/10 [--btn-hover-overlay:var(--color-zinc-950)]/2.5 data-active:[--btn-border:var(--color-zinc-950)]/15 data-hover:[--btn-border:var(--color-zinc-950)]/15',\n 'dark:[--btn-hover-overlay:var(--color-zinc-950)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-500)] data-hover:[--btn-icon:var(--color-zinc-500)]',\n ],\n zinc: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-zinc-600)] [--btn-border:var(--color-zinc-700)]/90',\n 'dark:[--btn-hover-overlay:var(--color-white)]/5',\n '[--btn-icon:var(--color-zinc-400)] data-active:[--btn-icon:var(--color-zinc-300)] data-hover:[--btn-icon:var(--color-zinc-300)]',\n ],\n indigo: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-indigo-500)] [--btn-border:var(--color-indigo-600)]/90',\n '[--btn-icon:var(--color-indigo-300)] data-active:[--btn-icon:var(--color-indigo-200)] data-hover:[--btn-icon:var(--color-indigo-200)]',\n ],\n cyan: [\n 'text-cyan-950 [--btn-bg:var(--color-cyan-300)] [--btn-border:var(--color-cyan-400)]/80 [--btn-hover-overlay:var(--color-white)]/25',\n '[--btn-icon:var(--color-cyan-500)]',\n ],\n red: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-red-600)] [--btn-border:var(--color-red-700)]/90',\n '[--btn-icon:var(--color-red-300)] data-active:[--btn-icon:var(--color-red-200)] data-hover:[--btn-icon:var(--color-red-200)]',\n ],\n orange: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-orange-500)] [--btn-border:var(--color-orange-600)]/90',\n '[--btn-icon:var(--color-orange-300)] data-active:[--btn-icon:var(--color-orange-200)] data-hover:[--btn-icon:var(--color-orange-200)]',\n ],\n amber: [\n 'text-amber-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-amber-400)] [--btn-border:var(--color-amber-500)]/80',\n '[--btn-icon:var(--color-amber-600)]',\n ],\n yellow: [\n 'text-yellow-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-yellow-300)] [--btn-border:var(--color-yellow-400)]/80',\n '[--btn-icon:var(--color-yellow-600)] data-active:[--btn-icon:var(--color-yellow-700)] data-hover:[--btn-icon:var(--color-yellow-700)]',\n ],\n lime: [\n 'text-lime-950 [--btn-hover-overlay:var(--color-white)]/25 [--btn-bg:var(--color-lime-300)] [--btn-border:var(--color-lime-400)]/80',\n '[--btn-icon:var(--color-lime-600)] data-active:[--btn-icon:var(--color-lime-700)] data-hover:[--btn-icon:var(--color-lime-700)]',\n ],\n green: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-green-600)] [--btn-border:var(--color-green-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n emerald: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-emerald-600)] [--btn-border:var(--color-emerald-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n teal: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-teal-600)] [--btn-border:var(--color-teal-700)]/90',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n sky: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-sky-500)] [--btn-border:var(--color-sky-600)]/80',\n '[--btn-icon:var(--color-white)]/60 data-active:[--btn-icon:var(--color-white)]/80 data-hover:[--btn-icon:var(--color-white)]/80',\n ],\n blue: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-blue-600)] [--btn-border:var(--color-blue-700)]/90',\n '[--btn-icon:var(--color-blue-400)] data-active:[--btn-icon:var(--color-blue-300)] data-hover:[--btn-icon:var(--color-blue-300)]',\n ],\n violet: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-violet-500)] [--btn-border:var(--color-violet-600)]/90',\n '[--btn-icon:var(--color-violet-300)] data-active:[--btn-icon:var(--color-violet-200)] data-hover:[--btn-icon:var(--color-violet-200)]',\n ],\n purple: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-purple-500)] [--btn-border:var(--color-purple-600)]/90',\n '[--btn-icon:var(--color-purple-300)] data-active:[--btn-icon:var(--color-purple-200)] data-hover:[--btn-icon:var(--color-purple-200)]',\n ],\n fuchsia: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-fuchsia-500)] [--btn-border:var(--color-fuchsia-600)]/90',\n '[--btn-icon:var(--color-fuchsia-300)] data-active:[--btn-icon:var(--color-fuchsia-200)] data-hover:[--btn-icon:var(--color-fuchsia-200)]',\n ],\n pink: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-pink-500)] [--btn-border:var(--color-pink-600)]/90',\n '[--btn-icon:var(--color-pink-300)] data-active:[--btn-icon:var(--color-pink-200)] data-hover:[--btn-icon:var(--color-pink-200)]',\n ],\n rose: [\n 'text-white [--btn-hover-overlay:var(--color-white)]/10 [--btn-bg:var(--color-rose-500)] [--btn-border:var(--color-rose-600)]/90',\n '[--btn-icon:var(--color-rose-300)] data-active:[--btn-icon:var(--color-rose-200)] data-hover:[--btn-icon:var(--color-rose-200)]',\n ],\n },\n};\n\ntype ButtonProps = (\n | { color?: keyof typeof styles.colors; outline?: never; plain?: never }\n | { color?: never; outline: true; plain?: never }\n | { color?: never; outline?: never; plain: true }\n) & { className?: string; children: React.ReactNode; ref?: React.Ref<HTMLElement> } & (\n | ({\n href?: never;\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n } & Omit<React.ComponentPropsWithoutRef<'button'>, 'className' | 'type'>)\n | ({\n href: string;\n } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n );\n\nexport function Button({ color, outline, plain, className, children, ref, ...props }: ButtonProps) {\n const disabled = 'disabled' in props ? props.disabled : false;\n const interactiveProps = useDataInteractive({ disabled: disabled ?? false });\n\n const classes = cn(\n className,\n styles.base,\n outline\n ? styles.outline\n : plain\n ? styles.plain\n : cn(styles.solid, styles.colors[color ?? 'dark/zinc']),\n );\n\n return typeof props.href === 'string' ? (\n <Link {...props} className={classes} ref={ref as React.Ref<HTMLAnchorElement>}>\n <TouchTarget>{children}</TouchTarget>\n </Link>\n ) : (\n <button\n type=\"button\"\n {...props}\n {...interactiveProps}\n className={cn(classes, 'cursor-default')}\n ref={ref as React.Ref<HTMLButtonElement>}\n >\n <TouchTarget>{children}</TouchTarget>\n </button>\n );\n}\n\n/**\n * Expand the hit area to at least 44x44px on touch devices\n */\nexport function TouchTarget({ children }: { children: React.ReactNode }) {\n return (\n <>\n <span\n className=\"absolute top-1/2 left-1/2 size-[max(100%,2.75rem)] -translate-x-1/2 -translate-y-1/2 pointer-fine:hidden\"\n aria-hidden=\"true\"\n />\n {children}\n </>\n );\n}\n","import type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { cn } from '../utils/cn.js';\nimport { TouchTarget } from './button-headless.js';\nimport { Link } from './link.js';\n\ntype AvatarProps = {\n src?: string | null | undefined;\n square?: boolean;\n initials?: string;\n alt?: string;\n className?: string;\n};\n\nexport function Avatar({\n src = null,\n square = false,\n initials,\n alt = '',\n className,\n ...props\n}: AvatarProps & React.ComponentPropsWithoutRef<'span'>) {\n const title = alt && alt.trim().length > 0 ? alt.trim() : 'Avatar';\n\n return (\n <span\n data-slot=\"avatar\"\n {...props}\n className={cn(\n className,\n // Basic layout\n 'inline-grid shrink-0 align-middle [--avatar-radius:20%] *:col-start-1 *:row-start-1',\n 'outline -outline-offset-1 outline-black/10 dark:outline-white/10',\n // Border radius\n square\n ? 'rounded-(--avatar-radius) *:rounded-(--avatar-radius)'\n : 'rounded-full *:rounded-full',\n )}\n >\n {initials && (\n <svg\n className=\"size-full fill-current p-[5%] text-[48px] font-medium uppercase select-none\"\n viewBox=\"0 0 100 100\"\n aria-hidden={alt && alt.trim().length > 0 ? undefined : 'true'}\n >\n <title>{title}</title>\n <text\n x=\"50%\"\n y=\"50%\"\n alignmentBaseline=\"middle\"\n dominantBaseline=\"middle\"\n textAnchor=\"middle\"\n dy=\".125em\"\n >\n {initials}\n </text>\n </svg>\n )}\n {/* biome-ignore lint/performance/noImgElement: generic React component, not Next.js */}\n {src && <img className=\"size-full\" src={src} alt={alt} />}\n </span>\n );\n}\n\nexport function AvatarButton({\n src,\n square = false,\n initials,\n alt,\n className,\n ref,\n ...props\n}: AvatarProps & { ref?: React.Ref<HTMLButtonElement> } & (\n | ({\n href?: never;\n disabled?: boolean;\n } & Omit<React.ComponentPropsWithoutRef<'button'>, 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n )) {\n const disabled = 'disabled' in props ? props.disabled : false;\n const interactiveProps = useDataInteractive({ disabled: disabled ?? false });\n\n const classes = cn(\n className,\n square ? 'rounded-[20%]' : 'rounded-full',\n 'relative inline-grid focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',\n );\n\n return typeof props.href === 'string' ? (\n <Link {...props} className={classes} ref={ref as React.Ref<HTMLAnchorElement>}>\n <TouchTarget>\n <Avatar src={src} square={square} initials={initials} alt={alt} />\n </TouchTarget>\n </Link>\n ) : (\n <button type=\"button\" {...props} {...interactiveProps} className={classes} ref={ref}>\n <TouchTarget>\n <Avatar src={src} square={square} initials={initials} alt={alt} />\n </TouchTarget>\n </button>\n );\n}\n","import { cn } from '../utils/cn.js';\nimport { Avatar } from './avatar.js';\n\ntype AvatarGroupItem = {\n src?: string | null;\n initials?: string;\n alt?: string;\n};\n\nexport function AvatarGroup({\n items,\n max = 5,\n size = 'md',\n className,\n}: {\n items: AvatarGroupItem[];\n max?: number;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n className?: string;\n}) {\n const sizeClasses = { xs: 'size-6', sm: 'size-8', md: 'size-10', lg: 'size-12' };\n const overlapClass = { xs: '-ml-1.5', sm: '-ml-2', md: '-ml-3', lg: '-ml-4' };\n\n const visible = items.slice(0, max);\n const overflow = items.length - max;\n\n return (\n <div className={cn('flex items-center', className)}>\n {visible.map((item, i) => {\n return (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: avatar items are positionally ordered with no stable ID\n key={i}\n className={cn(\n 'ring-2 ring-white dark:ring-zinc-900',\n sizeClasses[size],\n i > 0 && overlapClass[size],\n 'rounded-full',\n )}\n >\n <Avatar\n src={item.src}\n initials={item.initials}\n alt={item.alt ?? ''}\n className=\"size-full\"\n />\n </div>\n );\n })}\n {overflow > 0 && (\n <div\n className={cn(\n overlapClass[size],\n sizeClasses[size],\n 'flex items-center justify-center rounded-full bg-zinc-200 text-xs font-medium text-zinc-600 ring-2 ring-white dark:bg-zinc-700 dark:text-zinc-300 dark:ring-zinc-900',\n )}\n role=\"img\"\n aria-label={`${overflow} more`}\n >\n +{overflow}\n </div>\n )}\n </div>\n );\n}\n","import type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { cn } from '../utils/cn.js';\nimport { TouchTarget } from './button-headless.js';\nimport { Link } from './link.js';\n\nconst colors = {\n red: 'bg-red-500/15 text-red-700 group-data-hover:bg-red-500/25 dark:bg-red-500/10 dark:text-red-400 dark:group-data-hover:bg-red-500/20',\n orange:\n 'bg-orange-500/15 text-orange-700 group-data-hover:bg-orange-500/25 dark:bg-orange-500/10 dark:text-orange-400 dark:group-data-hover:bg-orange-500/20',\n amber:\n 'bg-amber-400/20 text-amber-700 group-data-hover:bg-amber-400/30 dark:bg-amber-400/10 dark:text-amber-400 dark:group-data-hover:bg-amber-400/15',\n yellow:\n 'bg-yellow-400/20 text-yellow-700 group-data-hover:bg-yellow-400/30 dark:bg-yellow-400/10 dark:text-yellow-300 dark:group-data-hover:bg-yellow-400/15',\n lime: 'bg-lime-400/20 text-lime-700 group-data-hover:bg-lime-400/30 dark:bg-lime-400/10 dark:text-lime-300 dark:group-data-hover:bg-lime-400/15',\n green:\n 'bg-green-500/15 text-green-700 group-data-hover:bg-green-500/25 dark:bg-green-500/10 dark:text-green-400 dark:group-data-hover:bg-green-500/20',\n emerald:\n 'bg-emerald-500/15 text-emerald-700 group-data-hover:bg-emerald-500/25 dark:bg-emerald-500/10 dark:text-emerald-400 dark:group-data-hover:bg-emerald-500/20',\n teal: 'bg-teal-500/15 text-teal-700 group-data-hover:bg-teal-500/25 dark:bg-teal-500/10 dark:text-teal-300 dark:group-data-hover:bg-teal-500/20',\n cyan: 'bg-cyan-400/20 text-cyan-700 group-data-hover:bg-cyan-400/30 dark:bg-cyan-400/10 dark:text-cyan-300 dark:group-data-hover:bg-cyan-400/15',\n sky: 'bg-sky-500/15 text-sky-700 group-data-hover:bg-sky-500/25 dark:bg-sky-500/10 dark:text-sky-300 dark:group-data-hover:bg-sky-500/20',\n blue: 'bg-blue-500/15 text-blue-700 group-data-hover:bg-blue-500/25 dark:text-blue-400 dark:group-data-hover:bg-blue-500/25',\n indigo:\n 'bg-indigo-500/15 text-indigo-700 group-data-hover:bg-indigo-500/25 dark:text-indigo-400 dark:group-data-hover:bg-indigo-500/20',\n violet:\n 'bg-violet-500/15 text-violet-700 group-data-hover:bg-violet-500/25 dark:text-violet-400 dark:group-data-hover:bg-violet-500/20',\n purple:\n 'bg-purple-500/15 text-purple-700 group-data-hover:bg-purple-500/25 dark:text-purple-400 dark:group-data-hover:bg-purple-500/20',\n fuchsia:\n 'bg-fuchsia-400/15 text-fuchsia-700 group-data-hover:bg-fuchsia-400/25 dark:bg-fuchsia-400/10 dark:text-fuchsia-400 dark:group-data-hover:bg-fuchsia-400/20',\n pink: 'bg-pink-400/15 text-pink-700 group-data-hover:bg-pink-400/25 dark:bg-pink-400/10 dark:text-pink-400 dark:group-data-hover:bg-pink-400/20',\n rose: 'bg-rose-400/15 text-rose-700 group-data-hover:bg-rose-400/25 dark:bg-rose-400/10 dark:text-rose-400 dark:group-data-hover:bg-rose-400/20',\n zinc: 'bg-zinc-600/10 text-zinc-700 group-data-hover:bg-zinc-600/20 dark:bg-white/5 dark:text-zinc-400 dark:group-data-hover:bg-white/10',\n};\n\ntype BadgeProps = { color?: keyof typeof colors };\n\nexport function Badge({\n color = 'zinc',\n className,\n ...props\n}: BadgeProps & React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n {...props}\n className={cn(\n className,\n 'inline-flex items-center gap-x-1.5 rounded-md px-1.5 py-0.5 text-sm/5 font-medium sm:text-xs/5 forced-colors:outline',\n colors[color],\n )}\n style={{\n borderRadius: 'var(--rvui-radius-full, 9999px)',\n transition:\n 'background-color var(--rvui-duration-fast, 120ms) var(--rvui-ease, cubic-bezier(0.22, 1, 0.36, 1))',\n }}\n />\n );\n}\n\nexport function BadgeButton({\n color = 'zinc',\n className,\n children,\n ref,\n ...props\n}: BadgeProps & { className?: string; children: React.ReactNode; ref?: React.Ref<HTMLElement> } & (\n | ({\n href?: never;\n disabled?: boolean;\n } & Omit<React.ComponentPropsWithoutRef<'button'>, 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n )) {\n const disabled = 'disabled' in props ? props.disabled : false;\n const interactiveProps = useDataInteractive({ disabled: disabled ?? false });\n\n const classes = cn(\n className,\n 'group relative inline-flex rounded-md focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',\n );\n\n return typeof props.href === 'string' ? (\n <Link {...props} className={classes} ref={ref as React.Ref<HTMLAnchorElement>}>\n <TouchTarget>\n <Badge color={color}>{children}</Badge>\n </TouchTarget>\n </Link>\n ) : (\n <button\n type=\"button\"\n {...props}\n {...interactiveProps}\n className={classes}\n ref={ref as React.Ref<HTMLButtonElement>}\n >\n <TouchTarget>\n <Badge color={color}>{children}</Badge>\n </TouchTarget>\n </button>\n );\n}\n","'use client';\nimport React from 'react';\nimport { cn } from '../utils/cn.js';\n\n// Context for managing checkbox state\nconst CheckboxContext = React.createContext<{\n state: boolean | 'indeterminate';\n disabled?: boolean | undefined;\n onCheckedChange?: (this: void, checked: boolean | 'indeterminate') => void;\n} | null>(null);\n\nexport interface CheckboxProps\n extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'checked' | 'defaultChecked' | 'type' | 'onChange'\n > {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?(this: void, checked: boolean | 'indeterminate'): void;\n ref?: React.Ref<HTMLInputElement>;\n}\n\n// Checkbox component\nfunction Checkbox({\n checked,\n defaultChecked,\n disabled,\n onCheckedChange,\n className,\n ref,\n ...props\n}: CheckboxProps) {\n const [internalChecked, setInternalChecked] = React.useState<boolean | 'indeterminate'>(\n defaultChecked ?? false,\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n const newChecked = e.target.checked;\n setInternalChecked(newChecked);\n onCheckedChange?.(newChecked);\n };\n\n React.useEffect(() => {\n if (checked !== undefined) {\n setInternalChecked(checked);\n }\n }, [checked]);\n\n return (\n <CheckboxContext.Provider value={{ state: internalChecked, disabled, onCheckedChange }}>\n <input\n type=\"checkbox\"\n disabled={disabled}\n checked={\n checked !== undefined\n ? checked\n : internalChecked === 'indeterminate'\n ? false\n : internalChecked\n }\n ref={(el) => {\n if (el) {\n el.indeterminate = internalChecked === 'indeterminate';\n }\n if (ref) {\n if (typeof ref === 'function') {\n ref(el);\n } else {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current = el;\n }\n }\n }}\n onChange={handleChange}\n className={cn(\n 'peer h-4 w-4 shrink-0 rounded border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',\n className,\n )}\n data-state={\n internalChecked === 'indeterminate'\n ? 'indeterminate'\n : internalChecked\n ? 'checked'\n : 'unchecked'\n }\n {...props}\n />\n </CheckboxContext.Provider>\n );\n}\n\nexport interface CheckboxIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n ref?: React.Ref<HTMLSpanElement>;\n}\n\n// CheckboxIndicator component\nfunction CheckboxIndicator({ className, ref, ...props }: CheckboxIndicatorProps) {\n const context = React.use(CheckboxContext);\n if (!context) {\n throw new Error('CheckboxIndicator must be used within a Checkbox');\n }\n\n return (\n <span\n data-state={\n context.state === 'indeterminate'\n ? 'indeterminate'\n : context.state\n ? 'checked'\n : 'unchecked'\n }\n ref={ref}\n className={cn('flex items-center justify-center text-current', className)}\n {...props}\n >\n {context.state === true && '✔'}\n {context.state === 'indeterminate' && '−'}\n </span>\n );\n}\n\n// Export components\nexport { Checkbox, CheckboxIndicator };\n","import type React from 'react';\nimport { cn } from '../utils/cn.js';\n\ntype CalloutVariant = 'info' | 'warning' | 'error' | 'success' | 'tip';\n\nconst variantStyles: Record<CalloutVariant, { wrapper: string; icon: string; iconChar: string }> = {\n info: {\n wrapper: 'bg-blue-50 ring-blue-200 dark:bg-blue-950/30 dark:ring-blue-800',\n icon: 'text-blue-600 dark:text-blue-400',\n iconChar: 'i',\n },\n warning: {\n wrapper: 'bg-amber-50 ring-amber-200 dark:bg-amber-950/30 dark:ring-amber-800',\n icon: 'text-amber-600 dark:text-amber-400',\n iconChar: '!',\n },\n error: {\n wrapper: 'bg-red-50 ring-red-200 dark:bg-red-950/30 dark:ring-red-800',\n icon: 'text-red-600 dark:text-red-400',\n iconChar: '✕',\n },\n success: {\n wrapper: 'bg-green-50 ring-green-200 dark:bg-green-950/30 dark:ring-green-800',\n icon: 'text-green-600 dark:text-green-400',\n iconChar: '✓',\n },\n tip: {\n wrapper: 'bg-violet-50 ring-violet-200 dark:bg-violet-950/30 dark:ring-violet-800',\n icon: 'text-violet-600 dark:text-violet-400',\n iconChar: '★',\n },\n};\n\nexport function Callout({\n variant = 'info',\n title,\n icon,\n className,\n children,\n}: {\n variant?: CalloutVariant;\n title?: string;\n icon?: React.ReactNode;\n className?: string;\n children: React.ReactNode;\n}) {\n const styles = variantStyles[variant];\n\n return (\n <div role=\"note\" className={cn('rounded-xl p-4 ring-1', styles.wrapper, className)}>\n <div className=\"flex gap-3\">\n <span className={cn('mt-0.5 shrink-0 text-sm font-bold', styles.icon)} aria-hidden=\"true\">\n {icon ?? styles.iconChar}\n </span>\n <div className=\"min-w-0 flex-1\">\n {title && <p className=\"text-sm font-semibold text-zinc-950 dark:text-white\">{title}</p>}\n <div className={cn('text-sm text-zinc-700 dark:text-zinc-300', title && 'mt-1')}>\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { createContext, type ReactNode, use, useId, useMemo } from 'react';\n\ninterface FieldContextValue {\n /** ID for the form control element */\n controlId: string;\n /** ID for the label element */\n labelId: string;\n /** ID for the description element */\n descriptionId: string;\n /** ID for the error message element */\n errorId: string;\n /** Whether the field is disabled */\n disabled: boolean;\n}\n\nconst FieldContext = createContext<FieldContextValue | null>(null);\n\nexport function useFieldContext(): FieldContextValue | null {\n return use(FieldContext);\n}\n\ninterface FieldProviderProps {\n children: ReactNode;\n disabled?: boolean;\n}\n\nexport function FieldProvider({ children, disabled = false }: FieldProviderProps): ReactNode {\n const id = useId();\n\n const value = useMemo<FieldContextValue>(\n () => ({\n controlId: `${id}-control`,\n labelId: `${id}-label`,\n descriptionId: `${id}-description`,\n errorId: `${id}-error`,\n disabled,\n }),\n [id, disabled],\n );\n\n return <FieldContext value={value}>{children}</FieldContext>;\n}\n\n/**\n * Returns ARIA props for a form control that participates in a Field.\n * Safe to call outside a Field — returns empty object if no context.\n */\nexport function useFieldControlProps(): Record<string, string | undefined> {\n const ctx = useFieldContext();\n if (!ctx) return {};\n\n return {\n id: ctx.controlId,\n 'aria-labelledby': ctx.labelId,\n 'aria-describedby': ctx.descriptionId,\n 'data-disabled': ctx.disabled ? '' : undefined,\n };\n}\n\n/**\n * Returns props for a label element within a Field.\n */\nexport function useFieldLabelProps(): Record<string, string | undefined> {\n const ctx = useFieldContext();\n if (!ctx) return {};\n\n return {\n id: ctx.labelId,\n htmlFor: ctx.controlId,\n 'data-disabled': ctx.disabled ? '' : undefined,\n };\n}\n\n/**\n * Returns props for a description element within a Field.\n */\nexport function useFieldDescriptionProps(): Record<string, string | undefined> {\n const ctx = useFieldContext();\n if (!ctx) return {};\n\n return {\n id: ctx.descriptionId,\n 'data-disabled': ctx.disabled ? '' : undefined,\n };\n}\n\n/**\n * Returns props for an error message element within a Field.\n */\nexport function useFieldErrorProps(): Record<string, string | undefined> {\n const ctx = useFieldContext();\n if (!ctx) return {};\n\n return {\n id: ctx.errorId,\n 'data-disabled': ctx.disabled ? '' : undefined,\n };\n}\n","import { useCallback, useRef, useState } from 'react';\n\nexport function useControllableState<T>({\n value: controlledValue,\n defaultValue,\n onChange,\n}: {\n value?: T;\n defaultValue: T;\n onChange?: (value: T) => void;\n}): [T, (next: T | ((prev: T) => T)) => void] {\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n\n // Use ref to avoid stale closure over onChange\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T | ((prev: T) => T)) => {\n const resolvedValue = typeof next === 'function' ? (next as (prev: T) => T)(value) : next;\n\n if (!isControlled) {\n setInternalValue(resolvedValue);\n }\n onChangeRef.current?.(resolvedValue);\n },\n [isControlled, value],\n );\n\n return [value, setValue];\n}\n","import { useCallback } from 'react';\nimport { useControllableState } from './use-controllable-state.js';\n\ninterface UseToggleOptions {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n}\n\ninterface UseToggleReturn {\n checked: boolean;\n toggle: () => void;\n toggleProps: {\n 'aria-checked': boolean;\n 'data-checked': string | undefined;\n tabIndex: number;\n onClick: () => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n };\n}\n\nexport function useToggle({\n checked: controlledChecked,\n defaultChecked = false,\n onChange,\n disabled = false,\n}: UseToggleOptions = {}): UseToggleReturn {\n const [checked, setChecked] = useControllableState({\n value: controlledChecked,\n defaultValue: defaultChecked,\n onChange,\n });\n\n const toggle = useCallback(() => {\n if (!disabled) {\n setChecked((prev) => !prev);\n }\n }, [disabled, setChecked]);\n\n const onClick = useCallback(() => {\n toggle();\n }, [toggle]);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === ' ') {\n e.preventDefault();\n toggle();\n }\n },\n [toggle],\n );\n\n return {\n checked,\n toggle,\n toggleProps: {\n 'aria-checked': checked,\n 'data-checked': checked ? '' : undefined,\n tabIndex: 0,\n onClick,\n onKeyDown,\n },\n };\n}\n","import type React from 'react';\nimport { useCallback } from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { FieldProvider } from '../hooks/use-field-context.js';\nimport { useToggle } from '../hooks/use-toggle.js';\nimport { cn } from '../utils/cn.js';\n\nexport function CheckboxGroup({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n data-slot=\"control\"\n {...props}\n className={cn(\n className,\n // Basic groups\n 'space-y-3',\n // With descriptions\n 'has-data-[slot=description]:space-y-6 has-data-[slot=description]:**:data-[slot=label]:font-medium',\n )}\n />\n );\n}\n\nexport function CheckboxField({\n className,\n disabled,\n ...props\n}: {\n className?: string;\n disabled?: boolean;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className'>) {\n return (\n <FieldProvider disabled={disabled}>\n <div\n data-slot=\"field\"\n data-disabled={disabled ? '' : undefined}\n {...props}\n className={cn(\n className,\n // Base layout\n 'grid grid-cols-[1.125rem_1fr] gap-x-4 gap-y-1 sm:grid-cols-[1rem_1fr]',\n // Control layout\n '*:data-[slot=control]:col-start-1 *:data-[slot=control]:row-start-1 *:data-[slot=control]:mt-0.75 sm:*:data-[slot=control]:mt-1',\n // Label layout\n '*:data-[slot=label]:col-start-2 *:data-[slot=label]:row-start-1',\n // Description layout\n '*:data-[slot=description]:col-start-2 *:data-[slot=description]:row-start-2',\n // With description\n 'has-data-[slot=description]:**:data-[slot=label]:font-medium',\n )}\n />\n </FieldProvider>\n );\n}\n\nconst base = [\n // Basic layout\n 'relative isolate flex size-4.5 items-center justify-center rounded-[0.3125rem] sm:size-4',\n // Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode\n 'before:absolute before:inset-0 before:-z-10 before:rounded-[calc(0.3125rem-1px)] before:bg-white before:shadow-sm',\n // Background color when checked\n 'group-data-checked:before:bg-(--checkbox-checked-bg)',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Background color applied to control in dark mode\n 'dark:bg-white/5 dark:group-data-checked:bg-(--checkbox-checked-bg)',\n // Border\n 'border border-zinc-950/15 group-data-checked:border-transparent group-data-hover:group-data-checked:border-transparent group-data-hover:border-zinc-950/30 group-data-checked:bg-(--checkbox-checked-border)',\n 'dark:border-white/15 dark:group-data-checked:border-white/5 dark:group-data-hover:group-data-checked:border-white/5 dark:group-data-hover:border-white/30',\n // Inner highlight shadow\n 'after:absolute after:inset-0 after:rounded-[calc(0.3125rem-1px)] after:shadow-[inset_0_1px_--theme(--color-white/15%)]',\n 'dark:after:-inset-px dark:after:hidden dark:after:rounded-[0.3125rem] dark:group-data-checked:after:block',\n // Focus ring\n 'group-data-focus:outline-2 group-data-focus:outline-offset-2 group-data-focus:outline-blue-500',\n // Disabled state\n 'group-data-disabled:opacity-50',\n 'group-data-disabled:border-zinc-950/25 group-data-disabled:bg-zinc-950/5 group-data-disabled:[--checkbox-check:var(--color-zinc-950)]/50 group-data-disabled:before:bg-transparent',\n 'dark:group-data-disabled:border-white/20 dark:group-data-disabled:bg-white/2.5 dark:group-data-disabled:[--checkbox-check:var(--color-white)]/50 dark:group-data-checked:group-data-disabled:after:hidden',\n // Forced colors mode\n 'forced-colors:[--checkbox-check:HighlightText] forced-colors:[--checkbox-checked-bg:Highlight] forced-colors:group-data-disabled:[--checkbox-check:Highlight]',\n 'dark:forced-colors:[--checkbox-check:HighlightText] dark:forced-colors:[--checkbox-checked-bg:Highlight] dark:forced-colors:group-data-disabled:[--checkbox-check:Highlight]',\n];\n\nconst colors = {\n 'dark/zinc': [\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-zinc-900)] [--checkbox-checked-border:var(--color-zinc-950)]/90',\n 'dark:[--checkbox-checked-bg:var(--color-zinc-600)]',\n ],\n 'dark/white': [\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-zinc-900)] [--checkbox-checked-border:var(--color-zinc-950)]/90',\n 'dark:[--checkbox-check:var(--color-zinc-900)] dark:[--checkbox-checked-bg:var(--color-white)] dark:[--checkbox-checked-border:var(--color-zinc-950)]/15',\n ],\n white:\n '[--checkbox-check:var(--color-zinc-900)] [--checkbox-checked-bg:var(--color-white)] [--checkbox-checked-border:var(--color-zinc-950)]/15',\n dark: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-zinc-900)] [--checkbox-checked-border:var(--color-zinc-950)]/90',\n zinc: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-zinc-600)] [--checkbox-checked-border:var(--color-zinc-700)]/90',\n red: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-red-600)] [--checkbox-checked-border:var(--color-red-700)]/90',\n orange:\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-orange-500)] [--checkbox-checked-border:var(--color-orange-600)]/90',\n amber:\n '[--checkbox-check:var(--color-amber-950)] [--checkbox-checked-bg:var(--color-amber-400)] [--checkbox-checked-border:var(--color-amber-500)]/80',\n yellow:\n '[--checkbox-check:var(--color-yellow-950)] [--checkbox-checked-bg:var(--color-yellow-300)] [--checkbox-checked-border:var(--color-yellow-400)]/80',\n lime: '[--checkbox-check:var(--color-lime-950)] [--checkbox-checked-bg:var(--color-lime-300)] [--checkbox-checked-border:var(--color-lime-400)]/80',\n green:\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-green-600)] [--checkbox-checked-border:var(--color-green-700)]/90',\n emerald:\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-emerald-600)] [--checkbox-checked-border:var(--color-emerald-700)]/90',\n teal: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-teal-600)] [--checkbox-checked-border:var(--color-teal-700)]/90',\n cyan: '[--checkbox-check:var(--color-cyan-950)] [--checkbox-checked-bg:var(--color-cyan-300)] [--checkbox-checked-border:var(--color-cyan-400)]/80',\n sky: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-sky-500)] [--checkbox-checked-border:var(--color-sky-600)]/80',\n blue: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-blue-600)] [--checkbox-checked-border:var(--color-blue-700)]/90',\n indigo:\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-indigo-500)] [--checkbox-checked-border:var(--color-indigo-600)]/90',\n violet:\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-violet-500)] [--checkbox-checked-border:var(--color-violet-600)]/90',\n purple:\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-purple-500)] [--checkbox-checked-border:var(--color-purple-600)]/90',\n fuchsia:\n '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-fuchsia-500)] [--checkbox-checked-border:var(--color-fuchsia-600)]/90',\n pink: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-pink-500)] [--checkbox-checked-border:var(--color-pink-600)]/90',\n rose: '[--checkbox-check:var(--color-white)] [--checkbox-checked-bg:var(--color-rose-500)] [--checkbox-checked-border:var(--color-rose-600)]/90',\n};\n\ntype Color = keyof typeof colors;\n\nexport function Checkbox({\n color = 'dark/zinc',\n className,\n checked: controlledChecked,\n defaultChecked,\n onChange,\n disabled,\n indeterminate,\n name,\n value,\n ...props\n}: {\n color?: Color;\n className?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n indeterminate?: boolean;\n name?: string;\n value?: string;\n} & Omit<React.ComponentPropsWithoutRef<'span'>, 'className' | 'onChange'>) {\n const { checked, toggleProps } = useToggle({\n checked: controlledChecked,\n defaultChecked,\n onChange,\n disabled,\n });\n const interactiveProps = useDataInteractive({ disabled });\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === ' ') {\n e.preventDefault();\n toggleProps.onKeyDown(e);\n }\n },\n [toggleProps],\n );\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: headless checkbox intentionally exposes checkbox semantics on a custom control\n <span\n data-slot=\"control\"\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n data-checked={checked ? '' : undefined}\n data-indeterminate={indeterminate ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n tabIndex={disabled ? undefined : 0}\n onClick={disabled ? undefined : toggleProps.onClick}\n onKeyDown={disabled ? undefined : handleKeyDown}\n {...interactiveProps}\n {...props}\n className={cn(className, 'group inline-flex focus:outline-hidden')}\n >\n {name && <input type=\"hidden\" name={name} value={checked ? (value ?? 'on') : ''} />}\n <span className={cn([base, colors[color]])}>\n <svg\n className=\"size-4 stroke-(--checkbox-check) opacity-0 group-data-checked:opacity-100 sm:h-3.5 sm:w-3.5\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n >\n <title>Checkmark</title>\n {/* Checkmark icon */}\n <path\n className=\"opacity-100 group-data-indeterminate:opacity-0\"\n d=\"M3 8L6 11L11 3.5\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n {/* Indeterminate icon */}\n <path\n className=\"opacity-0 group-data-indeterminate:opacity-100\"\n d=\"M3 7H11\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </span>\n );\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport function CodeBlock({\n code,\n language,\n filename,\n showCopy = true,\n className,\n}: {\n code: string;\n language?: string;\n filename?: string;\n showCopy?: boolean;\n className?: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(async () => {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [code]);\n\n return (\n <div className={cn('overflow-hidden rounded-xl bg-zinc-950 ring-1 ring-zinc-800', className)}>\n {(filename || language || showCopy) && (\n <div className=\"flex items-center justify-between border-b border-zinc-800 px-4 py-2.5\">\n <div className=\"flex items-center gap-2\">\n {filename && <span className=\"text-xs text-zinc-400\">{filename}</span>}\n {language && !filename && (\n <span className=\"rounded bg-zinc-800 px-1.5 py-0.5 text-xs text-zinc-400\">\n {language}\n </span>\n )}\n </div>\n {showCopy && (\n <button\n type=\"button\"\n onClick={() => void handleCopy()}\n aria-label={copied ? 'Copied' : 'Copy code'}\n className=\"rounded px-2 py-1 text-xs text-zinc-400 transition-colors hover:bg-zinc-800 hover:text-zinc-200 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500\"\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n )}\n </div>\n )}\n <pre className=\"overflow-x-auto p-4 text-sm leading-relaxed text-zinc-300\">\n <code>{code}</code>\n </pre>\n </div>\n );\n}\n","import { type RefObject, useEffect, useRef } from 'react';\n\nexport function useClickOutside(\n refs: RefObject<HTMLElement | null> | RefObject<HTMLElement | null>[],\n onClickOutside: () => void,\n enabled = true,\n): void {\n const callbackRef = useRef(onClickOutside);\n callbackRef.current = onClickOutside;\n\n useEffect(() => {\n if (!enabled) return;\n\n function handlePointerDown(e: PointerEvent) {\n const target = e.target as Node;\n const refArray = Array.isArray(refs) ? refs : [refs];\n const isOutside = refArray.every((ref) => !ref.current?.contains(target));\n if (isOutside) {\n callbackRef.current();\n }\n }\n\n // Use pointerdown on capture phase to fire before focus changes\n document.addEventListener('pointerdown', handlePointerDown, true);\n return () => document.removeEventListener('pointerdown', handlePointerDown, true);\n }, [refs, enabled]);\n}\n","import { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\ntype Anchor =\n | 'top'\n | 'top start'\n | 'top end'\n | 'bottom'\n | 'bottom start'\n | 'bottom end'\n | 'selection start';\n\ninterface UsePopoverOptions {\n /** Whether the popover is open */\n open: boolean;\n /** Preferred anchor position */\n anchor?: Anchor;\n /** Gap between trigger and popover (px) */\n gap?: number;\n /** Padding from viewport edges (px) */\n padding?: number;\n}\n\ninterface PopoverPosition {\n top: number;\n left: number;\n maxHeight: number;\n}\n\ninterface UsePopoverReturn {\n triggerRef: RefObject<HTMLElement | null>;\n popoverRef: RefObject<HTMLElement | null>;\n position: PopoverPosition;\n popoverProps: {\n style: React.CSSProperties;\n };\n}\n\nfunction computePosition(\n trigger: HTMLElement,\n popover: HTMLElement,\n anchor: Anchor,\n gap: number,\n padding: number,\n): PopoverPosition {\n const triggerRect = trigger.getBoundingClientRect();\n const popoverRect = popover.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n let top: number;\n let left: number;\n let maxHeight: number;\n\n // Vertical positioning\n const isTop = anchor.startsWith('top');\n const spaceBelow = viewportHeight - triggerRect.bottom - gap - padding;\n const spaceAbove = triggerRect.top - gap - padding;\n\n if (anchor === 'selection start') {\n // Position at the selection start (aligned with trigger)\n top = triggerRect.top;\n maxHeight = viewportHeight - top - padding;\n } else if (isTop) {\n top = triggerRect.top - popoverRect.height - gap;\n maxHeight = spaceAbove;\n // Flip to bottom if not enough space\n if (top < padding && spaceBelow > spaceAbove) {\n top = triggerRect.bottom + gap;\n maxHeight = spaceBelow;\n }\n } else {\n top = triggerRect.bottom + gap;\n maxHeight = spaceBelow;\n // Flip to top if not enough space\n if (top + popoverRect.height > viewportHeight - padding && spaceAbove > spaceBelow) {\n top = triggerRect.top - popoverRect.height - gap;\n maxHeight = spaceAbove;\n }\n }\n\n // Horizontal positioning\n const isEnd = anchor.endsWith('end');\n const isStart = anchor.endsWith('start');\n\n if (isEnd) {\n left = triggerRect.right - popoverRect.width;\n } else if (isStart || anchor === 'selection start') {\n left = triggerRect.left;\n } else {\n // Center\n left = triggerRect.left + (triggerRect.width - popoverRect.width) / 2;\n }\n\n // Clamp to viewport\n left = Math.max(padding, Math.min(left, viewportWidth - popoverRect.width - padding));\n top = Math.max(padding, top);\n\n return { top, left, maxHeight: Math.max(100, maxHeight) };\n}\n\nexport function usePopover({\n open,\n anchor = 'bottom',\n gap = 8,\n padding = 4,\n}: UsePopoverOptions): UsePopoverReturn {\n const triggerRef = useRef<HTMLElement | null>(null);\n const popoverRef = useRef<HTMLElement | null>(null);\n const [position, setPosition] = useState<PopoverPosition>({\n top: 0,\n left: 0,\n maxHeight: 300,\n });\n\n const updatePosition = useCallback(() => {\n if (!(triggerRef.current && popoverRef.current && open)) return;\n const pos = computePosition(triggerRef.current, popoverRef.current, anchor, gap, padding);\n setPosition(pos);\n }, [open, anchor, gap, padding]);\n\n // Update position when open changes or on scroll/resize\n useEffect(() => {\n if (!open) return;\n\n // Initial positioning (after popover renders)\n requestAnimationFrame(updatePosition);\n\n window.addEventListener('scroll', updatePosition, true);\n window.addEventListener('resize', updatePosition);\n\n return () => {\n window.removeEventListener('scroll', updatePosition, true);\n window.removeEventListener('resize', updatePosition);\n };\n }, [open, updatePosition]);\n\n return {\n triggerRef,\n popoverRef,\n position,\n popoverProps: {\n style: {\n position: 'fixed',\n top: position.top,\n left: position.left,\n maxHeight: position.maxHeight,\n zIndex: 50,\n },\n },\n };\n}\n","'use client';\n\nimport type React from 'react';\nimport { createContext, use, useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useClickOutside } from '../hooks/use-click-outside.js';\nimport { useControllableState } from '../hooks/use-controllable-state.js';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { usePopover } from '../hooks/use-popover.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { cn } from '../utils/cn.js';\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface ComboboxContextValue<T = unknown> {\n selectedValue: T | null;\n activeIndex: number;\n filteredOptions: T[];\n select: (value: T) => void;\n setActiveIndex: (index: number) => void;\n}\n\nconst ComboboxContext = createContext<ComboboxContextValue | null>(null);\n\nfunction useComboboxContext(): ComboboxContextValue {\n const ctx = use(ComboboxContext);\n if (!ctx) {\n throw new Error('Combobox compound components must be used within <Combobox>');\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Combobox\n// ---------------------------------------------------------------------------\n\nexport function Combobox<T>({\n options,\n displayValue,\n filter,\n anchor = 'bottom',\n className,\n placeholder,\n autoFocus = false,\n 'aria-label': ariaLabel,\n children,\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = false,\n name,\n}: {\n options: T[];\n displayValue: (value: T | null) => string | undefined;\n filter?: (value: T, query: string) => boolean;\n className?: string;\n placeholder?: string | undefined;\n autoFocus?: boolean | undefined;\n 'aria-label'?: string;\n children: (value: NonNullable<T>) => React.ReactElement;\n value?: T | null;\n defaultValue?: T | null;\n onChange?: (value: T) => void;\n disabled?: boolean;\n name?: string;\n anchor?: 'top' | 'bottom';\n}) {\n const [selectedValue, setSelectedValue] = useControllableState<T | null>({\n value: controlledValue,\n defaultValue: defaultValue ?? null,\n onChange: onChange as ((value: T | null) => void) | undefined,\n });\n\n const [query, setQuery] = useState('');\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = useRef<HTMLSpanElement>(null);\n const listboxId = useId();\n\n // Filtering\n const filteredOptions =\n query === ''\n ? options\n : options.filter((option) =>\n filter\n ? filter(option, query)\n : displayValue(option)?.toLowerCase().includes(query.toLowerCase()),\n );\n\n // Popover positioning\n const { triggerRef, popoverRef, popoverProps } = usePopover({\n open: isOpen,\n anchor,\n gap: 8,\n padding: 16,\n });\n\n // Sync control span as the trigger\n useEffect(() => {\n if (controlRef.current) {\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current = controlRef.current;\n }\n }, [triggerRef]);\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n inputRef.current?.focus();\n }\n }, [autoFocus, disabled]);\n\n // Transition\n const { mounted, nodeRef: transitionRef, transitionProps } = useTransition(isOpen);\n\n // Dismiss handlers\n useClickOutside(\n [controlRef, popoverRef],\n () => {\n if (isOpen) close();\n },\n isOpen,\n );\n\n useEscapeKey(() => {\n if (isOpen) close();\n }, isOpen);\n\n // Helpers\n const open = useCallback(() => {\n if (disabled) return;\n setIsOpen(true);\n setActiveIndex(-1);\n }, [disabled]);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setQuery('');\n setActiveIndex(-1);\n }, []);\n\n const select = useCallback(\n (value: T) => {\n setSelectedValue(value);\n close();\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n },\n [setSelectedValue, close],\n );\n\n // Keyboard navigation\n const handleInputKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n if (!isOpen) {\n open();\n } else {\n setActiveIndex((prev) => (prev < filteredOptions.length - 1 ? prev + 1 : 0));\n }\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n if (!isOpen) {\n open();\n } else {\n setActiveIndex((prev) => (prev > 0 ? prev - 1 : filteredOptions.length - 1));\n }\n break;\n }\n case 'Home': {\n if (isOpen) {\n e.preventDefault();\n setActiveIndex(0);\n }\n break;\n }\n case 'End': {\n if (isOpen) {\n e.preventDefault();\n setActiveIndex(filteredOptions.length - 1);\n }\n break;\n }\n case 'Enter': {\n e.preventDefault();\n if (isOpen && activeIndex >= 0 && activeIndex < filteredOptions.length) {\n select(filteredOptions[activeIndex] as T);\n }\n break;\n }\n case 'Tab': {\n if (isOpen) {\n close();\n }\n break;\n }\n }\n },\n [isOpen, open, close, select, activeIndex, filteredOptions],\n );\n\n // Scroll active option into view\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return;\n const listbox = popoverRef.current;\n if (!listbox) return;\n const activeOption = listbox.querySelector(`[data-combobox-option-index=\"${activeIndex}\"]`);\n if (activeOption) {\n activeOption.scrollIntoView({ block: 'nearest' });\n }\n }, [activeIndex, isOpen, popoverRef]);\n\n // Context value\n const contextValue: ComboboxContextValue<T> = {\n selectedValue,\n activeIndex,\n filteredOptions,\n select: select as (value: unknown) => void,\n setActiveIndex,\n };\n\n return (\n <ComboboxContext.Provider value={contextValue as ComboboxContextValue}>\n <span\n ref={controlRef}\n data-slot=\"control\"\n {...(disabled ? { 'data-disabled': '' } : {})}\n className={cn([\n className,\n 'relative block w-full',\n 'before:absolute before:inset-px before:rounded-[calc(var(--radius-lg)-1px)] before:bg-white before:shadow-sm',\n 'dark:before:hidden',\n 'after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset sm:focus-within:after:ring-2 sm:focus-within:after:ring-blue-500',\n 'has-data-disabled:opacity-50 has-data-disabled:before:bg-zinc-950/5 has-data-disabled:before:shadow-none',\n 'has-data-invalid:before:shadow-red-500/10',\n ])}\n >\n <input\n ref={inputRef}\n data-slot=\"control\"\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-activedescendant={\n isOpen && activeIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined\n }\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n disabled={disabled}\n name={name}\n value={isOpen ? query : (displayValue(selectedValue) ?? '')}\n onChange={(e) => {\n setQuery(e.target.value);\n if (!isOpen) open();\n setActiveIndex(-1);\n }}\n onFocus={() => {\n if (!isOpen) open();\n }}\n onKeyDown={handleInputKeyDown}\n placeholder={placeholder}\n {...(disabled ? { 'data-disabled': '' } : {})}\n className={cn([\n className,\n 'relative block w-full appearance-none rounded-lg py-[calc(--spacing(2.5)-1px)] sm:py-[calc(--spacing(1.5)-1px)]',\n 'pr-[calc(--spacing(10)-1px)] pl-[calc(--spacing(3.5)-1px)] sm:pr-[calc(--spacing(9)-1px)] sm:pl-[calc(--spacing(3)-1px)]',\n 'text-base/6 text-zinc-950 placeholder:text-zinc-500 sm:text-sm/6 dark:text-white',\n 'border border-zinc-950/10 data-hover:border-zinc-950/20 dark:border-white/10 dark:data-hover:border-white/20',\n 'bg-transparent dark:bg-white/5',\n 'focus:outline-hidden',\n 'data-invalid:border-red-500 data-invalid:data-hover:border-red-500 dark:data-invalid:border-red-500 dark:data-invalid:data-hover:border-red-500',\n 'data-disabled:border-zinc-950/20 dark:data-disabled:border-white/15 dark:data-disabled:bg-white/2.5 dark:data-hover:data-disabled:border-white/15',\n 'dark:scheme-dark',\n ])}\n />\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label=\"Toggle options\"\n disabled={disabled}\n onClick={() => {\n if (isOpen) {\n close();\n } else {\n open();\n inputRef.current?.focus();\n }\n }}\n className=\"group absolute inset-y-0 right-0 flex items-center px-2\"\n {...(disabled ? { 'data-disabled': '' } : {})}\n >\n <svg\n className=\"size-5 stroke-zinc-500 group-data-disabled:stroke-zinc-600 group-data-hover:stroke-zinc-700 sm:size-4 dark:stroke-zinc-400 dark:group-data-hover:stroke-zinc-300 forced-colors:stroke-[CanvasText]\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n fill=\"none\"\n >\n <path\n d=\"M5.75 10.75L8 13L10.25 10.75\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.25 5.25L8 3L5.75 5.25\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </span>\n\n {/* Options panel via portal */}\n {mounted &&\n createPortal(\n <div\n ref={(node) => {\n (popoverRef as React.MutableRefObject<HTMLElement | null>).current = node;\n (transitionRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n role=\"listbox\"\n id={listboxId}\n {...popoverProps}\n {...transitionProps}\n className={cn(\n '[--anchor-gap:--spacing(2)] [--anchor-padding:--spacing(4)] sm:data-[anchor~=start]:[--anchor-offset:-4px]',\n 'isolate min-w-[calc(var(--input-width)+8px)] scroll-py-1 rounded-xl p-1 select-none empty:invisible',\n 'outline outline-transparent focus:outline-hidden',\n 'overflow-y-scroll overscroll-contain',\n 'bg-white/75 backdrop-blur-xl dark:bg-zinc-800/75',\n 'shadow-lg ring-1 ring-zinc-950/10 dark:ring-white/10 dark:ring-inset',\n 'transition-opacity duration-100 ease-in data-closed:data-leave:opacity-0 data-transition:pointer-events-none',\n )}\n style={{\n ...popoverProps.style,\n minWidth: controlRef.current?.offsetWidth,\n }}\n >\n {filteredOptions.map((option, index) =>\n option == null ? null : (\n // biome-ignore lint/suspicious/noArrayIndexKey: filtered options have no stable ID\n <ComboboxOptionIndexProvider key={index} index={index}>\n {children(option)}\n </ComboboxOptionIndexProvider>\n ),\n )}\n </div>,\n document.body,\n )}\n </ComboboxContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Internal: option index provider\n// ---------------------------------------------------------------------------\n\nconst ComboboxOptionIndexContext = createContext<number>(-1);\n\nfunction ComboboxOptionIndexProvider({\n index,\n children,\n}: {\n index: number;\n children: React.ReactNode;\n}) {\n return (\n <ComboboxOptionIndexContext.Provider value={index}>\n {children}\n </ComboboxOptionIndexContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ComboboxOption\n// ---------------------------------------------------------------------------\n\nexport function ComboboxOption<T>({\n children,\n className,\n value,\n disabled = false,\n}: {\n className?: string;\n children?: React.ReactNode;\n value: T;\n disabled?: boolean;\n}) {\n const { selectedValue, activeIndex, select, setActiveIndex } = useComboboxContext();\n const index = use(ComboboxOptionIndexContext);\n\n const isSelected = selectedValue === value;\n const isActive = activeIndex === index;\n\n const sharedClasses = cn(\n 'flex min-w-0 items-center',\n '*:data-[slot=icon]:size-5 *:data-[slot=icon]:shrink-0 sm:*:data-[slot=icon]:size-4',\n '*:data-[slot=icon]:text-zinc-500 group-data-focus/option:*:data-[slot=icon]:text-white dark:*:data-[slot=icon]:text-zinc-400',\n 'forced-colors:*:data-[slot=icon]:text-[CanvasText] forced-colors:group-data-focus/option:*:data-[slot=icon]:text-[Canvas]',\n '*:data-[slot=avatar]:-mx-0.5 *:data-[slot=avatar]:size-6 sm:*:data-[slot=avatar]:size-5',\n );\n\n return (\n // biome-ignore lint/a11y/useFocusableInteractive: focus managed by roving tabindex\n // biome-ignore lint/a11y/useKeyWithClickEvents: keyboard selection is handled by the parent combobox input\n <div\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={disabled}\n data-combobox-option-index={index}\n {...(isActive ? { 'data-focus': '' } : {})}\n {...(isSelected ? { 'data-selected': '' } : {})}\n {...(disabled ? { 'data-disabled': '' } : {})}\n onPointerEnter={() => {\n if (!disabled) setActiveIndex(index);\n }}\n onPointerLeave={() => {\n setActiveIndex(-1);\n }}\n onClick={() => {\n if (!disabled) select(value);\n }}\n className={cn(\n 'group/option grid w-full cursor-default grid-cols-[1fr_--spacing(5)] items-baseline gap-x-2 rounded-lg py-2.5 pr-2 pl-3.5 sm:grid-cols-[1fr_--spacing(4)] sm:py-1.5 sm:pr-2 sm:pl-3',\n 'text-base/6 text-zinc-950 sm:text-sm/6 dark:text-white forced-colors:text-[CanvasText]',\n 'outline-hidden data-focus:bg-blue-500 data-focus:text-white',\n 'forced-color-adjust-none forced-colors:data-focus:bg-[Highlight] forced-colors:data-focus:text-[HighlightText]',\n 'data-disabled:opacity-50',\n )}\n >\n <span className={cn(className, sharedClasses)}>{children}</span>\n <svg\n className=\"relative col-start-2 hidden size-5 self-center stroke-current group-data-selected/option:inline sm:size-4\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 8.5l3 3L12 4\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ComboboxLabel\n// ---------------------------------------------------------------------------\n\nexport function ComboboxLabel({ className, ...props }: React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n {...props}\n className={cn(className, 'ml-2.5 truncate first:ml-0 sm:ml-2 sm:first:ml-0')}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// ComboboxDescription\n// ---------------------------------------------------------------------------\n\nexport function ComboboxDescription({\n className,\n children,\n ...props\n}: React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n {...props}\n className={cn(\n className,\n 'flex flex-1 overflow-hidden text-zinc-500 group-data-focus/option:text-white before:w-2 before:min-w-0 before:shrink dark:text-zinc-400',\n )}\n >\n <span className=\"flex-1 truncate\">{children}</span>\n </span>\n );\n}\n","import { cn } from '../utils/cn.js';\n\nexport function DescriptionList({ className, ...props }: React.ComponentPropsWithoutRef<'dl'>) {\n return (\n <dl\n {...props}\n className={cn(\n className,\n 'grid grid-cols-1 text-base/6 sm:grid-cols-[min(50%,--spacing(80))_auto] sm:text-sm/6',\n )}\n />\n );\n}\n\nexport function DescriptionTerm({ className, ...props }: React.ComponentPropsWithoutRef<'dt'>) {\n return (\n <dt\n {...props}\n className={cn(\n className,\n 'col-start-1 border-t border-zinc-950/5 pt-3 text-zinc-500 first:border-none sm:border-t sm:border-zinc-950/5 sm:py-3 dark:border-white/5 dark:text-zinc-400 sm:dark:border-white/5',\n )}\n />\n );\n}\n\nexport function DescriptionDetails({ className, ...props }: React.ComponentPropsWithoutRef<'dd'>) {\n return (\n <dd\n {...props}\n className={cn(\n className,\n 'pt-1 pb-3 text-zinc-950 sm:border-t sm:border-zinc-950/5 sm:py-3 sm:nth-2:border-none dark:text-white dark:sm:border-white/5',\n )}\n />\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { createContext, use, useId, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { useFocusTrap } from '../hooks/use-focus-trap.js';\nimport { useScrollLock } from '../hooks/use-scroll-lock.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { cn } from '../utils/cn.js';\nimport { Text } from './text.js';\n\nconst DialogContext = createContext<string | undefined>(undefined);\n\nconst sizes = {\n xs: 'sm:max-w-xs',\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-lg',\n xl: 'sm:max-w-xl',\n '2xl': 'sm:max-w-2xl',\n '3xl': 'sm:max-w-3xl',\n '4xl': 'sm:max-w-4xl',\n '5xl': 'sm:max-w-5xl',\n};\n\nexport function Dialog({\n size = 'lg',\n className,\n children,\n open,\n onClose,\n}: {\n size?: keyof typeof sizes;\n className?: string;\n children: React.ReactNode;\n open: boolean;\n onClose: () => void;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n\n const backdrop = useTransition(open);\n const panel = useTransition(open);\n\n useScrollLock(open);\n useFocusTrap(panelRef, open);\n useEscapeKey(onClose, open);\n\n if (!(backdrop.mounted || panel.mounted)) return null;\n\n return createPortal(\n <DialogContext.Provider value={titleId}>\n <div role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n {/* Backdrop */}\n {backdrop.mounted && (\n <button\n type=\"button\"\n aria-label=\"Close dialog\"\n ref={backdrop.nodeRef as React.RefObject<HTMLButtonElement>}\n {...backdrop.transitionProps}\n onClick={onClose}\n className=\"fixed inset-0 flex w-screen justify-center overflow-y-auto px-2 py-2 transition duration-100 focus:outline-0 data-closed:opacity-0 data-enter:ease-out data-leave:ease-in sm:px-6 sm:py-8 lg:px-8 lg:py-16\"\n style={{\n backgroundColor: 'oklch(0.13 0.004 228 / 0.6)',\n backdropFilter: 'blur(4px)',\n }}\n />\n )}\n\n {/* Panel container */}\n {panel.mounted && (\n <div className=\"fixed inset-0 w-screen overflow-y-auto pt-6 sm:pt-0\">\n <div className=\"grid min-h-full grid-rows-[1fr_auto] justify-items-center sm:grid-rows-[1fr_auto_3fr] sm:p-4\">\n <div\n ref={(node) => {\n // Combine refs\n (panelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n (panel.nodeRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n {...panel.transitionProps}\n className={cn(\n className,\n sizes[size],\n 'row-start-2 w-full min-w-0 rounded-t-3xl p-(--gutter) shadow-lg ring-1 [--gutter:--spacing(8)] sm:mb-auto sm:rounded-2xl forced-colors:outline',\n 'transition will-change-transform data-closed:translate-y-12 data-closed:opacity-0 data-enter:ease-out data-leave:ease-in sm:data-closed:translate-y-0 sm:data-closed:data-enter:scale-95',\n )}\n style={\n {\n backgroundColor: 'var(--rvui-surface-1, oklch(0.18 0.006 225))',\n boxShadow: 'var(--rvui-shadow-lg, 0 12px 40px oklch(0 0 0 / 0.35))',\n '--tw-ring-color': 'var(--rvui-border-subtle, oklch(0.28 0.006 222 / 0.4))',\n transitionDuration: 'var(--rvui-duration-normal, 200ms)',\n transitionTimingFunction:\n 'var(--rvui-ease-spring, cubic-bezier(0.34, 1.56, 0.64, 1))',\n } as React.CSSProperties\n }\n >\n {children}\n </div>\n </div>\n </div>\n )}\n </div>\n </DialogContext.Provider>,\n document.body,\n );\n}\n\nexport function DialogTitle({\n className,\n ...props\n}: { className?: string } & React.ComponentPropsWithoutRef<'h2'>) {\n const titleId = use(DialogContext);\n return (\n <h2\n id={titleId}\n {...props}\n className={cn(className, 'text-lg/6 font-semibold text-balance sm:text-base/6')}\n style={{ color: 'var(--rvui-text-0, oklch(0.95 0.002 210))' }}\n />\n );\n}\n\nexport function DialogDescription({\n className,\n ...props\n}: { className?: string } & React.ComponentPropsWithoutRef<typeof Text>) {\n return <Text {...props} className={cn(className, 'mt-2 text-pretty')} />;\n}\n\nexport function DialogBody({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div {...props} className={cn(className, 'mt-6')} />;\n}\n\nexport function DialogActions({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n {...props}\n className={cn(\n className,\n 'mt-8 flex flex-col-reverse items-center justify-end gap-3 *:w-full sm:flex-row sm:*:w-auto',\n )}\n />\n );\n}\n","import { cn } from '../utils/cn.js';\n\nexport function Divider({\n soft = false,\n className,\n ...props\n}: { soft?: boolean } & React.ComponentPropsWithoutRef<'hr'>) {\n return (\n <hr\n {...props}\n className={cn(\n className,\n 'w-full border-t',\n soft && 'border-zinc-950/5 dark:border-white/5',\n !soft && 'border-zinc-950/10 dark:border-white/10',\n )}\n />\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { createContext, use, useId, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { useFocusTrap } from '../hooks/use-focus-trap.js';\nimport { useScrollLock } from '../hooks/use-scroll-lock.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { cn } from '../utils/cn.js';\n\nconst DrawerContext = createContext<string | undefined>(undefined);\n\ntype DrawerSide = 'left' | 'right' | 'top' | 'bottom';\n\nconst sideClasses: Record<DrawerSide, string> = {\n left: 'inset-y-0 left-0 h-full w-full max-w-sm data-closed:-translate-x-full',\n right: 'inset-y-0 right-0 h-full w-full max-w-sm data-closed:translate-x-full',\n top: 'inset-x-0 top-0 w-full max-h-[50vh] data-closed:-translate-y-full',\n bottom: 'inset-x-0 bottom-0 w-full max-h-[50vh] data-closed:translate-y-full',\n};\n\nexport function Drawer({\n open,\n onClose,\n side = 'right',\n className,\n children,\n}: {\n open: boolean;\n onClose: () => void;\n side?: DrawerSide;\n className?: string;\n children: React.ReactNode;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n\n const backdrop = useTransition(open);\n const panel = useTransition(open);\n\n useScrollLock(open);\n useFocusTrap(panelRef, open);\n useEscapeKey(onClose, open);\n\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) onClose();\n };\n\n if (!(backdrop.mounted || panel.mounted)) return null;\n\n return createPortal(\n <DrawerContext.Provider value={titleId}>\n <div role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n {backdrop.mounted && (\n <button\n type=\"button\"\n aria-label=\"Close drawer\"\n ref={backdrop.nodeRef as React.RefObject<HTMLButtonElement>}\n {...backdrop.transitionProps}\n onClick={handleBackdropClick}\n className=\"fixed inset-0 z-40 bg-zinc-950/25 transition duration-200 data-closed:opacity-0 data-enter:ease-out data-leave:ease-in dark:bg-zinc-950/50\"\n />\n )}\n {panel.mounted && (\n <div\n ref={(node) => {\n (panelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n (panel.nodeRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n {...panel.transitionProps}\n className={cn(\n 'fixed z-50 overflow-y-auto bg-white shadow-xl ring-1 ring-zinc-950/10 transition duration-300 ease-in-out dark:bg-zinc-900 dark:ring-white/10',\n sideClasses[side],\n className,\n )}\n >\n {children}\n </div>\n )}\n </div>\n </DrawerContext.Provider>,\n document.body,\n );\n}\n\nexport function DrawerHeader({\n onClose,\n className,\n children,\n}: {\n onClose?: () => void;\n className?: string;\n children: React.ReactNode;\n}) {\n const titleId = use(DrawerContext);\n return (\n <div\n className={cn(\n 'flex items-center justify-between border-b border-zinc-200 px-6 py-4 dark:border-zinc-700',\n className,\n )}\n >\n <h2 id={titleId} className=\"text-base font-semibold text-zinc-950 dark:text-white\">\n {children}\n </h2>\n {onClose && (\n <button\n type=\"button\"\n aria-label=\"Close drawer\"\n onClick={onClose}\n className=\"rounded-md p-1 text-zinc-400 hover:text-zinc-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500 dark:hover:text-zinc-200\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className=\"size-4\" aria-hidden=\"true\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n );\n}\n\nexport function DrawerBody({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div {...props} className={cn('px-6 py-4', className)} />;\n}\n\nexport function DrawerFooter({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n {...props}\n className={cn(\n 'flex items-center justify-end gap-3 border-t border-zinc-200 px-6 py-4 dark:border-zinc-700',\n className,\n )}\n />\n );\n}\n","import { useCallback, useRef, useState } from 'react';\n\ninterface UseRovingTabindexOptions {\n /** Total number of items in the list */\n itemCount: number;\n /** Initial active index (-1 for none) */\n initialIndex?: number;\n /** Orientation for arrow key handling */\n orientation?: 'vertical' | 'horizontal';\n /** Whether navigation wraps around */\n loop?: boolean;\n /** Callback when active index changes */\n onActiveChange?: (index: number) => void;\n}\n\ninterface UseRovingTabindexReturn {\n /** Currently active (focused) item index */\n activeIndex: number;\n /** Set the active index programmatically */\n setActiveIndex: (index: number) => void;\n /** Props to spread on the container element */\n containerProps: {\n role: string;\n onKeyDown: (e: React.KeyboardEvent) => void;\n };\n /** Get props for an individual item */\n getItemProps: (index: number) => {\n tabIndex: number;\n 'data-focus': string | undefined;\n ref: (el: HTMLElement | null) => void;\n onPointerEnter: () => void;\n onClick: () => void;\n };\n}\n\nexport function useRovingTabindex({\n itemCount,\n initialIndex = -1,\n orientation = 'vertical',\n loop = true,\n onActiveChange,\n}: UseRovingTabindexOptions): UseRovingTabindexReturn {\n const [activeIndex, setActiveIndexState] = useState(initialIndex);\n const itemRefs = useRef<Map<number, HTMLElement>>(new Map());\n\n const onActiveChangeRef = useRef(onActiveChange);\n onActiveChangeRef.current = onActiveChange;\n\n const setActiveIndex = useCallback((index: number) => {\n setActiveIndexState(index);\n onActiveChangeRef.current?.(index);\n\n // Focus the element\n const el = itemRefs.current.get(index);\n el?.focus();\n }, []);\n\n const moveFocus = useCallback(\n (direction: 1 | -1) => {\n if (itemCount === 0) return;\n\n let next = activeIndex + direction;\n\n if (loop) {\n if (next < 0) next = itemCount - 1;\n else if (next >= itemCount) next = 0;\n } else {\n next = Math.max(0, Math.min(itemCount - 1, next));\n }\n\n // Skip disabled items\n const el = itemRefs.current.get(next);\n if (el?.hasAttribute('data-disabled')) {\n // Try next in same direction\n const nextNext = next + direction;\n if (nextNext >= 0 && nextNext < itemCount) {\n setActiveIndex(nextNext);\n return;\n }\n }\n\n setActiveIndex(next);\n },\n [activeIndex, itemCount, loop, setActiveIndex],\n );\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const prevKey = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n const nextKey = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n\n switch (e.key) {\n case prevKey:\n e.preventDefault();\n moveFocus(-1);\n break;\n case nextKey:\n e.preventDefault();\n moveFocus(1);\n break;\n case 'Home':\n e.preventDefault();\n setActiveIndex(0);\n break;\n case 'End':\n e.preventDefault();\n setActiveIndex(itemCount - 1);\n break;\n }\n },\n [moveFocus, setActiveIndex, itemCount, orientation],\n );\n\n const getItemProps = useCallback(\n (index: number) => ({\n tabIndex: index === activeIndex ? 0 : -1,\n 'data-focus': index === activeIndex ? '' : undefined,\n ref: (el: HTMLElement | null) => {\n if (el) {\n itemRefs.current.set(index, el);\n } else {\n itemRefs.current.delete(index);\n }\n },\n onPointerEnter: () => setActiveIndex(index),\n onClick: () => setActiveIndex(index),\n }),\n [activeIndex, setActiveIndex],\n );\n\n return {\n activeIndex,\n setActiveIndex,\n containerProps: {\n role: orientation === 'vertical' ? 'listbox' : 'group',\n onKeyDown,\n },\n getItemProps,\n };\n}\n","import { useCallback, useRef } from 'react';\n\ninterface UseTypeAheadOptions {\n /** Function to get the text content of an item by index */\n getItemText: (index: number) => string;\n /** Total number of items */\n itemCount: number;\n /** Callback when a match is found */\n onMatch: (index: number) => void;\n /** Timeout before search buffer resets (ms) */\n timeout?: number;\n}\n\nexport function useTypeAhead({\n getItemText,\n itemCount,\n onMatch,\n timeout = 350,\n}: UseTypeAheadOptions): {\n onKeyDown: (e: React.KeyboardEvent) => void;\n} {\n const searchBuffer = useRef('');\n const timeoutRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Only handle single character keys (not special keys)\n if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return;\n\n // Clear previous timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Append to search buffer\n searchBuffer.current += e.key.toLowerCase();\n\n // Set timeout to clear buffer\n timeoutRef.current = setTimeout(() => {\n searchBuffer.current = '';\n }, timeout);\n\n // Search for matching item\n const query = searchBuffer.current;\n for (let i = 0; i < itemCount; i++) {\n const text = getItemText(i).toLowerCase();\n if (text.startsWith(query)) {\n onMatch(i);\n return;\n }\n }\n },\n [getItemText, itemCount, onMatch, timeout],\n );\n\n return { onKeyDown };\n}\n","'use client';\n\nimport type React from 'react';\nimport { createContext, use, useCallback, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useClickOutside } from '../hooks/use-click-outside.js';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { usePopover } from '../hooks/use-popover.js';\nimport { useRovingTabindex } from '../hooks/use-roving-tabindex.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { useTypeAhead } from '../hooks/use-type-ahead.js';\nimport { cn } from '../utils/cn.js';\nimport { Button } from './button-headless.js';\nimport { Link } from './link.js';\n\n// ---------------------------------------------------------------------------\n// Dropdown context\n// ---------------------------------------------------------------------------\n\ninterface DropdownContextValue {\n open: boolean;\n setOpen: (open: boolean) => void;\n close: () => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null);\n\nfunction useDropdownContext(): DropdownContextValue {\n const ctx = use(DropdownContext);\n if (!ctx) {\n throw new Error('Dropdown compound components must be used within <Dropdown>');\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Item context (for roving tabindex coordination)\n// ---------------------------------------------------------------------------\n\ninterface DropdownItemContextValue {\n register: (el: HTMLElement) => number;\n unregister: (el: HTMLElement) => void;\n getItemProps: (index: number) => {\n tabIndex: number;\n 'data-focus': string | undefined;\n ref: (el: HTMLElement | null) => void;\n onPointerEnter: () => void;\n onClick: () => void;\n };\n}\n\nconst DropdownItemContext = createContext<DropdownItemContextValue | null>(null);\n\n// ---------------------------------------------------------------------------\n// Dropdown (root)\n// ---------------------------------------------------------------------------\n\nexport function Dropdown({\n children,\n ...props\n}: {\n children: React.ReactNode;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'children'>) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n triggerRef.current?.focus();\n }, []);\n\n const value = useMemo(() => ({ open, setOpen, close, triggerRef }), [open, close]);\n\n return (\n <DropdownContext.Provider value={value}>\n <div {...props}>{children}</div>\n </DropdownContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownButton\n// ---------------------------------------------------------------------------\n\nexport function DropdownButton<T extends React.ElementType = typeof Button>({\n as,\n className,\n ...props\n}: {\n as?: T;\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<T>, 'className'>) {\n const { open, setOpen, triggerRef } = useDropdownContext();\n const interactiveProps = useDataInteractive();\n\n const Component = (as ?? Button) as React.ElementType;\n\n const handleClick = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n },\n [setOpen],\n );\n\n return (\n <Component\n ref={triggerRef}\n {...interactiveProps}\n {...props}\n className={className}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownMenu\n// ---------------------------------------------------------------------------\n\nexport function DropdownMenu({\n anchor = 'bottom',\n className,\n children,\n ...props\n}: {\n anchor?: 'top' | 'top start' | 'top end' | 'bottom' | 'bottom start' | 'bottom end';\n className?: string;\n children?: React.ReactNode;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className' | 'children'>) {\n const { open, close, triggerRef } = useDropdownContext();\n const { mounted, nodeRef, transitionProps } = useTransition(open);\n const popover = usePopover({\n open,\n anchor,\n gap: 8,\n padding: 4,\n });\n\n // Combined ref for transition nodeRef + popover popoverRef + local ref\n const menuRef = useRef<HTMLDivElement | null>(null);\n const combinedRef = useCallback(\n (el: HTMLDivElement | null) => {\n menuRef.current = el;\n (popover.popoverRef as React.MutableRefObject<HTMLElement | null>).current = el;\n (nodeRef as React.MutableRefObject<HTMLElement | null>).current = el;\n },\n [popover.popoverRef, nodeRef],\n );\n\n // Point popover's triggerRef at the dropdown's trigger element\n (popover.triggerRef as React.MutableRefObject<HTMLElement | null>).current = triggerRef.current;\n\n // Close on click outside (exclude trigger + menu)\n useClickOutside([triggerRef, menuRef] as React.RefObject<HTMLElement | null>[], close, open);\n\n // Close on Escape\n useEscapeKey(close, open);\n\n // Track interactive items for roving tabindex\n const itemElements = useRef<HTMLElement[]>([]);\n const [itemCount, setItemCount] = useState(0);\n\n const register = useCallback((el: HTMLElement): number => {\n if (!itemElements.current.includes(el)) {\n itemElements.current.push(el);\n setItemCount(itemElements.current.length);\n }\n return itemElements.current.indexOf(el);\n }, []);\n\n const unregister = useCallback((el: HTMLElement): void => {\n const idx = itemElements.current.indexOf(el);\n if (idx !== -1) {\n itemElements.current.splice(idx, 1);\n setItemCount(itemElements.current.length);\n }\n }, []);\n\n const roving = useRovingTabindex({\n itemCount,\n initialIndex: -1,\n orientation: 'vertical',\n loop: true,\n });\n\n const typeAhead = useTypeAhead({\n getItemText: (index) => itemElements.current[index]?.textContent ?? '',\n itemCount,\n onMatch: (index) => roving.setActiveIndex(index),\n });\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n roving.containerProps.onKeyDown(e);\n typeAhead.onKeyDown(e);\n\n // Enter/Space selects the active item\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n const activeEl = itemElements.current[roving.activeIndex];\n if (activeEl) {\n activeEl.click();\n }\n }\n },\n [roving, typeAhead],\n );\n\n const itemContextValue = useMemo<DropdownItemContextValue>(\n () => ({\n register,\n unregister,\n getItemProps: roving.getItemProps,\n }),\n [register, unregister, roving.getItemProps],\n );\n\n if (!mounted) return null;\n\n return createPortal(\n <DropdownItemContext.Provider value={itemContextValue}>\n <div\n ref={combinedRef}\n {...transitionProps}\n {...props}\n role=\"menu\"\n aria-orientation=\"vertical\"\n style={popover.popoverProps.style}\n onKeyDown={handleKeyDown}\n className={cn(\n className,\n // Anchor positioning\n '[--anchor-gap:--spacing(2)] [--anchor-padding:--spacing(1)] data-[anchor~=end]:[--anchor-offset:6px] data-[anchor~=start]:[--anchor-offset:-6px] sm:data-[anchor~=end]:[--anchor-offset:4px] sm:data-[anchor~=start]:[--anchor-offset:-4px]',\n // Base styles\n 'isolate w-max rounded-xl p-1',\n // Invisible border that is only visible in `forced-colors` mode for accessibility purposes\n 'outline outline-transparent focus:outline-hidden',\n // Handle scrolling when menu won't fit in viewport\n 'overflow-y-auto',\n // Popover background\n 'bg-white/75 backdrop-blur-xl dark:bg-zinc-800/75',\n // Shadows\n 'shadow-lg ring-1 ring-zinc-950/10 dark:ring-white/10 dark:ring-inset',\n // Define grid at the menu level if subgrid is supported\n 'supports-[grid-template-columns:subgrid]:grid supports-[grid-template-columns:subgrid]:grid-cols-[auto_1fr_1.5rem_0.5rem_auto]',\n // Transitions\n 'transition data-leave:duration-100 data-leave:ease-in data-closed:data-leave:opacity-0',\n )}\n >\n {children}\n </div>\n </DropdownItemContext.Provider>,\n document.body,\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownItem\n// ---------------------------------------------------------------------------\n\nexport function DropdownItem({\n className,\n ...props\n}: { className?: string } & (\n | ({\n href?: never;\n disabled?: boolean;\n children?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n } & Omit<React.ComponentPropsWithoutRef<'button'>, 'className' | 'type'>)\n | ({\n href: string;\n children?: React.ReactNode;\n } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n)) {\n const { close } = useDropdownContext();\n const itemCtx = use(DropdownItemContext);\n const interactiveProps = useDataInteractive({\n disabled: 'disabled' in props ? (props.disabled ?? false) : false,\n });\n\n const elRef = useRef<HTMLElement | null>(null);\n const indexRef = useRef(-1);\n\n // Register this item with the roving tabindex system\n const setRef = useCallback(\n (el: HTMLElement | null) => {\n if (el && itemCtx) {\n elRef.current = el;\n indexRef.current = itemCtx.register(el);\n } else if (!el && elRef.current && itemCtx) {\n itemCtx.unregister(elRef.current);\n elRef.current = null;\n indexRef.current = -1;\n }\n },\n [itemCtx],\n );\n\n const rovingProps =\n itemCtx && indexRef.current >= 0\n ? itemCtx.getItemProps(indexRef.current)\n : {\n tabIndex: -1,\n 'data-focus': undefined,\n ref: () => {\n /* no-op */\n },\n onPointerEnter: () => {\n /* no-op */\n },\n onClick: () => {\n /* no-op */\n },\n };\n\n const propsDisabled = 'disabled' in props ? props.disabled : false;\n const propsOnClick =\n 'onClick' in props && typeof props.onClick === 'function'\n ? (props.onClick as (e: React.MouseEvent<HTMLElement>) => void)\n : undefined;\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n if (propsDisabled) return;\n rovingProps.onClick();\n propsOnClick?.(e);\n close();\n },\n [close, propsDisabled, propsOnClick, rovingProps],\n );\n\n const classes = cn(\n className,\n // Base styles\n 'group cursor-default rounded-lg px-3.5 py-2.5 focus:outline-hidden sm:px-3 sm:py-1.5',\n // Text styles\n 'text-left text-base/6 text-zinc-950 sm:text-sm/6 dark:text-white forced-colors:text-[CanvasText]',\n // Focus\n 'data-focus:bg-blue-500 data-focus:text-white',\n // Disabled state\n 'data-disabled:opacity-50',\n // Forced colors mode\n 'forced-color-adjust-none forced-colors:data-focus:bg-[Highlight] forced-colors:data-focus:text-[HighlightText] forced-colors:data-focus:*:data-[slot=icon]:text-[HighlightText]',\n // Use subgrid when available but fallback to an explicit grid layout if not\n 'col-span-full grid grid-cols-[auto_1fr_1.5rem_0.5rem_auto] items-center supports-[grid-template-columns:subgrid]:grid-cols-subgrid',\n // Icons\n '*:data-[slot=icon]:col-start-1 *:data-[slot=icon]:row-start-1 *:data-[slot=icon]:mr-2.5 *:data-[slot=icon]:-ml-0.5 *:data-[slot=icon]:size-5 sm:*:data-[slot=icon]:mr-2 sm:*:data-[slot=icon]:size-4',\n '*:data-[slot=icon]:text-zinc-500 data-focus:*:data-[slot=icon]:text-white dark:*:data-[slot=icon]:text-zinc-400 dark:data-focus:*:data-[slot=icon]:text-white',\n // Avatar\n '*:data-[slot=avatar]:mr-2.5 *:data-[slot=avatar]:-ml-1 *:data-[slot=avatar]:size-6 sm:*:data-[slot=avatar]:mr-2 sm:*:data-[slot=avatar]:size-5',\n );\n\n if (typeof props.href === 'string') {\n const { href, children, ...linkProps } = props as {\n href: string;\n children?: React.ReactNode;\n } & React.ComponentPropsWithoutRef<typeof Link>;\n\n return (\n <Link\n ref={setRef as React.Ref<HTMLAnchorElement>}\n role=\"menuitem\"\n href={href}\n {...linkProps}\n {...interactiveProps}\n tabIndex={rovingProps.tabIndex}\n data-focus={rovingProps['data-focus']}\n onPointerEnter={rovingProps.onPointerEnter}\n onClick={handleClick as React.MouseEventHandler<HTMLAnchorElement>}\n className={classes}\n >\n {children}\n </Link>\n );\n }\n\n const {\n disabled,\n children,\n onClick: _onClick,\n ...buttonProps\n } = props as {\n disabled?: boolean;\n children?: React.ReactNode;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n } & Omit<React.ComponentPropsWithoutRef<'button'>, 'className' | 'type'>;\n\n return (\n <button\n ref={setRef as React.Ref<HTMLButtonElement>}\n role=\"menuitem\"\n type=\"button\"\n disabled={disabled}\n {...buttonProps}\n {...interactiveProps}\n tabIndex={rovingProps.tabIndex}\n data-focus={rovingProps['data-focus']}\n onPointerEnter={rovingProps.onPointerEnter}\n onClick={handleClick as React.MouseEventHandler<HTMLButtonElement>}\n className={classes}\n >\n {children}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownHeader\n// ---------------------------------------------------------------------------\n\nexport function DropdownHeader({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div {...props} className={cn(className, 'col-span-5 px-3.5 pt-2.5 pb-1 sm:px-3')} />;\n}\n\n// ---------------------------------------------------------------------------\n// DropdownSection\n// ---------------------------------------------------------------------------\n\nexport function DropdownSection({\n className,\n ...props\n}: {\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className'>) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: menu sections intentionally use ARIA group semantics\n <div\n role=\"group\"\n {...props}\n className={cn(\n className,\n // Define grid at the section level instead of the item level if subgrid is supported\n 'col-span-full supports-[grid-template-columns:subgrid]:grid supports-[grid-template-columns:subgrid]:grid-cols-[auto_1fr_1.5rem_0.5rem_auto]',\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownHeading\n// ---------------------------------------------------------------------------\n\nexport function DropdownHeading({\n className,\n ...props\n}: {\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className'>) {\n return (\n <div\n role=\"presentation\"\n {...props}\n className={cn(\n className,\n 'col-span-full grid grid-cols-[1fr_auto] gap-x-12 px-3.5 pt-2 pb-1 text-sm/5 font-medium text-zinc-500 sm:px-3 sm:text-xs/5 dark:text-zinc-400',\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownDivider\n// ---------------------------------------------------------------------------\n\nexport function DropdownDivider({\n className,\n ...props\n}: {\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<'hr'>, 'className'>) {\n return (\n <hr\n {...props}\n className={cn(\n className,\n 'col-span-full mx-3.5 my-1 h-px border-0 bg-zinc-950/5 sm:mx-3 dark:bg-white/10 forced-colors:bg-[CanvasText]',\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownLabel\n// ---------------------------------------------------------------------------\n\nexport function DropdownLabel({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div {...props} data-slot=\"label\" className={cn(className, 'col-start-2 row-start-1')} />;\n}\n\n// ---------------------------------------------------------------------------\n// DropdownDescription\n// ---------------------------------------------------------------------------\n\nexport function DropdownDescription({\n className,\n ...props\n}: {\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<'span'>, 'className'>) {\n return (\n <span\n data-slot=\"description\"\n {...props}\n className={cn(\n className,\n 'col-span-2 col-start-2 row-start-2 text-sm/5 text-zinc-500 group-data-focus:text-white sm:text-xs/5 dark:text-zinc-400 forced-colors:group-data-focus:text-[HighlightText]',\n )}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// DropdownShortcut\n// ---------------------------------------------------------------------------\n\nexport function DropdownShortcut({\n keys,\n className,\n ...props\n}: {\n keys: string | string[];\n className?: string;\n} & Omit<React.ComponentPropsWithoutRef<'kbd'>, 'className' | 'children'>) {\n return (\n <kbd {...props} className={cn(className, 'col-start-5 row-start-1 flex justify-self-end')}>\n {(Array.isArray(keys) ? keys : keys.split('')).map((char, index) => {\n return (\n <kbd\n // biome-ignore lint/suspicious/noArrayIndexKey: key chars may repeat (e.g. \"Ctrl+Ctrl\"); index used to disambiguate\n key={`${char}-${index}`}\n className={cn([\n 'min-w-[2ch] text-center font-sans text-zinc-400 capitalize group-data-focus:text-white forced-colors:group-data-focus:text-[HighlightText]',\n // Make sure key names that are longer than one character (like \"Tab\") have extra space\n index > 0 && char.length > 1 && 'pl-1',\n ])}\n >\n {char}\n </kbd>\n );\n })}\n </kbd>\n );\n}\n","import type React from 'react';\nimport {\n FieldProvider,\n useFieldDescriptionProps,\n useFieldErrorProps,\n useFieldLabelProps,\n} from '../hooks/use-field-context.js';\nimport { cn } from '../utils/cn.js';\n\nexport function Fieldset({\n className,\n disabled,\n ...props\n}: { className?: string; disabled?: boolean } & Omit<\n React.ComponentPropsWithoutRef<'fieldset'>,\n 'className'\n>) {\n return (\n <fieldset\n disabled={disabled}\n {...props}\n className={cn(className, '*:data-[slot=text]:mt-1 [&>*+[data-slot=control]]:mt-6')}\n />\n );\n}\n\nexport function Legend({\n className,\n ...props\n}: { className?: string } & Omit<React.ComponentPropsWithoutRef<'legend'>, 'className'>) {\n return (\n <legend\n data-slot=\"legend\"\n {...props}\n className={cn(\n className,\n 'text-base/6 font-semibold text-zinc-950 data-disabled:opacity-50 sm:text-sm/6 dark:text-white',\n )}\n />\n );\n}\n\nexport function FieldGroup({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div data-slot=\"control\" {...props} className={cn(className, 'space-y-8')} />;\n}\n\nexport function Field({\n className,\n disabled,\n ...props\n}: {\n className?: string;\n disabled?: boolean;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className'>) {\n return (\n <FieldProvider disabled={disabled}>\n <div\n {...props}\n data-disabled={disabled ? '' : undefined}\n className={cn(\n className,\n '[&>[data-slot=label]+[data-slot=control]]:mt-3',\n '[&>[data-slot=label]+[data-slot=description]]:mt-1',\n '[&>[data-slot=description]+[data-slot=control]]:mt-3',\n '[&>[data-slot=control]+[data-slot=description]]:mt-3',\n '[&>[data-slot=control]+[data-slot=error]]:mt-3',\n '*:data-[slot=label]:font-medium',\n )}\n />\n </FieldProvider>\n );\n}\n\nexport function Label({\n className,\n ...props\n}: { className?: string } & Omit<React.ComponentPropsWithoutRef<'label'>, 'className'>) {\n const fieldLabelProps = useFieldLabelProps();\n\n return (\n // biome-ignore lint/a11y/noLabelWithoutControl: htmlFor provided via useFieldLabelProps hook\n <label\n data-slot=\"label\"\n {...fieldLabelProps}\n {...props}\n className={cn(\n className,\n 'text-base/6 text-zinc-950 select-none data-disabled:opacity-50 sm:text-sm/6 dark:text-white',\n )}\n />\n );\n}\n\nexport function Description({\n className,\n ...props\n}: { className?: string } & Omit<React.ComponentPropsWithoutRef<'p'>, 'className'>) {\n const fieldDescriptionProps = useFieldDescriptionProps();\n\n return (\n <p\n data-slot=\"description\"\n {...fieldDescriptionProps}\n {...props}\n className={cn(\n className,\n 'text-base/6 text-zinc-500 data-disabled:opacity-50 sm:text-sm/6 dark:text-zinc-400',\n )}\n />\n );\n}\n\nexport function ErrorMessage({\n className,\n ...props\n}: { className?: string } & Omit<React.ComponentPropsWithoutRef<'p'>, 'className'>) {\n const fieldErrorProps = useFieldErrorProps();\n\n return (\n <p\n data-slot=\"error\"\n {...fieldErrorProps}\n {...props}\n className={cn(\n className,\n 'text-base/6 text-red-600 data-disabled:opacity-50 sm:text-sm/6 dark:text-red-500',\n )}\n />\n );\n}\n","import type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { useFieldControlProps } from '../hooks/use-field-context.js';\nimport { cn } from '../utils/cn.js';\n\nexport function InputGroup({ children }: React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n data-slot=\"control\"\n className={cn(\n 'relative isolate block',\n 'has-[[data-slot=icon]:first-child]:[&_input]:pl-10 has-[[data-slot=icon]:last-child]:[&_input]:pr-10 sm:has-[[data-slot=icon]:first-child]:[&_input]:pl-8 sm:has-[[data-slot=icon]:last-child]:[&_input]:pr-8',\n '*:data-[slot=icon]:pointer-events-none *:data-[slot=icon]:absolute *:data-[slot=icon]:top-3 *:data-[slot=icon]:z-10 *:data-[slot=icon]:size-5 sm:*:data-[slot=icon]:top-2.5 sm:*:data-[slot=icon]:size-4',\n '[&>[data-slot=icon]:first-child]:left-3 sm:[&>[data-slot=icon]:first-child]:left-2.5 [&>[data-slot=icon]:last-child]:right-3 sm:[&>[data-slot=icon]:last-child]:right-2.5',\n '*:data-[slot=icon]:text-zinc-500 dark:*:data-[slot=icon]:text-zinc-400',\n )}\n >\n {children}\n </span>\n );\n}\n\nconst dateTypes = ['date', 'datetime-local', 'month', 'time', 'week'] as const;\ntype DateType = (typeof dateTypes)[number];\n\ntype InputProps = {\n className?: string;\n type?: 'email' | 'number' | 'password' | 'search' | 'tel' | 'text' | 'url' | DateType;\n disabled?: boolean;\n invalid?: boolean;\n ref?: React.Ref<HTMLInputElement>;\n} & Omit<React.ComponentPropsWithoutRef<'input'>, 'className' | 'type'>;\n\nexport function Input({ className, disabled, invalid, ref, ...props }: InputProps) {\n const interactiveProps = useDataInteractive({ disabled });\n const fieldProps = useFieldControlProps();\n\n return (\n <span\n data-slot=\"control\"\n className={cn([\n className,\n // Basic layout\n 'relative block w-full',\n // Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode\n 'before:absolute before:inset-px before:rounded-[calc(var(--radius-lg)-1px)] before:bg-white before:shadow-sm',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Focus ring\n 'after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset sm:focus-within:after:ring-2 sm:focus-within:after:ring-blue-500',\n // Disabled state\n 'has-data-disabled:opacity-50 has-data-disabled:before:bg-zinc-950/5 has-data-disabled:before:shadow-none',\n ])}\n >\n <input\n ref={ref}\n disabled={disabled}\n {...props}\n {...interactiveProps}\n {...fieldProps}\n data-invalid={invalid ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n className={cn([\n // Date classes\n props.type &&\n dateTypes.includes(props.type as DateType) && [\n '[&::-webkit-datetime-edit-fields-wrapper]:p-0',\n '[&::-webkit-date-and-time-value]:min-h-[1.5em]',\n '[&::-webkit-datetime-edit]:inline-flex',\n '[&::-webkit-datetime-edit]:p-0',\n '[&::-webkit-datetime-edit-year-field]:p-0',\n '[&::-webkit-datetime-edit-month-field]:p-0',\n '[&::-webkit-datetime-edit-day-field]:p-0',\n '[&::-webkit-datetime-edit-hour-field]:p-0',\n '[&::-webkit-datetime-edit-minute-field]:p-0',\n '[&::-webkit-datetime-edit-second-field]:p-0',\n '[&::-webkit-datetime-edit-millisecond-field]:p-0',\n '[&::-webkit-datetime-edit-meridiem-field]:p-0',\n ],\n // Basic layout\n 'relative block w-full appearance-none rounded-lg px-[calc(--spacing(3.5)-1px)] py-[calc(--spacing(2.5)-1px)] sm:px-[calc(--spacing(3)-1px)] sm:py-[calc(--spacing(1.5)-1px)]',\n // Typography\n 'text-base/6 text-zinc-950 placeholder:text-zinc-500 sm:text-sm/6 dark:text-white',\n // Border\n 'border border-zinc-950/10 data-hover:border-zinc-950/20 dark:border-white/10 dark:data-hover:border-white/20',\n // Background color\n 'bg-transparent dark:bg-white/5',\n // Hide default focus styles\n 'focus:outline-hidden',\n // Invalid state\n 'data-invalid:border-red-500 data-invalid:data-hover:border-red-500 dark:data-invalid:border-red-600 dark:data-invalid:data-hover:border-red-600',\n // Disabled state\n 'data-disabled:border-zinc-950/20 dark:data-disabled:border-white/15 dark:data-disabled:bg-white/2.5 dark:data-hover:data-disabled:border-white/15',\n // System icons\n 'dark:scheme-dark',\n ])}\n />\n </span>\n );\n}\n","import type React from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport function Kbd({ className, children, ...props }: React.ComponentPropsWithoutRef<'kbd'>) {\n return (\n <kbd\n {...props}\n className={cn(\n 'inline-flex items-center rounded border border-zinc-300 bg-zinc-100 px-1.5 py-0.5 font-mono text-xs font-medium text-zinc-700 dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-300',\n className,\n )}\n >\n {children}\n </kbd>\n );\n}\n\nexport function KbdShortcut({\n keys,\n separator = '+',\n className,\n}: {\n keys: string[];\n separator?: string;\n className?: string;\n}) {\n return (\n <span className={cn('inline-flex items-center gap-1', className)}>\n {keys.map((key, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: keyboard shortcut keys are positionally ordered with no stable ID\n <span key={i} className=\"inline-flex items-center gap-1\">\n <Kbd>{key}</Kbd>\n {i < keys.length - 1 && <span className=\"text-xs text-zinc-400\">{separator}</span>}\n </span>\n ))}\n </span>\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport {\n Children,\n createContext,\n isValidElement,\n type ReactNode,\n use,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useClickOutside } from '../hooks/use-click-outside.js';\nimport { useControllableState } from '../hooks/use-controllable-state.js';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { usePopover } from '../hooks/use-popover.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { cn } from '../utils/cn.js';\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface ListboxContextValue<T = unknown> {\n value: T;\n setValue: (v: T) => void;\n open: boolean;\n setOpen: (open: boolean) => void;\n disabled: boolean;\n activeIndex: number;\n setActiveIndex: (index: number) => void;\n registerOption: (index: number, value: T, el: HTMLElement | null) => void;\n optionCount: number;\n buttonId: string;\n listId: string;\n}\n\nconst ListboxContext = createContext<ListboxContextValue | null>(null);\n\nfunction useListboxContext(): ListboxContextValue {\n const ctx = use(ListboxContext);\n if (!ctx) {\n throw new Error('Listbox compound components must be used within <Listbox>');\n }\n return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction countOptions(children: ReactNode): number {\n let count = 0;\n Children.forEach(children, (child) => {\n if (!isValidElement(child)) return;\n if ((child.type as unknown) === ListboxOption) {\n count++;\n }\n });\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// OptionIndexProvider\n// ---------------------------------------------------------------------------\n\nconst OptionIndexContext = createContext<number>(-1);\n\nfunction OptionIndexProvider({ children }: { children: ReactNode }) {\n let index = 0;\n return (\n <>\n {Children.map(children, (child) => {\n if (!isValidElement(child)) return child;\n if ((child.type as unknown) === ListboxOption) {\n const currentIndex = index++;\n return (\n <OptionIndexContext.Provider value={currentIndex}>{child}</OptionIndexContext.Provider>\n );\n }\n return child;\n })}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Listbox (root)\n// ---------------------------------------------------------------------------\n\nexport function Listbox<T>({\n className,\n placeholder,\n autoFocus = false,\n 'aria-label': ariaLabel,\n children: options,\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = false,\n name,\n}: {\n className?: string;\n placeholder?: React.ReactNode;\n autoFocus?: boolean;\n 'aria-label'?: string;\n children?: ReactNode;\n value?: T;\n defaultValue?: T;\n onChange?: (value: T) => void;\n disabled?: boolean;\n name?: string;\n}) {\n const [value, setValue] = useControllableState<T>({\n value: controlledValue,\n defaultValue: defaultValue as T,\n onChange,\n });\n\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [optionCount, setOptionCount] = useState(0);\n\n const buttonId = useId();\n const listId = useId();\n\n const optionMapRef = useRef<Map<number, { value: T; element: HTMLElement | null }>>(new Map());\n\n const registerOption = useCallback((index: number, optValue: T, element: HTMLElement | null) => {\n optionMapRef.current.set(index, { value: optValue, element });\n }, []);\n\n const { triggerRef, popoverRef, popoverProps } = usePopover({\n open,\n anchor: 'selection start',\n gap: 0,\n padding: 16,\n });\n\n const { mounted, nodeRef, transitionProps } = useTransition(open);\n\n const focusTrigger = useCallback(() => {\n triggerRef.current?.focus();\n }, [triggerRef]);\n\n useEffect(() => {\n setOptionCount(countOptions(options));\n }, [options]);\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n focusTrigger();\n }\n }, [autoFocus, disabled, focusTrigger]);\n\n useClickOutside([triggerRef, popoverRef], () => setOpen(false), open);\n\n useEscapeKey(() => {\n setOpen(false);\n focusTrigger();\n }, open);\n\n const selectActiveOption = useCallback(() => {\n const entry = optionMapRef.current.get(activeIndex);\n if (entry) {\n setValue(entry.value);\n setOpen(false);\n focusTrigger();\n }\n }, [activeIndex, focusTrigger, setValue]);\n\n const handleOptionsKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n setActiveIndex((prev) => {\n const next = prev + 1;\n return next >= optionCount ? 0 : next;\n });\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n setActiveIndex((prev) => {\n const next = prev - 1;\n return next < 0 ? optionCount - 1 : next;\n });\n break;\n }\n case 'Home': {\n e.preventDefault();\n setActiveIndex(0);\n break;\n }\n case 'End': {\n e.preventDefault();\n setActiveIndex(optionCount - 1);\n break;\n }\n case 'Enter':\n case ' ': {\n e.preventDefault();\n selectActiveOption();\n break;\n }\n }\n },\n [optionCount, selectActiveOption],\n );\n\n useEffect(() => {\n if (!open || activeIndex < 0) return;\n const entry = optionMapRef.current.get(activeIndex);\n entry?.element?.scrollIntoView({ block: 'nearest' });\n }, [activeIndex, open]);\n\n useEffect(() => {\n if (open) {\n let selectedIdx = -1;\n for (const [idx, entry] of optionMapRef.current.entries()) {\n if (entry.value === value) {\n selectedIdx = idx;\n break;\n }\n }\n setActiveIndex(selectedIdx >= 0 ? selectedIdx : 0);\n }\n }, [open, value]);\n\n useEffect(() => {\n if (mounted && popoverRef.current) {\n popoverRef.current.focus({ preventScroll: true });\n }\n }, [mounted, popoverRef]);\n\n const selectedContent = useMemo(() => {\n let matched: ReactNode = null;\n Children.forEach(options, (child) => {\n if (!isValidElement(child)) return;\n if (\n (child.type as unknown) === ListboxOption &&\n (child.props as { value?: unknown }).value === value\n ) {\n matched = (child.props as { children?: ReactNode }).children;\n }\n });\n return matched;\n }, [options, value]);\n\n const ctx = useMemo<ListboxContextValue<T>>(\n () => ({\n value: value,\n setValue: setValue as (v: unknown) => void,\n open,\n setOpen,\n disabled,\n activeIndex,\n setActiveIndex,\n registerOption: registerOption as (\n index: number,\n value: unknown,\n el: HTMLElement | null,\n ) => void,\n optionCount,\n buttonId,\n listId,\n }),\n [value, setValue, open, disabled, activeIndex, registerOption, optionCount, buttonId, listId],\n );\n\n const handleButtonClick = useCallback(() => {\n if (!disabled) {\n setOpen((prev) => !prev);\n }\n }, [disabled]);\n\n const handleButtonKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setOpen(true);\n }\n },\n [disabled],\n );\n\n const selectedSharedClasses = cn(\n 'flex min-w-0 items-center',\n '*:data-[slot=icon]:size-5 *:data-[slot=icon]:shrink-0 sm:*:data-[slot=icon]:size-4',\n '*:data-[slot=icon]:text-zinc-500 group-data-focus/option:*:data-[slot=icon]:text-white dark:*:data-[slot=icon]:text-zinc-400',\n 'forced-colors:*:data-[slot=icon]:text-[CanvasText] forced-colors:group-data-focus/option:*:data-[slot=icon]:text-[Canvas]',\n '*:data-[slot=avatar]:-mx-0.5 *:data-[slot=avatar]:size-6 sm:*:data-[slot=avatar]:size-5',\n );\n\n const displayContent =\n selectedContent != null ? (\n <span className={selectedSharedClasses}>{selectedContent}</span>\n ) : placeholder ? (\n <span className=\"block truncate text-zinc-500\">{placeholder}</span>\n ) : null;\n\n return (\n <ListboxContext.Provider value={ctx as ListboxContextValue}>\n {name && <input type=\"hidden\" name={name} value={String(value ?? '')} />}\n\n <button\n ref={triggerRef as React.RefObject<HTMLButtonElement>}\n id={buttonId}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={open ? listId : undefined}\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n data-slot=\"control\"\n data-disabled={disabled ? '' : undefined}\n data-active={open ? '' : undefined}\n disabled={disabled}\n onClick={handleButtonClick}\n onKeyDown={handleButtonKeyDown}\n className={cn([\n className,\n 'group relative block w-full',\n 'before:absolute before:inset-px before:rounded-[calc(var(--radius-lg)-1px)] before:bg-white before:shadow-sm',\n 'dark:before:hidden',\n 'focus:outline-hidden',\n 'after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset data-focus:after:ring-2 data-focus:after:ring-blue-500',\n 'data-disabled:opacity-50 data-disabled:before:bg-zinc-950/5 data-disabled:before:shadow-none',\n ])}\n >\n <span\n className={cn([\n 'relative block w-full appearance-none rounded-lg py-[calc(--spacing(2.5)-1px)] sm:py-[calc(--spacing(1.5)-1px)]',\n 'min-h-11 sm:min-h-9',\n 'pr-[calc(--spacing(7)-1px)] pl-[calc(--spacing(3.5)-1px)] sm:pl-[calc(--spacing(3)-1px)]',\n 'text-left text-base/6 text-zinc-950 placeholder:text-zinc-500 sm:text-sm/6 dark:text-white forced-colors:text-[CanvasText]',\n 'border border-zinc-950/10 group-data-active:border-zinc-950/20 group-data-hover:border-zinc-950/20 dark:border-white/10 dark:group-data-active:border-white/20 dark:group-data-hover:border-white/20',\n 'bg-transparent dark:bg-white/5',\n 'group-data-invalid:border-red-500 group-data-hover:group-data-invalid:border-red-500 dark:group-data-invalid:border-red-600 dark:data-hover:group-data-invalid:border-red-600',\n 'group-data-disabled:border-zinc-950/20 group-data-disabled:opacity-100 dark:group-data-disabled:border-white/15 dark:group-data-disabled:bg-white/2.5 dark:group-data-disabled:data-hover:border-white/15',\n ])}\n >\n {displayContent}\n </span>\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2\">\n <svg\n className=\"size-5 stroke-zinc-500 group-data-disabled:stroke-zinc-600 sm:size-4 dark:stroke-zinc-400 forced-colors:stroke-[CanvasText]\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n fill=\"none\"\n >\n <path\n d=\"M5.75 10.75L8 13L10.25 10.75\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.25 5.25L8 3L5.75 5.25\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n\n {mounted &&\n createPortal(\n <div\n ref={(node) => {\n (popoverRef as React.MutableRefObject<HTMLElement | null>).current = node;\n (nodeRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n {...popoverProps}\n {...transitionProps}\n id={listId}\n role=\"listbox\"\n aria-labelledby={buttonId}\n tabIndex={-1}\n onKeyDown={handleOptionsKeyDown}\n className={cn(\n '[--anchor-offset:-1.625rem] [--anchor-padding:--spacing(4)] sm:[--anchor-offset:-1.375rem]',\n 'isolate w-max min-w-[calc(var(--button-width)+1.75rem)] scroll-py-1 rounded-xl p-1 select-none',\n 'outline outline-transparent focus:outline-hidden',\n 'overflow-y-scroll overscroll-contain',\n 'bg-white/75 backdrop-blur-xl dark:bg-zinc-800/75',\n 'shadow-lg ring-1 ring-zinc-950/10 dark:ring-white/10 dark:ring-inset',\n 'transition-opacity duration-100 ease-in data-closed:data-leave:opacity-0 data-transition:pointer-events-none',\n )}\n style={{\n ...popoverProps.style,\n minWidth: triggerRef.current\n ? `${triggerRef.current.getBoundingClientRect().width + 28}px`\n : undefined,\n }}\n >\n <OptionIndexProvider>{options}</OptionIndexProvider>\n </div>,\n document.body,\n )}\n </ListboxContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ListboxOption\n// ---------------------------------------------------------------------------\n\nexport function ListboxOption<T>({\n children,\n className,\n value: optionValue,\n disabled: optionDisabled = false,\n}: {\n className?: string;\n children?: ReactNode;\n value: T;\n disabled?: boolean;\n}) {\n const ctx = useListboxContext();\n const index = use(OptionIndexContext);\n const optionRef = useRef<HTMLDivElement>(null);\n\n const isSelected = ctx.value === optionValue;\n const isFocused = ctx.activeIndex === index;\n\n useEffect(() => {\n ctx.registerOption(index, optionValue, optionRef.current);\n }, [index, optionValue, ctx.registerOption, ctx]);\n\n const sharedClasses = cn(\n 'flex min-w-0 items-center',\n '*:data-[slot=icon]:size-5 *:data-[slot=icon]:shrink-0 sm:*:data-[slot=icon]:size-4',\n '*:data-[slot=icon]:text-zinc-500 group-data-focus/option:*:data-[slot=icon]:text-white dark:*:data-[slot=icon]:text-zinc-400',\n 'forced-colors:*:data-[slot=icon]:text-[CanvasText] forced-colors:group-data-focus/option:*:data-[slot=icon]:text-[Canvas]',\n '*:data-[slot=avatar]:-mx-0.5 *:data-[slot=avatar]:size-6 sm:*:data-[slot=avatar]:size-5',\n );\n\n const handleClick = useCallback(() => {\n if (optionDisabled) return;\n ctx.setValue(optionValue);\n ctx.setOpen(false);\n }, [optionDisabled, ctx.setValue, ctx.setOpen, optionValue, ctx]);\n\n const handlePointerEnter = useCallback(() => {\n if (!optionDisabled) {\n ctx.setActiveIndex(index);\n }\n }, [optionDisabled, ctx.setActiveIndex, index, ctx]);\n\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: keyboard interaction is handled by the parent listbox trigger and roving focus\n <div\n ref={optionRef}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={optionDisabled || undefined}\n data-selected={isSelected ? '' : undefined}\n data-focus={isFocused ? '' : undefined}\n data-disabled={optionDisabled ? '' : undefined}\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n tabIndex={-1}\n className={cn(\n 'group/option grid cursor-default grid-cols-[--spacing(5)_1fr] items-baseline gap-x-2 rounded-lg py-2.5 pr-3.5 pl-2 sm:grid-cols-[--spacing(4)_1fr] sm:py-1.5 sm:pr-3 sm:pl-1.5',\n 'text-base/6 text-zinc-950 sm:text-sm/6 dark:text-white forced-colors:text-[CanvasText]',\n 'outline-hidden data-focus:bg-blue-500 data-focus:text-white',\n 'forced-color-adjust-none forced-colors:data-focus:bg-[Highlight] forced-colors:data-focus:text-[HighlightText]',\n 'data-disabled:opacity-50',\n )}\n >\n <svg\n className=\"relative hidden size-5 self-center stroke-current group-data-selected/option:inline sm:size-4\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 8.5l3 3L12 4\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n <span className={cn(className, sharedClasses, 'col-start-2')}>{children}</span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ListboxLabel\n// ---------------------------------------------------------------------------\n\nexport function ListboxLabel({ className, ...props }: React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n {...props}\n className={cn(className, 'ml-2.5 truncate first:ml-0 sm:ml-2 sm:first:ml-0')}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// ListboxDescription\n// ---------------------------------------------------------------------------\n\nexport function ListboxDescription({\n className,\n children,\n ...props\n}: React.ComponentPropsWithoutRef<'span'>) {\n return (\n <span\n {...props}\n className={cn(\n className,\n 'flex flex-1 overflow-hidden text-zinc-500 group-data-focus/option:text-white before:w-2 before:min-w-0 before:shrink dark:text-zinc-400',\n )}\n >\n <span className=\"flex-1 truncate\">{children}</span>\n </span>\n );\n}\n","'use client';\n\n/**\n * Layout Animation Hook (FLIP Technique)\n *\n * Replaces motion/react's LayoutGroup + motion.span + layoutId pattern\n * with a native implementation using Web Animations API.\n *\n * The FLIP (First, Last, Invert, Play) technique:\n * 1. Record the element's position before it unmounts (First)\n * 2. Mount the new element and record its position (Last)\n * 3. Calculate the delta between positions (Invert)\n * 4. Animate from old position to new position (Play)\n *\n * @example\n * ```tsx\n * function NavSection({ children }) {\n * return <LayoutGroup>{children}</LayoutGroup>\n * }\n *\n * function NavItem({ current }) {\n * return (\n * <span>\n * {current && <LayoutIndicator layoutId=\"indicator\" className=\"...\" />}\n * ...\n * </span>\n * )\n * }\n * ```\n */\n\nimport { createContext, type ReactNode, type RefObject, use, useLayoutEffect, useRef } from 'react';\n\n// ============================================\n// CONTEXT\n// ============================================\n\nconst LayoutGroupContext = createContext<RefObject<Map<string, DOMRect>> | null>(null);\n\n// ============================================\n// LAYOUT GROUP\n// ============================================\n\ninterface LayoutGroupProps {\n /** Unique identifier for scoping (optional, context-scoped by default) */\n id?: string;\n children: ReactNode;\n}\n\n/**\n * Scopes layout animations to a group.\n * Elements with the same `layoutId` within a group share position data.\n */\nexport function LayoutGroup({ children }: LayoutGroupProps): ReactNode {\n const rectsRef = useRef(new Map<string, DOMRect>());\n return <LayoutGroupContext value={rectsRef}>{children}</LayoutGroupContext>;\n}\n\n// ============================================\n// HOOK\n// ============================================\n\n/** Spring-like easing approximation (matches motion's default layout spring) */\nconst LAYOUT_EASING = 'cubic-bezier(0.25, 0.8, 0.25, 1)';\nconst LAYOUT_DURATION = 350;\n\n/**\n * Hook that implements FLIP layout animation for an element.\n *\n * When an element with the same `layoutId` unmounts from one position\n * and mounts in another, this hook animates the transition smoothly.\n *\n * @param layoutId - Shared identifier linking old and new positions\n * @returns Ref to attach to the animated element\n */\nexport function useLayoutAnimation(layoutId: string): RefObject<HTMLElement | null> {\n const ref = useRef<HTMLElement | null>(null);\n const rectsCtx = use(LayoutGroupContext);\n\n useLayoutEffect(() => {\n const el = ref.current;\n const rects = rectsCtx?.current;\n if (!(el && rects)) return;\n\n const prevRect = rects.get(layoutId);\n const currentRect = el.getBoundingClientRect();\n\n // Save current position for next animation\n rects.set(layoutId, currentRect);\n\n // If we have a previous position, animate from old to new\n if (prevRect) {\n const deltaX = prevRect.left - currentRect.left;\n const deltaY = prevRect.top - currentRect.top;\n\n // Only animate if there's actual movement\n if (Math.abs(deltaX) > 0.5 || Math.abs(deltaY) > 0.5) {\n el.animate(\n [{ transform: `translate(${deltaX}px, ${deltaY}px)` }, { transform: 'translate(0, 0)' }],\n {\n duration: LAYOUT_DURATION,\n easing: LAYOUT_EASING,\n fill: 'none',\n },\n );\n }\n }\n\n return () => {\n // Save position before unmount so the next element can animate from here\n if (el) {\n rects.set(layoutId, el.getBoundingClientRect());\n }\n };\n });\n\n return ref;\n}\n\n// ============================================\n// COMPONENT\n// ============================================\n\ninterface LayoutIndicatorProps extends React.ComponentPropsWithoutRef<'span'> {\n /** Shared identifier for FLIP animation */\n layoutId: string;\n}\n\n/**\n * Animated indicator span that smoothly transitions between positions.\n * Drop-in replacement for `<motion.span layoutId=\"...\">`.\n */\nexport function LayoutIndicator({ layoutId, ...props }: LayoutIndicatorProps): ReactNode {\n const ref = useLayoutAnimation(layoutId);\n return <span ref={ref as RefObject<HTMLSpanElement>} {...props} />;\n}\n","'use client';\n\nimport type React from 'react';\nimport { useId } from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { LayoutGroup, LayoutIndicator } from '../hooks/use-layout-animation.js';\nimport { cn } from '../utils/cn.js';\nimport { TouchTarget } from './button-headless.js';\nimport { Link } from './link.js';\n\nexport function Navbar({ className, ...props }: React.ComponentPropsWithoutRef<'nav'>) {\n return <nav {...props} className={cn(className, 'flex flex-1 items-center gap-4 py-2.5')} />;\n}\n\nexport function NavbarDivider({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n aria-hidden=\"true\"\n {...props}\n className={cn(className, 'h-6 w-px bg-zinc-950/10 dark:bg-white/10')}\n />\n );\n}\n\nexport function NavbarSection({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n const id = useId();\n\n return (\n <LayoutGroup id={id}>\n <div {...props} className={cn(className, 'flex items-center gap-3')} />\n </LayoutGroup>\n );\n}\n\nexport function NavbarSpacer({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div aria-hidden=\"true\" {...props} className={cn(className, '-ml-4 flex-1')} />;\n}\n\nexport function NavbarItem({\n current,\n className,\n children,\n ref,\n ...props\n}: {\n current?: boolean;\n className?: string;\n children: React.ReactNode;\n ref?: React.Ref<HTMLAnchorElement | HTMLButtonElement>;\n} & (\n | ({\n href?: never;\n disabled?: boolean;\n } & Omit<React.ComponentPropsWithoutRef<'button'>, 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n)) {\n const disabled = 'disabled' in props ? props.disabled : false;\n const interactiveProps = useDataInteractive({ disabled: disabled ?? false });\n\n const classes = cn(\n // Base\n 'relative flex min-w-0 items-center gap-3 rounded-lg p-2 text-left text-base/6 font-medium text-zinc-950 sm:text-sm/5',\n // Leading icon/icon-only\n '*:data-[slot=icon]:size-6 *:data-[slot=icon]:shrink-0 *:data-[slot=icon]:fill-zinc-500 sm:*:data-[slot=icon]:size-5',\n // Trailing icon (down chevron or similar)\n '*:not-nth-2:last:data-[slot=icon]:ml-auto *:not-nth-2:last:data-[slot=icon]:size-5 sm:*:not-nth-2:last:data-[slot=icon]:size-4',\n // Avatar\n '*:data-[slot=avatar]:-m-0.5 *:data-[slot=avatar]:size-7 *:data-[slot=avatar]:[--avatar-radius:var(--radius-md)] sm:*:data-[slot=avatar]:size-6',\n // Hover\n 'data-hover:bg-zinc-950/5 data-hover:*:data-[slot=icon]:fill-zinc-950',\n // Active\n 'data-active:bg-zinc-950/5 data-active:*:data-[slot=icon]:fill-zinc-950',\n // Dark mode\n 'dark:text-white dark:*:data-[slot=icon]:fill-zinc-400',\n 'dark:data-hover:bg-white/5 dark:data-hover:*:data-[slot=icon]:fill-white',\n 'dark:data-active:bg-white/5 dark:data-active:*:data-[slot=icon]:fill-white',\n );\n\n return (\n <span className={cn(className, 'relative')}>\n {current && (\n <LayoutIndicator\n layoutId=\"current-indicator\"\n className=\"absolute inset-x-2 -bottom-2.5 h-0.5 rounded-full bg-zinc-950 dark:bg-white\"\n />\n )}\n {typeof props.href === 'string' ? (\n <Link\n {...props}\n className={classes}\n data-current={current ? 'true' : undefined}\n ref={ref as React.Ref<HTMLAnchorElement>}\n >\n <TouchTarget>{children}</TouchTarget>\n </Link>\n ) : (\n <button\n type=\"button\"\n {...props}\n {...interactiveProps}\n className={cn('cursor-default', classes)}\n data-current={current ? 'true' : undefined}\n ref={ref as React.Ref<HTMLButtonElement>}\n >\n <TouchTarget>{children}</TouchTarget>\n </button>\n )}\n </span>\n );\n}\n\nexport function NavbarLabel({ className, ...props }: React.ComponentPropsWithoutRef<'span'>) {\n return <span {...props} className={cn(className, 'truncate')} />;\n}\n","import { cn } from '../utils/cn.js';\n\ntype ProgressColor = 'blue' | 'green' | 'red' | 'amber' | 'violet' | 'zinc';\n\nconst trackClasses: Record<ProgressColor, string> = {\n blue: 'bg-blue-600 dark:bg-blue-500',\n green: 'bg-green-600 dark:bg-green-500',\n red: 'bg-red-600 dark:bg-red-500',\n amber: 'bg-amber-500 dark:bg-amber-400',\n violet: 'bg-violet-600 dark:bg-violet-500',\n zinc: 'bg-zinc-600 dark:bg-zinc-400',\n};\n\nexport function Progress({\n value,\n max = 100,\n color = 'blue',\n size = 'md',\n label,\n showValue = false,\n className,\n}: {\n value: number;\n max?: number;\n color?: ProgressColor;\n size?: 'xs' | 'sm' | 'md' | 'lg';\n label?: string;\n showValue?: boolean;\n className?: string;\n}) {\n const percentage = Math.min(100, Math.max(0, (value / max) * 100));\n const heightClass = { xs: 'h-1', sm: 'h-1.5', md: 'h-2.5', lg: 'h-4' }[size];\n\n return (\n <div className={cn('w-full', className)}>\n {(label || showValue) && (\n <div className=\"mb-1.5 flex items-center justify-between\">\n {label && (\n <span className=\"text-sm font-medium text-zinc-700 dark:text-zinc-300\">{label}</span>\n )}\n {showValue && (\n <span className=\"text-sm text-zinc-500 dark:text-zinc-400\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label ?? 'Progress'}\n className={cn(\n 'w-full overflow-hidden rounded-full bg-zinc-200 dark:bg-zinc-700',\n heightClass,\n )}\n >\n <div\n className={cn(\n 'h-full rounded-full transition-all duration-300 ease-in-out',\n trackClasses[color],\n )}\n style={{ width: `${percentage}%` }}\n />\n </div>\n </div>\n );\n}\n","import type React from 'react';\nimport { createContext, use, useCallback } from 'react';\nimport { useControllableState } from '../hooks/use-controllable-state.js';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { FieldProvider } from '../hooks/use-field-context.js';\nimport { cn } from '../utils/cn.js';\n\n// --- RadioGroup Context ---\ninterface RadioGroupContextValue {\n value: string | undefined;\n onChange: (value: string) => void;\n disabled: boolean;\n name?: string;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nfunction useRadioGroupContext() {\n const ctx = use(RadioGroupContext);\n if (!ctx) throw new Error('Radio must be used within a RadioGroup');\n return ctx;\n}\n\n// --- RadioGroup ---\nexport function RadioGroup({\n className,\n value: controlledValue,\n defaultValue,\n onChange,\n disabled = false,\n name,\n children,\n ...props\n}: {\n className?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n name?: string;\n children: React.ReactNode;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className' | 'onChange'>) {\n const [value, setValue] = useControllableState({\n value: controlledValue,\n defaultValue: defaultValue ?? '',\n onChange,\n });\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const radios = Array.from(\n e.currentTarget.querySelectorAll<HTMLElement>('[role=\"radio\"]:not([data-disabled])'),\n );\n if (radios.length === 0) return;\n\n const currentIndex = radios.indexOf(document.activeElement as HTMLElement);\n let nextIndex = currentIndex;\n\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowRight':\n e.preventDefault();\n nextIndex = currentIndex + 1 >= radios.length ? 0 : currentIndex + 1;\n break;\n case 'ArrowUp':\n case 'ArrowLeft':\n e.preventDefault();\n nextIndex = currentIndex - 1 < 0 ? radios.length - 1 : currentIndex - 1;\n break;\n case 'Home':\n e.preventDefault();\n nextIndex = 0;\n break;\n case 'End':\n e.preventDefault();\n nextIndex = radios.length - 1;\n break;\n default:\n return;\n }\n\n const nextRadio = radios[nextIndex];\n if (!nextRadio) return;\n nextRadio.focus();\n const radioValue = nextRadio.getAttribute('data-value');\n if (radioValue != null) {\n setValue(radioValue);\n }\n },\n [setValue],\n );\n\n return (\n <RadioGroupContext value={{ value, onChange: setValue, disabled, name }}>\n <div\n role=\"radiogroup\"\n data-slot=\"control\"\n onKeyDown={handleKeyDown}\n {...props}\n className={cn(\n className,\n // Basic groups\n 'space-y-3 **:data-[slot=label]:font-normal',\n // With descriptions\n 'has-data-[slot=description]:space-y-6 has-data-[slot=description]:**:data-[slot=label]:font-medium',\n )}\n >\n {children}\n </div>\n </RadioGroupContext>\n );\n}\n\n// --- RadioField ---\nexport function RadioField({\n className,\n disabled,\n ...props\n}: {\n className?: string;\n disabled?: boolean;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className'>) {\n return (\n <FieldProvider disabled={disabled}>\n <div\n data-slot=\"field\"\n data-disabled={disabled ? '' : undefined}\n {...props}\n className={cn(\n className,\n // Base layout\n 'grid grid-cols-[1.125rem_1fr] gap-x-4 gap-y-1 sm:grid-cols-[1rem_1fr]',\n // Control layout\n '*:data-[slot=control]:col-start-1 *:data-[slot=control]:row-start-1 *:data-[slot=control]:mt-0.75 sm:*:data-[slot=control]:mt-1',\n // Label layout\n '*:data-[slot=label]:col-start-2 *:data-[slot=label]:row-start-1',\n // Description layout\n '*:data-[slot=description]:col-start-2 *:data-[slot=description]:row-start-2',\n // With description\n 'has-data-[slot=description]:**:data-[slot=label]:font-medium',\n )}\n />\n </FieldProvider>\n );\n}\n\n// --- Radio ---\nconst base = [\n // Basic layout\n 'relative isolate flex size-4.75 shrink-0 rounded-full sm:size-4.25',\n // Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode\n 'before:absolute before:inset-0 before:-z-10 before:rounded-full before:bg-white before:shadow-sm',\n // Background color when checked\n 'group-data-checked:before:bg-(--radio-checked-bg)',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Background color applied to control in dark mode\n 'dark:bg-white/5 dark:group-data-checked:bg-(--radio-checked-bg)',\n // Border\n 'border border-zinc-950/15 group-data-checked:border-transparent group-data-hover:group-data-checked:border-transparent group-data-hover:border-zinc-950/30 group-data-checked:bg-(--radio-checked-border)',\n 'dark:border-white/15 dark:group-data-checked:border-white/5 dark:group-data-hover:group-data-checked:border-white/5 dark:group-data-hover:border-white/30',\n // Inner highlight shadow\n 'after:absolute after:inset-0 after:rounded-full after:shadow-[inset_0_1px_--theme(--color-white/15%)]',\n 'dark:after:-inset-px dark:after:hidden dark:after:rounded-full dark:group-data-checked:after:block',\n // Indicator color (light mode)\n '[--radio-indicator:transparent] group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] group-data-hover:group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] group-data-hover:[--radio-indicator:var(--color-zinc-900)]/10',\n // Indicator color (dark mode)\n 'dark:group-data-hover:group-data-checked:[--radio-indicator:var(--radio-checked-indicator)] dark:group-data-hover:[--radio-indicator:var(--color-zinc-700)]',\n // Focus ring\n 'group-data-focus:outline group-data-focus:outline-2 group-data-focus:outline-offset-2 group-data-focus:outline-blue-500',\n // Disabled state\n 'group-data-disabled:opacity-50',\n 'group-data-disabled:border-zinc-950/25 group-data-disabled:bg-zinc-950/5 group-data-disabled:[--radio-checked-indicator:var(--color-zinc-950)]/50 group-data-disabled:before:bg-transparent',\n 'dark:group-data-disabled:border-white/20 dark:group-data-disabled:bg-white/2.5 dark:group-data-disabled:[--radio-checked-indicator:var(--color-white)]/50 dark:group-data-checked:group-data-disabled:after:hidden',\n];\n\nconst radioColors = {\n 'dark/zinc': [\n '[--radio-checked-bg:var(--color-zinc-900)] [--radio-checked-border:var(--color-zinc-950)]/90 [--radio-checked-indicator:var(--color-white)]',\n 'dark:[--radio-checked-bg:var(--color-zinc-600)]',\n ],\n 'dark/white': [\n '[--radio-checked-bg:var(--color-zinc-900)] [--radio-checked-border:var(--color-zinc-950)]/90 [--radio-checked-indicator:var(--color-white)]',\n 'dark:[--radio-checked-bg:var(--color-white)] dark:[--radio-checked-border:var(--color-zinc-950)]/15 dark:[--radio-checked-indicator:var(--color-zinc-900)]',\n ],\n white:\n '[--radio-checked-bg:var(--color-white)] [--radio-checked-border:var(--color-zinc-950)]/15 [--radio-checked-indicator:var(--color-zinc-900)]',\n dark: '[--radio-checked-bg:var(--color-zinc-900)] [--radio-checked-border:var(--color-zinc-950)]/90 [--radio-checked-indicator:var(--color-white)]',\n zinc: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-zinc-600)] [--radio-checked-border:var(--color-zinc-700)]/90',\n red: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-red-600)] [--radio-checked-border:var(--color-red-700)]/90',\n orange:\n '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-orange-500)] [--radio-checked-border:var(--color-orange-600)]/90',\n amber:\n '[--radio-checked-bg:var(--color-amber-400)] [--radio-checked-border:var(--color-amber-500)]/80 [--radio-checked-indicator:var(--color-amber-950)]',\n yellow:\n '[--radio-checked-bg:var(--color-yellow-300)] [--radio-checked-border:var(--color-yellow-400)]/80 [--radio-checked-indicator:var(--color-yellow-950)]',\n lime: '[--radio-checked-bg:var(--color-lime-300)] [--radio-checked-border:var(--color-lime-400)]/80 [--radio-checked-indicator:var(--color-lime-950)]',\n green:\n '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-green-600)] [--radio-checked-border:var(--color-green-700)]/90',\n emerald:\n '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-emerald-600)] [--radio-checked-border:var(--color-emerald-700)]/90',\n teal: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-teal-600)] [--radio-checked-border:var(--color-teal-700)]/90',\n cyan: '[--radio-checked-bg:var(--color-cyan-300)] [--radio-checked-border:var(--color-cyan-400)]/80 [--radio-checked-indicator:var(--color-cyan-950)]',\n sky: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-sky-500)] [--radio-checked-border:var(--color-sky-600)]/80',\n blue: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-blue-600)] [--radio-checked-border:var(--color-blue-700)]/90',\n indigo:\n '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-indigo-500)] [--radio-checked-border:var(--color-indigo-600)]/90',\n violet:\n '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-violet-500)] [--radio-checked-border:var(--color-violet-600)]/90',\n purple:\n '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-purple-500)] [--radio-checked-border:var(--color-purple-600)]/90',\n fuchsia:\n '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-fuchsia-500)] [--radio-checked-border:var(--color-fuchsia-600)]/90',\n pink: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-pink-500)] [--radio-checked-border:var(--color-pink-600)]/90',\n rose: '[--radio-checked-indicator:var(--color-white)] [--radio-checked-bg:var(--color-rose-500)] [--radio-checked-border:var(--color-rose-600)]/90',\n};\n\ntype Color = keyof typeof radioColors;\n\nexport function Radio({\n color = 'dark/zinc',\n className,\n value,\n disabled: localDisabled,\n ...props\n}: {\n color?: Color;\n className?: string;\n value: string;\n disabled?: boolean;\n} & Omit<React.ComponentPropsWithoutRef<'span'>, 'className'>) {\n const group = useRadioGroupContext();\n const disabled = localDisabled || group.disabled;\n const checked = group.value === value;\n const interactiveProps = useDataInteractive({ disabled });\n\n const handleClick = useCallback(() => {\n if (!disabled) {\n group.onChange(value);\n }\n }, [disabled, group, value]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if ((e.key === ' ' || e.key === 'Enter') && !disabled) {\n e.preventDefault();\n group.onChange(value);\n }\n },\n [disabled, group, value],\n );\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: headless radio intentionally exposes ARIA radio semantics on a custom control\n <span\n role=\"radio\"\n data-slot=\"control\"\n aria-checked={checked}\n data-checked={checked ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n data-value={value}\n tabIndex={checked ? 0 : -1}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n {...interactiveProps}\n {...props}\n className={cn(className, 'group inline-flex focus:outline-hidden')}\n >\n {group.name && checked && <input type=\"hidden\" name={group.name} value={value} />}\n <span className={cn([base, radioColors[color]])}>\n <span\n className={cn(\n 'size-full rounded-full border-[4.5px] border-transparent bg-(--radio-indicator) bg-clip-padding',\n // Forced colors mode\n 'forced-colors:border-[Canvas] forced-colors:group-data-checked:border-[Highlight]',\n )}\n />\n </span>\n </span>\n );\n}\n","'use client';\n\nimport { useCallback, useId, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport function Rating({\n value: controlledValue,\n defaultValue = 0,\n max = 5,\n onChange,\n readOnly = false,\n size = 'md',\n label,\n className,\n}: {\n value?: number;\n defaultValue?: number;\n max?: number;\n onChange?: (value: number) => void;\n readOnly?: boolean;\n size?: 'sm' | 'md' | 'lg';\n label?: string;\n className?: string;\n}) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const [hovered, setHovered] = useState(0);\n const id = useId();\n\n const value = controlledValue ?? internalValue;\n const sizeClass = { sm: 'size-4', md: 'size-6', lg: 'size-8' }[size];\n\n const handleClick = useCallback(\n (star: number) => {\n if (readOnly) return;\n setInternalValue(star);\n onChange?.(star);\n },\n [readOnly, onChange],\n );\n\n const display = hovered > 0 ? hovered : value;\n\n return (\n <div className={className}>\n {label && (\n <span id={id} className=\"sr-only\">\n {label}\n </span>\n )}\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: aria-label is valid on both \"img\" and \"radiogroup\" roles; dynamic role prevents static analysis */}\n <div\n role={readOnly ? 'img' : 'radiogroup'}\n aria-label={label ?? `Rating: ${value} out of ${max}`}\n aria-labelledby={label ? id : undefined}\n className=\"flex items-center gap-0.5\"\n >\n {Array.from({ length: max }).map((_, i) => {\n const star = i + 1;\n const filled = star <= display;\n return (\n // biome-ignore lint/a11y/useAriaPropsSupportedByRole: aria-checked and aria-label are valid on role=\"radio\" per WAI-ARIA spec\n <button\n key={star}\n type=\"button\"\n role={readOnly ? undefined : 'radio'}\n aria-checked={readOnly ? undefined : value === star}\n aria-label={readOnly ? undefined : `${star} star${star !== 1 ? 's' : ''}`}\n disabled={readOnly}\n onClick={() => handleClick(star)}\n onMouseEnter={() => !readOnly && setHovered(star)}\n onMouseLeave={() => !readOnly && setHovered(0)}\n className={cn(\n sizeClass,\n 'transition-colors',\n readOnly\n ? 'cursor-default'\n : 'cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500',\n )}\n >\n <svg\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n className={cn(\n 'size-full',\n filled\n ? 'fill-amber-400 text-amber-400'\n : 'fill-zinc-200 text-zinc-200 dark:fill-zinc-700 dark:text-zinc-700',\n )}\n >\n <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z\" />\n </svg>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { Box, type BoxProps } from '../primitives/Box.js';\nimport { cn } from '../utils/cn.js';\n\nconst Check = ({ className }: { className?: string }) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={cn('size-6', className)}\n >\n <title>Selected</title>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 12l4 4L18 8\" />\n </svg>\n );\n};\n\nconst ChevronUp = ({ className }: { className?: string }) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={cn('size-6', className)}\n >\n <title>Scroll up</title>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 15.75l-7.5-7.5-7.5 7.5\" />\n </svg>\n );\n};\n\nconst ChevronDown = ({ className }: { className?: string }) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className={cn('size-6', className)}\n >\n <title>Scroll down</title>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4.5 8.25l7.5 7.5 7.5-7.5\" />\n </svg>\n );\n};\n\nexport interface SelectProps extends BoxProps {\n onValueChange?: (value: string) => void;\n value?: string;\n}\n\nfunction Select({ children, className, ref, ...props }: SelectProps) {\n return (\n <Box ref={ref} className={cn(className)} {...props}>\n {children}\n </Box>\n );\n}\n\nSelect.displayName = 'Select';\n\nfunction SelectGroup({ children, className, ref, ...props }: BoxProps) {\n return (\n <Box ref={ref} className={cn(className)} {...props}>\n {children}\n </Box>\n );\n}\n\nexport interface SelectValueProps extends BoxProps {\n placeholder?: string;\n value?: string;\n}\n\nfunction SelectValue({\n placeholder,\n children,\n value,\n ref,\n ...props\n}: SelectValueProps & { ref?: React.Ref<HTMLSpanElement> }) {\n return (\n <span ref={ref} {...props}>\n {children || placeholder || value}\n </span>\n );\n}\n\nexport type SelectTriggerProps = BoxProps;\n\nfunction SelectTrigger({ children, className, ref, ...props }: SelectTriggerProps) {\n return (\n <Box\n className={cn(\n 'flex h-10 w-full items-center justify-between rounded border border-input bg-background px-3 py-2 text-inherit ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n <ChevronDown className=\"size-4 opacity-50\" />\n </Box>\n );\n}\n\nSelectTrigger.displayName = 'SelectTrigger';\n\nexport type SelectScrollUpButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n ref?: React.Ref<HTMLButtonElement>;\n};\n\nfunction SelectScrollUpButton({ className, ref, ...props }: SelectScrollUpButtonProps) {\n return (\n <button\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n ref={ref}\n {...props}\n >\n <ChevronUp className=\"size-4\" />\n </button>\n );\n}\n\nexport type SelectScrollDownButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n ref?: React.Ref<HTMLButtonElement>;\n};\n\nfunction SelectScrollDownButton({ className, ref, ...props }: SelectScrollDownButtonProps) {\n return (\n <button\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n ref={ref}\n {...props}\n >\n <ChevronDown className=\"size-4\" />\n </button>\n );\n}\n\nexport type SelectContentProps = BoxProps;\n\nfunction SelectContent({ children, className, ref, ...props }: SelectContentProps) {\n return (\n <Box\n className={cn(\n 'relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded border bg-card text-popover-foreground shadow-md',\n className,\n )}\n ref={ref}\n {...props}\n >\n <SelectScrollUpButton />\n <div className=\"p-1\">{children}</div>\n <SelectScrollDownButton />\n </Box>\n );\n}\n\nSelectContent.displayName = 'SelectContent';\n\nexport type SelectLabelProps = React.HTMLAttributes<HTMLDivElement> & {\n ref?: React.Ref<HTMLDivElement>;\n};\n\nfunction SelectLabel({ className, ref, ...props }: SelectLabelProps) {\n return (\n <div className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)} ref={ref} {...props} />\n );\n}\n\nexport interface SelectItemProps extends BoxProps {\n value?: string;\n}\n\nfunction SelectItem({ children, className, value, ref, ...props }: SelectItemProps) {\n return (\n <Box\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n data-value={value}\n ref={ref}\n {...props}\n >\n <span className=\"absolute left-2 flex size-3.5 items-center justify-center\">\n <Check className=\"size-4\" />\n </span>\n <span>{children}</span>\n </Box>\n );\n}\n\nSelectItem.displayName = 'SelectItem';\n\nexport type SelectSeparatorProps = BoxProps;\n\nfunction SelectSeparator({ className, ref, ...props }: SelectSeparatorProps) {\n return <Box className={cn('-mx-1 my-1 h-px bg-muted', className)} ref={ref} {...props} />;\n}\n\nSelectSeparator.displayName = 'SelectSeparator';\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","import type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { useFieldControlProps } from '../hooks/use-field-context.js';\nimport { cn } from '../utils/cn.js';\n\ntype SelectProps = {\n className?: string;\n multiple?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n ref?: React.Ref<HTMLSelectElement>;\n} & Omit<React.ComponentPropsWithoutRef<'select'>, 'className'>;\n\nexport function Select({ className, multiple, disabled, invalid, ref, ...props }: SelectProps) {\n const interactiveProps = useDataInteractive({ disabled });\n const fieldProps = useFieldControlProps();\n\n return (\n <span\n data-slot=\"control\"\n className={cn([\n className,\n // Basic layout\n 'group relative block w-full',\n // Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode\n 'before:absolute before:inset-px before:rounded-[calc(var(--radius-lg)-1px)] before:bg-white before:shadow-sm',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Focus ring\n 'after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset has-data-focus:after:ring-2 has-data-focus:after:ring-blue-500',\n // Disabled state\n 'has-data-disabled:opacity-50 has-data-disabled:before:bg-zinc-950/5 has-data-disabled:before:shadow-none',\n ])}\n >\n <select\n ref={ref}\n multiple={multiple}\n disabled={disabled}\n {...props}\n {...interactiveProps}\n {...fieldProps}\n data-invalid={invalid ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n className={cn([\n // Basic layout\n 'relative block w-full appearance-none rounded-lg py-[calc(--spacing(2.5)-1px)] sm:py-[calc(--spacing(1.5)-1px)]',\n // Horizontal padding\n multiple\n ? 'px-[calc(--spacing(3.5)-1px)] sm:px-[calc(--spacing(3)-1px)]'\n : 'pr-[calc(--spacing(10)-1px)] pl-[calc(--spacing(3.5)-1px)] sm:pr-[calc(--spacing(9)-1px)] sm:pl-[calc(--spacing(3)-1px)]',\n // Options (multi-select)\n '[&_optgroup]:font-semibold',\n // Typography\n 'text-base/6 text-zinc-950 placeholder:text-zinc-500 sm:text-sm/6 dark:text-white dark:*:text-white',\n // Border\n 'border border-zinc-950/10 data-hover:border-zinc-950/20 dark:border-white/10 dark:data-hover:border-white/20',\n // Background color\n 'bg-transparent dark:bg-white/5 dark:*:bg-zinc-800',\n // Hide default focus styles\n 'focus:outline-hidden',\n // Invalid state\n 'data-invalid:border-red-500 data-invalid:data-hover:border-red-500 dark:data-invalid:border-red-600 dark:data-invalid:data-hover:border-red-600',\n // Disabled state\n 'data-disabled:border-zinc-950/20 data-disabled:opacity-100 dark:data-disabled:border-white/15 dark:data-disabled:bg-white/2.5 dark:data-hover:data-disabled:border-white/15',\n ])}\n />\n {!multiple && (\n <span className=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2\">\n <svg\n className=\"size-5 stroke-zinc-500 group-has-data-disabled:stroke-zinc-600 sm:size-4 dark:stroke-zinc-400 forced-colors:stroke-[CanvasText]\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n fill=\"none\"\n >\n <path\n d=\"M5.75 10.75L8 13L10.25 10.75\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.25 5.25L8 3L5.75 5.25\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n )}\n </span>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport const CloseContext = createContext<(() => void) | null>(null);\n\nexport function useCloseContext(): (() => void) | null {\n return useContext(CloseContext);\n}\n","'use client';\n\nimport type React from 'react';\nimport { useCallback, useId } from 'react';\nimport { useCloseContext } from '../hooks/use-close-context.js';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { LayoutGroup, LayoutIndicator } from '../hooks/use-layout-animation.js';\nimport { cn } from '../utils/cn.js';\nimport { TouchTarget } from './button-headless.js';\nimport { Link } from './link.js';\n\nexport function Sidebar({ className, ...props }: React.ComponentPropsWithoutRef<'nav'>) {\n return <nav {...props} className={cn(className, 'flex h-full min-h-0 flex-col')} />;\n}\n\nexport function SidebarHeader({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n {...props}\n className={cn(\n className,\n 'flex flex-col border-b border-zinc-950/5 p-4 dark:border-white/5 [&>[data-slot=section]+[data-slot=section]]:mt-2.5',\n )}\n />\n );\n}\n\nexport function SidebarBody({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n {...props}\n className={cn(\n className,\n 'flex flex-1 flex-col overflow-y-auto p-4 [&>[data-slot=section]+[data-slot=section]]:mt-8',\n )}\n />\n );\n}\n\nexport function SidebarFooter({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n {...props}\n className={cn(\n className,\n 'flex flex-col border-t border-zinc-950/5 p-4 dark:border-white/5 [&>[data-slot=section]+[data-slot=section]]:mt-2.5',\n )}\n />\n );\n}\n\nexport function SidebarSection({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n const id = useId();\n\n return (\n <LayoutGroup id={id}>\n <div {...props} data-slot=\"section\" className={cn(className, 'flex flex-col gap-0.5')} />\n </LayoutGroup>\n );\n}\n\nexport function SidebarDivider({ className, ...props }: React.ComponentPropsWithoutRef<'hr'>) {\n return (\n <hr\n {...props}\n className={cn(className, 'my-4 border-t border-zinc-950/5 lg:-mx-4 dark:border-white/5')}\n />\n );\n}\n\nexport function SidebarSpacer({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return <div aria-hidden=\"true\" {...props} className={cn(className, 'mt-8 flex-1')} />;\n}\n\nexport function SidebarHeading({ className, ...props }: React.ComponentPropsWithoutRef<'h3'>) {\n return (\n <h3\n {...props}\n className={cn(className, 'mb-1 px-2 text-xs/6 font-medium text-zinc-500 dark:text-zinc-400')}\n />\n );\n}\n\nexport function SidebarItem({\n current,\n className,\n children,\n ref,\n ...props\n}: {\n current?: boolean;\n className?: string;\n children: React.ReactNode;\n ref?: React.Ref<HTMLAnchorElement | HTMLButtonElement>;\n} & (\n | ({\n href?: never;\n disabled?: boolean;\n } & Omit<React.ComponentPropsWithoutRef<'button'>, 'className'>)\n | ({ href: string } & Omit<React.ComponentPropsWithoutRef<typeof Link>, 'className'>)\n)) {\n const disabled = 'disabled' in props ? props.disabled : false;\n const interactiveProps = useDataInteractive({ disabled: disabled ?? false });\n const closeFn = useCloseContext();\n const propsOnClick =\n 'onClick' in props\n ? (props.onClick as React.MouseEventHandler<HTMLAnchorElement> | undefined)\n : undefined;\n\n const handleLinkClick = useCallback(\n (e: React.MouseEvent<HTMLAnchorElement>) => {\n propsOnClick?.(e);\n closeFn?.();\n },\n [propsOnClick, closeFn],\n );\n\n const classes = cn(\n // Base\n 'flex w-full items-center gap-3 rounded-lg px-2 py-2.5 text-left text-base/6 font-medium text-zinc-950 sm:py-2 sm:text-sm/5',\n // Leading icon/icon-only\n '*:data-[slot=icon]:size-6 *:data-[slot=icon]:shrink-0 *:data-[slot=icon]:fill-zinc-500 sm:*:data-[slot=icon]:size-5',\n // Trailing icon (down chevron or similar)\n '*:last:data-[slot=icon]:ml-auto *:last:data-[slot=icon]:size-5 sm:*:last:data-[slot=icon]:size-4',\n // Avatar\n '*:data-[slot=avatar]:-m-0.5 *:data-[slot=avatar]:size-7 sm:*:data-[slot=avatar]:size-6',\n // Hover\n 'data-hover:bg-zinc-950/5 data-hover:*:data-[slot=icon]:fill-zinc-950',\n // Active\n 'data-active:bg-zinc-950/5 data-active:*:data-[slot=icon]:fill-zinc-950',\n // Current\n 'data-current:*:data-[slot=icon]:fill-zinc-950',\n // Dark mode\n 'dark:text-white dark:*:data-[slot=icon]:fill-zinc-400',\n 'dark:data-hover:bg-white/5 dark:data-hover:*:data-[slot=icon]:fill-white',\n 'dark:data-active:bg-white/5 dark:data-active:*:data-[slot=icon]:fill-white',\n 'dark:data-current:*:data-[slot=icon]:fill-white',\n );\n\n return (\n <span className={cn(className, 'relative')}>\n {current && (\n <LayoutIndicator\n layoutId=\"current-indicator\"\n className=\"absolute inset-y-2 -left-4 w-0.5 rounded-full bg-zinc-950 dark:bg-white\"\n />\n )}\n {typeof props.href === 'string' ? (\n <Link\n {...props}\n className={classes}\n data-current={current ? 'true' : undefined}\n ref={ref as React.Ref<HTMLAnchorElement>}\n onClick={handleLinkClick}\n >\n <TouchTarget>{children}</TouchTarget>\n </Link>\n ) : (\n <button\n type=\"button\"\n {...props}\n {...interactiveProps}\n className={cn('cursor-default', classes)}\n data-current={current ? 'true' : undefined}\n ref={ref as React.Ref<HTMLButtonElement>}\n >\n <TouchTarget>{children}</TouchTarget>\n </button>\n )}\n </span>\n );\n}\n\nexport function SidebarLabel({ className, ...props }: React.ComponentPropsWithoutRef<'span'>) {\n return <span {...props} className={cn(className, 'truncate')} />;\n}\n","'use client';\n\nimport type React from 'react';\nimport { useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseContext } from '../hooks/use-close-context.js';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { useFocusTrap } from '../hooks/use-focus-trap.js';\nimport { useScrollLock } from '../hooks/use-scroll-lock.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { NavbarItem } from './navbar.js';\n\nfunction OpenMenuIcon() {\n return (\n <svg data-slot=\"icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2 6.75C2 6.33579 2.33579 6 2.75 6H17.25C17.6642 6 18 6.33579 18 6.75C18 7.16421 17.6642 7.5 17.25 7.5H2.75C2.33579 7.5 2 7.16421 2 6.75ZM2 13.25C2 12.8358 2.33579 12.5 2.75 12.5H17.25C17.6642 12.5 18 12.8358 18 13.25C18 13.6642 17.6642 14 17.25 14H2.75C2.33579 14 2 13.6642 2 13.25Z\" />\n </svg>\n );\n}\n\nfunction CloseMenuIcon() {\n return (\n <svg data-slot=\"icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z\" />\n </svg>\n );\n}\n\nfunction MobileSidebar({\n open,\n close,\n children,\n}: React.PropsWithChildren<{ open: boolean; close: () => void }>) {\n const panelRef = useRef<HTMLDivElement>(null);\n\n const backdrop = useTransition(open);\n const panel = useTransition(open);\n\n useScrollLock(open);\n useFocusTrap(panelRef, open);\n useEscapeKey(close, open);\n\n if (!(backdrop.mounted || panel.mounted)) return null;\n\n return createPortal(\n <CloseContext.Provider value={close}>\n <div role=\"dialog\" aria-modal=\"true\" className=\"lg:hidden\">\n {/* Backdrop */}\n {backdrop.mounted && (\n <button\n type=\"button\"\n aria-label=\"Close navigation\"\n ref={backdrop.nodeRef as React.RefObject<HTMLButtonElement>}\n {...backdrop.transitionProps}\n onClick={close}\n className=\"fixed inset-0 bg-black/30 transition data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in\"\n />\n )}\n\n {/* Panel */}\n {panel.mounted && (\n <div\n ref={(node) => {\n (panelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n (panel.nodeRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n {...panel.transitionProps}\n className=\"fixed inset-y-0 w-full max-w-80 p-2 transition duration-300 ease-in-out data-closed:-translate-x-full\"\n >\n <div className=\"flex h-full flex-col rounded-lg bg-white shadow-xs ring-1 ring-zinc-950/5 dark:bg-zinc-900 dark:ring-white/10\">\n <div className=\"-mb-3 px-4 pt-3\">\n <NavbarItem onClick={close} aria-label=\"Close navigation\">\n <CloseMenuIcon />\n </NavbarItem>\n </div>\n {children}\n </div>\n </div>\n )}\n </div>\n </CloseContext.Provider>,\n document.body,\n );\n}\n\nexport function SidebarLayout({\n navbar,\n sidebar,\n children,\n}: React.PropsWithChildren<{\n navbar: React.ReactNode;\n sidebar: React.ReactNode;\n}>) {\n const [showSidebar, setShowSidebar] = useState(false);\n\n return (\n <div className=\"relative isolate flex min-h-svh w-full bg-white max-lg:flex-col lg:bg-zinc-100 dark:bg-zinc-900 dark:lg:bg-zinc-950\">\n {/* Sidebar on desktop */}\n <div className=\"fixed inset-y-0 left-0 w-64 max-lg:hidden\">{sidebar}</div>\n\n {/* Sidebar on mobile */}\n <MobileSidebar open={showSidebar} close={() => setShowSidebar(false)}>\n {sidebar}\n </MobileSidebar>\n\n {/* Navbar on mobile */}\n <header className=\"flex items-center px-4 lg:hidden\">\n <div className=\"py-2.5\">\n <NavbarItem onClick={() => setShowSidebar(true)} aria-label=\"Open navigation\">\n <OpenMenuIcon />\n </NavbarItem>\n </div>\n <div className=\"min-w-0 flex-1\">{navbar}</div>\n </header>\n\n {/* Content */}\n <main className=\"flex flex-1 flex-col pb-2 lg:min-w-0 lg:pt-2 lg:pr-2 lg:pl-64\">\n <div className=\"grow p-6 lg:rounded-lg lg:bg-white lg:p-10 lg:shadow-xs lg:ring-1 lg:ring-zinc-950/5 dark:lg:bg-zinc-900 dark:lg:ring-white/10\">\n <div className=\"mx-auto max-w-6xl\">{children}</div>\n </div>\n </main>\n </div>\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { useCallback, useId, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport function Slider({\n value: controlledValue,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n disabled = false,\n label,\n showValue = false,\n className,\n}: {\n value?: number;\n defaultValue?: number;\n min?: number;\n max?: number;\n step?: number;\n onChange?: (value: number) => void;\n disabled?: boolean;\n label?: string;\n showValue?: boolean;\n className?: string;\n}) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = controlledValue ?? internalValue;\n const id = useId();\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const next = Number(e.target.value);\n setInternalValue(next);\n onChange?.(next);\n },\n [onChange],\n );\n\n const percentage = ((value - min) / (max - min)) * 100;\n\n return (\n <div className={cn('w-full', className)}>\n {(label || showValue) && (\n <div className=\"mb-2 flex items-center justify-between\">\n {label && (\n <label htmlFor={id} className=\"text-sm font-medium text-zinc-700 dark:text-zinc-300\">\n {label}\n </label>\n )}\n {showValue && <span className=\"text-sm text-zinc-500 dark:text-zinc-400\">{value}</span>}\n </div>\n )}\n <input\n id={id}\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n onChange={handleChange}\n style={{ '--slider-pct': `${percentage}%` } as React.CSSProperties}\n className={cn(\n 'h-2 w-full cursor-pointer appearance-none rounded-full outline-none',\n 'bg-zinc-200 dark:bg-zinc-700',\n '[&::-webkit-slider-thumb]:size-4 [&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:appearance-none',\n '[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-blue-600 [&::-webkit-slider-thumb]:shadow-sm',\n '[&::-webkit-slider-thumb]:ring-2 [&::-webkit-slider-thumb]:ring-white [&::-webkit-slider-thumb]:dark:ring-zinc-900',\n '[&::-moz-range-thumb]:size-4 [&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:appearance-none',\n '[&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-none [&::-moz-range-thumb]:bg-blue-600',\n 'focus-visible:[&::-webkit-slider-thumb]:outline-2 focus-visible:[&::-webkit-slider-thumb]:outline-offset-2 focus-visible:[&::-webkit-slider-thumb]:outline-blue-500',\n disabled && 'cursor-not-allowed opacity-50',\n )}\n />\n </div>\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { CloseContext } from '../hooks/use-close-context.js';\nimport { useEscapeKey } from '../hooks/use-escape-key.js';\nimport { useFocusTrap } from '../hooks/use-focus-trap.js';\nimport { useScrollLock } from '../hooks/use-scroll-lock.js';\nimport { useTransition } from '../hooks/use-transition.js';\nimport { NavbarItem } from './navbar.js';\n\nfunction OpenMenuIcon() {\n return (\n <svg data-slot=\"icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M2 6.75C2 6.33579 2.33579 6 2.75 6H17.25C17.6642 6 18 6.33579 18 6.75C18 7.16421 17.6642 7.5 17.25 7.5H2.75C2.33579 7.5 2 7.16421 2 6.75ZM2 13.25C2 12.8358 2.33579 12.5 2.75 12.5H17.25C17.6642 12.5 18 12.8358 18 13.25C18 13.6642 17.6642 14 17.25 14H2.75C2.33579 14 2 13.6642 2 13.25Z\" />\n </svg>\n );\n}\n\nfunction CloseMenuIcon() {\n return (\n <svg data-slot=\"icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M6.28 5.22a.75.75 0 0 0-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 1 0 1.06 1.06L10 11.06l3.72 3.72a.75.75 0 1 0 1.06-1.06L11.06 10l3.72-3.72a.75.75 0 0 0-1.06-1.06L10 8.94 6.28 5.22Z\" />\n </svg>\n );\n}\n\nfunction MobileSidebar({\n open,\n close,\n children,\n}: React.PropsWithChildren<{ open: boolean; close: () => void }>) {\n const panelRef = useRef<HTMLDivElement>(null);\n\n const backdrop = useTransition(open);\n const panel = useTransition(open);\n\n useScrollLock(open);\n useFocusTrap(panelRef, open);\n useEscapeKey(close, open);\n\n if (!(backdrop.mounted || panel.mounted)) return null;\n\n return createPortal(\n <CloseContext.Provider value={close}>\n <div role=\"dialog\" aria-modal=\"true\" className=\"lg:hidden\">\n {/* Backdrop */}\n {backdrop.mounted && (\n <button\n type=\"button\"\n aria-label=\"Close navigation\"\n ref={backdrop.nodeRef as React.RefObject<HTMLButtonElement>}\n {...backdrop.transitionProps}\n onClick={close}\n className=\"fixed inset-0 bg-black/30 transition data-closed:opacity-0 data-enter:duration-300 data-enter:ease-out data-leave:duration-200 data-leave:ease-in\"\n />\n )}\n\n {/* Panel */}\n {panel.mounted && (\n <div\n ref={(node) => {\n (panelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n (panel.nodeRef as React.MutableRefObject<HTMLElement | null>).current = node;\n }}\n {...panel.transitionProps}\n className=\"fixed inset-y-0 w-full max-w-80 p-2 transition duration-300 ease-in-out data-closed:-translate-x-full\"\n >\n <div className=\"flex h-full flex-col rounded-lg bg-white shadow-xs ring-1 ring-zinc-950/5 dark:bg-zinc-900 dark:ring-white/10\">\n <div className=\"-mb-3 px-4 pt-3\">\n <NavbarItem onClick={close} aria-label=\"Close navigation\">\n <CloseMenuIcon />\n </NavbarItem>\n </div>\n {children}\n </div>\n </div>\n )}\n </div>\n </CloseContext.Provider>,\n document.body,\n );\n}\n\nexport function StackedLayout({\n navbar,\n sidebar,\n children,\n}: React.PropsWithChildren<{\n navbar: React.ReactNode;\n sidebar: React.ReactNode;\n}>) {\n const [showSidebar, setShowSidebar] = useState(false);\n\n return (\n <div className=\"relative isolate flex min-h-svh w-full flex-col bg-white lg:bg-zinc-100 dark:bg-zinc-900 dark:lg:bg-zinc-950\">\n {/* Sidebar on mobile */}\n <MobileSidebar open={showSidebar} close={() => setShowSidebar(false)}>\n {sidebar}\n </MobileSidebar>\n\n {/* Navbar */}\n <header className=\"flex items-center px-4\">\n <div className=\"py-2.5 lg:hidden\">\n <NavbarItem onClick={() => setShowSidebar(true)} aria-label=\"Open navigation\">\n <OpenMenuIcon />\n </NavbarItem>\n </div>\n <div className=\"min-w-0 flex-1\">{navbar}</div>\n </header>\n\n {/* Content */}\n <main className=\"flex flex-1 flex-col pb-2 lg:px-2\">\n <div className=\"grow p-6 lg:rounded-lg lg:bg-white lg:p-10 lg:shadow-xs lg:ring-1 lg:ring-zinc-950/5 dark:lg:bg-zinc-900 dark:lg:ring-white/10\">\n <div className=\"mx-auto max-w-6xl\">{children}</div>\n </div>\n </main>\n </div>\n );\n}\n","import type React from 'react';\nimport { cn } from '../utils/cn.js';\n\ntype TrendDirection = 'up' | 'down' | 'neutral';\n\nconst trendStyles: Record<TrendDirection, React.CSSProperties> = {\n up: { color: 'var(--rvui-success, oklch(0.72 0.17 155))' },\n down: { color: 'var(--rvui-error, oklch(0.65 0.2 25))' },\n neutral: { color: 'var(--rvui-text-2, oklch(0.55 0.012 218))' },\n};\n\nconst trendArrow = { up: '↑', down: '↓', neutral: '→' };\n\nexport function Stat({\n label,\n value,\n change,\n trend,\n description,\n icon,\n className,\n}: {\n label: string;\n value: React.ReactNode;\n change?: string;\n trend?: TrendDirection;\n description?: string;\n icon?: React.ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn('rounded-xl p-6 ring-1', className)}\n style={\n {\n backgroundColor: 'var(--rvui-surface-1, oklch(0.18 0.006 225))',\n '--tw-ring-color': 'var(--rvui-border-subtle, oklch(0.28 0.006 222 / 0.4))',\n borderRadius: 'var(--rvui-radius-lg, 16px)',\n transition:\n 'box-shadow var(--rvui-duration-normal, 200ms) var(--rvui-ease, cubic-bezier(0.22, 1, 0.36, 1))',\n } as React.CSSProperties\n }\n >\n <div className=\"flex items-start justify-between\">\n <p\n className=\"text-sm font-medium\"\n style={{ color: 'var(--rvui-text-2, oklch(0.55 0.012 218))' }}\n >\n {label}\n </p>\n {icon && (\n <div\n className=\"rounded-lg p-2\"\n style={{ backgroundColor: 'var(--rvui-surface-2, oklch(0.22 0.008 222))' }}\n >\n {icon}\n </div>\n )}\n </div>\n <p\n className=\"mt-2 text-3xl font-semibold tracking-tight\"\n style={{ color: 'var(--rvui-text-0, oklch(0.95 0.002 210))' }}\n >\n {value}\n </p>\n {(change || description) && (\n <div className=\"mt-2 flex items-center gap-2\">\n {change && trend && (\n <span className=\"text-sm font-medium\" style={trendStyles[trend]}>\n {trendArrow[trend]} {change}\n </span>\n )}\n {description && (\n <span\n className=\"text-sm\"\n style={{ color: 'var(--rvui-text-2, oklch(0.55 0.012 218))' }}\n >\n {description}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function StatGroup({\n className,\n children,\n}: {\n className?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4', className)}>\n {children}\n </div>\n );\n}\n","import { cn } from '../utils/cn.js';\n\ntype StepStatus = 'complete' | 'current' | 'upcoming';\n\nexport type StepperStep = {\n label: string;\n description?: string;\n status: StepStatus;\n};\n\nexport function Stepper({\n steps,\n orientation = 'horizontal',\n className,\n}: {\n steps: StepperStep[];\n orientation?: 'horizontal' | 'vertical';\n className?: string;\n}) {\n return orientation === 'vertical' ? (\n <StepperVertical steps={steps} className={className} />\n ) : (\n <StepperHorizontal steps={steps} className={className} />\n );\n}\n\nfunction StepIcon({ status }: { status: StepStatus }) {\n if (status === 'complete') {\n return (\n <span className=\"flex size-8 items-center justify-center rounded-full bg-blue-600\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className=\"size-4 text-white\" aria-hidden=\"true\">\n <path\n d=\"M3 8l3.5 3.5L13 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n );\n }\n if (status === 'current') {\n return (\n <span className=\"flex size-8 items-center justify-center rounded-full border-2 border-blue-600 bg-white dark:bg-zinc-900\">\n <span className=\"size-2.5 rounded-full bg-blue-600\" />\n </span>\n );\n }\n return (\n <span className=\"flex size-8 items-center justify-center rounded-full border-2 border-zinc-300 bg-white dark:border-zinc-600 dark:bg-zinc-900\">\n <span className=\"size-2.5 rounded-full bg-transparent\" />\n </span>\n );\n}\n\nfunction StepperHorizontal({ steps, className }: { steps: StepperStep[]; className?: string }) {\n return (\n <nav aria-label=\"Progress\">\n <ol className={cn('flex items-center', className)}>\n {steps.map((step, index) => {\n const isLast = index === steps.length - 1;\n return (\n <li\n // biome-ignore lint/suspicious/noArrayIndexKey: stepper steps are positionally ordered with no stable ID\n key={index}\n aria-current={step.status === 'current' ? 'step' : undefined}\n className={cn('flex items-center', !isLast && 'flex-1')}\n >\n <div className=\"flex flex-col items-center gap-1.5\">\n <StepIcon status={step.status} />\n <span\n className={cn(\n 'text-xs font-medium',\n step.status === 'current'\n ? 'text-blue-600'\n : step.status === 'complete'\n ? 'text-zinc-950 dark:text-white'\n : 'text-zinc-400 dark:text-zinc-500',\n )}\n >\n {step.label}\n </span>\n </div>\n {!isLast && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'mx-3 h-px flex-1',\n step.status === 'complete' ? 'bg-blue-600' : 'bg-zinc-200 dark:bg-zinc-700',\n )}\n />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n\nfunction StepperVertical({ steps, className }: { steps: StepperStep[]; className?: string }) {\n return (\n <nav aria-label=\"Progress\">\n <ol className={cn('space-y-0', className)}>\n {steps.map((step, index) => {\n const isLast = index === steps.length - 1;\n return (\n <li\n // biome-ignore lint/suspicious/noArrayIndexKey: stepper steps are positionally ordered with no stable ID\n key={index}\n aria-current={step.status === 'current' ? 'step' : undefined}\n className=\"relative flex gap-4\"\n >\n <div className=\"flex flex-col items-center\">\n <StepIcon status={step.status} />\n {!isLast && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'w-px flex-1',\n step.status === 'complete' ? 'bg-blue-600' : 'bg-zinc-200 dark:bg-zinc-700',\n )}\n />\n )}\n </div>\n <div className={cn('pb-6 pt-1', isLast && 'pb-0')}>\n <p\n className={cn(\n 'text-sm font-medium',\n step.status === 'current'\n ? 'text-blue-600'\n : step.status === 'complete'\n ? 'text-zinc-950 dark:text-white'\n : 'text-zinc-400 dark:text-zinc-500',\n )}\n >\n {step.label}\n </p>\n {step.description && (\n <p className=\"mt-0.5 text-sm text-zinc-500 dark:text-zinc-400\">\n {step.description}\n </p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { FieldProvider } from '../hooks/use-field-context.js';\nimport { useToggle } from '../hooks/use-toggle.js';\nimport { cn } from '../utils/cn.js';\n\nexport function SwitchGroup({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {\n return (\n <div\n data-slot=\"control\"\n {...props}\n className={cn(\n className,\n // Basic groups\n 'space-y-3 **:data-[slot=label]:font-normal',\n // With descriptions\n 'has-data-[slot=description]:space-y-6 has-data-[slot=description]:**:data-[slot=label]:font-medium',\n )}\n />\n );\n}\n\nexport function SwitchField({\n className,\n disabled,\n ...props\n}: {\n className?: string;\n disabled?: boolean;\n} & Omit<React.ComponentPropsWithoutRef<'div'>, 'className'>) {\n return (\n <FieldProvider disabled={disabled}>\n <div\n data-slot=\"field\"\n data-disabled={disabled ? '' : undefined}\n {...props}\n className={cn(\n className,\n // Base layout\n 'grid grid-cols-[1fr_auto] gap-x-8 gap-y-1 sm:grid-cols-[1fr_auto]',\n // Control layout\n '*:data-[slot=control]:col-start-2 *:data-[slot=control]:self-start sm:*:data-[slot=control]:mt-0.5',\n // Label layout\n '*:data-[slot=label]:col-start-1 *:data-[slot=label]:row-start-1',\n // Description layout\n '*:data-[slot=description]:col-start-1 *:data-[slot=description]:row-start-2',\n // With description\n 'has-data-[slot=description]:**:data-[slot=label]:font-medium',\n )}\n />\n </FieldProvider>\n );\n}\n\nconst colors = {\n 'dark/zinc': [\n '[--switch-bg-ring:var(--color-zinc-950)]/90 [--switch-bg:var(--color-zinc-900)] dark:[--switch-bg-ring:transparent] dark:[--switch-bg:var(--color-white)]/25',\n '[--switch-ring:var(--color-zinc-950)]/90 [--switch-shadow:var(--color-black)]/10 [--switch:white] dark:[--switch-ring:var(--color-zinc-700)]/90',\n ],\n 'dark/white': [\n '[--switch-bg-ring:var(--color-zinc-950)]/90 [--switch-bg:var(--color-zinc-900)] dark:[--switch-bg-ring:transparent] dark:[--switch-bg:var(--color-white)]',\n '[--switch-ring:var(--color-zinc-950)]/90 [--switch-shadow:var(--color-black)]/10 [--switch:white] dark:[--switch-ring:transparent] dark:[--switch:var(--color-zinc-900)]',\n ],\n dark: [\n '[--switch-bg-ring:var(--color-zinc-950)]/90 [--switch-bg:var(--color-zinc-900)] dark:[--switch-bg-ring:var(--color-white)]/15',\n '[--switch-ring:var(--color-zinc-950)]/90 [--switch-shadow:var(--color-black)]/10 [--switch:white]',\n ],\n zinc: [\n '[--switch-bg-ring:var(--color-zinc-700)]/90 [--switch-bg:var(--color-zinc-600)] dark:[--switch-bg-ring:transparent]',\n '[--switch-shadow:var(--color-black)]/10 [--switch:white] [--switch-ring:var(--color-zinc-700)]/90',\n ],\n white: [\n '[--switch-bg-ring:var(--color-black)]/15 [--switch-bg:white] dark:[--switch-bg-ring:transparent]',\n '[--switch-shadow:var(--color-black)]/10 [--switch-ring:transparent] [--switch:var(--color-zinc-950)]',\n ],\n red: [\n '[--switch-bg-ring:var(--color-red-700)]/90 [--switch-bg:var(--color-red-600)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-red-700)]/90 [--switch-shadow:var(--color-red-900)]/20',\n ],\n orange: [\n '[--switch-bg-ring:var(--color-orange-600)]/90 [--switch-bg:var(--color-orange-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-orange-600)]/90 [--switch-shadow:var(--color-orange-900)]/20',\n ],\n amber: [\n '[--switch-bg-ring:var(--color-amber-500)]/80 [--switch-bg:var(--color-amber-400)] dark:[--switch-bg-ring:transparent]',\n '[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-amber-950)]',\n ],\n yellow: [\n '[--switch-bg-ring:var(--color-yellow-400)]/80 [--switch-bg:var(--color-yellow-300)] dark:[--switch-bg-ring:transparent]',\n '[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-yellow-950)]',\n ],\n lime: [\n '[--switch-bg-ring:var(--color-lime-400)]/80 [--switch-bg:var(--color-lime-300)] dark:[--switch-bg-ring:transparent]',\n '[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-lime-950)]',\n ],\n green: [\n '[--switch-bg-ring:var(--color-green-700)]/90 [--switch-bg:var(--color-green-600)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-green-700)]/90 [--switch-shadow:var(--color-green-900)]/20',\n ],\n emerald: [\n '[--switch-bg-ring:var(--color-emerald-600)]/90 [--switch-bg:var(--color-emerald-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-emerald-600)]/90 [--switch-shadow:var(--color-emerald-900)]/20',\n ],\n teal: [\n '[--switch-bg-ring:var(--color-teal-700)]/90 [--switch-bg:var(--color-teal-600)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-teal-700)]/90 [--switch-shadow:var(--color-teal-900)]/20',\n ],\n cyan: [\n '[--switch-bg-ring:var(--color-cyan-400)]/80 [--switch-bg:var(--color-cyan-300)] dark:[--switch-bg-ring:transparent]',\n '[--switch-ring:transparent] [--switch-shadow:transparent] [--switch:var(--color-cyan-950)]',\n ],\n sky: [\n '[--switch-bg-ring:var(--color-sky-600)]/80 [--switch-bg:var(--color-sky-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-sky-600)]/80 [--switch-shadow:var(--color-sky-900)]/20',\n ],\n blue: [\n '[--switch-bg-ring:var(--color-blue-700)]/90 [--switch-bg:var(--color-blue-600)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-blue-700)]/90 [--switch-shadow:var(--color-blue-900)]/20',\n ],\n indigo: [\n '[--switch-bg-ring:var(--color-indigo-600)]/90 [--switch-bg:var(--color-indigo-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-indigo-600)]/90 [--switch-shadow:var(--color-indigo-900)]/20',\n ],\n violet: [\n '[--switch-bg-ring:var(--color-violet-600)]/90 [--switch-bg:var(--color-violet-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-violet-600)]/90 [--switch-shadow:var(--color-violet-900)]/20',\n ],\n purple: [\n '[--switch-bg-ring:var(--color-purple-600)]/90 [--switch-bg:var(--color-purple-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-purple-600)]/90 [--switch-shadow:var(--color-purple-900)]/20',\n ],\n fuchsia: [\n '[--switch-bg-ring:var(--color-fuchsia-600)]/90 [--switch-bg:var(--color-fuchsia-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-fuchsia-600)]/90 [--switch-shadow:var(--color-fuchsia-900)]/20',\n ],\n pink: [\n '[--switch-bg-ring:var(--color-pink-600)]/90 [--switch-bg:var(--color-pink-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-pink-600)]/90 [--switch-shadow:var(--color-pink-900)]/20',\n ],\n rose: [\n '[--switch-bg-ring:var(--color-rose-600)]/90 [--switch-bg:var(--color-rose-500)] dark:[--switch-bg-ring:transparent]',\n '[--switch:white] [--switch-ring:var(--color-rose-600)]/90 [--switch-shadow:var(--color-rose-900)]/20',\n ],\n};\n\ntype Color = keyof typeof colors;\n\nexport function Switch({\n color = 'dark/zinc',\n className,\n checked: controlledChecked,\n defaultChecked,\n onChange,\n disabled,\n name,\n value,\n ...props\n}: {\n color?: Color;\n className?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n disabled?: boolean;\n name?: string;\n value?: string;\n} & Omit<React.ComponentPropsWithoutRef<'button'>, 'className' | 'onChange' | 'type'>) {\n const { checked, toggleProps } = useToggle({\n checked: controlledChecked,\n defaultChecked,\n onChange,\n disabled,\n });\n const interactiveProps = useDataInteractive({ disabled });\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n data-slot=\"control\"\n aria-checked={checked}\n data-checked={checked ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n disabled={disabled}\n onClick={toggleProps.onClick}\n onKeyDown={toggleProps.onKeyDown}\n {...interactiveProps}\n {...props}\n className={cn(\n className,\n // Base styles\n 'group relative isolate inline-flex h-6 w-10 cursor-default rounded-full p-[3px] sm:h-5 sm:w-8',\n // Transitions\n 'transition duration-0 ease-in-out data-changing:duration-200',\n // Outline and background color in forced-colors mode so switch is still visible\n 'forced-colors:outline forced-colors:[--switch-bg:Highlight] dark:forced-colors:[--switch-bg:Highlight]',\n // Unchecked\n 'bg-zinc-200 ring-1 ring-black/5 ring-inset dark:bg-white/5 dark:ring-white/15',\n // Checked\n 'data-checked:bg-(--switch-bg) data-checked:ring-(--switch-bg-ring) dark:data-checked:bg-(--switch-bg) dark:data-checked:ring-(--switch-bg-ring)',\n // Focus\n 'focus:not-data-focus:outline-hidden data-focus:outline-2 data-focus:outline-offset-2 data-focus:outline-blue-500',\n // Hover\n 'data-hover:ring-black/15 data-hover:data-checked:ring-(--switch-bg-ring)',\n 'dark:data-hover:ring-white/25 dark:data-hover:data-checked:ring-(--switch-bg-ring)',\n // Disabled\n 'data-disabled:bg-zinc-200 data-disabled:opacity-50 data-disabled:data-checked:bg-zinc-200 data-disabled:data-checked:ring-black/5',\n 'dark:data-disabled:bg-white/15 dark:data-disabled:data-checked:bg-white/15 dark:data-disabled:data-checked:ring-white/15',\n // Color specific styles\n colors[color],\n )}\n >\n {name && <input type=\"hidden\" name={name} value={checked ? (value ?? 'on') : ''} />}\n <span\n aria-hidden=\"true\"\n className={cn(\n // Basic layout\n 'pointer-events-none relative inline-block size-4.5 rounded-full sm:size-3.5',\n // Transition\n 'translate-x-0 transition duration-200 ease-in-out',\n // Invisible border so the switch is still visible in forced-colors mode\n 'border border-transparent',\n // Unchecked\n 'bg-white shadow-sm ring-1 ring-black/5',\n // Checked\n 'group-data-checked:bg-(--switch) group-data-checked:shadow-(--switch-shadow) group-data-checked:ring-(--switch-ring)',\n 'group-data-checked:translate-x-4 sm:group-data-checked:translate-x-3',\n // Disabled\n 'group-data-checked:group-data-disabled:bg-white group-data-checked:group-data-disabled:shadow-sm group-data-checked:group-data-disabled:ring-black/5',\n )}\n />\n </button>\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { createContext, use, useId, useRef, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\ntype TabsContextValue = {\n activeTab: string;\n setActiveTab: (id: string) => void;\n baseId: string;\n};\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabsContext() {\n const ctx = use(TabsContext);\n if (!ctx) throw new Error('Tabs subcomponents must be used inside <Tabs>');\n return ctx;\n}\n\nexport function Tabs({\n defaultTab,\n value,\n onChange,\n className,\n children,\n}: {\n defaultTab?: string;\n value?: string;\n onChange?: (tab: string) => void;\n className?: string;\n children: React.ReactNode;\n}) {\n const baseId = useId();\n const [internalTab, setInternalTab] = useState(defaultTab ?? '');\n\n const activeTab = value ?? internalTab;\n const setActiveTab = (id: string) => {\n setInternalTab(id);\n onChange?.(id);\n };\n\n return (\n <TabsContext value={{ activeTab, setActiveTab, baseId }}>\n <div className={className}>{children}</div>\n </TabsContext>\n );\n}\n\nexport function TabList({\n className,\n children,\n}: {\n className?: string;\n children: React.ReactNode;\n}) {\n const listRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!listRef.current) return;\n const tabs = Array.from(listRef.current.querySelectorAll<HTMLElement>('[role=\"tab\"]'));\n const current = tabs.indexOf(document.activeElement as HTMLElement);\n if (current === -1) return;\n\n let next: number | undefined;\n if (e.key === 'ArrowRight') next = (current + 1) % tabs.length;\n else if (e.key === 'ArrowLeft') next = (current - 1 + tabs.length) % tabs.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = tabs.length - 1;\n\n if (next !== undefined) {\n e.preventDefault();\n tabs[next]?.focus();\n tabs[next]?.click();\n }\n };\n\n return (\n <div\n ref={listRef}\n role=\"tablist\"\n onKeyDown={handleKeyDown}\n className={cn('flex border-b border-zinc-200 dark:border-zinc-700', className)}\n >\n {children}\n </div>\n );\n}\n\nexport function Tab({\n id,\n className,\n children,\n}: {\n id: string;\n className?: string;\n children: React.ReactNode;\n}) {\n const { activeTab, setActiveTab, baseId } = useTabsContext();\n const isActive = activeTab === id;\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${id}`}\n aria-controls={`${baseId}-panel-${id}`}\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n onClick={() => setActiveTab(id)}\n className={cn(\n className,\n 'relative -mb-px border-b-2 px-4 py-2.5 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500',\n isActive\n ? 'border-blue-600 text-blue-600 dark:border-blue-400 dark:text-blue-400'\n : 'border-transparent text-zinc-500 hover:text-zinc-700 dark:text-zinc-400 dark:hover:text-zinc-200',\n )}\n >\n {children}\n </button>\n );\n}\n\nexport function TabPanel({\n id,\n className,\n children,\n}: {\n id: string;\n className?: string;\n children: React.ReactNode;\n}) {\n const { activeTab, baseId } = useTabsContext();\n if (activeTab !== id) return null;\n\n return (\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel-${id}`}\n aria-labelledby={`${baseId}-tab-${id}`}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: role=\"tabpanel\" requires tabIndex=0 for keyboard nav per WAI-ARIA 1.2\n tabIndex={0}\n className={cn('focus-visible:outline-none', className)}\n >\n {children}\n </div>\n );\n}\n","import type React from 'react';\nimport { useDataInteractive } from '../hooks/use-data-interactive.js';\nimport { useFieldControlProps } from '../hooks/use-field-context.js';\nimport { cn } from '../utils/cn.js';\n\ntype TextareaProps = {\n className?: string;\n resizable?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n ref?: React.Ref<HTMLTextAreaElement>;\n} & Omit<React.ComponentPropsWithoutRef<'textarea'>, 'className'>;\n\nexport function Textarea({\n className,\n resizable = true,\n disabled,\n invalid,\n ref,\n ...props\n}: TextareaProps) {\n const interactiveProps = useDataInteractive({ disabled });\n const fieldProps = useFieldControlProps();\n\n return (\n <span\n data-slot=\"control\"\n className={cn([\n className,\n // Basic layout\n 'relative block w-full',\n // Background color + shadow applied to inset pseudo element, so shadow blends with border in light mode\n 'before:absolute before:inset-px before:rounded-[calc(var(--radius-lg)-1px)] before:bg-white before:shadow-sm',\n // Background color is moved to control and shadow is removed in dark mode so hide `before` pseudo\n 'dark:before:hidden',\n // Focus ring\n 'after:pointer-events-none after:absolute after:inset-0 after:rounded-lg after:ring-transparent after:ring-inset sm:focus-within:after:ring-2 sm:focus-within:after:ring-blue-500',\n // Disabled state\n 'has-data-disabled:opacity-50 has-data-disabled:before:bg-zinc-950/5 has-data-disabled:before:shadow-none',\n ])}\n >\n <textarea\n ref={ref}\n disabled={disabled}\n {...props}\n {...interactiveProps}\n {...fieldProps}\n data-invalid={invalid ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n className={cn([\n // Basic layout\n 'relative block h-full w-full appearance-none rounded-lg px-[calc(--spacing(3.5)-1px)] py-[calc(--spacing(2.5)-1px)] sm:px-[calc(--spacing(3)-1px)] sm:py-[calc(--spacing(1.5)-1px)]',\n // Typography\n 'text-base/6 text-zinc-950 placeholder:text-zinc-500 sm:text-sm/6 dark:text-white',\n // Border\n 'border border-zinc-950/10 data-hover:border-zinc-950/20 dark:border-white/10 dark:data-hover:border-white/20',\n // Background color\n 'bg-transparent dark:bg-white/5',\n // Hide default focus styles\n 'focus:outline-hidden',\n // Invalid state\n 'data-invalid:border-red-500 data-invalid:data-hover:border-red-500 dark:data-invalid:border-red-600 dark:data-invalid:data-hover:border-red-600',\n // Disabled state\n 'disabled:border-zinc-950/20 dark:disabled:border-white/15 dark:disabled:bg-white/2.5 dark:data-hover:disabled:border-white/15',\n // Resizable\n resizable ? 'resize-y' : 'resize-none',\n ])}\n />\n </span>\n );\n}\n","import type React from 'react';\nimport { cn } from '../utils/cn.js';\n\nexport function Timeline({\n className,\n children,\n}: {\n className?: string;\n children: React.ReactNode;\n}) {\n return <ol className={cn('relative', className)}>{children}</ol>;\n}\n\nexport function TimelineItem({\n icon,\n date,\n title,\n description,\n isLast = false,\n className,\n}: {\n icon?: React.ReactNode;\n date?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n isLast?: boolean;\n className?: string;\n}) {\n return (\n <li className={cn('relative flex gap-4', !isLast && 'pb-8', className)}>\n {/* Connector line */}\n {!isLast && (\n <div\n aria-hidden=\"true\"\n className=\"absolute left-4 top-8 -bottom-0 w-px bg-zinc-200 dark:bg-zinc-700\"\n />\n )}\n\n {/* Icon */}\n <div className=\"relative z-10 flex size-8 shrink-0 items-center justify-center rounded-full bg-white ring-1 ring-zinc-200 dark:bg-zinc-900 dark:ring-zinc-700\">\n {icon ?? <div className=\"size-2 rounded-full bg-zinc-400 dark:bg-zinc-500\" />}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 pt-0.5\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-x-4\">\n <p className=\"text-sm font-semibold text-zinc-950 dark:text-white\">{title}</p>\n {date && (\n <time className=\"shrink-0 text-xs text-zinc-400 dark:text-zinc-500\">{date}</time>\n )}\n </div>\n {description && (\n <p className=\"mt-1 text-sm text-zinc-600 dark:text-zinc-400\">{description}</p>\n )}\n </div>\n </li>\n );\n}\n","'use client';\n\nimport type React from 'react';\nimport { createContext, use, useCallback, useEffect, useReducer, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../utils/cn.js';\n\ntype ToastVariant = 'default' | 'success' | 'error' | 'warning' | 'info';\n\ntype Toast = {\n id: string;\n title: string;\n description?: string;\n variant?: ToastVariant;\n duration?: number;\n};\n\ntype ToastAction = { type: 'ADD'; toast: Toast } | { type: 'REMOVE'; id: string };\n\nfunction toastReducer(state: Toast[], action: ToastAction): Toast[] {\n switch (action.type) {\n case 'ADD':\n return [...state, action.toast];\n case 'REMOVE':\n return state.filter((t) => t.id !== action.id);\n }\n}\n\ntype ToastContextValue = {\n toasts: Toast[];\n addToast: (toast: Omit<Toast, 'id'>) => string;\n removeToast: (id: string) => void;\n};\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nexport function ToastProvider({ children }: { children: React.ReactNode }) {\n const [toasts, dispatch] = useReducer(toastReducer, []);\n\n const addToast = useCallback((toast: Omit<Toast, 'id'>) => {\n const id = crypto.randomUUID();\n dispatch({ type: 'ADD', toast: { ...toast, id } });\n return id;\n }, []);\n\n const removeToast = useCallback((id: string) => {\n dispatch({ type: 'REMOVE', id });\n }, []);\n\n return (\n <ToastContext value={{ toasts, addToast, removeToast }}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(<ToastList toasts={toasts} onRemove={removeToast} />, document.body)}\n </ToastContext>\n );\n}\n\nexport function useToast(): Pick<ToastContextValue, 'addToast' | 'removeToast'> {\n const ctx = use(ToastContext);\n if (!ctx) throw new Error('useToast must be used within a ToastProvider');\n return ctx;\n}\n\nconst variantClasses: Record<ToastVariant, string> = {\n default: 'bg-white dark:bg-zinc-800 ring-zinc-950/10 dark:ring-white/10',\n success: 'bg-white dark:bg-zinc-800 ring-green-500/30',\n error: 'bg-white dark:bg-zinc-800 ring-red-500/30',\n warning: 'bg-white dark:bg-zinc-800 ring-amber-500/30',\n info: 'bg-white dark:bg-zinc-800 ring-blue-500/30',\n};\n\nconst variantIconClasses: Record<ToastVariant, string> = {\n default: 'hidden',\n success: 'text-green-500',\n error: 'text-red-500',\n warning: 'text-amber-500',\n info: 'text-blue-500',\n};\n\nconst variantIcons: Record<ToastVariant, string> = {\n default: '',\n success: '✓',\n error: '✕',\n warning: '!',\n info: 'i',\n};\n\nfunction ToastList({ toasts, onRemove }: { toasts: Toast[]; onRemove: (id: string) => void }) {\n if (toasts.length === 0) return null;\n\n return (\n <div\n aria-live=\"assertive\"\n className=\"pointer-events-none fixed inset-0 z-50 flex flex-col items-end justify-end gap-2 p-4 sm:p-6\"\n >\n {toasts.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onRemove={onRemove} />\n ))}\n </div>\n );\n}\n\nconst EXIT_DURATION_MS = 150;\n\nfunction ToastItem({ toast, onRemove }: { toast: Toast; onRemove: (id: string) => void }) {\n const variant = toast.variant ?? 'default';\n const [isExiting, setIsExiting] = useState(false);\n\n const handleRemove = useCallback(() => {\n setIsExiting(true);\n setTimeout(() => onRemove(toast.id), EXIT_DURATION_MS);\n }, [onRemove, toast.id]);\n\n // Auto-dismiss triggers exit animation instead of instant removal\n useEffect(() => {\n const duration = toast.duration ?? 5000;\n if (duration <= 0) return;\n const timer = setTimeout(handleRemove, duration);\n return () => clearTimeout(timer);\n }, [toast.duration, handleRemove]);\n\n return (\n <div\n role=\"alert\"\n className={cn(\n 'pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-xl p-4 shadow-lg ring-1 transition-all duration-200',\n variantClasses[variant],\n isExiting\n ? 'translate-y-2 opacity-0'\n : 'translate-y-0 opacity-100 animate-[slide-in-from-bottom_200ms_ease-out]',\n )}\n >\n {variant !== 'default' && (\n <span className={cn('mt-0.5 text-sm font-bold', variantIconClasses[variant])}>\n {variantIcons[variant]}\n </span>\n )}\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold text-zinc-950 dark:text-white\">{toast.title}</p>\n {toast.description && (\n <p className=\"mt-1 text-sm text-zinc-500 dark:text-zinc-400\">{toast.description}</p>\n )}\n </div>\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={handleRemove}\n className=\"shrink-0 rounded-md text-zinc-400 hover:text-zinc-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-500 dark:text-zinc-500 dark:hover:text-zinc-300\"\n >\n <span aria-hidden=\"true\">✕</span>\n </button>\n </div>\n );\n}\n","'use client';\n\nimport { type ReactNode, useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { cn } from '../utils/cn.js';\n\ntype TooltipSide = 'top' | 'bottom' | 'left' | 'right';\n\nconst sideClasses: Record<TooltipSide, string> = {\n top: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n bottom: 'top-full left-1/2 -translate-x-1/2 mt-2',\n left: 'right-full top-1/2 -translate-y-1/2 mr-2',\n right: 'left-full top-1/2 -translate-y-1/2 ml-2',\n};\n\ntype TooltipProps = {\n content: ReactNode;\n side?: TooltipSide;\n className?: string;\n delay?: number;\n children: ReactNode;\n};\n\nexport function Tooltip({ content, side = 'top', className, delay = 200, children }: TooltipProps) {\n const id = useId();\n const [visible, setVisible] = useState(false);\n const timeoutRef = useRef<number | null>(null);\n\n const clear = useCallback(() => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n const show = useCallback(() => {\n clear();\n timeoutRef.current = window.setTimeout(() => {\n setVisible(true);\n }, delay);\n }, [delay, clear]);\n\n const hide = useCallback(() => {\n clear();\n setVisible(false);\n }, [clear]);\n\n useEffect(() => {\n return clear;\n }, [clear]);\n\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: Tooltip triggers need pointer and focus listeners while still allowing arbitrary inline children.\n <span\n className=\"relative inline-flex\"\n onPointerEnter={show}\n onPointerLeave={hide}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocus={show}\n onBlur={hide}\n aria-describedby={visible ? id : undefined}\n >\n {children}\n\n {visible && (\n <span\n id={id}\n role=\"tooltip\"\n className={cn(\n 'pointer-events-none absolute z-50 w-max max-w-xs rounded-lg bg-zinc-950 px-2.5 py-1.5 text-xs text-white shadow-lg dark:bg-zinc-700',\n sideClasses[side],\n className,\n )}\n >\n {content}\n </span>\n )}\n </span>\n );\n}\n","'use client';\n\nimport { useCallback, useEffect, useSyncExternalStore } from 'react';\n\nexport type Theme = 'light' | 'dark' | 'system';\nexport type ResolvedTheme = 'light' | 'dark';\n\nconst STORAGE_KEY = 'rvui-theme';\nconst DATA_ATTR = 'data-theme';\n\n/** Listeners for theme changes across components */\nconst listeners = new Set<() => void>();\n\nfunction notifyListeners(): void {\n for (const listener of listeners) {\n listener();\n }\n}\n\n/** Resolve 'system' to 'light' or 'dark' based on media query */\nfunction resolveSystemTheme(): ResolvedTheme {\n if (typeof window === 'undefined') return 'dark';\n return window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';\n}\n\n/** Read stored preference or default to 'system' */\nfunction getStoredTheme(): Theme {\n if (typeof window === 'undefined') return 'system';\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === 'light' || stored === 'dark' || stored === 'system') return stored;\n } catch {\n // localStorage may be unavailable (SSR, privacy mode)\n }\n return 'system';\n}\n\n/** Apply theme to the document element */\nfunction applyTheme(theme: Theme): void {\n if (typeof document === 'undefined') return;\n const resolved = theme === 'system' ? resolveSystemTheme() : theme;\n document.documentElement.setAttribute(DATA_ATTR, resolved);\n}\n\n/** Store and apply theme, notify all subscribers */\nfunction setTheme(theme: Theme): void {\n try {\n localStorage.setItem(STORAGE_KEY, theme);\n } catch {\n // Ignore storage errors\n }\n applyTheme(theme);\n notifyListeners();\n}\n\n/** Get the current snapshot for useSyncExternalStore */\nfunction getSnapshot(): Theme {\n return getStoredTheme();\n}\n\nfunction getServerSnapshot(): Theme {\n return 'system';\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/**\n * Hook to read and set the current theme.\n *\n * Persists preference to localStorage under `rvui-theme`.\n * Applies `data-theme` attribute to the document element.\n * Supports 'light', 'dark', and 'system' (auto-detect).\n *\n * @example\n * ```tsx\n * const { theme, resolvedTheme, setTheme } = useTheme();\n * <button onClick={() => setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')}>\n * Toggle theme\n * </button>\n * ```\n */\nexport function useTheme(): {\n /** Current theme preference ('light' | 'dark' | 'system') */\n theme: Theme;\n /** Resolved theme after applying system preference ('light' | 'dark') */\n resolvedTheme: ResolvedTheme;\n /** Set theme preference */\n setTheme: (theme: Theme) => void;\n} {\n const theme = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n const resolved = theme === 'system' ? resolveSystemTheme() : theme;\n\n // Apply theme on mount and listen for system preference changes\n useEffect(() => {\n applyTheme(theme);\n\n const mq = window.matchMedia('(prefers-color-scheme: light)');\n const handleChange = () => {\n if (getStoredTheme() === 'system') {\n applyTheme('system');\n notifyListeners();\n }\n };\n mq.addEventListener('change', handleChange);\n return () => mq.removeEventListener('change', handleChange);\n }, [theme]);\n\n const setThemeStable = useCallback((t: Theme) => setTheme(t), []);\n\n return { theme, resolvedTheme: resolved, setTheme: setThemeStable };\n}\n"],"mappings":"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"}