@slipstream-ui/core 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +672 -52
- package/dist/index.d.ts +672 -52
- package/dist/index.js +1860 -657
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1836 -655
- package/dist/index.mjs.map +1 -1
- package/dist/manifests/app-shell.manifest.json +156 -0
- package/dist/manifests/auth-layout.manifest.json +99 -0
- package/dist/manifests/autocomplete.manifest.json +53 -5
- package/dist/manifests/badge.manifest.json +12 -0
- package/dist/manifests/button.manifest.json +6 -2
- package/dist/manifests/card.manifest.json +53 -6
- package/dist/manifests/date-picker.manifest.json +87 -0
- package/dist/manifests/dialog.manifest.json +49 -4
- package/dist/manifests/drawer.manifest.json +18 -4
- package/dist/manifests/empty-state.manifest.json +108 -0
- package/dist/manifests/file-upload.manifest.json +103 -0
- package/dist/manifests/filter-bar.manifest.json +100 -0
- package/dist/manifests/menu.manifest.json +13 -1
- package/dist/manifests/metric-card.manifest.json +105 -0
- package/dist/manifests/page-header.manifest.json +94 -0
- package/dist/manifests/pagination.manifest.json +62 -34
- package/dist/manifests/password-input.manifest.json +75 -0
- package/dist/manifests/select-menu.manifest.json +142 -0
- package/dist/manifests/select.manifest.json +49 -12
- package/dist/manifests/stepper.manifest.json +95 -0
- package/dist/manifests/table-card.manifest.json +123 -0
- package/dist/manifests/time-picker.manifest.json +86 -0
- package/dist/manifests/timeline.manifest.json +69 -0
- package/dist/manifests/toast.manifest.json +101 -25
- package/package.json +1 -1
- package/src/components/app-shell/AppShell.test.tsx +100 -0
- package/src/components/app-shell/AppShell.tsx +162 -0
- package/src/components/app-shell/index.ts +1 -0
- package/src/components/auth-layout/AuthLayout.test.tsx +34 -0
- package/src/components/auth-layout/AuthLayout.tsx +47 -0
- package/src/components/auth-layout/index.ts +1 -0
- package/src/components/autocomplete/Autocomplete.test.tsx +53 -0
- package/src/components/autocomplete/Autocomplete.tsx +160 -41
- package/src/components/badge/Badge.test.tsx +14 -0
- package/src/components/badge/Badge.tsx +10 -4
- package/src/components/button/Button.test.tsx +29 -0
- package/src/components/button/Button.tsx +10 -0
- package/src/components/button-group/ButtonGroup.test.tsx +6 -8
- package/src/components/button-group/ButtonGroup.tsx +17 -9
- package/src/components/card/Card.test.tsx +14 -0
- package/src/components/card/Card.tsx +15 -8
- package/src/components/date-picker/DatePicker.test.tsx +30 -0
- package/src/components/date-picker/DatePicker.tsx +57 -0
- package/src/components/date-picker/index.ts +1 -0
- package/src/components/dialog/Dialog.test.tsx +64 -1
- package/src/components/dialog/Dialog.tsx +113 -23
- package/src/components/dialog/index.ts +1 -2
- package/src/components/drawer/Drawer.test.tsx +50 -0
- package/src/components/drawer/Drawer.tsx +44 -6
- package/src/components/empty-state/EmptyState.test.tsx +30 -0
- package/src/components/empty-state/EmptyState.tsx +48 -0
- package/src/components/empty-state/index.ts +1 -0
- package/src/components/file-upload/FileUpload.test.tsx +43 -0
- package/src/components/file-upload/FileUpload.tsx +143 -0
- package/src/components/file-upload/index.ts +1 -0
- package/src/components/filter-bar/FilterBar.test.tsx +32 -0
- package/src/components/filter-bar/FilterBar.tsx +71 -0
- package/src/components/filter-bar/index.ts +1 -0
- package/src/components/input-group/InputGroup.test.tsx +6 -3
- package/src/components/input-group/InputGroup.tsx +9 -6
- package/src/components/menu/Menu.test.tsx +21 -0
- package/src/components/menu/Menu.tsx +8 -3
- package/src/components/metric-card/MetricCard.test.tsx +28 -0
- package/src/components/metric-card/MetricCard.tsx +54 -0
- package/src/components/metric-card/index.ts +1 -0
- package/src/components/page-header/PageHeader.test.tsx +31 -0
- package/src/components/page-header/PageHeader.tsx +37 -0
- package/src/components/page-header/index.ts +1 -0
- package/src/components/pagination/Pagination.test.tsx +25 -0
- package/src/components/pagination/Pagination.tsx +53 -12
- package/src/components/password-input/PasswordInput.test.tsx +29 -0
- package/src/components/password-input/PasswordInput.tsx +41 -0
- package/src/components/password-input/index.ts +1 -0
- package/src/components/select/Select.test.tsx +40 -1
- package/src/components/select/Select.tsx +52 -14
- package/src/components/select/index.ts +1 -1
- package/src/components/select-menu/SelectMenu.test.tsx +105 -0
- package/src/components/select-menu/SelectMenu.tsx +368 -0
- package/src/components/select-menu/index.ts +1 -0
- package/src/components/stepper/Stepper.test.tsx +35 -0
- package/src/components/stepper/Stepper.tsx +91 -0
- package/src/components/stepper/index.ts +1 -0
- package/src/components/table-card/TableCard.test.tsx +59 -0
- package/src/components/table-card/TableCard.tsx +48 -0
- package/src/components/table-card/index.ts +1 -0
- package/src/components/time-picker/TimePicker.test.tsx +30 -0
- package/src/components/time-picker/TimePicker.tsx +56 -0
- package/src/components/time-picker/index.ts +1 -0
- package/src/components/timeline/Timeline.test.tsx +26 -0
- package/src/components/timeline/Timeline.tsx +53 -0
- package/src/components/timeline/index.ts +1 -0
- package/src/components/toast/Toast.test.tsx +5 -0
- package/src/components/toast/Toast.tsx +2 -16
- package/src/components/toast/Toaster.test.tsx +84 -0
- package/src/components/toast/Toaster.tsx +116 -0
- package/src/components/toast/index.ts +4 -0
- package/src/components/toast/toast-store.ts +117 -0
- package/src/index.ts +14 -0
- package/src/manifests/app-shell.manifest.json +156 -0
- package/src/manifests/auth-layout.manifest.json +99 -0
- package/src/manifests/autocomplete.manifest.json +53 -5
- package/src/manifests/badge.manifest.json +12 -0
- package/src/manifests/button.manifest.json +6 -2
- package/src/manifests/card.manifest.json +53 -6
- package/src/manifests/date-picker.manifest.json +87 -0
- package/src/manifests/dialog.manifest.json +49 -4
- package/src/manifests/drawer.manifest.json +18 -4
- package/src/manifests/empty-state.manifest.json +108 -0
- package/src/manifests/file-upload.manifest.json +103 -0
- package/src/manifests/filter-bar.manifest.json +100 -0
- package/src/manifests/menu.manifest.json +13 -1
- package/src/manifests/metric-card.manifest.json +105 -0
- package/src/manifests/page-header.manifest.json +94 -0
- package/src/manifests/pagination.manifest.json +62 -34
- package/src/manifests/password-input.manifest.json +75 -0
- package/src/manifests/select-menu.manifest.json +142 -0
- package/src/manifests/select.manifest.json +49 -12
- package/src/manifests/stepper.manifest.json +95 -0
- package/src/manifests/table-card.manifest.json +123 -0
- package/src/manifests/time-picker.manifest.json +86 -0
- package/src/manifests/timeline.manifest.json +69 -0
- package/src/manifests/toast.manifest.json +101 -25
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types/manifest.ts","../src/utils/cn.ts","../src/utils/gap.ts","../src/utils/presence.ts","../src/components/button/Button.tsx","../src/components/button-group/ButtonGroup.tsx","../src/components/input/Input.tsx","../src/components/input-group/InputGroup.tsx","../src/components/textarea/Textarea.tsx","../src/components/select/Select.tsx","../src/components/badge/Badge.tsx","../src/components/avatar/Avatar.tsx","../src/components/spinner/Spinner.tsx","../src/components/toast/Toast.tsx","../src/components/dialog/Dialog.tsx","../src/components/drawer/Drawer.tsx","../src/components/search/Search.tsx","../src/components/search/use-combobox.ts","../src/components/autocomplete/Autocomplete.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/checkbox/CheckboxGroup.tsx","../src/components/radio/Radio.tsx","../src/components/radio/RadioCard.tsx","../src/components/label/Label.tsx","../src/components/fieldset/Fieldset.tsx","../src/components/form-field/FormField.tsx","../src/components/tooltip/Tooltip.tsx","../src/components/form/Form.tsx","../src/components/form-layout/FormLayout.tsx","../src/components/switch/Switch.tsx","../src/components/separator/Separator.tsx","../src/components/skeleton/Skeleton.tsx","../src/components/progress/Progress.tsx","../src/components/tabs/Tabs.tsx","../src/components/card/Card.tsx","../src/components/accordion/Accordion.tsx","../src/components/table/Table.tsx","../src/components/data-table/DataTable.tsx","../src/components/pagination/Pagination.tsx","../src/components/list/List.tsx","../src/components/text/Text.tsx","../src/components/heading/Heading.tsx","../src/components/block/Block.tsx","../src/components/flex/Flex.tsx","../src/components/grid/Grid.tsx","../src/components/menu/Menu.tsx","../src/components/alert/Alert.tsx","../src/components/popover/Popover.tsx","../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["export * from './types/manifest';\nexport * from './utils/cn';\nexport * from './utils/gap';\nexport * from './utils/presence';\nexport * from './components/button';\nexport * from './components/button-group';\nexport * from './components/input';\nexport * from './components/input-group';\nexport * from './components/badge';\nexport * from './components/avatar';\nexport * from './components/spinner';\nexport * from './components/toast';\nexport * from './components/dialog';\nexport * from './components/drawer';\nexport * from './components/select';\nexport * from './components/search';\nexport * from './components/autocomplete';\nexport * from './components/checkbox';\nexport * from './components/radio';\nexport * from './components/textarea';\nexport * from './components/label';\nexport * from './components/fieldset';\nexport * from './components/form-field';\nexport * from './components/form';\nexport * from './components/form-layout';\nexport * from './components/switch';\nexport * from './components/separator';\nexport * from './components/skeleton';\nexport * from './components/progress';\nexport * from './components/tabs';\nexport * from './components/tooltip';\nexport * from './components/card';\nexport * from './components/accordion';\nexport * from './components/table';\nexport * from './components/data-table';\nexport * from './components/list';\nexport * from './components/text';\nexport * from './components/heading';\nexport * from './components/block';\nexport * from './components/flex';\nexport * from './components/grid';\nexport * from './components/menu';\nexport * from './components/alert';\nexport * from './components/popover';\nexport * from './components/breadcrumb';\nexport * from './components/pagination';\n","/**\n * COMPONENT_MANIFEST Schema\n * \n * Every component in Slipstream UI ships a machine-readable manifest\n * that AI agents can read to understand how to use the component correctly.\n * \n * This manifest contains:\n * - Component metadata (id, name, tier)\n * - Design intent and purpose\n * - Full prop schema with types, defaults, and constraints\n * - Usage examples (good and anti-patterns)\n * - Accessibility requirements\n * - Content guidelines for AI text generation\n * - Composition rules\n */\n\nexport type ComponentTier = 'atom' | 'molecule' | 'organism' | 'pattern';\n\nexport type PropSchema = {\n /** Property name */\n name: string;\n /** TypeScript type */\n type: string;\n /**\n * Default value (if any). Manifests are JSON, so values are limited to\n * strings, numbers, booleans, null, or JSON-serializable structures.\n */\n defaultValue?: string | number | boolean | null | unknown[];\n /** Whether the prop is required */\n required: boolean;\n /** Description of what the prop does */\n description: string;\n /** Allowed values for enums */\n enum?: string[];\n /** Example values */\n examples?: unknown[];\n};\n\nexport type UsageExample = {\n /** Title for this example */\n title: string;\n /** Code example */\n code: string;\n /** Description of when to use this pattern */\n description?: string;\n};\n\n/**\n * An anti-pattern describes a misuse in prose rather than code: the title\n * names the mistake, the explanation says why it is wrong (and what to do\n * instead). `example` optionally shows the offending snippet.\n */\nexport type AntiPattern = {\n /** Short name of the anti-pattern */\n title: string;\n /** Why this usage is wrong and what to do instead */\n explanation: string;\n /** Optional snippet of the offending usage */\n example?: string;\n};\n\nexport type AccessibilityRequirement = {\n /** A11y feature (e.g., \"keyboard navigation\", \"screen reader support\") */\n feature: string;\n /** How the component implements this */\n implementation: string;\n /** Any user requirements */\n userRequirements?: string;\n};\n\nexport type ContentGuideline = {\n /** Type of content (e.g., \"button text\", \"placeholder text\") */\n contentType: string;\n /** Guidelines for AI when generating this content */\n guidelines: string[];\n /** Examples of good content */\n goodExamples?: string[];\n /** Examples to avoid */\n badExamples?: string[];\n};\n\nexport type CompositionRule = {\n /** Related component that can be composed with this one */\n component: string;\n /** How they should be used together */\n relationship: string;\n /** Example composition */\n example?: string;\n};\n\nexport type ComponentManifest = {\n /** Unique component identifier (kebab-case) */\n id: string;\n /** Display name */\n name: string;\n /** Component tier in atomic design */\n tier: ComponentTier;\n /** One-line description of the component's purpose */\n description: string;\n /** Detailed design intent - why this component exists */\n designIntent: string;\n /** Full prop schema */\n props: PropSchema[];\n /** Good usage examples */\n examples: UsageExample[];\n /** Anti-patterns to avoid */\n antiPatterns?: AntiPattern[];\n /** Accessibility requirements */\n accessibility: AccessibilityRequirement[];\n /** Content guidelines for AI text generation */\n contentGuidelines?: ContentGuideline[];\n /** Composition rules with other components */\n compositionRules?: CompositionRule[];\n /** Related components */\n relatedComponents?: string[];\n /** Package this component belongs to */\n package: '@slipstream-ui/core' | '@slipstream-ui/ai';\n /** Import path */\n importPath: string;\n /** Version when this manifest was last updated */\n version: string;\n};\n\n/**\n * Type guard to check if an object is a valid ComponentManifest\n */\nexport function isComponentManifest(obj: unknown): obj is ComponentManifest {\n if (typeof obj !== 'object' || obj === null) return false;\n const record = obj as Record<string, unknown>;\n return (\n typeof record.id === 'string' &&\n typeof record.name === 'string' &&\n typeof record.tier === 'string' &&\n typeof record.description === 'string' &&\n typeof record.designIntent === 'string' &&\n Array.isArray(record.props) &&\n Array.isArray(record.examples) &&\n Array.isArray(record.accessibility) &&\n typeof record.package === 'string' &&\n typeof record.importPath === 'string' &&\n typeof record.version === 'string'\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Gap tokens (Tailwind scale) OR an exact pixel number.\n * Numbers are pixels — `gap={16}` is exactly 16px, no scale guessing;\n * tokens keep spacing on the design-system grid.\n */\nexport type GapValue = 'none' | 'sm' | 'md' | 'lg' | 'xl' | number;\n\nconst GAP_CLASSES: Record<string, string> = {\n none: 'gap-0',\n sm: 'gap-2',\n md: 'gap-4',\n lg: 'gap-6',\n xl: 'gap-8',\n};\n\n/**\n * Resolve a GapValue to a Tailwind class (token) or an exact px style\n * (number). Both forms are supported everywhere gaps appear — Flex, Grid,\n * FormLayout, Accordion.\n */\nexport function resolveGap(gap: GapValue | undefined): {\n className?: string;\n style?: CSSProperties;\n} {\n if (gap === undefined) return {};\n if (typeof gap === 'number') return { style: { gap: `${gap}px` } };\n return { className: GAP_CLASSES[gap] };\n}\n","import * as React from 'react';\n\n/**\n * Keeps overlay content mounted while an optional exit animation plays.\n *\n * `present` gates rendering: it stays true for `exitMs` after `open`\n * flips false (when `animate` is on), giving CSS exit classes a window\n * to run before the portal unmounts. `exiting` tells the component to\n * swap enter classes for exit classes during that window.\n */\nexport function usePresence(\n open: boolean,\n animate: boolean,\n exitMs = 200,\n): { present: boolean; exiting: boolean } {\n const [present, setPresent] = React.useState(open);\n\n React.useEffect(() => {\n if (open) {\n setPresent(true);\n return;\n }\n if (!present) return;\n if (!animate) {\n setPresent(false);\n return;\n }\n const timer = setTimeout(() => setPresent(false), exitMs);\n return () => clearTimeout(timer);\n }, [open, animate, present, exitMs]);\n\n return { present, exiting: present && !open };\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n // Semantic status variants — foregrounds are the paired AA tokens\n // (white on dark green, ink on amber/cyan) in both themes.\n success: 'bg-success text-success-foreground hover:bg-success/90',\n warning: 'bg-warning text-warning-foreground hover:bg-warning/90',\n info: 'bg-info text-info-foreground hover:bg-info/90',\n outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type ButtonGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Stacked segments share vertical edges (default: side-by-side). */\n orientation?: 'horizontal' | 'vertical';\n};\n\n/**\n * Joins buttons into one segmented control: adjacent borders collapse\n * (negative spacing), middle corners square off, and only the outer\n * corners stay rounded — a single outline around the whole group.\n * Use border-bearing variants (default/outline/secondary); ghost\n * buttons have no border and would break the joined outline.\n */\nconst ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(\n ({ orientation = 'horizontal', className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"button-group\"\n role=\"group\"\n className={cn(\n 'inline-flex',\n orientation === 'horizontal'\n ? '-space-x-px [&>*:first-child]:rounded-l-md [&>*:last-child]:rounded-r-md'\n : '-space-y-px [&>*:first-child]:rounded-t-md [&>*:last-child]:rounded-b-md',\n '[&>*]:rounded-none [&>*]:focus-visible:relative [&>*]:focus-visible:z-10',\n className\n )}\n {...props}\n />\n )\n);\nButtonGroup.displayName = 'ButtonGroup';\n\nexport { ButtonGroup };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm',\n 'ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Input } from '../input/Input';\nimport { Textarea } from '../textarea/Textarea';\nimport { Select } from '../select/Select';\n\nexport type InputGroupProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype CloneableProps = Record<string, unknown>;\n\nconst isNestedField = (child: React.ReactNode): child is React.ReactElement<CloneableProps> =>\n React.isValidElement(child) && (child.type === Input || child.type === Textarea || child.type === Select);\n\n/**\n * Composite input shell: one outer outline wraps the addons and the\n * field itself. Nested inputs shed their own border/ring — focus and\n * the outline belong to the group, so left/right addons read as flush\n * parts of a single control (the outline doubles as the affordance).\n *\n * id / aria-describedby / aria-invalid arriving from FormField are\n * forwarded to the nested field, because a label's htmlFor must\n * resolve to the editable control, not the shell div.\n */\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n ({ id, 'aria-describedby': describedBy, 'aria-invalid': invalid, className, children, ...props }, ref) => {\n let wiredChildren = children;\n\n if (id !== undefined || describedBy !== undefined || invalid !== undefined) {\n const items = React.Children.toArray(children);\n const fieldIndex = items.findIndex(isNestedField);\n if (fieldIndex !== -1) {\n const field = items[fieldIndex];\n items[fieldIndex] = isNestedField(field)\n ? React.cloneElement(field, {\n ...(id !== undefined && { id }),\n ...(describedBy !== undefined && { 'aria-describedby': describedBy }),\n ...(invalid !== undefined && { 'aria-invalid': invalid }),\n })\n : field;\n wiredChildren = items;\n } else {\n // No recognizable field (custom children) — keep the wiring on the shell.\n props = {\n ...props,\n ...(id !== undefined && { id }),\n ...(describedBy !== undefined && { 'aria-describedby': describedBy }),\n ...(invalid !== undefined && { 'aria-invalid': invalid }),\n };\n }\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"input-group\"\n className={cn(\n 'flex h-10 w-full items-center overflow-hidden rounded-md border border-input bg-background',\n 'ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2',\n // The group is the control: strip chrome from nested fields so\n // only the outer border shows. Literal variants survive purging.\n '[&_input]:min-w-0 [&_input]:flex-1 [&_input]:border-0 [&_input]:bg-transparent [&_input]:px-3 [&_input]:py-2 [&_input]:shadow-none',\n '[&_input]:focus-visible:ring-0 [&_input]:focus-visible:ring-offset-0',\n '[&_textarea]:border-0 [&_textarea]:bg-transparent [&_textarea]:shadow-none [&_textarea]:focus-visible:ring-0',\n '[&_select]:border-0 [&_select]:bg-transparent [&_select]:shadow-none [&_select]:focus-visible:ring-0',\n '[&_input:disabled]:cursor-not-allowed',\n className\n )}\n {...props}\n >\n {wiredChildren}\n </div>\n );\n }\n);\nInputGroup.displayName = 'InputGroup';\n\nexport type InputGroupAddonProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Edge the addon hugs (flush against the group outline). */\n side?: 'left' | 'right';\n /** 'muted' paints a light-gray surface; 'ghost' keeps the group background. */\n variant?: 'ghost' | 'muted';\n};\n\n/**\n * Flush icon/text/button slot inside an InputGroup. Addons carry their\n * own padding on the outer edge only — the nested field's padding\n * supplies the gap toward the middle, so content stays on one rhythm.\n */\nconst InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ side = 'left', variant = 'ghost', className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"input-group-addon\"\n data-side={side}\n className={cn(\n 'flex shrink-0 select-none items-center self-stretch px-3 text-sm text-muted-foreground',\n variant === 'muted' && 'bg-muted',\n className\n )}\n {...props}\n />\n )\n);\nInputGroupAddon.displayName = 'InputGroupAddon';\n\nexport { InputGroup, InputGroupAddon };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n /** Controlled value; omit for uncontrolled usage. */\n value?: string;\n /** Fired when the content changes. */\n onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n};\n\n/**\n * Multi-line text input styled to match `Input`. Wraps the native\n * <textarea> so form semantics, IME support, and validation bubbles\n * behave exactly as users expect.\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n />\n )\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type SelectOption = {\n value: string;\n label: string;\n disabled?: boolean;\n};\n\nexport type SelectProps = Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'onChange' | 'value' | 'defaultValue'> & {\n options: SelectOption[];\n label?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n};\n\n/**\n * Accessible select primitive built on the native <select>: full keyboard,\n * screen-reader and mobile platform behavior comes from the platform rather\n * than a re-implemented listbox. Controlled via `value`, or\n * uncontrolled via `defaultValue`.\n */\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { options, label, value, defaultValue, onChange, id, className, ...props },\n ref,\n) {\n const generatedId = React.useId();\n const selectId = id ?? generatedId;\n const labelId = `${selectId}-label`;\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label id={labelId} htmlFor={selectId} className=\"text-sm font-medium\">\n {label}\n </label>\n )}\n <select\n ref={ref}\n id={selectId}\n aria-labelledby={label ? labelId : undefined}\n className={cn(\n 'rounded-md border border-input bg-background px-3 py-2 text-sm',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n className\n )}\n value={value}\n defaultValue={defaultValue}\n onChange={(event) => onChange?.(event.target.value)}\n {...props}\n >\n {options.map((option) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n );\n});\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary: 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive: 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport type BadgeProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof badgeVariants>;\n\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant, ...props }, ref) => (\n <div ref={ref} className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n);\nBadge.displayName = 'Badge';\n\nexport { Badge, badgeVariants };\n","import * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from '../../utils/cn';\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full',\n className\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst spinnerVariants = cva(\n 'inline-block animate-spin rounded-full border-2 border-current border-t-transparent text-muted-foreground motion-reduce:animate-none',\n {\n variants: {\n size: {\n sm: 'h-3 w-3',\n default: 'h-4 w-4',\n lg: 'h-6 w-6',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport type SpinnerProps = React.HTMLAttributes<HTMLSpanElement> & VariantProps<typeof spinnerVariants> & {\n /** Accessible label announced to screen readers; set aria-hidden when purely decorative. */\n label?: string;\n};\n\nfunction Spinner({ className, size, label = 'Loading...', ...props }: SpinnerProps) {\n return (\n <span\n role=\"status\"\n className={cn(spinnerVariants({ size }), className)}\n {...props}\n >\n <span className=\"sr-only\">{label}</span>\n </span>\n );\n}\n\nexport { Spinner, spinnerVariants };\n","'use client';\n\nimport * as React from 'react';\n\nexport type ToastAction = {\n label: string;\n onClick: () => void;\n};\n\nexport type ToastOptions = {\n title: string;\n description?: string;\n action?: ToastAction;\n /** Auto-dismiss delay in ms; 0 keeps the toast until dismissed. Default 5000. */\n duration?: number;\n};\n\nexport type ToastRecord = ToastOptions & {\n id: string;\n};\n\nexport type ToastContextValue = {\n toasts: ToastRecord[];\n toast: (options: ToastOptions) => string;\n dismiss: (id: string) => void;\n};\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\nconst DEFAULT_DURATION = 5000;\n\n/**\n * Accessible app-level notifications. Toasts render into a polite live\n * region so screen readers announce them without stealing focus, stack\n * newest-first, and auto-dismiss unless duration is 0.\n */\nexport function ToastProvider({ children, label = 'Notifications' }: { children: React.ReactNode; label?: string }) {\n const [toasts, setToasts] = React.useState<ToastRecord[]>([]);\n const timers = React.useRef(new Map<string, ReturnType<typeof setTimeout>>());\n\n const dismiss = React.useCallback((id: string) => {\n const timer = timers.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.current.delete(id);\n }\n setToasts((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const toast = React.useCallback(\n (options: ToastOptions) => {\n const id = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n setToasts((current) => [...current, { ...options, id }]);\n const duration = options.duration ?? DEFAULT_DURATION;\n if (duration > 0) {\n timers.current.set(\n id,\n setTimeout(() => dismiss(id), duration),\n );\n }\n return id;\n },\n [dismiss],\n );\n\n React.useEffect(() => {\n const pending = timers.current;\n return () => {\n for (const timer of pending.values()) clearTimeout(timer);\n pending.clear();\n };\n }, []);\n\n const value = React.useMemo(() => ({ toasts, toast, dismiss }), [toasts, toast, dismiss]);\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <ToastRegion toasts={toasts} onDismiss={dismiss} label={label} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastContextValue {\n const context = React.useContext(ToastContext);\n if (!context) throw new Error('useToast must be used within a <ToastProvider>.');\n return context;\n}\n\nfunction ToastRegion({\n toasts,\n onDismiss,\n label,\n}: {\n toasts: ToastRecord[];\n onDismiss: (id: string) => void;\n label: string;\n}) {\n return (\n <ol\n aria-label={label}\n className=\"fixed bottom-4 right-4 z-50 flex w-full max-w-sm flex-col gap-2\"\n >\n {toasts.map((entry) => (\n <li key={entry.id} className=\"rounded-lg border border-border bg-card p-4 shadow-lg\">\n <div role=\"status\" className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"text-sm font-semibold\">{entry.title}</p>\n {entry.description && <p className=\"mt-1 text-sm text-muted-foreground\">{entry.description}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onDismiss(entry.id)}\n aria-label={`Dismiss ${entry.title}`}\n className=\"rounded p-1 text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n </div>\n {entry.action && (\n <button\n type=\"button\"\n onClick={() => {\n entry.action?.onClick();\n onDismiss(entry.id);\n }}\n className=\"mt-2 text-sm font-medium text-primary hover:underline\"\n >\n {entry.action.label}\n </button>\n )}\n </li>\n ))}\n </ol>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { usePresence } from '../../utils/presence';\n\nexport type DialogProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n children?: React.ReactNode;\n closeOnBackdrop?: boolean;\n /** Hide the close (✕) button in the header; Escape and backdrop still close. */\n showClose?: boolean;\n /** Focused when the dialog opens; defaults to the first focusable element. */\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n ariaLabel?: string;\n /**\n * Fade the backdrop and panel in on open and out on close (requires\n * the tailwindcss-animate plugin). Off by default; reduced-motion\n * users get animate-none automatically.\n */\n animate?: boolean;\n};\n\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Accessible modal dialog: portal, aria-modal + labelled/describedby wiring,\n * Escape and backdrop dismissal, initial focus on open and focus restoration\n * on close, plus a Tab/Shift+Tab focus trap.\n */\nexport function Dialog({\n open,\n onOpenChange,\n title,\n description,\n children,\n closeOnBackdrop = true,\n showClose = true,\n initialFocusRef,\n animate = false,\n}: DialogProps) {\n const dialogRef = React.useRef<HTMLDivElement | null>(null);\n const previouslyFocused = React.useRef<HTMLElement | null>(null);\n const titleId = React.useId();\n const descriptionId = React.useId();\n const { present, exiting } = usePresence(open, animate);\n\n // Capture the opener before the panel takes focus; restore the moment\n // open flips false — even while an exit animation keeps the DOM up.\n React.useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement as HTMLElement | null;\n return;\n }\n previouslyFocused.current?.focus?.();\n previouslyFocused.current = null;\n }, [open]);\n\n // Move focus in once the panel is actually mounted (present can lag\n // open by a render when the presence gate starts closed).\n React.useEffect(() => {\n if (!open || !present) return;\n const node = dialogRef.current;\n const target =\n initialFocusRef?.current ?? node?.querySelector<HTMLElement>(FOCUSABLE) ?? node;\n target?.focus();\n }, [open, present, initialFocusRef]);\n\n React.useEffect(() => {\n if (!open) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onOpenChange(false);\n return;\n }\n if (event.key !== 'Tab') return;\n const node = dialogRef.current;\n if (!node) return;\n const focusable = Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === node)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', onKeyDown, true);\n return () => document.removeEventListener('keydown', onKeyDown, true);\n }, [open, onOpenChange]);\n\n if (!present || typeof document === 'undefined') return null;\n\n const motion = animate\n ? cn(\n 'duration-200 motion-reduce:animate-none',\n exiting ? 'animate-out fade-out-0 zoom-out-95' : 'animate-in fade-in-0 zoom-in-95',\n )\n : undefined;\n\n return createPortal(\n <div\n className={cn('fixed inset-0 z-50 flex items-center justify-center bg-background/80 p-4', motion)}\n onMouseDown={(event) => {\n if (closeOnBackdrop && event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n tabIndex={-1}\n className={cn('w-full max-w-md rounded-xl border border-border bg-card p-6 shadow-xl', motion)}\n >\n <div className=\"flex items-start justify-between gap-4\">\n <h2 id={titleId} className=\"text-lg font-semibold\">\n {title}\n </h2>\n {showClose && (\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n aria-label=\"Close dialog\"\n className=\"rounded p-1 text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n )}\n </div>\n {description && (\n <p id={descriptionId} className=\"mt-2 text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n {children && <div className=\"mt-4\">{children}</div>}\n </div>\n </div>,\n document.body,\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { usePresence } from '../../utils/presence';\n\nexport type DrawerSide = 'left' | 'right' | 'top' | 'bottom';\nexport type DrawerSize = 'sm' | 'md' | 'lg';\n\nexport type DrawerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n children?: React.ReactNode;\n /** Edge the drawer slides from (default 'right'). */\n side?: DrawerSide;\n /** Extent along the side axis (width for left/right, height for top/bottom). */\n size?: DrawerSize;\n /** Clicking the backdrop closes (default true). */\n closeOnBackdrop?: boolean;\n /** Hide the close (✕) button in the header (default true). */\n showClose?: boolean;\n /** Focused when the drawer opens; defaults to the first focusable element. */\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n /** Overrides the accessible name (defaults to the title). */\n ariaLabel?: string;\n /**\n * Slide the panel in from its edge and out on close (requires the\n * tailwindcss-animate plugin). Off by default; reduced-motion users\n * get animate-none automatically.\n */\n animate?: boolean;\n};\n\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst sideClasses: Record<DrawerSide, string> = {\n right: 'inset-y-0 right-0 border-l',\n left: 'inset-y-0 left-0 border-r',\n top: 'inset-x-0 top-0 border-b',\n bottom: 'inset-x-0 bottom-0 border-t',\n};\n\nconst sizeClasses: Record<DrawerSide, Record<DrawerSize, string>> = {\n right: { sm: 'w-72', md: 'w-96', lg: 'w-[32rem]' },\n left: { sm: 'w-72', md: 'w-96', lg: 'w-[32rem]' },\n top: { sm: 'h-48', md: 'h-80', lg: 'h-[32rem]' },\n bottom: { sm: 'h-48', md: 'h-80', lg: 'h-[32rem]' },\n};\n\n// Literal class maps so Tailwind's scanner keeps every slide utility.\nconst slideIn: Record<DrawerSide, string> = {\n right: 'slide-in-from-right',\n left: 'slide-in-from-left',\n top: 'slide-in-from-top',\n bottom: 'slide-in-from-bottom',\n};\nconst slideOut: Record<DrawerSide, string> = {\n right: 'slide-out-to-right',\n left: 'slide-out-to-left',\n top: 'slide-out-to-top',\n bottom: 'slide-out-to-bottom',\n};\n\n/**\n * Edge sheet for secondary flows (filters, detail panes, mobile nav).\n * Modal semantics identical to Dialog: portal, aria-modal + labelled by\n * title, Escape and backdrop dismissal, focus move + Tab trap + focus\n * restoration on close. Renders fixed to the chosen edge with a border\n * against the backdrop.\n */\nexport function Drawer({\n open,\n onOpenChange,\n title,\n description,\n children,\n side = 'right',\n size = 'md',\n closeOnBackdrop = true,\n showClose = true,\n initialFocusRef,\n ariaLabel,\n animate = false,\n}: DrawerProps) {\n const drawerRef = React.useRef<HTMLDivElement | null>(null);\n const previouslyFocused = React.useRef<HTMLElement | null>(null);\n const titleId = React.useId();\n const descriptionId = React.useId();\n const { present, exiting } = usePresence(open, animate);\n\n // Capture the opener before the panel takes focus; restore the moment\n // open flips false — even while an exit animation keeps the DOM up.\n React.useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement as HTMLElement | null;\n return;\n }\n previouslyFocused.current?.focus?.();\n previouslyFocused.current = null;\n }, [open]);\n\n // Move focus in once the panel is actually mounted (present can lag\n // open by a render when the presence gate starts closed).\n React.useEffect(() => {\n if (!open || !present) return;\n const node = drawerRef.current;\n const target =\n initialFocusRef?.current ?? node?.querySelector<HTMLElement>(FOCUSABLE) ?? node;\n target?.focus();\n }, [open, present, initialFocusRef]);\n\n React.useEffect(() => {\n if (!open) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onOpenChange(false);\n return;\n }\n if (event.key !== 'Tab') return;\n const node = drawerRef.current;\n if (!node) return;\n const focusable = Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || !node.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [open, onOpenChange]);\n\n if (!present || typeof document === 'undefined') return null;\n\n const motion = animate\n ? cn(\n 'duration-200 motion-reduce:animate-none',\n exiting ? `animate-out ${slideOut[side]}` : `animate-in ${slideIn[side]}`,\n )\n : undefined;\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-50\"\n onMouseDown={(event) => {\n if (closeOnBackdrop && event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel ?? title}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n tabIndex={-1}\n className={cn(\n 'fixed flex flex-col bg-background shadow-xl border-border',\n sideClasses[side],\n sizeClasses[side][size],\n motion\n )}\n >\n <div className=\"flex items-start justify-between gap-4 border-b border-border px-5 py-4\">\n <div>\n <h2 id={titleId} className=\"text-base font-semibold leading-tight\">\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className=\"mt-1 text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n {showClose && (\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n aria-label=\"Close drawer\"\n className=\"-mr-1 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">{children}</div>\n </div>\n </div>,\n document.body\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { Input } from '../input/Input';\nimport { useCombobox, type ComboboxItem } from './use-combobox';\n\nexport type SearchOption = {\n value: string;\n label: string;\n /** Secondary line in the dropdown. */\n description?: string;\n /** Extra words matched while filtering (aliases, category…). */\n keywords?: string;\n};\n\nexport type SearchProps = {\n /** The full option set; filtered client-side as the user types. */\n options: SearchOption[];\n /** Initially selected option value. Selection is reported via onValueChange. */\n defaultValue?: string;\n /** Called with the selected option's value. */\n onValueChange?: (value: string) => void;\n placeholder?: string;\n /** Shown when no option matches the query. */\n emptyText?: string;\n disabled?: boolean;\n id?: string;\n name?: string;\n className?: string;\n 'aria-label'?: string;\n};\n\n/**\n * Select-with-search: type to filter a full-width dropdown list, or arrow\n * through options from an empty query. Uncontrolled for its display — the\n * selected value is reported through onValueChange (initial selection via\n * defaultValue). The listbox portals to document.body with fixed\n * positioning, so scrollable containers never clip it.\n */\nexport function Search({\n options,\n defaultValue,\n onValueChange,\n placeholder = 'Search…',\n emptyText = 'No matching results',\n disabled,\n id,\n name,\n className,\n 'aria-label': ariaLabel,\n}: SearchProps) {\n const selected = React.useMemo(\n () => options.find((option) => option.value === defaultValue),\n [options, defaultValue]\n );\n const [query, setQuery] = React.useState(selected?.label ?? '');\n\n const filtered = React.useMemo(() => {\n if (!query.trim()) return options;\n const q = query.trim().toLowerCase();\n return options.filter(\n (option) =>\n option.label.toLowerCase().includes(q) ||\n option.value.toLowerCase().includes(q) ||\n (option.keywords?.toLowerCase().includes(q) ?? false) ||\n (option.description?.toLowerCase().includes(q) ?? false)\n );\n }, [options, query]);\n\n const combobox = useCombobox({\n items: filtered,\n onSelect: (item) => {\n setQuery(item.label);\n onValueChange?.(item.value);\n },\n });\n\n const select = (item: ComboboxItem) => {\n setQuery(item.label);\n onValueChange?.(item.value);\n combobox.setOpen(false);\n };\n\n return (\n <div ref={combobox.anchorRef} className={cn('relative w-full', className)}>\n <Input\n id={id}\n name={name}\n type=\"search\"\n autoComplete=\"off\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n disabled={disabled}\n value={query}\n onChange={(event) => {\n setQuery(event.target.value);\n combobox.setOpen(true);\n }}\n onFocus={() => {\n // Refocusing a completed selection shows the whole set again.\n if (selected && query === selected.label) setQuery('');\n combobox.setOpen(true);\n }}\n onKeyDown={combobox.onInputKeyDown}\n {...combobox.inputProps}\n />\n {combobox.ready &&\n createPortal(\n <ul\n id={combobox.listboxId}\n role=\"listbox\"\n aria-label={ariaLabel ?? 'Search results'}\n style={{\n position: 'fixed',\n top: combobox.pos!.top,\n left: combobox.pos!.left,\n width: Math.max(combobox.pos!.width, 220),\n zIndex: 50,\n }}\n className=\"max-h-64 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n {filtered.length === 0 ? (\n <li role=\"presentation\" className=\"px-3 py-2 text-sm text-muted-foreground\">\n {emptyText}\n </li>\n ) : (\n filtered.map((option, index) => (\n <li\n key={option.value}\n id={combobox.optionId(index)}\n role=\"option\"\n aria-selected={combobox.activeIndex === index}\n // Keep focus on the input so typing continues; select on click.\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => combobox.setActiveIndex(index)}\n onClick={() => select(option)}\n className={cn(\n 'cursor-pointer rounded-sm px-3 py-2 text-sm outline-none',\n combobox.activeIndex === index\n ? 'bg-accent text-accent-foreground'\n : 'hover:bg-accent/60'\n )}\n >\n <span className=\"block\">{option.label}</span>\n {option.description && (\n <span className=\"block text-xs text-muted-foreground\">{option.description}</span>\n )}\n </li>\n ))\n )}\n </ul>,\n document.body\n )}\n </div>\n );\n}\n","import * as React from 'react';\n\nexport type ComboboxItem = {\n value: string;\n label: string;\n};\n\ntype UseComboboxOptions = {\n /** Currently visible items (already filtered by the query). */\n items: ComboboxItem[];\n /** Called with the chosen item (mouse or Enter). */\n onSelect: (item: ComboboxItem) => void;\n /** Called whenever open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Close when the value is submitted with no active item (Enter). Default true. */\n closeOnSubmit?: boolean;\n};\n\ntype UseComboboxResult = {\n open: boolean;\n setOpen: (open: boolean) => void;\n activeIndex: number;\n /** Hover/highlight management for the listbox options. */\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n listboxId: string;\n /** Anchors the floating listbox — measured for fixed positioning. */\n anchorRef: React.MutableRefObject<HTMLDivElement | null>;\n /** aria-* props to spread on the input (combobox pattern). */\n inputProps: {\n role: 'combobox';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n 'aria-autocomplete': 'list';\n 'aria-activedescendant'?: string;\n };\n /** Key handler for the input: arrows, Home/End, Enter, Escape. */\n onInputKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n /** Downward movement for trigger buttons outside the input (optional). */\n optionId: (index: number) => string;\n /** True when the listbox should be rendered (open + measured). */\n ready: boolean;\n /** Fixed viewport coordinates for the listbox. */\n pos: { top: number; left: number; width: number } | null;\n};\n\nlet searchUid = 0;\n\n/**\n * Shared combobox brain for Search and Autocomplete: open/close, active\n * option, keyboard navigation, outside-click dismissal, and fixed-position\n * measurement (so demo frames with overflow never clip the listbox).\n */\nexport function useCombobox({\n items,\n onSelect,\n onOpenChange,\n closeOnSubmit = true,\n}: UseComboboxOptions): UseComboboxResult {\n const [open, setOpenState] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState(-1);\n const [pos, setPos] = React.useState<{ top: number; left: number; width: number } | null>(null);\n const anchorRef = React.useRef<HTMLDivElement | null>(null);\n const listboxId = React.useRef(`slipstream-combobox-${++searchUid}`).current;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n setOpenState(next);\n if (!next) setActiveIndex(-1);\n onOpenChange?.(next);\n },\n [onOpenChange]\n );\n\n // Reset the active item whenever the visible set changes.\n React.useEffect(() => {\n setActiveIndex(-1);\n }, [items]);\n\n // Measure the anchor for fixed listbox positioning while open; close on\n // any scroll (capture catches non-bubbling element scrolls) so the\n // floating list never detaches from its input.\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const GAP = 4;\n const measure = () => {\n const rect = anchorRef.current?.getBoundingClientRect();\n if (!rect) return;\n setPos({ top: rect.bottom + GAP, left: rect.left, width: rect.width });\n };\n measure();\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', measure);\n };\n }, [open, setOpen]);\n\n // Dismiss on outside press (the input keeps focus for continued typing).\n React.useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!anchorRef.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open, setOpen]);\n\n const onInputKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') {\n if (open) {\n event.preventDefault();\n setOpen(false);\n }\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open) {\n setOpen(true);\n return;\n }\n setActiveIndex((index) => (items.length === 0 ? -1 : index >= items.length - 1 ? 0 : index + 1));\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (!open) return;\n setActiveIndex((index) => (items.length === 0 ? -1 : index <= 0 ? items.length - 1 : index - 1));\n return;\n }\n if (event.key === 'Home' && open) {\n event.preventDefault();\n setActiveIndex(items.length ? 0 : -1);\n return;\n }\n if (event.key === 'End' && open) {\n event.preventDefault();\n setActiveIndex(items.length ? items.length - 1 : -1);\n return;\n }\n if (event.key === 'Enter') {\n if (open && activeIndex >= 0 && items[activeIndex]) {\n event.preventDefault();\n onSelect(items[activeIndex]);\n setOpen(false);\n } else if (open && closeOnSubmit) {\n setOpen(false);\n }\n }\n },\n [open, items, activeIndex, onSelect, setOpen, closeOnSubmit]\n );\n\n return {\n open,\n setOpen,\n activeIndex,\n setActiveIndex,\n listboxId,\n anchorRef,\n inputProps: {\n role: 'combobox',\n 'aria-expanded': open,\n 'aria-controls': listboxId,\n 'aria-autocomplete': 'list',\n ...(open && activeIndex >= 0 ? { 'aria-activedescendant': `${listboxId}-opt-${activeIndex}` } : {}),\n },\n onInputKeyDown,\n optionId: (index: number) => `${listboxId}-opt-${index}`,\n ready: open && pos !== null && typeof document !== 'undefined',\n pos,\n };\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { Input } from '../input/Input';\nimport { useCombobox } from '../search/use-combobox';\n\nexport type AutocompleteProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'children' | 'size'\n> & {\n /** Current text — standard controlled-input contract. */\n value?: string;\n /** Initial text when uncontrolled. */\n defaultValue?: string;\n /** Fires on every keystroke AND on suggestion selection (like a native input's onChange). */\n onValueChange?: (value: string) => void;\n /** Suggestion labels offered while typing; any value may still be entered free-form. */\n suggestions: string[];\n /** Shown when no suggestion matches (optional). */\n emptyText?: string;\n};\n\n/**\n * Type-ahead input following the HTML autocomplete model: users may enter\n * any value (free text is first-class), while matching suggestions appear\n * in a listbox — Arrow keys highlight, Enter accepts, Escape dismisses.\n * The native `autoComplete` attribute passes through (form autofill hints\n * keep working alongside the custom listbox). The listbox portals with\n * fixed positioning so scrollable containers never clip it.\n */\nexport function Autocomplete({\n value,\n defaultValue = '',\n onValueChange,\n suggestions,\n emptyText,\n placeholder,\n id,\n name,\n className,\n onKeyDown,\n onFocus,\n ...inputProps\n}: AutocompleteProps) {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const current = value ?? internalValue;\n\n const items = React.useMemo(() => {\n const q = current.trim().toLowerCase();\n const list = q\n ? suggestions.filter((suggestion) => suggestion.toLowerCase().includes(q))\n : suggestions;\n // Never offer the exact current value back as a suggestion.\n return list\n .filter((suggestion) => suggestion !== current)\n .map((suggestion) => ({ value: suggestion, label: suggestion }));\n }, [suggestions, current]);\n\n const combobox = useCombobox({\n items,\n onSelect: (item) => {\n if (value === undefined) setInternalValue(item.label);\n onValueChange?.(item.label);\n },\n });\n\n const select = (label: string) => {\n if (value === undefined) setInternalValue(label);\n onValueChange?.(label);\n combobox.setOpen(false);\n };\n\n return (\n <div ref={combobox.anchorRef} className={cn('relative w-full', className)}>\n <Input\n id={id}\n name={name}\n placeholder={placeholder}\n autoComplete=\"off\"\n value={current}\n onChange={(event) => {\n if (value === undefined) setInternalValue(event.target.value);\n onValueChange?.(event.target.value);\n combobox.setOpen(true);\n }}\n onFocus={(event) => {\n onFocus?.(event);\n combobox.setOpen(true);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n combobox.onInputKeyDown(event);\n }}\n {...inputProps}\n {...combobox.inputProps}\n />\n {combobox.ready &&\n createPortal(\n <ul\n id={combobox.listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n style={{\n position: 'fixed',\n top: combobox.pos!.top,\n left: combobox.pos!.left,\n width: Math.max(combobox.pos!.width, 220),\n zIndex: 50,\n }}\n className=\"max-h-60 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n {items.length === 0 ? (\n <li role=\"presentation\" className=\"px-3 py-2 text-sm text-muted-foreground\">\n {emptyText ?? 'No suggestions'}\n </li>\n ) : (\n items.map((item, index) => (\n <li\n key={item.value}\n id={combobox.optionId(index)}\n role=\"option\"\n aria-selected={combobox.activeIndex === index}\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => combobox.setActiveIndex(index)}\n onClick={() => select(item.label)}\n className={cn(\n 'cursor-pointer rounded-sm px-3 py-1.5 text-sm outline-none',\n combobox.activeIndex === index\n ? 'bg-accent text-accent-foreground'\n : 'hover:bg-accent/60'\n )}\n >\n {item.label}\n </li>\n ))\n )}\n </ul>,\n document.body\n )}\n </div>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type CheckboxProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'onChange'> & {\n /** Controlled checked state; omit for uncontrolled usage. */\n checked?: boolean;\n /** Fired when the user toggles the checkbox. */\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/**\n * Accessible checkbox built on the native input: keyboard, form, and\n * screen-reader behavior comes from the platform. Visual state is drawn\n * with a CSS overlay so the native input stays the source of truth.\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, checked, onCheckedChange, ...props }, ref) => (\n <input\n type=\"checkbox\"\n ref={ref}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.target.checked)}\n className={cn(\n 'peer h-4 w-4 shrink-0 rounded-sm border border-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'checked:bg-primary checked:text-primary-foreground',\n className\n )}\n {...props}\n />\n )\n);\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };\n","'use client';\n\nimport * as React from 'react';\nimport { Checkbox } from '../checkbox/Checkbox';\nimport { cn } from '../../utils/cn';\n\nexport type CheckboxGroupOrientation = 'vertical' | 'horizontal';\n\nexport type CheckboxGroupProps = {\n /** Shared name applied to every checkbox in the group. */\n name: string;\n /** Accessible group label; rendered as <legend> inside a fieldset. */\n legend?: string;\n /** Currently selected values (controlled). */\n value?: string[];\n /** Initial values (uncontrolled). */\n defaultValue?: string[];\n /** Called with the full selection after a toggle. */\n onValueChange?: (value: string[]) => void;\n /** Stack options (default) or lay them out in a wrapping row. */\n orientation?: CheckboxGroupOrientation;\n /** Group-level validation message; announced via role=alert. */\n error?: string;\n className?: string;\n children: React.ReactNode;\n};\n\ntype CheckboxGroupContextValue = {\n name: string;\n values: string[];\n toggle: (value: string) => void;\n};\n\nconst CheckboxGroupContext = React.createContext<CheckboxGroupContextValue>({\n name: '',\n values: [],\n toggle: () => {},\n});\n\n/**\n * Groups related checkboxes with a shared name and accessible legend.\n * Multi-select counterpart of RadioGroup: renders a native\n * <fieldset>/<legend> so screen readers announce the group context,\n * and keeps the selection as a string[] for forms and URLs.\n */\nconst CheckboxGroup = React.forwardRef<HTMLFieldSetElement, CheckboxGroupProps>(\n (\n { name, legend, value, defaultValue, onValueChange, orientation = 'vertical', error, className, children },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue ?? []);\n const currentValue = value ?? internalValue;\n\n const toggle = (next: string) => {\n const updated = currentValue.includes(next)\n ? currentValue.filter((item) => item !== next)\n : [...currentValue, next];\n if (value === undefined) setInternalValue(updated);\n onValueChange?.(updated);\n };\n\n return (\n <fieldset ref={ref} className={cn(orientation === 'vertical' ? 'space-y-2' : 'flex flex-row flex-wrap gap-x-4 gap-y-2', className)}>\n {legend && <legend className=\"text-sm font-medium\">{legend}</legend>}\n <CheckboxGroupContext.Provider value={{ name, values: currentValue, toggle }}>\n {children}\n </CheckboxGroupContext.Provider>\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </fieldset>\n );\n }\n);\nCheckboxGroup.displayName = 'CheckboxGroup';\n\nexport type CheckboxGroupItemProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'checked' | 'onChange' | 'value'\n> & {\n /** The value this item contributes to the selection. */\n value: string;\n /** Visible label rendered next to the checkbox. */\n label?: string;\n};\n\n/** A single multi-select option inside a `CheckboxGroup`. */\nconst CheckboxGroupItem = React.forwardRef<HTMLInputElement, CheckboxGroupItemProps>(\n ({ value, label, className, id, ...props }, ref) => {\n const group = React.useContext(CheckboxGroupContext);\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n ref={ref}\n id={inputId}\n name={group.name}\n value={value}\n checked={group.values.includes(value)}\n onCheckedChange={() => group.toggle(value)}\n className={className}\n {...props}\n />\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n </label>\n )}\n </div>\n );\n }\n);\nCheckboxGroupItem.displayName = 'CheckboxGroupItem';\n\nexport { CheckboxGroup, CheckboxGroupItem };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type RadioProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'onChange'> & {\n /** Controlled checked state; omit for uncontrolled usage. */\n checked?: boolean;\n /** Fired when the user selects this radio. */\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/**\n * Accessible radio built on the native input, to be used inside a\n * `RadioGroup` (which provides the shared `name`). Platform keyboard\n * navigation and form semantics come for free.\n */\nconst Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ className, checked, onCheckedChange, ...props }, ref) => (\n <input\n type=\"radio\"\n ref={ref}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.target.checked)}\n className={cn(\n 'h-4 w-4 shrink-0 rounded-full border border-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'checked:bg-primary checked:text-primary-foreground',\n className\n )}\n {...props}\n />\n )\n);\nRadio.displayName = 'Radio';\n\nexport type RadioGroupProps = {\n /** Shared name applied to every radio in the group. */\n name: string;\n /** Accessible group label; rendered as <legend> inside a fieldset. */\n legend?: string;\n /** Currently selected value (controlled). */\n value?: string;\n /** Initial value (uncontrolled). */\n defaultValue?: string;\n /** Called with the newly selected value. */\n onValueChange?: (value: string) => void;\n /** Stack options (default) or lay them out in a wrapping row. */\n orientation?: 'vertical' | 'horizontal';\n /** Group-level validation message; announced via role=alert. */\n error?: string;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Groups related radios with a shared name and accessible legend.\n * Renders a native <fieldset>/<legend> so screen readers announce the\n * group context alongside each option.\n */\nconst RadioGroup = React.forwardRef<HTMLFieldSetElement, RadioGroupProps>(\n ({ name, legend, value, defaultValue, onValueChange, orientation = 'vertical', error, className, children }, ref) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue ?? '');\n const currentValue = value ?? internalValue;\n\n const handleChange = (next: string) => {\n if (value === undefined) setInternalValue(next);\n onValueChange?.(next);\n };\n\n return (\n <fieldset\n ref={ref}\n className={cn(\n orientation === 'vertical' ? 'space-y-2' : 'flex flex-row flex-wrap gap-x-4 gap-y-2',\n className\n )}\n >\n {legend && <legend className=\"text-sm font-medium\">{legend}</legend>}\n <RadioGroupContext.Provider value={{ name, value: currentValue, onChange: handleChange }}>\n {children}\n </RadioGroupContext.Provider>\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </fieldset>\n );\n }\n);\nRadioGroup.displayName = 'RadioGroup';\n\ntype RadioGroupContextValue = {\n name: string;\n value: string;\n onChange: (value: string) => void;\n};\n\n/** Shared group state — exported so custom option controls (RadioCard) can join a RadioGroup. */\nexport const RadioGroupContext = React.createContext<RadioGroupContextValue>({\n name: '',\n value: '',\n onChange: () => {},\n});\n\nexport type RadioGroupItemProps = Omit<RadioProps, 'name' | 'checked' | 'onCheckedChange' | 'value'> & {\n /** The value this item contributes to the group. */\n value: string;\n /** Visible label rendered next to the radio. */\n label?: string;\n};\n\n/** A single radio option inside a `RadioGroup`. */\nconst RadioGroupItem = React.forwardRef<HTMLInputElement, RadioGroupItemProps>(\n ({ value, label, className, id, ...props }, ref) => {\n const group = React.useContext(RadioGroupContext);\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className=\"flex items-center gap-2\">\n <Radio\n ref={ref}\n id={inputId}\n name={group.name}\n value={value}\n checked={group.value === value}\n onCheckedChange={(checked) => checked && group.onChange(value)}\n className={className}\n {...props}\n />\n {label && (\n <label htmlFor={inputId} className=\"text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n </label>\n )}\n </div>\n );\n }\n);\nRadioGroupItem.displayName = 'RadioGroupItem';\n\nexport { Radio, RadioGroup, RadioGroupItem };\n","'use client';\n\nimport * as React from 'react';\nimport { Radio, RadioGroupContext } from './Radio';\nimport { cn } from '../../utils/cn';\n\nexport type RadioCardProps = {\n /** The value this section contributes to the group. */\n value: string;\n /** Section heading. */\n title?: string;\n /** Supporting line under the title. */\n description?: string;\n /** Custom body rendered after title/description. */\n children?: React.ReactNode;\n /** Outer border radius on the section (default true). */\n rounded?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n};\n\n/**\n * A whole section as one radio option: the entire card is the label,\n * the native radio circle is visually hidden (kept for semantics and\n * keyboard use), and selection shows as a primary border + tint via\n * has-[:checked]. Meant to sit inside a `RadioGroup`.\n */\nconst RadioCard = React.forwardRef<HTMLLabelElement, RadioCardProps>(\n ({ value, title, description, children, rounded = true, disabled, className, id }, ref) => {\n const group = React.useContext(RadioGroupContext);\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n return (\n <label\n ref={ref}\n htmlFor={inputId}\n className={cn(\n 'flex cursor-pointer flex-col gap-1.5 border border-border p-4 transition-colors',\n rounded ? 'rounded-lg' : 'rounded-none',\n 'hover:border-muted-foreground/40 hover:bg-muted/30',\n // Selected state rides on the hidden input — no visible circle.\n 'has-[:checked]:border-primary has-[:checked]:bg-primary/5',\n 'has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-background',\n disabled && 'cursor-not-allowed opacity-50 hover:border-border hover:bg-transparent',\n className\n )}\n >\n <Radio\n id={inputId}\n value={value}\n checked={group.value === value}\n onCheckedChange={(checked) => checked && group.onChange(value)}\n disabled={disabled}\n className=\"sr-only\"\n />\n {title && <span className=\"text-sm font-medium leading-none\">{title}</span>}\n {description && <span className=\"text-sm text-muted-foreground\">{description}</span>}\n {children}\n </label>\n );\n }\n);\nRadioCard.displayName = 'RadioCard';\n\nexport { RadioCard };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type LabelProps = React.LabelHTMLAttributes<HTMLLabelElement>;\n\n/**\n * Accessible form label. Associates with its control via `htmlFor`\n * (or wraps it) so screen readers announce the field name together\n * with its value and state.\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n />\n )\n);\nLabel.displayName = 'Label';\n\nexport { Label };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type FieldsetProps = React.FieldsetHTMLAttributes<HTMLFieldSetElement> & {\n /** Legend rendered as the group's accessible name. */\n legend?: string;\n /** Muted supporting line rendered under the legend. */\n description?: string;\n /** Error line rendered under the controls; announced via role=alert. */\n error?: string;\n};\n\n/**\n * Groups related form controls in a native <fieldset> with a legend,\n * optional description, and an error slot. Styling is token-based\n * (borderless by default — the native border reads as chrome, not content).\n */\nconst Fieldset = React.forwardRef<HTMLFieldSetElement, FieldsetProps>(\n ({ legend, description, error, className, children, ...props }, ref) => (\n <fieldset\n ref={ref}\n className={cn('m-0 flex min-w-0 flex-col gap-1.5 border-0 p-0', className)}\n {...props}\n >\n {legend && <legend className=\"p-0 text-sm font-medium leading-none\">{legend}</legend>}\n {description && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n {children}\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </fieldset>\n )\n);\nFieldset.displayName = 'Fieldset';\n\nexport { Fieldset };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Label } from '../label/Label';\nimport { Tooltip } from '../tooltip/Tooltip';\n\nexport type FormFieldLabelPlacement = 'top' | 'left';\n\nexport type FormFieldProps = {\n /**\n * The control's id. The same value is applied to the label's htmlFor, the\n * control (via clone), and the hint/error describedby wiring.\n */\n id: string;\n /** Visible label text (screen-reader visible even when labelHidden). */\n label: string;\n /** Helper text rendered under the control and wired via aria-describedby. */\n hint?: string;\n /**\n * Validation error; replaces the hint, sets aria-invalid on the control,\n * announced via role=alert.\n */\n error?: string;\n /** Renders the required marker and (via the cloned control) keeps the native required attribute. */\n required?: boolean;\n /** Keeps the label for assistive tech but hides it visually. */\n labelHidden?: boolean;\n /** Stack the label above the control (default) or inline it to the left. */\n labelPlacement?: FormFieldLabelPlacement;\n /** Info icon rendered after the label; opens a tooltip with this text. */\n tooltip?: string;\n /** Slot pinned to the far right of the label row (badge, link, action). */\n trailing?: React.ReactNode;\n className?: string;\n /**\n * The control. When it is a single React element (Slipstream inputs,\n * native inputs…), id / aria-describedby / aria-invalid are cloned onto\n * it automatically; wrapped or custom children must set them manually.\n */\n children: React.ReactNode;\n};\n\ntype CloneableProps = Record<string, unknown>;\n\n/**\n * Label + control + hint/error in one unit with the a11y wiring done for\n * you: htmlFor pairing, aria-describedby pointing at the hint (or error),\n * and aria-invalid when an error is present. Supports top or left label\n * placement, a label tooltip with info icon, and a trailing slot on the\n * right of the label row.\n */\nconst FormField = ({\n id,\n label,\n hint,\n error,\n required,\n labelHidden,\n labelPlacement = 'top',\n tooltip,\n trailing,\n className,\n children,\n}: FormFieldProps) => {\n const hintId = `${id}-hint`;\n const errorId = `${id}-error`;\n const describedBy = error ? errorId : hint ? hintId : undefined;\n\n let control = children;\n // Fragments/multi-children can't receive wired props — consumers must set\n // id/aria-describedby on those children themselves (documented).\n if (React.isValidElement<CloneableProps>(children) && children.type !== React.Fragment) {\n control = React.cloneElement<CloneableProps>(children, {\n id,\n 'aria-describedby': describedBy,\n ...(error ? { 'aria-invalid': true } : {}),\n });\n }\n\n const labelNode = (\n <Label htmlFor={id} className={labelHidden ? 'sr-only' : undefined}>\n {label}\n {required && (\n <>\n {' '}\n <span aria-hidden=\"true\" className=\"ml-0.5 text-destructive\">\n *\n </span>\n </>\n )}\n </Label>\n );\n\n const tooltipNode = tooltip ? (\n <Tooltip content={tooltip} side=\"top\">\n <button\n type=\"button\"\n aria-label={`${label} information`}\n className=\"ml-1 inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <svg viewBox=\"0 0 16 16\" className=\"h-3.5 w-3.5\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM8 7a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 7Zm0-2.25a.9.9 0 1 1 0 1.8.9.9 0 0 1 0-1.8Z\" />\n </svg>\n </button>\n </Tooltip>\n ) : null;\n\n const hintOrError = error ? (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n ) : hint ? (\n <p id={hintId} className=\"text-xs text-muted-foreground\">\n {hint}\n </p>\n ) : null;\n\n if (labelPlacement === 'left') {\n return (\n <div className={cn('flex min-w-0 flex-col gap-1.5', className)}>\n <div className=\"flex items-start gap-3\">\n <div className=\"flex w-40 shrink-0 items-center gap-1 pt-2\">\n {labelNode}\n {tooltipNode}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n {/* Trailing sits inline with the control (vertically centered),\n not floating above it — keeps the row reading as one field. */}\n <div className=\"flex min-w-0 items-center gap-2\">\n <div className=\"min-w-0 flex-1\">{control}</div>\n {trailing && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{trailing}</span>\n )}\n </div>\n {hintOrError}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn('flex min-w-0 flex-col gap-1.5', className)}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center\">\n {labelNode}\n {tooltipNode}\n </span>\n {trailing}\n </div>\n {control}\n {hintOrError}\n </div>\n );\n};\nFormField.displayName = 'FormField';\n\nexport { FormField };\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\nexport type TooltipProps = {\n /** The tooltip text. */\n content: string;\n /** Placement relative to the trigger (defaults to top). */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Delay before showing on hover, in milliseconds. */\n delay?: number;\n className?: string;\n /** A single focusable element; receives aria-describedby when open. */\n children: React.ReactElement;\n};\n\ntype Position = { top: number; left: number; transform: string };\n\nconst GAP = 8;\n\n/**\n * Hover/focus tooltip built on aria-describedby. Shows on pointer\n * hover and keyboard focus (not click), dismisses on Escape, and\n * never traps focus.\n *\n * The bubble portals to document.body with position:fixed, measured from\n * the trigger — overflowing a scrollable ancestor can never clip it or\n * scroll the container (the reported \"tooltip causes scroll\" bug).\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ content, side = 'top', delay = 300, className, children }, ref) => {\n const [open, setOpen] = React.useState(false);\n const [pos, setPos] = React.useState<Position | null>(null);\n const anchorRef = React.useRef<HTMLDivElement | null>(null);\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const id = React.useId();\n\n const show = React.useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setOpen(true), delay);\n }, [delay]);\n\n const hide = React.useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setOpen(false);\n setPos(null);\n }, []);\n\n React.useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n []\n );\n\n // Measure the trigger for fixed positioning; scroll/resize dismisses\n // the bubble so it can never drift from (or scroll with) its anchor.\n React.useLayoutEffect(() => {\n if (!open) return;\n const rect = anchorRef.current?.getBoundingClientRect();\n if (!rect) return;\n const next: Position =\n side === 'top'\n ? { top: rect.top - GAP, left: rect.left + rect.width / 2, transform: 'translate(-50%, -100%)' }\n : side === 'bottom'\n ? { top: rect.bottom + GAP, left: rect.left + rect.width / 2, transform: 'translate(-50%, 0)' }\n : side === 'left'\n ? { top: rect.top + rect.height / 2, left: rect.left - GAP, transform: 'translate(-100%, -50%)' }\n : { top: rect.top + rect.height / 2, left: rect.right + GAP, transform: 'translate(0, -50%)' };\n setPos(next);\n const onScrollOrResize = () => hide();\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n return () => {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n };\n }, [open, side, hide]);\n\n // Inject aria-describedby into the trigger so the hint is announced\n // alongside the trigger's own accessible name.\n const trigger = React.cloneElement(children, {\n 'aria-describedby': open ? id : undefined,\n } as React.Attributes);\n\n return (\n <div\n ref={(node) => {\n anchorRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n className={cn('relative inline-flex', className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocusCapture={show}\n onBlurCapture={hide}\n onKeyDown={(event) => {\n if (event.key === 'Escape' && open) {\n event.stopPropagation();\n hide();\n }\n }}\n >\n {trigger}\n {open &&\n pos &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n id={id}\n role=\"tooltip\"\n style={{ position: 'fixed', top: pos.top, left: pos.left, transform: pos.transform, zIndex: 60 }}\n className=\"pointer-events-none w-max max-w-xs rounded-md border border-border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md\"\n >\n {content}\n </div>,\n document.body\n )}\n </div>\n );\n }\n);\nTooltip.displayName = 'Tooltip';\n\nexport { Tooltip };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\nexport type FormVariant = 'default' | 'card' | 'inline';\n\nexport type FormProps = React.FormHTMLAttributes<HTMLFormElement> & {\n /** Visual container: plain stack (default), bordered card, or inline row. */\n variant?: FormVariant;\n /** Even spacing between children — token ('md') or exact pixels (16). */\n gap?: GapValue;\n};\n\n/**\n * Semantic <form> with an even-spacing layout built in: children stack\n * vertically (default), render as a bordered card, or flow inline on one\n * row. Native submit/validation semantics are untouched — wire onSubmit\n * and use noValidate only when you validate manually (e.g. with FormField\n * error states).\n */\nconst Form = React.forwardRef<HTMLFormElement, FormProps>(\n ({ variant = 'default', gap, className, style, ...props }, ref) => {\n const gapResolved = resolveGap(gap ?? 'md');\n return (\n <form\n ref={ref}\n className={cn(\n 'flex min-w-0 flex-col',\n variant === 'card' && 'rounded-lg border border-border bg-card p-6',\n variant === 'inline' && 'flex-row flex-wrap items-end',\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n {...props}\n />\n );\n }\n);\nForm.displayName = 'Form';\n\nexport { Form };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\n// Literal classes so Tailwind's scanner keeps them (runtime-built\n// grid-cols-${n} would be purged — same rule as Grid).\nconst GRID_COLUMNS: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n};\n\nexport type FormLayoutProps = React.HTMLAttributes<HTMLElement> & {\n /** Grouping layout: even vertical stack (default), horizontal row, or responsive grid. */\n layout?: 'stack' | 'row' | 'grid';\n /** Grid column count (1-4); grid wraps naturally via responsive variants passed as className. */\n columns?: 1 | 2 | 3 | 4;\n /** Even spacing between children — token ('md') or exact pixels (16). */\n gap?: GapValue;\n /** Group label; renders a semantic <legend> when as=\"fieldset\". */\n legend?: string;\n /** Supporting line under the legend (fieldset mode). */\n description?: string;\n /** Render as a semantic fieldset (default 'div'). */\n as?: 'div' | 'fieldset';\n};\n\n/**\n * Groups form fields with even, tokenized spacing — the layout half of\n * form composition (FormField/Fieldset provide the per-control semantics).\n * stack keeps one field per row, row flows fields inline, grid spreads\n * them across columns (1-4, literal classes so they survive purging).\n */\nconst FormLayout = React.forwardRef<HTMLElement, FormLayoutProps>(\n (\n {\n layout = 'stack',\n columns = 2,\n gap,\n legend,\n description,\n as = 'div',\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const Tag = as as 'div' | 'fieldset';\n const gapResolved = resolveGap(gap ?? 'md');\n return (\n <Tag\n ref={ref as never}\n className={cn(\n 'flex min-w-0',\n layout === 'stack' && 'flex-col',\n layout === 'row' && 'flex-row flex-wrap items-end',\n layout === 'grid' && `grid ${GRID_COLUMNS[columns]}`,\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n {...props}\n >\n {legend && as === 'fieldset' && (\n <legend className=\"col-span-full p-0 text-sm font-medium leading-none\">{legend}</legend>\n )}\n {description && as === 'fieldset' && (\n <p className=\"col-span-full text-xs text-muted-foreground\">{description}</p>\n )}\n {children}\n </Tag>\n );\n }\n);\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type SwitchProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> & {\n /** Controlled on/off state. */\n checked?: boolean;\n /** Initial state when uncontrolled. */\n defaultChecked?: boolean;\n /** Fired when the user toggles the switch. */\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/**\n * Toggle switch for binary settings. Rendered as a button with\n * `role=\"switch\"` and `aria-checked`, so screen readers announce\n * on/off state and keyboard users toggle with Enter or Space.\n */\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n ({ className, checked, defaultChecked, onCheckedChange, disabled, ...props }, ref) => {\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked ?? false);\n const isOn = checked ?? internalChecked;\n\n const toggle = () => {\n if (checked === undefined) setInternalChecked((prev) => !prev);\n onCheckedChange?.(!isOn);\n };\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n ref={ref}\n disabled={disabled}\n onClick={toggle}\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n isOn ? 'bg-primary' : 'bg-input',\n className\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg transition-transform',\n isOn ? 'translate-x-4' : 'translate-x-0'\n )}\n />\n </button>\n );\n }\n);\nSwitch.displayName = 'Switch';\n\nexport { Switch };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst separatorVariants = cva('shrink-0 bg-border', {\n variants: {\n orientation: {\n horizontal: 'h-px w-full',\n vertical: 'h-full w-px',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\nexport type SeparatorProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof separatorVariants> & {\n /** Accessible label for the dividing line (e.g. \"section break\"). */\n label?: string;\n};\n\n/**\n * Visual divider between content blocks. Decorative by default\n * (`role=\"none\"`); pass `label` to expose a semantic separator that\n * screen readers can announce.\n */\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n ({ className, orientation, label, ...props }, ref) => (\n <div\n ref={ref}\n role={label ? 'separator' : 'none'}\n aria-label={label}\n aria-orientation={orientation === 'vertical' ? 'vertical' : undefined}\n className={cn(separatorVariants({ orientation }), className)}\n {...props}\n />\n )\n);\nSeparator.displayName = 'Separator';\n\n/**\n * `Divider` is a semantic alias for the same primitive — either name works;\n * `Separator` follows the ARIA role terminology, `Divider` reads better in\n * layout code.\n */\nconst Divider = Separator;\n\nexport { Separator, Divider, separatorVariants };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nconst roundedClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n} as const;\n\nexport type SkeletonProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Tailwind height class for the block (e.g. 'h-4'). */\n height?: string;\n /** Tailwind width class for the block (e.g. 'w-48', 'w-full'). */\n width?: string;\n /** Corner rounding preset (default 'md'). */\n rounded?: keyof typeof roundedClasses;\n};\n\n/**\n * Loading placeholder that mirrors the shape of upcoming content.\n * Sizing lives on props (height/width/rounded) instead of ad-hoc\n * className strings. Marked `aria-hidden` so screen readers skip it —\n * pair with a live-region status elsewhere to announce loading.\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, height, width, rounded = 'md', ...props }, ref) => (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={cn(\n 'animate-pulse bg-muted motion-reduce:animate-none',\n roundedClasses[rounded],\n height,\n width,\n className\n )}\n {...props}\n />\n )\n);\nSkeleton.displayName = 'Skeleton';\n\nexport { Skeleton };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type ProgressProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Current value between 0 and `max`. */\n value?: number;\n /** Upper bound (default 100). */\n max?: number;\n /** Accessible label announced by screen readers. */\n label?: string;\n};\n\n/**\n * Determinate progress bar. Exposes `role=\"progressbar\"` with\n * `aria-valuenow`/`aria-valuemax` so assistive tech reports the exact\n * percentage; the visual track is pure CSS.\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({ className, value = 0, max = 100, label, ...props }, ref) => {\n const clamped = Math.min(Math.max(value, 0), max);\n const percent = max > 0 ? (clamped / max) * 100 : 0;\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label}\n className={cn('relative h-2 w-full overflow-hidden rounded-full bg-muted', className)}\n {...props}\n >\n <div\n className=\"h-full bg-primary transition-all duration-300 motion-reduce:transition-none\"\n style={{ width: `${percent}%` }}\n />\n </div>\n );\n }\n);\nProgress.displayName = 'Progress';\n\nexport { Progress };\n","'use client';\n\nimport * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\ntype TabsVariant = 'default' | 'underline' | 'rounded';\ntype TabsSize = 'sm' | 'md' | 'lg';\n\ntype TabsContextValue = {\n value: string;\n setValue: (value: string) => void;\n baseId: string;\n variant: TabsVariant;\n size: TabsSize;\n};\n\nconst TabsContext = React.createContext<TabsContextValue>({\n value: '',\n setValue: () => {},\n baseId: '',\n variant: 'default',\n size: 'md',\n});\n\nexport type TabsProps = {\n /** Controlled active tab value. */\n value?: string;\n /** Initial tab value when uncontrolled. */\n defaultValue?: string;\n /** Called when the active tab changes. */\n onValueChange?: (value: string) => void;\n /** Visual style of the tab strip. Default is the enclosed pill track. */\n variant?: TabsVariant;\n /** Control density for strip and triggers. */\n size?: TabsSize;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Tabbed content container. Manages the active tab and wires ARIA\n * tablist/tab/tabpanel semantics with roving-tabindex keyboard\n * navigation (arrow keys, Home/End).\n */\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n (\n { value, defaultValue, onValueChange, variant = 'default', size = 'md', className, children },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue ?? '');\n const current = value ?? internalValue;\n const baseId = React.useId();\n\n const setValue = React.useCallback(\n (next: string) => {\n if (value === undefined) setInternalValue(next);\n onValueChange?.(next);\n },\n [value, onValueChange]\n );\n\n return (\n <div ref={ref} className={className} data-value={current} data-variant={variant}>\n <TabsContext.Provider value={{ value: current, setValue, baseId, variant, size }}>\n {children}\n </TabsContext.Provider>\n </div>\n );\n }\n);\nTabs.displayName = 'Tabs';\n\nconst tabsListVariants = cva('inline-flex items-center justify-center text-muted-foreground', {\n variants: {\n variant: {\n default: 'rounded-md bg-muted p-1',\n // Item 18: underline strips carry no background — the underline alone\n // marks the active tab.\n underline: 'gap-1 rounded-none border-b border-border bg-transparent p-0',\n // Item 9: fully-rounded pill track with pill triggers.\n rounded: 'rounded-full bg-muted p-1',\n },\n size: {\n sm: 'gap-0.5',\n md: 'gap-1',\n lg: 'gap-1.5',\n },\n },\n defaultVariants: { variant: 'default', size: 'md' },\n});\n\nexport type TabsListProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Container for the tab triggers; renders `role=\"tablist\"`. */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n const ctx = React.useContext(TabsContext);\n return (\n <div\n ref={ref}\n role=\"tablist\"\n className={cn(tabsListVariants({ variant: ctx.variant, size: ctx.size }), className)}\n {...props}\n />\n );\n }\n);\nTabsList.displayName = 'TabsList';\n\nconst tabsTriggerVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all',\n {\n variants: {\n variant: {\n default: 'rounded-sm px-3 py-1.5 text-sm',\n underline: 'rounded-none border-b-2 border-transparent px-3 pb-2 pt-1.5 text-sm',\n rounded: 'rounded-full px-3 py-1.5 text-sm',\n },\n size: {\n sm: 'px-2 py-1 text-xs',\n md: '',\n lg: 'px-4 py-2 text-sm',\n },\n },\n defaultVariants: { variant: 'default', size: 'md' },\n }\n);\n\nconst triggerActiveByVariant: Record<TabsVariant, string> = {\n default: 'bg-background text-foreground shadow-sm',\n underline: 'border-primary text-foreground',\n rounded: 'bg-background text-foreground shadow-sm',\n};\n\nconst triggerInactiveByVariant: Record<TabsVariant, string> = {\n default: 'hover:text-foreground',\n underline: 'border-transparent text-muted-foreground hover:border-border hover:text-foreground',\n rounded: 'hover:text-foreground',\n};\n\nexport type TabsTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** The tab's value; links it to its panel. */\n value: string;\n};\n\n/** A single tab button. Roving tabindex plus full arrow-key navigation. */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ value, className, onKeyDown, ...props }, ref) => {\n const ctx = React.useContext(TabsContext);\n const active = ctx.value === value;\n\n // WAI-ARIA tabs pattern: arrows move AND activate (automatic activation).\n const focusAt = (tabs: Element[], index: number) => {\n if (tabs.length === 0) return;\n const next = (index + tabs.length) % tabs.length;\n const target = tabs[next] as HTMLButtonElement;\n target.focus();\n target.click();\n };\n\n const siblingTabs = (button: HTMLButtonElement): Element[] =>\n Array.from(button.parentElement?.querySelectorAll('[role=\"tab\"]') ?? []);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={`${ctx.baseId}-tab-${value}`}\n aria-selected={active}\n aria-controls={`${ctx.baseId}-panel-${value}`}\n // Radix-compatible hook so consumers can style active state from\n // outside: data-[state=active]:border-primary etc.\n data-state={active ? 'active' : 'inactive'}\n tabIndex={active ? 0 : -1}\n onClick={() => ctx.setValue(value)}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n ctx.setValue(value);\n } else if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault();\n const tabs = siblingTabs(event.currentTarget);\n focusAt(tabs, tabs.indexOf(event.currentTarget) + 1);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault();\n const tabs = siblingTabs(event.currentTarget);\n focusAt(tabs, tabs.indexOf(event.currentTarget) - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n focusAt(siblingTabs(event.currentTarget), 0);\n } else if (event.key === 'End') {\n event.preventDefault();\n focusAt(siblingTabs(event.currentTarget), -1);\n }\n }}\n className={cn(\n tabsTriggerVariants({ variant: ctx.variant, size: ctx.size }),\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n active ? triggerActiveByVariant[ctx.variant] : triggerInactiveByVariant[ctx.variant],\n className\n )}\n {...props}\n />\n );\n }\n);\nTabsTrigger.displayName = 'TabsTrigger';\n\nexport type TabsContentProps = React.HTMLAttributes<HTMLDivElement> & {\n /** The panel's value; must match its trigger. */\n value: string;\n};\n\n/** The content panel for a tab. Hidden via the `hidden` attribute when inactive. */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ value, className, ...props }, ref) => {\n const ctx = React.useContext(TabsContext);\n const active = ctx.value === value;\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`${ctx.baseId}-panel-${value}`}\n aria-labelledby={`${ctx.baseId}-tab-${value}`}\n data-state={active ? 'active' : 'inactive'}\n hidden={!active}\n tabIndex={0}\n className={cn(\n 'mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n />\n );\n }\n);\nTabsContent.displayName = 'TabsContent';\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type CardProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Content container with a subtle border and surface styling. */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('rounded-xl border border-border bg-card text-card-foreground shadow-sm', className)}\n {...props}\n />\n )\n);\nCard.displayName = 'Card';\n\nexport type CardHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Header section of a Card; typically contains CardTitle and CardDescription. */\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n )\n);\nCardHeader.displayName = 'CardHeader';\n\nexport type CardTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/** Title heading inside a CardHeader. */\nconst CardTitle = React.forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n )\n);\nCardTitle.displayName = 'CardTitle';\n\nexport type CardDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\n/** Supporting text inside a CardHeader. */\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n )\n);\nCardDescription.displayName = 'CardDescription';\n\nexport type CardContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Main content area of a Card. */\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n )\n);\nCardContent.displayName = 'CardContent';\n\nexport type CardFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Footer section of a Card; typically contains actions. */\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n )\n);\nCardFooter.displayName = 'CardFooter';\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\ntype AccordionContextValue = {\n openItems: Set<string>;\n toggle: (id: string) => void;\n /** Whether only one item may be open at a time. */\n collapsible: boolean;\n};\n\nconst AccordionContext = React.createContext<AccordionContextValue>({\n openItems: new Set(),\n toggle: () => {},\n collapsible: true,\n});\n\nexport type AccordionProps = {\n /** Controlled open item ids. */\n value?: string[];\n /** Initial open item ids when uncontrolled. */\n defaultValue?: string[];\n /** Called when the open set changes. */\n onValueChange?: (value: string[]) => void;\n /** When true (default), opening an item closes the others. */\n collapsible?: boolean;\n /** 'default' = bordered card with dividers; 'borderless' = plain stacked sections. */\n variant?: 'default' | 'borderless';\n /** Token gap ('lg') or exact pixels (16) between items. */\n gap?: GapValue;\n className?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n};\n\n/**\n * Collapsible content sections with proper ARIA accordion semantics.\n * Each item's trigger announces its expanded state and controls its panel.\n */\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n (\n {\n value,\n defaultValue = [],\n onValueChange,\n collapsible = true,\n variant = 'default',\n gap,\n className,\n style,\n children,\n },\n ref\n ) => {\n const [internalOpen, setInternalOpen] = React.useState<string[]>(defaultValue);\n const current = value ?? internalOpen;\n\n const toggle = React.useCallback(\n (id: string) => {\n const next = current.includes(id)\n ? current.filter((item) => item !== id)\n : collapsible\n ? [id]\n : [...current, id];\n if (value === undefined) setInternalOpen(next);\n onValueChange?.(next);\n },\n [current, collapsible, value, onValueChange]\n );\n\n const gapResolved = resolveGap(gap);\n\n return (\n <div\n ref={ref}\n className={cn(\n // flex-col so token/px gaps apply (gap is a flex property);\n // divide-y rides along in the default variant.\n 'flex w-full flex-col',\n variant === 'default' && 'rounded-lg border border-border divide-y divide-border',\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n >\n <AccordionContext.Provider value={{ openItems: new Set(current), toggle, collapsible }}>\n {children}\n </AccordionContext.Provider>\n </div>\n );\n }\n);\nAccordion.displayName = 'Accordion';\n\nexport type AccordionItemProps = {\n /** Unique id linking the trigger to its panel. */\n id: string;\n className?: string;\n children: React.ReactNode;\n};\n\n/** A single collapsible section. */\nconst AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ id, className, children }, ref) => (\n <div ref={ref} data-accordion-item={id} className={className}>\n <AccordionItemContext.Provider value={{ id }}>{children}</AccordionItemContext.Provider>\n </div>\n )\n);\nAccordionItem.displayName = 'AccordionItem';\n\nconst AccordionItemContext = React.createContext<{ id: string }>({ id: '' });\n\nexport type AccordionTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Replace the default chevron (rendered at the far right of the header). */\n icon?: React.ReactNode;\n};\n\n/** The clickable header that expands/collapses its panel. */\nconst AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n ({ className, children, icon, ...props }, ref) => {\n const { id } = React.useContext(AccordionItemContext);\n const { openItems, toggle } = React.useContext(AccordionContext);\n const open = openItems.has(id);\n const panelId = `${id}-panel`;\n const triggerId = `${id}-trigger`;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => toggle(id)}\n className={cn(\n // w-full keeps the header clickable edge-to-edge in closed AND\n // open states; the icon slot sits at the far right via justify-between.\n 'flex w-full flex-1 items-center justify-between px-4 py-3 text-left text-sm font-medium transition-colors',\n 'hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n >\n {children}\n {icon ?? (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className={cn('h-4 w-4 shrink-0 transition-transform duration-200', open && 'rotate-180')}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )}\n </button>\n );\n }\n);\nAccordionTrigger.displayName = 'AccordionTrigger';\n\nexport type AccordionContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** The collapsible panel; hidden from assistive tech when collapsed. */\nconst AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n ({ className, children, ...props }, ref) => {\n const { id } = React.useContext(AccordionItemContext);\n const { openItems } = React.useContext(AccordionContext);\n const open = openItems.has(id);\n\n // Expansion animation via grid-template-rows (0fr -> 1fr): supported\n // in Chrome 117+/Firefox 66+/Safari 17+, and degrades to an instant\n // toggle elsewhere because the rows value simply stops interpolating.\n // The `hidden` attribute stays bound to `open` (synchronous) so panels\n // are removed from the a11y tree and tab order the moment they close.\n const [expanded, setExpanded] = React.useState(open);\n React.useEffect(() => {\n if (!open) {\n setExpanded(false);\n return;\n }\n const reduce =\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (reduce) {\n setExpanded(true);\n return;\n }\n let second = 0;\n const first = requestAnimationFrame(() => {\n second = requestAnimationFrame(() => setExpanded(true));\n });\n return () => {\n cancelAnimationFrame(first);\n cancelAnimationFrame(second);\n };\n }, [open]);\n\n return (\n <div\n ref={ref}\n id={`${id}-panel`}\n role=\"region\"\n aria-labelledby={`${id}-trigger`}\n hidden={!open}\n className={cn(\n // No display utility while closed: author styles would beat the\n // UA [hidden] rule and keep the collapsed panel visible.\n open &&\n cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n ),\n !open && 'grid-rows-[0fr]',\n className\n )}\n {...props}\n >\n <div className=\"overflow-hidden\">\n <div className=\"px-4 pb-3 text-sm text-muted-foreground\">{children}</div>\n </div>\n </div>\n );\n }\n);\nAccordionContent.displayName = 'AccordionContent';\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type TableProps = React.HTMLAttributes<HTMLTableElement>;\n\n/** Semantic table wrapper with consistent borders and striping. */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n )\n);\nTable.displayName = 'Table';\n\nexport type TableHeaderProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\n/** Groups the header row(s). */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n )\n);\nTableHeader.displayName = 'TableHeader';\n\nexport type TableBodyProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\n/** Groups the body row(s). */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n )\n);\nTableBody.displayName = 'TableBody';\n\nexport type TableFooterProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\n/** Groups the footer row(s) for summary content. */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n )\n);\nTableFooter.displayName = 'TableFooter';\n\nexport type TableRowProps = React.HTMLAttributes<HTMLTableRowElement>;\n\n/** A table row. */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className\n )}\n {...props}\n />\n )\n);\nTableRow.displayName = 'TableRow';\n\nexport type TableHeadProps = React.ThHTMLAttributes<HTMLTableCellElement>;\n\n/** A header cell. */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n scope=\"col\"\n className={cn(\n 'h-10 px-3 text-left align-middle text-xs font-medium uppercase tracking-wider text-muted-foreground',\n className\n )}\n {...props}\n />\n )\n);\nTableHead.displayName = 'TableHead';\n\nexport type TableCellProps = React.TdHTMLAttributes<HTMLTableCellElement>;\n\n/** A data cell. */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td ref={ref} className={cn('px-3 py-2 align-middle', className)} {...props} />\n )\n);\nTableCell.displayName = 'TableCell';\n\nexport type TableCaptionProps = React.HTMLAttributes<HTMLTableCaptionElement>;\n\n/** Accessible caption describing the table's contents. */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n ({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-3 text-xs text-muted-foreground', className)} {...props} />\n )\n);\nTableCaption.displayName = 'TableCaption';\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n};\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Pagination } from '../pagination/Pagination';\nimport { Skeleton } from '../skeleton/Skeleton';\n\nexport type DataTableColumn<T> = {\n /** Unique column key; also the value passed to onSortChange when sortable. */\n key: string;\n /** Header cell content. */\n header: React.ReactNode;\n /**\n * Cell renderer. Defaults to reading `row[key]` (nullish values render\n * as an em dash).\n */\n cell?: (row: T, index: number) => React.ReactNode;\n /** Enables a sort toggle on this column's header. */\n sortable?: boolean;\n align?: 'left' | 'center' | 'right';\n /** Extra classes for the th/td cells (e.g. 'w-40', 'hidden sm:table-cell'). */\n className?: string;\n /** Per-cell click callback — the cell content renders as a button. */\n onClick?: (row: T) => void;\n};\n\nexport type SortIconState = 'none' | 'asc' | 'desc';\n\nexport type DataTableProps<T> = {\n /** Column configuration — everything about the table's shape. */\n columns: DataTableColumn<T>[];\n /** Row data. */\n data: T[];\n /** Stable id per row (React key + test hooks). */\n rowId: (row: T) => string;\n /** Accessible table caption (visible; pass captionHidden styling to hide). */\n caption?: string;\n /** Initial sort (uncontrolled). Omit for no initial sort. */\n defaultSort?: { key: string; dir: 'asc' | 'desc' } | null;\n /** Controlled sort. */\n sortKey?: string | null;\n sortDir?: 'asc' | 'desc';\n /**\n * Fires when the sort changes (controlled or not) — wire it to a server\n * query to sort at the database while DataTable renders aria-sort.\n */\n onSortChange?: (key: string, dir: 'asc' | 'desc') => void;\n /** Replace the default ▲/▼/↕ header glyphs. */\n renderSortIcon?: (state: SortIconState) => React.ReactNode;\n /** Rows per page; enables pagination when set. */\n pageSize?: number;\n /** Controlled page (1-based) when pageSize is set. */\n page?: number;\n /** Fires on page change (controlled or not). */\n onPageChange?: (page: number) => void;\n /** Click/keyboard activation on a row. */\n onRowClick?: (row: T) => void;\n /** Message shown when data is empty. */\n emptyMessage?: string;\n /** Pin the header while the body scrolls (needs a max-height on the wrapper via className). */\n stickyHeader?: boolean;\n /** Compact row density. */\n density?: 'default' | 'compact';\n /** Zebra-striped rows. */\n zebra?: boolean;\n /** Render skeleton placeholder rows (announced via aria-busy). */\n loading?: boolean;\n /**\n * Skeleton row count while loading (defaults to the page size, else 5).\n * Match it to your visible data length so rows don't jump when real\n * data replaces the placeholders.\n */\n loadingRows?: number;\n className?: string;\n};\n\ntype SortState = { key: string; dir: 'asc' | 'desc' } | null;\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n const an = a == null ? '' : String(a);\n const bn = b == null ? '' : String(b);\n return an.localeCompare(bn, undefined, { numeric: true, sensitivity: 'base' });\n}\n\n/**\n * Config-driven table: one component + a `columns` config that owns shape,\n * sorting, pagination, and row interaction. Built-in sorting toggles with\n * aria-sort, cursor pagination when `pageSize` is set, and a friendly empty\n * state — so most tables never need hand-rolled table code.\n */\nexport function DataTable<T>({\n columns,\n data,\n rowId,\n caption,\n defaultSort = null,\n sortKey,\n sortDir,\n onSortChange,\n renderSortIcon,\n pageSize,\n page,\n onPageChange,\n onRowClick,\n emptyMessage = 'No results.',\n stickyHeader,\n density = 'default',\n zebra,\n loading,\n loadingRows,\n className,\n}: DataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<SortState>(defaultSort);\n const [internalPage, setInternalPage] = React.useState(1);\n\n const sort = React.useMemo<SortState>(() => {\n if (sortKey !== undefined) {\n return sortKey === null ? null : { key: sortKey, dir: sortDir ?? 'asc' };\n }\n return internalSort;\n }, [sortKey, sortDir, internalSort]);\n const currentPage = page ?? internalPage;\n\n const applySort = (key: string) => {\n const nextDir: 'asc' | 'desc' = sort?.key === key && sort.dir === 'asc' ? 'desc' : 'asc';\n if (sortKey === undefined) setInternalSort({ key, dir: nextDir });\n onSortChange?.(key, nextDir);\n if (pageSize && currentPage !== 1) setPage(1);\n };\n\n const setPage = (next: number) => {\n if (page === undefined) setInternalPage(next);\n onPageChange?.(next);\n };\n\n const sorted = React.useMemo(() => {\n if (!sort) return data;\n const column = columns.find((c) => c.key === sort.key);\n if (!column) return data;\n const read = (row: T): unknown =>\n column.cell ? undefined : (row as unknown as Record<string, unknown>)[column.key];\n // When a custom cell renders the value, fall back to the raw key access\n // for sorting — configs should keep row data addressable by column.key.\n const copy = [...data];\n copy.sort((a, b) => {\n const cmp = compareValues(\n (a as unknown as Record<string, unknown>)[column.key] ?? read(a),\n (b as unknown as Record<string, unknown>)[column.key] ?? read(b)\n );\n return sort.dir === 'asc' ? cmp : -cmp;\n });\n return copy;\n }, [data, sort, columns]);\n\n const pageCount = pageSize ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 0;\n const safePage = Math.min(currentPage, pageCount || 1);\n const visible = pageSize\n ? sorted.slice((safePage - 1) * pageSize, safePage * pageSize)\n : sorted;\n\n const cellValue = (row: T, column: DataTableColumn<T>, index: number): React.ReactNode => {\n if (column.cell) return column.cell(row, index);\n const raw = (row as unknown as Record<string, unknown>)[column.key];\n if (raw == null) return '—';\n if (typeof raw === 'string' || typeof raw === 'number') return raw;\n return String(raw);\n };\n\n const alignClass = (align?: DataTableColumn<T>['align']) =>\n align === 'right' ? 'text-right' : align === 'center' ? 'text-center' : 'text-left';\n\n return (\n <div className={cn('w-full space-y-3', className)}>\n <div className=\"w-full overflow-x-auto rounded-lg border border-border\">\n <table\n className={cn('w-full caption-bottom', density === 'compact' ? 'text-xs' : 'text-sm')}\n >\n {caption && <caption className=\"px-3 py-2 text-left text-xs text-muted-foreground\">{caption}</caption>}\n <thead className={cn('bg-muted/50', stickyHeader && 'sticky top-0 z-10 bg-background')}>\n <tr>\n {columns.map((column) => {\n const isSorted = sort?.key === column.key;\n const ariaSort = !column.sortable\n ? undefined\n : isSorted\n ? sort!.dir === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={column.key}\n scope=\"col\"\n aria-sort={ariaSort}\n className={cn(\n 'border-b border-border px-3 py-2 font-medium',\n alignClass(column.align),\n column.className\n )}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => applySort(column.key)}\n className=\"inline-flex items-center gap-1 rounded px-1 py-0.5 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {column.header}\n <span aria-hidden=\"true\" className=\"text-[10px] text-muted-foreground\">\n {renderSortIcon\n ? renderSortIcon(isSorted ? (sort!.dir === 'asc' ? 'asc' : 'desc') : 'none')\n : isSorted\n ? sort!.dir === 'asc'\n ? '▲'\n : '▼'\n : '↕'}\n </span>\n </button>\n ) : (\n column.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody aria-busy={loading || undefined}>\n {loading ? (\n Array.from(\n { length: (loadingRows ?? pageSize ?? Math.min(visible.length, 5)) || 5 },\n (_, skeletonRow) => (\n <tr key={`skeleton-${skeletonRow}`}>\n {columns.map((column) => (\n <td key={column.key} className={cn('px-3 py-2', density === 'compact' && 'px-2 py-1')}>\n {/* Height tracks density so skeleton rows match real row\n height and replacing them doesn't shift the table. */}\n <Skeleton className={density === 'compact' ? 'h-3 w-full' : 'h-4 w-full'} />\n </td>\n ))}\n </tr>\n )\n )\n ) : visible.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-3 py-8 text-center text-sm text-muted-foreground\"\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n visible.map((row, index) => (\n <tr\n key={rowId(row)}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n onKeyDown={\n onRowClick\n ? (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row);\n }\n }\n : undefined\n }\n className={cn(\n 'border-b border-border last:border-0',\n zebra && '[&:nth-child(odd)]:bg-muted/30',\n onRowClick &&\n 'cursor-pointer transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring'\n )}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n 'align-middle',\n density === 'compact' ? 'px-2 py-1' : 'px-3 py-2',\n alignClass(column.align),\n column.className\n )}\n >\n {column.onClick ? (\n <button\n type=\"button\"\n onClick={() => column.onClick!(row)}\n className=\"block w-full rounded px-1.5 py-0.5 text-left transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {cellValue(row, column, index)}\n </button>\n ) : (\n cellValue(row, column, index)\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n {pageSize && pageCount > 1 && (\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2\">\n <p\n className=\"min-h-8 leading-none text-xs text-muted-foreground\"\n aria-live=\"polite\"\n >\n {(safePage - 1) * pageSize + 1}–{Math.min(safePage * pageSize, sorted.length)} of{' '}\n {sorted.length}\n </p>\n <Pagination page={safePage} pageCount={pageCount} onPageChange={setPage} />\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type PaginationIcons = {\n /** Glyph/slot for the jump-to-first button. */\n first?: React.ReactNode;\n /** Glyph/slot for the previous-page button. */\n previous?: React.ReactNode;\n /** Glyph/slot for the next-page button. */\n next?: React.ReactNode;\n /** Glyph/slot for the jump-to-last button. */\n last?: React.ReactNode;\n};\n\nexport type PaginationProps = React.HTMLAttributes<HTMLElement> & {\n /** Current page number (1-based). */\n page: number;\n /** Total number of pages. */\n pageCount: number;\n /** Called with the new page number. */\n onPageChange?: (page: number) => void;\n /** How many page buttons to show around the current page (default 1). */\n siblings?: number;\n /** Show « / » jump-to-first/last buttons (default false). */\n showBoundaries?: boolean;\n /** Force-show the first-page button; defaults to showBoundaries. */\n showFirst?: boolean;\n /** Force-show the last-page button; defaults to showBoundaries. */\n showLast?: boolean;\n /** Replace the default ‹ › « » glyphs. */\n icons?: PaginationIcons;\n};\n\nconst controlClass =\n 'inline-flex h-8 items-center rounded-md border border-border px-2.5 text-sm transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/**\n * Numeric pagination with prev/next and optional boundary jumps. Renders\n * as a nav landmark with aria-current=\"page\" on the active button. Each\n * control is a real <button> with an accessible name; glyphs are\n * swappable and each boundary button can be shown or hidden independently\n * (e.g. hide — instead of disabling — once you reach the list edge).\n */\nconst Pagination = React.forwardRef<HTMLElement, PaginationProps>(\n (\n {\n page,\n pageCount,\n onPageChange,\n siblings = 1,\n showBoundaries = false,\n showFirst,\n showLast,\n icons,\n className,\n ...props\n },\n ref\n ) => {\n // Build the page number list with ellipsis markers.\n const pages: (number | 'ellipsis')[] = [];\n const start = Math.max(2, page - siblings);\n const end = Math.min(pageCount - 1, page + siblings);\n\n pages.push(1);\n if (start > 2) pages.push('ellipsis');\n for (let i = start; i <= end; i++) pages.push(i);\n if (end < pageCount - 1) pages.push('ellipsis');\n if (pageCount > 1) pages.push(pageCount);\n\n const withFirst = showFirst ?? showBoundaries;\n const withLast = showLast ?? showBoundaries;\n\n return (\n <nav\n ref={ref}\n aria-label=\"Pagination\"\n className={cn('flex items-center justify-center gap-1', className)}\n {...props}\n >\n {withFirst && (\n <button\n type=\"button\"\n onClick={() => onPageChange?.(1)}\n disabled={page <= 1}\n aria-label=\"First page\"\n className={controlClass}\n >\n {icons?.first ?? '«'}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onPageChange?.(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n className={controlClass}\n >\n {icons?.previous ?? '‹'}\n </button>\n {pages.map((entry, index) =>\n entry === 'ellipsis' ? (\n <span\n key={`ellipsis-${index}`}\n aria-hidden=\"true\"\n className=\"px-2 text-sm text-muted-foreground\"\n >\n …\n </span>\n ) : (\n <button\n key={entry}\n type=\"button\"\n onClick={() => onPageChange?.(entry)}\n aria-current={entry === page ? 'page' : undefined}\n aria-label={`Page ${entry}`}\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-md border text-sm transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n entry === page\n ? 'border-primary bg-primary text-primary-foreground font-medium'\n : 'border-border hover:bg-muted'\n )}\n >\n {entry}\n </button>\n )\n )}\n <button\n type=\"button\"\n onClick={() => onPageChange?.(page + 1)}\n disabled={page >= pageCount}\n aria-label=\"Next page\"\n className={controlClass}\n >\n {icons?.next ?? '›'}\n </button>\n {withLast && (\n <button\n type=\"button\"\n onClick={() => onPageChange?.(pageCount)}\n disabled={page >= pageCount}\n aria-label=\"Last page\"\n className={controlClass}\n >\n {icons?.last ?? '»'}\n </button>\n )}\n </nav>\n );\n }\n);\nPagination.displayName = 'Pagination';\n\nexport { Pagination };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type ListProps = React.HTMLAttributes<HTMLUListElement> & {\n /** Hairline dividers between rows. */\n divided?: boolean;\n /** Card-like surface and border around the list. */\n bordered?: boolean;\n /** Row density. */\n size?: 'default' | 'compact';\n};\n\n/**\n * Semantic list container for groups of related rows (settings, results,\n * nav items). Renders a real <ul> so screen readers announce item counts;\n * pair with ListItem rows.\n */\nconst List = React.forwardRef<HTMLUListElement, ListProps>(\n ({ divided, bordered, size = 'default', className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\n 'flex flex-col',\n bordered && 'overflow-hidden rounded-lg border border-border bg-card',\n divided && 'divide-y divide-border',\n size === 'compact' ? 'gap-0' : 'gap-0',\n className\n )}\n {...props}\n />\n )\n);\nList.displayName = 'List';\n\nexport type ListItemProps = React.LiHTMLAttributes<HTMLLIElement> & {\n /** Leading slot: icon, avatar, status dot, or checkbox. */\n leading?: React.ReactNode;\n /** Trailing slot: chevron, badge, meta, or action. */\n trailing?: React.ReactNode;\n /** Marks the row as the active/selected item. */\n selected?: boolean;\n /**\n * Makes the row pressable. The content renders inside a full-width\n * <button> so list semantics (ul > li) stay intact for assistive tech.\n */\n onClick?: () => void;\n /** Secondary line under the main content. */\n description?: string;\n /** Disables a pressable row. */\n disabled?: boolean;\n};\n\n/** A single row inside a List. */\nconst ListItem = React.forwardRef<HTMLLIElement, ListItemProps>(\n ({ leading, trailing, selected, onClick, description, disabled, className, children, ...props }, ref) => {\n const padding = 'px-3 py-2.5';\n const rowClass = cn(\n 'flex w-full items-center gap-3 text-left text-sm',\n selected && 'bg-accent text-accent-foreground',\n onClick && !disabled && 'hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n disabled && 'opacity-50',\n className\n );\n\n const body = (\n <>\n {leading && <span className=\"flex shrink-0 items-center\">{leading}</span>}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{children}</span>\n {description && (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">{description}</span>\n )}\n </span>\n {trailing && <span className=\"flex shrink-0 items-center text-xs text-muted-foreground\">{trailing}</span>}\n </>\n );\n\n return (\n <li ref={ref} {...props}>\n {onClick ? (\n <button type=\"button\" onClick={onClick} disabled={disabled} className={cn(padding, rowClass)}>\n {body}\n </button>\n ) : (\n <div className={cn(padding, rowClass)}>{body}</div>\n )}\n </li>\n );\n }\n);\nListItem.displayName = 'ListItem';\n\nexport { List, ListItem };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nconst sizeClasses = {\n xs: 'text-xs',\n sm: 'text-sm',\n base: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n} as const;\n\nconst weightClasses = {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n} as const;\n\nexport type TextProps = React.HTMLAttributes<HTMLElement> & {\n /** Render as an inline <span> instead of a block <p> (\"inline block\" variation). */\n inline?: boolean;\n /** Type scale (default 'base'). */\n size?: keyof typeof sizeClasses;\n /** Font weight (default 'normal'). */\n weight?: keyof typeof weightClasses;\n /** Use the muted-foreground token instead of the primary text color. */\n muted?: boolean;\n};\n\n/**\n * Semantic paragraph text with a controlled type scale. Renders a real\n * <p> for document structure (or <span> with inline) — never a styled\n * div — so copy, screen readers, and reader-mode all treat it as text.\n */\nconst Text = React.forwardRef<HTMLElement, TextProps>(\n ({ inline, size = 'base', weight, muted, className, ...props }, ref) => {\n const Tag = (inline ? 'span' : 'p') as 'span' | 'p';\n return (\n <Tag\n ref={ref as React.Ref<HTMLParagraphElement>}\n className={cn(\n sizeClasses[size],\n weight && weightClasses[weight],\n muted && 'text-muted-foreground',\n inline ? 'inline' : 'block',\n className\n )}\n {...props}\n />\n );\n }\n);\nText.displayName = 'Text';\n\nexport { Text };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nconst levelClasses: Record<HeadingLevel, string> = {\n 1: 'text-4xl',\n 2: 'text-3xl',\n 3: 'text-2xl',\n 4: 'text-xl',\n 5: 'text-lg',\n 6: 'text-base',\n};\n\nconst sizeClasses = {\n sm: 'text-lg',\n md: 'text-xl',\n lg: 'text-2xl',\n xl: 'text-3xl',\n '2xl': 'text-4xl',\n '3xl': 'text-5xl',\n} as const;\n\nexport type HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n /** Semantic level — renders the matching h1..h6 element. */\n level: HeadingLevel;\n /** Visual size override, independent of the semantic level. */\n size?: keyof typeof sizeClasses;\n /** Use the muted-foreground token instead of the primary text color. */\n muted?: boolean;\n};\n\n/**\n * Semantic heading with a safe default scale. Keep `level` correct for\n * document outline (h1 once per page, no skipped levels) and use `size`\n * when the visual weight must differ from the structural level.\n */\nconst Heading = React.forwardRef<HTMLHeadingElement, HeadingProps>(\n ({ level, size, muted, className, ...props }, ref) => {\n const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n return (\n <Tag\n ref={ref}\n className={cn(\n 'font-semibold tracking-tight',\n size ? sizeClasses[size] : levelClasses[level],\n muted && 'text-muted-foreground',\n className\n )}\n {...props}\n />\n );\n }\n);\nHeading.displayName = 'Heading';\n\nexport { Heading };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type BlockElement =\n | 'div'\n | 'span'\n | 'section'\n | 'article'\n | 'figure'\n | 'header'\n | 'footer'\n | 'nav'\n | 'main'\n | 'aside';\n\nexport type BlockProps = React.HTMLAttributes<HTMLElement> & {\n /** Semantic element to render (default 'div'). */\n as?: BlockElement;\n /** Shorthand for as=\"span\" — inline flow instead of a block box. */\n inline?: boolean;\n /** Use the muted-foreground token for the block's text. */\n muted?: boolean;\n};\n\n/**\n * Semantic container div — the structural counterpart to Text (p). Pick the\n * element that matches the content's meaning (section/article/figure…) and\n * use `inline` for span-level flow. No default styling beyond layout-safe\n * color tokens, so it composes with any Tailwind utilities.\n */\nconst Block = React.forwardRef<HTMLElement, BlockProps>(\n ({ as = 'div', inline, muted, className, ...props }, ref) => {\n const Tag = (inline ? 'span' : as) as BlockElement;\n return (\n <Tag\n ref={ref as never}\n className={cn(muted && 'text-muted-foreground', inline && 'inline', className)}\n {...props}\n />\n );\n }\n);\nBlock.displayName = 'Block';\n\nexport { Block };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\nexport type FlexProps = React.HTMLAttributes<HTMLElement> & {\n /** Main axis direction. */\n direction?: 'row' | 'column';\n /** Cross-axis alignment (align-items). */\n align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';\n /** Main-axis distribution (justify-content). */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n /** Allow items to wrap onto multiple lines. */\n wrap?: boolean;\n /** Token gap ('md') or exact pixels (16) between children. */\n gap?: GapValue;\n /** Semantic element (default 'div'; 'span' keeps inline flow). */\n as?: 'div' | 'span' | 'section' | 'article' | 'nav' | 'header' | 'footer';\n};\n\nconst justifyClasses = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n} as const;\n\nconst alignClasses = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n} as const;\n\n/**\n * Layout flex container — a typed, discoverable wrapper around\n * `display: flex` with token gaps. Children are plain elements; use\n * FlexItem for per-child grow/shrink/basis overrides.\n */\nconst Flex = React.forwardRef<HTMLElement, FlexProps>(\n (\n { direction = 'row', align, justify, wrap, gap = 'md', as = 'div', className, style, ...props },\n ref\n ) => {\n const Tag = as as 'div' | 'span' | 'section' | 'article' | 'nav' | 'header' | 'footer';\n const gapResolved = resolveGap(gap);\n return (\n <Tag\n ref={ref as never}\n className={cn(\n 'flex min-w-0',\n direction === 'column' ? 'flex-col' : 'flex-row',\n wrap && 'flex-wrap',\n align && alignClasses[align],\n justify && justifyClasses[justify],\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n {...props}\n />\n );\n }\n);\nFlex.displayName = 'Flex';\n\nexport type FlexItemProps = React.HTMLAttributes<HTMLElement> & {\n /** flex-grow — number or CSS-ish string (e.g. '1', '2'). */\n grow?: boolean | string;\n /** flex-shrink — number or CSS-ish string (e.g. '0'). */\n shrink?: boolean | string;\n /** flex-basis (e.g. '0', '200px', 'auto'). */\n basis?: string;\n /** Cross-axis alignment for this item (align-self). */\n align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';\n /** Semantic element (default 'div'). */\n as?: 'div' | 'span' | 'li' | 'figure';\n};\n\nconst selfAlignClasses = {\n start: 'self-start',\n center: 'self-center',\n end: 'self-end',\n stretch: 'self-stretch',\n baseline: 'self-baseline',\n} as const;\n\n/** Per-child flex controls for a Flex container. */\nconst FlexItem = React.forwardRef<HTMLElement, FlexItemProps>(\n ({ grow, shrink, basis, align, as = 'div', className, ...props }, ref) => {\n const Tag = as as 'div' | 'span' | 'li' | 'figure';\n // Numeric/arb flex values go through style — Tailwind cannot compile\n // runtime-built arbitrary classes (grow-[${grow}]) they would be purged.\n const style: React.CSSProperties = {\n ...(grow === true ? { flexGrow: 1 } : typeof grow === 'string' && grow ? { flexGrow: grow } : {}),\n ...(shrink === false ? { flexShrink: 0 } : typeof shrink === 'string' && shrink ? { flexShrink: Number(shrink) || shrink } : {}),\n ...(basis ? { flexBasis: basis } : {}),\n };\n return (\n <Tag\n ref={ref as never}\n className={cn(align && selfAlignClasses[align], className)}\n style={Object.keys(style).length > 0 ? style : undefined}\n {...props}\n />\n );\n }\n);\nFlexItem.displayName = 'FlexItem';\n\nexport { Flex, FlexItem };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\n// Literal class maps — Tailwind's scanner only keeps classes it can see in\n// source, so every col-span/columns combination must appear verbatim here.\nconst BASE_COLS: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 5: 'grid-cols-5',\n 6: 'grid-cols-6',\n};\nconst SM_COLS: Record<number, string> = {\n 1: 'sm:grid-cols-1',\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n 5: 'sm:grid-cols-5',\n 6: 'sm:grid-cols-6',\n};\nconst MD_COLS: Record<number, string> = {\n 1: 'md:grid-cols-1',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-4',\n 5: 'md:grid-cols-5',\n 6: 'md:grid-cols-6',\n};\nconst LG_COLS: Record<number, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n 5: 'lg:grid-cols-5',\n 6: 'lg:grid-cols-6',\n};\nconst COL_SPAN: Record<number, string> = {\n 1: 'col-span-1',\n 2: 'col-span-2',\n 3: 'col-span-3',\n 4: 'col-span-4',\n 5: 'col-span-5',\n 6: 'col-span-6',\n};\nconst SM_COL_SPAN: Record<number, string> = {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n};\nconst MD_COL_SPAN: Record<number, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n};\nconst LG_COL_SPAN: Record<number, string> = {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n 5: 'lg:col-span-5',\n 6: 'lg:col-span-6',\n};\n\nexport type GridProps = React.HTMLAttributes<HTMLElement> & {\n /** Base column count (1-6). */\n cols?: number;\n /** Columns from the sm breakpoint up (1-6). */\n smCols?: number;\n /** Columns from the md breakpoint up (1-6). */\n mdCols?: number;\n /** Columns from the lg breakpoint up (1-6). */\n lgCols?: number;\n /**\n * Auto-fit mode: repeat(auto-fit, minmax(<minCol>, 1fr)) — cards wrap\n * responsively without per-breakpoint column math. Overrides cols*.\n */\n minCol?: string;\n /** Token gap ('md') or exact pixels (16) between cells. */\n gap?: GapValue;\n /** Semantic element (default 'div'). */\n as?: 'div' | 'span' | 'section' | 'ul';\n};\n\n/**\n * Layout grid container with typed column counts (literal Tailwind classes,\n * so utilities survive CSS purging) and an auto-fit min-column mode for\n * card grids. Pair with GridItem for per-cell spans.\n */\nconst Grid = React.forwardRef<HTMLElement, GridProps>(\n ({ cols, smCols, mdCols, lgCols, minCol, gap = 'md', as = 'div', className, style, ...props }, ref) => {\n const Tag = as as 'div' | 'span' | 'section' | 'ul';\n const gapResolved = resolveGap(gap);\n return (\n <Tag\n ref={ref as never}\n className={cn(\n 'grid min-w-0',\n !minCol && cols && BASE_COLS[cols],\n !minCol && smCols && SM_COLS[smCols],\n !minCol && mdCols && MD_COLS[mdCols],\n !minCol && lgCols && LG_COLS[lgCols],\n gapResolved.className,\n className\n )}\n style={{\n ...(minCol ? { gridTemplateColumns: `repeat(auto-fit, minmax(${minCol}, 1fr))` } : {}),\n ...gapResolved.style,\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nGrid.displayName = 'Grid';\n\nexport type GridItemProps = React.HTMLAttributes<HTMLElement> & {\n /** Column span at the base breakpoint (1-6). */\n span?: number;\n /** Column span from the sm breakpoint up (1-6). */\n smSpan?: number;\n /** Column span from the md breakpoint up (1-6). */\n mdSpan?: number;\n /** Column span from the lg breakpoint up (1-6). */\n lgSpan?: number;\n /** Semantic element (default 'div'; 'li' pairs with as=\"ul\" on Grid). */\n as?: 'div' | 'span' | 'li';\n};\n\n/** Per-cell column spans for a Grid container. */\nconst GridItem = React.forwardRef<HTMLElement, GridItemProps>(\n ({ span, smSpan, mdSpan, lgSpan, as = 'div', className, ...props }, ref) => {\n const Tag = as as 'div' | 'span' | 'li';\n return (\n <Tag\n ref={ref as never}\n className={cn(\n span && COL_SPAN[span],\n smSpan && SM_COL_SPAN[smSpan],\n mdSpan && MD_COL_SPAN[mdSpan],\n lgSpan && LG_COL_SPAN[lgSpan],\n className\n )}\n {...props}\n />\n );\n }\n);\nGridItem.displayName = 'GridItem';\n\nexport { Grid, GridItem };\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\ntype MenuContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n activeIndex: number;\n setActiveIndex: (index: number) => void;\n /** The relative wrapper the menu is anchored to (measured for portal positioning). */\n wrapperRef: React.MutableRefObject<HTMLDivElement | null>;\n};\n\nconst MenuContext = React.createContext<MenuContextValue>({\n open: false,\n setOpen: () => {},\n activeIndex: -1,\n setActiveIndex: () => {},\n wrapperRef: { current: null },\n});\n\nexport type MenuProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Called when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Dropdown menu with keyboard navigation (arrows, Home/End, Escape),\n * typeahead, and proper ARIA menu semantics. Items are rendered in a\n * floating panel anchored to the trigger.\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>(\n ({ open, onOpenChange, className, children }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState(-1);\n const current = open ?? internalOpen;\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n const setRefs = React.useCallback(\n (node: HTMLDivElement | null) => {\n wrapperRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref]\n );\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (open === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n if (!next) setActiveIndex(-1);\n },\n [open, onOpenChange]\n );\n\n return (\n <div ref={setRefs} className={cn('relative inline-block', className)}>\n <MenuContext.Provider\n value={{ open: current, setOpen, activeIndex, setActiveIndex, wrapperRef }}\n >\n {children}\n </MenuContext.Provider>\n </div>\n );\n }\n);\nMenu.displayName = 'Menu';\n\nexport type MenuTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/** The button that opens the menu. */\nconst MenuTrigger = React.forwardRef<HTMLButtonElement, MenuTriggerProps>(\n ({ className, children, ...props }, ref) => {\n const { open, setOpen } = React.useContext(MenuContext);\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className={cn(\n 'inline-flex items-center justify-center rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium transition-colors',\n 'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\nMenuTrigger.displayName = 'MenuTrigger';\n\nexport type MenuContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** The floating panel containing menu items. */\nconst MenuContent = React.forwardRef<HTMLDivElement, MenuContentProps>(\n ({ className, children, ...props }, ref) => {\n const { open, setOpen, activeIndex, setActiveIndex, wrapperRef } = React.useContext(MenuContext);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n // Viewport coordinates measured from the wrapper; the panel portals to\n // document.body with position:fixed so ancestor overflow (scrollable\n // demo frames, clipped containers) can never cut it off.\n const [pos, setPos] = React.useState<{ top: number; right: number } | null>(null);\n const itemsRef = React.useRef<HTMLElement[]>([]);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const GAP = 4; // matches the previous mt-1 spacing\n const measure = () => {\n const rect = wrapperRef.current?.getBoundingClientRect();\n if (!rect) return;\n setPos({ top: rect.bottom + GAP, right: Math.max(8, window.innerWidth - rect.right) });\n };\n measure();\n // Close on any scroll (capture phase catches scrolling ancestors that\n // do not bubble) so the fixed panel never drifts from its trigger;\n // reposition on resize.\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', measure);\n };\n }, [open, setOpen, wrapperRef]);\n\n // Close on outside click.\n React.useEffect(() => {\n if (!open) return;\n function onPointerDown(event: PointerEvent) {\n if (!contentRef.current?.contains(event.target as Node)) setOpen(false);\n }\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open, setOpen]);\n\n // Collect items for keyboard navigation and move focus into the menu\n // when it opens so arrow keys reach the onKeyDown handler. Depends on\n // `pos` because the panel only mounts once measured.\n React.useEffect(() => {\n if (open && pos && contentRef.current) {\n itemsRef.current = Array.from(\n contentRef.current.querySelectorAll('[role=\"menuitem\"]:not([disabled])')\n );\n itemsRef.current[0]?.focus();\n setActiveIndex(0);\n }\n }, [open, pos, setActiveIndex]);\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const items = itemsRef.current;\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n const next = activeIndex < items.length - 1 ? activeIndex + 1 : 0;\n setActiveIndex(next);\n items[next]?.focus();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n const next = activeIndex > 0 ? activeIndex - 1 : items.length - 1;\n setActiveIndex(next);\n items[next]?.focus();\n } else if (event.key === 'Home') {\n event.preventDefault();\n setActiveIndex(0);\n items[0]?.focus();\n } else if (event.key === 'End') {\n event.preventDefault();\n setActiveIndex(items.length - 1);\n items[items.length - 1]?.focus();\n }\n };\n\n if (!open || !pos || typeof document === 'undefined') return null;\n\n return createPortal(\n <div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n role=\"menu\"\n onKeyDown={onKeyDown}\n style={{ position: 'fixed', top: pos.top, right: pos.right, zIndex: 50 }}\n className={cn(\n 'min-w-[10rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md',\n className\n )}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n);\nMenuContent.displayName = 'MenuContent';\n\nexport type MenuItemProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Renders the item in a destructive style. */\n destructive?: boolean;\n};\n\n/** A single action item in the menu. */\nconst MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ className, destructive, onClick, ...props }, ref) => {\n const { setOpen } = React.useContext(MenuContext);\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n onClick={(event) => {\n onClick?.(event);\n setOpen(false);\n }}\n className={cn(\n 'flex w-full cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors',\n 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n destructive && 'text-destructive hover:bg-destructive/10 hover:text-destructive',\n className\n )}\n {...props}\n />\n );\n }\n);\nMenuItem.displayName = 'MenuItem';\n\nexport type MenuSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Visual divider between menu items. */\nconst MenuSeparator = React.forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} role=\"separator\" className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />\n )\n);\nMenuSeparator.displayName = 'MenuSeparator';\n\nexport type MenuLabelProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Non-interactive label grouping related menu items. */\nconst MenuLabel = React.forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('px-2 py-1 text-xs font-medium uppercase tracking-wider text-muted-foreground', className)}\n {...props}\n />\n )\n);\nMenuLabel.displayName = 'MenuLabel';\n\nexport { Menu, MenuTrigger, MenuContent, MenuItem, MenuSeparator, MenuLabel };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7',\n {\n variants: {\n variant: {\n default: 'bg-background text-foreground border-border',\n destructive: 'border-destructive/50 text-destructive bg-destructive/10 [&>svg]:text-destructive',\n success: 'border-success/50 text-success bg-success/10 [&>svg]:text-success',\n warning: 'border-warning/50 text-warning bg-warning/10 [&>svg]:text-warning',\n info: 'border-info/50 text-info bg-info/10 [&>svg]:text-info',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport type AlertProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>;\n\n/**\n * Inline alert for status messages and notifications. Supports\n * semantic variants (destructive, success, warning, info) with\n * matching icon colors. Renders role=\"alert\" for screen readers.\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n);\nAlert.displayName = 'Alert';\n\nexport type AlertTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/** Title heading inside an Alert. */\nconst AlertTitle = React.forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn('mb-1 font-medium leading-none tracking-tight', className)}\n {...props}\n />\n )\n);\nAlertTitle.displayName = 'AlertTitle';\n\nexport type AlertDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\n/** Description text inside an Alert. */\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, AlertDescriptionProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('text-sm [&_p]:leading-relaxed', className)}\n {...props}\n />\n )\n);\nAlertDescription.displayName = 'AlertDescription';\n\nexport { Alert, AlertTitle, AlertDescription, alertVariants };\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n triggerId: string;\n contentId: string;\n /** The relative wrapper the popover is anchored to (measured for portal positioning). */\n wrapperRef: React.MutableRefObject<HTMLDivElement | null>;\n};\n\nconst PopoverContext = React.createContext<PopoverContextValue>({\n open: false,\n setOpen: () => {},\n triggerId: '',\n contentId: '',\n wrapperRef: { current: null },\n});\n\nexport type PopoverProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Called when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Floating panel anchored to a trigger. Unlike Tooltip, the content is\n * interactive (links, buttons, forms). Closes on outside click and Escape.\n * Renders as a non-modal dialog with proper aria wiring.\n */\nconst Popover = React.forwardRef<HTMLDivElement, PopoverProps>(\n ({ open, onOpenChange, className, children }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const current = open ?? internalOpen;\n const triggerId = React.useId();\n const contentId = React.useId();\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n const setRefs = React.useCallback(\n (node: HTMLDivElement | null) => {\n wrapperRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref]\n );\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (open === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [open, onOpenChange]\n );\n\n return (\n <div ref={setRefs} className={cn('relative inline-block', className)}>\n <PopoverContext.Provider\n value={{ open: current, setOpen, triggerId, contentId, wrapperRef }}\n >\n {children}\n </PopoverContext.Provider>\n </div>\n );\n }\n);\nPopover.displayName = 'Popover';\n\nexport type PopoverTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/** The button that toggles the popover. */\nconst PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTriggerProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { open, setOpen, triggerId, contentId } = React.useContext(PopoverContext);\n return (\n <button\n ref={ref}\n id={triggerId}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n onClick={(event) => {\n onClick?.(event);\n setOpen(!open);\n }}\n className={cn(\n 'inline-flex items-center justify-center rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium transition-colors',\n 'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\nPopoverTrigger.displayName = 'PopoverTrigger';\n\nexport type PopoverContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n /** The floating panel with interactive content. */\n const PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(\n ({ className, children, onKeyDown, ...props }, ref) => {\n const { open, setOpen, triggerId, contentId, wrapperRef } =\n React.useContext(PopoverContext);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n // Viewport coordinates measured from the wrapper; the panel portals to\n // document.body with position:fixed so ancestor overflow (scrollable\n // demo frames, clipped containers) can never cut it off.\n const [pos, setPos] = React.useState<{ top: number; right: number } | null>(null);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const GAP = 8; // matches the previous mt-2 spacing\n const measure = () => {\n const rect = wrapperRef.current?.getBoundingClientRect();\n if (!rect) return;\n setPos({ top: rect.bottom + GAP, right: Math.max(8, window.innerWidth - rect.right) });\n };\n measure();\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', measure);\n };\n }, [open, setOpen, wrapperRef]);\n\n // Close on outside click.\n React.useEffect(() => {\n if (!open) return;\n function onPointerDown(event: PointerEvent) {\n if (!contentRef.current?.contains(event.target as Node)) setOpen(false);\n }\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open, setOpen]);\n\n // Focus the content when it opens so Escape reaches it. Depends on\n // `pos` because the panel only mounts once measured.\n React.useEffect(() => {\n if (open && pos && contentRef.current) {\n contentRef.current.focus();\n }\n }, [open, pos]);\n\n if (!open || !pos || typeof document === 'undefined') return null;\n\n return createPortal(\n <div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n id={contentId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.key === 'Escape') {\n event.stopPropagation();\n setOpen(false);\n }\n }}\n style={{ position: 'fixed', top: pos.top, right: pos.right, zIndex: 50 }}\n className={cn(\n 'w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none',\n className\n )}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n );\nPopoverContent.displayName = 'PopoverContent';\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type BreadcrumbItem = {\n /** Display label. */\n label: string;\n /** Destination href; omit for the current page (renders as plain text). */\n href?: string;\n};\n\nexport type BreadcrumbProps = React.HTMLAttributes<HTMLElement> & {\n /** Ordered list of breadcrumb items; the last item is the current page. */\n items: BreadcrumbItem[];\n /** Separator character between items (default '/'). */\n separator?: React.ReactNode;\n /**\n * Receives every link click with the item and its index. When provided,\n * default navigation is prevented so you can route programmatically\n * (e.g. via a router, state machine, or analytics wrapper).\n */\n onItemClick?: (item: BreadcrumbItem, index: number) => void;\n};\n\n/**\n * Navigation breadcrumb trail. The last item is rendered as the current\n * page with aria-current=\"page\". Earlier items are links. Screen readers\n * announce the navigation landmark and current location.\n */\nconst Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({ items, separator = '/', onItemClick, className, ...props }, ref) => (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={cn('flex items-center space-x-1.5 text-sm text-muted-foreground', className)}\n {...props}\n >\n <ol className=\"flex flex-wrap items-center space-x-1.5\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={`${item.label}-${index}`} className=\"flex items-center space-x-1.5\">\n {index > 0 && (\n <span aria-hidden=\"true\" className=\"text-muted-foreground/50\">\n {separator}\n </span>\n )}\n {item.href && !isLast ? (\n <a\n href={item.href}\n className=\"transition-colors hover:text-foreground\"\n onClick={\n onItemClick\n ? (event) => {\n event.preventDefault();\n onItemClick(item, index);\n }\n : undefined\n }\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? 'page' : undefined}\n className={isLast ? 'font-medium text-foreground' : undefined}\n >\n {item.label}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n )\n);\nBreadcrumb.displayName = 'Breadcrumb';\n\nexport { Breadcrumb };\n"],"mappings":"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","names":["React","React","import_jsx_runtime","React","import_jsx_runtime","React","React","import_jsx_runtime","React","import_jsx_runtime","Select","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","FOCUSABLE","React","import_react_dom","React","GAP","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","React","import_react_dom","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","React","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","sizeClasses","React","import_jsx_runtime","sizeClasses","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","GAP","React","import_class_variance_authority","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","GAP","React","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types/manifest.ts","../src/utils/cn.ts","../src/utils/gap.ts","../src/utils/presence.ts","../src/components/app-shell/AppShell.tsx","../src/components/drawer/Drawer.tsx","../src/components/button/Button.tsx","../src/components/button-group/ButtonGroup.tsx","../src/components/input/Input.tsx","../src/components/input-group/InputGroup.tsx","../src/components/textarea/Textarea.tsx","../src/components/select/Select.tsx","../src/components/badge/Badge.tsx","../src/components/avatar/Avatar.tsx","../src/components/spinner/Spinner.tsx","../src/components/toast/Toast.tsx","../src/components/toast/Toaster.tsx","../src/components/toast/toast-store.ts","../src/components/dialog/Dialog.tsx","../src/components/table-card/TableCard.tsx","../src/components/select-menu/SelectMenu.tsx","../src/components/search/Search.tsx","../src/components/search/use-combobox.ts","../src/components/autocomplete/Autocomplete.tsx","../src/components/checkbox/Checkbox.tsx","../src/components/checkbox/CheckboxGroup.tsx","../src/components/radio/Radio.tsx","../src/components/radio/RadioCard.tsx","../src/components/label/Label.tsx","../src/components/fieldset/Fieldset.tsx","../src/components/form-field/FormField.tsx","../src/components/tooltip/Tooltip.tsx","../src/components/form/Form.tsx","../src/components/form-layout/FormLayout.tsx","../src/components/switch/Switch.tsx","../src/components/separator/Separator.tsx","../src/components/skeleton/Skeleton.tsx","../src/components/progress/Progress.tsx","../src/components/tabs/Tabs.tsx","../src/components/card/Card.tsx","../src/components/accordion/Accordion.tsx","../src/components/table/Table.tsx","../src/components/data-table/DataTable.tsx","../src/components/pagination/Pagination.tsx","../src/components/list/List.tsx","../src/components/text/Text.tsx","../src/components/heading/Heading.tsx","../src/components/empty-state/EmptyState.tsx","../src/components/page-header/PageHeader.tsx","../src/components/metric-card/MetricCard.tsx","../src/components/password-input/PasswordInput.tsx","../src/components/auth-layout/AuthLayout.tsx","../src/components/filter-bar/FilterBar.tsx","../src/components/date-picker/DatePicker.tsx","../src/components/time-picker/TimePicker.tsx","../src/components/stepper/Stepper.tsx","../src/components/file-upload/FileUpload.tsx","../src/components/timeline/Timeline.tsx","../src/components/block/Block.tsx","../src/components/flex/Flex.tsx","../src/components/grid/Grid.tsx","../src/components/menu/Menu.tsx","../src/components/alert/Alert.tsx","../src/components/popover/Popover.tsx","../src/components/breadcrumb/Breadcrumb.tsx"],"sourcesContent":["export * from './types/manifest';\nexport * from './utils/cn';\nexport * from './utils/gap';\nexport * from './utils/presence';\nexport * from './components/app-shell';\nexport * from './components/button';\nexport * from './components/button-group';\nexport * from './components/input';\nexport * from './components/input-group';\nexport * from './components/badge';\nexport * from './components/avatar';\nexport * from './components/spinner';\nexport * from './components/toast';\nexport * from './components/dialog';\nexport * from './components/drawer';\nexport * from './components/select';\nexport * from './components/table-card';\nexport * from './components/select-menu';\nexport * from './components/search';\nexport * from './components/autocomplete';\nexport * from './components/checkbox';\nexport * from './components/radio';\nexport * from './components/textarea';\nexport * from './components/label';\nexport * from './components/fieldset';\nexport * from './components/form-field';\nexport * from './components/form';\nexport * from './components/form-layout';\nexport * from './components/switch';\nexport * from './components/separator';\nexport * from './components/skeleton';\nexport * from './components/progress';\nexport * from './components/tabs';\nexport * from './components/tooltip';\nexport * from './components/card';\nexport * from './components/accordion';\nexport * from './components/table';\nexport * from './components/data-table';\nexport * from './components/list';\nexport * from './components/text';\nexport * from './components/heading';\nexport * from './components/empty-state';\nexport * from './components/page-header';\nexport * from './components/metric-card';\nexport * from './components/password-input';\nexport * from './components/auth-layout';\nexport * from './components/filter-bar';\nexport * from './components/date-picker';\nexport * from './components/time-picker';\nexport * from './components/stepper';\nexport * from './components/file-upload';\nexport * from './components/timeline';\nexport * from './components/block';\nexport * from './components/flex';\nexport * from './components/grid';\nexport * from './components/menu';\nexport * from './components/alert';\nexport * from './components/popover';\nexport * from './components/breadcrumb';\nexport * from './components/pagination';\n","/**\n * COMPONENT_MANIFEST Schema\n * \n * Every component in Slipstream UI ships a machine-readable manifest\n * that AI agents can read to understand how to use the component correctly.\n * \n * This manifest contains:\n * - Component metadata (id, name, tier)\n * - Design intent and purpose\n * - Full prop schema with types, defaults, and constraints\n * - Usage examples (good and anti-patterns)\n * - Accessibility requirements\n * - Content guidelines for AI text generation\n * - Composition rules\n */\n\nexport type ComponentTier = 'atom' | 'molecule' | 'organism' | 'pattern';\n\nexport type PropSchema = {\n /** Property name */\n name: string;\n /** TypeScript type */\n type: string;\n /**\n * Default value (if any). Manifests are JSON, so values are limited to\n * strings, numbers, booleans, null, or JSON-serializable structures.\n */\n defaultValue?: string | number | boolean | null | unknown[];\n /** Whether the prop is required */\n required: boolean;\n /** Description of what the prop does */\n description: string;\n /** Allowed values for enums */\n enum?: string[];\n /** Example values */\n examples?: unknown[];\n};\n\nexport type UsageExample = {\n /** Title for this example */\n title: string;\n /** Code example */\n code: string;\n /** Description of when to use this pattern */\n description?: string;\n};\n\n/**\n * An anti-pattern describes a misuse in prose rather than code: the title\n * names the mistake, the explanation says why it is wrong (and what to do\n * instead). `example` optionally shows the offending snippet.\n */\nexport type AntiPattern = {\n /** Short name of the anti-pattern */\n title: string;\n /** Why this usage is wrong and what to do instead */\n explanation: string;\n /** Optional snippet of the offending usage */\n example?: string;\n};\n\nexport type AccessibilityRequirement = {\n /** A11y feature (e.g., \"keyboard navigation\", \"screen reader support\") */\n feature: string;\n /** How the component implements this */\n implementation: string;\n /** Any user requirements */\n userRequirements?: string;\n};\n\nexport type ContentGuideline = {\n /** Type of content (e.g., \"button text\", \"placeholder text\") */\n contentType: string;\n /** Guidelines for AI when generating this content */\n guidelines: string[];\n /** Examples of good content */\n goodExamples?: string[];\n /** Examples to avoid */\n badExamples?: string[];\n};\n\nexport type CompositionRule = {\n /** Related component that can be composed with this one */\n component: string;\n /** How they should be used together */\n relationship: string;\n /** Example composition */\n example?: string;\n};\n\nexport type ComponentManifest = {\n /** Unique component identifier (kebab-case) */\n id: string;\n /** Display name */\n name: string;\n /** Component tier in atomic design */\n tier: ComponentTier;\n /** One-line description of the component's purpose */\n description: string;\n /** Detailed design intent - why this component exists */\n designIntent: string;\n /** Full prop schema */\n props: PropSchema[];\n /** Good usage examples */\n examples: UsageExample[];\n /** Anti-patterns to avoid */\n antiPatterns?: AntiPattern[];\n /** Accessibility requirements */\n accessibility: AccessibilityRequirement[];\n /** Content guidelines for AI text generation */\n contentGuidelines?: ContentGuideline[];\n /** Composition rules with other components */\n compositionRules?: CompositionRule[];\n /** Related components */\n relatedComponents?: string[];\n /** Package this component belongs to */\n package: '@slipstream-ui/core' | '@slipstream-ui/ai';\n /** Import path */\n importPath: string;\n /** Version when this manifest was last updated */\n version: string;\n};\n\n/**\n * Type guard to check if an object is a valid ComponentManifest\n */\nexport function isComponentManifest(obj: unknown): obj is ComponentManifest {\n if (typeof obj !== 'object' || obj === null) return false;\n const record = obj as Record<string, unknown>;\n return (\n typeof record.id === 'string' &&\n typeof record.name === 'string' &&\n typeof record.tier === 'string' &&\n typeof record.description === 'string' &&\n typeof record.designIntent === 'string' &&\n Array.isArray(record.props) &&\n Array.isArray(record.examples) &&\n Array.isArray(record.accessibility) &&\n typeof record.package === 'string' &&\n typeof record.importPath === 'string' &&\n typeof record.version === 'string'\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Gap tokens (Tailwind scale) OR an exact pixel number.\n * Numbers are pixels — `gap={16}` is exactly 16px, no scale guessing;\n * tokens keep spacing on the design-system grid.\n */\nexport type GapValue = 'none' | 'sm' | 'md' | 'lg' | 'xl' | number;\n\nconst GAP_CLASSES: Record<string, string> = {\n none: 'gap-0',\n sm: 'gap-2',\n md: 'gap-4',\n lg: 'gap-6',\n xl: 'gap-8',\n};\n\n/**\n * Resolve a GapValue to a Tailwind class (token) or an exact px style\n * (number). Both forms are supported everywhere gaps appear — Flex, Grid,\n * FormLayout, Accordion.\n */\nexport function resolveGap(gap: GapValue | undefined): {\n className?: string;\n style?: CSSProperties;\n} {\n if (gap === undefined) return {};\n if (typeof gap === 'number') return { style: { gap: `${gap}px` } };\n return { className: GAP_CLASSES[gap] };\n}\n","import * as React from 'react';\n\n/**\n * Keeps overlay content mounted while an optional exit animation plays.\n *\n * `present` gates rendering: it stays true for `exitMs` after `open`\n * flips false (when `animate` is on), giving CSS exit classes a window\n * to run before the portal unmounts. `exiting` tells the component to\n * swap enter classes for exit classes during that window.\n */\nexport function usePresence(\n open: boolean,\n animate: boolean,\n exitMs = 200,\n): { present: boolean; exiting: boolean } {\n const [present, setPresent] = React.useState(open);\n\n React.useEffect(() => {\n if (open) {\n setPresent(true);\n return;\n }\n if (!present) return;\n if (!animate) {\n setPresent(false);\n return;\n }\n const timer = setTimeout(() => setPresent(false), exitMs);\n return () => clearTimeout(timer);\n }, [open, animate, present, exitMs]);\n\n return { present, exiting: present && !open };\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Drawer } from '../drawer/Drawer';\n\nexport type SidebarItem = {\n href: string;\n label: string;\n icon?: React.ReactNode;\n /** Trailing slot — count, status dot, shortcut. */\n badge?: React.ReactNode;\n /** Force the active state (otherwise activeHref is compared). */\n active?: boolean;\n};\n\nexport type SidebarSection = {\n title?: string;\n items: SidebarItem[];\n};\n\nexport type SidebarProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {\n sections: SidebarSection[];\n /** Brand/mark rendered at the top. */\n heading?: React.ReactNode;\n /** Rendered at the bottom (user menu, upgrade CTA). */\n footer?: React.ReactNode;\n /** Current route — items with a matching href get aria-current=\"page\". */\n activeHref?: string;\n /** Custom link element for routers (react-router `Link`, Next `Link`). */\n linkComponent?: React.ElementType;\n /** Accessible name of the nav landmark. Default 'Primary'. */\n label?: string;\n};\n\n/**\n * Sectioned navigation rail. Purely presentational: you pass the active\n * route and a router link component, so it stays stateless and works with\n * any routing library.\n */\nexport function Sidebar({\n sections,\n heading,\n footer,\n activeHref,\n linkComponent,\n label = 'Primary',\n className,\n ...props\n}: SidebarProps) {\n const Link = linkComponent ?? 'a';\n\n return (\n <div className={cn('flex h-full min-h-0 flex-col gap-6 p-4', className)} {...props}>\n {heading && <div className=\"px-2\">{heading}</div>}\n <nav aria-label={label} className=\"flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto\">\n {sections.map((section, index) => (\n <div key={section.title ?? `section-${index}`}>\n {section.title && (\n <p className=\"mb-1.5 px-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {section.title}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const active = item.active ?? (activeHref !== undefined && item.href === activeHref);\n return (\n <li key={item.href}>\n <Link\n href={item.href}\n aria-current={active ? 'page' : undefined}\n className={cn(\n 'flex items-center gap-2.5 rounded-md px-2.5 py-2 text-sm transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n active\n ? 'bg-primary/10 font-medium text-primary'\n : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'\n )}\n >\n {item.icon && <span className=\"shrink-0 [&_svg]:size-4\">{item.icon}</span>}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.badge && <span className=\"shrink-0 text-xs\">{item.badge}</span>}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n {footer && <div className=\"border-t border-border pt-4\">{footer}</div>}\n </div>\n );\n}\n\nexport type AppShellProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Desktop rail; also rendered inside a mobile drawer. */\n sidebar?: React.ReactNode;\n /** Sticky top bar content. */\n header?: React.ReactNode;\n /** Hide the built-in mobile menu button (e.g. when the header owns one). */\n hideMobileMenu?: boolean;\n /** Tailwind width class for the desktop rail. Default 'w-64'. */\n sidebarWidth?: string;\n};\n\n/**\n * Application frame: fixed-height sidebar, sticky header, scrolling main.\n * On small screens the sidebar becomes a left Drawer opened by a burger\n * button, so pages never need their own responsive nav wiring.\n */\nexport function AppShell({\n sidebar,\n header,\n hideMobileMenu = false,\n sidebarWidth = 'w-64',\n className,\n children,\n ...props\n}: AppShellProps) {\n const [mobileOpen, setMobileOpen] = React.useState(false);\n\n return (\n <div className={cn('flex min-h-screen bg-background text-foreground', className)} {...props}>\n {sidebar && (\n <aside className={cn('hidden shrink-0 border-r border-border md:block', sidebarWidth)}>\n {sidebar}\n </aside>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {(header || (sidebar && !hideMobileMenu)) && (\n <header className=\"sticky top-0 z-30 flex h-14 items-center gap-3 border-b border-border bg-background/80 px-4 backdrop-blur supports-[backdrop-filter]:bg-background/60\">\n {sidebar && !hideMobileMenu && (\n <button\n type=\"button\"\n onClick={() => setMobileOpen(true)}\n aria-label=\"Open navigation\"\n className=\"rounded-md border border-border p-2 text-muted-foreground hover:bg-muted md:hidden\"\n >\n <span aria-hidden=\"true\">☰</span>\n </button>\n )}\n <div className=\"min-w-0 flex-1\">{header}</div>\n </header>\n )}\n <main className=\"min-w-0 flex-1\">{children}</main>\n </div>\n {sidebar && (\n <Drawer\n open={mobileOpen}\n onOpenChange={setMobileOpen}\n title=\"Navigation\"\n side=\"left\"\n size=\"sm\"\n animate\n >\n {sidebar}\n </Drawer>\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { usePresence } from '../../utils/presence';\n\nexport type DrawerSide = 'left' | 'right' | 'top' | 'bottom';\nexport type DrawerSize = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport type DrawerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n children?: React.ReactNode;\n /** Edge the drawer slides from (default 'right'). */\n side?: DrawerSide;\n /** Preset extent along the side axis (width for left/right, height for top/bottom). */\n size?: DrawerSize;\n /**\n * Custom extent for left/right drawers: pixels (480) or any CSS length\n * (\"70vw\"). Overrides `size`.\n */\n width?: number | string;\n /**\n * Custom extent for top/bottom drawers: pixels (320) or any CSS length\n * (\"60vh\"). Overrides `size`.\n */\n height?: number | string;\n /** Clicking the backdrop closes (default true). */\n closeOnBackdrop?: boolean;\n /** Hide the close (✕) button in the header (default true). */\n showClose?: boolean;\n /** Focused when the drawer opens; defaults to the first focusable element. */\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n /** Overrides the accessible name (defaults to the title). */\n ariaLabel?: string;\n /**\n * Slide the panel in from its edge and out on close (requires the\n * tailwindcss-animate plugin). Off by default; reduced-motion users\n * get animate-none automatically.\n */\n animate?: boolean;\n};\n\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst sideClasses: Record<DrawerSide, string> = {\n right: 'inset-y-0 right-0 border-l',\n left: 'inset-y-0 left-0 border-r',\n top: 'inset-x-0 top-0 border-b',\n bottom: 'inset-x-0 bottom-0 border-t',\n};\n\nconst sideWidths: Record<DrawerSize, string> = {\n sm: 'w-72',\n md: 'w-96',\n lg: 'w-[32rem]',\n xl: 'w-[40rem]',\n '2xl': 'w-[48rem]',\n};\n\nconst sideHeights: Record<DrawerSize, string> = {\n sm: 'h-48',\n md: 'h-80',\n lg: 'h-[32rem]',\n xl: 'h-[40rem]',\n '2xl': 'h-[48rem]',\n};\n\nconst sizeClasses: Record<DrawerSide, Record<DrawerSize, string>> = {\n right: sideWidths,\n left: sideWidths,\n top: sideHeights,\n bottom: sideHeights,\n};\n\n/** Custom extent wins over the preset; numbers are pixels. */\nfunction extentStyle(value: number | string | undefined): string | undefined {\n if (value === undefined) return undefined;\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n// Literal class maps so Tailwind's scanner keeps every slide utility.\nconst slideIn: Record<DrawerSide, string> = {\n right: 'slide-in-from-right',\n left: 'slide-in-from-left',\n top: 'slide-in-from-top',\n bottom: 'slide-in-from-bottom',\n};\nconst slideOut: Record<DrawerSide, string> = {\n right: 'slide-out-to-right',\n left: 'slide-out-to-left',\n top: 'slide-out-to-top',\n bottom: 'slide-out-to-bottom',\n};\n\n/**\n * Edge sheet for secondary flows (filters, detail panes, mobile nav).\n * Modal semantics identical to Dialog: portal, aria-modal + labelled by\n * title, Escape and backdrop dismissal, focus move + Tab trap + focus\n * restoration on close. Renders fixed to the chosen edge with a border\n * against the backdrop.\n */\nexport function Drawer({\n open,\n onOpenChange,\n title,\n description,\n children,\n side = 'right',\n size = 'md',\n width,\n height,\n closeOnBackdrop = true,\n showClose = true,\n initialFocusRef,\n ariaLabel,\n animate = false,\n}: DrawerProps) {\n const drawerRef = React.useRef<HTMLDivElement | null>(null);\n const previouslyFocused = React.useRef<HTMLElement | null>(null);\n const titleId = React.useId();\n const descriptionId = React.useId();\n const { present, exiting } = usePresence(open, animate);\n\n // Capture the opener before the panel takes focus; restore the moment\n // open flips false — even while an exit animation keeps the DOM up.\n React.useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement as HTMLElement | null;\n return;\n }\n previouslyFocused.current?.focus?.();\n previouslyFocused.current = null;\n }, [open]);\n\n // Move focus in once the panel is actually mounted (present can lag\n // open by a render when the presence gate starts closed).\n React.useEffect(() => {\n if (!open || !present) return;\n const node = drawerRef.current;\n const target =\n initialFocusRef?.current ?? node?.querySelector<HTMLElement>(FOCUSABLE) ?? node;\n target?.focus();\n }, [open, present, initialFocusRef]);\n\n React.useEffect(() => {\n if (!open) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onOpenChange(false);\n return;\n }\n if (event.key !== 'Tab') return;\n const node = drawerRef.current;\n if (!node) return;\n const focusable = Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || !node.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [open, onOpenChange]);\n\n if (!present || typeof document === 'undefined') return null;\n\n const isVerticalSide = side === 'top' || side === 'bottom';\n const customExtent = isVerticalSide ? extentStyle(height) : extentStyle(width);\n\n const motion = animate\n ? cn(\n 'duration-200 motion-reduce:animate-none',\n exiting ? `animate-out ${slideOut[side]}` : `animate-in ${slideIn[side]}`,\n )\n : undefined;\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-50\"\n onMouseDown={(event) => {\n if (closeOnBackdrop && event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel ?? title}\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={description ? descriptionId : undefined}\n tabIndex={-1}\n className={cn(\n 'fixed flex flex-col bg-background shadow-xl border-border',\n sideClasses[side],\n sizeClasses[side][size],\n motion\n )}\n style={customExtent ? { [isVerticalSide ? 'height' : 'width']: customExtent } : undefined}\n >\n <div className=\"flex items-start justify-between gap-4 border-b border-border px-5 py-4\">\n <div>\n <h2 id={titleId} className=\"text-base font-semibold leading-tight\">\n {title}\n </h2>\n {description && (\n <p id={descriptionId} className=\"mt-1 text-sm text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n {showClose && (\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n aria-label=\"Close drawer\"\n className=\"-mr-1 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-y-auto px-5 py-4\">{children}</div>\n </div>\n </div>,\n document.body\n );\n}\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n // Semantic status variants — foregrounds are the paired AA tokens\n // (white on dark green, ink on amber/cyan) in both themes.\n success: 'bg-success text-success-foreground hover:bg-success/90',\n warning: 'bg-warning text-warning-foreground hover:bg-warning/90',\n info: 'bg-info text-info-foreground hover:bg-info/90',\n outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n // Colored outlines: semantic border + label on the page surface, with\n // a faint tint on hover — mirrors the Alert variant recipe.\n 'outline-destructive':\n 'border border-destructive/50 bg-background text-destructive hover:border-destructive hover:bg-destructive/10',\n 'outline-success':\n 'border border-success/50 bg-background text-success hover:border-success hover:bg-success/10',\n 'outline-warning':\n 'border border-warning/50 bg-background text-warning hover:border-warning hover:bg-warning/10',\n 'outline-info':\n 'border border-info/50 bg-background text-info hover:border-info hover:bg-info/10',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nexport type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n }\n);\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type ButtonGroupProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Stacked segments share vertical edges (default: side-by-side). */\n orientation?: 'horizontal' | 'vertical';\n};\n\n/**\n * Joins buttons into one segmented control.\n *\n * The group owns the outline: a single border, one outer radius (children\n * are clipped by overflow-hidden), and 1px separators drawn between\n * segments. Children lose their own borders and radii, so mixed variants\n * (default/outline/secondary/ghost) still read as one instrument — a\n * borderless variant no longer leaves the seam misaligned the way\n * negative-margin border collapsing did.\n *\n * Focus rings render inset so they are never clipped at the edges.\n */\nconst ButtonGroup = React.forwardRef<HTMLDivElement, ButtonGroupProps>(\n ({ orientation = 'horizontal', className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"button-group\"\n role=\"group\"\n className={cn(\n 'inline-flex overflow-hidden rounded-md border border-border bg-background',\n '[&>*]:rounded-none [&>*]:border-0',\n '[&>*:focus-visible]:ring-inset [&>*:focus-visible]:ring-offset-0',\n // divide-* compiles to `.group > * ~ * { border-left/top }` — higher\n // specificity than the lead-strip above, so seams stay exact.\n orientation === 'horizontal'\n ? 'divide-x divide-border'\n : 'flex-col divide-y divide-border',\n className\n )}\n {...props}\n />\n )\n);\nButtonGroup.displayName = 'ButtonGroup';\n\nexport { ButtonGroup };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>;\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm',\n 'ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\nexport { Input };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Input } from '../input/Input';\nimport { Textarea } from '../textarea/Textarea';\nimport { Select } from '../select/Select';\n\nexport type InputGroupProps = React.HTMLAttributes<HTMLDivElement>;\n\ntype CloneableProps = Record<string, unknown>;\n\nconst isNestedField = (child: React.ReactNode): child is React.ReactElement<CloneableProps> =>\n React.isValidElement(child) && (child.type === Input || child.type === Textarea || child.type === Select);\n\n/**\n * Composite input shell: one outer outline wraps the addons and the\n * field itself. Nested inputs shed their own border/ring — focus and\n * the outline belong to the group, so left/right addons read as flush\n * parts of a single control (the outline doubles as the affordance).\n *\n * id / aria-describedby / aria-invalid arriving from FormField are\n * forwarded to the nested field, because a label's htmlFor must\n * resolve to the editable control, not the shell div.\n */\nconst InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n ({ id, 'aria-describedby': describedBy, 'aria-invalid': invalid, className, children, ...props }, ref) => {\n let wiredChildren = children;\n\n if (id !== undefined || describedBy !== undefined || invalid !== undefined) {\n const items = React.Children.toArray(children);\n const fieldIndex = items.findIndex(isNestedField);\n if (fieldIndex !== -1) {\n const field = items[fieldIndex];\n items[fieldIndex] = isNestedField(field)\n ? React.cloneElement(field, {\n ...(id !== undefined && { id }),\n ...(describedBy !== undefined && { 'aria-describedby': describedBy }),\n ...(invalid !== undefined && { 'aria-invalid': invalid }),\n })\n : field;\n wiredChildren = items;\n } else {\n // No recognizable field (custom children) — keep the wiring on the shell.\n props = {\n ...props,\n ...(id !== undefined && { id }),\n ...(describedBy !== undefined && { 'aria-describedby': describedBy }),\n ...(invalid !== undefined && { 'aria-invalid': invalid }),\n };\n }\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"input-group\"\n className={cn(\n 'flex h-10 w-full items-center overflow-hidden rounded-md border border-input bg-background',\n 'ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2',\n // The group's outline is the only outline: force-strip every\n // nested field's border, radius, ring, shadow and UA focus outline.\n // Important flags defeat both the component's own utilities\n // (Input ships `border` + `focus-visible:ring-2`) and browser\n // defaults — no seams appear where an addon sits flush.\n '[&_input]:h-full [&_input]:min-w-0 [&_input]:flex-1 [&_input]:rounded-none [&_input]:px-3 [&_input]:py-2',\n '[&_input]:!border-0 [&_input]:!bg-transparent [&_input]:!shadow-none [&_input]:!outline-none [&_input]:!ring-0 [&_input]:!ring-offset-0',\n '[&_textarea]:!border-0 [&_textarea]:!rounded-none [&_textarea]:!bg-transparent [&_textarea]:!shadow-none [&_textarea]:!outline-none [&_textarea]:!ring-0 [&_textarea]:!ring-offset-0',\n '[&_select]:!border-0 [&_select]:!rounded-none [&_select]:!bg-transparent [&_select]:!shadow-none [&_select]:!outline-none [&_select]:!ring-0 [&_select]:!ring-offset-0',\n '[&_input:disabled]:cursor-not-allowed',\n className\n )}\n {...props}\n >\n {wiredChildren}\n </div>\n );\n }\n);\nInputGroup.displayName = 'InputGroup';\n\nexport type InputGroupAddonProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Edge the addon hugs (flush against the group outline). */\n side?: 'left' | 'right';\n /** 'muted' paints a light-gray surface; 'ghost' keeps the group background. */\n variant?: 'ghost' | 'muted';\n};\n\n/**\n * Flush icon/text/button slot inside an InputGroup. Addons carry their\n * own padding on the outer edge only — the nested field's padding\n * supplies the gap toward the middle, so content stays on one rhythm.\n */\nconst InputGroupAddon = React.forwardRef<HTMLDivElement, InputGroupAddonProps>(\n ({ side = 'left', variant = 'ghost', className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"input-group-addon\"\n data-side={side}\n className={cn(\n 'flex shrink-0 select-none items-center self-stretch px-3 text-sm text-muted-foreground',\n variant === 'muted' && 'bg-muted',\n className\n )}\n {...props}\n />\n )\n);\nInputGroupAddon.displayName = 'InputGroupAddon';\n\nexport { InputGroup, InputGroupAddon };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n /** Controlled value; omit for uncontrolled usage. */\n value?: string;\n /** Fired when the content changes. */\n onChange?: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n};\n\n/**\n * Multi-line text input styled to match `Input`. Wraps the native\n * <textarea> so form semantics, IME support, and validation bubbles\n * behave exactly as users expect.\n */\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n />\n )\n);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type SelectOption = {\n value: string;\n label: string;\n disabled?: boolean;\n};\n\nexport type SelectOptionGroup = {\n label: string;\n options: SelectOption[];\n};\n\nexport type SelectProps = Omit<\n React.SelectHTMLAttributes<HTMLSelectElement>,\n 'onChange' | 'value' | 'defaultValue' | 'multiple'\n> & {\n /** Flat options. Ignored when `groups` is provided. */\n options?: SelectOption[];\n /** Optgroups with a heading per section. */\n groups?: SelectOptionGroup[];\n label?: string;\n /** Renders a disabled empty option — the native \"choose one\" affordance. */\n placeholder?: string;\n /** Native multi-select: value/onChange switch to string[]. */\n multiple?: boolean;\n value?: string | string[];\n defaultValue?: string | string[];\n onChange?: (value: string | string[]) => void;\n};\n\n/**\n * Accessible select primitive built on the native <select>: full keyboard,\n * screen-reader and mobile platform behavior comes from the platform rather\n * than a re-implemented listbox. Supports flat options, optgroups,\n * placeholder rows and native multi-select (string[] contract).\n */\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(function Select(\n { options, groups, label, placeholder, multiple = false, value, defaultValue, onChange, id, className, ...props },\n ref,\n) {\n const generatedId = React.useId();\n const selectId = id ?? generatedId;\n const labelId = `${selectId}-label`;\n\n const renderOption = (option: SelectOption) => (\n <option key={option.value} value={option.value} disabled={option.disabled}>\n {option.label}\n </option>\n );\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {label && (\n <label id={labelId} htmlFor={selectId} className=\"text-sm font-medium\">\n {label}\n </label>\n )}\n <select\n ref={ref}\n id={selectId}\n multiple={multiple}\n aria-labelledby={label ? labelId : undefined}\n className={cn(\n 'rounded-md border border-input bg-background px-3 py-2 text-sm',\n multiple && 'min-h-32',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n value={value as string | string[] | undefined}\n defaultValue={defaultValue as string | string[] | undefined}\n onChange={(event) => {\n if (!onChange) return;\n if (multiple) {\n onChange(Array.from(event.target.selectedOptions, (option) => option.value));\n return;\n }\n onChange(event.target.value);\n }}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {groups\n ? groups.map((group) => (\n <optgroup key={group.label} label={group.label}>\n {group.options.map(renderOption)}\n </optgroup>\n ))\n : (options ?? []).map(renderOption)}\n </select>\n </div>\n );\n});\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary: 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive: 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport type BadgeProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof badgeVariants> & {\n /** Render the child element (e.g. a router Link) with badge styling. */\n asChild?: boolean;\n };\n\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'div';\n return <Comp ref={ref} className={cn(badgeVariants({ variant }), className)} {...props} />;\n }\n);\nBadge.displayName = 'Badge';\n\nexport { Badge, badgeVariants };\n","import * as React from 'react';\nimport * as AvatarPrimitive from '@radix-ui/react-avatar';\nimport { cn } from '../../utils/cn';\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(\n 'relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full',\n className\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full', className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarImage, AvatarFallback };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst spinnerVariants = cva(\n 'inline-block animate-spin rounded-full border-2 border-current border-t-transparent text-muted-foreground motion-reduce:animate-none',\n {\n variants: {\n size: {\n sm: 'h-3 w-3',\n default: 'h-4 w-4',\n lg: 'h-6 w-6',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n);\n\nexport type SpinnerProps = React.HTMLAttributes<HTMLSpanElement> & VariantProps<typeof spinnerVariants> & {\n /** Accessible label announced to screen readers; set aria-hidden when purely decorative. */\n label?: string;\n};\n\nfunction Spinner({ className, size, label = 'Loading...', ...props }: SpinnerProps) {\n return (\n <span\n role=\"status\"\n className={cn(spinnerVariants({ size }), className)}\n {...props}\n >\n <span className=\"sr-only\">{label}</span>\n </span>\n );\n}\n\nexport { Spinner, spinnerVariants };\n","'use client';\n\nimport * as React from 'react';\nimport type { ToastAction, ToastOptions, ToastRecord } from './toast-store';\n\nexport type { ToastAction, ToastOptions, ToastRecord };\n\nexport type ToastContextValue = {\n toasts: ToastRecord[];\n toast: (options: ToastOptions) => string;\n dismiss: (id: string) => void;\n};\n\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\nconst DEFAULT_DURATION = 5000;\n\n/**\n * Accessible app-level notifications. Toasts render into a polite live\n * region so screen readers announce them without stealing focus, stack\n * newest-first, and auto-dismiss unless duration is 0.\n */\nexport function ToastProvider({ children, label = 'Notifications' }: { children: React.ReactNode; label?: string }) {\n const [toasts, setToasts] = React.useState<ToastRecord[]>([]);\n const timers = React.useRef(new Map<string, ReturnType<typeof setTimeout>>());\n\n const dismiss = React.useCallback((id: string) => {\n const timer = timers.current.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.current.delete(id);\n }\n setToasts((current) => current.filter((entry) => entry.id !== id));\n }, []);\n\n const toast = React.useCallback(\n (options: ToastOptions) => {\n const id = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n setToasts((current) => [...current, { ...options, id }]);\n const duration = options.duration ?? DEFAULT_DURATION;\n if (duration > 0) {\n timers.current.set(\n id,\n setTimeout(() => dismiss(id), duration),\n );\n }\n return id;\n },\n [dismiss],\n );\n\n React.useEffect(() => {\n const pending = timers.current;\n return () => {\n for (const timer of pending.values()) clearTimeout(timer);\n pending.clear();\n };\n }, []);\n\n const value = React.useMemo(() => ({ toasts, toast, dismiss }), [toasts, toast, dismiss]);\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <ToastRegion toasts={toasts} onDismiss={dismiss} label={label} />\n </ToastContext.Provider>\n );\n}\n\nexport function useToast(): ToastContextValue {\n const context = React.useContext(ToastContext);\n if (!context) throw new Error('useToast must be used within a <ToastProvider>.');\n return context;\n}\n\nfunction ToastRegion({\n toasts,\n onDismiss,\n label,\n}: {\n toasts: ToastRecord[];\n onDismiss: (id: string) => void;\n label: string;\n}) {\n return (\n <ol\n aria-label={label}\n className=\"fixed bottom-4 right-4 z-50 flex w-full max-w-sm flex-col gap-2\"\n >\n {toasts.map((entry) => (\n <li key={entry.id} className=\"rounded-lg border border-border bg-card p-4 shadow-lg\">\n <div role=\"status\" className=\"flex items-start justify-between gap-3\">\n <div>\n <p className=\"text-sm font-semibold\">{entry.title}</p>\n {entry.description && <p className=\"mt-1 text-sm text-muted-foreground\">{entry.description}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onDismiss(entry.id)}\n aria-label={`Dismiss ${entry.title}`}\n className=\"rounded p-1 text-muted-foreground hover:text-foreground\"\n >\n ✕\n </button>\n </div>\n {entry.action && (\n <button\n type=\"button\"\n onClick={() => {\n entry.action?.onClick();\n onDismiss(entry.id);\n }}\n className=\"mt-2 text-sm font-medium text-primary hover:underline\"\n >\n {entry.action.label}\n </button>\n )}\n </li>\n ))}\n </ol>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport {\n getToastServerSnapshot,\n getToastSnapshot,\n subscribeToToasts,\n toast as imperativeToast,\n type ToastRecord,\n type ToastVariant,\n} from './toast-store';\n\nexport type ToasterPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport type ToasterProps = {\n /** Corner/edge the stack renders at. Default 'bottom-right'. */\n position?: ToasterPosition;\n /** Accessible name of the live region. Default 'Notifications'. */\n label?: string;\n /** Tint the toast surface with its status color (neutral by default). */\n richColors?: boolean;\n};\n\nconst positionClasses: Record<ToasterPosition, string> = {\n 'top-left': 'left-4 top-4 items-start',\n 'top-center': 'left-1/2 top-4 -translate-x-1/2 items-center',\n 'top-right': 'right-4 top-4 items-end',\n 'bottom-left': 'bottom-4 left-4 items-start',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2 items-center',\n 'bottom-right': 'bottom-4 right-4 items-end',\n};\n\nconst richClasses: Record<ToastVariant, string> = {\n default: 'border-border bg-card',\n success: 'border-success/50 bg-success/10',\n error: 'border-destructive/50 bg-destructive/10',\n warning: 'border-warning/50 bg-warning/10',\n info: 'border-info/50 bg-info/10',\n};\n\nconst dotClasses: Record<ToastVariant, string> = {\n default: 'bg-muted-foreground',\n success: 'bg-success',\n error: 'bg-destructive',\n warning: 'bg-warning',\n info: 'bg-info',\n};\n\n/**\n * Renders the imperative toast queue. Mount once near the app root:\n *\n * <Toaster />\n * toast.success('Saved')\n *\n * The region is a polite live region, so announcements don't steal focus.\n */\nexport function Toaster({ position = 'bottom-right', label = 'Notifications', richColors = false }: ToasterProps) {\n const entries = React.useSyncExternalStore(subscribeToToasts, getToastSnapshot, getToastServerSnapshot);\n\n return (\n <ol\n aria-label={label}\n className={cn('fixed z-[60] flex w-full max-w-sm flex-col gap-2', positionClasses[position])}\n >\n {entries.map((entry) => {\n const variant = entry.variant ?? 'default';\n return (\n <li\n key={entry.id}\n className={cn(\n 'rounded-lg border p-4 shadow-lg',\n richColors ? richClasses[variant] : 'border-border bg-card',\n )}\n >\n <div role=\"status\" className=\"flex items-start gap-3\">\n <span aria-hidden=\"true\" className={cn('mt-1 h-2 w-2 shrink-0 rounded-full', dotClasses[variant])} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold\">{entry.title}</p>\n {entry.description && <p className=\"mt-1 text-sm text-muted-foreground\">{entry.description}</p>}\n {entry.action && (\n <button\n type=\"button\"\n onClick={() => {\n entry.action?.onClick();\n imperativeToast.dismiss(entry.id);\n }}\n className=\"mt-2 text-sm font-medium text-primary hover:underline\"\n >\n {entry.action.label}\n </button>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => imperativeToast.dismiss(entry.id)}\n aria-label={`Dismiss ${entry.title}`}\n className=\"rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n\nexport type { ToastRecord };\n","/**\n * Imperative toast store.\n *\n * Components can call `toast(...)` from anywhere — event handlers, data\n * layers, async catch blocks — without threading a hook through the tree.\n * `<Toaster />` subscribes to this store and renders the queue. The\n * provider/hook API in Toast.tsx remains for tree-scoped usage.\n */\n\nexport type ToastVariant = 'default' | 'success' | 'error' | 'warning' | 'info';\n\nexport type ToastAction = {\n label: string;\n onClick: () => void;\n};\n\nexport type ToastOptions = {\n title: string;\n description?: string;\n action?: ToastAction;\n variant?: ToastVariant;\n /** Auto-dismiss delay in ms; 0 keeps the toast until dismissed. Default 5000. */\n duration?: number;\n};\n\nexport type ToastRecord = ToastOptions & { id: string };\n\ntype Listener = (toasts: readonly ToastRecord[]) => void;\n\nconst DEFAULT_DURATION = 5000;\n\nlet toasts: readonly ToastRecord[] = [];\nconst EMPTY: readonly ToastRecord[] = [];\nconst listeners = new Set<Listener>();\nconst timers = new Map<string, ReturnType<typeof setTimeout>>();\n\nfunction emit() {\n for (const listener of listeners) listener(toasts);\n}\n\nfunction dismiss(id: string) {\n const timer = timers.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.delete(id);\n }\n toasts = toasts.filter((entry) => entry.id !== id);\n emit();\n}\n\nfunction show(options: ToastOptions): string {\n const id = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n toasts = [...toasts, { ...options, id }];\n emit();\n\n const duration = options.duration ?? DEFAULT_DURATION;\n if (duration > 0) {\n timers.set(\n id,\n setTimeout(() => dismiss(id), duration),\n );\n }\n return id;\n}\n\ntype ToastFunction = ((options: ToastOptions) => string) & {\n success: (title: string, description?: string) => string;\n error: (title: string, description?: string) => string;\n warning: (title: string, description?: string) => string;\n info: (title: string, description?: string) => string;\n dismiss: (id?: string) => void;\n clear: () => void;\n};\n\n/**\n * Fire a toast from anywhere. Variant helpers mirror the sonner/Radix\n * shape most codebases already call:\n *\n * toast.success('Saved')\n * toast.error('Upload failed', 'Check your connection')\n * toast({ title: 'Heads up', duration: 0 })\n */\nexport const toast: ToastFunction = Object.assign(\n (options: ToastOptions) => show({ ...options, variant: options.variant ?? 'default' }),\n {\n success: (title: string, description?: string) => show({ title, description, variant: 'success' }),\n error: (title: string, description?: string) => show({ title, description, variant: 'error' }),\n warning: (title: string, description?: string) => show({ title, description, variant: 'warning' }),\n info: (title: string, description?: string) => show({ title, description, variant: 'info' }),\n dismiss: (id?: string) => {\n if (id) {\n dismiss(id);\n return;\n }\n for (const entry of [...toasts]) dismiss(entry.id);\n },\n clear: () => {\n for (const entry of [...toasts]) dismiss(entry.id);\n },\n },\n);\n\n/** Subscribe to the queue (used by `<Toaster />`). */\nexport function subscribeToToasts(listener: Listener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** Current queue; the reference is stable between mutations. */\nexport function getToastSnapshot(): readonly ToastRecord[] {\n return toasts;\n}\n\n/** SSR-safe snapshot — always empty (toasts only exist client-side). */\nexport function getToastServerSnapshot(): readonly ToastRecord[] {\n return EMPTY;\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { usePresence } from '../../utils/presence';\n\nexport type DialogSize = 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n\nexport type DialogProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Accessible name + default header title. Optional when composing a custom header. */\n title?: string;\n description?: string;\n children?: React.ReactNode;\n /** Panel max-width preset (default 'md'). */\n size?: DialogSize;\n /**\n * Replaces the default header row. Compose with `<DialogHeader>` /\n * `<DialogTitle>` / `<DialogDescription>` — those parts pick up the\n * dialog's aria ids automatically.\n */\n header?: React.ReactNode;\n /** Action row pinned under the body. */\n footer?: React.ReactNode;\n /** Cap the body height and scroll inside the panel. */\n scrollable?: boolean;\n bodyClassName?: string;\n closeOnBackdrop?: boolean;\n /** Hide the close (✕) button in the header; Escape and backdrop still close. */\n showClose?: boolean;\n /** Focused when the dialog opens; defaults to the first focusable element. */\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n /** Accessible name when `title` is omitted (required with a custom header). */\n ariaLabel?: string;\n /**\n * Fade the backdrop and panel in on open and out on close (requires\n * the tailwindcss-animate plugin). Off by default; reduced-motion\n * users get animate-none automatically.\n */\n animate?: boolean;\n};\n\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst sizeClasses: Record<DialogSize, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n};\n\nconst DialogIdsContext = React.createContext<{ titleId: string; descriptionId: string } | null>(null);\n\nexport type DialogHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Header row for composed dialogs. */\nfunction DialogHeader({ className, ...props }: DialogHeaderProps) {\n return <div className={cn('flex items-start justify-between gap-4', className)} {...props} />;\n}\n\nexport type DialogTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/** Dialog heading; automatically wired to aria-labelledby. */\nfunction DialogTitle({ className, ...props }: DialogTitleProps) {\n const ids = React.useContext(DialogIdsContext);\n return <h2 id={ids?.titleId} className={cn('text-lg font-semibold', className)} {...props} />;\n}\n\nexport type DialogDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\n/** Supporting line; automatically wired to aria-describedby. */\nfunction DialogDescription({ className, ...props }: DialogDescriptionProps) {\n const ids = React.useContext(DialogIdsContext);\n return <p id={ids?.descriptionId} className={cn('mt-2 text-sm text-muted-foreground', className)} {...props} />;\n}\n\nexport type DialogBodyProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Body wrapper for composed dialogs. */\nfunction DialogBody({ className, ...props }: DialogBodyProps) {\n return <div className={cn('mt-4', className)} {...props} />;\n}\n\nexport type DialogFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Action row pinned to the bottom of the panel. */\nfunction DialogFooter({ className, ...props }: DialogFooterProps) {\n return <div className={cn('mt-6 flex items-center justify-end gap-2', className)} {...props} />;\n}\n\n/**\n * Accessible modal dialog: portal, aria-modal + labelled/describedby wiring,\n * Escape and backdrop dismissal, initial focus on open and focus restoration\n * on close, plus a Tab/Shift+Tab focus trap.\n *\n * Use `title`/`description` for the default header, or pass `header` with\n * `<DialogHeader>`/`<DialogTitle>`/`<DialogDescription>` (and an\n * `ariaLabel` fallback) for full control.\n */\nexport function Dialog({\n open,\n onOpenChange,\n title,\n description,\n children,\n size = 'md',\n header,\n footer,\n scrollable = false,\n bodyClassName,\n closeOnBackdrop = true,\n showClose = true,\n initialFocusRef,\n ariaLabel,\n animate = false,\n}: DialogProps) {\n const dialogRef = React.useRef<HTMLDivElement | null>(null);\n const previouslyFocused = React.useRef<HTMLElement | null>(null);\n const titleId = React.useId();\n const descriptionId = React.useId();\n const { present, exiting } = usePresence(open, animate);\n\n // Capture the opener before the panel takes focus; restore the moment\n // open flips false — even while an exit animation keeps the DOM up.\n React.useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement as HTMLElement | null;\n return;\n }\n previouslyFocused.current?.focus?.();\n previouslyFocused.current = null;\n }, [open]);\n\n // Move focus in once the panel is actually mounted (present can lag\n // open by a render when the presence gate starts closed).\n React.useEffect(() => {\n if (!open || !present) return;\n const node = dialogRef.current;\n const target =\n initialFocusRef?.current ?? node?.querySelector<HTMLElement>(FOCUSABLE) ?? node;\n target?.focus();\n }, [open, present, initialFocusRef]);\n\n React.useEffect(() => {\n if (!open) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n onOpenChange(false);\n return;\n }\n if (event.key !== 'Tab') return;\n const node = dialogRef.current;\n if (!node) return;\n const focusable = Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (focusable.length === 0) return;\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === node)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', onKeyDown, true);\n return () => document.removeEventListener('keydown', onKeyDown, true);\n }, [open, onOpenChange]);\n\n if (!present || typeof document === 'undefined') return null;\n\n const motion = animate\n ? cn(\n 'duration-200 motion-reduce:animate-none',\n exiting ? 'animate-out fade-out-0 zoom-out-95' : 'animate-in fade-in-0 zoom-in-95',\n )\n : undefined;\n\n return createPortal(\n <div\n className={cn('fixed inset-0 z-50 flex items-center justify-center bg-background/80 p-4', motion)}\n onMouseDown={(event) => {\n if (closeOnBackdrop && event.target === event.currentTarget) onOpenChange(false);\n }}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={ariaLabel ? undefined : titleId}\n aria-label={ariaLabel}\n aria-describedby={description ? descriptionId : undefined}\n tabIndex={-1}\n className={cn(\n 'flex w-full flex-col rounded-xl border border-border bg-card p-6 shadow-xl',\n sizeClasses[size],\n motion,\n )}\n >\n <DialogIdsContext.Provider value={{ titleId, descriptionId }}>\n {header ?? (\n <DialogHeader>\n <div className=\"min-w-0\">\n {title && <DialogTitle>{title}</DialogTitle>}\n {description && <DialogDescription>{description}</DialogDescription>}\n </div>\n {showClose && (\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n aria-label=\"Close dialog\"\n className=\"rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n )}\n </DialogHeader>\n )}\n <div\n className={cn(\n 'mt-4 min-h-0',\n scrollable && 'max-h-[60vh] overflow-y-auto pr-1',\n bodyClassName,\n )}\n >\n {children}\n </div>\n {footer && <DialogFooter>{footer}</DialogFooter>}\n </DialogIdsContext.Provider>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport { DialogHeader, DialogTitle, DialogDescription, DialogBody, DialogFooter };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type TableCardProps = React.HTMLAttributes<HTMLDivElement> & {\n title?: string;\n description?: string;\n /** Right-aligned header actions (create, export, column settings). */\n actions?: React.ReactNode;\n /** Row between the header and the table (filters, bulk actions). */\n toolbar?: React.ReactNode;\n /** Table/DataTable content. */\n children: React.ReactNode;\n /** Rendered under the table (pagination, summary). */\n footer?: React.ReactNode;\n /** Remove the inner padding so table edges reach the card border. */\n flush?: boolean;\n};\n\n/**\n * Table shell: title/description + actions, an optional toolbar, an\n * edge-to-edge table body and a footer row. Standardizes the chrome every\n * list page grows around a Table or DataTable.\n */\nexport const TableCard = React.forwardRef<HTMLDivElement, TableCardProps>(function TableCard(\n { title, description, actions, toolbar, children, footer, flush = true, className, ...props },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cn('overflow-hidden rounded-xl border border-border bg-card text-card-foreground', className)}\n {...props}\n >\n {(title || description || actions) && (\n <div className=\"flex flex-wrap items-start justify-between gap-3 border-b border-border px-4 py-3\">\n <div className=\"min-w-0\">\n {title && <h2 className=\"text-sm font-semibold\">{title}</h2>}\n {description && <p className=\"mt-0.5 text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n )}\n {toolbar && <div className=\"border-b border-border px-4 py-2\">{toolbar}</div>}\n <div className={cn(flush ? 'overflow-x-auto' : 'p-4')}>{children}</div>\n {footer && <div className=\"border-t border-border px-4 py-3\">{footer}</div>}\n </div>\n );\n});\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\nexport type SelectMenuItem = {\n value: string;\n label: string;\n /** Muted supporting line under the label. */\n description?: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n /** Section heading the item renders under. */\n group?: string;\n};\n\nexport type SelectMenuProps = Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'value' | 'defaultValue' | 'onChange' | 'children' | 'type'\n> & {\n items: SelectMenuItem[];\n /** Selected value(s): a string, or string[] when multiple. */\n value?: string | string[];\n defaultValue?: string | string[];\n onValueChange?: (value: string | string[]) => void;\n /** Allow choosing several items (the listbox stays open). */\n multiple?: boolean;\n placeholder?: string;\n /** Name for hidden form inputs (renders one input per selected value). */\n name?: string;\n /** Custom trigger content for the current selection. */\n renderValue?: (selected: SelectMenuItem[]) => React.ReactNode;\n /** Custom option row. */\n renderItem?: (item: SelectMenuItem, state: { selected: boolean; active: boolean }) => React.ReactNode;\n emptyText?: string;\n};\n\nfunction useOutsideClose(open: boolean, close: () => void, refs: Array<React.RefObject<HTMLElement | null>>) {\n React.useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: MouseEvent) => {\n const target = event.target as Node;\n if (refs.some((ref) => ref.current?.contains(target))) return;\n close();\n };\n document.addEventListener('mousedown', onPointerDown);\n return () => document.removeEventListener('mousedown', onPointerDown);\n }, [open, close, refs]);\n}\n\n/**\n * Custom dropdown select for rich options: descriptions, icons, grouped\n * headings, multi-select and custom row rendering. Unlike `Select` (native\n * `<select>`), this renders a real listbox, so option content is not limited\n * to text. Keyboard model follows the button/listbox pattern: arrows move the\n * active option, Home/End jump, Enter/Space selects, Escape closes, and\n * first-letter typeahead jumps to matching options.\n */\nexport const SelectMenu = React.forwardRef<HTMLButtonElement, SelectMenuProps>(function SelectMenu(\n {\n items,\n value,\n defaultValue,\n onValueChange,\n multiple = false,\n placeholder = 'Select…',\n name,\n renderValue,\n renderItem,\n emptyText = 'No options',\n className,\n disabled,\n onKeyDown,\n ...buttonProps\n },\n ref\n) {\n const [internal, setInternal] = React.useState<string[]>(() => {\n if (defaultValue === undefined) return [];\n return Array.isArray(defaultValue) ? defaultValue : [defaultValue];\n });\n const selectedValues = React.useMemo(() => {\n if (value === undefined) return internal;\n return Array.isArray(value) ? value : [value];\n }, [value, internal]);\n\n const [open, setOpen] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState(-1);\n const [position, setPosition] = React.useState<{ top: number; left: number; width: number } | null>(null);\n const triggerRef = React.useRef<HTMLButtonElement | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n const listboxId = React.useId();\n const labelId = React.useId();\n const typeahead = React.useRef({ query: '', at: 0 });\n\n const setTriggerRef = React.useCallback(\n (node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref]\n );\n\n const close = React.useCallback(() => setOpen(false), []);\n useOutsideClose(open, close, [triggerRef, listRef]);\n\n const measure = React.useCallback(() => {\n const node = triggerRef.current;\n if (!node) return;\n const rect = node.getBoundingClientRect();\n setPosition({ top: rect.bottom + 4, left: rect.left, width: Math.max(rect.width, 200) });\n }, []);\n\n React.useEffect(() => {\n if (!open) return;\n measure();\n const onScroll = () => measure();\n window.addEventListener('resize', onScroll);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n window.removeEventListener('resize', onScroll);\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [open, measure]);\n\n // Index of the first enabled option for initial highlight.\n const firstEnabled = React.useMemo(() => items.findIndex((item) => !item.disabled), [items]);\n\n const openMenu = () => {\n if (disabled) return;\n setOpen(true);\n const selectedIndex = items.findIndex((item) => selectedValues.includes(item.value) && !item.disabled);\n setActiveIndex(selectedIndex >= 0 ? selectedIndex : firstEnabled);\n };\n\n const commit = (next: string[]) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(multiple ? next : next[0] ?? '');\n };\n\n const select = (item: SelectMenuItem) => {\n if (item.disabled) return;\n if (multiple) {\n const next = selectedValues.includes(item.value)\n ? selectedValues.filter((entry) => entry !== item.value)\n : [...selectedValues, item.value];\n commit(next);\n return;\n }\n commit([item.value]);\n setOpen(false);\n };\n\n const move = (direction: 1 | -1) => {\n if (items.length === 0) return;\n let index = activeIndex;\n for (let step = 0; step < items.length; step += 1) {\n index = (index + direction + items.length) % items.length;\n if (!items[index]?.disabled) {\n setActiveIndex(index);\n return;\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n\n if (!open) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openMenu();\n }\n return;\n }\n\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 setActiveIndex(firstEnabled);\n break;\n case 'End': {\n event.preventDefault();\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (!items[i]?.disabled) {\n setActiveIndex(i);\n break;\n }\n }\n break;\n }\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (activeIndex >= 0 && items[activeIndex]) select(items[activeIndex]);\n break;\n case 'Escape':\n event.preventDefault();\n setOpen(false);\n break;\n case 'Tab':\n setOpen(false);\n break;\n default: {\n if (event.key.length !== 1 || event.metaKey || event.ctrlKey || event.altKey) return;\n const now = Date.now();\n const buffer = now - typeahead.current.at > 600 ? event.key : typeahead.current.query + event.key;\n typeahead.current = { query: buffer, at: now };\n const query = buffer.toLowerCase();\n const index = items.findIndex((item) => !item.disabled && item.label.toLowerCase().startsWith(query));\n if (index >= 0) setActiveIndex(index);\n }\n }\n };\n\n const selectedItems = items.filter((item) => selectedValues.includes(item.value));\n const triggerContent = renderValue ? (\n renderValue(selectedItems)\n ) : selectedItems.length === 0 ? (\n <span className=\"text-muted-foreground\">{placeholder}</span>\n ) : multiple ? (\n <span className=\"truncate\">\n {selectedItems.length === 1 ? selectedItems[0].label : `${selectedItems.length} selected`}\n </span>\n ) : (\n <span className=\"truncate\">{selectedItems[0].label}</span>\n );\n\n const activeOptionId = activeIndex >= 0 ? `${listboxId}-option-${activeIndex}` : undefined;\n\n // Group headings, keeping the flat index aligned with `items`.\n const rows = React.useMemo(() => {\n const out: Array<{ heading?: string; item?: SelectMenuItem; index: number }> = [];\n let lastGroup: string | undefined;\n items.forEach((item, index) => {\n if (item.group && item.group !== lastGroup) {\n out.push({ heading: item.group, index: -1 });\n lastGroup = item.group;\n }\n out.push({ item, index });\n });\n return out;\n }, [items]);\n\n return (\n <>\n <span id={labelId} className=\"sr-only\">\n {typeof buttonProps['aria-label'] === 'string' ? buttonProps['aria-label'] : 'Select'}\n </span>\n {name &&\n selectedValues.map((selected) => (\n <input key={selected} type=\"hidden\" name={name} value={selected} />\n ))}\n <button\n ref={setTriggerRef}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={open ? activeOptionId : undefined}\n aria-labelledby={labelId}\n disabled={disabled}\n onClick={() => (open ? setOpen(false) : openMenu())}\n onKeyDown={handleKeyDown}\n className={cn(\n 'flex h-10 w-full items-center justify-between gap-2 rounded-md border border-input bg-background px-3 py-2 text-left text-sm',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...buttonProps}\n >\n <span className=\"min-w-0 flex-1\">{triggerContent}</span>\n <span aria-hidden=\"true\" className=\"text-muted-foreground\">▾</span>\n </button>\n\n {open &&\n position &&\n createPortal(\n <div\n ref={listRef}\n id={listboxId}\n role=\"listbox\"\n aria-labelledby={labelId}\n aria-multiselectable={multiple || undefined}\n style={{\n position: 'fixed',\n top: position.top,\n left: position.left,\n width: position.width,\n zIndex: 50,\n }}\n className=\"max-h-64 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n {items.length === 0 ? (\n <p role=\"presentation\" className=\"px-3 py-2 text-sm text-muted-foreground\">\n {emptyText}\n </p>\n ) : (\n rows.map((row, rowIndex) =>\n row.heading ? (\n <p\n key={`heading-${row.heading}-${rowIndex}`}\n role=\"presentation\"\n className=\"px-3 pb-1 pt-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {row.heading}\n </p>\n ) : (\n <div\n key={row.item!.value}\n id={`${listboxId}-option-${row.index}`}\n role=\"option\"\n aria-selected={selectedValues.includes(row.item!.value)}\n aria-disabled={row.item!.disabled || undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => !row.item!.disabled && setActiveIndex(row.index)}\n onClick={() => select(row.item!)}\n className={cn(\n 'flex cursor-pointer items-start gap-2 rounded-sm px-3 py-2 text-sm outline-none',\n row.index === activeIndex ? 'bg-accent text-accent-foreground' : 'hover:bg-accent/60',\n row.item!.disabled && 'pointer-events-none opacity-50'\n )}\n >\n {renderItem ? (\n renderItem(row.item!, {\n selected: selectedValues.includes(row.item!.value),\n active: row.index === activeIndex,\n })\n ) : (\n <>\n {row.item!.icon && <span className=\"mt-0.5 shrink-0 [&_svg]:size-4\">{row.item!.icon}</span>}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block\">{row.item!.label}</span>\n {row.item!.description && (\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {row.item!.description}\n </span>\n )}\n </span>\n {multiple && selectedValues.includes(row.item!.value) && (\n <span aria-hidden=\"true\" className=\"ml-auto text-primary\">\n ✓\n </span>\n )}\n </>\n )}\n </div>\n )\n )\n )}\n </div>,\n document.body\n )}\n </>\n );\n});\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { Input } from '../input/Input';\nimport { useCombobox, type ComboboxItem } from './use-combobox';\n\nexport type SearchOption = {\n value: string;\n label: string;\n /** Secondary line in the dropdown. */\n description?: string;\n /** Extra words matched while filtering (aliases, category…). */\n keywords?: string;\n};\n\nexport type SearchProps = {\n /** The full option set; filtered client-side as the user types. */\n options: SearchOption[];\n /** Initially selected option value. Selection is reported via onValueChange. */\n defaultValue?: string;\n /** Called with the selected option's value. */\n onValueChange?: (value: string) => void;\n placeholder?: string;\n /** Shown when no option matches the query. */\n emptyText?: string;\n disabled?: boolean;\n id?: string;\n name?: string;\n className?: string;\n 'aria-label'?: string;\n};\n\n/**\n * Select-with-search: type to filter a full-width dropdown list, or arrow\n * through options from an empty query. Uncontrolled for its display — the\n * selected value is reported through onValueChange (initial selection via\n * defaultValue). The listbox portals to document.body with fixed\n * positioning, so scrollable containers never clip it.\n */\nexport function Search({\n options,\n defaultValue,\n onValueChange,\n placeholder = 'Search…',\n emptyText = 'No matching results',\n disabled,\n id,\n name,\n className,\n 'aria-label': ariaLabel,\n}: SearchProps) {\n const selected = React.useMemo(\n () => options.find((option) => option.value === defaultValue),\n [options, defaultValue]\n );\n const [query, setQuery] = React.useState(selected?.label ?? '');\n\n const filtered = React.useMemo(() => {\n if (!query.trim()) return options;\n const q = query.trim().toLowerCase();\n return options.filter(\n (option) =>\n option.label.toLowerCase().includes(q) ||\n option.value.toLowerCase().includes(q) ||\n (option.keywords?.toLowerCase().includes(q) ?? false) ||\n (option.description?.toLowerCase().includes(q) ?? false)\n );\n }, [options, query]);\n\n const combobox = useCombobox({\n items: filtered,\n onSelect: (item) => {\n setQuery(item.label);\n onValueChange?.(item.value);\n },\n });\n\n const select = (item: ComboboxItem) => {\n setQuery(item.label);\n onValueChange?.(item.value);\n combobox.setOpen(false);\n };\n\n return (\n <div ref={combobox.anchorRef} className={cn('relative w-full', className)}>\n <Input\n id={id}\n name={name}\n type=\"search\"\n autoComplete=\"off\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n disabled={disabled}\n value={query}\n onChange={(event) => {\n setQuery(event.target.value);\n combobox.setOpen(true);\n }}\n onFocus={() => {\n // Refocusing a completed selection shows the whole set again.\n if (selected && query === selected.label) setQuery('');\n combobox.setOpen(true);\n }}\n onKeyDown={combobox.onInputKeyDown}\n {...combobox.inputProps}\n />\n {combobox.ready &&\n createPortal(\n <ul\n id={combobox.listboxId}\n role=\"listbox\"\n aria-label={ariaLabel ?? 'Search results'}\n style={{\n position: 'fixed',\n top: combobox.pos!.top,\n left: combobox.pos!.left,\n width: Math.max(combobox.pos!.width, 220),\n zIndex: 50,\n }}\n className=\"max-h-64 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n {filtered.length === 0 ? (\n <li role=\"presentation\" className=\"px-3 py-2 text-sm text-muted-foreground\">\n {emptyText}\n </li>\n ) : (\n filtered.map((option, index) => (\n <li\n key={option.value}\n id={combobox.optionId(index)}\n role=\"option\"\n aria-selected={combobox.activeIndex === index}\n // Keep focus on the input so typing continues; select on click.\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => combobox.setActiveIndex(index)}\n onClick={() => select(option)}\n className={cn(\n 'cursor-pointer rounded-sm px-3 py-2 text-sm outline-none',\n combobox.activeIndex === index\n ? 'bg-accent text-accent-foreground'\n : 'hover:bg-accent/60'\n )}\n >\n <span className=\"block\">{option.label}</span>\n {option.description && (\n <span className=\"block text-xs text-muted-foreground\">{option.description}</span>\n )}\n </li>\n ))\n )}\n </ul>,\n document.body\n )}\n </div>\n );\n}\n","import * as React from 'react';\n\nexport type ComboboxItem = {\n value: string;\n label: string;\n};\n\ntype UseComboboxOptions = {\n /** Currently visible items (already filtered by the query). */\n items: ComboboxItem[];\n /** Called with the chosen item (mouse or Enter). */\n onSelect: (item: ComboboxItem) => void;\n /** Called whenever open state changes. */\n onOpenChange?: (open: boolean) => void;\n /** Close when the value is submitted with no active item (Enter). Default true. */\n closeOnSubmit?: boolean;\n};\n\ntype UseComboboxResult = {\n open: boolean;\n setOpen: (open: boolean) => void;\n activeIndex: number;\n /** Hover/highlight management for the listbox options. */\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n listboxId: string;\n /** Anchors the floating listbox — measured for fixed positioning. */\n anchorRef: React.MutableRefObject<HTMLDivElement | null>;\n /** aria-* props to spread on the input (combobox pattern). */\n inputProps: {\n role: 'combobox';\n 'aria-expanded': boolean;\n 'aria-controls': string;\n 'aria-autocomplete': 'list';\n 'aria-activedescendant'?: string;\n };\n /** Key handler for the input: arrows, Home/End, Enter, Escape. */\n onInputKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;\n /** Downward movement for trigger buttons outside the input (optional). */\n optionId: (index: number) => string;\n /** True when the listbox should be rendered (open + measured). */\n ready: boolean;\n /** Fixed viewport coordinates for the listbox. */\n pos: { top: number; left: number; width: number } | null;\n};\n\nlet searchUid = 0;\n\n/**\n * Shared combobox brain for Search and Autocomplete: open/close, active\n * option, keyboard navigation, outside-click dismissal, and fixed-position\n * measurement (so demo frames with overflow never clip the listbox).\n */\nexport function useCombobox({\n items,\n onSelect,\n onOpenChange,\n closeOnSubmit = true,\n}: UseComboboxOptions): UseComboboxResult {\n const [open, setOpenState] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState(-1);\n const [pos, setPos] = React.useState<{ top: number; left: number; width: number } | null>(null);\n const anchorRef = React.useRef<HTMLDivElement | null>(null);\n const listboxId = React.useRef(`slipstream-combobox-${++searchUid}`).current;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n setOpenState(next);\n if (!next) setActiveIndex(-1);\n onOpenChange?.(next);\n },\n [onOpenChange]\n );\n\n // Reset the active item whenever the visible set changes.\n React.useEffect(() => {\n setActiveIndex(-1);\n }, [items]);\n\n // Measure the anchor for fixed listbox positioning while open; close on\n // any scroll (capture catches non-bubbling element scrolls) so the\n // floating list never detaches from its input.\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const GAP = 4;\n const measure = () => {\n const rect = anchorRef.current?.getBoundingClientRect();\n if (!rect) return;\n setPos({ top: rect.bottom + GAP, left: rect.left, width: rect.width });\n };\n measure();\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', measure);\n };\n }, [open, setOpen]);\n\n // Dismiss on outside press (the input keeps focus for continued typing).\n React.useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!anchorRef.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open, setOpen]);\n\n const onInputKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Escape') {\n if (open) {\n event.preventDefault();\n setOpen(false);\n }\n return;\n }\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (!open) {\n setOpen(true);\n return;\n }\n setActiveIndex((index) => (items.length === 0 ? -1 : index >= items.length - 1 ? 0 : index + 1));\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (!open) return;\n setActiveIndex((index) => (items.length === 0 ? -1 : index <= 0 ? items.length - 1 : index - 1));\n return;\n }\n if (event.key === 'Home' && open) {\n event.preventDefault();\n setActiveIndex(items.length ? 0 : -1);\n return;\n }\n if (event.key === 'End' && open) {\n event.preventDefault();\n setActiveIndex(items.length ? items.length - 1 : -1);\n return;\n }\n if (event.key === 'Enter') {\n if (open && activeIndex >= 0 && items[activeIndex]) {\n event.preventDefault();\n onSelect(items[activeIndex]);\n setOpen(false);\n } else if (open && closeOnSubmit) {\n setOpen(false);\n }\n }\n },\n [open, items, activeIndex, onSelect, setOpen, closeOnSubmit]\n );\n\n return {\n open,\n setOpen,\n activeIndex,\n setActiveIndex,\n listboxId,\n anchorRef,\n inputProps: {\n role: 'combobox',\n 'aria-expanded': open,\n 'aria-controls': listboxId,\n 'aria-autocomplete': 'list',\n ...(open && activeIndex >= 0 ? { 'aria-activedescendant': `${listboxId}-opt-${activeIndex}` } : {}),\n },\n onInputKeyDown,\n optionId: (index: number) => `${listboxId}-opt-${index}`,\n ready: open && pos !== null && typeof document !== 'undefined',\n pos,\n };\n}\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { Input } from '../input/Input';\nimport { useCombobox } from '../search/use-combobox';\n\nexport type AutocompleteOption = {\n value: string;\n /** Display label; defaults to the value. */\n label?: string;\n /** Section heading the option renders under. */\n group?: string;\n /** Muted supporting line under the label. */\n description?: string;\n};\n\nexport type AutocompleteProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'defaultValue' | 'onChange' | 'children' | 'size'\n> & {\n /** Current text — standard controlled-input contract. */\n value?: string;\n /** Initial text when uncontrolled. */\n defaultValue?: string;\n /** Fires on every keystroke AND on suggestion selection. */\n onValueChange?: (value: string) => void;\n /** Static suggestions (strings or option objects). */\n options?: Array<string | AutocompleteOption>;\n /** @deprecated Use `options`. */\n suggestions?: string[];\n /** Async source; called with the current query (debounced) when provided. */\n loadOptions?: (query: string) => Promise<Array<string | AutocompleteOption>>;\n /** Custom row rendering (receives the normalized option). */\n renderOption?: (option: NormalizedOption, state: { active: boolean }) => React.ReactNode;\n /** Show a clear button once there is text. */\n clearable?: boolean;\n /** Shown when no option matches. */\n emptyText?: string;\n /** Shown while async options load. */\n loadingText?: string;\n /** Debounce for `loadOptions`, in ms. Default 200. */\n debounceMs?: number;\n};\n\ntype NormalizedOption = {\n value: string;\n label: string;\n group?: string;\n description?: string;\n};\n\nfunction normalize(entry: string | AutocompleteOption): NormalizedOption {\n if (typeof entry === 'string') return { value: entry, label: entry };\n return { value: entry.value, label: entry.label ?? entry.value, group: entry.group, description: entry.description };\n}\n\n/**\n * Type-ahead input following the HTML autocomplete model: users may enter\n * any value (free text is first-class), while matching options appear in a\n * portalled listbox (grouped, optional async loading, custom rows).\n * Arrow keys highlight, Enter accepts, Escape dismisses.\n */\nexport function Autocomplete({\n value,\n defaultValue = '',\n onValueChange,\n options,\n suggestions,\n loadOptions,\n renderOption,\n clearable = false,\n emptyText,\n loadingText,\n debounceMs = 200,\n placeholder,\n id,\n name,\n className,\n onKeyDown,\n onFocus,\n ...inputProps\n}: AutocompleteProps) {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const current = value ?? internalValue;\n\n const [asyncOptions, setAsyncOptions] = React.useState<NormalizedOption[]>([]);\n const [loading, setLoading] = React.useState(false);\n const requestId = React.useRef(0);\n\n const source = React.useMemo<NormalizedOption[]>(() => {\n const list = options ?? (suggestions ?? []).map(normalize);\n return list.map(normalize);\n }, [options, suggestions]);\n\n // Debounced async source. Guarded by a request id so stale responses\n // never overwrite newer ones.\n React.useEffect(() => {\n if (!loadOptions) return;\n const id = ++requestId.current;\n setLoading(true);\n const timer = setTimeout(async () => {\n try {\n const result = await loadOptions(current);\n if (requestId.current === id) setAsyncOptions(result.map(normalize));\n } catch {\n if (requestId.current === id) setAsyncOptions([]);\n } finally {\n if (requestId.current === id) setLoading(false);\n }\n }, debounceMs);\n return () => clearTimeout(timer);\n }, [loadOptions, current, debounceMs]);\n\n const pool = loadOptions ? asyncOptions : source;\n\n const items = React.useMemo(() => {\n const q = current.trim().toLowerCase();\n return pool\n .filter((option) => !q || option.label.toLowerCase().includes(q) || option.value.toLowerCase().includes(q))\n .filter((option) => option.value !== current);\n }, [pool, current]);\n\n const combobox = useCombobox({\n items: items.map((item) => ({ value: item.value, label: item.label })),\n onSelect: (item) => {\n if (value === undefined) setInternalValue(item.label);\n onValueChange?.(item.label);\n },\n });\n\n const select = (option: NormalizedOption) => {\n if (value === undefined) setInternalValue(option.label);\n onValueChange?.(option.label);\n combobox.setOpen(false);\n };\n\n // Render order with group headings derived from the option stream.\n const grouped = React.useMemo(() => {\n const out: Array<{ heading?: string; option?: NormalizedOption; index: number }> = [];\n let lastGroup: string | undefined;\n items.forEach((option, index) => {\n if (option.group && option.group !== lastGroup) {\n out.push({ heading: option.group, index: -1 });\n lastGroup = option.group;\n }\n out.push({ option, index });\n });\n return out;\n }, [items]);\n\n return (\n <div ref={combobox.anchorRef} className={cn('relative w-full', className)}>\n <Input\n id={id}\n name={name}\n placeholder={placeholder}\n autoComplete=\"off\"\n value={current}\n className={clearable && current ? 'pr-9' : undefined}\n onChange={(event) => {\n if (value === undefined) setInternalValue(event.target.value);\n onValueChange?.(event.target.value);\n combobox.setOpen(true);\n }}\n onFocus={(event) => {\n onFocus?.(event);\n combobox.setOpen(true);\n }}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n combobox.onInputKeyDown(event);\n }}\n {...inputProps}\n {...combobox.inputProps}\n />\n {clearable && current && (\n <button\n type=\"button\"\n onClick={() => {\n if (value === undefined) setInternalValue('');\n onValueChange?.('');\n combobox.setOpen(true);\n }}\n aria-label=\"Clear input\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n )}\n {combobox.ready &&\n createPortal(\n <ul\n id={combobox.listboxId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n aria-busy={loading || undefined}\n style={{\n position: 'fixed',\n top: combobox.pos!.top,\n left: combobox.pos!.left,\n width: Math.max(combobox.pos!.width, 220),\n zIndex: 50,\n }}\n className=\"max-h-60 overflow-y-auto rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n {loading && items.length === 0 ? (\n <li role=\"presentation\" className=\"px-3 py-2 text-sm text-muted-foreground\">\n {loadingText ?? 'Loading…'}\n </li>\n ) : items.length === 0 ? (\n <li role=\"presentation\" className=\"px-3 py-2 text-sm text-muted-foreground\">\n {emptyText ?? 'No suggestions'}\n </li>\n ) : (\n grouped.map((entry, rowIndex) =>\n entry.heading ? (\n <li\n key={`group-${entry.heading}-${rowIndex}`}\n role=\"presentation\"\n className=\"px-3 pb-1 pt-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\"\n >\n {entry.heading}\n </li>\n ) : (\n <li\n key={entry.option!.value}\n id={combobox.optionId(entry.index)}\n role=\"option\"\n aria-selected={combobox.activeIndex === entry.index}\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => combobox.setActiveIndex(entry.index)}\n onClick={() => select(entry.option!)}\n className={cn(\n 'cursor-pointer rounded-sm px-3 py-1.5 text-sm outline-none',\n combobox.activeIndex === entry.index\n ? 'bg-accent text-accent-foreground'\n : 'hover:bg-accent/60'\n )}\n >\n {renderOption ? (\n renderOption(entry.option!, { active: combobox.activeIndex === entry.index })\n ) : (\n <>\n <span className=\"block\">{entry.option!.label}</span>\n {entry.option!.description && (\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {entry.option!.description}\n </span>\n )}\n </>\n )}\n </li>\n )\n )\n )}\n </ul>,\n document.body\n )}\n </div>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type CheckboxProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'onChange'> & {\n /** Controlled checked state; omit for uncontrolled usage. */\n checked?: boolean;\n /** Fired when the user toggles the checkbox. */\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/**\n * Accessible checkbox built on the native input: keyboard, form, and\n * screen-reader behavior comes from the platform. Visual state is drawn\n * with a CSS overlay so the native input stays the source of truth.\n */\nconst Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ className, checked, onCheckedChange, ...props }, ref) => (\n <input\n type=\"checkbox\"\n ref={ref}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.target.checked)}\n className={cn(\n 'peer h-4 w-4 shrink-0 rounded-sm border border-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'checked:bg-primary checked:text-primary-foreground',\n className\n )}\n {...props}\n />\n )\n);\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };\n","'use client';\n\nimport * as React from 'react';\nimport { Checkbox } from '../checkbox/Checkbox';\nimport { cn } from '../../utils/cn';\n\nexport type CheckboxGroupOrientation = 'vertical' | 'horizontal';\n\nexport type CheckboxGroupProps = {\n /** Shared name applied to every checkbox in the group. */\n name: string;\n /** Accessible group label; rendered as <legend> inside a fieldset. */\n legend?: string;\n /** Currently selected values (controlled). */\n value?: string[];\n /** Initial values (uncontrolled). */\n defaultValue?: string[];\n /** Called with the full selection after a toggle. */\n onValueChange?: (value: string[]) => void;\n /** Stack options (default) or lay them out in a wrapping row. */\n orientation?: CheckboxGroupOrientation;\n /** Group-level validation message; announced via role=alert. */\n error?: string;\n className?: string;\n children: React.ReactNode;\n};\n\ntype CheckboxGroupContextValue = {\n name: string;\n values: string[];\n toggle: (value: string) => void;\n};\n\nconst CheckboxGroupContext = React.createContext<CheckboxGroupContextValue>({\n name: '',\n values: [],\n toggle: () => {},\n});\n\n/**\n * Groups related checkboxes with a shared name and accessible legend.\n * Multi-select counterpart of RadioGroup: renders a native\n * <fieldset>/<legend> so screen readers announce the group context,\n * and keeps the selection as a string[] for forms and URLs.\n */\nconst CheckboxGroup = React.forwardRef<HTMLFieldSetElement, CheckboxGroupProps>(\n (\n { name, legend, value, defaultValue, onValueChange, orientation = 'vertical', error, className, children },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState<string[]>(defaultValue ?? []);\n const currentValue = value ?? internalValue;\n\n const toggle = (next: string) => {\n const updated = currentValue.includes(next)\n ? currentValue.filter((item) => item !== next)\n : [...currentValue, next];\n if (value === undefined) setInternalValue(updated);\n onValueChange?.(updated);\n };\n\n return (\n <fieldset ref={ref} className={cn(orientation === 'vertical' ? 'space-y-2' : 'flex flex-row flex-wrap gap-x-4 gap-y-2', className)}>\n {legend && <legend className=\"text-sm font-medium\">{legend}</legend>}\n <CheckboxGroupContext.Provider value={{ name, values: currentValue, toggle }}>\n {children}\n </CheckboxGroupContext.Provider>\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </fieldset>\n );\n }\n);\nCheckboxGroup.displayName = 'CheckboxGroup';\n\nexport type CheckboxGroupItemProps = Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'name' | 'checked' | 'onChange' | 'value'\n> & {\n /** The value this item contributes to the selection. */\n value: string;\n /** Visible label rendered next to the checkbox. */\n label?: string;\n};\n\n/** A single multi-select option inside a `CheckboxGroup`. */\nconst CheckboxGroupItem = React.forwardRef<HTMLInputElement, CheckboxGroupItemProps>(\n ({ value, label, className, id, ...props }, ref) => {\n const group = React.useContext(CheckboxGroupContext);\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n ref={ref}\n id={inputId}\n name={group.name}\n value={value}\n checked={group.values.includes(value)}\n onCheckedChange={() => group.toggle(value)}\n className={className}\n {...props}\n />\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n </label>\n )}\n </div>\n );\n }\n);\nCheckboxGroupItem.displayName = 'CheckboxGroupItem';\n\nexport { CheckboxGroup, CheckboxGroupItem };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type RadioProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'onChange'> & {\n /** Controlled checked state; omit for uncontrolled usage. */\n checked?: boolean;\n /** Fired when the user selects this radio. */\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/**\n * Accessible radio built on the native input, to be used inside a\n * `RadioGroup` (which provides the shared `name`). Platform keyboard\n * navigation and form semantics come for free.\n */\nconst Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({ className, checked, onCheckedChange, ...props }, ref) => (\n <input\n type=\"radio\"\n ref={ref}\n checked={checked}\n onChange={(event) => onCheckedChange?.(event.target.checked)}\n className={cn(\n 'h-4 w-4 shrink-0 rounded-full border border-primary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'checked:bg-primary checked:text-primary-foreground',\n className\n )}\n {...props}\n />\n )\n);\nRadio.displayName = 'Radio';\n\nexport type RadioGroupProps = {\n /** Shared name applied to every radio in the group. */\n name: string;\n /** Accessible group label; rendered as <legend> inside a fieldset. */\n legend?: string;\n /** Currently selected value (controlled). */\n value?: string;\n /** Initial value (uncontrolled). */\n defaultValue?: string;\n /** Called with the newly selected value. */\n onValueChange?: (value: string) => void;\n /** Stack options (default) or lay them out in a wrapping row. */\n orientation?: 'vertical' | 'horizontal';\n /** Group-level validation message; announced via role=alert. */\n error?: string;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Groups related radios with a shared name and accessible legend.\n * Renders a native <fieldset>/<legend> so screen readers announce the\n * group context alongside each option.\n */\nconst RadioGroup = React.forwardRef<HTMLFieldSetElement, RadioGroupProps>(\n ({ name, legend, value, defaultValue, onValueChange, orientation = 'vertical', error, className, children }, ref) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue ?? '');\n const currentValue = value ?? internalValue;\n\n const handleChange = (next: string) => {\n if (value === undefined) setInternalValue(next);\n onValueChange?.(next);\n };\n\n return (\n <fieldset\n ref={ref}\n className={cn(\n orientation === 'vertical' ? 'space-y-2' : 'flex flex-row flex-wrap gap-x-4 gap-y-2',\n className\n )}\n >\n {legend && <legend className=\"text-sm font-medium\">{legend}</legend>}\n <RadioGroupContext.Provider value={{ name, value: currentValue, onChange: handleChange }}>\n {children}\n </RadioGroupContext.Provider>\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </fieldset>\n );\n }\n);\nRadioGroup.displayName = 'RadioGroup';\n\ntype RadioGroupContextValue = {\n name: string;\n value: string;\n onChange: (value: string) => void;\n};\n\n/** Shared group state — exported so custom option controls (RadioCard) can join a RadioGroup. */\nexport const RadioGroupContext = React.createContext<RadioGroupContextValue>({\n name: '',\n value: '',\n onChange: () => {},\n});\n\nexport type RadioGroupItemProps = Omit<RadioProps, 'name' | 'checked' | 'onCheckedChange' | 'value'> & {\n /** The value this item contributes to the group. */\n value: string;\n /** Visible label rendered next to the radio. */\n label?: string;\n};\n\n/** A single radio option inside a `RadioGroup`. */\nconst RadioGroupItem = React.forwardRef<HTMLInputElement, RadioGroupItemProps>(\n ({ value, label, className, id, ...props }, ref) => {\n const group = React.useContext(RadioGroupContext);\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n return (\n <div className=\"flex items-center gap-2\">\n <Radio\n ref={ref}\n id={inputId}\n name={group.name}\n value={value}\n checked={group.value === value}\n onCheckedChange={(checked) => checked && group.onChange(value)}\n className={className}\n {...props}\n />\n {label && (\n <label htmlFor={inputId} className=\"text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\">\n {label}\n </label>\n )}\n </div>\n );\n }\n);\nRadioGroupItem.displayName = 'RadioGroupItem';\n\nexport { Radio, RadioGroup, RadioGroupItem };\n","'use client';\n\nimport * as React from 'react';\nimport { Radio, RadioGroupContext } from './Radio';\nimport { cn } from '../../utils/cn';\n\nexport type RadioCardProps = {\n /** The value this section contributes to the group. */\n value: string;\n /** Section heading. */\n title?: string;\n /** Supporting line under the title. */\n description?: string;\n /** Custom body rendered after title/description. */\n children?: React.ReactNode;\n /** Outer border radius on the section (default true). */\n rounded?: boolean;\n disabled?: boolean;\n className?: string;\n id?: string;\n};\n\n/**\n * A whole section as one radio option: the entire card is the label,\n * the native radio circle is visually hidden (kept for semantics and\n * keyboard use), and selection shows as a primary border + tint via\n * has-[:checked]. Meant to sit inside a `RadioGroup`.\n */\nconst RadioCard = React.forwardRef<HTMLLabelElement, RadioCardProps>(\n ({ value, title, description, children, rounded = true, disabled, className, id }, ref) => {\n const group = React.useContext(RadioGroupContext);\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n return (\n <label\n ref={ref}\n htmlFor={inputId}\n className={cn(\n 'flex cursor-pointer flex-col gap-1.5 border border-border p-4 transition-colors',\n rounded ? 'rounded-lg' : 'rounded-none',\n 'hover:border-muted-foreground/40 hover:bg-muted/30',\n // Selected state rides on the hidden input — no visible circle.\n 'has-[:checked]:border-primary has-[:checked]:bg-primary/5',\n 'has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-ring has-[:focus-visible]:ring-offset-2 has-[:focus-visible]:ring-offset-background',\n disabled && 'cursor-not-allowed opacity-50 hover:border-border hover:bg-transparent',\n className\n )}\n >\n <Radio\n id={inputId}\n value={value}\n checked={group.value === value}\n onCheckedChange={(checked) => checked && group.onChange(value)}\n disabled={disabled}\n className=\"sr-only\"\n />\n {title && <span className=\"text-sm font-medium leading-none\">{title}</span>}\n {description && <span className=\"text-sm text-muted-foreground\">{description}</span>}\n {children}\n </label>\n );\n }\n);\nRadioCard.displayName = 'RadioCard';\n\nexport { RadioCard };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type LabelProps = React.LabelHTMLAttributes<HTMLLabelElement>;\n\n/**\n * Accessible form label. Associates with its control via `htmlFor`\n * (or wraps it) so screen readers announce the field name together\n * with its value and state.\n */\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n {...props}\n />\n )\n);\nLabel.displayName = 'Label';\n\nexport { Label };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type FieldsetProps = React.FieldsetHTMLAttributes<HTMLFieldSetElement> & {\n /** Legend rendered as the group's accessible name. */\n legend?: string;\n /** Muted supporting line rendered under the legend. */\n description?: string;\n /** Error line rendered under the controls; announced via role=alert. */\n error?: string;\n};\n\n/**\n * Groups related form controls in a native <fieldset> with a legend,\n * optional description, and an error slot. Styling is token-based\n * (borderless by default — the native border reads as chrome, not content).\n */\nconst Fieldset = React.forwardRef<HTMLFieldSetElement, FieldsetProps>(\n ({ legend, description, error, className, children, ...props }, ref) => (\n <fieldset\n ref={ref}\n className={cn('m-0 flex min-w-0 flex-col gap-1.5 border-0 p-0', className)}\n {...props}\n >\n {legend && <legend className=\"p-0 text-sm font-medium leading-none\">{legend}</legend>}\n {description && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n {children}\n {error && (\n <p role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </fieldset>\n )\n);\nFieldset.displayName = 'Fieldset';\n\nexport { Fieldset };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Label } from '../label/Label';\nimport { Tooltip } from '../tooltip/Tooltip';\n\nexport type FormFieldLabelPlacement = 'top' | 'left';\n\nexport type FormFieldProps = {\n /**\n * The control's id. The same value is applied to the label's htmlFor, the\n * control (via clone), and the hint/error describedby wiring.\n */\n id: string;\n /** Visible label text (screen-reader visible even when labelHidden). */\n label: string;\n /** Helper text rendered under the control and wired via aria-describedby. */\n hint?: string;\n /**\n * Validation error; replaces the hint, sets aria-invalid on the control,\n * announced via role=alert.\n */\n error?: string;\n /** Renders the required marker and (via the cloned control) keeps the native required attribute. */\n required?: boolean;\n /** Keeps the label for assistive tech but hides it visually. */\n labelHidden?: boolean;\n /** Stack the label above the control (default) or inline it to the left. */\n labelPlacement?: FormFieldLabelPlacement;\n /** Info icon rendered after the label; opens a tooltip with this text. */\n tooltip?: string;\n /** Slot pinned to the far right of the label row (badge, link, action). */\n trailing?: React.ReactNode;\n className?: string;\n /**\n * The control. When it is a single React element (Slipstream inputs,\n * native inputs…), id / aria-describedby / aria-invalid are cloned onto\n * it automatically; wrapped or custom children must set them manually.\n */\n children: React.ReactNode;\n};\n\ntype CloneableProps = Record<string, unknown>;\n\n/**\n * Label + control + hint/error in one unit with the a11y wiring done for\n * you: htmlFor pairing, aria-describedby pointing at the hint (or error),\n * and aria-invalid when an error is present. Supports top or left label\n * placement, a label tooltip with info icon, and a trailing slot on the\n * right of the label row.\n */\nconst FormField = ({\n id,\n label,\n hint,\n error,\n required,\n labelHidden,\n labelPlacement = 'top',\n tooltip,\n trailing,\n className,\n children,\n}: FormFieldProps) => {\n const hintId = `${id}-hint`;\n const errorId = `${id}-error`;\n const describedBy = error ? errorId : hint ? hintId : undefined;\n\n let control = children;\n // Fragments/multi-children can't receive wired props — consumers must set\n // id/aria-describedby on those children themselves (documented).\n if (React.isValidElement<CloneableProps>(children) && children.type !== React.Fragment) {\n control = React.cloneElement<CloneableProps>(children, {\n id,\n 'aria-describedby': describedBy,\n ...(error ? { 'aria-invalid': true } : {}),\n });\n }\n\n const labelNode = (\n <Label htmlFor={id} className={labelHidden ? 'sr-only' : undefined}>\n {label}\n {required && (\n <>\n {' '}\n <span aria-hidden=\"true\" className=\"ml-0.5 text-destructive\">\n *\n </span>\n </>\n )}\n </Label>\n );\n\n const tooltipNode = tooltip ? (\n <Tooltip content={tooltip} side=\"top\">\n <button\n type=\"button\"\n aria-label={`${label} information`}\n className=\"ml-1 inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-full text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <svg viewBox=\"0 0 16 16\" className=\"h-3.5 w-3.5\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M8 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM8 7a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 7Zm0-2.25a.9.9 0 1 1 0 1.8.9.9 0 0 1 0-1.8Z\" />\n </svg>\n </button>\n </Tooltip>\n ) : null;\n\n const hintOrError = error ? (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n ) : hint ? (\n <p id={hintId} className=\"text-xs text-muted-foreground\">\n {hint}\n </p>\n ) : null;\n\n if (labelPlacement === 'left') {\n return (\n <div className={cn('flex min-w-0 flex-col gap-1.5', className)}>\n <div className=\"flex items-start gap-3\">\n <div className=\"flex w-40 shrink-0 items-center gap-1 pt-2\">\n {labelNode}\n {tooltipNode}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n {/* Trailing sits inline with the control (vertically centered),\n not floating above it — keeps the row reading as one field. */}\n <div className=\"flex min-w-0 items-center gap-2\">\n <div className=\"min-w-0 flex-1\">{control}</div>\n {trailing && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{trailing}</span>\n )}\n </div>\n {hintOrError}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className={cn('flex min-w-0 flex-col gap-1.5', className)}>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center\">\n {labelNode}\n {tooltipNode}\n </span>\n {trailing}\n </div>\n {control}\n {hintOrError}\n </div>\n );\n};\nFormField.displayName = 'FormField';\n\nexport { FormField };\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\nexport type TooltipProps = {\n /** The tooltip text. */\n content: string;\n /** Placement relative to the trigger (defaults to top). */\n side?: 'top' | 'bottom' | 'left' | 'right';\n /** Delay before showing on hover, in milliseconds. */\n delay?: number;\n className?: string;\n /** A single focusable element; receives aria-describedby when open. */\n children: React.ReactElement;\n};\n\ntype Position = { top: number; left: number; transform: string };\n\nconst GAP = 8;\n\n/**\n * Hover/focus tooltip built on aria-describedby. Shows on pointer\n * hover and keyboard focus (not click), dismisses on Escape, and\n * never traps focus.\n *\n * The bubble portals to document.body with position:fixed, measured from\n * the trigger — overflowing a scrollable ancestor can never clip it or\n * scroll the container (the reported \"tooltip causes scroll\" bug).\n */\nconst Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n ({ content, side = 'top', delay = 300, className, children }, ref) => {\n const [open, setOpen] = React.useState(false);\n const [pos, setPos] = React.useState<Position | null>(null);\n const anchorRef = React.useRef<HTMLDivElement | null>(null);\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const id = React.useId();\n\n const show = React.useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setOpen(true), delay);\n }, [delay]);\n\n const hide = React.useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n setOpen(false);\n setPos(null);\n }, []);\n\n React.useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n []\n );\n\n // Measure the trigger for fixed positioning; scroll/resize dismisses\n // the bubble so it can never drift from (or scroll with) its anchor.\n React.useLayoutEffect(() => {\n if (!open) return;\n const rect = anchorRef.current?.getBoundingClientRect();\n if (!rect) return;\n const next: Position =\n side === 'top'\n ? { top: rect.top - GAP, left: rect.left + rect.width / 2, transform: 'translate(-50%, -100%)' }\n : side === 'bottom'\n ? { top: rect.bottom + GAP, left: rect.left + rect.width / 2, transform: 'translate(-50%, 0)' }\n : side === 'left'\n ? { top: rect.top + rect.height / 2, left: rect.left - GAP, transform: 'translate(-100%, -50%)' }\n : { top: rect.top + rect.height / 2, left: rect.right + GAP, transform: 'translate(0, -50%)' };\n setPos(next);\n const onScrollOrResize = () => hide();\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n return () => {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n };\n }, [open, side, hide]);\n\n // Inject aria-describedby into the trigger so the hint is announced\n // alongside the trigger's own accessible name.\n const trigger = React.cloneElement(children, {\n 'aria-describedby': open ? id : undefined,\n } as React.Attributes);\n\n return (\n <div\n ref={(node) => {\n anchorRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n className={cn('relative inline-flex', className)}\n onMouseEnter={show}\n onMouseLeave={hide}\n onFocusCapture={show}\n onBlurCapture={hide}\n onKeyDown={(event) => {\n if (event.key === 'Escape' && open) {\n event.stopPropagation();\n hide();\n }\n }}\n >\n {trigger}\n {open &&\n pos &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n id={id}\n role=\"tooltip\"\n style={{ position: 'fixed', top: pos.top, left: pos.left, transform: pos.transform, zIndex: 60 }}\n className=\"pointer-events-none w-max max-w-xs rounded-md border border-border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md\"\n >\n {content}\n </div>,\n document.body\n )}\n </div>\n );\n }\n);\nTooltip.displayName = 'Tooltip';\n\nexport { Tooltip };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\nexport type FormVariant = 'default' | 'card' | 'inline';\n\nexport type FormProps = React.FormHTMLAttributes<HTMLFormElement> & {\n /** Visual container: plain stack (default), bordered card, or inline row. */\n variant?: FormVariant;\n /** Even spacing between children — token ('md') or exact pixels (16). */\n gap?: GapValue;\n};\n\n/**\n * Semantic <form> with an even-spacing layout built in: children stack\n * vertically (default), render as a bordered card, or flow inline on one\n * row. Native submit/validation semantics are untouched — wire onSubmit\n * and use noValidate only when you validate manually (e.g. with FormField\n * error states).\n */\nconst Form = React.forwardRef<HTMLFormElement, FormProps>(\n ({ variant = 'default', gap, className, style, ...props }, ref) => {\n const gapResolved = resolveGap(gap ?? 'md');\n return (\n <form\n ref={ref}\n className={cn(\n 'flex min-w-0 flex-col',\n variant === 'card' && 'rounded-lg border border-border bg-card p-6',\n variant === 'inline' && 'flex-row flex-wrap items-end',\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n {...props}\n />\n );\n }\n);\nForm.displayName = 'Form';\n\nexport { Form };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\n// Literal classes so Tailwind's scanner keeps them (runtime-built\n// grid-cols-${n} would be purged — same rule as Grid).\nconst GRID_COLUMNS: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n};\n\nexport type FormLayoutProps = React.HTMLAttributes<HTMLElement> & {\n /** Grouping layout: even vertical stack (default), horizontal row, or responsive grid. */\n layout?: 'stack' | 'row' | 'grid';\n /** Grid column count (1-4); grid wraps naturally via responsive variants passed as className. */\n columns?: 1 | 2 | 3 | 4;\n /** Even spacing between children — token ('md') or exact pixels (16). */\n gap?: GapValue;\n /** Group label; renders a semantic <legend> when as=\"fieldset\". */\n legend?: string;\n /** Supporting line under the legend (fieldset mode). */\n description?: string;\n /** Render as a semantic fieldset (default 'div'). */\n as?: 'div' | 'fieldset';\n};\n\n/**\n * Groups form fields with even, tokenized spacing — the layout half of\n * form composition (FormField/Fieldset provide the per-control semantics).\n * stack keeps one field per row, row flows fields inline, grid spreads\n * them across columns (1-4, literal classes so they survive purging).\n */\nconst FormLayout = React.forwardRef<HTMLElement, FormLayoutProps>(\n (\n {\n layout = 'stack',\n columns = 2,\n gap,\n legend,\n description,\n as = 'div',\n className,\n style,\n children,\n ...props\n },\n ref,\n ) => {\n const Tag = as as 'div' | 'fieldset';\n const gapResolved = resolveGap(gap ?? 'md');\n return (\n <Tag\n ref={ref as never}\n className={cn(\n 'flex min-w-0',\n layout === 'stack' && 'flex-col',\n layout === 'row' && 'flex-row flex-wrap items-end',\n layout === 'grid' && `grid ${GRID_COLUMNS[columns]}`,\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n {...props}\n >\n {legend && as === 'fieldset' && (\n <legend className=\"col-span-full p-0 text-sm font-medium leading-none\">{legend}</legend>\n )}\n {description && as === 'fieldset' && (\n <p className=\"col-span-full text-xs text-muted-foreground\">{description}</p>\n )}\n {children}\n </Tag>\n );\n }\n);\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type SwitchProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> & {\n /** Controlled on/off state. */\n checked?: boolean;\n /** Initial state when uncontrolled. */\n defaultChecked?: boolean;\n /** Fired when the user toggles the switch. */\n onCheckedChange?: (checked: boolean) => void;\n};\n\n/**\n * Toggle switch for binary settings. Rendered as a button with\n * `role=\"switch\"` and `aria-checked`, so screen readers announce\n * on/off state and keyboard users toggle with Enter or Space.\n */\nconst Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n ({ className, checked, defaultChecked, onCheckedChange, disabled, ...props }, ref) => {\n const [internalChecked, setInternalChecked] = React.useState(defaultChecked ?? false);\n const isOn = checked ?? internalChecked;\n\n const toggle = () => {\n if (checked === undefined) setInternalChecked((prev) => !prev);\n onCheckedChange?.(!isOn);\n };\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={isOn}\n ref={ref}\n disabled={disabled}\n onClick={toggle}\n className={cn(\n 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n isOn ? 'bg-primary' : 'bg-input',\n className\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg transition-transform',\n isOn ? 'translate-x-4' : 'translate-x-0'\n )}\n />\n </button>\n );\n }\n);\nSwitch.displayName = 'Switch';\n\nexport { Switch };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst separatorVariants = cva('shrink-0 bg-border', {\n variants: {\n orientation: {\n horizontal: 'h-px w-full',\n vertical: 'h-full w-px',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n});\n\nexport type SeparatorProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof separatorVariants> & {\n /** Accessible label for the dividing line (e.g. \"section break\"). */\n label?: string;\n};\n\n/**\n * Visual divider between content blocks. Decorative by default\n * (`role=\"none\"`); pass `label` to expose a semantic separator that\n * screen readers can announce.\n */\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n ({ className, orientation, label, ...props }, ref) => (\n <div\n ref={ref}\n role={label ? 'separator' : 'none'}\n aria-label={label}\n aria-orientation={orientation === 'vertical' ? 'vertical' : undefined}\n className={cn(separatorVariants({ orientation }), className)}\n {...props}\n />\n )\n);\nSeparator.displayName = 'Separator';\n\n/**\n * `Divider` is a semantic alias for the same primitive — either name works;\n * `Separator` follows the ARIA role terminology, `Divider` reads better in\n * layout code.\n */\nconst Divider = Separator;\n\nexport { Separator, Divider, separatorVariants };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nconst roundedClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n full: 'rounded-full',\n} as const;\n\nexport type SkeletonProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Tailwind height class for the block (e.g. 'h-4'). */\n height?: string;\n /** Tailwind width class for the block (e.g. 'w-48', 'w-full'). */\n width?: string;\n /** Corner rounding preset (default 'md'). */\n rounded?: keyof typeof roundedClasses;\n};\n\n/**\n * Loading placeholder that mirrors the shape of upcoming content.\n * Sizing lives on props (height/width/rounded) instead of ad-hoc\n * className strings. Marked `aria-hidden` so screen readers skip it —\n * pair with a live-region status elsewhere to announce loading.\n */\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({ className, height, width, rounded = 'md', ...props }, ref) => (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={cn(\n 'animate-pulse bg-muted motion-reduce:animate-none',\n roundedClasses[rounded],\n height,\n width,\n className\n )}\n {...props}\n />\n )\n);\nSkeleton.displayName = 'Skeleton';\n\nexport { Skeleton };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type ProgressProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Current value between 0 and `max`. */\n value?: number;\n /** Upper bound (default 100). */\n max?: number;\n /** Accessible label announced by screen readers. */\n label?: string;\n};\n\n/**\n * Determinate progress bar. Exposes `role=\"progressbar\"` with\n * `aria-valuenow`/`aria-valuemax` so assistive tech reports the exact\n * percentage; the visual track is pure CSS.\n */\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({ className, value = 0, max = 100, label, ...props }, ref) => {\n const clamped = Math.min(Math.max(value, 0), max);\n const percent = max > 0 ? (clamped / max) * 100 : 0;\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuenow={clamped}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label}\n className={cn('relative h-2 w-full overflow-hidden rounded-full bg-muted', className)}\n {...props}\n >\n <div\n className=\"h-full bg-primary transition-all duration-300 motion-reduce:transition-none\"\n style={{ width: `${percent}%` }}\n />\n </div>\n );\n }\n);\nProgress.displayName = 'Progress';\n\nexport { Progress };\n","'use client';\n\nimport * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\ntype TabsVariant = 'default' | 'underline' | 'rounded';\ntype TabsSize = 'sm' | 'md' | 'lg';\n\ntype TabsContextValue = {\n value: string;\n setValue: (value: string) => void;\n baseId: string;\n variant: TabsVariant;\n size: TabsSize;\n};\n\nconst TabsContext = React.createContext<TabsContextValue>({\n value: '',\n setValue: () => {},\n baseId: '',\n variant: 'default',\n size: 'md',\n});\n\nexport type TabsProps = {\n /** Controlled active tab value. */\n value?: string;\n /** Initial tab value when uncontrolled. */\n defaultValue?: string;\n /** Called when the active tab changes. */\n onValueChange?: (value: string) => void;\n /** Visual style of the tab strip. Default is the enclosed pill track. */\n variant?: TabsVariant;\n /** Control density for strip and triggers. */\n size?: TabsSize;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Tabbed content container. Manages the active tab and wires ARIA\n * tablist/tab/tabpanel semantics with roving-tabindex keyboard\n * navigation (arrow keys, Home/End).\n */\nconst Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n (\n { value, defaultValue, onValueChange, variant = 'default', size = 'md', className, children },\n ref\n ) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue ?? '');\n const current = value ?? internalValue;\n const baseId = React.useId();\n\n const setValue = React.useCallback(\n (next: string) => {\n if (value === undefined) setInternalValue(next);\n onValueChange?.(next);\n },\n [value, onValueChange]\n );\n\n return (\n <div ref={ref} className={className} data-value={current} data-variant={variant}>\n <TabsContext.Provider value={{ value: current, setValue, baseId, variant, size }}>\n {children}\n </TabsContext.Provider>\n </div>\n );\n }\n);\nTabs.displayName = 'Tabs';\n\nconst tabsListVariants = cva('inline-flex items-center justify-center text-muted-foreground', {\n variants: {\n variant: {\n default: 'rounded-md bg-muted p-1',\n // Item 18: underline strips carry no background — the underline alone\n // marks the active tab.\n underline: 'gap-1 rounded-none border-b border-border bg-transparent p-0',\n // Item 9: fully-rounded pill track with pill triggers.\n rounded: 'rounded-full bg-muted p-1',\n },\n size: {\n sm: 'gap-0.5',\n md: 'gap-1',\n lg: 'gap-1.5',\n },\n },\n defaultVariants: { variant: 'default', size: 'md' },\n});\n\nexport type TabsListProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Container for the tab triggers; renders `role=\"tablist\"`. */\nconst TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n const ctx = React.useContext(TabsContext);\n return (\n <div\n ref={ref}\n role=\"tablist\"\n className={cn(tabsListVariants({ variant: ctx.variant, size: ctx.size }), className)}\n {...props}\n />\n );\n }\n);\nTabsList.displayName = 'TabsList';\n\nconst tabsTriggerVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap font-medium transition-all',\n {\n variants: {\n variant: {\n default: 'rounded-sm px-3 py-1.5 text-sm',\n underline: 'rounded-none border-b-2 border-transparent px-3 pb-2 pt-1.5 text-sm',\n rounded: 'rounded-full px-3 py-1.5 text-sm',\n },\n size: {\n sm: 'px-2 py-1 text-xs',\n md: '',\n lg: 'px-4 py-2 text-sm',\n },\n },\n defaultVariants: { variant: 'default', size: 'md' },\n }\n);\n\nconst triggerActiveByVariant: Record<TabsVariant, string> = {\n default: 'bg-background text-foreground shadow-sm',\n underline: 'border-primary text-foreground',\n rounded: 'bg-background text-foreground shadow-sm',\n};\n\nconst triggerInactiveByVariant: Record<TabsVariant, string> = {\n default: 'hover:text-foreground',\n underline: 'border-transparent text-muted-foreground hover:border-border hover:text-foreground',\n rounded: 'hover:text-foreground',\n};\n\nexport type TabsTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** The tab's value; links it to its panel. */\n value: string;\n};\n\n/** A single tab button. Roving tabindex plus full arrow-key navigation. */\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ value, className, onKeyDown, ...props }, ref) => {\n const ctx = React.useContext(TabsContext);\n const active = ctx.value === value;\n\n // WAI-ARIA tabs pattern: arrows move AND activate (automatic activation).\n const focusAt = (tabs: Element[], index: number) => {\n if (tabs.length === 0) return;\n const next = (index + tabs.length) % tabs.length;\n const target = tabs[next] as HTMLButtonElement;\n target.focus();\n target.click();\n };\n\n const siblingTabs = (button: HTMLButtonElement): Element[] =>\n Array.from(button.parentElement?.querySelectorAll('[role=\"tab\"]') ?? []);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={`${ctx.baseId}-tab-${value}`}\n aria-selected={active}\n aria-controls={`${ctx.baseId}-panel-${value}`}\n // Radix-compatible hook so consumers can style active state from\n // outside: data-[state=active]:border-primary etc.\n data-state={active ? 'active' : 'inactive'}\n tabIndex={active ? 0 : -1}\n onClick={() => ctx.setValue(value)}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n ctx.setValue(value);\n } else if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault();\n const tabs = siblingTabs(event.currentTarget);\n focusAt(tabs, tabs.indexOf(event.currentTarget) + 1);\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault();\n const tabs = siblingTabs(event.currentTarget);\n focusAt(tabs, tabs.indexOf(event.currentTarget) - 1);\n } else if (event.key === 'Home') {\n event.preventDefault();\n focusAt(siblingTabs(event.currentTarget), 0);\n } else if (event.key === 'End') {\n event.preventDefault();\n focusAt(siblingTabs(event.currentTarget), -1);\n }\n }}\n className={cn(\n tabsTriggerVariants({ variant: ctx.variant, size: ctx.size }),\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n active ? triggerActiveByVariant[ctx.variant] : triggerInactiveByVariant[ctx.variant],\n className\n )}\n {...props}\n />\n );\n }\n);\nTabsTrigger.displayName = 'TabsTrigger';\n\nexport type TabsContentProps = React.HTMLAttributes<HTMLDivElement> & {\n /** The panel's value; must match its trigger. */\n value: string;\n};\n\n/** The content panel for a tab. Hidden via the `hidden` attribute when inactive. */\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ value, className, ...props }, ref) => {\n const ctx = React.useContext(TabsContext);\n const active = ctx.value === value;\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={`${ctx.baseId}-panel-${value}`}\n aria-labelledby={`${ctx.baseId}-tab-${value}`}\n data-state={active ? 'active' : 'inactive'}\n hidden={!active}\n tabIndex={0}\n className={cn(\n 'mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n />\n );\n }\n);\nTabsContent.displayName = 'TabsContent';\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import * as React from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../../utils/cn';\n\nexport type CardProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Render the child element (e.g. a router Link) with card styling. */\n asChild?: boolean;\n};\n\n/** Content container with a subtle border and surface styling. */\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'div';\n return (\n <Comp\n ref={ref}\n className={cn('rounded-xl border border-border bg-card text-card-foreground shadow-sm', className)}\n {...props}\n />\n );\n }\n);\nCard.displayName = 'Card';\n\nexport type CardHeaderProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Header section of a Card; typically contains CardTitle and CardDescription. */\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />\n )\n);\nCardHeader.displayName = 'CardHeader';\n\nexport type CardTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/** Title heading inside a CardHeader. */\nconst CardTitle = React.forwardRef<HTMLHeadingElement, CardTitleProps>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n )\n);\nCardTitle.displayName = 'CardTitle';\n\nexport type CardDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\n/** Supporting text inside a CardHeader. */\nconst CardDescription = React.forwardRef<HTMLParagraphElement, CardDescriptionProps>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n )\n);\nCardDescription.displayName = 'CardDescription';\n\nexport type CardContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Main content area of a Card. */\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-6 pt-0', className)} {...props} />\n )\n);\nCardContent.displayName = 'CardContent';\n\nexport type CardFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Footer section of a Card; typically contains actions. */\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn('flex items-center p-6 pt-0', className)} {...props} />\n )\n);\nCardFooter.displayName = 'CardFooter';\n\nexport { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\ntype AccordionContextValue = {\n openItems: Set<string>;\n toggle: (id: string) => void;\n /** Whether only one item may be open at a time. */\n collapsible: boolean;\n};\n\nconst AccordionContext = React.createContext<AccordionContextValue>({\n openItems: new Set(),\n toggle: () => {},\n collapsible: true,\n});\n\nexport type AccordionProps = {\n /** Controlled open item ids. */\n value?: string[];\n /** Initial open item ids when uncontrolled. */\n defaultValue?: string[];\n /** Called when the open set changes. */\n onValueChange?: (value: string[]) => void;\n /** When true (default), opening an item closes the others. */\n collapsible?: boolean;\n /** 'default' = bordered card with dividers; 'borderless' = plain stacked sections. */\n variant?: 'default' | 'borderless';\n /** Token gap ('lg') or exact pixels (16) between items. */\n gap?: GapValue;\n className?: string;\n style?: React.CSSProperties;\n children: React.ReactNode;\n};\n\n/**\n * Collapsible content sections with proper ARIA accordion semantics.\n * Each item's trigger announces its expanded state and controls its panel.\n */\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n (\n {\n value,\n defaultValue = [],\n onValueChange,\n collapsible = true,\n variant = 'default',\n gap,\n className,\n style,\n children,\n },\n ref\n ) => {\n const [internalOpen, setInternalOpen] = React.useState<string[]>(defaultValue);\n const current = value ?? internalOpen;\n\n const toggle = React.useCallback(\n (id: string) => {\n const next = current.includes(id)\n ? current.filter((item) => item !== id)\n : collapsible\n ? [id]\n : [...current, id];\n if (value === undefined) setInternalOpen(next);\n onValueChange?.(next);\n },\n [current, collapsible, value, onValueChange]\n );\n\n const gapResolved = resolveGap(gap);\n\n return (\n <div\n ref={ref}\n className={cn(\n // flex-col so token/px gaps apply (gap is a flex property);\n // divide-y rides along in the default variant.\n 'flex w-full flex-col',\n variant === 'default' && 'rounded-lg border border-border divide-y divide-border',\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n >\n <AccordionContext.Provider value={{ openItems: new Set(current), toggle, collapsible }}>\n {children}\n </AccordionContext.Provider>\n </div>\n );\n }\n);\nAccordion.displayName = 'Accordion';\n\nexport type AccordionItemProps = {\n /** Unique id linking the trigger to its panel. */\n id: string;\n className?: string;\n children: React.ReactNode;\n};\n\n/** A single collapsible section. */\nconst AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(\n ({ id, className, children }, ref) => (\n <div ref={ref} data-accordion-item={id} className={className}>\n <AccordionItemContext.Provider value={{ id }}>{children}</AccordionItemContext.Provider>\n </div>\n )\n);\nAccordionItem.displayName = 'AccordionItem';\n\nconst AccordionItemContext = React.createContext<{ id: string }>({ id: '' });\n\nexport type AccordionTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Replace the default chevron (rendered at the far right of the header). */\n icon?: React.ReactNode;\n};\n\n/** The clickable header that expands/collapses its panel. */\nconst AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n ({ className, children, icon, ...props }, ref) => {\n const { id } = React.useContext(AccordionItemContext);\n const { openItems, toggle } = React.useContext(AccordionContext);\n const open = openItems.has(id);\n const panelId = `${id}-panel`;\n const triggerId = `${id}-trigger`;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n id={triggerId}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => toggle(id)}\n className={cn(\n // w-full keeps the header clickable edge-to-edge in closed AND\n // open states; the icon slot sits at the far right via justify-between.\n 'flex w-full flex-1 items-center justify-between px-4 py-3 text-left text-sm font-medium transition-colors',\n 'hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n >\n {children}\n {icon ?? (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className={cn('h-4 w-4 shrink-0 transition-transform duration-200', open && 'rotate-180')}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )}\n </button>\n );\n }\n);\nAccordionTrigger.displayName = 'AccordionTrigger';\n\nexport type AccordionContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** The collapsible panel; hidden from assistive tech when collapsed. */\nconst AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n ({ className, children, ...props }, ref) => {\n const { id } = React.useContext(AccordionItemContext);\n const { openItems } = React.useContext(AccordionContext);\n const open = openItems.has(id);\n\n // Expansion animation via grid-template-rows (0fr -> 1fr): supported\n // in Chrome 117+/Firefox 66+/Safari 17+, and degrades to an instant\n // toggle elsewhere because the rows value simply stops interpolating.\n // The `hidden` attribute stays bound to `open` (synchronous) so panels\n // are removed from the a11y tree and tab order the moment they close.\n const [expanded, setExpanded] = React.useState(open);\n React.useEffect(() => {\n if (!open) {\n setExpanded(false);\n return;\n }\n const reduce =\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (reduce) {\n setExpanded(true);\n return;\n }\n let second = 0;\n const first = requestAnimationFrame(() => {\n second = requestAnimationFrame(() => setExpanded(true));\n });\n return () => {\n cancelAnimationFrame(first);\n cancelAnimationFrame(second);\n };\n }, [open]);\n\n return (\n <div\n ref={ref}\n id={`${id}-panel`}\n role=\"region\"\n aria-labelledby={`${id}-trigger`}\n hidden={!open}\n className={cn(\n // No display utility while closed: author styles would beat the\n // UA [hidden] rule and keep the collapsed panel visible.\n open &&\n cn(\n 'grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n ),\n !open && 'grid-rows-[0fr]',\n className\n )}\n {...props}\n >\n <div className=\"overflow-hidden\">\n <div className=\"px-4 pb-3 text-sm text-muted-foreground\">{children}</div>\n </div>\n </div>\n );\n }\n);\nAccordionContent.displayName = 'AccordionContent';\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type TableProps = React.HTMLAttributes<HTMLTableElement>;\n\n/** Semantic table wrapper with consistent borders and striping. */\nconst Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n )\n);\nTable.displayName = 'Table';\n\nexport type TableHeaderProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\n/** Groups the header row(s). */\nconst TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n )\n);\nTableHeader.displayName = 'TableHeader';\n\nexport type TableBodyProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\n/** Groups the body row(s). */\nconst TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n )\n);\nTableBody.displayName = 'TableBody';\n\nexport type TableFooterProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\n/** Groups the footer row(s) for summary content. */\nconst TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n )\n);\nTableFooter.displayName = 'TableFooter';\n\nexport type TableRowProps = React.HTMLAttributes<HTMLTableRowElement>;\n\n/** A table row. */\nconst TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b border-border transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className\n )}\n {...props}\n />\n )\n);\nTableRow.displayName = 'TableRow';\n\nexport type TableHeadProps = React.ThHTMLAttributes<HTMLTableCellElement>;\n\n/** A header cell. */\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n scope=\"col\"\n className={cn(\n 'h-10 px-3 text-left align-middle text-xs font-medium uppercase tracking-wider text-muted-foreground',\n className\n )}\n {...props}\n />\n )\n);\nTableHead.displayName = 'TableHead';\n\nexport type TableCellProps = React.TdHTMLAttributes<HTMLTableCellElement>;\n\n/** A data cell. */\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td ref={ref} className={cn('px-3 py-2 align-middle', className)} {...props} />\n )\n);\nTableCell.displayName = 'TableCell';\n\nexport type TableCaptionProps = React.HTMLAttributes<HTMLTableCaptionElement>;\n\n/** Accessible caption describing the table's contents. */\nconst TableCaption = React.forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n ({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-3 text-xs text-muted-foreground', className)} {...props} />\n )\n);\nTableCaption.displayName = 'TableCaption';\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n};\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Pagination } from '../pagination/Pagination';\nimport { Skeleton } from '../skeleton/Skeleton';\n\nexport type DataTableColumn<T> = {\n /** Unique column key; also the value passed to onSortChange when sortable. */\n key: string;\n /** Header cell content. */\n header: React.ReactNode;\n /**\n * Cell renderer. Defaults to reading `row[key]` (nullish values render\n * as an em dash).\n */\n cell?: (row: T, index: number) => React.ReactNode;\n /** Enables a sort toggle on this column's header. */\n sortable?: boolean;\n align?: 'left' | 'center' | 'right';\n /** Extra classes for the th/td cells (e.g. 'w-40', 'hidden sm:table-cell'). */\n className?: string;\n /** Per-cell click callback — the cell content renders as a button. */\n onClick?: (row: T) => void;\n};\n\nexport type SortIconState = 'none' | 'asc' | 'desc';\n\nexport type DataTableProps<T> = {\n /** Column configuration — everything about the table's shape. */\n columns: DataTableColumn<T>[];\n /** Row data. */\n data: T[];\n /** Stable id per row (React key + test hooks). */\n rowId: (row: T) => string;\n /** Accessible table caption (visible; pass captionHidden styling to hide). */\n caption?: string;\n /** Initial sort (uncontrolled). Omit for no initial sort. */\n defaultSort?: { key: string; dir: 'asc' | 'desc' } | null;\n /** Controlled sort. */\n sortKey?: string | null;\n sortDir?: 'asc' | 'desc';\n /**\n * Fires when the sort changes (controlled or not) — wire it to a server\n * query to sort at the database while DataTable renders aria-sort.\n */\n onSortChange?: (key: string, dir: 'asc' | 'desc') => void;\n /** Replace the default ▲/▼/↕ header glyphs. */\n renderSortIcon?: (state: SortIconState) => React.ReactNode;\n /** Rows per page; enables pagination when set. */\n pageSize?: number;\n /** Controlled page (1-based) when pageSize is set. */\n page?: number;\n /** Fires on page change (controlled or not). */\n onPageChange?: (page: number) => void;\n /** Click/keyboard activation on a row. */\n onRowClick?: (row: T) => void;\n /** Message shown when data is empty. */\n emptyMessage?: string;\n /** Pin the header while the body scrolls (needs a max-height on the wrapper via className). */\n stickyHeader?: boolean;\n /** Compact row density. */\n density?: 'default' | 'compact';\n /** Zebra-striped rows. */\n zebra?: boolean;\n /** Render skeleton placeholder rows (announced via aria-busy). */\n loading?: boolean;\n /**\n * Skeleton row count while loading (defaults to the page size, else 5).\n * Match it to your visible data length so rows don't jump when real\n * data replaces the placeholders.\n */\n loadingRows?: number;\n className?: string;\n};\n\ntype SortState = { key: string; dir: 'asc' | 'desc' } | null;\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n const an = a == null ? '' : String(a);\n const bn = b == null ? '' : String(b);\n return an.localeCompare(bn, undefined, { numeric: true, sensitivity: 'base' });\n}\n\n/**\n * Config-driven table: one component + a `columns` config that owns shape,\n * sorting, pagination, and row interaction. Built-in sorting toggles with\n * aria-sort, cursor pagination when `pageSize` is set, and a friendly empty\n * state — so most tables never need hand-rolled table code.\n */\nexport function DataTable<T>({\n columns,\n data,\n rowId,\n caption,\n defaultSort = null,\n sortKey,\n sortDir,\n onSortChange,\n renderSortIcon,\n pageSize,\n page,\n onPageChange,\n onRowClick,\n emptyMessage = 'No results.',\n stickyHeader,\n density = 'default',\n zebra,\n loading,\n loadingRows,\n className,\n}: DataTableProps<T>) {\n const [internalSort, setInternalSort] = React.useState<SortState>(defaultSort);\n const [internalPage, setInternalPage] = React.useState(1);\n\n const sort = React.useMemo<SortState>(() => {\n if (sortKey !== undefined) {\n return sortKey === null ? null : { key: sortKey, dir: sortDir ?? 'asc' };\n }\n return internalSort;\n }, [sortKey, sortDir, internalSort]);\n const currentPage = page ?? internalPage;\n\n const applySort = (key: string) => {\n const nextDir: 'asc' | 'desc' = sort?.key === key && sort.dir === 'asc' ? 'desc' : 'asc';\n if (sortKey === undefined) setInternalSort({ key, dir: nextDir });\n onSortChange?.(key, nextDir);\n if (pageSize && currentPage !== 1) setPage(1);\n };\n\n const setPage = (next: number) => {\n if (page === undefined) setInternalPage(next);\n onPageChange?.(next);\n };\n\n const sorted = React.useMemo(() => {\n if (!sort) return data;\n const column = columns.find((c) => c.key === sort.key);\n if (!column) return data;\n const read = (row: T): unknown =>\n column.cell ? undefined : (row as unknown as Record<string, unknown>)[column.key];\n // When a custom cell renders the value, fall back to the raw key access\n // for sorting — configs should keep row data addressable by column.key.\n const copy = [...data];\n copy.sort((a, b) => {\n const cmp = compareValues(\n (a as unknown as Record<string, unknown>)[column.key] ?? read(a),\n (b as unknown as Record<string, unknown>)[column.key] ?? read(b)\n );\n return sort.dir === 'asc' ? cmp : -cmp;\n });\n return copy;\n }, [data, sort, columns]);\n\n const pageCount = pageSize ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 0;\n const safePage = Math.min(currentPage, pageCount || 1);\n const visible = pageSize\n ? sorted.slice((safePage - 1) * pageSize, safePage * pageSize)\n : sorted;\n\n const cellValue = (row: T, column: DataTableColumn<T>, index: number): React.ReactNode => {\n if (column.cell) return column.cell(row, index);\n const raw = (row as unknown as Record<string, unknown>)[column.key];\n if (raw == null) return '—';\n if (typeof raw === 'string' || typeof raw === 'number') return raw;\n return String(raw);\n };\n\n const alignClass = (align?: DataTableColumn<T>['align']) =>\n align === 'right' ? 'text-right' : align === 'center' ? 'text-center' : 'text-left';\n\n return (\n <div className={cn('w-full space-y-3', className)}>\n <div className=\"w-full overflow-x-auto rounded-lg border border-border\">\n <table\n className={cn('w-full caption-bottom', density === 'compact' ? 'text-xs' : 'text-sm')}\n >\n {caption && <caption className=\"px-3 py-2 text-left text-xs text-muted-foreground\">{caption}</caption>}\n <thead className={cn('bg-muted/50', stickyHeader && 'sticky top-0 z-10 bg-background')}>\n <tr>\n {columns.map((column) => {\n const isSorted = sort?.key === column.key;\n const ariaSort = !column.sortable\n ? undefined\n : isSorted\n ? sort!.dir === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none';\n return (\n <th\n key={column.key}\n scope=\"col\"\n aria-sort={ariaSort}\n className={cn(\n 'border-b border-border px-3 py-2 font-medium',\n alignClass(column.align),\n column.className\n )}\n >\n {column.sortable ? (\n <button\n type=\"button\"\n onClick={() => applySort(column.key)}\n className=\"inline-flex items-center gap-1 rounded px-1 py-0.5 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {column.header}\n <span aria-hidden=\"true\" className=\"text-[10px] text-muted-foreground\">\n {renderSortIcon\n ? renderSortIcon(isSorted ? (sort!.dir === 'asc' ? 'asc' : 'desc') : 'none')\n : isSorted\n ? sort!.dir === 'asc'\n ? '▲'\n : '▼'\n : '↕'}\n </span>\n </button>\n ) : (\n column.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody aria-busy={loading || undefined}>\n {loading ? (\n Array.from(\n { length: (loadingRows ?? pageSize ?? Math.min(visible.length, 5)) || 5 },\n (_, skeletonRow) => (\n <tr key={`skeleton-${skeletonRow}`}>\n {columns.map((column) => (\n <td key={column.key} className={cn('px-3 py-2', density === 'compact' && 'px-2 py-1')}>\n {/* Height tracks density so skeleton rows match real row\n height and replacing them doesn't shift the table. */}\n <Skeleton className={density === 'compact' ? 'h-3 w-full' : 'h-4 w-full'} />\n </td>\n ))}\n </tr>\n )\n )\n ) : visible.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-3 py-8 text-center text-sm text-muted-foreground\"\n >\n {emptyMessage}\n </td>\n </tr>\n ) : (\n visible.map((row, index) => (\n <tr\n key={rowId(row)}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n onKeyDown={\n onRowClick\n ? (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onRowClick(row);\n }\n }\n : undefined\n }\n className={cn(\n 'border-b border-border last:border-0',\n zebra && '[&:nth-child(odd)]:bg-muted/30',\n onRowClick &&\n 'cursor-pointer transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring'\n )}\n >\n {columns.map((column) => (\n <td\n key={column.key}\n className={cn(\n 'align-middle',\n density === 'compact' ? 'px-2 py-1' : 'px-3 py-2',\n alignClass(column.align),\n column.className\n )}\n >\n {column.onClick ? (\n <button\n type=\"button\"\n onClick={() => column.onClick!(row)}\n className=\"block w-full rounded px-1.5 py-0.5 text-left transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {cellValue(row, column, index)}\n </button>\n ) : (\n cellValue(row, column, index)\n )}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n {pageSize && pageCount > 1 && (\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2\">\n <p\n className=\"min-h-8 leading-none text-xs text-muted-foreground\"\n aria-live=\"polite\"\n >\n {(safePage - 1) * pageSize + 1}–{Math.min(safePage * pageSize, sorted.length)} of{' '}\n {sorted.length}\n </p>\n <Pagination page={safePage} pageCount={pageCount} onPageChange={setPage} />\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type PaginationIcons = {\n /** Glyph/slot for the jump-to-first button. */\n first?: React.ReactNode;\n /** Glyph/slot for the previous-page button. */\n previous?: React.ReactNode;\n /** Glyph/slot for the next-page button. */\n next?: React.ReactNode;\n /** Glyph/slot for the jump-to-last button. */\n last?: React.ReactNode;\n};\n\nexport type PaginationProps = React.HTMLAttributes<HTMLElement> & {\n /** Current page number (1-based). Alias: currentPage. */\n page?: number;\n /** Total number of pages. Alias: totalPages (or derived from total/pageSize). */\n pageCount?: number;\n /** Alias for page (migration-friendly). */\n currentPage?: number;\n /** Alias for pageCount. */\n totalPages?: number;\n /** Rows per page — with `total`, enables the item-count summary. */\n pageSize?: number;\n /** Total item count — with `pageSize`, enables the summary and derives pageCount. */\n total?: number;\n /** Noun used in the summary (\"Showing 26–50 of 312 classes\"). Default \"items\". */\n itemLabel?: string;\n /** Force the summary on/off; defaults to on when total and pageSize are set. */\n showSummary?: boolean;\n /** Called with the new page number. */\n onPageChange?: (page: number) => void;\n /** How many page buttons to show around the current page (default 1). */\n siblings?: number;\n /** Show « / » jump-to-first/last buttons (default false). */\n showBoundaries?: boolean;\n /** Force-show the first-page button; defaults to showBoundaries. */\n showFirst?: boolean;\n /** Force-show the last-page button; defaults to showBoundaries. */\n showLast?: boolean;\n /** Replace the default ‹ › « » glyphs. */\n icons?: PaginationIcons;\n};\n\nconst controlClass =\n 'inline-flex h-8 items-center rounded-md border border-border px-2.5 text-sm transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50';\n\n/**\n * Numeric pagination with prev/next and optional boundary jumps. Renders\n * as a nav landmark with aria-current=\"page\" on the active button. Accepts\n * either page/pageCount or the currentPage/totalPages aliases, and can\n * derive the page count (plus a \"Showing X–Y of Z\" summary) from\n * total/pageSize.\n */\nconst Pagination = React.forwardRef<HTMLElement, PaginationProps>(\n (\n {\n page: pageProp,\n pageCount: pageCountProp,\n currentPage,\n totalPages,\n pageSize,\n total,\n itemLabel = 'items',\n showSummary,\n onPageChange,\n siblings = 1,\n showBoundaries = false,\n showFirst,\n showLast,\n icons,\n className,\n ...props\n },\n ref\n ) => {\n const page = pageProp ?? currentPage ?? 1;\n const derivedPageCount =\n total !== undefined && pageSize !== undefined && pageSize > 0 ? Math.ceil(total / pageSize) : undefined;\n const pageCount = Math.max(1, pageCountProp ?? totalPages ?? derivedPageCount ?? 1);\n\n // Build the page number list with ellipsis markers.\n const pages: (number | 'ellipsis')[] = [];\n const start = Math.max(2, page - siblings);\n const end = Math.min(pageCount - 1, page + siblings);\n\n pages.push(1);\n if (start > 2) pages.push('ellipsis');\n for (let i = start; i <= end; i++) pages.push(i);\n if (end < pageCount - 1) pages.push('ellipsis');\n if (pageCount > 1) pages.push(pageCount);\n\n const withFirst = showFirst ?? showBoundaries;\n const withLast = showLast ?? showBoundaries;\n\n const summaryEnabled = showSummary ?? (total !== undefined && pageSize !== undefined);\n const rangeStart = pageSize !== undefined ? (page - 1) * pageSize + 1 : undefined;\n const rangeEnd =\n pageSize !== undefined && total !== undefined ? Math.min(total, page * pageSize) : undefined;\n\n const nav = (\n <nav\n ref={ref}\n aria-label=\"Pagination\"\n className={cn('flex items-center justify-center gap-1', summaryEnabled ? undefined : className)}\n {...props}\n >\n {withFirst && (\n <button\n type=\"button\"\n onClick={() => onPageChange?.(1)}\n disabled={page <= 1}\n aria-label=\"First page\"\n className={controlClass}\n >\n {icons?.first ?? '«'}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => onPageChange?.(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n className={controlClass}\n >\n {icons?.previous ?? '‹'}\n </button>\n {pages.map((entry, index) =>\n entry === 'ellipsis' ? (\n <span\n key={`ellipsis-${index}`}\n aria-hidden=\"true\"\n className=\"px-2 text-sm text-muted-foreground\"\n >\n …\n </span>\n ) : (\n <button\n key={entry}\n type=\"button\"\n onClick={() => onPageChange?.(entry)}\n aria-current={entry === page ? 'page' : undefined}\n aria-label={`Page ${entry}`}\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded-md border text-sm transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n entry === page\n ? 'border-primary bg-primary text-primary-foreground font-medium'\n : 'border-border hover:bg-muted'\n )}\n >\n {entry}\n </button>\n )\n )}\n <button\n type=\"button\"\n onClick={() => onPageChange?.(page + 1)}\n disabled={page >= pageCount}\n aria-label=\"Next page\"\n className={controlClass}\n >\n {icons?.next ?? '›'}\n </button>\n {withLast && (\n <button\n type=\"button\"\n onClick={() => onPageChange?.(pageCount)}\n disabled={page >= pageCount}\n aria-label=\"Last page\"\n className={controlClass}\n >\n {icons?.last ?? '»'}\n </button>\n )}\n </nav>\n );\n\n if (!summaryEnabled) return nav;\n\n return (\n <div className={cn('flex flex-wrap items-center justify-between gap-3', className)}>\n <p className=\"text-sm text-muted-foreground\">\n {rangeStart !== undefined && rangeEnd !== undefined && total !== undefined\n ? `Showing ${rangeStart}–${rangeEnd} of ${total} ${itemLabel}`\n : `Page ${page} of ${pageCount}`}\n </p>\n {nav}\n </div>\n );\n }\n);\nPagination.displayName = 'Pagination';\n\nexport { Pagination };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type ListProps = React.HTMLAttributes<HTMLUListElement> & {\n /** Hairline dividers between rows. */\n divided?: boolean;\n /** Card-like surface and border around the list. */\n bordered?: boolean;\n /** Row density. */\n size?: 'default' | 'compact';\n};\n\n/**\n * Semantic list container for groups of related rows (settings, results,\n * nav items). Renders a real <ul> so screen readers announce item counts;\n * pair with ListItem rows.\n */\nconst List = React.forwardRef<HTMLUListElement, ListProps>(\n ({ divided, bordered, size = 'default', className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\n 'flex flex-col',\n bordered && 'overflow-hidden rounded-lg border border-border bg-card',\n divided && 'divide-y divide-border',\n size === 'compact' ? 'gap-0' : 'gap-0',\n className\n )}\n {...props}\n />\n )\n);\nList.displayName = 'List';\n\nexport type ListItemProps = React.LiHTMLAttributes<HTMLLIElement> & {\n /** Leading slot: icon, avatar, status dot, or checkbox. */\n leading?: React.ReactNode;\n /** Trailing slot: chevron, badge, meta, or action. */\n trailing?: React.ReactNode;\n /** Marks the row as the active/selected item. */\n selected?: boolean;\n /**\n * Makes the row pressable. The content renders inside a full-width\n * <button> so list semantics (ul > li) stay intact for assistive tech.\n */\n onClick?: () => void;\n /** Secondary line under the main content. */\n description?: string;\n /** Disables a pressable row. */\n disabled?: boolean;\n};\n\n/** A single row inside a List. */\nconst ListItem = React.forwardRef<HTMLLIElement, ListItemProps>(\n ({ leading, trailing, selected, onClick, description, disabled, className, children, ...props }, ref) => {\n const padding = 'px-3 py-2.5';\n const rowClass = cn(\n 'flex w-full items-center gap-3 text-left text-sm',\n selected && 'bg-accent text-accent-foreground',\n onClick && !disabled && 'hover:bg-muted/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n disabled && 'opacity-50',\n className\n );\n\n const body = (\n <>\n {leading && <span className=\"flex shrink-0 items-center\">{leading}</span>}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{children}</span>\n {description && (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">{description}</span>\n )}\n </span>\n {trailing && <span className=\"flex shrink-0 items-center text-xs text-muted-foreground\">{trailing}</span>}\n </>\n );\n\n return (\n <li ref={ref} {...props}>\n {onClick ? (\n <button type=\"button\" onClick={onClick} disabled={disabled} className={cn(padding, rowClass)}>\n {body}\n </button>\n ) : (\n <div className={cn(padding, rowClass)}>{body}</div>\n )}\n </li>\n );\n }\n);\nListItem.displayName = 'ListItem';\n\nexport { List, ListItem };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nconst sizeClasses = {\n xs: 'text-xs',\n sm: 'text-sm',\n base: 'text-base',\n lg: 'text-lg',\n xl: 'text-xl',\n} as const;\n\nconst weightClasses = {\n normal: 'font-normal',\n medium: 'font-medium',\n semibold: 'font-semibold',\n bold: 'font-bold',\n} as const;\n\nexport type TextProps = React.HTMLAttributes<HTMLElement> & {\n /** Render as an inline <span> instead of a block <p> (\"inline block\" variation). */\n inline?: boolean;\n /** Type scale (default 'base'). */\n size?: keyof typeof sizeClasses;\n /** Font weight (default 'normal'). */\n weight?: keyof typeof weightClasses;\n /** Use the muted-foreground token instead of the primary text color. */\n muted?: boolean;\n};\n\n/**\n * Semantic paragraph text with a controlled type scale. Renders a real\n * <p> for document structure (or <span> with inline) — never a styled\n * div — so copy, screen readers, and reader-mode all treat it as text.\n */\nconst Text = React.forwardRef<HTMLElement, TextProps>(\n ({ inline, size = 'base', weight, muted, className, ...props }, ref) => {\n const Tag = (inline ? 'span' : 'p') as 'span' | 'p';\n return (\n <Tag\n ref={ref as React.Ref<HTMLParagraphElement>}\n className={cn(\n sizeClasses[size],\n weight && weightClasses[weight],\n muted && 'text-muted-foreground',\n inline ? 'inline' : 'block',\n className\n )}\n {...props}\n />\n );\n }\n);\nText.displayName = 'Text';\n\nexport { Text };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nconst levelClasses: Record<HeadingLevel, string> = {\n 1: 'text-4xl',\n 2: 'text-3xl',\n 3: 'text-2xl',\n 4: 'text-xl',\n 5: 'text-lg',\n 6: 'text-base',\n};\n\nconst sizeClasses = {\n sm: 'text-lg',\n md: 'text-xl',\n lg: 'text-2xl',\n xl: 'text-3xl',\n '2xl': 'text-4xl',\n '3xl': 'text-5xl',\n} as const;\n\nexport type HeadingProps = React.HTMLAttributes<HTMLHeadingElement> & {\n /** Semantic level — renders the matching h1..h6 element. */\n level: HeadingLevel;\n /** Visual size override, independent of the semantic level. */\n size?: keyof typeof sizeClasses;\n /** Use the muted-foreground token instead of the primary text color. */\n muted?: boolean;\n};\n\n/**\n * Semantic heading with a safe default scale. Keep `level` correct for\n * document outline (h1 once per page, no skipped levels) and use `size`\n * when the visual weight must differ from the structural level.\n */\nconst Heading = React.forwardRef<HTMLHeadingElement, HeadingProps>(\n ({ level, size, muted, className, ...props }, ref) => {\n const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n return (\n <Tag\n ref={ref}\n className={cn(\n 'font-semibold tracking-tight',\n size ? sizeClasses[size] : levelClasses[level],\n muted && 'text-muted-foreground',\n className\n )}\n {...props}\n />\n );\n }\n);\nHeading.displayName = 'Heading';\n\nexport { Heading };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type EmptyStateProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Icon or illustration shown above the title. */\n icon?: React.ReactNode;\n title: string;\n description?: string;\n /** Primary action (button/link). */\n action?: React.ReactNode;\n /** Secondary action shown beside the primary one. */\n secondaryAction?: React.ReactNode;\n /** Compact padding for use inside panels and table bodies. */\n size?: 'sm' | 'md';\n};\n\n/**\n * Placeholder for empty collections, zero-result searches and unconfigured\n * features. Keeps the title/description/action hierarchy consistent across\n * the product.\n */\nexport const EmptyState = React.forwardRef<HTMLDivElement, EmptyStateProps>(function EmptyState(\n { icon, title, description, action, secondaryAction, size = 'md', className, children, ...props },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col items-center justify-center rounded-lg border border-dashed border-border text-center',\n size === 'md' ? 'gap-3 px-6 py-12' : 'gap-2 px-4 py-6',\n className\n )}\n {...props}\n >\n {icon && <div className=\"text-muted-foreground [&_svg]:size-8\">{icon}</div>}\n <p className={cn('font-semibold', size === 'md' ? 'text-base' : 'text-sm')}>{title}</p>\n {description && <p className=\"max-w-sm text-sm text-muted-foreground\">{description}</p>}\n {children}\n {(action || secondaryAction) && (\n <div className=\"mt-1 flex flex-wrap items-center justify-center gap-2\">\n {action}\n {secondaryAction}\n </div>\n )}\n </div>\n );\n});\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type PageHeaderProps = React.HTMLAttributes<HTMLDivElement> & {\n title: string;\n description?: string;\n /** Breadcrumbs/eyebrow above the title. */\n breadcrumbs?: React.ReactNode;\n /** Right-aligned actions (buttons, menus). */\n actions?: React.ReactNode;\n /** Small slot under the title row (tabs, filters). */\n children?: React.ReactNode;\n};\n\n/**\n * Standard page heading block: optional breadcrumbs, title, description and\n * a right-aligned action cluster. Pages stop inventing their own spacing\n * and heading hierarchy.\n */\nexport const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(function PageHeader(\n { title, description, breadcrumbs, actions, className, children, ...props },\n ref\n) {\n return (\n <div ref={ref} className={cn('flex flex-col gap-2', className)} {...props}>\n {breadcrumbs && <div className=\"text-sm text-muted-foreground\">{breadcrumbs}</div>}\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1>\n {description && <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n {children && <div className=\"mt-2\">{children}</div>}\n </div>\n );\n});\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type MetricTrend = 'up' | 'down' | 'flat';\n\nexport type MetricCardProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> & {\n label: string;\n value: string | number;\n /** Secondary line under the value. */\n hint?: string;\n /** Signed change, e.g. \"+12.4%\" or \"-3\". */\n delta?: string;\n /** Direction colors the delta (green up / red down / muted flat). */\n trend?: MetricTrend;\n icon?: React.ReactNode;\n};\n\nconst trendClasses: Record<MetricTrend, string> = {\n up: 'text-success',\n down: 'text-destructive',\n flat: 'text-muted-foreground',\n};\n\nconst trendGlyph: Record<MetricTrend, string> = { up: '↑', down: '↓', flat: '→' };\n\n/**\n * Compact KPI tile: label, value, optional delta with direction color and a\n * supporting hint. Deltas always carry an arrow glyph so the direction is\n * never communicated by color alone.\n */\nexport const MetricCard = React.forwardRef<HTMLDivElement, MetricCardProps>(function MetricCard(\n { label, value, hint, delta, trend = 'flat', icon, className, ...props },\n ref\n) {\n return (\n <div ref={ref} className={cn('rounded-xl border border-border bg-card p-5', className)} {...props}>\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-sm text-muted-foreground\">{label}</p>\n {icon && <span className=\"text-muted-foreground [&_svg]:size-4\">{icon}</span>}\n </div>\n <p className=\"mt-2 text-2xl font-semibold tabular-nums\">{value}</p>\n {(delta || hint) && (\n <p className=\"mt-1 flex items-center gap-2 text-sm\">\n {delta && (\n <span className={cn('font-medium tabular-nums', trendClasses[trend])}>\n <span aria-hidden=\"true\">{trendGlyph[trend]}</span> {delta}\n </span>\n )}\n {hint && <span className=\"text-muted-foreground\">{hint}</span>}\n </p>\n )}\n </div>\n );\n});\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../button/Button';\nimport { Input, type InputProps } from '../input/Input';\n\nexport type PasswordInputProps = Omit<InputProps, 'type'> & {\n /** Accessible labels for the visibility toggle. */\n showLabel?: string;\n hideLabel?: string;\n};\n\n/**\n * Password field with a show/hide toggle. The toggle is a real button with\n * pressed state, so keyboard and screen-reader users can reveal the value\n * without losing the focused field.\n */\nexport const PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(function PasswordInput(\n { className, showLabel = 'Show password', hideLabel = 'Hide password', ...props },\n ref\n) {\n const [visible, setVisible] = React.useState(false);\n\n return (\n <div className={cn('relative flex items-center', className)}>\n <Input ref={ref} type={visible ? 'text' : 'password'} className=\"pr-24\" {...props} />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-pressed={visible}\n aria-label={visible ? hideLabel : showLabel}\n onClick={() => setVisible((current) => !current)}\n className=\"absolute right-1 h-8 px-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n {visible ? 'Hide' : 'Show'}\n </Button>\n </div>\n );\n});\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type AuthLayoutProps = React.HTMLAttributes<HTMLDivElement> & {\n title: string;\n description?: string;\n /** Brand/mark above the card. */\n brand?: React.ReactNode;\n /** Links or legal copy under the card. */\n footer?: React.ReactNode;\n /** Rendered inside the card under the heading. */\n children?: React.ReactNode;\n /** Card width preset (default 'md'). */\n size?: 'sm' | 'md' | 'lg';\n};\n\nconst sizeClasses: Record<NonNullable<AuthLayoutProps['size']>, string> = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n};\n\n/**\n * Centered auth surface: brand mark, title/description, the form card and a\n * footer slot. Keeps sign-in, sign-up, reset and verify screens visually\n * identical without each page re-deriving the layout.\n */\nexport const AuthLayout = React.forwardRef<HTMLDivElement, AuthLayoutProps>(function AuthLayout(\n { title, description, brand, footer, children, size = 'md', className, ...props },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cn('flex min-h-screen flex-col items-center justify-center bg-muted/30 px-4 py-12', className)}\n {...props}\n >\n {brand && <div className=\"mb-6\">{brand}</div>}\n <div className={cn('w-full rounded-xl border border-border bg-card p-6 shadow-sm sm:p-8', sizeClasses[size])}>\n <h1 className=\"text-xl font-semibold tracking-tight\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n <div className=\"mt-6\">{children}</div>\n </div>\n {footer && <div className=\"mt-6 text-center text-sm text-muted-foreground\">{footer}</div>}\n </div>\n );\n});\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../button/Button';\nimport { Input } from '../input/Input';\n\nexport type FilterBarProps = React.HTMLAttributes<HTMLDivElement> & {\n /** Controlled search text. */\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n /** Search placeholder; the search box is hidden when omitted. */\n searchPlaceholder?: string;\n /** Rendered after the search box — selects, toggles, date pickers. */\n children?: React.ReactNode;\n /** Shows a reset button when provided (pass the active filter count for the label). */\n onReset?: () => void;\n activeCount?: number;\n /** Rendered at the far right (bulk actions, column settings). */\n trailing?: React.ReactNode;\n};\n\n/**\n * Horizontal filter strip for list pages: search field, filter controls and\n * a reset affordance. Scrolls horizontally on narrow screens instead of\n * wrapping into a tall stack.\n */\nexport const FilterBar = React.forwardRef<HTMLDivElement, FilterBarProps>(function FilterBar(\n {\n searchValue,\n onSearchChange,\n searchPlaceholder = 'Search…',\n onReset,\n activeCount = 0,\n trailing,\n className,\n children,\n ...props\n },\n ref\n) {\n return (\n <div\n ref={ref}\n role=\"search\"\n className={cn(\n 'flex flex-wrap items-center gap-2 rounded-lg border border-border bg-card p-2',\n className\n )}\n {...props}\n >\n {onSearchChange !== undefined && (\n <Input\n type=\"search\"\n value={searchValue}\n onChange={(event) => onSearchChange(event.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className=\"h-9 w-full min-w-40 flex-1 sm:w-auto\"\n />\n )}\n <div className=\"flex flex-wrap items-center gap-2\">{children}</div>\n {onReset && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onReset}>\n Reset{activeCount > 0 ? ` (${activeCount})` : ''}\n </Button>\n )}\n {trailing && <div className=\"ml-auto flex items-center gap-2\">{trailing}</div>}\n </div>\n );\n});\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Input, type InputProps } from '../input/Input';\n\nexport type DatePickerProps = Omit<InputProps, 'type' | 'onChange' | 'value' | 'defaultValue'> & {\n /** ISO date string (YYYY-MM-DD) — controlled. */\n value?: string;\n /** ISO date string — initial value when uncontrolled. */\n defaultValue?: string;\n /** Fired with the ISO string ('' when cleared). */\n onValueChange?: (value: string) => void;\n /** Show a clear button once a date is selected. */\n clearable?: boolean;\n};\n\n/**\n * Native date field with an ISO-string contract. Uses the platform picker\n * (mobile date wheels, keyboard editing, locale formatting) rather than a\n * custom calendar, so accessibility and input methods come for free.\n */\nexport const DatePicker = React.forwardRef<HTMLInputElement, DatePickerProps>(function DatePicker(\n { value, defaultValue, onValueChange, clearable = false, className, ...props },\n ref\n) {\n const [internal, setInternal] = React.useState(defaultValue ?? '');\n const current = value ?? internal;\n\n const commit = (next: string) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n return (\n <div className={cn('relative flex items-center', className)}>\n <Input\n ref={ref}\n type=\"date\"\n value={current}\n onChange={(event) => commit(event.target.value)}\n className={clearable && current ? 'pr-9' : undefined}\n {...props}\n />\n {clearable && current && (\n <button\n type=\"button\"\n onClick={() => commit('')}\n aria-label=\"Clear date\"\n className=\"absolute right-2 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n )}\n </div>\n );\n});\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Input, type InputProps } from '../input/Input';\n\nexport type TimePickerProps = Omit<InputProps, 'type' | 'onChange' | 'value' | 'defaultValue'> & {\n /** \"HH:MM\" (24h) — controlled. */\n value?: string;\n /** \"HH:MM\" — initial value when uncontrolled. */\n defaultValue?: string;\n /** Fired with the time string ('' when cleared). */\n onValueChange?: (value: string) => void;\n /** Show a clear button once a time is selected. */\n clearable?: boolean;\n};\n\n/**\n * Native time field with an \"HH:MM\" contract. The platform supplies the\n * picker, keyboard editing and locale behavior.\n */\nexport const TimePicker = React.forwardRef<HTMLInputElement, TimePickerProps>(function TimePicker(\n { value, defaultValue, onValueChange, clearable = false, className, ...props },\n ref\n) {\n const [internal, setInternal] = React.useState(defaultValue ?? '');\n const current = value ?? internal;\n\n const commit = (next: string) => {\n if (value === undefined) setInternal(next);\n onValueChange?.(next);\n };\n\n return (\n <div className={cn('relative flex items-center', className)}>\n <Input\n ref={ref}\n type=\"time\"\n value={current}\n onChange={(event) => commit(event.target.value)}\n className={clearable && current ? 'pr-9' : undefined}\n {...props}\n />\n {clearable && current && (\n <button\n type=\"button\"\n onClick={() => commit('')}\n aria-label=\"Clear time\"\n className=\"absolute right-2 rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n )}\n </div>\n );\n});\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type StepperStep = {\n label: string;\n description?: string;\n};\n\nexport type StepperProps = Omit<React.OlHTMLAttributes<HTMLOListElement>, 'onClick'> & {\n steps: StepperStep[];\n /** Zero-based index of the active step. */\n current: number;\n orientation?: 'horizontal' | 'vertical';\n /** Makes completed/upcoming steps clickable. */\n onStepClick?: (index: number) => void;\n};\n\n/**\n * Progress through a multi-step flow with proper semantics: an ordered list\n * where the active step carries aria-current=\"step\" and each marker states\n * complete/current/upcoming in text, not only color.\n */\nexport const Stepper = React.forwardRef<HTMLOListElement, StepperProps>(function Stepper(\n { steps, current, orientation = 'horizontal', onStepClick, className, ...props },\n ref\n) {\n return (\n <ol\n ref={ref}\n className={cn(\n 'flex gap-4',\n orientation === 'vertical' ? 'flex-col' : 'flex-wrap items-start',\n className\n )}\n {...props}\n >\n {steps.map((step, index) => {\n const state = index < current ? 'complete' : index === current ? 'current' : 'upcoming';\n const interactive = Boolean(onStepClick);\n const content = (\n <>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full border text-xs font-medium',\n state === 'complete' && 'border-primary bg-primary text-primary-foreground',\n state === 'current' && 'border-primary text-primary',\n state === 'upcoming' && 'border-border text-muted-foreground'\n )}\n >\n {state === 'complete' ? '✓' : index + 1}\n </span>\n <span className=\"min-w-0\">\n <span className={cn('block text-sm', state === 'upcoming' ? 'text-muted-foreground' : 'font-medium')}>\n {step.label}\n </span>\n {step.description && (\n <span className=\"block text-xs text-muted-foreground\">{step.description}</span>\n )}\n <span className=\"sr-only\">\n {state === 'complete' ? ' (completed)' : state === 'current' ? ' (current step)' : ' (upcoming)'}\n </span>\n </span>\n </>\n );\n\n return (\n <li key={step.label} className=\"flex min-w-0 items-start gap-2\">\n {interactive ? (\n <button\n type=\"button\"\n onClick={() => onStepClick?.(index)}\n aria-current={state === 'current' ? 'step' : undefined}\n className=\"flex items-start gap-2 rounded-md text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {content}\n </button>\n ) : (\n <div aria-current={state === 'current' ? 'step' : undefined} className=\"flex items-start gap-2\">\n {content}\n </div>\n )}\n {orientation === 'horizontal' && index < steps.length - 1 && (\n <span aria-hidden=\"true\" className=\"mt-3.5 hidden h-px w-8 bg-border sm:block\" />\n )}\n </li>\n );\n })}\n </ol>\n );\n});\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type FileUploadProps = Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type' | 'value' | 'onChange'> & {\n /** Controlled selection. */\n files?: File[];\n /** Initial selection when uncontrolled. */\n defaultFiles?: File[];\n /** Fired whenever the list changes (add, remove, drop, clear). */\n onFilesChange?: (files: File[]) => void;\n /** Drag-and-drop area copy. */\n label?: string;\n hint?: string;\n /** Per-file progress (0-100) keyed by file name, rendered as a bar. */\n progress?: Record<string, number>;\n};\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Drag-and-drop file picker with a removable list. The native input drives\n * selection (keyboard + mobile camera/file dialogs); the drop zone is a\n * progressive enhancement. Files are plain `File` objects, so you own the\n * upload transport and can render progress per file.\n */\nexport const FileUpload = React.forwardRef<HTMLInputElement, FileUploadProps>(function FileUpload(\n {\n files,\n defaultFiles,\n onFilesChange,\n label = 'Drop files here or click to browse',\n hint,\n progress,\n multiple = true,\n accept,\n disabled,\n className,\n id,\n ...props\n },\n ref\n) {\n const [internal, setInternal] = React.useState<File[]>(defaultFiles ?? []);\n const [dragging, setDragging] = React.useState(false);\n const current = files ?? internal;\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n\n const commit = (next: File[]) => {\n if (files === undefined) setInternal(next);\n onFilesChange?.(next);\n };\n\n const add = (incoming: FileList | null) => {\n if (!incoming || incoming.length === 0) return;\n const list = Array.from(incoming);\n commit(multiple ? [...current, ...list] : list.slice(0, 1));\n };\n\n return (\n <div className={cn('flex flex-col gap-3', className)}>\n <div\n onDragOver={(event) => {\n if (disabled) return;\n event.preventDefault();\n setDragging(true);\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(event) => {\n if (disabled) return;\n event.preventDefault();\n setDragging(false);\n add(event.dataTransfer.files);\n }}\n className={cn(\n 'rounded-lg border border-dashed border-border p-6 text-center transition-colors',\n dragging && 'border-primary bg-primary/5',\n disabled && 'opacity-50'\n )}\n >\n <label htmlFor={inputId} className={cn('block text-sm', disabled ? 'cursor-not-allowed' : 'cursor-pointer')}>\n {label}\n <input\n ref={ref}\n id={inputId}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n className=\"sr-only\"\n onChange={(event) => {\n add(event.target.files);\n event.target.value = '';\n }}\n {...props}\n />\n </label>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {hint ?? (accept ? `Accepted: ${accept}` : 'Any file type')}\n </p>\n </div>\n\n {current.length > 0 && (\n <ul aria-label=\"Selected files\" className=\"space-y-2\">\n {current.map((file) => (\n <li key={file.name} className=\"flex items-center justify-between gap-3 rounded-md border border-border px-3 py-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm\">{file.name}</p>\n <p className=\"text-xs text-muted-foreground\">{formatSize(file.size)}</p>\n {progress?.[file.name] !== undefined && (\n <div\n role=\"progressbar\"\n aria-valuenow={progress[file.name]}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Uploading ${file.name}`}\n className=\"mt-1 h-1.5 w-40 overflow-hidden rounded-full bg-muted\"\n >\n <div className=\"h-full bg-primary\" style={{ width: `${progress[file.name]}%` }} />\n </div>\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => commit(current.filter((entry) => entry.name !== file.name))}\n aria-label={`Remove ${file.name}`}\n className=\"rounded p-1 text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n ✕\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n});\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type TimelineItem = {\n title: string;\n /** Period/date label (e.g. \"2023 — Present\"). */\n period?: string;\n description?: string;\n icon?: React.ReactNode;\n /** Muted items render dimmed (upcoming/archived). */\n muted?: boolean;\n};\n\nexport type TimelineProps = Omit<React.OlHTMLAttributes<HTMLOListElement>, 'children'> & {\n items: TimelineItem[];\n};\n\n/**\n * Vertical chronology (experience, activity, audit trail). Renders an\n * ordered list with a connector rule, so the sequence is conveyed\n * structurally instead of by decoration alone.\n */\nexport const Timeline = React.forwardRef<HTMLOListElement, TimelineProps>(function Timeline(\n { items, className, ...props },\n ref\n) {\n return (\n <ol ref={ref} className={cn('relative flex flex-col gap-6', className)} {...props}>\n {items.map((item, index) => (\n <li key={`${item.title}-${index}`} className=\"relative flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <span\n aria-hidden=\"true\"\n className={cn(\n 'mt-1 flex h-3 w-3 shrink-0 items-center justify-center rounded-full border-2',\n item.muted ? 'border-border bg-background' : 'border-primary bg-primary'\n )}\n />\n {index < items.length - 1 && <span aria-hidden=\"true\" className=\"mt-1 w-px flex-1 bg-border\" />}\n </div>\n <div className={cn('min-w-0 pb-1', item.muted && 'opacity-60')}>\n {item.period && (\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">{item.period}</p>\n )}\n <p className=\"text-sm font-semibold\">{item.title}</p>\n {item.description && <p className=\"mt-1 text-sm text-muted-foreground\">{item.description}</p>}\n {item.icon && <div className=\"mt-1 text-muted-foreground [&_svg]:size-4\">{item.icon}</div>}\n </div>\n </li>\n ))}\n </ol>\n );\n});\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type BlockElement =\n | 'div'\n | 'span'\n | 'section'\n | 'article'\n | 'figure'\n | 'header'\n | 'footer'\n | 'nav'\n | 'main'\n | 'aside';\n\nexport type BlockProps = React.HTMLAttributes<HTMLElement> & {\n /** Semantic element to render (default 'div'). */\n as?: BlockElement;\n /** Shorthand for as=\"span\" — inline flow instead of a block box. */\n inline?: boolean;\n /** Use the muted-foreground token for the block's text. */\n muted?: boolean;\n};\n\n/**\n * Semantic container div — the structural counterpart to Text (p). Pick the\n * element that matches the content's meaning (section/article/figure…) and\n * use `inline` for span-level flow. No default styling beyond layout-safe\n * color tokens, so it composes with any Tailwind utilities.\n */\nconst Block = React.forwardRef<HTMLElement, BlockProps>(\n ({ as = 'div', inline, muted, className, ...props }, ref) => {\n const Tag = (inline ? 'span' : as) as BlockElement;\n return (\n <Tag\n ref={ref as never}\n className={cn(muted && 'text-muted-foreground', inline && 'inline', className)}\n {...props}\n />\n );\n }\n);\nBlock.displayName = 'Block';\n\nexport { Block };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\nexport type FlexProps = React.HTMLAttributes<HTMLElement> & {\n /** Main axis direction. */\n direction?: 'row' | 'column';\n /** Cross-axis alignment (align-items). */\n align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';\n /** Main-axis distribution (justify-content). */\n justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n /** Allow items to wrap onto multiple lines. */\n wrap?: boolean;\n /** Token gap ('md') or exact pixels (16) between children. */\n gap?: GapValue;\n /** Semantic element (default 'div'; 'span' keeps inline flow). */\n as?: 'div' | 'span' | 'section' | 'article' | 'nav' | 'header' | 'footer';\n};\n\nconst justifyClasses = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n} as const;\n\nconst alignClasses = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n} as const;\n\n/**\n * Layout flex container — a typed, discoverable wrapper around\n * `display: flex` with token gaps. Children are plain elements; use\n * FlexItem for per-child grow/shrink/basis overrides.\n */\nconst Flex = React.forwardRef<HTMLElement, FlexProps>(\n (\n { direction = 'row', align, justify, wrap, gap = 'md', as = 'div', className, style, ...props },\n ref\n ) => {\n const Tag = as as 'div' | 'span' | 'section' | 'article' | 'nav' | 'header' | 'footer';\n const gapResolved = resolveGap(gap);\n return (\n <Tag\n ref={ref as never}\n className={cn(\n 'flex min-w-0',\n direction === 'column' ? 'flex-col' : 'flex-row',\n wrap && 'flex-wrap',\n align && alignClasses[align],\n justify && justifyClasses[justify],\n gapResolved.className,\n className\n )}\n style={{ ...gapResolved.style, ...style }}\n {...props}\n />\n );\n }\n);\nFlex.displayName = 'Flex';\n\nexport type FlexItemProps = React.HTMLAttributes<HTMLElement> & {\n /** flex-grow — number or CSS-ish string (e.g. '1', '2'). */\n grow?: boolean | string;\n /** flex-shrink — number or CSS-ish string (e.g. '0'). */\n shrink?: boolean | string;\n /** flex-basis (e.g. '0', '200px', 'auto'). */\n basis?: string;\n /** Cross-axis alignment for this item (align-self). */\n align?: 'start' | 'center' | 'end' | 'stretch' | 'baseline';\n /** Semantic element (default 'div'). */\n as?: 'div' | 'span' | 'li' | 'figure';\n};\n\nconst selfAlignClasses = {\n start: 'self-start',\n center: 'self-center',\n end: 'self-end',\n stretch: 'self-stretch',\n baseline: 'self-baseline',\n} as const;\n\n/** Per-child flex controls for a Flex container. */\nconst FlexItem = React.forwardRef<HTMLElement, FlexItemProps>(\n ({ grow, shrink, basis, align, as = 'div', className, ...props }, ref) => {\n const Tag = as as 'div' | 'span' | 'li' | 'figure';\n // Numeric/arb flex values go through style — Tailwind cannot compile\n // runtime-built arbitrary classes (grow-[${grow}]) they would be purged.\n const style: React.CSSProperties = {\n ...(grow === true ? { flexGrow: 1 } : typeof grow === 'string' && grow ? { flexGrow: grow } : {}),\n ...(shrink === false ? { flexShrink: 0 } : typeof shrink === 'string' && shrink ? { flexShrink: Number(shrink) || shrink } : {}),\n ...(basis ? { flexBasis: basis } : {}),\n };\n return (\n <Tag\n ref={ref as never}\n className={cn(align && selfAlignClasses[align], className)}\n style={Object.keys(style).length > 0 ? style : undefined}\n {...props}\n />\n );\n }\n);\nFlexItem.displayName = 'FlexItem';\n\nexport { Flex, FlexItem };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { resolveGap, type GapValue } from '../../utils/gap';\n\n// Literal class maps — Tailwind's scanner only keeps classes it can see in\n// source, so every col-span/columns combination must appear verbatim here.\nconst BASE_COLS: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n 5: 'grid-cols-5',\n 6: 'grid-cols-6',\n};\nconst SM_COLS: Record<number, string> = {\n 1: 'sm:grid-cols-1',\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-3',\n 4: 'sm:grid-cols-4',\n 5: 'sm:grid-cols-5',\n 6: 'sm:grid-cols-6',\n};\nconst MD_COLS: Record<number, string> = {\n 1: 'md:grid-cols-1',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-4',\n 5: 'md:grid-cols-5',\n 6: 'md:grid-cols-6',\n};\nconst LG_COLS: Record<number, string> = {\n 1: 'lg:grid-cols-1',\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n 5: 'lg:grid-cols-5',\n 6: 'lg:grid-cols-6',\n};\nconst COL_SPAN: Record<number, string> = {\n 1: 'col-span-1',\n 2: 'col-span-2',\n 3: 'col-span-3',\n 4: 'col-span-4',\n 5: 'col-span-5',\n 6: 'col-span-6',\n};\nconst SM_COL_SPAN: Record<number, string> = {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n};\nconst MD_COL_SPAN: Record<number, string> = {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n};\nconst LG_COL_SPAN: Record<number, string> = {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n 5: 'lg:col-span-5',\n 6: 'lg:col-span-6',\n};\n\nexport type GridProps = React.HTMLAttributes<HTMLElement> & {\n /** Base column count (1-6). */\n cols?: number;\n /** Columns from the sm breakpoint up (1-6). */\n smCols?: number;\n /** Columns from the md breakpoint up (1-6). */\n mdCols?: number;\n /** Columns from the lg breakpoint up (1-6). */\n lgCols?: number;\n /**\n * Auto-fit mode: repeat(auto-fit, minmax(<minCol>, 1fr)) — cards wrap\n * responsively without per-breakpoint column math. Overrides cols*.\n */\n minCol?: string;\n /** Token gap ('md') or exact pixels (16) between cells. */\n gap?: GapValue;\n /** Semantic element (default 'div'). */\n as?: 'div' | 'span' | 'section' | 'ul';\n};\n\n/**\n * Layout grid container with typed column counts (literal Tailwind classes,\n * so utilities survive CSS purging) and an auto-fit min-column mode for\n * card grids. Pair with GridItem for per-cell spans.\n */\nconst Grid = React.forwardRef<HTMLElement, GridProps>(\n ({ cols, smCols, mdCols, lgCols, minCol, gap = 'md', as = 'div', className, style, ...props }, ref) => {\n const Tag = as as 'div' | 'span' | 'section' | 'ul';\n const gapResolved = resolveGap(gap);\n return (\n <Tag\n ref={ref as never}\n className={cn(\n 'grid min-w-0',\n !minCol && cols && BASE_COLS[cols],\n !minCol && smCols && SM_COLS[smCols],\n !minCol && mdCols && MD_COLS[mdCols],\n !minCol && lgCols && LG_COLS[lgCols],\n gapResolved.className,\n className\n )}\n style={{\n ...(minCol ? { gridTemplateColumns: `repeat(auto-fit, minmax(${minCol}, 1fr))` } : {}),\n ...gapResolved.style,\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nGrid.displayName = 'Grid';\n\nexport type GridItemProps = React.HTMLAttributes<HTMLElement> & {\n /** Column span at the base breakpoint (1-6). */\n span?: number;\n /** Column span from the sm breakpoint up (1-6). */\n smSpan?: number;\n /** Column span from the md breakpoint up (1-6). */\n mdSpan?: number;\n /** Column span from the lg breakpoint up (1-6). */\n lgSpan?: number;\n /** Semantic element (default 'div'; 'li' pairs with as=\"ul\" on Grid). */\n as?: 'div' | 'span' | 'li';\n};\n\n/** Per-cell column spans for a Grid container. */\nconst GridItem = React.forwardRef<HTMLElement, GridItemProps>(\n ({ span, smSpan, mdSpan, lgSpan, as = 'div', className, ...props }, ref) => {\n const Tag = as as 'div' | 'span' | 'li';\n return (\n <Tag\n ref={ref as never}\n className={cn(\n span && COL_SPAN[span],\n smSpan && SM_COL_SPAN[smSpan],\n mdSpan && MD_COL_SPAN[mdSpan],\n lgSpan && LG_COL_SPAN[lgSpan],\n className\n )}\n {...props}\n />\n );\n }\n);\nGridItem.displayName = 'GridItem';\n\nexport { Grid, GridItem };\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '../../utils/cn';\n\ntype MenuContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n activeIndex: number;\n setActiveIndex: (index: number) => void;\n /** The relative wrapper the menu is anchored to (measured for portal positioning). */\n wrapperRef: React.MutableRefObject<HTMLDivElement | null>;\n};\n\nconst MenuContext = React.createContext<MenuContextValue>({\n open: false,\n setOpen: () => {},\n activeIndex: -1,\n setActiveIndex: () => {},\n wrapperRef: { current: null },\n});\n\nexport type MenuProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Called when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Dropdown menu with keyboard navigation (arrows, Home/End, Escape),\n * typeahead, and proper ARIA menu semantics. Items are rendered in a\n * floating panel anchored to the trigger.\n */\nconst Menu = React.forwardRef<HTMLDivElement, MenuProps>(\n ({ open, onOpenChange, className, children }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState(-1);\n const current = open ?? internalOpen;\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n const setRefs = React.useCallback(\n (node: HTMLDivElement | null) => {\n wrapperRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref]\n );\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (open === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n if (!next) setActiveIndex(-1);\n },\n [open, onOpenChange]\n );\n\n return (\n <div ref={setRefs} className={cn('relative inline-block', className)}>\n <MenuContext.Provider\n value={{ open: current, setOpen, activeIndex, setActiveIndex, wrapperRef }}\n >\n {children}\n </MenuContext.Provider>\n </div>\n );\n }\n);\nMenu.displayName = 'Menu';\n\nexport type MenuTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/** The button that opens the menu. */\nconst MenuTrigger = React.forwardRef<HTMLButtonElement, MenuTriggerProps>(\n ({ className, children, ...props }, ref) => {\n const { open, setOpen } = React.useContext(MenuContext);\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n className={cn(\n 'inline-flex items-center justify-center rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium transition-colors',\n 'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\nMenuTrigger.displayName = 'MenuTrigger';\n\nexport type MenuContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** The floating panel containing menu items. */\nconst MenuContent = React.forwardRef<HTMLDivElement, MenuContentProps>(\n ({ className, children, ...props }, ref) => {\n const { open, setOpen, activeIndex, setActiveIndex, wrapperRef } = React.useContext(MenuContext);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n // Viewport coordinates measured from the wrapper; the panel portals to\n // document.body with position:fixed so ancestor overflow (scrollable\n // demo frames, clipped containers) can never cut it off.\n const [pos, setPos] = React.useState<{ top: number; right: number } | null>(null);\n const itemsRef = React.useRef<HTMLElement[]>([]);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const GAP = 4; // matches the previous mt-1 spacing\n const measure = () => {\n const rect = wrapperRef.current?.getBoundingClientRect();\n if (!rect) return;\n setPos({ top: rect.bottom + GAP, right: Math.max(8, window.innerWidth - rect.right) });\n };\n measure();\n // Close on any scroll (capture phase catches scrolling ancestors that\n // do not bubble) so the fixed panel never drifts from its trigger;\n // reposition on resize.\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', measure);\n };\n }, [open, setOpen, wrapperRef]);\n\n // Close on outside click.\n React.useEffect(() => {\n if (!open) return;\n function onPointerDown(event: PointerEvent) {\n if (!contentRef.current?.contains(event.target as Node)) setOpen(false);\n }\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open, setOpen]);\n\n // Collect items for keyboard navigation and move focus into the menu\n // when it opens so arrow keys reach the onKeyDown handler. Depends on\n // `pos` because the panel only mounts once measured.\n React.useEffect(() => {\n if (open && pos && contentRef.current) {\n itemsRef.current = Array.from(\n contentRef.current.querySelectorAll('[role=\"menuitem\"]:not([disabled])')\n );\n itemsRef.current[0]?.focus();\n setActiveIndex(0);\n }\n }, [open, pos, setActiveIndex]);\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const items = itemsRef.current;\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n const next = activeIndex < items.length - 1 ? activeIndex + 1 : 0;\n setActiveIndex(next);\n items[next]?.focus();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n const next = activeIndex > 0 ? activeIndex - 1 : items.length - 1;\n setActiveIndex(next);\n items[next]?.focus();\n } else if (event.key === 'Home') {\n event.preventDefault();\n setActiveIndex(0);\n items[0]?.focus();\n } else if (event.key === 'End') {\n event.preventDefault();\n setActiveIndex(items.length - 1);\n items[items.length - 1]?.focus();\n }\n };\n\n if (!open || !pos || typeof document === 'undefined') return null;\n\n return createPortal(\n <div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n role=\"menu\"\n onKeyDown={onKeyDown}\n style={{ position: 'fixed', top: pos.top, right: pos.right, zIndex: 50 }}\n className={cn(\n 'min-w-[10rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md',\n className\n )}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n);\nMenuContent.displayName = 'MenuContent';\n\nexport type MenuItemProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Renders the item in a destructive style. */\n destructive?: boolean;\n /** Render the child element (e.g. an <a>) as the menu item. */\n asChild?: boolean;\n};\n\n/** A single action item in the menu. */\nconst MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({ className, destructive, asChild = false, onClick, ...props }, ref) => {\n const { setOpen } = React.useContext(MenuContext);\n const Comp = asChild ? Slot : 'button';\n const typeProp = asChild ? {} : { type: 'button' as const };\n return (\n <Comp\n ref={ref}\n {...typeProp}\n role=\"menuitem\"\n onClick={(event) => {\n onClick?.(event);\n setOpen(false);\n }}\n className={cn(\n 'flex w-full cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors',\n 'hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground',\n destructive && 'text-destructive hover:bg-destructive/10 hover:text-destructive',\n className\n )}\n {...props}\n />\n );\n }\n);\nMenuItem.displayName = 'MenuItem';\n\nexport type MenuSeparatorProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Visual divider between menu items. */\nconst MenuSeparator = React.forwardRef<HTMLDivElement, MenuSeparatorProps>(\n ({ className, ...props }, ref) => (\n <div ref={ref} role=\"separator\" className={cn('-mx-1 my-1 h-px bg-border', className)} {...props} />\n )\n);\nMenuSeparator.displayName = 'MenuSeparator';\n\nexport type MenuLabelProps = React.HTMLAttributes<HTMLDivElement>;\n\n/** Non-interactive label grouping related menu items. */\nconst MenuLabel = React.forwardRef<HTMLDivElement, MenuLabelProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('px-2 py-1 text-xs font-medium uppercase tracking-wider text-muted-foreground', className)}\n {...props}\n />\n )\n);\nMenuLabel.displayName = 'MenuLabel';\n\nexport { Menu, MenuTrigger, MenuContent, MenuItem, MenuSeparator, MenuLabel };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst alertVariants = cva(\n 'relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7',\n {\n variants: {\n variant: {\n default: 'bg-background text-foreground border-border',\n destructive: 'border-destructive/50 text-destructive bg-destructive/10 [&>svg]:text-destructive',\n success: 'border-success/50 text-success bg-success/10 [&>svg]:text-success',\n warning: 'border-warning/50 text-warning bg-warning/10 [&>svg]:text-warning',\n info: 'border-info/50 text-info bg-info/10 [&>svg]:text-info',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport type AlertProps = React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>;\n\n/**\n * Inline alert for status messages and notifications. Supports\n * semantic variants (destructive, success, warning, info) with\n * matching icon colors. Renders role=\"alert\" for screen readers.\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n )\n);\nAlert.displayName = 'Alert';\n\nexport type AlertTitleProps = React.HTMLAttributes<HTMLHeadingElement>;\n\n/** Title heading inside an Alert. */\nconst AlertTitle = React.forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ className, ...props }, ref) => (\n <h5\n ref={ref}\n className={cn('mb-1 font-medium leading-none tracking-tight', className)}\n {...props}\n />\n )\n);\nAlertTitle.displayName = 'AlertTitle';\n\nexport type AlertDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\n/** Description text inside an Alert. */\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, AlertDescriptionProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('text-sm [&_p]:leading-relaxed', className)}\n {...props}\n />\n )\n);\nAlertDescription.displayName = 'AlertDescription';\n\nexport { Alert, AlertTitle, AlertDescription, alertVariants };\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n triggerId: string;\n contentId: string;\n /** The relative wrapper the popover is anchored to (measured for portal positioning). */\n wrapperRef: React.MutableRefObject<HTMLDivElement | null>;\n};\n\nconst PopoverContext = React.createContext<PopoverContextValue>({\n open: false,\n setOpen: () => {},\n triggerId: '',\n contentId: '',\n wrapperRef: { current: null },\n});\n\nexport type PopoverProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Called when the open state changes. */\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children: React.ReactNode;\n};\n\n/**\n * Floating panel anchored to a trigger. Unlike Tooltip, the content is\n * interactive (links, buttons, forms). Closes on outside click and Escape.\n * Renders as a non-modal dialog with proper aria wiring.\n */\nconst Popover = React.forwardRef<HTMLDivElement, PopoverProps>(\n ({ open, onOpenChange, className, children }, ref) => {\n const [internalOpen, setInternalOpen] = React.useState(false);\n const current = open ?? internalOpen;\n const triggerId = React.useId();\n const contentId = React.useId();\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n const setRefs = React.useCallback(\n (node: HTMLDivElement | null) => {\n wrapperRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n },\n [ref]\n );\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (open === undefined) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [open, onOpenChange]\n );\n\n return (\n <div ref={setRefs} className={cn('relative inline-block', className)}>\n <PopoverContext.Provider\n value={{ open: current, setOpen, triggerId, contentId, wrapperRef }}\n >\n {children}\n </PopoverContext.Provider>\n </div>\n );\n }\n);\nPopover.displayName = 'Popover';\n\nexport type PopoverTriggerProps = React.ButtonHTMLAttributes<HTMLButtonElement>;\n\n/** The button that toggles the popover. */\nconst PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTriggerProps>(\n ({ className, children, onClick, ...props }, ref) => {\n const { open, setOpen, triggerId, contentId } = React.useContext(PopoverContext);\n return (\n <button\n ref={ref}\n id={triggerId}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n onClick={(event) => {\n onClick?.(event);\n setOpen(!open);\n }}\n className={cn(\n 'inline-flex items-center justify-center rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium transition-colors',\n 'hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n }\n);\nPopoverTrigger.displayName = 'PopoverTrigger';\n\nexport type PopoverContentProps = React.HTMLAttributes<HTMLDivElement>;\n\n /** The floating panel with interactive content. */\n const PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(\n ({ className, children, onKeyDown, ...props }, ref) => {\n const { open, setOpen, triggerId, contentId, wrapperRef } =\n React.useContext(PopoverContext);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n // Viewport coordinates measured from the wrapper; the panel portals to\n // document.body with position:fixed so ancestor overflow (scrollable\n // demo frames, clipped containers) can never cut it off.\n const [pos, setPos] = React.useState<{ top: number; right: number } | null>(null);\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const GAP = 8; // matches the previous mt-2 spacing\n const measure = () => {\n const rect = wrapperRef.current?.getBoundingClientRect();\n if (!rect) return;\n setPos({ top: rect.bottom + GAP, right: Math.max(8, window.innerWidth - rect.right) });\n };\n measure();\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', measure);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', measure);\n };\n }, [open, setOpen, wrapperRef]);\n\n // Close on outside click.\n React.useEffect(() => {\n if (!open) return;\n function onPointerDown(event: PointerEvent) {\n if (!contentRef.current?.contains(event.target as Node)) setOpen(false);\n }\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open, setOpen]);\n\n // Focus the content when it opens so Escape reaches it. Depends on\n // `pos` because the panel only mounts once measured.\n React.useEffect(() => {\n if (open && pos && contentRef.current) {\n contentRef.current.focus();\n }\n }, [open, pos]);\n\n if (!open || !pos || typeof document === 'undefined') return null;\n\n return createPortal(\n <div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n }}\n id={contentId}\n role=\"dialog\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n onKeyDown={(event) => {\n onKeyDown?.(event);\n if (event.key === 'Escape') {\n event.stopPropagation();\n setOpen(false);\n }\n }}\n style={{ position: 'fixed', top: pos.top, right: pos.right, zIndex: 50 }}\n className={cn(\n 'w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none',\n className\n )}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n );\nPopoverContent.displayName = 'PopoverContent';\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport type BreadcrumbItem = {\n /** Display label. */\n label: string;\n /** Destination href; omit for the current page (renders as plain text). */\n href?: string;\n};\n\nexport type BreadcrumbProps = React.HTMLAttributes<HTMLElement> & {\n /** Ordered list of breadcrumb items; the last item is the current page. */\n items: BreadcrumbItem[];\n /** Separator character between items (default '/'). */\n separator?: React.ReactNode;\n /**\n * Receives every link click with the item and its index. When provided,\n * default navigation is prevented so you can route programmatically\n * (e.g. via a router, state machine, or analytics wrapper).\n */\n onItemClick?: (item: BreadcrumbItem, index: number) => void;\n};\n\n/**\n * Navigation breadcrumb trail. The last item is rendered as the current\n * page with aria-current=\"page\". Earlier items are links. Screen readers\n * announce the navigation landmark and current location.\n */\nconst Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({ items, separator = '/', onItemClick, className, ...props }, ref) => (\n <nav\n ref={ref}\n aria-label=\"Breadcrumb\"\n className={cn('flex items-center space-x-1.5 text-sm text-muted-foreground', className)}\n {...props}\n >\n <ol className=\"flex flex-wrap items-center space-x-1.5\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={`${item.label}-${index}`} className=\"flex items-center space-x-1.5\">\n {index > 0 && (\n <span aria-hidden=\"true\" className=\"text-muted-foreground/50\">\n {separator}\n </span>\n )}\n {item.href && !isLast ? (\n <a\n href={item.href}\n className=\"transition-colors hover:text-foreground\"\n onClick={\n onItemClick\n ? (event) => {\n event.preventDefault();\n onItemClick(item, index);\n }\n : undefined\n }\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? 'page' : undefined}\n className={isLast ? 'font-medium text-foreground' : undefined}\n >\n {item.label}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n )\n);\nBreadcrumb.displayName = 'Breadcrumb';\n\nexport { Breadcrumb };\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC8HO,SAAS,oBAAoB,KAAwC;AAC1E,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AACpD,QAAM,SAAS;AACf,SACE,OAAO,OAAO,OAAO,YACrB,OAAO,OAAO,SAAS,YACvB,OAAO,OAAO,SAAS,YACvB,OAAO,OAAO,gBAAgB,YAC9B,OAAO,OAAO,iBAAiB,YAC/B,MAAM,QAAQ,OAAO,KAAK,KAC1B,MAAM,QAAQ,OAAO,QAAQ,KAC7B,MAAM,QAAQ,OAAO,aAAa,KAClC,OAAO,OAAO,YAAY,YAC1B,OAAO,OAAO,eAAe,YAC7B,OAAO,OAAO,YAAY;AAE9B;;;AC9IA,kBAAsC;AACtC,4BAAwB;AAEjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ACIA,IAAM,cAAsC;AAAA,EAC1C,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAOO,SAAS,WAAW,KAGzB;AACA,MAAI,QAAQ,OAAW,QAAO,CAAC;AAC/B,MAAI,OAAO,QAAQ,SAAU,QAAO,EAAE,OAAO,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE;AACjE,SAAO,EAAE,WAAW,YAAY,GAAG,EAAE;AACvC;;;AC7BA,YAAuB;AAUhB,SAAS,YACd,MACA,SACA,SAAS,KAC+B;AACxC,QAAM,CAAC,SAAS,UAAU,IAAU,eAAS,IAAI;AAEjD,EAAM,gBAAU,MAAM;AACpB,QAAI,MAAM;AACR,iBAAW,IAAI;AACf;AAAA,IACF;AACA,QAAI,CAAC,QAAS;AACd,QAAI,CAAC,SAAS;AACZ,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,UAAM,QAAQ,WAAW,MAAM,WAAW,KAAK,GAAG,MAAM;AACxD,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,MAAM,SAAS,SAAS,MAAM,CAAC;AAEnC,SAAO,EAAE,SAAS,SAAS,WAAW,CAAC,KAAK;AAC9C;;;AC9BA,IAAAA,SAAuB;;;ACAvB,IAAAC,SAAuB;AACvB,uBAA6B;AAqNnB;AA1KV,IAAM,YACJ;AAEF,IAAM,cAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV;AAEA,IAAM,aAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACT;AAEA,IAAM,cAA0C;AAAA,EAC9C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACT;AAEA,IAAM,cAA8D;AAAA,EAClE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV;AAGA,SAAS,YAAY,OAAwD;AAC3E,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AACpD;AAGA,IAAM,UAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV;AACA,IAAM,WAAuC;AAAA,EAC3C,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV;AASO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAAgB;AACd,QAAM,YAAkB,cAA8B,IAAI;AAC1D,QAAM,oBAA0B,cAA2B,IAAI;AAC/D,QAAM,UAAgB,aAAM;AAC5B,QAAM,gBAAsB,aAAM;AAClC,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY,MAAM,OAAO;AAItD,EAAM,iBAAU,MAAM;AACpB,QAAI,MAAM;AACR,wBAAkB,UAAU,SAAS;AACrC;AAAA,IACF;AACA,sBAAkB,SAAS,QAAQ;AACnC,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,IAAI,CAAC;AAIT,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,QAAS;AACvB,UAAM,OAAO,UAAU;AACvB,UAAM,SACJ,iBAAiB,WAAW,MAAM,cAA2B,SAAS,KAAK;AAC7E,YAAQ,MAAM;AAAA,EAChB,GAAG,CAAC,MAAM,SAAS,eAAe,CAAC;AAEnC,EAAM,iBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,UAAU;AAC1B,cAAM,gBAAgB;AACtB,qBAAa,KAAK;AAClB;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,MAAO;AACzB,YAAM,OAAO,UAAU;AACvB,UAAI,CAAC,KAAM;AACX,YAAM,YAAY,MAAM,KAAK,KAAK,iBAA8B,SAAS,CAAC;AAC1E,UAAI,UAAU,WAAW,GAAG;AAC1B,cAAM,eAAe;AACrB;AAAA,MACF;AACA,YAAM,QAAQ,UAAU,CAAC;AACzB,YAAM,OAAO,UAAU,UAAU,SAAS,CAAC;AAC3C,YAAM,SAAS,SAAS;AACxB,UAAI,MAAM,aAAa,WAAW,SAAS,CAAC,KAAK,SAAS,MAAM,IAAI;AAClE,cAAM,eAAe;AACrB,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,MAAM,YAAY,WAAW,MAAM;AAC7C,cAAM,eAAe;AACrB,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM,SAAS,oBAAoB,WAAW,SAAS;AAAA,EAChE,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,MAAI,CAAC,WAAW,OAAO,aAAa,YAAa,QAAO;AAExD,QAAM,iBAAiB,SAAS,SAAS,SAAS;AAClD,QAAM,eAAe,iBAAiB,YAAY,MAAM,IAAI,YAAY,KAAK;AAE7E,QAAM,SAAS,UACX;AAAA,IACE;AAAA,IACA,UAAU,eAAe,SAAS,IAAI,CAAC,KAAK,cAAc,QAAQ,IAAI,CAAC;AAAA,EACzE,IACA;AAEJ,aAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,aAAa,CAAC,UAAU;AACtB,cAAI,mBAAmB,MAAM,WAAW,MAAM,cAAe,cAAa,KAAK;AAAA,QACjF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAW;AAAA,YACX,cAAY,aAAa;AAAA,YACzB,mBAAiB,QAAQ,UAAU;AAAA,YACnC,oBAAkB,cAAc,gBAAgB;AAAA,YAChD,UAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACA,YAAY,IAAI;AAAA,cAChB,YAAY,IAAI,EAAE,IAAI;AAAA,cACtB;AAAA,YACF;AAAA,YACA,OAAO,eAAe,EAAE,CAAC,iBAAiB,WAAW,OAAO,GAAG,aAAa,IAAI;AAAA,YAEhF;AAAA,2DAAC,SAAI,WAAU,2EACb;AAAA,6DAAC,SACC;AAAA,8DAAC,QAAG,IAAI,SAAS,WAAU,yCACxB,iBACH;AAAA,kBACC,eACC,4CAAC,OAAE,IAAI,eAAe,WAAU,sCAC7B,uBACH;AAAA,mBAEJ;AAAA,gBACC,aACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,aAAa,KAAK;AAAA,oBACjC,cAAW;AAAA,oBACX,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBAEJ;AAAA,cACA,4CAAC,SAAI,WAAU,oCAAoC,UAAS;AAAA;AAAA;AAAA,QAC9D;AAAA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AD5LkB,IAAAC,sBAAA;AAdX,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAAiB;AACf,QAAM,OAAO,iBAAiB;AAE9B,SACE,8CAAC,SAAI,WAAW,GAAG,0CAA0C,SAAS,GAAI,GAAG,OAC1E;AAAA,eAAW,6CAAC,SAAI,WAAU,QAAQ,mBAAQ;AAAA,IAC3C,6CAAC,SAAI,cAAY,OAAO,WAAU,sDAC/B,mBAAS,IAAI,CAAC,SAAS,UACtB,8CAAC,SACE;AAAA,cAAQ,SACP,6CAAC,OAAE,WAAU,iFACV,kBAAQ,OACX;AAAA,MAEF,6CAAC,QAAG,WAAU,eACX,kBAAQ,MAAM,IAAI,CAAC,SAAS;AAC3B,cAAM,SAAS,KAAK,WAAW,eAAe,UAAa,KAAK,SAAS;AACzE,eACE,6CAAC,QACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,gBAAc,SAAS,SAAS;AAAA,YAChC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA,SACI,2CACA;AAAA,YACN;AAAA,YAEC;AAAA,mBAAK,QAAQ,6CAAC,UAAK,WAAU,2BAA2B,eAAK,MAAK;AAAA,cACnE,6CAAC,UAAK,WAAU,2BAA2B,eAAK,OAAM;AAAA,cACrD,KAAK,SAAS,6CAAC,UAAK,WAAU,oBAAoB,eAAK,OAAM;AAAA;AAAA;AAAA,QAChE,KAfO,KAAK,IAgBd;AAAA,MAEJ,CAAC,GACH;AAAA,SA7BQ,QAAQ,SAAS,WAAW,KAAK,EA8B3C,CACD,GACH;AAAA,IACC,UAAU,6CAAC,SAAI,WAAU,+BAA+B,kBAAO;AAAA,KAClE;AAEJ;AAkBO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAS,KAAK;AAExD,SACE,8CAAC,SAAI,WAAW,GAAG,mDAAmD,SAAS,GAAI,GAAG,OACnF;AAAA,eACC,6CAAC,WAAM,WAAW,GAAG,mDAAmD,YAAY,GACjF,mBACH;AAAA,IAEF,8CAAC,SAAI,WAAU,gCACX;AAAA,iBAAW,WAAW,CAAC,mBACvB,8CAAC,YAAO,WAAU,yJACf;AAAA,mBAAW,CAAC,kBACX;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,cAAc,IAAI;AAAA,YACjC,cAAW;AAAA,YACX,WAAU;AAAA,YAEV,uDAAC,UAAK,eAAY,QAAO,oBAAC;AAAA;AAAA,QAC5B;AAAA,QAEF,6CAAC,SAAI,WAAU,kBAAkB,kBAAO;AAAA,SAC1C;AAAA,MAEF,6CAAC,UAAK,WAAU,kBAAkB,UAAS;AAAA,OAC7C;AAAA,IACC,WACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,OAAM;AAAA,QACN,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAO;AAAA,QAEN;AAAA;AAAA,IACH;AAAA,KAEJ;AAEJ;;;AEjKA,IAAAC,SAAuB;AACvB,wBAAqB;AACrB,sCAAuC;AAoDjC,IAAAC,sBAAA;AAjDN,IAAM,qBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aAAa;AAAA;AAAA;AAAA,QAGb,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA;AAAA;AAAA,QAGT,uBACE;AAAA,QACF,mBACE;AAAA,QACF,mBACE;AAAA,QACF,gBACE;AAAA,QACF,WAAW;AAAA,QACX,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAMA,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AAChE,UAAM,OAAO,UAAU,yBAAO;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,QAC1D;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;AC9DrB,IAAAC,SAAuB;AAsBnB,IAAAC,sBAAA;AAFJ,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,cAAc,cAAc,WAAW,GAAG,MAAM,GAAG,QACpD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA;AAAA;AAAA,QAGA,gBAAgB,eACZ,2BACA;AAAA,QACJ;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,YAAY,cAAc;;;ACzC1B,IAAAC,SAAuB;AAQjB,IAAAC,sBAAA;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,MAAM,GAAG,MAAM,GAAG,QAAQ;AACtC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;;;ACxBpB,IAAAC,SAAuB;;;ACAvB,IAAAC,SAAuB;AAiBnB,IAAAC,sBAAA;AAFJ,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,SAAS,cAAc;;;AC5BvB,IAAAC,SAAuB;AA+CnB,IAAAC,sBAAA;AATG,IAAM,SAAe,kBAA2C,SAASC,QAC9E,EAAE,SAAS,QAAQ,OAAO,aAAa,WAAW,OAAO,OAAO,cAAc,UAAU,IAAI,WAAW,GAAG,MAAM,GAChH,KACA;AACA,QAAM,cAAoB,aAAM;AAChC,QAAM,WAAW,MAAM;AACvB,QAAM,UAAU,GAAG,QAAQ;AAE3B,QAAM,eAAe,CAAC,WACpB,6CAAC,YAA0B,OAAO,OAAO,OAAO,UAAU,OAAO,UAC9D,iBAAO,SADG,OAAO,KAEpB;AAGF,SACE,8CAAC,SAAI,WAAU,yBACZ;AAAA,aACC,6CAAC,WAAM,IAAI,SAAS,SAAS,UAAU,WAAU,uBAC9C,iBACH;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,mBAAiB,QAAQ,UAAU;AAAA,QACnC,WAAW;AAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,CAAC,UAAU;AACnB,cAAI,CAAC,SAAU;AACf,cAAI,UAAU;AACZ,qBAAS,MAAM,KAAK,MAAM,OAAO,iBAAiB,CAAC,WAAW,OAAO,KAAK,CAAC;AAC3E;AAAA,UACF;AACA,mBAAS,MAAM,OAAO,KAAK;AAAA,QAC7B;AAAA,QACC,GAAG;AAAA,QAEH;AAAA,yBACC,6CAAC,YAAO,OAAM,IAAG,UAAQ,MACtB,uBACH;AAAA,UAED,SACG,OAAO,IAAI,CAAC,UACV,6CAAC,cAA2B,OAAO,MAAM,OACtC,gBAAM,QAAQ,IAAI,YAAY,KADlB,MAAM,KAErB,CACD,KACA,WAAW,CAAC,GAAG,IAAI,YAAY;AAAA;AAAA;AAAA,IACtC;AAAA,KACF;AAEJ,CAAC;;;AFhDK,IAAAC,sBAAA;AA1CN,IAAM,gBAAgB,CAAC,UACf,sBAAe,KAAK,MAAM,MAAM,SAAS,SAAS,MAAM,SAAS,YAAY,MAAM,SAAS;AAYpG,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,IAAI,oBAAoB,aAAa,gBAAgB,SAAS,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AACxG,QAAI,gBAAgB;AAEpB,QAAI,OAAO,UAAa,gBAAgB,UAAa,YAAY,QAAW;AAC1E,YAAM,QAAc,gBAAS,QAAQ,QAAQ;AAC7C,YAAM,aAAa,MAAM,UAAU,aAAa;AAChD,UAAI,eAAe,IAAI;AACrB,cAAM,QAAQ,MAAM,UAAU;AAC9B,cAAM,UAAU,IAAI,cAAc,KAAK,IAC7B,oBAAa,OAAO;AAAA,UACxB,GAAI,OAAO,UAAa,EAAE,GAAG;AAAA,UAC7B,GAAI,gBAAgB,UAAa,EAAE,oBAAoB,YAAY;AAAA,UACnE,GAAI,YAAY,UAAa,EAAE,gBAAgB,QAAQ;AAAA,QACzD,CAAC,IACD;AACJ,wBAAgB;AAAA,MAClB,OAAO;AAEL,gBAAQ;AAAA,UACN,GAAG;AAAA,UACH,GAAI,OAAO,UAAa,EAAE,GAAG;AAAA,UAC7B,GAAI,gBAAgB,UAAa,EAAE,oBAAoB,YAAY;AAAA,UACnE,GAAI,YAAY,UAAa,EAAE,gBAAgB,QAAQ;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,aAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,WAAW,cAAc;AAczB,IAAM,kBAAwB;AAAA,EAC5B,CAAC,EAAE,OAAO,QAAQ,UAAU,SAAS,WAAW,GAAG,MAAM,GAAG,QAC1D;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAU;AAAA,MACV,aAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA,YAAY,WAAW;AAAA,QACvB;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,gBAAgB,cAAc;;;AG1G9B,IAAAC,UAAuB;AACvB,IAAAC,qBAAqB;AACrB,IAAAC,mCAAuC;AA6B5B,IAAAC,sBAAA;AA1BX,IAAM,oBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAQA,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,SAAS,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AAC1D,UAAM,OAAO,UAAU,0BAAO;AAC9B,WAAO,6CAAC,QAAK,KAAU,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS,GAAI,GAAG,OAAO;AAAA,EAC1F;AACF;AACA,MAAM,cAAc;;;AClCpB,IAAAC,UAAuB;AACvB,sBAAiC;AAO/B,IAAAC,uBAAA;AAJF,IAAM,SAAe,mBAGnB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,OAAO,cAA8B,qBAAK;AAE1C,IAAM,cAAoB,mBAGxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW,GAAG,+BAA+B,SAAS;AAAA,IACrD,GAAG;AAAA;AACN,CACD;AACD,YAAY,cAA8B,sBAAM;AAEhD,IAAM,iBAAuB,mBAG3B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAC1B;AAAA,EAAiB;AAAA,EAAhB;AAAA,IACC;AAAA,IACA,WAAW;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,eAAe,cAA8B,yBAAS;;;AC3CtD,IAAAC,mCAAuC;AA+BjC,IAAAC,uBAAA;AA5BN,IAAM,sBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAOA,SAAS,QAAQ,EAAE,WAAW,MAAM,QAAQ,cAAc,GAAG,MAAM,GAAiB;AAClF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW,GAAG,gBAAgB,EAAE,KAAK,CAAC,GAAG,SAAS;AAAA,MACjD,GAAG;AAAA,MAEJ,wDAAC,UAAK,WAAU,WAAW,iBAAM;AAAA;AAAA,EACnC;AAEJ;;;ACjCA,IAAAC,UAAuB;AA4DnB,IAAAC,uBAAA;AAjDJ,IAAM,eAAqB,sBAAwC,IAAI;AAEvE,IAAM,mBAAmB;AAOlB,SAAS,cAAc,EAAE,UAAU,QAAQ,gBAAgB,GAAkD;AAClH,QAAM,CAACC,SAAQ,SAAS,IAAU,iBAAwB,CAAC,CAAC;AAC5D,QAAMC,UAAe,eAAO,oBAAI,IAA2C,CAAC;AAE5E,QAAMC,WAAgB,oBAAY,CAAC,OAAe;AAChD,UAAM,QAAQD,QAAO,QAAQ,IAAI,EAAE;AACnC,QAAI,OAAO;AACT,mBAAa,KAAK;AAClB,MAAAA,QAAO,QAAQ,OAAO,EAAE;AAAA,IAC1B;AACA,cAAU,CAAC,YAAY,QAAQ,OAAO,CAAC,UAAU,MAAM,OAAO,EAAE,CAAC;AAAA,EACnE,GAAG,CAAC,CAAC;AAEL,QAAME,SAAc;AAAA,IAClB,CAAC,YAA0B;AACzB,YAAM,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACxE,gBAAU,CAAC,YAAY,CAAC,GAAG,SAAS,EAAE,GAAG,SAAS,GAAG,CAAC,CAAC;AACvD,YAAM,WAAW,QAAQ,YAAY;AACrC,UAAI,WAAW,GAAG;AAChB,QAAAF,QAAO,QAAQ;AAAA,UACb;AAAA,UACA,WAAW,MAAMC,SAAQ,EAAE,GAAG,QAAQ;AAAA,QACxC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,CAACA,QAAO;AAAA,EACV;AAEA,EAAM,kBAAU,MAAM;AACpB,UAAM,UAAUD,QAAO;AACvB,WAAO,MAAM;AACX,iBAAW,SAAS,QAAQ,OAAO,EAAG,cAAa,KAAK;AACxD,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAc,gBAAQ,OAAO,EAAE,QAAAD,SAAQ,OAAAG,QAAO,SAAAD,SAAQ,IAAI,CAACF,SAAQG,QAAOD,QAAO,CAAC;AAExF,SACE,+CAAC,aAAa,UAAb,EAAsB,OACpB;AAAA;AAAA,IACD,8CAAC,eAAY,QAAQF,SAAQ,WAAWE,UAAS,OAAc;AAAA,KACjE;AAEJ;AAEO,SAAS,WAA8B;AAC5C,QAAM,UAAgB,mBAAW,YAAY;AAC7C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,iDAAiD;AAC/E,SAAO;AACT;AAEA,SAAS,YAAY;AAAA,EACnB,QAAAF;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,WAAU;AAAA,MAET,UAAAA,QAAO,IAAI,CAAC,UACX,+CAAC,QAAkB,WAAU,yDAC3B;AAAA,uDAAC,SAAI,MAAK,UAAS,WAAU,0CAC3B;AAAA,yDAAC,SACC;AAAA,0DAAC,OAAE,WAAU,yBAAyB,gBAAM,OAAM;AAAA,YACjD,MAAM,eAAe,8CAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,aAC7F;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,UAAU,MAAM,EAAE;AAAA,cACjC,cAAY,WAAW,MAAM,KAAK;AAAA,cAClC,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,WACF;AAAA,QACC,MAAM,UACL;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,oBAAM,QAAQ,QAAQ;AACtB,wBAAU,MAAM,EAAE;AAAA,YACpB;AAAA,YACA,WAAU;AAAA,YAET,gBAAM,OAAO;AAAA;AAAA,QAChB;AAAA,WAzBK,MAAM,EA2Bf,CACD;AAAA;AAAA,EACH;AAEJ;;;ACvHA,IAAAI,UAAuB;;;AC2BvB,IAAMC,oBAAmB;AAEzB,IAAI,SAAiC,CAAC;AACtC,IAAM,QAAgC,CAAC;AACvC,IAAM,YAAY,oBAAI,IAAc;AACpC,IAAM,SAAS,oBAAI,IAA2C;AAE9D,SAAS,OAAO;AACd,aAAW,YAAY,UAAW,UAAS,MAAM;AACnD;AAEA,SAAS,QAAQ,IAAY;AAC3B,QAAM,QAAQ,OAAO,IAAI,EAAE;AAC3B,MAAI,OAAO;AACT,iBAAa,KAAK;AAClB,WAAO,OAAO,EAAE;AAAA,EAClB;AACA,WAAS,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO,EAAE;AACjD,OAAK;AACP;AAEA,SAAS,KAAK,SAA+B;AAC3C,QAAM,KAAK,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACxE,WAAS,CAAC,GAAG,QAAQ,EAAE,GAAG,SAAS,GAAG,CAAC;AACvC,OAAK;AAEL,QAAM,WAAW,QAAQ,YAAYA;AACrC,MAAI,WAAW,GAAG;AAChB,WAAO;AAAA,MACL;AAAA,MACA,WAAW,MAAM,QAAQ,EAAE,GAAG,QAAQ;AAAA,IACxC;AAAA,EACF;AACA,SAAO;AACT;AAmBO,IAAM,QAAuB,OAAO;AAAA,EACzC,CAAC,YAA0B,KAAK,EAAE,GAAG,SAAS,SAAS,QAAQ,WAAW,UAAU,CAAC;AAAA,EACrF;AAAA,IACE,SAAS,CAAC,OAAe,gBAAyB,KAAK,EAAE,OAAO,aAAa,SAAS,UAAU,CAAC;AAAA,IACjG,OAAO,CAAC,OAAe,gBAAyB,KAAK,EAAE,OAAO,aAAa,SAAS,QAAQ,CAAC;AAAA,IAC7F,SAAS,CAAC,OAAe,gBAAyB,KAAK,EAAE,OAAO,aAAa,SAAS,UAAU,CAAC;AAAA,IACjG,MAAM,CAAC,OAAe,gBAAyB,KAAK,EAAE,OAAO,aAAa,SAAS,OAAO,CAAC;AAAA,IAC3F,SAAS,CAAC,OAAgB;AACxB,UAAI,IAAI;AACN,gBAAQ,EAAE;AACV;AAAA,MACF;AACA,iBAAW,SAAS,CAAC,GAAG,MAAM,EAAG,SAAQ,MAAM,EAAE;AAAA,IACnD;AAAA,IACA,OAAO,MAAM;AACX,iBAAW,SAAS,CAAC,GAAG,MAAM,EAAG,SAAQ,MAAM,EAAE;AAAA,IACnD;AAAA,EACF;AACF;AAGO,SAAS,kBAAkB,UAAgC;AAChE,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM,UAAU,OAAO,QAAQ;AACxC;AAGO,SAAS,mBAA2C;AACzD,SAAO;AACT;AAGO,SAAS,yBAAiD;AAC/D,SAAO;AACT;;;ADlCc,IAAAC,uBAAA;AApDd,IAAM,kBAAmD;AAAA,EACvD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,gBAAgB;AAClB;AAEA,IAAM,cAA4C;AAAA,EAChD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAEA,IAAM,aAA2C;AAAA,EAC/C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAUO,SAAS,QAAQ,EAAE,WAAW,gBAAgB,QAAQ,iBAAiB,aAAa,MAAM,GAAiB;AAChH,QAAM,UAAgB,6BAAqB,mBAAmB,kBAAkB,sBAAsB;AAEtG,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ,WAAW,GAAG,oDAAoD,gBAAgB,QAAQ,CAAC;AAAA,MAE1F,kBAAQ,IAAI,CAAC,UAAU;AACtB,cAAM,UAAU,MAAM,WAAW;AACjC,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA,aAAa,YAAY,OAAO,IAAI;AAAA,YACtC;AAAA,YAEA,yDAAC,SAAI,MAAK,UAAS,WAAU,0BAC3B;AAAA,4DAAC,UAAK,eAAY,QAAO,WAAW,GAAG,sCAAsC,WAAW,OAAO,CAAC,GAAG;AAAA,cACnG,+CAAC,SAAI,WAAU,kBACb;AAAA,8DAAC,OAAE,WAAU,yBAAyB,gBAAM,OAAM;AAAA,gBACjD,MAAM,eAAe,8CAAC,OAAE,WAAU,sCAAsC,gBAAM,aAAY;AAAA,gBAC1F,MAAM,UACL;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM;AACb,4BAAM,QAAQ,QAAQ;AACtB,4BAAgB,QAAQ,MAAM,EAAE;AAAA,oBAClC;AAAA,oBACA,WAAU;AAAA,oBAET,gBAAM,OAAO;AAAA;AAAA,gBAChB;AAAA,iBAEJ;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,MAAgB,QAAQ,MAAM,EAAE;AAAA,kBAC/C,cAAY,WAAW,MAAM,KAAK;AAAA,kBAClC,WAAU;AAAA,kBACX;AAAA;AAAA,cAED;AAAA,eACF;AAAA;AAAA,UAhCK,MAAM;AAAA,QAiCb;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;;;AE/GA,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AA0DpB,IAAAC,uBAAA;AAjBT,IAAMC,aACJ;AAEF,IAAMC,eAA0C;AAAA,EAC9C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACT;AAEA,IAAM,mBAAyB,sBAAiE,IAAI;AAKpG,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAsB;AAChE,SAAO,8CAAC,SAAI,WAAW,GAAG,0CAA0C,SAAS,GAAI,GAAG,OAAO;AAC7F;AAKA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAqB;AAC9D,QAAM,MAAY,mBAAW,gBAAgB;AAC7C,SAAO,8CAAC,QAAG,IAAI,KAAK,SAAS,WAAW,GAAG,yBAAyB,SAAS,GAAI,GAAG,OAAO;AAC7F;AAKA,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAA2B;AAC1E,QAAM,MAAY,mBAAW,gBAAgB;AAC7C,SAAO,8CAAC,OAAE,IAAI,KAAK,eAAe,WAAW,GAAG,sCAAsC,SAAS,GAAI,GAAG,OAAO;AAC/G;AAKA,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAoB;AAC5D,SAAO,8CAAC,SAAI,WAAW,GAAG,QAAQ,SAAS,GAAI,GAAG,OAAO;AAC3D;AAKA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAsB;AAChE,SAAO,8CAAC,SAAI,WAAW,GAAG,4CAA4C,SAAS,GAAI,GAAG,OAAO;AAC/F;AAWO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,UAAU;AACZ,GAAgB;AACd,QAAM,YAAkB,eAA8B,IAAI;AAC1D,QAAM,oBAA0B,eAA2B,IAAI;AAC/D,QAAM,UAAgB,cAAM;AAC5B,QAAM,gBAAsB,cAAM;AAClC,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY,MAAM,OAAO;AAItD,EAAM,kBAAU,MAAM;AACpB,QAAI,MAAM;AACR,wBAAkB,UAAU,SAAS;AACrC;AAAA,IACF;AACA,sBAAkB,SAAS,QAAQ;AACnC,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,IAAI,CAAC;AAIT,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,QAAQ,CAAC,QAAS;AACvB,UAAM,OAAO,UAAU;AACvB,UAAM,SACJ,iBAAiB,WAAW,MAAM,cAA2BD,UAAS,KAAK;AAC7E,YAAQ,MAAM;AAAA,EAChB,GAAG,CAAC,MAAM,SAAS,eAAe,CAAC;AAEnC,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,UAAU;AAC1B,cAAM,gBAAgB;AACtB,qBAAa,KAAK;AAClB;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,MAAO;AACzB,YAAM,OAAO,UAAU;AACvB,UAAI,CAAC,KAAM;AACX,YAAM,YAAY,MAAM,KAAK,KAAK,iBAA8BA,UAAS,CAAC;AAC1E,UAAI,UAAU,WAAW,EAAG;AAC5B,YAAM,QAAQ,UAAU,CAAC;AACzB,YAAM,OAAO,UAAU,UAAU,SAAS,CAAC;AAC3C,YAAM,SAAS,SAAS;AACxB,UAAI,MAAM,aAAa,WAAW,SAAS,WAAW,OAAO;AAC3D,cAAM,eAAe;AACrB,aAAK,MAAM;AAAA,MACb,WAAW,CAAC,MAAM,YAAY,WAAW,MAAM;AAC7C,cAAM,eAAe;AACrB,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,WAAW,IAAI;AACpD,WAAO,MAAM,SAAS,oBAAoB,WAAW,WAAW,IAAI;AAAA,EACtE,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,MAAI,CAAC,WAAW,OAAO,aAAa,YAAa,QAAO;AAExD,QAAM,SAAS,UACX;AAAA,IACE;AAAA,IACA,UAAU,uCAAuC;AAAA,EACnD,IACA;AAEJ,aAAO;AAAA,IACL;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,4EAA4E,MAAM;AAAA,QAChG,aAAa,CAAC,UAAU;AACtB,cAAI,mBAAmB,MAAM,WAAW,MAAM,cAAe,cAAa,KAAK;AAAA,QACjF;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,cAAW;AAAA,YACX,mBAAiB,YAAY,SAAY;AAAA,YACzC,cAAY;AAAA,YACZ,oBAAkB,cAAc,gBAAgB;AAAA,YAChD,UAAU;AAAA,YACV,WAAW;AAAA,cACT;AAAA,cACAC,aAAY,IAAI;AAAA,cAChB;AAAA,YACF;AAAA,YAEA,yDAAC,iBAAiB,UAAjB,EAA0B,OAAO,EAAE,SAAS,cAAc,GACxD;AAAA,wBACC,+CAAC,gBACC;AAAA,+DAAC,SAAI,WAAU,WACZ;AAAA,2BAAS,8CAAC,eAAa,iBAAM;AAAA,kBAC7B,eAAe,8CAAC,qBAAmB,uBAAY;AAAA,mBAClD;AAAA,gBACC,aACC;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,aAAa,KAAK;AAAA,oBACjC,cAAW;AAAA,oBACX,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,iBAEJ;AAAA,cAEF;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,cAAc;AAAA,oBACd;AAAA,kBACF;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cACC,UAAU,8CAAC,gBAAc,kBAAO;AAAA,eACnC;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AC/OA,IAAAC,UAAuB;AAmCb,IAAAC,uBAAA;AAZH,IAAM,YAAkB,mBAA2C,SAASC,WACjF,EAAE,OAAO,aAAa,SAAS,SAAS,UAAU,QAAQ,QAAQ,MAAM,WAAW,GAAG,MAAM,GAC5F,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,gFAAgF,SAAS;AAAA,MACtG,GAAG;AAAA,MAEF;AAAA,kBAAS,eAAe,YACxB,+CAAC,SAAI,WAAU,qFACb;AAAA,yDAAC,SAAI,WAAU,WACZ;AAAA,qBAAS,8CAAC,QAAG,WAAU,yBAAyB,iBAAM;AAAA,YACtD,eAAe,8CAAC,OAAE,WAAU,wCAAwC,uBAAY;AAAA,aACnF;AAAA,UACC,WAAW,8CAAC,SAAI,WAAU,oCAAoC,mBAAQ;AAAA,WACzE;AAAA,QAED,WAAW,8CAAC,SAAI,WAAU,oCAAoC,mBAAQ;AAAA,QACvE,8CAAC,SAAI,WAAW,GAAG,QAAQ,oBAAoB,KAAK,GAAI,UAAS;AAAA,QAChE,UAAU,8CAAC,SAAI,WAAU,oCAAoC,kBAAO;AAAA;AAAA;AAAA,EACvE;AAEJ,CAAC;;;AC7CD,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AAmOzB,IAAAC,uBAAA;AAhMJ,SAAS,gBAAgB,MAAe,OAAmB,MAAkD;AAC3G,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,UAAsB;AAC3C,YAAM,SAAS,MAAM;AACrB,UAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,SAAS,MAAM,CAAC,EAAG;AACvD,YAAM;AAAA,IACR;AACA,aAAS,iBAAiB,aAAa,aAAa;AACpD,WAAO,MAAM,SAAS,oBAAoB,aAAa,aAAa;AAAA,EACtE,GAAG,CAAC,MAAM,OAAO,IAAI,CAAC;AACxB;AAUO,IAAM,aAAmB,mBAA+C,SAASC,YACtF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAmB,MAAM;AAC7D,QAAI,iBAAiB,OAAW,QAAO,CAAC;AACxC,WAAO,MAAM,QAAQ,YAAY,IAAI,eAAe,CAAC,YAAY;AAAA,EACnE,CAAC;AACD,QAAM,iBAAuB,gBAAQ,MAAM;AACzC,QAAI,UAAU,OAAW,QAAO;AAChC,WAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAAA,EAC9C,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,QAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK;AAC5C,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAS,EAAE;AACvD,QAAM,CAAC,UAAU,WAAW,IAAU,iBAA8D,IAAI;AACxG,QAAM,aAAmB,eAAiC,IAAI;AAC9D,QAAM,UAAgB,eAA8B,IAAI;AACxD,QAAM,YAAkB,cAAM;AAC9B,QAAM,UAAgB,cAAM;AAC5B,QAAM,YAAkB,eAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;AAEnD,QAAM,gBAAsB;AAAA,IAC1B,CAAC,SAAmC;AAClC,iBAAW,UAAU;AACrB,UAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,eAC9B,IAAK,KAAI,UAAU;AAAA,IAC9B;AAAA,IACA,CAAC,GAAG;AAAA,EACN;AAEA,QAAM,QAAc,oBAAY,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AACxD,kBAAgB,MAAM,OAAO,CAAC,YAAY,OAAO,CAAC;AAElD,QAAM,UAAgB,oBAAY,MAAM;AACtC,UAAM,OAAO,WAAW;AACxB,QAAI,CAAC,KAAM;AACX,UAAM,OAAO,KAAK,sBAAsB;AACxC,gBAAY,EAAE,KAAK,KAAK,SAAS,GAAG,MAAM,KAAK,MAAM,OAAO,KAAK,IAAI,KAAK,OAAO,GAAG,EAAE,CAAC;AAAA,EACzF,GAAG,CAAC,CAAC;AAEL,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,YAAQ;AACR,UAAM,WAAW,MAAM,QAAQ;AAC/B,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,aAAO,oBAAoB,UAAU,UAAU,IAAI;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,CAAC;AAGlB,QAAM,eAAqB,gBAAQ,MAAM,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,CAAC;AAE3F,QAAM,WAAW,MAAM;AACrB,QAAI,SAAU;AACd,YAAQ,IAAI;AACZ,UAAM,gBAAgB,MAAM,UAAU,CAAC,SAAS,eAAe,SAAS,KAAK,KAAK,KAAK,CAAC,KAAK,QAAQ;AACrG,mBAAe,iBAAiB,IAAI,gBAAgB,YAAY;AAAA,EAClE;AAEA,QAAM,SAAS,CAAC,SAAmB;AACjC,QAAI,UAAU,OAAW,aAAY,IAAI;AACzC,oBAAgB,WAAW,OAAO,KAAK,CAAC,KAAK,EAAE;AAAA,EACjD;AAEA,QAAM,SAAS,CAAC,SAAyB;AACvC,QAAI,KAAK,SAAU;AACnB,QAAI,UAAU;AACZ,YAAM,OAAO,eAAe,SAAS,KAAK,KAAK,IAC3C,eAAe,OAAO,CAAC,UAAU,UAAU,KAAK,KAAK,IACrD,CAAC,GAAG,gBAAgB,KAAK,KAAK;AAClC,aAAO,IAAI;AACX;AAAA,IACF;AACA,WAAO,CAAC,KAAK,KAAK,CAAC;AACnB,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,OAAO,CAAC,cAAsB;AAClC,QAAI,MAAM,WAAW,EAAG;AACxB,QAAI,QAAQ;AACZ,aAAS,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ,GAAG;AACjD,eAAS,QAAQ,YAAY,MAAM,UAAU,MAAM;AACnD,UAAI,CAAC,MAAM,KAAK,GAAG,UAAU;AAC3B,uBAAe,KAAK;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,UAAkD;AACvE,gBAAY,KAAK;AACjB,QAAI,MAAM,iBAAkB;AAE5B,QAAI,CAAC,MAAM;AACT,UAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,aAAa,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AACtG,cAAM,eAAe;AACrB,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,YAAQ,MAAM,KAAK;AAAA,MACjB,KAAK;AACH,cAAM,eAAe;AACrB,aAAK,CAAC;AACN;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,aAAK,EAAE;AACP;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,uBAAe,YAAY;AAC3B;AAAA,MACF,KAAK,OAAO;AACV,cAAM,eAAe;AACrB,iBAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAC7C,cAAI,CAAC,MAAM,CAAC,GAAG,UAAU;AACvB,2BAAe,CAAC;AAChB;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACH,cAAM,eAAe;AACrB,YAAI,eAAe,KAAK,MAAM,WAAW,EAAG,QAAO,MAAM,WAAW,CAAC;AACrE;AAAA,MACF,KAAK;AACH,cAAM,eAAe;AACrB,gBAAQ,KAAK;AACb;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK;AACb;AAAA,MACF,SAAS;AACP,YAAI,MAAM,IAAI,WAAW,KAAK,MAAM,WAAW,MAAM,WAAW,MAAM,OAAQ;AAC9E,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,SAAS,MAAM,UAAU,QAAQ,KAAK,MAAM,MAAM,MAAM,UAAU,QAAQ,QAAQ,MAAM;AAC9F,kBAAU,UAAU,EAAE,OAAO,QAAQ,IAAI,IAAI;AAC7C,cAAM,QAAQ,OAAO,YAAY;AACjC,cAAM,QAAQ,MAAM,UAAU,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AACpG,YAAI,SAAS,EAAG,gBAAe,KAAK;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM,OAAO,CAAC,SAAS,eAAe,SAAS,KAAK,KAAK,CAAC;AAChF,QAAM,iBAAiB,cACrB,YAAY,aAAa,IACvB,cAAc,WAAW,IAC3B,8CAAC,UAAK,WAAU,yBAAyB,uBAAY,IACnD,WACF,8CAAC,UAAK,WAAU,YACb,wBAAc,WAAW,IAAI,cAAc,CAAC,EAAE,QAAQ,GAAG,cAAc,MAAM,aAChF,IAEA,8CAAC,UAAK,WAAU,YAAY,wBAAc,CAAC,EAAE,OAAM;AAGrD,QAAM,iBAAiB,eAAe,IAAI,GAAG,SAAS,WAAW,WAAW,KAAK;AAGjF,QAAM,OAAa,gBAAQ,MAAM;AAC/B,UAAM,MAAyE,CAAC;AAChF,QAAI;AACJ,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,UAAI,KAAK,SAAS,KAAK,UAAU,WAAW;AAC1C,YAAI,KAAK,EAAE,SAAS,KAAK,OAAO,OAAO,GAAG,CAAC;AAC3C,oBAAY,KAAK;AAAA,MACnB;AACA,UAAI,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,IAC1B,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,gFACE;AAAA,kDAAC,UAAK,IAAI,SAAS,WAAU,WAC1B,iBAAO,YAAY,YAAY,MAAM,WAAW,YAAY,YAAY,IAAI,UAC/E;AAAA,IACC,QACC,eAAe,IAAI,CAAC,aAClB,8CAAC,WAAqB,MAAK,UAAS,MAAY,OAAO,YAA3C,QAAqD,CAClE;AAAA,IACH;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,OAAO,YAAY;AAAA,QAClC,yBAAuB,OAAO,iBAAiB;AAAA,QAC/C,mBAAiB;AAAA,QACjB;AAAA,QACA,SAAS,MAAO,OAAO,QAAQ,KAAK,IAAI,SAAS;AAAA,QACjD,WAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,wDAAC,UAAK,WAAU,kBAAkB,0BAAe;AAAA,UACjD,8CAAC,UAAK,eAAY,QAAO,WAAU,yBAAwB,oBAAC;AAAA;AAAA;AAAA,IAC9D;AAAA,IAEC,QACC,gBACA;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,IAAI;AAAA,UACJ,MAAK;AAAA,UACL,mBAAiB;AAAA,UACjB,wBAAsB,YAAY;AAAA,UAClC,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK,SAAS;AAAA,YACd,MAAM,SAAS;AAAA,YACf,OAAO,SAAS;AAAA,YAChB,QAAQ;AAAA,UACV;AAAA,UACA,WAAU;AAAA,UAET,gBAAM,WAAW,IAChB,8CAAC,OAAE,MAAK,gBAAe,WAAU,2CAC9B,qBACH,IAEA,KAAK;AAAA,YAAI,CAAC,KAAK,aACb,IAAI,UACF;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAU;AAAA,gBAET,cAAI;AAAA;AAAA,cAJA,WAAW,IAAI,OAAO,IAAI,QAAQ;AAAA,YAKzC,IAEA;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI,GAAG,SAAS,WAAW,IAAI,KAAK;AAAA,gBACpC,MAAK;AAAA,gBACL,iBAAe,eAAe,SAAS,IAAI,KAAM,KAAK;AAAA,gBACtD,iBAAe,IAAI,KAAM,YAAY;AAAA,gBACrC,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,gBAC7C,cAAc,MAAM,CAAC,IAAI,KAAM,YAAY,eAAe,IAAI,KAAK;AAAA,gBACnE,SAAS,MAAM,OAAO,IAAI,IAAK;AAAA,gBAC/B,WAAW;AAAA,kBACT;AAAA,kBACA,IAAI,UAAU,cAAc,qCAAqC;AAAA,kBACjE,IAAI,KAAM,YAAY;AAAA,gBACxB;AAAA,gBAEC,uBACC,WAAW,IAAI,MAAO;AAAA,kBACpB,UAAU,eAAe,SAAS,IAAI,KAAM,KAAK;AAAA,kBACjD,QAAQ,IAAI,UAAU;AAAA,gBACxB,CAAC,IAED,gFACG;AAAA,sBAAI,KAAM,QAAQ,8CAAC,UAAK,WAAU,kCAAkC,cAAI,KAAM,MAAK;AAAA,kBACpF,+CAAC,UAAK,WAAU,kBACd;AAAA,kEAAC,UAAK,WAAU,SAAS,cAAI,KAAM,OAAM;AAAA,oBACxC,IAAI,KAAM,eACT,8CAAC,UAAK,WAAU,8CACb,cAAI,KAAM,aACb;AAAA,qBAEJ;AAAA,kBACC,YAAY,eAAe,SAAS,IAAI,KAAM,KAAK,KAClD,8CAAC,UAAK,eAAY,QAAO,WAAU,wBAAuB,oBAE1D;AAAA,mBAEJ;AAAA;AAAA,cAnCG,IAAI,KAAM;AAAA,YAqCjB;AAAA,UAEJ;AAAA;AAAA,MAEJ;AAAA,MACA,SAAS;AAAA,IACX;AAAA,KACJ;AAEJ,CAAC;;;AC7WD,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;;;ACH7B,IAAAC,UAAuB;AA6CvB,IAAI,YAAY;AAOT,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,GAA0C;AACxC,QAAM,CAAC,MAAM,YAAY,IAAU,iBAAS,KAAK;AACjD,QAAM,CAAC,aAAa,cAAc,IAAU,iBAAS,EAAE;AACvD,QAAM,CAAC,KAAK,MAAM,IAAU,iBAA8D,IAAI;AAC9F,QAAM,YAAkB,eAA8B,IAAI;AAC1D,QAAM,YAAkB,eAAO,uBAAuB,EAAE,SAAS,EAAE,EAAE;AAErE,QAAM,UAAgB;AAAA,IACpB,CAAC,SAAkB;AACjB,mBAAa,IAAI;AACjB,UAAI,CAAC,KAAM,gBAAe,EAAE;AAC5B,qBAAe,IAAI;AAAA,IACrB;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAGA,EAAM,kBAAU,MAAM;AACpB,mBAAe,EAAE;AAAA,EACnB,GAAG,CAAC,KAAK,CAAC;AAKV,EAAM,wBAAgB,MAAM;AAC1B,QAAI,CAAC,MAAM;AACT,aAAO,IAAI;AACX;AAAA,IACF;AACA,UAAMC,OAAM;AACZ,UAAM,UAAU,MAAM;AACpB,YAAM,OAAO,UAAU,SAAS,sBAAsB;AACtD,UAAI,CAAC,KAAM;AACX,aAAO,EAAE,KAAK,KAAK,SAASA,MAAK,MAAM,KAAK,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,IACvE;AACA,YAAQ;AACR,UAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,WAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,WAAO,iBAAiB,UAAU,OAAO;AACzC,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,aAAO,oBAAoB,UAAU,OAAO;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,MAAM,OAAO,CAAC;AAGlB,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,UAAwB;AAC7C,UAAI,CAAC,UAAU,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,IACvE;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,WAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,EACxE,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,QAAM,iBAAuB;AAAA,IAC3B,CAAC,UAAiD;AAChD,UAAI,MAAM,QAAQ,UAAU;AAC1B,YAAI,MAAM;AACR,gBAAM,eAAe;AACrB,kBAAQ,KAAK;AAAA,QACf;AACA;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,aAAa;AAC7B,cAAM,eAAe;AACrB,YAAI,CAAC,MAAM;AACT,kBAAQ,IAAI;AACZ;AAAA,QACF;AACA,uBAAe,CAAC,UAAW,MAAM,WAAW,IAAI,KAAK,SAAS,MAAM,SAAS,IAAI,IAAI,QAAQ,CAAE;AAC/F;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,WAAW;AAC3B,cAAM,eAAe;AACrB,YAAI,CAAC,KAAM;AACX,uBAAe,CAAC,UAAW,MAAM,WAAW,IAAI,KAAK,SAAS,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAE;AAC/F;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,UAAU,MAAM;AAChC,cAAM,eAAe;AACrB,uBAAe,MAAM,SAAS,IAAI,EAAE;AACpC;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,SAAS,MAAM;AAC/B,cAAM,eAAe;AACrB,uBAAe,MAAM,SAAS,MAAM,SAAS,IAAI,EAAE;AACnD;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,SAAS;AACzB,YAAI,QAAQ,eAAe,KAAK,MAAM,WAAW,GAAG;AAClD,gBAAM,eAAe;AACrB,mBAAS,MAAM,WAAW,CAAC;AAC3B,kBAAQ,KAAK;AAAA,QACf,WAAW,QAAQ,eAAe;AAChC,kBAAQ,KAAK;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,OAAO,aAAa,UAAU,SAAS,aAAa;AAAA,EAC7D;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,MACrB,GAAI,QAAQ,eAAe,IAAI,EAAE,yBAAyB,GAAG,SAAS,QAAQ,WAAW,GAAG,IAAI,CAAC;AAAA,IACnG;AAAA,IACA;AAAA,IACA,UAAU,CAAC,UAAkB,GAAG,SAAS,QAAQ,KAAK;AAAA,IACtD,OAAO,QAAQ,QAAQ,QAAQ,OAAO,aAAa;AAAA,IACnD;AAAA,EACF;AACF;;;AD3FM,IAAAC,uBAAA;AA9CC,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAChB,GAAgB;AACd,QAAM,WAAiB;AAAA,IACrB,MAAM,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,YAAY;AAAA,IAC5D,CAAC,SAAS,YAAY;AAAA,EACxB;AACA,QAAM,CAAC,OAAO,QAAQ,IAAU,iBAAS,UAAU,SAAS,EAAE;AAE9D,QAAM,WAAiB,gBAAQ,MAAM;AACnC,QAAI,CAAC,MAAM,KAAK,EAAG,QAAO;AAC1B,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,WAAO,QAAQ;AAAA,MACb,CAAC,WACC,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,KACrC,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,MACpC,OAAO,UAAU,YAAY,EAAE,SAAS,CAAC,KAAK,WAC9C,OAAO,aAAa,YAAY,EAAE,SAAS,CAAC,KAAK;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,WAAW,YAAY;AAAA,IAC3B,OAAO;AAAA,IACP,UAAU,CAAC,SAAS;AAClB,eAAS,KAAK,KAAK;AACnB,sBAAgB,KAAK,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,CAAC,SAAuB;AACrC,aAAS,KAAK,KAAK;AACnB,oBAAgB,KAAK,KAAK;AAC1B,aAAS,QAAQ,KAAK;AAAA,EACxB;AAEA,SACE,+CAAC,SAAI,KAAK,SAAS,WAAW,WAAW,GAAG,mBAAmB,SAAS,GACtE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,cAAa;AAAA,QACb,cAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU,CAAC,UAAU;AACnB,mBAAS,MAAM,OAAO,KAAK;AAC3B,mBAAS,QAAQ,IAAI;AAAA,QACvB;AAAA,QACA,SAAS,MAAM;AAEb,cAAI,YAAY,UAAU,SAAS,MAAO,UAAS,EAAE;AACrD,mBAAS,QAAQ,IAAI;AAAA,QACvB;AAAA,QACA,WAAW,SAAS;AAAA,QACnB,GAAG,SAAS;AAAA;AAAA,IACf;AAAA,IACC,SAAS,aACR;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,SAAS;AAAA,UACb,MAAK;AAAA,UACL,cAAY,aAAa;AAAA,UACzB,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK,SAAS,IAAK;AAAA,YACnB,MAAM,SAAS,IAAK;AAAA,YACpB,OAAO,KAAK,IAAI,SAAS,IAAK,OAAO,GAAG;AAAA,YACxC,QAAQ;AAAA,UACV;AAAA,UACA,WAAU;AAAA,UAET,mBAAS,WAAW,IACnB,8CAAC,QAAG,MAAK,gBAAe,WAAU,2CAC/B,qBACH,IAEA,SAAS,IAAI,CAAC,QAAQ,UACpB;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI,SAAS,SAAS,KAAK;AAAA,cAC3B,MAAK;AAAA,cACL,iBAAe,SAAS,gBAAgB;AAAA,cAExC,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,cAC7C,cAAc,MAAM,SAAS,eAAe,KAAK;AAAA,cACjD,SAAS,MAAM,OAAO,MAAM;AAAA,cAC5B,WAAW;AAAA,gBACT;AAAA,gBACA,SAAS,gBAAgB,QACrB,qCACA;AAAA,cACN;AAAA,cAEA;AAAA,8DAAC,UAAK,WAAU,SAAS,iBAAO,OAAM;AAAA,gBACrC,OAAO,eACN,8CAAC,UAAK,WAAU,uCAAuC,iBAAO,aAAY;AAAA;AAAA;AAAA,YAjBvE,OAAO;AAAA,UAmBd,CACD;AAAA;AAAA,MAEL;AAAA,MACA,SAAS;AAAA,IACX;AAAA,KACJ;AAEJ;;;AE3JA,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AAuJvB,IAAAC,uBAAA;AArGN,SAAS,UAAU,OAAsD;AACvE,MAAI,OAAO,UAAU,SAAU,QAAO,EAAE,OAAO,OAAO,OAAO,MAAM;AACnE,SAAO,EAAE,OAAO,MAAM,OAAO,OAAO,MAAM,SAAS,MAAM,OAAO,OAAO,MAAM,OAAO,aAAa,MAAM,YAAY;AACrH;AAQO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,QAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAS,YAAY;AACrE,QAAM,UAAU,SAAS;AAEzB,QAAM,CAAC,cAAc,eAAe,IAAU,iBAA6B,CAAC,CAAC;AAC7E,QAAM,CAAC,SAAS,UAAU,IAAU,iBAAS,KAAK;AAClD,QAAM,YAAkB,eAAO,CAAC;AAEhC,QAAM,SAAe,gBAA4B,MAAM;AACrD,UAAM,OAAO,YAAY,eAAe,CAAC,GAAG,IAAI,SAAS;AACzD,WAAO,KAAK,IAAI,SAAS;AAAA,EAC3B,GAAG,CAAC,SAAS,WAAW,CAAC;AAIzB,EAAM,kBAAU,MAAM;AACpB,QAAI,CAAC,YAAa;AAClB,UAAMC,MAAK,EAAE,UAAU;AACvB,eAAW,IAAI;AACf,UAAM,QAAQ,WAAW,YAAY;AACnC,UAAI;AACF,cAAM,SAAS,MAAM,YAAY,OAAO;AACxC,YAAI,UAAU,YAAYA,IAAI,iBAAgB,OAAO,IAAI,SAAS,CAAC;AAAA,MACrE,QAAQ;AACN,YAAI,UAAU,YAAYA,IAAI,iBAAgB,CAAC,CAAC;AAAA,MAClD,UAAE;AACA,YAAI,UAAU,YAAYA,IAAI,YAAW,KAAK;AAAA,MAChD;AAAA,IACF,GAAG,UAAU;AACb,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,aAAa,SAAS,UAAU,CAAC;AAErC,QAAM,OAAO,cAAc,eAAe;AAE1C,QAAM,QAAc,gBAAQ,MAAM;AAChC,UAAM,IAAI,QAAQ,KAAK,EAAE,YAAY;AACrC,WAAO,KACJ,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,KAAK,OAAO,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC,EACzG,OAAO,CAAC,WAAW,OAAO,UAAU,OAAO;AAAA,EAChD,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,QAAM,WAAW,YAAY;AAAA,IAC3B,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM,EAAE;AAAA,IACrE,UAAU,CAAC,SAAS;AAClB,UAAI,UAAU,OAAW,kBAAiB,KAAK,KAAK;AACpD,sBAAgB,KAAK,KAAK;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,CAAC,WAA6B;AAC3C,QAAI,UAAU,OAAW,kBAAiB,OAAO,KAAK;AACtD,oBAAgB,OAAO,KAAK;AAC5B,aAAS,QAAQ,KAAK;AAAA,EACxB;AAGA,QAAM,UAAgB,gBAAQ,MAAM;AAClC,UAAM,MAA6E,CAAC;AACpF,QAAI;AACJ,UAAM,QAAQ,CAAC,QAAQ,UAAU;AAC/B,UAAI,OAAO,SAAS,OAAO,UAAU,WAAW;AAC9C,YAAI,KAAK,EAAE,SAAS,OAAO,OAAO,OAAO,GAAG,CAAC;AAC7C,oBAAY,OAAO;AAAA,MACrB;AACA,UAAI,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,IAC5B,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,+CAAC,SAAI,KAAK,SAAS,WAAW,WAAW,GAAG,mBAAmB,SAAS,GACtE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAa;AAAA,QACb,OAAO;AAAA,QACP,WAAW,aAAa,UAAU,SAAS;AAAA,QAC3C,UAAU,CAAC,UAAU;AACnB,cAAI,UAAU,OAAW,kBAAiB,MAAM,OAAO,KAAK;AAC5D,0BAAgB,MAAM,OAAO,KAAK;AAClC,mBAAS,QAAQ,IAAI;AAAA,QACvB;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,oBAAU,KAAK;AACf,mBAAS,QAAQ,IAAI;AAAA,QACvB;AAAA,QACA,WAAW,CAAC,UAAU;AACpB,sBAAY,KAAK;AACjB,mBAAS,eAAe,KAAK;AAAA,QAC/B;AAAA,QACC,GAAG;AAAA,QACH,GAAG,SAAS;AAAA;AAAA,IACf;AAAA,IACC,aAAa,WACZ;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM;AACb,cAAI,UAAU,OAAW,kBAAiB,EAAE;AAC5C,0BAAgB,EAAE;AAClB,mBAAS,QAAQ,IAAI;AAAA,QACvB;AAAA,QACA,cAAW;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,IAED,SAAS,aACR;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,SAAS;AAAA,UACb,MAAK;AAAA,UACL,cAAW;AAAA,UACX,aAAW,WAAW;AAAA,UACtB,OAAO;AAAA,YACL,UAAU;AAAA,YACV,KAAK,SAAS,IAAK;AAAA,YACnB,MAAM,SAAS,IAAK;AAAA,YACpB,OAAO,KAAK,IAAI,SAAS,IAAK,OAAO,GAAG;AAAA,YACxC,QAAQ;AAAA,UACV;AAAA,UACA,WAAU;AAAA,UAET,qBAAW,MAAM,WAAW,IAC3B,8CAAC,QAAG,MAAK,gBAAe,WAAU,2CAC/B,yBAAe,iBAClB,IACE,MAAM,WAAW,IACnB,8CAAC,QAAG,MAAK,gBAAe,WAAU,2CAC/B,uBAAa,kBAChB,IAEA,QAAQ;AAAA,YAAI,CAAC,OAAO,aAClB,MAAM,UACJ;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAU;AAAA,gBAET,gBAAM;AAAA;AAAA,cAJF,SAAS,MAAM,OAAO,IAAI,QAAQ;AAAA,YAKzC,IAEA;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI,SAAS,SAAS,MAAM,KAAK;AAAA,gBACjC,MAAK;AAAA,gBACL,iBAAe,SAAS,gBAAgB,MAAM;AAAA,gBAC9C,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,gBAC7C,cAAc,MAAM,SAAS,eAAe,MAAM,KAAK;AAAA,gBACvD,SAAS,MAAM,OAAO,MAAM,MAAO;AAAA,gBACnC,WAAW;AAAA,kBACT;AAAA,kBACA,SAAS,gBAAgB,MAAM,QAC3B,qCACA;AAAA,gBACN;AAAA,gBAEC,yBACC,aAAa,MAAM,QAAS,EAAE,QAAQ,SAAS,gBAAgB,MAAM,MAAM,CAAC,IAE5E,gFACE;AAAA,gEAAC,UAAK,WAAU,SAAS,gBAAM,OAAQ,OAAM;AAAA,kBAC5C,MAAM,OAAQ,eACb,8CAAC,UAAK,WAAU,8CACb,gBAAM,OAAQ,aACjB;AAAA,mBAEJ;AAAA;AAAA,cAxBG,MAAM,OAAQ;AAAA,YA0BrB;AAAA,UAEJ;AAAA;AAAA,MAEJ;AAAA,MACA,SAAS;AAAA,IACX;AAAA,KACJ;AAEJ;;;ACtQA,IAAAC,UAAuB;AAiBnB,IAAAC,uBAAA;AAFJ,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,SAAS,iBAAiB,GAAG,MAAM,GAAG,QAClD;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,CAAC,UAAU,kBAAkB,MAAM,OAAO,OAAO;AAAA,MAC3D,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,SAAS,cAAc;;;AC/BvB,IAAAC,UAAuB;AA4DjB,IAAAC,uBAAA;AA7BN,IAAM,uBAA6B,sBAAyC;AAAA,EAC1E,MAAM;AAAA,EACN,QAAQ,CAAC;AAAA,EACT,QAAQ,MAAM;AAAA,EAAC;AACjB,CAAC;AAQD,IAAM,gBAAsB;AAAA,EAC1B,CACE,EAAE,MAAM,QAAQ,OAAO,cAAc,eAAe,cAAc,YAAY,OAAO,WAAW,SAAS,GACzG,QACG;AACH,UAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAmB,gBAAgB,CAAC,CAAC;AACrF,UAAM,eAAe,SAAS;AAE9B,UAAM,SAAS,CAAC,SAAiB;AAC/B,YAAM,UAAU,aAAa,SAAS,IAAI,IACtC,aAAa,OAAO,CAAC,SAAS,SAAS,IAAI,IAC3C,CAAC,GAAG,cAAc,IAAI;AAC1B,UAAI,UAAU,OAAW,kBAAiB,OAAO;AACjD,sBAAgB,OAAO;AAAA,IACzB;AAEA,WACE,+CAAC,cAAS,KAAU,WAAW,GAAG,gBAAgB,aAAa,cAAc,2CAA2C,SAAS,GAC9H;AAAA,gBAAU,8CAAC,YAAO,WAAU,uBAAuB,kBAAO;AAAA,MAC3D,8CAAC,qBAAqB,UAArB,EAA8B,OAAO,EAAE,MAAM,QAAQ,cAAc,OAAO,GACxE,UACH;AAAA,MACC,SACC,8CAAC,OAAE,MAAK,SAAQ,WAAU,4BACvB,iBACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAa5B,IAAM,oBAA0B;AAAA,EAC9B,CAAC,EAAE,OAAO,OAAO,WAAW,IAAI,GAAG,MAAM,GAAG,QAAQ;AAClD,UAAM,QAAc,mBAAW,oBAAoB;AACnD,UAAM,cAAoB,cAAM;AAChC,UAAM,UAAU,MAAM;AAEtB,WACE,+CAAC,SAAI,WAAU,2BACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM,MAAM;AAAA,UACZ;AAAA,UACA,SAAS,MAAM,OAAO,SAAS,KAAK;AAAA,UACpC,iBAAiB,MAAM,MAAM,OAAO,KAAK;AAAA,UACzC;AAAA,UACC,GAAG;AAAA;AAAA,MACN;AAAA,MACC,SACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UAET;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AACA,kBAAkB,cAAc;;;ACrHhC,IAAAC,UAAuB;AAiBnB,IAAAC,uBAAA;AAFJ,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,SAAS,iBAAiB,GAAG,MAAM,GAAG,QAClD;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,UAAU,CAAC,UAAU,kBAAkB,MAAM,OAAO,OAAO;AAAA,MAC3D,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,MAAM,cAAc;AA0BpB,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,MAAM,QAAQ,OAAO,cAAc,eAAe,cAAc,YAAY,OAAO,WAAW,SAAS,GAAG,QAAQ;AACnH,UAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAS,gBAAgB,EAAE;AAC3E,UAAM,eAAe,SAAS;AAE9B,UAAM,eAAe,CAAC,SAAiB;AACrC,UAAI,UAAU,OAAW,kBAAiB,IAAI;AAC9C,sBAAgB,IAAI;AAAA,IACtB;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT,gBAAgB,aAAa,cAAc;AAAA,UAC3C;AAAA,QACF;AAAA,QAEC;AAAA,oBAAU,8CAAC,YAAO,WAAU,uBAAuB,kBAAO;AAAA,UAC3D,8CAAC,kBAAkB,UAAlB,EAA2B,OAAO,EAAE,MAAM,OAAO,cAAc,UAAU,aAAa,GACpF,UACH;AAAA,UACC,SACC,8CAAC,OAAE,MAAK,SAAQ,WAAU,4BACvB,iBACH;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AACA,WAAW,cAAc;AASlB,IAAM,oBAA0B,sBAAsC;AAAA,EAC3E,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU,MAAM;AAAA,EAAC;AACnB,CAAC;AAUD,IAAM,iBAAuB;AAAA,EAC3B,CAAC,EAAE,OAAO,OAAO,WAAW,IAAI,GAAG,MAAM,GAAG,QAAQ;AAClD,UAAM,QAAc,mBAAW,iBAAiB;AAChD,UAAM,cAAoB,cAAM;AAChC,UAAM,UAAU,MAAM;AAEtB,WACE,+CAAC,SAAI,WAAU,2BACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM,MAAM;AAAA,UACZ;AAAA,UACA,SAAS,MAAM,UAAU;AAAA,UACzB,iBAAiB,CAAC,YAAY,WAAW,MAAM,SAAS,KAAK;AAAA,UAC7D;AAAA,UACC,GAAG;AAAA;AAAA,MACN;AAAA,MACC,SACC,8CAAC,WAAM,SAAS,SAAS,WAAU,kFAChC,iBACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AACA,eAAe,cAAc;;;AC5I7B,IAAAC,UAAuB;AAiCjB,IAAAC,uBAAA;AAPN,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,OAAO,OAAO,aAAa,UAAU,UAAU,MAAM,UAAU,WAAW,GAAG,GAAG,QAAQ;AACzF,UAAM,QAAc,mBAAW,iBAAiB;AAChD,UAAM,cAAoB,cAAM;AAChC,UAAM,UAAU,MAAM;AAEtB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACA,UAAU,eAAe;AAAA,UACzB;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,UAAU;AAAA,cACzB,iBAAiB,CAAC,YAAY,WAAW,MAAM,SAAS,KAAK;AAAA,cAC7D;AAAA,cACA,WAAU;AAAA;AAAA,UACZ;AAAA,UACC,SAAS,8CAAC,UAAK,WAAU,oCAAoC,iBAAM;AAAA,UACnE,eAAe,8CAAC,UAAK,WAAU,iCAAiC,uBAAY;AAAA,UAC5E;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,UAAU,cAAc;;;AChExB,IAAAC,UAAuB;AAYnB,IAAAC,uBAAA;AAFJ,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,MAAM,cAAc;;;ACtBpB,IAAAC,UAAuB;AAmBnB,IAAAC,uBAAA;AAFJ,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,QAAQ,aAAa,OAAO,WAAW,UAAU,GAAG,MAAM,GAAG,QAC9D;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,kDAAkD,SAAS;AAAA,MACxE,GAAG;AAAA,MAEH;AAAA,kBAAU,8CAAC,YAAO,WAAU,wCAAwC,kBAAO;AAAA,QAC3E,eAAe,8CAAC,OAAE,WAAU,iCAAiC,uBAAY;AAAA,QACzE;AAAA,QACA,SACC,8CAAC,OAAE,MAAK,SAAQ,WAAU,4BACvB,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AACA,SAAS,cAAc;;;ACjCvB,IAAAC,UAAuB;;;ACAvB,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AAqFvB,IAAAC,uBAAA;AApEN,IAAM,MAAM;AAWZ,IAAM,UAAgB;AAAA,EACpB,CAAC,EAAE,SAAS,OAAO,OAAO,QAAQ,KAAK,WAAW,SAAS,GAAG,QAAQ;AACpE,UAAM,CAAC,MAAM,OAAO,IAAU,iBAAS,KAAK;AAC5C,UAAM,CAAC,KAAK,MAAM,IAAU,iBAA0B,IAAI;AAC1D,UAAM,YAAkB,eAA8B,IAAI;AAC1D,UAAM,WAAiB,eAA6C,IAAI;AACxE,UAAM,KAAW,cAAM;AAEvB,UAAMC,QAAa,oBAAY,MAAM;AACnC,UAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AACnD,eAAS,UAAU,WAAW,MAAM,QAAQ,IAAI,GAAG,KAAK;AAAA,IAC1D,GAAG,CAAC,KAAK,CAAC;AAEV,UAAM,OAAa,oBAAY,MAAM;AACnC,UAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AACnD,cAAQ,KAAK;AACb,aAAO,IAAI;AAAA,IACb,GAAG,CAAC,CAAC;AAEL,IAAM;AAAA,MACJ,MAAM,MAAM;AACV,YAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AAAA,MACrD;AAAA,MACA,CAAC;AAAA,IACH;AAIA,IAAM,wBAAgB,MAAM;AAC1B,UAAI,CAAC,KAAM;AACX,YAAM,OAAO,UAAU,SAAS,sBAAsB;AACtD,UAAI,CAAC,KAAM;AACX,YAAM,OACJ,SAAS,QACL,EAAE,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,GAAG,WAAW,yBAAyB,IAC7F,SAAS,WACP,EAAE,KAAK,KAAK,SAAS,KAAK,MAAM,KAAK,OAAO,KAAK,QAAQ,GAAG,WAAW,qBAAqB,IAC5F,SAAS,SACP,EAAE,KAAK,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,KAAK,OAAO,KAAK,WAAW,yBAAyB,IAC9F,EAAE,KAAK,KAAK,MAAM,KAAK,SAAS,GAAG,MAAM,KAAK,QAAQ,KAAK,WAAW,qBAAqB;AACrG,aAAO,IAAI;AACX,YAAM,mBAAmB,MAAM,KAAK;AACpC,aAAO,iBAAiB,UAAU,kBAAkB,IAAI;AACxD,aAAO,iBAAiB,UAAU,gBAAgB;AAClD,aAAO,MAAM;AACX,eAAO,oBAAoB,UAAU,kBAAkB,IAAI;AAC3D,eAAO,oBAAoB,UAAU,gBAAgB;AAAA,MACvD;AAAA,IACF,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC;AAIrB,UAAM,UAAgB,qBAAa,UAAU;AAAA,MAC3C,oBAAoB,OAAO,KAAK;AAAA,IAClC,CAAqB;AAErB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,CAAC,SAAS;AACb,oBAAU,UAAU;AACpB,cAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,mBAC9B,IAAK,KAAI,UAAU;AAAA,QAC9B;AAAA,QACA,WAAW,GAAG,wBAAwB,SAAS;AAAA,QAC/C,cAAcA;AAAA,QACd,cAAc;AAAA,QACd,gBAAgBA;AAAA,QAChB,eAAe;AAAA,QACf,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,YAAY,MAAM;AAClC,kBAAM,gBAAgB;AACtB,iBAAK;AAAA,UACP;AAAA,QACF;AAAA,QAEC;AAAA;AAAA,UACA,QACC,OACA,OAAO,aAAa,mBACpB;AAAA,YACE;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAK;AAAA,gBACL,OAAO,EAAE,UAAU,SAAS,KAAK,IAAI,KAAK,MAAM,IAAI,MAAM,WAAW,IAAI,WAAW,QAAQ,GAAG;AAAA,gBAC/F,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,YACA,SAAS;AAAA,UACX;AAAA;AAAA;AAAA,IACJ;AAAA,EAEJ;AACF;AACA,QAAQ,cAAc;;;ADzCd,IAAAC,uBAAA;AAhCR,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAsB;AACpB,QAAM,SAAS,GAAG,EAAE;AACpB,QAAM,UAAU,GAAG,EAAE;AACrB,QAAM,cAAc,QAAQ,UAAU,OAAO,SAAS;AAEtD,MAAI,UAAU;AAGd,MAAU,uBAA+B,QAAQ,KAAK,SAAS,SAAe,kBAAU;AACtF,cAAgB,qBAA6B,UAAU;AAAA,MACrD;AAAA,MACA,oBAAoB;AAAA,MACpB,GAAI,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAAA,IAC1C,CAAC;AAAA,EACH;AAEA,QAAM,YACJ,+CAAC,SAAM,SAAS,IAAI,WAAW,cAAc,YAAY,QACtD;AAAA;AAAA,IACA,YACC,gFACG;AAAA;AAAA,MACD,8CAAC,UAAK,eAAY,QAAO,WAAU,2BAA0B,eAE7D;AAAA,OACF;AAAA,KAEJ;AAGF,QAAM,cAAc,UAClB,8CAAC,WAAQ,SAAS,SAAS,MAAK,OAC9B;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY,GAAG,KAAK;AAAA,MACpB,WAAU;AAAA,MAEV,wDAAC,SAAI,SAAQ,aAAY,WAAU,eAAc,MAAK,gBAAe,eAAY,QAC/E,wDAAC,UAAK,GAAE,gKAA+J,GACzK;AAAA;AAAA,EACF,GACF,IACE;AAEJ,QAAM,cAAc,QAClB,8CAAC,OAAE,IAAI,SAAS,MAAK,SAAQ,WAAU,4BACpC,iBACH,IACE,OACF,8CAAC,OAAE,IAAI,QAAQ,WAAU,iCACtB,gBACH,IACE;AAEJ,MAAI,mBAAmB,QAAQ;AAC7B,WACE,8CAAC,SAAI,WAAW,GAAG,iCAAiC,SAAS,GAC3D,yDAAC,SAAI,WAAU,0BACb;AAAA,qDAAC,SAAI,WAAU,8CACZ;AAAA;AAAA,QACA;AAAA,SACH;AAAA,MACA,+CAAC,SAAI,WAAU,wCAGb;AAAA,uDAAC,SAAI,WAAU,mCACb;AAAA,wDAAC,SAAI,WAAU,kBAAkB,mBAAQ;AAAA,UACxC,YACC,8CAAC,UAAK,WAAU,0CAA0C,oBAAS;AAAA,WAEvE;AAAA,QACC;AAAA,SACH;AAAA,OACF,GACF;AAAA,EAEJ;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,iCAAiC,SAAS,GAC3D;AAAA,mDAAC,SAAI,WAAU,2CACb;AAAA,qDAAC,UAAK,WAAU,6BACb;AAAA;AAAA,QACA;AAAA,SACH;AAAA,MACC;AAAA,OACH;AAAA,IACC;AAAA,IACA;AAAA,KACH;AAEJ;AACA,UAAU,cAAc;;;AE5JxB,IAAAC,UAAuB;AAwBjB,IAAAC,uBAAA;AAJN,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,UAAU,WAAW,KAAK,WAAW,OAAO,GAAG,MAAM,GAAG,QAAQ;AACjE,UAAM,cAAc,WAAW,OAAO,IAAI;AAC1C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,YAAY,UAAU;AAAA,UACtB,YAAY,YAAY;AAAA,UACxB,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACA,OAAO,EAAE,GAAG,YAAY,OAAO,GAAG,MAAM;AAAA,QACvC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;;;ACvCnB,IAAAC,UAAuB;AAqDjB,IAAAC,uBAAA;AA/CN,IAAM,eAAuC;AAAA,EAC3C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAuBA,IAAM,aAAmB;AAAA,EACvB,CACE;AAAA,IACE,SAAS;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,MAAM;AACZ,UAAM,cAAc,WAAW,OAAO,IAAI;AAC1C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,WAAW,WAAW;AAAA,UACtB,WAAW,SAAS;AAAA,UACpB,WAAW,UAAU,QAAQ,aAAa,OAAO,CAAC;AAAA,UAClD,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACA,OAAO,EAAE,GAAG,YAAY,OAAO,GAAG,MAAM;AAAA,QACvC,GAAG;AAAA,QAEH;AAAA,oBAAU,OAAO,cAChB,8CAAC,YAAO,WAAU,sDAAsD,kBAAO;AAAA,UAEhF,eAAe,OAAO,cACrB,8CAAC,OAAE,WAAU,+CAA+C,uBAAY;AAAA,UAEzE;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,WAAW,cAAc;;;AC3EzB,IAAAC,UAAuB;AA4Cf,IAAAC,uBAAA;AA3BR,IAAM,SAAe;AAAA,EACnB,CAAC,EAAE,WAAW,SAAS,gBAAgB,iBAAiB,UAAU,GAAG,MAAM,GAAG,QAAQ;AACpF,UAAM,CAAC,iBAAiB,kBAAkB,IAAU,iBAAS,kBAAkB,KAAK;AACpF,UAAM,OAAO,WAAW;AAExB,UAAM,SAAS,MAAM;AACnB,UAAI,YAAY,OAAW,oBAAmB,CAAC,SAAS,CAAC,IAAI;AAC7D,wBAAkB,CAAC,IAAI;AAAA,IACzB;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,eAAe;AAAA,UACtB;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAW;AAAA,cACT;AAAA,cACA,OAAO,kBAAkB;AAAA,YAC3B;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,OAAO,cAAc;;;ACzDrB,IAAAC,UAAuB;AACvB,IAAAC,mCAAuC;AA2BnC,IAAAC,uBAAA;AAxBJ,IAAM,wBAAoB,sCAAI,sBAAsB;AAAA,EAClD,UAAU;AAAA,IACR,aAAa;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,iBAAiB;AAAA,IACf,aAAa;AAAA,EACf;AACF,CAAC;AAYD,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,WAAW,aAAa,OAAO,GAAG,MAAM,GAAG,QAC5C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAM,QAAQ,cAAc;AAAA,MAC5B,cAAY;AAAA,MACZ,oBAAkB,gBAAgB,aAAa,aAAa;AAAA,MAC5D,WAAW,GAAG,kBAAkB,EAAE,YAAY,CAAC,GAAG,SAAS;AAAA,MAC1D,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,UAAU,cAAc;AAOxB,IAAM,UAAU;;;AC7ChB,IAAAC,UAAuB;AA4BnB,IAAAC,uBAAA;AAzBJ,IAAM,iBAAiB;AAAA,EACrB,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AACR;AAiBA,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,QAAQ,OAAO,UAAU,MAAM,GAAG,MAAM,GAAG,QACvD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA,eAAe,OAAO;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,SAAS,cAAc;;;AC1CvB,IAAAC,UAAuB;AAiCf,IAAAC,uBAAA;AAhBR,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,QAAQ,GAAG,MAAM,KAAK,OAAO,GAAG,MAAM,GAAG,QAAQ;AAC7D,UAAM,UAAU,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,GAAG,GAAG;AAChD,UAAM,UAAU,MAAM,IAAK,UAAU,MAAO,MAAM;AAElD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,cAAY;AAAA,QACZ,WAAW,GAAG,6DAA6D,SAAS;AAAA,QACnF,GAAG;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI;AAAA;AAAA,QAChC;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;;;ACvCvB,IAAAC,UAAuB;AACvB,IAAAC,mCAAoB;AA6DZ,IAAAC,uBAAA;AA/CR,IAAM,cAAoB,sBAAgC;AAAA,EACxD,OAAO;AAAA,EACP,UAAU,MAAM;AAAA,EAAC;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AACR,CAAC;AAsBD,IAAM,OAAa;AAAA,EACjB,CACE,EAAE,OAAO,cAAc,eAAe,UAAU,WAAW,OAAO,MAAM,WAAW,SAAS,GAC5F,QACG;AACH,UAAM,CAAC,eAAe,gBAAgB,IAAU,iBAAS,gBAAgB,EAAE;AAC3E,UAAM,UAAU,SAAS;AACzB,UAAM,SAAe,cAAM;AAE3B,UAAM,WAAiB;AAAA,MACrB,CAAC,SAAiB;AAChB,YAAI,UAAU,OAAW,kBAAiB,IAAI;AAC9C,wBAAgB,IAAI;AAAA,MACtB;AAAA,MACA,CAAC,OAAO,aAAa;AAAA,IACvB;AAEA,WACE,8CAAC,SAAI,KAAU,WAAsB,cAAY,SAAS,gBAAc,SACtE,wDAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,OAAO,SAAS,UAAU,QAAQ,SAAS,KAAK,GAC5E,UACH,GACF;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAEnB,IAAM,uBAAmB,sCAAI,iEAAiE;AAAA,EAC5F,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS;AAAA;AAAA;AAAA,MAGT,WAAW;AAAA;AAAA,MAEX,SAAS;AAAA,IACX;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;AAKD,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QAAQ;AAChC,UAAM,MAAY,mBAAW,WAAW;AACxC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAW,GAAG,iBAAiB,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS;AAAA,QAClF,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;AAEvB,IAAM,0BAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB,EAAE,SAAS,WAAW,MAAM,KAAK;AAAA,EACpD;AACF;AAEA,IAAM,yBAAsD;AAAA,EAC1D,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAEA,IAAM,2BAAwD;AAAA,EAC5D,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX;AAQA,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,OAAO,WAAW,WAAW,GAAG,MAAM,GAAG,QAAQ;AAClD,UAAM,MAAY,mBAAW,WAAW;AACxC,UAAM,SAAS,IAAI,UAAU;AAG7B,UAAM,UAAU,CAAC,MAAiB,UAAkB;AAClD,UAAI,KAAK,WAAW,EAAG;AACvB,YAAM,QAAQ,QAAQ,KAAK,UAAU,KAAK;AAC1C,YAAM,SAAS,KAAK,IAAI;AACxB,aAAO,MAAM;AACb,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,cAAc,CAAC,WACnB,MAAM,KAAK,OAAO,eAAe,iBAAiB,cAAc,KAAK,CAAC,CAAC;AAEzE,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,QAC9B,iBAAe;AAAA,QACf,iBAAe,GAAG,IAAI,MAAM,UAAU,KAAK;AAAA,QAG3C,cAAY,SAAS,WAAW;AAAA,QAChC,UAAU,SAAS,IAAI;AAAA,QACvB,SAAS,MAAM,IAAI,SAAS,KAAK;AAAA,QACjC,WAAW,CAAC,UAAU;AACpB,sBAAY,KAAK;AACjB,cAAI,MAAM,iBAAkB;AAC5B,cAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,kBAAM,eAAe;AACrB,gBAAI,SAAS,KAAK;AAAA,UACpB,WAAW,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,aAAa;AAClE,kBAAM,eAAe;AACrB,kBAAM,OAAO,YAAY,MAAM,aAAa;AAC5C,oBAAQ,MAAM,KAAK,QAAQ,MAAM,aAAa,IAAI,CAAC;AAAA,UACrD,WAAW,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AAC/D,kBAAM,eAAe;AACrB,kBAAM,OAAO,YAAY,MAAM,aAAa;AAC5C,oBAAQ,MAAM,KAAK,QAAQ,MAAM,aAAa,IAAI,CAAC;AAAA,UACrD,WAAW,MAAM,QAAQ,QAAQ;AAC/B,kBAAM,eAAe;AACrB,oBAAQ,YAAY,MAAM,aAAa,GAAG,CAAC;AAAA,UAC7C,WAAW,MAAM,QAAQ,OAAO;AAC9B,kBAAM,eAAe;AACrB,oBAAQ,YAAY,MAAM,aAAa,GAAG,EAAE;AAAA,UAC9C;AAAA,QACF;AAAA,QACA,WAAW;AAAA,UACT,oBAAoB,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAK,CAAC;AAAA,UAC5D;AAAA,UACA,SAAS,uBAAuB,IAAI,OAAO,IAAI,yBAAyB,IAAI,OAAO;AAAA,UACnF;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,YAAY,cAAc;AAQ1B,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AACvC,UAAM,MAAY,mBAAW,WAAW;AACxC,UAAM,SAAS,IAAI,UAAU;AAE7B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,IAAI,GAAG,IAAI,MAAM,UAAU,KAAK;AAAA,QAChC,mBAAiB,GAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,QAC3C,cAAY,SAAS,WAAW;AAAA,QAChC,QAAQ,CAAC;AAAA,QACT,UAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,YAAY,cAAc;;;ACjP1B,IAAAC,UAAuB;AACvB,IAAAC,qBAAqB;AAaf,IAAAC,uBAAA;AAJN,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,WAAW,UAAU,OAAO,GAAG,MAAM,GAAG,QAAQ;AACjD,UAAM,OAAO,UAAU,0BAAO;AAC9B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,0EAA0E,SAAS;AAAA,QAChG,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAKnB,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,iCAAiC,SAAS,GAAI,GAAG,OAAO;AAEzF;AACA,WAAW,cAAc;AAKzB,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,qDAAqD,SAAS;AAAA,MAC3E,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,UAAU,cAAc;AAKxB,IAAM,kBAAwB;AAAA,EAC5B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,OAAE,KAAU,WAAW,GAAG,iCAAiC,SAAS,GAAI,GAAG,OAAO;AAEvF;AACA,gBAAgB,cAAc;AAK9B,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,YAAY,SAAS,GAAI,GAAG,OAAO;AAEpE;AACA,YAAY,cAAc;AAK1B,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,WAAW,GAAG,8BAA8B,SAAS,GAAI,GAAG,OAAO;AAEtF;AACA,WAAW,cAAc;;;AC1EzB,IAAAC,UAAuB;AAqFf,IAAAC,uBAAA;AA1ER,IAAM,mBAAyB,sBAAqC;AAAA,EAClE,WAAW,oBAAI,IAAI;AAAA,EACnB,QAAQ,MAAM;AAAA,EAAC;AAAA,EACf,aAAa;AACf,CAAC;AAwBD,IAAM,YAAkB;AAAA,EACtB,CACE;AAAA,IACE;AAAA,IACA,eAAe,CAAC;AAAA,IAChB;AAAA,IACA,cAAc;AAAA,IACd,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA,QACG;AACH,UAAM,CAAC,cAAc,eAAe,IAAU,iBAAmB,YAAY;AAC7E,UAAM,UAAU,SAAS;AAEzB,UAAM,SAAe;AAAA,MACnB,CAAC,OAAe;AACd,cAAM,OAAO,QAAQ,SAAS,EAAE,IAC5B,QAAQ,OAAO,CAAC,SAAS,SAAS,EAAE,IACpC,cACE,CAAC,EAAE,IACH,CAAC,GAAG,SAAS,EAAE;AACrB,YAAI,UAAU,OAAW,iBAAgB,IAAI;AAC7C,wBAAgB,IAAI;AAAA,MACtB;AAAA,MACA,CAAC,SAAS,aAAa,OAAO,aAAa;AAAA,IAC7C;AAEA,UAAM,cAAc,WAAW,GAAG;AAElC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA;AAAA;AAAA,UAGT;AAAA,UACA,YAAY,aAAa;AAAA,UACzB,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACA,OAAO,EAAE,GAAG,YAAY,OAAO,GAAG,MAAM;AAAA,QAExC,wDAAC,iBAAiB,UAAjB,EAA0B,OAAO,EAAE,WAAW,IAAI,IAAI,OAAO,GAAG,QAAQ,YAAY,GAClF,UACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,UAAU,cAAc;AAUxB,IAAM,gBAAsB;AAAA,EAC1B,CAAC,EAAE,IAAI,WAAW,SAAS,GAAG,QAC5B,8CAAC,SAAI,KAAU,uBAAqB,IAAI,WACtC,wDAAC,qBAAqB,UAArB,EAA8B,OAAO,EAAE,GAAG,GAAI,UAAS,GAC1D;AAEJ;AACA,cAAc,cAAc;AAE5B,IAAM,uBAA6B,sBAA8B,EAAE,IAAI,GAAG,CAAC;AAQ3E,IAAM,mBAAyB;AAAA,EAC7B,CAAC,EAAE,WAAW,UAAU,MAAM,GAAG,MAAM,GAAG,QAAQ;AAChD,UAAM,EAAE,GAAG,IAAU,mBAAW,oBAAoB;AACpD,UAAM,EAAE,WAAW,OAAO,IAAU,mBAAW,gBAAgB;AAC/D,UAAM,OAAO,UAAU,IAAI,EAAE;AAC7B,UAAM,UAAU,GAAG,EAAE;AACrB,UAAM,YAAY,GAAG,EAAE;AAEvB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,IAAI;AAAA,QACJ,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,SAAS,MAAM,OAAO,EAAE;AAAA,QACxB,WAAW;AAAA;AAAA;AAAA,UAGT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,UACA,QACC;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,WAAW,GAAG,sDAAsD,QAAQ,YAAY;AAAA,cAExF,wDAAC,cAAS,QAAO,kBAAiB;AAAA;AAAA,UACpC;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AACA,iBAAiB,cAAc;AAK/B,IAAM,mBAAyB;AAAA,EAC7B,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC1C,UAAM,EAAE,GAAG,IAAU,mBAAW,oBAAoB;AACpD,UAAM,EAAE,UAAU,IAAU,mBAAW,gBAAgB;AACvD,UAAM,OAAO,UAAU,IAAI,EAAE;AAO7B,UAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,IAAI;AACnD,IAAM,kBAAU,MAAM;AACpB,UAAI,CAAC,MAAM;AACT,oBAAY,KAAK;AACjB;AAAA,MACF;AACA,YAAM,SACJ,OAAO,OAAO,eAAe,cAC7B,OAAO,WAAW,kCAAkC,EAAE;AACxD,UAAI,QAAQ;AACV,oBAAY,IAAI;AAChB;AAAA,MACF;AACA,UAAI,SAAS;AACb,YAAM,QAAQ,sBAAsB,MAAM;AACxC,iBAAS,sBAAsB,MAAM,YAAY,IAAI,CAAC;AAAA,MACxD,CAAC;AACD,aAAO,MAAM;AACX,6BAAqB,KAAK;AAC1B,6BAAqB,MAAM;AAAA,MAC7B;AAAA,IACF,GAAG,CAAC,IAAI,CAAC;AAET,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI,GAAG,EAAE;AAAA,QACT,MAAK;AAAA,QACL,mBAAiB,GAAG,EAAE;AAAA,QACtB,QAAQ,CAAC;AAAA,QACT,WAAW;AAAA;AAAA;AAAA,UAGT,QACE;AAAA,YACE;AAAA,YACA,WAAW,oBAAoB;AAAA,UACjC;AAAA,UACF,CAAC,QAAQ;AAAA,UACT;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ,wDAAC,SAAI,WAAU,mBACb,wDAAC,SAAI,WAAU,2CAA2C,UAAS,GACrE;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,iBAAiB,cAAc;;;ACtO/B,IAAAC,UAAuB;AASjB,IAAAC,uBAAA;AAHN,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,WAAU,iCACb;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN,GACF;AAEJ;AACA,MAAM,cAAc;AAKpB,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,WAAM,KAAU,WAAW,GAAG,mBAAmB,SAAS,GAAI,GAAG,OAAO;AAE7E;AACA,YAAY,cAAc;AAK1B,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,WAAM,KAAU,WAAW,GAAG,8BAA8B,SAAS,GAAI,GAAG,OAAO;AAExF;AACA,UAAU,cAAc;AAKxB,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,yEAAyE,SAAS;AAAA,MAC/F,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,YAAY,cAAc;AAK1B,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,SAAS,cAAc;AAKvB,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,UAAU,cAAc;AAKxB,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,QAAG,KAAU,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,OAAO;AAEjF;AACA,UAAU,cAAc;AAKxB,IAAM,eAAqB;AAAA,EACzB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,aAAQ,KAAU,WAAW,GAAG,sCAAsC,SAAS,GAAI,GAAG,OAAO;AAElG;AACA,aAAa,cAAc;;;ACxG3B,IAAAC,UAAuB;;;ACAvB,IAAAC,UAAuB;AAsGjB,IAAAC,uBAAA;AAzDN,IAAM,eACJ;AASF,IAAM,aAAmB;AAAA,EACvB,CACE;AAAA,IACE,MAAM;AAAA,IACN,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,OAAO,YAAY,eAAe;AACxC,UAAM,mBACJ,UAAU,UAAa,aAAa,UAAa,WAAW,IAAI,KAAK,KAAK,QAAQ,QAAQ,IAAI;AAChG,UAAM,YAAY,KAAK,IAAI,GAAG,iBAAiB,cAAc,oBAAoB,CAAC;AAGlF,UAAM,QAAiC,CAAC;AACxC,UAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,QAAQ;AACzC,UAAM,MAAM,KAAK,IAAI,YAAY,GAAG,OAAO,QAAQ;AAEnD,UAAM,KAAK,CAAC;AACZ,QAAI,QAAQ,EAAG,OAAM,KAAK,UAAU;AACpC,aAAS,IAAI,OAAO,KAAK,KAAK,IAAK,OAAM,KAAK,CAAC;AAC/C,QAAI,MAAM,YAAY,EAAG,OAAM,KAAK,UAAU;AAC9C,QAAI,YAAY,EAAG,OAAM,KAAK,SAAS;AAEvC,UAAM,YAAY,aAAa;AAC/B,UAAM,WAAW,YAAY;AAE7B,UAAM,iBAAiB,gBAAgB,UAAU,UAAa,aAAa;AAC3E,UAAM,aAAa,aAAa,UAAa,OAAO,KAAK,WAAW,IAAI;AACxE,UAAM,WACJ,aAAa,UAAa,UAAU,SAAY,KAAK,IAAI,OAAO,OAAO,QAAQ,IAAI;AAErF,UAAM,MACJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,cAAW;AAAA,QACX,WAAW,GAAG,0CAA0C,iBAAiB,SAAY,SAAS;AAAA,QAC7F,GAAG;AAAA,QAEH;AAAA,uBACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,eAAe,CAAC;AAAA,cAC/B,UAAU,QAAQ;AAAA,cAClB,cAAW;AAAA,cACX,WAAW;AAAA,cAEV,iBAAO,SAAS;AAAA;AAAA,UACnB;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,eAAe,OAAO,CAAC;AAAA,cACtC,UAAU,QAAQ;AAAA,cAClB,cAAW;AAAA,cACX,WAAW;AAAA,cAEV,iBAAO,YAAY;AAAA;AAAA,UACtB;AAAA,UACC,MAAM;AAAA,YAAI,CAAC,OAAO,UACjB,UAAU,aACR;AAAA,cAAC;AAAA;AAAA,gBAEC,eAAY;AAAA,gBACZ,WAAU;AAAA,gBACX;AAAA;AAAA,cAHM,YAAY,KAAK;AAAA,YAKxB,IAEA;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,MAAM,eAAe,KAAK;AAAA,gBACnC,gBAAc,UAAU,OAAO,SAAS;AAAA,gBACxC,cAAY,QAAQ,KAAK;AAAA,gBACzB,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA,UAAU,OACN,kEACA;AAAA,gBACN;AAAA,gBAEC;AAAA;AAAA,cAbI;AAAA,YAcP;AAAA,UAEJ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,eAAe,OAAO,CAAC;AAAA,cACtC,UAAU,QAAQ;AAAA,cAClB,cAAW;AAAA,cACX,WAAW;AAAA,cAEV,iBAAO,QAAQ;AAAA;AAAA,UAClB;AAAA,UACC,YACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,eAAe,SAAS;AAAA,cACvC,UAAU,QAAQ;AAAA,cAClB,cAAW;AAAA,cACX,WAAW;AAAA,cAEV,iBAAO,QAAQ;AAAA;AAAA,UAClB;AAAA;AAAA;AAAA,IAEJ;AAGF,QAAI,CAAC,eAAgB,QAAO;AAE5B,WACE,+CAAC,SAAI,WAAW,GAAG,qDAAqD,SAAS,GAC/E;AAAA,oDAAC,OAAE,WAAU,iCACV,yBAAe,UAAa,aAAa,UAAa,UAAU,SAC7D,WAAW,UAAU,SAAI,QAAQ,OAAO,KAAK,IAAI,SAAS,KAC1D,QAAQ,IAAI,OAAO,SAAS,IAClC;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AACF;AACA,WAAW,cAAc;;;ADhBH,IAAAC,uBAAA;AArGtB,SAAS,cAAc,GAAY,GAAoB;AACrD,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,IAAI;AAC/D,MAAI,aAAa,QAAQ,aAAa,KAAM,QAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAC3E,QAAM,KAAK,KAAK,OAAO,KAAK,OAAO,CAAC;AACpC,QAAM,KAAK,KAAK,OAAO,KAAK,OAAO,CAAC;AACpC,SAAO,GAAG,cAAc,IAAI,QAAW,EAAE,SAAS,MAAM,aAAa,OAAO,CAAC;AAC/E;AAQO,SAAS,UAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAoB,WAAW;AAC7E,QAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,CAAC;AAExD,QAAM,OAAa,gBAAmB,MAAM;AAC1C,QAAI,YAAY,QAAW;AACzB,aAAO,YAAY,OAAO,OAAO,EAAE,KAAK,SAAS,KAAK,WAAW,MAAM;AAAA,IACzE;AACA,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,SAAS,YAAY,CAAC;AACnC,QAAM,cAAc,QAAQ;AAE5B,QAAM,YAAY,CAAC,QAAgB;AACjC,UAAM,UAA0B,MAAM,QAAQ,OAAO,KAAK,QAAQ,QAAQ,SAAS;AACnF,QAAI,YAAY,OAAW,iBAAgB,EAAE,KAAK,KAAK,QAAQ,CAAC;AAChE,mBAAe,KAAK,OAAO;AAC3B,QAAI,YAAY,gBAAgB,EAAG,SAAQ,CAAC;AAAA,EAC9C;AAEA,QAAM,UAAU,CAAC,SAAiB;AAChC,QAAI,SAAS,OAAW,iBAAgB,IAAI;AAC5C,mBAAe,IAAI;AAAA,EACrB;AAEA,QAAM,SAAe,gBAAQ,MAAM;AACjC,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,GAAG;AACrD,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,OAAO,CAAC,QACZ,OAAO,OAAO,SAAa,IAA2C,OAAO,GAAG;AAGlF,UAAM,OAAO,CAAC,GAAG,IAAI;AACrB,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,YAAM,MAAM;AAAA,QACT,EAAyC,OAAO,GAAG,KAAK,KAAK,CAAC;AAAA,QAC9D,EAAyC,OAAO,GAAG,KAAK,KAAK,CAAC;AAAA,MACjE;AACA,aAAO,KAAK,QAAQ,QAAQ,MAAM,CAAC;AAAA,IACrC,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,MAAM,OAAO,CAAC;AAExB,QAAM,YAAY,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,SAAS,QAAQ,CAAC,IAAI;AAChF,QAAM,WAAW,KAAK,IAAI,aAAa,aAAa,CAAC;AACrD,QAAM,UAAU,WACZ,OAAO,OAAO,WAAW,KAAK,UAAU,WAAW,QAAQ,IAC3D;AAEJ,QAAM,YAAY,CAAC,KAAQ,QAA4B,UAAmC;AACxF,QAAI,OAAO,KAAM,QAAO,OAAO,KAAK,KAAK,KAAK;AAC9C,UAAM,MAAO,IAA2C,OAAO,GAAG;AAClE,QAAI,OAAO,KAAM,QAAO;AACxB,QAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,SAAU,QAAO;AAC/D,WAAO,OAAO,GAAG;AAAA,EACnB;AAEA,QAAM,aAAa,CAAC,UAClB,UAAU,UAAU,eAAe,UAAU,WAAW,gBAAgB;AAE1E,SACE,+CAAC,SAAI,WAAW,GAAG,oBAAoB,SAAS,GAC9C;AAAA,kDAAC,SAAI,WAAU,0DACb;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,yBAAyB,YAAY,YAAY,YAAY,SAAS;AAAA,QAEnF;AAAA,qBAAW,8CAAC,aAAQ,WAAU,qDAAqD,mBAAQ;AAAA,UAC5F,8CAAC,WAAM,WAAW,GAAG,eAAe,gBAAgB,iCAAiC,GACnF,wDAAC,QACE,kBAAQ,IAAI,CAAC,WAAW;AACvB,kBAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,kBAAM,WAAW,CAAC,OAAO,WACrB,SACA,WACE,KAAM,QAAQ,QACZ,cACA,eACF;AACN,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,OAAM;AAAA,gBACN,aAAW;AAAA,gBACX,WAAW;AAAA,kBACT;AAAA,kBACA,WAAW,OAAO,KAAK;AAAA,kBACvB,OAAO;AAAA,gBACT;AAAA,gBAEC,iBAAO,WACN;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,UAAU,OAAO,GAAG;AAAA,oBACnC,WAAU;AAAA,oBAET;AAAA,6BAAO;AAAA,sBACR,8CAAC,UAAK,eAAY,QAAO,WAAU,qCAChC,2BACG,eAAe,WAAY,KAAM,QAAQ,QAAQ,QAAQ,SAAU,MAAM,IACzE,WACE,KAAM,QAAQ,QACZ,WACA,WACF,UACR;AAAA;AAAA;AAAA,gBACF,IAEA,OAAO;AAAA;AAAA,cA3BJ,OAAO;AAAA,YA6Bd;AAAA,UAEJ,CAAC,GACH,GACF;AAAA,UACA,8CAAC,WAAM,aAAW,WAAW,QAC1B,oBACC,MAAM;AAAA,YACJ,EAAE,SAAS,eAAe,YAAY,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE;AAAA,YACxE,CAAC,GAAG,gBACF,8CAAC,QACE,kBAAQ,IAAI,CAAC,WACZ,8CAAC,QAAoB,WAAW,GAAG,aAAa,YAAY,aAAa,WAAW,GAGlF,wDAAC,YAAS,WAAW,YAAY,YAAY,eAAe,cAAc,KAHnE,OAAO,GAIhB,CACD,KAPM,YAAY,WAAW,EAQhC;AAAA,UAEJ,IACE,QAAQ,WAAW,IACrB,8CAAC,QACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,QAAQ;AAAA,cACjB,WAAU;AAAA,cAET;AAAA;AAAA,UACH,GACF,IAEA,QAAQ,IAAI,CAAC,KAAK,UAChB;AAAA,YAAC;AAAA;AAAA,cAEC,UAAU,aAAa,IAAI;AAAA,cAC3B,SAAS,aAAa,MAAM,WAAW,GAAG,IAAI;AAAA,cAC9C,WACE,aACI,CAAC,UAAU;AACT,oBAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,wBAAM,eAAe;AACrB,6BAAW,GAAG;AAAA,gBAChB;AAAA,cACF,IACA;AAAA,cAEN,WAAW;AAAA,gBACT;AAAA,gBACA,SAAS;AAAA,gBACT,cACE;AAAA,cACJ;AAAA,cAEC,kBAAQ,IAAI,CAAC,WACZ;AAAA,gBAAC;AAAA;AAAA,kBAEC,WAAW;AAAA,oBACT;AAAA,oBACA,YAAY,YAAY,cAAc;AAAA,oBACtC,WAAW,OAAO,KAAK;AAAA,oBACvB,OAAO;AAAA,kBACT;AAAA,kBAEC,iBAAO,UACN;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,OAAO,QAAS,GAAG;AAAA,sBAClC,WAAU;AAAA,sBAET,oBAAU,KAAK,QAAQ,KAAK;AAAA;AAAA,kBAC/B,IAEA,UAAU,KAAK,QAAQ,KAAK;AAAA;AAAA,gBAjBzB,OAAO;AAAA,cAmBd,CACD;AAAA;AAAA,YA1CI,MAAM,GAAG;AAAA,UA2ChB,CACD,GAEL;AAAA;AAAA;AAAA,IACF,GACF;AAAA,IACC,YAAY,YAAY,KACvB,+CAAC,SAAI,WAAU,+DACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,aAAU;AAAA,UAER;AAAA,wBAAW,KAAK,WAAW;AAAA,YAAE;AAAA,YAAE,KAAK,IAAI,WAAW,UAAU,OAAO,MAAM;AAAA,YAAE;AAAA,YAAI;AAAA,YACjF,OAAO;AAAA;AAAA;AAAA,MACV;AAAA,MACA,8CAAC,cAAW,MAAM,UAAU,WAAsB,cAAc,SAAS;AAAA,OAC3E;AAAA,KAEJ;AAEJ;;;AE9TA,IAAAC,UAAuB;AAmBnB,IAAAC,uBAAA;AAFJ,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,SAAS,UAAU,OAAO,WAAW,WAAW,GAAG,MAAM,GAAG,QAC7D;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,SAAS,YAAY,UAAU;AAAA,QAC/B;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,KAAK,cAAc;AAqBnB,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,SAAS,UAAU,UAAU,SAAS,aAAa,UAAU,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AACvG,UAAM,UAAU;AAChB,UAAM,WAAW;AAAA,MACf;AAAA,MACA,YAAY;AAAA,MACZ,WAAW,CAAC,YAAY;AAAA,MACxB,YAAY;AAAA,MACZ;AAAA,IACF;AAEA,UAAM,OACJ,gFACG;AAAA,iBAAW,8CAAC,UAAK,WAAU,8BAA8B,mBAAQ;AAAA,MAClE,+CAAC,UAAK,WAAU,kBACd;AAAA,sDAAC,UAAK,WAAU,kBAAkB,UAAS;AAAA,QAC1C,eACC,8CAAC,UAAK,WAAU,uDAAuD,uBAAY;AAAA,SAEvF;AAAA,MACC,YAAY,8CAAC,UAAK,WAAU,4DAA4D,oBAAS;AAAA,OACpG;AAGF,WACE,8CAAC,QAAG,KAAW,GAAG,OACf,oBACC,8CAAC,YAAO,MAAK,UAAS,SAAkB,UAAoB,WAAW,GAAG,SAAS,QAAQ,GACxF,gBACH,IAEA,8CAAC,SAAI,WAAW,GAAG,SAAS,QAAQ,GAAI,gBAAK,GAEjD;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;;;AC1FvB,IAAAC,UAAuB;AAsCjB,IAAAC,uBAAA;AAnCN,IAAMC,eAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,gBAAgB;AAAA,EACpB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AACR;AAkBA,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,QAAQ,OAAO,QAAQ,QAAQ,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AACtE,UAAM,MAAO,SAAS,SAAS;AAC/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACTA,aAAY,IAAI;AAAA,UAChB,UAAU,cAAc,MAAM;AAAA,UAC9B,SAAS;AAAA,UACT,SAAS,WAAW;AAAA,UACpB;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;;;ACpDnB,IAAAC,UAAuB;AAyCjB,IAAAC,uBAAA;AApCN,IAAM,eAA6C;AAAA,EACjD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEA,IAAMC,eAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO;AACT;AAgBA,IAAM,UAAgB;AAAA,EACpB,CAAC,EAAE,OAAO,MAAM,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AACpD,UAAM,MAAM,IAAI,KAAK;AACrB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,OAAOA,aAAY,IAAI,IAAI,aAAa,KAAK;AAAA,UAC7C,SAAS;AAAA,UACT;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,QAAQ,cAAc;;;ACtDtB,IAAAC,UAAuB;AAmCR,IAAAC,uBAAA;AAdR,IAAM,aAAmB,mBAA4C,SAASC,YACnF,EAAE,MAAM,OAAO,aAAa,QAAQ,iBAAiB,OAAO,MAAM,WAAW,UAAU,GAAG,MAAM,GAChG,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,SAAS,OAAO,qBAAqB;AAAA,QACrC;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,gBAAQ,8CAAC,SAAI,WAAU,wCAAwC,gBAAK;AAAA,QACrE,8CAAC,OAAE,WAAW,GAAG,iBAAiB,SAAS,OAAO,cAAc,SAAS,GAAI,iBAAM;AAAA,QAClF,eAAe,8CAAC,OAAE,WAAU,0CAA0C,uBAAY;AAAA,QAClF;AAAA,SACC,UAAU,oBACV,+CAAC,SAAI,WAAU,yDACZ;AAAA;AAAA,UACA;AAAA,WACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;;;AC/CD,IAAAC,UAAuB;AAyBD,IAAAC,uBAAA;AANf,IAAM,aAAmB,mBAA4C,SAASC,YACnF,EAAE,OAAO,aAAa,aAAa,SAAS,WAAW,UAAU,GAAG,MAAM,GAC1E,KACA;AACA,SACE,+CAAC,SAAI,KAAU,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OACjE;AAAA,mBAAe,8CAAC,SAAI,WAAU,iCAAiC,uBAAY;AAAA,IAC5E,+CAAC,SAAI,WAAU,oDACb;AAAA,qDAAC,SAAI,WAAU,WACb;AAAA,sDAAC,QAAG,WAAU,yCAAyC,iBAAM;AAAA,QAC5D,eAAe,8CAAC,OAAE,WAAU,gDAAgD,uBAAY;AAAA,SAC3F;AAAA,MACC,WAAW,8CAAC,SAAI,WAAU,oCAAoC,mBAAQ;AAAA,OACzE;AAAA,IACC,YAAY,8CAAC,SAAI,WAAU,QAAQ,UAAS;AAAA,KAC/C;AAEJ,CAAC;;;ACpCD,IAAAC,UAAuB;AAoCjB,IAAAC,uBAAA;AAnBN,IAAM,eAA4C;AAAA,EAChD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,aAA0C,EAAE,IAAI,UAAK,MAAM,UAAK,MAAM,SAAI;AAOzE,IAAM,aAAmB,mBAA4C,SAASC,YACnF,EAAE,OAAO,OAAO,MAAM,OAAO,QAAQ,QAAQ,MAAM,WAAW,GAAG,MAAM,GACvE,KACA;AACA,SACE,+CAAC,SAAI,KAAU,WAAW,GAAG,+CAA+C,SAAS,GAAI,GAAG,OAC1F;AAAA,mDAAC,SAAI,WAAU,0CACb;AAAA,oDAAC,OAAE,WAAU,iCAAiC,iBAAM;AAAA,MACnD,QAAQ,8CAAC,UAAK,WAAU,wCAAwC,gBAAK;AAAA,OACxE;AAAA,IACA,8CAAC,OAAE,WAAU,4CAA4C,iBAAM;AAAA,KAC7D,SAAS,SACT,+CAAC,OAAE,WAAU,wCACV;AAAA,eACC,+CAAC,UAAK,WAAW,GAAG,4BAA4B,aAAa,KAAK,CAAC,GACjE;AAAA,sDAAC,UAAK,eAAY,QAAQ,qBAAW,KAAK,GAAE;AAAA,QAAO;AAAA,QAAE;AAAA,SACvD;AAAA,MAED,QAAQ,8CAAC,UAAK,WAAU,yBAAyB,gBAAK;AAAA,OACzD;AAAA,KAEJ;AAEJ,CAAC;;;ACnDD,IAAAC,UAAuB;AAuBnB,IAAAC,uBAAA;AAPG,IAAM,gBAAsB,mBAAiD,SAASC,eAC3F,EAAE,WAAW,YAAY,iBAAiB,YAAY,iBAAiB,GAAG,MAAM,GAChF,KACA;AACA,QAAM,CAAC,SAAS,UAAU,IAAU,iBAAS,KAAK;AAElD,SACE,+CAAC,SAAI,WAAW,GAAG,8BAA8B,SAAS,GACxD;AAAA,kDAAC,SAAM,KAAU,MAAM,UAAU,SAAS,YAAY,WAAU,SAAS,GAAG,OAAO;AAAA,IACnF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,gBAAc;AAAA,QACd,cAAY,UAAU,YAAY;AAAA,QAClC,SAAS,MAAM,WAAW,CAAC,YAAY,CAAC,OAAO;AAAA,QAC/C,WAAU;AAAA,QAET,oBAAU,SAAS;AAAA;AAAA,IACtB;AAAA,KACF;AAEJ,CAAC;;;ACxCD,IAAAC,UAAuB;AAqCP,IAAAC,uBAAA;AArBhB,IAAMC,eAAoE;AAAA,EACxE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAOO,IAAM,aAAmB,mBAA4C,SAASC,YACnF,EAAE,OAAO,aAAa,OAAO,QAAQ,UAAU,OAAO,MAAM,WAAW,GAAG,MAAM,GAChF,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,iFAAiF,SAAS;AAAA,MACvG,GAAG;AAAA,MAEH;AAAA,iBAAS,8CAAC,SAAI,WAAU,QAAQ,iBAAM;AAAA,QACvC,+CAAC,SAAI,WAAW,GAAG,uEAAuED,aAAY,IAAI,CAAC,GACzG;AAAA,wDAAC,QAAG,WAAU,wCAAwC,iBAAM;AAAA,UAC3D,eAAe,8CAAC,OAAE,WAAU,sCAAsC,uBAAY;AAAA,UAC/E,8CAAC,SAAI,WAAU,QAAQ,UAAS;AAAA,WAClC;AAAA,QACC,UAAU,8CAAC,SAAI,WAAU,kDAAkD,kBAAO;AAAA;AAAA;AAAA,EACrF;AAEJ,CAAC;;;AC5CD,IAAAE,UAAuB;AAkDf,IAAAC,uBAAA;AAzBD,IAAM,YAAkB,mBAA2C,SAASC,WACjF;AAAA,EACE;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,2BAAmB,UAClB;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,eAAe,MAAM,OAAO,KAAK;AAAA,YACtD,aAAa;AAAA,YACb,cAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACZ;AAAA,QAEF,8CAAC,SAAI,WAAU,qCAAqC,UAAS;AAAA,QAC5D,WACC,+CAAC,UAAO,MAAK,UAAS,SAAQ,SAAQ,MAAK,MAAK,SAAS,SAAS;AAAA;AAAA,UAC1D,cAAc,IAAI,KAAK,WAAW,MAAM;AAAA,WAChD;AAAA,QAED,YAAY,8CAAC,SAAI,WAAU,mCAAmC,oBAAS;AAAA;AAAA;AAAA,EAC1E;AAEJ,CAAC;;;ACpED,IAAAC,UAAuB;AAiCnB,IAAAC,uBAAA;AAbG,IAAM,aAAmB,mBAA8C,SAASC,YACrF,EAAE,OAAO,cAAc,eAAe,YAAY,OAAO,WAAW,GAAG,MAAM,GAC7E,KACA;AACA,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,gBAAgB,EAAE;AACjE,QAAM,UAAU,SAAS;AAEzB,QAAM,SAAS,CAAC,SAAiB;AAC/B,QAAI,UAAU,OAAW,aAAY,IAAI;AACzC,oBAAgB,IAAI;AAAA,EACtB;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,8BAA8B,SAAS,GACxD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK;AAAA,QAC9C,WAAW,aAAa,UAAU,SAAS;AAAA,QAC1C,GAAG;AAAA;AAAA,IACN;AAAA,IACC,aAAa,WACZ;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,OAAO,EAAE;AAAA,QACxB,cAAW;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KAEJ;AAEJ,CAAC;;;ACtDD,IAAAC,UAAuB;AAgCnB,IAAAC,uBAAA;AAbG,IAAM,aAAmB,mBAA8C,SAASC,YACrF,EAAE,OAAO,cAAc,eAAe,YAAY,OAAO,WAAW,GAAG,MAAM,GAC7E,KACA;AACA,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,gBAAgB,EAAE;AACjE,QAAM,UAAU,SAAS;AAEzB,QAAM,SAAS,CAAC,SAAiB;AAC/B,QAAI,UAAU,OAAW,aAAY,IAAI;AACzC,oBAAgB,IAAI;AAAA,EACtB;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,8BAA8B,SAAS,GACxD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,CAAC,UAAU,OAAO,MAAM,OAAO,KAAK;AAAA,QAC9C,WAAW,aAAa,UAAU,SAAS;AAAA,QAC1C,GAAG;AAAA;AAAA,IACN;AAAA,IACC,aAAa,WACZ;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,OAAO,EAAE;AAAA,QACxB,cAAW;AAAA,QACX,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KAEJ;AAEJ,CAAC;;;ACvDD,IAAAC,UAAuB;AAwCb,IAAAC,uBAAA;AAlBH,IAAM,UAAgB,mBAA2C,SAASC,SAC/E,EAAE,OAAO,SAAS,cAAc,cAAc,aAAa,WAAW,GAAG,MAAM,GAC/E,KACA;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,aAAa,aAAa;AAAA,QAC1C;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,QAAQ,QAAQ,UAAU,aAAa,UAAU,UAAU,YAAY;AAC7E,cAAM,cAAc,QAAQ,WAAW;AACvC,cAAM,UACJ,gFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAW;AAAA,gBACT;AAAA,gBACA,UAAU,cAAc;AAAA,gBACxB,UAAU,aAAa;AAAA,gBACvB,UAAU,cAAc;AAAA,cAC1B;AAAA,cAEC,oBAAU,aAAa,WAAM,QAAQ;AAAA;AAAA,UACxC;AAAA,UACA,+CAAC,UAAK,WAAU,WACd;AAAA,0DAAC,UAAK,WAAW,GAAG,iBAAiB,UAAU,aAAa,0BAA0B,aAAa,GAChG,eAAK,OACR;AAAA,YACC,KAAK,eACJ,8CAAC,UAAK,WAAU,uCAAuC,eAAK,aAAY;AAAA,YAE1E,8CAAC,UAAK,WAAU,WACb,oBAAU,aAAa,iBAAiB,UAAU,YAAY,oBAAoB,eACrF;AAAA,aACF;AAAA,WACF;AAGF,eACE,+CAAC,QAAoB,WAAU,kCAC5B;AAAA,wBACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,cAAc,KAAK;AAAA,cAClC,gBAAc,UAAU,YAAY,SAAS;AAAA,cAC7C,WAAU;AAAA,cAET;AAAA;AAAA,UACH,IAEA,8CAAC,SAAI,gBAAc,UAAU,YAAY,SAAS,QAAW,WAAU,0BACpE,mBACH;AAAA,UAED,gBAAgB,gBAAgB,QAAQ,MAAM,SAAS,KACtD,8CAAC,UAAK,eAAY,QAAO,WAAU,6CAA4C;AAAA,aAhB1E,KAAK,KAkBd;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ,CAAC;;;ACxFD,IAAAC,UAAuB;AAoFf,IAAAC,uBAAA;AAnER,SAAS,WAAW,OAAuB;AACzC,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;AAQO,IAAM,aAAmB,mBAA8C,SAASC,YACrF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAiB,gBAAgB,CAAC,CAAC;AACzE,QAAM,CAAC,UAAU,WAAW,IAAU,iBAAS,KAAK;AACpD,QAAM,UAAU,SAAS;AACzB,QAAM,cAAoB,cAAM;AAChC,QAAM,UAAU,MAAM;AAEtB,QAAM,SAAS,CAAC,SAAiB;AAC/B,QAAI,UAAU,OAAW,aAAY,IAAI;AACzC,oBAAgB,IAAI;AAAA,EACtB;AAEA,QAAM,MAAM,CAAC,aAA8B;AACzC,QAAI,CAAC,YAAY,SAAS,WAAW,EAAG;AACxC,UAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,WAAO,WAAW,CAAC,GAAG,SAAS,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA,EAC5D;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,uBAAuB,SAAS,GACjD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,YAAY,CAAC,UAAU;AACrB,cAAI,SAAU;AACd,gBAAM,eAAe;AACrB,sBAAY,IAAI;AAAA,QAClB;AAAA,QACA,aAAa,MAAM,YAAY,KAAK;AAAA,QACpC,QAAQ,CAAC,UAAU;AACjB,cAAI,SAAU;AACd,gBAAM,eAAe;AACrB,sBAAY,KAAK;AACjB,cAAI,MAAM,aAAa,KAAK;AAAA,QAC9B;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,QACd;AAAA,QAEA;AAAA,yDAAC,WAAM,SAAS,SAAS,WAAW,GAAG,iBAAiB,WAAW,uBAAuB,gBAAgB,GACvG;AAAA;AAAA,YACD;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,WAAU;AAAA,gBACV,UAAU,CAAC,UAAU;AACnB,sBAAI,MAAM,OAAO,KAAK;AACtB,wBAAM,OAAO,QAAQ;AAAA,gBACvB;AAAA,gBACC,GAAG;AAAA;AAAA,YACN;AAAA,aACF;AAAA,UACA,8CAAC,OAAE,WAAU,sCACV,mBAAS,SAAS,aAAa,MAAM,KAAK,kBAC7C;AAAA;AAAA;AAAA,IACF;AAAA,IAEC,QAAQ,SAAS,KAChB,8CAAC,QAAG,cAAW,kBAAiB,WAAU,aACvC,kBAAQ,IAAI,CAAC,SACZ,+CAAC,QAAmB,WAAU,qFAC5B;AAAA,qDAAC,SAAI,WAAU,WACb;AAAA,sDAAC,OAAE,WAAU,oBAAoB,eAAK,MAAK;AAAA,QAC3C,8CAAC,OAAE,WAAU,iCAAiC,qBAAW,KAAK,IAAI,GAAE;AAAA,QACnE,WAAW,KAAK,IAAI,MAAM,UACzB;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,iBAAe,SAAS,KAAK,IAAI;AAAA,YACjC,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,cAAY,aAAa,KAAK,IAAI;AAAA,YAClC,WAAU;AAAA,YAEV,wDAAC,SAAI,WAAU,qBAAoB,OAAO,EAAE,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC,IAAI,GAAG;AAAA;AAAA,QAClF;AAAA,SAEJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,OAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,UACzE,cAAY,UAAU,KAAK,IAAI;AAAA,UAC/B,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,SAxBO,KAAK,IAyBd,CACD,GACH;AAAA,KAEJ;AAEJ,CAAC;;;AC9ID,IAAAC,UAAuB;AA8Bb,IAAAC,uBAAA;AARH,IAAM,WAAiB,mBAA4C,SAASC,UACjF,EAAE,OAAO,WAAW,GAAG,MAAM,GAC7B,KACA;AACA,SACE,8CAAC,QAAG,KAAU,WAAW,GAAG,gCAAgC,SAAS,GAAI,GAAG,OACzE,gBAAM,IAAI,CAAC,MAAM,UAChB,+CAAC,QAAkC,WAAU,uBAC3C;AAAA,mDAAC,SAAI,WAAU,8BACb;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,eAAY;AAAA,UACZ,WAAW;AAAA,YACT;AAAA,YACA,KAAK,QAAQ,gCAAgC;AAAA,UAC/C;AAAA;AAAA,MACF;AAAA,MACC,QAAQ,MAAM,SAAS,KAAK,8CAAC,UAAK,eAAY,QAAO,WAAU,8BAA6B;AAAA,OAC/F;AAAA,IACA,+CAAC,SAAI,WAAW,GAAG,gBAAgB,KAAK,SAAS,YAAY,GAC1D;AAAA,WAAK,UACJ,8CAAC,OAAE,WAAU,qEAAqE,eAAK,QAAO;AAAA,MAEhG,8CAAC,OAAE,WAAU,yBAAyB,eAAK,OAAM;AAAA,MAChD,KAAK,eAAe,8CAAC,OAAE,WAAU,sCAAsC,eAAK,aAAY;AAAA,MACxF,KAAK,QAAQ,8CAAC,SAAI,WAAU,6CAA6C,eAAK,MAAK;AAAA,OACtF;AAAA,OAlBO,GAAG,KAAK,KAAK,IAAI,KAAK,EAmB/B,CACD,GACH;AAEJ,CAAC;;;ACpDD,IAAAC,UAAuB;AAkCjB,IAAAC,uBAAA;AAJN,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,KAAK,OAAO,QAAQ,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC3D,UAAM,MAAO,SAAS,SAAS;AAC/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,SAAS,yBAAyB,UAAU,UAAU,SAAS;AAAA,QAC5E,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;;;AC1CpB,IAAAC,UAAuB;AAiDjB,IAAAC,uBAAA;AA9BN,IAAM,iBAAiB;AAAA,EACrB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAM,eAAe;AAAA,EACnB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AACZ;AAOA,IAAM,OAAa;AAAA,EACjB,CACE,EAAE,YAAY,OAAO,OAAO,SAAS,MAAM,MAAM,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,MAAM,GAC9F,QACG;AACH,UAAM,MAAM;AACZ,UAAM,cAAc,WAAW,GAAG;AAClC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,cAAc,WAAW,aAAa;AAAA,UACtC,QAAQ;AAAA,UACR,SAAS,aAAa,KAAK;AAAA,UAC3B,WAAW,eAAe,OAAO;AAAA,UACjC,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACA,OAAO,EAAE,GAAG,YAAY,OAAO,GAAG,MAAM;AAAA,QACvC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAenB,IAAM,mBAAmB;AAAA,EACvB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AACZ;AAGA,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,MAAM,QAAQ,OAAO,OAAO,KAAK,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AACxE,UAAM,MAAM;AAGZ,UAAM,QAA6B;AAAA,MACjC,GAAI,SAAS,OAAO,EAAE,UAAU,EAAE,IAAI,OAAO,SAAS,YAAY,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,MAC/F,GAAI,WAAW,QAAQ,EAAE,YAAY,EAAE,IAAI,OAAO,WAAW,YAAY,SAAS,EAAE,YAAY,OAAO,MAAM,KAAK,OAAO,IAAI,CAAC;AAAA,MAC9H,GAAI,QAAQ,EAAE,WAAW,MAAM,IAAI,CAAC;AAAA,IACtC;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,GAAG,SAAS,iBAAiB,KAAK,GAAG,SAAS;AAAA,QACzD,OAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,QAC9C,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;;;AC9GvB,IAAAC,UAAuB;AAqGjB,IAAAC,uBAAA;AA/FN,IAAM,YAAoC;AAAA,EACxC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,UAAkC;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,UAAkC;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,UAAkC;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,WAAmC;AAAA,EACvC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,cAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,cAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AACA,IAAM,cAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AA2BA,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,MAAM,MAAM,KAAK,OAAO,WAAW,OAAO,GAAG,MAAM,GAAG,QAAQ;AACrG,UAAM,MAAM;AACZ,UAAM,cAAc,WAAW,GAAG;AAClC,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,CAAC,UAAU,QAAQ,UAAU,IAAI;AAAA,UACjC,CAAC,UAAU,UAAU,QAAQ,MAAM;AAAA,UACnC,CAAC,UAAU,UAAU,QAAQ,MAAM;AAAA,UACnC,CAAC,UAAU,UAAU,QAAQ,MAAM;AAAA,UACnC,YAAY;AAAA,UACZ;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,GAAI,SAAS,EAAE,qBAAqB,2BAA2B,MAAM,UAAU,IAAI,CAAC;AAAA,UACpF,GAAG,YAAY;AAAA,UACf,GAAG;AAAA,QACL;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAgBnB,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,MAAM,QAAQ,QAAQ,QAAQ,KAAK,OAAO,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC1E,UAAM,MAAM;AACZ,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT,QAAQ,SAAS,IAAI;AAAA,UACrB,UAAU,YAAY,MAAM;AAAA,UAC5B,UAAU,YAAY,MAAM;AAAA,UAC5B,UAAU,YAAY,MAAM;AAAA,UAC5B;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;;;AC1JvB,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AAC7B,IAAAC,qBAAqB;AA4Db,IAAAC,uBAAA;AAhDR,IAAM,cAAoB,sBAAgC;AAAA,EACxD,MAAM;AAAA,EACN,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,aAAa;AAAA,EACb,gBAAgB,MAAM;AAAA,EAAC;AAAA,EACvB,YAAY,EAAE,SAAS,KAAK;AAC9B,CAAC;AAgBD,IAAM,OAAa;AAAA,EACjB,CAAC,EAAE,MAAM,cAAc,WAAW,SAAS,GAAG,QAAQ;AACpD,UAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,KAAK;AAC5D,UAAM,CAAC,aAAa,cAAc,IAAU,iBAAS,EAAE;AACvD,UAAM,UAAU,QAAQ;AACxB,UAAM,aAAmB,eAA8B,IAAI;AAC3D,UAAM,UAAgB;AAAA,MACpB,CAAC,SAAgC;AAC/B,mBAAW,UAAU;AACrB,YAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,iBAC9B,IAAK,KAAI,UAAU;AAAA,MAC9B;AAAA,MACA,CAAC,GAAG;AAAA,IACN;AAEA,UAAM,UAAgB;AAAA,MACpB,CAAC,SAAkB;AACjB,YAAI,SAAS,OAAW,iBAAgB,IAAI;AAC5C,uBAAe,IAAI;AACnB,YAAI,CAAC,KAAM,gBAAe,EAAE;AAAA,MAC9B;AAAA,MACA,CAAC,MAAM,YAAY;AAAA,IACrB;AAEA,WACE,8CAAC,SAAI,KAAK,SAAS,WAAW,GAAG,yBAAyB,SAAS,GACjE;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACC,OAAO,EAAE,MAAM,SAAS,SAAS,aAAa,gBAAgB,WAAW;AAAA,QAExE;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACF;AACA,KAAK,cAAc;AAKnB,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC1C,UAAM,EAAE,MAAM,QAAQ,IAAU,mBAAW,WAAW;AACtD,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,QAC5B,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,YAAY,cAAc;AAK1B,IAAM,cAAoB;AAAA,EACxB,CAAC,EAAE,WAAW,UAAU,GAAG,MAAM,GAAG,QAAQ;AAC1C,UAAM,EAAE,MAAM,SAAS,aAAa,gBAAgB,WAAW,IAAU,mBAAW,WAAW;AAC/F,UAAM,aAAmB,eAA8B,IAAI;AAI3D,UAAM,CAAC,KAAK,MAAM,IAAU,iBAAgD,IAAI;AAChF,UAAM,WAAiB,eAAsB,CAAC,CAAC;AAE/C,IAAM,wBAAgB,MAAM;AAC1B,UAAI,CAAC,MAAM;AACT,eAAO,IAAI;AACX;AAAA,MACF;AACA,YAAMC,OAAM;AACZ,YAAM,UAAU,MAAM;AACpB,cAAM,OAAO,WAAW,SAAS,sBAAsB;AACvD,YAAI,CAAC,KAAM;AACX,eAAO,EAAE,KAAK,KAAK,SAASA,MAAK,OAAO,KAAK,IAAI,GAAG,OAAO,aAAa,KAAK,KAAK,EAAE,CAAC;AAAA,MACvF;AACA,cAAQ;AAIR,YAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,aAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,aAAO,iBAAiB,UAAU,OAAO;AACzC,aAAO,MAAM;AACX,eAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,eAAO,oBAAoB,UAAU,OAAO;AAAA,MAC9C;AAAA,IACF,GAAG,CAAC,MAAM,SAAS,UAAU,CAAC;AAG9B,IAAM,kBAAU,MAAM;AACpB,UAAI,CAAC,KAAM;AACX,eAAS,cAAc,OAAqB;AAC1C,YAAI,CAAC,WAAW,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,MACxE;AACA,eAAS,iBAAiB,eAAe,aAAa;AACtD,aAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,IACxE,GAAG,CAAC,MAAM,OAAO,CAAC;AAKlB,IAAM,kBAAU,MAAM;AACpB,UAAI,QAAQ,OAAO,WAAW,SAAS;AACrC,iBAAS,UAAU,MAAM;AAAA,UACvB,WAAW,QAAQ,iBAAiB,mCAAmC;AAAA,QACzE;AACA,iBAAS,QAAQ,CAAC,GAAG,MAAM;AAC3B,uBAAe,CAAC;AAAA,MAClB;AAAA,IACF,GAAG,CAAC,MAAM,KAAK,cAAc,CAAC;AAE9B,UAAM,YAAY,CAAC,UAA+B;AAChD,YAAM,QAAQ,SAAS;AACvB,UAAI,MAAM,QAAQ,UAAU;AAC1B,cAAM,eAAe;AACrB,gBAAQ,KAAK;AAAA,MACf,WAAW,MAAM,QAAQ,aAAa;AACpC,cAAM,eAAe;AACrB,cAAM,OAAO,cAAc,MAAM,SAAS,IAAI,cAAc,IAAI;AAChE,uBAAe,IAAI;AACnB,cAAM,IAAI,GAAG,MAAM;AAAA,MACrB,WAAW,MAAM,QAAQ,WAAW;AAClC,cAAM,eAAe;AACrB,cAAM,OAAO,cAAc,IAAI,cAAc,IAAI,MAAM,SAAS;AAChE,uBAAe,IAAI;AACnB,cAAM,IAAI,GAAG,MAAM;AAAA,MACrB,WAAW,MAAM,QAAQ,QAAQ;AAC/B,cAAM,eAAe;AACrB,uBAAe,CAAC;AAChB,cAAM,CAAC,GAAG,MAAM;AAAA,MAClB,WAAW,MAAM,QAAQ,OAAO;AAC9B,cAAM,eAAe;AACrB,uBAAe,MAAM,SAAS,CAAC;AAC/B,cAAM,MAAM,SAAS,CAAC,GAAG,MAAM;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,CAAC,OAAO,OAAO,aAAa,YAAa,QAAO;AAE7D,eAAO;AAAA,MACL;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,CAAC,SAAS;AACb,uBAAW,UAAU;AACrB,gBAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,qBAC9B,IAAK,KAAI,UAAU;AAAA,UAC9B;AAAA,UACA,MAAK;AAAA,UACL;AAAA,UACA,OAAO,EAAE,UAAU,SAAS,KAAK,IAAI,KAAK,OAAO,IAAI,OAAO,QAAQ,GAAG;AAAA,UACvE,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACC,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;AACA,YAAY,cAAc;AAU1B,IAAM,WAAiB;AAAA,EACrB,CAAC,EAAE,WAAW,aAAa,UAAU,OAAO,SAAS,GAAG,MAAM,GAAG,QAAQ;AACvE,UAAM,EAAE,QAAQ,IAAU,mBAAW,WAAW;AAChD,UAAM,OAAO,UAAU,0BAAO;AAC9B,UAAM,WAAW,UAAU,CAAC,IAAI,EAAE,MAAM,SAAkB;AAC1D,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,MAAK;AAAA,QACL,SAAS,CAAC,UAAU;AAClB,oBAAU,KAAK;AACf,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,QACF;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;AAKvB,IAAM,gBAAsB;AAAA,EAC1B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB,8CAAC,SAAI,KAAU,MAAK,aAAY,WAAW,GAAG,6BAA6B,SAAS,GAAI,GAAG,OAAO;AAEtG;AACA,cAAc,cAAc;AAK5B,IAAM,YAAkB;AAAA,EACtB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,gFAAgF,SAAS;AAAA,MACtG,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,UAAU,cAAc;;;AC/QxB,IAAAC,UAAuB;AACvB,IAAAC,mCAAuC;AA8BnC,IAAAC,uBAAA;AA3BJ,IAAM,oBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aAAa;AAAA,QACb,SAAS;AAAA,QACT,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AASA,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,SAAS,GAAG,MAAM,GAAG,QACjC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,MAAM,cAAc;AAKpB,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,gDAAgD,SAAS;AAAA,MACtE,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,WAAW,cAAc;AAKzB,IAAM,mBAAyB;AAAA,EAC7B,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,MACvD,GAAG;AAAA;AAAA,EACN;AAEJ;AACA,iBAAiB,cAAc;;;ACjE/B,IAAAC,UAAuB;AACvB,IAAAC,oBAA6B;AA4DrB,IAAAC,uBAAA;AAhDR,IAAM,iBAAuB,sBAAmC;AAAA,EAC9D,MAAM;AAAA,EACN,SAAS,MAAM;AAAA,EAAC;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY,EAAE,SAAS,KAAK;AAC9B,CAAC;AAgBD,IAAM,UAAgB;AAAA,EACpB,CAAC,EAAE,MAAM,cAAc,WAAW,SAAS,GAAG,QAAQ;AACpD,UAAM,CAAC,cAAc,eAAe,IAAU,iBAAS,KAAK;AAC5D,UAAM,UAAU,QAAQ;AACxB,UAAM,YAAkB,cAAM;AAC9B,UAAM,YAAkB,cAAM;AAC9B,UAAM,aAAmB,eAA8B,IAAI;AAC3D,UAAM,UAAgB;AAAA,MACpB,CAAC,SAAgC;AAC/B,mBAAW,UAAU;AACrB,YAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,iBAC9B,IAAK,KAAI,UAAU;AAAA,MAC9B;AAAA,MACA,CAAC,GAAG;AAAA,IACN;AAEA,UAAM,UAAgB;AAAA,MACpB,CAAC,SAAkB;AACjB,YAAI,SAAS,OAAW,iBAAgB,IAAI;AAC5C,uBAAe,IAAI;AAAA,MACrB;AAAA,MACA,CAAC,MAAM,YAAY;AAAA,IACrB;AAEA,WACE,8CAAC,SAAI,KAAK,SAAS,WAAW,GAAG,yBAAyB,SAAS,GACjE;AAAA,MAAC,eAAe;AAAA,MAAf;AAAA,QACC,OAAO,EAAE,MAAM,SAAS,SAAS,WAAW,WAAW,WAAW;AAAA,QAEjE;AAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACF;AACA,QAAQ,cAAc;AAKtB,IAAM,iBAAuB;AAAA,EAC3B,CAAC,EAAE,WAAW,UAAU,SAAS,GAAG,MAAM,GAAG,QAAQ;AACnD,UAAM,EAAE,MAAM,SAAS,WAAW,UAAU,IAAU,mBAAW,cAAc;AAC/E,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,OAAO,YAAY;AAAA,QAClC,SAAS,CAAC,UAAU;AAClB,oBAAU,KAAK;AACf,kBAAQ,CAAC,IAAI;AAAA,QACf;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AACA,eAAe,cAAc;AAK3B,IAAM,iBAAuB;AAAA,EAC3B,CAAC,EAAE,WAAW,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AACrD,UAAM,EAAE,MAAM,SAAS,WAAW,WAAW,WAAW,IAChD,mBAAW,cAAc;AACjC,UAAM,aAAmB,eAA8B,IAAI;AAI3D,UAAM,CAAC,KAAK,MAAM,IAAU,iBAAgD,IAAI;AAEhF,IAAM,wBAAgB,MAAM;AAC1B,UAAI,CAAC,MAAM;AACT,eAAO,IAAI;AACX;AAAA,MACF;AACA,YAAMC,OAAM;AACZ,YAAM,UAAU,MAAM;AACpB,cAAM,OAAO,WAAW,SAAS,sBAAsB;AACvD,YAAI,CAAC,KAAM;AACX,eAAO,EAAE,KAAK,KAAK,SAASA,MAAK,OAAO,KAAK,IAAI,GAAG,OAAO,aAAa,KAAK,KAAK,EAAE,CAAC;AAAA,MACvF;AACA,cAAQ;AACR,YAAM,WAAW,MAAM,QAAQ,KAAK;AACpC,aAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,aAAO,iBAAiB,UAAU,OAAO;AACzC,aAAO,MAAM;AACX,eAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,eAAO,oBAAoB,UAAU,OAAO;AAAA,MAC9C;AAAA,IACF,GAAG,CAAC,MAAM,SAAS,UAAU,CAAC;AAG9B,IAAM,kBAAU,MAAM;AACpB,UAAI,CAAC,KAAM;AACX,eAAS,cAAc,OAAqB;AAC1C,YAAI,CAAC,WAAW,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,MACxE;AACA,eAAS,iBAAiB,eAAe,aAAa;AACtD,aAAO,MAAM,SAAS,oBAAoB,eAAe,aAAa;AAAA,IACxE,GAAG,CAAC,MAAM,OAAO,CAAC;AAIlB,IAAM,kBAAU,MAAM;AACpB,UAAI,QAAQ,OAAO,WAAW,SAAS;AACrC,mBAAW,QAAQ,MAAM;AAAA,MAC3B;AAAA,IACF,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAI,CAAC,QAAQ,CAAC,OAAO,OAAO,aAAa,YAAa,QAAO;AAE7D,eAAO;AAAA,MACL;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,CAAC,SAAS;AACb,uBAAW,UAAU;AACrB,gBAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,qBAC9B,IAAK,KAAI,UAAU;AAAA,UAC9B;AAAA,UACA,IAAI;AAAA,UACJ,MAAK;AAAA,UACL,mBAAiB;AAAA,UACjB,UAAU;AAAA,UACV,WAAW,CAAC,UAAU;AACpB,wBAAY,KAAK;AACjB,gBAAI,MAAM,QAAQ,UAAU;AAC1B,oBAAM,gBAAgB;AACtB,sBAAQ,KAAK;AAAA,YACf;AAAA,UACF;AAAA,UACA,OAAO,EAAE,UAAU,SAAS,KAAK,IAAI,KAAK,OAAO,IAAI,OAAO,QAAQ,GAAG;AAAA,UACvE,WAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACC,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AACF;AACF,eAAe,cAAc;;;AC/L7B,IAAAC,UAAuB;AAwCX,IAAAC,uBAAA;AAZZ,IAAM,aAAmB;AAAA,EACvB,CAAC,EAAE,OAAO,YAAY,KAAK,aAAa,WAAW,GAAG,MAAM,GAAG,QAC7D;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAW;AAAA,MACX,WAAW,GAAG,+DAA+D,SAAS;AAAA,MACrF,GAAG;AAAA,MAEJ,wDAAC,QAAG,WAAU,2CACX,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,SAAS,UAAU,MAAM,SAAS;AACxC,eACE,+CAAC,QAAkC,WAAU,iCAC1C;AAAA,kBAAQ,KACP,8CAAC,UAAK,eAAY,QAAO,WAAU,4BAChC,qBACH;AAAA,UAED,KAAK,QAAQ,CAAC,SACb;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,WAAU;AAAA,cACV,SACE,cACI,CAAC,UAAU;AACT,sBAAM,eAAe;AACrB,4BAAY,MAAM,KAAK;AAAA,cACzB,IACA;AAAA,cAGL,eAAK;AAAA;AAAA,UACR,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,gBAAc,SAAS,SAAS;AAAA,cAChC,WAAW,SAAS,gCAAgC;AAAA,cAEnD,eAAK;AAAA;AAAA,UACR;AAAA,aA3BK,GAAG,KAAK,KAAK,IAAI,KAAK,EA6B/B;AAAA,MAEJ,CAAC,GACH;AAAA;AAAA,EACF;AAEJ;AACA,WAAW,cAAc;","names":["React","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","React","import_jsx_runtime","React","import_jsx_runtime","Select","import_jsx_runtime","React","import_react_slot","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","toasts","timers","dismiss","toast","React","DEFAULT_DURATION","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","FOCUSABLE","sizeClasses","React","import_jsx_runtime","TableCard","React","import_react_dom","import_jsx_runtime","SelectMenu","React","import_react_dom","React","GAP","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","id","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","React","import_react_dom","import_jsx_runtime","show","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_class_variance_authority","import_jsx_runtime","React","import_react_slot","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","React","import_jsx_runtime","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","sizeClasses","React","import_jsx_runtime","sizeClasses","React","import_jsx_runtime","EmptyState","React","import_jsx_runtime","PageHeader","React","import_jsx_runtime","MetricCard","React","import_jsx_runtime","PasswordInput","React","import_jsx_runtime","sizeClasses","AuthLayout","React","import_jsx_runtime","FilterBar","React","import_jsx_runtime","DatePicker","React","import_jsx_runtime","TimePicker","React","import_jsx_runtime","Stepper","React","import_jsx_runtime","FileUpload","React","import_jsx_runtime","Timeline","React","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","React","import_react_dom","import_react_slot","import_jsx_runtime","GAP","React","import_class_variance_authority","import_jsx_runtime","React","import_react_dom","import_jsx_runtime","GAP","React","import_jsx_runtime"]}
|