@ship-it-ui/ui 0.0.3 → 0.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/cn.ts","../src/hooks/useControllableState.ts","../src/hooks/useDisclosure.ts","../src/hooks/useEscape.ts","../src/hooks/useIsomorphicLayoutEffect.ts","../src/hooks/useKeyboardList.ts","../src/hooks/useOutsideClick.ts","../src/hooks/useTheme.ts","../src/components/Button/Button.tsx","../src/components/Button/IconButton.tsx","../src/components/Button/ButtonGroup.tsx","../src/components/Button/SplitButton.tsx","../src/components/Button/FAB.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Field/Field.tsx","../src/components/Input/Input.tsx","../src/components/Input/SearchInput.tsx","../src/components/OTP/OTP.tsx","../src/components/Radio/Radio.tsx","../src/components/Select/Select.tsx","../src/components/Slider/Slider.tsx","../src/components/Switch/Switch.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Avatar/Avatar.tsx","../src/components/StatusDot/StatusDot.tsx","../src/components/Avatar/sizes.ts","../src/components/Avatar/AvatarGroup.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/Card/StatCard.tsx","../src/components/Chip/Chip.tsx","../src/components/Kbd/Kbd.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Tag/Tag.tsx","../src/components/ContextMenu/ContextMenu.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/Drawer.tsx","../src/components/Dialog/Sheet.tsx","../src/components/Dialog/AlertDialog.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/HoverCard/HoverCard.tsx","../src/components/Popover/Popover.tsx","../src/components/Toast/Toast.tsx","../src/components/Tooltip/Tooltip.tsx","../src/patterns/Alert/Alert.tsx","../src/patterns/Banner/Banner.tsx","../src/patterns/Breadcrumbs/Breadcrumbs.tsx","../src/patterns/Combobox/Combobox.tsx","../src/patterns/CommandPalette/CommandPalette.tsx","../src/patterns/DataTable/DataTable.tsx","../src/patterns/DatePicker/Calendar.tsx","../src/patterns/DatePicker/DatePicker.tsx","../src/patterns/Dots/Dots.tsx","../src/patterns/Dropzone/Dropzone.tsx","../src/patterns/EmptyState/EmptyState.tsx","../src/patterns/FileChip/FileChip.tsx","../src/patterns/Menubar/Menubar.tsx","../src/patterns/NavBar/NavBar.tsx","../src/patterns/Sidebar/Sidebar.tsx","../src/patterns/Pagination/Pagination.tsx","../src/patterns/Progress/Progress.tsx","../src/patterns/RadialProgress/RadialProgress.tsx","../src/patterns/Sparkline/Sparkline.tsx","../src/patterns/Spinner/Spinner.tsx","../src/patterns/Stepper/Stepper.tsx","../src/patterns/Tabs/Tabs.tsx","../src/patterns/Timeline/Timeline.tsx","../src/patterns/Topbar/Topbar.tsx","../src/patterns/Tree/Tree.tsx"],"sourcesContent":["/**\n * Public API for @ship-it-ui/ui.\n *\n * Add new components here as they're built. Keep exports alphabetical within each\n * category so the barrel stays scannable.\n */\n\n// Utilities\nexport { cn } from './utils/cn';\nexport type { ClassValue } from './utils/cn';\n\n// Hooks\nexport * from './hooks';\n\n// Components — inputs\nexport * from './components/Button';\nexport * from './components/Checkbox';\nexport * from './components/Field';\nexport * from './components/Input';\nexport * from './components/OTP';\nexport * from './components/Radio';\nexport * from './components/Select';\nexport * from './components/Slider';\nexport * from './components/Switch';\nexport * from './components/Textarea';\n\n// Components — display\nexport * from './components/Avatar';\nexport * from './components/Badge';\nexport * from './components/Card';\nexport * from './components/Chip';\nexport * from './components/Kbd';\nexport * from './components/Skeleton';\nexport * from './components/StatusDot';\nexport * from './components/Tag';\n\n// Components — overlays\nexport * from './components/ContextMenu';\nexport * from './components/Dialog';\nexport * from './components/DropdownMenu';\nexport * from './components/HoverCard';\nexport * from './components/Popover';\nexport * from './components/Toast';\nexport * from './components/Tooltip';\n\n// Components — patterns\nexport * from './patterns/Alert';\nexport * from './patterns/Banner';\nexport * from './patterns/Breadcrumbs';\nexport * from './patterns/Combobox';\nexport * from './patterns/CommandPalette';\nexport * from './patterns/DataTable';\nexport * from './patterns/DatePicker';\nexport * from './patterns/Dots';\nexport * from './patterns/Dropzone';\nexport * from './patterns/EmptyState';\nexport * from './patterns/FileChip';\nexport * from './patterns/Menubar';\nexport * from './patterns/NavBar';\nexport * from './patterns/Pagination';\nexport * from './patterns/Progress';\nexport * from './patterns/RadialProgress';\nexport * from './patterns/Sidebar';\nexport * from './patterns/Sparkline';\nexport * from './patterns/Spinner';\nexport * from './patterns/Stepper';\nexport * from './patterns/Tabs';\nexport * from './patterns/Timeline';\nexport * from './patterns/Topbar';\nexport * from './patterns/Tree';\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport type { ClassValue } from 'clsx';\n\n/**\n * Combine class names with conflict-aware Tailwind merging.\n *\n * cn('px-2 py-1', condition && 'px-4') → 'py-1 px-4'\n *\n * Use anywhere you'd otherwise concatenate strings of Tailwind classes.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { useCallback, useRef, useState } from 'react';\n\n/**\n * Standard controlled/uncontrolled state hook. Mirrors Radix's\n * `useControllableState` — when `value` is provided, the hook stays in sync\n * with it; otherwise it manages an internal state seeded by `defaultValue`.\n *\n * Use this for any composite that needs to support both modes (Tabs,\n * Combobox, Tree, DatePicker, Switch, etc.).\n */\n\nexport interface UseControllableStateProps<T> {\n /** Controlled value. When provided, the hook is in controlled mode. */\n value?: T;\n /** Default for uncontrolled mode. Used only when `value` is undefined. */\n defaultValue?: T;\n /** Change callback fired in both modes whenever the value would change. */\n onChange?: (value: T) => void;\n}\n\n// Overload: a required `defaultValue` (or a controlled `value`) means the\n// returned tuple is always non-undefined `T`. This is the common case for\n// composites like DataTable / Tree that pass an `EMPTY_SET` fallback.\nexport function useControllableState<T>(opts: {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}): readonly [T, (next: T | ((prev: T) => T)) => void];\n\n// Overload: no default → the value may be `undefined` until the consumer sets it.\nexport function useControllableState<T>(opts: {\n value?: T;\n defaultValue?: T;\n onChange?: (next: T) => void;\n}): readonly [T | undefined, (next: T | ((prev: T | undefined) => T)) => void];\n\n// Implementation\nexport function useControllableState<T>({\n value: controlledValue,\n defaultValue,\n onChange,\n}: UseControllableStateProps<T>): readonly [\n T | undefined,\n (next: T | ((prev: T | undefined) => T)) => void,\n] {\n const [uncontrolledValue, setUncontrolledValue] = useState<T | undefined>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const setValue = useCallback(\n (next: T | ((prev: T | undefined) => T)) => {\n const resolved =\n typeof next === 'function' ? (next as (prev: T | undefined) => T)(valueRef.current) : next;\n if (!isControlled) {\n setUncontrolledValue(resolved);\n }\n if (resolved !== valueRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [value, setValue] as const;\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\n/**\n * Standardized open/close state for overlays.\n * Returns the same shape Radix and shadcn-style libraries use, so passing it as\n * `{...disclosure}` props works with any overlay primitive.\n */\nexport function useDisclosure(initial = false): {\n open: boolean;\n onOpen: () => void;\n onClose: () => void;\n onToggle: () => void;\n setOpen: (open: boolean) => void;\n} {\n const [open, setOpen] = useState(initial);\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n const onToggle = useCallback(() => setOpen((o) => !o), []);\n return { open, onOpen, onClose, onToggle, setOpen };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Calls `handler` when Escape is pressed while `enabled` is true.\n * Most overlay components (Dialog, Popover, Drawer) get this for free via Radix,\n * but custom popovers and inline editors need it.\n *\n * Implementation note: the handler is stored in a ref so an inline\n * `() => doThing()` passed by the consumer doesn't detach/reattach the\n * `keydown` listener every render.\n */\nexport function useEscape(handler: () => void, enabled = true) {\n const handlerRef = useRef(handler);\n useEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n useEffect(() => {\n if (!enabled) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handlerRef.current();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [enabled]);\n}\n","'use client';\n\nimport { useEffect, useLayoutEffect } from 'react';\n\n/**\n * `useLayoutEffect` on the client, `useEffect` on the server.\n *\n * React warns when `useLayoutEffect` runs on the server because there's no\n * DOM to measure. This shim swaps in `useEffect` during SSR and restores\n * `useLayoutEffect` once the bundle is evaluated client-side.\n *\n * Use when you need to measure or synchronously mutate the DOM before\n * paint. Plain `useEffect` is preferred otherwise.\n */\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","'use client';\n\nimport { useCallback, useState, type KeyboardEvent } from 'react';\n\n/**\n * Keyboard navigation for arrow-key selectable lists (Combobox, CommandPalette,\n * filtered dropdown bodies). Tracks the highlighted cursor and exposes a\n * `getKeyDownHandler` you can spread on the input/list element.\n *\n * Supports ↑/↓, Home/End, optional Enter, and a `loop` option that wraps from\n * end → start. The `count` arg drives bounds; pass `0` and the hook becomes a\n * no-op until you hydrate it.\n */\n\nexport interface UseKeyboardListOptions {\n /** Total number of items currently in the list. */\n count: number;\n /** Wrap around at the ends. Default true. */\n loop?: boolean;\n /** Initial cursor. Default 0. */\n defaultCursor?: number;\n /** Called with the current cursor index when Enter is pressed. */\n onSelect?: (index: number) => void;\n}\n\nexport interface UseKeyboardListResult {\n cursor: number;\n setCursor: (index: number) => void;\n /** Handler for `onKeyDown` — does NOT call `preventDefault` for unhandled keys. */\n onKeyDown: (event: KeyboardEvent) => void;\n}\n\nexport function useKeyboardList({\n count,\n loop = true,\n defaultCursor = 0,\n onSelect,\n}: UseKeyboardListOptions): UseKeyboardListResult {\n const [cursor, setCursor] = useState(defaultCursor);\n\n const move = useCallback(\n (delta: number) => {\n if (count <= 0) return;\n setCursor((c) => {\n const next = c + delta;\n if (loop) return ((next % count) + count) % count;\n return Math.max(0, Math.min(count - 1, next));\n });\n },\n [count, loop],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (count <= 0) return;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n move(-1);\n break;\n case 'Home':\n event.preventDefault();\n setCursor(0);\n break;\n case 'End':\n event.preventDefault();\n setCursor(count - 1);\n break;\n case 'Enter':\n if (onSelect) {\n event.preventDefault();\n onSelect(cursor);\n }\n break;\n default:\n break;\n }\n },\n [count, cursor, move, onSelect],\n );\n\n const safeCursor = count > 0 ? Math.min(cursor, count - 1) : 0;\n\n return { cursor: safeCursor, setCursor, onKeyDown };\n}\n","'use client';\n\nimport { useEffect, type RefObject } from 'react';\n\n/**\n * Calls `handler` when a pointerdown occurs outside the element referenced by `ref`.\n *\n * Pass `enabled=false` to detach (typically while the popover is closed). Listens on\n * `pointerdown` rather than `click` so the trigger sees the close before its own click\n * fires — matches the behavior of most popover libraries. `pointerdown` is the unified\n * mouse + touch + pen event, so this also works on touch devices (where `mousedown`\n * is not synthesized for taps until after the click).\n */\nexport function useOutsideClick<T extends HTMLElement>(\n ref: RefObject<T | null>,\n handler: () => void,\n enabled = true,\n) {\n useEffect(() => {\n if (!enabled) return;\n const onDown = (e: PointerEvent) => {\n const el = ref.current;\n if (el && e.target instanceof Node && !el.contains(e.target)) handler();\n };\n document.addEventListener('pointerdown', onDown);\n return () => document.removeEventListener('pointerdown', onDown);\n }, [ref, handler, enabled]);\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nexport type Theme = 'dark' | 'light';\n\n/**\n * Read and toggle the active theme (`[data-theme]` on `<html>`).\n *\n * `dark` is the default — when the attribute is absent, dark theme applies.\n * `light` is the opt-in: setting it adds `data-theme=\"light\"` to the document root.\n *\n * Usage:\n * const { theme, setTheme, toggle } = useTheme();\n * <Switch on={theme === 'light'} onChange={toggle} />\n */\nexport function useTheme(): {\n theme: Theme;\n setTheme: (next: Theme) => void;\n toggle: () => void;\n} {\n // Initialize to 'dark' on both server and client to avoid SSR hydration mismatch.\n // The real DOM value is read post-mount in the effect below.\n const [theme, setThemeState] = useState<Theme>('dark');\n\n const setTheme = useCallback((next: Theme) => {\n if (typeof document === 'undefined') {\n setThemeState(next);\n return;\n }\n if (next === 'light') {\n document.documentElement.setAttribute('data-theme', 'light');\n } else {\n document.documentElement.removeAttribute('data-theme');\n }\n setThemeState(next);\n }, []);\n\n const toggle = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n // Sync state with the actual DOM attribute on mount, then keep it in sync if\n // something else flips the attribute (e.g., a test, a parent app).\n useEffect(() => {\n const initial = document.documentElement.getAttribute('data-theme');\n setThemeState(initial === 'light' ? 'light' : 'dark');\n const observer = new MutationObserver(() => {\n const attr = document.documentElement.getAttribute('data-theme');\n setThemeState(attr === 'light' ? 'light' : 'dark');\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n return () => observer.disconnect();\n }, []);\n\n return { theme, setTheme, toggle };\n}\n","'use client';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode, type Ref } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Seven variants × three sizes × five states. One primary per surface — everything\n * else defers. Variants and sizes match `design-handoff/project/components/Button.jsx`.\n */\nconst buttonStyles = cva(\n [\n 'inline-flex items-center justify-center whitespace-nowrap',\n 'font-medium transition-[background,filter,box-shadow,color] duration-(--duration-micro)',\n 'outline-none',\n 'focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n ],\n {\n variants: {\n variant: {\n primary:\n 'bg-accent text-on-accent border border-accent hover:brightness-110 active:brightness-95',\n secondary:\n 'bg-panel-2 text-text border border-border hover:bg-[color-mix(in_oklab,var(--color-panel-2),white_4%)]',\n ghost: 'bg-transparent text-text border border-transparent hover:bg-panel-2',\n outline: 'bg-transparent text-text border border-border-strong hover:bg-panel-2',\n destructive:\n 'bg-err text-on-accent border border-err hover:brightness-110 active:brightness-95',\n success: 'bg-ok text-on-accent border border-ok hover:brightness-110 active:brightness-95',\n link: 'bg-transparent text-accent border border-transparent underline underline-offset-[3px] hover:brightness-110',\n },\n size: {\n sm: 'h-[26px] px-[10px] text-[11px] gap-[5px] rounded-[5px]',\n md: 'h-[32px] px-3 text-[12px] gap-[6px] rounded-md',\n lg: 'h-[38px] px-4 text-[13px] gap-[7px] rounded-[7px]',\n },\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n fullWidth: false,\n },\n },\n);\n\n/** Spinner glyph used for the loading state. Inherits color from the button text. */\nfunction Spinner({ size }: { size: number }) {\n return (\n <span\n aria-hidden\n className=\"inline-block animate-[ship-spin_0.7s_linear_infinite] rounded-full border-[1.5px] border-current border-t-transparent\"\n style={{ width: size, height: size }}\n />\n );\n}\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonStyles> {\n /** Icon shown to the left of the label (or replacing the spinner when `loading`). */\n icon?: ReactNode;\n /** Icon/text shown to the right of the label. Often a chevron, kbd hint, or arrow. */\n trailing?: ReactNode;\n /** When true, hides the icon, swaps in a spinner, and disables the button. */\n loading?: boolean;\n /**\n * Render the inner content as a child element instead of a `<button>`. Useful for\n * link wrappers — `<Button asChild><Link href=\"/\" /></Button>`.\n */\n asChild?: boolean;\n}\n\n/** Pixel size of the icon/spinner inside each button size. */\nconst iconSize = { sm: 11, md: 12, lg: 13 } as const;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant,\n size,\n fullWidth,\n icon,\n trailing,\n loading = false,\n disabled,\n asChild = false,\n type,\n className,\n children,\n ...props\n },\n ref,\n) {\n const isDisabled = disabled || loading;\n const iconPx = iconSize[size ?? 'md'];\n const composedClassName = cn(buttonStyles({ variant, size, fullWidth }), className);\n\n // asChild defers all rendering to the consumer's element. We just decorate it\n // with Button styles — Slot requires exactly one child, so icon/trailing/loading\n // slots are intentionally not supported on asChild buttons.\n if (asChild) {\n return (\n <Slot\n // Radix Slot widens the rendered element to whatever the consumer passes\n // as the single child, but our public ref type is HTMLButtonElement (the\n // common case). Cast to HTMLElement for the asChild branch — consumers\n // rendering a non-button child accept the variance.\n ref={ref as Ref<HTMLElement>}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled ? '' : undefined}\n className={composedClassName}\n {...props}\n >\n {children}\n </Slot>\n );\n }\n\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n className={composedClassName}\n {...props}\n >\n {loading ? (\n <Spinner size={iconPx} />\n ) : icon ? (\n <span className=\"inline-flex\">{icon}</span>\n ) : null}\n {children}\n {trailing && <span className=\"inline-flex opacity-60\">{trailing}</span>}\n </button>\n );\n});\n\nButton.displayName = 'Button';\n\nexport { buttonStyles };\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst iconButtonStyles = cva(\n [\n 'inline-grid place-items-center transition-[background,filter,color] duration-(--duration-micro)',\n 'outline-none focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n ],\n {\n variants: {\n // Mirrors `Button`'s variant set, minus `link` — an underlined link\n // affordance is awkward for an icon-only target, so we omit it\n // intentionally. Use `<Button variant=\"link\" icon={…} />` if you need it.\n variant: {\n primary: 'bg-accent text-on-accent border border-accent hover:brightness-110',\n secondary:\n 'bg-panel-2 text-text-muted border border-border hover:bg-[color-mix(in_oklab,var(--color-panel-2),white_4%)]',\n ghost:\n 'bg-transparent text-text-muted border border-transparent hover:bg-panel-2 hover:text-text',\n outline:\n 'bg-transparent text-text-muted border border-border-strong hover:bg-panel-2 hover:text-text',\n destructive:\n 'bg-err text-on-accent border border-err hover:brightness-110 active:brightness-95',\n success: 'bg-ok text-on-accent border border-ok hover:brightness-110 active:brightness-95',\n },\n size: {\n sm: 'h-[26px] w-[26px] text-[12px] rounded-[5px]',\n md: 'h-[32px] w-[32px] text-[13px] rounded-md',\n lg: 'h-[38px] w-[38px] text-[15px] rounded-[7px]',\n },\n },\n defaultVariants: { variant: 'secondary', size: 'md' },\n },\n);\n\nexport interface IconButtonProps\n extends\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'>,\n VariantProps<typeof iconButtonStyles> {\n /** The glyph or icon node to render. Pure decoration — set `aria-label` for screen readers. */\n icon: ReactNode;\n /**\n * Required: an accessible label since icon buttons have no visible text.\n * Mapped to `aria-label`.\n */\n 'aria-label': string;\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { variant, size, icon, type, className, ...props },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={cn(iconButtonStyles({ variant, size }), className)}\n {...props}\n >\n {icon}\n </button>\n );\n});\n\nIconButton.displayName = 'IconButton';\n\nexport { iconButtonStyles };\n","'use client';\n\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactElement,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * `orientation=\"horizontal\"` (default) joins children edge-to-edge with shared\n * borders; `vertical` does the same column-wise.\n */\n orientation?: 'horizontal' | 'vertical';\n}\n\n/**\n * Joins a row of `<Button>`s into a segmented control. The group owns the rounded\n * corners and outer border; child buttons render flush.\n *\n * Pass children as `<Button variant=\"secondary\">…</Button>` — the group strips\n * each child's individual radius and adds the connecting borders.\n */\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(function ButtonGroup(\n { orientation = 'horizontal', className, children, ...props },\n ref,\n) {\n const items = Children.toArray(children).filter(isValidElement) as ReactElement<{\n className?: string;\n }>[];\n\n return (\n <div\n ref={ref}\n role=\"group\"\n className={cn(\n 'border-border inline-flex overflow-hidden rounded-md border',\n orientation === 'vertical' ? 'flex-col' : 'flex-row',\n className,\n )}\n {...props}\n >\n {items.map((child, i) => {\n const isFirst = i === 0;\n const childProps = (child.props ?? {}) as { className?: string };\n return cloneElement(child, {\n key: i,\n className: cn(\n childProps.className,\n 'rounded-none border-none',\n !isFirst &&\n (orientation === 'horizontal'\n ? 'border-l border-l-border'\n : 'border-t border-t-border'),\n ),\n });\n })}\n </div>\n );\n});\n\nButtonGroup.displayName = 'ButtonGroup';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { Button, type ButtonProps } from './Button';\n\n/**\n * Variant set supported by `SplitButton`. Mirrors `Button`'s set minus `link` —\n * a split-button \"menu\" affordance attached to a link variant doesn't compose\n * visually. Use a regular `<Button variant=\"link\" />` instead.\n */\nexport type SplitButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'success';\n\nexport interface SplitButtonProps extends HTMLAttributes<HTMLDivElement> {\n /** Visual variant applied to BOTH segments. Defaults to `primary`. */\n variant?: SplitButtonVariant;\n /** Size applied to both segments. Defaults to `md`. */\n size?: ButtonProps['size'];\n /** Click handler for the main action button. */\n onClick?: () => void;\n /** Click handler for the trailing menu (caret) button. */\n onMenu?: () => void;\n /** Disable both segments. */\n disabled?: boolean;\n /**\n * Accessible label for the trailing menu button. Defaults to\n * `\"More actions\"`. Override when the menu's purpose is more specific\n * (e.g. `\"Deploy options\"`) so screen-reader users hear the right intent.\n */\n menuAriaLabel?: string;\n children: ReactNode;\n}\n\n/**\n * Two-segment button: a primary action on the left, a menu chevron on the right.\n * Common pattern for \"Deploy ▾\" or \"Save and …\" controls.\n */\nexport const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(function SplitButton(\n {\n variant = 'primary',\n size = 'md',\n onClick,\n onMenu,\n disabled,\n menuAriaLabel = 'More actions',\n className,\n children,\n ...props\n },\n ref,\n) {\n // Token-aware divider between the two segments. For variants whose\n // background is a colored surface with `text-on-accent` foreground\n // (primary/destructive/success), a 20%-opacity dark line is visible.\n // For neutral surfaces (secondary/outline/ghost), use the strong border\n // token so the divider tracks light/dark theme.\n const dividerBorder =\n variant === 'primary' || variant === 'destructive' || variant === 'success'\n ? 'border-r-on-accent/20'\n : 'border-r-border-strong';\n return (\n <div ref={ref} className={cn('inline-flex', className)} {...props}>\n <Button\n variant={variant}\n size={size}\n onClick={onClick}\n disabled={disabled}\n className={cn('rounded-r-none border-r', dividerBorder)}\n >\n {children}\n </Button>\n <Button\n variant={variant}\n size={size}\n onClick={onMenu}\n disabled={disabled}\n aria-label={menuAriaLabel}\n className=\"rounded-l-none px-2\"\n >\n ▾\n </Button>\n </div>\n );\n});\n\nSplitButton.displayName = 'SplitButton';\n","'use client';\n\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface FABProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n /** Icon or glyph rendered inside the FAB. Defaults to `✦`. */\n icon?: ReactNode;\n /** Required: accessible label. Maps to `aria-label`. */\n 'aria-label': string;\n}\n\n/**\n * Floating action button — round, accent-bg, accent-glow shadow. Use for the\n * single most-prominent action on a surface (e.g., \"Ask anything\" trigger).\n */\nexport const FAB = forwardRef<HTMLButtonElement, FABProps>(function FAB(\n { icon = '✦', type, className, style, ...props },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={cn(\n 'grid h-12 w-12 place-items-center rounded-full',\n 'bg-accent text-on-accent text-lg font-semibold',\n 'shadow-[0_10px_30px_var(--color-accent-glow),0_2px_6px_rgba(0,0,0,0.4)]',\n 'transition-[transform,box-shadow] duration-200',\n 'hover:-translate-y-px hover:shadow-[0_14px_36px_var(--color-accent-glow),0_4px_10px_rgba(0,0,0,0.45)]',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n className,\n )}\n style={style}\n {...props}\n >\n {icon}\n </button>\n );\n});\n\nFAB.displayName = 'FAB';\n","'use client';\n\nimport * as RadixCheckbox from '@radix-ui/react-checkbox';\nimport { forwardRef, useId, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface CheckboxProps extends Omit<RadixCheckbox.CheckboxProps, 'asChild' | 'children'> {\n /** Optional inline label rendered to the right of the box. */\n label?: ReactNode;\n}\n\n/**\n * Tri-state checkbox. Set `checked=\"indeterminate\"` for the dash-mark state used\n * in select-all rows.\n */\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(function Checkbox(\n { label, className, id: idProp, ...props },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `cb-${reactId}`;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-2 select-none',\n props.disabled && 'cursor-not-allowed opacity-40',\n className,\n )}\n >\n <RadixCheckbox.Root\n ref={ref}\n id={id}\n className={cn(\n 'grid h-4 w-4 place-items-center rounded-xs',\n 'bg-panel border-border-strong border',\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n 'data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent',\n 'transition-[background,border-color] duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n )}\n {...props}\n >\n <RadixCheckbox.Indicator className=\"text-on-accent text-[11px] leading-none\">\n {props.checked === 'indeterminate' ? '−' : '✓'}\n </RadixCheckbox.Indicator>\n </RadixCheckbox.Root>\n {label && (\n <label htmlFor={id} className=\"cursor-pointer text-[13px]\">\n {label}\n </label>\n )}\n </span>\n );\n});\n\nCheckbox.displayName = 'Checkbox';\n","'use client';\n\nimport { useId, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface FieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Visible label rendered above the control. */\n label?: ReactNode;\n /** Helper text shown below the control when no error is present. */\n hint?: ReactNode;\n /** Error message shown below the control. Displaces `hint` when set. */\n error?: ReactNode;\n /** Marks the field with a visual asterisk (does not enforce validity). */\n required?: boolean;\n /**\n * The control. Receives `id`, `aria-describedby`, and `aria-invalid` automatically.\n * Pass via render prop so the field can wire IDs without consumers thinking about it.\n */\n children: (props: {\n id: string;\n 'aria-describedby': string | undefined;\n 'aria-invalid': boolean | undefined;\n }) => ReactNode;\n}\n\n/**\n * Form-field wrapper: label + control + hint/error. Wires up the IDs so screen\n * readers connect the label and helper text to the input.\n *\n * <Field label=\"Email\" hint=\"We never share it\">\n * {(p) => <Input type=\"email\" placeholder=\"me@org.com\" {...p} />}\n * </Field>\n */\nexport function Field({ label, hint, error, required, className, children, ...props }: FieldProps) {\n const reactId = useId();\n const id = `field-${reactId}`;\n const hintId = hint && !error ? `${id}-hint` : undefined;\n const errorId = error ? `${id}-error` : undefined;\n const describedBy = errorId ?? hintId;\n\n return (\n <div className={cn('flex flex-col gap-[6px]', className)} {...props}>\n {label && (\n <label htmlFor={id} className=\"text-text-muted text-[11px] font-medium\">\n {label}\n {required && <span className=\"text-err ml-1\">*</span>}\n </label>\n )}\n {children({\n id,\n 'aria-describedby': describedBy,\n 'aria-invalid': error ? true : undefined,\n })}\n {hint && !error && (\n <div id={hintId} className=\"text-text-dim text-[11px]\">\n {hint}\n </div>\n )}\n {error && (\n <div id={errorId} className=\"text-err text-[11px]\">\n {error}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst inputWrapperStyles = cva(\n [\n 'flex items-center gap-[6px] font-sans transition-[border-color,box-shadow] duration-(--duration-micro)',\n 'border focus-within:ring-[3px]',\n 'has-[:disabled]:opacity-50 has-[:disabled]:bg-panel-2',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 px-2 text-[12px] rounded-md',\n md: 'h-[34px] px-[10px] text-[13px] rounded-md',\n lg: 'h-10 px-3 text-[14px] rounded-md',\n },\n tone: {\n default: 'bg-panel border-border focus-within:border-accent focus-within:ring-accent-dim',\n err: 'bg-panel border-err focus-within:border-err focus-within:ring-err/30',\n },\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nexport interface InputProps\n extends\n Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>,\n VariantProps<typeof inputWrapperStyles> {\n /** Element rendered to the left of the input (an `IconGlyph`, `@`, etc.). */\n icon?: ReactNode;\n /** Element rendered to the right (a unit suffix, kbd hint, clear button). */\n trailing?: ReactNode;\n /** When true, swaps the wrapper border to error tone (independent of `aria-invalid`). */\n error?: boolean;\n /** Pixel width override; otherwise the wrapper grows to fill its container. */\n width?: number | string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { size, tone, icon, trailing, error, width, className, style, disabled, ...props },\n ref,\n) {\n const computedTone = error ? 'err' : tone;\n return (\n <div\n className={cn(inputWrapperStyles({ size, tone: computedTone }), className)}\n style={{ width, ...style }}\n >\n {icon && <span className=\"text-text-dim leading-none\">{icon}</span>}\n <input\n ref={ref}\n disabled={disabled}\n aria-invalid={error || undefined}\n className={cn(\n 'text-text min-w-0 flex-1 border-none bg-transparent font-sans outline-none',\n 'placeholder:text-text-dim',\n 'disabled:cursor-not-allowed',\n )}\n {...props}\n />\n {trailing && <span className=\"text-text-dim text-[11px]\">{trailing}</span>}\n </div>\n );\n});\n\nInput.displayName = 'Input';\n","'use client';\n\nimport { forwardRef, type InputHTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface SearchInputProps extends InputHTMLAttributes<HTMLInputElement> {\n /** Optional keyboard shortcut hint (e.g., `⌘K`) shown on the right edge. */\n shortcut?: string;\n /** Pixel width or any CSS length. Defaults to `360px`. */\n width?: number | string;\n}\n\n/**\n * The hero search field — taller than a regular Input, with a leading magnifying-glass\n * glyph and an optional trailing keyboard-shortcut chip. Used for command bars,\n * topbar search, and entity search.\n */\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(function SearchInput(\n {\n shortcut = '⌘K',\n width = 360,\n className,\n style,\n placeholder = 'Search…',\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n) {\n return (\n <div\n className={cn(\n 'rounded-base flex h-9 items-center gap-2 px-3 font-sans',\n 'bg-panel-2 border-border border',\n 'focus-within:border-accent focus-within:ring-accent-dim focus-within:ring-[3px]',\n 'transition-[border-color,box-shadow] duration-(--duration-micro)',\n className,\n )}\n style={{ width, ...style }}\n >\n <span className=\"text-text-dim leading-none\" aria-hidden>\n ⌕\n </span>\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n // Default the accessible name to the placeholder. WCAG 4.1.2 / 3.3.2\n // require a programmatic name; placeholder alone does not satisfy\n // either criterion. Consumers can still override by passing aria-label.\n aria-label={ariaLabel ?? (typeof placeholder === 'string' ? placeholder : 'Search')}\n className=\"text-text placeholder:text-text-dim min-w-0 flex-1 border-none bg-transparent text-[13px] outline-none\"\n {...props}\n />\n {shortcut && (\n <kbd className=\"text-text-dim border-border rounded-xs border px-[6px] py-[2px] font-mono text-[10px]\">\n {shortcut}\n </kbd>\n )}\n </div>\n );\n});\n\nSearchInput.displayName = 'SearchInput';\n","'use client';\n\nimport {\n forwardRef,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type KeyboardEvent,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface OTPProps {\n /** Number of digit slots. Defaults to 6. */\n length?: number;\n /** Called with the assembled string when every slot has a value. */\n onComplete?: (code: string) => void;\n /** Called with the partial string on every change. */\n onChange?: (value: string) => void;\n /** Initial value (string of digits). */\n defaultValue?: string;\n /** Aria label applied to each individual slot, suffixed with \" {n} of {N}\". */\n ariaLabel?: string;\n className?: string;\n disabled?: boolean;\n}\n\nexport type OTPHandle = {\n focus: () => void;\n reset: () => void;\n};\n\n/**\n * Six-slot one-time-password input with auto-advance, backspace navigation, and\n * paste-to-fill. Each slot is a single-character `<input>` for screen-reader clarity.\n */\nexport const OTP = forwardRef<OTPHandle, OTPProps>(function OTP(\n { length = 6, onComplete, onChange, defaultValue = '', ariaLabel = 'Code', className, disabled },\n ref,\n) {\n const baseId = useId();\n const refs = useRef<(HTMLInputElement | null)[]>([]);\n const [values, setValues] = useState<string[]>(() =>\n Array.from({ length }, (_, i) => defaultValue[i] ?? ''),\n );\n const [completedAnnouncement, setCompletedAnnouncement] = useState('');\n\n useImperativeHandle(ref, () => ({\n focus: () => refs.current[0]?.focus(),\n reset: () => {\n setValues(Array(length).fill(''));\n setCompletedAnnouncement('');\n refs.current[0]?.focus();\n },\n }));\n\n const writeAt = (i: number, char: string) => {\n if (!/^\\d?$/.test(char)) return;\n // Compute next outside the updater so callbacks fire exactly once even\n // when React Strict Mode invokes the updater twice in dev.\n const next = [...values];\n next[i] = char;\n setValues(next);\n const joined = next.join('');\n onChange?.(joined);\n const isComplete = joined.length === length && next.every((c) => c);\n if (isComplete) {\n onComplete?.(joined);\n setCompletedAnnouncement('Code complete');\n } else {\n // Reset the announcement when the user is editing the value back to incomplete.\n setCompletedAnnouncement('');\n }\n if (char && i < length - 1) refs.current[i + 1]?.focus();\n };\n\n const onKey = (i: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !values[i] && i > 0) {\n refs.current[i - 1]?.focus();\n } else if (e.key === 'ArrowLeft' && i > 0) {\n refs.current[i - 1]?.focus();\n } else if (e.key === 'ArrowRight' && i < length - 1) {\n refs.current[i + 1]?.focus();\n }\n };\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length);\n if (!pasted) return;\n e.preventDefault();\n const next = Array.from({ length }, (_, i) => pasted[i] ?? '');\n setValues(next);\n const joined = next.join('');\n onChange?.(joined);\n const isComplete = joined.length === length && next.every((c) => c);\n if (isComplete) {\n onComplete?.(joined);\n setCompletedAnnouncement('Code complete');\n } else {\n setCompletedAnnouncement('');\n }\n refs.current[Math.min(pasted.length, length - 1)]?.focus();\n };\n\n return (\n <div className={cn('flex gap-2', className)}>\n {values.map((c, i) => (\n <input\n key={i}\n id={`${baseId}-${i}`}\n ref={(el) => {\n refs.current[i] = el;\n }}\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n value={c}\n disabled={disabled}\n aria-label={`${ariaLabel} ${i + 1} of ${length}`}\n onChange={(e) => writeAt(i, e.target.value)}\n onKeyDown={(e) => onKey(i, e)}\n onFocus={(e) => e.target.select()}\n onPaste={i === 0 ? onPaste : undefined}\n className={cn(\n 'text-text bg-panel h-12 w-10 rounded-md text-center font-mono text-[20px] font-medium',\n 'border-border border transition-[border-color,box-shadow] duration-(--duration-micro) outline-none',\n 'focus:border-accent focus:ring-accent-dim focus:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n />\n ))}\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {completedAnnouncement}\n </span>\n </div>\n );\n});\n\nOTP.displayName = 'OTP';\n","'use client';\n\nimport * as RadixRadio from '@radix-ui/react-radio-group';\nimport { forwardRef, useId, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/* ───── RadioGroup ───── */\n\nexport type RadioGroupProps = Omit<RadixRadio.RadioGroupProps, 'asChild'>;\n\n/**\n * Container for radio items. Wires up roving focus + arrow-key navigation.\n *\n * <RadioGroup value={v} onValueChange={setV}>\n * <Radio value=\"team\" label=\"Everyone on team\" />\n * <Radio value=\"admins\" label=\"Admins only\" />\n * </RadioGroup>\n */\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(function RadioGroup(\n { className, ...props },\n ref,\n) {\n return <RadixRadio.Root ref={ref} className={cn('flex flex-col gap-2', className)} {...props} />;\n});\n\nRadioGroup.displayName = 'RadioGroup';\n\n/* ───── Radio ───── */\n\nexport interface RadioProps extends Omit<RadixRadio.RadioGroupItemProps, 'asChild' | 'children'> {\n /** Optional inline label. */\n label?: ReactNode;\n}\n\nexport const Radio = forwardRef<HTMLButtonElement, RadioProps>(function Radio(\n { label, className, id: idProp, ...props },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `radio-${reactId}`;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-2 select-none',\n props.disabled && 'cursor-not-allowed opacity-40',\n className,\n )}\n >\n <RadixRadio.Item\n ref={ref}\n id={id}\n className={cn(\n 'grid h-4 w-4 place-items-center rounded-full',\n 'bg-panel border-border-strong border',\n 'data-[state=checked]:border-accent',\n 'transition-[border-color] duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n )}\n {...props}\n >\n <RadixRadio.Indicator className=\"bg-accent block h-[7px] w-[7px] rounded-full\" />\n </RadixRadio.Item>\n {label && (\n <label htmlFor={id} className=\"cursor-pointer text-[13px]\">\n {label}\n </label>\n )}\n </span>\n );\n});\n\nRadio.displayName = 'Radio';\n","'use client';\n\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/* ───── Atomic Radix wrappers (advanced API) ───── */\n\nexport const SelectRoot = RadixSelect.Root;\nexport const SelectValue = RadixSelect.Value;\nexport const SelectGroup = RadixSelect.Group;\nexport const SelectLabel = RadixSelect.Label;\n\nconst triggerClasses = {\n sm: 'h-7 px-2 text-[12px]',\n md: 'h-[34px] px-[10px] text-[13px]',\n lg: 'h-10 px-3 text-[14px]',\n} as const;\n\nexport const SelectTrigger = forwardRef<\n HTMLButtonElement,\n RadixSelect.SelectTriggerProps & { size?: keyof typeof triggerClasses }\n>(function SelectTrigger({ size = 'md', className, children, ...props }, ref) {\n return (\n <RadixSelect.Trigger\n ref={ref}\n className={cn(\n 'text-text bg-panel border-border inline-flex items-center justify-between gap-2 rounded-md border font-sans',\n 'data-[state=open]:border-accent',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'data-[disabled]:bg-panel-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n 'transition-[border-color,box-shadow] duration-(--duration-micro)',\n triggerClasses[size],\n className,\n )}\n {...props}\n >\n {children}\n <RadixSelect.Icon className=\"text-text-dim text-[11px] leading-none\">▾</RadixSelect.Icon>\n </RadixSelect.Trigger>\n );\n});\n\nSelectTrigger.displayName = 'SelectTrigger';\n\nexport const SelectContent = forwardRef<HTMLDivElement, RadixSelect.SelectContentProps>(\n function SelectContent(\n { className, children, position = 'popper', sideOffset = 6, ...props },\n ref,\n ) {\n return (\n <RadixSelect.Portal>\n <RadixSelect.Content\n ref={ref}\n position={position}\n sideOffset={sideOffset}\n className={cn(\n 'bg-panel border-border z-popover min-w-[var(--radix-select-trigger-width)] rounded-md border p-1 shadow',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n >\n <RadixSelect.Viewport>{children}</RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n );\n },\n);\n\nSelectContent.displayName = 'SelectContent';\n\nexport const SelectItem = forwardRef<HTMLDivElement, RadixSelect.SelectItemProps>(\n function SelectItem({ className, children, ...props }, ref) {\n return (\n <RadixSelect.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-pointer items-center rounded-sm px-2 py-[6px] text-[13px] outline-none',\n 'data-[highlighted]:bg-accent-dim data-[highlighted]:text-accent',\n 'data-[state=checked]:font-medium',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-40',\n className,\n )}\n {...props}\n >\n <RadixSelect.ItemText>{children}</RadixSelect.ItemText>\n </RadixSelect.Item>\n );\n },\n);\n\nSelectItem.displayName = 'SelectItem';\n\n/* ───── Convenience wrapper ───── */\n\nexport type SelectOption = string | { value: string; label: ReactNode };\n\nexport interface SelectProps extends Omit<RadixSelect.SelectProps, 'children'> {\n /** Array of strings, or `{value, label}` objects. */\n options: SelectOption[];\n /** Placeholder shown when nothing is selected. */\n placeholder?: string;\n /** Trigger size. */\n size?: keyof typeof triggerClasses;\n /** Optional className for the trigger. */\n className?: string;\n /** Accessible label forwarded to the trigger button. */\n 'aria-label'?: string;\n /** ID of an element labelling the trigger. */\n 'aria-labelledby'?: string;\n}\n\n/**\n * One-line Select. For composition (groups, separators), use the lower-level\n * `SelectRoot/Trigger/Content/Item` exports directly.\n */\nexport function Select({\n options,\n placeholder = 'Select…',\n size,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...rootProps\n}: SelectProps) {\n return (\n <RadixSelect.Root {...rootProps}>\n <SelectTrigger\n size={size}\n className={className}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => {\n const value = typeof opt === 'string' ? opt : opt.value;\n const label = typeof opt === 'string' ? opt : opt.label;\n return (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n );\n })}\n </SelectContent>\n </RadixSelect.Root>\n );\n}\n","'use client';\n\nimport * as RadixSlider from '@radix-ui/react-slider';\nimport { forwardRef, useCallback, useState } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface SliderProps extends Omit<\n RadixSlider.SliderProps,\n 'asChild' | 'value' | 'defaultValue' | 'onValueChange'\n> {\n /** Show the numeric value to the right of the track. */\n showValue?: boolean;\n /** Pixel width or any CSS length. Defaults to `240`. */\n width?: number | string;\n /**\n * Per-thumb accessible names for multi-thumb (range) sliders. The label at\n * each index is forwarded to the corresponding `<RadixSlider.Thumb>`. When\n * omitted, every thumb falls back to `aria-label`/`aria-labelledby` (or the\n * literal `'Value'` when neither is provided).\n */\n thumbLabels?: ReadonlyArray<string>;\n /**\n * Controlled value. Accepts a scalar for single-thumb sliders or an array\n * for multi-thumb (range) sliders. The shape passed in mirrors the shape\n * passed back to `onValueChange`.\n */\n value?: number | number[];\n /** Uncontrolled initial value. Same scalar/array semantics as `value`. */\n defaultValue?: number | number[];\n /**\n * Fires when the value changes. The argument shape mirrors the input shape:\n * if `value`/`defaultValue` is a scalar, `next` is a scalar; if it's an\n * array, `next` is an array.\n */\n onValueChange?: (next: number | number[]) => void;\n}\n\n/**\n * Range slider. Built on Radix Slider for keyboard support (arrow keys nudge,\n * Page Up/Down jumps, Home/End snap to extremes).\n *\n * Pass `aria-label` / `aria-labelledby` to name a single-thumb slider; pass\n * `thumbLabels` to name each thumb in a multi-thumb (range) slider.\n */\nexport const Slider = forwardRef<HTMLSpanElement, SliderProps>(function Slider(\n {\n showValue,\n width = 240,\n className,\n value,\n defaultValue,\n onValueChange,\n thumbLabels,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...props\n },\n ref,\n) {\n // Radix Slider's value is always an array; we accept either form for ergonomics.\n const arrValue = Array.isArray(value)\n ? value\n : value !== undefined\n ? [value as unknown as number]\n : undefined;\n const arrDefault = Array.isArray(defaultValue)\n ? defaultValue\n : defaultValue !== undefined\n ? [defaultValue as unknown as number]\n : undefined;\n\n // Uncontrolled tracking so `showValue` follows the thumb as it's dragged.\n // Without this, `display` is computed once from `defaultValue` and Radix's\n // own internal state drifts away from what we render. We deliberately do\n // not useEffect-sync from `arrValue` — that allocates a fresh array per\n // render and would re-fire on every render, causing an infinite loop.\n // Instead we read `arrValue` directly in controlled mode and only fall\n // back to local state when uncontrolled.\n const isControlled = arrValue !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState<number[] | undefined>(arrDefault);\n const currentValue = isControlled ? arrValue : uncontrolledValue;\n\n // Per-render snapshot of the prop shape — drives whether `onValueChange`\n // reports a scalar or an array. With both `value` and `defaultValue`\n // undefined this is `false` (matches Radix's native array shape). The\n // variable describes *this render*, not a stable identity: if a consumer\n // later supplies a scalar `value`, the callback shape switches on the\n // next render to match.\n const wasScalar = !Array.isArray(value ?? defaultValue) && (value ?? defaultValue) !== undefined;\n const handleValueChange = useCallback(\n (next: number[]) => {\n if (!isControlled) setUncontrolledValue(next);\n if (onValueChange) {\n onValueChange(wasScalar ? (next[0] ?? 0) : next);\n }\n },\n [isControlled, onValueChange, wasScalar],\n );\n\n const display = currentValue?.[0] ?? props.min ?? 0;\n\n // Determine how many thumbs to render. Radix derives the count from the\n // value/defaultValue array length; mirror that here so we can render one\n // Thumb per slot with its own per-thumb name.\n const thumbCount = (arrValue ?? arrDefault)?.length ?? 1;\n\n return (\n <span\n ref={ref}\n className={cn('inline-flex items-center gap-[10px]', className)}\n style={{ width }}\n >\n <RadixSlider.Root\n value={arrValue}\n defaultValue={arrDefault}\n onValueChange={handleValueChange}\n className=\"relative flex h-4 flex-1 touch-none items-center select-none\"\n {...props}\n >\n <RadixSlider.Track className=\"bg-panel-2 relative h-1 grow rounded-full\">\n <RadixSlider.Range className=\"bg-accent absolute h-full rounded-full\" />\n </RadixSlider.Track>\n {Array.from({ length: thumbCount }, (_, i) => {\n const perThumb = thumbLabels?.[i];\n // aria-labelledby wins when there's no per-thumb override.\n const thumbAriaLabel = perThumb ?? (ariaLabelledBy ? undefined : (ariaLabel ?? 'Value'));\n return (\n <RadixSlider.Thumb\n key={i}\n className={cn(\n 'bg-text border-accent block h-[14px] w-[14px] rounded-full border-2 shadow',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'cursor-grab active:cursor-grabbing',\n )}\n aria-label={thumbAriaLabel}\n aria-labelledby={perThumb ? undefined : ariaLabelledBy}\n />\n );\n })}\n </RadixSlider.Root>\n {showValue && (\n <span className=\"text-text-muted min-w-[28px] text-right font-mono text-[11px]\">\n {display}\n </span>\n )}\n </span>\n );\n});\n\nSlider.displayName = 'Slider';\n","'use client';\n\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport { forwardRef, useId, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface SwitchProps extends Omit<RadixSwitch.SwitchProps, 'asChild' | 'children'> {\n /** Optional inline label rendered to the right of the switch. */\n label?: ReactNode;\n /** Visual size. Default `md`. */\n size?: 'sm' | 'md';\n}\n\nconst trackClasses = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n} as const;\n\nconst thumbClasses = {\n sm: 'h-3 w-3 data-[state=checked]:translate-x-3',\n md: 'h-4 w-4 data-[state=checked]:translate-x-4',\n} as const;\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { label, size = 'md', className, id: idProp, ...props },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `sw-${reactId}`;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-2 select-none',\n props.disabled && 'cursor-not-allowed opacity-40',\n className,\n )}\n >\n <RadixSwitch.Root\n ref={ref}\n id={id}\n className={cn(\n 'relative inline-flex shrink-0 cursor-pointer rounded-full border transition-colors duration-(--duration-micro)',\n 'bg-panel-2 border-border data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed',\n trackClasses[size],\n )}\n {...props}\n >\n <RadixSwitch.Thumb\n className={cn(\n 'bg-text absolute top-1/2 left-[1px] -translate-y-1/2 rounded-full shadow-sm',\n 'data-[state=checked]:bg-on-accent transition-transform duration-(--duration-micro)',\n thumbClasses[size],\n )}\n />\n </RadixSwitch.Root>\n {label && (\n <label htmlFor={id} className=\"cursor-pointer text-[13px]\">\n {label}\n </label>\n )}\n </span>\n );\n});\n\nSwitch.displayName = 'Switch';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type TextareaHTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst textareaStyles = cva(\n [\n 'w-full font-sans text-text bg-panel rounded-md p-[10px]',\n 'border outline-none transition-[border-color,box-shadow] duration-(--duration-micro)',\n 'placeholder:text-text-dim resize-y',\n 'focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-panel-2',\n ],\n {\n variants: {\n tone: {\n default: 'border-border focus-visible:border-accent focus-visible:ring-accent-dim',\n err: 'border-err focus-visible:border-err focus-visible:ring-err/30',\n },\n },\n defaultVariants: { tone: 'default' },\n },\n);\n\nexport interface TextareaProps\n extends TextareaHTMLAttributes<HTMLTextAreaElement>, VariantProps<typeof textareaStyles> {\n /** Error tone shortcut. Sets `aria-invalid` and the error border. */\n error?: boolean;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { tone, error, rows = 4, className, ...props },\n ref,\n) {\n return (\n <textarea\n ref={ref}\n rows={rows}\n aria-invalid={error || undefined}\n className={cn(textareaStyles({ tone: error ? 'err' : tone }), className)}\n {...props}\n />\n );\n});\n\nTextarea.displayName = 'Textarea';\n","'use client';\n\nimport * as RadixAvatar from '@radix-ui/react-avatar';\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\nimport { stateLabel } from '../StatusDot/StatusDot';\n\nimport { sizePx } from './sizes';\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type AvatarStatus = 'ok' | 'warn' | 'err' | 'off';\n\nconst statusBg: Record<AvatarStatus, string> = {\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n off: 'bg-text-dim',\n};\n\nfunction initialsFor(name: string): string {\n return (name || '?')\n .split(/\\s+/)\n .map((p) => p[0] ?? '')\n .join('')\n .slice(0, 2)\n .toUpperCase();\n}\n\nfunction hashHue(str: string): number {\n let h = 0;\n for (let i = 0; i < str.length; i++) h = (h * 31 + str.charCodeAt(i)) % 360;\n return h;\n}\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n /** Display name. Used to derive initials and a deterministic background color. */\n name?: string;\n /** Image source. Falls back to initials if loading fails. */\n src?: string;\n /** Predefined size: xs (20) / sm (24) / md (32) / lg (40) / xl (56). */\n size?: AvatarSize;\n /** Optional presence indicator. */\n status?: AvatarStatus;\n /** Override the auto-generated initials (e.g., for non-Latin scripts). */\n initials?: string;\n}\n\n/**\n * Person/entity avatar. Auto-generates initials and a stable background color from\n * `name`. When `src` is provided, it's the primary; initials show during load and\n * after a load failure.\n */\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n { name = '?', src, size = 'md', status, initials, className, style, ...props },\n ref,\n) {\n const dim = sizePx[size];\n const hue = hashHue(name);\n const computedInitials = initials ?? initialsFor(name);\n\n return (\n <span\n ref={ref}\n className={cn('relative inline-block', className)}\n style={{ width: dim, height: dim, ...style }}\n {...props}\n >\n <RadixAvatar.Root\n className=\"border-border relative inline-flex h-full w-full shrink-0 overflow-hidden rounded-full border\"\n style={{\n background: src\n ? undefined\n : `oklch(var(--color-avatar-fallback-l) var(--color-avatar-fallback-c) ${hue})`,\n }}\n >\n {src && <RadixAvatar.Image src={src} alt={name} className=\"h-full w-full object-cover\" />}\n <RadixAvatar.Fallback\n className=\"flex h-full w-full items-center justify-center font-sans font-semibold text-white\"\n style={{ fontSize: dim * 0.38 }}\n >\n {computedInitials}\n </RadixAvatar.Fallback>\n </RadixAvatar.Root>\n {status && (\n <span\n role=\"img\"\n aria-label={stateLabel[status]}\n className={cn(\n 'border-bg absolute right-0 bottom-0 rounded-full border-[2px]',\n statusBg[status],\n )}\n style={{ width: dim * 0.3, height: dim * 0.3 }}\n />\n )}\n </span>\n );\n});\n\nAvatar.displayName = 'Avatar';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type StatusState = 'ok' | 'warn' | 'err' | 'off' | 'sync' | 'accent';\n\nexport interface StatusDotProps extends HTMLAttributes<HTMLSpanElement> {\n /** Semantic status. */\n state?: StatusState;\n /** Optional label rendered next to the dot. */\n label?: ReactNode;\n /** Pulse the dot — used for `sync` state to indicate live activity. */\n pulse?: boolean;\n /** Pixel diameter. Defaults to 8px. */\n size?: number;\n}\n\nconst stateColor: Record<StatusState, string> = {\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n off: 'bg-text-dim',\n sync: 'bg-accent',\n accent: 'bg-accent',\n};\n\nconst stateText: Record<StatusState, string> = {\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n off: 'text-text-dim',\n sync: 'text-accent',\n accent: 'text-accent',\n};\n\n/**\n * Human-friendly accessible names for each status. Used as the default\n * `aria-label` when no `label` is provided so screen readers announce\n * \"Online\" instead of the raw enum token \"ok\". Exported so other components\n * (e.g., `Avatar`'s status indicator) can reuse the same vocabulary.\n */\nexport const stateLabel: Record<StatusState, string> = {\n ok: 'Online',\n warn: 'Warning',\n err: 'Error',\n off: 'Offline',\n sync: 'Syncing',\n accent: 'Active',\n};\n\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(function StatusDot(\n { state = 'ok', label, pulse, size = 8, className, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n role={label ? 'status' : 'img'}\n aria-label={!label ? stateLabel[state] : undefined}\n className={cn('inline-flex items-center gap-[6px]', className)}\n {...props}\n >\n <span\n className={cn(\n 'inline-block rounded-full',\n stateColor[state],\n pulse && 'animate-[ship-pulse-ring_1.6s_infinite]',\n stateText[state],\n )}\n style={{ width: size, height: size }}\n />\n {label && <span className=\"text-text-muted text-[12px]\">{label}</span>}\n </span>\n );\n});\n\nStatusDot.displayName = 'StatusDot';\n","import type { AvatarSize } from './Avatar';\n\n/**\n * Pixel dimensions for each avatar size token. Shared by `Avatar` and\n * `AvatarGroup` so the visual scale stays in lockstep.\n */\nexport const sizePx: Record<AvatarSize, number> = {\n xs: 20,\n sm: 24,\n md: 32,\n lg: 40,\n xl: 56,\n};\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { Avatar, type AvatarSize } from './Avatar';\nimport { sizePx } from './sizes';\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Names rendered as stacked avatars. */\n names: string[];\n /** Maximum avatars before collapsing into a `+N` chip. Defaults to 3. */\n max?: number;\n /** Avatar size for the whole group. */\n size?: AvatarSize;\n}\n\n/**\n * Stacked avatars with overflow chip. Each avatar's initials and color is\n * deterministic from its name.\n */\nexport const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(function AvatarGroup(\n { names, max = 3, size = 'md', className, ...props },\n ref,\n) {\n const dim = sizePx[size];\n const visible = names.slice(0, max);\n const rest = names.length - visible.length;\n const overlap = -dim * 0.35;\n\n return (\n <div ref={ref} className={cn('inline-flex', className)} {...props}>\n {visible.map((n, i) => (\n <span key={`${n}-${i}`} style={{ marginLeft: i === 0 ? 0 : overlap }}>\n <Avatar name={n} size={size} />\n </span>\n ))}\n {rest > 0 && (\n <span\n aria-label={`+${rest} more`}\n className=\"bg-panel-2 border-border text-text-muted grid place-items-center rounded-full border font-mono\"\n style={{\n width: dim,\n height: dim,\n marginLeft: overlap,\n fontSize: dim * 0.35,\n }}\n >\n +{rest}\n </span>\n )}\n </div>\n );\n});\n\nAvatarGroup.displayName = 'AvatarGroup';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst badgeStyles = cva('inline-flex items-center font-sans leading-none whitespace-nowrap', {\n variants: {\n variant: {\n neutral: 'bg-panel-2 text-text-muted border border-border',\n accent: 'bg-accent-dim text-accent border border-transparent',\n ok: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_85%)] text-ok border border-transparent',\n warn: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_85%)] text-warn border border-transparent',\n err: 'bg-[color-mix(in_oklab,var(--color-err),transparent_85%)] text-err border border-transparent',\n purple:\n 'bg-[color-mix(in_oklab,var(--color-purple),transparent_85%)] text-purple border border-transparent',\n pink: 'bg-[color-mix(in_oklab,var(--color-pink),transparent_85%)] text-pink border border-transparent',\n outline: 'bg-transparent text-text border border-border-strong',\n solid: 'bg-text text-bg border border-text',\n },\n size: {\n sm: 'h-[18px] px-[6px] py-[1px] text-[10px] gap-1 rounded-full',\n md: 'h-[22px] px-2 py-[2px] text-[11px] gap-[5px] rounded-full',\n lg: 'h-[26px] px-[10px] py-[3px] text-[12px] gap-[6px] rounded-full',\n },\n },\n defaultVariants: { variant: 'neutral', size: 'md' },\n});\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeStyles> {\n /** Show a colored leading dot. */\n dot?: boolean;\n /** Optional leading icon (defers to children). */\n icon?: ReactNode;\n}\n\nconst dotColorClass = {\n neutral: 'bg-text-dim',\n accent: 'bg-accent',\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n purple: 'bg-purple',\n pink: 'bg-pink',\n outline: 'bg-text-muted',\n solid: 'bg-bg',\n} as const;\n\nconst dotSize = { sm: 'h-[5px] w-[5px]', md: 'h-[6px] w-[6px]', lg: 'h-[7px] w-[7px]' } as const;\n\ntype BadgeSize = keyof typeof dotSize;\ntype BadgeVariant = keyof typeof dotColorClass;\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant = 'neutral', size = 'md', dot, icon, className, children, ...props },\n ref,\n) {\n const sz = (size ?? 'md') as BadgeSize;\n const v = (variant ?? 'neutral') as BadgeVariant;\n return (\n <span ref={ref} className={cn(badgeStyles({ variant, size }), className)} {...props}>\n {dot && (\n <span\n aria-hidden\n className={cn('inline-block rounded-full', dotSize[sz], dotColorClass[v])}\n />\n )}\n {icon && <span className=\"inline-flex leading-none\">{icon}</span>}\n {children}\n </span>\n );\n});\n\nBadge.displayName = 'Badge';\n\nexport { badgeStyles };\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type AnchorHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst cardStyles = cva(\n 'block bg-panel border border-border rounded-base transition-[border-color,transform,box-shadow] duration-(--duration-step)',\n {\n variants: {\n variant: {\n default: '',\n ghost: 'bg-transparent',\n elevated: 'shadow',\n },\n interactive: {\n true: 'cursor-pointer hover:border-border-strong hover:-translate-y-px hover:shadow',\n false: '',\n },\n },\n defaultVariants: { variant: 'default', interactive: false },\n },\n);\n\nexport interface CardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'>, VariantProps<typeof cardStyles> {\n /** Render a header row with this title (and optional `actions`). */\n title?: ReactNode;\n /** Description shown under the title (or above children when no title). */\n description?: ReactNode;\n /** Action slot rendered to the right of the title. */\n actions?: ReactNode;\n /** Footer slot rendered with a top divider beneath children. */\n footer?: ReactNode;\n /**\n * Keyboard activation handler. When provided, Enter/Space on a card with\n * `role=\"button\"` (i.e. `interactive` truthy) calls this instead of\n * synthesizing a fake mouse event for `onClick` — downstream `e.button` /\n * `e.clientX` reads from the synthesized event are `undefined`, so prefer\n * `onActivate` when you need an intent-only callback.\n */\n onActivate?: () => void;\n}\n\n/**\n * Standard surface for a chunk of content. All cards share the same chrome\n * (panel bg, 1px border, 10px radius); variation comes from what's inside.\n *\n * Compose with the `<Card title=\"…\" actions={…} footer={…}>` API for simple\n * cases, or pass children directly for full control.\n *\n * NOTE on `interactive`: a card with `interactive` resolves to\n * `role=\"button\" tabIndex=0`. If the same card also renders interactive\n * children (e.g. via `actions`), screen readers see a button-inside-button —\n * an axe `nested-interactive` violation. For \"the whole card is one link\"\n * use `<CardLink>` instead. In the actions-present + interactive case we\n * downgrade to a plain `<div>` (and warn in dev) so the assistive-tech tree\n * stays valid.\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n variant,\n interactive,\n title,\n description,\n actions,\n footer,\n className,\n children,\n onClick,\n onActivate,\n ...props\n },\n ref,\n) {\n const wantsInteractive = interactive ?? Boolean(onClick);\n const hasActions = actions != null;\n // Nested-interactive guard: a card containing action buttons must not itself\n // claim role=\"button\". Drop the role/tabIndex but keep the click handler so\n // background activation still fires for non-AT users.\n if (wantsInteractive && hasActions && process.env.NODE_ENV !== 'production') {\n console.warn(\n '[Card] `interactive` was requested but `actions` is also set, which would create a nested-interactive a11y violation. The card will render as a plain <div>. Use <CardLink> for whole-card links, or move the actions outside the card.',\n );\n }\n const isInteractive = wantsInteractive && !hasActions;\n const handleKeyDown = isInteractive\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n if (onActivate) {\n e.preventDefault();\n onActivate();\n } else if (onClick) {\n e.preventDefault();\n // Fallback: callers that didn't pass onActivate still need keyboard\n // parity with mouse, so synthesize a minimal event. Reads of\n // mouse-only fields (`e.button`, `e.clientX`) will be undefined —\n // hence the preference for onActivate above.\n onClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n }\n : undefined;\n return (\n <div\n ref={ref}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n role={isInteractive ? 'button' : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n className={cn(cardStyles({ variant, interactive: wantsInteractive }), 'p-[18px]', className)}\n {...props}\n >\n {(title || actions) && (\n <div className={cn('flex items-start gap-3', (description || children) && 'mb-[10px]')}>\n {title && <div className=\"flex-1 text-[14px] font-medium\">{title}</div>}\n {actions && <div className=\"flex gap-1\">{actions}</div>}\n </div>\n )}\n {description && (\n <div className={cn('text-text-muted text-[12px] leading-[1.55]', children && 'mb-[14px]')}>\n {description}\n </div>\n )}\n {children}\n {footer && (\n <div className=\"border-border text-text-dim mt-[14px] border-t pt-3 text-[11px]\">\n {footer}\n </div>\n )}\n </div>\n );\n});\n\nCard.displayName = 'Card';\n\nexport interface CardLinkProps\n extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'title'>, VariantProps<typeof cardStyles> {\n /** Destination URL. The whole card becomes a single link to this URL. */\n href: string;\n /** Render a header row with this title. */\n title?: ReactNode;\n /** Description shown under the title (or above children when no title). */\n description?: ReactNode;\n /** Footer slot rendered with a top divider beneath children. */\n footer?: ReactNode;\n}\n\n/**\n * Whole-card link. Use this when \"click anywhere on the card\" should\n * navigate — it renders a single `<a>` so assistive tech sees one link\n * (no nested-interactive problem) and the browser handles middle-click,\n * cmd-click, hover preview, etc. without bespoke wiring.\n *\n * Does not accept an `actions` slot: action buttons inside a link are a\n * nested-interactive violation. Put per-card actions next to the card\n * instead, or use the plain `<Card>` for non-link cards.\n */\nexport const CardLink = forwardRef<HTMLAnchorElement, CardLinkProps>(function CardLink(\n { variant, title, description, footer, className, children, href, ...props },\n ref,\n) {\n return (\n <a\n ref={ref}\n href={href}\n className={cn(\n cardStyles({ variant, interactive: true }),\n 'focus-visible:ring-accent-dim p-[18px] no-underline outline-none focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n >\n {title && (\n <div className={cn('flex items-start', (description || children) && 'mb-[10px]')}>\n <div className=\"flex-1 text-[14px] font-medium\">{title}</div>\n </div>\n )}\n {description && (\n <div className={cn('text-text-muted text-[12px] leading-[1.55]', children && 'mb-[14px]')}>\n {description}\n </div>\n )}\n {children}\n {footer && (\n <div className=\"border-border text-text-dim mt-[14px] border-t pt-3 text-[11px]\">\n {footer}\n </div>\n )}\n </a>\n );\n});\n\nCardLink.displayName = 'CardLink';\n\nexport { cardStyles };\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type StatTrend = 'up' | 'down' | 'flat';\n\nexport interface StatCardProps extends HTMLAttributes<HTMLDivElement> {\n /** UPPERCASE eyebrow label above the value. */\n label: ReactNode;\n /** The big number / value. Renders in tabular-nums monospace for ticker comparison. */\n value: ReactNode;\n /** Optional delta string (\"+284 today\", \"-0.3%\"). */\n delta?: ReactNode;\n /** Pairs with `delta` to color the change: up = ok, down = err, flat = neutral. */\n trend?: StatTrend;\n /** Optional trailing icon, top-right. */\n icon?: ReactNode;\n}\n\nconst trendClasses: Record<StatTrend, string> = {\n up: 'text-ok',\n down: 'text-err',\n flat: 'text-text-dim',\n};\n\nconst trendArrows: Record<StatTrend, string> = { up: '↑', down: '↓', flat: '→' };\n\n/**\n * Card subclass for a single metric. Use in dashboard grids; cap at 4 per row.\n */\nexport const StatCard = forwardRef<HTMLDivElement, StatCardProps>(function StatCard(\n { label, value, delta, trend = 'flat', icon, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('bg-panel border-border rounded-base block border p-[18px]', className)}\n {...props}\n >\n <div className=\"mb-[10px] flex items-center justify-between\">\n <div className=\"text-text-dim font-mono text-[10px] tracking-wide uppercase\">{label}</div>\n {icon && <div className=\"text-text-dim text-[14px]\">{icon}</div>}\n </div>\n <div className=\"text-text font-mono text-[26px] leading-none font-medium tracking-tight\">\n {value}\n </div>\n {delta !== undefined && (\n <div className={cn('mt-[6px] font-mono text-[11px]', trendClasses[trend])}>\n {trendArrows[trend]} {delta}\n </div>\n )}\n </div>\n );\n});\n\nStatCard.displayName = 'StatCard';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n /** Pill-style leading icon (typically a glyph or `@`/`#`). */\n icon?: ReactNode;\n /**\n * Optional remove handler. When provided, renders an inset close button.\n * Mirrors the `Tag` API — pass `onRemove` and the X is rendered automatically.\n */\n onRemove?: () => void;\n children: ReactNode;\n}\n\n/**\n * Pill-shaped filter chip. Used in command palette tag rows, search filter strips,\n * and AI suggestion lists. Differs from `Tag` by being pill-shaped (full radius)\n * and slightly more decorative.\n */\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(function Chip(\n { icon, onRemove, className, children, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n className={cn(\n 'inline-flex h-[26px] items-center gap-[6px] py-[4px] pr-1 pl-[10px] font-sans text-[12px]',\n 'bg-panel-2 text-text border-border rounded-full border',\n className,\n )}\n {...props}\n >\n {icon && <span className=\"text-text-dim inline-flex text-[10px]\">{icon}</span>}\n {children}\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove\"\n className=\"bg-panel text-text-dim hover:text-text grid h-[18px] w-[18px] place-items-center rounded-full text-[10px] leading-none\"\n >\n ×\n </button>\n )}\n </span>\n );\n});\n\nChip.displayName = 'Chip';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type KbdProps = HTMLAttributes<HTMLElement>;\n\n/**\n * Keyboard shortcut display — `<Kbd>⌘</Kbd><Kbd>K</Kbd>`. Uses `<kbd>` semantics\n * so screen readers announce it as a key.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(function Kbd(\n { className, children, ...props },\n ref,\n) {\n return (\n <kbd\n ref={ref}\n className={cn(\n 'text-text-muted inline-flex items-center font-mono text-[10px] font-medium',\n 'bg-panel border-border rounded-xs border px-[6px] py-[2px]',\n 'border-b-border border-b-[2px]',\n className,\n )}\n {...props}\n >\n {children}\n </kbd>\n );\n});\n\nKbd.displayName = 'Kbd';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst skeletonStyles = cva('block bg-panel-2 animate-[ship-skeleton_1.4s_infinite]', {\n variants: {\n shape: {\n line: 'rounded-xs',\n block: 'rounded-md',\n circle: 'rounded-full',\n },\n },\n defaultVariants: { shape: 'line' },\n});\n\nexport interface SkeletonProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonStyles> {\n /** Width override — accepts any CSS length, e.g. `'70%'`, `120`. */\n width?: number | string;\n /** Height override. Defaults differ by shape: `line` = 14, `block` = 80, `circle` = 40. */\n height?: number | string;\n /**\n * Render this Skeleton as its own loading announcement (`role=\"status\"`,\n * `aria-busy=\"true\"`, `aria-label=\"Loading\"`). Default `false` — Skeleton is\n * `aria-hidden` so a list of N skeletons does not announce N times. Wrap a\n * group of Skeletons in `<SkeletonGroup>` to get a single aggregate\n * announcement, or set `standalone` when rendering a single isolated\n * Skeleton with no surrounding live region.\n */\n standalone?: boolean;\n}\n\nconst defaultHeight = { line: 14, block: 80, circle: 40 } as const;\n\n/**\n * Visual placeholder for content that is loading. By default, Skeleton is\n * `aria-hidden` and emits no live-region announcement — wrap one or more\n * Skeletons in `<SkeletonGroup loading>` to get a single \"Loading\" message\n * for the whole group. For a single isolated Skeleton outside any group,\n * pass `standalone` to restore the per-element `role=\"status\"` semantic.\n */\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(function Skeleton(\n { shape = 'line', width = '100%', height, standalone = false, className, style, ...props },\n ref,\n) {\n const h = height ?? defaultHeight[shape!];\n const w = shape === 'circle' ? h : width;\n const a11yProps = standalone\n ? ({ role: 'status', 'aria-busy': true, 'aria-label': 'Loading' } as const)\n : ({ 'aria-hidden': true } as const);\n return (\n <div\n ref={ref}\n {...a11yProps}\n className={cn(skeletonStyles({ shape }), className)}\n style={{ width: w, height: h, ...style }}\n {...props}\n />\n );\n});\n\nSkeleton.displayName = 'Skeleton';\n\nexport interface SkeletonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Optional override for the announcement text. Defaults to `\"Loading\"`.\n * Pass something more specific (e.g., `\"Loading inbox\"`) when the context\n * makes it useful.\n */\n label?: string;\n /**\n * When `false`, the group renders as a plain wrapper with no live region —\n * useful when toggling between loading and loaded children inside the same\n * mount. Default `true`.\n */\n loading?: boolean;\n}\n\n/**\n * Wraps a group of `<Skeleton>` placeholders in a single `role=\"status\"` /\n * `aria-busy=\"true\"` live region so screen readers announce one \"Loading\"\n * message for the whole group instead of one per Skeleton.\n */\nexport const SkeletonGroup = forwardRef<HTMLDivElement, SkeletonGroupProps>(function SkeletonGroup(\n { label = 'Loading', loading = true, className, children, ...props },\n ref,\n) {\n if (!loading) {\n return (\n <div ref={ref} className={className} {...props}>\n {children as ReactNode}\n </div>\n );\n }\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-busy=\"true\"\n aria-label={label}\n className={className}\n {...props}\n >\n {children as ReactNode}\n </div>\n );\n});\n\nSkeletonGroup.displayName = 'SkeletonGroup';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n /** Optional close button. When provided, a `×` rendered on the right calls it. */\n onRemove?: () => void;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Pixel height. Defaults to 22px. */\n size?: number;\n children: ReactNode;\n}\n\n/**\n * Compact label with optional remove button. Used for selected filters,\n * applied tags, mention tokens.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { onRemove, icon, size = 22, className, children, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-[6px] px-2 py-[3px] font-sans text-[11px]',\n 'bg-panel-2 text-text border-border rounded-xs border',\n className,\n )}\n style={{ height: size }}\n {...props}\n >\n {icon && <span className=\"text-text-dim inline-flex\">{icon}</span>}\n {children}\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove\"\n className=\"text-text-dim hover:text-text px-[2px] leading-none\"\n >\n ×\n </button>\n )}\n </span>\n );\n});\n\nTag.displayName = 'Tag';\n","'use client';\n\nimport * as RadixContext from '@radix-ui/react-context-menu';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const ContextMenuRoot = RadixContext.Root;\nexport const ContextMenuTrigger = RadixContext.Trigger;\nexport const ContextMenuPortal = RadixContext.Portal;\n\nexport const ContextMenuContent = forwardRef<HTMLDivElement, RadixContext.ContextMenuContentProps>(\n function ContextMenuContent({ className, ...props }, ref) {\n return (\n <RadixContext.Portal>\n <RadixContext.Content\n ref={ref}\n className={cn(\n 'bg-panel border-border-strong z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixContext.Portal>\n );\n },\n);\n\nContextMenuContent.displayName = 'ContextMenuContent';\n\nconst itemBase = cn(\n 'flex items-center gap-2 px-[10px] py-[6px] rounded-sm text-[12px] cursor-pointer outline-none',\n 'data-[highlighted]:bg-panel-2',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed',\n);\n\nexport interface ContextMenuItemProps extends RadixContext.ContextMenuItemProps {\n icon?: ReactNode;\n trailing?: ReactNode;\n destructive?: boolean;\n}\n\nexport const ContextMenuItem = forwardRef<HTMLDivElement, ContextMenuItemProps>(\n function ContextMenuItem({ icon, trailing, destructive, className, children, ...props }, ref) {\n return (\n <RadixContext.Item\n ref={ref}\n className={cn(itemBase, destructive ? 'text-err' : 'text-text', className)}\n {...props}\n >\n {icon && <span className=\"w-[14px] text-[12px] opacity-70\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n {trailing && <span className=\"text-text-dim font-mono text-[10px]\">{trailing}</span>}\n </RadixContext.Item>\n );\n },\n);\n\nContextMenuItem.displayName = 'ContextMenuItem';\n\nexport const ContextMenuSeparator = forwardRef<\n HTMLDivElement,\n RadixContext.ContextMenuSeparatorProps\n>(function ContextMenuSeparator({ className, ...props }, ref) {\n return (\n <RadixContext.Separator\n ref={ref}\n className={cn('bg-border my-1 h-[1px]', className)}\n {...props}\n />\n );\n});\n\nContextMenuSeparator.displayName = 'ContextMenuSeparator';\n\nexport const ContextMenu = RadixContext.Root;\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Modal dialog. Built on Radix Dialog so focus trap, ESC, and ARIA come for free.\n *\n * Two APIs:\n * 1. Composition: `<Dialog open={…}><DialogContent>…</DialogContent></Dialog>`\n * 2. Convenience: `<Dialog open={…} title=\"…\" description=\"…\" footer={…}>body</Dialog>`\n */\n\nexport const DialogRoot = RadixDialog.Root;\nexport const DialogTrigger = RadixDialog.Trigger;\nexport const DialogClose = RadixDialog.Close;\nexport const DialogPortal = RadixDialog.Portal;\n\nexport const DialogOverlay = forwardRef<HTMLDivElement, RadixDialog.DialogOverlayProps>(\n function DialogOverlay({ className, ...props }, ref) {\n return (\n <RadixDialog.Overlay\n ref={ref}\n className={cn(\n 'z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]',\n 'data-[state=open]:animate-[ship-fade-in_150ms_ease]',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nDialogOverlay.displayName = 'DialogOverlay';\n\nexport interface DialogContentProps extends RadixDialog.DialogContentProps {\n /** Pixel max-width of the panel. Defaults to 460. */\n width?: number | string;\n}\n\nexport const DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(function DialogContent(\n { className, width = 460, style, children, ...props },\n ref,\n) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n className={cn(\n 'z-modal fixed top-1/2 left-1/2 w-[calc(100%-40px)] -translate-x-1/2 -translate-y-1/2 p-6',\n 'bg-panel border-border-strong rounded-lg border shadow-lg',\n 'data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]',\n 'outline-none',\n className,\n )}\n style={{ maxWidth: width, ...style }}\n {...props}\n >\n {children}\n </RadixDialog.Content>\n </DialogPortal>\n );\n});\n\nDialogContent.displayName = 'DialogContent';\n\nexport interface DialogProps extends RadixDialog.DialogProps {\n /** Convenience: title rendered with proper heading semantics. */\n title?: ReactNode;\n /** Convenience: description rendered with proper a11y description. */\n description?: ReactNode;\n /** Footer slot — typically buttons. */\n footer?: ReactNode;\n /** Pixel max-width of the panel. */\n width?: number | string;\n /** When set, content is wrapped in a content frame; omit for full custom layout. */\n children?: ReactNode;\n}\n\nexport function Dialog({ title, description, footer, width, children, ...rootProps }: DialogProps) {\n // If consumer passed only children, render in convenience mode.\n return (\n <DialogRoot {...rootProps}>\n <DialogContent width={width}>\n {title && (\n <RadixDialog.Title\n className={cn('text-[16px] font-medium', description ? 'mb-[6px]' : 'mb-4')}\n >\n {title}\n </RadixDialog.Title>\n )}\n {description && (\n <RadixDialog.Description className=\"text-text-muted mb-[18px] text-[13px] leading-[1.55]\">\n {description}\n </RadixDialog.Description>\n )}\n {children}\n {footer && <div className=\"mt-5 flex justify-end gap-2\">{footer}</div>}\n </DialogContent>\n </DialogRoot>\n );\n}\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { DialogOverlay, DialogPortal, DialogRoot } from './Dialog';\n\nexport type DrawerSide = 'left' | 'right';\n\nexport interface DrawerProps extends RadixDialog.DialogProps {\n /** Side the drawer slides in from. */\n side?: DrawerSide;\n /** Title rendered in the drawer header (with built-in close button). */\n title?: ReactNode;\n /** Width override. Defaults to 420. */\n width?: number | string;\n children?: ReactNode;\n}\n\nconst sideClasses: Record<DrawerSide, string> = {\n left: 'left-0 border-r border-border-strong data-[state=open]:animate-[ship-slide-in-left_220ms_var(--easing-out)]',\n right:\n 'right-0 border-l border-border-strong data-[state=open]:animate-[ship-slide-in-right_220ms_var(--easing-out)]',\n};\n\nconst DrawerHeader = ({ title, onClose }: { title: ReactNode; onClose?: () => void }) => (\n <div className=\"border-border flex items-center justify-between border-b p-[16px] px-5\">\n <RadixDialog.Title className=\"text-[14px] font-medium\">{title}</RadixDialog.Title>\n <RadixDialog.Close\n onClick={onClose}\n aria-label=\"Close\"\n className=\"text-text-dim hover:text-text p-1 text-[18px] leading-none\"\n >\n ×\n </RadixDialog.Close>\n </div>\n);\n\n/**\n * Side-panel overlay. Same focus-trap + ESC + backdrop semantics as Dialog,\n * just slid in from the side.\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(function Drawer(\n { side = 'right', title, width = 420, children, ...rootProps },\n ref,\n) {\n return (\n <DialogRoot {...rootProps}>\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n aria-describedby={undefined}\n className={cn(\n 'bg-panel z-modal fixed top-0 bottom-0 flex flex-col shadow-lg outline-none',\n sideClasses[side],\n )}\n style={{ width }}\n >\n {title ? (\n <DrawerHeader title={title} />\n ) : (\n <RadixDialog.Title className=\"sr-only\">Drawer</RadixDialog.Title>\n )}\n <div className=\"flex-1 overflow-auto p-5\">{children}</div>\n </RadixDialog.Content>\n </DialogPortal>\n </DialogRoot>\n );\n});\n\nDrawer.displayName = 'Drawer';\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { DialogOverlay, DialogPortal, DialogRoot } from './Dialog';\n\nexport interface SheetProps extends RadixDialog.DialogProps {\n /** Optional title rendered above the body. */\n title?: ReactNode;\n /** Width override. Defaults to `min(640px, 90vw)`. */\n width?: number | string;\n children?: ReactNode;\n}\n\n/**\n * Bottom sheet overlay. Slides up from the bottom edge of the viewport. Useful\n * for quick actions on mobile-leaning surfaces.\n */\nexport const Sheet = forwardRef<HTMLDivElement, SheetProps>(function Sheet(\n { title, width = 'min(640px, 90vw)', children, ...rootProps },\n ref,\n) {\n return (\n <DialogRoot {...rootProps}>\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n aria-describedby={undefined}\n className={cn(\n 'z-modal fixed bottom-0 left-1/2 -translate-x-1/2 p-5',\n 'bg-panel border-border-strong rounded-tl-lg rounded-tr-lg border-t shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-slide-in-bottom_220ms_var(--easing-out)]',\n )}\n style={{ width }}\n >\n {title ? (\n <RadixDialog.Title className=\"mb-1 text-[15px] font-medium\">{title}</RadixDialog.Title>\n ) : (\n <RadixDialog.Title className=\"sr-only\">Sheet</RadixDialog.Title>\n )}\n {children}\n </RadixDialog.Content>\n </DialogPortal>\n </DialogRoot>\n );\n});\n\nSheet.displayName = 'Sheet';\n","'use client';\n\nimport * as RadixAlert from '@radix-ui/react-alert-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Confirmation dialog. Stricter than Dialog: cannot be closed by clicking the\n * backdrop, requires an explicit cancel/confirm action.\n */\n\nexport const AlertDialogRoot = RadixAlert.Root;\nexport const AlertDialogTrigger = RadixAlert.Trigger;\nexport const AlertDialogAction = RadixAlert.Action;\nexport const AlertDialogCancel = RadixAlert.Cancel;\n\nexport interface AlertDialogProps extends RadixAlert.AlertDialogProps {\n title: ReactNode;\n description?: ReactNode;\n /** Confirm + cancel buttons or any custom footer slot. */\n footer?: ReactNode;\n width?: number | string;\n}\n\nexport const AlertDialog = forwardRef<HTMLDivElement, AlertDialogProps>(function AlertDialog(\n { title, description, footer, width = 460, children, ...rootProps },\n ref,\n) {\n return (\n <AlertDialogRoot {...rootProps}>\n <RadixAlert.Portal>\n <RadixAlert.Overlay\n className={cn(\n 'z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]',\n 'data-[state=open]:animate-[ship-fade-in_150ms_ease]',\n )}\n />\n <RadixAlert.Content\n ref={ref}\n style={{ maxWidth: width }}\n className={cn(\n 'z-modal fixed top-1/2 left-1/2 w-[calc(100%-40px)] -translate-x-1/2 -translate-y-1/2 p-6',\n 'bg-panel border-border-strong rounded-lg border shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]',\n )}\n >\n <RadixAlert.Title\n className={cn('text-[16px] font-medium', description ? 'mb-[6px]' : 'mb-4')}\n >\n {title}\n </RadixAlert.Title>\n {description && (\n <RadixAlert.Description className=\"text-text-muted mb-[18px] text-[13px] leading-[1.55]\">\n {description}\n </RadixAlert.Description>\n )}\n {children}\n {footer && <div className=\"mt-5 flex justify-end gap-2\">{footer}</div>}\n </RadixAlert.Content>\n </RadixAlert.Portal>\n </AlertDialogRoot>\n );\n});\n\nAlertDialog.displayName = 'AlertDialog';\n","'use client';\n\nimport * as RadixMenu from '@radix-ui/react-dropdown-menu';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const DropdownMenuRoot = RadixMenu.Root;\nexport const DropdownMenuTrigger = RadixMenu.Trigger;\nexport const DropdownMenuPortal = RadixMenu.Portal;\nexport const DropdownMenuGroup = RadixMenu.Group;\nexport const DropdownMenuLabel = RadixMenu.Label;\nexport const DropdownMenuRadioGroup = RadixMenu.RadioGroup;\n\nexport const DropdownMenuContent = forwardRef<HTMLDivElement, RadixMenu.DropdownMenuContentProps>(\n function DropdownMenuContent({ className, sideOffset = 6, align = 'start', ...props }, ref) {\n return (\n <RadixMenu.Portal>\n <RadixMenu.Content\n ref={ref}\n sideOffset={sideOffset}\n align={align}\n className={cn(\n 'bg-panel border-border-strong z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixMenu.Portal>\n );\n },\n);\n\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\nexport interface MenuItemProps extends RadixMenu.DropdownMenuItemProps {\n /** Icon rendered to the left of the label. */\n icon?: ReactNode;\n /** Trailing hint — typically a kbd shortcut. */\n trailing?: ReactNode;\n /** Style as destructive (red). Doesn't change behavior. */\n destructive?: boolean;\n}\n\nconst itemBase = cn(\n 'flex items-center gap-2 px-[10px] py-[6px] rounded-sm text-[12px] cursor-pointer outline-none',\n 'data-[highlighted]:bg-panel-2',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed',\n);\n\nexport const MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(function MenuItem(\n { icon, trailing, destructive, className, children, ...props },\n ref,\n) {\n return (\n <RadixMenu.Item\n ref={ref}\n className={cn(itemBase, destructive ? 'text-err' : 'text-text', className)}\n {...props}\n >\n {icon && <span className=\"w-[14px] text-[12px] opacity-70\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n {trailing && <span className=\"text-text-dim font-mono text-[10px]\">{trailing}</span>}\n </RadixMenu.Item>\n );\n});\n\nMenuItem.displayName = 'MenuItem';\n\nexport const MenuCheckboxItem = forwardRef<HTMLDivElement, RadixMenu.DropdownMenuCheckboxItemProps>(\n function MenuCheckboxItem({ className, children, ...props }, ref) {\n return (\n <RadixMenu.CheckboxItem\n ref={ref}\n className={cn(itemBase, 'text-text relative pl-[26px]', className)}\n {...props}\n >\n <RadixMenu.ItemIndicator className=\"text-accent absolute top-1/2 left-2 -translate-y-1/2 text-[10px]\">\n ✓\n </RadixMenu.ItemIndicator>\n {children}\n </RadixMenu.CheckboxItem>\n );\n },\n);\n\nMenuCheckboxItem.displayName = 'MenuCheckboxItem';\n\nexport const MenuSeparator = forwardRef<HTMLDivElement, RadixMenu.DropdownMenuSeparatorProps>(\n function MenuSeparator({ className, ...props }, ref) {\n return (\n <RadixMenu.Separator\n ref={ref}\n className={cn('bg-border my-1 h-[1px]', className)}\n {...props}\n />\n );\n },\n);\n\nMenuSeparator.displayName = 'MenuSeparator';\n\n/** Convenience export so consumers can `<DropdownMenu>...</DropdownMenu>`. */\nexport const DropdownMenu = RadixMenu.Root;\n","'use client';\n\nimport * as RadixHoverCard from '@radix-ui/react-hover-card';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const HoverCardRoot = RadixHoverCard.Root;\nexport const HoverCardTrigger = RadixHoverCard.Trigger;\nexport const HoverCardPortal = RadixHoverCard.Portal;\n\nexport const HoverCardContent = forwardRef<HTMLDivElement, RadixHoverCard.HoverCardContentProps>(\n function HoverCardContent({ className, sideOffset = 4, ...props }, ref) {\n return (\n <RadixHoverCard.Portal>\n <RadixHoverCard.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'rounded-base bg-panel border-border-strong z-popover border p-[14px] shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixHoverCard.Portal>\n );\n },\n);\n\nHoverCardContent.displayName = 'HoverCardContent';\n\nexport interface HoverCardProps extends RadixHoverCard.HoverCardProps {\n trigger: ReactNode;\n content: ReactNode;\n}\n\n/** Convenience wrapper — pass `trigger` and `content` as props. */\nexport function HoverCard({ trigger, content, ...rootProps }: HoverCardProps) {\n return (\n <RadixHoverCard.Root openDelay={200} closeDelay={120} {...rootProps}>\n <RadixHoverCard.Trigger asChild>{trigger}</RadixHoverCard.Trigger>\n <HoverCardContent>{content}</HoverCardContent>\n </RadixHoverCard.Root>\n );\n}\n","'use client';\n\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const PopoverRoot = RadixPopover.Root;\nexport const PopoverTrigger = RadixPopover.Trigger;\nexport const PopoverAnchor = RadixPopover.Anchor;\nexport const PopoverPortal = RadixPopover.Portal;\nexport const PopoverClose = RadixPopover.Close;\nexport const PopoverArrow = RadixPopover.Arrow;\n\nexport const PopoverContent = forwardRef<HTMLDivElement, RadixPopover.PopoverContentProps>(\n function PopoverContent({ className, align = 'start', sideOffset = 6, ...props }, ref) {\n return (\n <RadixPopover.Portal>\n <RadixPopover.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'bg-panel border-border-strong z-popover rounded-md border p-[6px] shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixPopover.Portal>\n );\n },\n);\n\nPopoverContent.displayName = 'PopoverContent';\n\n/**\n * Convenience export — the Radix Root with our default styles applied to Content.\n *\n * <Popover>\n * <PopoverTrigger asChild><Button>Open</Button></PopoverTrigger>\n * <PopoverContent>…</PopoverContent>\n * </Popover>\n */\nexport const Popover = RadixPopover.Root;\n","'use client';\n\nimport * as RadixToast from '@radix-ui/react-toast';\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type ToastVariant = 'default' | 'info' | 'ok' | 'warn' | 'err';\n\nexport interface ToastInput {\n /** Optional ID; auto-generated when omitted. Useful for `dismiss(id)`. */\n id?: string;\n variant?: ToastVariant;\n title: ReactNode;\n description?: ReactNode;\n /** Inline action — typically a Button. */\n action?: ReactNode;\n /** Auto-dismiss after N ms. Default 4000. Set to 0 to require manual dismiss. */\n duration?: number;\n}\n\ninterface ToastEntry extends ToastInput {\n id: string;\n}\n\ninterface ToastContextValue {\n toast: (t: ToastInput) => string;\n dismiss: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nconst variantIcon: Record<ToastVariant, string> = {\n default: '●',\n info: 'ℹ',\n ok: '✓',\n warn: '!',\n err: '×',\n};\n\nconst variantTextColor: Record<ToastVariant, string> = {\n default: 'text-text-dim',\n info: 'text-accent',\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n};\n\nconst variantBorderLeft: Record<ToastVariant, string> = {\n default: 'border-l-border',\n info: 'border-l-accent',\n ok: 'border-l-ok',\n warn: 'border-l-warn',\n err: 'border-l-err',\n};\n\n// Module-scope counter for auto-generated IDs. SSR-safe (no browser APIs)\n// and unique within a session — safer than `Math.random()` for keys.\nlet toastIdCounter = 0;\nconst nextToastId = () => `toast-${++toastIdCounter}`;\n\n/**\n * Wrap your app once at the root. Components inside can call `useToast()` to\n * push transient messages from anywhere.\n */\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastEntry[]>([]);\n\n const toast = useCallback((t: ToastInput) => {\n // Only dedupe when the consumer explicitly supplied an id — auto-generated\n // ids never collide, so the `find` would always miss. This makes\n // `toast({ id: 'save-status', ... })` a natural \"replace existing\" API.\n const explicitId = t.id;\n const id = explicitId ?? nextToastId();\n const entry = { ...t, id };\n setToasts((prev) => {\n if (explicitId !== undefined && prev.some((existing) => existing.id === explicitId)) {\n return prev.map((existing) => (existing.id === explicitId ? entry : existing));\n }\n return [...prev, entry];\n });\n return id;\n }, []);\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);\n\n return (\n <ToastContext.Provider value={value}>\n <RadixToast.Provider swipeDirection=\"right\">\n {children}\n {toasts.map((t) => (\n <ToastCard key={t.id} toast={t} onDismiss={() => dismiss(t.id)} />\n ))}\n <RadixToast.Viewport className=\"z-toast fixed right-5 bottom-5 flex w-[380px] max-w-[calc(100vw-40px)] flex-col gap-2 outline-none\" />\n </RadixToast.Provider>\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be inside <ToastProvider>');\n return ctx;\n}\n\ninterface ToastCardProps {\n toast: ToastEntry;\n onDismiss: () => void;\n}\n\nexport const ToastCard = forwardRef<HTMLLIElement, ToastCardProps>(function ToastCard(\n { toast, onDismiss },\n ref,\n) {\n const variant = toast.variant ?? 'default';\n return (\n <RadixToast.Root\n ref={ref}\n duration={toast.duration ?? 4000}\n onOpenChange={(open) => {\n if (!open) onDismiss();\n }}\n className={cn(\n 'bg-panel border-border pointer-events-auto rounded-md border border-l-[2px] p-3 shadow-lg',\n 'flex items-start gap-[10px]',\n 'data-[state=open]:animate-[ship-toast-in_220ms_var(--easing-out)]',\n variantBorderLeft[variant],\n )}\n >\n <span className={cn('mt-px text-[14px] leading-none', variantTextColor[variant])}>\n {variantIcon[variant]}\n </span>\n <div className=\"min-w-0 flex-1\">\n <RadixToast.Title className=\"text-text text-[13px] font-medium\">\n {toast.title}\n </RadixToast.Title>\n {toast.description && (\n <RadixToast.Description className=\"text-text-muted mt-[2px] text-[12px] leading-[1.5]\">\n {toast.description}\n </RadixToast.Description>\n )}\n {toast.action && <div className=\"mt-2\">{toast.action}</div>}\n </div>\n <RadixToast.Close\n aria-label=\"Dismiss\"\n className=\"text-text-dim hover:text-text -mt-px text-[15px] leading-none\"\n >\n ×\n </RadixToast.Close>\n </RadixToast.Root>\n );\n});\n\nToastCard.displayName = 'ToastCard';\n","'use client';\n\nimport * as RadixTooltip from '@radix-ui/react-tooltip';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Tooltip — small, transient label that appears on hover/focus.\n *\n * Wrap your app once in `<TooltipProvider>` (Radix's provider) for shared delay\n * configuration; a single tooltip can be used standalone via `<Tooltip>` shorthand.\n */\n\nexport const TooltipProvider = RadixTooltip.Provider;\nexport const TooltipRoot = RadixTooltip.Root;\nexport const TooltipTrigger = RadixTooltip.Trigger;\nexport const TooltipPortal = RadixTooltip.Portal;\nexport const TooltipArrow = RadixTooltip.Arrow;\n\nexport const TooltipContent = forwardRef<HTMLDivElement, RadixTooltip.TooltipContentProps>(\n function TooltipContent({ className, sideOffset = 6, ...props }, ref) {\n return (\n <RadixTooltip.Portal>\n <RadixTooltip.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-tooltip pointer-events-none rounded-sm px-2 py-[5px] text-[11px] whitespace-nowrap',\n 'bg-text text-bg',\n 'data-[state=delayed-open]:animate-[ship-pop-in_120ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixTooltip.Portal>\n );\n },\n);\n\nTooltipContent.displayName = 'TooltipContent';\n\nexport interface TooltipProps {\n /** Tooltip text/content. */\n content: ReactNode;\n /** Trigger element — usually a Button or IconButton. */\n children: ReactNode;\n /** Side: top (default) | right | bottom | left. */\n side?: RadixTooltip.TooltipContentProps['side'];\n /** Open/close delay in ms (overrides provider default). */\n delayDuration?: number;\n}\n\n/**\n * One-liner tooltip wrapper. Wraps a trigger child with the full Radix stack.\n * For composition (multiple triggers in a list), use the lower-level exports.\n */\nexport function Tooltip({ content, children, side = 'top', delayDuration = 400 }: TooltipProps) {\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <TooltipRoot>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side}>{content}</TooltipContent>\n </TooltipRoot>\n </TooltipProvider>\n );\n}\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Alert — inline messaging block. Four tones (accent / ok / warn / err) with a\n * matching glyph, a left accent rule, and an optional dismiss action.\n *\n * For interrupting alerts (errors that need acknowledgment) use AlertDialog.\n * For transient feedback use Toast.\n */\n\nexport type AlertTone = 'accent' | 'ok' | 'warn' | 'err';\n\nconst alertStyles = cva('flex items-start gap-3 rounded-base border bg-panel p-3 text-[13px]', {\n variants: {\n tone: {\n accent: 'border-border border-l-2 border-l-accent',\n ok: 'border-border border-l-2 border-l-ok',\n warn: 'border-border border-l-2 border-l-warn',\n err: 'border-border border-l-2 border-l-err',\n },\n },\n defaultVariants: { tone: 'accent' },\n});\n\nconst iconColorClass: Record<AlertTone, string> = {\n accent: 'text-accent',\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n};\n\nconst defaultGlyph: Record<AlertTone, string> = {\n accent: 'ℹ',\n ok: '✓',\n warn: '!',\n err: '×',\n};\n\nexport interface AlertProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'>, VariantProps<typeof alertStyles> {\n /** Bold title text. */\n title?: ReactNode;\n /** Body description. */\n description?: ReactNode;\n /** Icon override; defaults to a glyph matched to the tone. */\n icon?: ReactNode;\n /** Optional trailing actions (rendered to the right of the description). */\n action?: ReactNode;\n /**\n * Aria-live behavior for the alert. Default `'polite'`.\n *\n * Alerts that are part of the initial page render should leave this at the\n * default — `role=\"alert\"` (which is `aria-live=\"assertive\"`) interrupts the\n * screen reader on every page load. Set `'assertive'` only for urgent\n * alerts that appear *after* initial render. Set `'off'` to suppress\n * announcements entirely (still rendered, still has `role=\"status\"`).\n */\n live?: 'off' | 'polite' | 'assertive';\n}\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n tone = 'accent',\n title,\n description,\n icon,\n action,\n live = 'polite',\n className,\n children,\n ...props\n },\n ref,\n) {\n const t = (tone ?? 'accent') as AlertTone;\n return (\n <div\n ref={ref}\n role={live === 'assertive' ? 'alert' : 'status'}\n aria-live={live === 'off' ? undefined : live}\n className={cn(alertStyles({ tone }), className)}\n {...props}\n >\n <span aria-hidden className={cn('mt-[1px] text-[14px] leading-none', iconColorClass[t])}>\n {icon ?? defaultGlyph[t]}\n </span>\n <div className=\"min-w-0 flex-1\">\n {title && <div className=\"font-medium\">{title}</div>}\n {description && <div className=\"text-text-muted mt-[2px] text-[12px]\">{description}</div>}\n {children}\n </div>\n {action && <div className=\"ml-1 shrink-0\">{action}</div>}\n </div>\n );\n});\n\nAlert.displayName = 'Alert';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Banner — top-of-page notice. Spans the full width of its container, uses a\n * tinted background derived from the tone color, and supports `sticky`\n * positioning so it stays at the top of the viewport on scroll.\n */\n\nexport type BannerTone = 'accent' | 'ok' | 'warn' | 'err';\n\nconst bannerStyles = cva(\n 'flex items-center gap-3 border-b border-border px-[14px] py-2 text-[12px]',\n {\n variants: {\n tone: {\n accent: 'bg-[color-mix(in_oklab,var(--color-accent),transparent_82%)] text-accent',\n ok: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_82%)] text-ok',\n warn: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_82%)] text-warn',\n err: 'bg-[color-mix(in_oklab,var(--color-err),transparent_82%)] text-err',\n },\n sticky: {\n true: 'sticky top-0 z-sticky',\n false: '',\n },\n },\n defaultVariants: { tone: 'accent', sticky: false },\n },\n);\n\nconst defaultGlyph: Record<BannerTone, string> = {\n accent: '✦',\n ok: '✓',\n warn: '!',\n err: '×',\n};\n\nexport interface BannerProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof bannerStyles> {\n /** Override the leading glyph. */\n icon?: ReactNode;\n /** Optional trailing action (e.g., a link). Rendered with `ml-auto`. */\n action?: ReactNode;\n /**\n * Aria-live behavior for the banner. Default `'polite'`.\n *\n * Banners that are part of the initial page render should leave this at the\n * default — `role=\"alert\"` (which is `aria-live=\"assertive\"`) interrupts the\n * screen reader on every page load. Set `'assertive'` only for urgent\n * banners that appear *after* initial render. Set `'off'` to suppress\n * announcements entirely (still rendered, still has `role=\"status\"`).\n */\n live?: 'off' | 'polite' | 'assertive';\n}\n\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(\n { tone = 'accent', sticky, icon, action, live = 'polite', className, children, ...props },\n ref,\n) {\n const t = (tone ?? 'accent') as BannerTone;\n return (\n <div\n ref={ref}\n role={live === 'assertive' ? 'alert' : 'status'}\n aria-live={live === 'off' ? undefined : live}\n className={cn(bannerStyles({ tone, sticky }), className)}\n {...props}\n >\n <span aria-hidden className=\"leading-none\">\n {icon ?? defaultGlyph[t]}\n </span>\n <div className=\"min-w-0 flex-1\">{children}</div>\n {action && <div className=\"ml-auto\">{action}</div>}\n </div>\n );\n});\n\nBanner.displayName = 'Banner';\n","'use client';\n\nimport {\n Children,\n forwardRef,\n isValidElement,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Breadcrumbs — composed of `<Crumb>` children. The last crumb is treated as\n * the current page (rendered as plain text with `aria-current=\"page\"`); earlier\n * crumbs render as links if `href` is provided. Pass `separator` to swap the\n * default `/` divider.\n */\n\nexport interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {\n /** Element to render between crumbs. Defaults to a dim `/`. */\n separator?: ReactNode;\n}\n\nexport const Breadcrumbs = forwardRef<HTMLElement, BreadcrumbsProps>(function Breadcrumbs(\n { separator = '/', className, children, ...props },\n ref,\n) {\n const crumbs = Children.toArray(children).filter(isValidElement) as ReactElement<CrumbProps>[];\n const last = crumbs.length - 1;\n return (\n <nav ref={ref} aria-label=\"Breadcrumb\" className={cn('text-[13px]', className)} {...props}>\n <ol className=\"text-text-muted flex flex-wrap items-center gap-[6px]\">\n {crumbs.map((crumb, i) => {\n const isCurrent = i === last;\n return (\n <li key={i} className=\"inline-flex items-center gap-[6px]\">\n {isCurrent ? <Crumb {...crumb.props} current /> : crumb}\n {!isCurrent && (\n <span aria-hidden className=\"text-text-dim\">\n {separator}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n});\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n\nexport interface CrumbProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Marks this crumb as the current page — disables the link and applies emphasis styling. */\n current?: boolean;\n}\n\nexport const Crumb = forwardRef<HTMLAnchorElement, CrumbProps>(function Crumb(\n { current, className, href, children, ...props },\n ref,\n) {\n if (current) {\n return (\n <span aria-current=\"page\" className={cn('text-text', className)}>\n {children}\n </span>\n );\n }\n if (href === undefined) {\n return <span className={cn('text-text-dim', className)}>{children}</span>;\n }\n return (\n <a\n ref={ref}\n href={href}\n className={cn('hover:text-text transition-colors duration-(--duration-micro)', className)}\n {...props}\n >\n {children}\n </a>\n );\n});\n\nCrumb.displayName = 'Crumb';\n","'use client';\n\nimport {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { useKeyboardList } from '../../hooks/useKeyboardList';\nimport { useOutsideClick } from '../../hooks/useOutsideClick';\nimport { cn } from '../../utils/cn';\n\n/**\n * Combobox — text input with an attached, type-to-filter listbox. Implements\n * the WAI-ARIA combobox pattern (input owns focus; listbox is referenced via\n * aria-controls; highlighted option via aria-activedescendant).\n *\n * Selection (`value`) and the visible query are independent. Selecting an\n * option syncs the query to the option's label so the user sees what was\n * picked; subsequent typing reopens the list and re-filters.\n */\n\nexport type ComboboxOption =\n | string\n | {\n value: string;\n label?: ReactNode;\n description?: ReactNode;\n /** Disable selection without removing the option from the list. */\n disabled?: boolean;\n };\n\nexport interface ComboboxProps {\n /** Available options. Strings are normalized to `{ value, label: value }`. */\n options: ReadonlyArray<ComboboxOption>;\n /** Controlled selected option value. */\n value?: string;\n /** Default selected value (uncontrolled). */\n defaultValue?: string;\n /** Fires with the option's `value` when a selection is committed. */\n onValueChange?: (value: string) => void;\n /** Controlled query. */\n query?: string;\n /** Default query (uncontrolled). */\n defaultQuery?: string;\n /** Fires whenever the query changes. */\n onQueryChange?: (query: string) => void;\n placeholder?: string;\n /** Custom matcher. Default: case-insensitive substring on label/description. */\n filter?: (option: NormalizedOption, query: string) => boolean;\n /** Empty-state node rendered when filtering yields nothing. */\n emptyState?: ReactNode;\n /** Pixel or CSS width of the wrapper. Default 260. */\n width?: number | string;\n disabled?: boolean;\n name?: string;\n id?: string;\n 'aria-label'?: string;\n}\n\nexport interface NormalizedOption {\n value: string;\n label: ReactNode;\n description?: ReactNode;\n searchText: string;\n disabled?: boolean;\n}\n\nfunction normalize(option: ComboboxOption): NormalizedOption {\n if (typeof option === 'string') {\n return { value: option, label: option, searchText: option.toLowerCase() };\n }\n const labelString =\n typeof option.label === 'string'\n ? option.label\n : typeof option.label === 'undefined'\n ? option.value\n : '';\n const descriptionString = typeof option.description === 'string' ? option.description : '';\n return {\n value: option.value,\n label: option.label ?? option.value,\n description: option.description,\n searchText: `${labelString} ${descriptionString}`.toLowerCase(),\n disabled: option.disabled,\n };\n}\n\nconst defaultFilter = (option: NormalizedOption, query: string) =>\n option.searchText.includes(query.toLowerCase());\n\nexport const Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n value: valueProp,\n defaultValue,\n onValueChange,\n query: queryProp,\n defaultQuery,\n onQueryChange,\n placeholder,\n filter = defaultFilter,\n emptyState,\n width = 260,\n disabled,\n name,\n id,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const reactId = useId();\n const listboxId = `${id ?? reactId}-listbox`;\n const inputId = id ?? `${reactId}-input`;\n\n const normalized = useMemo(() => options.map(normalize), [options]);\n\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n const initialQuery = useMemo(() => {\n if (defaultQuery !== undefined) return defaultQuery;\n if (defaultValue !== undefined) {\n const opt = normalized.find((o) => o.value === defaultValue);\n if (opt && typeof opt.label === 'string') return opt.label;\n }\n return '';\n }, [defaultQuery, defaultValue, normalized]);\n\n const [query, setQuery] = useControllableState<string>({\n value: queryProp,\n defaultValue: initialQuery,\n onChange: onQueryChange,\n });\n\n const [open, setOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useOutsideClick(wrapperRef, () => setOpen(false));\n\n const filtered = useMemo(\n () => (query ? normalized.filter((o) => filter(o, query)) : normalized),\n [normalized, query, filter],\n );\n\n const { cursor, setCursor, onKeyDown } = useKeyboardList({\n count: filtered.length,\n defaultCursor: 0,\n onSelect: (i) => {\n const item = filtered[i];\n if (item && !item.disabled) commit(item);\n },\n });\n\n useEffect(() => {\n setCursor(0);\n }, [query, setCursor]);\n\n function commit(option: NormalizedOption) {\n setValue(option.value);\n if (typeof option.label === 'string') setQuery(option.label);\n setOpen(false);\n }\n\n const handleKey = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') {\n setOpen(false);\n return;\n }\n if (!open && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {\n setOpen(true);\n }\n onKeyDown(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.relatedTarget as Node | null)) {\n setOpen(false);\n }\n };\n\n return (\n <div ref={wrapperRef} className=\"relative\" style={{ width }}>\n <input\n ref={ref}\n id={inputId}\n name={name}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-activedescendant={\n open && filtered.length > 0 ? `${listboxId}-option-${cursor}` : undefined\n }\n aria-label={ariaLabel}\n disabled={disabled}\n placeholder={placeholder}\n value={query ?? ''}\n onChange={(e) => {\n setQuery(e.target.value);\n setOpen(true);\n if (value !== undefined) setValue('');\n }}\n onFocus={() => setOpen(true)}\n onBlur={handleBlur}\n onKeyDown={handleKey}\n className={cn(\n 'border-border bg-panel text-text block w-full rounded-md border px-3 py-2 text-[13px] outline-none',\n 'transition-[border,box-shadow] duration-(--duration-micro)',\n 'placeholder:text-text-dim',\n 'focus-visible:border-accent focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n )}\n />\n {open && (\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-label={ariaLabel ?? 'Suggestions'}\n className={cn(\n 'z-dropdown absolute top-full right-0 left-0 mt-1 max-h-[220px] overflow-auto',\n 'border-border bg-panel rounded-md border p-1 shadow-lg',\n )}\n >\n {filtered.length === 0 ? (\n <li className=\"text-text-dim px-2 py-3 text-center text-[12px]\" role=\"presentation\">\n {emptyState ?? 'No matches'}\n </li>\n ) : (\n filtered.map((option, i) => {\n const isActive = i === cursor;\n return (\n <li\n key={option.value}\n id={`${listboxId}-option-${i}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={option.disabled || undefined}\n onMouseEnter={() => setCursor(i)}\n onMouseDown={(e) => {\n e.preventDefault(); // keep focus on input\n if (!option.disabled) commit(option);\n }}\n className={cn(\n 'text-text cursor-pointer rounded-sm px-[10px] py-2 text-[12px]',\n isActive && 'bg-accent-dim text-accent',\n option.disabled && 'pointer-events-none opacity-40',\n )}\n >\n <div>{option.label}</div>\n {option.description && (\n <div className=\"text-text-dim text-[11px]\">{option.description}</div>\n )}\n </li>\n );\n })\n )}\n </ul>\n )}\n {name && <input type=\"hidden\" name={name} value={value ?? ''} readOnly />}\n </div>\n );\n});\n\nCombobox.displayName = 'Combobox';\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, useEffect, useId, useMemo, type ReactNode } from 'react';\n\nimport { useKeyboardList } from '../../hooks/useKeyboardList';\nimport { cn } from '../../utils/cn';\n\n/**\n * CommandPalette — keyboard-driven command launcher. Built on Radix Dialog\n * (focus trap, Esc, scroll lock for free) with a controlled query input,\n * grouped results, and arrow-key navigation provided by `useKeyboardList`.\n *\n * The component is presentation-only over its results: the consumer owns the\n * query state and is responsible for filtering. Pass already-matched groups\n * via `groups`. For the common substring case, `filterCommandItems(query, …)`\n * is exported as a one-liner.\n */\n\nexport interface CommandPaletteItem {\n /** Stable id passed back to `onSelect`. */\n id: string;\n /** Visible label / title. */\n label: ReactNode;\n /** Secondary line beneath the label. */\n description?: ReactNode;\n /** Leading glyph or icon node. */\n glyph?: ReactNode;\n /** Trailing hint, often a kbd shortcut. */\n trailing?: ReactNode;\n /** Lower-cased haystack used by `filterCommandItems`. Defaults to `label + description`. */\n searchText?: string;\n}\n\nexport interface CommandPaletteGroup {\n /** Group heading label. */\n label?: ReactNode;\n items: ReadonlyArray<CommandPaletteItem>;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n query: string;\n onQueryChange: (query: string) => void;\n /** Already-matched, ready-to-render groups. Use `filterCommandItems` for the simple case. */\n groups: ReadonlyArray<CommandPaletteGroup>;\n /** Called with the item id when the user picks an item (click or Enter). */\n onSelect: (id: string) => void;\n /** Placeholder text for the search input. */\n placeholder?: string;\n /** Footer hint row (kbd legend). Accepts free-form children. */\n footer?: ReactNode;\n /** Empty-state node when groups resolve to zero items. */\n emptyState?: ReactNode;\n /** Pixel width of the palette panel. Default 540. */\n width?: number;\n}\n\nfunction flatItems(groups: ReadonlyArray<CommandPaletteGroup>): CommandPaletteItem[] {\n return groups.flatMap((g) => g.items as CommandPaletteItem[]);\n}\n\nexport const CommandPalette = forwardRef<HTMLDivElement, CommandPaletteProps>(\n function CommandPalette(\n {\n open,\n onOpenChange,\n query,\n onQueryChange,\n groups,\n onSelect,\n placeholder = 'Search…',\n footer,\n emptyState,\n width = 540,\n },\n ref,\n ) {\n const flat = useMemo(() => flatItems(groups), [groups]);\n const { cursor, setCursor, onKeyDown } = useKeyboardList({\n count: flat.length,\n defaultCursor: 0,\n onSelect: (i) => {\n const item = flat[i];\n if (item) onSelect(item.id);\n },\n });\n\n const reactId = useId();\n const listboxId = `${reactId}-listbox`;\n const optionId = (i: number) => `${listboxId}-option-${i}`;\n const hasMatches = flat.length > 0;\n\n // Reset the cursor whenever the query or groups shape changes.\n useEffect(() => {\n setCursor(0);\n }, [query, groups, setCursor]);\n\n return (\n <RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n className={cn(\n 'z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]',\n 'data-[state=open]:animate-[ship-fade-in_150ms_ease]',\n )}\n />\n <RadixDialog.Content\n ref={ref}\n aria-label=\"Command palette\"\n aria-describedby={undefined}\n style={{ width }}\n className={cn(\n 'z-modal fixed top-[20%] left-1/2 max-w-[calc(100%-40px)] -translate-x-1/2',\n 'border-border-strong bg-panel overflow-hidden rounded-xl border shadow-lg',\n 'outline-none data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]',\n )}\n onKeyDown={onKeyDown}\n >\n <RadixDialog.Title className=\"sr-only\">Command palette</RadixDialog.Title>\n <div className=\"border-border flex items-center gap-[10px] border-b px-4 py-[14px]\">\n <span aria-hidden className=\"text-text-dim\">\n ⌕\n </span>\n <input\n // Command palettes are launched via keyboard (⌘K); autofocusing\n // the search input is the entire point of the pattern.\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n type=\"text\"\n value={query}\n onChange={(e) => onQueryChange(e.target.value)}\n placeholder={placeholder}\n aria-label=\"Search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n // The listbox is always rendered while the palette is open\n // (even in the empty-state branch the container is mounted),\n // so `aria-expanded` is true whenever this input is mounted.\n aria-expanded\n aria-controls={listboxId}\n aria-activedescendant={hasMatches ? optionId(cursor) : undefined}\n className=\"text-text placeholder:text-text-dim flex-1 border-0 bg-transparent text-[14px] outline-none\"\n />\n <span className=\"border-border text-text-dim rounded-xs border px-[6px] py-[2px] font-mono text-[10px]\">\n ESC\n </span>\n </div>\n <div id={listboxId} className=\"min-h-[220px] p-2\" role=\"listbox\" aria-label=\"Results\">\n {flat.length === 0 ? (\n (emptyState ?? (\n <div className=\"text-text-dim px-3 py-5 text-center text-[12px]\">No matches</div>\n ))\n ) : (\n <CommandGroups\n groups={groups}\n cursor={cursor}\n setCursor={setCursor}\n onSelect={onSelect}\n optionId={optionId}\n />\n )}\n </div>\n {footer && (\n <div className=\"border-border text-text-dim flex gap-4 border-t px-[14px] py-[10px] font-mono text-[10px]\">\n {footer}\n </div>\n )}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n },\n);\n\nCommandPalette.displayName = 'CommandPalette';\n\ninterface CommandGroupsProps {\n groups: ReadonlyArray<CommandPaletteGroup>;\n cursor: number;\n setCursor: (i: number) => void;\n onSelect: (id: string) => void;\n optionId: (i: number) => string;\n}\n\nfunction CommandGroups({ groups, cursor, setCursor, onSelect, optionId }: CommandGroupsProps) {\n let runningIndex = 0;\n return (\n <>\n {groups.map((group, gIdx) => {\n if (group.items.length === 0) return null;\n return (\n <div key={gIdx}>\n {group.label && (\n <div className=\"text-text-dim px-2 pt-2 pb-1 font-mono text-[9px] tracking-[1.4px] uppercase\">\n {group.label} · {group.items.length}\n </div>\n )}\n {group.items.map((item) => {\n const myIndex = runningIndex++;\n const isActive = cursor === myIndex;\n return (\n <button\n key={item.id}\n id={optionId(myIndex)}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n onClick={() => onSelect(item.id)}\n onMouseEnter={() => setCursor(myIndex)}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-[10px] rounded-md border-0 bg-transparent px-[10px] py-2 text-left outline-none',\n isActive ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n )}\n >\n {item.glyph != null && (\n <span\n aria-hidden\n className={cn(\n 'font-mono text-[12px]',\n isActive ? 'text-accent' : 'text-text-muted',\n )}\n >\n {item.glyph}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[13px]\">{item.label}</span>\n {item.description && (\n <span className=\"text-text-dim block truncate text-[11px]\">\n {item.description}\n </span>\n )}\n </span>\n {item.trailing && (\n <span className=\"text-text-dim font-mono text-[10px]\">{item.trailing}</span>\n )}\n </button>\n );\n })}\n </div>\n );\n })}\n </>\n );\n}\n\n/**\n * Substring filter helper. Lower-cases `query` and matches any item whose\n * `searchText` (or computed `label + description`) contains it. Preserves\n * groups; drops empty ones.\n */\nexport function filterCommandItems(\n query: string,\n groups: ReadonlyArray<CommandPaletteGroup>,\n): CommandPaletteGroup[] {\n const q = query.trim().toLowerCase();\n if (!q) return groups.map((g) => ({ ...g, items: [...g.items] }));\n return groups\n .map((g) => ({\n ...g,\n items: g.items.filter((item) => {\n const haystack =\n item.searchText ??\n `${typeof item.label === 'string' ? item.label : ''} ${typeof item.description === 'string' ? item.description : ''}`;\n return haystack.toLowerCase().includes(q);\n }),\n }))\n .filter((g) => g.items.length > 0);\n}\n","'use client';\n\nimport { type Ref, useEffect, useMemo, useRef, type ReactNode } from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\n/**\n * DataTable — generic, sortable, selectable table. The component is a\n * \"headless-with-defaults\": you bring your data and column definitions, the\n * table handles sort state, selection (with indeterminate \"select-all\"),\n * sticky header, and basic ARIA.\n *\n * Sort: if a column declares an `accessor`, clicking its header toggles the\n * direction. Selection: pass `selectable` to render a checkbox column with a\n * select-all in the header.\n */\n\nexport interface DataTableColumn<T> {\n /** Stable id used for sorting state. */\n key: string;\n /** Header content. */\n header: ReactNode;\n /** Custom cell renderer. Defaults to the accessor's stringified value. */\n cell?: (row: T) => ReactNode;\n /** Returns the sort key for `row`. When omitted, the column is not sortable. */\n accessor?: (row: T) => string | number;\n align?: 'left' | 'right' | 'center';\n /** CSS width — string or number (px). */\n width?: number | string;\n}\n\nexport interface DataTableSort {\n key: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface DataTableProps<T> {\n data: ReadonlyArray<T>;\n columns: ReadonlyArray<DataTableColumn<T>>;\n /** Returns a stable id for `row`. Required for selection + React keys. */\n rowKey: (row: T) => string;\n /** Controlled sort state. */\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n /** Show the leading checkbox column. */\n selectable?: boolean;\n /** Controlled selection. */\n selected?: ReadonlySet<string>;\n defaultSelected?: ReadonlyArray<string>;\n onSelectionChange?: (selection: ReadonlySet<string>) => void;\n /** Rendered when `data` is empty. */\n emptyState?: ReactNode;\n /** Sticky table header (requires the table to live in a scroll container). */\n stickyHeader?: boolean;\n /** Caption for screen readers. */\n caption?: ReactNode;\n className?: string;\n}\n\nconst alignClass = {\n left: 'text-left',\n right: 'text-right',\n center: 'text-center',\n} as const;\n\n/**\n * Stable empty-set fallback for unset controlled `selected`. Using a single\n * frozen instance keeps `.has(id)` lookups cheap and avoids referential churn\n * in render-derived memos.\n */\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\n// Note: this is a generic component. The forwardRef helper loses the generic\n// type, so we keep it as a plain function and accept an optional ref via props.\nexport function DataTable<T>(props: DataTableProps<T> & { ref?: Ref<HTMLTableElement> }) {\n const {\n data,\n columns,\n rowKey,\n sort: sortProp,\n defaultSort,\n onSortChange,\n selectable,\n selected: selectedProp,\n defaultSelected,\n onSelectionChange,\n emptyState,\n stickyHeader,\n caption,\n className,\n ref,\n } = props;\n\n const [sort, setSort] = useControllableState<DataTableSort | null>({\n value: sortProp,\n defaultValue: defaultSort ?? null,\n onChange: onSortChange,\n });\n\n const [selected, setSelected] = useControllableState<ReadonlySet<string>>({\n value: selectedProp,\n defaultValue: new Set(defaultSelected ?? []),\n onChange: onSelectionChange,\n });\n\n const sortableMap = useMemo(() => {\n const m = new Map<string, DataTableColumn<T>>();\n for (const c of columns) if (c.accessor) m.set(c.key, c);\n return m;\n }, [columns]);\n\n const sortedData = useMemo(() => {\n if (!sort) return [...data];\n const col = sortableMap.get(sort.key);\n if (!col || !col.accessor) return [...data];\n const factor = sort.direction === 'asc' ? 1 : -1;\n return [...data].sort((a, b) => {\n const av = col.accessor!(a);\n const bv = col.accessor!(b);\n if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * factor;\n return String(av).localeCompare(String(bv)) * factor;\n });\n }, [data, sort, sortableMap]);\n\n const allIds = useMemo(() => sortedData.map(rowKey), [sortedData, rowKey]);\n const selectedSet = selected ?? EMPTY_SET;\n const allSelected = allIds.length > 0 && allIds.every((id) => selectedSet.has(id));\n const someSelected = !allSelected && allIds.some((id) => selectedSet.has(id));\n\n const headerCheckRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (headerCheckRef.current) headerCheckRef.current.indeterminate = someSelected;\n }, [someSelected]);\n\n const toggleSort = (key: string) => {\n const col = sortableMap.get(key);\n if (!col) return;\n setSort((prev) => {\n if (prev?.key !== key) return { key, direction: 'asc' };\n if (prev.direction === 'asc') return { key, direction: 'desc' };\n return null;\n });\n };\n\n const toggleAll = () => {\n setSelected((prev) => {\n const next = new Set(prev ?? []);\n if (allSelected) {\n for (const id of allIds) next.delete(id);\n } else {\n for (const id of allIds) next.add(id);\n }\n return next;\n });\n };\n\n const toggleRow = (id: string) => {\n setSelected((prev) => {\n const next = new Set(prev ?? []);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n return (\n <table ref={ref} className={cn('w-full border-collapse text-[12px]', className)}>\n {caption && <caption className=\"sr-only\">{caption}</caption>}\n <thead className={cn('bg-panel-2', stickyHeader && 'z-raised sticky top-0')}>\n <tr>\n {selectable && (\n <th scope=\"col\" className=\"border-border w-8 border-b px-3 py-2 text-left\">\n <input\n ref={headerCheckRef}\n type=\"checkbox\"\n aria-label=\"Select all rows\"\n checked={allSelected}\n onChange={toggleAll}\n className=\"cursor-pointer accent-[var(--color-accent)]\"\n />\n </th>\n )}\n {columns.map((col) => {\n const sortable = !!col.accessor;\n const isSorted = sort?.key === col.key;\n const ariaSort = !sortable\n ? undefined\n : isSorted\n ? sort?.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n const align = col.align ?? 'left';\n const indicator = sortable && isSorted && (\n <span aria-hidden className=\"ml-1\">\n {sort?.direction === 'asc' ? '↑' : '↓'}\n </span>\n );\n return (\n <th\n key={col.key}\n scope=\"col\"\n aria-sort={ariaSort}\n style={col.width != null ? { width: col.width } : undefined}\n className={cn(\n 'border-border border-b px-3 py-2 font-mono text-[10px] font-medium tracking-[1.4px] uppercase select-none',\n alignClass[align],\n sortable && 'cursor-pointer',\n isSorted ? 'text-accent' : 'text-text-dim',\n )}\n >\n {sortable ? (\n <button\n type=\"button\"\n onClick={() => toggleSort(col.key)}\n className=\"focus-visible:ring-accent-dim inline-flex cursor-pointer items-center gap-1 font-mono text-[10px] font-medium tracking-[1.4px] uppercase outline-none focus-visible:ring-[3px]\"\n >\n {col.header}\n {indicator}\n </button>\n ) : (\n col.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {sortedData.length === 0 && (\n <tr>\n <td\n colSpan={columns.length + (selectable ? 1 : 0)}\n className=\"text-text-dim px-3 py-8 text-center\"\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n )}\n {sortedData.map((row) => {\n const id = rowKey(row);\n const isSelected = selectedSet.has(id);\n return (\n <tr\n key={id}\n data-state={isSelected ? 'selected' : undefined}\n className={cn(\n 'border-border border-b transition-colors duration-(--duration-micro) last:border-0',\n isSelected ? 'bg-accent-dim/50' : 'hover:bg-panel-2',\n )}\n >\n {selectable && (\n <td className=\"px-3 py-[10px]\">\n <input\n type=\"checkbox\"\n aria-label={`Select row ${id}`}\n checked={isSelected}\n onChange={() => toggleRow(id)}\n className=\"cursor-pointer accent-[var(--color-accent)]\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={cn('px-3 py-[10px]', alignClass[col.align ?? 'left'])}>\n {col.cell ? col.cell(row) : col.accessor ? String(col.accessor(row)) : null}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { IconButton } from '../../components/Button/IconButton';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\n/**\n * Calendar — single-month date grid. Displays the month named by\n * `month`/`year` (0-indexed month) and surfaces the selected date via\n * `value` / `onValueChange`.\n *\n * Uses native `Date` only (no external date lib). Days outside the current\n * month are not rendered (ShipIt's design uses leading whitespace, not\n * leading-/trailing-month grays).\n *\n * Keyboard model (APG date-picker):\n * - Arrow Left/Right: move focus ±1 day\n * - Arrow Up/Down: move focus ±1 week\n * - Home/End: jump to start/end of week\n * - PageUp/PageDown: ±1 month (also navigates the visible month)\n * - Roving tabindex: only the focused day cell is in the tab order.\n */\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst DAYS = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\nexport interface CalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'defaultValue'\n> {\n /** Currently selected date (controlled). */\n value?: Date;\n /** Default selected date (uncontrolled). */\n defaultValue?: Date;\n /** Fires with the newly selected date. */\n onValueChange?: (date: Date) => void;\n /** Currently visible month (0-indexed) and year. */\n month?: number;\n year?: number;\n /** Default visible month (0-indexed) and year (uncontrolled). */\n defaultMonth?: number;\n defaultYear?: number;\n /** Fires when the visible month changes. */\n onVisibleMonthChange?: (params: { month: number; year: number }) => void;\n /** Optional disable predicate. */\n isDateDisabled?: (date: Date) => boolean;\n}\n\nfunction isSameDay(a: Date | undefined, b: Date) {\n if (!a) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction clampDay(year: number, month: number, day: number) {\n const max = new Date(year, month + 1, 0).getDate();\n return Math.min(Math.max(1, day), max);\n}\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(function Calendar(\n {\n value,\n defaultValue,\n onValueChange,\n month: monthProp,\n year: yearProp,\n defaultMonth,\n defaultYear,\n onVisibleMonthChange,\n isDateDisabled,\n className,\n ...props\n },\n ref,\n) {\n // Stable \"today\" so render is deterministic across re-renders within a\n // session. We still gate today-specific markup behind a post-hydration\n // flag so the server-rendered HTML never includes today-only attrs/classes\n // (avoids hydration mismatches at midnight or across clock-skewed servers).\n const [today] = useState(() => new Date());\n const [hydrated, setHydrated] = useState(false);\n useEffect(() => setHydrated(true), []);\n\n const [selectedDate, setSelectedDate] = useControllableState<Date>({\n value,\n defaultValue,\n onChange: onValueChange,\n });\n\n const initialMonth = defaultMonth ?? defaultValue?.getMonth() ?? today.getMonth();\n const initialYear = defaultYear ?? defaultValue?.getFullYear() ?? today.getFullYear();\n const [internalMonth, setInternalMonth] = useState(initialMonth);\n const [internalYear, setInternalYear] = useState(initialYear);\n\n const month = monthProp ?? internalMonth;\n const year = yearProp ?? internalYear;\n const isControlled = monthProp !== undefined && yearProp !== undefined;\n\n const setVisible = useCallback(\n (m: number, y: number) => {\n if (!isControlled) {\n setInternalMonth(m);\n setInternalYear(y);\n }\n onVisibleMonthChange?.({ month: m, year: y });\n },\n [isControlled, onVisibleMonthChange],\n );\n\n const goPrev = useCallback(() => {\n const m = month === 0 ? 11 : month - 1;\n const y = month === 0 ? year - 1 : year;\n setVisible(m, y);\n }, [month, year, setVisible]);\n const goNext = useCallback(() => {\n const m = month === 11 ? 0 : month + 1;\n const y = month === 11 ? year + 1 : year;\n setVisible(m, y);\n }, [month, year, setVisible]);\n\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n\n // Roving-tabindex focus state. Defaults to the selected day, then today\n // (only after hydration), then day 1. We track focus by full date so we\n // can carry it across month boundaries when Arrow / PageUp / PageDown\n // crosses into the next/prev month.\n const [focusedDate, setFocusedDate] = useState<Date>(() => {\n if (selectedDate) return selectedDate;\n return new Date(initialYear, initialMonth, 1);\n });\n\n // If the selected date changes (controlled mode), follow it.\n useEffect(() => {\n if (selectedDate) setFocusedDate(selectedDate);\n }, [selectedDate]);\n\n // If the focused date isn't in the visible month, clamp it so the\n // currently-rendered grid always has a `tabIndex=0` cell.\n const focusedInVisibleMonth =\n focusedDate.getMonth() === month && focusedDate.getFullYear() === year;\n const effectiveFocusDay = focusedInVisibleMonth\n ? focusedDate.getDate()\n : clampDay(year, month, focusedDate.getDate());\n\n const dayRefs = useRef<Map<number, HTMLButtonElement | null>>(new Map());\n const shouldFocusRef = useRef(false);\n\n // After a keyboard navigation that crossed months, move DOM focus to the\n // newly-focused day in the now-rendered grid.\n useEffect(() => {\n if (!shouldFocusRef.current) return;\n shouldFocusRef.current = false;\n const node = dayRefs.current.get(effectiveFocusDay);\n node?.focus();\n }, [effectiveFocusDay, month, year]);\n\n const moveFocus = useCallback(\n (next: Date) => {\n setFocusedDate(next);\n shouldFocusRef.current = true;\n const nextMonth = next.getMonth();\n const nextYear = next.getFullYear();\n if (nextMonth !== month || nextYear !== year) {\n setVisible(nextMonth, nextYear);\n }\n },\n [month, year, setVisible],\n );\n\n const onCellKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\n const current = new Date(year, month, day);\n let next: Date | null = null;\n let handled = true;\n switch (e.key) {\n case 'ArrowLeft':\n next = new Date(year, month, day - 1);\n break;\n case 'ArrowRight':\n next = new Date(year, month, day + 1);\n break;\n case 'ArrowUp':\n next = new Date(year, month, day - 7);\n break;\n case 'ArrowDown':\n next = new Date(year, month, day + 7);\n break;\n case 'Home': {\n const dow = current.getDay();\n next = new Date(year, month, day - dow);\n break;\n }\n case 'End': {\n const dow = current.getDay();\n next = new Date(year, month, day + (6 - dow));\n break;\n }\n case 'PageUp': {\n const targetMonth = month === 0 ? 11 : month - 1;\n const targetYear = month === 0 ? year - 1 : year;\n const targetDay = clampDay(targetYear, targetMonth, day);\n next = new Date(targetYear, targetMonth, targetDay);\n break;\n }\n case 'PageDown': {\n const targetMonth = month === 11 ? 0 : month + 1;\n const targetYear = month === 11 ? year + 1 : year;\n const targetDay = clampDay(targetYear, targetMonth, day);\n next = new Date(targetYear, targetMonth, targetDay);\n break;\n }\n default:\n handled = false;\n }\n if (handled && next) {\n e.preventDefault();\n moveFocus(next);\n }\n },\n [month, year, moveFocus],\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={`${MONTHS[month]} ${year}`}\n className={cn(\n 'rounded-base border-border bg-panel w-[280px] border p-4 shadow-lg',\n className,\n )}\n {...props}\n >\n <div className=\"mb-3 flex items-center justify-between\">\n <span className=\"text-[13px] font-medium\" aria-live=\"polite\">\n {MONTHS[month]} {year}\n </span>\n <div className=\"flex gap-1\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon=\"‹\"\n aria-label=\"Previous month\"\n onClick={goPrev}\n />\n <IconButton size=\"sm\" variant=\"ghost\" icon=\"›\" aria-label=\"Next month\" onClick={goNext} />\n </div>\n </div>\n {/*\n APG date-grid: outer `role=\"grid\"`, weekday header as a `row` of\n `columnheader` cells, then one `row` per week containing\n `gridcell`-wrapped buttons. `aria-selected` requires this grid\n ancestry to be valid ARIA.\n */}\n <div role=\"grid\" aria-label={`${MONTHS[month]} ${year}`} className=\"flex flex-col gap-[2px]\">\n <div role=\"row\" className=\"grid grid-cols-7 gap-[2px]\">\n {DAYS.map((d, i) => (\n <div\n key={i}\n role=\"columnheader\"\n aria-label={\n ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][i]\n }\n className=\"text-text-dim p-1 text-center font-mono text-[10px]\"\n >\n {d}\n </div>\n ))}\n </div>\n {(() => {\n const totalCells = firstDayOfMonth + daysInMonth;\n const rowCount = Math.ceil(totalCells / 7);\n const rows: ReactNode[] = [];\n for (let r = 0; r < rowCount; r++) {\n const cells: ReactNode[] = [];\n for (let c = 0; c < 7; c++) {\n const cellIndex = r * 7 + c;\n const dayNum = cellIndex - firstDayOfMonth + 1;\n if (dayNum < 1 || dayNum > daysInMonth) {\n cells.push(<div key={`pad-${r}-${c}`} role=\"gridcell\" aria-hidden />);\n continue;\n }\n const date = new Date(year, month, dayNum);\n const isSelected = isSameDay(selectedDate, date);\n const isToday = hydrated && isSameDay(today, date);\n const disabled = isDateDisabled?.(date) ?? false;\n const isFocused = dayNum === effectiveFocusDay;\n const day = dayNum;\n cells.push(\n <div key={day} role=\"gridcell\" aria-selected={isSelected}>\n <button\n ref={(node) => {\n if (node) dayRefs.current.set(day, node);\n else dayRefs.current.delete(day);\n }}\n type=\"button\"\n disabled={disabled}\n aria-current={isToday ? 'date' : undefined}\n aria-label={date.toDateString()}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => {\n setSelectedDate(date);\n setFocusedDate(date);\n }}\n onKeyDown={(e) => onCellKeyDown(e, day)}\n className={cn(\n 'w-full cursor-pointer rounded-xs border-0 bg-transparent py-[6px] text-center text-[12px] outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-30',\n !isSelected && !disabled && 'text-text hover:bg-panel-2',\n isSelected && 'bg-accent text-on-accent font-semibold',\n !isSelected && isToday && 'border-border-strong border',\n )}\n >\n {day}\n </button>\n </div>,\n );\n }\n rows.push(\n <div key={`row-${r}`} role=\"row\" className=\"grid grid-cols-7 gap-[2px]\">\n {cells}\n </div>,\n );\n }\n return rows;\n })()}\n </div>\n </div>\n );\n});\n\nCalendar.displayName = 'Calendar';\n","'use client';\n\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { forwardRef, useState, type ReactNode } from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\nimport { Calendar } from './Calendar';\n\n/**\n * DatePicker — a button-style trigger that opens a popover containing a\n * `Calendar`. Pass `value` / `onValueChange` for the selected date.\n */\n\nexport interface DatePickerProps {\n value?: Date;\n defaultValue?: Date;\n onValueChange?: (value: Date) => void;\n placeholder?: string;\n /** Format the selected date for display. Default: `toLocaleDateString()`. */\n format?: (date: Date) => string;\n /** Optional disable predicate forwarded to Calendar. */\n isDateDisabled?: (date: Date) => boolean;\n /** Pixel width of the trigger button. Default 200. */\n width?: number | string;\n disabled?: boolean;\n /** Content for the trigger when no date is selected. Defaults to `placeholder`. */\n emptyLabel?: ReactNode;\n 'aria-label'?: string;\n id?: string;\n name?: string;\n}\n\nconst defaultFormat = (d: Date) => d.toLocaleDateString();\n\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(function DatePicker(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n placeholder = 'Pick a date',\n format = defaultFormat,\n isDateDisabled,\n width = 200,\n disabled,\n emptyLabel,\n 'aria-label': ariaLabel,\n id,\n name,\n },\n ref,\n) {\n const [open, setOpen] = useState(false);\n const [value, setValue] = useControllableState<Date>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n return (\n <RadixPopover.Root open={open} onOpenChange={setOpen}>\n <RadixPopover.Trigger asChild>\n <button\n ref={ref}\n id={id}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel ?? placeholder}\n className={cn(\n 'border-border bg-panel text-text flex cursor-pointer items-center gap-2 rounded-md border px-3 py-2 text-left text-[13px] outline-none',\n 'transition-[border,box-shadow] duration-(--duration-micro)',\n 'hover:bg-panel-2',\n 'focus-visible:border-accent focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n )}\n style={{ width }}\n >\n <span aria-hidden className=\"text-text-dim\">\n ▢\n </span>\n <span className={cn('flex-1 truncate', !value && 'text-text-dim')}>\n {value ? format(value) : (emptyLabel ?? placeholder)}\n </span>\n </button>\n </RadixPopover.Trigger>\n <RadixPopover.Portal>\n <RadixPopover.Content\n align=\"start\"\n sideOffset={6}\n className=\"z-popover outline-none data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]\"\n >\n <Calendar\n value={value}\n defaultMonth={value?.getMonth()}\n defaultYear={value?.getFullYear()}\n onValueChange={(date) => {\n setValue(date);\n setOpen(false);\n }}\n isDateDisabled={isDateDisabled}\n />\n </RadixPopover.Content>\n </RadixPopover.Portal>\n {name && (\n <input type=\"hidden\" name={name} value={value ? value.toISOString() : ''} readOnly />\n )}\n </RadixPopover.Root>\n );\n});\n\nDatePicker.displayName = 'DatePicker';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Dots — progress dots for carousels and onboarding tours. The current dot\n * widens into a pill (per the handoff spec); the rest stay circular.\n */\n\nexport interface DotsProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Total dot count. */\n total: number;\n /** Zero-based index of the active dot. */\n current: number;\n /** Optional click handler — when provided, dots become focusable buttons. */\n onChange?: (index: number) => void;\n /** Accessible label. Defaults to `Progress`. */\n 'aria-label'?: string;\n}\n\nexport const Dots = forwardRef<HTMLElement, DotsProps>(function Dots(\n { total, current, onChange, className, 'aria-label': ariaLabel = 'Progress', ...props },\n ref,\n) {\n const interactive = typeof onChange === 'function';\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={cn('inline-flex items-center gap-[6px]', className)}\n {...props}\n >\n {Array.from({ length: total }).map((_, i) => {\n const isActive = i === current;\n const sharedClass = cn(\n 'h-[6px] rounded-full transition-[width,background] duration-(--duration-micro)',\n isActive ? 'w-[18px] bg-accent' : 'w-[6px] bg-panel-2',\n );\n if (interactive) {\n return (\n <button\n key={i}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n aria-current={isActive ? 'true' : undefined}\n onClick={() => onChange?.(i)}\n className={cn(\n sharedClass,\n 'cursor-pointer outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n !isActive && 'hover:bg-border-strong',\n )}\n />\n );\n }\n return <span key={i} aria-hidden className={sharedClass} />;\n })}\n </nav>\n );\n});\n\nDots.displayName = 'Dots';\n","'use client';\n\nimport {\n forwardRef,\n useState,\n type DragEvent,\n type LabelHTMLAttributes,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Dropzone — drag-and-drop file capture surface with a click-to-browse\n * fallback. Manages its own drag-over state and forwards file drops to\n * `onFiles`. Native `<input type=\"file\">` covers keyboard / a11y.\n */\n\nexport interface DropzoneProps extends Omit<\n LabelHTMLAttributes<HTMLLabelElement>,\n 'onDrop' | 'onDragOver' | 'onDragLeave' | 'title'\n> {\n /** Fired with the dropped or selected files. */\n onFiles?: (files: File[]) => void;\n /** Limit accepted MIME types or extensions. Forwarded to the hidden input + filtered on drop. */\n accept?: string;\n /** Allow multiple files. Default true. */\n multiple?: boolean;\n /** Heading text. Default \"Drop files to ingest\". */\n title?: ReactNode;\n /** Subtitle / hint text rendered below the title. */\n description?: ReactNode;\n /** Glyph at the top of the surface. Default `↥`. */\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nfunction listToArray(list: FileList | null): File[] {\n if (!list) return [];\n return Array.from(list);\n}\n\nexport const Dropzone = forwardRef<HTMLLabelElement, DropzoneProps>(function Dropzone(\n {\n onFiles,\n accept,\n multiple = true,\n title = 'Drop files to ingest',\n description,\n icon = '↥',\n disabled,\n className,\n ...props\n },\n ref,\n) {\n const [isDragging, setIsDragging] = useState(false);\n\n const onDragOver = (e: DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(true);\n };\n const onDragLeave = () => setIsDragging(false);\n const onDrop = (e: DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(false);\n const files = listToArray(e.dataTransfer.files);\n if (files.length) onFiles?.(files);\n };\n\n return (\n <label\n ref={ref}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n className={cn(\n 'rounded-base flex max-w-[420px] cursor-pointer flex-col items-center border-[1.5px] border-dashed p-8 text-center',\n 'transition-[background,border] duration-(--duration-micro)',\n 'focus-within:ring-accent-dim focus-within:ring-[3px]',\n isDragging\n ? 'border-accent bg-accent-dim'\n : 'border-border-strong bg-panel hover:bg-panel-2',\n disabled && 'pointer-events-none cursor-not-allowed opacity-50',\n className,\n )}\n {...props}\n >\n <input\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n aria-label={typeof title === 'string' ? title : 'Upload files'}\n className=\"sr-only\"\n onChange={(e) => {\n const files = listToArray(e.target.files);\n if (files.length) onFiles?.(files);\n e.target.value = '';\n }}\n />\n <div\n aria-hidden\n className={cn('mb-2 text-[28px]', isDragging ? 'text-accent' : 'text-text-dim')}\n >\n {icon}\n </div>\n <div className=\"mb-1 text-[13px] font-medium\">{title}</div>\n {description && <div className=\"text-text-dim text-[11px]\">{description}</div>}\n </label>\n );\n});\n\nDropzone.displayName = 'Dropzone';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * EmptyState — placeholder for empty lists, no-results states, and error\n * surfaces. A 48×48 icon plate sits above a title + description and an\n * optional action area (button or chip stack).\n *\n * Tone controls the icon plate color. Omit `tone` for a neutral plate (the\n * default for empty lists / no-results); pass `accent | ok | warn | err` to\n * signal semantic intent (e.g., `err` for sync failures).\n */\n\nconst plateStyles = cva('grid h-12 w-12 place-items-center rounded-base text-[22px]', {\n variants: {\n tone: {\n neutral: 'bg-panel-2 text-text-muted',\n accent: 'bg-accent-dim text-accent',\n ok: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_85%)] text-ok',\n warn: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_85%)] text-warn',\n err: 'bg-[color-mix(in_oklab,var(--color-err),transparent_85%)] text-err',\n },\n },\n defaultVariants: { tone: 'neutral' },\n});\n\ntype PlateVariantProps = VariantProps<typeof plateStyles>;\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Glyph or icon node shown in the rounded plate. */\n icon?: ReactNode;\n /** Title heading. */\n title: ReactNode;\n /** Body description. */\n description?: ReactNode;\n /** Optional primary action (e.g., a Button) below the description. */\n action?: ReactNode;\n /** Optional list of chip-style suggestions instead of (or below) the action. */\n chips?: ReadonlyArray<{ label: ReactNode; onClick?: () => void }>;\n /** Semantic tone for the icon plate. Omit for the neutral default. */\n tone?: Exclude<PlateVariantProps['tone'], 'neutral' | null | undefined> | undefined;\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n { icon, title, description, action, chips, tone, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-base border-border bg-panel flex flex-col items-center gap-[10px] border border-dashed p-6 text-center',\n className,\n )}\n {...props}\n >\n {icon != null && (\n <span aria-hidden className={plateStyles({ tone: tone ?? 'neutral' })}>\n {icon}\n </span>\n )}\n <div className=\"text-[14px] font-medium\">{title}</div>\n {description && (\n <div className=\"text-text-muted max-w-[260px] text-[12px] leading-[1.5]\">{description}</div>\n )}\n {chips && chips.length > 0 && (\n <div className=\"flex w-full flex-col gap-1\">\n {chips.map((c, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={c.onClick}\n className={cn(\n 'border-border bg-panel-2 text-text-muted cursor-pointer rounded-md border px-[10px] py-[6px] text-[11px]',\n 'hover:border-border-strong hover:text-text outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n )}\n >\n {c.label}\n </button>\n ))}\n </div>\n )}\n {action}\n </div>\n );\n});\n\nEmptyState.displayName = 'EmptyState';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * FileChip — file attachment chip with thumb, name, size, optional progress\n * bar, and a remove affordance. The thumb defaults to the file extension; pass\n * `icon` to override.\n */\n\nexport interface FileChipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Filename to display. */\n name: string;\n /** Right-of-name label (size, status). Often `2.4 MB` or `failed`. */\n size?: ReactNode;\n /** When set, renders a progress bar at the bottom (0..100). Used for upload UX. */\n progress?: number;\n /** Replace the file-extension thumb. */\n icon?: ReactNode;\n /** When provided, renders a remove (×) button. */\n onRemove?: () => void;\n /** When true, signals an error state (red status text + red bar). */\n failed?: boolean;\n}\n\nfunction deriveExt(name: string) {\n const dot = name.lastIndexOf('.');\n if (dot < 0) return 'FILE';\n return name\n .slice(dot + 1)\n .slice(0, 4)\n .toUpperCase();\n}\n\nexport const FileChip = forwardRef<HTMLDivElement, FileChipProps>(function FileChip(\n { name, size, progress, icon, onRemove, failed, className, ...props },\n ref,\n) {\n const ext = deriveExt(name);\n const showProgress = typeof progress === 'number';\n const isComplete = showProgress && progress >= 100;\n\n return (\n <div\n ref={ref}\n className={cn(\n 'border-border bg-panel-2 flex max-w-[320px] items-center gap-[10px] rounded-md border px-3 py-2',\n className,\n )}\n {...props}\n >\n <span\n aria-hidden\n className=\"border-border bg-panel text-text-dim grid h-6 w-6 shrink-0 place-items-center rounded-xs border font-mono text-[9px]\"\n >\n {icon ?? ext}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-[12px] font-medium\">{name}</div>\n <div className={cn('font-mono text-[10px]', failed ? 'text-err' : 'text-text-dim')}>\n {size}\n {showProgress && !isComplete && <span> · {Math.round(progress)}%</span>}\n </div>\n {showProgress && !isComplete && (\n <div className=\"bg-panel mt-1 h-[2px] overflow-hidden rounded-full\">\n <div\n className={cn(\n 'h-full transition-[width] duration-(--duration-step)',\n failed ? 'bg-err' : 'bg-accent',\n )}\n style={{ width: `${Math.max(0, Math.min(100, progress))}%` }}\n />\n </div>\n )}\n </div>\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${name}`}\n onClick={onRemove}\n className={cn(\n 'text-text-dim cursor-pointer border-0 bg-transparent p-0 text-[14px] leading-none',\n 'hover:text-text focus-visible:ring-accent-dim rounded-xs outline-none focus-visible:ring-[3px]',\n )}\n >\n ×\n </button>\n )}\n </div>\n );\n});\n\nFileChip.displayName = 'FileChip';\n","'use client';\n\nimport * as RadixMenubar from '@radix-ui/react-menubar';\nimport { forwardRef, type FC, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Menubar — desktop-style horizontal menu strip (File, Edit, View, …) built on\n * Radix Menubar. Owns ARIA + keyboard semantics; ShipIt owns styling.\n *\n * Compose with `<MenubarMenu>` per top-level entry. Inside each menu use\n * `<MenubarTrigger>` (the visible button), `<MenubarContent>` (the dropdown),\n * and `<MenuItem>` / `<MenuSeparator>` from the existing primitive surface.\n */\n\nexport const Menubar = forwardRef<HTMLDivElement, RadixMenubar.MenubarProps>(function Menubar(\n { className, ...props },\n ref,\n) {\n return (\n <RadixMenubar.Root\n ref={ref}\n className={cn(\n 'border-border bg-panel flex h-[30px] items-center gap-[2px] border-b px-3',\n className,\n )}\n {...props}\n />\n );\n});\n\nMenubar.displayName = 'Menubar';\n\nexport const MenubarMenu: FC<RadixMenubar.MenubarMenuProps> = RadixMenubar.Menu;\n\nexport const MenubarTrigger = forwardRef<HTMLButtonElement, RadixMenubar.MenubarTriggerProps>(\n function MenubarTrigger({ className, ...props }, ref) {\n return (\n <RadixMenubar.Trigger\n ref={ref}\n className={cn(\n 'text-text cursor-pointer rounded-xs border-0 bg-transparent px-[10px] py-1 text-[12px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'data-[state=open]:bg-panel-2 hover:bg-panel-2',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nMenubarTrigger.displayName = 'MenubarTrigger';\n\nexport const MenubarContent = forwardRef<HTMLDivElement, RadixMenubar.MenubarContentProps>(\n function MenubarContent({ className, sideOffset = 6, align = 'start', ...props }, ref) {\n return (\n <RadixMenubar.Portal>\n <RadixMenubar.Content\n ref={ref}\n sideOffset={sideOffset}\n align={align}\n className={cn(\n 'border-border-strong bg-panel z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixMenubar.Portal>\n );\n },\n);\n\nMenubarContent.displayName = 'MenubarContent';\n\nconst itemBase = cn(\n 'flex items-center gap-2 rounded-sm px-[10px] py-[6px] text-[12px] cursor-pointer outline-none',\n 'data-[highlighted]:bg-panel-2',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed',\n);\n\nexport interface MenubarItemProps extends RadixMenubar.MenubarItemProps {\n /** Trailing hint — typically a kbd shortcut. */\n trailing?: ReactNode;\n /** Style as destructive (red). */\n destructive?: boolean;\n}\n\nexport const MenubarItem = forwardRef<HTMLDivElement, MenubarItemProps>(function MenubarItem(\n { trailing, destructive, className, children, ...props },\n ref,\n) {\n return (\n <RadixMenubar.Item\n ref={ref}\n className={cn(itemBase, destructive ? 'text-err' : 'text-text', className)}\n {...props}\n >\n <span className=\"flex-1\">{children}</span>\n {trailing && <span className=\"text-text-dim font-mono text-[10px]\">{trailing}</span>}\n </RadixMenubar.Item>\n );\n});\n\nMenubarItem.displayName = 'MenubarItem';\n\nexport const MenubarSeparator = forwardRef<HTMLDivElement, RadixMenubar.MenubarSeparatorProps>(\n function MenubarSeparator({ className, ...props }, ref) {\n return (\n <RadixMenubar.Separator\n ref={ref}\n className={cn('bg-border my-1 h-px', className)}\n {...props}\n />\n );\n },\n);\n\nMenubarSeparator.displayName = 'MenubarSeparator';\n","'use client';\n\nimport * as RadixNav from '@radix-ui/react-navigation-menu';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react';\n\nimport { Drawer } from '../../components/Dialog/Drawer';\nimport { cn } from '../../utils/cn';\nimport { NavItem } from '../Sidebar';\n\n/**\n * NavBar — primary app navigation. The same component renders either as a\n * horizontal top bar (`orientation=\"horizontal\"`) or as a vertical side rail\n * (`orientation=\"vertical\"`); both layouts are driven by the same `items`\n * tree. Items can carry nested `children` to produce dropdowns on\n * horizontal and expand-collapse groups on vertical. Below `md` the bar\n * collapses to a hamburger that opens a Drawer rendering the items\n * vertically (set `responsive={false}` to opt out).\n *\n * Active state can be controlled (`value` + `onValueChange`) or uncontrolled\n * (`defaultValue`). Items with an `href` render as anchors; otherwise as\n * buttons that fire `onValueChange`.\n */\n\nexport interface NavBarItem {\n /** Stable identifier — what `value` / `onValueChange` reference. */\n id: string;\n label: ReactNode;\n /** Optional left-of-label icon node. */\n icon?: ReactNode;\n /** When set, item renders as an `<a>`; otherwise as a `<button>`. */\n href?: string;\n /** Trailing badge text. */\n badge?: ReactNode;\n disabled?: boolean;\n /** Nested items — dropdowns on horizontal, expand-groups on vertical. */\n children?: NavBarItem[];\n}\n\nexport type NavBarOrientation = 'horizontal' | 'vertical';\n\nexport interface NavBarProps extends Omit<HTMLAttributes<HTMLElement>, 'defaultValue' | 'title'> {\n /** Layout direction. Default `'horizontal'`. */\n orientation?: NavBarOrientation;\n /** Item tree driving the bar. */\n items: NavBarItem[];\n /**\n * Brand / logo slot rendered at the start. When `responsive` is `true`,\n * `brand` also seeds the mobile Drawer's accessible name, so it should\n * include text — e.g. `<><Logo /> ShipIt</>` rather than `<Logo />` alone.\n * Falls back to `'Navigation'` when omitted.\n */\n brand?: ReactNode;\n /** Trailing slot for secondary actions (avatar, settings, theme toggle, …). */\n actions?: ReactNode;\n /** Controlled active item id. */\n value?: string;\n /** Uncontrolled initial active item id. */\n defaultValue?: string;\n /** Fired when an item is activated. */\n onValueChange?: (id: string) => void;\n /** Pixel width of the vertical rail. Default 240. */\n width?: number;\n /** Collapse to a hamburger drawer below `md`. Default `true`. */\n responsive?: boolean;\n}\n\n/** Walks the tree to find whether `activeId` is `item` or any descendant. */\nfunction isActiveTree(item: NavBarItem, activeId: string | undefined): boolean {\n if (item.id === activeId) return true;\n return item.children?.some((c) => isActiveTree(c, activeId)) ?? false;\n}\n\nexport const NavBar = forwardRef<HTMLElement, NavBarProps>(function NavBar(\n {\n orientation = 'horizontal',\n items,\n brand,\n actions,\n value,\n defaultValue,\n onValueChange,\n width = 240,\n responsive = true,\n className,\n ...props\n },\n ref,\n) {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string | undefined>(defaultValue);\n const activeId = isControlled ? value : internalValue;\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const select = useCallback(\n (id: string) => {\n if (!isControlled) setInternalValue(id);\n onValueChange?.(id);\n },\n [isControlled, onValueChange],\n );\n\n const handleItemActivate = useCallback(\n (id: string) => {\n select(id);\n setDrawerOpen(false);\n },\n [select],\n );\n\n const drawerBody = (\n // Distinct aria-label from the desktop <aside>'s <nav> below — when the\n // drawer is open on a viewport that's resizing past `md`, both navs can\n // sit in the DOM together. Identical accessible names would trip axe's\n // `landmark-unique` rule.\n <nav aria-label=\"Mobile navigation\" className=\"flex flex-col gap-1\">\n {items.map((item) => (\n <VerticalItem\n key={item.id}\n item={item}\n activeId={activeId}\n onActivate={handleItemActivate}\n />\n ))}\n </nav>\n );\n\n // The mobile fallback is intentionally a <div>, not a <header>. The\n // desktop layout (rendered alongside, hidden via media query) already\n // owns the `banner` landmark — two co-existing <header>s in the DOM\n // would trip axe's `landmark-no-duplicate-banner` rule even though only\n // one is visible at a time.\n const mobileBar = responsive ? (\n <div\n className={cn(\n 'border-border bg-panel z-overlay sticky top-0 flex h-[52px] items-center gap-4 border-b px-5 md:hidden',\n )}\n >\n <button\n type=\"button\"\n onClick={() => setDrawerOpen(true)}\n aria-label=\"Open navigation\"\n className=\"text-text-muted hover:text-text focus-visible:ring-accent-dim rounded-xs px-2 py-1 text-[18px] outline-none focus-visible:ring-[3px]\"\n >\n ☰\n </button>\n {brand && (\n <div className=\"flex flex-1 items-center text-[13px] font-medium whitespace-nowrap\">\n {brand}\n </div>\n )}\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n ) : null;\n\n if (orientation === 'horizontal') {\n return (\n <>\n {mobileBar}\n <header\n ref={ref as React.Ref<HTMLElement>}\n className={cn(\n 'border-border bg-panel flex h-[52px] items-center gap-4 border-b px-5',\n responsive && 'hidden md:flex',\n className,\n )}\n {...props}\n >\n {brand && (\n <div className=\"shrink-0 text-[13px] font-medium whitespace-nowrap\">{brand}</div>\n )}\n <RadixNav.Root className=\"relative flex-1\" delayDuration={120}>\n {/* Reset list styling. Consumers may render NavBar inside a\n typography/prose wrapper (e.g. MDX content) that injects\n `list-style: disc` and `li { margin }` — neutralize both\n here so the bar looks the same everywhere. */}\n <RadixNav.List className=\"m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!\">\n {items.map((item) =>\n item.children?.length ? (\n <HorizontalDropdown\n key={item.id}\n item={item}\n active={isActiveTree(item, activeId)}\n activeId={activeId}\n onActivate={handleItemActivate}\n />\n ) : (\n <RadixNav.Item key={item.id}>\n <HorizontalLink\n item={item}\n active={item.id === activeId}\n onActivate={handleItemActivate}\n />\n </RadixNav.Item>\n ),\n )}\n </RadixNav.List>\n <div className=\"z-popover absolute top-full left-0 flex justify-start\">\n <RadixNav.Viewport className=\"origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]\" />\n </div>\n </RadixNav.Root>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </header>\n {responsive && (\n <Drawer\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n side=\"left\"\n title={brand ?? 'Navigation'}\n width={300}\n >\n {drawerBody}\n </Drawer>\n )}\n </>\n );\n }\n\n return (\n <>\n {mobileBar}\n <aside\n ref={ref as React.Ref<HTMLElement>}\n // Distinguishes this complementary landmark from any other <aside>\n // (e.g. a docs sidebar) that may sit alongside a vertical NavBar on\n // the same page — without it, axe's `landmark-unique` rule fires\n // when both asides land in the DOM.\n aria-label=\"Primary navigation\"\n style={{ width }}\n className={cn(\n 'border-border bg-panel flex h-full flex-col gap-2 border-r p-[14px]',\n responsive && 'hidden md:flex',\n className,\n )}\n {...props}\n >\n {brand && <div className=\"px-2 py-1 text-[13px] font-medium\">{brand}</div>}\n <nav aria-label=\"Sidebar navigation\" className=\"flex flex-1 flex-col gap-1 overflow-y-auto\">\n {items.map((item) => (\n <VerticalItem\n key={item.id}\n item={item}\n activeId={activeId}\n onActivate={handleItemActivate}\n />\n ))}\n </nav>\n {actions && (\n <div className=\"border-border mt-auto flex flex-col gap-2 border-t pt-3\">{actions}</div>\n )}\n </aside>\n {responsive && (\n <Drawer\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n side=\"left\"\n title={brand ?? 'Navigation'}\n width={300}\n >\n {drawerBody}\n </Drawer>\n )}\n </>\n );\n});\n\nNavBar.displayName = 'NavBar';\n\n// ---------- Internal sub-components ----------\n\ninterface HorizontalLinkProps {\n item: NavBarItem;\n active: boolean;\n onActivate: (id: string) => void;\n}\n\nfunction HorizontalLink({ item, active, onActivate }: HorizontalLinkProps) {\n const baseClass = cn(\n 'flex items-center gap-[6px] rounded-xs px-3 py-[6px] text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n item.disabled && 'pointer-events-none opacity-50',\n );\n const handleClick = (e: MouseEvent<HTMLElement>) => {\n if (item.disabled) {\n e.preventDefault();\n return;\n }\n onActivate(item.id);\n };\n const inner = (\n <>\n {item.icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n {item.badge != null && <ItemBadge active={active}>{item.badge}</ItemBadge>}\n </>\n );\n\n if (item.href) {\n return (\n <RadixNav.Link asChild active={active}>\n <a\n href={item.href}\n aria-current={active ? 'page' : undefined}\n aria-disabled={item.disabled || undefined}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </a>\n </RadixNav.Link>\n );\n }\n return (\n <RadixNav.Link asChild active={active}>\n <button\n type=\"button\"\n aria-current={active ? 'page' : undefined}\n disabled={item.disabled}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </button>\n </RadixNav.Link>\n );\n}\n\ninterface HorizontalDropdownProps {\n item: NavBarItem;\n active: boolean;\n activeId: string | undefined;\n onActivate: (id: string) => void;\n}\n\nfunction HorizontalDropdown({ item, active, activeId, onActivate }: HorizontalDropdownProps) {\n return (\n <RadixNav.Item>\n <RadixNav.Trigger\n // `group` on the Trigger lets descendants react to the Trigger's\n // own `data-state` attribute via `group-data-[state=open]:…`.\n // Without `group`, child variants like `data-[state=open]:rotate-180`\n // on the chevron span would target the span's own (absent) data-state.\n className={cn(\n 'group flex items-center gap-1 rounded-xs px-3 py-[6px] text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n 'data-[state=open]:bg-panel-2',\n )}\n disabled={item.disabled}\n >\n {item.icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n <span\n aria-hidden\n className=\"ml-1 text-[10px] opacity-70 transition-transform group-data-[state=open]:rotate-180\"\n >\n ▾\n </span>\n </RadixNav.Trigger>\n <RadixNav.Content className=\"border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg\">\n <ul className=\"m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!\">\n {item.children!.map((child) => (\n <li key={child.id}>\n <DropdownLink item={child} active={child.id === activeId} onActivate={onActivate} />\n </li>\n ))}\n </ul>\n </RadixNav.Content>\n </RadixNav.Item>\n );\n}\n\nfunction DropdownLink({ item, active, onActivate }: HorizontalLinkProps) {\n const baseClass = cn(\n 'flex w-full items-center gap-2 rounded-xs px-2 py-[6px] text-left text-[13px] outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n item.disabled && 'pointer-events-none opacity-50',\n );\n const handleClick = (e: MouseEvent<HTMLElement>) => {\n if (item.disabled) {\n e.preventDefault();\n return;\n }\n onActivate(item.id);\n };\n const inner = (\n <>\n {item.icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1\">{item.label}</span>\n {item.badge != null && <ItemBadge active={active}>{item.badge}</ItemBadge>}\n </>\n );\n if (item.href) {\n return (\n <RadixNav.Link asChild active={active}>\n <a\n href={item.href}\n aria-current={active ? 'page' : undefined}\n aria-disabled={item.disabled || undefined}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </a>\n </RadixNav.Link>\n );\n }\n return (\n <RadixNav.Link asChild active={active}>\n <button\n type=\"button\"\n aria-current={active ? 'page' : undefined}\n disabled={item.disabled}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </button>\n </RadixNav.Link>\n );\n}\n\ninterface VerticalItemProps {\n item: NavBarItem;\n activeId: string | undefined;\n onActivate: (id: string) => void;\n}\n\nfunction VerticalItem({ item, activeId, onActivate }: VerticalItemProps) {\n const hasChildren = (item.children?.length ?? 0) > 0;\n const treeActive = isActiveTree(item, activeId);\n // Default the group to expanded when a descendant is active; otherwise\n // collapsed. Consumers who want different behavior can rebuild the tree.\n const [open, setOpen] = useState(treeActive);\n // If the parent later moves activeId into this subtree (e.g. router push\n // to a descendant route while this group is collapsed), force the group\n // open so the active item is visible. Open-only: never auto-collapse —\n // the user may have closed the group deliberately. Driven from an effect\n // (not in-render ref mutation) so a discarded concurrent-mode render\n // can't leave the ref ahead of the committed state and skip the next\n // legitimate transition.\n const prevTreeActive = useRef(treeActive);\n useEffect(() => {\n if (treeActive && !prevTreeActive.current) setOpen(true);\n prevTreeActive.current = treeActive;\n }, [treeActive]);\n\n if (!hasChildren) {\n const handleClick = (e: MouseEvent<HTMLElement>) => {\n // Always notify; let the link navigate naturally when href is set.\n if (item.disabled) {\n e.preventDefault();\n return;\n }\n onActivate(item.id);\n };\n return (\n <NavItem\n icon={item.icon}\n label={item.label}\n active={item.id === activeId}\n badge={item.badge}\n disabled={item.disabled}\n href={item.href}\n onClick={handleClick}\n />\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n disabled={item.disabled}\n className={cn(\n 'flex w-full items-center gap-[10px] rounded-xs px-2 py-[6px] text-left text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n treeActive ? 'text-text' : 'text-text-muted',\n 'hover:bg-panel-2',\n item.disabled && 'pointer-events-none opacity-50',\n )}\n >\n {item.icon != null && (\n <span aria-hidden className=\"w-[14px] text-center opacity-80\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.badge != null && <ItemBadge active={treeActive}>{item.badge}</ItemBadge>}\n <span aria-hidden className=\"text-[10px] opacity-60\">\n {open ? '▾' : '▸'}\n </span>\n </button>\n {open && (\n <div className=\"border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3\">\n {item.children!.map((child) => (\n <VerticalItem key={child.id} item={child} activeId={activeId} onActivate={onActivate} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ItemBadge({ active, children }: { active: boolean; children: ReactNode }) {\n return (\n <span\n className={cn(\n 'rounded-xs px-[6px] py-px font-mono text-[10px]',\n active ? 'bg-accent text-on-accent' : 'bg-panel-2 text-text-muted',\n )}\n >\n {children}\n </span>\n );\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Sidebar — primary app navigation column. A simple flex column with the\n * panel background and a right border. Compose with `<NavItem>` and\n * `<NavSection>` for the standard ShipIt sidebar shape.\n */\n\nexport interface SidebarProps extends HTMLAttributes<HTMLElement> {\n /** Width in pixels. Default 240. */\n width?: number;\n}\n\nexport const Sidebar = forwardRef<HTMLElement, SidebarProps>(function Sidebar(\n { width = 240, className, style, ...props },\n ref,\n) {\n return (\n <aside\n ref={ref}\n style={{ width, ...style }}\n className={cn(\n 'border-border bg-panel flex h-full flex-col gap-2 border-r p-[14px]',\n className,\n )}\n {...props}\n />\n );\n});\n\nSidebar.displayName = 'Sidebar';\n\ntype NavItemBaseProps = {\n /** Left-side glyph or icon node. */\n icon?: ReactNode;\n /** Visible label. */\n label: ReactNode;\n /** Highlights the row in the accent palette. */\n active?: boolean;\n /** Optional trailing badge text. */\n badge?: ReactNode;\n /** Disabled / read-only display. */\n disabled?: boolean;\n};\n\nexport type NavItemProps = NavItemBaseProps &\n (\n | ({ href: string } & Omit<HTMLAttributes<HTMLAnchorElement>, keyof NavItemBaseProps>)\n | ({ href?: undefined } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, keyof NavItemBaseProps>)\n );\n\nexport const NavItem = forwardRef<HTMLAnchorElement | HTMLButtonElement, NavItemProps>(\n function NavItem({ icon, label, active, badge, href, disabled, className, ...props }, ref) {\n const inner = (\n <>\n {icon && (\n <span aria-hidden className=\"w-[14px] text-center opacity-80\">\n {icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{label}</span>\n {badge != null && (\n <span\n className={cn(\n 'rounded-xs px-[6px] py-px font-mono text-[10px]',\n active ? 'bg-accent text-on-accent' : 'bg-panel-2 text-text-muted',\n )}\n >\n {badge}\n </span>\n )}\n </>\n );\n const baseClass = cn(\n 'flex cursor-pointer items-center gap-[10px] rounded-xs px-2 py-[6px] text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n disabled && 'opacity-50 pointer-events-none',\n className,\n );\n if (href) {\n const anchorProps = props as HTMLAttributes<HTMLAnchorElement>;\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n aria-current={active ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n className={baseClass}\n {...anchorProps}\n >\n {inner}\n </a>\n );\n }\n // No href — render a real <button> so Enter/Space activation, focus\n // semantics, and disabled handling come from the platform.\n const buttonProps = props as ButtonHTMLAttributes<HTMLButtonElement>;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n aria-current={active ? 'page' : undefined}\n disabled={disabled}\n className={cn(baseClass, 'w-full text-left')}\n {...buttonProps}\n >\n {inner}\n </button>\n );\n },\n);\n\nNavItem.displayName = 'NavItem';\n\nexport interface NavSectionProps extends HTMLAttributes<HTMLDivElement> {\n /** Eyebrow heading. Rendered uppercase, mono, dim. */\n label: ReactNode;\n /** Optional leading glyph or icon node next to the eyebrow. */\n icon?: ReactNode;\n /** Optional trailing element next to the heading (e.g., a `+` add affordance). */\n action?: ReactNode;\n /**\n * When true, the eyebrow becomes a button that toggles the body. The body\n * is hidden when closed. Default `false` — the eyebrow stays static.\n */\n collapsible?: boolean;\n /** Uncontrolled initial open state. Default `true`. Ignored when `open` is provided. */\n defaultOpen?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Pixel indent applied to the body. Useful when this section nests other\n * sections — the indent visually anchors children to the eyebrow above.\n * A subtle left rail is drawn alongside the indent. Default `0`.\n */\n indent?: number;\n}\n\nexport const NavSection = forwardRef<HTMLDivElement, NavSectionProps>(function NavSection(\n {\n label,\n icon,\n action,\n collapsible = false,\n defaultOpen = true,\n open,\n onOpenChange,\n indent = 0,\n className,\n children,\n ...props\n },\n ref,\n) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n // `open`/`defaultOpen` only matter when `collapsible` is true. A\n // non-collapsible section has no toggle to recover from a hidden body,\n // so always render its children regardless of the (possibly stale)\n // `open` prop a caller may have passed alongside.\n const isOpen = !collapsible || (isControlled ? open : internalOpen);\n\n const toggle = useCallback(() => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n }, [isOpen, isControlled, onOpenChange]);\n\n const eyebrowClass =\n 'text-text-dim flex items-center gap-[6px] px-2 pt-2 font-mono text-[9px] tracking-[1.4px] uppercase';\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1', className)} {...props}>\n {collapsible ? (\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={toggle}\n className={cn(\n eyebrowClass,\n 'cursor-pointer rounded-xs outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'hover:text-text-muted',\n )}\n >\n {icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {icon}\n </span>\n )}\n <span className=\"flex-1 text-left\">{label}</span>\n {action}\n <span aria-hidden className=\"text-[10px] opacity-70\">\n {isOpen ? '▾' : '▸'}\n </span>\n </button>\n ) : (\n <div className={eyebrowClass}>\n {icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {icon}\n </span>\n )}\n <span className=\"flex-1\">{label}</span>\n {action}\n </div>\n )}\n {isOpen && (\n <div\n className={cn('flex flex-col gap-[2px]', indent > 0 && 'border-border ml-2 border-l')}\n style={indent > 0 ? { paddingLeft: indent } : undefined}\n >\n {children}\n </div>\n )}\n </div>\n );\n});\n\nNavSection.displayName = 'NavSection';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { IconButton } from '../../components/Button/IconButton';\nimport { cn } from '../../utils/cn';\n\n/**\n * Pagination — page selector for paginated lists/tables. Renders prev/next\n * arrows plus a compact range of numbered pages. Use `siblings` to control how\n * many pages flank the current page; ellipses are inserted automatically.\n */\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Currently selected page (1-indexed). */\n page: number;\n /** Total number of pages. */\n total: number;\n /** Called with the new page when the user clicks a page or arrow. */\n onPageChange: (page: number) => void;\n /** How many sibling pages to show on each side of the current page. Default 1. */\n siblings?: number;\n}\n\ntype PageItem = number | 'start-ellipsis' | 'end-ellipsis';\n\nfunction buildRange(page: number, total: number, siblings: number): PageItem[] {\n if (total <= 0) return [];\n const items: PageItem[] = [];\n const left = Math.max(2, page - siblings);\n const right = Math.min(total - 1, page + siblings);\n\n items.push(1);\n if (left > 2) items.push('start-ellipsis');\n for (let i = left; i <= right; i++) items.push(i);\n if (right < total - 1) items.push('end-ellipsis');\n if (total > 1) items.push(total);\n return items;\n}\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n { page, total, onPageChange, siblings = 1, className, ...props },\n ref,\n) {\n const items = buildRange(page, total, siblings);\n\n return (\n <nav\n ref={ref}\n aria-label=\"Pagination\"\n className={cn('inline-flex items-center gap-1', className)}\n {...props}\n >\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon=\"‹\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => onPageChange(Math.max(1, page - 1))}\n />\n {items.map((item, i) => {\n if (item === 'start-ellipsis' || item === 'end-ellipsis') {\n return (\n <span\n key={`ellipsis-${i}`}\n aria-hidden\n className=\"text-text-dim grid h-[26px] min-w-[26px] place-items-center px-2 font-mono text-[12px]\"\n >\n …\n </span>\n );\n }\n const isActive = item === page;\n return (\n <button\n key={item}\n type=\"button\"\n aria-label={`Go to page ${item}`}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onPageChange(item)}\n className={cn(\n 'h-[26px] min-w-[26px] rounded-[5px] px-2 font-mono text-[12px] outline-none',\n 'cursor-pointer transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n isActive\n ? 'bg-accent-dim text-accent border-accent border'\n : 'text-text-muted hover:bg-panel-2 hover:text-text border border-transparent',\n )}\n >\n {item}\n </button>\n );\n })}\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon=\"›\"\n aria-label=\"Next page\"\n disabled={page >= total}\n onClick={() => onPageChange(Math.min(total, page + 1))}\n />\n </nav>\n );\n});\n\nPagination.displayName = 'Pagination';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Progress — linear bar in determinate (`value`) or `indeterminate` mode.\n * Pass `label` for an accessible name and a visible label row above the bar.\n *\n * For value rounding: the bar's width is the raw value clamped to [0, max];\n * the label/aria-valuenow are rounded to whole percent.\n */\n\nconst trackStyles = cva('w-full rounded-full bg-panel-2 overflow-hidden', {\n variants: {\n size: {\n sm: 'h-[3px]',\n md: 'h-[4px]',\n lg: 'h-[6px]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst fillStyles = cva('h-full rounded-full transition-[width] duration-(--duration-step)', {\n variants: {\n tone: {\n accent: 'bg-accent',\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n },\n },\n defaultVariants: { tone: 'accent' },\n});\n\nexport interface ProgressProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role'>,\n VariantProps<typeof trackStyles>,\n VariantProps<typeof fillStyles> {\n /** Numeric progress, 0..max. Ignored when `indeterminate`. */\n value?: number;\n /** Maximum value. Default 100. */\n max?: number;\n /** When true, shows an indeterminate sliding pill instead of a determinate fill. */\n indeterminate?: boolean;\n /** Optional visible label (rendered above the bar with the percent). */\n label?: ReactNode;\n /** When false, hides the percent readout next to the label. Default true. */\n showValue?: boolean;\n}\n\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n {\n value = 0,\n max = 100,\n indeterminate = false,\n label,\n showValue = true,\n tone,\n size,\n className,\n ...props\n },\n ref,\n) {\n const clamped = Math.min(max, Math.max(0, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const display = Math.round(pct);\n\n return (\n <div ref={ref} className={cn('flex w-full flex-col gap-2', className)} {...props}>\n {label != null && (\n <div className=\"flex text-[12px]\">\n <span className=\"text-text-muted\">{label}</span>\n {showValue && !indeterminate && (\n <span className=\"text-text ml-auto font-mono tabular-nums\">{display}%</span>\n )}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : display}\n aria-label={typeof label === 'string' ? label : undefined}\n className={trackStyles({ size })}\n >\n {indeterminate ? (\n <span\n aria-hidden\n className={cn(\n 'block h-full w-[40%] rounded-full',\n fillStyles({ tone }),\n 'animate-[ship-indeterminate_1.4s_linear_infinite]',\n )}\n />\n ) : (\n <span aria-hidden className={fillStyles({ tone })} style={{ width: `${pct}%` }} />\n )}\n </div>\n </div>\n );\n});\n\nProgress.displayName = 'Progress';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * RadialProgress — circular SVG progress ring. Renders the percent label in the\n * center by default; pass `children` to override (e.g., a glyph or a count).\n *\n * Tones: accent (default) and ok (auto-applied when value === max).\n */\n\nexport type RadialTone = 'accent' | 'ok' | 'warn' | 'err';\n\nexport interface RadialProgressProps extends HTMLAttributes<HTMLDivElement> {\n /** Current value, 0..max. */\n value: number;\n /** Maximum value. Default 100. */\n max?: number;\n /** Pixel size of the SVG. Default 64. */\n size?: number;\n /** Stroke width. Default 4. */\n thickness?: number;\n /** Color tone. Auto-flips to `ok` on completion unless explicitly set. */\n tone?: RadialTone;\n /** Replaces the centered percent label. */\n children?: ReactNode;\n /** Accessible label. Falls back to `${pct}%`. */\n 'aria-label'?: string;\n}\n\nconst toneStrokeClass: Record<RadialTone, string> = {\n accent: 'stroke-accent',\n ok: 'stroke-ok',\n warn: 'stroke-warn',\n err: 'stroke-err',\n};\n\nexport const RadialProgress = forwardRef<HTMLDivElement, RadialProgressProps>(\n function RadialProgress(\n {\n value,\n max = 100,\n size = 64,\n thickness = 4,\n tone,\n children,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) {\n const clamped = Math.min(max, Math.max(0, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const r = (size - thickness) / 2;\n const c = 2 * Math.PI * r;\n const dash = (pct / 100) * c;\n const resolvedTone: RadialTone = tone ?? (clamped >= max ? 'ok' : 'accent');\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.round(pct)}\n aria-label={ariaLabel ?? `${Math.round(pct)}%`}\n className={cn('relative inline-grid place-items-center', className)}\n style={{ width: size, height: size }}\n {...props}\n >\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n strokeWidth={thickness}\n className=\"stroke-panel-2\"\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n strokeDasharray={`${dash} ${c}`}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n className={cn(\n 'transition-[stroke-dasharray] duration-(--duration-step)',\n toneStrokeClass[resolvedTone],\n )}\n />\n </svg>\n <div className=\"absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums\">\n {children ?? `${Math.round(pct)}%`}\n </div>\n </div>\n );\n },\n);\n\nRadialProgress.displayName = 'RadialProgress';\n","'use client';\n\nimport { forwardRef, useMemo, type SVGAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Sparkline — small inline SVG chart for showing trend at a glance. Computes\n * a polyline path from `values`; optionally fills the area under the line.\n *\n * The only chart we ship — the design system's stance on charting is that\n * production apps should bring their own (Recharts, Visx, etc.) when they\n * need anything more than a quiet trend cue.\n */\n\nexport interface SparklineProps extends Omit<\n SVGAttributes<SVGSVGElement>,\n 'children' | 'fill' | 'values'\n> {\n /** Numeric series. Drawn at uniform horizontal spacing. */\n values: ReadonlyArray<number>;\n /** Pixel width. Default 160. */\n width?: number;\n /** Pixel height. Default 32. */\n height?: number;\n /** Stroke color (CSS color or var). Defaults to `currentColor`. */\n stroke?: string;\n /** Stroke width. Default 1.5. */\n strokeWidth?: number;\n /** When true, fills the area under the line at 16% opacity. */\n fill?: boolean;\n /** Accessible label. Defaults to `Trend`. */\n 'aria-label'?: string;\n}\n\nfunction buildPath(values: ReadonlyArray<number>, w: number, h: number) {\n if (values.length === 0) return { line: '', area: '' };\n const pad = 2;\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min || 1;\n const stepX = values.length === 1 ? 0 : (w - pad * 2) / (values.length - 1);\n const points = values.map((v, i) => {\n const x = pad + i * stepX;\n const y = pad + (1 - (v - min) / range) * (h - pad * 2);\n return `${x.toFixed(2)},${y.toFixed(2)}`;\n });\n const line = `M${points.join(' L')}`;\n const area = `${line} L${(pad + (values.length - 1) * stepX).toFixed(2)},${(h - pad).toFixed(\n 2,\n )} L${pad.toFixed(2)},${(h - pad).toFixed(2)} Z`;\n return { line, area };\n}\n\nexport const Sparkline = forwardRef<SVGSVGElement, SparklineProps>(function Sparkline(\n {\n values,\n width = 160,\n height = 32,\n stroke = 'currentColor',\n strokeWidth = 1.5,\n fill = false,\n className,\n 'aria-label': ariaLabel = 'Trend',\n ...props\n },\n ref,\n) {\n const { line, area } = useMemo(() => buildPath(values, width, height), [values, width, height]);\n\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n className={cn('inline-block', className)}\n {...props}\n >\n {fill && <path d={area} fill={stroke} fillOpacity={0.16} stroke=\"none\" />}\n <path\n d={line}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n});\n\nSparkline.displayName = 'Sparkline';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/** Spinner — circular loading indicator. Three sizes. */\n\nconst sizes = {\n sm: { box: 'h-3 w-3', border: 'border-[2px]' },\n md: { box: 'h-4 w-4', border: 'border-[2px]' },\n lg: { box: 'h-5 w-5', border: 'border-[2px]' },\n} as const;\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: keyof typeof sizes;\n /** Accessible label. Defaults to `Loading`. */\n label?: string;\n}\n\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(function Spinner(\n { size = 'md', label = 'Loading', className, ...props },\n ref,\n) {\n const s = sizes[size];\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label={label}\n className={cn('inline-block', className)}\n {...props}\n >\n <span\n aria-hidden\n className={cn(\n 'border-panel-2 border-t-accent block animate-[ship-spin_0.7s_linear_infinite] rounded-full',\n s.box,\n s.border,\n )}\n />\n </span>\n );\n});\n\nSpinner.displayName = 'Spinner';\n","'use client';\n\nimport { forwardRef, Fragment, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Stepper — wizard / multi-step progress indicator. Computes done / current /\n * upcoming state from the `current` index so the consumer just passes labels.\n */\n\nexport type StepState = 'done' | 'current' | 'upcoming';\n\n/** A step in a Stepper. Pass either a bare string label or a `{ id?, label }` object. */\nexport type StepperStep = string | { id?: string; label: string };\n\nexport interface StepperProps extends HTMLAttributes<HTMLOListElement> {\n /**\n * Ordered steps. A step may be either a bare string label or an object\n * `{ id?, label }`. Use `id` to give React a stable key when two steps\n * share a label (e.g. [\"Plan\", \"Plan Review\"]).\n */\n steps: ReadonlyArray<StepperStep>;\n /** Zero-based index of the current step. Steps before are `done`, after are `upcoming`. */\n current: number;\n}\n\nconst dotBase =\n 'h-6 w-6 rounded-full grid place-items-center text-[11px] font-mono font-semibold border';\n\nconst dotStateClass: Record<StepState, string> = {\n done: 'bg-accent text-on-accent border-accent',\n current: 'bg-accent-dim text-accent border-accent',\n upcoming: 'bg-panel text-text-dim border-border',\n};\n\nconst labelStateClass: Record<StepState, string> = {\n done: 'text-text',\n current: 'text-text font-medium',\n upcoming: 'text-text-dim',\n};\n\nfunction stateFor(index: number, current: number): StepState {\n if (index < current) return 'done';\n if (index === current) return 'current';\n return 'upcoming';\n}\n\nexport const Stepper = forwardRef<HTMLOListElement, StepperProps>(function Stepper(\n { steps, current, className, ...props },\n ref,\n) {\n return (\n <ol\n ref={ref}\n aria-label=\"Progress\"\n className={cn('m-0 flex w-full list-none items-center p-0', className)}\n {...props}\n >\n {steps.map((step, i) => {\n const label = typeof step === 'string' ? step : step.label;\n const id = typeof step === 'string' ? undefined : step.id;\n const state = stateFor(i, current);\n const connectorActive = i < current;\n return (\n <Fragment key={id ?? i}>\n <li\n aria-current={state === 'current' ? 'step' : undefined}\n className=\"flex items-center gap-2\"\n >\n <span aria-hidden className={cn(dotBase, dotStateClass[state])}>\n {state === 'done' ? '✓' : i + 1}\n </span>\n <span className={cn('text-[12px]', labelStateClass[state])}>{label}</span>\n </li>\n {i < steps.length - 1 && (\n <span\n aria-hidden\n className={cn('mx-3 h-px flex-1', connectorActive ? 'bg-accent' : 'bg-border')}\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n});\n\nStepper.displayName = 'Stepper';\n","'use client';\n\nimport * as RadixTabs from '@radix-ui/react-tabs';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { createContext, forwardRef, useContext, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Tabs — two visual styles built on Radix Tabs.\n *\n * `variant=\"underline\"` (default) is the navigation tab style: text labels with\n * a moving 2px underline. `variant=\"pill\"` is the segmented-control style: a\n * rounded panel housing pill buttons. Both share Radix's keyboard semantics\n * (←/→ to move, Home/End to jump, Enter/Space to activate when activation is\n * manual).\n */\n\ntype TabsVariant = 'underline' | 'pill';\n\nconst TabsVariantContext = createContext<TabsVariant>('underline');\n\nconst tabsListStyles = cva('', {\n variants: {\n variant: {\n underline: 'flex gap-6 border-b border-border',\n pill: 'inline-flex gap-1 rounded-base border border-border bg-panel-2 p-[3px]',\n },\n },\n});\n\nconst tabsTriggerStyles = cva(\n 'cursor-pointer outline-none transition-colors duration-(--duration-micro) focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n {\n variants: {\n variant: {\n underline: cn(\n 'relative -mb-px inline-flex items-center px-[2px] py-2 text-[13px]',\n 'border-b-2 border-transparent text-text-muted',\n 'hover:text-text',\n 'data-[state=active]:border-accent data-[state=active]:text-text data-[state=active]:font-medium',\n ),\n pill: cn(\n 'inline-flex items-center rounded-sm px-[14px] py-[6px] text-[12px] font-normal',\n 'text-text-muted hover:text-text',\n 'data-[state=active]:bg-panel data-[state=active]:text-text data-[state=active]:font-medium',\n 'data-[state=active]:shadow-sm',\n ),\n },\n },\n },\n);\n\nexport interface TabsProps extends RadixTabs.TabsProps {\n /** Visual style — `underline` (default) or segmented `pill`. */\n variant?: TabsVariant;\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n { variant = 'underline', className, ...props },\n ref,\n) {\n return (\n <TabsVariantContext.Provider value={variant}>\n <RadixTabs.Root\n ref={ref}\n className={cn('flex flex-col', variant === 'underline' && 'gap-3', className)}\n {...props}\n />\n </TabsVariantContext.Provider>\n );\n});\n\nTabs.displayName = 'Tabs';\n\nexport const TabsList = forwardRef<HTMLDivElement, RadixTabs.TabsListProps>(function TabsList(\n { className, ...props },\n ref,\n) {\n const variant = useContext(TabsVariantContext);\n return (\n <RadixTabs.List ref={ref} className={cn(tabsListStyles({ variant }), className)} {...props} />\n );\n});\n\nTabsList.displayName = 'TabsList';\n\nexport interface TabProps extends RadixTabs.TabsTriggerProps {\n children?: ReactNode;\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { className, ...props },\n ref,\n) {\n const variant = useContext(TabsVariantContext);\n return (\n <RadixTabs.Trigger\n ref={ref}\n className={cn(tabsTriggerStyles({ variant }), className)}\n {...props}\n />\n );\n});\n\nTab.displayName = 'Tab';\n\nexport const TabsContent = forwardRef<HTMLDivElement, RadixTabs.TabsContentProps>(\n function TabsContent({ className, ...props }, ref) {\n return (\n <RadixTabs.Content\n ref={ref}\n className={cn(\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nTabsContent.displayName = 'TabsContent';\n\nexport type TabsVariantProps = VariantProps<typeof tabsTriggerStyles>;\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Timeline — vertical event list with a connecting rule between markers.\n * Pass `events` (preferred) for the simple shape, or compose with\n * `<TimelineItem>` children for custom layouts.\n */\n\nexport type TimelineEventTone = 'accent' | 'ok' | 'warn' | 'err' | 'muted';\n\nexport interface TimelineEvent {\n title: ReactNode;\n description?: ReactNode;\n /** Time label rendered in mono. */\n time?: ReactNode;\n /** Marker color tone. Defaults to `accent`. */\n tone?: TimelineEventTone;\n}\n\nexport interface TimelineProps extends HTMLAttributes<HTMLOListElement> {\n /** Convenience prop — when provided, renders `<TimelineItem>` for each event. */\n events?: ReadonlyArray<TimelineEvent>;\n}\n\nconst ringClass: Record<TimelineEventTone, string> = {\n accent: 'border-accent',\n ok: 'border-ok',\n warn: 'border-warn',\n err: 'border-err',\n muted: 'border-text-dim',\n};\n\nexport const Timeline = forwardRef<HTMLOListElement, TimelineProps>(function Timeline(\n { events, className, children, ...props },\n ref,\n) {\n return (\n <ol\n ref={ref}\n className={cn(\n 'relative pl-6',\n 'before:bg-border before:absolute before:top-[6px] before:bottom-[6px] before:left-[7px] before:w-px',\n className,\n )}\n {...props}\n >\n {events\n ? events.map((e, i) => (\n <TimelineItem key={i} tone={e.tone} time={e.time} description={e.description}>\n {e.title}\n </TimelineItem>\n ))\n : children}\n </ol>\n );\n});\n\nTimeline.displayName = 'Timeline';\n\nexport interface TimelineItemProps extends HTMLAttributes<HTMLLIElement> {\n tone?: TimelineEventTone;\n description?: ReactNode;\n time?: ReactNode;\n}\n\nexport const TimelineItem = forwardRef<HTMLLIElement, TimelineItemProps>(function TimelineItem(\n { tone = 'accent', description, time, className, children, ...props },\n ref,\n) {\n return (\n <li ref={ref} className={cn('relative mb-[18px] last:mb-0', className)} {...props}>\n <span\n aria-hidden\n className={cn(\n 'bg-bg absolute top-[4px] -left-6 h-[14px] w-[14px] rounded-full border-2',\n ringClass[tone],\n )}\n />\n <div className=\"text-[13px] font-medium\">{children}</div>\n {description && <div className=\"text-text-muted text-[12px]\">{description}</div>}\n {time && <div className=\"text-text-dim mt-[2px] font-mono text-[10px]\">{time}</div>}\n </li>\n );\n});\n\nTimelineItem.displayName = 'TimelineItem';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Topbar — slim header strip across the top of an app surface. The title\n * lives on the left, the rest of the row is yours via `actions` (search,\n * settings, avatar, etc.).\n */\n\nexport interface TopbarProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Title rendered on the left. */\n title?: ReactNode;\n /** Left-of-title slot — typically a logo or breadcrumbs. */\n leading?: ReactNode;\n /** Right-side action group. Rendered with `gap-3`. */\n actions?: ReactNode;\n}\n\nexport const Topbar = forwardRef<HTMLElement, TopbarProps>(function Topbar(\n { title, leading, actions, className, children, ...props },\n ref,\n) {\n return (\n <header\n ref={ref}\n className={cn(\n 'border-border bg-panel flex h-[52px] items-center gap-4 border-b px-5',\n className,\n )}\n {...props}\n >\n {leading}\n {title && <div className=\"text-[13px] font-medium\">{title}</div>}\n <div className=\"flex flex-1 items-center\" />\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n {children}\n </header>\n );\n});\n\nTopbar.displayName = 'Topbar';\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\n/**\n * Tree — recursive expandable list. Pass a nested `items` tree; the component\n * handles expand/collapse and selection state. Both can be uncontrolled\n * (`defaultExpanded` / `defaultValue`) or controlled (`expanded` / `value` +\n * change callbacks).\n *\n * Implements the WAI-ARIA tree pattern with roving tabindex and the standard\n * keyboard model (Up/Down/Left/Right/Home/End/Enter/Space).\n */\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\nexport interface TreeItem {\n id: string;\n label: ReactNode;\n /** Leading glyph or icon node. */\n icon?: ReactNode;\n /** Trailing badge / hint. */\n trailing?: ReactNode;\n children?: ReadonlyArray<TreeItem>;\n}\n\nexport interface TreeProps extends Omit<HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n /** Tree data. */\n items: ReadonlyArray<TreeItem>;\n /** Controlled set of expanded node ids. */\n expanded?: ReadonlySet<string>;\n /** Default expanded ids (uncontrolled). */\n defaultExpanded?: ReadonlyArray<string>;\n /** Fires with the new expanded set whenever a node toggles. */\n onExpandedChange?: (expanded: ReadonlySet<string>) => void;\n /** Controlled selected node id. */\n value?: string;\n /** Default selected (uncontrolled). */\n defaultValue?: string;\n /** Fires with the selected node id. */\n onValueChange?: (id: string) => void;\n}\n\ninterface FlatItem {\n id: string;\n level: number;\n hasChildren: boolean;\n parentId: string | null;\n}\n\nfunction flattenVisible(\n items: ReadonlyArray<TreeItem>,\n expanded: ReadonlySet<string>,\n level: number,\n parentId: string | null,\n out: FlatItem[],\n): void {\n for (const item of items) {\n const hasChildren = !!item.children && item.children.length > 0;\n out.push({ id: item.id, level, hasChildren, parentId });\n if (hasChildren && expanded.has(item.id)) {\n flattenVisible(item.children ?? [], expanded, level + 1, item.id, out);\n }\n }\n}\n\nexport const Tree = forwardRef<HTMLUListElement, TreeProps>(function Tree(\n {\n items,\n expanded: expandedProp,\n defaultExpanded,\n onExpandedChange,\n value: valueProp,\n defaultValue,\n onValueChange,\n className,\n onKeyDown,\n ...props\n },\n ref,\n) {\n const [expanded, setExpanded] = useControllableState<ReadonlySet<string>>({\n value: expandedProp,\n defaultValue: defaultExpanded ? new Set(defaultExpanded) : undefined,\n onChange: onExpandedChange,\n });\n\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n const expandedSet = expanded ?? EMPTY_SET;\n\n const flatVisible = useMemo<FlatItem[]>(() => {\n const out: FlatItem[] = [];\n flattenVisible(items, expandedSet, 1, null, out);\n return out;\n }, [items, expandedSet]);\n\n // Roving tabindex: track which item is the focus target.\n const [activeId, setActiveId] = useState<string | null>(null);\n\n // If activeId is no longer visible (parent collapsed), reset to a sensible default.\n useEffect(() => {\n if (activeId && !flatVisible.some((f) => f.id === activeId)) {\n setActiveId(null);\n }\n }, [activeId, flatVisible]);\n\n // The \"tab stop\" is: explicit activeId if visible, else the selected value if\n // visible, else the first visible item.\n const tabStopId = useMemo<string | null>(() => {\n if (activeId && flatVisible.some((f) => f.id === activeId)) return activeId;\n if (value && flatVisible.some((f) => f.id === value)) return value;\n return flatVisible[0]?.id ?? null;\n }, [activeId, flatVisible, value]);\n\n const listRef = useRef<HTMLUListElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLUListElement | null) => {\n listRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLUListElement | null>).current = node;\n },\n [ref],\n );\n\n const focusItem = useCallback((id: string) => {\n const root = listRef.current;\n if (!root) return;\n const el = root.querySelector<HTMLElement>(`[data-treeitem-id=\"${CSS.escape(id)}\"]`);\n el?.focus();\n }, []);\n\n const moveActive = useCallback(\n (id: string) => {\n setActiveId(id);\n // Focus on next paint so the DOM reflects any expansion change.\n queueMicrotask(() => focusItem(id));\n },\n [focusItem],\n );\n\n const toggle = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev ?? EMPTY_SET);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n },\n [setExpanded],\n );\n\n const expand = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const base = prev ?? EMPTY_SET;\n if (base.has(id)) return base;\n const next = new Set(base);\n next.add(id);\n return next;\n });\n },\n [setExpanded],\n );\n\n const collapse = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const base = prev ?? EMPTY_SET;\n if (!base.has(id)) return base;\n const next = new Set(base);\n next.delete(id);\n return next;\n });\n },\n [setExpanded],\n );\n\n const selectItem = useCallback(\n (id: string) => {\n setValue(id);\n },\n [setValue],\n );\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLUListElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (flatVisible.length === 0) return;\n\n const currentId = tabStopId;\n const currentIndex = currentId ? flatVisible.findIndex((f) => f.id === currentId) : -1;\n const current = currentIndex >= 0 ? flatVisible[currentIndex] : undefined;\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = flatVisible[Math.min(flatVisible.length - 1, currentIndex + 1)];\n if (next) moveActive(next.id);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = flatVisible[Math.max(0, currentIndex - 1)];\n if (prev) moveActive(prev.id);\n break;\n }\n case 'ArrowRight': {\n if (!current) return;\n e.preventDefault();\n if (current.hasChildren) {\n if (!expandedSet.has(current.id)) {\n expand(current.id);\n } else {\n // Move to first child (the next item in the flat visible list).\n const child = flatVisible[currentIndex + 1];\n if (child && child.parentId === current.id) moveActive(child.id);\n }\n }\n break;\n }\n case 'ArrowLeft': {\n if (!current) return;\n e.preventDefault();\n if (current.hasChildren && expandedSet.has(current.id)) {\n collapse(current.id);\n } else if (current.parentId) {\n moveActive(current.parentId);\n }\n break;\n }\n case 'Home': {\n e.preventDefault();\n const first = flatVisible[0];\n if (first) moveActive(first.id);\n break;\n }\n case 'End': {\n e.preventDefault();\n const last = flatVisible[flatVisible.length - 1];\n if (last) moveActive(last.id);\n break;\n }\n case 'Enter':\n case ' ': {\n if (!current) return;\n e.preventDefault();\n selectItem(current.id);\n if (current.hasChildren) toggle(current.id);\n break;\n }\n default:\n break;\n }\n },\n [\n collapse,\n expand,\n expandedSet,\n flatVisible,\n moveActive,\n onKeyDown,\n selectItem,\n tabStopId,\n toggle,\n ],\n );\n\n return (\n <ul\n ref={setRefs}\n role=\"tree\"\n className={cn('flex flex-col gap-px text-[12px]', className)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {items.map((item) => (\n <TreeItemRow\n key={item.id}\n item={item}\n level={1}\n expanded={expandedSet}\n selected={value}\n tabStopId={tabStopId}\n onFocusItem={setActiveId}\n onActivate={(id) => {\n setActiveId(id);\n selectItem(id);\n }}\n onToggle={toggle}\n />\n ))}\n </ul>\n );\n});\n\nTree.displayName = 'Tree';\n\ninterface TreeItemRowProps {\n item: TreeItem;\n level: number;\n expanded: ReadonlySet<string>;\n selected: string | undefined;\n tabStopId: string | null;\n onFocusItem: (id: string) => void;\n onActivate: (id: string) => void;\n onToggle: (id: string) => void;\n}\n\nfunction TreeItemRow({\n item,\n level,\n expanded,\n selected,\n tabStopId,\n onFocusItem,\n onActivate,\n onToggle,\n}: TreeItemRowProps) {\n const hasChildren = !!item.children && item.children.length > 0;\n const isExpanded = hasChildren && expanded.has(item.id);\n const isSelected = selected === item.id;\n const isTabStop = tabStopId === item.id;\n\n return (\n <li role=\"none\">\n {/* Keyboard activation lives on the parent <ul> via the APG roving-tabindex\n model, so this row's onClick has no per-element keydown handler. */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n <div\n role=\"treeitem\"\n data-treeitem-id={item.id}\n aria-level={level}\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-selected={isSelected}\n tabIndex={isTabStop ? 0 : -1}\n onFocus={(e) => {\n if (e.target === e.currentTarget) onFocusItem(item.id);\n }}\n onClick={() => {\n onActivate(item.id);\n if (hasChildren) onToggle(item.id);\n }}\n style={{ paddingLeft: 4 + (level - 1) * 16 }}\n className={cn(\n 'flex cursor-pointer items-center gap-[6px] rounded-xs py-[5px] pr-2 outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n isSelected ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n )}\n >\n <span aria-hidden className=\"text-text-dim grid w-3 place-items-center text-[10px]\">\n {hasChildren ? (isExpanded ? '▾' : '▸') : ''}\n </span>\n {item.icon && (\n <span aria-hidden className=\"text-[12px] opacity-80\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.trailing}\n </div>\n {hasChildren && isExpanded && (\n <ul role=\"group\" className=\"flex flex-col gap-px\">\n {(item.children ?? []).map((child) => (\n <TreeItemRow\n key={child.id}\n item={child}\n level={level + 1}\n expanded={expanded}\n selected={selected}\n tabStopId={tabStopId}\n onFocusItem={onFocusItem}\n onActivate={onActivate}\n onToggle={onToggle}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n"],"mappings":"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","names":["Spinner","import_react","import_react","import_react","import_react","import_react","import_react","import_react","Button","import_class_variance_authority","import_react","import_jsx_runtime","IconButton","import_react","import_jsx_runtime","ButtonGroup","import_react","import_jsx_runtime","SplitButton","import_react","import_jsx_runtime","FAB","import_react","import_jsx_runtime","Checkbox","import_react","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","Input","import_react","import_jsx_runtime","SearchInput","import_react","import_jsx_runtime","OTP","import_react","import_jsx_runtime","RadioGroup","Radio","import_react","import_jsx_runtime","SelectTrigger","SelectContent","SelectItem","import_react","import_jsx_runtime","Slider","import_react","import_jsx_runtime","Switch","import_class_variance_authority","import_react","import_jsx_runtime","Textarea","import_react","import_react","import_jsx_runtime","StatusDot","import_jsx_runtime","Avatar","import_react","import_jsx_runtime","AvatarGroup","import_class_variance_authority","import_react","import_jsx_runtime","Badge","import_class_variance_authority","import_react","import_jsx_runtime","Card","CardLink","import_react","import_jsx_runtime","StatCard","import_react","import_jsx_runtime","Chip","import_react","import_jsx_runtime","Kbd","import_class_variance_authority","import_react","import_jsx_runtime","Skeleton","SkeletonGroup","import_react","import_jsx_runtime","Tag","import_react","import_jsx_runtime","ContextMenuContent","ContextMenuItem","ContextMenuSeparator","import_react","import_jsx_runtime","DialogOverlay","DialogContent","RadixDialog","import_react","import_jsx_runtime","Drawer","RadixDialog","import_react","import_jsx_runtime","Sheet","import_react","import_jsx_runtime","AlertDialog","import_react","import_jsx_runtime","DropdownMenuContent","itemBase","MenuItem","MenuCheckboxItem","MenuSeparator","import_react","import_jsx_runtime","HoverCardContent","import_react","import_jsx_runtime","PopoverContent","import_react","import_jsx_runtime","ToastCard","import_react","import_jsx_runtime","TooltipContent","import_class_variance_authority","import_react","import_jsx_runtime","Alert","import_class_variance_authority","import_react","import_jsx_runtime","defaultGlyph","Banner","import_react","import_jsx_runtime","Breadcrumbs","Crumb","import_react","import_jsx_runtime","Combobox","RadixDialog","import_react","import_jsx_runtime","CommandPalette","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Calendar","RadixPopover","import_react","import_jsx_runtime","DatePicker","import_react","import_jsx_runtime","Dots","import_react","import_jsx_runtime","Dropzone","import_class_variance_authority","import_react","import_jsx_runtime","EmptyState","import_react","import_jsx_runtime","FileChip","import_react","import_jsx_runtime","Menubar","MenubarTrigger","MenubarContent","itemBase","MenubarItem","MenubarSeparator","import_react","import_react","import_jsx_runtime","Sidebar","NavItem","NavSection","import_jsx_runtime","NavBar","import_react","import_jsx_runtime","Pagination","import_class_variance_authority","import_react","import_jsx_runtime","Progress","import_react","import_jsx_runtime","RadialProgress","import_react","import_jsx_runtime","Sparkline","import_react","import_jsx_runtime","Spinner","import_react","import_jsx_runtime","Stepper","import_class_variance_authority","import_react","import_jsx_runtime","Tabs","TabsList","Tab","TabsContent","import_react","import_jsx_runtime","Timeline","TimelineItem","import_react","import_jsx_runtime","Topbar","import_react","import_jsx_runtime","EMPTY_SET","Tree"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/cn.ts","../src/hooks/useControllableState.ts","../src/hooks/useDisclosure.ts","../src/hooks/useEscape.ts","../src/hooks/useIsomorphicLayoutEffect.ts","../src/hooks/useKeyboardList.ts","../src/hooks/useOutsideClick.ts","../src/hooks/useTheme.ts","../src/components/Button/Button.tsx","../src/components/Button/IconButton.tsx","../src/components/Button/ButtonGroup.tsx","../src/components/Button/SplitButton.tsx","../src/components/Button/FAB.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Field/Field.tsx","../src/components/Input/Input.tsx","../src/components/Input/SearchInput.tsx","../src/components/OTP/OTP.tsx","../src/components/Radio/Radio.tsx","../src/components/Select/Select.tsx","../src/components/Slider/Slider.tsx","../src/components/Switch/Switch.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Avatar/Avatar.tsx","../src/components/StatusDot/StatusDot.tsx","../src/components/Avatar/sizes.ts","../src/components/Avatar/AvatarGroup.tsx","../src/components/Badge/Badge.tsx","../src/components/Card/Card.tsx","../src/components/Card/StatCard.tsx","../src/components/Chip/Chip.tsx","../src/components/Kbd/Kbd.tsx","../src/components/ScrollArea/ScrollArea.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Tag/Tag.tsx","../src/components/ContextMenu/ContextMenu.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Dialog/Drawer.tsx","../src/components/Dialog/Sheet.tsx","../src/components/Dialog/AlertDialog.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/HoverCard/HoverCard.tsx","../src/components/Popover/Popover.tsx","../src/components/Toast/Toast.tsx","../src/components/Tooltip/Tooltip.tsx","../src/patterns/Alert/Alert.tsx","../src/patterns/Banner/Banner.tsx","../src/patterns/Breadcrumbs/Breadcrumbs.tsx","../src/patterns/Combobox/Combobox.tsx","../src/patterns/CommandPalette/CommandPalette.tsx","../src/patterns/DataTable/DataTable.tsx","../src/patterns/DatePicker/Calendar.tsx","../src/patterns/DatePicker/DatePicker.tsx","../src/patterns/Dots/Dots.tsx","../src/patterns/Dropzone/Dropzone.tsx","../src/patterns/EmptyState/EmptyState.tsx","../src/patterns/FileChip/FileChip.tsx","../src/patterns/FilterPanel/FilterPanel.tsx","../src/patterns/HealthScore/HealthScore.tsx","../src/patterns/RadialProgress/RadialProgress.tsx","../src/patterns/Menubar/Menubar.tsx","../src/patterns/NavBar/NavBar.tsx","../src/patterns/Sidebar/Sidebar.tsx","../src/patterns/OnboardingChecklist/OnboardingChecklist.tsx","../src/patterns/Pagination/Pagination.tsx","../src/patterns/Progress/Progress.tsx","../src/patterns/Sparkline/Sparkline.tsx","../src/patterns/Spinner/Spinner.tsx","../src/patterns/Stepper/Stepper.tsx","../src/patterns/Tabs/Tabs.tsx","../src/patterns/Timeline/Timeline.tsx","../src/patterns/Timeline/ActivityTimeline.tsx","../src/patterns/Timeline/formatRelative.ts","../src/patterns/Topbar/Topbar.tsx","../src/patterns/Tree/Tree.tsx","../src/patterns/WizardDialog/WizardDialog.tsx"],"sourcesContent":["/**\n * Public API for @ship-it-ui/ui.\n *\n * Add new components here as they're built. Keep exports alphabetical within each\n * category so the barrel stays scannable.\n */\n\n// Utilities\nexport { cn } from './utils/cn';\nexport type { ClassValue } from './utils/cn';\n\n// Hooks\nexport * from './hooks';\n\n// Components — inputs\nexport * from './components/Button';\nexport * from './components/Checkbox';\nexport * from './components/Field';\nexport * from './components/Input';\nexport * from './components/OTP';\nexport * from './components/Radio';\nexport * from './components/Select';\nexport * from './components/Slider';\nexport * from './components/Switch';\nexport * from './components/Textarea';\n\n// Components — display\nexport * from './components/Avatar';\nexport * from './components/Badge';\nexport * from './components/Card';\nexport * from './components/Chip';\nexport * from './components/Kbd';\nexport * from './components/ScrollArea';\nexport * from './components/Skeleton';\nexport * from './components/StatusDot';\nexport * from './components/Tag';\n\n// Components — overlays\nexport * from './components/ContextMenu';\nexport * from './components/Dialog';\nexport * from './components/DropdownMenu';\nexport * from './components/HoverCard';\nexport * from './components/Popover';\nexport * from './components/Toast';\nexport * from './components/Tooltip';\n\n// Components — patterns\nexport * from './patterns/Alert';\nexport * from './patterns/Banner';\nexport * from './patterns/Breadcrumbs';\nexport * from './patterns/Combobox';\nexport * from './patterns/CommandPalette';\nexport * from './patterns/DataTable';\nexport * from './patterns/DatePicker';\nexport * from './patterns/Dots';\nexport * from './patterns/Dropzone';\nexport * from './patterns/EmptyState';\nexport * from './patterns/FileChip';\nexport * from './patterns/FilterPanel';\nexport * from './patterns/HealthScore';\nexport * from './patterns/Menubar';\nexport * from './patterns/NavBar';\nexport * from './patterns/OnboardingChecklist';\nexport * from './patterns/Pagination';\nexport * from './patterns/Progress';\nexport * from './patterns/RadialProgress';\nexport * from './patterns/Sidebar';\nexport * from './patterns/Sparkline';\nexport * from './patterns/Spinner';\nexport * from './patterns/Stepper';\nexport * from './patterns/Tabs';\nexport * from './patterns/Timeline';\nexport * from './patterns/Topbar';\nexport * from './patterns/Tree';\nexport * from './patterns/WizardDialog';\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport type { ClassValue } from 'clsx';\n\n/**\n * Combine class names with conflict-aware Tailwind merging.\n *\n * cn('px-2 py-1', condition && 'px-4') → 'py-1 px-4'\n *\n * Use anywhere you'd otherwise concatenate strings of Tailwind classes.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport { useCallback, useRef, useState } from 'react';\n\n/**\n * Standard controlled/uncontrolled state hook. Mirrors Radix's\n * `useControllableState` — when `value` is provided, the hook stays in sync\n * with it; otherwise it manages an internal state seeded by `defaultValue`.\n *\n * Use this for any composite that needs to support both modes (Tabs,\n * Combobox, Tree, DatePicker, Switch, etc.).\n */\n\nexport interface UseControllableStateProps<T> {\n /** Controlled value. When provided, the hook is in controlled mode. */\n value?: T;\n /** Default for uncontrolled mode. Used only when `value` is undefined. */\n defaultValue?: T;\n /** Change callback fired in both modes whenever the value would change. */\n onChange?: (value: T) => void;\n}\n\n// Overload: a required `defaultValue` (or a controlled `value`) means the\n// returned tuple is always non-undefined `T`. This is the common case for\n// composites like DataTable / Tree that pass an `EMPTY_SET` fallback.\nexport function useControllableState<T>(opts: {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}): readonly [T, (next: T | ((prev: T) => T)) => void];\n\n// Overload: no default → the value may be `undefined` until the consumer sets it.\nexport function useControllableState<T>(opts: {\n value?: T;\n defaultValue?: T;\n onChange?: (next: T) => void;\n}): readonly [T | undefined, (next: T | ((prev: T | undefined) => T)) => void];\n\n// Implementation\nexport function useControllableState<T>({\n value: controlledValue,\n defaultValue,\n onChange,\n}: UseControllableStateProps<T>): readonly [\n T | undefined,\n (next: T | ((prev: T | undefined) => T)) => void,\n] {\n const [uncontrolledValue, setUncontrolledValue] = useState<T | undefined>(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : uncontrolledValue;\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const setValue = useCallback(\n (next: T | ((prev: T | undefined) => T)) => {\n const resolved =\n typeof next === 'function' ? (next as (prev: T | undefined) => T)(valueRef.current) : next;\n if (!isControlled) {\n setUncontrolledValue(resolved);\n }\n if (resolved !== valueRef.current) {\n onChangeRef.current?.(resolved);\n }\n },\n [isControlled],\n );\n\n return [value, setValue] as const;\n}\n","'use client';\n\nimport { useCallback, useState } from 'react';\n\n/**\n * Standardized open/close state for overlays.\n * Returns the same shape Radix and shadcn-style libraries use, so passing it as\n * `{...disclosure}` props works with any overlay primitive.\n */\nexport function useDisclosure(initial = false): {\n open: boolean;\n onOpen: () => void;\n onClose: () => void;\n onToggle: () => void;\n setOpen: (open: boolean) => void;\n} {\n const [open, setOpen] = useState(initial);\n const onOpen = useCallback(() => setOpen(true), []);\n const onClose = useCallback(() => setOpen(false), []);\n const onToggle = useCallback(() => setOpen((o) => !o), []);\n return { open, onOpen, onClose, onToggle, setOpen };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Calls `handler` when Escape is pressed while `enabled` is true.\n * Most overlay components (Dialog, Popover, Drawer) get this for free via Radix,\n * but custom popovers and inline editors need it.\n *\n * Implementation note: the handler is stored in a ref so an inline\n * `() => doThing()` passed by the consumer doesn't detach/reattach the\n * `keydown` listener every render.\n */\nexport function useEscape(handler: () => void, enabled = true) {\n const handlerRef = useRef(handler);\n useEffect(() => {\n handlerRef.current = handler;\n }, [handler]);\n useEffect(() => {\n if (!enabled) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handlerRef.current();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [enabled]);\n}\n","'use client';\n\nimport { useEffect, useLayoutEffect } from 'react';\n\n/**\n * `useLayoutEffect` on the client, `useEffect` on the server.\n *\n * React warns when `useLayoutEffect` runs on the server because there's no\n * DOM to measure. This shim swaps in `useEffect` during SSR and restores\n * `useLayoutEffect` once the bundle is evaluated client-side.\n *\n * Use when you need to measure or synchronously mutate the DOM before\n * paint. Plain `useEffect` is preferred otherwise.\n */\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n","'use client';\n\nimport { useCallback, useState, type KeyboardEvent } from 'react';\n\n/**\n * Keyboard navigation for arrow-key selectable lists (Combobox, CommandPalette,\n * filtered dropdown bodies). Tracks the highlighted cursor and exposes a\n * `getKeyDownHandler` you can spread on the input/list element.\n *\n * Supports ↑/↓, Home/End, optional Enter, and a `loop` option that wraps from\n * end → start. The `count` arg drives bounds; pass `0` and the hook becomes a\n * no-op until you hydrate it.\n */\n\nexport interface UseKeyboardListOptions {\n /** Total number of items currently in the list. */\n count: number;\n /** Wrap around at the ends. Default true. */\n loop?: boolean;\n /** Initial cursor. Default 0. */\n defaultCursor?: number;\n /** Called with the current cursor index when Enter is pressed. */\n onSelect?: (index: number) => void;\n}\n\nexport interface UseKeyboardListResult {\n cursor: number;\n setCursor: (index: number) => void;\n /** Handler for `onKeyDown` — does NOT call `preventDefault` for unhandled keys. */\n onKeyDown: (event: KeyboardEvent) => void;\n}\n\nexport function useKeyboardList({\n count,\n loop = true,\n defaultCursor = 0,\n onSelect,\n}: UseKeyboardListOptions): UseKeyboardListResult {\n const [cursor, setCursor] = useState(defaultCursor);\n\n const move = useCallback(\n (delta: number) => {\n if (count <= 0) return;\n setCursor((c) => {\n const next = c + delta;\n if (loop) return ((next % count) + count) % count;\n return Math.max(0, Math.min(count - 1, next));\n });\n },\n [count, loop],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (count <= 0) return;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n move(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n move(-1);\n break;\n case 'Home':\n event.preventDefault();\n setCursor(0);\n break;\n case 'End':\n event.preventDefault();\n setCursor(count - 1);\n break;\n case 'Enter':\n if (onSelect) {\n event.preventDefault();\n onSelect(cursor);\n }\n break;\n default:\n break;\n }\n },\n [count, cursor, move, onSelect],\n );\n\n const safeCursor = count > 0 ? Math.min(cursor, count - 1) : 0;\n\n return { cursor: safeCursor, setCursor, onKeyDown };\n}\n","'use client';\n\nimport { useEffect, type RefObject } from 'react';\n\n/**\n * Calls `handler` when a pointerdown occurs outside the element referenced by `ref`.\n *\n * Pass `enabled=false` to detach (typically while the popover is closed). Listens on\n * `pointerdown` rather than `click` so the trigger sees the close before its own click\n * fires — matches the behavior of most popover libraries. `pointerdown` is the unified\n * mouse + touch + pen event, so this also works on touch devices (where `mousedown`\n * is not synthesized for taps until after the click).\n */\nexport function useOutsideClick<T extends HTMLElement>(\n ref: RefObject<T | null>,\n handler: () => void,\n enabled = true,\n) {\n useEffect(() => {\n if (!enabled) return;\n const onDown = (e: PointerEvent) => {\n const el = ref.current;\n if (el && e.target instanceof Node && !el.contains(e.target)) handler();\n };\n document.addEventListener('pointerdown', onDown);\n return () => document.removeEventListener('pointerdown', onDown);\n }, [ref, handler, enabled]);\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nexport type Theme = 'dark' | 'light';\n\n/**\n * Read and toggle the active theme (`[data-theme]` on `<html>`).\n *\n * `dark` is the default — when the attribute is absent, dark theme applies.\n * `light` is the opt-in: setting it adds `data-theme=\"light\"` to the document root.\n *\n * Usage:\n * const { theme, setTheme, toggle } = useTheme();\n * <Switch on={theme === 'light'} onChange={toggle} />\n */\nexport function useTheme(): {\n theme: Theme;\n setTheme: (next: Theme) => void;\n toggle: () => void;\n} {\n // Initialize to 'dark' on both server and client to avoid SSR hydration mismatch.\n // The real DOM value is read post-mount in the effect below.\n const [theme, setThemeState] = useState<Theme>('dark');\n\n const setTheme = useCallback((next: Theme) => {\n if (typeof document === 'undefined') {\n setThemeState(next);\n return;\n }\n if (next === 'light') {\n document.documentElement.setAttribute('data-theme', 'light');\n } else {\n document.documentElement.removeAttribute('data-theme');\n }\n setThemeState(next);\n }, []);\n\n const toggle = useCallback(() => {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }, [theme, setTheme]);\n\n // Sync state with the actual DOM attribute on mount, then keep it in sync if\n // something else flips the attribute (e.g., a test, a parent app).\n useEffect(() => {\n const initial = document.documentElement.getAttribute('data-theme');\n setThemeState(initial === 'light' ? 'light' : 'dark');\n const observer = new MutationObserver(() => {\n const attr = document.documentElement.getAttribute('data-theme');\n setThemeState(attr === 'light' ? 'light' : 'dark');\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n });\n return () => observer.disconnect();\n }, []);\n\n return { theme, setTheme, toggle };\n}\n","'use client';\n\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode, type Ref } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Seven variants × three sizes × five states. One primary per surface — everything\n * else defers. Variants and sizes match `design-handoff/project/components/Button.jsx`.\n */\nconst buttonStyles = cva(\n [\n 'inline-flex items-center justify-center whitespace-nowrap',\n 'font-medium transition-[background,filter,box-shadow,color] duration-(--duration-micro)',\n 'outline-none',\n 'focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n ],\n {\n variants: {\n variant: {\n primary:\n 'bg-accent text-on-accent border border-accent hover:brightness-110 active:brightness-95',\n secondary:\n 'bg-panel-2 text-text border border-border hover:bg-[color-mix(in_oklab,var(--color-panel-2),white_4%)]',\n ghost: 'bg-transparent text-text border border-transparent hover:bg-panel-2',\n outline: 'bg-transparent text-text border border-border-strong hover:bg-panel-2',\n destructive:\n 'bg-err text-on-accent border border-err hover:brightness-110 active:brightness-95',\n success: 'bg-ok text-on-accent border border-ok hover:brightness-110 active:brightness-95',\n link: 'bg-transparent text-accent border border-transparent underline underline-offset-[3px] hover:brightness-110',\n },\n size: {\n sm: 'h-[26px] px-[10px] text-[11px] gap-[5px] rounded-[5px]',\n md: 'h-[32px] px-3 text-[12px] gap-[6px] rounded-md',\n lg: 'h-[38px] px-4 text-[13px] gap-[7px] rounded-[7px]',\n },\n fullWidth: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'md',\n fullWidth: false,\n },\n },\n);\n\n/** Spinner glyph used for the loading state. Inherits color from the button text. */\nfunction Spinner({ size }: { size: number }) {\n return (\n <span\n aria-hidden\n className=\"inline-block animate-[ship-spin_0.7s_linear_infinite] rounded-full border-[1.5px] border-current border-t-transparent\"\n style={{ width: size, height: size }}\n />\n );\n}\n\nexport interface ButtonProps\n extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonStyles> {\n /** Icon shown to the left of the label (or replacing the spinner when `loading`). */\n icon?: ReactNode;\n /** Icon/text shown to the right of the label. Often a chevron, kbd hint, or arrow. */\n trailing?: ReactNode;\n /** When true, hides the icon, swaps in a spinner, and disables the button. */\n loading?: boolean;\n /**\n * Render the inner content as a child element instead of a `<button>`. Useful for\n * link wrappers — `<Button asChild><Link href=\"/\" /></Button>`.\n */\n asChild?: boolean;\n}\n\n/** Pixel size of the icon/spinner inside each button size. */\nconst iconSize = { sm: 11, md: 12, lg: 13 } as const;\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant,\n size,\n fullWidth,\n icon,\n trailing,\n loading = false,\n disabled,\n asChild = false,\n type,\n className,\n children,\n ...props\n },\n ref,\n) {\n const isDisabled = disabled || loading;\n const iconPx = iconSize[size ?? 'md'];\n const composedClassName = cn(buttonStyles({ variant, size, fullWidth }), className);\n\n // asChild defers all rendering to the consumer's element. We just decorate it\n // with Button styles — Slot requires exactly one child, so icon/trailing/loading\n // slots are intentionally not supported on asChild buttons.\n if (asChild) {\n return (\n <Slot\n // Radix Slot widens the rendered element to whatever the consumer passes\n // as the single child, but our public ref type is HTMLButtonElement (the\n // common case). Cast to HTMLElement for the asChild branch — consumers\n // rendering a non-button child accept the variance.\n ref={ref as Ref<HTMLElement>}\n aria-busy={loading || undefined}\n aria-disabled={isDisabled || undefined}\n data-disabled={isDisabled ? '' : undefined}\n className={composedClassName}\n {...props}\n >\n {children}\n </Slot>\n );\n }\n\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n disabled={isDisabled}\n aria-busy={loading || undefined}\n className={composedClassName}\n {...props}\n >\n {loading ? (\n <Spinner size={iconPx} />\n ) : icon ? (\n <span className=\"inline-flex\">{icon}</span>\n ) : null}\n {children}\n {trailing && <span className=\"inline-flex opacity-60\">{trailing}</span>}\n </button>\n );\n});\n\nButton.displayName = 'Button';\n\nexport { buttonStyles };\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst iconButtonStyles = cva(\n [\n 'inline-grid place-items-center transition-[background,filter,color] duration-(--duration-micro)',\n 'outline-none focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n ],\n {\n variants: {\n // Mirrors `Button`'s variant set, minus `link` — an underlined link\n // affordance is awkward for an icon-only target, so we omit it\n // intentionally. Use `<Button variant=\"link\" icon={…} />` if you need it.\n variant: {\n primary: 'bg-accent text-on-accent border border-accent hover:brightness-110',\n secondary:\n 'bg-panel-2 text-text-muted border border-border hover:bg-[color-mix(in_oklab,var(--color-panel-2),white_4%)]',\n ghost:\n 'bg-transparent text-text-muted border border-transparent hover:bg-panel-2 hover:text-text',\n outline:\n 'bg-transparent text-text-muted border border-border-strong hover:bg-panel-2 hover:text-text',\n destructive:\n 'bg-err text-on-accent border border-err hover:brightness-110 active:brightness-95',\n success: 'bg-ok text-on-accent border border-ok hover:brightness-110 active:brightness-95',\n },\n size: {\n sm: 'h-[26px] w-[26px] text-[12px] rounded-[5px]',\n md: 'h-[32px] w-[32px] text-[13px] rounded-md',\n lg: 'h-[38px] w-[38px] text-[15px] rounded-[7px]',\n },\n },\n defaultVariants: { variant: 'secondary', size: 'md' },\n },\n);\n\nexport interface IconButtonProps\n extends\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'>,\n VariantProps<typeof iconButtonStyles> {\n /** The glyph or icon node to render. Pure decoration — set `aria-label` for screen readers. */\n icon: ReactNode;\n /**\n * Required: an accessible label since icon buttons have no visible text.\n * Mapped to `aria-label`.\n */\n 'aria-label': string;\n}\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { variant, size, icon, type, className, ...props },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={cn(iconButtonStyles({ variant, size }), className)}\n {...props}\n >\n {icon}\n </button>\n );\n});\n\nIconButton.displayName = 'IconButton';\n\nexport { iconButtonStyles };\n","'use client';\n\nimport {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactElement,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * `orientation=\"horizontal\"` (default) joins children edge-to-edge with shared\n * borders; `vertical` does the same column-wise.\n */\n orientation?: 'horizontal' | 'vertical';\n}\n\n/**\n * Joins a row of `<Button>`s into a segmented control. The group owns the rounded\n * corners and outer border; child buttons render flush.\n *\n * Pass children as `<Button variant=\"secondary\">…</Button>` — the group strips\n * each child's individual radius and adds the connecting borders.\n */\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(function ButtonGroup(\n { orientation = 'horizontal', className, children, ...props },\n ref,\n) {\n const items = Children.toArray(children).filter(isValidElement) as ReactElement<{\n className?: string;\n }>[];\n\n return (\n <div\n ref={ref}\n role=\"group\"\n className={cn(\n 'border-border inline-flex overflow-hidden rounded-md border',\n orientation === 'vertical' ? 'flex-col' : 'flex-row',\n className,\n )}\n {...props}\n >\n {items.map((child, i) => {\n const isFirst = i === 0;\n const childProps = (child.props ?? {}) as { className?: string };\n return cloneElement(child, {\n key: i,\n className: cn(\n childProps.className,\n 'rounded-none border-none',\n !isFirst &&\n (orientation === 'horizontal'\n ? 'border-l border-l-border'\n : 'border-t border-t-border'),\n ),\n });\n })}\n </div>\n );\n});\n\nButtonGroup.displayName = 'ButtonGroup';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { Button, type ButtonProps } from './Button';\n\n/**\n * Variant set supported by `SplitButton`. Mirrors `Button`'s set minus `link` —\n * a split-button \"menu\" affordance attached to a link variant doesn't compose\n * visually. Use a regular `<Button variant=\"link\" />` instead.\n */\nexport type SplitButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'success';\n\nexport interface SplitButtonProps extends HTMLAttributes<HTMLDivElement> {\n /** Visual variant applied to BOTH segments. Defaults to `primary`. */\n variant?: SplitButtonVariant;\n /** Size applied to both segments. Defaults to `md`. */\n size?: ButtonProps['size'];\n /** Click handler for the main action button. */\n onClick?: () => void;\n /** Click handler for the trailing menu (caret) button. */\n onMenu?: () => void;\n /** Disable both segments. */\n disabled?: boolean;\n /**\n * Accessible label for the trailing menu button. Defaults to\n * `\"More actions\"`. Override when the menu's purpose is more specific\n * (e.g. `\"Deploy options\"`) so screen-reader users hear the right intent.\n */\n menuAriaLabel?: string;\n children: ReactNode;\n}\n\n/**\n * Two-segment button: a primary action on the left, a menu chevron on the right.\n * Common pattern for \"Deploy ▾\" or \"Save and …\" controls.\n */\nexport const SplitButton = forwardRef<HTMLDivElement, SplitButtonProps>(function SplitButton(\n {\n variant = 'primary',\n size = 'md',\n onClick,\n onMenu,\n disabled,\n menuAriaLabel = 'More actions',\n className,\n children,\n ...props\n },\n ref,\n) {\n // Token-aware divider between the two segments. For variants whose\n // background is a colored surface with `text-on-accent` foreground\n // (primary/destructive/success), a 20%-opacity dark line is visible.\n // For neutral surfaces (secondary/outline/ghost), use the strong border\n // token so the divider tracks light/dark theme.\n const dividerBorder =\n variant === 'primary' || variant === 'destructive' || variant === 'success'\n ? 'border-r-on-accent/20'\n : 'border-r-border-strong';\n return (\n <div ref={ref} className={cn('inline-flex', className)} {...props}>\n <Button\n variant={variant}\n size={size}\n onClick={onClick}\n disabled={disabled}\n className={cn('rounded-r-none border-r', dividerBorder)}\n >\n {children}\n </Button>\n <Button\n variant={variant}\n size={size}\n onClick={onMenu}\n disabled={disabled}\n aria-label={menuAriaLabel}\n className=\"rounded-l-none px-2\"\n >\n ▾\n </Button>\n </div>\n );\n});\n\nSplitButton.displayName = 'SplitButton';\n","'use client';\n\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface FABProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n /** Icon or glyph rendered inside the FAB. Defaults to `✦`. */\n icon?: ReactNode;\n /** Required: accessible label. Maps to `aria-label`. */\n 'aria-label': string;\n}\n\n/**\n * Floating action button — round, accent-bg, accent-glow shadow. Use for the\n * single most-prominent action on a surface (e.g., \"Ask anything\" trigger).\n */\nexport const FAB = forwardRef<HTMLButtonElement, FABProps>(function FAB(\n { icon = '✦', type, className, style, ...props },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={cn(\n 'grid h-12 w-12 place-items-center rounded-full',\n 'bg-accent text-on-accent text-lg font-semibold',\n 'shadow-[0_10px_30px_var(--color-accent-glow),0_2px_6px_rgba(0,0,0,0.4)]',\n 'transition-[transform,box-shadow] duration-200',\n 'hover:-translate-y-px hover:shadow-[0_14px_36px_var(--color-accent-glow),0_4px_10px_rgba(0,0,0,0.45)]',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n className,\n )}\n style={style}\n {...props}\n >\n {icon}\n </button>\n );\n});\n\nFAB.displayName = 'FAB';\n","'use client';\n\nimport * as RadixCheckbox from '@radix-ui/react-checkbox';\nimport { forwardRef, useId, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface CheckboxProps extends Omit<RadixCheckbox.CheckboxProps, 'asChild' | 'children'> {\n /** Optional inline label rendered to the right of the box. */\n label?: ReactNode;\n}\n\n/**\n * Tri-state checkbox. Set `checked=\"indeterminate\"` for the dash-mark state used\n * in select-all rows.\n */\nexport const Checkbox = forwardRef<HTMLButtonElement, CheckboxProps>(function Checkbox(\n { label, className, id: idProp, ...props },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `cb-${reactId}`;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-2 select-none',\n props.disabled && 'cursor-not-allowed opacity-40',\n className,\n )}\n >\n <RadixCheckbox.Root\n ref={ref}\n id={id}\n className={cn(\n 'grid h-4 w-4 place-items-center rounded-xs',\n 'bg-panel border-border-strong border',\n 'data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n 'data-[state=indeterminate]:bg-accent data-[state=indeterminate]:border-accent',\n 'transition-[background,border-color] duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n )}\n {...props}\n >\n <RadixCheckbox.Indicator className=\"text-on-accent text-[11px] leading-none\">\n {props.checked === 'indeterminate' ? '−' : '✓'}\n </RadixCheckbox.Indicator>\n </RadixCheckbox.Root>\n {label && (\n <label htmlFor={id} className=\"cursor-pointer text-[13px]\">\n {label}\n </label>\n )}\n </span>\n );\n});\n\nCheckbox.displayName = 'Checkbox';\n","'use client';\n\nimport { useId, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface FieldProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Visible label rendered above the control. */\n label?: ReactNode;\n /** Helper text shown below the control when no error is present. */\n hint?: ReactNode;\n /** Error message shown below the control. Displaces `hint` when set. */\n error?: ReactNode;\n /** Marks the field with a visual asterisk (does not enforce validity). */\n required?: boolean;\n /**\n * The control. Receives `id`, `aria-describedby`, and `aria-invalid` automatically.\n * Pass via render prop so the field can wire IDs without consumers thinking about it.\n */\n children: (props: {\n id: string;\n 'aria-describedby': string | undefined;\n 'aria-invalid': boolean | undefined;\n }) => ReactNode;\n}\n\n/**\n * Form-field wrapper: label + control + hint/error. Wires up the IDs so screen\n * readers connect the label and helper text to the input.\n *\n * <Field label=\"Email\" hint=\"We never share it\">\n * {(p) => <Input type=\"email\" placeholder=\"me@org.com\" {...p} />}\n * </Field>\n */\nexport function Field({ label, hint, error, required, className, children, ...props }: FieldProps) {\n const reactId = useId();\n const id = `field-${reactId}`;\n const hintId = hint && !error ? `${id}-hint` : undefined;\n const errorId = error ? `${id}-error` : undefined;\n const describedBy = errorId ?? hintId;\n\n return (\n <div className={cn('flex flex-col gap-[6px]', className)} {...props}>\n {label && (\n <label htmlFor={id} className=\"text-text-muted text-[11px] font-medium\">\n {label}\n {required && <span className=\"text-err ml-1\">*</span>}\n </label>\n )}\n {children({\n id,\n 'aria-describedby': describedBy,\n 'aria-invalid': error ? true : undefined,\n })}\n {hint && !error && (\n <div id={hintId} className=\"text-text-dim text-[11px]\">\n {hint}\n </div>\n )}\n {error && (\n <div id={errorId} className=\"text-err text-[11px]\">\n {error}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst inputWrapperStyles = cva(\n [\n 'flex items-center gap-[6px] font-sans transition-[border-color,box-shadow] duration-(--duration-micro)',\n 'border focus-within:ring-[3px]',\n 'has-[:disabled]:opacity-50 has-[:disabled]:bg-panel-2',\n ],\n {\n variants: {\n size: {\n sm: 'h-7 px-2 text-[12px] rounded-md',\n md: 'h-[34px] px-[10px] text-[13px] rounded-md',\n lg: 'h-10 px-3 text-[14px] rounded-md',\n },\n tone: {\n default: 'bg-panel border-border focus-within:border-accent focus-within:ring-accent-dim',\n err: 'bg-panel border-err focus-within:border-err focus-within:ring-err/30',\n },\n },\n defaultVariants: { size: 'md', tone: 'default' },\n },\n);\n\nexport interface InputProps\n extends\n Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>,\n VariantProps<typeof inputWrapperStyles> {\n /** Element rendered to the left of the input (an `IconGlyph`, `@`, etc.). */\n icon?: ReactNode;\n /** Element rendered to the right (a unit suffix, kbd hint, clear button). */\n trailing?: ReactNode;\n /** When true, swaps the wrapper border to error tone (independent of `aria-invalid`). */\n error?: boolean;\n /** Pixel width override; otherwise the wrapper grows to fill its container. */\n width?: number | string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { size, tone, icon, trailing, error, width, className, style, disabled, ...props },\n ref,\n) {\n const computedTone = error ? 'err' : tone;\n return (\n <div\n className={cn(inputWrapperStyles({ size, tone: computedTone }), className)}\n style={{ width, ...style }}\n >\n {icon && <span className=\"text-text-dim leading-none\">{icon}</span>}\n <input\n ref={ref}\n disabled={disabled}\n aria-invalid={error || undefined}\n className={cn(\n 'text-text min-w-0 flex-1 border-none bg-transparent font-sans outline-none',\n 'placeholder:text-text-dim',\n 'disabled:cursor-not-allowed',\n )}\n {...props}\n />\n {trailing && <span className=\"text-text-dim text-[11px]\">{trailing}</span>}\n </div>\n );\n});\n\nInput.displayName = 'Input';\n","'use client';\n\nimport { forwardRef, type InputHTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface SearchInputProps extends InputHTMLAttributes<HTMLInputElement> {\n /** Optional keyboard shortcut hint (e.g., `⌘K`) shown on the right edge. */\n shortcut?: string;\n /** Pixel width or any CSS length. Defaults to `360px`. */\n width?: number | string;\n}\n\n/**\n * The hero search field — taller than a regular Input, with a leading magnifying-glass\n * glyph and an optional trailing keyboard-shortcut chip. Used for command bars,\n * topbar search, and entity search.\n */\nexport const SearchInput = forwardRef<HTMLInputElement, SearchInputProps>(function SearchInput(\n {\n shortcut = '⌘K',\n width = 360,\n className,\n style,\n placeholder = 'Search…',\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n) {\n return (\n <div\n className={cn(\n 'rounded-base flex h-9 items-center gap-2 px-3 font-sans',\n 'bg-panel-2 border-border border',\n 'focus-within:border-accent focus-within:ring-accent-dim focus-within:ring-[3px]',\n 'transition-[border-color,box-shadow] duration-(--duration-micro)',\n className,\n )}\n style={{ width, ...style }}\n >\n <span className=\"text-text-dim leading-none\" aria-hidden>\n ⌕\n </span>\n <input\n ref={ref}\n type=\"search\"\n placeholder={placeholder}\n // Default the accessible name to the placeholder. WCAG 4.1.2 / 3.3.2\n // require a programmatic name; placeholder alone does not satisfy\n // either criterion. Consumers can still override by passing aria-label.\n aria-label={ariaLabel ?? (typeof placeholder === 'string' ? placeholder : 'Search')}\n className=\"text-text placeholder:text-text-dim min-w-0 flex-1 border-none bg-transparent text-[13px] outline-none\"\n {...props}\n />\n {shortcut && (\n <kbd className=\"text-text-dim border-border rounded-xs border px-[6px] py-[2px] font-mono text-[10px]\">\n {shortcut}\n </kbd>\n )}\n </div>\n );\n});\n\nSearchInput.displayName = 'SearchInput';\n","'use client';\n\nimport {\n forwardRef,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n type KeyboardEvent,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface OTPProps {\n /** Number of digit slots. Defaults to 6. */\n length?: number;\n /** Called with the assembled string when every slot has a value. */\n onComplete?: (code: string) => void;\n /** Called with the partial string on every change. */\n onChange?: (value: string) => void;\n /** Initial value (string of digits). */\n defaultValue?: string;\n /** Aria label applied to each individual slot, suffixed with \" {n} of {N}\". */\n ariaLabel?: string;\n className?: string;\n disabled?: boolean;\n}\n\nexport type OTPHandle = {\n focus: () => void;\n reset: () => void;\n};\n\n/**\n * Six-slot one-time-password input with auto-advance, backspace navigation, and\n * paste-to-fill. Each slot is a single-character `<input>` for screen-reader clarity.\n */\nexport const OTP = forwardRef<OTPHandle, OTPProps>(function OTP(\n { length = 6, onComplete, onChange, defaultValue = '', ariaLabel = 'Code', className, disabled },\n ref,\n) {\n const baseId = useId();\n const refs = useRef<(HTMLInputElement | null)[]>([]);\n const [values, setValues] = useState<string[]>(() =>\n Array.from({ length }, (_, i) => defaultValue[i] ?? ''),\n );\n const [completedAnnouncement, setCompletedAnnouncement] = useState('');\n\n useImperativeHandle(ref, () => ({\n focus: () => refs.current[0]?.focus(),\n reset: () => {\n setValues(Array(length).fill(''));\n setCompletedAnnouncement('');\n refs.current[0]?.focus();\n },\n }));\n\n const writeAt = (i: number, char: string) => {\n if (!/^\\d?$/.test(char)) return;\n // Compute next outside the updater so callbacks fire exactly once even\n // when React Strict Mode invokes the updater twice in dev.\n const next = [...values];\n next[i] = char;\n setValues(next);\n const joined = next.join('');\n onChange?.(joined);\n const isComplete = joined.length === length && next.every((c) => c);\n if (isComplete) {\n onComplete?.(joined);\n setCompletedAnnouncement('Code complete');\n } else {\n // Reset the announcement when the user is editing the value back to incomplete.\n setCompletedAnnouncement('');\n }\n if (char && i < length - 1) refs.current[i + 1]?.focus();\n };\n\n const onKey = (i: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Backspace' && !values[i] && i > 0) {\n refs.current[i - 1]?.focus();\n } else if (e.key === 'ArrowLeft' && i > 0) {\n refs.current[i - 1]?.focus();\n } else if (e.key === 'ArrowRight' && i < length - 1) {\n refs.current[i + 1]?.focus();\n }\n };\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pasted = e.clipboardData.getData('text').replace(/\\D/g, '').slice(0, length);\n if (!pasted) return;\n e.preventDefault();\n const next = Array.from({ length }, (_, i) => pasted[i] ?? '');\n setValues(next);\n const joined = next.join('');\n onChange?.(joined);\n const isComplete = joined.length === length && next.every((c) => c);\n if (isComplete) {\n onComplete?.(joined);\n setCompletedAnnouncement('Code complete');\n } else {\n setCompletedAnnouncement('');\n }\n refs.current[Math.min(pasted.length, length - 1)]?.focus();\n };\n\n return (\n <div className={cn('flex gap-2', className)}>\n {values.map((c, i) => (\n <input\n key={i}\n id={`${baseId}-${i}`}\n ref={(el) => {\n refs.current[i] = el;\n }}\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={1}\n value={c}\n disabled={disabled}\n aria-label={`${ariaLabel} ${i + 1} of ${length}`}\n onChange={(e) => writeAt(i, e.target.value)}\n onKeyDown={(e) => onKey(i, e)}\n onFocus={(e) => e.target.select()}\n onPaste={i === 0 ? onPaste : undefined}\n className={cn(\n 'text-text bg-panel h-12 w-10 rounded-md text-center font-mono text-[20px] font-medium',\n 'border-border border transition-[border-color,box-shadow] duration-(--duration-micro) outline-none',\n 'focus:border-accent focus:ring-accent-dim focus:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n )}\n />\n ))}\n <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n {completedAnnouncement}\n </span>\n </div>\n );\n});\n\nOTP.displayName = 'OTP';\n","'use client';\n\nimport * as RadixRadio from '@radix-ui/react-radio-group';\nimport { forwardRef, useId, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/* ───── RadioGroup ───── */\n\nexport type RadioGroupProps = Omit<RadixRadio.RadioGroupProps, 'asChild'>;\n\n/**\n * Container for radio items. Wires up roving focus + arrow-key navigation.\n *\n * <RadioGroup value={v} onValueChange={setV}>\n * <Radio value=\"team\" label=\"Everyone on team\" />\n * <Radio value=\"admins\" label=\"Admins only\" />\n * </RadioGroup>\n */\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(function RadioGroup(\n { className, ...props },\n ref,\n) {\n return <RadixRadio.Root ref={ref} className={cn('flex flex-col gap-2', className)} {...props} />;\n});\n\nRadioGroup.displayName = 'RadioGroup';\n\n/* ───── Radio ───── */\n\nexport interface RadioProps extends Omit<RadixRadio.RadioGroupItemProps, 'asChild' | 'children'> {\n /** Optional inline label. */\n label?: ReactNode;\n}\n\nexport const Radio = forwardRef<HTMLButtonElement, RadioProps>(function Radio(\n { label, className, id: idProp, ...props },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `radio-${reactId}`;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-2 select-none',\n props.disabled && 'cursor-not-allowed opacity-40',\n className,\n )}\n >\n <RadixRadio.Item\n ref={ref}\n id={id}\n className={cn(\n 'grid h-4 w-4 place-items-center rounded-full',\n 'bg-panel border-border-strong border',\n 'data-[state=checked]:border-accent',\n 'transition-[border-color] duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n )}\n {...props}\n >\n <RadixRadio.Indicator className=\"bg-accent block h-[7px] w-[7px] rounded-full\" />\n </RadixRadio.Item>\n {label && (\n <label htmlFor={id} className=\"cursor-pointer text-[13px]\">\n {label}\n </label>\n )}\n </span>\n );\n});\n\nRadio.displayName = 'Radio';\n","'use client';\n\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/* ───── Atomic Radix wrappers (advanced API) ───── */\n\nexport const SelectRoot = RadixSelect.Root;\nexport const SelectValue = RadixSelect.Value;\nexport const SelectGroup = RadixSelect.Group;\nexport const SelectLabel = RadixSelect.Label;\n\nconst triggerClasses = {\n sm: 'h-7 px-2 text-[12px]',\n md: 'h-[34px] px-[10px] text-[13px]',\n lg: 'h-10 px-3 text-[14px]',\n} as const;\n\nexport const SelectTrigger = forwardRef<\n HTMLButtonElement,\n RadixSelect.SelectTriggerProps & { size?: keyof typeof triggerClasses }\n>(function SelectTrigger({ size = 'md', className, children, ...props }, ref) {\n return (\n <RadixSelect.Trigger\n ref={ref}\n className={cn(\n 'text-text bg-panel border-border inline-flex items-center justify-between gap-2 rounded-md border font-sans',\n 'data-[state=open]:border-accent',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'data-[disabled]:bg-panel-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50',\n 'transition-[border-color,box-shadow] duration-(--duration-micro)',\n triggerClasses[size],\n className,\n )}\n {...props}\n >\n {children}\n <RadixSelect.Icon className=\"text-text-dim text-[11px] leading-none\">▾</RadixSelect.Icon>\n </RadixSelect.Trigger>\n );\n});\n\nSelectTrigger.displayName = 'SelectTrigger';\n\nexport const SelectContent = forwardRef<HTMLDivElement, RadixSelect.SelectContentProps>(\n function SelectContent(\n { className, children, position = 'popper', sideOffset = 6, ...props },\n ref,\n ) {\n return (\n <RadixSelect.Portal>\n <RadixSelect.Content\n ref={ref}\n position={position}\n sideOffset={sideOffset}\n className={cn(\n 'bg-panel border-border z-popover min-w-[var(--radix-select-trigger-width)] rounded-md border p-1 shadow',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n >\n <RadixSelect.Viewport>{children}</RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n );\n },\n);\n\nSelectContent.displayName = 'SelectContent';\n\nexport const SelectItem = forwardRef<HTMLDivElement, RadixSelect.SelectItemProps>(\n function SelectItem({ className, children, ...props }, ref) {\n return (\n <RadixSelect.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-pointer items-center rounded-sm px-2 py-[6px] text-[13px] outline-none',\n 'data-[highlighted]:bg-accent-dim data-[highlighted]:text-accent',\n 'data-[state=checked]:font-medium',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-40',\n className,\n )}\n {...props}\n >\n <RadixSelect.ItemText>{children}</RadixSelect.ItemText>\n </RadixSelect.Item>\n );\n },\n);\n\nSelectItem.displayName = 'SelectItem';\n\n/* ───── Convenience wrapper ───── */\n\nexport type SelectOption = string | { value: string; label: ReactNode };\n\nexport interface SelectProps extends Omit<RadixSelect.SelectProps, 'children'> {\n /** Array of strings, or `{value, label}` objects. */\n options: SelectOption[];\n /** Placeholder shown when nothing is selected. */\n placeholder?: string;\n /** Trigger size. */\n size?: keyof typeof triggerClasses;\n /** Optional className for the trigger. */\n className?: string;\n /** Accessible label forwarded to the trigger button. */\n 'aria-label'?: string;\n /** ID of an element labelling the trigger. */\n 'aria-labelledby'?: string;\n}\n\n/**\n * One-line Select. For composition (groups, separators), use the lower-level\n * `SelectRoot/Trigger/Content/Item` exports directly.\n */\nexport function Select({\n options,\n placeholder = 'Select…',\n size,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...rootProps\n}: SelectProps) {\n return (\n <RadixSelect.Root {...rootProps}>\n <SelectTrigger\n size={size}\n className={className}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options.map((opt) => {\n const value = typeof opt === 'string' ? opt : opt.value;\n const label = typeof opt === 'string' ? opt : opt.label;\n return (\n <SelectItem key={value} value={value}>\n {label}\n </SelectItem>\n );\n })}\n </SelectContent>\n </RadixSelect.Root>\n );\n}\n","'use client';\n\nimport * as RadixSlider from '@radix-ui/react-slider';\nimport { forwardRef, useCallback, useState } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface SliderProps extends Omit<\n RadixSlider.SliderProps,\n 'asChild' | 'value' | 'defaultValue' | 'onValueChange'\n> {\n /** Show the numeric value to the right of the track. */\n showValue?: boolean;\n /** Pixel width or any CSS length. Defaults to `240`. */\n width?: number | string;\n /**\n * Per-thumb accessible names for multi-thumb (range) sliders. The label at\n * each index is forwarded to the corresponding `<RadixSlider.Thumb>`. When\n * omitted, every thumb falls back to `aria-label`/`aria-labelledby` (or the\n * literal `'Value'` when neither is provided).\n */\n thumbLabels?: ReadonlyArray<string>;\n /**\n * Controlled value. Accepts a scalar for single-thumb sliders or an array\n * for multi-thumb (range) sliders. The shape passed in mirrors the shape\n * passed back to `onValueChange`.\n */\n value?: number | number[];\n /** Uncontrolled initial value. Same scalar/array semantics as `value`. */\n defaultValue?: number | number[];\n /**\n * Fires when the value changes. The argument shape mirrors the input shape:\n * if `value`/`defaultValue` is a scalar, `next` is a scalar; if it's an\n * array, `next` is an array.\n */\n onValueChange?: (next: number | number[]) => void;\n}\n\n/**\n * Range slider. Built on Radix Slider for keyboard support (arrow keys nudge,\n * Page Up/Down jumps, Home/End snap to extremes).\n *\n * Pass `aria-label` / `aria-labelledby` to name a single-thumb slider; pass\n * `thumbLabels` to name each thumb in a multi-thumb (range) slider.\n */\nexport const Slider = forwardRef<HTMLSpanElement, SliderProps>(function Slider(\n {\n showValue,\n width = 240,\n className,\n value,\n defaultValue,\n onValueChange,\n thumbLabels,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...props\n },\n ref,\n) {\n // Radix Slider's value is always an array; we accept either form for ergonomics.\n const arrValue = Array.isArray(value)\n ? value\n : value !== undefined\n ? [value as unknown as number]\n : undefined;\n const arrDefault = Array.isArray(defaultValue)\n ? defaultValue\n : defaultValue !== undefined\n ? [defaultValue as unknown as number]\n : undefined;\n\n // Uncontrolled tracking so `showValue` follows the thumb as it's dragged.\n // Without this, `display` is computed once from `defaultValue` and Radix's\n // own internal state drifts away from what we render. We deliberately do\n // not useEffect-sync from `arrValue` — that allocates a fresh array per\n // render and would re-fire on every render, causing an infinite loop.\n // Instead we read `arrValue` directly in controlled mode and only fall\n // back to local state when uncontrolled.\n const isControlled = arrValue !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = useState<number[] | undefined>(arrDefault);\n const currentValue = isControlled ? arrValue : uncontrolledValue;\n\n // Per-render snapshot of the prop shape — drives whether `onValueChange`\n // reports a scalar or an array. With both `value` and `defaultValue`\n // undefined this is `false` (matches Radix's native array shape). The\n // variable describes *this render*, not a stable identity: if a consumer\n // later supplies a scalar `value`, the callback shape switches on the\n // next render to match.\n const wasScalar = !Array.isArray(value ?? defaultValue) && (value ?? defaultValue) !== undefined;\n const handleValueChange = useCallback(\n (next: number[]) => {\n if (!isControlled) setUncontrolledValue(next);\n if (onValueChange) {\n onValueChange(wasScalar ? (next[0] ?? 0) : next);\n }\n },\n [isControlled, onValueChange, wasScalar],\n );\n\n const display = currentValue?.[0] ?? props.min ?? 0;\n\n // Determine how many thumbs to render. Radix derives the count from the\n // value/defaultValue array length; mirror that here so we can render one\n // Thumb per slot with its own per-thumb name.\n const thumbCount = (arrValue ?? arrDefault)?.length ?? 1;\n\n return (\n <span\n ref={ref}\n className={cn('inline-flex items-center gap-[10px]', className)}\n style={{ width }}\n >\n <RadixSlider.Root\n value={arrValue}\n defaultValue={arrDefault}\n onValueChange={handleValueChange}\n className=\"relative flex h-4 flex-1 touch-none items-center select-none\"\n {...props}\n >\n <RadixSlider.Track className=\"bg-panel-2 relative h-1 grow rounded-full\">\n <RadixSlider.Range className=\"bg-accent absolute h-full rounded-full\" />\n </RadixSlider.Track>\n {Array.from({ length: thumbCount }, (_, i) => {\n const perThumb = thumbLabels?.[i];\n // aria-labelledby wins when there's no per-thumb override.\n const thumbAriaLabel = perThumb ?? (ariaLabelledBy ? undefined : (ariaLabel ?? 'Value'));\n return (\n <RadixSlider.Thumb\n key={i}\n className={cn(\n 'bg-text border-accent block h-[14px] w-[14px] rounded-full border-2 shadow',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'cursor-grab active:cursor-grabbing',\n )}\n aria-label={thumbAriaLabel}\n aria-labelledby={perThumb ? undefined : ariaLabelledBy}\n />\n );\n })}\n </RadixSlider.Root>\n {showValue && (\n <span className=\"text-text-muted min-w-[28px] text-right font-mono text-[11px]\">\n {display}\n </span>\n )}\n </span>\n );\n});\n\nSlider.displayName = 'Slider';\n","'use client';\n\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport { forwardRef, useId, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface SwitchProps extends Omit<RadixSwitch.SwitchProps, 'asChild' | 'children'> {\n /** Optional inline label rendered to the right of the switch. */\n label?: ReactNode;\n /** Visual size. Default `md`. */\n size?: 'sm' | 'md';\n}\n\nconst trackClasses = {\n sm: 'h-4 w-7',\n md: 'h-5 w-9',\n} as const;\n\nconst thumbClasses = {\n sm: 'h-3 w-3 data-[state=checked]:translate-x-3',\n md: 'h-4 w-4 data-[state=checked]:translate-x-4',\n} as const;\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { label, size = 'md', className, id: idProp, ...props },\n ref,\n) {\n const reactId = useId();\n const id = idProp ?? `sw-${reactId}`;\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-2 select-none',\n props.disabled && 'cursor-not-allowed opacity-40',\n className,\n )}\n >\n <RadixSwitch.Root\n ref={ref}\n id={id}\n className={cn(\n 'relative inline-flex shrink-0 cursor-pointer rounded-full border transition-colors duration-(--duration-micro)',\n 'bg-panel-2 border-border data-[state=checked]:bg-accent data-[state=checked]:border-accent',\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed',\n trackClasses[size],\n )}\n {...props}\n >\n <RadixSwitch.Thumb\n className={cn(\n 'bg-text absolute top-1/2 left-[1px] -translate-y-1/2 rounded-full shadow-sm',\n 'data-[state=checked]:bg-on-accent transition-transform duration-(--duration-micro)',\n thumbClasses[size],\n )}\n />\n </RadixSwitch.Root>\n {label && (\n <label htmlFor={id} className=\"cursor-pointer text-[13px]\">\n {label}\n </label>\n )}\n </span>\n );\n});\n\nSwitch.displayName = 'Switch';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type TextareaHTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst textareaStyles = cva(\n [\n 'w-full font-sans text-text bg-panel rounded-md p-[10px]',\n 'border outline-none transition-[border-color,box-shadow] duration-(--duration-micro)',\n 'placeholder:text-text-dim resize-y',\n 'focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-panel-2',\n ],\n {\n variants: {\n tone: {\n default: 'border-border focus-visible:border-accent focus-visible:ring-accent-dim',\n err: 'border-err focus-visible:border-err focus-visible:ring-err/30',\n },\n },\n defaultVariants: { tone: 'default' },\n },\n);\n\nexport interface TextareaProps\n extends TextareaHTMLAttributes<HTMLTextAreaElement>, VariantProps<typeof textareaStyles> {\n /** Error tone shortcut. Sets `aria-invalid` and the error border. */\n error?: boolean;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { tone, error, rows = 4, className, ...props },\n ref,\n) {\n return (\n <textarea\n ref={ref}\n rows={rows}\n aria-invalid={error || undefined}\n className={cn(textareaStyles({ tone: error ? 'err' : tone }), className)}\n {...props}\n />\n );\n});\n\nTextarea.displayName = 'Textarea';\n","'use client';\n\nimport * as RadixAvatar from '@radix-ui/react-avatar';\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\nimport { stateLabel } from '../StatusDot/StatusDot';\n\nimport { sizePx } from './sizes';\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type AvatarStatus = 'ok' | 'warn' | 'err' | 'off';\n\nconst statusBg: Record<AvatarStatus, string> = {\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n off: 'bg-text-dim',\n};\n\nfunction initialsFor(name: string): string {\n return (name || '?')\n .split(/\\s+/)\n .map((p) => p[0] ?? '')\n .join('')\n .slice(0, 2)\n .toUpperCase();\n}\n\nfunction hashHue(str: string): number {\n let h = 0;\n for (let i = 0; i < str.length; i++) h = (h * 31 + str.charCodeAt(i)) % 360;\n return h;\n}\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n /** Display name. Used to derive initials and a deterministic background color. */\n name?: string;\n /** Image source. Falls back to initials if loading fails. */\n src?: string;\n /** Predefined size: xs (20) / sm (24) / md (32) / lg (40) / xl (56). */\n size?: AvatarSize;\n /** Optional presence indicator. */\n status?: AvatarStatus;\n /** Override the auto-generated initials (e.g., for non-Latin scripts). */\n initials?: string;\n}\n\n/**\n * Person/entity avatar. Auto-generates initials and a stable background color from\n * `name`. When `src` is provided, it's the primary; initials show during load and\n * after a load failure.\n */\nexport const Avatar = forwardRef<HTMLSpanElement, AvatarProps>(function Avatar(\n { name = '?', src, size = 'md', status, initials, className, style, ...props },\n ref,\n) {\n const dim = sizePx[size];\n const hue = hashHue(name);\n const computedInitials = initials ?? initialsFor(name);\n\n return (\n <span\n ref={ref}\n className={cn('relative inline-block', className)}\n style={{ width: dim, height: dim, ...style }}\n {...props}\n >\n <RadixAvatar.Root\n className=\"border-border relative inline-flex h-full w-full shrink-0 overflow-hidden rounded-full border\"\n style={{\n background: src\n ? undefined\n : `oklch(var(--color-avatar-fallback-l) var(--color-avatar-fallback-c) ${hue})`,\n }}\n >\n {src && <RadixAvatar.Image src={src} alt={name} className=\"h-full w-full object-cover\" />}\n <RadixAvatar.Fallback\n className=\"flex h-full w-full items-center justify-center font-sans font-semibold text-white\"\n style={{ fontSize: dim * 0.38 }}\n >\n {computedInitials}\n </RadixAvatar.Fallback>\n </RadixAvatar.Root>\n {status && (\n <span\n role=\"img\"\n aria-label={stateLabel[status]}\n className={cn(\n 'border-bg absolute right-0 bottom-0 rounded-full border-[2px]',\n statusBg[status],\n )}\n style={{ width: dim * 0.3, height: dim * 0.3 }}\n />\n )}\n </span>\n );\n});\n\nAvatar.displayName = 'Avatar';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type StatusState = 'ok' | 'warn' | 'err' | 'off' | 'sync' | 'accent';\n\nexport interface StatusDotProps extends HTMLAttributes<HTMLSpanElement> {\n /** Semantic status. */\n state?: StatusState;\n /** Optional label rendered next to the dot. */\n label?: ReactNode;\n /** Pulse the dot — used for `sync` state to indicate live activity. */\n pulse?: boolean;\n /** Pixel diameter. Defaults to 8px. */\n size?: number;\n}\n\nconst stateColor: Record<StatusState, string> = {\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n off: 'bg-text-dim',\n sync: 'bg-accent',\n accent: 'bg-accent',\n};\n\nconst stateText: Record<StatusState, string> = {\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n off: 'text-text-dim',\n sync: 'text-accent',\n accent: 'text-accent',\n};\n\n/**\n * Human-friendly accessible names for each status. Used as the default\n * `aria-label` when no `label` is provided so screen readers announce\n * \"Online\" instead of the raw enum token \"ok\". Exported so other components\n * (e.g., `Avatar`'s status indicator) can reuse the same vocabulary.\n */\nexport const stateLabel: Record<StatusState, string> = {\n ok: 'Online',\n warn: 'Warning',\n err: 'Error',\n off: 'Offline',\n sync: 'Syncing',\n accent: 'Active',\n};\n\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(function StatusDot(\n { state = 'ok', label, pulse, size = 8, className, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n role={label ? 'status' : 'img'}\n aria-label={!label ? stateLabel[state] : undefined}\n className={cn('inline-flex items-center gap-[6px]', className)}\n {...props}\n >\n <span\n className={cn(\n 'inline-block rounded-full',\n stateColor[state],\n pulse && 'animate-[ship-pulse-ring_1.6s_infinite]',\n stateText[state],\n )}\n style={{ width: size, height: size }}\n />\n {label && <span className=\"text-text-muted text-[12px]\">{label}</span>}\n </span>\n );\n});\n\nStatusDot.displayName = 'StatusDot';\n","import type { AvatarSize } from './Avatar';\n\n/**\n * Pixel dimensions for each avatar size token. Shared by `Avatar` and\n * `AvatarGroup` so the visual scale stays in lockstep.\n */\nexport const sizePx: Record<AvatarSize, number> = {\n xs: 20,\n sm: 24,\n md: 32,\n lg: 40,\n xl: 56,\n};\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { Avatar, type AvatarSize } from './Avatar';\nimport { sizePx } from './sizes';\n\nexport interface AvatarGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Names rendered as stacked avatars. */\n names: string[];\n /** Maximum avatars before collapsing into a `+N` chip. Defaults to 3. */\n max?: number;\n /** Avatar size for the whole group. */\n size?: AvatarSize;\n}\n\n/**\n * Stacked avatars with overflow chip. Each avatar's initials and color is\n * deterministic from its name.\n */\nexport const AvatarGroup = forwardRef<HTMLDivElement, AvatarGroupProps>(function AvatarGroup(\n { names, max = 3, size = 'md', className, ...props },\n ref,\n) {\n const dim = sizePx[size];\n const visible = names.slice(0, max);\n const rest = names.length - visible.length;\n const overlap = -dim * 0.35;\n\n return (\n <div ref={ref} className={cn('inline-flex', className)} {...props}>\n {visible.map((n, i) => (\n <span key={`${n}-${i}`} style={{ marginLeft: i === 0 ? 0 : overlap }}>\n <Avatar name={n} size={size} />\n </span>\n ))}\n {rest > 0 && (\n <span\n aria-label={`+${rest} more`}\n className=\"bg-panel-2 border-border text-text-muted grid place-items-center rounded-full border font-mono\"\n style={{\n width: dim,\n height: dim,\n marginLeft: overlap,\n fontSize: dim * 0.35,\n }}\n >\n +{rest}\n </span>\n )}\n </div>\n );\n});\n\nAvatarGroup.displayName = 'AvatarGroup';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst badgeStyles = cva('inline-flex items-center font-sans leading-none whitespace-nowrap', {\n variants: {\n variant: {\n neutral: 'bg-panel-2 text-text-muted border border-border',\n accent: 'bg-accent-dim text-accent border border-transparent',\n ok: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_85%)] text-ok border border-transparent',\n warn: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_85%)] text-warn border border-transparent',\n err: 'bg-[color-mix(in_oklab,var(--color-err),transparent_85%)] text-err border border-transparent',\n purple:\n 'bg-[color-mix(in_oklab,var(--color-purple),transparent_85%)] text-purple border border-transparent',\n pink: 'bg-[color-mix(in_oklab,var(--color-pink),transparent_85%)] text-pink border border-transparent',\n outline: 'bg-transparent text-text border border-border-strong',\n solid: 'bg-text text-bg border border-text',\n },\n size: {\n sm: 'h-[18px] px-[6px] py-[1px] text-[10px] gap-1 rounded-full',\n md: 'h-[22px] px-2 py-[2px] text-[11px] gap-[5px] rounded-full',\n lg: 'h-[26px] px-[10px] py-[3px] text-[12px] gap-[6px] rounded-full',\n },\n },\n defaultVariants: { variant: 'neutral', size: 'md' },\n});\n\nexport interface BadgeProps\n extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeStyles> {\n /** Show a colored leading dot. */\n dot?: boolean;\n /** Optional leading icon (defers to children). */\n icon?: ReactNode;\n}\n\nconst dotColorClass = {\n neutral: 'bg-text-dim',\n accent: 'bg-accent',\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n purple: 'bg-purple',\n pink: 'bg-pink',\n outline: 'bg-text-muted',\n solid: 'bg-bg',\n} as const;\n\nconst dotSize = { sm: 'h-[5px] w-[5px]', md: 'h-[6px] w-[6px]', lg: 'h-[7px] w-[7px]' } as const;\n\ntype BadgeSize = keyof typeof dotSize;\ntype BadgeVariant = keyof typeof dotColorClass;\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant = 'neutral', size = 'md', dot, icon, className, children, ...props },\n ref,\n) {\n const sz = (size ?? 'md') as BadgeSize;\n const v = (variant ?? 'neutral') as BadgeVariant;\n return (\n <span ref={ref} className={cn(badgeStyles({ variant, size }), className)} {...props}>\n {dot && (\n <span\n aria-hidden\n className={cn('inline-block rounded-full', dotSize[sz], dotColorClass[v])}\n />\n )}\n {icon && <span className=\"inline-flex leading-none\">{icon}</span>}\n {children}\n </span>\n );\n});\n\nBadge.displayName = 'Badge';\n\nexport { badgeStyles };\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type AnchorHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst cardStyles = cva(\n 'block bg-panel border border-border rounded-base transition-[border-color,transform,box-shadow] duration-(--duration-step)',\n {\n variants: {\n variant: {\n default: '',\n ghost: 'bg-transparent',\n elevated: 'shadow',\n },\n interactive: {\n true: 'cursor-pointer hover:border-border-strong hover:-translate-y-px hover:shadow',\n false: '',\n },\n },\n defaultVariants: { variant: 'default', interactive: false },\n },\n);\n\nexport interface CardProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'>, VariantProps<typeof cardStyles> {\n /** Render a header row with this title (and optional `actions`). */\n title?: ReactNode;\n /** Description shown under the title (or above children when no title). */\n description?: ReactNode;\n /** Action slot rendered to the right of the title. */\n actions?: ReactNode;\n /** Footer slot rendered with a top divider beneath children. */\n footer?: ReactNode;\n /**\n * Keyboard activation handler. When provided, Enter/Space on a card with\n * `role=\"button\"` (i.e. `interactive` truthy) calls this instead of\n * synthesizing a fake mouse event for `onClick` — downstream `e.button` /\n * `e.clientX` reads from the synthesized event are `undefined`, so prefer\n * `onActivate` when you need an intent-only callback.\n */\n onActivate?: () => void;\n}\n\n/**\n * Standard surface for a chunk of content. All cards share the same chrome\n * (panel bg, 1px border, 10px radius); variation comes from what's inside.\n *\n * Compose with the `<Card title=\"…\" actions={…} footer={…}>` API for simple\n * cases, or pass children directly for full control.\n *\n * NOTE on `interactive`: a card with `interactive` resolves to\n * `role=\"button\" tabIndex=0`. If the same card also renders interactive\n * children (e.g. via `actions`), screen readers see a button-inside-button —\n * an axe `nested-interactive` violation. For \"the whole card is one link\"\n * use `<CardLink>` instead. In the actions-present + interactive case we\n * downgrade to a plain `<div>` (and warn in dev) so the assistive-tech tree\n * stays valid.\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n {\n variant,\n interactive,\n title,\n description,\n actions,\n footer,\n className,\n children,\n onClick,\n onActivate,\n ...props\n },\n ref,\n) {\n const wantsInteractive = interactive ?? Boolean(onClick);\n const hasActions = actions != null;\n // Nested-interactive guard: a card containing action buttons must not itself\n // claim role=\"button\". Drop the role/tabIndex but keep the click handler so\n // background activation still fires for non-AT users.\n if (wantsInteractive && hasActions && process.env.NODE_ENV !== 'production') {\n console.warn(\n '[Card] `interactive` was requested but `actions` is also set, which would create a nested-interactive a11y violation. The card will render as a plain <div>. Use <CardLink> for whole-card links, or move the actions outside the card.',\n );\n }\n const isInteractive = wantsInteractive && !hasActions;\n const handleKeyDown = isInteractive\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n if (onActivate) {\n e.preventDefault();\n onActivate();\n } else if (onClick) {\n e.preventDefault();\n // Fallback: callers that didn't pass onActivate still need keyboard\n // parity with mouse, so synthesize a minimal event. Reads of\n // mouse-only fields (`e.button`, `e.clientX`) will be undefined —\n // hence the preference for onActivate above.\n onClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n }\n : undefined;\n return (\n <div\n ref={ref}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n role={isInteractive ? 'button' : undefined}\n tabIndex={isInteractive ? 0 : undefined}\n className={cn(cardStyles({ variant, interactive: wantsInteractive }), 'p-[18px]', className)}\n {...props}\n >\n {(title || actions) && (\n <div className={cn('flex items-start gap-3', (description || children) && 'mb-[10px]')}>\n {title && <div className=\"flex-1 text-[14px] font-medium\">{title}</div>}\n {actions && <div className=\"flex gap-1\">{actions}</div>}\n </div>\n )}\n {description && (\n <div className={cn('text-text-muted text-[12px] leading-[1.55]', children && 'mb-[14px]')}>\n {description}\n </div>\n )}\n {children}\n {footer && (\n <div className=\"border-border text-text-dim mt-[14px] border-t pt-3 text-[11px]\">\n {footer}\n </div>\n )}\n </div>\n );\n});\n\nCard.displayName = 'Card';\n\nexport interface CardLinkProps\n extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'title'>, VariantProps<typeof cardStyles> {\n /** Destination URL. The whole card becomes a single link to this URL. */\n href: string;\n /** Render a header row with this title. */\n title?: ReactNode;\n /** Description shown under the title (or above children when no title). */\n description?: ReactNode;\n /** Footer slot rendered with a top divider beneath children. */\n footer?: ReactNode;\n}\n\n/**\n * Whole-card link. Use this when \"click anywhere on the card\" should\n * navigate — it renders a single `<a>` so assistive tech sees one link\n * (no nested-interactive problem) and the browser handles middle-click,\n * cmd-click, hover preview, etc. without bespoke wiring.\n *\n * Does not accept an `actions` slot: action buttons inside a link are a\n * nested-interactive violation. Put per-card actions next to the card\n * instead, or use the plain `<Card>` for non-link cards.\n */\nexport const CardLink = forwardRef<HTMLAnchorElement, CardLinkProps>(function CardLink(\n { variant, title, description, footer, className, children, href, ...props },\n ref,\n) {\n return (\n <a\n ref={ref}\n href={href}\n className={cn(\n cardStyles({ variant, interactive: true }),\n 'focus-visible:ring-accent-dim p-[18px] no-underline outline-none focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n >\n {title && (\n <div className={cn('flex items-start', (description || children) && 'mb-[10px]')}>\n <div className=\"flex-1 text-[14px] font-medium\">{title}</div>\n </div>\n )}\n {description && (\n <div className={cn('text-text-muted text-[12px] leading-[1.55]', children && 'mb-[14px]')}>\n {description}\n </div>\n )}\n {children}\n {footer && (\n <div className=\"border-border text-text-dim mt-[14px] border-t pt-3 text-[11px]\">\n {footer}\n </div>\n )}\n </a>\n );\n});\n\nCardLink.displayName = 'CardLink';\n\nexport { cardStyles };\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type StatTrend = 'up' | 'down' | 'flat';\n\nexport interface StatCardProps extends HTMLAttributes<HTMLDivElement> {\n /** UPPERCASE eyebrow label above the value. */\n label: ReactNode;\n /** The big number / value. Renders in tabular-nums monospace for ticker comparison. */\n value: ReactNode;\n /** Optional delta string (\"+284 today\", \"-0.3%\"). */\n delta?: ReactNode;\n /** Pairs with `delta` to color the change: up = ok, down = err, flat = neutral. */\n trend?: StatTrend;\n /** Optional trailing icon, top-right. */\n icon?: ReactNode;\n}\n\nconst trendClasses: Record<StatTrend, string> = {\n up: 'text-ok',\n down: 'text-err',\n flat: 'text-text-dim',\n};\n\nconst trendArrows: Record<StatTrend, string> = { up: '↑', down: '↓', flat: '→' };\n\n/**\n * Card subclass for a single metric. Use in dashboard grids; cap at 4 per row.\n */\nexport const StatCard = forwardRef<HTMLDivElement, StatCardProps>(function StatCard(\n { label, value, delta, trend = 'flat', icon, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('bg-panel border-border rounded-base block border p-[18px]', className)}\n {...props}\n >\n <div className=\"mb-[10px] flex items-center justify-between\">\n <div className=\"text-text-dim font-mono text-[10px] tracking-wide uppercase\">{label}</div>\n {icon && <div className=\"text-text-dim text-[14px]\">{icon}</div>}\n </div>\n <div className=\"text-text font-mono text-[26px] leading-none font-medium tracking-tight\">\n {value}\n </div>\n {delta !== undefined && (\n <div className={cn('mt-[6px] font-mono text-[11px]', trendClasses[trend])}>\n {trendArrows[trend]} {delta}\n </div>\n )}\n </div>\n );\n});\n\nStatCard.displayName = 'StatCard';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface ChipProps extends HTMLAttributes<HTMLSpanElement> {\n /** Pill-style leading icon (typically a glyph or `@`/`#`). */\n icon?: ReactNode;\n /**\n * Optional remove handler. When provided, renders an inset close button.\n * Mirrors the `Tag` API — pass `onRemove` and the X is rendered automatically.\n */\n onRemove?: () => void;\n children: ReactNode;\n}\n\n/**\n * Pill-shaped filter chip. Used in command palette tag rows, search filter strips,\n * and AI suggestion lists. Differs from `Tag` by being pill-shaped (full radius)\n * and slightly more decorative.\n */\nexport const Chip = forwardRef<HTMLSpanElement, ChipProps>(function Chip(\n { icon, onRemove, className, children, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n className={cn(\n 'inline-flex h-[26px] items-center gap-[6px] py-[4px] pr-1 pl-[10px] font-sans text-[12px]',\n 'bg-panel-2 text-text border-border rounded-full border',\n className,\n )}\n {...props}\n >\n {icon && <span className=\"text-text-dim inline-flex text-[10px]\">{icon}</span>}\n {children}\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove\"\n className=\"bg-panel text-text-dim hover:text-text grid h-[18px] w-[18px] place-items-center rounded-full text-[10px] leading-none\"\n >\n ×\n </button>\n )}\n </span>\n );\n});\n\nChip.displayName = 'Chip';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type KbdProps = HTMLAttributes<HTMLElement>;\n\n/**\n * Keyboard shortcut display — `<Kbd>⌘</Kbd><Kbd>K</Kbd>`. Uses `<kbd>` semantics\n * so screen readers announce it as a key.\n */\nexport const Kbd = forwardRef<HTMLElement, KbdProps>(function Kbd(\n { className, children, ...props },\n ref,\n) {\n return (\n <kbd\n ref={ref}\n className={cn(\n 'text-text-muted inline-flex items-center font-mono text-[10px] font-medium',\n 'bg-panel border-border rounded-xs border px-[6px] py-[2px]',\n 'border-b-border border-b-[2px]',\n className,\n )}\n {...props}\n >\n {children}\n </kbd>\n );\n});\n\nKbd.displayName = 'Kbd';\n","'use client';\n\nimport * as RadixScrollArea from '@radix-ui/react-scroll-area';\nimport { forwardRef, type HTMLAttributes, type ReactNode, type Ref } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * ScrollArea — token-styled scrollbar primitive built on\n * `@radix-ui/react-scroll-area`. Wraps a viewport with custom scrollbars that\n * match the design tokens (`--color-text-muted` thumb on `--color-panel-2`\n * track) and behave consistently across platforms.\n *\n * Defaults to `type=\"hover\"` so scrollbars fade in only when the pointer is\n * over the area, matching the system feel without the OS-default chrome.\n */\n\nexport type ScrollAreaType = 'auto' | 'always' | 'scroll' | 'hover';\n\nexport interface ScrollAreaProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onScroll' | 'dir'> {\n /** Scrollbar visibility behavior. Default `'hover'`. */\n type?: ScrollAreaType;\n /** Which scrollbars to render. Default `'vertical'`. */\n orientation?: 'vertical' | 'horizontal' | 'both';\n /** Time in ms before scrollbar hides after the last interaction (auto/scroll/hover). */\n scrollHideDelay?: number;\n /** Class applied to the inner viewport rather than the outer root. */\n viewportClassName?: string;\n /**\n * Ref to the inner viewport (the scrollable element). Useful when a consumer\n * wants to drive scroll position imperatively without losing the outer-root\n * ref forwarded as `ref`.\n */\n viewportRef?: Ref<HTMLDivElement>;\n /** Document direction for RTL handling. */\n dir?: 'ltr' | 'rtl';\n children?: ReactNode;\n}\n\nconst scrollbarBase =\n 'flex touch-none select-none p-[2px] transition-colors duration-(--duration-micro)';\nconst thumbBase =\n 'relative flex-1 rounded-full bg-text-muted/40 hover:bg-text-muted/60 before:absolute before:inset-1/2 before:size-full before:min-h-[44px] before:min-w-[44px] before:-translate-x-1/2 before:-translate-y-1/2 before:content-[\"\"]';\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(function ScrollArea(\n {\n type = 'hover',\n orientation = 'vertical',\n scrollHideDelay = 600,\n className,\n viewportClassName,\n viewportRef,\n children,\n ...props\n },\n ref,\n) {\n const showVertical = orientation === 'vertical' || orientation === 'both';\n const showHorizontal = orientation === 'horizontal' || orientation === 'both';\n\n return (\n <RadixScrollArea.Root\n ref={ref}\n type={type}\n scrollHideDelay={scrollHideDelay}\n className={cn('relative overflow-hidden', className)}\n {...props}\n >\n <RadixScrollArea.Viewport\n ref={viewportRef}\n className={cn('h-full w-full rounded-[inherit]', viewportClassName)}\n >\n {children}\n </RadixScrollArea.Viewport>\n {showVertical && (\n <RadixScrollArea.Scrollbar\n orientation=\"vertical\"\n className={cn(scrollbarBase, 'bg-panel-2/40 hover:bg-panel-2/80 h-full w-[10px]')}\n >\n <RadixScrollArea.Thumb className={thumbBase} />\n </RadixScrollArea.Scrollbar>\n )}\n {showHorizontal && (\n <RadixScrollArea.Scrollbar\n orientation=\"horizontal\"\n className={cn(\n scrollbarBase,\n 'bg-panel-2/40 hover:bg-panel-2/80 h-[10px] w-full flex-col',\n )}\n >\n <RadixScrollArea.Thumb className={thumbBase} />\n </RadixScrollArea.Scrollbar>\n )}\n {orientation === 'both' && <RadixScrollArea.Corner className=\"bg-panel-2/60\" />}\n </RadixScrollArea.Root>\n );\n});\n\nScrollArea.displayName = 'ScrollArea';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nconst skeletonStyles = cva('block bg-panel-2 animate-[ship-skeleton_1.4s_infinite]', {\n variants: {\n shape: {\n line: 'rounded-xs',\n block: 'rounded-md',\n circle: 'rounded-full',\n },\n },\n defaultVariants: { shape: 'line' },\n});\n\nexport interface SkeletonProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonStyles> {\n /** Width override — accepts any CSS length, e.g. `'70%'`, `120`. */\n width?: number | string;\n /** Height override. Defaults differ by shape: `line` = 14, `block` = 80, `circle` = 40. */\n height?: number | string;\n /**\n * Render this Skeleton as its own loading announcement (`role=\"status\"`,\n * `aria-busy=\"true\"`, `aria-label=\"Loading\"`). Default `false` — Skeleton is\n * `aria-hidden` so a list of N skeletons does not announce N times. Wrap a\n * group of Skeletons in `<SkeletonGroup>` to get a single aggregate\n * announcement, or set `standalone` when rendering a single isolated\n * Skeleton with no surrounding live region.\n */\n standalone?: boolean;\n}\n\nconst defaultHeight = { line: 14, block: 80, circle: 40 } as const;\n\n/**\n * Visual placeholder for content that is loading. By default, Skeleton is\n * `aria-hidden` and emits no live-region announcement — wrap one or more\n * Skeletons in `<SkeletonGroup loading>` to get a single \"Loading\" message\n * for the whole group. For a single isolated Skeleton outside any group,\n * pass `standalone` to restore the per-element `role=\"status\"` semantic.\n */\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(function Skeleton(\n { shape = 'line', width = '100%', height, standalone = false, className, style, ...props },\n ref,\n) {\n const h = height ?? defaultHeight[shape!];\n const w = shape === 'circle' ? h : width;\n const a11yProps = standalone\n ? ({ role: 'status', 'aria-busy': true, 'aria-label': 'Loading' } as const)\n : ({ 'aria-hidden': true } as const);\n return (\n <div\n ref={ref}\n {...a11yProps}\n className={cn(skeletonStyles({ shape }), className)}\n style={{ width: w, height: h, ...style }}\n {...props}\n />\n );\n});\n\nSkeleton.displayName = 'Skeleton';\n\nexport interface SkeletonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Optional override for the announcement text. Defaults to `\"Loading\"`.\n * Pass something more specific (e.g., `\"Loading inbox\"`) when the context\n * makes it useful.\n */\n label?: string;\n /**\n * When `false`, the group renders as a plain wrapper with no live region —\n * useful when toggling between loading and loaded children inside the same\n * mount. Default `true`.\n */\n loading?: boolean;\n}\n\n/**\n * Wraps a group of `<Skeleton>` placeholders in a single `role=\"status\"` /\n * `aria-busy=\"true\"` live region so screen readers announce one \"Loading\"\n * message for the whole group instead of one per Skeleton.\n */\nexport const SkeletonGroup = forwardRef<HTMLDivElement, SkeletonGroupProps>(function SkeletonGroup(\n { label = 'Loading', loading = true, className, children, ...props },\n ref,\n) {\n if (!loading) {\n return (\n <div ref={ref} className={className} {...props}>\n {children as ReactNode}\n </div>\n );\n }\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-busy=\"true\"\n aria-label={label}\n className={className}\n {...props}\n >\n {children as ReactNode}\n </div>\n );\n});\n\nSkeletonGroup.displayName = 'SkeletonGroup';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n /** Optional close button. When provided, a `×` rendered on the right calls it. */\n onRemove?: () => void;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Pixel height. Defaults to 22px. */\n size?: number;\n children: ReactNode;\n}\n\n/**\n * Compact label with optional remove button. Used for selected filters,\n * applied tags, mention tokens.\n */\nexport const Tag = forwardRef<HTMLSpanElement, TagProps>(function Tag(\n { onRemove, icon, size = 22, className, children, ...props },\n ref,\n) {\n return (\n <span\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-[6px] px-2 py-[3px] font-sans text-[11px]',\n 'bg-panel-2 text-text border-border rounded-xs border',\n className,\n )}\n style={{ height: size }}\n {...props}\n >\n {icon && <span className=\"text-text-dim inline-flex\">{icon}</span>}\n {children}\n {onRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove\"\n className=\"text-text-dim hover:text-text px-[2px] leading-none\"\n >\n ×\n </button>\n )}\n </span>\n );\n});\n\nTag.displayName = 'Tag';\n","'use client';\n\nimport * as RadixContext from '@radix-ui/react-context-menu';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const ContextMenuRoot = RadixContext.Root;\nexport const ContextMenuTrigger = RadixContext.Trigger;\nexport const ContextMenuPortal = RadixContext.Portal;\n\nexport const ContextMenuContent = forwardRef<HTMLDivElement, RadixContext.ContextMenuContentProps>(\n function ContextMenuContent({ className, ...props }, ref) {\n return (\n <RadixContext.Portal>\n <RadixContext.Content\n ref={ref}\n className={cn(\n 'bg-panel border-border-strong z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixContext.Portal>\n );\n },\n);\n\nContextMenuContent.displayName = 'ContextMenuContent';\n\nconst itemBase = cn(\n 'flex items-center gap-2 px-[10px] py-[6px] rounded-sm text-[12px] cursor-pointer outline-none',\n 'data-[highlighted]:bg-panel-2',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed',\n);\n\nexport interface ContextMenuItemProps extends RadixContext.ContextMenuItemProps {\n icon?: ReactNode;\n trailing?: ReactNode;\n destructive?: boolean;\n}\n\nexport const ContextMenuItem = forwardRef<HTMLDivElement, ContextMenuItemProps>(\n function ContextMenuItem({ icon, trailing, destructive, className, children, ...props }, ref) {\n return (\n <RadixContext.Item\n ref={ref}\n className={cn(itemBase, destructive ? 'text-err' : 'text-text', className)}\n {...props}\n >\n {icon && <span className=\"w-[14px] text-[12px] opacity-70\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n {trailing && <span className=\"text-text-dim font-mono text-[10px]\">{trailing}</span>}\n </RadixContext.Item>\n );\n },\n);\n\nContextMenuItem.displayName = 'ContextMenuItem';\n\nexport const ContextMenuSeparator = forwardRef<\n HTMLDivElement,\n RadixContext.ContextMenuSeparatorProps\n>(function ContextMenuSeparator({ className, ...props }, ref) {\n return (\n <RadixContext.Separator\n ref={ref}\n className={cn('bg-border my-1 h-[1px]', className)}\n {...props}\n />\n );\n});\n\nContextMenuSeparator.displayName = 'ContextMenuSeparator';\n\nexport const ContextMenu = RadixContext.Root;\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Modal dialog. Built on Radix Dialog so focus trap, ESC, and ARIA come for free.\n *\n * Two APIs:\n * 1. Composition: `<Dialog open={…}><DialogContent>…</DialogContent></Dialog>`\n * 2. Convenience: `<Dialog open={…} title=\"…\" description=\"…\" footer={…}>body</Dialog>`\n */\n\nexport const DialogRoot = RadixDialog.Root;\nexport const DialogTrigger = RadixDialog.Trigger;\nexport const DialogClose = RadixDialog.Close;\nexport const DialogPortal = RadixDialog.Portal;\n\nexport const DialogOverlay = forwardRef<HTMLDivElement, RadixDialog.DialogOverlayProps>(\n function DialogOverlay({ className, ...props }, ref) {\n return (\n <RadixDialog.Overlay\n ref={ref}\n className={cn(\n 'z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]',\n 'data-[state=open]:animate-[ship-fade-in_150ms_ease]',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nDialogOverlay.displayName = 'DialogOverlay';\n\nexport interface DialogContentProps extends RadixDialog.DialogContentProps {\n /** Pixel max-width of the panel. Defaults to 460. */\n width?: number | string;\n}\n\nexport const DialogContent = forwardRef<HTMLDivElement, DialogContentProps>(function DialogContent(\n { className, width = 460, style, children, ...props },\n ref,\n) {\n return (\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n className={cn(\n 'z-modal fixed top-1/2 left-1/2 w-[calc(100%-40px)] -translate-x-1/2 -translate-y-1/2 p-6',\n 'bg-panel border-border-strong rounded-lg border shadow-lg',\n 'data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]',\n 'outline-none',\n className,\n )}\n style={{ maxWidth: width, ...style }}\n {...props}\n >\n {children}\n </RadixDialog.Content>\n </DialogPortal>\n );\n});\n\nDialogContent.displayName = 'DialogContent';\n\nexport interface DialogProps extends RadixDialog.DialogProps {\n /** Convenience: title rendered with proper heading semantics. */\n title?: ReactNode;\n /** Convenience: description rendered with proper a11y description. */\n description?: ReactNode;\n /** Footer slot — typically buttons. */\n footer?: ReactNode;\n /** Pixel max-width of the panel. */\n width?: number | string;\n /** When set, content is wrapped in a content frame; omit for full custom layout. */\n children?: ReactNode;\n}\n\nexport function Dialog({ title, description, footer, width, children, ...rootProps }: DialogProps) {\n // If consumer passed only children, render in convenience mode.\n return (\n <DialogRoot {...rootProps}>\n <DialogContent width={width}>\n {title && (\n <RadixDialog.Title\n className={cn('text-[16px] font-medium', description ? 'mb-[6px]' : 'mb-4')}\n >\n {title}\n </RadixDialog.Title>\n )}\n {description && (\n <RadixDialog.Description className=\"text-text-muted mb-[18px] text-[13px] leading-[1.55]\">\n {description}\n </RadixDialog.Description>\n )}\n {children}\n {footer && <div className=\"mt-5 flex justify-end gap-2\">{footer}</div>}\n </DialogContent>\n </DialogRoot>\n );\n}\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { DialogOverlay, DialogPortal, DialogRoot } from './Dialog';\n\nexport type DrawerSide = 'left' | 'right';\n\nexport interface DrawerProps extends RadixDialog.DialogProps {\n /** Side the drawer slides in from. */\n side?: DrawerSide;\n /** Title rendered in the drawer header (with built-in close button). */\n title?: ReactNode;\n /** Width override. Defaults to 420. */\n width?: number | string;\n children?: ReactNode;\n}\n\nconst sideClasses: Record<DrawerSide, string> = {\n left: 'left-0 border-r border-border-strong data-[state=open]:animate-[ship-slide-in-left_220ms_var(--easing-out)]',\n right:\n 'right-0 border-l border-border-strong data-[state=open]:animate-[ship-slide-in-right_220ms_var(--easing-out)]',\n};\n\nconst DrawerHeader = ({ title, onClose }: { title: ReactNode; onClose?: () => void }) => (\n <div className=\"border-border flex items-center justify-between border-b p-[16px] px-5\">\n <RadixDialog.Title className=\"text-[14px] font-medium\">{title}</RadixDialog.Title>\n <RadixDialog.Close\n onClick={onClose}\n aria-label=\"Close\"\n className=\"text-text-dim hover:text-text p-1 text-[18px] leading-none\"\n >\n ×\n </RadixDialog.Close>\n </div>\n);\n\n/**\n * Side-panel overlay. Same focus-trap + ESC + backdrop semantics as Dialog,\n * just slid in from the side.\n */\nexport const Drawer = forwardRef<HTMLDivElement, DrawerProps>(function Drawer(\n { side = 'right', title, width = 420, children, ...rootProps },\n ref,\n) {\n return (\n <DialogRoot {...rootProps}>\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n aria-describedby={undefined}\n className={cn(\n 'bg-panel z-modal fixed top-0 bottom-0 flex flex-col shadow-lg outline-none',\n sideClasses[side],\n )}\n style={{ width }}\n >\n {title ? (\n <DrawerHeader title={title} />\n ) : (\n <RadixDialog.Title className=\"sr-only\">Drawer</RadixDialog.Title>\n )}\n <div className=\"flex-1 overflow-auto p-5\">{children}</div>\n </RadixDialog.Content>\n </DialogPortal>\n </DialogRoot>\n );\n});\n\nDrawer.displayName = 'Drawer';\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { DialogOverlay, DialogPortal, DialogRoot } from './Dialog';\n\nexport interface SheetProps extends RadixDialog.DialogProps {\n /** Optional title rendered above the body. */\n title?: ReactNode;\n /** Width override. Defaults to `min(640px, 90vw)`. */\n width?: number | string;\n children?: ReactNode;\n}\n\n/**\n * Bottom sheet overlay. Slides up from the bottom edge of the viewport. Useful\n * for quick actions on mobile-leaning surfaces.\n */\nexport const Sheet = forwardRef<HTMLDivElement, SheetProps>(function Sheet(\n { title, width = 'min(640px, 90vw)', children, ...rootProps },\n ref,\n) {\n return (\n <DialogRoot {...rootProps}>\n <DialogPortal>\n <DialogOverlay />\n <RadixDialog.Content\n ref={ref}\n aria-describedby={undefined}\n className={cn(\n 'z-modal fixed bottom-0 left-1/2 -translate-x-1/2 p-5',\n 'bg-panel border-border-strong rounded-tl-lg rounded-tr-lg border-t shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-slide-in-bottom_220ms_var(--easing-out)]',\n )}\n style={{ width }}\n >\n {title ? (\n <RadixDialog.Title className=\"mb-1 text-[15px] font-medium\">{title}</RadixDialog.Title>\n ) : (\n <RadixDialog.Title className=\"sr-only\">Sheet</RadixDialog.Title>\n )}\n {children}\n </RadixDialog.Content>\n </DialogPortal>\n </DialogRoot>\n );\n});\n\nSheet.displayName = 'Sheet';\n","'use client';\n\nimport * as RadixAlert from '@radix-ui/react-alert-dialog';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Confirmation dialog. Stricter than Dialog: cannot be closed by clicking the\n * backdrop, requires an explicit cancel/confirm action.\n */\n\nexport const AlertDialogRoot = RadixAlert.Root;\nexport const AlertDialogTrigger = RadixAlert.Trigger;\nexport const AlertDialogAction = RadixAlert.Action;\nexport const AlertDialogCancel = RadixAlert.Cancel;\n\nexport interface AlertDialogProps extends RadixAlert.AlertDialogProps {\n title: ReactNode;\n description?: ReactNode;\n /** Confirm + cancel buttons or any custom footer slot. */\n footer?: ReactNode;\n width?: number | string;\n}\n\nexport const AlertDialog = forwardRef<HTMLDivElement, AlertDialogProps>(function AlertDialog(\n { title, description, footer, width = 460, children, ...rootProps },\n ref,\n) {\n return (\n <AlertDialogRoot {...rootProps}>\n <RadixAlert.Portal>\n <RadixAlert.Overlay\n className={cn(\n 'z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]',\n 'data-[state=open]:animate-[ship-fade-in_150ms_ease]',\n )}\n />\n <RadixAlert.Content\n ref={ref}\n style={{ maxWidth: width }}\n className={cn(\n 'z-modal fixed top-1/2 left-1/2 w-[calc(100%-40px)] -translate-x-1/2 -translate-y-1/2 p-6',\n 'bg-panel border-border-strong rounded-lg border shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]',\n )}\n >\n <RadixAlert.Title\n className={cn('text-[16px] font-medium', description ? 'mb-[6px]' : 'mb-4')}\n >\n {title}\n </RadixAlert.Title>\n {description && (\n <RadixAlert.Description className=\"text-text-muted mb-[18px] text-[13px] leading-[1.55]\">\n {description}\n </RadixAlert.Description>\n )}\n {children}\n {footer && <div className=\"mt-5 flex justify-end gap-2\">{footer}</div>}\n </RadixAlert.Content>\n </RadixAlert.Portal>\n </AlertDialogRoot>\n );\n});\n\nAlertDialog.displayName = 'AlertDialog';\n","'use client';\n\nimport * as RadixMenu from '@radix-ui/react-dropdown-menu';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const DropdownMenuRoot = RadixMenu.Root;\nexport const DropdownMenuTrigger = RadixMenu.Trigger;\nexport const DropdownMenuPortal = RadixMenu.Portal;\nexport const DropdownMenuGroup = RadixMenu.Group;\nexport const DropdownMenuLabel = RadixMenu.Label;\nexport const DropdownMenuRadioGroup = RadixMenu.RadioGroup;\n\nexport const DropdownMenuContent = forwardRef<HTMLDivElement, RadixMenu.DropdownMenuContentProps>(\n function DropdownMenuContent({ className, sideOffset = 6, align = 'start', ...props }, ref) {\n return (\n <RadixMenu.Portal>\n <RadixMenu.Content\n ref={ref}\n sideOffset={sideOffset}\n align={align}\n className={cn(\n 'bg-panel border-border-strong z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixMenu.Portal>\n );\n },\n);\n\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\nexport interface MenuItemProps extends RadixMenu.DropdownMenuItemProps {\n /** Icon rendered to the left of the label. */\n icon?: ReactNode;\n /** Trailing hint — typically a kbd shortcut. */\n trailing?: ReactNode;\n /** Style as destructive (red). Doesn't change behavior. */\n destructive?: boolean;\n}\n\nconst itemBase = cn(\n 'flex items-center gap-2 px-[10px] py-[6px] rounded-sm text-[12px] cursor-pointer outline-none',\n 'data-[highlighted]:bg-panel-2',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed',\n);\n\nexport const MenuItem = forwardRef<HTMLDivElement, MenuItemProps>(function MenuItem(\n { icon, trailing, destructive, className, children, ...props },\n ref,\n) {\n return (\n <RadixMenu.Item\n ref={ref}\n className={cn(itemBase, destructive ? 'text-err' : 'text-text', className)}\n {...props}\n >\n {icon && <span className=\"w-[14px] text-[12px] opacity-70\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n {trailing && <span className=\"text-text-dim font-mono text-[10px]\">{trailing}</span>}\n </RadixMenu.Item>\n );\n});\n\nMenuItem.displayName = 'MenuItem';\n\nexport const MenuCheckboxItem = forwardRef<HTMLDivElement, RadixMenu.DropdownMenuCheckboxItemProps>(\n function MenuCheckboxItem({ className, children, ...props }, ref) {\n return (\n <RadixMenu.CheckboxItem\n ref={ref}\n className={cn(itemBase, 'text-text relative pl-[26px]', className)}\n {...props}\n >\n <RadixMenu.ItemIndicator className=\"text-accent absolute top-1/2 left-2 -translate-y-1/2 text-[10px]\">\n ✓\n </RadixMenu.ItemIndicator>\n {children}\n </RadixMenu.CheckboxItem>\n );\n },\n);\n\nMenuCheckboxItem.displayName = 'MenuCheckboxItem';\n\nexport const MenuSeparator = forwardRef<HTMLDivElement, RadixMenu.DropdownMenuSeparatorProps>(\n function MenuSeparator({ className, ...props }, ref) {\n return (\n <RadixMenu.Separator\n ref={ref}\n className={cn('bg-border my-1 h-[1px]', className)}\n {...props}\n />\n );\n },\n);\n\nMenuSeparator.displayName = 'MenuSeparator';\n\n/** Convenience export so consumers can `<DropdownMenu>...</DropdownMenu>`. */\nexport const DropdownMenu = RadixMenu.Root;\n","'use client';\n\nimport * as RadixHoverCard from '@radix-ui/react-hover-card';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const HoverCardRoot = RadixHoverCard.Root;\nexport const HoverCardTrigger = RadixHoverCard.Trigger;\nexport const HoverCardPortal = RadixHoverCard.Portal;\n\nexport const HoverCardContent = forwardRef<HTMLDivElement, RadixHoverCard.HoverCardContentProps>(\n function HoverCardContent({ className, sideOffset = 4, ...props }, ref) {\n return (\n <RadixHoverCard.Portal>\n <RadixHoverCard.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'rounded-base bg-panel border-border-strong z-popover border p-[14px] shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixHoverCard.Portal>\n );\n },\n);\n\nHoverCardContent.displayName = 'HoverCardContent';\n\nexport interface HoverCardProps extends RadixHoverCard.HoverCardProps {\n trigger: ReactNode;\n content: ReactNode;\n}\n\n/** Convenience wrapper — pass `trigger` and `content` as props. */\nexport function HoverCard({ trigger, content, ...rootProps }: HoverCardProps) {\n return (\n <RadixHoverCard.Root openDelay={200} closeDelay={120} {...rootProps}>\n <RadixHoverCard.Trigger asChild>{trigger}</RadixHoverCard.Trigger>\n <HoverCardContent>{content}</HoverCardContent>\n </RadixHoverCard.Root>\n );\n}\n","'use client';\n\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { forwardRef } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport const PopoverRoot = RadixPopover.Root;\nexport const PopoverTrigger = RadixPopover.Trigger;\nexport const PopoverAnchor = RadixPopover.Anchor;\nexport const PopoverPortal = RadixPopover.Portal;\nexport const PopoverClose = RadixPopover.Close;\nexport const PopoverArrow = RadixPopover.Arrow;\n\nexport const PopoverContent = forwardRef<HTMLDivElement, RadixPopover.PopoverContentProps>(\n function PopoverContent({ className, align = 'start', sideOffset = 6, ...props }, ref) {\n return (\n <RadixPopover.Portal>\n <RadixPopover.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'bg-panel border-border-strong z-popover rounded-md border p-[6px] shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixPopover.Portal>\n );\n },\n);\n\nPopoverContent.displayName = 'PopoverContent';\n\n/**\n * Convenience export — the Radix Root with our default styles applied to Content.\n *\n * <Popover>\n * <PopoverTrigger asChild><Button>Open</Button></PopoverTrigger>\n * <PopoverContent>…</PopoverContent>\n * </Popover>\n */\nexport const Popover = RadixPopover.Root;\n","'use client';\n\nimport * as RadixToast from '@radix-ui/react-toast';\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\nexport type ToastVariant = 'default' | 'info' | 'ok' | 'warn' | 'err';\n\nexport interface ToastInput {\n /** Optional ID; auto-generated when omitted. Useful for `dismiss(id)`. */\n id?: string;\n variant?: ToastVariant;\n title: ReactNode;\n description?: ReactNode;\n /** Inline action — typically a Button. */\n action?: ReactNode;\n /** Auto-dismiss after N ms. Default 4000. Set to 0 to require manual dismiss. */\n duration?: number;\n}\n\ninterface ToastEntry extends ToastInput {\n id: string;\n}\n\ninterface ToastContextValue {\n toast: (t: ToastInput) => string;\n dismiss: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nconst variantIcon: Record<ToastVariant, string> = {\n default: '●',\n info: 'ℹ',\n ok: '✓',\n warn: '!',\n err: '×',\n};\n\nconst variantTextColor: Record<ToastVariant, string> = {\n default: 'text-text-dim',\n info: 'text-accent',\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n};\n\nconst variantBorderLeft: Record<ToastVariant, string> = {\n default: 'border-l-border',\n info: 'border-l-accent',\n ok: 'border-l-ok',\n warn: 'border-l-warn',\n err: 'border-l-err',\n};\n\n// Module-scope counter for auto-generated IDs. SSR-safe (no browser APIs)\n// and unique within a session — safer than `Math.random()` for keys.\nlet toastIdCounter = 0;\nconst nextToastId = () => `toast-${++toastIdCounter}`;\n\n/**\n * Wrap your app once at the root. Components inside can call `useToast()` to\n * push transient messages from anywhere.\n */\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastEntry[]>([]);\n\n const toast = useCallback((t: ToastInput) => {\n // Only dedupe when the consumer explicitly supplied an id — auto-generated\n // ids never collide, so the `find` would always miss. This makes\n // `toast({ id: 'save-status', ... })` a natural \"replace existing\" API.\n const explicitId = t.id;\n const id = explicitId ?? nextToastId();\n const entry = { ...t, id };\n setToasts((prev) => {\n if (explicitId !== undefined && prev.some((existing) => existing.id === explicitId)) {\n return prev.map((existing) => (existing.id === explicitId ? entry : existing));\n }\n return [...prev, entry];\n });\n return id;\n }, []);\n\n const dismiss = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const value = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);\n\n return (\n <ToastContext.Provider value={value}>\n <RadixToast.Provider swipeDirection=\"right\">\n {children}\n {toasts.map((t) => (\n <ToastCard key={t.id} toast={t} onDismiss={() => dismiss(t.id)} />\n ))}\n <RadixToast.Viewport className=\"z-toast fixed right-5 bottom-5 flex w-[380px] max-w-[calc(100vw-40px)] flex-col gap-2 outline-none\" />\n </RadixToast.Provider>\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be inside <ToastProvider>');\n return ctx;\n}\n\ninterface ToastCardProps {\n toast: ToastEntry;\n onDismiss: () => void;\n}\n\nexport const ToastCard = forwardRef<HTMLLIElement, ToastCardProps>(function ToastCard(\n { toast, onDismiss },\n ref,\n) {\n const variant = toast.variant ?? 'default';\n return (\n <RadixToast.Root\n ref={ref}\n duration={toast.duration ?? 4000}\n onOpenChange={(open) => {\n if (!open) onDismiss();\n }}\n className={cn(\n 'bg-panel border-border pointer-events-auto rounded-md border border-l-[2px] p-3 shadow-lg',\n 'flex items-start gap-[10px]',\n 'data-[state=open]:animate-[ship-toast-in_220ms_var(--easing-out)]',\n variantBorderLeft[variant],\n )}\n >\n <span className={cn('mt-px text-[14px] leading-none', variantTextColor[variant])}>\n {variantIcon[variant]}\n </span>\n <div className=\"min-w-0 flex-1\">\n <RadixToast.Title className=\"text-text text-[13px] font-medium\">\n {toast.title}\n </RadixToast.Title>\n {toast.description && (\n <RadixToast.Description className=\"text-text-muted mt-[2px] text-[12px] leading-[1.5]\">\n {toast.description}\n </RadixToast.Description>\n )}\n {toast.action && <div className=\"mt-2\">{toast.action}</div>}\n </div>\n <RadixToast.Close\n aria-label=\"Dismiss\"\n className=\"text-text-dim hover:text-text -mt-px text-[15px] leading-none\"\n >\n ×\n </RadixToast.Close>\n </RadixToast.Root>\n );\n});\n\nToastCard.displayName = 'ToastCard';\n","'use client';\n\nimport * as RadixTooltip from '@radix-ui/react-tooltip';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Tooltip — small, transient label that appears on hover/focus.\n *\n * Wrap your app once in `<TooltipProvider>` (Radix's provider) for shared delay\n * configuration; a single tooltip can be used standalone via `<Tooltip>` shorthand.\n */\n\nexport const TooltipProvider = RadixTooltip.Provider;\nexport const TooltipRoot = RadixTooltip.Root;\nexport const TooltipTrigger = RadixTooltip.Trigger;\nexport const TooltipPortal = RadixTooltip.Portal;\nexport const TooltipArrow = RadixTooltip.Arrow;\n\nexport const TooltipContent = forwardRef<HTMLDivElement, RadixTooltip.TooltipContentProps>(\n function TooltipContent({ className, sideOffset = 6, ...props }, ref) {\n return (\n <RadixTooltip.Portal>\n <RadixTooltip.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-tooltip pointer-events-none rounded-sm px-2 py-[5px] text-[11px] whitespace-nowrap',\n 'bg-text text-bg',\n 'data-[state=delayed-open]:animate-[ship-pop-in_120ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixTooltip.Portal>\n );\n },\n);\n\nTooltipContent.displayName = 'TooltipContent';\n\nexport interface TooltipProps {\n /** Tooltip text/content. */\n content: ReactNode;\n /** Trigger element — usually a Button or IconButton. */\n children: ReactNode;\n /** Side: top (default) | right | bottom | left. */\n side?: RadixTooltip.TooltipContentProps['side'];\n /** Open/close delay in ms (overrides provider default). */\n delayDuration?: number;\n}\n\n/**\n * One-liner tooltip wrapper. Wraps a trigger child with the full Radix stack.\n * For composition (multiple triggers in a list), use the lower-level exports.\n */\nexport function Tooltip({ content, children, side = 'top', delayDuration = 400 }: TooltipProps) {\n return (\n <TooltipProvider delayDuration={delayDuration}>\n <TooltipRoot>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side}>{content}</TooltipContent>\n </TooltipRoot>\n </TooltipProvider>\n );\n}\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Alert — inline messaging block. Four tones (accent / ok / warn / err) with a\n * matching glyph, a left accent rule, and an optional dismiss action.\n *\n * For interrupting alerts (errors that need acknowledgment) use AlertDialog.\n * For transient feedback use Toast.\n */\n\nexport type AlertTone = 'accent' | 'ok' | 'warn' | 'err';\n\nconst alertStyles = cva('flex items-start gap-3 rounded-base border bg-panel p-3 text-[13px]', {\n variants: {\n tone: {\n accent: 'border-border border-l-2 border-l-accent',\n ok: 'border-border border-l-2 border-l-ok',\n warn: 'border-border border-l-2 border-l-warn',\n err: 'border-border border-l-2 border-l-err',\n },\n },\n defaultVariants: { tone: 'accent' },\n});\n\nconst iconColorClass: Record<AlertTone, string> = {\n accent: 'text-accent',\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n};\n\nconst defaultGlyph: Record<AlertTone, string> = {\n accent: 'ℹ',\n ok: '✓',\n warn: '!',\n err: '×',\n};\n\nexport interface AlertProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'>, VariantProps<typeof alertStyles> {\n /** Bold title text. */\n title?: ReactNode;\n /** Body description. */\n description?: ReactNode;\n /** Icon override; defaults to a glyph matched to the tone. */\n icon?: ReactNode;\n /** Optional trailing actions (rendered to the right of the description). */\n action?: ReactNode;\n /**\n * Aria-live behavior for the alert. Default `'polite'`.\n *\n * Alerts that are part of the initial page render should leave this at the\n * default — `role=\"alert\"` (which is `aria-live=\"assertive\"`) interrupts the\n * screen reader on every page load. Set `'assertive'` only for urgent\n * alerts that appear *after* initial render. Set `'off'` to suppress\n * announcements entirely (still rendered, still has `role=\"status\"`).\n */\n live?: 'off' | 'polite' | 'assertive';\n}\n\nexport const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n tone = 'accent',\n title,\n description,\n icon,\n action,\n live = 'polite',\n className,\n children,\n ...props\n },\n ref,\n) {\n const t = (tone ?? 'accent') as AlertTone;\n return (\n <div\n ref={ref}\n role={live === 'assertive' ? 'alert' : 'status'}\n aria-live={live === 'off' ? undefined : live}\n className={cn(alertStyles({ tone }), className)}\n {...props}\n >\n <span aria-hidden className={cn('mt-[1px] text-[14px] leading-none', iconColorClass[t])}>\n {icon ?? defaultGlyph[t]}\n </span>\n <div className=\"min-w-0 flex-1\">\n {title && <div className=\"font-medium\">{title}</div>}\n {description && <div className=\"text-text-muted mt-[2px] text-[12px]\">{description}</div>}\n {children}\n </div>\n {action && <div className=\"ml-1 shrink-0\">{action}</div>}\n </div>\n );\n});\n\nAlert.displayName = 'Alert';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Banner — top-of-page notice. Spans the full width of its container, uses a\n * tinted background derived from the tone color, and supports `sticky`\n * positioning so it stays at the top of the viewport on scroll.\n */\n\nexport type BannerTone = 'accent' | 'ok' | 'warn' | 'err';\n\nconst bannerStyles = cva(\n 'flex items-center gap-3 border-b border-border px-[14px] py-2 text-[12px]',\n {\n variants: {\n tone: {\n accent: 'bg-[color-mix(in_oklab,var(--color-accent),transparent_82%)] text-accent',\n ok: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_82%)] text-ok',\n warn: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_82%)] text-warn',\n err: 'bg-[color-mix(in_oklab,var(--color-err),transparent_82%)] text-err',\n },\n sticky: {\n true: 'sticky top-0 z-sticky',\n false: '',\n },\n },\n defaultVariants: { tone: 'accent', sticky: false },\n },\n);\n\nconst defaultGlyph: Record<BannerTone, string> = {\n accent: '✦',\n ok: '✓',\n warn: '!',\n err: '×',\n};\n\nexport interface BannerProps\n extends HTMLAttributes<HTMLDivElement>, VariantProps<typeof bannerStyles> {\n /** Override the leading glyph. */\n icon?: ReactNode;\n /** Optional trailing action (e.g., a link). Rendered with `ml-auto`. */\n action?: ReactNode;\n /**\n * Aria-live behavior for the banner. Default `'polite'`.\n *\n * Banners that are part of the initial page render should leave this at the\n * default — `role=\"alert\"` (which is `aria-live=\"assertive\"`) interrupts the\n * screen reader on every page load. Set `'assertive'` only for urgent\n * banners that appear *after* initial render. Set `'off'` to suppress\n * announcements entirely (still rendered, still has `role=\"status\"`).\n */\n live?: 'off' | 'polite' | 'assertive';\n}\n\nexport const Banner = forwardRef<HTMLDivElement, BannerProps>(function Banner(\n { tone = 'accent', sticky, icon, action, live = 'polite', className, children, ...props },\n ref,\n) {\n const t = (tone ?? 'accent') as BannerTone;\n return (\n <div\n ref={ref}\n role={live === 'assertive' ? 'alert' : 'status'}\n aria-live={live === 'off' ? undefined : live}\n className={cn(bannerStyles({ tone, sticky }), className)}\n {...props}\n >\n <span aria-hidden className=\"leading-none\">\n {icon ?? defaultGlyph[t]}\n </span>\n <div className=\"min-w-0 flex-1\">{children}</div>\n {action && <div className=\"ml-auto\">{action}</div>}\n </div>\n );\n});\n\nBanner.displayName = 'Banner';\n","'use client';\n\nimport {\n Children,\n forwardRef,\n isValidElement,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Breadcrumbs — composed of `<Crumb>` children. The last crumb is treated as\n * the current page (rendered as plain text with `aria-current=\"page\"`); earlier\n * crumbs render as links if `href` is provided. Pass `separator` to swap the\n * default `/` divider.\n */\n\nexport interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {\n /** Element to render between crumbs. Defaults to a dim `/`. */\n separator?: ReactNode;\n}\n\nexport const Breadcrumbs = forwardRef<HTMLElement, BreadcrumbsProps>(function Breadcrumbs(\n { separator = '/', className, children, ...props },\n ref,\n) {\n const crumbs = Children.toArray(children).filter(isValidElement) as ReactElement<CrumbProps>[];\n const last = crumbs.length - 1;\n return (\n <nav ref={ref} aria-label=\"Breadcrumb\" className={cn('text-[13px]', className)} {...props}>\n <ol className=\"text-text-muted flex flex-wrap items-center gap-[6px]\">\n {crumbs.map((crumb, i) => {\n const isCurrent = i === last;\n return (\n <li key={i} className=\"inline-flex items-center gap-[6px]\">\n {isCurrent ? <Crumb {...crumb.props} current /> : crumb}\n {!isCurrent && (\n <span aria-hidden className=\"text-text-dim\">\n {separator}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n});\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n\nexport interface CrumbProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Marks this crumb as the current page — disables the link and applies emphasis styling. */\n current?: boolean;\n}\n\nexport const Crumb = forwardRef<HTMLAnchorElement, CrumbProps>(function Crumb(\n { current, className, href, children, ...props },\n ref,\n) {\n if (current) {\n return (\n <span aria-current=\"page\" className={cn('text-text', className)}>\n {children}\n </span>\n );\n }\n if (href === undefined) {\n return <span className={cn('text-text-dim', className)}>{children}</span>;\n }\n return (\n <a\n ref={ref}\n href={href}\n className={cn('hover:text-text transition-colors duration-(--duration-micro)', className)}\n {...props}\n >\n {children}\n </a>\n );\n});\n\nCrumb.displayName = 'Crumb';\n","'use client';\n\nimport {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { useKeyboardList } from '../../hooks/useKeyboardList';\nimport { useOutsideClick } from '../../hooks/useOutsideClick';\nimport { cn } from '../../utils/cn';\n\n/**\n * Combobox — text input with an attached, type-to-filter listbox. Implements\n * the WAI-ARIA combobox pattern (input owns focus; listbox is referenced via\n * aria-controls; highlighted option via aria-activedescendant).\n *\n * Selection (`value`) and the visible query are independent. Selecting an\n * option syncs the query to the option's label so the user sees what was\n * picked; subsequent typing reopens the list and re-filters.\n */\n\nexport type ComboboxOption =\n | string\n | {\n value: string;\n label?: ReactNode;\n description?: ReactNode;\n /** Disable selection without removing the option from the list. */\n disabled?: boolean;\n };\n\nexport interface ComboboxProps {\n /** Available options. Strings are normalized to `{ value, label: value }`. */\n options: ReadonlyArray<ComboboxOption>;\n /** Controlled selected option value. */\n value?: string;\n /** Default selected value (uncontrolled). */\n defaultValue?: string;\n /** Fires with the option's `value` when a selection is committed. */\n onValueChange?: (value: string) => void;\n /** Controlled query. */\n query?: string;\n /** Default query (uncontrolled). */\n defaultQuery?: string;\n /** Fires whenever the query changes. */\n onQueryChange?: (query: string) => void;\n placeholder?: string;\n /** Custom matcher. Default: case-insensitive substring on label/description. */\n filter?: (option: NormalizedOption, query: string) => boolean;\n /** Empty-state node rendered when filtering yields nothing. */\n emptyState?: ReactNode;\n /** Pixel or CSS width of the wrapper. Default 260. */\n width?: number | string;\n disabled?: boolean;\n name?: string;\n id?: string;\n 'aria-label'?: string;\n}\n\nexport interface NormalizedOption {\n value: string;\n label: ReactNode;\n description?: ReactNode;\n searchText: string;\n disabled?: boolean;\n}\n\nfunction normalize(option: ComboboxOption): NormalizedOption {\n if (typeof option === 'string') {\n return { value: option, label: option, searchText: option.toLowerCase() };\n }\n const labelString =\n typeof option.label === 'string'\n ? option.label\n : typeof option.label === 'undefined'\n ? option.value\n : '';\n const descriptionString = typeof option.description === 'string' ? option.description : '';\n return {\n value: option.value,\n label: option.label ?? option.value,\n description: option.description,\n searchText: `${labelString} ${descriptionString}`.toLowerCase(),\n disabled: option.disabled,\n };\n}\n\nconst defaultFilter = (option: NormalizedOption, query: string) =>\n option.searchText.includes(query.toLowerCase());\n\nexport const Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n value: valueProp,\n defaultValue,\n onValueChange,\n query: queryProp,\n defaultQuery,\n onQueryChange,\n placeholder,\n filter = defaultFilter,\n emptyState,\n width = 260,\n disabled,\n name,\n id,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const reactId = useId();\n const listboxId = `${id ?? reactId}-listbox`;\n const inputId = id ?? `${reactId}-input`;\n\n const normalized = useMemo(() => options.map(normalize), [options]);\n\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n const initialQuery = useMemo(() => {\n if (defaultQuery !== undefined) return defaultQuery;\n if (defaultValue !== undefined) {\n const opt = normalized.find((o) => o.value === defaultValue);\n if (opt && typeof opt.label === 'string') return opt.label;\n }\n return '';\n }, [defaultQuery, defaultValue, normalized]);\n\n const [query, setQuery] = useControllableState<string>({\n value: queryProp,\n defaultValue: initialQuery,\n onChange: onQueryChange,\n });\n\n const [open, setOpen] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useOutsideClick(wrapperRef, () => setOpen(false));\n\n const filtered = useMemo(\n () => (query ? normalized.filter((o) => filter(o, query)) : normalized),\n [normalized, query, filter],\n );\n\n const { cursor, setCursor, onKeyDown } = useKeyboardList({\n count: filtered.length,\n defaultCursor: 0,\n onSelect: (i) => {\n const item = filtered[i];\n if (item && !item.disabled) commit(item);\n },\n });\n\n useEffect(() => {\n setCursor(0);\n }, [query, setCursor]);\n\n function commit(option: NormalizedOption) {\n setValue(option.value);\n if (typeof option.label === 'string') setQuery(option.label);\n setOpen(false);\n }\n\n const handleKey = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') {\n setOpen(false);\n return;\n }\n if (!open && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {\n setOpen(true);\n }\n onKeyDown(event);\n };\n\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n if (wrapperRef.current && !wrapperRef.current.contains(event.relatedTarget as Node | null)) {\n setOpen(false);\n }\n };\n\n return (\n <div ref={wrapperRef} className=\"relative\" style={{ width }}>\n <input\n ref={ref}\n id={inputId}\n name={name}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-activedescendant={\n open && filtered.length > 0 ? `${listboxId}-option-${cursor}` : undefined\n }\n aria-label={ariaLabel}\n disabled={disabled}\n placeholder={placeholder}\n value={query ?? ''}\n onChange={(e) => {\n setQuery(e.target.value);\n setOpen(true);\n if (value !== undefined) setValue('');\n }}\n onFocus={() => setOpen(true)}\n onBlur={handleBlur}\n onKeyDown={handleKey}\n className={cn(\n 'border-border bg-panel text-text block w-full rounded-md border px-3 py-2 text-[13px] outline-none',\n 'transition-[border,box-shadow] duration-(--duration-micro)',\n 'placeholder:text-text-dim',\n 'focus-visible:border-accent focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n )}\n />\n {open && (\n <ul\n id={listboxId}\n role=\"listbox\"\n aria-label={ariaLabel ?? 'Suggestions'}\n className={cn(\n 'z-dropdown absolute top-full right-0 left-0 mt-1 max-h-[220px] overflow-auto',\n 'border-border bg-panel rounded-md border p-1 shadow-lg',\n )}\n >\n {filtered.length === 0 ? (\n <li className=\"text-text-dim px-2 py-3 text-center text-[12px]\" role=\"presentation\">\n {emptyState ?? 'No matches'}\n </li>\n ) : (\n filtered.map((option, i) => {\n const isActive = i === cursor;\n return (\n <li\n key={option.value}\n id={`${listboxId}-option-${i}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={option.disabled || undefined}\n onMouseEnter={() => setCursor(i)}\n onMouseDown={(e) => {\n e.preventDefault(); // keep focus on input\n if (!option.disabled) commit(option);\n }}\n className={cn(\n 'text-text cursor-pointer rounded-sm px-[10px] py-2 text-[12px]',\n isActive && 'bg-accent-dim text-accent',\n option.disabled && 'pointer-events-none opacity-40',\n )}\n >\n <div>{option.label}</div>\n {option.description && (\n <div className=\"text-text-dim text-[11px]\">{option.description}</div>\n )}\n </li>\n );\n })\n )}\n </ul>\n )}\n {name && <input type=\"hidden\" name={name} value={value ?? ''} readOnly />}\n </div>\n );\n});\n\nCombobox.displayName = 'Combobox';\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, useEffect, useId, useMemo, type ReactNode } from 'react';\n\nimport { useKeyboardList } from '../../hooks/useKeyboardList';\nimport { cn } from '../../utils/cn';\n\n/**\n * CommandPalette — keyboard-driven command launcher. Built on Radix Dialog\n * (focus trap, Esc, scroll lock for free) with a controlled query input,\n * grouped results, and arrow-key navigation provided by `useKeyboardList`.\n *\n * The component is presentation-only over its results: the consumer owns the\n * query state and is responsible for filtering. Pass already-matched groups\n * via `groups`. For the common substring case, `filterCommandItems(query, …)`\n * is exported as a one-liner.\n */\n\nexport interface CommandPaletteItem {\n /** Stable id passed back to `onSelect`. */\n id: string;\n /** Visible label / title. */\n label: ReactNode;\n /** Secondary line beneath the label. */\n description?: ReactNode;\n /** Leading glyph or icon node. */\n glyph?: ReactNode;\n /** Trailing hint, often a kbd shortcut. */\n trailing?: ReactNode;\n /** Lower-cased haystack used by `filterCommandItems`. Defaults to `label + description`. */\n searchText?: string;\n}\n\nexport interface CommandPaletteGroup {\n /** Group heading label. */\n label?: ReactNode;\n items: ReadonlyArray<CommandPaletteItem>;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n query: string;\n onQueryChange: (query: string) => void;\n /** Already-matched, ready-to-render groups. Use `filterCommandItems` for the simple case. */\n groups: ReadonlyArray<CommandPaletteGroup>;\n /** Called with the item id when the user picks an item (click or Enter). */\n onSelect: (id: string) => void;\n /** Placeholder text for the search input. */\n placeholder?: string;\n /** Footer hint row (kbd legend). Accepts free-form children. */\n footer?: ReactNode;\n /** Empty-state node when groups resolve to zero items. */\n emptyState?: ReactNode;\n /** Pixel width of the palette panel. Default 540. */\n width?: number;\n}\n\nfunction flatItems(groups: ReadonlyArray<CommandPaletteGroup>): CommandPaletteItem[] {\n return groups.flatMap((g) => g.items as CommandPaletteItem[]);\n}\n\nexport const CommandPalette = forwardRef<HTMLDivElement, CommandPaletteProps>(\n function CommandPalette(\n {\n open,\n onOpenChange,\n query,\n onQueryChange,\n groups,\n onSelect,\n placeholder = 'Search…',\n footer,\n emptyState,\n width = 540,\n },\n ref,\n ) {\n const flat = useMemo(() => flatItems(groups), [groups]);\n const { cursor, setCursor, onKeyDown } = useKeyboardList({\n count: flat.length,\n defaultCursor: 0,\n onSelect: (i) => {\n const item = flat[i];\n if (item) onSelect(item.id);\n },\n });\n\n const reactId = useId();\n const listboxId = `${reactId}-listbox`;\n const optionId = (i: number) => `${listboxId}-option-${i}`;\n const hasMatches = flat.length > 0;\n\n // Reset the cursor whenever the query or groups shape changes.\n useEffect(() => {\n setCursor(0);\n }, [query, groups, setCursor]);\n\n return (\n <RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n className={cn(\n 'z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]',\n 'data-[state=open]:animate-[ship-fade-in_150ms_ease]',\n )}\n />\n <RadixDialog.Content\n ref={ref}\n aria-label=\"Command palette\"\n aria-describedby={undefined}\n style={{ width }}\n className={cn(\n 'z-modal fixed top-[20%] left-1/2 max-w-[calc(100%-40px)] -translate-x-1/2',\n 'border-border-strong bg-panel overflow-hidden rounded-xl border shadow-lg',\n 'outline-none data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]',\n )}\n onKeyDown={onKeyDown}\n >\n <RadixDialog.Title className=\"sr-only\">Command palette</RadixDialog.Title>\n <div className=\"border-border flex items-center gap-[10px] border-b px-4 py-[14px]\">\n <span aria-hidden className=\"text-text-dim\">\n ⌕\n </span>\n <input\n // Command palettes are launched via keyboard (⌘K); autofocusing\n // the search input is the entire point of the pattern.\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n type=\"text\"\n value={query}\n onChange={(e) => onQueryChange(e.target.value)}\n placeholder={placeholder}\n aria-label=\"Search\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n // The listbox is always rendered while the palette is open\n // (even in the empty-state branch the container is mounted),\n // so `aria-expanded` is true whenever this input is mounted.\n aria-expanded\n aria-controls={listboxId}\n aria-activedescendant={hasMatches ? optionId(cursor) : undefined}\n className=\"text-text placeholder:text-text-dim flex-1 border-0 bg-transparent text-[14px] outline-none\"\n />\n <span className=\"border-border text-text-dim rounded-xs border px-[6px] py-[2px] font-mono text-[10px]\">\n ESC\n </span>\n </div>\n <div id={listboxId} className=\"min-h-[220px] p-2\" role=\"listbox\" aria-label=\"Results\">\n {flat.length === 0 ? (\n (emptyState ?? (\n <div className=\"text-text-dim px-3 py-5 text-center text-[12px]\">No matches</div>\n ))\n ) : (\n <CommandGroups\n groups={groups}\n cursor={cursor}\n setCursor={setCursor}\n onSelect={onSelect}\n optionId={optionId}\n />\n )}\n </div>\n {footer && (\n <div className=\"border-border text-text-dim flex gap-4 border-t px-[14px] py-[10px] font-mono text-[10px]\">\n {footer}\n </div>\n )}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n );\n },\n);\n\nCommandPalette.displayName = 'CommandPalette';\n\ninterface CommandGroupsProps {\n groups: ReadonlyArray<CommandPaletteGroup>;\n cursor: number;\n setCursor: (i: number) => void;\n onSelect: (id: string) => void;\n optionId: (i: number) => string;\n}\n\nfunction CommandGroups({ groups, cursor, setCursor, onSelect, optionId }: CommandGroupsProps) {\n let runningIndex = 0;\n return (\n <>\n {groups.map((group, gIdx) => {\n if (group.items.length === 0) return null;\n return (\n <div key={gIdx}>\n {group.label && (\n <div className=\"text-text-dim px-2 pt-2 pb-1 font-mono text-[9px] tracking-[1.4px] uppercase\">\n {group.label} · {group.items.length}\n </div>\n )}\n {group.items.map((item) => {\n const myIndex = runningIndex++;\n const isActive = cursor === myIndex;\n return (\n <button\n key={item.id}\n id={optionId(myIndex)}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n onClick={() => onSelect(item.id)}\n onMouseEnter={() => setCursor(myIndex)}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-[10px] rounded-md border-0 bg-transparent px-[10px] py-2 text-left outline-none',\n isActive ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n )}\n >\n {item.glyph != null && (\n <span\n aria-hidden\n className={cn(\n 'font-mono text-[12px]',\n isActive ? 'text-accent' : 'text-text-muted',\n )}\n >\n {item.glyph}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[13px]\">{item.label}</span>\n {item.description && (\n <span className=\"text-text-dim block truncate text-[11px]\">\n {item.description}\n </span>\n )}\n </span>\n {item.trailing && (\n <span className=\"text-text-dim font-mono text-[10px]\">{item.trailing}</span>\n )}\n </button>\n );\n })}\n </div>\n );\n })}\n </>\n );\n}\n\n/**\n * Substring filter helper. Lower-cases `query` and matches any item whose\n * `searchText` (or computed `label + description`) contains it. Preserves\n * groups; drops empty ones.\n */\nexport function filterCommandItems(\n query: string,\n groups: ReadonlyArray<CommandPaletteGroup>,\n): CommandPaletteGroup[] {\n const q = query.trim().toLowerCase();\n if (!q) return groups.map((g) => ({ ...g, items: [...g.items] }));\n return groups\n .map((g) => ({\n ...g,\n items: g.items.filter((item) => {\n const haystack =\n item.searchText ??\n `${typeof item.label === 'string' ? item.label : ''} ${typeof item.description === 'string' ? item.description : ''}`;\n return haystack.toLowerCase().includes(q);\n }),\n }))\n .filter((g) => g.items.length > 0);\n}\n","'use client';\n\nimport { type Ref, useEffect, useMemo, useRef, type ReactNode } from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\n/**\n * DataTable — generic, sortable, selectable table. The component is a\n * \"headless-with-defaults\": you bring your data and column definitions, the\n * table handles sort state, selection (with indeterminate \"select-all\"),\n * sticky header, and basic ARIA.\n *\n * Sort: if a column declares an `accessor`, clicking its header toggles the\n * direction. Selection: pass `selectable` to render a checkbox column with a\n * select-all in the header.\n */\n\nexport interface DataTableColumn<T> {\n /** Stable id used for sorting state. */\n key: string;\n /** Header content. */\n header: ReactNode;\n /** Custom cell renderer. Defaults to the accessor's stringified value. */\n cell?: (row: T) => ReactNode;\n /** Returns the sort key for `row`. When omitted, the column is not sortable. */\n accessor?: (row: T) => string | number;\n align?: 'left' | 'right' | 'center';\n /** CSS width — string or number (px). */\n width?: number | string;\n}\n\nexport interface DataTableSort {\n key: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface DataTableProps<T> {\n data: ReadonlyArray<T>;\n columns: ReadonlyArray<DataTableColumn<T>>;\n /** Returns a stable id for `row`. Required for selection + React keys. */\n rowKey: (row: T) => string;\n /** Controlled sort state. */\n sort?: DataTableSort | null;\n defaultSort?: DataTableSort | null;\n onSortChange?: (sort: DataTableSort | null) => void;\n /** Show the leading checkbox column. */\n selectable?: boolean;\n /** Controlled selection. */\n selected?: ReadonlySet<string>;\n defaultSelected?: ReadonlyArray<string>;\n onSelectionChange?: (selection: ReadonlySet<string>) => void;\n /** Rendered when `data` is empty. */\n emptyState?: ReactNode;\n /** Sticky table header (requires the table to live in a scroll container). */\n stickyHeader?: boolean;\n /** Caption for screen readers. */\n caption?: ReactNode;\n className?: string;\n}\n\nconst alignClass = {\n left: 'text-left',\n right: 'text-right',\n center: 'text-center',\n} as const;\n\n/**\n * Stable empty-set fallback for unset controlled `selected`. Using a single\n * frozen instance keeps `.has(id)` lookups cheap and avoids referential churn\n * in render-derived memos.\n */\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\n// Note: this is a generic component. The forwardRef helper loses the generic\n// type, so we keep it as a plain function and accept an optional ref via props.\nexport function DataTable<T>(props: DataTableProps<T> & { ref?: Ref<HTMLTableElement> }) {\n const {\n data,\n columns,\n rowKey,\n sort: sortProp,\n defaultSort,\n onSortChange,\n selectable,\n selected: selectedProp,\n defaultSelected,\n onSelectionChange,\n emptyState,\n stickyHeader,\n caption,\n className,\n ref,\n } = props;\n\n const [sort, setSort] = useControllableState<DataTableSort | null>({\n value: sortProp,\n defaultValue: defaultSort ?? null,\n onChange: onSortChange,\n });\n\n const [selected, setSelected] = useControllableState<ReadonlySet<string>>({\n value: selectedProp,\n defaultValue: new Set(defaultSelected ?? []),\n onChange: onSelectionChange,\n });\n\n const sortableMap = useMemo(() => {\n const m = new Map<string, DataTableColumn<T>>();\n for (const c of columns) if (c.accessor) m.set(c.key, c);\n return m;\n }, [columns]);\n\n const sortedData = useMemo(() => {\n if (!sort) return [...data];\n const col = sortableMap.get(sort.key);\n if (!col || !col.accessor) return [...data];\n const factor = sort.direction === 'asc' ? 1 : -1;\n return [...data].sort((a, b) => {\n const av = col.accessor!(a);\n const bv = col.accessor!(b);\n if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * factor;\n return String(av).localeCompare(String(bv)) * factor;\n });\n }, [data, sort, sortableMap]);\n\n const allIds = useMemo(() => sortedData.map(rowKey), [sortedData, rowKey]);\n const selectedSet = selected ?? EMPTY_SET;\n const allSelected = allIds.length > 0 && allIds.every((id) => selectedSet.has(id));\n const someSelected = !allSelected && allIds.some((id) => selectedSet.has(id));\n\n const headerCheckRef = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (headerCheckRef.current) headerCheckRef.current.indeterminate = someSelected;\n }, [someSelected]);\n\n const toggleSort = (key: string) => {\n const col = sortableMap.get(key);\n if (!col) return;\n setSort((prev) => {\n if (prev?.key !== key) return { key, direction: 'asc' };\n if (prev.direction === 'asc') return { key, direction: 'desc' };\n return null;\n });\n };\n\n const toggleAll = () => {\n setSelected((prev) => {\n const next = new Set(prev ?? []);\n if (allSelected) {\n for (const id of allIds) next.delete(id);\n } else {\n for (const id of allIds) next.add(id);\n }\n return next;\n });\n };\n\n const toggleRow = (id: string) => {\n setSelected((prev) => {\n const next = new Set(prev ?? []);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n return (\n <table ref={ref} className={cn('w-full border-collapse text-[12px]', className)}>\n {caption && <caption className=\"sr-only\">{caption}</caption>}\n <thead className={cn('bg-panel-2', stickyHeader && 'z-raised sticky top-0')}>\n <tr>\n {selectable && (\n <th scope=\"col\" className=\"border-border w-8 border-b px-3 py-2 text-left\">\n <input\n ref={headerCheckRef}\n type=\"checkbox\"\n aria-label=\"Select all rows\"\n checked={allSelected}\n onChange={toggleAll}\n className=\"cursor-pointer accent-[var(--color-accent)]\"\n />\n </th>\n )}\n {columns.map((col) => {\n const sortable = !!col.accessor;\n const isSorted = sort?.key === col.key;\n const ariaSort = !sortable\n ? undefined\n : isSorted\n ? sort?.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n const align = col.align ?? 'left';\n const indicator = sortable && isSorted && (\n <span aria-hidden className=\"ml-1\">\n {sort?.direction === 'asc' ? '↑' : '↓'}\n </span>\n );\n return (\n <th\n key={col.key}\n scope=\"col\"\n aria-sort={ariaSort}\n style={col.width != null ? { width: col.width } : undefined}\n className={cn(\n 'border-border border-b px-3 py-2 font-mono text-[10px] font-medium tracking-[1.4px] uppercase select-none',\n alignClass[align],\n sortable && 'cursor-pointer',\n isSorted ? 'text-accent' : 'text-text-dim',\n )}\n >\n {sortable ? (\n <button\n type=\"button\"\n onClick={() => toggleSort(col.key)}\n className=\"focus-visible:ring-accent-dim inline-flex cursor-pointer items-center gap-1 font-mono text-[10px] font-medium tracking-[1.4px] uppercase outline-none focus-visible:ring-[3px]\"\n >\n {col.header}\n {indicator}\n </button>\n ) : (\n col.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {sortedData.length === 0 && (\n <tr>\n <td\n colSpan={columns.length + (selectable ? 1 : 0)}\n className=\"text-text-dim px-3 py-8 text-center\"\n >\n {emptyState ?? 'No data'}\n </td>\n </tr>\n )}\n {sortedData.map((row) => {\n const id = rowKey(row);\n const isSelected = selectedSet.has(id);\n return (\n <tr\n key={id}\n data-state={isSelected ? 'selected' : undefined}\n className={cn(\n 'border-border border-b transition-colors duration-(--duration-micro) last:border-0',\n isSelected ? 'bg-accent-dim/50' : 'hover:bg-panel-2',\n )}\n >\n {selectable && (\n <td className=\"px-3 py-[10px]\">\n <input\n type=\"checkbox\"\n aria-label={`Select row ${id}`}\n checked={isSelected}\n onChange={() => toggleRow(id)}\n className=\"cursor-pointer accent-[var(--color-accent)]\"\n />\n </td>\n )}\n {columns.map((col) => (\n <td key={col.key} className={cn('px-3 py-[10px]', alignClass[col.align ?? 'left'])}>\n {col.cell ? col.cell(row) : col.accessor ? String(col.accessor(row)) : null}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { IconButton } from '../../components/Button/IconButton';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\n/**\n * Calendar — single-month date grid. Displays the month named by\n * `month`/`year` (0-indexed month) and surfaces the selected date via\n * `value` / `onValueChange`.\n *\n * Uses native `Date` only (no external date lib). Days outside the current\n * month are not rendered (ShipIt's design uses leading whitespace, not\n * leading-/trailing-month grays).\n *\n * Keyboard model (APG date-picker):\n * - Arrow Left/Right: move focus ±1 day\n * - Arrow Up/Down: move focus ±1 week\n * - Home/End: jump to start/end of week\n * - PageUp/PageDown: ±1 month (also navigates the visible month)\n * - Roving tabindex: only the focused day cell is in the tab order.\n */\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst DAYS = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\n\nexport interface CalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onSelect' | 'defaultValue'\n> {\n /** Currently selected date (controlled). */\n value?: Date;\n /** Default selected date (uncontrolled). */\n defaultValue?: Date;\n /** Fires with the newly selected date. */\n onValueChange?: (date: Date) => void;\n /** Currently visible month (0-indexed) and year. */\n month?: number;\n year?: number;\n /** Default visible month (0-indexed) and year (uncontrolled). */\n defaultMonth?: number;\n defaultYear?: number;\n /** Fires when the visible month changes. */\n onVisibleMonthChange?: (params: { month: number; year: number }) => void;\n /** Optional disable predicate. */\n isDateDisabled?: (date: Date) => boolean;\n}\n\nfunction isSameDay(a: Date | undefined, b: Date) {\n if (!a) return false;\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nfunction clampDay(year: number, month: number, day: number) {\n const max = new Date(year, month + 1, 0).getDate();\n return Math.min(Math.max(1, day), max);\n}\n\nexport const Calendar = forwardRef<HTMLDivElement, CalendarProps>(function Calendar(\n {\n value,\n defaultValue,\n onValueChange,\n month: monthProp,\n year: yearProp,\n defaultMonth,\n defaultYear,\n onVisibleMonthChange,\n isDateDisabled,\n className,\n ...props\n },\n ref,\n) {\n // Stable \"today\" so render is deterministic across re-renders within a\n // session. We still gate today-specific markup behind a post-hydration\n // flag so the server-rendered HTML never includes today-only attrs/classes\n // (avoids hydration mismatches at midnight or across clock-skewed servers).\n const [today] = useState(() => new Date());\n const [hydrated, setHydrated] = useState(false);\n useEffect(() => setHydrated(true), []);\n\n const [selectedDate, setSelectedDate] = useControllableState<Date>({\n value,\n defaultValue,\n onChange: onValueChange,\n });\n\n const initialMonth = defaultMonth ?? defaultValue?.getMonth() ?? today.getMonth();\n const initialYear = defaultYear ?? defaultValue?.getFullYear() ?? today.getFullYear();\n const [internalMonth, setInternalMonth] = useState(initialMonth);\n const [internalYear, setInternalYear] = useState(initialYear);\n\n const month = monthProp ?? internalMonth;\n const year = yearProp ?? internalYear;\n const isControlled = monthProp !== undefined && yearProp !== undefined;\n\n const setVisible = useCallback(\n (m: number, y: number) => {\n if (!isControlled) {\n setInternalMonth(m);\n setInternalYear(y);\n }\n onVisibleMonthChange?.({ month: m, year: y });\n },\n [isControlled, onVisibleMonthChange],\n );\n\n const goPrev = useCallback(() => {\n const m = month === 0 ? 11 : month - 1;\n const y = month === 0 ? year - 1 : year;\n setVisible(m, y);\n }, [month, year, setVisible]);\n const goNext = useCallback(() => {\n const m = month === 11 ? 0 : month + 1;\n const y = month === 11 ? year + 1 : year;\n setVisible(m, y);\n }, [month, year, setVisible]);\n\n const daysInMonth = new Date(year, month + 1, 0).getDate();\n const firstDayOfMonth = new Date(year, month, 1).getDay();\n\n // Roving-tabindex focus state. Defaults to the selected day, then today\n // (only after hydration), then day 1. We track focus by full date so we\n // can carry it across month boundaries when Arrow / PageUp / PageDown\n // crosses into the next/prev month.\n const [focusedDate, setFocusedDate] = useState<Date>(() => {\n if (selectedDate) return selectedDate;\n return new Date(initialYear, initialMonth, 1);\n });\n\n // If the selected date changes (controlled mode), follow it.\n useEffect(() => {\n if (selectedDate) setFocusedDate(selectedDate);\n }, [selectedDate]);\n\n // If the focused date isn't in the visible month, clamp it so the\n // currently-rendered grid always has a `tabIndex=0` cell.\n const focusedInVisibleMonth =\n focusedDate.getMonth() === month && focusedDate.getFullYear() === year;\n const effectiveFocusDay = focusedInVisibleMonth\n ? focusedDate.getDate()\n : clampDay(year, month, focusedDate.getDate());\n\n const dayRefs = useRef<Map<number, HTMLButtonElement | null>>(new Map());\n const shouldFocusRef = useRef(false);\n\n // After a keyboard navigation that crossed months, move DOM focus to the\n // newly-focused day in the now-rendered grid.\n useEffect(() => {\n if (!shouldFocusRef.current) return;\n shouldFocusRef.current = false;\n const node = dayRefs.current.get(effectiveFocusDay);\n node?.focus();\n }, [effectiveFocusDay, month, year]);\n\n const moveFocus = useCallback(\n (next: Date) => {\n setFocusedDate(next);\n shouldFocusRef.current = true;\n const nextMonth = next.getMonth();\n const nextYear = next.getFullYear();\n if (nextMonth !== month || nextYear !== year) {\n setVisible(nextMonth, nextYear);\n }\n },\n [month, year, setVisible],\n );\n\n const onCellKeyDown = useCallback(\n (e: KeyboardEvent<HTMLButtonElement>, day: number) => {\n const current = new Date(year, month, day);\n let next: Date | null = null;\n let handled = true;\n switch (e.key) {\n case 'ArrowLeft':\n next = new Date(year, month, day - 1);\n break;\n case 'ArrowRight':\n next = new Date(year, month, day + 1);\n break;\n case 'ArrowUp':\n next = new Date(year, month, day - 7);\n break;\n case 'ArrowDown':\n next = new Date(year, month, day + 7);\n break;\n case 'Home': {\n const dow = current.getDay();\n next = new Date(year, month, day - dow);\n break;\n }\n case 'End': {\n const dow = current.getDay();\n next = new Date(year, month, day + (6 - dow));\n break;\n }\n case 'PageUp': {\n const targetMonth = month === 0 ? 11 : month - 1;\n const targetYear = month === 0 ? year - 1 : year;\n const targetDay = clampDay(targetYear, targetMonth, day);\n next = new Date(targetYear, targetMonth, targetDay);\n break;\n }\n case 'PageDown': {\n const targetMonth = month === 11 ? 0 : month + 1;\n const targetYear = month === 11 ? year + 1 : year;\n const targetDay = clampDay(targetYear, targetMonth, day);\n next = new Date(targetYear, targetMonth, targetDay);\n break;\n }\n default:\n handled = false;\n }\n if (handled && next) {\n e.preventDefault();\n moveFocus(next);\n }\n },\n [month, year, moveFocus],\n );\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={`${MONTHS[month]} ${year}`}\n className={cn(\n 'rounded-base border-border bg-panel w-[280px] border p-4 shadow-lg',\n className,\n )}\n {...props}\n >\n <div className=\"mb-3 flex items-center justify-between\">\n <span className=\"text-[13px] font-medium\" aria-live=\"polite\">\n {MONTHS[month]} {year}\n </span>\n <div className=\"flex gap-1\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon=\"‹\"\n aria-label=\"Previous month\"\n onClick={goPrev}\n />\n <IconButton size=\"sm\" variant=\"ghost\" icon=\"›\" aria-label=\"Next month\" onClick={goNext} />\n </div>\n </div>\n {/*\n APG date-grid: outer `role=\"grid\"`, weekday header as a `row` of\n `columnheader` cells, then one `row` per week containing\n `gridcell`-wrapped buttons. `aria-selected` requires this grid\n ancestry to be valid ARIA.\n */}\n <div role=\"grid\" aria-label={`${MONTHS[month]} ${year}`} className=\"flex flex-col gap-[2px]\">\n <div role=\"row\" className=\"grid grid-cols-7 gap-[2px]\">\n {DAYS.map((d, i) => (\n <div\n key={i}\n role=\"columnheader\"\n aria-label={\n ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][i]\n }\n className=\"text-text-dim p-1 text-center font-mono text-[10px]\"\n >\n {d}\n </div>\n ))}\n </div>\n {(() => {\n const totalCells = firstDayOfMonth + daysInMonth;\n const rowCount = Math.ceil(totalCells / 7);\n const rows: ReactNode[] = [];\n for (let r = 0; r < rowCount; r++) {\n const cells: ReactNode[] = [];\n for (let c = 0; c < 7; c++) {\n const cellIndex = r * 7 + c;\n const dayNum = cellIndex - firstDayOfMonth + 1;\n if (dayNum < 1 || dayNum > daysInMonth) {\n cells.push(<div key={`pad-${r}-${c}`} role=\"gridcell\" aria-hidden />);\n continue;\n }\n const date = new Date(year, month, dayNum);\n const isSelected = isSameDay(selectedDate, date);\n const isToday = hydrated && isSameDay(today, date);\n const disabled = isDateDisabled?.(date) ?? false;\n const isFocused = dayNum === effectiveFocusDay;\n const day = dayNum;\n cells.push(\n <div key={day} role=\"gridcell\" aria-selected={isSelected}>\n <button\n ref={(node) => {\n if (node) dayRefs.current.set(day, node);\n else dayRefs.current.delete(day);\n }}\n type=\"button\"\n disabled={disabled}\n aria-current={isToday ? 'date' : undefined}\n aria-label={date.toDateString()}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => {\n setSelectedDate(date);\n setFocusedDate(date);\n }}\n onKeyDown={(e) => onCellKeyDown(e, day)}\n className={cn(\n 'w-full cursor-pointer rounded-xs border-0 bg-transparent py-[6px] text-center text-[12px] outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-30',\n !isSelected && !disabled && 'text-text hover:bg-panel-2',\n isSelected && 'bg-accent text-on-accent font-semibold',\n !isSelected && isToday && 'border-border-strong border',\n )}\n >\n {day}\n </button>\n </div>,\n );\n }\n rows.push(\n <div key={`row-${r}`} role=\"row\" className=\"grid grid-cols-7 gap-[2px]\">\n {cells}\n </div>,\n );\n }\n return rows;\n })()}\n </div>\n </div>\n );\n});\n\nCalendar.displayName = 'Calendar';\n","'use client';\n\nimport * as RadixPopover from '@radix-ui/react-popover';\nimport { forwardRef, useState, type ReactNode } from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\nimport { Calendar } from './Calendar';\n\n/**\n * DatePicker — a button-style trigger that opens a popover containing a\n * `Calendar`. Pass `value` / `onValueChange` for the selected date.\n */\n\nexport interface DatePickerProps {\n value?: Date;\n defaultValue?: Date;\n onValueChange?: (value: Date) => void;\n placeholder?: string;\n /** Format the selected date for display. Default: `toLocaleDateString()`. */\n format?: (date: Date) => string;\n /** Optional disable predicate forwarded to Calendar. */\n isDateDisabled?: (date: Date) => boolean;\n /** Pixel width of the trigger button. Default 200. */\n width?: number | string;\n disabled?: boolean;\n /** Content for the trigger when no date is selected. Defaults to `placeholder`. */\n emptyLabel?: ReactNode;\n 'aria-label'?: string;\n id?: string;\n name?: string;\n}\n\nconst defaultFormat = (d: Date) => d.toLocaleDateString();\n\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(function DatePicker(\n {\n value: valueProp,\n defaultValue,\n onValueChange,\n placeholder = 'Pick a date',\n format = defaultFormat,\n isDateDisabled,\n width = 200,\n disabled,\n emptyLabel,\n 'aria-label': ariaLabel,\n id,\n name,\n },\n ref,\n) {\n const [open, setOpen] = useState(false);\n const [value, setValue] = useControllableState<Date>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n return (\n <RadixPopover.Root open={open} onOpenChange={setOpen}>\n <RadixPopover.Trigger asChild>\n <button\n ref={ref}\n id={id}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel ?? placeholder}\n className={cn(\n 'border-border bg-panel text-text flex cursor-pointer items-center gap-2 rounded-md border px-3 py-2 text-left text-[13px] outline-none',\n 'transition-[border,box-shadow] duration-(--duration-micro)',\n 'hover:bg-panel-2',\n 'focus-visible:border-accent focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'disabled:cursor-not-allowed disabled:opacity-40',\n )}\n style={{ width }}\n >\n <span aria-hidden className=\"text-text-dim\">\n ▢\n </span>\n <span className={cn('flex-1 truncate', !value && 'text-text-dim')}>\n {value ? format(value) : (emptyLabel ?? placeholder)}\n </span>\n </button>\n </RadixPopover.Trigger>\n <RadixPopover.Portal>\n <RadixPopover.Content\n align=\"start\"\n sideOffset={6}\n className=\"z-popover outline-none data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]\"\n >\n <Calendar\n value={value}\n defaultMonth={value?.getMonth()}\n defaultYear={value?.getFullYear()}\n onValueChange={(date) => {\n setValue(date);\n setOpen(false);\n }}\n isDateDisabled={isDateDisabled}\n />\n </RadixPopover.Content>\n </RadixPopover.Portal>\n {name && (\n <input type=\"hidden\" name={name} value={value ? value.toISOString() : ''} readOnly />\n )}\n </RadixPopover.Root>\n );\n});\n\nDatePicker.displayName = 'DatePicker';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Dots — progress dots for carousels and onboarding tours. The current dot\n * widens into a pill (per the handoff spec); the rest stay circular.\n */\n\nexport interface DotsProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Total dot count. */\n total: number;\n /** Zero-based index of the active dot. */\n current: number;\n /** Optional click handler — when provided, dots become focusable buttons. */\n onChange?: (index: number) => void;\n /** Accessible label. Defaults to `Progress`. */\n 'aria-label'?: string;\n}\n\nexport const Dots = forwardRef<HTMLElement, DotsProps>(function Dots(\n { total, current, onChange, className, 'aria-label': ariaLabel = 'Progress', ...props },\n ref,\n) {\n const interactive = typeof onChange === 'function';\n return (\n <nav\n ref={ref}\n aria-label={ariaLabel}\n className={cn('inline-flex items-center gap-[6px]', className)}\n {...props}\n >\n {Array.from({ length: total }).map((_, i) => {\n const isActive = i === current;\n const sharedClass = cn(\n 'h-[6px] rounded-full transition-[width,background] duration-(--duration-micro)',\n isActive ? 'w-[18px] bg-accent' : 'w-[6px] bg-panel-2',\n );\n if (interactive) {\n return (\n <button\n key={i}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n aria-current={isActive ? 'true' : undefined}\n onClick={() => onChange?.(i)}\n className={cn(\n sharedClass,\n 'cursor-pointer outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n !isActive && 'hover:bg-border-strong',\n )}\n />\n );\n }\n return <span key={i} aria-hidden className={sharedClass} />;\n })}\n </nav>\n );\n});\n\nDots.displayName = 'Dots';\n","'use client';\n\nimport {\n forwardRef,\n useState,\n type DragEvent,\n type LabelHTMLAttributes,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Dropzone — drag-and-drop file capture surface with a click-to-browse\n * fallback. Manages its own drag-over state and forwards file drops to\n * `onFiles`. Native `<input type=\"file\">` covers keyboard / a11y.\n */\n\nexport interface DropzoneProps extends Omit<\n LabelHTMLAttributes<HTMLLabelElement>,\n 'onDrop' | 'onDragOver' | 'onDragLeave' | 'title'\n> {\n /** Fired with the dropped or selected files. */\n onFiles?: (files: File[]) => void;\n /** Limit accepted MIME types or extensions. Forwarded to the hidden input + filtered on drop. */\n accept?: string;\n /** Allow multiple files. Default true. */\n multiple?: boolean;\n /** Heading text. Default \"Drop files to ingest\". */\n title?: ReactNode;\n /** Subtitle / hint text rendered below the title. */\n description?: ReactNode;\n /** Glyph at the top of the surface. Default `↥`. */\n icon?: ReactNode;\n disabled?: boolean;\n}\n\nfunction listToArray(list: FileList | null): File[] {\n if (!list) return [];\n return Array.from(list);\n}\n\nexport const Dropzone = forwardRef<HTMLLabelElement, DropzoneProps>(function Dropzone(\n {\n onFiles,\n accept,\n multiple = true,\n title = 'Drop files to ingest',\n description,\n icon = '↥',\n disabled,\n className,\n ...props\n },\n ref,\n) {\n const [isDragging, setIsDragging] = useState(false);\n\n const onDragOver = (e: DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(true);\n };\n const onDragLeave = () => setIsDragging(false);\n const onDrop = (e: DragEvent) => {\n if (disabled) return;\n e.preventDefault();\n setIsDragging(false);\n const files = listToArray(e.dataTransfer.files);\n if (files.length) onFiles?.(files);\n };\n\n return (\n <label\n ref={ref}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n className={cn(\n 'rounded-base flex max-w-[420px] cursor-pointer flex-col items-center border-[1.5px] border-dashed p-8 text-center',\n 'transition-[background,border] duration-(--duration-micro)',\n 'focus-within:ring-accent-dim focus-within:ring-[3px]',\n isDragging\n ? 'border-accent bg-accent-dim'\n : 'border-border-strong bg-panel hover:bg-panel-2',\n disabled && 'pointer-events-none cursor-not-allowed opacity-50',\n className,\n )}\n {...props}\n >\n <input\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n aria-label={typeof title === 'string' ? title : 'Upload files'}\n className=\"sr-only\"\n onChange={(e) => {\n const files = listToArray(e.target.files);\n if (files.length) onFiles?.(files);\n e.target.value = '';\n }}\n />\n <div\n aria-hidden\n className={cn('mb-2 text-[28px]', isDragging ? 'text-accent' : 'text-text-dim')}\n >\n {icon}\n </div>\n <div className=\"mb-1 text-[13px] font-medium\">{title}</div>\n {description && <div className=\"text-text-dim text-[11px]\">{description}</div>}\n </label>\n );\n});\n\nDropzone.displayName = 'Dropzone';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * EmptyState — placeholder for empty lists, no-results states, and error\n * surfaces. A 48×48 icon plate sits above a title + description and an\n * optional action area (button or chip stack).\n *\n * Tone controls the icon plate color. Omit `tone` for a neutral plate (the\n * default for empty lists / no-results); pass `accent | ok | warn | err` to\n * signal semantic intent (e.g., `err` for sync failures).\n */\n\nconst plateStyles = cva('grid h-12 w-12 place-items-center rounded-base text-[22px]', {\n variants: {\n tone: {\n neutral: 'bg-panel-2 text-text-muted',\n accent: 'bg-accent-dim text-accent',\n ok: 'bg-[color-mix(in_oklab,var(--color-ok),transparent_85%)] text-ok',\n warn: 'bg-[color-mix(in_oklab,var(--color-warn),transparent_85%)] text-warn',\n err: 'bg-[color-mix(in_oklab,var(--color-err),transparent_85%)] text-err',\n },\n },\n defaultVariants: { tone: 'neutral' },\n});\n\ntype PlateVariantProps = VariantProps<typeof plateStyles>;\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Glyph or icon node shown in the rounded plate. */\n icon?: ReactNode;\n /** Title heading. */\n title: ReactNode;\n /** Body description. */\n description?: ReactNode;\n /** Optional primary action (e.g., a Button) below the description. */\n action?: ReactNode;\n /** Optional list of chip-style suggestions instead of (or below) the action. */\n chips?: ReadonlyArray<{ label: ReactNode; onClick?: () => void }>;\n /** Semantic tone for the icon plate. Omit for the neutral default. */\n tone?: Exclude<PlateVariantProps['tone'], 'neutral' | null | undefined> | undefined;\n}\n\nexport const EmptyState = forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n { icon, title, description, action, chips, tone, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-base border-border bg-panel flex flex-col items-center gap-[10px] border border-dashed p-6 text-center',\n className,\n )}\n {...props}\n >\n {icon != null && (\n <span aria-hidden className={plateStyles({ tone: tone ?? 'neutral' })}>\n {icon}\n </span>\n )}\n <div className=\"text-[14px] font-medium\">{title}</div>\n {description && (\n <div className=\"text-text-muted max-w-[260px] text-[12px] leading-[1.5]\">{description}</div>\n )}\n {chips && chips.length > 0 && (\n <div className=\"flex w-full flex-col gap-1\">\n {chips.map((c, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={c.onClick}\n className={cn(\n 'border-border bg-panel-2 text-text-muted cursor-pointer rounded-md border px-[10px] py-[6px] text-[11px]',\n 'hover:border-border-strong hover:text-text outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n )}\n >\n {c.label}\n </button>\n ))}\n </div>\n )}\n {action}\n </div>\n );\n});\n\nEmptyState.displayName = 'EmptyState';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * FileChip — file attachment chip with thumb, name, size, optional progress\n * bar, and a remove affordance. The thumb defaults to the file extension; pass\n * `icon` to override.\n */\n\nexport interface FileChipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Filename to display. */\n name: string;\n /** Right-of-name label (size, status). Often `2.4 MB` or `failed`. */\n size?: ReactNode;\n /** When set, renders a progress bar at the bottom (0..100). Used for upload UX. */\n progress?: number;\n /** Replace the file-extension thumb. */\n icon?: ReactNode;\n /** When provided, renders a remove (×) button. */\n onRemove?: () => void;\n /** When true, signals an error state (red status text + red bar). */\n failed?: boolean;\n}\n\nfunction deriveExt(name: string) {\n const dot = name.lastIndexOf('.');\n if (dot < 0) return 'FILE';\n return name\n .slice(dot + 1)\n .slice(0, 4)\n .toUpperCase();\n}\n\nexport const FileChip = forwardRef<HTMLDivElement, FileChipProps>(function FileChip(\n { name, size, progress, icon, onRemove, failed, className, ...props },\n ref,\n) {\n const ext = deriveExt(name);\n const showProgress = typeof progress === 'number';\n const isComplete = showProgress && progress >= 100;\n\n return (\n <div\n ref={ref}\n className={cn(\n 'border-border bg-panel-2 flex max-w-[320px] items-center gap-[10px] rounded-md border px-3 py-2',\n className,\n )}\n {...props}\n >\n <span\n aria-hidden\n className=\"border-border bg-panel text-text-dim grid h-6 w-6 shrink-0 place-items-center rounded-xs border font-mono text-[9px]\"\n >\n {icon ?? ext}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-[12px] font-medium\">{name}</div>\n <div className={cn('font-mono text-[10px]', failed ? 'text-err' : 'text-text-dim')}>\n {size}\n {showProgress && !isComplete && <span> · {Math.round(progress)}%</span>}\n </div>\n {showProgress && !isComplete && (\n <div className=\"bg-panel mt-1 h-[2px] overflow-hidden rounded-full\">\n <div\n className={cn(\n 'h-full transition-[width] duration-(--duration-step)',\n failed ? 'bg-err' : 'bg-accent',\n )}\n style={{ width: `${Math.max(0, Math.min(100, progress))}%` }}\n />\n </div>\n )}\n </div>\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${name}`}\n onClick={onRemove}\n className={cn(\n 'text-text-dim cursor-pointer border-0 bg-transparent p-0 text-[14px] leading-none',\n 'hover:text-text focus-visible:ring-accent-dim rounded-xs outline-none focus-visible:ring-[3px]',\n )}\n >\n ×\n </button>\n )}\n </div>\n );\n});\n\nFileChip.displayName = 'FileChip';\n","'use client';\n\nimport { forwardRef, useCallback, useState, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { Badge } from '../../components/Badge';\nimport { Button } from '../../components/Button';\nimport { Checkbox } from '../../components/Checkbox';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\n/**\n * FilterPanel — multi-facet checkbox filter panel. Pass a `facets` array\n * describing each facet (label, options, optional collapsibility); the panel\n * renders a header with a reset action, then each facet as a labeled\n * checkbox group. Selections are emitted as\n * `Record<facetId, readonly string[]>` and supported in both controlled and\n * uncontrolled modes — mirroring `Slider` and `NavBar`.\n *\n * Reset both invokes the optional `onReset` callback and emits an empty\n * selection through `onValueChange`, so consumers can drive either signal.\n */\n\nexport interface FilterFacetOption {\n value: string;\n label: ReactNode;\n}\n\nexport interface FilterFacet {\n id: string;\n label: ReactNode;\n options: ReadonlyArray<FilterFacetOption>;\n /** Whether the group can collapse. Default `true`. */\n collapsible?: boolean;\n /** Initial open state for collapsible groups. Default `true`. */\n defaultOpen?: boolean;\n}\n\nexport type FilterPanelValue = Record<string, ReadonlyArray<string>>;\n\nexport interface FilterPanelProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n 'onReset' | 'defaultValue' | 'title'\n> {\n facets: ReadonlyArray<FilterFacet>;\n /** Controlled selection map keyed by facet id. */\n value?: FilterPanelValue;\n /** Uncontrolled initial selection map. Default `{}`. */\n defaultValue?: FilterPanelValue;\n /** Fires whenever the selection changes — including reset. */\n onValueChange?: (next: FilterPanelValue) => void;\n /** Fired when the reset action is invoked, alongside `onValueChange({})`. */\n onReset?: () => void;\n /**\n * Optional per-option counts shown in a trailing pill. Shape:\n * `{ [facetId]: { [optionValue]: number } }`.\n */\n counts?: Record<string, Record<string, number>>;\n /** Override the header title. Default `'Filter'`. */\n title?: ReactNode;\n /** Override the reset button label. Default `'Reset'`. */\n resetLabel?: ReactNode;\n}\n\nconst EMPTY: FilterPanelValue = Object.freeze({});\n\nexport const FilterPanel = forwardRef<HTMLDivElement, FilterPanelProps>(function FilterPanel(\n {\n facets,\n value,\n defaultValue,\n onValueChange,\n onReset,\n counts,\n title = 'Filter',\n resetLabel = 'Reset',\n className,\n ...props\n },\n ref,\n) {\n const [selection, setSelection] = useControllableState<FilterPanelValue>({\n value,\n defaultValue: defaultValue ?? EMPTY,\n onChange: onValueChange,\n });\n\n const total = facets.reduce((sum, facet) => sum + (selection[facet.id]?.length ?? 0), 0);\n\n const toggle = useCallback(\n (facetId: string, optionValue: string, next: boolean) => {\n setSelection((prev) => {\n const current = prev?.[facetId] ?? [];\n const filtered = current.filter((v) => v !== optionValue);\n const updated = next ? [...filtered, optionValue] : filtered;\n return { ...(prev ?? {}), [facetId]: updated };\n });\n },\n [setSelection],\n );\n\n const handleReset = useCallback(() => {\n setSelection(EMPTY);\n onReset?.();\n }, [setSelection, onReset]);\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-label={typeof title === 'string' ? title : undefined}\n className={cn(\n 'rounded-base border-border bg-panel flex w-[260px] flex-col gap-3 border p-4',\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase\">\n {title}\n </span>\n {total > 0 && (\n <Badge size=\"sm\" variant=\"accent\">\n {total}\n </Badge>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleReset}\n disabled={total === 0}\n className=\"ml-auto\"\n >\n {resetLabel}\n </Button>\n </div>\n {facets.map((facet) => (\n <FilterFacetGroup\n key={facet.id}\n facet={facet}\n selected={selection[facet.id] ?? []}\n counts={counts?.[facet.id]}\n onToggle={toggle}\n />\n ))}\n </div>\n );\n});\n\nFilterPanel.displayName = 'FilterPanel';\n\ninterface FilterFacetGroupProps {\n facet: FilterFacet;\n selected: ReadonlyArray<string>;\n counts?: Record<string, number>;\n onToggle: (facetId: string, optionValue: string, next: boolean) => void;\n}\n\nfunction FilterFacetGroup({ facet, selected, counts, onToggle }: FilterFacetGroupProps) {\n const collapsible = facet.collapsible ?? true;\n const [open, setOpen] = useState(facet.defaultOpen ?? true);\n const isOpen = !collapsible || open;\n const selectedCount = selected.length;\n\n const headingClass =\n 'text-text-muted flex items-center gap-[6px] font-mono text-[10px] tracking-[1.4px] uppercase';\n\n return (\n <section className=\"flex flex-col gap-1\">\n {collapsible ? (\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n headingClass,\n 'cursor-pointer rounded-xs px-1 py-[2px] outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'hover:text-text',\n )}\n >\n <span className=\"flex-1 text-left\">{facet.label}</span>\n {selectedCount > 0 && (\n <Badge size=\"sm\" variant=\"neutral\">\n {selectedCount}\n </Badge>\n )}\n <span aria-hidden className=\"text-[10px] opacity-70\">\n {isOpen ? '▾' : '▸'}\n </span>\n </button>\n ) : (\n <div className={cn(headingClass, 'px-1 py-[2px]')}>\n <span className=\"flex-1\">{facet.label}</span>\n {selectedCount > 0 && (\n <Badge size=\"sm\" variant=\"neutral\">\n {selectedCount}\n </Badge>\n )}\n </div>\n )}\n {isOpen && (\n <ul className=\"m-0 flex list-none flex-col gap-[2px] p-0\">\n {facet.options.map((option) => {\n const isSelected = selected.includes(option.value);\n const count = counts?.[option.value];\n return (\n <li key={option.value} className=\"flex items-center gap-2 px-1 py-[3px]\">\n <Checkbox\n checked={isSelected}\n onCheckedChange={(next) => onToggle(facet.id, option.value, next === true)}\n label={option.label}\n />\n {typeof count === 'number' && (\n <span className=\"text-text-dim ml-auto font-mono text-[10px] tabular-nums\">\n {count}\n </span>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { HoverCard } from '../../components/HoverCard';\nimport { cn } from '../../utils/cn';\nimport { RadialProgress, type RadialTone } from '../RadialProgress';\n\n/**\n * HealthScore — `RadialProgress` + delta indicator + optional breakdown\n * tooltip. The shape generalizes recurring product surfaces like service\n * health, deployment confidence, and graph health.\n *\n * Delta sign drives the arrow direction and tone (positive = ok, negative =\n * err) unless an explicit `tone` is set. When a `breakdown` is supplied, the\n * score wraps in a `HoverCard` that reveals the per-bucket contributions.\n */\n\nexport interface HealthScoreBreakdownEntry {\n label: ReactNode;\n value: number;\n /** Tone for the value text. Defaults to inheriting the parent score tone. */\n tone?: RadialTone;\n}\n\nexport interface HealthScoreProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Current value, 0..max. */\n value: number;\n /** Maximum value. Default 100. */\n max?: number;\n /**\n * Signed change vs. the previous period. Positive draws an up-arrow + ok\n * tone, negative draws a down-arrow + err tone. Pass `0` to render a flat\n * indicator.\n */\n delta?: number;\n /** Label rendered under the score. */\n label?: ReactNode;\n /** Optional per-bucket contributions revealed in a HoverCard. */\n breakdown?: ReadonlyArray<HealthScoreBreakdownEntry>;\n /** Pixel size for the RadialProgress. Default 72. */\n size?: number;\n /** Color tone for the ring. Auto-derived when omitted. */\n tone?: RadialTone;\n /** Accessible label for the score. Defaults to `${pct}% health`. */\n 'aria-label'?: string;\n}\n\nfunction deltaTone(delta: number): RadialTone {\n if (delta > 0) return 'ok';\n if (delta < 0) return 'err';\n return 'accent';\n}\n\nfunction deltaGlyph(delta: number) {\n if (delta > 0) return '↑';\n if (delta < 0) return '↓';\n return '·';\n}\n\nconst toneTextClass: Record<RadialTone, string> = {\n accent: 'text-text-muted',\n ok: 'text-ok',\n warn: 'text-warn',\n err: 'text-err',\n};\n\nexport const HealthScore = forwardRef<HTMLDivElement, HealthScoreProps>(function HealthScore(\n {\n value,\n max = 100,\n delta,\n label,\n breakdown,\n size = 72,\n tone,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n) {\n const pct = max > 0 ? Math.round((Math.min(max, Math.max(0, value)) / max) * 100) : 0;\n const resolvedTone: RadialTone = tone ?? (pct >= 80 ? 'ok' : pct >= 50 ? 'accent' : 'warn');\n const indicatorTone = typeof delta === 'number' ? deltaTone(delta) : 'accent';\n\n const core = (\n <div\n ref={ref}\n className={cn('inline-flex flex-col items-center gap-1', className)}\n aria-label={ariaLabel ?? `${pct}% health`}\n {...props}\n >\n <RadialProgress value={value} max={max} size={size} tone={resolvedTone} />\n {label && <div className=\"text-text-muted mt-1 text-[12px] leading-tight\">{label}</div>}\n {typeof delta === 'number' && (\n <div className={cn('font-mono text-[11px] tabular-nums', toneTextClass[indicatorTone])}>\n <span aria-hidden>{deltaGlyph(delta)}</span> {Math.abs(delta)}\n </div>\n )}\n </div>\n );\n\n if (!breakdown || breakdown.length === 0) {\n return core;\n }\n\n return (\n <HoverCard\n trigger={<span className=\"inline-flex\">{core}</span>}\n content={\n <div className=\"flex min-w-[180px] flex-col gap-2\">\n <div className=\"text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase\">\n Breakdown\n </div>\n <ul className=\"m-0 flex list-none flex-col gap-1 p-0 text-[12px]\">\n {breakdown.map((entry, i) => (\n <li key={i} className=\"flex items-center gap-2\">\n <span className=\"text-text-muted flex-1 truncate\">{entry.label}</span>\n <span\n className={cn(\n 'font-mono tabular-nums',\n entry.tone ? toneTextClass[entry.tone] : 'text-text',\n )}\n >\n {entry.value}\n </span>\n </li>\n ))}\n </ul>\n </div>\n }\n />\n );\n});\n\nHealthScore.displayName = 'HealthScore';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * RadialProgress — circular SVG progress ring. Renders the percent label in the\n * center by default; pass `children` to override (e.g., a glyph or a count).\n *\n * Tones: accent (default) and ok (auto-applied when value === max).\n */\n\nexport type RadialTone = 'accent' | 'ok' | 'warn' | 'err';\n\nexport interface RadialProgressProps extends HTMLAttributes<HTMLDivElement> {\n /** Current value, 0..max. */\n value: number;\n /** Maximum value. Default 100. */\n max?: number;\n /** Pixel size of the SVG. Default 64. */\n size?: number;\n /** Stroke width. Default 4. */\n thickness?: number;\n /** Color tone. Auto-flips to `ok` on completion unless explicitly set. */\n tone?: RadialTone;\n /** Replaces the centered percent label. */\n children?: ReactNode;\n /** Accessible label. Falls back to `${pct}%`. */\n 'aria-label'?: string;\n}\n\nconst toneStrokeClass: Record<RadialTone, string> = {\n accent: 'stroke-accent',\n ok: 'stroke-ok',\n warn: 'stroke-warn',\n err: 'stroke-err',\n};\n\nexport const RadialProgress = forwardRef<HTMLDivElement, RadialProgressProps>(\n function RadialProgress(\n {\n value,\n max = 100,\n size = 64,\n thickness = 4,\n tone,\n children,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n ref,\n ) {\n const clamped = Math.min(max, Math.max(0, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const r = (size - thickness) / 2;\n const c = 2 * Math.PI * r;\n const dash = (pct / 100) * c;\n const resolvedTone: RadialTone = tone ?? (clamped >= max ? 'ok' : 'accent');\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={Math.round(pct)}\n aria-label={ariaLabel ?? `${Math.round(pct)}%`}\n className={cn('relative inline-grid place-items-center', className)}\n style={{ width: size, height: size }}\n {...props}\n >\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n strokeWidth={thickness}\n className=\"stroke-panel-2\"\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n strokeDasharray={`${dash} ${c}`}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n className={cn(\n 'transition-[stroke-dasharray] duration-(--duration-step)',\n toneStrokeClass[resolvedTone],\n )}\n />\n </svg>\n <div className=\"absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums\">\n {children ?? `${Math.round(pct)}%`}\n </div>\n </div>\n );\n },\n);\n\nRadialProgress.displayName = 'RadialProgress';\n","'use client';\n\nimport * as RadixMenubar from '@radix-ui/react-menubar';\nimport { forwardRef, type FC, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Menubar — desktop-style horizontal menu strip (File, Edit, View, …) built on\n * Radix Menubar. Owns ARIA + keyboard semantics; ShipIt owns styling.\n *\n * Compose with `<MenubarMenu>` per top-level entry. Inside each menu use\n * `<MenubarTrigger>` (the visible button), `<MenubarContent>` (the dropdown),\n * and `<MenuItem>` / `<MenuSeparator>` from the existing primitive surface.\n */\n\nexport const Menubar = forwardRef<HTMLDivElement, RadixMenubar.MenubarProps>(function Menubar(\n { className, ...props },\n ref,\n) {\n return (\n <RadixMenubar.Root\n ref={ref}\n className={cn(\n 'border-border bg-panel flex h-[30px] items-center gap-[2px] border-b px-3',\n className,\n )}\n {...props}\n />\n );\n});\n\nMenubar.displayName = 'Menubar';\n\nexport const MenubarMenu: FC<RadixMenubar.MenubarMenuProps> = RadixMenubar.Menu;\n\nexport const MenubarTrigger = forwardRef<HTMLButtonElement, RadixMenubar.MenubarTriggerProps>(\n function MenubarTrigger({ className, ...props }, ref) {\n return (\n <RadixMenubar.Trigger\n ref={ref}\n className={cn(\n 'text-text cursor-pointer rounded-xs border-0 bg-transparent px-[10px] py-1 text-[12px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'data-[state=open]:bg-panel-2 hover:bg-panel-2',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nMenubarTrigger.displayName = 'MenubarTrigger';\n\nexport const MenubarContent = forwardRef<HTMLDivElement, RadixMenubar.MenubarContentProps>(\n function MenubarContent({ className, sideOffset = 6, align = 'start', ...props }, ref) {\n return (\n <RadixMenubar.Portal>\n <RadixMenubar.Content\n ref={ref}\n sideOffset={sideOffset}\n align={align}\n className={cn(\n 'border-border-strong bg-panel z-popover min-w-[180px] rounded-md border p-1 shadow-lg outline-none',\n 'data-[state=open]:animate-[ship-pop-in_140ms_var(--easing-out)]',\n className,\n )}\n {...props}\n />\n </RadixMenubar.Portal>\n );\n },\n);\n\nMenubarContent.displayName = 'MenubarContent';\n\nconst itemBase = cn(\n 'flex items-center gap-2 rounded-sm px-[10px] py-[6px] text-[12px] cursor-pointer outline-none',\n 'data-[highlighted]:bg-panel-2',\n 'data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed',\n);\n\nexport interface MenubarItemProps extends RadixMenubar.MenubarItemProps {\n /** Trailing hint — typically a kbd shortcut. */\n trailing?: ReactNode;\n /** Style as destructive (red). */\n destructive?: boolean;\n}\n\nexport const MenubarItem = forwardRef<HTMLDivElement, MenubarItemProps>(function MenubarItem(\n { trailing, destructive, className, children, ...props },\n ref,\n) {\n return (\n <RadixMenubar.Item\n ref={ref}\n className={cn(itemBase, destructive ? 'text-err' : 'text-text', className)}\n {...props}\n >\n <span className=\"flex-1\">{children}</span>\n {trailing && <span className=\"text-text-dim font-mono text-[10px]\">{trailing}</span>}\n </RadixMenubar.Item>\n );\n});\n\nMenubarItem.displayName = 'MenubarItem';\n\nexport const MenubarSeparator = forwardRef<HTMLDivElement, RadixMenubar.MenubarSeparatorProps>(\n function MenubarSeparator({ className, ...props }, ref) {\n return (\n <RadixMenubar.Separator\n ref={ref}\n className={cn('bg-border my-1 h-px', className)}\n {...props}\n />\n );\n },\n);\n\nMenubarSeparator.displayName = 'MenubarSeparator';\n","'use client';\n\nimport * as RadixNav from '@radix-ui/react-navigation-menu';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type MouseEvent,\n type ReactNode,\n} from 'react';\n\nimport { Drawer } from '../../components/Dialog/Drawer';\nimport { cn } from '../../utils/cn';\nimport { NavItem } from '../Sidebar';\n\n/**\n * NavBar — primary app navigation. The same component renders either as a\n * horizontal top bar (`orientation=\"horizontal\"`) or as a vertical side rail\n * (`orientation=\"vertical\"`); both layouts are driven by the same `items`\n * tree. Items can carry nested `children` to produce dropdowns on\n * horizontal and expand-collapse groups on vertical. Below `md` the bar\n * collapses to a hamburger that opens a Drawer rendering the items\n * vertically (set `responsive={false}` to opt out).\n *\n * Active state can be controlled (`value` + `onValueChange`) or uncontrolled\n * (`defaultValue`). Items with an `href` render as anchors; otherwise as\n * buttons that fire `onValueChange`.\n */\n\nexport interface NavBarItem {\n /** Stable identifier — what `value` / `onValueChange` reference. */\n id: string;\n label: ReactNode;\n /** Optional left-of-label icon node. */\n icon?: ReactNode;\n /** When set, item renders as an `<a>`; otherwise as a `<button>`. */\n href?: string;\n /** Trailing badge text. */\n badge?: ReactNode;\n disabled?: boolean;\n /** Nested items — dropdowns on horizontal, expand-groups on vertical. */\n children?: NavBarItem[];\n}\n\nexport type NavBarOrientation = 'horizontal' | 'vertical';\n\nexport interface NavBarProps extends Omit<HTMLAttributes<HTMLElement>, 'defaultValue' | 'title'> {\n /** Layout direction. Default `'horizontal'`. */\n orientation?: NavBarOrientation;\n /** Item tree driving the bar. */\n items: NavBarItem[];\n /**\n * Brand / logo slot rendered at the start. When `responsive` is `true`,\n * `brand` also seeds the mobile Drawer's accessible name, so it should\n * include text — e.g. `<><Logo /> ShipIt</>` rather than `<Logo />` alone.\n * Falls back to `'Navigation'` when omitted.\n */\n brand?: ReactNode;\n /** Trailing slot for secondary actions (avatar, settings, theme toggle, …). */\n actions?: ReactNode;\n /** Controlled active item id. */\n value?: string;\n /** Uncontrolled initial active item id. */\n defaultValue?: string;\n /** Fired when an item is activated. */\n onValueChange?: (id: string) => void;\n /** Pixel width of the vertical rail. Default 240. */\n width?: number;\n /** Collapse to a hamburger drawer below `md`. Default `true`. */\n responsive?: boolean;\n}\n\n/** Walks the tree to find whether `activeId` is `item` or any descendant. */\nfunction isActiveTree(item: NavBarItem, activeId: string | undefined): boolean {\n if (item.id === activeId) return true;\n return item.children?.some((c) => isActiveTree(c, activeId)) ?? false;\n}\n\nexport const NavBar = forwardRef<HTMLElement, NavBarProps>(function NavBar(\n {\n orientation = 'horizontal',\n items,\n brand,\n actions,\n value,\n defaultValue,\n onValueChange,\n width = 240,\n responsive = true,\n className,\n ...props\n },\n ref,\n) {\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState<string | undefined>(defaultValue);\n const activeId = isControlled ? value : internalValue;\n const [drawerOpen, setDrawerOpen] = useState(false);\n\n const select = useCallback(\n (id: string) => {\n if (!isControlled) setInternalValue(id);\n onValueChange?.(id);\n },\n [isControlled, onValueChange],\n );\n\n const handleItemActivate = useCallback(\n (id: string) => {\n select(id);\n setDrawerOpen(false);\n },\n [select],\n );\n\n const drawerBody = (\n // Distinct aria-label from the desktop <aside>'s <nav> below — when the\n // drawer is open on a viewport that's resizing past `md`, both navs can\n // sit in the DOM together. Identical accessible names would trip axe's\n // `landmark-unique` rule.\n <nav aria-label=\"Mobile navigation\" className=\"flex flex-col gap-1\">\n {items.map((item) => (\n <VerticalItem\n key={item.id}\n item={item}\n activeId={activeId}\n onActivate={handleItemActivate}\n />\n ))}\n </nav>\n );\n\n // The mobile fallback is intentionally a <div>, not a <header>. The\n // desktop layout (rendered alongside, hidden via media query) already\n // owns the `banner` landmark — two co-existing <header>s in the DOM\n // would trip axe's `landmark-no-duplicate-banner` rule even though only\n // one is visible at a time.\n const mobileBar = responsive ? (\n <div\n className={cn(\n 'border-border bg-panel z-overlay sticky top-0 flex h-[52px] items-center gap-4 border-b px-5 md:hidden',\n )}\n >\n <button\n type=\"button\"\n onClick={() => setDrawerOpen(true)}\n aria-label=\"Open navigation\"\n className=\"text-text-muted hover:text-text focus-visible:ring-accent-dim rounded-xs px-2 py-1 text-[18px] outline-none focus-visible:ring-[3px]\"\n >\n ☰\n </button>\n {brand && (\n <div className=\"flex flex-1 items-center text-[13px] font-medium whitespace-nowrap\">\n {brand}\n </div>\n )}\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n ) : null;\n\n if (orientation === 'horizontal') {\n return (\n <>\n {mobileBar}\n <header\n ref={ref as React.Ref<HTMLElement>}\n className={cn(\n 'border-border bg-panel flex h-[52px] items-center gap-4 border-b px-5',\n responsive && 'hidden md:flex',\n className,\n )}\n {...props}\n >\n {brand && (\n <div className=\"shrink-0 text-[13px] font-medium whitespace-nowrap\">{brand}</div>\n )}\n <RadixNav.Root className=\"relative flex-1\" delayDuration={120}>\n {/* Reset list styling. Consumers may render NavBar inside a\n typography/prose wrapper (e.g. MDX content) that injects\n `list-style: disc` and `li { margin }` — neutralize both\n here so the bar looks the same everywhere. */}\n <RadixNav.List className=\"m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!\">\n {items.map((item) =>\n item.children?.length ? (\n <HorizontalDropdown\n key={item.id}\n item={item}\n active={isActiveTree(item, activeId)}\n activeId={activeId}\n onActivate={handleItemActivate}\n />\n ) : (\n <RadixNav.Item key={item.id}>\n <HorizontalLink\n item={item}\n active={item.id === activeId}\n onActivate={handleItemActivate}\n />\n </RadixNav.Item>\n ),\n )}\n </RadixNav.List>\n <div className=\"z-popover absolute top-full left-0 flex justify-start\">\n <RadixNav.Viewport className=\"origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]\" />\n </div>\n </RadixNav.Root>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </header>\n {responsive && (\n <Drawer\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n side=\"left\"\n title={brand ?? 'Navigation'}\n width={300}\n >\n {drawerBody}\n </Drawer>\n )}\n </>\n );\n }\n\n return (\n <>\n {mobileBar}\n <aside\n ref={ref as React.Ref<HTMLElement>}\n // Distinguishes this complementary landmark from any other <aside>\n // (e.g. a docs sidebar) that may sit alongside a vertical NavBar on\n // the same page — without it, axe's `landmark-unique` rule fires\n // when both asides land in the DOM.\n aria-label=\"Primary navigation\"\n style={{ width }}\n className={cn(\n 'border-border bg-panel flex h-full flex-col gap-2 border-r p-[14px]',\n responsive && 'hidden md:flex',\n className,\n )}\n {...props}\n >\n {brand && <div className=\"px-2 py-1 text-[13px] font-medium\">{brand}</div>}\n <nav aria-label=\"Sidebar navigation\" className=\"flex flex-1 flex-col gap-1 overflow-y-auto\">\n {items.map((item) => (\n <VerticalItem\n key={item.id}\n item={item}\n activeId={activeId}\n onActivate={handleItemActivate}\n />\n ))}\n </nav>\n {actions && (\n <div className=\"border-border mt-auto flex flex-col gap-2 border-t pt-3\">{actions}</div>\n )}\n </aside>\n {responsive && (\n <Drawer\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n side=\"left\"\n title={brand ?? 'Navigation'}\n width={300}\n >\n {drawerBody}\n </Drawer>\n )}\n </>\n );\n});\n\nNavBar.displayName = 'NavBar';\n\n// ---------- Internal sub-components ----------\n\ninterface HorizontalLinkProps {\n item: NavBarItem;\n active: boolean;\n onActivate: (id: string) => void;\n}\n\nfunction HorizontalLink({ item, active, onActivate }: HorizontalLinkProps) {\n const baseClass = cn(\n 'flex items-center gap-[6px] rounded-xs px-3 py-[6px] text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n item.disabled && 'pointer-events-none opacity-50',\n );\n const handleClick = (e: MouseEvent<HTMLElement>) => {\n if (item.disabled) {\n e.preventDefault();\n return;\n }\n onActivate(item.id);\n };\n const inner = (\n <>\n {item.icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n {item.badge != null && <ItemBadge active={active}>{item.badge}</ItemBadge>}\n </>\n );\n\n if (item.href) {\n return (\n <RadixNav.Link asChild active={active}>\n <a\n href={item.href}\n aria-current={active ? 'page' : undefined}\n aria-disabled={item.disabled || undefined}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </a>\n </RadixNav.Link>\n );\n }\n return (\n <RadixNav.Link asChild active={active}>\n <button\n type=\"button\"\n aria-current={active ? 'page' : undefined}\n disabled={item.disabled}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </button>\n </RadixNav.Link>\n );\n}\n\ninterface HorizontalDropdownProps {\n item: NavBarItem;\n active: boolean;\n activeId: string | undefined;\n onActivate: (id: string) => void;\n}\n\nfunction HorizontalDropdown({ item, active, activeId, onActivate }: HorizontalDropdownProps) {\n return (\n <RadixNav.Item>\n <RadixNav.Trigger\n // `group` on the Trigger lets descendants react to the Trigger's\n // own `data-state` attribute via `group-data-[state=open]:…`.\n // Without `group`, child variants like `data-[state=open]:rotate-180`\n // on the chevron span would target the span's own (absent) data-state.\n className={cn(\n 'group flex items-center gap-1 rounded-xs px-3 py-[6px] text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n 'data-[state=open]:bg-panel-2',\n )}\n disabled={item.disabled}\n >\n {item.icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {item.icon}\n </span>\n )}\n <span>{item.label}</span>\n <span\n aria-hidden\n className=\"ml-1 text-[10px] opacity-70 transition-transform group-data-[state=open]:rotate-180\"\n >\n ▾\n </span>\n </RadixNav.Trigger>\n <RadixNav.Content className=\"border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg\">\n <ul className=\"m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!\">\n {item.children!.map((child) => (\n <li key={child.id}>\n <DropdownLink item={child} active={child.id === activeId} onActivate={onActivate} />\n </li>\n ))}\n </ul>\n </RadixNav.Content>\n </RadixNav.Item>\n );\n}\n\nfunction DropdownLink({ item, active, onActivate }: HorizontalLinkProps) {\n const baseClass = cn(\n 'flex w-full items-center gap-2 rounded-xs px-2 py-[6px] text-left text-[13px] outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n item.disabled && 'pointer-events-none opacity-50',\n );\n const handleClick = (e: MouseEvent<HTMLElement>) => {\n if (item.disabled) {\n e.preventDefault();\n return;\n }\n onActivate(item.id);\n };\n const inner = (\n <>\n {item.icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1\">{item.label}</span>\n {item.badge != null && <ItemBadge active={active}>{item.badge}</ItemBadge>}\n </>\n );\n if (item.href) {\n return (\n <RadixNav.Link asChild active={active}>\n <a\n href={item.href}\n aria-current={active ? 'page' : undefined}\n aria-disabled={item.disabled || undefined}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </a>\n </RadixNav.Link>\n );\n }\n return (\n <RadixNav.Link asChild active={active}>\n <button\n type=\"button\"\n aria-current={active ? 'page' : undefined}\n disabled={item.disabled}\n className={baseClass}\n onClick={handleClick}\n >\n {inner}\n </button>\n </RadixNav.Link>\n );\n}\n\ninterface VerticalItemProps {\n item: NavBarItem;\n activeId: string | undefined;\n onActivate: (id: string) => void;\n}\n\nfunction VerticalItem({ item, activeId, onActivate }: VerticalItemProps) {\n const hasChildren = (item.children?.length ?? 0) > 0;\n const treeActive = isActiveTree(item, activeId);\n // Default the group to expanded when a descendant is active; otherwise\n // collapsed. Consumers who want different behavior can rebuild the tree.\n const [open, setOpen] = useState(treeActive);\n // If the parent later moves activeId into this subtree (e.g. router push\n // to a descendant route while this group is collapsed), force the group\n // open so the active item is visible. Open-only: never auto-collapse —\n // the user may have closed the group deliberately. Driven from an effect\n // (not in-render ref mutation) so a discarded concurrent-mode render\n // can't leave the ref ahead of the committed state and skip the next\n // legitimate transition.\n const prevTreeActive = useRef(treeActive);\n useEffect(() => {\n if (treeActive && !prevTreeActive.current) setOpen(true);\n prevTreeActive.current = treeActive;\n }, [treeActive]);\n\n if (!hasChildren) {\n const handleClick = (e: MouseEvent<HTMLElement>) => {\n // Always notify; let the link navigate naturally when href is set.\n if (item.disabled) {\n e.preventDefault();\n return;\n }\n onActivate(item.id);\n };\n return (\n <NavItem\n icon={item.icon}\n label={item.label}\n active={item.id === activeId}\n badge={item.badge}\n disabled={item.disabled}\n href={item.href}\n onClick={handleClick}\n />\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n disabled={item.disabled}\n className={cn(\n 'flex w-full items-center gap-[10px] rounded-xs px-2 py-[6px] text-left text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n treeActive ? 'text-text' : 'text-text-muted',\n 'hover:bg-panel-2',\n item.disabled && 'pointer-events-none opacity-50',\n )}\n >\n {item.icon != null && (\n <span aria-hidden className=\"w-[14px] text-center opacity-80\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.badge != null && <ItemBadge active={treeActive}>{item.badge}</ItemBadge>}\n <span aria-hidden className=\"text-[10px] opacity-60\">\n {open ? '▾' : '▸'}\n </span>\n </button>\n {open && (\n <div className=\"border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3\">\n {item.children!.map((child) => (\n <VerticalItem key={child.id} item={child} activeId={activeId} onActivate={onActivate} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ItemBadge({ active, children }: { active: boolean; children: ReactNode }) {\n return (\n <span\n className={cn(\n 'rounded-xs px-[6px] py-px font-mono text-[10px]',\n active ? 'bg-accent text-on-accent' : 'bg-panel-2 text-text-muted',\n )}\n >\n {children}\n </span>\n );\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Sidebar — primary app navigation column. A simple flex column with the\n * panel background and a right border. Compose with `<NavItem>` and\n * `<NavSection>` for the standard ShipIt sidebar shape.\n */\n\nexport interface SidebarProps extends HTMLAttributes<HTMLElement> {\n /** Width in pixels. Default 240. */\n width?: number;\n}\n\nexport const Sidebar = forwardRef<HTMLElement, SidebarProps>(function Sidebar(\n { width = 240, className, style, ...props },\n ref,\n) {\n return (\n <aside\n ref={ref}\n style={{ width, ...style }}\n className={cn(\n 'border-border bg-panel flex h-full flex-col gap-2 border-r p-[14px]',\n className,\n )}\n {...props}\n />\n );\n});\n\nSidebar.displayName = 'Sidebar';\n\ntype NavItemBaseProps = {\n /** Left-side glyph or icon node. */\n icon?: ReactNode;\n /** Visible label. */\n label: ReactNode;\n /** Highlights the row in the accent palette. */\n active?: boolean;\n /** Optional trailing badge text. */\n badge?: ReactNode;\n /** Disabled / read-only display. */\n disabled?: boolean;\n};\n\nexport type NavItemProps = NavItemBaseProps &\n (\n | ({ href: string } & Omit<HTMLAttributes<HTMLAnchorElement>, keyof NavItemBaseProps>)\n | ({ href?: undefined } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, keyof NavItemBaseProps>)\n );\n\nexport const NavItem = forwardRef<HTMLAnchorElement | HTMLButtonElement, NavItemProps>(\n function NavItem({ icon, label, active, badge, href, disabled, className, ...props }, ref) {\n const inner = (\n <>\n {icon && (\n <span aria-hidden className=\"w-[14px] text-center opacity-80\">\n {icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{label}</span>\n {badge != null && (\n <span\n className={cn(\n 'rounded-xs px-[6px] py-px font-mono text-[10px]',\n active ? 'bg-accent text-on-accent' : 'bg-panel-2 text-text-muted',\n )}\n >\n {badge}\n </span>\n )}\n </>\n );\n const baseClass = cn(\n 'flex cursor-pointer items-center gap-[10px] rounded-xs px-2 py-[6px] text-[13px] outline-none',\n 'transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n active ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n disabled && 'opacity-50 pointer-events-none',\n className,\n );\n if (href) {\n const anchorProps = props as HTMLAttributes<HTMLAnchorElement>;\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n aria-current={active ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n className={baseClass}\n {...anchorProps}\n >\n {inner}\n </a>\n );\n }\n // No href — render a real <button> so Enter/Space activation, focus\n // semantics, and disabled handling come from the platform.\n const buttonProps = props as ButtonHTMLAttributes<HTMLButtonElement>;\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n aria-current={active ? 'page' : undefined}\n disabled={disabled}\n className={cn(baseClass, 'w-full text-left')}\n {...buttonProps}\n >\n {inner}\n </button>\n );\n },\n);\n\nNavItem.displayName = 'NavItem';\n\nexport interface NavSectionProps extends HTMLAttributes<HTMLDivElement> {\n /** Eyebrow heading. Rendered uppercase, mono, dim. */\n label: ReactNode;\n /** Optional leading glyph or icon node next to the eyebrow. */\n icon?: ReactNode;\n /** Optional trailing element next to the heading (e.g., a `+` add affordance). */\n action?: ReactNode;\n /**\n * When true, the eyebrow becomes a button that toggles the body. The body\n * is hidden when closed. Default `false` — the eyebrow stays static.\n */\n collapsible?: boolean;\n /** Uncontrolled initial open state. Default `true`. Ignored when `open` is provided. */\n defaultOpen?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Pixel indent applied to the body. Useful when this section nests other\n * sections — the indent visually anchors children to the eyebrow above.\n * A subtle left rail is drawn alongside the indent. Default `0`.\n */\n indent?: number;\n}\n\nexport const NavSection = forwardRef<HTMLDivElement, NavSectionProps>(function NavSection(\n {\n label,\n icon,\n action,\n collapsible = false,\n defaultOpen = true,\n open,\n onOpenChange,\n indent = 0,\n className,\n children,\n ...props\n },\n ref,\n) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n // `open`/`defaultOpen` only matter when `collapsible` is true. A\n // non-collapsible section has no toggle to recover from a hidden body,\n // so always render its children regardless of the (possibly stale)\n // `open` prop a caller may have passed alongside.\n const isOpen = !collapsible || (isControlled ? open : internalOpen);\n\n const toggle = useCallback(() => {\n const next = !isOpen;\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n }, [isOpen, isControlled, onOpenChange]);\n\n const eyebrowClass =\n 'text-text-dim flex items-center gap-[6px] px-2 pt-2 font-mono text-[9px] tracking-[1.4px] uppercase';\n\n return (\n <div ref={ref} className={cn('flex flex-col gap-1', className)} {...props}>\n {collapsible ? (\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={toggle}\n className={cn(\n eyebrowClass,\n 'cursor-pointer rounded-xs outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n 'hover:text-text-muted',\n )}\n >\n {icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {icon}\n </span>\n )}\n <span className=\"flex-1 text-left\">{label}</span>\n {action}\n <span aria-hidden className=\"text-[10px] opacity-70\">\n {isOpen ? '▾' : '▸'}\n </span>\n </button>\n ) : (\n <div className={eyebrowClass}>\n {icon != null && (\n <span aria-hidden className=\"opacity-80\">\n {icon}\n </span>\n )}\n <span className=\"flex-1\">{label}</span>\n {action}\n </div>\n )}\n {isOpen && (\n <div\n className={cn('flex flex-col gap-[2px]', indent > 0 && 'border-border ml-2 border-l')}\n style={indent > 0 ? { paddingLeft: indent } : undefined}\n >\n {children}\n </div>\n )}\n </div>\n );\n});\n\nNavSection.displayName = 'NavSection';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { StatusDot } from '../../components/StatusDot';\nimport { cn } from '../../utils/cn';\n\n/**\n * OnboardingChecklist — list of getting-started tasks driven by remote\n * progress. Each item has a `status` (`pending` / `in-progress` / `done`)\n * that decides its dot color and label tone, plus an optional `action` slot\n * (typically a `Button`) rendered on the right.\n *\n * The header shows aggregate progress as a `Progress` bar; pass\n * `progressLabel` to override the default `\"{n} of {m} complete\"` text.\n */\n\nexport type OnboardingItemStatus = 'pending' | 'in-progress' | 'done';\n\nexport interface OnboardingItem {\n id: string;\n label: ReactNode;\n description?: ReactNode;\n status: OnboardingItemStatus;\n /** Trailing call-to-action (typically a `Button`). */\n action?: ReactNode;\n}\n\nexport interface OnboardingChecklistProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n items: ReadonlyArray<OnboardingItem>;\n /** Fires when an item row is clicked. The whole row becomes clickable when supplied. */\n onItemClick?: (id: string) => void;\n /** Header heading. Default `'Get started'`. */\n title?: ReactNode;\n /** Override the progress label rendered next to the bar. */\n progressLabel?: ReactNode;\n /** Hide the aggregate progress bar. */\n hideProgress?: boolean;\n}\n\nconst statusDot: Record<OnboardingItemStatus, 'off' | 'sync' | 'ok'> = {\n pending: 'off',\n 'in-progress': 'sync',\n done: 'ok',\n};\n\nconst labelStateClass: Record<OnboardingItemStatus, string> = {\n pending: 'text-text',\n 'in-progress': 'text-text',\n done: 'text-text-dim line-through',\n};\n\nexport const OnboardingChecklist = forwardRef<HTMLElement, OnboardingChecklistProps>(\n function OnboardingChecklist(\n { items, onItemClick, title = 'Get started', progressLabel, hideProgress, className, ...props },\n ref,\n ) {\n const total = items.length;\n const done = items.filter((i) => i.status === 'done').length;\n\n return (\n <section\n ref={ref}\n aria-label={typeof title === 'string' ? title : undefined}\n className={cn(\n 'rounded-base border-border bg-panel flex flex-col gap-3 border p-5',\n className,\n )}\n {...props}\n >\n <header className=\"flex items-center gap-2\">\n <span className=\"text-[14px] font-medium\">{title}</span>\n <span className=\"text-text-dim ml-auto font-mono text-[11px] tabular-nums\">\n {progressLabel ?? `${done} of ${total} complete`}\n </span>\n </header>\n {!hideProgress && total > 0 && (\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={done}\n aria-label={typeof title === 'string' ? `${title} progress` : 'Setup progress'}\n className=\"bg-panel-2 h-[3px] w-full overflow-hidden rounded-full\"\n >\n <span\n aria-hidden\n className={cn(\n 'block h-full rounded-full transition-[width] duration-(--duration-step)',\n done === total ? 'bg-ok' : 'bg-accent',\n )}\n style={{ width: `${total > 0 ? (done / total) * 100 : 0}%` }}\n />\n </div>\n )}\n <ul className=\"m-0 flex list-none flex-col gap-1 p-0\">\n {items.map((item) => {\n const interactive = typeof onItemClick === 'function';\n const labelBlock = (\n <>\n <StatusDot\n state={statusDot[item.status]}\n pulse={item.status === 'in-progress'}\n size={10}\n className=\"mt-[3px]\"\n />\n <div className=\"flex min-w-0 flex-1 flex-col gap-[2px]\">\n <span className={cn('text-[13px]', labelStateClass[item.status])}>\n {item.label}\n </span>\n {item.description && (\n <span className=\"text-text-muted text-[12px] leading-[1.45]\">\n {item.description}\n </span>\n )}\n </div>\n </>\n );\n const labelRegionClass = cn(\n 'flex flex-1 items-start gap-3 rounded-md px-2 py-2 text-left transition-colors duration-(--duration-micro)',\n interactive &&\n 'cursor-pointer outline-none hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n );\n // The label region is the clickable target; the `action` slot\n // renders as a sibling so any nested button stays a peer of the\n // row button (avoiding axe `nested-interactive`).\n return (\n <li key={item.id} className=\"flex items-start gap-2\">\n {interactive ? (\n <button\n type=\"button\"\n aria-current={item.status === 'in-progress' ? 'step' : undefined}\n onClick={() => onItemClick(item.id)}\n className={labelRegionClass}\n >\n {labelBlock}\n </button>\n ) : (\n <div className={labelRegionClass}>{labelBlock}</div>\n )}\n {item.action && <div className=\"shrink-0 self-center\">{item.action}</div>}\n </li>\n );\n })}\n </ul>\n </section>\n );\n },\n);\n\nOnboardingChecklist.displayName = 'OnboardingChecklist';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { IconButton } from '../../components/Button/IconButton';\nimport { cn } from '../../utils/cn';\n\n/**\n * Pagination — page selector for paginated lists/tables. Renders prev/next\n * arrows plus a compact range of numbered pages. Use `siblings` to control how\n * many pages flank the current page; ellipses are inserted automatically.\n */\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Currently selected page (1-indexed). */\n page: number;\n /** Total number of pages. */\n total: number;\n /** Called with the new page when the user clicks a page or arrow. */\n onPageChange: (page: number) => void;\n /** How many sibling pages to show on each side of the current page. Default 1. */\n siblings?: number;\n}\n\ntype PageItem = number | 'start-ellipsis' | 'end-ellipsis';\n\nfunction buildRange(page: number, total: number, siblings: number): PageItem[] {\n if (total <= 0) return [];\n const items: PageItem[] = [];\n const left = Math.max(2, page - siblings);\n const right = Math.min(total - 1, page + siblings);\n\n items.push(1);\n if (left > 2) items.push('start-ellipsis');\n for (let i = left; i <= right; i++) items.push(i);\n if (right < total - 1) items.push('end-ellipsis');\n if (total > 1) items.push(total);\n return items;\n}\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n { page, total, onPageChange, siblings = 1, className, ...props },\n ref,\n) {\n const items = buildRange(page, total, siblings);\n\n return (\n <nav\n ref={ref}\n aria-label=\"Pagination\"\n className={cn('inline-flex items-center gap-1', className)}\n {...props}\n >\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon=\"‹\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => onPageChange(Math.max(1, page - 1))}\n />\n {items.map((item, i) => {\n if (item === 'start-ellipsis' || item === 'end-ellipsis') {\n return (\n <span\n key={`ellipsis-${i}`}\n aria-hidden\n className=\"text-text-dim grid h-[26px] min-w-[26px] place-items-center px-2 font-mono text-[12px]\"\n >\n …\n </span>\n );\n }\n const isActive = item === page;\n return (\n <button\n key={item}\n type=\"button\"\n aria-label={`Go to page ${item}`}\n aria-current={isActive ? 'page' : undefined}\n onClick={() => onPageChange(item)}\n className={cn(\n 'h-[26px] min-w-[26px] rounded-[5px] px-2 font-mono text-[12px] outline-none',\n 'cursor-pointer transition-colors duration-(--duration-micro)',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n isActive\n ? 'bg-accent-dim text-accent border-accent border'\n : 'text-text-muted hover:bg-panel-2 hover:text-text border border-transparent',\n )}\n >\n {item}\n </button>\n );\n })}\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon=\"›\"\n aria-label=\"Next page\"\n disabled={page >= total}\n onClick={() => onPageChange(Math.min(total, page + 1))}\n />\n </nav>\n );\n});\n\nPagination.displayName = 'Pagination';\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Progress — linear bar in determinate (`value`) or `indeterminate` mode.\n * Pass `label` for an accessible name and a visible label row above the bar.\n *\n * For value rounding: the bar's width is the raw value clamped to [0, max];\n * the label/aria-valuenow are rounded to whole percent.\n */\n\nconst trackStyles = cva('w-full rounded-full bg-panel-2 overflow-hidden', {\n variants: {\n size: {\n sm: 'h-[3px]',\n md: 'h-[4px]',\n lg: 'h-[6px]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst fillStyles = cva('h-full rounded-full transition-[width] duration-(--duration-step)', {\n variants: {\n tone: {\n accent: 'bg-accent',\n ok: 'bg-ok',\n warn: 'bg-warn',\n err: 'bg-err',\n },\n },\n defaultVariants: { tone: 'accent' },\n});\n\nexport interface ProgressProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role'>,\n VariantProps<typeof trackStyles>,\n VariantProps<typeof fillStyles> {\n /** Numeric progress, 0..max. Ignored when `indeterminate`. */\n value?: number;\n /** Maximum value. Default 100. */\n max?: number;\n /** When true, shows an indeterminate sliding pill instead of a determinate fill. */\n indeterminate?: boolean;\n /** Optional visible label (rendered above the bar with the percent). */\n label?: ReactNode;\n /** When false, hides the percent readout next to the label. Default true. */\n showValue?: boolean;\n}\n\nexport const Progress = forwardRef<HTMLDivElement, ProgressProps>(function Progress(\n {\n value = 0,\n max = 100,\n indeterminate = false,\n label,\n showValue = true,\n tone,\n size,\n className,\n ...props\n },\n ref,\n) {\n const clamped = Math.min(max, Math.max(0, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const display = Math.round(pct);\n\n return (\n <div ref={ref} className={cn('flex w-full flex-col gap-2', className)} {...props}>\n {label != null && (\n <div className=\"flex text-[12px]\">\n <span className=\"text-text-muted\">{label}</span>\n {showValue && !indeterminate && (\n <span className=\"text-text ml-auto font-mono tabular-nums\">{display}%</span>\n )}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : display}\n aria-label={typeof label === 'string' ? label : undefined}\n className={trackStyles({ size })}\n >\n {indeterminate ? (\n <span\n aria-hidden\n className={cn(\n 'block h-full w-[40%] rounded-full',\n fillStyles({ tone }),\n 'animate-[ship-indeterminate_1.4s_linear_infinite]',\n )}\n />\n ) : (\n <span aria-hidden className={fillStyles({ tone })} style={{ width: `${pct}%` }} />\n )}\n </div>\n </div>\n );\n});\n\nProgress.displayName = 'Progress';\n","'use client';\n\nimport { forwardRef, useMemo, type SVGAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Sparkline — small inline SVG chart for showing trend at a glance. Computes\n * a polyline path from `values`; optionally fills the area under the line.\n *\n * The only chart we ship — the design system's stance on charting is that\n * production apps should bring their own (Recharts, Visx, etc.) when they\n * need anything more than a quiet trend cue.\n */\n\nexport interface SparklineProps extends Omit<\n SVGAttributes<SVGSVGElement>,\n 'children' | 'fill' | 'values'\n> {\n /** Numeric series. Drawn at uniform horizontal spacing. */\n values: ReadonlyArray<number>;\n /** Pixel width. Default 160. */\n width?: number;\n /** Pixel height. Default 32. */\n height?: number;\n /** Stroke color (CSS color or var). Defaults to `currentColor`. */\n stroke?: string;\n /** Stroke width. Default 1.5. */\n strokeWidth?: number;\n /** When true, fills the area under the line at 16% opacity. */\n fill?: boolean;\n /** Accessible label. Defaults to `Trend`. */\n 'aria-label'?: string;\n}\n\nfunction buildPath(values: ReadonlyArray<number>, w: number, h: number) {\n if (values.length === 0) return { line: '', area: '' };\n const pad = 2;\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min || 1;\n const stepX = values.length === 1 ? 0 : (w - pad * 2) / (values.length - 1);\n const points = values.map((v, i) => {\n const x = pad + i * stepX;\n const y = pad + (1 - (v - min) / range) * (h - pad * 2);\n return `${x.toFixed(2)},${y.toFixed(2)}`;\n });\n const line = `M${points.join(' L')}`;\n const area = `${line} L${(pad + (values.length - 1) * stepX).toFixed(2)},${(h - pad).toFixed(\n 2,\n )} L${pad.toFixed(2)},${(h - pad).toFixed(2)} Z`;\n return { line, area };\n}\n\nexport const Sparkline = forwardRef<SVGSVGElement, SparklineProps>(function Sparkline(\n {\n values,\n width = 160,\n height = 32,\n stroke = 'currentColor',\n strokeWidth = 1.5,\n fill = false,\n className,\n 'aria-label': ariaLabel = 'Trend',\n ...props\n },\n ref,\n) {\n const { line, area } = useMemo(() => buildPath(values, width, height), [values, width, height]);\n\n return (\n <svg\n ref={ref}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n className={cn('inline-block', className)}\n {...props}\n >\n {fill && <path d={area} fill={stroke} fillOpacity={0.16} stroke=\"none\" />}\n <path\n d={line}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n});\n\nSparkline.displayName = 'Sparkline';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/** Spinner — circular loading indicator. Three sizes. */\n\nconst sizes = {\n sm: { box: 'h-3 w-3', border: 'border-[2px]' },\n md: { box: 'h-4 w-4', border: 'border-[2px]' },\n lg: { box: 'h-5 w-5', border: 'border-[2px]' },\n} as const;\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: keyof typeof sizes;\n /** Accessible label. Defaults to `Loading`. */\n label?: string;\n}\n\nexport const Spinner = forwardRef<HTMLSpanElement, SpinnerProps>(function Spinner(\n { size = 'md', label = 'Loading', className, ...props },\n ref,\n) {\n const s = sizes[size];\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label={label}\n className={cn('inline-block', className)}\n {...props}\n >\n <span\n aria-hidden\n className={cn(\n 'border-panel-2 border-t-accent block animate-[ship-spin_0.7s_linear_infinite] rounded-full',\n s.box,\n s.border,\n )}\n />\n </span>\n );\n});\n\nSpinner.displayName = 'Spinner';\n","'use client';\n\nimport { forwardRef, Fragment, type HTMLAttributes } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Stepper — wizard / multi-step progress indicator. Computes done / current /\n * upcoming state from the `current` index so the consumer just passes labels.\n */\n\nexport type StepState = 'done' | 'current' | 'upcoming';\n\n/** A step in a Stepper. Pass either a bare string label or a `{ id?, label }` object. */\nexport type StepperStep = string | { id?: string; label: string };\n\nexport interface StepperProps extends HTMLAttributes<HTMLOListElement> {\n /**\n * Ordered steps. A step may be either a bare string label or an object\n * `{ id?, label }`. Use `id` to give React a stable key when two steps\n * share a label (e.g. [\"Plan\", \"Plan Review\"]).\n */\n steps: ReadonlyArray<StepperStep>;\n /** Zero-based index of the current step. Steps before are `done`, after are `upcoming`. */\n current: number;\n}\n\nconst dotBase =\n 'h-6 w-6 rounded-full grid place-items-center text-[11px] font-mono font-semibold border';\n\nconst dotStateClass: Record<StepState, string> = {\n done: 'bg-accent text-on-accent border-accent',\n current: 'bg-accent-dim text-accent border-accent',\n upcoming: 'bg-panel text-text-dim border-border',\n};\n\nconst labelStateClass: Record<StepState, string> = {\n done: 'text-text',\n current: 'text-text font-medium',\n upcoming: 'text-text-dim',\n};\n\nfunction stateFor(index: number, current: number): StepState {\n if (index < current) return 'done';\n if (index === current) return 'current';\n return 'upcoming';\n}\n\nexport const Stepper = forwardRef<HTMLOListElement, StepperProps>(function Stepper(\n { steps, current, className, ...props },\n ref,\n) {\n return (\n <ol\n ref={ref}\n aria-label=\"Progress\"\n className={cn('m-0 flex w-full list-none items-center p-0', className)}\n {...props}\n >\n {steps.map((step, i) => {\n const label = typeof step === 'string' ? step : step.label;\n const id = typeof step === 'string' ? undefined : step.id;\n const state = stateFor(i, current);\n const connectorActive = i < current;\n return (\n <Fragment key={id ?? i}>\n <li\n aria-current={state === 'current' ? 'step' : undefined}\n className=\"flex items-center gap-2\"\n >\n <span aria-hidden className={cn(dotBase, dotStateClass[state])}>\n {state === 'done' ? '✓' : i + 1}\n </span>\n <span className={cn('text-[12px]', labelStateClass[state])}>{label}</span>\n </li>\n {i < steps.length - 1 && (\n <span\n aria-hidden\n className={cn('mx-3 h-px flex-1', connectorActive ? 'bg-accent' : 'bg-border')}\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n});\n\nStepper.displayName = 'Stepper';\n","'use client';\n\nimport * as RadixTabs from '@radix-ui/react-tabs';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { createContext, forwardRef, useContext, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Tabs — two visual styles built on Radix Tabs.\n *\n * `variant=\"underline\"` (default) is the navigation tab style: text labels with\n * a moving 2px underline. `variant=\"pill\"` is the segmented-control style: a\n * rounded panel housing pill buttons. Both share Radix's keyboard semantics\n * (←/→ to move, Home/End to jump, Enter/Space to activate when activation is\n * manual).\n */\n\ntype TabsVariant = 'underline' | 'pill';\n\nconst TabsVariantContext = createContext<TabsVariant>('underline');\n\nconst tabsListStyles = cva('', {\n variants: {\n variant: {\n underline: 'flex gap-6 border-b border-border',\n pill: 'inline-flex gap-1 rounded-base border border-border bg-panel-2 p-[3px]',\n },\n },\n});\n\nconst tabsTriggerStyles = cva(\n 'cursor-pointer outline-none transition-colors duration-(--duration-micro) focus-visible:ring-[3px] focus-visible:ring-accent-dim',\n {\n variants: {\n variant: {\n underline: cn(\n 'relative -mb-px inline-flex items-center px-[2px] py-2 text-[13px]',\n 'border-b-2 border-transparent text-text-muted',\n 'hover:text-text',\n 'data-[state=active]:border-accent data-[state=active]:text-text data-[state=active]:font-medium',\n ),\n pill: cn(\n 'inline-flex items-center rounded-sm px-[14px] py-[6px] text-[12px] font-normal',\n 'text-text-muted hover:text-text',\n 'data-[state=active]:bg-panel data-[state=active]:text-text data-[state=active]:font-medium',\n 'data-[state=active]:shadow-sm',\n ),\n },\n },\n },\n);\n\nexport interface TabsProps extends RadixTabs.TabsProps {\n /** Visual style — `underline` (default) or segmented `pill`. */\n variant?: TabsVariant;\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n { variant = 'underline', className, ...props },\n ref,\n) {\n return (\n <TabsVariantContext.Provider value={variant}>\n <RadixTabs.Root\n ref={ref}\n className={cn('flex flex-col', variant === 'underline' && 'gap-3', className)}\n {...props}\n />\n </TabsVariantContext.Provider>\n );\n});\n\nTabs.displayName = 'Tabs';\n\nexport const TabsList = forwardRef<HTMLDivElement, RadixTabs.TabsListProps>(function TabsList(\n { className, ...props },\n ref,\n) {\n const variant = useContext(TabsVariantContext);\n return (\n <RadixTabs.List ref={ref} className={cn(tabsListStyles({ variant }), className)} {...props} />\n );\n});\n\nTabsList.displayName = 'TabsList';\n\nexport interface TabProps extends RadixTabs.TabsTriggerProps {\n children?: ReactNode;\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { className, ...props },\n ref,\n) {\n const variant = useContext(TabsVariantContext);\n return (\n <RadixTabs.Trigger\n ref={ref}\n className={cn(tabsTriggerStyles({ variant }), className)}\n {...props}\n />\n );\n});\n\nTab.displayName = 'Tab';\n\nexport const TabsContent = forwardRef<HTMLDivElement, RadixTabs.TabsContentProps>(\n function TabsContent({ className, ...props }, ref) {\n return (\n <RadixTabs.Content\n ref={ref}\n className={cn(\n 'focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nTabsContent.displayName = 'TabsContent';\n\nexport type TabsVariantProps = VariantProps<typeof tabsTriggerStyles>;\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Timeline — vertical event list with a connecting rule between markers.\n * Pass `events` (preferred) for the simple shape, or compose with\n * `<TimelineItem>` children for custom layouts.\n */\n\nexport type TimelineEventTone = 'accent' | 'ok' | 'warn' | 'err' | 'muted';\n\nexport interface TimelineEvent {\n title: ReactNode;\n description?: ReactNode;\n /** Time label rendered in mono. */\n time?: ReactNode;\n /** Marker color tone. Defaults to `accent`. */\n tone?: TimelineEventTone;\n}\n\nexport interface TimelineProps extends HTMLAttributes<HTMLOListElement> {\n /** Convenience prop — when provided, renders `<TimelineItem>` for each event. */\n events?: ReadonlyArray<TimelineEvent>;\n}\n\nconst ringClass: Record<TimelineEventTone, string> = {\n accent: 'border-accent',\n ok: 'border-ok',\n warn: 'border-warn',\n err: 'border-err',\n muted: 'border-text-dim',\n};\n\nexport const Timeline = forwardRef<HTMLOListElement, TimelineProps>(function Timeline(\n { events, className, children, ...props },\n ref,\n) {\n return (\n <ol\n ref={ref}\n className={cn(\n 'relative pl-6',\n 'before:bg-border before:absolute before:top-[6px] before:bottom-[6px] before:left-[7px] before:w-px',\n className,\n )}\n {...props}\n >\n {events\n ? events.map((e, i) => (\n <TimelineItem key={i} tone={e.tone} time={e.time} description={e.description}>\n {e.title}\n </TimelineItem>\n ))\n : children}\n </ol>\n );\n});\n\nTimeline.displayName = 'Timeline';\n\nexport interface TimelineItemProps extends HTMLAttributes<HTMLLIElement> {\n tone?: TimelineEventTone;\n description?: ReactNode;\n time?: ReactNode;\n}\n\nexport const TimelineItem = forwardRef<HTMLLIElement, TimelineItemProps>(function TimelineItem(\n { tone = 'accent', description, time, className, children, ...props },\n ref,\n) {\n return (\n <li ref={ref} className={cn('relative mb-[18px] last:mb-0', className)} {...props}>\n <span\n aria-hidden\n className={cn(\n 'bg-bg absolute top-[4px] -left-6 h-[14px] w-[14px] rounded-full border-2',\n ringClass[tone],\n )}\n />\n <div className=\"text-[13px] font-medium\">{children}</div>\n {description && <div className=\"text-text-muted text-[12px]\">{description}</div>}\n {time && <div className=\"text-text-dim mt-[2px] font-mono text-[10px]\">{time}</div>}\n </li>\n );\n});\n\nTimelineItem.displayName = 'TimelineItem';\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\nimport { formatRelative } from './formatRelative';\nimport type { TimelineEventTone } from './Timeline';\n\n/**\n * ActivityTimeline — typed-event variant of `Timeline`. Each event carries\n * an optional `icon`, an `actor` (name + avatar slot), a `title`, an `at`\n * timestamp formatted relative to `relativeNow`, and an optional `payload`\n * preview. Tone drives the marker color.\n *\n * The component is presentation-only — supply your own data adapter to map\n * domain events to `ActivityEvent`s.\n */\n\nexport interface ActivityActor {\n name: ReactNode;\n /** Typically an `<Avatar>` or `<IconGlyph>`. */\n avatar?: ReactNode;\n}\n\nexport interface ActivityEvent {\n id: string;\n /** Leading icon next to the marker. Often an `<IconGlyph>`. */\n icon?: ReactNode;\n actor?: ActivityActor;\n title: ReactNode;\n /** Event time. Renders relative to `relativeNow`. */\n at: Date | string | number;\n /** Optional inline preview (e.g. a diff snippet or a payload summary). */\n payload?: ReactNode;\n /** Marker color tone. Default `accent`. */\n tone?: TimelineEventTone;\n}\n\nexport interface ActivityTimelineProps extends HTMLAttributes<HTMLOListElement> {\n events: ReadonlyArray<ActivityEvent>;\n /** Reference time for relative formatting. Injectable for tests/SSR. */\n relativeNow?: Date;\n}\n\nconst ringClass: Record<TimelineEventTone, string> = {\n accent: 'border-accent',\n ok: 'border-ok',\n warn: 'border-warn',\n err: 'border-err',\n muted: 'border-text-dim',\n};\n\nexport const ActivityTimeline = forwardRef<HTMLOListElement, ActivityTimelineProps>(\n function ActivityTimeline({ events, relativeNow, className, ...props }, ref) {\n const now = relativeNow ?? new Date();\n return (\n <ol\n ref={ref}\n className={cn(\n 'relative m-0 list-none p-0 pl-6',\n 'before:bg-border before:absolute before:top-[6px] before:bottom-[6px] before:left-[7px] before:w-px',\n className,\n )}\n {...props}\n >\n {events.map((event) => {\n const tone = event.tone ?? 'accent';\n const time = formatRelative(event.at, now);\n return (\n <li key={event.id} className=\"relative mb-4 last:mb-0\">\n <span\n aria-hidden\n className={cn(\n 'bg-bg absolute top-[4px] -left-6 h-[14px] w-[14px] rounded-full border-2',\n ringClass[tone],\n )}\n />\n <div className=\"flex items-baseline gap-2\">\n {event.icon && (\n <span aria-hidden className=\"text-text-muted font-mono text-[12px]\">\n {event.icon}\n </span>\n )}\n <div className=\"text-[13px] font-medium\">{event.title}</div>\n {time && (\n <time className=\"text-text-dim ml-auto font-mono text-[10px]\">{time}</time>\n )}\n </div>\n {event.actor && (\n <div className=\"text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]\">\n {event.actor.avatar && (\n <span aria-hidden className=\"inline-flex\">\n {event.actor.avatar}\n </span>\n )}\n <span>{event.actor.name}</span>\n </div>\n )}\n {event.payload && (\n <div className=\"border-border bg-panel-2 mt-2 rounded-md border px-3 py-2 font-mono text-[11px] leading-[1.5]\">\n {event.payload}\n </div>\n )}\n </li>\n );\n })}\n </ol>\n );\n },\n);\n\nActivityTimeline.displayName = 'ActivityTimeline';\n\n// Re-export the underlying tone type so consumers don't need a separate import.\nexport type { TimelineEventTone };\n\n// Re-export the helper since it's useful outside the timeline (e.g. ConnectorCard).\nexport { formatRelative };\n","/**\n * formatRelative — compact \"x ago\" / \"in x\" formatter used by ActivityTimeline\n * and any other surface that wants to print typed event timestamps. Always\n * returns a short, ASCII string; if you need locale-aware formatting reach for\n * `Intl.RelativeTimeFormat` instead.\n *\n * The `now` argument is injectable so callers can render deterministically in\n * tests and during SSR. Invalid or unparseable inputs return an empty string\n * (note: `0` is a valid timestamp — the Unix epoch — and renders as a real\n * relative time).\n */\n\nconst SECOND = 1_000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nconst WEEK = 7 * DAY;\nconst MONTH = 30 * DAY;\nconst YEAR = 365 * DAY;\n\ninterface Unit {\n ms: number;\n short: string;\n}\n\nconst UNITS: ReadonlyArray<Unit> = [\n { ms: YEAR, short: 'y' },\n { ms: MONTH, short: 'mo' },\n { ms: WEEK, short: 'w' },\n { ms: DAY, short: 'd' },\n { ms: HOUR, short: 'h' },\n { ms: MINUTE, short: 'm' },\n { ms: SECOND, short: 's' },\n];\n\nexport function formatRelative(input: Date | string | number, now: Date = new Date()): string {\n const target = input instanceof Date ? input : new Date(input);\n if (Number.isNaN(target.getTime())) return '';\n\n const diffMs = now.getTime() - target.getTime();\n const abs = Math.abs(diffMs);\n if (abs < 5 * SECOND) return 'just now';\n\n for (const unit of UNITS) {\n if (abs >= unit.ms) {\n const n = Math.floor(abs / unit.ms);\n return diffMs >= 0 ? `${n}${unit.short} ago` : `in ${n}${unit.short}`;\n }\n }\n return 'just now';\n}\n","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\n\nimport { cn } from '../../utils/cn';\n\n/**\n * Topbar — slim header strip across the top of an app surface. The title\n * lives on the left, the rest of the row is yours via `actions` (search,\n * settings, avatar, etc.).\n */\n\nexport interface TopbarProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Title rendered on the left. */\n title?: ReactNode;\n /** Left-of-title slot — typically a logo or breadcrumbs. */\n leading?: ReactNode;\n /** Right-side action group. Rendered with `gap-3`. */\n actions?: ReactNode;\n}\n\nexport const Topbar = forwardRef<HTMLElement, TopbarProps>(function Topbar(\n { title, leading, actions, className, children, ...props },\n ref,\n) {\n return (\n <header\n ref={ref}\n className={cn(\n 'border-border bg-panel flex h-[52px] items-center gap-4 border-b px-5',\n className,\n )}\n {...props}\n >\n {leading}\n {title && <div className=\"text-[13px] font-medium\">{title}</div>}\n <div className=\"flex flex-1 items-center\" />\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n {children}\n </header>\n );\n});\n\nTopbar.displayName = 'Topbar';\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\n\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { cn } from '../../utils/cn';\n\n/**\n * Tree — recursive expandable list. Pass a nested `items` tree; the component\n * handles expand/collapse and selection state. Both can be uncontrolled\n * (`defaultExpanded` / `defaultValue`) or controlled (`expanded` / `value` +\n * change callbacks).\n *\n * Implements the WAI-ARIA tree pattern with roving tabindex and the standard\n * keyboard model (Up/Down/Left/Right/Home/End/Enter/Space).\n */\n\nconst EMPTY_SET: ReadonlySet<string> = new Set();\n\nexport interface TreeItem {\n id: string;\n label: ReactNode;\n /** Leading glyph or icon node. */\n icon?: ReactNode;\n /** Trailing badge / hint. */\n trailing?: ReactNode;\n children?: ReadonlyArray<TreeItem>;\n}\n\nexport interface TreeProps extends Omit<HTMLAttributes<HTMLUListElement>, 'onSelect'> {\n /** Tree data. */\n items: ReadonlyArray<TreeItem>;\n /** Controlled set of expanded node ids. */\n expanded?: ReadonlySet<string>;\n /** Default expanded ids (uncontrolled). */\n defaultExpanded?: ReadonlyArray<string>;\n /** Fires with the new expanded set whenever a node toggles. */\n onExpandedChange?: (expanded: ReadonlySet<string>) => void;\n /** Controlled selected node id. */\n value?: string;\n /** Default selected (uncontrolled). */\n defaultValue?: string;\n /** Fires with the selected node id. */\n onValueChange?: (id: string) => void;\n}\n\ninterface FlatItem {\n id: string;\n level: number;\n hasChildren: boolean;\n parentId: string | null;\n}\n\nfunction flattenVisible(\n items: ReadonlyArray<TreeItem>,\n expanded: ReadonlySet<string>,\n level: number,\n parentId: string | null,\n out: FlatItem[],\n): void {\n for (const item of items) {\n const hasChildren = !!item.children && item.children.length > 0;\n out.push({ id: item.id, level, hasChildren, parentId });\n if (hasChildren && expanded.has(item.id)) {\n flattenVisible(item.children ?? [], expanded, level + 1, item.id, out);\n }\n }\n}\n\nexport const Tree = forwardRef<HTMLUListElement, TreeProps>(function Tree(\n {\n items,\n expanded: expandedProp,\n defaultExpanded,\n onExpandedChange,\n value: valueProp,\n defaultValue,\n onValueChange,\n className,\n onKeyDown,\n ...props\n },\n ref,\n) {\n const [expanded, setExpanded] = useControllableState<ReadonlySet<string>>({\n value: expandedProp,\n defaultValue: defaultExpanded ? new Set(defaultExpanded) : undefined,\n onChange: onExpandedChange,\n });\n\n const [value, setValue] = useControllableState<string>({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n const expandedSet = expanded ?? EMPTY_SET;\n\n const flatVisible = useMemo<FlatItem[]>(() => {\n const out: FlatItem[] = [];\n flattenVisible(items, expandedSet, 1, null, out);\n return out;\n }, [items, expandedSet]);\n\n // Roving tabindex: track which item is the focus target.\n const [activeId, setActiveId] = useState<string | null>(null);\n\n // If activeId is no longer visible (parent collapsed), reset to a sensible default.\n useEffect(() => {\n if (activeId && !flatVisible.some((f) => f.id === activeId)) {\n setActiveId(null);\n }\n }, [activeId, flatVisible]);\n\n // The \"tab stop\" is: explicit activeId if visible, else the selected value if\n // visible, else the first visible item.\n const tabStopId = useMemo<string | null>(() => {\n if (activeId && flatVisible.some((f) => f.id === activeId)) return activeId;\n if (value && flatVisible.some((f) => f.id === value)) return value;\n return flatVisible[0]?.id ?? null;\n }, [activeId, flatVisible, value]);\n\n const listRef = useRef<HTMLUListElement | null>(null);\n const setRefs = useCallback(\n (node: HTMLUListElement | null) => {\n listRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLUListElement | null>).current = node;\n },\n [ref],\n );\n\n const focusItem = useCallback((id: string) => {\n const root = listRef.current;\n if (!root) return;\n const el = root.querySelector<HTMLElement>(`[data-treeitem-id=\"${CSS.escape(id)}\"]`);\n el?.focus();\n }, []);\n\n const moveActive = useCallback(\n (id: string) => {\n setActiveId(id);\n // Focus on next paint so the DOM reflects any expansion change.\n queueMicrotask(() => focusItem(id));\n },\n [focusItem],\n );\n\n const toggle = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev ?? EMPTY_SET);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n },\n [setExpanded],\n );\n\n const expand = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const base = prev ?? EMPTY_SET;\n if (base.has(id)) return base;\n const next = new Set(base);\n next.add(id);\n return next;\n });\n },\n [setExpanded],\n );\n\n const collapse = useCallback(\n (id: string) => {\n setExpanded((prev) => {\n const base = prev ?? EMPTY_SET;\n if (!base.has(id)) return base;\n const next = new Set(base);\n next.delete(id);\n return next;\n });\n },\n [setExpanded],\n );\n\n const selectItem = useCallback(\n (id: string) => {\n setValue(id);\n },\n [setValue],\n );\n\n const handleKeyDown = useCallback(\n (e: ReactKeyboardEvent<HTMLUListElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n if (flatVisible.length === 0) return;\n\n const currentId = tabStopId;\n const currentIndex = currentId ? flatVisible.findIndex((f) => f.id === currentId) : -1;\n const current = currentIndex >= 0 ? flatVisible[currentIndex] : undefined;\n\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n const next = flatVisible[Math.min(flatVisible.length - 1, currentIndex + 1)];\n if (next) moveActive(next.id);\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n const prev = flatVisible[Math.max(0, currentIndex - 1)];\n if (prev) moveActive(prev.id);\n break;\n }\n case 'ArrowRight': {\n if (!current) return;\n e.preventDefault();\n if (current.hasChildren) {\n if (!expandedSet.has(current.id)) {\n expand(current.id);\n } else {\n // Move to first child (the next item in the flat visible list).\n const child = flatVisible[currentIndex + 1];\n if (child && child.parentId === current.id) moveActive(child.id);\n }\n }\n break;\n }\n case 'ArrowLeft': {\n if (!current) return;\n e.preventDefault();\n if (current.hasChildren && expandedSet.has(current.id)) {\n collapse(current.id);\n } else if (current.parentId) {\n moveActive(current.parentId);\n }\n break;\n }\n case 'Home': {\n e.preventDefault();\n const first = flatVisible[0];\n if (first) moveActive(first.id);\n break;\n }\n case 'End': {\n e.preventDefault();\n const last = flatVisible[flatVisible.length - 1];\n if (last) moveActive(last.id);\n break;\n }\n case 'Enter':\n case ' ': {\n if (!current) return;\n e.preventDefault();\n selectItem(current.id);\n if (current.hasChildren) toggle(current.id);\n break;\n }\n default:\n break;\n }\n },\n [\n collapse,\n expand,\n expandedSet,\n flatVisible,\n moveActive,\n onKeyDown,\n selectItem,\n tabStopId,\n toggle,\n ],\n );\n\n return (\n <ul\n ref={setRefs}\n role=\"tree\"\n className={cn('flex flex-col gap-px text-[12px]', className)}\n onKeyDown={handleKeyDown}\n {...props}\n >\n {items.map((item) => (\n <TreeItemRow\n key={item.id}\n item={item}\n level={1}\n expanded={expandedSet}\n selected={value}\n tabStopId={tabStopId}\n onFocusItem={setActiveId}\n onActivate={(id) => {\n setActiveId(id);\n selectItem(id);\n }}\n onToggle={toggle}\n />\n ))}\n </ul>\n );\n});\n\nTree.displayName = 'Tree';\n\ninterface TreeItemRowProps {\n item: TreeItem;\n level: number;\n expanded: ReadonlySet<string>;\n selected: string | undefined;\n tabStopId: string | null;\n onFocusItem: (id: string) => void;\n onActivate: (id: string) => void;\n onToggle: (id: string) => void;\n}\n\nfunction TreeItemRow({\n item,\n level,\n expanded,\n selected,\n tabStopId,\n onFocusItem,\n onActivate,\n onToggle,\n}: TreeItemRowProps) {\n const hasChildren = !!item.children && item.children.length > 0;\n const isExpanded = hasChildren && expanded.has(item.id);\n const isSelected = selected === item.id;\n const isTabStop = tabStopId === item.id;\n\n return (\n <li role=\"none\">\n {/* Keyboard activation lives on the parent <ul> via the APG roving-tabindex\n model, so this row's onClick has no per-element keydown handler. */}\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}\n <div\n role=\"treeitem\"\n data-treeitem-id={item.id}\n aria-level={level}\n aria-expanded={hasChildren ? isExpanded : undefined}\n aria-selected={isSelected}\n tabIndex={isTabStop ? 0 : -1}\n onFocus={(e) => {\n if (e.target === e.currentTarget) onFocusItem(item.id);\n }}\n onClick={() => {\n onActivate(item.id);\n if (hasChildren) onToggle(item.id);\n }}\n style={{ paddingLeft: 4 + (level - 1) * 16 }}\n className={cn(\n 'flex cursor-pointer items-center gap-[6px] rounded-xs py-[5px] pr-2 outline-none',\n 'focus-visible:ring-accent-dim focus-visible:ring-[3px]',\n isSelected ? 'bg-accent-dim text-accent' : 'text-text hover:bg-panel-2',\n )}\n >\n <span aria-hidden className=\"text-text-dim grid w-3 place-items-center text-[10px]\">\n {hasChildren ? (isExpanded ? '▾' : '▸') : ''}\n </span>\n {item.icon && (\n <span aria-hidden className=\"text-[12px] opacity-80\">\n {item.icon}\n </span>\n )}\n <span className=\"flex-1 truncate\">{item.label}</span>\n {item.trailing}\n </div>\n {hasChildren && isExpanded && (\n <ul role=\"group\" className=\"flex flex-col gap-px\">\n {(item.children ?? []).map((child) => (\n <TreeItemRow\n key={child.id}\n item={child}\n level={level + 1}\n expanded={expanded}\n selected={selected}\n tabStopId={tabStopId}\n onFocusItem={onFocusItem}\n onActivate={onActivate}\n onToggle={onToggle}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n","'use client';\n\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { forwardRef, useCallback, useMemo, useState, type ReactNode } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { DialogContent, DialogRoot } from '../../components/Dialog';\nimport { Stepper } from '../Stepper';\n\n/**\n * WizardDialog — modal multi-step flow. Composes `Dialog`, `Stepper`, and\n * Next/Back navigation around a `steps` array. Each step's content can be a\n * static node or a render function that receives the wizard context, which\n * is useful for steps that need to read or drive the navigation imperatively.\n *\n * `canAdvance` lets a step gate the Next button (e.g. when a form field is\n * empty). When the last step's Next is clicked, the wizard calls\n * `onComplete()` and lets the consumer close the dialog from there.\n */\n\nexport interface WizardContext {\n current: number;\n total: number;\n goNext: () => void;\n goBack: () => void;\n goTo: (index: number) => void;\n isFirst: boolean;\n isLast: boolean;\n}\n\nexport interface WizardStep {\n /** Stable id. Used as the React key and the Stepper id. */\n id: string;\n /** Visible label in the Stepper. */\n label: string;\n /**\n * Step body. Pass a node for static content or a function for content that\n * needs the wizard context (e.g. to disable a Next button from inside).\n */\n content: ReactNode | ((ctx: WizardContext) => ReactNode);\n /**\n * Predicate that gates the Next button for this step. Receives the wizard\n * context. Default: always true (Next is enabled).\n */\n canAdvance?: (ctx: WizardContext) => boolean;\n}\n\nexport interface WizardDialogProps {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. */\n defaultOpen?: boolean;\n /** Fires when the dialog open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Ordered list of wizard steps. */\n steps: ReadonlyArray<WizardStep>;\n /** Step index to start at. Default 0. */\n initialStep?: number;\n /** Fires when Next is clicked on the last step. The consumer typically closes the dialog here. */\n onComplete?: () => void;\n /** Dialog title (visible heading). */\n title?: ReactNode;\n /** Dialog description (rendered below the title for assistive tech). */\n description?: ReactNode;\n /** Pixel max-width of the dialog panel. Default 560. */\n width?: number | string;\n /** Override the Next button label. Default `'Next'`. */\n nextLabel?: ReactNode;\n /** Override the Next button label on the last step. Default `'Done'`. */\n completeLabel?: ReactNode;\n /** Override the Back button label. Default `'Back'`. */\n backLabel?: ReactNode;\n /** Optional cancel slot rendered in the footer alongside the navigation. */\n cancelLabel?: ReactNode;\n /** Fires when the cancel button is pressed. The consumer typically closes the dialog. */\n onCancel?: () => void;\n}\n\nexport const WizardDialog = forwardRef<HTMLDivElement, WizardDialogProps>(function WizardDialog(\n {\n open,\n defaultOpen,\n onOpenChange,\n steps,\n initialStep = 0,\n onComplete,\n title,\n description,\n width = 560,\n nextLabel = 'Next',\n completeLabel = 'Done',\n backLabel = 'Back',\n cancelLabel,\n onCancel,\n },\n ref,\n) {\n const [current, setCurrent] = useState(initialStep);\n\n const total = steps.length;\n const safeCurrent = Math.min(current, Math.max(0, total - 1));\n const step = steps[safeCurrent];\n\n const goTo = useCallback(\n (index: number) => {\n setCurrent(Math.min(Math.max(0, index), Math.max(0, total - 1)));\n },\n [total],\n );\n const goNext = useCallback(() => setCurrent((c) => Math.min(c + 1, total - 1)), [total]);\n const goBack = useCallback(() => setCurrent((c) => Math.max(c - 1, 0)), []);\n\n const ctx = useMemo<WizardContext>(\n () => ({\n current: safeCurrent,\n total,\n goNext,\n goBack,\n goTo,\n isFirst: safeCurrent === 0,\n isLast: safeCurrent >= total - 1,\n }),\n [safeCurrent, total, goNext, goBack, goTo],\n );\n\n const stepperSteps = useMemo(() => steps.map((s) => ({ id: s.id, label: s.label })), [steps]);\n\n if (!step) return null;\n\n const canAdvance = step.canAdvance ? step.canAdvance(ctx) : true;\n const body = typeof step.content === 'function' ? step.content(ctx) : step.content;\n\n const handlePrimary = () => {\n if (ctx.isLast) {\n onComplete?.();\n } else {\n goNext();\n }\n };\n\n return (\n <DialogRoot open={open} defaultOpen={defaultOpen} onOpenChange={onOpenChange}>\n <DialogContent ref={ref} width={width}>\n {title && <WizardTitle>{title}</WizardTitle>}\n {description && <WizardDescription>{description}</WizardDescription>}\n <div className=\"mb-5\">\n <Stepper steps={stepperSteps} current={safeCurrent} />\n </div>\n <div className=\"mb-5\">{body}</div>\n <div className=\"flex justify-end gap-2\">\n {cancelLabel && (\n <Button type=\"button\" variant=\"ghost\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n )}\n <Button type=\"button\" variant=\"secondary\" onClick={goBack} disabled={ctx.isFirst}>\n {backLabel}\n </Button>\n <Button type=\"button\" variant=\"primary\" onClick={handlePrimary} disabled={!canAdvance}>\n {ctx.isLast ? completeLabel : nextLabel}\n </Button>\n </div>\n </DialogContent>\n </DialogRoot>\n );\n});\n\nfunction WizardTitle({ children }: { children: ReactNode }) {\n return <RadixDialog.Title className=\"mb-2 text-[16px] font-medium\">{children}</RadixDialog.Title>;\n}\nfunction WizardDescription({ children }: { children: ReactNode }) {\n return (\n <RadixDialog.Description className=\"text-text-muted mb-4 text-[13px] leading-[1.55]\">\n {children}\n </RadixDialog.Description>\n );\n}\n\nWizardDialog.displayName = 'WizardDialog';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAsC;AACtC,4BAAwB;AAWjB,SAAS,MAAM,QAA8B;AAClD,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ACZA,mBAA8C;AAqCvC,SAAS,qBAAwB;AAAA,EACtC,OAAO;AAAA,EACP;AAAA,EACA;AACF,GAGE;AACA,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,uBAAwB,YAAY;AACtF,QAAM,eAAe,oBAAoB;AACzC,QAAM,QAAQ,eAAe,kBAAkB;AAE/C,QAAM,kBAAc,qBAAO,QAAQ;AACnC,cAAY,UAAU;AACtB,QAAM,eAAW,qBAAO,KAAK;AAC7B,WAAS,UAAU;AAEnB,QAAM,eAAW;AAAA,IACf,CAAC,SAA2C;AAC1C,YAAM,WACJ,OAAO,SAAS,aAAc,KAAoC,SAAS,OAAO,IAAI;AACxF,UAAI,CAAC,cAAc;AACjB,6BAAqB,QAAQ;AAAA,MAC/B;AACA,UAAI,aAAa,SAAS,SAAS;AACjC,oBAAY,UAAU,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,SAAO,CAAC,OAAO,QAAQ;AACzB;;;ACrEA,IAAAC,gBAAsC;AAO/B,SAAS,cAAc,UAAU,OAMtC;AACA,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,OAAO;AACxC,QAAM,aAAS,2BAAY,MAAM,QAAQ,IAAI,GAAG,CAAC,CAAC;AAClD,QAAM,cAAU,2BAAY,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AACpD,QAAM,eAAW,2BAAY,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACzD,SAAO,EAAE,MAAM,QAAQ,SAAS,UAAU,QAAQ;AACpD;;;ACnBA,IAAAC,gBAAkC;AAW3B,SAAS,UAAU,SAAqB,UAAU,MAAM;AAC7D,QAAM,iBAAa,sBAAO,OAAO;AACjC,+BAAU,MAAM;AACd,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,OAAO,CAAC;AACZ,+BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,SAAU,YAAW,QAAQ;AAAA,IAC7C;AACA,aAAS,iBAAiB,WAAW,KAAK;AAC1C,WAAO,MAAM,SAAS,oBAAoB,WAAW,KAAK;AAAA,EAC5D,GAAG,CAAC,OAAO,CAAC;AACd;;;ACxBA,IAAAC,gBAA2C;AAYpC,IAAM,4BACX,OAAO,WAAW,cAAc,gCAAkB;;;ACbpD,IAAAC,gBAA0D;AA8BnD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB;AACF,GAAkD;AAChD,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,aAAa;AAElD,QAAM,WAAO;AAAA,IACX,CAAC,UAAkB;AACjB,UAAI,SAAS,EAAG;AAChB,gBAAU,CAAC,MAAM;AACf,cAAM,OAAO,IAAI;AACjB,YAAI,KAAM,SAAS,OAAO,QAAS,SAAS;AAC5C,eAAO,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,GAAG,IAAI,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,IACA,CAAC,OAAO,IAAI;AAAA,EACd;AAEA,QAAM,gBAAY;AAAA,IAChB,CAAC,UAAyB;AACxB,UAAI,SAAS,EAAG;AAChB,cAAQ,MAAM,KAAK;AAAA,QACjB,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,CAAC;AACN;AAAA,QACF,KAAK;AACH,gBAAM,eAAe;AACrB,eAAK,EAAE;AACP;AAAA,QACF,KAAK;AACH,gBAAM,eAAe;AACrB,oBAAU,CAAC;AACX;AAAA,QACF,KAAK;AACH,gBAAM,eAAe;AACrB,oBAAU,QAAQ,CAAC;AACnB;AAAA,QACF,KAAK;AACH,cAAI,UAAU;AACZ,kBAAM,eAAe;AACrB,qBAAS,MAAM;AAAA,UACjB;AACA;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,OAAO,QAAQ,MAAM,QAAQ;AAAA,EAChC;AAEA,QAAM,aAAa,QAAQ,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC,IAAI;AAE7D,SAAO,EAAE,QAAQ,YAAY,WAAW,UAAU;AACpD;;;ACtFA,IAAAC,gBAA0C;AAWnC,SAAS,gBACd,KACA,SACA,UAAU,MACV;AACA,+BAAU,MAAM;AACd,QAAI,CAAC,QAAS;AACd,UAAM,SAAS,CAAC,MAAoB;AAClC,YAAM,KAAK,IAAI;AACf,UAAI,MAAM,EAAE,kBAAkB,QAAQ,CAAC,GAAG,SAAS,EAAE,MAAM,EAAG,SAAQ;AAAA,IACxE;AACA,aAAS,iBAAiB,eAAe,MAAM;AAC/C,WAAO,MAAM,SAAS,oBAAoB,eAAe,MAAM;AAAA,EACjE,GAAG,CAAC,KAAK,SAAS,OAAO,CAAC;AAC5B;;;ACzBA,IAAAC,gBAAiD;AAc1C,SAAS,WAId;AAGA,QAAM,CAAC,OAAO,aAAa,QAAI,wBAAgB,MAAM;AAErD,QAAM,eAAW,2BAAY,CAAC,SAAgB;AAC5C,QAAI,OAAO,aAAa,aAAa;AACnC,oBAAc,IAAI;AAClB;AAAA,IACF;AACA,QAAI,SAAS,SAAS;AACpB,eAAS,gBAAgB,aAAa,cAAc,OAAO;AAAA,IAC7D,OAAO;AACL,eAAS,gBAAgB,gBAAgB,YAAY;AAAA,IACvD;AACA,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS,2BAAY,MAAM;AAC/B,aAAS,UAAU,SAAS,UAAU,MAAM;AAAA,EAC9C,GAAG,CAAC,OAAO,QAAQ,CAAC;AAIpB,+BAAU,MAAM;AACd,UAAM,UAAU,SAAS,gBAAgB,aAAa,YAAY;AAClE,kBAAc,YAAY,UAAU,UAAU,MAAM;AACpD,UAAM,WAAW,IAAI,iBAAiB,MAAM;AAC1C,YAAM,OAAO,SAAS,gBAAgB,aAAa,YAAY;AAC/D,oBAAc,SAAS,UAAU,UAAU,MAAM;AAAA,IACnD,CAAC;AACD,aAAS,QAAQ,SAAS,iBAAiB;AAAA,MACzC,YAAY;AAAA,MACZ,iBAAiB,CAAC,YAAY;AAAA,IAChC,CAAC;AACD,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,OAAO,UAAU,OAAO;AACnC;;;ACzDA,wBAAqB;AACrB,sCAAuC;AACvC,IAAAC,gBAAgF;AAmD5E;AA3CJ,IAAM,mBAAe;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SACE;AAAA,QACF,WACE;AAAA,QACF,OAAO;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAGA,SAAS,QAAQ,EAAE,KAAK,GAAqB;AAC3C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,MACX,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA;AAAA,EACrC;AAEJ;AAkBA,IAAM,WAAW,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG;AAEnC,IAAM,aAAS,0BAA2C,SAASC,QACxE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,aAAa,YAAY;AAC/B,QAAM,SAAS,SAAS,QAAQ,IAAI;AACpC,QAAM,oBAAoB,GAAG,aAAa,EAAE,SAAS,MAAM,UAAU,CAAC,GAAG,SAAS;AAKlF,MAAI,SAAS;AACX,WACE;AAAA,MAAC;AAAA;AAAA,QAKC;AAAA,QACA,aAAW,WAAW;AAAA,QACtB,iBAAe,cAAc;AAAA,QAC7B,iBAAe,aAAa,KAAK;AAAA,QACjC,WAAW;AAAA,QACV,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,UAAU;AAAA,MACV,aAAW,WAAW;AAAA,MACtB,WAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA,kBACC,4CAAC,WAAQ,MAAM,QAAQ,IACrB,OACF,4CAAC,UAAK,WAAU,eAAe,gBAAK,IAClC;AAAA,QACH;AAAA,QACA,YAAY,4CAAC,UAAK,WAAU,0BAA0B,oBAAS;AAAA;AAAA;AAAA,EAClE;AAEJ,CAAC;AAED,OAAO,cAAc;;;AC9IrB,IAAAC,mCAAuC;AACvC,IAAAC,gBAAsE;AAuDlE,IAAAC,sBAAA;AAnDJ,IAAM,uBAAmB;AAAA,EACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA;AAAA;AAAA;AAAA,MAIR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WACE;AAAA,QACF,OACE;AAAA,QACF,SACE;AAAA,QACF,aACE;AAAA,QACF,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,SAAS,aAAa,MAAM,KAAK;AAAA,EACtD;AACF;AAeO,IAAM,iBAAa,0BAA+C,SAASC,YAChF,EAAE,SAAS,MAAM,MAAM,MAAM,WAAW,GAAG,MAAM,GACjD,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,WAAW,GAAG,iBAAiB,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,MAC3D,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,WAAW,cAAc;;;ACnEzB,IAAAC,iBAOO;AA4BH,IAAAC,sBAAA;AATG,IAAM,kBAAc,2BAA6C,SAASC,aAC/E,EAAE,cAAc,cAAc,WAAW,UAAU,GAAG,MAAM,GAC5D,KACA;AACA,QAAM,QAAQ,wBAAS,QAAQ,QAAQ,EAAE,OAAO,6BAAc;AAI9D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,aAAa,aAAa;AAAA,QAC1C;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,OAAO,MAAM;AACvB,cAAM,UAAU,MAAM;AACtB,cAAM,aAAc,MAAM,SAAS,CAAC;AACpC,mBAAO,6BAAa,OAAO;AAAA,UACzB,KAAK;AAAA,UACL,WAAW;AAAA,YACT,WAAW;AAAA,YACX;AAAA,YACA,CAAC,YACE,gBAAgB,eACb,6BACA;AAAA,UACR;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,YAAY,cAAc;;;AChE1B,IAAAC,iBAAgE;AAmE5D,IAAAC,sBAAA;AAxBG,IAAM,kBAAc,2BAA6C,SAASC,aAC/E;AAAA,EACE,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AAMA,QAAM,gBACJ,YAAY,aAAa,YAAY,iBAAiB,YAAY,YAC9D,0BACA;AACN,SACE,8CAAC,SAAI,KAAU,WAAW,GAAG,eAAe,SAAS,GAAI,GAAG,OAC1D;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,GAAG,2BAA2B,aAAa;AAAA,QAErD;AAAA;AAAA,IACH;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,cAAY;AAAA,QACZ,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KACF;AAEJ,CAAC;AAED,YAAY,cAAc;;;AC3F1B,IAAAC,iBAAsE;AAoBlE,IAAAC,sBAAA;AALG,IAAM,UAAM,2BAAwC,SAASC,KAClE,EAAE,OAAO,UAAK,MAAM,WAAW,OAAO,GAAG,MAAM,GAC/C,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,IAAI,cAAc;;;ACzClB,oBAA+B;AAC/B,IAAAC,iBAAkD;AAqB9C,IAAAC,sBAAA;AARG,IAAM,eAAW,2BAA6C,SAASC,UAC5E,EAAE,OAAO,WAAW,IAAI,QAAQ,GAAG,MAAM,GACzC,KACA;AACA,QAAM,cAAU,sBAAM;AACtB,QAAM,KAAK,UAAU,MAAM,OAAO;AAElC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,MAAM,YAAY;AAAA,QAClB;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAe;AAAA,UAAd;AAAA,YACC;AAAA,YACA;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAEJ,uDAAe,yBAAd,EAAwB,WAAU,2CAChC,gBAAM,YAAY,kBAAkB,WAAM,UAC7C;AAAA;AAAA,QACF;AAAA,QACC,SACC,6CAAC,WAAM,SAAS,IAAI,WAAU,8BAC3B,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,SAAS,cAAc;;;ACvDvB,IAAAC,iBAA2D;AA0CnD,IAAAC,sBAAA;AAVD,SAAS,MAAM,EAAE,OAAO,MAAM,OAAO,UAAU,WAAW,UAAU,GAAG,MAAM,GAAe;AACjG,QAAM,cAAU,sBAAM;AACtB,QAAM,KAAK,SAAS,OAAO;AAC3B,QAAM,SAAS,QAAQ,CAAC,QAAQ,GAAG,EAAE,UAAU;AAC/C,QAAM,UAAU,QAAQ,GAAG,EAAE,WAAW;AACxC,QAAM,cAAc,WAAW;AAE/B,SACE,8CAAC,SAAI,WAAW,GAAG,2BAA2B,SAAS,GAAI,GAAG,OAC3D;AAAA,aACC,8CAAC,WAAM,SAAS,IAAI,WAAU,2CAC3B;AAAA;AAAA,MACA,YAAY,6CAAC,UAAK,WAAU,iBAAgB,eAAC;AAAA,OAChD;AAAA,IAED,SAAS;AAAA,MACR;AAAA,MACA,oBAAoB;AAAA,MACpB,gBAAgB,QAAQ,OAAO;AAAA,IACjC,CAAC;AAAA,IACA,QAAQ,CAAC,SACR,6CAAC,SAAI,IAAI,QAAQ,WAAU,6BACxB,gBACH;AAAA,IAED,SACC,6CAAC,SAAI,IAAI,SAAS,WAAU,wBACzB,iBACH;AAAA,KAEJ;AAEJ;;;AChEA,IAAAC,mCAAuC;AACvC,IAAAC,iBAAqE;AA8CjE,IAAAC,sBAAA;AA1CJ,IAAM,yBAAqB;AAAA,EACzB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,EACjD;AACF;AAgBO,IAAM,YAAQ,2BAAyC,SAASC,OACrE,EAAE,MAAM,MAAM,MAAM,UAAU,OAAO,OAAO,WAAW,OAAO,UAAU,GAAG,MAAM,GACjF,KACA;AACA,QAAM,eAAe,QAAQ,QAAQ;AACrC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,mBAAmB,EAAE,MAAM,MAAM,aAAa,CAAC,GAAG,SAAS;AAAA,MACzE,OAAO,EAAE,OAAO,GAAG,MAAM;AAAA,MAExB;AAAA,gBAAQ,6CAAC,UAAK,WAAU,8BAA8B,gBAAK;AAAA,QAC5D;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,gBAAc,SAAS;AAAA,YACvB,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACC,GAAG;AAAA;AAAA,QACN;AAAA,QACC,YAAY,6CAAC,UAAK,WAAU,6BAA6B,oBAAS;AAAA;AAAA;AAAA,EACrE;AAEJ,CAAC;AAED,MAAM,cAAc;;;ACpEpB,IAAAC,iBAAqD;AA6BjD,IAAAC,sBAAA;AAbG,IAAM,kBAAc,2BAA+C,SAASC,aACjF;AAAA,EACE,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd,GAAG;AACL,GACA,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,OAAO,GAAG,MAAM;AAAA,MAEzB;AAAA,qDAAC,UAAK,WAAU,8BAA6B,eAAW,MAAC,oBAEzD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAK;AAAA,YACL;AAAA,YAIA,cAAY,cAAc,OAAO,gBAAgB,WAAW,cAAc;AAAA,YAC1E,WAAU;AAAA,YACT,GAAG;AAAA;AAAA,QACN;AAAA,QACC,YACC,6CAAC,SAAI,WAAU,yFACZ,oBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,YAAY,cAAc;;;AC9D1B,IAAAC,iBAOO;AAiGH,IAAAC,uBAAA;AArEG,IAAM,UAAM,2BAAgC,SAASC,KAC1D,EAAE,SAAS,GAAG,YAAY,UAAU,eAAe,IAAI,YAAY,QAAQ,WAAW,SAAS,GAC/F,KACA;AACA,QAAM,aAAS,sBAAM;AACrB,QAAM,WAAO,uBAAoC,CAAC,CAAC;AACnD,QAAM,CAAC,QAAQ,SAAS,QAAI;AAAA,IAAmB,MAC7C,MAAM,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE;AAAA,EACxD;AACA,QAAM,CAAC,uBAAuB,wBAAwB,QAAI,yBAAS,EAAE;AAErE,0CAAoB,KAAK,OAAO;AAAA,IAC9B,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG,MAAM;AAAA,IACpC,OAAO,MAAM;AACX,gBAAU,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;AAChC,+BAAyB,EAAE;AAC3B,WAAK,QAAQ,CAAC,GAAG,MAAM;AAAA,IACzB;AAAA,EACF,EAAE;AAEF,QAAM,UAAU,CAAC,GAAW,SAAiB;AAC3C,QAAI,CAAC,QAAQ,KAAK,IAAI,EAAG;AAGzB,UAAM,OAAO,CAAC,GAAG,MAAM;AACvB,SAAK,CAAC,IAAI;AACV,cAAU,IAAI;AACd,UAAM,SAAS,KAAK,KAAK,EAAE;AAC3B,eAAW,MAAM;AACjB,UAAM,aAAa,OAAO,WAAW,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC;AAClE,QAAI,YAAY;AACd,mBAAa,MAAM;AACnB,+BAAyB,eAAe;AAAA,IAC1C,OAAO;AAEL,+BAAyB,EAAE;AAAA,IAC7B;AACA,QAAI,QAAQ,IAAI,SAAS,EAAG,MAAK,QAAQ,IAAI,CAAC,GAAG,MAAM;AAAA,EACzD;AAEA,QAAM,QAAQ,CAAC,GAAW,MAAuC;AAC/D,QAAI,EAAE,QAAQ,eAAe,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG;AAChD,WAAK,QAAQ,IAAI,CAAC,GAAG,MAAM;AAAA,IAC7B,WAAW,EAAE,QAAQ,eAAe,IAAI,GAAG;AACzC,WAAK,QAAQ,IAAI,CAAC,GAAG,MAAM;AAAA,IAC7B,WAAW,EAAE,QAAQ,gBAAgB,IAAI,SAAS,GAAG;AACnD,WAAK,QAAQ,IAAI,CAAC,GAAG,MAAM;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,MAA8C;AAC7D,UAAM,SAAS,EAAE,cAAc,QAAQ,MAAM,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,MAAM;AACjF,QAAI,CAAC,OAAQ;AACb,MAAE,eAAe;AACjB,UAAM,OAAO,MAAM,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE;AAC7D,cAAU,IAAI;AACd,UAAM,SAAS,KAAK,KAAK,EAAE;AAC3B,eAAW,MAAM;AACjB,UAAM,aAAa,OAAO,WAAW,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC;AAClE,QAAI,YAAY;AACd,mBAAa,MAAM;AACnB,+BAAyB,eAAe;AAAA,IAC1C,OAAO;AACL,+BAAyB,EAAE;AAAA,IAC7B;AACA,SAAK,QAAQ,KAAK,IAAI,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG,MAAM;AAAA,EAC3D;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,cAAc,SAAS,GACvC;AAAA,WAAO,IAAI,CAAC,GAAG,MACd;AAAA,MAAC;AAAA;AAAA,QAEC,IAAI,GAAG,MAAM,IAAI,CAAC;AAAA,QAClB,KAAK,CAAC,OAAO;AACX,eAAK,QAAQ,CAAC,IAAI;AAAA,QACpB;AAAA,QACA,WAAU;AAAA,QACV,cAAa;AAAA,QACb,WAAW;AAAA,QACX,OAAO;AAAA,QACP;AAAA,QACA,cAAY,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,MAAM;AAAA,QAC9C,UAAU,CAAC,MAAM,QAAQ,GAAG,EAAE,OAAO,KAAK;AAAA,QAC1C,WAAW,CAAC,MAAM,MAAM,GAAG,CAAC;AAAA,QAC5B,SAAS,CAAC,MAAM,EAAE,OAAO,OAAO;AAAA,QAChC,SAAS,MAAM,IAAI,UAAU;AAAA,QAC7B,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,MApBK;AAAA,IAqBP,CACD;AAAA,IACD,8CAAC,UAAK,WAAU,WAAU,aAAU,UAAS,eAAY,QACtD,iCACH;AAAA,KACF;AAEJ,CAAC;AAED,IAAI,cAAc;;;ACzIlB,iBAA4B;AAC5B,IAAAC,iBAAkD;AAoBzC,IAAAC,uBAAA;AAJF,IAAM,iBAAa,2BAA4C,SAASC,YAC7E,EAAE,WAAW,GAAG,MAAM,GACtB,KACA;AACA,SAAO,8CAAY,iBAAX,EAAgB,KAAU,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAAO;AAChG,CAAC;AAED,WAAW,cAAc;AASlB,IAAM,YAAQ,2BAA0C,SAASC,OACtE,EAAE,OAAO,WAAW,IAAI,QAAQ,GAAG,MAAM,GACzC,KACA;AACA,QAAM,cAAU,sBAAM;AACtB,QAAM,KAAK,UAAU,SAAS,OAAO;AAErC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,MAAM,YAAY;AAAA,QAClB;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAY;AAAA,UAAX;AAAA,YACC;AAAA,YACA;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACC,GAAG;AAAA,YAEJ,wDAAY,sBAAX,EAAqB,WAAU,gDAA+C;AAAA;AAAA,QACjF;AAAA,QACC,SACC,8CAAC,WAAM,SAAS,IAAI,WAAU,8BAC3B,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,MAAM,cAAc;;;ACvEpB,kBAA6B;AAC7B,IAAAC,iBAA2C;AAsBvC,IAAAC,uBAAA;AAhBG,IAAM,aAAyB;AAC/B,IAAM,cAA0B;AAChC,IAAM,cAA0B;AAChC,IAAM,cAA0B;AAEvC,IAAM,iBAAiB;AAAA,EACrB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,oBAAgB,2BAG3B,SAASC,eAAc,EAAE,OAAO,MAAM,WAAW,UAAU,GAAG,MAAM,GAAG,KAAK;AAC5E,SACE;AAAA,IAAa;AAAA,IAAZ;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,8CAAa,kBAAZ,EAAiB,WAAU,0CAAyC,oBAAC;AAAA;AAAA;AAAA,EACxE;AAEJ,CAAC;AAED,cAAc,cAAc;AAErB,IAAM,oBAAgB;AAAA,EAC3B,SAASC,eACP,EAAE,WAAW,UAAU,WAAW,UAAU,aAAa,GAAG,GAAG,MAAM,GACrE,KACA;AACA,WACE,8CAAa,oBAAZ,EACC;AAAA,MAAa;AAAA,MAAZ;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ,wDAAa,sBAAZ,EAAsB,UAAS;AAAA;AAAA,IAClC,GACF;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;AAErB,IAAM,iBAAa;AAAA,EACxB,SAASC,YAAW,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,KAAK;AAC1D,WACE;AAAA,MAAa;AAAA,MAAZ;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ,wDAAa,sBAAZ,EAAsB,UAAS;AAAA;AAAA,IAClC;AAAA,EAEJ;AACF;AAEA,WAAW,cAAc;AAyBlB,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,GAAG;AACL,GAAgB;AACd,SACE,+CAAa,kBAAZ,EAAkB,GAAG,WACpB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,cAAY;AAAA,QACZ,mBAAiB;AAAA,QAEjB,wDAAC,eAAY,aAA0B;AAAA;AAAA,IACzC;AAAA,IACA,8CAAC,iBACE,kBAAQ,IAAI,CAAC,QAAQ;AACpB,YAAM,QAAQ,OAAO,QAAQ,WAAW,MAAM,IAAI;AAClD,YAAM,QAAQ,OAAO,QAAQ,WAAW,MAAM,IAAI;AAClD,aACE,8CAAC,cAAuB,OACrB,mBADc,KAEjB;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;;;ACpJA,kBAA6B;AAC7B,IAAAC,iBAAkD;AA8G5C,IAAAC,uBAAA;AApEC,IAAM,aAAS,2BAAyC,SAASC,QACtE;AAAA,EACE;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,GAAG;AACL,GACA,KACA;AAEA,QAAM,WAAW,MAAM,QAAQ,KAAK,IAChC,QACA,UAAU,SACR,CAAC,KAA0B,IAC3B;AACN,QAAM,aAAa,MAAM,QAAQ,YAAY,IACzC,eACA,iBAAiB,SACf,CAAC,YAAiC,IAClC;AASN,QAAM,eAAe,aAAa;AAClC,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAA+B,UAAU;AAC3F,QAAM,eAAe,eAAe,WAAW;AAQ/C,QAAM,YAAY,CAAC,MAAM,QAAQ,SAAS,YAAY,MAAM,SAAS,kBAAkB;AACvF,QAAM,wBAAoB;AAAA,IACxB,CAAC,SAAmB;AAClB,UAAI,CAAC,aAAc,sBAAqB,IAAI;AAC5C,UAAI,eAAe;AACjB,sBAAc,YAAa,KAAK,CAAC,KAAK,IAAK,IAAI;AAAA,MACjD;AAAA,IACF;AAAA,IACA,CAAC,cAAc,eAAe,SAAS;AAAA,EACzC;AAEA,QAAM,UAAU,eAAe,CAAC,KAAK,MAAM,OAAO;AAKlD,QAAM,cAAc,YAAY,aAAa,UAAU;AAEvD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,uCAAuC,SAAS;AAAA,MAC9D,OAAO,EAAE,MAAM;AAAA,MAEf;AAAA;AAAA,UAAa;AAAA,UAAZ;AAAA,YACC,OAAO;AAAA,YACP,cAAc;AAAA,YACd,eAAe;AAAA,YACf,WAAU;AAAA,YACT,GAAG;AAAA,YAEJ;AAAA,4DAAa,mBAAZ,EAAkB,WAAU,6CAC3B,wDAAa,mBAAZ,EAAkB,WAAU,0CAAyC,GACxE;AAAA,cACC,MAAM,KAAK,EAAE,QAAQ,WAAW,GAAG,CAAC,GAAG,MAAM;AAC5C,sBAAM,WAAW,cAAc,CAAC;AAEhC,sBAAM,iBAAiB,aAAa,iBAAiB,SAAa,aAAa;AAC/E,uBACE;AAAA,kBAAa;AAAA,kBAAZ;AAAA,oBAEC,WAAW;AAAA,sBACT;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF;AAAA,oBACA,cAAY;AAAA,oBACZ,mBAAiB,WAAW,SAAY;AAAA;AAAA,kBAPnC;AAAA,gBAQP;AAAA,cAEJ,CAAC;AAAA;AAAA;AAAA,QACH;AAAA,QACC,aACC,8CAAC,UAAK,WAAU,iEACb,mBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,OAAO,cAAc;;;ACpJrB,kBAA6B;AAC7B,IAAAC,iBAAkD;AA6B9C,IAAAC,uBAAA;AAlBJ,IAAM,eAAe;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,eAAe;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,aAAS,2BAA2C,SAASC,QACxE,EAAE,OAAO,OAAO,MAAM,WAAW,IAAI,QAAQ,GAAG,MAAM,GACtD,KACA;AACA,QAAM,cAAU,sBAAM;AACtB,QAAM,KAAK,UAAU,MAAM,OAAO;AAElC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,MAAM,YAAY;AAAA,QAClB;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAa;AAAA,UAAZ;AAAA,YACC;AAAA,YACA;AAAA,YACA,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,aAAa,IAAI;AAAA,YACnB;AAAA,YACC,GAAG;AAAA,YAEJ;AAAA,cAAa;AAAA,cAAZ;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA,aAAa,IAAI;AAAA,gBACnB;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,QACC,SACC,8CAAC,WAAM,SAAS,IAAI,WAAU,8BAC3B,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,OAAO,cAAc;;;AClErB,IAAAC,mCAAuC;AACvC,IAAAC,iBAAwD;AAkCpD,IAAAC,uBAAA;AA9BJ,IAAM,qBAAiB;AAAA,EACrB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,KAAK;AAAA,MACP;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,MAAM,UAAU;AAAA,EACrC;AACF;AAQO,IAAM,eAAW,2BAA+C,SAASC,UAC9E,EAAE,MAAM,OAAO,OAAO,GAAG,WAAW,GAAG,MAAM,GAC7C,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,gBAAc,SAAS;AAAA,MACvB,WAAW,GAAG,eAAe,EAAE,MAAM,QAAQ,QAAQ,KAAK,CAAC,GAAG,SAAS;AAAA,MACtE,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,SAAS,cAAc;;;AC7CvB,kBAA6B;AAC7B,IAAAC,iBAAgD;;;ACDhD,IAAAC,iBAAgE;AAuD5D,IAAAC,uBAAA;AAtCJ,IAAM,aAA0C;AAAA,EAC9C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AACV;AAEA,IAAM,YAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AACV;AAQO,IAAM,aAA0C;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AACV;AAEO,IAAM,gBAAY,2BAA4C,SAASC,WAC5E,EAAE,QAAQ,MAAM,OAAO,OAAO,OAAO,GAAG,WAAW,GAAG,MAAM,GAC5D,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,QAAQ,WAAW;AAAA,MACzB,cAAY,CAAC,QAAQ,WAAW,KAAK,IAAI;AAAA,MACzC,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,WAAW,KAAK;AAAA,cAChB,SAAS;AAAA,cACT,UAAU,KAAK;AAAA,YACjB;AAAA,YACA,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA;AAAA,QACrC;AAAA,QACC,SAAS,8CAAC,UAAK,WAAU,+BAA+B,iBAAM;AAAA;AAAA;AAAA,EACjE;AAEJ,CAAC;AAED,UAAU,cAAc;;;ACxEjB,IAAM,SAAqC;AAAA,EAChD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;;;AFwDM,IAAAC,uBAAA;AAvDN,IAAM,WAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AACP;AAEA,SAAS,YAAY,MAAsB;AACzC,UAAQ,QAAQ,KACb,MAAM,KAAK,EACX,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EACrB,KAAK,EAAE,EACP,MAAM,GAAG,CAAC,EACV,YAAY;AACjB;AAEA,SAAS,QAAQ,KAAqB;AACpC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAK,MAAK,IAAI,KAAK,IAAI,WAAW,CAAC,KAAK;AACxE,SAAO;AACT;AAoBO,IAAM,aAAS,2BAAyC,SAASC,QACtE,EAAE,OAAO,KAAK,KAAK,OAAO,MAAM,QAAQ,UAAU,WAAW,OAAO,GAAG,MAAM,GAC7E,KACA;AACA,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,mBAAmB,YAAY,YAAY,IAAI;AAErD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,yBAAyB,SAAS;AAAA,MAChD,OAAO,EAAE,OAAO,KAAK,QAAQ,KAAK,GAAG,MAAM;AAAA,MAC1C,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAa;AAAA,UAAZ;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,YAAY,MACR,SACA,uEAAuE,GAAG;AAAA,YAChF;AAAA,YAEC;AAAA,qBAAO,8CAAa,mBAAZ,EAAkB,KAAU,KAAK,MAAM,WAAU,8BAA6B;AAAA,cACvF;AAAA,gBAAa;AAAA,gBAAZ;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,UAAU,MAAM,KAAK;AAAA,kBAE7B;AAAA;AAAA,cACH;AAAA;AAAA;AAAA,QACF;AAAA,QACC,UACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,WAAW,MAAM;AAAA,YAC7B,WAAW;AAAA,cACT;AAAA,cACA,SAAS,MAAM;AAAA,YACjB;AAAA,YACA,OAAO,EAAE,OAAO,MAAM,KAAK,QAAQ,MAAM,IAAI;AAAA;AAAA,QAC/C;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,OAAO,cAAc;;;AGjGrB,IAAAC,iBAAgD;AAiCtC,IAAAC,uBAAA;AAbH,IAAM,kBAAc,2BAA6C,SAASC,aAC/E,EAAE,OAAO,MAAM,GAAG,OAAO,MAAM,WAAW,GAAG,MAAM,GACnD,KACA;AACA,QAAM,MAAM,OAAO,IAAI;AACvB,QAAM,UAAU,MAAM,MAAM,GAAG,GAAG;AAClC,QAAM,OAAO,MAAM,SAAS,QAAQ;AACpC,QAAM,UAAU,CAAC,MAAM;AAEvB,SACE,+CAAC,SAAI,KAAU,WAAW,GAAG,eAAe,SAAS,GAAI,GAAG,OACzD;AAAA,YAAQ,IAAI,CAAC,GAAG,MACf,8CAAC,UAAuB,OAAO,EAAE,YAAY,MAAM,IAAI,IAAI,QAAQ,GACjE,wDAAC,UAAO,MAAM,GAAG,MAAY,KADpB,GAAG,CAAC,IAAI,CAAC,EAEpB,CACD;AAAA,IACA,OAAO,KACN;AAAA,MAAC;AAAA;AAAA,QACC,cAAY,IAAI,IAAI;AAAA,QACpB,WAAU;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU,MAAM;AAAA,QAClB;AAAA,QACD;AAAA;AAAA,UACG;AAAA;AAAA;AAAA,IACJ;AAAA,KAEJ;AAEJ,CAAC;AAED,YAAY,cAAc;;;ACtD1B,IAAAC,mCAAuC;AACvC,IAAAC,iBAAgE;AA2D5D,IAAAC,uBAAA;AAvDJ,IAAM,kBAAc,sCAAI,qEAAqE;AAAA,EAC3F,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QACE;AAAA,MACF,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,SAAS,WAAW,MAAM,KAAK;AACpD,CAAC;AAUD,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AAEA,IAAM,UAAU,EAAE,IAAI,mBAAmB,IAAI,mBAAmB,IAAI,kBAAkB;AAK/E,IAAM,YAAQ,2BAAwC,SAASC,OACpE,EAAE,UAAU,WAAW,OAAO,MAAM,KAAK,MAAM,WAAW,UAAU,GAAG,MAAM,GAC7E,KACA;AACA,QAAM,KAAM,QAAQ;AACpB,QAAM,IAAK,WAAW;AACtB,SACE,+CAAC,UAAK,KAAU,WAAW,GAAG,YAAY,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS,GAAI,GAAG,OAC3E;AAAA,WACC;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAW,GAAG,6BAA6B,QAAQ,EAAE,GAAG,cAAc,CAAC,CAAC;AAAA;AAAA,IAC1E;AAAA,IAED,QAAQ,8CAAC,UAAK,WAAU,4BAA4B,gBAAK;AAAA,IACzD;AAAA,KACH;AAEJ,CAAC;AAED,MAAM,cAAc;;;ACzEpB,IAAAC,mCAAuC;AACvC,IAAAC,iBAA2F;AA+GnF,IAAAC,uBAAA;AA3GR,IAAM,iBAAa;AAAA,EACjB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,OAAO;AAAA,QACP,UAAU;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,SAAS,WAAW,aAAa,MAAM;AAAA,EAC5D;AACF;AAqCO,IAAM,WAAO,2BAAsC,SAASC,MACjE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,mBAAmB,eAAe,QAAQ,OAAO;AACvD,QAAM,aAAa,WAAW;AAI9B,MAAI,oBAAoB,cAAc,QAAQ,IAAI,aAAa,cAAc;AAC3E,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,oBAAoB,CAAC;AAC3C,QAAM,gBAAgB,gBAClB,CAAC,MAA2C;AAC1C,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,IAAK;AACxC,QAAI,YAAY;AACd,QAAE,eAAe;AACjB,iBAAW;AAAA,IACb,WAAW,SAAS;AAClB,QAAE,eAAe;AAKjB,cAAQ,CAAgD;AAAA,IAC1D;AAAA,EACF,IACA;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,MAAM,gBAAgB,WAAW;AAAA,MACjC,UAAU,gBAAgB,IAAI;AAAA,MAC9B,WAAW,GAAG,WAAW,EAAE,SAAS,aAAa,iBAAiB,CAAC,GAAG,YAAY,SAAS;AAAA,MAC1F,GAAG;AAAA,MAEF;AAAA,kBAAS,YACT,+CAAC,SAAI,WAAW,GAAG,2BAA2B,eAAe,aAAa,WAAW,GAClF;AAAA,mBAAS,8CAAC,SAAI,WAAU,kCAAkC,iBAAM;AAAA,UAChE,WAAW,8CAAC,SAAI,WAAU,cAAc,mBAAQ;AAAA,WACnD;AAAA,QAED,eACC,8CAAC,SAAI,WAAW,GAAG,8CAA8C,YAAY,WAAW,GACrF,uBACH;AAAA,QAED;AAAA,QACA,UACC,8CAAC,SAAI,WAAU,mEACZ,kBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,KAAK,cAAc;AAwBZ,IAAM,eAAW,2BAA6C,SAASC,UAC5E,EAAE,SAAS,OAAO,aAAa,QAAQ,WAAW,UAAU,MAAM,GAAG,MAAM,GAC3E,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT,WAAW,EAAE,SAAS,aAAa,KAAK,CAAC;AAAA,QACzC;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,iBACC,8CAAC,SAAI,WAAW,GAAG,qBAAqB,eAAe,aAAa,WAAW,GAC7E,wDAAC,SAAI,WAAU,kCAAkC,iBAAM,GACzD;AAAA,QAED,eACC,8CAAC,SAAI,WAAW,GAAG,8CAA8C,YAAY,WAAW,GACrF,uBACH;AAAA,QAED;AAAA,QACA,UACC,8CAAC,SAAI,WAAU,mEACZ,kBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,SAAS,cAAc;;;AC/LvB,IAAAC,iBAAgE;AAwC1D,IAAAC,uBAAA;AArBN,IAAM,eAA0C;AAAA,EAC9C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,cAAyC,EAAE,IAAI,UAAK,MAAM,UAAK,MAAM,SAAI;AAKxE,IAAM,eAAW,2BAA0C,SAASC,UACzE,EAAE,OAAO,OAAO,OAAO,QAAQ,QAAQ,MAAM,WAAW,GAAG,MAAM,GACjE,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,6DAA6D,SAAS;AAAA,MACnF,GAAG;AAAA,MAEJ;AAAA,uDAAC,SAAI,WAAU,+CACb;AAAA,wDAAC,SAAI,WAAU,+DAA+D,iBAAM;AAAA,UACnF,QAAQ,8CAAC,SAAI,WAAU,6BAA6B,gBAAK;AAAA,WAC5D;AAAA,QACA,8CAAC,SAAI,WAAU,2EACZ,iBACH;AAAA,QACC,UAAU,UACT,+CAAC,SAAI,WAAW,GAAG,kCAAkC,aAAa,KAAK,CAAC,GACrE;AAAA,sBAAY,KAAK;AAAA,UAAE;AAAA,UAAE;AAAA,WACxB;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,SAAS,cAAc;;;ACxDvB,IAAAC,iBAAgE;AAyB5D,IAAAC,uBAAA;AALG,IAAM,WAAO,2BAAuC,SAASC,MAClE,EAAE,MAAM,UAAU,WAAW,UAAU,GAAG,MAAM,GAChD,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,gBAAQ,8CAAC,UAAK,WAAU,yCAAyC,gBAAK;AAAA,QACtE;AAAA,QACA,YACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,cAAW;AAAA,YACX,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,KAAK,cAAc;;;AClDnB,IAAAC,iBAAgD;AAe5C,IAAAC,uBAAA;AALG,IAAM,UAAM,2BAAkC,SAASC,KAC5D,EAAE,WAAW,UAAU,GAAG,MAAM,GAChC,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,IAAI,cAAc;;;AC9BlB,sBAAiC;AACjC,IAAAC,iBAA0E;AA0DtE,IAAAC,uBAAA;AAtBJ,IAAM,gBACJ;AACF,IAAM,YACJ;AAEK,IAAM,iBAAa,2BAA4C,SAASC,YAC7E;AAAA,EACE,OAAO;AAAA,EACP,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,eAAe,gBAAgB,cAAc,gBAAgB;AACnE,QAAM,iBAAiB,gBAAgB,gBAAgB,gBAAgB;AAEvE,SACE;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,GAAG,4BAA4B,SAAS;AAAA,MAClD,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAiB;AAAA,UAAhB;AAAA,YACC,KAAK;AAAA,YACL,WAAW,GAAG,mCAAmC,iBAAiB;AAAA,YAEjE;AAAA;AAAA,QACH;AAAA,QACC,gBACC;AAAA,UAAiB;AAAA,UAAhB;AAAA,YACC,aAAY;AAAA,YACZ,WAAW,GAAG,eAAe,mDAAmD;AAAA,YAEhF,wDAAiB,uBAAhB,EAAsB,WAAW,WAAW;AAAA;AAAA,QAC/C;AAAA,QAED,kBACC;AAAA,UAAiB;AAAA,UAAhB;AAAA,YACC,aAAY;AAAA,YACZ,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEA,wDAAiB,uBAAhB,EAAsB,WAAW,WAAW;AAAA;AAAA,QAC/C;AAAA,QAED,gBAAgB,UAAU,8CAAiB,wBAAhB,EAAuB,WAAU,iBAAgB;AAAA;AAAA;AAAA,EAC/E;AAEJ,CAAC;AAED,WAAW,cAAc;;;AChGzB,IAAAC,mCAAuC;AACvC,IAAAC,iBAAgE;AAmD5D,IAAAC,uBAAA;AA/CJ,IAAM,qBAAiB,sCAAI,0DAA0D;AAAA,EACnF,UAAU;AAAA,IACR,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,OAAO,OAAO;AACnC,CAAC;AAmBD,IAAM,gBAAgB,EAAE,MAAM,IAAI,OAAO,IAAI,QAAQ,GAAG;AASjD,IAAM,eAAW,2BAA0C,SAASC,UACzE,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,aAAa,OAAO,WAAW,OAAO,GAAG,MAAM,GACzF,KACA;AACA,QAAM,IAAI,UAAU,cAAc,KAAM;AACxC,QAAM,IAAI,UAAU,WAAW,IAAI;AACnC,QAAM,YAAY,aACb,EAAE,MAAM,UAAU,aAAa,MAAM,cAAc,UAAU,IAC7D,EAAE,eAAe,KAAK;AAC3B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACC,GAAG;AAAA,MACJ,WAAW,GAAG,eAAe,EAAE,MAAM,CAAC,GAAG,SAAS;AAAA,MAClD,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,GAAG,MAAM;AAAA,MACtC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,SAAS,cAAc;AAsBhB,IAAM,oBAAgB,2BAA+C,SAASC,eACnF,EAAE,QAAQ,WAAW,UAAU,MAAM,WAAW,UAAU,GAAG,MAAM,GACnE,KACA;AACA,MAAI,CAAC,SAAS;AACZ,WACE,8CAAC,SAAI,KAAU,WAAuB,GAAG,OACtC,UACH;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAY;AAAA,MACZ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,cAAc,cAAc;;;AC7G5B,IAAAC,iBAAgE;AAuB5D,IAAAC,uBAAA;AALG,IAAM,UAAM,2BAAsC,SAASC,KAChE,EAAE,UAAU,MAAM,OAAO,IAAI,WAAW,UAAU,GAAG,MAAM,GAC3D,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,QAAQ,KAAK;AAAA,MACrB,GAAG;AAAA,MAEH;AAAA,gBAAQ,8CAAC,UAAK,WAAU,6BAA6B,gBAAK;AAAA,QAC1D;AAAA,QACA,YACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,cAAW;AAAA,YACX,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,IAAI,cAAc;;;ACjDlB,mBAA8B;AAC9B,IAAAC,iBAA2C;AAYnC,IAAAC,uBAAA;AARD,IAAM,kBAA+B;AACrC,IAAM,qBAAkC;AACxC,IAAM,oBAAiC;AAEvC,IAAM,yBAAqB;AAAA,EAChC,SAASC,oBAAmB,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AACxD,WACE,8CAAc,qBAAb,EACC;AAAA,MAAc;AAAA,MAAb;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAEA,mBAAmB,cAAc;AAEjC,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF;AAQO,IAAM,sBAAkB;AAAA,EAC7B,SAASC,iBAAgB,EAAE,MAAM,UAAU,aAAa,WAAW,UAAU,GAAG,MAAM,GAAG,KAAK;AAC5F,WACE;AAAA,MAAc;AAAA,MAAb;AAAA,QACC;AAAA,QACA,WAAW,GAAG,UAAU,cAAc,aAAa,aAAa,SAAS;AAAA,QACxE,GAAG;AAAA,QAEH;AAAA,kBAAQ,8CAAC,UAAK,WAAU,mCAAmC,gBAAK;AAAA,UACjE,8CAAC,UAAK,WAAU,UAAU,UAAS;AAAA,UAClC,YAAY,8CAAC,UAAK,WAAU,uCAAuC,oBAAS;AAAA;AAAA;AAAA,IAC/E;AAAA,EAEJ;AACF;AAEA,gBAAgB,cAAc;AAEvB,IAAM,2BAAuB,2BAGlC,SAASC,sBAAqB,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AAC5D,SACE;AAAA,IAAc;AAAA,IAAb;AAAA,MACC;AAAA,MACA,WAAW,GAAG,0BAA0B,SAAS;AAAA,MAChD,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,qBAAqB,cAAc;AAE5B,IAAM,cAA2B;;;AC1ExC,kBAA6B;AAC7B,IAAAC,iBAA2C;AAoBrC,IAAAC,uBAAA;AARC,IAAM,aAAyB;AAC/B,IAAM,gBAA4B;AAClC,IAAM,cAA0B;AAChC,IAAM,eAA2B;AAEjC,IAAM,oBAAgB;AAAA,EAC3B,SAASC,eAAc,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AACnD,WACE;AAAA,MAAa;AAAA,MAAZ;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;AAOrB,IAAM,oBAAgB,2BAA+C,SAASC,eACnF,EAAE,WAAW,QAAQ,KAAK,OAAO,UAAU,GAAG,MAAM,GACpD,KACA;AACA,SACE,+CAAC,gBACC;AAAA,kDAAC,iBAAc;AAAA,IACf;AAAA,MAAa;AAAA,MAAZ;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,EAAE,UAAU,OAAO,GAAG,MAAM;AAAA,QAClC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,KACF;AAEJ,CAAC;AAED,cAAc,cAAc;AAerB,SAAS,OAAO,EAAE,OAAO,aAAa,QAAQ,OAAO,UAAU,GAAG,UAAU,GAAgB;AAEjG,SACE,8CAAC,cAAY,GAAG,WACd,yDAAC,iBAAc,OACZ;AAAA,aACC;AAAA,MAAa;AAAA,MAAZ;AAAA,QACC,WAAW,GAAG,2BAA2B,cAAc,aAAa,MAAM;AAAA,QAEzE;AAAA;AAAA,IACH;AAAA,IAED,eACC,8CAAa,yBAAZ,EAAwB,WAAU,wDAChC,uBACH;AAAA,IAED;AAAA,IACA,UAAU,8CAAC,SAAI,WAAU,+BAA+B,kBAAO;AAAA,KAClE,GACF;AAEJ;;;ACvGA,IAAAC,eAA6B;AAC7B,IAAAC,iBAA2C;AAyBzC,IAAAC,uBAAA;AAPF,IAAM,cAA0C;AAAA,EAC9C,MAAM;AAAA,EACN,OACE;AACJ;AAEA,IAAM,eAAe,CAAC,EAAE,OAAO,QAAQ,MACrC,+CAAC,SAAI,WAAU,0EACb;AAAA,gDAAa,oBAAZ,EAAkB,WAAU,2BAA2B,iBAAM;AAAA,EAC9D;AAAA,IAAa;AAAA,IAAZ;AAAA,MACC,SAAS;AAAA,MACT,cAAW;AAAA,MACX,WAAU;AAAA,MACX;AAAA;AAAA,EAED;AAAA,GACF;AAOK,IAAM,aAAS,2BAAwC,SAASC,QACrE,EAAE,OAAO,SAAS,OAAO,QAAQ,KAAK,UAAU,GAAG,UAAU,GAC7D,KACA;AACA,SACE,8CAAC,cAAY,GAAG,WACd,yDAAC,gBACC;AAAA,kDAAC,iBAAc;AAAA,IACf;AAAA,MAAa;AAAA,MAAZ;AAAA,QACC;AAAA,QACA,oBAAkB;AAAA,QAClB,WAAW;AAAA,UACT;AAAA,UACA,YAAY,IAAI;AAAA,QAClB;AAAA,QACA,OAAO,EAAE,MAAM;AAAA,QAEd;AAAA,kBACC,8CAAC,gBAAa,OAAc,IAE5B,8CAAa,oBAAZ,EAAkB,WAAU,WAAU,oBAAM;AAAA,UAE/C,8CAAC,SAAI,WAAU,4BAA4B,UAAS;AAAA;AAAA;AAAA,IACtD;AAAA,KACF,GACF;AAEJ,CAAC;AAED,OAAO,cAAc;;;ACvErB,IAAAC,eAA6B;AAC7B,IAAAC,iBAA2C;AAyBnC,IAAAC,uBAAA;AAPD,IAAM,YAAQ,2BAAuC,SAASC,OACnE,EAAE,OAAO,QAAQ,oBAAoB,UAAU,GAAG,UAAU,GAC5D,KACA;AACA,SACE,8CAAC,cAAY,GAAG,WACd,yDAAC,gBACC;AAAA,kDAAC,iBAAc;AAAA,IACf;AAAA,MAAa;AAAA,MAAZ;AAAA,QACC;AAAA,QACA,oBAAkB;AAAA,QAClB,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,EAAE,MAAM;AAAA,QAEd;AAAA,kBACC,8CAAa,oBAAZ,EAAkB,WAAU,gCAAgC,iBAAM,IAEnE,8CAAa,oBAAZ,EAAkB,WAAU,WAAU,mBAAK;AAAA,UAE7C;AAAA;AAAA;AAAA,IACH;AAAA,KACF,GACF;AAEJ,CAAC;AAED,MAAM,cAAc;;;ACjDpB,iBAA4B;AAC5B,IAAAC,iBAA2C;AA6BnC,IAAAC,uBAAA;AApBD,IAAM,kBAA6B;AACnC,IAAM,qBAAgC;AACtC,IAAM,oBAA+B;AACrC,IAAM,oBAA+B;AAUrC,IAAM,kBAAc,2BAA6C,SAASC,aAC/E,EAAE,OAAO,aAAa,QAAQ,QAAQ,KAAK,UAAU,GAAG,UAAU,GAClE,KACA;AACA,SACE,8CAAC,mBAAiB,GAAG,WACnB,yDAAY,mBAAX,EACC;AAAA;AAAA,MAAY;AAAA,MAAX;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAY;AAAA,MAAX;AAAA,QACC;AAAA,QACA,OAAO,EAAE,UAAU,MAAM;AAAA,QACzB,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAEA;AAAA;AAAA,YAAY;AAAA,YAAX;AAAA,cACC,WAAW,GAAG,2BAA2B,cAAc,aAAa,MAAM;AAAA,cAEzE;AAAA;AAAA,UACH;AAAA,UACC,eACC,8CAAY,wBAAX,EAAuB,WAAU,wDAC/B,uBACH;AAAA,UAED;AAAA,UACA,UAAU,8CAAC,SAAI,WAAU,+BAA+B,kBAAO;AAAA;AAAA;AAAA,IAClE;AAAA,KACF,GACF;AAEJ,CAAC;AAED,YAAY,cAAc;;;AC/D1B,gBAA2B;AAC3B,IAAAC,iBAA2C;AAenC,IAAAC,uBAAA;AAXD,IAAM,mBAA6B;AACnC,IAAM,sBAAgC;AACtC,IAAM,qBAA+B;AACrC,IAAM,oBAA8B;AACpC,IAAM,oBAA8B;AACpC,IAAM,yBAAmC;AAEzC,IAAM,0BAAsB;AAAA,EACjC,SAASC,qBAAoB,EAAE,WAAW,aAAa,GAAG,QAAQ,SAAS,GAAG,MAAM,GAAG,KAAK;AAC1F,WACE,8CAAW,kBAAV,EACC;AAAA,MAAW;AAAA,MAAV;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAEA,oBAAoB,cAAc;AAWlC,IAAMC,YAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,eAAW,2BAA0C,SAASC,UACzE,EAAE,MAAM,UAAU,aAAa,WAAW,UAAU,GAAG,MAAM,GAC7D,KACA;AACA,SACE;AAAA,IAAW;AAAA,IAAV;AAAA,MACC;AAAA,MACA,WAAW,GAAGD,WAAU,cAAc,aAAa,aAAa,SAAS;AAAA,MACxE,GAAG;AAAA,MAEH;AAAA,gBAAQ,8CAAC,UAAK,WAAU,mCAAmC,gBAAK;AAAA,QACjE,8CAAC,UAAK,WAAU,UAAU,UAAS;AAAA,QAClC,YAAY,8CAAC,UAAK,WAAU,uCAAuC,oBAAS;AAAA;AAAA;AAAA,EAC/E;AAEJ,CAAC;AAED,SAAS,cAAc;AAEhB,IAAM,uBAAmB;AAAA,EAC9B,SAASE,kBAAiB,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,KAAK;AAChE,WACE;AAAA,MAAW;AAAA,MAAV;AAAA,QACC;AAAA,QACA,WAAW,GAAGF,WAAU,gCAAgC,SAAS;AAAA,QAChE,GAAG;AAAA,QAEJ;AAAA,wDAAW,yBAAV,EAAwB,WAAU,oEAAmE,oBAEtG;AAAA,UACC;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;AAExB,IAAM,oBAAgB;AAAA,EAC3B,SAASG,eAAc,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AACnD,WACE;AAAA,MAAW;AAAA,MAAV;AAAA,QACC;AAAA,QACA,WAAW,GAAG,0BAA0B,SAAS;AAAA,QAChD,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,cAAc,cAAc;AAGrB,IAAM,eAAyB;;;ACtGtC,qBAAgC;AAChC,IAAAC,iBAA2C;AAYnC,IAAAC,uBAAA;AARD,IAAM,gBAA+B;AACrC,IAAM,mBAAkC;AACxC,IAAM,kBAAiC;AAEvC,IAAM,uBAAmB;AAAA,EAC9B,SAASC,kBAAiB,EAAE,WAAW,aAAa,GAAG,GAAG,MAAM,GAAG,KAAK;AACtE,WACE,8CAAgB,uBAAf,EACC;AAAA,MAAgB;AAAA,MAAf;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;AAQxB,SAAS,UAAU,EAAE,SAAS,SAAS,GAAG,UAAU,GAAmB;AAC5E,SACE,+CAAgB,qBAAf,EAAoB,WAAW,KAAK,YAAY,KAAM,GAAG,WACxD;AAAA,kDAAgB,wBAAf,EAAuB,SAAO,MAAE,mBAAQ;AAAA,IACzC,8CAAC,oBAAkB,mBAAQ;AAAA,KAC7B;AAEJ;;;AC3CA,mBAA8B;AAC9B,IAAAC,iBAA2B;AAenB,IAAAC,uBAAA;AAXD,IAAM,cAA2B;AACjC,IAAM,iBAA8B;AACpC,IAAM,gBAA6B;AACnC,IAAM,gBAA6B;AACnC,IAAM,eAA4B;AAClC,IAAM,eAA4B;AAElC,IAAM,qBAAiB;AAAA,EAC5B,SAASC,gBAAe,EAAE,WAAW,QAAQ,SAAS,aAAa,GAAG,GAAG,MAAM,GAAG,KAAK;AACrF,WACE,8CAAc,qBAAb,EACC;AAAA,MAAc;AAAA,MAAb;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;AAUtB,IAAM,UAAuB;;;AC1CpC,iBAA4B;AAC5B,IAAAC,iBAQO;AAyFD,IAAAC,uBAAA;AA9DN,IAAM,mBAAe,8BAAwC,IAAI;AAEjE,IAAM,cAA4C;AAAA,EAChD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAEA,IAAM,mBAAiD;AAAA,EACrD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAEA,IAAM,oBAAkD;AAAA,EACtD,SAAS;AAAA,EACT,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAIA,IAAI,iBAAiB;AACrB,IAAM,cAAc,MAAM,SAAS,EAAE,cAAc;AAM5C,SAAS,cAAc,EAAE,SAAS,GAA4B;AACnE,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAuB,CAAC,CAAC;AAErD,QAAM,YAAQ,4BAAY,CAAC,MAAkB;AAI3C,UAAM,aAAa,EAAE;AACrB,UAAM,KAAK,cAAc,YAAY;AACrC,UAAM,QAAQ,EAAE,GAAG,GAAG,GAAG;AACzB,cAAU,CAAC,SAAS;AAClB,UAAI,eAAe,UAAa,KAAK,KAAK,CAAC,aAAa,SAAS,OAAO,UAAU,GAAG;AACnF,eAAO,KAAK,IAAI,CAAC,aAAc,SAAS,OAAO,aAAa,QAAQ,QAAS;AAAA,MAC/E;AACA,aAAO,CAAC,GAAG,MAAM,KAAK;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,cAAU,4BAAY,CAAC,OAAe;AAC1C,cAAU,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAEL,QAAM,YAAQ,wBAAQ,OAAO,EAAE,OAAO,QAAQ,IAAI,CAAC,OAAO,OAAO,CAAC;AAElE,SACE,8CAAC,aAAa,UAAb,EAAsB,OACrB,yDAAY,qBAAX,EAAoB,gBAAe,SACjC;AAAA;AAAA,IACA,OAAO,IAAI,CAAC,MACX,8CAAC,aAAqB,OAAO,GAAG,WAAW,MAAM,QAAQ,EAAE,EAAE,KAA7C,EAAE,EAA8C,CACjE;AAAA,IACD,8CAAY,qBAAX,EAAoB,WAAU,sGAAqG;AAAA,KACtI,GACF;AAEJ;AAEO,SAAS,WAA8B;AAC5C,QAAM,UAAM,2BAAW,YAAY;AACnC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yCAAyC;AACnE,SAAO;AACT;AAOO,IAAM,gBAAY,2BAA0C,SAASC,WAC1E,EAAE,OAAO,UAAU,GACnB,KACA;AACA,QAAM,UAAU,MAAM,WAAW;AACjC,SACE;AAAA,IAAY;AAAA,IAAX;AAAA,MACC;AAAA,MACA,UAAU,MAAM,YAAY;AAAA,MAC5B,cAAc,CAAC,SAAS;AACtB,YAAI,CAAC,KAAM,WAAU;AAAA,MACvB;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB,OAAO;AAAA,MAC3B;AAAA,MAEA;AAAA,sDAAC,UAAK,WAAW,GAAG,kCAAkC,iBAAiB,OAAO,CAAC,GAC5E,sBAAY,OAAO,GACtB;AAAA,QACA,+CAAC,SAAI,WAAU,kBACb;AAAA,wDAAY,kBAAX,EAAiB,WAAU,qCACzB,gBAAM,OACT;AAAA,UACC,MAAM,eACL,8CAAY,wBAAX,EAAuB,WAAU,sDAC/B,gBAAM,aACT;AAAA,UAED,MAAM,UAAU,8CAAC,SAAI,WAAU,QAAQ,gBAAM,QAAO;AAAA,WACvD;AAAA,QACA;AAAA,UAAY;AAAA,UAAX;AAAA,YACC,cAAW;AAAA,YACX,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,UAAU,cAAc;;;ACnKxB,mBAA8B;AAC9B,IAAAC,iBAA2C;AAqBnC,IAAAC,uBAAA;AAVD,IAAM,kBAA+B;AACrC,IAAM,cAA2B;AACjC,IAAM,iBAA8B;AACpC,IAAM,gBAA6B;AACnC,IAAM,eAA4B;AAElC,IAAM,qBAAiB;AAAA,EAC5B,SAASC,gBAAe,EAAE,WAAW,aAAa,GAAG,GAAG,MAAM,GAAG,KAAK;AACpE,WACE,8CAAc,qBAAb,EACC;AAAA,MAAc;AAAA,MAAb;AAAA,QACC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;AAiBtB,SAAS,QAAQ,EAAE,SAAS,UAAU,OAAO,OAAO,gBAAgB,IAAI,GAAiB;AAC9F,SACE,8CAAC,mBAAgB,eACf,yDAAC,eACC;AAAA,kDAAC,kBAAe,SAAO,MAAE,UAAS;AAAA,IAClC,8CAAC,kBAAe,MAAa,mBAAQ;AAAA,KACvC,GACF;AAEJ;;;AChEA,IAAAC,mCAAuC;AACvC,IAAAC,iBAAgE;AAqF1D,IAAAC,uBAAA;AAvEN,IAAM,kBAAc,sCAAI,uEAAuE;AAAA,EAC7F,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,MAAM,SAAS;AACpC,CAAC;AAED,IAAM,iBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAEA,IAAM,eAA0C;AAAA,EAC9C,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAwBO,IAAM,YAAQ,2BAAuC,SAASC,OACnE;AAAA,EACE,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,IAAK,QAAQ;AACnB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,SAAS,cAAc,UAAU;AAAA,MACvC,aAAW,SAAS,QAAQ,SAAY;AAAA,MACxC,WAAW,GAAG,YAAY,EAAE,KAAK,CAAC,GAAG,SAAS;AAAA,MAC7C,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,eAAW,MAAC,WAAW,GAAG,qCAAqC,eAAe,CAAC,CAAC,GACnF,kBAAQ,aAAa,CAAC,GACzB;AAAA,QACA,+CAAC,SAAI,WAAU,kBACZ;AAAA,mBAAS,8CAAC,SAAI,WAAU,eAAe,iBAAM;AAAA,UAC7C,eAAe,8CAAC,SAAI,WAAU,wCAAwC,uBAAY;AAAA,UAClF;AAAA,WACH;AAAA,QACC,UAAU,8CAAC,SAAI,WAAU,iBAAiB,kBAAO;AAAA;AAAA;AAAA,EACpD;AAEJ,CAAC;AAED,MAAM,cAAc;;;ACnGpB,IAAAC,mCAAuC;AACvC,IAAAC,iBAAgE;AA8D5D,IAAAC,uBAAA;AAlDJ,IAAM,mBAAe;AAAA,EACnB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,MAAM,UAAU,QAAQ,MAAM;AAAA,EACnD;AACF;AAEA,IAAMC,gBAA2C;AAAA,EAC/C,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAoBO,IAAM,aAAS,2BAAwC,SAASC,QACrE,EAAE,OAAO,UAAU,QAAQ,MAAM,QAAQ,OAAO,UAAU,WAAW,UAAU,GAAG,MAAM,GACxF,KACA;AACA,QAAM,IAAK,QAAQ;AACnB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,SAAS,cAAc,UAAU;AAAA,MACvC,aAAW,SAAS,QAAQ,SAAY;AAAA,MACxC,WAAW,GAAG,aAAa,EAAE,MAAM,OAAO,CAAC,GAAG,SAAS;AAAA,MACtD,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,eAAW,MAAC,WAAU,gBACzB,kBAAQD,cAAa,CAAC,GACzB;AAAA,QACA,8CAAC,SAAI,WAAU,kBAAkB,UAAS;AAAA,QACzC,UAAU,8CAAC,SAAI,WAAU,WAAW,kBAAO;AAAA;AAAA;AAAA,EAC9C;AAEJ,CAAC;AAED,OAAO,cAAc;;;AC/ErB,IAAAE,iBAQO;AA4BK,IAAAC,uBAAA;AAZL,IAAM,kBAAc,2BAA0C,SAASC,aAC5E,EAAE,YAAY,KAAK,WAAW,UAAU,GAAG,MAAM,GACjD,KACA;AACA,QAAM,SAAS,wBAAS,QAAQ,QAAQ,EAAE,OAAO,6BAAc;AAC/D,QAAM,OAAO,OAAO,SAAS;AAC7B,SACE,8CAAC,SAAI,KAAU,cAAW,cAAa,WAAW,GAAG,eAAe,SAAS,GAAI,GAAG,OAClF,wDAAC,QAAG,WAAU,yDACX,iBAAO,IAAI,CAAC,OAAO,MAAM;AACxB,UAAM,YAAY,MAAM;AACxB,WACE,+CAAC,QAAW,WAAU,sCACnB;AAAA,kBAAY,8CAAC,SAAO,GAAG,MAAM,OAAO,SAAO,MAAC,IAAK;AAAA,MACjD,CAAC,aACA,8CAAC,UAAK,eAAW,MAAC,WAAU,iBACzB,qBACH;AAAA,SALK,CAOT;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ,CAAC;AAED,YAAY,cAAc;AAOnB,IAAM,YAAQ,2BAA0C,SAASC,OACtE,EAAE,SAAS,WAAW,MAAM,UAAU,GAAG,MAAM,GAC/C,KACA;AACA,MAAI,SAAS;AACX,WACE,8CAAC,UAAK,gBAAa,QAAO,WAAW,GAAG,aAAa,SAAS,GAC3D,UACH;AAAA,EAEJ;AACA,MAAI,SAAS,QAAW;AACtB,WAAO,8CAAC,UAAK,WAAW,GAAG,iBAAiB,SAAS,GAAI,UAAS;AAAA,EACpE;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,GAAG,iEAAiE,SAAS;AAAA,MACvF,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,MAAM,cAAc;;;ACpFpB,IAAAC,iBAUO;AAqLD,IAAAC,uBAAA;AAtHN,SAAS,UAAU,QAA0C;AAC3D,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,EAAE,OAAO,QAAQ,OAAO,QAAQ,YAAY,OAAO,YAAY,EAAE;AAAA,EAC1E;AACA,QAAM,cACJ,OAAO,OAAO,UAAU,WACpB,OAAO,QACP,OAAO,OAAO,UAAU,cACtB,OAAO,QACP;AACR,QAAM,oBAAoB,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AACxF,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,OAAO,OAAO,SAAS,OAAO;AAAA,IAC9B,aAAa,OAAO;AAAA,IACpB,YAAY,GAAG,WAAW,IAAI,iBAAiB,GAAG,YAAY;AAAA,IAC9D,UAAU,OAAO;AAAA,EACnB;AACF;AAEA,IAAM,gBAAgB,CAAC,QAA0B,UAC/C,OAAO,WAAW,SAAS,MAAM,YAAY,CAAC;AAEzC,IAAM,eAAW,2BAA4C,SAASC,UAC3E;AAAA,EACE;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GACA,KACA;AACA,QAAM,cAAU,sBAAM;AACtB,QAAM,YAAY,GAAG,MAAM,OAAO;AAClC,QAAM,UAAU,MAAM,GAAG,OAAO;AAEhC,QAAM,iBAAa,wBAAQ,MAAM,QAAQ,IAAI,SAAS,GAAG,CAAC,OAAO,CAAC;AAElE,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAA6B;AAAA,IACrD,OAAO;AAAA,IACP;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,mBAAe,wBAAQ,MAAM;AACjC,QAAI,iBAAiB,OAAW,QAAO;AACvC,QAAI,iBAAiB,QAAW;AAC9B,YAAM,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,UAAU,YAAY;AAC3D,UAAI,OAAO,OAAO,IAAI,UAAU,SAAU,QAAO,IAAI;AAAA,IACvD;AACA,WAAO;AAAA,EACT,GAAG,CAAC,cAAc,cAAc,UAAU,CAAC;AAE3C,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAA6B;AAAA,IACrD,OAAO;AAAA,IACP,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,iBAAa,uBAAuB,IAAI;AAE9C,kBAAgB,YAAY,MAAM,QAAQ,KAAK,CAAC;AAEhD,QAAM,eAAW;AAAA,IACf,MAAO,QAAQ,WAAW,OAAO,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI;AAAA,IAC5D,CAAC,YAAY,OAAO,MAAM;AAAA,EAC5B;AAEA,QAAM,EAAE,QAAQ,WAAW,UAAU,IAAI,gBAAgB;AAAA,IACvD,OAAO,SAAS;AAAA,IAChB,eAAe;AAAA,IACf,UAAU,CAAC,MAAM;AACf,YAAM,OAAO,SAAS,CAAC;AACvB,UAAI,QAAQ,CAAC,KAAK,SAAU,QAAO,IAAI;AAAA,IACzC;AAAA,EACF,CAAC;AAED,gCAAU,MAAM;AACd,cAAU,CAAC;AAAA,EACb,GAAG,CAAC,OAAO,SAAS,CAAC;AAErB,WAAS,OAAO,QAA0B;AACxC,aAAS,OAAO,KAAK;AACrB,QAAI,OAAO,OAAO,UAAU,SAAU,UAAS,OAAO,KAAK;AAC3D,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,YAAY,CAAC,UAA2C;AAC5D,QAAI,MAAM,QAAQ,UAAU;AAC1B,cAAQ,KAAK;AACb;AAAA,IACF;AACA,QAAI,CAAC,SAAS,MAAM,QAAQ,eAAe,MAAM,QAAQ,YAAY;AACnE,cAAQ,IAAI;AAAA,IACd;AACA,cAAU,KAAK;AAAA,EACjB;AAEA,QAAM,aAAa,CAAC,UAAwC;AAC1D,QAAI,WAAW,WAAW,CAAC,WAAW,QAAQ,SAAS,MAAM,aAA4B,GAAG;AAC1F,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,SACE,+CAAC,SAAI,KAAK,YAAY,WAAU,YAAW,OAAO,EAAE,MAAM,GACxD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,cAAa;AAAA,QACb,qBAAkB;AAAA,QAClB,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,yBACE,QAAQ,SAAS,SAAS,IAAI,GAAG,SAAS,WAAW,MAAM,KAAK;AAAA,QAElE,cAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,UAAU,CAAC,MAAM;AACf,mBAAS,EAAE,OAAO,KAAK;AACvB,kBAAQ,IAAI;AACZ,cAAI,UAAU,OAAW,UAAS,EAAE;AAAA,QACtC;AAAA,QACA,SAAS,MAAM,QAAQ,IAAI;AAAA,QAC3B,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACC,QACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,cAAY,aAAa;AAAA,QACzB,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QAEC,mBAAS,WAAW,IACnB,8CAAC,QAAG,WAAU,mDAAkD,MAAK,gBAClE,wBAAc,cACjB,IAEA,SAAS,IAAI,CAAC,QAAQ,MAAM;AAC1B,gBAAM,WAAW,MAAM;AACvB,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI,GAAG,SAAS,WAAW,CAAC;AAAA,cAC5B,MAAK;AAAA,cACL,iBAAe;AAAA,cACf,iBAAe,OAAO,YAAY;AAAA,cAClC,cAAc,MAAM,UAAU,CAAC;AAAA,cAC/B,aAAa,CAAC,MAAM;AAClB,kBAAE,eAAe;AACjB,oBAAI,CAAC,OAAO,SAAU,QAAO,MAAM;AAAA,cACrC;AAAA,cACA,WAAW;AAAA,gBACT;AAAA,gBACA,YAAY;AAAA,gBACZ,OAAO,YAAY;AAAA,cACrB;AAAA,cAEA;AAAA,8DAAC,SAAK,iBAAO,OAAM;AAAA,gBAClB,OAAO,eACN,8CAAC,SAAI,WAAU,6BAA6B,iBAAO,aAAY;AAAA;AAAA;AAAA,YAlB5D,OAAO;AAAA,UAoBd;AAAA,QAEJ,CAAC;AAAA;AAAA,IAEL;AAAA,IAED,QAAQ,8CAAC,WAAM,MAAK,UAAS,MAAY,OAAO,SAAS,IAAI,UAAQ,MAAC;AAAA,KACzE;AAEJ,CAAC;AAED,SAAS,cAAc;;;AClRvB,IAAAC,eAA6B;AAC7B,IAAAC,iBAAsE;AAmG5D,IAAAC,uBAAA;AA3CV,SAAS,UAAU,QAAkE;AACnF,SAAO,OAAO,QAAQ,CAAC,MAAM,EAAE,KAA6B;AAC9D;AAEO,IAAM,qBAAiB;AAAA,EAC5B,SAASC,gBACP;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,GACA,KACA;AACA,UAAM,WAAO,wBAAQ,MAAM,UAAU,MAAM,GAAG,CAAC,MAAM,CAAC;AACtD,UAAM,EAAE,QAAQ,WAAW,UAAU,IAAI,gBAAgB;AAAA,MACvD,OAAO,KAAK;AAAA,MACZ,eAAe;AAAA,MACf,UAAU,CAAC,MAAM;AACf,cAAM,OAAO,KAAK,CAAC;AACnB,YAAI,KAAM,UAAS,KAAK,EAAE;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,UAAM,cAAU,sBAAM;AACtB,UAAM,YAAY,GAAG,OAAO;AAC5B,UAAM,WAAW,CAAC,MAAc,GAAG,SAAS,WAAW,CAAC;AACxD,UAAM,aAAa,KAAK,SAAS;AAGjC,kCAAU,MAAM;AACd,gBAAU,CAAC;AAAA,IACb,GAAG,CAAC,OAAO,QAAQ,SAAS,CAAC;AAE7B,WACE,8CAAa,mBAAZ,EAAiB,MAAY,cAC5B,yDAAa,qBAAZ,EACC;AAAA;AAAA,QAAa;AAAA,QAAZ;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,MACA;AAAA,QAAa;AAAA,QAAZ;AAAA,UACC;AAAA,UACA,cAAW;AAAA,UACX,oBAAkB;AAAA,UAClB,OAAO,EAAE,MAAM;AAAA,UACf,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,UAEA;AAAA,0DAAa,oBAAZ,EAAkB,WAAU,WAAU,6BAAe;AAAA,YACtD,+CAAC,SAAI,WAAU,sEACb;AAAA,4DAAC,UAAK,eAAW,MAAC,WAAU,iBAAgB,oBAE5C;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBAIC,WAAS;AAAA,kBACT,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,kBAC7C;AAAA,kBACA,cAAW;AAAA,kBACX,MAAK;AAAA,kBACL,qBAAkB;AAAA,kBAIlB,iBAAa;AAAA,kBACb,iBAAe;AAAA,kBACf,yBAAuB,aAAa,SAAS,MAAM,IAAI;AAAA,kBACvD,WAAU;AAAA;AAAA,cACZ;AAAA,cACA,8CAAC,UAAK,WAAU,yFAAwF,iBAExG;AAAA,eACF;AAAA,YACA,8CAAC,SAAI,IAAI,WAAW,WAAU,qBAAoB,MAAK,WAAU,cAAW,WACzE,eAAK,WAAW,IACd,cACC,8CAAC,SAAI,WAAU,mDAAkD,wBAAU,IAG7E;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF,GAEJ;AAAA,YACC,UACC,8CAAC,SAAI,WAAU,6FACZ,kBACH;AAAA;AAAA;AAAA,MAEJ;AAAA,OACF,GACF;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;AAU7B,SAAS,cAAc,EAAE,QAAQ,QAAQ,WAAW,UAAU,SAAS,GAAuB;AAC5F,MAAI,eAAe;AACnB,SACE,+EACG,iBAAO,IAAI,CAAC,OAAO,SAAS;AAC3B,QAAI,MAAM,MAAM,WAAW,EAAG,QAAO;AACrC,WACE,+CAAC,SACE;AAAA,YAAM,SACL,+CAAC,SAAI,WAAU,gFACZ;AAAA,cAAM;AAAA,QAAM;AAAA,QAAI,MAAM,MAAM;AAAA,SAC/B;AAAA,MAED,MAAM,MAAM,IAAI,CAAC,SAAS;AACzB,cAAM,UAAU;AAChB,cAAM,WAAW,WAAW;AAC5B,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI,SAAS,OAAO;AAAA,YACpB,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,YAC/B,cAAc,MAAM,UAAU,OAAO;AAAA,YACrC,WAAW;AAAA,cACT;AAAA,cACA,WAAW,8BAA8B;AAAA,YAC3C;AAAA,YAEC;AAAA,mBAAK,SAAS,QACb;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW;AAAA,kBACX,WAAW;AAAA,oBACT;AAAA,oBACA,WAAW,gBAAgB;AAAA,kBAC7B;AAAA,kBAEC,eAAK;AAAA;AAAA,cACR;AAAA,cAEF,+CAAC,UAAK,WAAU,kBACd;AAAA,8DAAC,UAAK,WAAU,8BAA8B,eAAK,OAAM;AAAA,gBACxD,KAAK,eACJ,8CAAC,UAAK,WAAU,4CACb,eAAK,aACR;AAAA,iBAEJ;AAAA,cACC,KAAK,YACJ,8CAAC,UAAK,WAAU,uCAAuC,eAAK,UAAS;AAAA;AAAA;AAAA,UAhClE,KAAK;AAAA,QAkCZ;AAAA,MAEJ,CAAC;AAAA,SA/CO,IAgDV;AAAA,EAEJ,CAAC,GACH;AAEJ;AAOO,SAAS,mBACd,OACA,QACuB;AACvB,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,MAAI,CAAC,EAAG,QAAO,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;AAChE,SAAO,OACJ,IAAI,CAAC,OAAO;AAAA,IACX,GAAG;AAAA,IACH,OAAO,EAAE,MAAM,OAAO,CAAC,SAAS;AAC9B,YAAM,WACJ,KAAK,cACL,GAAG,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,EAAE,IAAI,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,EAAE;AACrH,aAAO,SAAS,YAAY,EAAE,SAAS,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;AACrC;;;AC5QA,IAAAC,iBAAqE;AAuKnD,IAAAC,uBAAA;AA5GlB,IAAM,aAAa;AAAA,EACjB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV;AAOA,IAAM,YAAiC,oBAAI,IAAI;AAIxC,SAAS,UAAa,OAA4D;AACvF,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,MAAM,OAAO,IAAI,qBAA2C;AAAA,IACjE,OAAO;AAAA,IACP,cAAc,eAAe;AAAA,IAC7B,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,CAAC,UAAU,WAAW,IAAI,qBAA0C;AAAA,IACxE,OAAO;AAAA,IACP,cAAc,IAAI,IAAI,mBAAmB,CAAC,CAAC;AAAA,IAC3C,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,kBAAc,wBAAQ,MAAM;AAChC,UAAM,IAAI,oBAAI,IAAgC;AAC9C,eAAW,KAAK,QAAS,KAAI,EAAE,SAAU,GAAE,IAAI,EAAE,KAAK,CAAC;AACvD,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,iBAAa,wBAAQ,MAAM;AAC/B,QAAI,CAAC,KAAM,QAAO,CAAC,GAAG,IAAI;AAC1B,UAAM,MAAM,YAAY,IAAI,KAAK,GAAG;AACpC,QAAI,CAAC,OAAO,CAAC,IAAI,SAAU,QAAO,CAAC,GAAG,IAAI;AAC1C,UAAM,SAAS,KAAK,cAAc,QAAQ,IAAI;AAC9C,WAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9B,YAAM,KAAK,IAAI,SAAU,CAAC;AAC1B,YAAM,KAAK,IAAI,SAAU,CAAC;AAC1B,UAAI,OAAO,OAAO,YAAY,OAAO,OAAO,SAAU,SAAQ,KAAK,MAAM;AACzE,aAAO,OAAO,EAAE,EAAE,cAAc,OAAO,EAAE,CAAC,IAAI;AAAA,IAChD,CAAC;AAAA,EACH,GAAG,CAAC,MAAM,MAAM,WAAW,CAAC;AAE5B,QAAM,aAAS,wBAAQ,MAAM,WAAW,IAAI,MAAM,GAAG,CAAC,YAAY,MAAM,CAAC;AACzE,QAAM,cAAc,YAAY;AAChC,QAAM,cAAc,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC,OAAO,YAAY,IAAI,EAAE,CAAC;AACjF,QAAM,eAAe,CAAC,eAAe,OAAO,KAAK,CAAC,OAAO,YAAY,IAAI,EAAE,CAAC;AAE5E,QAAM,qBAAiB,uBAAyB,IAAI;AACpD,gCAAU,MAAM;AACd,QAAI,eAAe,QAAS,gBAAe,QAAQ,gBAAgB;AAAA,EACrE,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,aAAa,CAAC,QAAgB;AAClC,UAAM,MAAM,YAAY,IAAI,GAAG;AAC/B,QAAI,CAAC,IAAK;AACV,YAAQ,CAAC,SAAS;AAChB,UAAI,MAAM,QAAQ,IAAK,QAAO,EAAE,KAAK,WAAW,MAAM;AACtD,UAAI,KAAK,cAAc,MAAO,QAAO,EAAE,KAAK,WAAW,OAAO;AAC9D,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM;AACtB,gBAAY,CAAC,SAAS;AACpB,YAAM,OAAO,IAAI,IAAI,QAAQ,CAAC,CAAC;AAC/B,UAAI,aAAa;AACf,mBAAW,MAAM,OAAQ,MAAK,OAAO,EAAE;AAAA,MACzC,OAAO;AACL,mBAAW,MAAM,OAAQ,MAAK,IAAI,EAAE;AAAA,MACtC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,CAAC,OAAe;AAChC,gBAAY,CAAC,SAAS;AACpB,YAAM,OAAO,IAAI,IAAI,QAAQ,CAAC,CAAC;AAC/B,UAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,UAC3B,MAAK,IAAI,EAAE;AAChB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SACE,+CAAC,WAAM,KAAU,WAAW,GAAG,sCAAsC,SAAS,GAC3E;AAAA,eAAW,8CAAC,aAAQ,WAAU,WAAW,mBAAQ;AAAA,IAClD,8CAAC,WAAM,WAAW,GAAG,cAAc,gBAAgB,uBAAuB,GACxE,yDAAC,QACE;AAAA,oBACC,8CAAC,QAAG,OAAM,OAAM,WAAU,kDACxB;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,cAAW;AAAA,UACX,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAU;AAAA;AAAA,MACZ,GACF;AAAA,MAED,QAAQ,IAAI,CAAC,QAAQ;AACpB,cAAM,WAAW,CAAC,CAAC,IAAI;AACvB,cAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,cAAM,WAAW,CAAC,WACd,SACA,WACE,MAAM,cAAc,QAClB,cACA,eACF;AACN,cAAM,QAAQ,IAAI,SAAS;AAC3B,cAAM,YAAY,YAAY,YAC5B,8CAAC,UAAK,eAAW,MAAC,WAAU,QACzB,gBAAM,cAAc,QAAQ,WAAM,UACrC;AAEF,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,OAAM;AAAA,YACN,aAAW;AAAA,YACX,OAAO,IAAI,SAAS,OAAO,EAAE,OAAO,IAAI,MAAM,IAAI;AAAA,YAClD,WAAW;AAAA,cACT;AAAA,cACA,WAAW,KAAK;AAAA,cAChB,YAAY;AAAA,cACZ,WAAW,gBAAgB;AAAA,YAC7B;AAAA,YAEC,qBACC;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,WAAW,IAAI,GAAG;AAAA,gBACjC,WAAU;AAAA,gBAET;AAAA,sBAAI;AAAA,kBACJ;AAAA;AAAA;AAAA,YACH,IAEA,IAAI;AAAA;AAAA,UArBD,IAAI;AAAA,QAuBX;AAAA,MAEJ,CAAC;AAAA,OACH,GACF;AAAA,IACA,+CAAC,WACE;AAAA,iBAAW,WAAW,KACrB,8CAAC,QACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS,QAAQ,UAAU,aAAa,IAAI;AAAA,UAC5C,WAAU;AAAA,UAET,wBAAc;AAAA;AAAA,MACjB,GACF;AAAA,MAED,WAAW,IAAI,CAAC,QAAQ;AACvB,cAAM,KAAK,OAAO,GAAG;AACrB,cAAM,aAAa,YAAY,IAAI,EAAE;AACrC,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,cAAY,aAAa,aAAa;AAAA,YACtC,WAAW;AAAA,cACT;AAAA,cACA,aAAa,qBAAqB;AAAA,YACpC;AAAA,YAEC;AAAA,4BACC,8CAAC,QAAG,WAAU,kBACZ;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAY,cAAc,EAAE;AAAA,kBAC5B,SAAS;AAAA,kBACT,UAAU,MAAM,UAAU,EAAE;AAAA,kBAC5B,WAAU;AAAA;AAAA,cACZ,GACF;AAAA,cAED,QAAQ,IAAI,CAAC,QACZ,8CAAC,QAAiB,WAAW,GAAG,kBAAkB,WAAW,IAAI,SAAS,MAAM,CAAC,GAC9E,cAAI,OAAO,IAAI,KAAK,GAAG,IAAI,IAAI,WAAW,OAAO,IAAI,SAAS,GAAG,CAAC,IAAI,QADhE,IAAI,GAEb,CACD;AAAA;AAAA;AAAA,UAtBI;AAAA,QAuBP;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,KACF;AAEJ;;;ACjRA,IAAAC,iBASO;AA8OC,IAAAC,uBAAA;AAvNR,IAAM,SAAS,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AAClG,IAAM,OAAO,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAwB/C,SAAS,UAAU,GAAqB,GAAS;AAC/C,MAAI,CAAC,EAAG,QAAO;AACf,SACE,EAAE,YAAY,MAAM,EAAE,YAAY,KAClC,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAE9B;AAEA,SAAS,SAAS,MAAc,OAAe,KAAa;AAC1D,QAAM,MAAM,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ;AACjD,SAAO,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,GAAG,GAAG;AACvC;AAEO,IAAM,eAAW,2BAA0C,SAASC,UACzE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AAKA,QAAM,CAAC,KAAK,QAAI,yBAAS,MAAM,oBAAI,KAAK,CAAC;AACzC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,gCAAU,MAAM,YAAY,IAAI,GAAG,CAAC,CAAC;AAErC,QAAM,CAAC,cAAc,eAAe,IAAI,qBAA2B;AAAA,IACjE;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,eAAe,gBAAgB,cAAc,SAAS,KAAK,MAAM,SAAS;AAChF,QAAM,cAAc,eAAe,cAAc,YAAY,KAAK,MAAM,YAAY;AACpF,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,YAAY;AAC/D,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,WAAW;AAE5D,QAAM,QAAQ,aAAa;AAC3B,QAAM,OAAO,YAAY;AACzB,QAAM,eAAe,cAAc,UAAa,aAAa;AAE7D,QAAM,iBAAa;AAAA,IACjB,CAAC,GAAW,MAAc;AACxB,UAAI,CAAC,cAAc;AACjB,yBAAiB,CAAC;AAClB,wBAAgB,CAAC;AAAA,MACnB;AACA,6BAAuB,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;AAAA,IAC9C;AAAA,IACA,CAAC,cAAc,oBAAoB;AAAA,EACrC;AAEA,QAAM,aAAS,4BAAY,MAAM;AAC/B,UAAM,IAAI,UAAU,IAAI,KAAK,QAAQ;AACrC,UAAM,IAAI,UAAU,IAAI,OAAO,IAAI;AACnC,eAAW,GAAG,CAAC;AAAA,EACjB,GAAG,CAAC,OAAO,MAAM,UAAU,CAAC;AAC5B,QAAM,aAAS,4BAAY,MAAM;AAC/B,UAAM,IAAI,UAAU,KAAK,IAAI,QAAQ;AACrC,UAAM,IAAI,UAAU,KAAK,OAAO,IAAI;AACpC,eAAW,GAAG,CAAC;AAAA,EACjB,GAAG,CAAC,OAAO,MAAM,UAAU,CAAC;AAE5B,QAAM,cAAc,IAAI,KAAK,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ;AACzD,QAAM,kBAAkB,IAAI,KAAK,MAAM,OAAO,CAAC,EAAE,OAAO;AAMxD,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAe,MAAM;AACzD,QAAI,aAAc,QAAO;AACzB,WAAO,IAAI,KAAK,aAAa,cAAc,CAAC;AAAA,EAC9C,CAAC;AAGD,gCAAU,MAAM;AACd,QAAI,aAAc,gBAAe,YAAY;AAAA,EAC/C,GAAG,CAAC,YAAY,CAAC;AAIjB,QAAM,wBACJ,YAAY,SAAS,MAAM,SAAS,YAAY,YAAY,MAAM;AACpE,QAAM,oBAAoB,wBACtB,YAAY,QAAQ,IACpB,SAAS,MAAM,OAAO,YAAY,QAAQ,CAAC;AAE/C,QAAM,cAAU,uBAA8C,oBAAI,IAAI,CAAC;AACvE,QAAM,qBAAiB,uBAAO,KAAK;AAInC,gCAAU,MAAM;AACd,QAAI,CAAC,eAAe,QAAS;AAC7B,mBAAe,UAAU;AACzB,UAAM,OAAO,QAAQ,QAAQ,IAAI,iBAAiB;AAClD,UAAM,MAAM;AAAA,EACd,GAAG,CAAC,mBAAmB,OAAO,IAAI,CAAC;AAEnC,QAAM,gBAAY;AAAA,IAChB,CAAC,SAAe;AACd,qBAAe,IAAI;AACnB,qBAAe,UAAU;AACzB,YAAM,YAAY,KAAK,SAAS;AAChC,YAAM,WAAW,KAAK,YAAY;AAClC,UAAI,cAAc,SAAS,aAAa,MAAM;AAC5C,mBAAW,WAAW,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,IACA,CAAC,OAAO,MAAM,UAAU;AAAA,EAC1B;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,GAAqC,QAAgB;AACpD,YAAM,UAAU,IAAI,KAAK,MAAM,OAAO,GAAG;AACzC,UAAI,OAAoB;AACxB,UAAI,UAAU;AACd,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AACH,iBAAO,IAAI,KAAK,MAAM,OAAO,MAAM,CAAC;AACpC;AAAA,QACF,KAAK;AACH,iBAAO,IAAI,KAAK,MAAM,OAAO,MAAM,CAAC;AACpC;AAAA,QACF,KAAK;AACH,iBAAO,IAAI,KAAK,MAAM,OAAO,MAAM,CAAC;AACpC;AAAA,QACF,KAAK;AACH,iBAAO,IAAI,KAAK,MAAM,OAAO,MAAM,CAAC;AACpC;AAAA,QACF,KAAK,QAAQ;AACX,gBAAM,MAAM,QAAQ,OAAO;AAC3B,iBAAO,IAAI,KAAK,MAAM,OAAO,MAAM,GAAG;AACtC;AAAA,QACF;AAAA,QACA,KAAK,OAAO;AACV,gBAAM,MAAM,QAAQ,OAAO;AAC3B,iBAAO,IAAI,KAAK,MAAM,OAAO,OAAO,IAAI,IAAI;AAC5C;AAAA,QACF;AAAA,QACA,KAAK,UAAU;AACb,gBAAM,cAAc,UAAU,IAAI,KAAK,QAAQ;AAC/C,gBAAM,aAAa,UAAU,IAAI,OAAO,IAAI;AAC5C,gBAAM,YAAY,SAAS,YAAY,aAAa,GAAG;AACvD,iBAAO,IAAI,KAAK,YAAY,aAAa,SAAS;AAClD;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,gBAAM,cAAc,UAAU,KAAK,IAAI,QAAQ;AAC/C,gBAAM,aAAa,UAAU,KAAK,OAAO,IAAI;AAC7C,gBAAM,YAAY,SAAS,YAAY,aAAa,GAAG;AACvD,iBAAO,IAAI,KAAK,YAAY,aAAa,SAAS;AAClD;AAAA,QACF;AAAA,QACA;AACE,oBAAU;AAAA,MACd;AACA,UAAI,WAAW,MAAM;AACnB,UAAE,eAAe;AACjB,kBAAU,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,IACA,CAAC,OAAO,MAAM,SAAS;AAAA,EACzB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,cAAY,GAAG,OAAO,KAAK,CAAC,IAAI,IAAI;AAAA,MACpC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,uDAAC,SAAI,WAAU,0CACb;AAAA,yDAAC,UAAK,WAAU,2BAA0B,aAAU,UACjD;AAAA,mBAAO,KAAK;AAAA,YAAE;AAAA,YAAE;AAAA,aACnB;AAAA,UACA,+CAAC,SAAI,WAAU,cACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAAS;AAAA;AAAA,YACX;AAAA,YACA,8CAAC,cAAW,MAAK,MAAK,SAAQ,SAAQ,MAAK,UAAI,cAAW,cAAa,SAAS,QAAQ;AAAA,aAC1F;AAAA,WACF;AAAA,QAOA,+CAAC,SAAI,MAAK,QAAO,cAAY,GAAG,OAAO,KAAK,CAAC,IAAI,IAAI,IAAI,WAAU,2BACjE;AAAA,wDAAC,SAAI,MAAK,OAAM,WAAU,8BACvB,eAAK,IAAI,CAAC,GAAG,MACZ;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,cACE,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU,EAAE,CAAC;AAAA,cAElF,WAAU;AAAA,cAET;AAAA;AAAA,YAPI;AAAA,UAQP,CACD,GACH;AAAA,WACE,MAAM;AACN,kBAAM,aAAa,kBAAkB;AACrC,kBAAM,WAAW,KAAK,KAAK,aAAa,CAAC;AACzC,kBAAM,OAAoB,CAAC;AAC3B,qBAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,oBAAM,QAAqB,CAAC;AAC5B,uBAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,sBAAM,YAAY,IAAI,IAAI;AAC1B,sBAAM,SAAS,YAAY,kBAAkB;AAC7C,oBAAI,SAAS,KAAK,SAAS,aAAa;AACtC,wBAAM,KAAK,8CAAC,SAA0B,MAAK,YAAW,eAAW,QAA5C,OAAO,CAAC,IAAI,CAAC,EAAgC,CAAE;AACpE;AAAA,gBACF;AACA,sBAAM,OAAO,IAAI,KAAK,MAAM,OAAO,MAAM;AACzC,sBAAM,aAAa,UAAU,cAAc,IAAI;AAC/C,sBAAM,UAAU,YAAY,UAAU,OAAO,IAAI;AACjD,sBAAM,WAAW,iBAAiB,IAAI,KAAK;AAC3C,sBAAM,YAAY,WAAW;AAC7B,sBAAM,MAAM;AACZ,sBAAM;AAAA,kBACJ,8CAAC,SAAc,MAAK,YAAW,iBAAe,YAC5C;AAAA,oBAAC;AAAA;AAAA,sBACC,KAAK,CAAC,SAAS;AACb,4BAAI,KAAM,SAAQ,QAAQ,IAAI,KAAK,IAAI;AAAA,4BAClC,SAAQ,QAAQ,OAAO,GAAG;AAAA,sBACjC;AAAA,sBACA,MAAK;AAAA,sBACL;AAAA,sBACA,gBAAc,UAAU,SAAS;AAAA,sBACjC,cAAY,KAAK,aAAa;AAAA,sBAC9B,UAAU,YAAY,IAAI;AAAA,sBAC1B,SAAS,MAAM;AACb,wCAAgB,IAAI;AACpB,uCAAe,IAAI;AAAA,sBACrB;AAAA,sBACA,WAAW,CAAC,MAAM,cAAc,GAAG,GAAG;AAAA,sBACtC,WAAW;AAAA,wBACT;AAAA,wBACA;AAAA,wBACA;AAAA,wBACA,CAAC,cAAc,CAAC,YAAY;AAAA,wBAC5B,cAAc;AAAA,wBACd,CAAC,cAAc,WAAW;AAAA,sBAC5B;AAAA,sBAEC;AAAA;AAAA,kBACH,KA1BQ,GA2BV;AAAA,gBACF;AAAA,cACF;AACA,mBAAK;AAAA,gBACH,8CAAC,SAAqB,MAAK,OAAM,WAAU,8BACxC,mBADO,OAAO,CAAC,EAElB;AAAA,cACF;AAAA,YACF;AACA,mBAAO;AAAA,UACT,GAAG;AAAA,WACL;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,SAAS,cAAc;;;ACzVvB,IAAAC,gBAA8B;AAC9B,IAAAC,iBAAqD;AA4D7C,IAAAC,uBAAA;AA7BR,IAAM,gBAAgB,CAAC,MAAY,EAAE,mBAAmB;AAEjD,IAAM,iBAAa,2BAA+C,SAASC,YAChF;AAAA,EACE,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,SAAS;AAAA,EACT;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AACF,GACA,KACA;AACA,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAA2B;AAAA,IACnD,OAAO;AAAA,IACP;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,SACE,+CAAc,oBAAb,EAAkB,MAAY,cAAc,SAC3C;AAAA,kDAAc,uBAAb,EAAqB,SAAO,MAC3B;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA,cAAY,aAAa;AAAA,QACzB,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,EAAE,MAAM;AAAA,QAEf;AAAA,wDAAC,UAAK,eAAW,MAAC,WAAU,iBAAgB,oBAE5C;AAAA,UACA,8CAAC,UAAK,WAAW,GAAG,mBAAmB,CAAC,SAAS,eAAe,GAC7D,kBAAQ,OAAO,KAAK,IAAK,cAAc,aAC1C;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IACA,8CAAc,sBAAb,EACC;AAAA,MAAc;AAAA,MAAb;AAAA,QACC,OAAM;AAAA,QACN,YAAY;AAAA,QACZ,WAAU;AAAA,QAEV;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,cAAc,OAAO,SAAS;AAAA,YAC9B,aAAa,OAAO,YAAY;AAAA,YAChC,eAAe,CAAC,SAAS;AACvB,uBAAS,IAAI;AACb,sBAAQ,KAAK;AAAA,YACf;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA,IACF,GACF;AAAA,IACC,QACC,8CAAC,WAAM,MAAK,UAAS,MAAY,OAAO,QAAQ,MAAM,YAAY,IAAI,IAAI,UAAQ,MAAC;AAAA,KAEvF;AAEJ,CAAC;AAED,WAAW,cAAc;;;AC7GzB,IAAAC,iBAAgD;AAwCpC,IAAAC,uBAAA;AApBL,IAAM,WAAO,2BAAmC,SAASC,MAC9D,EAAE,OAAO,SAAS,UAAU,WAAW,cAAc,YAAY,YAAY,GAAG,MAAM,GACtF,KACA;AACA,QAAM,cAAc,OAAO,aAAa;AACxC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAY;AAAA,MACZ,WAAW,GAAG,sCAAsC,SAAS;AAAA,MAC5D,GAAG;AAAA,MAEH,gBAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM;AAC3C,cAAM,WAAW,MAAM;AACvB,cAAM,cAAc;AAAA,UAClB;AAAA,UACA,WAAW,uBAAuB;AAAA,QACpC;AACA,YAAI,aAAa;AACf,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,cAAY,eAAe,IAAI,CAAC;AAAA,cAChC,gBAAc,WAAW,SAAS;AAAA,cAClC,SAAS,MAAM,WAAW,CAAC;AAAA,cAC3B,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,CAAC,YAAY;AAAA,cACf;AAAA;AAAA,YAVK;AAAA,UAWP;AAAA,QAEJ;AACA,eAAO,8CAAC,UAAa,eAAW,MAAC,WAAW,eAA1B,CAAuC;AAAA,MAC3D,CAAC;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,KAAK,cAAc;;;AC7DnB,IAAAC,iBAMO;AAiEH,IAAAC,uBAAA;AApCJ,SAAS,YAAY,MAA+B;AAClD,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,IAAM,eAAW,2BAA4C,SAASC,UAC3E;AAAA,EACE;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAElD,QAAM,aAAa,CAAC,MAAiB;AACnC,QAAI,SAAU;AACd,MAAE,eAAe;AACjB,kBAAc,IAAI;AAAA,EACpB;AACA,QAAM,cAAc,MAAM,cAAc,KAAK;AAC7C,QAAM,SAAS,CAAC,MAAiB;AAC/B,QAAI,SAAU;AACd,MAAE,eAAe;AACjB,kBAAc,KAAK;AACnB,UAAM,QAAQ,YAAY,EAAE,aAAa,KAAK;AAC9C,QAAI,MAAM,OAAQ,WAAU,KAAK;AAAA,EACnC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,aACI,gCACA;AAAA,QACJ,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,YAChD,WAAU;AAAA,YACV,UAAU,CAAC,MAAM;AACf,oBAAM,QAAQ,YAAY,EAAE,OAAO,KAAK;AACxC,kBAAI,MAAM,OAAQ,WAAU,KAAK;AACjC,gBAAE,OAAO,QAAQ;AAAA,YACnB;AAAA;AAAA,QACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAW,GAAG,oBAAoB,aAAa,gBAAgB,eAAe;AAAA,YAE7E;AAAA;AAAA,QACH;AAAA,QACA,8CAAC,SAAI,WAAU,gCAAgC,iBAAM;AAAA,QACpD,eAAe,8CAAC,SAAI,WAAU,6BAA6B,uBAAY;AAAA;AAAA;AAAA,EAC1E;AAEJ,CAAC;AAED,SAAS,cAAc;;;ACjHvB,IAAAC,oCAAuC;AACvC,IAAAC,iBAAgE;AAiD5D,IAAAC,uBAAA;AAnCJ,IAAM,kBAAc,uCAAI,8DAA8D;AAAA,EACpF,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,MAAM,UAAU;AACrC,CAAC;AAmBM,IAAM,iBAAa,2BAA4C,SAASC,YAC7E,EAAE,MAAM,OAAO,aAAa,QAAQ,OAAO,MAAM,WAAW,GAAG,MAAM,GACrE,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,gBAAQ,QACP,8CAAC,UAAK,eAAW,MAAC,WAAW,YAAY,EAAE,MAAM,QAAQ,UAAU,CAAC,GACjE,gBACH;AAAA,QAEF,8CAAC,SAAI,WAAU,2BAA2B,iBAAM;AAAA,QAC/C,eACC,8CAAC,SAAI,WAAU,2DAA2D,uBAAY;AAAA,QAEvF,SAAS,MAAM,SAAS,KACvB,8CAAC,SAAI,WAAU,8BACZ,gBAAM,IAAI,CAAC,GAAG,MACb;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,SAAS,EAAE;AAAA,YACX,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YAEC,YAAE;AAAA;AAAA,UATE;AAAA,QAUP,CACD,GACH;AAAA,QAED;AAAA;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,WAAW,cAAc;;;AC1FzB,IAAAC,iBAAgE;AAmD1D,IAAAC,uBAAA;AA1BN,SAAS,UAAU,MAAc;AAC/B,QAAM,MAAM,KAAK,YAAY,GAAG;AAChC,MAAI,MAAM,EAAG,QAAO;AACpB,SAAO,KACJ,MAAM,MAAM,CAAC,EACb,MAAM,GAAG,CAAC,EACV,YAAY;AACjB;AAEO,IAAM,eAAW,2BAA0C,SAASC,UACzE,EAAE,MAAM,MAAM,UAAU,MAAM,UAAU,QAAQ,WAAW,GAAG,MAAM,GACpE,KACA;AACA,QAAM,MAAM,UAAU,IAAI;AAC1B,QAAM,eAAe,OAAO,aAAa;AACzC,QAAM,aAAa,gBAAgB,YAAY;AAE/C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAU;AAAA,YAET,kBAAQ;AAAA;AAAA,QACX;AAAA,QACA,+CAAC,SAAI,WAAU,kBACb;AAAA,wDAAC,SAAI,WAAU,oCAAoC,gBAAK;AAAA,UACxD,+CAAC,SAAI,WAAW,GAAG,yBAAyB,SAAS,aAAa,eAAe,GAC9E;AAAA;AAAA,YACA,gBAAgB,CAAC,cAAc,+CAAC,UAAK;AAAA;AAAA,cAAI,KAAK,MAAM,QAAQ;AAAA,cAAE;AAAA,eAAC;AAAA,aAClE;AAAA,UACC,gBAAgB,CAAC,cAChB,8CAAC,SAAI,WAAU,sDACb;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,SAAS,WAAW;AAAA,cACtB;AAAA,cACA,OAAO,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI;AAAA;AAAA,UAC7D,GACF;AAAA,WAEJ;AAAA,QACC,YACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,cAAY,UAAU,IAAI;AAAA,YAC1B,SAAS;AAAA,YACT,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YACD;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,SAAS,cAAc;;;AC5FvB,IAAAC,iBAAuF;AAkHjF,IAAAC,uBAAA;AArDN,IAAM,QAA0B,OAAO,OAAO,CAAC,CAAC;AAEzC,IAAM,kBAAc,2BAA6C,SAASC,aAC/E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,CAAC,WAAW,YAAY,IAAI,qBAAuC;AAAA,IACvE;AAAA,IACA,cAAc,gBAAgB;AAAA,IAC9B,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,UAAU,OAAO,UAAU,MAAM,EAAE,GAAG,UAAU,IAAI,CAAC;AAEvF,QAAM,aAAS;AAAA,IACb,CAAC,SAAiB,aAAqB,SAAkB;AACvD,mBAAa,CAAC,SAAS;AACrB,cAAM,UAAU,OAAO,OAAO,KAAK,CAAC;AACpC,cAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,MAAM,WAAW;AACxD,cAAM,UAAU,OAAO,CAAC,GAAG,UAAU,WAAW,IAAI;AACpD,eAAO,EAAE,GAAI,QAAQ,CAAC,GAAI,CAAC,OAAO,GAAG,QAAQ;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,kBAAc,4BAAY,MAAM;AACpC,iBAAa,KAAK;AAClB,cAAU;AAAA,EACZ,GAAG,CAAC,cAAc,OAAO,CAAC;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,MAChD,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,uDAAC,SAAI,WAAU,2BACb;AAAA,wDAAC,UAAK,WAAU,kEACb,iBACH;AAAA,UACC,QAAQ,KACP,8CAAC,SAAM,MAAK,MAAK,SAAQ,UACtB,iBACH;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,UAAU;AAAA,cACpB,WAAU;AAAA,cAET;AAAA;AAAA,UACH;AAAA,WACF;AAAA,QACC,OAAO,IAAI,CAAC,UACX;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,UAAU,UAAU,MAAM,EAAE,KAAK,CAAC;AAAA,YAClC,QAAQ,SAAS,MAAM,EAAE;AAAA,YACzB,UAAU;AAAA;AAAA,UAJL,MAAM;AAAA,QAKb,CACD;AAAA;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,YAAY,cAAc;AAS1B,SAAS,iBAAiB,EAAE,OAAO,UAAU,QAAQ,SAAS,GAA0B;AACtF,QAAM,cAAc,MAAM,eAAe;AACzC,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,MAAM,eAAe,IAAI;AAC1D,QAAM,SAAS,CAAC,eAAe;AAC/B,QAAM,gBAAgB,SAAS;AAE/B,QAAM,eACJ;AAEF,SACE,+CAAC,aAAQ,WAAU,uBAChB;AAAA,kBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAChC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAEA;AAAA,wDAAC,UAAK,WAAU,oBAAoB,gBAAM,OAAM;AAAA,UAC/C,gBAAgB,KACf,8CAAC,SAAM,MAAK,MAAK,SAAQ,WACtB,yBACH;AAAA,UAEF,8CAAC,UAAK,eAAW,MAAC,WAAU,0BACzB,mBAAS,WAAM,UAClB;AAAA;AAAA;AAAA,IACF,IAEA,+CAAC,SAAI,WAAW,GAAG,cAAc,eAAe,GAC9C;AAAA,oDAAC,UAAK,WAAU,UAAU,gBAAM,OAAM;AAAA,MACrC,gBAAgB,KACf,8CAAC,SAAM,MAAK,MAAK,SAAQ,WACtB,yBACH;AAAA,OAEJ;AAAA,IAED,UACC,8CAAC,QAAG,WAAU,6CACX,gBAAM,QAAQ,IAAI,CAAC,WAAW;AAC7B,YAAM,aAAa,SAAS,SAAS,OAAO,KAAK;AACjD,YAAM,QAAQ,SAAS,OAAO,KAAK;AACnC,aACE,+CAAC,QAAsB,WAAU,yCAC/B;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,iBAAiB,CAAC,SAAS,SAAS,MAAM,IAAI,OAAO,OAAO,SAAS,IAAI;AAAA,YACzE,OAAO,OAAO;AAAA;AAAA,QAChB;AAAA,QACC,OAAO,UAAU,YAChB,8CAAC,UAAK,WAAU,4DACb,iBACH;AAAA,WATK,OAAO,KAWhB;AAAA,IAEJ,CAAC,GACH;AAAA,KAEJ;AAEJ;;;AC/NA,IAAAC,iBAAgE;;;ACAhE,IAAAC,iBAAgE;AAuExD,IAAAC,uBAAA;AAzCR,IAAM,kBAA8C;AAAA,EAClD,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAEO,IAAM,qBAAiB;AAAA,EAC5B,SAASC,gBACP;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,GAAG;AAAA,EACL,GACA,KACA;AACA,UAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AAChD,UAAM,MAAM,MAAM,IAAK,UAAU,MAAO,MAAM;AAC9C,UAAM,KAAK,OAAO,aAAa;AAC/B,UAAM,IAAI,IAAI,KAAK,KAAK;AACxB,UAAM,OAAQ,MAAM,MAAO;AAC3B,UAAM,eAA2B,SAAS,WAAW,MAAM,OAAO;AAElE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe,KAAK,MAAM,GAAG;AAAA,QAC7B,cAAY,aAAa,GAAG,KAAK,MAAM,GAAG,CAAC;AAAA,QAC3C,WAAW,GAAG,2CAA2C,SAAS;AAAA,QAClE,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,QAClC,GAAG;AAAA,QAEJ;AAAA,yDAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAS,OAAO,IAAI,IAAI,IAAI,IAC1D;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,OAAO;AAAA,gBACX,IAAI,OAAO;AAAA,gBACX;AAAA,gBACA,MAAK;AAAA,gBACL,aAAa;AAAA,gBACb,WAAU;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI,OAAO;AAAA,gBACX,IAAI,OAAO;AAAA,gBACX;AAAA,gBACA,MAAK;AAAA,gBACL,aAAa;AAAA,gBACb,eAAc;AAAA,gBACd,iBAAiB,GAAG,IAAI,IAAI,CAAC;AAAA,gBAC7B,WAAW,cAAc,OAAO,CAAC,IAAI,OAAO,CAAC;AAAA,gBAC7C,WAAW;AAAA,kBACT;AAAA,kBACA,gBAAgB,YAAY;AAAA,gBAC9B;AAAA;AAAA,YACF;AAAA,aACF;AAAA,UACA,8CAAC,SAAI,WAAU,2FACZ,sBAAY,GAAG,KAAK,MAAM,GAAG,CAAC,KACjC;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;;;ADZvB,IAAAC,uBAAA;AA7CN,SAAS,UAAU,OAA2B;AAC5C,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,QAAQ,EAAG,QAAO;AACtB,SAAO;AACT;AAEA,SAAS,WAAW,OAAe;AACjC,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI,QAAQ,EAAG,QAAO;AACtB,SAAO;AACT;AAEA,IAAM,gBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AACP;AAEO,IAAM,kBAAc,2BAA6C,SAASC,aAC/E;AAAA,EACE;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACL,GACA,KACA;AACA,QAAM,MAAM,MAAM,IAAI,KAAK,MAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC,IAAI,MAAO,GAAG,IAAI;AACpF,QAAM,eAA2B,SAAS,OAAO,KAAK,OAAO,OAAO,KAAK,WAAW;AACpF,QAAM,gBAAgB,OAAO,UAAU,WAAW,UAAU,KAAK,IAAI;AAErE,QAAM,OACJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,2CAA2C,SAAS;AAAA,MAClE,cAAY,aAAa,GAAG,GAAG;AAAA,MAC9B,GAAG;AAAA,MAEJ;AAAA,sDAAC,kBAAe,OAAc,KAAU,MAAY,MAAM,cAAc;AAAA,QACvE,SAAS,8CAAC,SAAI,WAAU,kDAAkD,iBAAM;AAAA,QAChF,OAAO,UAAU,YAChB,+CAAC,SAAI,WAAW,GAAG,sCAAsC,cAAc,aAAa,CAAC,GACnF;AAAA,wDAAC,UAAK,eAAW,MAAE,qBAAW,KAAK,GAAE;AAAA,UAAO;AAAA,UAAE,KAAK,IAAI,KAAK;AAAA,WAC9D;AAAA;AAAA;AAAA,EAEJ;AAGF,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,8CAAC,UAAK,WAAU,eAAe,gBAAK;AAAA,MAC7C,SACE,+CAAC,SAAI,WAAU,qCACb;AAAA,sDAAC,SAAI,WAAU,iEAAgE,uBAE/E;AAAA,QACA,8CAAC,QAAG,WAAU,qDACX,oBAAU,IAAI,CAAC,OAAO,MACrB,+CAAC,QAAW,WAAU,2BACpB;AAAA,wDAAC,UAAK,WAAU,mCAAmC,gBAAM,OAAM;AAAA,UAC/D;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,MAAM,OAAO,cAAc,MAAM,IAAI,IAAI;AAAA,cAC3C;AAAA,cAEC,gBAAM;AAAA;AAAA,UACT;AAAA,aATO,CAUT,CACD,GACH;AAAA,SACF;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,YAAY,cAAc;;;AEtI1B,mBAA8B;AAC9B,IAAAC,iBAAoD;AAkBhD,IAAAC,uBAAA;AALG,IAAM,cAAU,2BAAsD,SAASC,SACpF,EAAE,WAAW,GAAG,MAAM,GACtB,KACA;AACA,SACE;AAAA,IAAc;AAAA,IAAb;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,QAAQ,cAAc;AAEf,IAAM,cAA8D;AAEpE,IAAM,qBAAiB;AAAA,EAC5B,SAASC,gBAAe,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AACpD,WACE;AAAA,MAAc;AAAA,MAAb;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;AAEtB,IAAM,qBAAiB;AAAA,EAC5B,SAASC,gBAAe,EAAE,WAAW,aAAa,GAAG,QAAQ,SAAS,GAAG,MAAM,GAAG,KAAK;AACrF,WACE,8CAAc,qBAAb,EACC;AAAA,MAAc;AAAA,MAAb;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAEA,eAAe,cAAc;AAE7B,IAAMC,YAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF;AASO,IAAM,kBAAc,2BAA6C,SAASC,aAC/E,EAAE,UAAU,aAAa,WAAW,UAAU,GAAG,MAAM,GACvD,KACA;AACA,SACE;AAAA,IAAc;AAAA,IAAb;AAAA,MACC;AAAA,MACA,WAAW,GAAGD,WAAU,cAAc,aAAa,aAAa,SAAS;AAAA,MACxE,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,WAAU,UAAU,UAAS;AAAA,QAClC,YAAY,8CAAC,UAAK,WAAU,uCAAuC,oBAAS;AAAA;AAAA;AAAA,EAC/E;AAEJ,CAAC;AAED,YAAY,cAAc;AAEnB,IAAM,uBAAmB;AAAA,EAC9B,SAASE,kBAAiB,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AACtD,WACE;AAAA,MAAc;AAAA,MAAb;AAAA,QACC;AAAA,QACA,WAAW,GAAG,uBAAuB,SAAS;AAAA,QAC7C,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;;;ACvH/B,eAA0B;AAC1B,IAAAC,iBASO;;;ACVP,IAAAC,iBAOO;AAoBH,IAAAC,uBAAA;AALG,IAAM,cAAU,2BAAsC,SAASC,SACpE,EAAE,QAAQ,KAAK,WAAW,OAAO,GAAG,MAAM,GAC1C,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,OAAO,GAAG,MAAM;AAAA,MACzB,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,QAAQ,cAAc;AAqBf,IAAM,cAAU;AAAA,EACrB,SAASC,SAAQ,EAAE,MAAM,OAAO,QAAQ,OAAO,MAAM,UAAU,WAAW,GAAG,MAAM,GAAG,KAAK;AACzF,UAAM,QACJ,gFACG;AAAA,cACC,8CAAC,UAAK,eAAW,MAAC,WAAU,mCACzB,gBACH;AAAA,MAEF,8CAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA,MACxC,SAAS,QACR;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA,SAAS,6BAA6B;AAAA,UACxC;AAAA,UAEC;AAAA;AAAA,MACH;AAAA,OAEJ;AAEF,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,8BAA8B;AAAA,MACvC,YAAY;AAAA,MACZ;AAAA,IACF;AACA,QAAI,MAAM;AACR,YAAM,cAAc;AACpB,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,gBAAc,SAAS,SAAS;AAAA,UAChC,iBAAe,YAAY;AAAA,UAC3B,WAAW;AAAA,UACV,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA,IAEJ;AAGA,UAAM,cAAc;AACpB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,gBAAc,SAAS,SAAS;AAAA,QAChC;AAAA,QACA,WAAW,GAAG,WAAW,kBAAkB;AAAA,QAC1C,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,QAAQ,cAAc;AA4Bf,IAAM,iBAAa,2BAA4C,SAASC,YAC7E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,eAAe,SAAS;AAC9B,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,WAAW;AAK5D,QAAM,SAAS,CAAC,gBAAgB,eAAe,OAAO;AAEtD,QAAM,aAAS,4BAAY,MAAM;AAC/B,UAAM,OAAO,CAAC;AACd,QAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,QAAQ,cAAc,YAAY,CAAC;AAEvC,QAAM,eACJ;AAEF,SACE,+CAAC,SAAI,KAAU,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OACjE;AAAA,kBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QAEC;AAAA,kBAAQ,QACP,8CAAC,UAAK,eAAW,MAAC,WAAU,cACzB,gBACH;AAAA,UAEF,8CAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA,UACzC;AAAA,UACD,8CAAC,UAAK,eAAW,MAAC,WAAU,0BACzB,mBAAS,WAAM,UAClB;AAAA;AAAA;AAAA,IACF,IAEA,+CAAC,SAAI,WAAW,cACb;AAAA,cAAQ,QACP,8CAAC,UAAK,eAAW,MAAC,WAAU,cACzB,gBACH;AAAA,MAEF,8CAAC,UAAK,WAAU,UAAU,iBAAM;AAAA,MAC/B;AAAA,OACH;AAAA,IAED,UACC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,2BAA2B,SAAS,KAAK,6BAA6B;AAAA,QACpF,OAAO,SAAS,IAAI,EAAE,aAAa,OAAO,IAAI;AAAA,QAE7C;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ,CAAC;AAED,WAAW,cAAc;;;AD7GjB,IAAAC,uBAAA;AAjDR,SAAS,aAAa,MAAkB,UAAuC;AAC7E,MAAI,KAAK,OAAO,SAAU,QAAO;AACjC,SAAO,KAAK,UAAU,KAAK,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK;AAClE;AAEO,IAAM,aAAS,2BAAqC,SAASC,QAClE;AAAA,EACE,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,eAAe,UAAU;AAC/B,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAA6B,YAAY;AACnF,QAAM,WAAW,eAAe,QAAQ;AACxC,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAElD,QAAM,aAAS;AAAA,IACb,CAAC,OAAe;AACd,UAAI,CAAC,aAAc,kBAAiB,EAAE;AACtC,sBAAgB,EAAE;AAAA,IACpB;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,EAC9B;AAEA,QAAM,yBAAqB;AAAA,IACzB,CAAC,OAAe;AACd,aAAO,EAAE;AACT,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,QAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKJ,8CAAC,SAAI,cAAW,qBAAoB,WAAU,uBAC3C,gBAAM,IAAI,CAAC,SACV;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA,YAAY;AAAA;AAAA,MAHP,KAAK;AAAA,IAIZ,CACD,GACH;AAAA;AAQF,QAAM,YAAY,aAChB;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,IAAI;AAAA,YACjC,cAAW;AAAA,YACX,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QACC,SACC,8CAAC,SAAI,WAAU,sEACZ,iBACH;AAAA,QAED,WAAW,8CAAC,SAAI,WAAU,2BAA2B,mBAAQ;AAAA;AAAA;AAAA,EAChE,IACE;AAEJ,MAAI,gBAAgB,cAAc;AAChC,WACE,gFACG;AAAA;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,WAAW;AAAA,YACT;AAAA,YACA,cAAc;AAAA,YACd;AAAA,UACF;AAAA,UACC,GAAG;AAAA,UAEH;AAAA,qBACC,8CAAC,SAAI,WAAU,sDAAsD,iBAAM;AAAA,YAE7E,+CAAU,eAAT,EAAc,WAAU,mBAAkB,eAAe,KAKxD;AAAA,4DAAU,eAAT,EAAc,WAAU,4DACtB,gBAAM;AAAA,gBAAI,CAAC,SACV,KAAK,UAAU,SACb;AAAA,kBAAC;AAAA;AAAA,oBAEC;AAAA,oBACA,QAAQ,aAAa,MAAM,QAAQ;AAAA,oBACnC;AAAA,oBACA,YAAY;AAAA;AAAA,kBAJP,KAAK;AAAA,gBAKZ,IAEA,8CAAU,eAAT,EACC;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,QAAQ,KAAK,OAAO;AAAA,oBACpB,YAAY;AAAA;AAAA,gBACd,KALkB,KAAK,EAMzB;AAAA,cAEJ,GACF;AAAA,cACA,8CAAC,SAAI,WAAU,yDACb,wDAAU,mBAAT,EAAkB,WAAU,oFAAmF,GAClH;AAAA,eACF;AAAA,YACC,WAAW,8CAAC,SAAI,WAAU,2BAA2B,mBAAQ;AAAA;AAAA;AAAA,MAChE;AAAA,MACC,cACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,cAAc;AAAA,UACd,MAAK;AAAA,UACL,OAAO,SAAS;AAAA,UAChB,OAAO;AAAA,UAEN;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gFACG;AAAA;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QAKA,cAAW;AAAA,QACX,OAAO,EAAE,MAAM;AAAA,QACf,WAAW;AAAA,UACT;AAAA,UACA,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA,mBAAS,8CAAC,SAAI,WAAU,qCAAqC,iBAAM;AAAA,UACpE,8CAAC,SAAI,cAAW,sBAAqB,WAAU,8CAC5C,gBAAM,IAAI,CAAC,SACV;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA;AAAA,cACA,YAAY;AAAA;AAAA,YAHP,KAAK;AAAA,UAIZ,CACD,GACH;AAAA,UACC,WACC,8CAAC,SAAI,WAAU,2DAA2D,mBAAQ;AAAA;AAAA;AAAA,IAEtF;AAAA,IACC,cACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,MAAK;AAAA,QACL,OAAO,SAAS;AAAA,QAChB,OAAO;AAAA,QAEN;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ,CAAC;AAED,OAAO,cAAc;AAUrB,SAAS,eAAe,EAAE,MAAM,QAAQ,WAAW,GAAwB;AACzE,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,8BAA8B;AAAA,IACvC,KAAK,YAAY;AAAA,EACnB;AACA,QAAM,cAAc,CAAC,MAA+B;AAClD,QAAI,KAAK,UAAU;AACjB,QAAE,eAAe;AACjB;AAAA,IACF;AACA,eAAW,KAAK,EAAE;AAAA,EACpB;AACA,QAAM,QACJ,gFACG;AAAA,SAAK,QAAQ,QACZ,8CAAC,UAAK,eAAW,MAAC,WAAU,cACzB,eAAK,MACR;AAAA,IAEF,8CAAC,UAAM,eAAK,OAAM;AAAA,IACjB,KAAK,SAAS,QAAQ,8CAAC,aAAU,QAAiB,eAAK,OAAM;AAAA,KAChE;AAGF,MAAI,KAAK,MAAM;AACb,WACE,8CAAU,eAAT,EAAc,SAAO,MAAC,QACrB;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,gBAAc,SAAS,SAAS;AAAA,QAChC,iBAAe,KAAK,YAAY;AAAA,QAChC,WAAW;AAAA,QACX,SAAS;AAAA,QAER;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACA,SACE,8CAAU,eAAT,EAAc,SAAO,MAAC,QACrB;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,gBAAc,SAAS,SAAS;AAAA,MAChC,UAAU,KAAK;AAAA,MACf,WAAW;AAAA,MACX,SAAS;AAAA,MAER;AAAA;AAAA,EACH,GACF;AAEJ;AASA,SAAS,mBAAmB,EAAE,MAAM,QAAQ,UAAU,WAAW,GAA4B;AAC3F,SACE,+CAAU,eAAT,EACC;AAAA;AAAA,MAAU;AAAA,MAAT;AAAA,QAKC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,8BAA8B;AAAA,UACvC;AAAA,QACF;AAAA,QACA,UAAU,KAAK;AAAA,QAEd;AAAA,eAAK,QAAQ,QACZ,8CAAC,UAAK,eAAW,MAAC,WAAU,cACzB,eAAK,MACR;AAAA,UAEF,8CAAC,UAAM,eAAK,OAAM;AAAA,UAClB;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,cACX,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IACF;AAAA,IACA,8CAAU,kBAAT,EAAiB,WAAU,wEAC1B,wDAAC,QAAG,WAAU,4DACX,eAAK,SAAU,IAAI,CAAC,UACnB,8CAAC,QACC,wDAAC,gBAAa,MAAM,OAAO,QAAQ,MAAM,OAAO,UAAU,YAAwB,KAD3E,MAAM,EAEf,CACD,GACH,GACF;AAAA,KACF;AAEJ;AAEA,SAAS,aAAa,EAAE,MAAM,QAAQ,WAAW,GAAwB;AACvE,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,SAAS,8BAA8B;AAAA,IACvC,KAAK,YAAY;AAAA,EACnB;AACA,QAAM,cAAc,CAAC,MAA+B;AAClD,QAAI,KAAK,UAAU;AACjB,QAAE,eAAe;AACjB;AAAA,IACF;AACA,eAAW,KAAK,EAAE;AAAA,EACpB;AACA,QAAM,QACJ,gFACG;AAAA,SAAK,QAAQ,QACZ,8CAAC,UAAK,eAAW,MAAC,WAAU,cACzB,eAAK,MACR;AAAA,IAEF,8CAAC,UAAK,WAAU,UAAU,eAAK,OAAM;AAAA,IACpC,KAAK,SAAS,QAAQ,8CAAC,aAAU,QAAiB,eAAK,OAAM;AAAA,KAChE;AAEF,MAAI,KAAK,MAAM;AACb,WACE,8CAAU,eAAT,EAAc,SAAO,MAAC,QACrB;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,gBAAc,SAAS,SAAS;AAAA,QAChC,iBAAe,KAAK,YAAY;AAAA,QAChC,WAAW;AAAA,QACX,SAAS;AAAA,QAER;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACA,SACE,8CAAU,eAAT,EAAc,SAAO,MAAC,QACrB;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,gBAAc,SAAS,SAAS;AAAA,MAChC,UAAU,KAAK;AAAA,MACf,WAAW;AAAA,MACX,SAAS;AAAA,MAER;AAAA;AAAA,EACH,GACF;AAEJ;AAQA,SAAS,aAAa,EAAE,MAAM,UAAU,WAAW,GAAsB;AACvE,QAAM,eAAe,KAAK,UAAU,UAAU,KAAK;AACnD,QAAM,aAAa,aAAa,MAAM,QAAQ;AAG9C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,UAAU;AAQ3C,QAAM,qBAAiB,uBAAO,UAAU;AACxC,gCAAU,MAAM;AACd,QAAI,cAAc,CAAC,eAAe,QAAS,SAAQ,IAAI;AACvD,mBAAe,UAAU;AAAA,EAC3B,GAAG,CAAC,UAAU,CAAC;AAEf,MAAI,CAAC,aAAa;AAChB,UAAM,cAAc,CAAC,MAA+B;AAElD,UAAI,KAAK,UAAU;AACjB,UAAE,eAAe;AACjB;AAAA,MACF;AACA,iBAAW,KAAK,EAAE;AAAA,IACpB;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,QACX,SAAS;AAAA;AAAA,IACX;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,WAAU,iBACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,SAAS,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;AAAA,QAChC,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,cAAc;AAAA,UAC3B;AAAA,UACA,KAAK,YAAY;AAAA,QACnB;AAAA,QAEC;AAAA,eAAK,QAAQ,QACZ,8CAAC,UAAK,eAAW,MAAC,WAAU,mCACzB,eAAK,MACR;AAAA,UAEF,8CAAC,UAAK,WAAU,mBAAmB,eAAK,OAAM;AAAA,UAC7C,KAAK,SAAS,QAAQ,8CAAC,aAAU,QAAQ,YAAa,eAAK,OAAM;AAAA,UAClE,8CAAC,UAAK,eAAW,MAAC,WAAU,0BACzB,iBAAO,WAAM,UAChB;AAAA;AAAA;AAAA,IACF;AAAA,IACC,QACC,8CAAC,SAAI,WAAU,sEACZ,eAAK,SAAU,IAAI,CAAC,UACnB,8CAAC,gBAA4B,MAAM,OAAO,UAAoB,cAA3C,MAAM,EAA6D,CACvF,GACH;AAAA,KAEJ;AAEJ;AAEA,SAAS,UAAU,EAAE,QAAQ,SAAS,GAA6C;AACjF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,SAAS,6BAA6B;AAAA,MACxC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AE5hBA,IAAAC,iBAAgE;AAoExD,IAAAC,uBAAA;AA9BR,IAAM,YAAiE;AAAA,EACrE,SAAS;AAAA,EACT,eAAe;AAAA,EACf,MAAM;AACR;AAEA,IAAM,kBAAwD;AAAA,EAC5D,SAAS;AAAA,EACT,eAAe;AAAA,EACf,MAAM;AACR;AAEO,IAAM,0BAAsB;AAAA,EACjC,SAASC,qBACP,EAAE,OAAO,aAAa,QAAQ,eAAe,eAAe,cAAc,WAAW,GAAG,MAAM,GAC9F,KACA;AACA,UAAM,QAAQ,MAAM;AACpB,UAAM,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAEtD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,QAChD,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,yDAAC,YAAO,WAAU,2BAChB;AAAA,0DAAC,UAAK,WAAU,2BAA2B,iBAAM;AAAA,YACjD,8CAAC,UAAK,WAAU,4DACb,2BAAiB,GAAG,IAAI,OAAO,KAAK,aACvC;AAAA,aACF;AAAA,UACC,CAAC,gBAAgB,QAAQ,KACxB;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,iBAAe;AAAA,cACf,cAAY,OAAO,UAAU,WAAW,GAAG,KAAK,cAAc;AAAA,cAC9D,WAAU;AAAA,cAEV;AAAA,gBAAC;AAAA;AAAA,kBACC,eAAW;AAAA,kBACX,WAAW;AAAA,oBACT;AAAA,oBACA,SAAS,QAAQ,UAAU;AAAA,kBAC7B;AAAA,kBACA,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAK,OAAO,QAAS,MAAM,CAAC,IAAI;AAAA;AAAA,cAC7D;AAAA;AAAA,UACF;AAAA,UAEF,8CAAC,QAAG,WAAU,yCACX,gBAAM,IAAI,CAAC,SAAS;AACnB,kBAAM,cAAc,OAAO,gBAAgB;AAC3C,kBAAM,aACJ,gFACE;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO,UAAU,KAAK,MAAM;AAAA,kBAC5B,OAAO,KAAK,WAAW;AAAA,kBACvB,MAAM;AAAA,kBACN,WAAU;AAAA;AAAA,cACZ;AAAA,cACA,+CAAC,SAAI,WAAU,0CACb;AAAA,8DAAC,UAAK,WAAW,GAAG,eAAe,gBAAgB,KAAK,MAAM,CAAC,GAC5D,eAAK,OACR;AAAA,gBACC,KAAK,eACJ,8CAAC,UAAK,WAAU,8CACb,eAAK,aACR;AAAA,iBAEJ;AAAA,eACF;AAEF,kBAAM,mBAAmB;AAAA,cACvB;AAAA,cACA,eACE;AAAA,YACJ;AAIA,mBACE,+CAAC,QAAiB,WAAU,0BACzB;AAAA,4BACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,gBAAc,KAAK,WAAW,gBAAgB,SAAS;AAAA,kBACvD,SAAS,MAAM,YAAY,KAAK,EAAE;AAAA,kBAClC,WAAW;AAAA,kBAEV;AAAA;AAAA,cACH,IAEA,8CAAC,SAAI,WAAW,kBAAmB,sBAAW;AAAA,cAE/C,KAAK,UAAU,8CAAC,SAAI,WAAU,wBAAwB,eAAK,QAAO;AAAA,iBAb5D,KAAK,EAcd;AAAA,UAEJ,CAAC,GACH;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,oBAAoB,cAAc;;;ACpJlC,IAAAC,iBAAgD;AA6C5C,IAAAC,uBAAA;AArBJ,SAAS,WAAW,MAAc,OAAe,UAA8B;AAC7E,MAAI,SAAS,EAAG,QAAO,CAAC;AACxB,QAAM,QAAoB,CAAC;AAC3B,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,QAAQ;AACxC,QAAM,QAAQ,KAAK,IAAI,QAAQ,GAAG,OAAO,QAAQ;AAEjD,QAAM,KAAK,CAAC;AACZ,MAAI,OAAO,EAAG,OAAM,KAAK,gBAAgB;AACzC,WAAS,IAAI,MAAM,KAAK,OAAO,IAAK,OAAM,KAAK,CAAC;AAChD,MAAI,QAAQ,QAAQ,EAAG,OAAM,KAAK,cAAc;AAChD,MAAI,QAAQ,EAAG,OAAM,KAAK,KAAK;AAC/B,SAAO;AACT;AAEO,IAAM,iBAAa,2BAAyC,SAASC,YAC1E,EAAE,MAAM,OAAO,cAAc,WAAW,GAAG,WAAW,GAAG,MAAM,GAC/D,KACA;AACA,QAAM,QAAQ,WAAW,MAAM,OAAO,QAAQ;AAE9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAW;AAAA,MACX,WAAW,GAAG,kCAAkC,SAAS;AAAA,MACxD,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU,QAAQ;AAAA,YAClB,SAAS,MAAM,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA;AAAA,QACnD;AAAA,QACC,MAAM,IAAI,CAAC,MAAM,MAAM;AACtB,cAAI,SAAS,oBAAoB,SAAS,gBAAgB;AACxD,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,eAAW;AAAA,gBACX,WAAU;AAAA,gBACX;AAAA;AAAA,cAHM,YAAY,CAAC;AAAA,YAKpB;AAAA,UAEJ;AACA,gBAAM,WAAW,SAAS;AAC1B,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,cAAY,cAAc,IAAI;AAAA,cAC9B,gBAAc,WAAW,SAAS;AAAA,cAClC,SAAS,MAAM,aAAa,IAAI;AAAA,cAChC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,WACI,mDACA;AAAA,cACN;AAAA,cAEC;AAAA;AAAA,YAdI;AAAA,UAeP;AAAA,QAEJ,CAAC;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,cAAW;AAAA,YACX,UAAU,QAAQ;AAAA,YAClB,SAAS,MAAM,aAAa,KAAK,IAAI,OAAO,OAAO,CAAC,CAAC;AAAA;AAAA,QACvD;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,WAAW,cAAc;;;ACxGzB,IAAAC,oCAAuC;AACvC,IAAAC,iBAAgE;AA0EtD,IAAAC,uBAAA;AA9DV,IAAM,kBAAc,uCAAI,kDAAkD;AAAA,EACxE,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,MAAM,KAAK;AAChC,CAAC;AAED,IAAM,iBAAa,uCAAI,qEAAqE;AAAA,EAC1F,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EACA,iBAAiB,EAAE,MAAM,SAAS;AACpC,CAAC;AAmBM,IAAM,eAAW,2BAA0C,SAASC,UACzE;AAAA,EACE,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AAChD,QAAM,MAAM,MAAM,IAAK,UAAU,MAAO,MAAM;AAC9C,QAAM,UAAU,KAAK,MAAM,GAAG;AAE9B,SACE,+CAAC,SAAI,KAAU,WAAW,GAAG,8BAA8B,SAAS,GAAI,GAAG,OACxE;AAAA,aAAS,QACR,+CAAC,SAAI,WAAU,oBACb;AAAA,oDAAC,UAAK,WAAU,mBAAmB,iBAAM;AAAA,MACxC,aAAa,CAAC,iBACb,+CAAC,UAAK,WAAU,4CAA4C;AAAA;AAAA,QAAQ;AAAA,SAAC;AAAA,OAEzE;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe,gBAAgB,SAAY;AAAA,QAC3C,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,QAChD,WAAW,YAAY,EAAE,KAAK,CAAC;AAAA,QAE9B,0BACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAW;AAAA,cACT;AAAA,cACA,WAAW,EAAE,KAAK,CAAC;AAAA,cACnB;AAAA,YACF;AAAA;AAAA,QACF,IAEA,8CAAC,UAAK,eAAW,MAAC,WAAW,WAAW,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,OAAO,GAAG,GAAG,IAAI,GAAG;AAAA;AAAA,IAEpF;AAAA,KACF;AAEJ,CAAC;AAED,SAAS,cAAc;;;AC1GvB,IAAAC,iBAAwD;AAqEpD,IAAAC,uBAAA;AApCJ,SAAS,UAAU,QAA+B,GAAW,GAAW;AACtE,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,MAAM,IAAI,MAAM,GAAG;AACrD,QAAM,MAAM;AACZ,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,QAAQ,MAAM,OAAO;AAC3B,QAAM,QAAQ,OAAO,WAAW,IAAI,KAAK,IAAI,MAAM,MAAM,OAAO,SAAS;AACzE,QAAM,SAAS,OAAO,IAAI,CAAC,GAAG,MAAM;AAClC,UAAM,IAAI,MAAM,IAAI;AACpB,UAAM,IAAI,OAAO,KAAK,IAAI,OAAO,UAAU,IAAI,MAAM;AACrD,WAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,CAAC;AACD,QAAM,OAAO,IAAI,OAAO,KAAK,IAAI,CAAC;AAClC,QAAM,OAAO,GAAG,IAAI,MAAM,OAAO,OAAO,SAAS,KAAK,OAAO,QAAQ,CAAC,CAAC,KAAK,IAAI,KAAK;AAAA,IACnF;AAAA,EACF,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC5C,SAAO,EAAE,MAAM,KAAK;AACtB;AAEO,IAAM,gBAAY,2BAA0C,SAASC,WAC1E;AAAA,EACE;AAAA,EACA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B,GAAG;AACL,GACA,KACA;AACA,QAAM,EAAE,MAAM,KAAK,QAAI,wBAAQ,MAAM,UAAU,QAAQ,OAAO,MAAM,GAAG,CAAC,QAAQ,OAAO,MAAM,CAAC;AAE9F,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,OAAO,KAAK,IAAI,MAAM;AAAA,MAC/B,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAW,GAAG,gBAAgB,SAAS;AAAA,MACtC,GAAG;AAAA,MAEH;AAAA,gBAAQ,8CAAC,UAAK,GAAG,MAAM,MAAM,QAAQ,aAAa,MAAM,QAAO,QAAO;AAAA,QACvE;AAAA,UAAC;AAAA;AAAA,YACC,GAAG;AAAA,YACH,MAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,eAAc;AAAA,YACd,gBAAe;AAAA;AAAA,QACjB;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAED,UAAU,cAAc;;;AC5FxB,IAAAC,iBAAgD;AA+B1C,IAAAC,uBAAA;AAzBN,IAAM,QAAQ;AAAA,EACZ,IAAI,EAAE,KAAK,WAAW,QAAQ,eAAe;AAAA,EAC7C,IAAI,EAAE,KAAK,WAAW,QAAQ,eAAe;AAAA,EAC7C,IAAI,EAAE,KAAK,WAAW,QAAQ,eAAe;AAC/C;AAQO,IAAMC,eAAU,2BAA0C,SAASA,SACxE,EAAE,OAAO,MAAM,QAAQ,WAAW,WAAW,GAAG,MAAM,GACtD,KACA;AACA,QAAM,IAAI,MAAM,IAAI;AACpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,WAAW,GAAG,gBAAgB,SAAS;AAAA,MACtC,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,eAAW;AAAA,UACX,WAAW;AAAA,YACT;AAAA,YACA,EAAE;AAAA,YACF,EAAE;AAAA,UACJ;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ,CAAC;AAEDA,SAAQ,cAAc;;;AC3CtB,IAAAC,iBAA0D;AAgE9C,IAAAC,uBAAA;AAvCZ,IAAM,UACJ;AAEF,IAAM,gBAA2C;AAAA,EAC/C,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AACZ;AAEA,IAAMC,mBAA6C;AAAA,EACjD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AACZ;AAEA,SAAS,SAAS,OAAe,SAA4B;AAC3D,MAAI,QAAQ,QAAS,QAAO;AAC5B,MAAI,UAAU,QAAS,QAAO;AAC9B,SAAO;AACT;AAEO,IAAM,cAAU,2BAA2C,SAASC,SACzE,EAAE,OAAO,SAAS,WAAW,GAAG,MAAM,GACtC,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAW;AAAA,MACX,WAAW,GAAG,8CAA8C,SAAS;AAAA,MACpE,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,MAAM,MAAM;AACtB,cAAM,QAAQ,OAAO,SAAS,WAAW,OAAO,KAAK;AACrD,cAAM,KAAK,OAAO,SAAS,WAAW,SAAY,KAAK;AACvD,cAAM,QAAQ,SAAS,GAAG,OAAO;AACjC,cAAM,kBAAkB,IAAI;AAC5B,eACE,+CAAC,2BACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,gBAAc,UAAU,YAAY,SAAS;AAAA,cAC7C,WAAU;AAAA,cAEV;AAAA,8DAAC,UAAK,eAAW,MAAC,WAAW,GAAG,SAAS,cAAc,KAAK,CAAC,GAC1D,oBAAU,SAAS,WAAM,IAAI,GAChC;AAAA,gBACA,8CAAC,UAAK,WAAW,GAAG,eAAeD,iBAAgB,KAAK,CAAC,GAAI,iBAAM;AAAA;AAAA;AAAA,UACrE;AAAA,UACC,IAAI,MAAM,SAAS,KAClB;AAAA,YAAC;AAAA;AAAA,cACC,eAAW;AAAA,cACX,WAAW,GAAG,oBAAoB,kBAAkB,cAAc,WAAW;AAAA;AAAA,UAC/E;AAAA,aAdW,MAAM,CAgBrB;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,QAAQ,cAAc;;;ACtFtB,gBAA2B;AAC3B,IAAAE,oCAAuC;AACvC,IAAAC,iBAAsE;AA4DhE,IAAAC,uBAAA;AA5CN,IAAM,yBAAqB,8BAA2B,WAAW;AAEjE,IAAM,qBAAiB,uCAAI,IAAI;AAAA,EAC7B,UAAU;AAAA,IACR,SAAS;AAAA,MACP,WAAW;AAAA,MACX,MAAM;AAAA,IACR;AAAA,EACF;AACF,CAAC;AAED,IAAM,wBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAOO,IAAM,WAAO,2BAAsC,SAASC,MACjE,EAAE,UAAU,aAAa,WAAW,GAAG,MAAM,GAC7C,KACA;AACA,SACE,8CAAC,mBAAmB,UAAnB,EAA4B,OAAO,SAClC;AAAA,IAAW;AAAA,IAAV;AAAA,MACC;AAAA,MACA,WAAW,GAAG,iBAAiB,YAAY,eAAe,SAAS,SAAS;AAAA,MAC3E,GAAG;AAAA;AAAA,EACN,GACF;AAEJ,CAAC;AAED,KAAK,cAAc;AAEZ,IAAM,eAAW,2BAAoD,SAASC,UACnF,EAAE,WAAW,GAAG,MAAM,GACtB,KACA;AACA,QAAM,cAAU,2BAAW,kBAAkB;AAC7C,SACE,8CAAW,gBAAV,EAAe,KAAU,WAAW,GAAG,eAAe,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAI,GAAG,OAAO;AAEhG,CAAC;AAED,SAAS,cAAc;AAMhB,IAAM,UAAM,2BAAwC,SAASC,KAClE,EAAE,WAAW,GAAG,MAAM,GACtB,KACA;AACA,QAAM,cAAU,2BAAW,kBAAkB;AAC7C,SACE;AAAA,IAAW;AAAA,IAAV;AAAA,MACC;AAAA,MACA,WAAW,GAAG,kBAAkB,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MACtD,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,IAAI,cAAc;AAEX,IAAM,kBAAc;AAAA,EACzB,SAASC,aAAY,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK;AACjD,WACE;AAAA,MAAW;AAAA,MAAV;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;;;ACxH1B,IAAAC,iBAAgE;AAkDpD,IAAAC,uBAAA;AAxBZ,IAAM,YAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AACT;AAEO,IAAM,eAAW,2BAA4C,SAASC,UAC3E,EAAE,QAAQ,WAAW,UAAU,GAAG,MAAM,GACxC,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,mBACG,OAAO,IAAI,CAAC,GAAG,MACb,8CAAC,gBAAqB,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,aAAa,EAAE,aAC9D,YAAE,SADc,CAEnB,CACD,IACD;AAAA;AAAA,EACN;AAEJ,CAAC;AAED,SAAS,cAAc;AAQhB,IAAM,mBAAe,2BAA6C,SAASC,cAChF,EAAE,OAAO,UAAU,aAAa,MAAM,WAAW,UAAU,GAAG,MAAM,GACpE,KACA;AACA,SACE,+CAAC,QAAG,KAAU,WAAW,GAAG,gCAAgC,SAAS,GAAI,GAAG,OAC1E;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA,UAAU,IAAI;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,IACA,8CAAC,SAAI,WAAU,2BAA2B,UAAS;AAAA,IAClD,eAAe,8CAAC,SAAI,WAAU,+BAA+B,uBAAY;AAAA,IACzE,QAAQ,8CAAC,SAAI,WAAU,gDAAgD,gBAAK;AAAA,KAC/E;AAEJ,CAAC;AAED,aAAa,cAAc;;;ACvF3B,IAAAC,iBAAgE;;;ACUhE,IAAM,SAAS;AACf,IAAM,SAAS,KAAK;AACpB,IAAM,OAAO,KAAK;AAClB,IAAM,MAAM,KAAK;AACjB,IAAM,OAAO,IAAI;AACjB,IAAM,QAAQ,KAAK;AACnB,IAAM,OAAO,MAAM;AAOnB,IAAM,QAA6B;AAAA,EACjC,EAAE,IAAI,MAAM,OAAO,IAAI;AAAA,EACvB,EAAE,IAAI,OAAO,OAAO,KAAK;AAAA,EACzB,EAAE,IAAI,MAAM,OAAO,IAAI;AAAA,EACvB,EAAE,IAAI,KAAK,OAAO,IAAI;AAAA,EACtB,EAAE,IAAI,MAAM,OAAO,IAAI;AAAA,EACvB,EAAE,IAAI,QAAQ,OAAO,IAAI;AAAA,EACzB,EAAE,IAAI,QAAQ,OAAO,IAAI;AAC3B;AAEO,SAAS,eAAe,OAA+B,MAAY,oBAAI,KAAK,GAAW;AAC5F,QAAM,SAAS,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAK;AAC7D,MAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,EAAG,QAAO;AAE3C,QAAM,SAAS,IAAI,QAAQ,IAAI,OAAO,QAAQ;AAC9C,QAAM,MAAM,KAAK,IAAI,MAAM;AAC3B,MAAI,MAAM,IAAI,OAAQ,QAAO;AAE7B,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,KAAK,IAAI;AAClB,YAAM,IAAI,KAAK,MAAM,MAAM,KAAK,EAAE;AAClC,aAAO,UAAU,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK,SAAS,MAAM,CAAC,GAAG,KAAK,KAAK;AAAA,IACrE;AAAA,EACF;AACA,SAAO;AACT;;;ADqBc,IAAAC,uBAAA;AA1Bd,IAAMC,aAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AACT;AAEO,IAAM,uBAAmB;AAAA,EAC9B,SAASC,kBAAiB,EAAE,QAAQ,aAAa,WAAW,GAAG,MAAM,GAAG,KAAK;AAC3E,UAAM,MAAM,eAAe,oBAAI,KAAK;AACpC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH,iBAAO,IAAI,CAAC,UAAU;AACrB,gBAAM,OAAO,MAAM,QAAQ;AAC3B,gBAAM,OAAO,eAAe,MAAM,IAAI,GAAG;AACzC,iBACE,+CAAC,QAAkB,WAAU,2BAC3B;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,eAAW;AAAA,gBACX,WAAW;AAAA,kBACT;AAAA,kBACAD,WAAU,IAAI;AAAA,gBAChB;AAAA;AAAA,YACF;AAAA,YACA,+CAAC,SAAI,WAAU,6BACZ;AAAA,oBAAM,QACL,8CAAC,UAAK,eAAW,MAAC,WAAU,yCACzB,gBAAM,MACT;AAAA,cAEF,8CAAC,SAAI,WAAU,2BAA2B,gBAAM,OAAM;AAAA,cACrD,QACC,8CAAC,UAAK,WAAU,+CAA+C,gBAAK;AAAA,eAExE;AAAA,YACC,MAAM,SACL,+CAAC,SAAI,WAAU,oEACZ;AAAA,oBAAM,MAAM,UACX,8CAAC,UAAK,eAAW,MAAC,WAAU,eACzB,gBAAM,MAAM,QACf;AAAA,cAEF,8CAAC,UAAM,gBAAM,MAAM,MAAK;AAAA,eAC1B;AAAA,YAED,MAAM,WACL,8CAAC,SAAI,WAAU,iGACZ,gBAAM,SACT;AAAA,eAhCK,MAAM,EAkCf;AAAA,QAEJ,CAAC;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,iBAAiB,cAAc;;;AE9G/B,IAAAE,iBAAgE;AAwB5D,IAAAC,uBAAA;AALG,IAAM,aAAS,2BAAqC,SAASC,QAClE,EAAE,OAAO,SAAS,SAAS,WAAW,UAAU,GAAG,MAAM,GACzD,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,SAAS,8CAAC,SAAI,WAAU,2BAA2B,iBAAM;AAAA,QAC1D,8CAAC,SAAI,WAAU,4BAA2B;AAAA,QACzC,WAAW,8CAAC,SAAI,WAAU,2BAA2B,mBAAQ;AAAA,QAC7D;AAAA;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,OAAO,cAAc;;;ACzCrB,IAAAC,iBAUO;AA4RC,IAAAC,uBAAA;AA7QR,IAAMC,aAAiC,oBAAI,IAAI;AAoC/C,SAAS,eACP,OACA,UACA,OACA,UACA,KACM;AACN,aAAW,QAAQ,OAAO;AACxB,UAAM,cAAc,CAAC,CAAC,KAAK,YAAY,KAAK,SAAS,SAAS;AAC9D,QAAI,KAAK,EAAE,IAAI,KAAK,IAAI,OAAO,aAAa,SAAS,CAAC;AACtD,QAAI,eAAe,SAAS,IAAI,KAAK,EAAE,GAAG;AACxC,qBAAe,KAAK,YAAY,CAAC,GAAG,UAAU,QAAQ,GAAG,KAAK,IAAI,GAAG;AAAA,IACvE;AAAA,EACF;AACF;AAEO,IAAM,WAAO,2BAAwC,SAASC,MACnE;AAAA,EACE;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,CAAC,UAAU,WAAW,IAAI,qBAA0C;AAAA,IACxE,OAAO;AAAA,IACP,cAAc,kBAAkB,IAAI,IAAI,eAAe,IAAI;AAAA,IAC3D,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAA6B;AAAA,IACrD,OAAO;AAAA,IACP;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,cAAc,YAAYD;AAEhC,QAAM,kBAAc,wBAAoB,MAAM;AAC5C,UAAM,MAAkB,CAAC;AACzB,mBAAe,OAAO,aAAa,GAAG,MAAM,GAAG;AAC/C,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,WAAW,CAAC;AAGvB,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB,IAAI;AAG5D,gCAAU,MAAM;AACd,QAAI,YAAY,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,GAAG;AAC3D,kBAAY,IAAI;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,UAAU,WAAW,CAAC;AAI1B,QAAM,gBAAY,wBAAuB,MAAM;AAC7C,QAAI,YAAY,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAG,QAAO;AACnE,QAAI,SAAS,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAG,QAAO;AAC7D,WAAO,YAAY,CAAC,GAAG,MAAM;AAAA,EAC/B,GAAG,CAAC,UAAU,aAAa,KAAK,CAAC;AAEjC,QAAM,cAAU,uBAAgC,IAAI;AACpD,QAAM,cAAU;AAAA,IACd,CAAC,SAAkC;AACjC,cAAQ,UAAU;AAClB,UAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,eAC9B,IAAK,CAAC,IAAwD,UAAU;AAAA,IACnF;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,gBAAY,4BAAY,CAAC,OAAe;AAC5C,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,KAAM;AACX,UAAM,KAAK,KAAK,cAA2B,sBAAsB,IAAI,OAAO,EAAE,CAAC,IAAI;AACnF,QAAI,MAAM;AAAA,EACZ,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa;AAAA,IACjB,CAAC,OAAe;AACd,kBAAY,EAAE;AAEd,qBAAe,MAAM,UAAU,EAAE,CAAC;AAAA,IACpC;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,aAAS;AAAA,IACb,CAAC,OAAe;AACd,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,IAAI,IAAI,QAAQA,UAAS;AACtC,YAAI,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AAAA,YAC3B,MAAK,IAAI,EAAE;AAChB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,aAAS;AAAA,IACb,CAAC,OAAe;AACd,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,QAAQA;AACrB,YAAI,KAAK,IAAI,EAAE,EAAG,QAAO;AACzB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,IAAI,EAAE;AACX,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,eAAW;AAAA,IACf,CAAC,OAAe;AACd,kBAAY,CAAC,SAAS;AACpB,cAAM,OAAO,QAAQA;AACrB,YAAI,CAAC,KAAK,IAAI,EAAE,EAAG,QAAO;AAC1B,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,OAAO,EAAE;AACd,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAC,OAAe;AACd,eAAS,EAAE;AAAA,IACb;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,oBAAgB;AAAA,IACpB,CAAC,MAA4C;AAC3C,kBAAY,CAAC;AACb,UAAI,EAAE,iBAAkB;AACxB,UAAI,YAAY,WAAW,EAAG;AAE9B,YAAM,YAAY;AAClB,YAAM,eAAe,YAAY,YAAY,UAAU,CAAC,MAAM,EAAE,OAAO,SAAS,IAAI;AACpF,YAAM,UAAU,gBAAgB,IAAI,YAAY,YAAY,IAAI;AAEhE,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK,aAAa;AAChB,YAAE,eAAe;AACjB,gBAAM,OAAO,YAAY,KAAK,IAAI,YAAY,SAAS,GAAG,eAAe,CAAC,CAAC;AAC3E,cAAI,KAAM,YAAW,KAAK,EAAE;AAC5B;AAAA,QACF;AAAA,QACA,KAAK,WAAW;AACd,YAAE,eAAe;AACjB,gBAAM,OAAO,YAAY,KAAK,IAAI,GAAG,eAAe,CAAC,CAAC;AACtD,cAAI,KAAM,YAAW,KAAK,EAAE;AAC5B;AAAA,QACF;AAAA,QACA,KAAK,cAAc;AACjB,cAAI,CAAC,QAAS;AACd,YAAE,eAAe;AACjB,cAAI,QAAQ,aAAa;AACvB,gBAAI,CAAC,YAAY,IAAI,QAAQ,EAAE,GAAG;AAChC,qBAAO,QAAQ,EAAE;AAAA,YACnB,OAAO;AAEL,oBAAM,QAAQ,YAAY,eAAe,CAAC;AAC1C,kBAAI,SAAS,MAAM,aAAa,QAAQ,GAAI,YAAW,MAAM,EAAE;AAAA,YACjE;AAAA,UACF;AACA;AAAA,QACF;AAAA,QACA,KAAK,aAAa;AAChB,cAAI,CAAC,QAAS;AACd,YAAE,eAAe;AACjB,cAAI,QAAQ,eAAe,YAAY,IAAI,QAAQ,EAAE,GAAG;AACtD,qBAAS,QAAQ,EAAE;AAAA,UACrB,WAAW,QAAQ,UAAU;AAC3B,uBAAW,QAAQ,QAAQ;AAAA,UAC7B;AACA;AAAA,QACF;AAAA,QACA,KAAK,QAAQ;AACX,YAAE,eAAe;AACjB,gBAAM,QAAQ,YAAY,CAAC;AAC3B,cAAI,MAAO,YAAW,MAAM,EAAE;AAC9B;AAAA,QACF;AAAA,QACA,KAAK,OAAO;AACV,YAAE,eAAe;AACjB,gBAAM,OAAO,YAAY,YAAY,SAAS,CAAC;AAC/C,cAAI,KAAM,YAAW,KAAK,EAAE;AAC5B;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK,KAAK;AACR,cAAI,CAAC,QAAS;AACd,YAAE,eAAe;AACjB,qBAAW,QAAQ,EAAE;AACrB,cAAI,QAAQ,YAAa,QAAO,QAAQ,EAAE;AAC1C;AAAA,QACF;AAAA,QACA;AACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAW,GAAG,oCAAoC,SAAS;AAAA,MAC3D,WAAW;AAAA,MACV,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,SACV;AAAA,QAAC;AAAA;AAAA,UAEC;AAAA,UACA,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAU;AAAA,UACV;AAAA,UACA,aAAa;AAAA,UACb,YAAY,CAAC,OAAO;AAClB,wBAAY,EAAE;AACd,uBAAW,EAAE;AAAA,UACf;AAAA,UACA,UAAU;AAAA;AAAA,QAXL,KAAK;AAAA,MAYZ,CACD;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,KAAK,cAAc;AAanB,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,cAAc,CAAC,CAAC,KAAK,YAAY,KAAK,SAAS,SAAS;AAC9D,QAAM,aAAa,eAAe,SAAS,IAAI,KAAK,EAAE;AACtD,QAAM,aAAa,aAAa,KAAK;AACrC,QAAM,YAAY,cAAc,KAAK;AAErC,SACE,+CAAC,QAAG,MAAK,QAIP;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,oBAAkB,KAAK;AAAA,QACvB,cAAY;AAAA,QACZ,iBAAe,cAAc,aAAa;AAAA,QAC1C,iBAAe;AAAA,QACf,UAAU,YAAY,IAAI;AAAA,QAC1B,SAAS,CAAC,MAAM;AACd,cAAI,EAAE,WAAW,EAAE,cAAe,aAAY,KAAK,EAAE;AAAA,QACvD;AAAA,QACA,SAAS,MAAM;AACb,qBAAW,KAAK,EAAE;AAClB,cAAI,YAAa,UAAS,KAAK,EAAE;AAAA,QACnC;AAAA,QACA,OAAO,EAAE,aAAa,KAAK,QAAQ,KAAK,GAAG;AAAA,QAC3C,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,aAAa,8BAA8B;AAAA,QAC7C;AAAA,QAEA;AAAA,wDAAC,UAAK,eAAW,MAAC,WAAU,yDACzB,wBAAe,aAAa,WAAM,WAAO,IAC5C;AAAA,UACC,KAAK,QACJ,8CAAC,UAAK,eAAW,MAAC,WAAU,0BACzB,eAAK,MACR;AAAA,UAEF,8CAAC,UAAK,WAAU,mBAAmB,eAAK,OAAM;AAAA,UAC7C,KAAK;AAAA;AAAA;AAAA,IACR;AAAA,IACC,eAAe,cACd,8CAAC,QAAG,MAAK,SAAQ,WAAU,wBACvB,gBAAK,YAAY,CAAC,GAAG,IAAI,CAAC,UAC1B;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MARK,MAAM;AAAA,IASb,CACD,GACH;AAAA,KAEJ;AAEJ;;;AC7YA,IAAAE,eAA6B;AAC7B,IAAAC,iBAA2E;AA4IzD,IAAAC,uBAAA;AAjEX,IAAM,mBAAe,2BAA8C,SAASC,cACjF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ;AAAA,EACA;AACF,GACA,KACA;AACA,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,WAAW;AAElD,QAAM,QAAQ,MAAM;AACpB,QAAM,cAAc,KAAK,IAAI,SAAS,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AAC5D,QAAM,OAAO,MAAM,WAAW;AAE9B,QAAM,WAAO;AAAA,IACX,CAAC,UAAkB;AACjB,iBAAW,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC;AAAA,IACjE;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AACA,QAAM,aAAS,4BAAY,MAAM,WAAW,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AACvF,QAAM,aAAS,4BAAY,MAAM,WAAW,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAE1E,QAAM,UAAM;AAAA,IACV,OAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,gBAAgB;AAAA,MACzB,QAAQ,eAAe,QAAQ;AAAA,IACjC;AAAA,IACA,CAAC,aAAa,OAAO,QAAQ,QAAQ,IAAI;AAAA,EAC3C;AAEA,QAAM,mBAAe,wBAAQ,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC;AAE5F,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,aAAa,KAAK,aAAa,KAAK,WAAW,GAAG,IAAI;AAC5D,QAAM,OAAO,OAAO,KAAK,YAAY,aAAa,KAAK,QAAQ,GAAG,IAAI,KAAK;AAE3E,QAAM,gBAAgB,MAAM;AAC1B,QAAI,IAAI,QAAQ;AACd,mBAAa;AAAA,IACf,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SACE,8CAAC,cAAW,MAAY,aAA0B,cAChD,yDAAC,iBAAc,KAAU,OACtB;AAAA,aAAS,8CAAC,eAAa,iBAAM;AAAA,IAC7B,eAAe,8CAAC,qBAAmB,uBAAY;AAAA,IAChD,8CAAC,SAAI,WAAU,QACb,wDAAC,WAAQ,OAAO,cAAc,SAAS,aAAa,GACtD;AAAA,IACA,8CAAC,SAAI,WAAU,QAAQ,gBAAK;AAAA,IAC5B,+CAAC,SAAI,WAAU,0BACZ;AAAA,qBACC,8CAAC,UAAO,MAAK,UAAS,SAAQ,SAAQ,SAAS,UAC5C,uBACH;AAAA,MAEF,8CAAC,UAAO,MAAK,UAAS,SAAQ,aAAY,SAAS,QAAQ,UAAU,IAAI,SACtE,qBACH;AAAA,MACA,8CAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,SAAS,eAAe,UAAU,CAAC,YACxE,cAAI,SAAS,gBAAgB,WAChC;AAAA,OACF;AAAA,KACF,GACF;AAEJ,CAAC;AAED,SAAS,YAAY,EAAE,SAAS,GAA4B;AAC1D,SAAO,8CAAa,oBAAZ,EAAkB,WAAU,gCAAgC,UAAS;AAC/E;AACA,SAAS,kBAAkB,EAAE,SAAS,GAA4B;AAChE,SACE,8CAAa,0BAAZ,EAAwB,WAAU,mDAChC,UACH;AAEJ;AAEA,aAAa,cAAc;","names":["Spinner","import_react","import_react","import_react","import_react","import_react","import_react","import_react","Button","import_class_variance_authority","import_react","import_jsx_runtime","IconButton","import_react","import_jsx_runtime","ButtonGroup","import_react","import_jsx_runtime","SplitButton","import_react","import_jsx_runtime","FAB","import_react","import_jsx_runtime","Checkbox","import_react","import_jsx_runtime","import_class_variance_authority","import_react","import_jsx_runtime","Input","import_react","import_jsx_runtime","SearchInput","import_react","import_jsx_runtime","OTP","import_react","import_jsx_runtime","RadioGroup","Radio","import_react","import_jsx_runtime","SelectTrigger","SelectContent","SelectItem","import_react","import_jsx_runtime","Slider","import_react","import_jsx_runtime","Switch","import_class_variance_authority","import_react","import_jsx_runtime","Textarea","import_react","import_react","import_jsx_runtime","StatusDot","import_jsx_runtime","Avatar","import_react","import_jsx_runtime","AvatarGroup","import_class_variance_authority","import_react","import_jsx_runtime","Badge","import_class_variance_authority","import_react","import_jsx_runtime","Card","CardLink","import_react","import_jsx_runtime","StatCard","import_react","import_jsx_runtime","Chip","import_react","import_jsx_runtime","Kbd","import_react","import_jsx_runtime","ScrollArea","import_class_variance_authority","import_react","import_jsx_runtime","Skeleton","SkeletonGroup","import_react","import_jsx_runtime","Tag","import_react","import_jsx_runtime","ContextMenuContent","ContextMenuItem","ContextMenuSeparator","import_react","import_jsx_runtime","DialogOverlay","DialogContent","RadixDialog","import_react","import_jsx_runtime","Drawer","RadixDialog","import_react","import_jsx_runtime","Sheet","import_react","import_jsx_runtime","AlertDialog","import_react","import_jsx_runtime","DropdownMenuContent","itemBase","MenuItem","MenuCheckboxItem","MenuSeparator","import_react","import_jsx_runtime","HoverCardContent","import_react","import_jsx_runtime","PopoverContent","import_react","import_jsx_runtime","ToastCard","import_react","import_jsx_runtime","TooltipContent","import_class_variance_authority","import_react","import_jsx_runtime","Alert","import_class_variance_authority","import_react","import_jsx_runtime","defaultGlyph","Banner","import_react","import_jsx_runtime","Breadcrumbs","Crumb","import_react","import_jsx_runtime","Combobox","RadixDialog","import_react","import_jsx_runtime","CommandPalette","import_react","import_jsx_runtime","import_react","import_jsx_runtime","Calendar","RadixPopover","import_react","import_jsx_runtime","DatePicker","import_react","import_jsx_runtime","Dots","import_react","import_jsx_runtime","Dropzone","import_class_variance_authority","import_react","import_jsx_runtime","EmptyState","import_react","import_jsx_runtime","FileChip","import_react","import_jsx_runtime","FilterPanel","import_react","import_react","import_jsx_runtime","RadialProgress","import_jsx_runtime","HealthScore","import_react","import_jsx_runtime","Menubar","MenubarTrigger","MenubarContent","itemBase","MenubarItem","MenubarSeparator","import_react","import_react","import_jsx_runtime","Sidebar","NavItem","NavSection","import_jsx_runtime","NavBar","import_react","import_jsx_runtime","OnboardingChecklist","import_react","import_jsx_runtime","Pagination","import_class_variance_authority","import_react","import_jsx_runtime","Progress","import_react","import_jsx_runtime","Sparkline","import_react","import_jsx_runtime","Spinner","import_react","import_jsx_runtime","labelStateClass","Stepper","import_class_variance_authority","import_react","import_jsx_runtime","Tabs","TabsList","Tab","TabsContent","import_react","import_jsx_runtime","Timeline","TimelineItem","import_react","import_jsx_runtime","ringClass","ActivityTimeline","import_react","import_jsx_runtime","Topbar","import_react","import_jsx_runtime","EMPTY_SET","Tree","RadixDialog","import_react","import_jsx_runtime","WizardDialog"]}