@tribepad/themis 1.6.5 → 1.6.7
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/CHANGELOG.md +14 -0
- package/dist/elements/AlertDialog/index.js +1 -1
- package/dist/elements/AlertDialog/index.js.map +1 -1
- package/dist/elements/AlertDialog/index.mjs +1 -1
- package/dist/elements/AlertDialog/index.mjs.map +1 -1
- package/dist/elements/Breadcrumbs/index.js +1 -1
- package/dist/elements/Breadcrumbs/index.js.map +1 -1
- package/dist/elements/Breadcrumbs/index.mjs +1 -1
- package/dist/elements/Breadcrumbs/index.mjs.map +1 -1
- package/dist/elements/Combobox/Combobox.d.ts.map +1 -1
- package/dist/elements/Combobox/index.js +1 -1
- package/dist/elements/Combobox/index.js.map +1 -1
- package/dist/elements/Combobox/index.mjs +1 -1
- package/dist/elements/Combobox/index.mjs.map +1 -1
- package/dist/elements/DatePicker/DatePicker.d.ts.map +1 -1
- package/dist/elements/DatePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/elements/DatePicker/index.js +1 -1
- package/dist/elements/DatePicker/index.js.map +1 -1
- package/dist/elements/DatePicker/index.mjs +1 -1
- package/dist/elements/DatePicker/index.mjs.map +1 -1
- package/dist/elements/Dropdown/Dropdown.d.ts.map +1 -1
- package/dist/elements/Dropdown/index.js +1 -1
- package/dist/elements/Dropdown/index.js.map +1 -1
- package/dist/elements/Dropdown/index.mjs +1 -1
- package/dist/elements/Dropdown/index.mjs.map +1 -1
- package/dist/elements/Filters/FilterPopover.d.ts.map +1 -1
- package/dist/elements/Filters/index.js +1 -1
- package/dist/elements/Filters/index.js.map +1 -1
- package/dist/elements/Filters/index.mjs +1 -1
- package/dist/elements/Filters/index.mjs.map +1 -1
- package/dist/elements/Modal/Modal.d.ts +1 -1
- package/dist/elements/Modal/Modal.d.ts.map +1 -1
- package/dist/elements/Modal/Modal.types.d.ts +2 -0
- package/dist/elements/Modal/Modal.types.d.ts.map +1 -1
- package/dist/elements/Modal/index.js +1 -1
- package/dist/elements/Modal/index.js.map +1 -1
- package/dist/elements/Modal/index.mjs +1 -1
- package/dist/elements/Modal/index.mjs.map +1 -1
- package/dist/elements/NumberField/NumberField.types.d.ts +1 -1
- package/dist/elements/NumberField/NumberField.types.d.ts.map +1 -1
- package/dist/elements/NumberField/index.js +1 -1
- package/dist/elements/NumberField/index.js.map +1 -1
- package/dist/elements/NumberField/index.mjs +1 -1
- package/dist/elements/NumberField/index.mjs.map +1 -1
- package/dist/elements/PageTitle/index.js +1 -1
- package/dist/elements/PageTitle/index.js.map +1 -1
- package/dist/elements/PageTitle/index.mjs +1 -1
- package/dist/elements/PageTitle/index.mjs.map +1 -1
- package/dist/elements/Panel/Panel.d.ts.map +1 -1
- package/dist/elements/Panel/index.js +1 -1
- package/dist/elements/Panel/index.js.map +1 -1
- package/dist/elements/Panel/index.mjs +1 -1
- package/dist/elements/Panel/index.mjs.map +1 -1
- package/dist/elements/Resizable/components/ResizablePopover.d.ts.map +1 -1
- package/dist/elements/Resizable/index.js +1 -1
- package/dist/elements/Resizable/index.js.map +1 -1
- package/dist/elements/Resizable/index.mjs +1 -1
- package/dist/elements/Resizable/index.mjs.map +1 -1
- package/dist/elements/Select/Select.d.ts.map +1 -1
- package/dist/elements/Select/index.js +1 -1
- package/dist/elements/Select/index.js.map +1 -1
- package/dist/elements/Select/index.mjs +1 -1
- package/dist/elements/Select/index.mjs.map +1 -1
- package/dist/elements/Sidebar/SidebarMobileDrawer.d.ts.map +1 -1
- package/dist/elements/Sidebar/index.js +1 -1
- package/dist/elements/Sidebar/index.js.map +1 -1
- package/dist/elements/Sidebar/index.mjs +1 -1
- package/dist/elements/Sidebar/index.mjs.map +1 -1
- package/dist/elements/Table/index.js +1 -1
- package/dist/elements/Table/index.js.map +1 -1
- package/dist/elements/Table/index.mjs +1 -1
- package/dist/elements/Table/index.mjs.map +1 -1
- package/dist/elements/Wizard/index.js +1 -1
- package/dist/elements/Wizard/index.js.map +1 -1
- package/dist/elements/Wizard/index.mjs +1 -1
- package/dist/elements/Wizard/index.mjs.map +1 -1
- package/dist/elements/index.js +1 -1
- package/dist/elements/index.js.map +1 -1
- package/dist/elements/index.mjs +1 -1
- package/dist/elements/index.mjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/utils/browserExtensionOverlay.d.ts +36 -0
- package/dist/utils/browserExtensionOverlay.d.ts.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +1 -1
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/elements/NumberField/NumberField.stories.tsx +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/elements/Dropdown/Dropdown.styles.ts","../../../src/elements/Dropdown/Dropdown.tsx"],"names":["cn","inputs","twMerge","clsx","menuVariants","cva","menuItemVariants","getDisplayName","type","DropdownRoot","forwardRef","defaultOpen","isOpen","onOpenChange","children","_ref","childArray","Children","hasTrigger","child","isValidElement","DropdownTrigger","hasMenu","DropdownMenu","jsx","AriaMenuTrigger","props","ref","cloneElement","AriaButton","align","side","className","placement","AriaPopover","AriaMenu","DropdownItem","onAction","isDisabled","shortcut","icon","iconRight","ariaLabel","isDropdownMenu","hasSubmenu","contentChildren","submenu","jsxs","AriaSubmenuTrigger","AriaMenuItem","ChevronRight","DropdownSeparator","memo","AriaSeparator","DropdownLabel","AriaHeader","Dropdown"],"mappings":"+WAcO,SAASA,CAAAA,CAAAA,GAAMC,CAAAA,CAA8B,CAClD,OAAOC,QAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CCVO,IAAMG,CAAAA,CAAeC,GAAAA,CAE1B,+IAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,EACX,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,CAAA,CAMaC,CAAAA,CAAmBD,GAAAA,CAE9B,qYAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,OAAA,CAAS,EACX,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,SACX,CACF,CACF,ECCA,SAASE,CAAAA,CAAeC,CAAAA,CAAmC,CACzD,GAAI,OAAOA,CAAAA,EAAS,UAAA,EAAc,OAAOA,CAAAA,EAAS,QAAA,CAChD,OAAQA,CAAAA,EAAwB,WAGpC,CAYA,IAAMC,CAAAA,CAAeC,UAAAA,CACnB,CAAC,CAAE,WAAA,CAAAC,CAAAA,CAAc,KAAA,CAAO,MAAA,CAAAC,EAAQ,YAAA,CAAAC,CAAAA,CAAc,QAAA,CAAAC,CAAS,CAAA,CAAGC,CAAAA,GAAS,CAEjE,GAAI,QAAQ,GAAA,CAAI,QAAA,GAAa,YAAA,CAAc,CACzC,IAAMC,CAAAA,CAAaC,QAAAA,CAAS,OAAA,CAAQH,CAAQ,CAAA,CACtCI,CAAAA,CAAaF,CAAAA,CAAW,IAAA,CAC3BG,CAAAA,EACCC,cAAAA,CAAeD,CAAK,IACnBA,CAAAA,CAAM,IAAA,GAASE,CAAAA,EAAmBd,CAAAA,CAAeY,CAAAA,CAAM,IAAI,CAAA,GAAM,iBAAA,CACtE,CAAA,CACMG,CAAAA,CAAUN,CAAAA,CAAW,IAAA,CACxBG,CAAAA,EACCC,cAAAA,CAAeD,CAAK,CAAA,GACnBA,EAAM,IAAA,GAASI,CAAAA,EAAgBhB,CAAAA,CAAeY,CAAAA,CAAM,IAAI,CAAA,GAAM,cAAA,CACnE,CAAA,CAEA,GAAI,CAACD,CAAAA,EAAc,CAACI,CAAAA,CAClB,MAAM,IAAI,KAAA,CACR,kFACF,CAEJ,CAEA,OACEE,GAAAA,CAACC,WAAAA,CAAA,CAAgB,WAAA,CAAad,CAAAA,CAAa,OAAQC,CAAAA,CAAQ,YAAA,CAAcC,CAAAA,CACtE,QAAA,CAAAC,CAAAA,CACH,CAEJ,CACF,CAAA,CAEAL,EAAa,WAAA,CAAc,UAAA,CAQ3B,IAAMY,CAAAA,CAAkBX,UAAAA,CACtB,CAAC,CAAE,QAAA,CAAAI,CAAAA,CAAU,GAAGY,CAAM,CAAA,CAAGC,CAAAA,GAYnBP,cAAAA,CAAeN,CAAQ,CAAA,CAClBc,aAAad,CAAAA,CAAmDY,CAAK,CAAA,CAK5EF,GAAAA,CAACK,MAAAA,CAAA,CAAW,GAAA,CAAKF,CAAAA,CAAM,GAAGD,CAAAA,CACvB,QAAA,CAAAZ,CAAAA,CACH,CAGN,EAEAO,CAAAA,CAAgB,WAAA,CAAc,kBAQ9B,IAAME,CAAAA,CAAeb,UAAAA,CACnB,CAAC,CAAE,KAAA,CAAAoB,CAAAA,CAAQ,OAAA,CAAS,IAAA,CAAAC,CAAAA,CAAO,QAAA,CAAU,SAAA,CAAAC,CAAAA,CAAW,QAAA,CAAAlB,CAAAA,CAAU,GAAGY,CAAM,CAAA,CAAGX,CAAAA,GAAS,CAE7E,IAAMkB,CAAAA,CAAY,CAAA,EAAGF,CAAI,CAAA,CAAA,EAAID,CAAK,CAAA,CAAA,CAElC,OACEN,GAAAA,CAACU,OAAAA,CAAA,CACC,SAAA,CAAWD,CAAAA,CACX,SAAA,CAAU,sZAEV,QAAA,CAAAT,GAAAA,CAACW,IAAAA,CAAA,CACC,SAAA,CAAWnC,CAAAA,CAAGI,CAAAA,CAAa,CAAE,OAAA,CAAS,SAAU,CAAC,CAAA,CAAG4B,CAAS,CAAA,CAC5D,GAAGN,CAAAA,CAEH,SAAAZ,CAAAA,CACH,CAAA,CACF,CAEJ,CACF,EAEAS,CAAAA,CAAa,WAAA,CAAc,cAAA,CAQ3B,IAAMa,CAAAA,CAAe1B,UAAAA,CACnB,CACE,CACE,QAAA,CAAAI,CAAAA,CACA,QAAA,CAAAuB,EACA,UAAA,CAAAC,CAAAA,CAAa,KAAA,CACb,QAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CACA,SAAA,CAAAT,CAAAA,CACA,YAAA,CAAcU,CAAAA,CACd,GAAGhB,CACL,CAAA,CACAX,IACG,CAEH,IAAMC,CAAAA,CAAaC,QAAAA,CAAS,OAAA,CAAQH,CAAQ,CAAA,CACtC6B,CAAAA,CAAkBxB,GACtBC,cAAAA,CAAeD,CAAK,CAAA,GACnBA,CAAAA,CAAM,IAAA,GAASI,CAAAA,EAAgBhB,CAAAA,CAAeY,CAAAA,CAAM,IAAI,CAAA,GAAM,cAAA,CAAA,CAE3DyB,CAAAA,CAAa5B,CAAAA,CAAW,IAAA,CAAK2B,CAAc,CAAA,CAG3CE,CAAAA,CAAkB7B,CAAAA,CAAW,MAAA,CAAQG,CAAAA,EAAU,CAACwB,CAAAA,CAAexB,CAAK,CAAC,CAAA,CAErE2B,EAAU9B,CAAAA,CAAW,IAAA,CAAK2B,CAAc,CAAA,CAE9C,OAAIC,CAAAA,EAAcE,CAAAA,CAGdC,IAAAA,CAACC,cAAAA,CAAA,CACC,QAAA,CAAA,CAAAD,IAAAA,CAACE,QAAAA,CAAA,CACC,YAAA,CAAYP,CAAAA,CACZ,UAAW1C,CAAAA,CAAGM,CAAAA,CAAiB,CAAE,OAAA,CAAS,SAAU,CAAC,CAAA,CAAG0B,CAAS,CAAA,CAChE,GAAGN,CAAAA,CAEH,QAAA,CAAA,CAAAc,CAAAA,EAAQhB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,OAAQ,QAAA,CAAAgB,CAAAA,CAAK,CAAA,CACtChB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,QAAA,CAAU,QAAA,CAAAqB,EAAgB,CAAA,CAC1CrB,GAAAA,CAAC0B,YAAAA,CAAA,CAAa,SAAA,CAAU,iBAAA,CAAkB,aAAA,CAAY,MAAA,CAAO,GAC/D,CAAA,CACCJ,CAAAA,CAAAA,CACH,CAAA,CAMFC,IAAAA,CAACE,QAAAA,CAAA,CACC,QAAA,CAAUZ,CAAAA,CACV,UAAA,CAAYC,CAAAA,CACZ,YAAA,CAAYI,CAAAA,CACZ,SAAA,CAAW1C,CAAAA,CAAGM,CAAAA,CAAiB,CAAE,QAAS,SAAU,CAAC,CAAA,CAAG0B,CAAS,CAAA,CAChE,GAAGN,CAAAA,CAEH,QAAA,CAAA,CAAAc,CAAAA,EAAQhB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,MAAA,CAAQ,QAAA,CAAAgB,CAAAA,CAAK,CAAA,CACtChB,IAAC,MAAA,CAAA,CAAK,SAAA,CAAU,QAAA,CAAU,QAAA,CAAAV,CAAAA,CAAS,CAAA,CAClC2B,CAAAA,EAAajB,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,SAAA,CAAW,QAAA,CAAAiB,CAAAA,CAAU,CAAA,CAClDF,CAAAA,EACCf,GAAAA,CAAC,OAAI,SAAA,CAAU,8NAAA,CACZ,QAAA,CAAAe,CAAAA,CACH,CAAA,CAAA,CAEJ,CAEJ,CACF,EAEAH,EAAa,WAAA,CAAc,cAAA,CAQ3B,IAAMe,CAAAA,CAAoBC,IAAAA,CAAK1C,UAAAA,CAC7B,CAAC,CAAE,UAAAsB,CAAAA,CAAW,GAAGN,CAAM,CAAA,CAAGX,CAAAA,GAEtBS,GAAAA,CAAC6B,SAAAA,CAAA,CACC,SAAA,CAAWrD,CAAAA,CACT,+CAAA,CACAgC,CACF,CAAA,CACC,GAAGN,CAAAA,CACN,CAGN,CAAC,EAEDyB,CAAAA,CAAkB,WAAA,CAAc,mBAAA,CAQhC,IAAMG,CAAAA,CAAgBF,IAAAA,CAAK1C,UAAAA,CACzB,CAAC,CAAE,QAAA,CAAAI,CAAAA,CAAU,SAAA,CAAAkB,CAAAA,CAAW,GAAGN,CAAM,EAAGX,CAAAA,GAEhCS,GAAAA,CAAC+B,MAAAA,CAAA,CACC,SAAA,CAAWvD,CAAAA,CACT,4DAAA,CACAgC,CACF,CAAA,CACC,GAAGN,CAAAA,CAEH,QAAA,CAAAZ,CAAAA,CACH,CAGN,CAAC,EAEDwC,EAAc,WAAA,CAAc,eAAA,CAUrB,IAAME,CAAAA,CAAW,MAAA,CAAO,MAAA,CAAO/C,CAAAA,CAAc,CAClD,QAASY,CAAAA,CACT,IAAA,CAAME,CAAAA,CACN,IAAA,CAAMa,CAAAA,CACN,SAAA,CAAWe,CAAAA,CACX,KAAA,CAAOG,CACT,CAAC","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Menu variant styles using CVA\n * @see spec.md FR-040 (CVA for variant styling - single \"default\" variant for v1)\n */\nexport const menuVariants = cva(\n // Base styles - semantic tokens with fallbacks\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-[var(--menu-border)] bg-[var(--menu-background)] text-[var(--menu-foreground)] p-1\",\n {\n variants: {\n variant: {\n default: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/**\n * Menu Item variant styles using CVA\n * @see spec.md FR-041 (CVA for item states: hover, focus, active, disabled)\n */\nexport const menuItemVariants = cva(\n // Base styles - FR-014: 44x44px minimum touch targets\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 min-h-[44px] data-[focused]:bg-[var(--menu-accent)] data-[focused]:text-[var(--menu-accent-foreground)] data-[pressed]:bg-[var(--menu-accent)] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/**\n * Type exports for variant props\n * Allows TypeScript inference of variant combinations\n */\nexport type MenuVariantProps = VariantProps<typeof menuVariants>;\nexport type MenuItemVariantProps = VariantProps<typeof menuItemVariants>;\n","\"use client\";\n\n/**\n * Dropdown Menu Component\n * Accessible dropdown menu with React Aria primitives, nested submenus, and CVA styling\n *\n * @see spec.md FR-001 to FR-054 (Dropdown Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, Children, isValidElement, type ReactNode, type ReactElement, cloneElement, type ComponentType } from 'react';\nimport type { Placement } from 'react-aria';\nimport {\n MenuTrigger as AriaMenuTrigger,\n SubmenuTrigger as AriaSubmenuTrigger,\n Button as AriaButton,\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n Separator as AriaSeparator,\n Header as AriaHeader,\n Popover as AriaPopover,\n} from 'react-aria-components';\nimport { ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { menuVariants, menuItemVariants } from './Dropdown.styles';\nimport type {\n DropdownProps,\n DropdownTriggerProps,\n DropdownMenuProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n DropdownLabelProps,\n} from './Dropdown.types';\n\n/**\n * Type-safe helper to get displayName from a component type.\n */\nfunction getDisplayName(type: unknown): string | undefined {\n if (typeof type === 'function' || typeof type === 'object') {\n return (type as ComponentType)?.displayName;\n }\n return undefined;\n}\n\n/**\n * Dropdown Root Component\n * Manages open/close state and coordinates Trigger and Menu children\n *\n * @see spec.md FR-001 to FR-007\n */\ninterface InternalDropdownProps extends DropdownProps {\n children: ReactNode;\n}\n\nconst DropdownRoot = forwardRef<HTMLDivElement, InternalDropdownProps>(\n ({ defaultOpen = false, isOpen, onOpenChange, children }, _ref) => {\n // Validate children structure in development only\n if (process.env.NODE_ENV !== 'production') {\n const childArray = Children.toArray(children);\n const hasTrigger = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === DropdownTrigger || getDisplayName(child.type) === 'DropdownTrigger')\n );\n const hasMenu = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === DropdownMenu || getDisplayName(child.type) === 'DropdownMenu')\n );\n\n if (!hasTrigger || !hasMenu) {\n throw new Error(\n 'Dropdown requires exactly one Dropdown.Trigger and one Dropdown.Menu as children'\n );\n }\n }\n\n return (\n <AriaMenuTrigger defaultOpen={defaultOpen} isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </AriaMenuTrigger>\n );\n }\n);\n\nDropdownRoot.displayName = 'Dropdown';\n\n/**\n * Dropdown.Trigger Component\n * Wraps trigger element (typically Button) with proper ARIA attributes\n *\n * @see spec.md FR-008 to FR-012\n */\nconst DropdownTrigger = forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ children, ...props }, ref) => {\n // Clone child to forward props. Note: NO `slot: 'trigger'` here —\n // `MenuTrigger` (the parent provider) injects its press behaviour into\n // the child Button via the default ButtonContext slot, not a named\n // 'trigger' slot. Adding `slot=\"trigger\"` worked in older react-aria-\n // components but 1.17+ strict-validates slots and throws\n // `Invalid slot \"trigger\". Valid slot names are \"close\".` when the\n // Dropdown is rendered inside a Dialog/Modal subtree.\n //\n // The Disclosure pattern (see Accordion.tsx) DOES require\n // `slot=\"trigger\"` — that's a different react-aria contract where\n // Disclosure's context exposes a named `trigger` slot.\n if (isValidElement(children)) {\n return cloneElement(children as ReactElement<Record<string, unknown>>, props);\n }\n\n // Fallback: wrap in AriaButton if not a React element\n return (\n <AriaButton ref={ref} {...props}>\n {children}\n </AriaButton>\n );\n }\n);\n\nDropdownTrigger.displayName = 'DropdownTrigger';\n\n/**\n * Dropdown.Menu Component\n * Renders menu with positioning, collision detection, and focus management\n *\n * @see spec.md FR-014 to FR-024\n */\nconst DropdownMenu = forwardRef<HTMLDivElement, DropdownMenuProps>(\n ({ align = 'start', side = 'bottom', className, children, ...props }, _ref) => {\n // Map align to React Aria placement\n const placement = `${side} ${align}` as Placement;\n\n return (\n <AriaPopover\n placement={placement}\n className=\"data-[entering]:motion-safe:animate-in data-[entering]:motion-safe:fade-in-0 data-[entering]:motion-safe:slide-in-from-top-2 data-[entering]:[animation-duration:250ms] data-[entering]:[animation-timing-function:cubic-bezier(0.16,1,0.3,1)] data-[exiting]:motion-safe:animate-out data-[exiting]:motion-safe:fade-out-0 data-[exiting]:motion-safe:slide-out-to-top-2 data-[exiting]:[animation-duration:150ms]\"\n >\n <AriaMenu\n className={cn(menuVariants({ variant: 'default' }), className)}\n {...props}\n >\n {children}\n </AriaMenu>\n </AriaPopover>\n );\n }\n);\n\nDropdownMenu.displayName = 'DropdownMenu';\n\n/**\n * Dropdown.Item Component\n * Menu item with action callbacks, disabled state, shortcuts, icons, and nested submenu support\n *\n * @see spec.md FR-025 to FR-034\n */\nconst DropdownItem = forwardRef<HTMLDivElement, DropdownItemProps>(\n (\n {\n children,\n onAction,\n isDisabled = false,\n shortcut,\n icon,\n iconRight,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n _ref\n ) => {\n // Check if this item contains a nested submenu\n const childArray = Children.toArray(children);\n const isDropdownMenu = (child: unknown): boolean =>\n isValidElement(child) &&\n (child.type === DropdownMenu || getDisplayName(child.type) === 'DropdownMenu');\n\n const hasSubmenu = childArray.some(isDropdownMenu);\n\n // Filter children to separate submenu from content\n const contentChildren = childArray.filter((child) => !isDropdownMenu(child));\n\n const submenu = childArray.find(isDropdownMenu);\n\n if (hasSubmenu && submenu) {\n // Render as submenu trigger using React Aria's SubmenuTrigger\n return (\n <AriaSubmenuTrigger>\n <AriaMenuItem\n aria-label={ariaLabel}\n className={cn(menuItemVariants({ variant: 'default' }), className)}\n {...props}\n >\n {icon && <span className=\"mr-2\">{icon}</span>}\n <span className=\"flex-1\">{contentChildren}</span>\n <ChevronRight className=\"ml-auto h-4 w-4\" aria-hidden=\"true\" />\n </AriaMenuItem>\n {submenu as ReactElement}\n </AriaSubmenuTrigger>\n );\n }\n\n // Regular menu item\n return (\n <AriaMenuItem\n onAction={onAction}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n className={cn(menuItemVariants({ variant: 'default' }), className)}\n {...props}\n >\n {icon && <span className=\"mr-2\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n {iconRight && <span className=\"ml-auto\">{iconRight}</span>}\n {shortcut && (\n <kbd className=\"ml-auto pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-[var(--border)] bg-[var(--accent-background)] px-1.5 font-mono text-[10px] font-medium text-[var(--menu-muted)] opacity-100\">\n {shortcut}\n </kbd>\n )}\n </AriaMenuItem>\n );\n }\n);\n\nDropdownItem.displayName = 'DropdownItem';\n\n/**\n * Dropdown.Separator Component\n * Non-focusable visual divider\n *\n * @see spec.md FR-043 to FR-045\n */\nconst DropdownSeparator = memo(forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, _ref) => {\n return (\n <AriaSeparator\n className={cn(\n '-mx-1 my-1 h-px bg-[var(--accent-background)]',\n className\n )}\n {...props}\n />\n );\n }\n));\n\nDropdownSeparator.displayName = 'DropdownSeparator';\n\n/**\n * Dropdown.Label Component\n * Non-interactive section header\n *\n * @see spec.md FR-046 to FR-048\n */\nconst DropdownLabel = memo(forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ children, className, ...props }, _ref) => {\n return (\n <AriaHeader\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold text-[var(--menu-muted)]',\n className\n )}\n {...props}\n >\n {children}\n </AriaHeader>\n );\n }\n));\n\nDropdownLabel.displayName = 'DropdownLabel';\n\n/**\n * Export compound component via Object.assign for backwards compatibility.\n * Enables `<Dropdown.Trigger>`, `<Dropdown.Menu>`, etc.\n *\n * @deprecated v2 — Remove Object.assign pattern in favour of direct named exports\n * (DropdownTrigger, DropdownMenu, DropdownItem, DropdownSeparator, DropdownLabel)\n * for better tree-shaking. See named exports below.\n */\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n Separator: DropdownSeparator,\n Label: DropdownLabel,\n});\n\n// Export individual components for flexibility\nexport { DropdownTrigger, DropdownMenu, DropdownItem, DropdownSeparator, DropdownLabel };\n\n// Export variant functions for external use\nexport { menuVariants, menuItemVariants };\n\n// Export types\nexport type {\n DropdownProps,\n DropdownTriggerProps,\n DropdownMenuProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n DropdownLabelProps,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/cn.ts","../../../src/utils/browserExtensionOverlay.ts","../../../src/elements/Dropdown/Dropdown.styles.ts","../../../src/elements/Dropdown/Dropdown.tsx"],"names":["cn","inputs","twMerge","clsx","isExtensionInjectedElement","element","node","depth","tag","root","custom","parent","createInteractOutsideGuard","consumerShouldClose","menuVariants","cva","menuItemVariants","getDisplayName","type","DropdownRoot","forwardRef","defaultOpen","isOpen","onOpenChange","children","_ref","childArray","Children","hasTrigger","child","isValidElement","DropdownTrigger","hasMenu","DropdownMenu","jsx","AriaMenuTrigger","props","ref","cloneElement","AriaButton","align","side","className","placement","AriaPopover","AriaMenu","DropdownItem","onAction","isDisabled","shortcut","icon","iconRight","ariaLabel","isDropdownMenu","hasSubmenu","contentChildren","submenu","jsxs","AriaSubmenuTrigger","AriaMenuItem","ChevronRight","DropdownSeparator","memo","AriaSeparator","DropdownLabel","AriaHeader","Dropdown"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Class Name Utility\n * Merges Tailwind CSS classes with conflict resolution\n *\n * Combines clsx for conditional classes and tailwind-merge for deduplication\n *\n * @example\n * cn('px-2 py-1', 'px-4') // => 'py-1 px-4' (px-4 overrides px-2)\n * cn('text-red-500', condition && 'text-blue-500') // => conditional application\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Detection + dismissal guard for in-page writing-assistant browser extensions\n * (Grammarly, LanguageTool, Wordtune, …).\n *\n * These extensions inject their suggestion UI as elements appended to `<body>`,\n * outside any open overlay's DOM subtree. React Aria's `isDismissable` behaviour\n * treats a click on that injected UI as an \"outside click\" and dismisses the\n * overlay — so clicking a spelling suggestion silently closes the form pop-up\n * and discards the user's in-progress correction.\n *\n * The guard below lets overlays keep open when the interaction lands on an\n * extension-injected node, while every other outside click, Escape, and the\n * close button behave exactly as before.\n */\n\nconst MAX_ANCESTOR_DEPTH = 100;\n\n/**\n * Returns `true` when `element` belongs to an injected in-page writing\n * assistant (Grammarly, LanguageTool, Wordtune, …).\n *\n * UX-ONLY heuristic. This is a deliberately spoofable DOM sniff used solely to\n * keep a form pop-up open when a writing-assistant suggestion is clicked. It is\n * NOT a security/authorization control and must never gate access to data or\n * actions (the frontend is not a security boundary). Pure function — never log\n * the element (it can reference arbitrary DOM / user content).\n */\nexport function isExtensionInjectedElement(element: Element): boolean {\n if (!(element instanceof Element)) return false;\n\n // 1. Known-vendor markers (authoritative). Walk up via parentElement, and\n // climb shadow boundaries via getRootNode().host so detection still finds\n // the <grammarly-extension> host if React Aria's shadowDOM flag is ever\n // enabled (it defaults to false today → the document-level listener\n // already receives the retargeted host, so the parentElement walk alone\n // suffices currently). Depth-bounded as a defensive guard against a\n // crafted/overridden getRootNode/host returning a cycle (which would\n // otherwise hang the tab — a client-side DoS).\n let node: Element | null = element;\n for (let depth = 0; node && depth < MAX_ANCESTOR_DEPTH; depth++) {\n const tag = node.tagName?.toLowerCase() ?? '';\n if (tag.startsWith('grammarly-')) return true; // Grammarly\n if (tag.startsWith('lt-')) return true; // LanguageTool\n if (node.hasAttribute('data-grammarly-shadow-root')) return true;\n\n if (node.parentElement) {\n node = node.parentElement;\n } else {\n const root = node.getRootNode();\n node = root instanceof ShadowRoot ? root.host : null;\n }\n }\n\n // 2. Structural fallback (best-effort, future-proofs the long tail).\n // Extensions inject their UI as a custom element (hyphenated tag name)\n // mounted as a top-level sibling of the React root — i.e. a direct child\n // of <body>/<html>. Our app never renders body-level custom elements, and\n // React Aria portals render plain <div>s, so this stays safe for any\n // future first-party web component nested inside the app tree.\n let custom: Element | null = element;\n while (custom && !custom.tagName.includes('-')) {\n custom = custom.parentElement;\n }\n if (!custom) return false;\n\n const parent = custom.parentElement;\n return parent === document.body || parent === document.documentElement;\n}\n\n/**\n * Builds a `shouldCloseOnInteractOutside` predicate for React Aria overlays\n * that keeps the overlay open when the interaction targets an extension-injected\n * element, while preserving any consumer-supplied predicate.\n *\n * React Aria semantics: the predicate returns `true` ⇒ the overlay should\n * close. So we close only when the element is NOT extension-injected AND the\n * consumer (if any) also agrees it should close.\n */\nexport function createInteractOutsideGuard(\n consumerShouldClose?: (element: Element) => boolean,\n): (element: Element) => boolean {\n return (element: Element): boolean =>\n !isExtensionInjectedElement(element) && (consumerShouldClose?.(element) ?? true);\n}\n","import { cva, type VariantProps } from 'class-variance-authority';\n\n/**\n * Menu variant styles using CVA\n * @see spec.md FR-040 (CVA for variant styling - single \"default\" variant for v1)\n */\nexport const menuVariants = cva(\n // Base styles - semantic tokens with fallbacks\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border border-[var(--menu-border)] bg-[var(--menu-background)] text-[var(--menu-foreground)] p-1\",\n {\n variants: {\n variant: {\n default: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/**\n * Menu Item variant styles using CVA\n * @see spec.md FR-041 (CVA for item states: hover, focus, active, disabled)\n */\nexport const menuItemVariants = cva(\n // Base styles - FR-014: 44x44px minimum touch targets\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 min-h-[44px] data-[focused]:bg-[var(--menu-accent)] data-[focused]:text-[var(--menu-accent-foreground)] data-[pressed]:bg-[var(--menu-accent)] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n);\n\n/**\n * Type exports for variant props\n * Allows TypeScript inference of variant combinations\n */\nexport type MenuVariantProps = VariantProps<typeof menuVariants>;\nexport type MenuItemVariantProps = VariantProps<typeof menuItemVariants>;\n","\"use client\";\n\n/**\n * Dropdown Menu Component\n * Accessible dropdown menu with React Aria primitives, nested submenus, and CVA styling\n *\n * @see spec.md FR-001 to FR-054 (Dropdown Component Requirements)\n * @see spec.md FR-009 (WCAG 2.2 AAA - 7:1 contrast ratio)\n * @see spec.md FR-014 (44x44px minimum touch targets)\n * @see constitution.md Principle IV (Accessibility First)\n */\n\nimport { forwardRef, memo, Children, isValidElement, type ReactNode, type ReactElement, cloneElement, type ComponentType } from 'react';\nimport type { Placement } from 'react-aria';\nimport {\n MenuTrigger as AriaMenuTrigger,\n SubmenuTrigger as AriaSubmenuTrigger,\n Button as AriaButton,\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n Separator as AriaSeparator,\n Header as AriaHeader,\n Popover as AriaPopover,\n} from 'react-aria-components';\nimport { ChevronRight } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { createInteractOutsideGuard } from '../../utils/browserExtensionOverlay';\nimport { menuVariants, menuItemVariants } from './Dropdown.styles';\nimport type {\n DropdownProps,\n DropdownTriggerProps,\n DropdownMenuProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n DropdownLabelProps,\n} from './Dropdown.types';\n\n/**\n * Type-safe helper to get displayName from a component type.\n */\nfunction getDisplayName(type: unknown): string | undefined {\n if (typeof type === 'function' || typeof type === 'object') {\n return (type as ComponentType)?.displayName;\n }\n return undefined;\n}\n\n/**\n * Dropdown Root Component\n * Manages open/close state and coordinates Trigger and Menu children\n *\n * @see spec.md FR-001 to FR-007\n */\ninterface InternalDropdownProps extends DropdownProps {\n children: ReactNode;\n}\n\nconst DropdownRoot = forwardRef<HTMLDivElement, InternalDropdownProps>(\n ({ defaultOpen = false, isOpen, onOpenChange, children }, _ref) => {\n // Validate children structure in development only\n if (process.env.NODE_ENV !== 'production') {\n const childArray = Children.toArray(children);\n const hasTrigger = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === DropdownTrigger || getDisplayName(child.type) === 'DropdownTrigger')\n );\n const hasMenu = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === DropdownMenu || getDisplayName(child.type) === 'DropdownMenu')\n );\n\n if (!hasTrigger || !hasMenu) {\n throw new Error(\n 'Dropdown requires exactly one Dropdown.Trigger and one Dropdown.Menu as children'\n );\n }\n }\n\n return (\n <AriaMenuTrigger defaultOpen={defaultOpen} isOpen={isOpen} onOpenChange={onOpenChange}>\n {children}\n </AriaMenuTrigger>\n );\n }\n);\n\nDropdownRoot.displayName = 'Dropdown';\n\n/**\n * Dropdown.Trigger Component\n * Wraps trigger element (typically Button) with proper ARIA attributes\n *\n * @see spec.md FR-008 to FR-012\n */\nconst DropdownTrigger = forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ children, ...props }, ref) => {\n // Clone child to forward props. Note: NO `slot: 'trigger'` here —\n // `MenuTrigger` (the parent provider) injects its press behaviour into\n // the child Button via the default ButtonContext slot, not a named\n // 'trigger' slot. Adding `slot=\"trigger\"` worked in older react-aria-\n // components but 1.17+ strict-validates slots and throws\n // `Invalid slot \"trigger\". Valid slot names are \"close\".` when the\n // Dropdown is rendered inside a Dialog/Modal subtree.\n //\n // The Disclosure pattern (see Accordion.tsx) DOES require\n // `slot=\"trigger\"` — that's a different react-aria contract where\n // Disclosure's context exposes a named `trigger` slot.\n if (isValidElement(children)) {\n return cloneElement(children as ReactElement<Record<string, unknown>>, props);\n }\n\n // Fallback: wrap in AriaButton if not a React element\n return (\n <AriaButton ref={ref} {...props}>\n {children}\n </AriaButton>\n );\n }\n);\n\nDropdownTrigger.displayName = 'DropdownTrigger';\n\n/**\n * Dropdown.Menu Component\n * Renders menu with positioning, collision detection, and focus management\n *\n * @see spec.md FR-014 to FR-024\n */\nconst DropdownMenu = forwardRef<HTMLDivElement, DropdownMenuProps>(\n ({ align = 'start', side = 'bottom', className, children, ...props }, _ref) => {\n // Map align to React Aria placement\n const placement = `${side} ${align}` as Placement;\n\n return (\n <AriaPopover\n placement={placement}\n shouldCloseOnInteractOutside={createInteractOutsideGuard()}\n className=\"data-[entering]:motion-safe:animate-in data-[entering]:motion-safe:fade-in-0 data-[entering]:motion-safe:slide-in-from-top-2 data-[entering]:[animation-duration:250ms] data-[entering]:[animation-timing-function:cubic-bezier(0.16,1,0.3,1)] data-[exiting]:motion-safe:animate-out data-[exiting]:motion-safe:fade-out-0 data-[exiting]:motion-safe:slide-out-to-top-2 data-[exiting]:[animation-duration:150ms]\"\n >\n <AriaMenu\n className={cn(menuVariants({ variant: 'default' }), className)}\n {...props}\n >\n {children}\n </AriaMenu>\n </AriaPopover>\n );\n }\n);\n\nDropdownMenu.displayName = 'DropdownMenu';\n\n/**\n * Dropdown.Item Component\n * Menu item with action callbacks, disabled state, shortcuts, icons, and nested submenu support\n *\n * @see spec.md FR-025 to FR-034\n */\nconst DropdownItem = forwardRef<HTMLDivElement, DropdownItemProps>(\n (\n {\n children,\n onAction,\n isDisabled = false,\n shortcut,\n icon,\n iconRight,\n className,\n 'aria-label': ariaLabel,\n ...props\n },\n _ref\n ) => {\n // Check if this item contains a nested submenu\n const childArray = Children.toArray(children);\n const isDropdownMenu = (child: unknown): boolean =>\n isValidElement(child) &&\n (child.type === DropdownMenu || getDisplayName(child.type) === 'DropdownMenu');\n\n const hasSubmenu = childArray.some(isDropdownMenu);\n\n // Filter children to separate submenu from content\n const contentChildren = childArray.filter((child) => !isDropdownMenu(child));\n\n const submenu = childArray.find(isDropdownMenu);\n\n if (hasSubmenu && submenu) {\n // Render as submenu trigger using React Aria's SubmenuTrigger\n return (\n <AriaSubmenuTrigger>\n <AriaMenuItem\n aria-label={ariaLabel}\n className={cn(menuItemVariants({ variant: 'default' }), className)}\n {...props}\n >\n {icon && <span className=\"mr-2\">{icon}</span>}\n <span className=\"flex-1\">{contentChildren}</span>\n <ChevronRight className=\"ml-auto h-4 w-4\" aria-hidden=\"true\" />\n </AriaMenuItem>\n {submenu as ReactElement}\n </AriaSubmenuTrigger>\n );\n }\n\n // Regular menu item\n return (\n <AriaMenuItem\n onAction={onAction}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n className={cn(menuItemVariants({ variant: 'default' }), className)}\n {...props}\n >\n {icon && <span className=\"mr-2\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n {iconRight && <span className=\"ml-auto\">{iconRight}</span>}\n {shortcut && (\n <kbd className=\"ml-auto pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border border-[var(--border)] bg-[var(--accent-background)] px-1.5 font-mono text-[10px] font-medium text-[var(--menu-muted)] opacity-100\">\n {shortcut}\n </kbd>\n )}\n </AriaMenuItem>\n );\n }\n);\n\nDropdownItem.displayName = 'DropdownItem';\n\n/**\n * Dropdown.Separator Component\n * Non-focusable visual divider\n *\n * @see spec.md FR-043 to FR-045\n */\nconst DropdownSeparator = memo(forwardRef<HTMLDivElement, DropdownSeparatorProps>(\n ({ className, ...props }, _ref) => {\n return (\n <AriaSeparator\n className={cn(\n '-mx-1 my-1 h-px bg-[var(--accent-background)]',\n className\n )}\n {...props}\n />\n );\n }\n));\n\nDropdownSeparator.displayName = 'DropdownSeparator';\n\n/**\n * Dropdown.Label Component\n * Non-interactive section header\n *\n * @see spec.md FR-046 to FR-048\n */\nconst DropdownLabel = memo(forwardRef<HTMLDivElement, DropdownLabelProps>(\n ({ children, className, ...props }, _ref) => {\n return (\n <AriaHeader\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold text-[var(--menu-muted)]',\n className\n )}\n {...props}\n >\n {children}\n </AriaHeader>\n );\n }\n));\n\nDropdownLabel.displayName = 'DropdownLabel';\n\n/**\n * Export compound component via Object.assign for backwards compatibility.\n * Enables `<Dropdown.Trigger>`, `<Dropdown.Menu>`, etc.\n *\n * @deprecated v2 — Remove Object.assign pattern in favour of direct named exports\n * (DropdownTrigger, DropdownMenu, DropdownItem, DropdownSeparator, DropdownLabel)\n * for better tree-shaking. See named exports below.\n */\nexport const Dropdown = Object.assign(DropdownRoot, {\n Trigger: DropdownTrigger,\n Menu: DropdownMenu,\n Item: DropdownItem,\n Separator: DropdownSeparator,\n Label: DropdownLabel,\n});\n\n// Export individual components for flexibility\nexport { DropdownTrigger, DropdownMenu, DropdownItem, DropdownSeparator, DropdownLabel };\n\n// Export variant functions for external use\nexport { menuVariants, menuItemVariants };\n\n// Export types\nexport type {\n DropdownProps,\n DropdownTriggerProps,\n DropdownMenuProps,\n DropdownItemProps,\n DropdownSeparatorProps,\n DropdownLabelProps,\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterPopover.d.ts","sourceRoot":"","sources":["../../../src/elements/Filters/FilterPopover.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"FilterPopover.d.ts","sourceRoot":"","sources":["../../../src/elements/Filters/FilterPopover.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAavC,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,QAAQ,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC,CAAC;IACzD,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,KAAe,EACf,SAAS,GACV,EAAE,kBAAkB,GAAG,SAAS,CAuChC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var react=require('react'),reactAria=require('react-aria'),lucideReact=require('lucide-react'),reactAriaComponents=require('react-aria-components'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function m(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var te="data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2",me="data-[pressed]:scale-[0.97]";var Z="hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground",re="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",ae="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground",Xe="disabled:pointer-events-none disabled:opacity-50",wt=`${te} ${me} ${Z} ${re} ${ae}`;var Ze={sm:"text-xs",default:"text-sm",lg:"text-base"};var Te={sm:"h-9",default:"h-10",lg:"h-11"},B={sm:`${Te.sm} px-2 text-xs`,default:`${Te.default} px-3 text-sm`,lg:`${Te.lg} px-4 text-base`},K="min-h-[44px] flex items-center";var Ke=classVarianceAuthority.cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),Qe=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]",link:"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-6 text-base",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var Dt=react.createContext(null);Dt.displayName="ButtonGroupContext";function Bt(){return react.useContext(Dt)}var Ot=react.createContext(null);Ot.displayName="ButtonGroupItemContext";function Gt(){return react.useContext(Ot)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var Mt=classVarianceAuthority.cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});classVarianceAuthority.cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var _=react.memo(react.forwardRef(({className:e,buttonVisualClassName:t,variant:r,size:a,visualSize:n,fullWidth:s,loading:d=false,loadingText:i="Loading...",shortcut:u,children:p,isDisabled:f,paywall:l=false,paywallRedirect:o,paywallDescription:c,onPress:b,...g},y)=>{let h=react.useId(),C=Bt(),E=Gt(),v=r??C?.variant??"default",V=a??C?.size,w=f??C?.isDisabled??false,T=C?.orientation==="vertical",I=s||T,M=E?Mt({orientation:C?.orientation??"horizontal",position:E.position}):"",k=n??V??"default";return process.env.NODE_ENV!=="production"&&(k==="dot"||k==="icon")&&!g["aria-label"]&&!p&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsxRuntime.jsx(reactAriaComponents.Button,{ref:y,isDisabled:w||d||void 0,"aria-disabled":l?true:void 0,"aria-describedby":l?h:void 0,onPress:x=>{if(l){o&&window.open(o,"_blank","noopener,noreferrer");return}b?.(x);},className:m(Ke({fullWidth:I,inVerticalGroup:T}),e),...g,children:x=>jsxRuntime.jsxs("span",{className:m(Qe({variant:v,visualSize:k,paywall:l,fullWidth:I}),M,t,me,"",re,ae),"data-pressed":x.isPressed||void 0,children:[d&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:i})]}),!d&&p,l&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxRuntime.jsxs("span",{id:h,className:"sr-only",children:["Premium feature: ",c||"Upgrade required to access this feature"]}),x.isFocusVisible&&u&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:u})]})})}));_.displayName="Button";var Ht=()=>jsxRuntime.jsxs("svg",{"data-testid":"password-toggle-icon-show",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M1 8s3-5 7-5 7 5 7 5-3 5-7 5-7-5-7-5z"}),jsxRuntime.jsx("circle",{cx:"8",cy:"8",r:"2"})]}),zt=()=>jsxRuntime.jsxs("svg",{"data-testid":"password-toggle-icon-hide",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M10.5 5.5l-5 5"}),jsxRuntime.jsx("path",{d:"M1 8s3-5 7-5c1.5 0 2.8.6 4 1.5M15 8s-1.5 2.5-4 4"}),jsxRuntime.jsx("path",{d:"M3 13l2-2m7-7l2-2"}),jsxRuntime.jsx("circle",{cx:"8",cy:"8",r:"2"})]});var rt=classVarianceAuthority.cva("flex w-full rounded-md border bg-[var(--content-background)] px-3 py-2 text-sm ring-offset-[var(--content-background)] file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[var(--content-foreground)] placeholder:text-[var(--menu-muted)] transition-all duration-200",{variants:{size:{sm:`${B.sm} py-1`,default:`${B.default} py-2`,lg:`${B.lg} py-3`},state:{default:"border-[var(--input-border)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2",error:"border-[var(--destructive-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--destructive-background)] focus-visible:ring-offset-2",success:"border-[var(--success-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--success-ring)] focus-visible:ring-offset-2",disabled:"cursor-not-allowed opacity-50",readonly:"cursor-default bg-[var(--content-background)] opacity-70"}},defaultVariants:{size:"default",state:"default"}}),at=classVarianceAuthority.cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",{variants:{state:{default:"text-[var(--content-foreground)]",disabled:"opacity-50 cursor-not-allowed"}},defaultVariants:{state:"default"}}),ot=classVarianceAuthority.cva("text-sm text-[var(--content-foreground)]"),$t=classVarianceAuthority.cva("text-sm text-[var(--destructive-background)] font-medium"),nt=classVarianceAuthority.cva("text-sm text-[var(--success-foreground)] font-medium");function Wt({expandOnFocus:e,collapsedWidth:t,value:r,defaultValue:a,userOnFocus:n,userOnBlur:s}){let[d,i]=react.useState(false),u=react.useCallback(l=>{e&&i(true),n?.(l);},[e,n]),p=react.useCallback(l=>{e&&l.target.value===""&&i(false),s?.(l);},[e,s]),f=react.useMemo(()=>e?d||(r!==void 0?r!=="":a!==void 0&&a!=="")?"100%":t:void 0,[e,d,r,a,t]);return {handleFocus:u,handleBlur:p,inputWidth:f}}function Yt({disableCopyPaste:e}){let[t,r]=react.useState(false),[a,n]=react.useState("");react.useEffect(()=>{e&&typeof process<"u"&&process.env.NODE_ENV==="development"&&console.warn("[TextField] Copy/paste prevention should only be used for security-critical fields like password confirmation. This feature can break assistive technology workflows and password managers.");},[e]);let s=react.useCallback(d=>{e&&(d.preventDefault(),r(true),n("Pasting is not allowed in this field. Please type your entry."),setTimeout(()=>{r(false),n("");},250));},[e]);return {isShaking:t,screenReaderMessage:a,handlePaste:s}}function qt({type:e,showPasswordToggle:t}){let[r,a]=react.useState(false),n=react.useCallback(()=>{a(d=>!d);},[]),s=react.useMemo(()=>e==="password"&&t&&r?"text":e,[e,t,r]);return {showPassword:r,actualType:s,handlePasswordToggle:n}}var Aa=react.forwardRef(({className:e,state:t="default",children:r,...a},n)=>jsxRuntime.jsx(reactAriaComponents.Label,{ref:n,className:m(at({state:t}),e),...a,children:r}));Aa.displayName="TextFieldLabel";var wa=react.forwardRef(({className:e,size:t="default",state:r="default",...a},n)=>jsxRuntime.jsx(reactAriaComponents.Input,{ref:n,className:m(rt({size:t,state:r}),Xe,e),...a}));wa.displayName="TextFieldInput";var ka=react.forwardRef(({className:e,children:t,...r},a)=>jsxRuntime.jsx(reactAriaComponents.Text,{ref:a,slot:"description",className:m(ot(),e),...r,children:t}));ka.displayName="TextFieldDescription";var Qt=react.forwardRef(({className:e,children:t,...r},a)=>jsxRuntime.jsx(reactAriaComponents.FieldError,{ref:a,...r,className:m($t(),e),children:t}));Qt.displayName="TextFieldError";var La=react.forwardRef(({className:e,children:t,...r},a)=>jsxRuntime.jsx(reactAriaComponents.Text,{ref:a,slot:"description",className:m(nt(),e),...r,children:t}));La.displayName="TextFieldSuccess";var st=react.forwardRef(({className:e,size:t="default",label:r,labelHint:a,description:n,errorMessage:s,successMessage:d,type:i="text",isRequired:u=false,isReadOnly:p=false,isDisabled:f=false,isInvalid:l=false,isValid:o=false,id:c,autoComplete:b,disableCopyPaste:g=false,pattern:y,patternDescription:h,expandOnFocus:C=false,collapsedWidth:E="200px",prefix:v,suffix:V,prefixSize:w=16,suffixSize:T=16,showPasswordToggle:I,isIconHidden:M=false,onSubmit:k,onClear:F,value:D,defaultValue:x,onFocus:R,onBlur:N,...G},We)=>{let Ve=react.useId(),ra=react.useId(),aa=c||ra,{handleFocus:oa,handleBlur:na,inputWidth:ia}=Wt({expandOnFocus:C,collapsedWidth:E,value:D,defaultValue:x,userOnFocus:R,userOnBlur:N}),{isShaking:sa,screenReaderMessage:Vt,handlePaste:la}=Yt({disableCopyPaste:g}),{showPassword:Ye,actualType:da,handlePasswordToggle:Rt}=qt({type:i,showPasswordToggle:I}),j=i==="search",[ca,Tt]=react.useState(x??""),fe=D!==void 0,Y=fe?D:ca,ua=react.useCallback(L=>{fe||Tt(L),G.onChange?.(L);},[fe,G]),Re=react.useCallback(()=>{fe||Tt(""),G.onChange?.(""),F?.();},[fe,G,F]),pa=react.useCallback(L=>{L.key==="Enter"&&k&&k(Y),L.key==="Escape"&&Y&&(L.preventDefault(),Re());},[Y,k,Re]),fa=react.useMemo(()=>f?"disabled":p?"readonly":l?"error":o?"success":"default",[f,p,l,o]),ma=react.useMemo(()=>f?"disabled":"default",[f]),It=react.useMemo(()=>n&&h?`${n} ${h}`:n||h,[n,h]),ee=react.useMemo(()=>j&&!M&&!v?jsxRuntime.jsx(lucideReact.Search,{className:t==="sm"?"h-3.5 w-3.5":t==="lg"?"h-5 w-5":"h-4 w-4"}):v,[j,M,v,t]),Ft=react.useMemo(()=>{let L={left:12,right:12};if(ee){let qe=typeof ee=="string"?ee.length*8+16:w+16;L.left=qe;}if(i==="password"&&I)L.right=32;else if(j&&Y)L.right=44;else if(V){let qe=typeof V=="string"?V.length*8+16:T+16;L.right=qe;}return L},[ee,v,V,w,T,i,I,j,Y]),Pt=react.useMemo(()=>i==="password"&&I?jsxRuntime.jsx(_,{variant:"ghost",visualSize:"icon",onPress:Rt,"aria-label":Ye?"Hide password":"Show password",className:"!min-h-0 !min-w-0 h-8 w-8",children:Ye?jsxRuntime.jsx(zt,{}):jsxRuntime.jsx(Ht,{})}):j&&Y?jsxRuntime.jsx(_,{variant:"ghost",visualSize:"icon",onPress:Re,"aria-label":"Clear search",className:"!min-h-0 !min-w-0 h-8 w-8",children:jsxRuntime.jsx(lucideReact.X,{className:t==="sm"?"h-3 w-3":t==="lg"?"h-5 w-5":"h-4 w-4"})}):V,[i,I,Ye,V,Rt,j,Y,t,Re]),At=i==="password"&&I||j&&!!Y;return jsxRuntime.jsxs(reactAriaComponents.TextField,{ref:We,className:m("flex flex-col gap-1.5",e),isRequired:u,isReadOnly:p,isDisabled:f,isInvalid:l,value:j?Y:D,defaultValue:j?void 0:x,onChange:j?ua:void 0,...G,children:[r&&jsxRuntime.jsxs(reactAriaComponents.Label,{className:m(at({state:ma}),a&&"flex items-baseline justify-between"),children:[jsxRuntime.jsxs("span",{children:[r,u&&jsxRuntime.jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:jsxRuntime.jsx("strong",{children:"*"})})]}),a&&jsxRuntime.jsx("span",{className:"text-xs font-normal text-[var(--muted-foreground)]",children:a})]}),It&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"description",className:m(ot()),children:It}),jsxRuntime.jsxs("div",{className:m(K,"relative cursor-text motion-safe:transition-colors motion-safe:duration-200"),style:{width:ia},onClick:L=>{L.target===L.currentTarget&&L.currentTarget.querySelector("input")?.focus();},children:[ee&&jsxRuntime.jsx("div",{"data-testid":"textfield-prefix",className:"absolute left-3 flex items-center justify-center pointer-events-none text-[var(--content-foreground)]","aria-hidden":"true",children:ee}),jsxRuntime.jsx(reactAriaComponents.Input,{type:da,id:aa,className:m(rt({size:t,state:fa}),Xe,sa&&"shake"),style:{width:"100%",paddingLeft:`${Ft.left}px`,paddingRight:`${Ft.right}px`},autoComplete:b,pattern:y,onPaste:la,onFocus:oa,onBlur:na,onKeyDown:j?pa:void 0,"aria-required":u?"true":void 0,"aria-readonly":p?"true":void 0,"aria-errormessage":l&&s?Ve:void 0}),Pt&&jsxRuntime.jsx("div",{"data-testid":"textfield-suffix",className:m("absolute right-3 flex items-center justify-center text-[var(--content-foreground)]",At?"":"pointer-events-none"),"aria-hidden":At?void 0:"true",children:Pt})]}),o&&d&&!l&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"description",className:m(nt()),children:d}),l&&s&&jsxRuntime.jsx(Qt,{id:Ve,children:s}),Vt&&jsxRuntime.jsx("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:Vt})]})});st.displayName="TextField";var we=react.forwardRef(({label:e,description:t,errorMessage:r,"aria-label":a,"aria-labelledby":n,...s},d)=>(process.env.NODE_ENV!=="production"&&!e&&!a&&!n&&console.warn("[SearchField] Either label, aria-label, or aria-labelledby is required for accessibility (WCAG 1.1.1)"),jsxRuntime.jsx(st,{ref:d,type:"search",label:e,description:r?void 0:t,errorMessage:r,isInvalid:!!r,"aria-label":e?void 0:a,"aria-labelledby":n,...s})));we.displayName="SearchField";function Jt(e,t){return !(e===false||t)}var er="(prefers-reduced-motion: reduce)";function Ga(){return typeof window>"u"?false:window.matchMedia(er).matches}function tr(){let[e,t]=react.useState(Ga);return react.useEffect(()=>{let r=window.matchMedia(er);t(r.matches);let a=n=>{t(n.matches);};return r.addEventListener("change",a),()=>r.removeEventListener("change",a)},[]),e}var ge;function ja(){return ge!==void 0?Promise.resolve(ge):import('motion').then(e=>(ge=e.animate,ge)).catch(()=>(ge=null,null))}var Wa={stiffness:500,damping:30},ar=classVarianceAuthority.cva("inline-flex shrink-0 cursor-pointer items-center justify-center min-h-[44px] min-w-[44px] disabled:cursor-not-allowed disabled:opacity-50 data-[readonly]:cursor-default",{variants:{},defaultVariants:{}}),or=classVarianceAuthority.cva("relative inline-flex shrink-0 items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background",{variants:{variant:{default:"bg-[var(--border)] data-[selected]:bg-[var(--primary)]",destructive:"bg-[var(--border)] data-[selected]:bg-[var(--destructive-background)]"},size:{sm:"h-6 w-10",default:"h-7 w-12",lg:"h-8 w-14"}},defaultVariants:{variant:"default",size:"default"}}),nr=classVarianceAuthority.cva("pointer-events-none absolute left-0.5 rounded-full bg-[var(--content-background)] ring-0",{variants:{size:{sm:"h-4 w-4",default:"h-5 w-5",lg:"h-6 w-6"},animated:{false:"transition-transform data-[selected]:translate-x-full",true:""}},defaultVariants:{size:"default",animated:false}}),Le=react.memo(react.forwardRef(({className:e,variant:t,size:r,label:a,description:n,isDisabled:s,isReadOnly:d,animated:i,springConfig:u=Wa,onChange:p,...f},l)=>{let o=tr(),c=Jt(i,o),b=react.useRef(null),g=react.useRef(false),y=react.useRef(null),h=react.useRef(null);react.useEffect(()=>{c&&ja().then(v=>{if(v&&(y.current=v,g.current=true,b.current)){let V=b.current.hasAttribute("data-selected");b.current.style.transform=V?"translateX(100%)":"translateX(0)";}});},[c]);let C=react.useCallback(v=>{p?.(v),c&&g.current&&y.current&&b.current&&(h.current?.stop(),h.current=y.current(b.current,{x:v?"100%":"0%"},{type:"spring",stiffness:u.stiffness,damping:u.damping}));},[c,u.stiffness,u.damping,p]),E=c;return jsxRuntime.jsx(reactAriaComponents.Switch,{ref:l,isDisabled:s,isReadOnly:d,onChange:C,className:v=>m("group inline-flex items-center gap-2",s&&"cursor-not-allowed opacity-50",e),...f,children:v=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:m(ar()),"data-selected":v.isSelected||void 0,"data-readonly":d||void 0,children:jsxRuntime.jsx("div",{className:m(or({variant:t,size:r}),wt),"data-selected":v.isSelected||void 0,children:jsxRuntime.jsx("div",{ref:b,className:m(nr({size:r,animated:E})),"data-selected":v.isSelected||void 0})})}),(a||n)&&jsxRuntime.jsxs("div",{className:"flex flex-col",children:[a&&jsxRuntime.jsx("span",{className:"text-sm font-medium text-[var(--content-foreground)]",children:a}),n&&jsxRuntime.jsx("span",{className:"text-xs text-[var(--menu-muted)]",children:n})]})]})})}));Le.displayName="Switch";var ir=react.createContext({variant:"default",size:"default",isInvalid:false}),ao=classVarianceAuthority.cva("flex",{variants:{orientation:{vertical:"flex-col gap-2",horizontal:"flex-row flex-wrap gap-2"}},defaultVariants:{orientation:"vertical"}}),oo=classVarianceAuthority.cva(["flex items-center gap-3 rounded-md border cursor-pointer","transition-colors duration-200","rtl:flex-row-reverse",te,Z].join(" "),{variants:{variant:{default:["border-[var(--border)]","data-[hovered]:bg-[var(--accent)]/10","data-[selected]:border-[var(--primary)]","data-[selected]:bg-[var(--primary)]/10"].join(" "),destructive:["border-[var(--border)]","data-[hovered]:bg-[var(--destructive-background)]/10","data-[selected]:border-[var(--destructive-background)]","data-[selected]:bg-[var(--destructive-background)]/10"].join(" ")},size:{sm:"min-h-[44px] py-2 px-3 text-sm",default:"min-h-[48px] py-3 px-4 text-sm",lg:"min-h-[56px] py-4 px-5 text-base"},isDisabled:{true:"opacity-50 cursor-not-allowed",false:""},isInvalid:{true:"border-[var(--destructive-background)]",false:""}},defaultVariants:{variant:"default",size:"default",isDisabled:false,isInvalid:false}}),no=classVarianceAuthority.cva("flex-shrink-0 rounded-full border-2 flex items-center justify-center transition-colors duration-200",{variants:{variant:{default:["border-[var(--border)]","data-[selected]:border-[var(--primary)]"].join(" "),destructive:["border-[var(--border)]","data-[selected]:border-[var(--destructive-background)]"].join(" ")},size:{sm:"h-4 w-4",default:"h-5 w-5",lg:"h-6 w-6"}},defaultVariants:{variant:"default",size:"default"}}),io=classVarianceAuthority.cva(["rounded-full transition-transform duration-200","[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]","motion-reduce:transition-none","scale-0 data-[selected]:scale-100"].join(" "),{variants:{variant:{default:"bg-[var(--primary)]",destructive:"bg-[var(--destructive-background)]"},size:{sm:"h-2 w-2",default:"h-2.5 w-2.5",lg:"h-3 w-3"}},defaultVariants:{variant:"default",size:"default"}});function sr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("font-medium text-[var(--content-foreground)]",t),children:e})}sr.displayName="Radio.Label";function lr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("text-sm text-[var(--menu-muted)]",t),children:e})}lr.displayName="Radio.Description";function so({value:e,isDisabled:t,children:r,className:a}){let{variant:n,size:s,isInvalid:d}=react.useContext(ir);return jsxRuntime.jsx(reactAriaComponents.Radio,{value:e,isDisabled:t,className:i=>m(oo({variant:n,size:s,isDisabled:i.isDisabled,isInvalid:d}),a),children:i=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:no({variant:n,size:s}),"data-selected":i.isSelected||void 0,children:jsxRuntime.jsx("div",{className:io({variant:n,size:s}),"data-selected":i.isSelected||void 0})}),jsxRuntime.jsx("div",{className:"flex-1 flex flex-col",children:r})]})})}var le=Object.assign(so,{Label:sr,Description:lr});le.displayName="Radio";var ve=react.forwardRef(function(t,r){let{label:a,description:n,errorMessage:s,value:d,defaultValue:i,isDisabled:u=false,isReadOnly:p=false,isRequired:f=false,isInvalid:l=false,orientation:o="vertical",variant:c="default",size:b="default",name:g,onChange:y,onFocusChange:h,className:C,children:E,id:v,"aria-label":V,"aria-labelledby":w,"aria-describedby":T,"data-testid":I,...M}=t,k=react.useId(),F=v??k,D=`${F}-label`,x=`${F}-description`,R=`${F}-error`,N=[];T&&N.push(T),n&&N.push(x),l&&s&&N.push(R);let G=N.length>0?N.join(" "):void 0;return jsxRuntime.jsx(ir.Provider,{value:{variant:c,size:b,isInvalid:l},children:jsxRuntime.jsxs(reactAriaComponents.RadioGroup,{ref:r,id:F,name:g,value:d??void 0,defaultValue:i??void 0,isDisabled:u,isReadOnly:p,isRequired:f,isInvalid:l,orientation:o,onChange:y,onFocusChange:h,"aria-label":V,"aria-labelledby":a?D:w,"aria-describedby":G,"data-testid":I,"data-orientation":o,className:m("flex flex-col gap-1.5",C),...M,children:[a&&jsxRuntime.jsxs(reactAriaComponents.Label,{id:D,className:"text-sm font-medium text-[var(--content-foreground)]",children:[a,f&&jsxRuntime.jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:"*"})]}),n&&jsxRuntime.jsx(reactAriaComponents.Text,{id:x,slot:"description",className:"text-sm text-[var(--menu-muted)]",children:n}),jsxRuntime.jsx("div",{className:ao({orientation:o}),children:E}),l&&s&&jsxRuntime.jsx(reactAriaComponents.FieldError,{id:R,className:"text-sm text-[var(--destructive-background)]",children:jsxRuntime.jsx("span",{role:"alert",children:s})})]})})});ve.displayName="RadioGroup";var cr=react.createContext({variant:"default",size:"default",isInvalid:false,isDisabled:false,isReadOnly:false}),ur=classVarianceAuthority.cva("flex",{variants:{orientation:{vertical:"flex-col gap-2",horizontal:"flex-row flex-wrap gap-2"}},defaultVariants:{orientation:"vertical"}}),pr=classVarianceAuthority.cva(["flex items-center gap-3 rounded-md border cursor-pointer","transition-colors duration-200","rtl:flex-row-reverse",te,Z].join(" "),{variants:{variant:{default:["border-[var(--border)]","data-[hovered]:bg-[var(--accent)]/10","data-[selected]:border-[var(--primary)]","data-[selected]:bg-[var(--primary)]/10"].join(" "),destructive:["border-[var(--border)]","data-[hovered]:bg-[var(--destructive-background)]/10","data-[selected]:border-[var(--destructive-background)]","data-[selected]:bg-[var(--destructive-background)]/10"].join(" ")},size:{sm:"min-h-[44px] py-2 px-3 text-sm",default:"min-h-[48px] py-3 px-4 text-sm",lg:"min-h-[56px] py-4 px-5 text-base"},isDisabled:{true:"opacity-50 cursor-not-allowed",false:""},isReadOnly:{true:"cursor-default",false:""},isInvalid:{true:"border-[var(--destructive-background)]",false:""}},defaultVariants:{variant:"default",size:"default",isDisabled:false,isReadOnly:false,isInvalid:false}}),fr=classVarianceAuthority.cva("flex-shrink-0 rounded-sm border-2 flex items-center justify-center transition-colors duration-200",{variants:{variant:{default:["border-[var(--border)]","data-[selected]:border-[var(--primary)]","data-[selected]:bg-[var(--primary)]"].join(" "),destructive:["border-[var(--border)]","data-[selected]:border-[var(--destructive-background)]","data-[selected]:bg-[var(--destructive-background)]"].join(" ")},size:{sm:"h-4 w-4",default:"h-5 w-5",lg:"h-6 w-6"}},defaultVariants:{variant:"default",size:"default"}}),mr=classVarianceAuthority.cva(["transition-transform duration-200","[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]","motion-reduce:transition-none","scale-0 data-[selected]:scale-100"].join(" "),{variants:{variant:{default:"text-[var(--primary-foreground)]",destructive:"text-[var(--destructive-foreground)]"},size:{sm:"h-3 w-3",default:"h-3.5 w-3.5",lg:"h-4 w-4"}},defaultVariants:{variant:"default",size:"default"}});function br({className:e,...t}){return jsxRuntime.jsx("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:3,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",...t,children:jsxRuntime.jsx("polyline",{points:"20 6 9 17 4 12"})})}function xr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("font-medium text-[var(--content-foreground)]",t),children:e})}xr.displayName="Checkbox.Label";function gr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("text-sm text-[var(--menu-muted)]",t),children:e})}gr.displayName="Checkbox.Description";function yo({value:e,isDisabled:t,children:r,className:a,selectedIcon:n}){let{variant:s,size:d,isInvalid:i,isDisabled:u,isReadOnly:p}=react.useContext(cr),f=t||u,l=o=>{let c=m(mr({variant:s,size:d})),b=o||void 0;if(n){if(react.isValidElement(n)){let g=n;return react.cloneElement(g,{className:m(c,g.props.className),"data-selected":b})}return jsxRuntime.jsx("span",{className:c,"data-selected":b,children:n})}return jsxRuntime.jsx(br,{className:c,"data-selected":b})};return jsxRuntime.jsx(reactAriaComponents.Checkbox,{value:e,isDisabled:f,className:o=>m(pr({variant:s,size:d,isDisabled:o.isDisabled,isReadOnly:p,isInvalid:i}),a),children:o=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:fr({variant:s,size:d}),"data-selected":o.isSelected||void 0,children:l(o.isSelected)}),jsxRuntime.jsx("div",{className:"flex-1 flex flex-col",children:r})]})})}var Be=Object.assign(yo,{Label:xr,Description:gr});Be.displayName="Checkbox";function dr(e,t){if(!e)return e;let r=[...new Set(e)];return process.env.NODE_ENV!=="production"&&r.length!==e.length&&console.warn(`[${t}] Received duplicate values in value/defaultValue prop. Original: [${e.join(", ")}], Deduplicated: [${r.join(", ")}]. Duplicate values are automatically removed.`),r}var Oe=react.forwardRef(function(t,r){let{label:a,description:n,errorMessage:s,value:d,defaultValue:i,isDisabled:u=false,isReadOnly:p=false,isRequired:f=false,isInvalid:l=false,orientation:o="vertical",variant:c="default",size:b="default",name:g,onChange:y,onFocusChange:h,className:C,children:E,id:v,"aria-label":V,"aria-labelledby":w,"aria-describedby":T,"data-testid":I,...M}=t,k=react.useId(),F=v??k,D=`${F}-label`,x=`${F}-description`,R=`${F}-error`,N=[];T&&N.push(T),n&&N.push(x),l&&s&&N.push(R);let G=N.length>0?N.join(" "):void 0,We=dr(d,"CheckboxGroup"),Ve=dr(i,"CheckboxGroup");return jsxRuntime.jsx(cr.Provider,{value:{variant:c,size:b,isInvalid:l,isDisabled:u,isReadOnly:p},children:jsxRuntime.jsxs(reactAriaComponents.CheckboxGroup,{ref:r,id:F,name:g,value:We,defaultValue:Ve,isDisabled:u,isReadOnly:p,isRequired:f,isInvalid:l,onChange:y,onFocusChange:h,"aria-label":V,"aria-labelledby":a?D:w,"aria-describedby":G,"aria-orientation":o,"aria-required":f||void 0,"aria-invalid":l||void 0,"data-testid":I,className:m("flex flex-col gap-1.5",C),...M,children:[a&&jsxRuntime.jsxs(reactAriaComponents.Label,{id:D,className:"text-sm font-medium text-[var(--content-foreground)]",children:[a,f&&jsxRuntime.jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:"*"})]}),n&&jsxRuntime.jsx(reactAriaComponents.Text,{id:x,slot:"description",className:"text-sm text-[var(--menu-muted)]",children:n}),jsxRuntime.jsx("div",{className:ur({orientation:o}),children:E}),l&&s&&jsxRuntime.jsx(reactAriaComponents.FieldError,{id:R,className:"text-sm text-[var(--destructive-background)]",children:jsxRuntime.jsx("span",{role:"alert",children:s})})]})})});Oe.displayName="CheckboxGroup";var vr=classVarianceAuthority.cva("group flex flex-col gap-1.5 w-full",{variants:{size:{sm:"",default:"",lg:""}},defaultVariants:{size:"default"}}),hr=classVarianceAuthority.cva("text-[var(--text-primary)] font-medium",{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),Sr=classVarianceAuthority.cva(["flex-1 bg-transparent outline-none","placeholder:text-[var(--muted-foreground)]","disabled:cursor-not-allowed"],{variants:{size:Ze},defaultVariants:{size:"default"}}),yr=classVarianceAuthority.cva(["flex items-center w-full rounded-md border","bg-[var(--input-background)] text-[var(--content-foreground)]","border-[var(--input-border)]","transition-colors duration-[var(--transition-fast)]","focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-[var(--ring-offset)]","data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50","data-[invalid]:border-[var(--destructive-background)]"],{variants:{size:{sm:`${B.sm} gap-1`,default:`${B.default} gap-2`,lg:`${B.lg} gap-2`}},defaultVariants:{size:"default"}}),Cr=classVarianceAuthority.cva(["flex items-center justify-center shrink-0","text-[var(--muted-foreground)]","hover:text-[var(--text-primary)]","transition-colors","focus:outline-none"],{variants:{size:{sm:"h-4 w-4 min-h-[44px] min-w-[44px]",default:"h-5 w-5 min-h-[44px] min-w-[44px]",lg:"h-6 w-6 min-h-[44px] min-w-[44px]"}},defaultVariants:{size:"default"}}),Er=classVarianceAuthority.cva(["w-[var(--trigger-width)] overflow-auto","rounded-md border border-[var(--border)]","bg-[var(--content-background)] text-[var(--content-foreground)]","data-[entering]:motion-safe:animate-in data-[entering]:motion-safe:fade-in-0","data-[exiting]:motion-safe:animate-out data-[exiting]:motion-safe:fade-out-0"]),Nr=classVarianceAuthority.cva("p-1 outline-none max-h-[300px] overflow-auto"),Vr=classVarianceAuthority.cva(["flex items-center gap-2 w-full rounded-sm px-2 py-1.5","text-[var(--content-foreground)]","cursor-pointer outline-none","data-[focused]:bg-[var(--accent-background)] data-[focused]:text-[var(--accent-foreground)]","data-[selected]:font-medium","data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed"],{variants:{size:{sm:"text-xs min-h-[44px]",default:"text-sm min-h-[44px]",lg:"text-base min-h-[44px]"}},defaultVariants:{size:"default"}});classVarianceAuthority.cva("pt-1");classVarianceAuthority.cva("px-2 py-1.5 text-xs font-semibold text-[var(--muted-foreground)]");var Ir=classVarianceAuthority.cva("text-[var(--muted-foreground)]",{variants:{size:{sm:"text-xs",default:"text-xs",lg:"text-sm"}},defaultVariants:{size:"default"}}),Fr=classVarianceAuthority.cva("text-[var(--destructive-background)]",{variants:{size:{sm:"text-xs",default:"text-xs",lg:"text-sm"}},defaultVariants:{size:"default"}});var Ge=react.forwardRef(({className:e,size:t="default",label:r,description:a,errorMessage:n,isRequired:s,isDisabled:d,isReadOnly:i,placeholder:u,name:p,allowsCustomValue:f=false,menuTrigger:l="input",defaultInputValue:o,inputValue:c,defaultSelectedKey:b,selectedKey:g,onInputChange:y,onSelectionChange:h,children:C,"aria-label":E,"aria-labelledby":v,"data-testid":V,...w},T)=>(process.env.NODE_ENV!=="production"&&!r&&!E&&!v&&console.warn("[Combobox] Either label, aria-label, or aria-labelledby is required for accessibility (WCAG 1.1.1)"),jsxRuntime.jsxs(reactAriaComponents.ComboBox,{ref:T,className:m(vr({size:t}),e),isRequired:s,isDisabled:d,isReadOnly:i,name:p,allowsCustomValue:f,menuTrigger:l,defaultInputValue:o,inputValue:c,defaultSelectedKey:b,selectedKey:g,onInputChange:y,onSelectionChange:h,"aria-label":r?void 0:E,"aria-labelledby":v,"data-testid":V,...w,children:[r&&jsxRuntime.jsxs(reactAriaComponents.Label,{className:hr({size:t}),children:[r,s&&jsxRuntime.jsx("span",{className:"text-[var(--destructive-background)] ml-1","aria-hidden":"true",children:"*"})]}),jsxRuntime.jsxs("div",{className:m(K,yr({size:t})),children:[jsxRuntime.jsx(reactAriaComponents.Input,{className:Sr({size:t}),placeholder:u}),jsxRuntime.jsx(reactAriaComponents.Button,{className:Cr({size:t}),children:jsxRuntime.jsx(lucideReact.ChevronsUpDown,{className:"h-full w-full","aria-hidden":"true"})})]}),a&&!n&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"description",className:Ir({size:t}),children:a}),n&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"errorMessage",className:Fr({size:t}),children:n}),jsxRuntime.jsx(reactAriaComponents.Popover,{className:Er(),children:jsxRuntime.jsx(reactAriaComponents.ListBox,{className:Nr(),children:C})})]})));Ge.displayName="Combobox";function Se({children:e,className:t,textValue:r,...a}){let n=r||(typeof e=="string"?e:void 0);return jsxRuntime.jsx(reactAriaComponents.ListBoxItem,{className:m(Vr({size:"default"}),t),textValue:n,...a,children:({isSelected:s})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"flex-1",children:e}),s&&jsxRuntime.jsx(lucideReact.Check,{className:"h-4 w-4 shrink-0 text-[var(--primary)]","aria-hidden":"true"})]})})}Se.displayName="ComboboxItem";var wr=classVarianceAuthority.cva(["flex","w-full","items-center","justify-between","gap-2","rounded-md","border","bg-[var(--content-background)]","text-[var(--content-foreground)]","transition-colors","duration-200","outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2","hover:bg-[var(--accent)]/10","disabled:cursor-not-allowed","disabled:opacity-50","data-[loading=true]:cursor-wait","truncate"],{variants:{size:{sm:`${B.sm} pr-1`,default:`${B.default} pr-1.5`,lg:`${B.lg} pr-2`},isInvalid:{true:"border-[var(--destructive-background)]",false:"border-[var(--input-border)] hover:border-[var(--input-border)]/80"}},defaultVariants:{size:"default",isInvalid:false}}),kr=classVarianceAuthority.cva(["relative","flex","w-full","cursor-pointer","select-none","items-center","rounded-sm","outline-none","transition-colors","pl-8","pr-2","hover:bg-[var(--accent)]","hover:text-[var(--accent-foreground)]","focus:bg-[var(--accent)]","focus:text-[var(--accent-foreground)]","data-[selected=true]:bg-[var(--accent)]","data-[selected=true]:text-[var(--accent-foreground)]","data-[disabled=true]:pointer-events-none","data-[disabled=true]:opacity-50","data-[disabled=true]:text-[var(--menu-muted)]"],{variants:{size:{sm:`${B.sm} py-1`,default:`${B.default} py-2`,lg:`${B.lg} py-3`}},defaultVariants:{size:"default"}}),Lr=classVarianceAuthority.cva(["z-50","w-[--trigger-width]","rounded-md","border","border-[var(--menu-border)]","bg-[var(--menu-background)]","text-[var(--menu-foreground)]","outline-none","overflow-auto","data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:zoom-in-95","data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:zoom-out-95"],{variants:{size:{sm:"max-h-[200px] p-1",default:"max-h-[300px] p-1",lg:"max-h-[400px] p-1"}},defaultVariants:{size:"default"}}),_r=classVarianceAuthority.cva(["px-2","py-1.5","text-xs","font-semibold","text-[var(--menu-muted)]","uppercase","tracking-wider"],{variants:{size:{sm:"px-2 py-1 text-[10px]",default:"px-2 py-1 text-xs",lg:"px-2 py-1.5 text-xs"}},defaultVariants:{size:"default"}}),Dr=classVarianceAuthority.cva(["flex","items-center","gap-1.5","text-sm","font-medium","text-[var(--destructive-background)]","mt-1"],{variants:{size:{sm:"text-xs mt-1",default:"text-sm mt-1",lg:"text-base mt-1"}},defaultVariants:{size:"default"}});var Qo=Array.from({length:3}).map((e,t)=>jsxRuntime.jsx("div",{className:"h-11 px-4 py-2",children:jsxRuntime.jsx("div",{className:"h-4 bg-[var(--accent-background)] rounded animate-pulse"})},`skeleton-${t}`));function Mr({ariaSelectProps:e,triggerContent:t,triggerRef:r,label:a,description:n,isRequired:s,isDisabled:d,isLoading:i,errorMessage:u,size:p,emptyStateMessage:f,childCount:l,children:o}){let c=react.useId(),b=react.useId(),g=react.useId(),y=!!u;return jsxRuntime.jsxs(reactAriaComponents.Select,{...e,isInvalid:y,children:[jsxRuntime.jsxs(reactAriaComponents.Label,{id:c,className:"text-sm font-medium text-[var(--content-foreground)]",children:[a,s&&jsxRuntime.jsx("span",{className:"text-[var(--destructive-background)] ml-1",children:"*"})]}),n&&jsxRuntime.jsx(reactAriaComponents.Text,{id:b,slot:"description",className:"text-sm text-[var(--menu-muted)] mt-1",children:n}),jsxRuntime.jsx("div",{className:K,children:jsxRuntime.jsxs(reactAriaComponents.Button,{ref:r,className:wr({size:p,isInvalid:y}),"aria-labelledby":c,"aria-describedby":n?b:u?g:void 0,"data-loading":i,...s&&{"aria-required":"true"},...i&&{"aria-busy":"true"},...(d||i)&&{"aria-disabled":"true"},children:[t,i?jsxRuntime.jsx(lucideReact.Loader2,{className:"ml-auto h-4 w-4 shrink-0 animate-spin text-[var(--menu-muted)]","aria-hidden":"true"}):jsxRuntime.jsx(lucideReact.ChevronDown,{className:"ml-auto h-4 w-4 shrink-0 text-[var(--menu-muted)]","aria-hidden":"true"})]})}),jsxRuntime.jsx(reactAriaComponents.FieldError,{id:g,className:Dr({size:p}),children:({validationErrors:h})=>{let C=u||h.join(" ");return C?jsxRuntime.jsx(jsxRuntime.Fragment,{children:C}):null}}),jsxRuntime.jsx(reactAriaComponents.Popover,{className:Lr({size:p}),children:jsxRuntime.jsxs(reactAriaComponents.ListBox,{className:"outline-none",children:[i&&l>0&&Qo,!i&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[o,l===0&&jsxRuntime.jsx(reactAriaComponents.ListBoxItem,{id:"__empty__",textValue:"empty",isDisabled:true,className:"py-6 text-center text-sm text-[var(--menu-muted)] cursor-default pointer-events-none",children:jsxRuntime.jsx("span",{role:"status",children:f||"No options available"})})]})]})})]})}var Hr=react.forwardRef(({label:e,placeholder:t,description:r,value:a,defaultValue:n,isOpen:s,isDisabled:d=false,isRequired:i=false,disabledKeys:u,validate:p,validationBehavior:f="aria",errorMessage:l,isLoading:o=false,emptyStateMessage:c,name:b,size:g="default",onChange:y,onOpenChange:h,className:C,children:E,...v},V)=>{let w=react.Children.count(E);return w>1e3&&console.warn("Select has >1000 items. Consider using Autocomplete component for better performance."),jsxRuntime.jsx(Mr,{ariaSelectProps:{value:a,defaultValue:n,onChange:T=>{y&&y(T);},placeholder:t,disabledKeys:u,isOpen:s,onOpenChange:h,isDisabled:d||o,isRequired:i,name:b,validate:p,validationBehavior:f,className:C,...v},triggerContent:jsxRuntime.jsx(reactAriaComponents.SelectValue,{className:"flex-1 text-left truncate"}),triggerRef:V,label:e,description:r,isRequired:i,isDisabled:d,isLoading:o,errorMessage:l,size:g,emptyStateMessage:c,childCount:w,children:E})});Hr.displayName="Select";var zr=react.forwardRef(({label:e,placeholder:t,description:r,value:a,defaultValue:n,selectionMode:s="multiple",isOpen:d,isDisabled:i=false,isRequired:u=false,disabledKeys:p,validate:f,validationBehavior:l="aria",errorMessage:o,isLoading:c=false,emptyStateMessage:b,name:g,size:y="default",onChange:h,onOpenChange:C,className:E,children:v,...V},w)=>{let T=react.Children.count(v);T>1e3&&console.warn("Select has >1000 items. Consider using Autocomplete component for better performance.");let I=react.useMemo(()=>{let k=new Map,F=D=>{react.Children.forEach(D,x=>{if(react.isValidElement(x)){let R=x;if(R.type===Me||R.props?.value){let N=R.props.value,G=R.props.children;N&&typeof G=="string"&&k.set(N,G);}R.props?.children&&F(R.props.children);}});};return F(v),k},[v]),M=react.useMemo(()=>!a||!Array.isArray(a)||a.length===0?t||"":a.length<=2?a.map(F=>I.get(F)||F).join(", "):`${a.length} items selected`,[a,I,t]);return jsxRuntime.jsx(Mr,{ariaSelectProps:{value:a,defaultValue:n,onChange:k=>{h&&h(k);},selectionMode:"multiple",disabledKeys:p,isOpen:d,onOpenChange:C,isDisabled:i||c,isRequired:u,name:g,validate:f,validationBehavior:l,className:E,...V},triggerContent:jsxRuntime.jsx("span",{className:"flex-1 text-left truncate",children:M}),triggerRef:w,label:e,description:r,isRequired:u,isDisabled:i,isLoading:c,errorMessage:o,size:y,emptyStateMessage:b,childCount:T,children:v})});zr.displayName="MultiSelect";var Me=react.memo(function({children:t,textValue:r,value:a,isDisabled:n=false,className:s,...d}){if(!r&&typeof t!="string"){let i="Select.Item with custom children requires textValue prop for accessibility";if(process.env.NODE_ENV==="development")throw new Error(i);console.warn(i);}return jsxRuntime.jsx(reactAriaComponents.ListBoxItem,{id:a,textValue:r||(typeof t=="string"?t:void 0),className:`${kr({size:"default"})} ${s||""}`,isDisabled:n,...d,children:({isSelected:i,selectionMode:u,isDisabled:p})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[u==="multiple"?jsxRuntime.jsx(lucideReact.CheckSquare,{className:`absolute left-2 h-4 w-4 ${i?"visible":"invisible"}`,"aria-hidden":"true"}):i&&jsxRuntime.jsx(lucideReact.Check,{className:"absolute left-2 h-4 w-4","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:p?"text-[var(--menu-muted)]":"",children:t})]})})});Me.displayName="SelectItem";function mt({children:e,className:t,...r}){return jsxRuntime.jsx(reactAriaComponents.ListBoxSection,{className:`border-t border-[var(--border)] first:border-t-0 ${t||""}`,...r,children:e})}mt.displayName="SelectSection";function bt({children:e,className:t,...r}){return jsxRuntime.jsx(reactAriaComponents.Header,{className:`${_r({size:"default"})} ${t||""}`,...r,children:e})}bt.displayName="SelectHeader";var Ce=Object.assign(Hr,{Item:Me,Section:mt,Header:bt});Object.assign(zr,{Item:Me,Section:mt,Header:bt});var $r=classVarianceAuthority.cva(["relative inline-flex items-center justify-center","min-h-[44px] min-w-[44px]","focus-visible:outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2","focus-visible:ring-offset-[var(--page-background)]","disabled:pointer-events-none","disabled:opacity-50"],{variants:{},defaultVariants:{}}),jr=classVarianceAuthority.cva(["inline-flex items-center justify-center","gap-1","rounded-full","font-medium","whitespace-nowrap","transition-colors"],{variants:{variant:{primary:["bg-[var(--primary-action)]","text-[var(--primary-action-foreground)]","hover:bg-[var(--primary-action)]/90","data-[pressed]:bg-[var(--primary-action)]/80"],accent:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"],destructive:["bg-[var(--destructive-background)]","text-[var(--destructive-foreground)]","hover:bg-[var(--destructive-background)]/90","data-[pressed]:bg-[var(--destructive-background)]/80"],content:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"]},size:{sm:"h-5 px-2 text-xs",default:"h-6 px-2.5 text-xs",lg:"h-7 px-3 text-sm"}},defaultVariants:{variant:"primary",size:"default"}});var an={sm:"[&_svg]:h-2.5 [&_svg]:w-2.5",default:"[&_svg]:h-3 [&_svg]:w-3",lg:"[&_svg]:h-3.5 [&_svg]:w-3.5"},ce=react.memo(react.forwardRef(({className:e,variant:t="primary",size:r="default",children:a,icon:n,iconPosition:s="start",count:d,onPress:i,isDisabled:u,id:p,"aria-label":f,"aria-labelledby":l,"aria-describedby":o,"data-testid":c,...b},g)=>{let y=m(jr({variant:t,size:r}),an[r],e),v=[!!n,d!==void 0,!!a].filter(Boolean).length>1,V=()=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[n&&s==="start"&&jsxRuntime.jsx("span",{className:"shrink-0","aria-hidden":"true",children:n}),a&&(v?jsxRuntime.jsx("span",{children:a}):a),d!==void 0&&jsxRuntime.jsx("span",{className:"font-mono tabular-nums",children:d}),n&&s==="end"&&jsxRuntime.jsx("span",{className:"shrink-0","aria-hidden":"true",children:n})]});return i?jsxRuntime.jsx(reactAriaComponents.Button,{ref:g,isDisabled:u,onPress:i,className:$r(),id:p,"aria-label":f,"aria-labelledby":l,"aria-describedby":o,"data-testid":c,...b,children:w=>jsxRuntime.jsx("span",{className:m(y,me,"",re,ae),"data-pressed":w.isPressed||void 0,children:V()})}):jsxRuntime.jsx("span",{ref:g,className:y,id:p,"aria-label":f,"aria-labelledby":l,"aria-describedby":o,"data-testid":c,...b,children:V()})}));ce.displayName="Badge";var xt=classVarianceAuthority.cva(["flex flex-wrap items-center gap-2"]),Ee=classVarianceAuthority.cva(["inline-flex items-center gap-2"]),gt=classVarianceAuthority.cva(["min-w-[14rem] max-w-[20rem] rounded-md border border-[var(--border)]","bg-[var(--content-background)] p-2 shadow-md","motion-safe:data-[entering]:animate-in motion-safe:data-[entering]:fade-in-0","motion-safe:data-[exiting]:animate-out motion-safe:data-[exiting]:fade-out-0"]),vt=classVarianceAuthority.cva(["flex items-center justify-between gap-2 px-1 pb-2 mb-1","border-b border-[var(--border)]"]),ht=classVarianceAuthority.cva(["flex items-center gap-2"],{variants:{scrollable:{true:"flex-nowrap overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden [&>*]:flex-none",false:"flex-wrap"}},defaultVariants:{scrollable:false}}),Wr=classVarianceAuthority.cva(["fixed inset-0 z-[80] bg-[rgb(23_23_23_/_0.42)]","motion-safe:data-[entering]:animate-in motion-safe:data-[entering]:fade-in-0","motion-safe:data-[exiting]:animate-out motion-safe:data-[exiting]:fade-out-0"]),Yr=classVarianceAuthority.cva(["fixed inset-x-0 bottom-0 z-[81] flex max-h-[88vh] flex-col","rounded-t-3xl border-t border-[var(--border)] bg-[var(--content-background)]","motion-safe:data-[entering]:animate-in motion-safe:data-[entering]:slide-in-from-bottom","motion-safe:data-[exiting]:animate-out motion-safe:data-[exiting]:slide-out-to-bottom"]),qr=classVarianceAuthority.cva(["flex items-center justify-between gap-2 px-5 py-3 border-b border-[var(--border)] flex-none"]),Xr=classVarianceAuthority.cva(["flex flex-col gap-5 overflow-auto p-5 flex-1","[&>*]:w-full"]),Zr=classVarianceAuthority.cva(["flex items-center justify-between gap-3 px-5 pt-3 flex-none","pb-[calc(0.75rem+env(safe-area-inset-bottom))] border-t border-[var(--border)]"]),Kr=classVarianceAuthority.cva(["mx-auto mt-2.5 mb-0.5 h-1.5 w-10 flex-none rounded-full bg-[var(--border)]"]),sn=classVarianceAuthority.cva(["inline-flex items-center gap-1.5 min-h-[44px] px-3 rounded-full","border border-[var(--border)] bg-[var(--accent-background)]","text-sm text-[var(--content-foreground)]","hover:bg-[var(--accent)] motion-safe:transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","cursor-pointer"]);function Ne({label:e,badge:t,isActive:r=false,children:a,doneLabel:n,align:s="start",className:d}){let i=t!=null&&t!=="";return jsxRuntime.jsxs(reactAriaComponents.DialogTrigger,{children:[jsxRuntime.jsxs(_,{variant:r?"secondary":"outline",className:m(Ee(),d),children:[jsxRuntime.jsx("span",{children:e}),i&&jsxRuntime.jsx(ce,{size:"sm",children:String(t)}),jsxRuntime.jsx(lucideReact.ChevronDown,{"aria-hidden":"true",className:"h-4 w-4 opacity-60"})]}),jsxRuntime.jsx(reactAriaComponents.Popover,{isNonModal:true,placement:s==="end"?"bottom end":"bottom start",className:gt(),children:jsxRuntime.jsx(reactAriaComponents.Dialog,{"aria-label":e,className:"outline-none",children:({close:u})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[n&&jsxRuntime.jsxs("div",{className:vt(),children:[jsxRuntime.jsx("span",{className:"text-xs font-bold uppercase tracking-wide text-[var(--menu-muted)]",children:e}),jsxRuntime.jsx(_,{variant:"link",onPress:u,children:n})]}),typeof a=="function"?a(u):a]})})})]})}function xn(e,t){typeof e=="function"?e(t):e&&(e.current=t);}var Ue=react.forwardRef(({chips:e,onRemove:t,onClearAll:r,clearAllLabel:a,removeChipLabel:n,scrollable:s=false,"aria-label":d="Active filters",className:i,"data-testid":u="applied-filters"},p)=>{let f=react.useRef(null);if(e.length===0)return null;let l='button,a[href],input,select,textarea,[tabindex]:not([tabindex="-1"])',o=(c,b)=>{let g=f.current;if(e.length<=1&&g){let h=g.previousElementSibling;((h?.matches(l)?h:h?.querySelector(l))??g).focus(),t(c);return}t(c),requestAnimationFrame(()=>{let h=f.current;if(!h)return;let C=h.querySelectorAll("[data-chip]");C.length>0?C[Math.min(b,C.length-1)]?.focus():h.focus();});};return jsxRuntime.jsxs("div",{ref:c=>{f.current=c,xn(p,c);},role:"region","aria-label":d,tabIndex:-1,className:m(ht({scrollable:s}),"outline-none",i),"data-testid":u,children:[e.map((c,b)=>jsxRuntime.jsxs(_,{variant:"outline","data-chip":true,"aria-label":n(`${c.group?`${c.group} `:""}${c.label}`),onPress:()=>o(c,b),children:[c.group&&jsxRuntime.jsx("span",{className:"text-xs font-bold uppercase tracking-wide opacity-60",children:c.group}),jsxRuntime.jsx("span",{className:"font-semibold",children:c.label}),jsxRuntime.jsx(lucideReact.X,{"aria-hidden":"true",className:"h-3.5 w-3.5 opacity-60"})]},c.id)),e.length>1&&jsxRuntime.jsx(_,{variant:"link",onPress:()=>{r(),requestAnimationFrame(()=>f.current?.focus());},children:a})]})});Ue.displayName="AppliedFilters";var $e=react.createContext(null);function W(e){let t=react.useContext($e);if(!t)throw new Error(`<${e}> must be rendered inside <Filters>.`);return t}var ea=react.forwardRef(({values:e,onChange:t,labels:r,narrow:a=false,children:n,"aria-label":s="Filters",className:d,"data-testid":i="filters"},u)=>{let p=react.useRef(new Map),[f,l]=react.useState(0),o=react.useRef(e);o.current=e;let c=react.useCallback((x,R)=>{t({...o.current,[x]:R});},[t]),b=react.useCallback(x=>t(x),[t]),g=react.useCallback((x,R)=>{R?p.current.set(x,R):p.current.delete(x),l(N=>N+1);},[]),y=react.useMemo(()=>({values:e,narrow:a,setValue:c,replaceValues:b,labels:r,registry:p,registryVersion:f,syncControl:g}),[e,a,c,b,r,f,g]),h=react.useMemo(()=>{let x=0;for(let[R,N]of p.current)N.isActive(e[R])&&(x+=1);return x},[e,f]),C=()=>{let x={...o.current};for(let[R,N]of p.current)x[R]=N.clearedValue;b(x);},[E,v]=react.useState(false),V=react.useRef(null),w=react.useRef(null),T=react.useRef(null),I=react.useCallback(()=>{v(false),requestAnimationFrame(()=>V.current?.focus());},[]);react.useEffect(()=>{if(!E)return;w.current?.querySelector('button,a[href],input,select,textarea,[tabindex]:not([tabindex="-1"])')?.focus();},[E]),react.useEffect(()=>{if(!E)return;let x=N=>{let G=N.target;T.current&&T.current.contains(G)&&I();},R=N=>{N.key==="Escape"&&(N.preventDefault(),I());};return document.addEventListener("pointerdown",x,true),document.addEventListener("keydown",R),()=>{document.removeEventListener("pointerdown",x,true),document.removeEventListener("keydown",R);}},[E,I]);let M=react.Children.toArray(n),k=x=>react.isValidElement(x)&&x.type===ta,F=M.filter(k),D=M.filter(x=>!k(x));return a?jsxRuntime.jsx($e.Provider,{value:y,children:jsxRuntime.jsxs("div",{ref:u,role:"region","aria-label":s,className:m("flex flex-col gap-3",d),"data-testid":i,children:[jsxRuntime.jsx("div",{children:jsxRuntime.jsxs(_,{ref:V,variant:"outline",className:Ee(),"aria-haspopup":"dialog","aria-expanded":E,onPress:()=>v(true),children:[jsxRuntime.jsx(lucideReact.SlidersHorizontal,{"aria-hidden":"true",className:"h-4 w-4"}),jsxRuntime.jsx("span",{children:r.filtersButton??s}),h>0&&jsxRuntime.jsx(ce,{size:"sm",children:String(h)})]})}),E&&jsxRuntime.jsx("div",{ref:T,className:Wr(),"aria-hidden":"true"}),jsxRuntime.jsx(reactAria.FocusScope,{contain:E,restoreFocus:true,children:jsxRuntime.jsxs("div",{ref:w,role:"dialog","aria-modal":E||void 0,"aria-label":s,className:E?Yr():"hidden",children:[jsxRuntime.jsx("span",{className:Kr(),"aria-hidden":"true"}),jsxRuntime.jsxs("div",{className:qr(),children:[jsxRuntime.jsx("span",{className:"text-lg font-semibold",children:r.filtersButton??s}),jsxRuntime.jsx(_,{variant:"ghost",visualSize:"icon","aria-label":r.close??"Close",onPress:I,children:jsxRuntime.jsx(lucideReact.X,{"aria-hidden":"true"})})]}),jsxRuntime.jsx("div",{className:Xr(),children:D}),jsxRuntime.jsxs("div",{className:Zr(),children:[jsxRuntime.jsx(_,{variant:"link",onPress:C,children:r.clearAll??r.clear}),jsxRuntime.jsx(_,{variant:"default",onPress:I,children:r.done})]})]})}),F]})}):jsxRuntime.jsx($e.Provider,{value:y,children:jsxRuntime.jsxs("div",{ref:u,role:"region","aria-label":s,className:m("flex flex-col gap-3",d),"data-testid":i,children:[jsxRuntime.jsx("div",{className:xt(),children:D}),F]})})});ea.displayName="Filters";function pe(e,t){let{syncControl:r}=W("Filter control");react.useEffect(()=>(r(e,t),()=>r(e,null)),[e,t,r]);}function Ct(e){return e.map(t=>`${t.value}\0${t.label}`).join("")}function Et(e,t){return e.find(r=>r.value===t)?.label??t}function Vn({name:e,label:t,placeholder:r,chipGroup:a,className:n}){let{values:s,setValue:d}=W("FilterSearch"),i=typeof s[e]=="string"?s[e]:"",u=react.useMemo(()=>({name:e,clearedValue:"",isActive:p=>typeof p=="string"&&p.trim()!=="",toChips:p=>typeof p=="string"&&p.trim()!==""?[{id:e,key:e,label:`\u201C${p}\u201D`,group:a??t}]:[]}),[e,t,a]);return pe(e,u),jsxRuntime.jsx(we,{"aria-label":t,placeholder:r,value:i,onChange:p=>d(e,p),onClear:()=>d(e,""),className:m("min-w-[14rem]",n)})}function Rn({name:e,label:t,className:r}){let{values:a,setValue:n}=W("FilterToggle"),s=a[e]===true,d=react.useMemo(()=>({name:e,clearedValue:false,isActive:i=>i===true,toChips:i=>i===true?[{id:e,key:e,label:t}]:[]}),[e,t]);return pe(e,d),jsxRuntime.jsx(Le,{label:t,isSelected:s,onChange:i=>n(e,!!i),className:r})}var St="__all__";function Tn({name:e,label:t,options:r,allLabel:a,className:n}){let{values:s,setValue:d,narrow:i}=W("FilterSelect"),u=typeof s[e]=="string"?s[e]:"",p=Ct(r),f=react.useMemo(()=>({name:e,clearedValue:"",isActive:l=>typeof l=="string"&&l!=="",toChips:l=>typeof l=="string"&&l!==""?[{id:e,key:e,label:Et(r,l),group:t}]:[]}),[e,t,p]);return pe(e,f),i?jsxRuntime.jsxs(Ce,{label:t,value:u===""?St:u,onChange:l=>{let o=Array.isArray(l)?l[0]:l;d(e,!o||o===St?"":o);},className:n,children:[jsxRuntime.jsx(Ce.Item,{value:St,children:a??"All"}),r.map(l=>jsxRuntime.jsx(Ce.Item,{value:l.value,children:l.label},l.value))]}):jsxRuntime.jsx(Ne,{label:t,isActive:u!=="",className:n,children:l=>jsxRuntime.jsxs(ve,{"aria-label":t,value:u,onChange:o=>{d(e,o),l();},children:[jsxRuntime.jsx(le,{value:"",children:a??"All"}),r.map(o=>jsxRuntime.jsx(le,{value:o.value,children:o.label},o.value))]})})}function In({name:e,label:t,presets:r,className:a}){let{values:n,setValue:s,narrow:d}=W("FilterWithin"),i=r[0]?.value??"",u=typeof n[e]=="string"?n[e]:i,p=Ct(r),f=react.useMemo(()=>({name:e,clearedValue:i,isActive:o=>typeof o=="string"&&o!==i,toChips:o=>typeof o=="string"&&o!==i?[{id:e,key:e,label:Et(r,o),group:t}]:[]}),[e,t,i,p]);pe(e,f);let l=o=>jsxRuntime.jsx(ve,{label:d?t:void 0,"aria-label":d?void 0:t,value:u,onChange:c=>{s(e,c),o?.();},className:d?a:void 0,children:r.map(c=>jsxRuntime.jsx(le,{value:c.value,children:c.label},c.value))});return d?l():jsxRuntime.jsx(Ne,{label:t,isActive:u!==i,className:a,children:o=>l(o)})}function Fn({name:e,label:t,options:r,className:a}){let{values:n,setValue:s,labels:d,narrow:i}=W("FilterMulti"),u=Array.isArray(n[e])?n[e]:[],p=Ct(r),f=react.useMemo(()=>({name:e,clearedValue:[],isActive:o=>Array.isArray(o)&&o.length>0,toChips:o=>Array.isArray(o)?o.map(c=>({id:`${e}:${c}`,key:e,optionValue:c,label:Et(r,c),group:t})):[]}),[e,t,p]);pe(e,f);let l=jsxRuntime.jsx(Oe,{label:i?t:void 0,"aria-label":i?void 0:t,value:u,onChange:o=>s(e,o),className:i?a:void 0,children:r.map(o=>jsxRuntime.jsx(Be,{value:o.value,children:o.label},o.value))});return i?l:jsxRuntime.jsxs(Ne,{label:t,badge:u.length||null,isActive:u.length>0,doneLabel:d.done,className:a,children:[l,u.length>0&&jsxRuntime.jsx("div",{className:"pt-1",children:jsxRuntime.jsx(_,{variant:"link",onPress:()=>s(e,[]),children:d.clear})})]})}function Pn({name:e,label:t,options:r,onSearch:a,isLoading:n,placeholder:s,className:d}){let{values:i,setValue:u}=W("FilterCombobox"),p=typeof i[e]=="string"?i[e]:"",f=react.useRef(new Map);for(let o of r)f.current.set(o.value,o.label);let l=react.useMemo(()=>({name:e,clearedValue:"",isActive:o=>typeof o=="string"&&o!=="",toChips:o=>typeof o=="string"&&o!==""?[{id:e,key:e,label:f.current.get(o)??o,group:t}]:[]}),[e,t]);return pe(e,l),jsxRuntime.jsx(Ge,{"aria-label":t,placeholder:s,selectedKey:p||null,onSelectionChange:o=>u(e,o==null?"":String(o)),onInputChange:a,className:m("min-w-[14rem]",d),children:r.length===0&&n?jsxRuntime.jsx(Se,{id:"__loading",isDisabled:true,children:"Loading\u2026"}):r.map(o=>jsxRuntime.jsx(Se,{id:o.value,children:o.label},o.value))})}function ta({clearAllLabel:e,removeChipLabel:t,"aria-label":r,className:a,"data-testid":n}){let{values:s,setValue:d,replaceValues:i,registry:u,narrow:p}=W("FilterChips"),f=[];for(let[c,b]of u.current)f.push(...b.toChips(s[c]));return jsxRuntime.jsx(Ue,{chips:f,onRemove:c=>{if(c.optionValue!==void 0){let b=s[c.key],g=Array.isArray(b)?b:[];d(c.key,g.filter(y=>y!==c.optionValue));}else {let b=u.current.get(c.key);d(c.key,b?b.clearedValue:"");}},onClearAll:()=>{let c={...s};for(let[b,g]of u.current)c[b]=g.clearedValue;i(c);},clearAllLabel:e,removeChipLabel:t,scrollable:p,"aria-label":r,className:a,"data-testid":n})}var An=zod.z.object({value:zod.z.string(),label:zod.z.string()});exports.AppliedFilters=Ue;exports.FilterChips=ta;exports.FilterCombobox=Pn;exports.FilterMulti=Fn;exports.FilterOptionSchema=An;exports.FilterPopover=Ne;exports.FilterSearch=Vn;exports.FilterSelect=Tn;exports.FilterToggle=Rn;exports.FilterWithin=In;exports.Filters=ea;exports.appliedFiltersVariants=ht;exports.filterChipVariants=sn;exports.filterPillVariants=Ee;exports.filterPopoverHeaderVariants=vt;exports.filterPopoverVariants=gt;exports.filtersBarVariants=xt;exports.useFiltersContext=W;//# sourceMappingURL=index.js.map
|
|
2
|
+
'use strict';var react=require('react'),reactAria=require('react-aria'),lucideReact=require('lucide-react'),reactAriaComponents=require('react-aria-components'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge'),classVarianceAuthority=require('class-variance-authority'),jsxRuntime=require('react/jsx-runtime'),zod=require('zod');function m(...e){return tailwindMerge.twMerge(clsx.clsx(e))}var te="data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--themis-ring)] data-[focus-visible]:ring-offset-2",be="data-[pressed]:scale-[0.97]";var Z="hc:data-[focus-visible]:outline hc:data-[focus-visible]:outline-4 hc:data-[focus-visible]:outline-offset-2 hc:data-[focus-visible]:outline-foreground",re="hc:data-[hovered]:outline hc:data-[hovered]:outline-2 hc:data-[hovered]:outline-foreground",ae="hc:data-[pressed]:outline hc:data-[pressed]:outline-2 hc:data-[pressed]:outline-offset-1 hc:data-[pressed]:outline-foreground",Ze="disabled:pointer-events-none disabled:opacity-50",kt=`${te} ${be} ${Z} ${re} ${ae}`;var Ke={sm:"text-xs",default:"text-sm",lg:"text-base"};var Ie={sm:"h-9",default:"h-10",lg:"h-11"},D={sm:`${Ie.sm} px-2 text-xs`,default:`${Ie.default} px-3 text-sm`,lg:`${Ie.lg} px-4 text-base`},K="min-h-[44px] flex items-center";var Qe=classVarianceAuthority.cva("inline-flex justify-center min-h-[44px] min-w-[44px] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50",{variants:{fullWidth:{true:"w-full",false:""},inVerticalGroup:{true:"items-stretch",false:"items-center"}},defaultVariants:{fullWidth:false,inVerticalGroup:false}}),Je=classVarianceAuthority.cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-normal ring-offset-background motion-safe:transition-transform motion-safe:duration-200 motion-safe:[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 relative cursor-pointer",{variants:{variant:{default:"bg-[var(--primary-action)] text-[var(--primary-action-foreground)] shadow-md hover:bg-[var(--primary-action-hover)] hover:-translate-y-1",destructive:"bg-[var(--destructive-background)] text-[var(--destructive-foreground)] hover:bg-[var(--destructive-background-hover,var(--destructive-background))] motion-safe:hover:btn-warn-shake",outline:"border border-[var(--input-border)] bg-[var(--page-background)] hover:bg-[var(--input-border)]",secondary:"bg-[var(--secondary)] text-[var(--secondary-foreground)] hover:bg-[var(--secondary-hover,var(--secondary))]",ghost:"hover:bg-[var(--accent)] hover:text-[var(--accent-foreground)]",link:"text-[var(--text-link)] underline underline-offset-4 hover:bg-[var(--accent)] hover:text-[var(--text-link-hover)]"},fullWidth:{true:"w-full",false:""},visualSize:{default:"h-10 px-4 py-2",sm:"h-9 rounded-md px-3 text-xs",lg:"h-11 rounded-md px-6 text-base",icon:"h-10 w-10",dot:"h-5 w-5 rounded-full p-0 min-h-0 min-w-0"},paywall:{true:"!bg-[var(--paywall)] !text-[var(--paywall-foreground)] hover:!bg-[var(--paywall)]/90 !cursor-not-allowed !border-transparent",false:""}},defaultVariants:{variant:"default",visualSize:"default",paywall:false}});var Dt=react.createContext(null);Dt.displayName="ButtonGroupContext";function Bt(){return react.useContext(Dt)}var Gt=react.createContext(null);Gt.displayName="ButtonGroupItemContext";function Mt(){return react.useContext(Gt)}classVarianceAuthority.cva("inline-flex items-center gap-0",{variants:{orientation:{horizontal:"flex-row",vertical:"flex-col w-full"}},defaultVariants:{orientation:"horizontal"}});var Ht=classVarianceAuthority.cva("",{variants:{orientation:{horizontal:"min-w-[44px]",vertical:"flex min-h-[44px]"},position:{first:"",middle:"",last:"",only:""}},compoundVariants:[{orientation:"horizontal",position:"first",className:"rounded-r-none border-r-0"},{orientation:"horizontal",position:"middle",className:"rounded-none border-r-0"},{orientation:"horizontal",position:"last",className:"rounded-l-none"},{orientation:"vertical",position:"first",className:"rounded-b-none border-b-0"},{orientation:"vertical",position:"middle",className:"rounded-none border-b-0"},{orientation:"vertical",position:"last",className:"rounded-t-none"}],defaultVariants:{orientation:"horizontal",position:"only"}});classVarianceAuthority.cva("bg-[var(--border)]",{variants:{orientation:{horizontal:"w-px h-6 mx-1",vertical:"h-px w-full my-1"}},defaultVariants:{orientation:"horizontal"}});var _=react.memo(react.forwardRef(({className:e,buttonVisualClassName:t,variant:r,size:a,visualSize:o,fullWidth:s,loading:d=false,loadingText:i="Loading...",shortcut:u,children:p,isDisabled:f,paywall:l=false,paywallRedirect:n,paywallDescription:c,onPress:b,...g},y)=>{let h=react.useId(),C=Bt(),E=Mt(),v=r??C?.variant??"default",V=a??C?.size,w=f??C?.isDisabled??false,T=C?.orientation==="vertical",I=s||T,M=E?Ht({orientation:C?.orientation??"horizontal",position:E.position}):"",k=o??V??"default";return process.env.NODE_ENV!=="production"&&(k==="dot"||k==="icon")&&!g["aria-label"]&&!p&&console.warn('[Button] visualSize="dot" or "icon" requires aria-label when no visible text is provided (WCAG 1.1.1)'),jsxRuntime.jsx(reactAriaComponents.Button,{ref:y,isDisabled:w||d||void 0,"aria-disabled":l?true:void 0,"aria-describedby":l?h:void 0,onPress:x=>{if(l){n&&window.open(n,"_blank","noopener,noreferrer");return}b?.(x);},className:m(Qe({fullWidth:I,inVerticalGroup:T}),e),...g,children:x=>jsxRuntime.jsxs("span",{className:m(Je({variant:v,visualSize:k,paywall:l,fullWidth:I}),M,t,be,"",re,ae),"data-pressed":x.isPressed||void 0,children:[d&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(lucideReact.Loader2,{className:"motion-safe:animate-spin","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:"sr-only","aria-live":"polite",children:i})]}),!d&&p,l&&jsxRuntime.jsx(lucideReact.Zap,{"data-testid":"zap-icon","aria-hidden":"true",className:"ml-1"}),l&&jsxRuntime.jsxs("span",{id:h,className:"sr-only",children:["Premium feature: ",c||"Upgrade required to access this feature"]}),x.isFocusVisible&&u&&jsxRuntime.jsx("kbd",{className:"ml-auto hidden text-xs opacity-60 lg:inline",children:u})]})})}));_.displayName="Button";var zt=()=>jsxRuntime.jsxs("svg",{"data-testid":"password-toggle-icon-show",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M1 8s3-5 7-5 7 5 7 5-3 5-7 5-7-5-7-5z"}),jsxRuntime.jsx("circle",{cx:"8",cy:"8",r:"2"})]}),Ut=()=>jsxRuntime.jsxs("svg",{"data-testid":"password-toggle-icon-hide",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[jsxRuntime.jsx("path",{d:"M10.5 5.5l-5 5"}),jsxRuntime.jsx("path",{d:"M1 8s3-5 7-5c1.5 0 2.8.6 4 1.5M15 8s-1.5 2.5-4 4"}),jsxRuntime.jsx("path",{d:"M3 13l2-2m7-7l2-2"}),jsxRuntime.jsx("circle",{cx:"8",cy:"8",r:"2"})]});var at=classVarianceAuthority.cva("flex w-full rounded-md border bg-[var(--content-background)] px-3 py-2 text-sm ring-offset-[var(--content-background)] file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-[var(--content-foreground)] placeholder:text-[var(--menu-muted)] transition-all duration-200",{variants:{size:{sm:`${D.sm} py-1`,default:`${D.default} py-2`,lg:`${D.lg} py-3`},state:{default:"border-[var(--input-border)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2",error:"border-[var(--destructive-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--destructive-background)] focus-visible:ring-offset-2",success:"border-[var(--success-background)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--success-ring)] focus-visible:ring-offset-2",disabled:"cursor-not-allowed opacity-50",readonly:"cursor-default bg-[var(--content-background)] opacity-70"}},defaultVariants:{size:"default",state:"default"}}),ot=classVarianceAuthority.cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",{variants:{state:{default:"text-[var(--content-foreground)]",disabled:"opacity-50 cursor-not-allowed"}},defaultVariants:{state:"default"}}),nt=classVarianceAuthority.cva("text-sm text-[var(--content-foreground)]"),Wt=classVarianceAuthority.cva("text-sm text-[var(--destructive-background)] font-medium"),it=classVarianceAuthority.cva("text-sm text-[var(--success-foreground)] font-medium");function Yt({expandOnFocus:e,collapsedWidth:t,value:r,defaultValue:a,userOnFocus:o,userOnBlur:s}){let[d,i]=react.useState(false),u=react.useCallback(l=>{e&&i(true),o?.(l);},[e,o]),p=react.useCallback(l=>{e&&l.target.value===""&&i(false),s?.(l);},[e,s]),f=react.useMemo(()=>e?d||(r!==void 0?r!=="":a!==void 0&&a!=="")?"100%":t:void 0,[e,d,r,a,t]);return {handleFocus:u,handleBlur:p,inputWidth:f}}function qt({disableCopyPaste:e}){let[t,r]=react.useState(false),[a,o]=react.useState("");react.useEffect(()=>{e&&typeof process<"u"&&process.env.NODE_ENV==="development"&&console.warn("[TextField] Copy/paste prevention should only be used for security-critical fields like password confirmation. This feature can break assistive technology workflows and password managers.");},[e]);let s=react.useCallback(d=>{e&&(d.preventDefault(),r(true),o("Pasting is not allowed in this field. Please type your entry."),setTimeout(()=>{r(false),o("");},250));},[e]);return {isShaking:t,screenReaderMessage:a,handlePaste:s}}function Xt({type:e,showPasswordToggle:t}){let[r,a]=react.useState(false),o=react.useCallback(()=>{a(d=>!d);},[]),s=react.useMemo(()=>e==="password"&&t&&r?"text":e,[e,t,r]);return {showPassword:r,actualType:s,handlePasswordToggle:o}}var wa=react.forwardRef(({className:e,state:t="default",children:r,...a},o)=>jsxRuntime.jsx(reactAriaComponents.Label,{ref:o,className:m(ot({state:t}),e),...a,children:r}));wa.displayName="TextFieldLabel";var ka=react.forwardRef(({className:e,size:t="default",state:r="default",...a},o)=>jsxRuntime.jsx(reactAriaComponents.Input,{ref:o,className:m(at({size:t,state:r}),Ze,e),...a}));ka.displayName="TextFieldInput";var La=react.forwardRef(({className:e,children:t,...r},a)=>jsxRuntime.jsx(reactAriaComponents.Text,{ref:a,slot:"description",className:m(nt(),e),...r,children:t}));La.displayName="TextFieldDescription";var Jt=react.forwardRef(({className:e,children:t,...r},a)=>jsxRuntime.jsx(reactAriaComponents.FieldError,{ref:a,...r,className:m(Wt(),e),children:t}));Jt.displayName="TextFieldError";var _a=react.forwardRef(({className:e,children:t,...r},a)=>jsxRuntime.jsx(reactAriaComponents.Text,{ref:a,slot:"description",className:m(it(),e),...r,children:t}));_a.displayName="TextFieldSuccess";var lt=react.forwardRef(({className:e,size:t="default",label:r,labelHint:a,description:o,errorMessage:s,successMessage:d,type:i="text",isRequired:u=false,isReadOnly:p=false,isDisabled:f=false,isInvalid:l=false,isValid:n=false,id:c,autoComplete:b,disableCopyPaste:g=false,pattern:y,patternDescription:h,expandOnFocus:C=false,collapsedWidth:E="200px",prefix:v,suffix:V,prefixSize:w=16,suffixSize:T=16,showPasswordToggle:I,isIconHidden:M=false,onSubmit:k,onClear:P,value:O,defaultValue:x,onFocus:R,onBlur:N,...G},Ye)=>{let Re=react.useId(),aa=react.useId(),oa=c||aa,{handleFocus:na,handleBlur:ia,inputWidth:sa}=Yt({expandOnFocus:C,collapsedWidth:E,value:O,defaultValue:x,userOnFocus:R,userOnBlur:N}),{isShaking:la,screenReaderMessage:Rt,handlePaste:da}=qt({disableCopyPaste:g}),{showPassword:qe,actualType:ca,handlePasswordToggle:Tt}=Xt({type:i,showPasswordToggle:I}),W=i==="search",[ua,It]=react.useState(x??""),me=O!==void 0,Y=me?O:ua,pa=react.useCallback(L=>{me||It(L),G.onChange?.(L);},[me,G]),Te=react.useCallback(()=>{me||It(""),G.onChange?.(""),P?.();},[me,G,P]),fa=react.useCallback(L=>{L.key==="Enter"&&k&&k(Y),L.key==="Escape"&&Y&&(L.preventDefault(),Te());},[Y,k,Te]),ma=react.useMemo(()=>f?"disabled":p?"readonly":l?"error":n?"success":"default",[f,p,l,n]),ba=react.useMemo(()=>f?"disabled":"default",[f]),Pt=react.useMemo(()=>o&&h?`${o} ${h}`:o||h,[o,h]),ee=react.useMemo(()=>W&&!M&&!v?jsxRuntime.jsx(lucideReact.Search,{className:t==="sm"?"h-3.5 w-3.5":t==="lg"?"h-5 w-5":"h-4 w-4"}):v,[W,M,v,t]),Ft=react.useMemo(()=>{let L={left:12,right:12};if(ee){let Xe=typeof ee=="string"?ee.length*8+16:w+16;L.left=Xe;}if(i==="password"&&I)L.right=32;else if(W&&Y)L.right=44;else if(V){let Xe=typeof V=="string"?V.length*8+16:T+16;L.right=Xe;}return L},[ee,v,V,w,T,i,I,W,Y]),At=react.useMemo(()=>i==="password"&&I?jsxRuntime.jsx(_,{variant:"ghost",visualSize:"icon",onPress:Tt,"aria-label":qe?"Hide password":"Show password",className:"!min-h-0 !min-w-0 h-8 w-8",children:qe?jsxRuntime.jsx(Ut,{}):jsxRuntime.jsx(zt,{})}):W&&Y?jsxRuntime.jsx(_,{variant:"ghost",visualSize:"icon",onPress:Te,"aria-label":"Clear search",className:"!min-h-0 !min-w-0 h-8 w-8",children:jsxRuntime.jsx(lucideReact.X,{className:t==="sm"?"h-3 w-3":t==="lg"?"h-5 w-5":"h-4 w-4"})}):V,[i,I,qe,V,Tt,W,Y,t,Te]),wt=i==="password"&&I||W&&!!Y;return jsxRuntime.jsxs(reactAriaComponents.TextField,{ref:Ye,className:m("flex flex-col gap-1.5",e),isRequired:u,isReadOnly:p,isDisabled:f,isInvalid:l,value:W?Y:O,defaultValue:W?void 0:x,onChange:W?pa:void 0,...G,children:[r&&jsxRuntime.jsxs(reactAriaComponents.Label,{className:m(ot({state:ba}),a&&"flex items-baseline justify-between"),children:[jsxRuntime.jsxs("span",{children:[r,u&&jsxRuntime.jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:jsxRuntime.jsx("strong",{children:"*"})})]}),a&&jsxRuntime.jsx("span",{className:"text-xs font-normal text-[var(--muted-foreground)]",children:a})]}),Pt&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"description",className:m(nt()),children:Pt}),jsxRuntime.jsxs("div",{className:m(K,"relative cursor-text motion-safe:transition-colors motion-safe:duration-200"),style:{width:sa},onClick:L=>{L.target===L.currentTarget&&L.currentTarget.querySelector("input")?.focus();},children:[ee&&jsxRuntime.jsx("div",{"data-testid":"textfield-prefix",className:"absolute left-3 flex items-center justify-center pointer-events-none text-[var(--content-foreground)]","aria-hidden":"true",children:ee}),jsxRuntime.jsx(reactAriaComponents.Input,{type:ca,id:oa,className:m(at({size:t,state:ma}),Ze,la&&"shake"),style:{width:"100%",paddingLeft:`${Ft.left}px`,paddingRight:`${Ft.right}px`},autoComplete:b,pattern:y,onPaste:da,onFocus:na,onBlur:ia,onKeyDown:W?fa:void 0,"aria-required":u?"true":void 0,"aria-readonly":p?"true":void 0,"aria-errormessage":l&&s?Re:void 0}),At&&jsxRuntime.jsx("div",{"data-testid":"textfield-suffix",className:m("absolute right-3 flex items-center justify-center text-[var(--content-foreground)]",wt?"":"pointer-events-none"),"aria-hidden":wt?void 0:"true",children:At})]}),n&&d&&!l&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"description",className:m(it()),children:d}),l&&s&&jsxRuntime.jsx(Jt,{id:Re,children:s}),Rt&&jsxRuntime.jsx("div",{className:"sr-only",role:"status","aria-live":"polite","aria-atomic":"true",children:Rt})]})});lt.displayName="TextField";var ke=react.forwardRef(({label:e,description:t,errorMessage:r,"aria-label":a,"aria-labelledby":o,...s},d)=>(process.env.NODE_ENV!=="production"&&!e&&!a&&!o&&console.warn("[SearchField] Either label, aria-label, or aria-labelledby is required for accessibility (WCAG 1.1.1)"),jsxRuntime.jsx(lt,{ref:d,type:"search",label:e,description:r?void 0:t,errorMessage:r,isInvalid:!!r,"aria-label":e?void 0:a,"aria-labelledby":o,...s})));ke.displayName="SearchField";function er(e,t){return !(e===false||t)}var tr="(prefers-reduced-motion: reduce)";function Ma(){return typeof window>"u"?false:window.matchMedia(tr).matches}function rr(){let[e,t]=react.useState(Ma);return react.useEffect(()=>{let r=window.matchMedia(tr);t(r.matches);let a=o=>{t(o.matches);};return r.addEventListener("change",a),()=>r.removeEventListener("change",a)},[]),e}var ve;function ja(){return ve!==void 0?Promise.resolve(ve):import('motion').then(e=>(ve=e.animate,ve)).catch(()=>(ve=null,null))}var Ya={stiffness:500,damping:30},or=classVarianceAuthority.cva("inline-flex shrink-0 cursor-pointer items-center justify-center min-h-[44px] min-w-[44px] disabled:cursor-not-allowed disabled:opacity-50 data-[readonly]:cursor-default",{variants:{},defaultVariants:{}}),nr=classVarianceAuthority.cva("relative inline-flex shrink-0 items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2 focus-visible:ring-offset-background",{variants:{variant:{default:"bg-[var(--border)] data-[selected]:bg-[var(--primary)]",destructive:"bg-[var(--border)] data-[selected]:bg-[var(--destructive-background)]"},size:{sm:"h-6 w-10",default:"h-7 w-12",lg:"h-8 w-14"}},defaultVariants:{variant:"default",size:"default"}}),ir=classVarianceAuthority.cva("pointer-events-none absolute left-0.5 rounded-full bg-[var(--content-background)] ring-0",{variants:{size:{sm:"h-4 w-4",default:"h-5 w-5",lg:"h-6 w-6"},animated:{false:"transition-transform data-[selected]:translate-x-full",true:""}},defaultVariants:{size:"default",animated:false}}),_e=react.memo(react.forwardRef(({className:e,variant:t,size:r,label:a,description:o,isDisabled:s,isReadOnly:d,animated:i,springConfig:u=Ya,onChange:p,...f},l)=>{let n=rr(),c=er(i,n),b=react.useRef(null),g=react.useRef(false),y=react.useRef(null),h=react.useRef(null);react.useEffect(()=>{c&&ja().then(v=>{if(v&&(y.current=v,g.current=true,b.current)){let V=b.current.hasAttribute("data-selected");b.current.style.transform=V?"translateX(100%)":"translateX(0)";}});},[c]);let C=react.useCallback(v=>{p?.(v),c&&g.current&&y.current&&b.current&&(h.current?.stop(),h.current=y.current(b.current,{x:v?"100%":"0%"},{type:"spring",stiffness:u.stiffness,damping:u.damping}));},[c,u.stiffness,u.damping,p]),E=c;return jsxRuntime.jsx(reactAriaComponents.Switch,{ref:l,isDisabled:s,isReadOnly:d,onChange:C,className:v=>m("group inline-flex items-center gap-2",s&&"cursor-not-allowed opacity-50",e),...f,children:v=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:m(or()),"data-selected":v.isSelected||void 0,"data-readonly":d||void 0,children:jsxRuntime.jsx("div",{className:m(nr({variant:t,size:r}),kt),"data-selected":v.isSelected||void 0,children:jsxRuntime.jsx("div",{ref:b,className:m(ir({size:r,animated:E})),"data-selected":v.isSelected||void 0})})}),(a||o)&&jsxRuntime.jsxs("div",{className:"flex flex-col",children:[a&&jsxRuntime.jsx("span",{className:"text-sm font-medium text-[var(--content-foreground)]",children:a}),o&&jsxRuntime.jsx("span",{className:"text-xs text-[var(--menu-muted)]",children:o})]})]})})}));_e.displayName="Switch";var sr=react.createContext({variant:"default",size:"default",isInvalid:false}),oo=classVarianceAuthority.cva("flex",{variants:{orientation:{vertical:"flex-col gap-2",horizontal:"flex-row flex-wrap gap-2"}},defaultVariants:{orientation:"vertical"}}),no=classVarianceAuthority.cva(["flex items-center gap-3 rounded-md border cursor-pointer","transition-colors duration-200","rtl:flex-row-reverse",te,Z].join(" "),{variants:{variant:{default:["border-[var(--border)]","data-[hovered]:bg-[var(--accent)]/10","data-[selected]:border-[var(--primary)]","data-[selected]:bg-[var(--primary)]/10"].join(" "),destructive:["border-[var(--border)]","data-[hovered]:bg-[var(--destructive-background)]/10","data-[selected]:border-[var(--destructive-background)]","data-[selected]:bg-[var(--destructive-background)]/10"].join(" ")},size:{sm:"min-h-[44px] py-2 px-3 text-sm",default:"min-h-[48px] py-3 px-4 text-sm",lg:"min-h-[56px] py-4 px-5 text-base"},isDisabled:{true:"opacity-50 cursor-not-allowed",false:""},isInvalid:{true:"border-[var(--destructive-background)]",false:""}},defaultVariants:{variant:"default",size:"default",isDisabled:false,isInvalid:false}}),io=classVarianceAuthority.cva("flex-shrink-0 rounded-full border-2 flex items-center justify-center transition-colors duration-200",{variants:{variant:{default:["border-[var(--border)]","data-[selected]:border-[var(--primary)]"].join(" "),destructive:["border-[var(--border)]","data-[selected]:border-[var(--destructive-background)]"].join(" ")},size:{sm:"h-4 w-4",default:"h-5 w-5",lg:"h-6 w-6"}},defaultVariants:{variant:"default",size:"default"}}),so=classVarianceAuthority.cva(["rounded-full transition-transform duration-200","[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]","motion-reduce:transition-none","scale-0 data-[selected]:scale-100"].join(" "),{variants:{variant:{default:"bg-[var(--primary)]",destructive:"bg-[var(--destructive-background)]"},size:{sm:"h-2 w-2",default:"h-2.5 w-2.5",lg:"h-3 w-3"}},defaultVariants:{variant:"default",size:"default"}});function lr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("font-medium text-[var(--content-foreground)]",t),children:e})}lr.displayName="Radio.Label";function dr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("text-sm text-[var(--menu-muted)]",t),children:e})}dr.displayName="Radio.Description";function lo({value:e,isDisabled:t,children:r,className:a}){let{variant:o,size:s,isInvalid:d}=react.useContext(sr);return jsxRuntime.jsx(reactAriaComponents.Radio,{value:e,isDisabled:t,className:i=>m(no({variant:o,size:s,isDisabled:i.isDisabled,isInvalid:d}),a),children:i=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:io({variant:o,size:s}),"data-selected":i.isSelected||void 0,children:jsxRuntime.jsx("div",{className:so({variant:o,size:s}),"data-selected":i.isSelected||void 0})}),jsxRuntime.jsx("div",{className:"flex-1 flex flex-col",children:r})]})})}var le=Object.assign(lo,{Label:lr,Description:dr});le.displayName="Radio";var he=react.forwardRef(function(t,r){let{label:a,description:o,errorMessage:s,value:d,defaultValue:i,isDisabled:u=false,isReadOnly:p=false,isRequired:f=false,isInvalid:l=false,orientation:n="vertical",variant:c="default",size:b="default",name:g,onChange:y,onFocusChange:h,className:C,children:E,id:v,"aria-label":V,"aria-labelledby":w,"aria-describedby":T,"data-testid":I,...M}=t,k=react.useId(),P=v??k,O=`${P}-label`,x=`${P}-description`,R=`${P}-error`,N=[];T&&N.push(T),o&&N.push(x),l&&s&&N.push(R);let G=N.length>0?N.join(" "):void 0;return jsxRuntime.jsx(sr.Provider,{value:{variant:c,size:b,isInvalid:l},children:jsxRuntime.jsxs(reactAriaComponents.RadioGroup,{ref:r,id:P,name:g,value:d??void 0,defaultValue:i??void 0,isDisabled:u,isReadOnly:p,isRequired:f,isInvalid:l,orientation:n,onChange:y,onFocusChange:h,"aria-label":V,"aria-labelledby":a?O:w,"aria-describedby":G,"data-testid":I,"data-orientation":n,className:m("flex flex-col gap-1.5",C),...M,children:[a&&jsxRuntime.jsxs(reactAriaComponents.Label,{id:O,className:"text-sm font-medium text-[var(--content-foreground)]",children:[a,f&&jsxRuntime.jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:"*"})]}),o&&jsxRuntime.jsx(reactAriaComponents.Text,{id:x,slot:"description",className:"text-sm text-[var(--menu-muted)]",children:o}),jsxRuntime.jsx("div",{className:oo({orientation:n}),children:E}),l&&s&&jsxRuntime.jsx(reactAriaComponents.FieldError,{id:R,className:"text-sm text-[var(--destructive-background)]",children:jsxRuntime.jsx("span",{role:"alert",children:s})})]})})});he.displayName="RadioGroup";var ur=react.createContext({variant:"default",size:"default",isInvalid:false,isDisabled:false,isReadOnly:false}),pr=classVarianceAuthority.cva("flex",{variants:{orientation:{vertical:"flex-col gap-2",horizontal:"flex-row flex-wrap gap-2"}},defaultVariants:{orientation:"vertical"}}),fr=classVarianceAuthority.cva(["flex items-center gap-3 rounded-md border cursor-pointer","transition-colors duration-200","rtl:flex-row-reverse",te,Z].join(" "),{variants:{variant:{default:["border-[var(--border)]","data-[hovered]:bg-[var(--accent)]/10","data-[selected]:border-[var(--primary)]","data-[selected]:bg-[var(--primary)]/10"].join(" "),destructive:["border-[var(--border)]","data-[hovered]:bg-[var(--destructive-background)]/10","data-[selected]:border-[var(--destructive-background)]","data-[selected]:bg-[var(--destructive-background)]/10"].join(" ")},size:{sm:"min-h-[44px] py-2 px-3 text-sm",default:"min-h-[48px] py-3 px-4 text-sm",lg:"min-h-[56px] py-4 px-5 text-base"},isDisabled:{true:"opacity-50 cursor-not-allowed",false:""},isReadOnly:{true:"cursor-default",false:""},isInvalid:{true:"border-[var(--destructive-background)]",false:""}},defaultVariants:{variant:"default",size:"default",isDisabled:false,isReadOnly:false,isInvalid:false}}),mr=classVarianceAuthority.cva("flex-shrink-0 rounded-sm border-2 flex items-center justify-center transition-colors duration-200",{variants:{variant:{default:["border-[var(--border)]","data-[selected]:border-[var(--primary)]","data-[selected]:bg-[var(--primary)]"].join(" "),destructive:["border-[var(--border)]","data-[selected]:border-[var(--destructive-background)]","data-[selected]:bg-[var(--destructive-background)]"].join(" ")},size:{sm:"h-4 w-4",default:"h-5 w-5",lg:"h-6 w-6"}},defaultVariants:{variant:"default",size:"default"}}),br=classVarianceAuthority.cva(["transition-transform duration-200","[transition-timing-function:cubic-bezier(0.34,1.56,0.64,1)]","motion-reduce:transition-none","scale-0 data-[selected]:scale-100"].join(" "),{variants:{variant:{default:"text-[var(--primary-foreground)]",destructive:"text-[var(--destructive-foreground)]"},size:{sm:"h-3 w-3",default:"h-3.5 w-3.5",lg:"h-4 w-4"}},defaultVariants:{variant:"default",size:"default"}});function xr({className:e,...t}){return jsxRuntime.jsx("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:3,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",...t,children:jsxRuntime.jsx("polyline",{points:"20 6 9 17 4 12"})})}function gr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("font-medium text-[var(--content-foreground)]",t),children:e})}gr.displayName="Checkbox.Label";function vr({children:e,className:t}){return jsxRuntime.jsx("span",{className:m("text-sm text-[var(--menu-muted)]",t),children:e})}vr.displayName="Checkbox.Description";function Co({value:e,isDisabled:t,children:r,className:a,selectedIcon:o}){let{variant:s,size:d,isInvalid:i,isDisabled:u,isReadOnly:p}=react.useContext(ur),f=t||u,l=n=>{let c=m(br({variant:s,size:d})),b=n||void 0;if(o){if(react.isValidElement(o)){let g=o;return react.cloneElement(g,{className:m(c,g.props.className),"data-selected":b})}return jsxRuntime.jsx("span",{className:c,"data-selected":b,children:o})}return jsxRuntime.jsx(xr,{className:c,"data-selected":b})};return jsxRuntime.jsx(reactAriaComponents.Checkbox,{value:e,isDisabled:f,className:n=>m(fr({variant:s,size:d,isDisabled:n.isDisabled,isReadOnly:p,isInvalid:i}),a),children:n=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("div",{className:mr({variant:s,size:d}),"data-selected":n.isSelected||void 0,children:l(n.isSelected)}),jsxRuntime.jsx("div",{className:"flex-1 flex flex-col",children:r})]})})}var Be=Object.assign(Co,{Label:gr,Description:vr});Be.displayName="Checkbox";function cr(e,t){if(!e)return e;let r=[...new Set(e)];return process.env.NODE_ENV!=="production"&&r.length!==e.length&&console.warn(`[${t}] Received duplicate values in value/defaultValue prop. Original: [${e.join(", ")}], Deduplicated: [${r.join(", ")}]. Duplicate values are automatically removed.`),r}var Ge=react.forwardRef(function(t,r){let{label:a,description:o,errorMessage:s,value:d,defaultValue:i,isDisabled:u=false,isReadOnly:p=false,isRequired:f=false,isInvalid:l=false,orientation:n="vertical",variant:c="default",size:b="default",name:g,onChange:y,onFocusChange:h,className:C,children:E,id:v,"aria-label":V,"aria-labelledby":w,"aria-describedby":T,"data-testid":I,...M}=t,k=react.useId(),P=v??k,O=`${P}-label`,x=`${P}-description`,R=`${P}-error`,N=[];T&&N.push(T),o&&N.push(x),l&&s&&N.push(R);let G=N.length>0?N.join(" "):void 0,Ye=cr(d,"CheckboxGroup"),Re=cr(i,"CheckboxGroup");return jsxRuntime.jsx(ur.Provider,{value:{variant:c,size:b,isInvalid:l,isDisabled:u,isReadOnly:p},children:jsxRuntime.jsxs(reactAriaComponents.CheckboxGroup,{ref:r,id:P,name:g,value:Ye,defaultValue:Re,isDisabled:u,isReadOnly:p,isRequired:f,isInvalid:l,onChange:y,onFocusChange:h,"aria-label":V,"aria-labelledby":a?O:w,"aria-describedby":G,"aria-orientation":n,"aria-required":f||void 0,"aria-invalid":l||void 0,"data-testid":I,className:m("flex flex-col gap-1.5",C),...M,children:[a&&jsxRuntime.jsxs(reactAriaComponents.Label,{id:O,className:"text-sm font-medium text-[var(--content-foreground)]",children:[a,f&&jsxRuntime.jsx("span",{className:"ml-1 text-[var(--destructive-background)]","aria-hidden":"true",children:"*"})]}),o&&jsxRuntime.jsx(reactAriaComponents.Text,{id:x,slot:"description",className:"text-sm text-[var(--menu-muted)]",children:o}),jsxRuntime.jsx("div",{className:pr({orientation:n}),children:E}),l&&s&&jsxRuntime.jsx(reactAriaComponents.FieldError,{id:R,className:"text-sm text-[var(--destructive-background)]",children:jsxRuntime.jsx("span",{role:"alert",children:s})})]})})});Ge.displayName="CheckboxGroup";function No(e){if(!(e instanceof Element))return false;let t=e;for(let o=0;t&&o<100;o++){let s=t.tagName?.toLowerCase()??"";if(s.startsWith("grammarly-")||s.startsWith("lt-")||t.hasAttribute("data-grammarly-shadow-root"))return true;if(t.parentElement)t=t.parentElement;else {let d=t.getRootNode();t=d instanceof ShadowRoot?d.host:null;}}let r=e;for(;r&&!r.tagName.includes("-");)r=r.parentElement;if(!r)return false;let a=r.parentElement;return a===document.body||a===document.documentElement}function de(e){return t=>!No(t)&&(e?.(t)??true)}var hr=classVarianceAuthority.cva("group flex flex-col gap-1.5 w-full",{variants:{size:{sm:"",default:"",lg:""}},defaultVariants:{size:"default"}}),Sr=classVarianceAuthority.cva("text-[var(--text-primary)] font-medium",{variants:{size:{sm:"text-xs",default:"text-sm",lg:"text-base"}},defaultVariants:{size:"default"}}),yr=classVarianceAuthority.cva(["flex-1 bg-transparent outline-none","placeholder:text-[var(--muted-foreground)]","disabled:cursor-not-allowed"],{variants:{size:Ke},defaultVariants:{size:"default"}}),Cr=classVarianceAuthority.cva(["flex items-center w-full rounded-md border","bg-[var(--input-background)] text-[var(--content-foreground)]","border-[var(--input-border)]","transition-colors duration-[var(--transition-fast)]","focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-[var(--ring-offset)]","data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50","data-[invalid]:border-[var(--destructive-background)]"],{variants:{size:{sm:`${D.sm} gap-1`,default:`${D.default} gap-2`,lg:`${D.lg} gap-2`}},defaultVariants:{size:"default"}}),Er=classVarianceAuthority.cva(["flex items-center justify-center shrink-0","text-[var(--muted-foreground)]","hover:text-[var(--text-primary)]","transition-colors","focus:outline-none"],{variants:{size:{sm:"h-4 w-4 min-h-[44px] min-w-[44px]",default:"h-5 w-5 min-h-[44px] min-w-[44px]",lg:"h-6 w-6 min-h-[44px] min-w-[44px]"}},defaultVariants:{size:"default"}}),Nr=classVarianceAuthority.cva(["w-[var(--trigger-width)] overflow-auto","rounded-md border border-[var(--border)]","bg-[var(--content-background)] text-[var(--content-foreground)]","data-[entering]:motion-safe:animate-in data-[entering]:motion-safe:fade-in-0","data-[exiting]:motion-safe:animate-out data-[exiting]:motion-safe:fade-out-0"]),Vr=classVarianceAuthority.cva("p-1 outline-none max-h-[300px] overflow-auto"),Rr=classVarianceAuthority.cva(["flex items-center gap-2 w-full rounded-sm px-2 py-1.5","text-[var(--content-foreground)]","cursor-pointer outline-none","data-[focused]:bg-[var(--accent-background)] data-[focused]:text-[var(--accent-foreground)]","data-[selected]:font-medium","data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed"],{variants:{size:{sm:"text-xs min-h-[44px]",default:"text-sm min-h-[44px]",lg:"text-base min-h-[44px]"}},defaultVariants:{size:"default"}});classVarianceAuthority.cva("pt-1");classVarianceAuthority.cva("px-2 py-1.5 text-xs font-semibold text-[var(--muted-foreground)]");var Pr=classVarianceAuthority.cva("text-[var(--muted-foreground)]",{variants:{size:{sm:"text-xs",default:"text-xs",lg:"text-sm"}},defaultVariants:{size:"default"}}),Fr=classVarianceAuthority.cva("text-[var(--destructive-background)]",{variants:{size:{sm:"text-xs",default:"text-xs",lg:"text-sm"}},defaultVariants:{size:"default"}});var Me=react.forwardRef(({className:e,size:t="default",label:r,description:a,errorMessage:o,isRequired:s,isDisabled:d,isReadOnly:i,placeholder:u,name:p,allowsCustomValue:f=false,menuTrigger:l="input",defaultInputValue:n,inputValue:c,defaultSelectedKey:b,selectedKey:g,onInputChange:y,onSelectionChange:h,children:C,"aria-label":E,"aria-labelledby":v,"data-testid":V,...w},T)=>(process.env.NODE_ENV!=="production"&&!r&&!E&&!v&&console.warn("[Combobox] Either label, aria-label, or aria-labelledby is required for accessibility (WCAG 1.1.1)"),jsxRuntime.jsxs(reactAriaComponents.ComboBox,{ref:T,className:m(hr({size:t}),e),isRequired:s,isDisabled:d,isReadOnly:i,name:p,allowsCustomValue:f,menuTrigger:l,defaultInputValue:n,inputValue:c,defaultSelectedKey:b,selectedKey:g,onInputChange:y,onSelectionChange:h,"aria-label":r?void 0:E,"aria-labelledby":v,"data-testid":V,...w,children:[r&&jsxRuntime.jsxs(reactAriaComponents.Label,{className:Sr({size:t}),children:[r,s&&jsxRuntime.jsx("span",{className:"text-[var(--destructive-background)] ml-1","aria-hidden":"true",children:"*"})]}),jsxRuntime.jsxs("div",{className:m(K,Cr({size:t})),children:[jsxRuntime.jsx(reactAriaComponents.Input,{className:yr({size:t}),placeholder:u}),jsxRuntime.jsx(reactAriaComponents.Button,{className:Er({size:t}),children:jsxRuntime.jsx(lucideReact.ChevronsUpDown,{className:"h-full w-full","aria-hidden":"true"})})]}),a&&!o&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"description",className:Pr({size:t}),children:a}),o&&jsxRuntime.jsx(reactAriaComponents.Text,{slot:"errorMessage",className:Fr({size:t}),children:o}),jsxRuntime.jsx(reactAriaComponents.Popover,{shouldCloseOnInteractOutside:de(),className:Nr(),children:jsxRuntime.jsx(reactAriaComponents.ListBox,{className:Vr(),children:C})})]})));Me.displayName="Combobox";function ye({children:e,className:t,textValue:r,...a}){let o=r||(typeof e=="string"?e:void 0);return jsxRuntime.jsx(reactAriaComponents.ListBoxItem,{className:m(Rr({size:"default"}),t),textValue:o,...a,children:({isSelected:s})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("span",{className:"flex-1",children:e}),s&&jsxRuntime.jsx(lucideReact.Check,{className:"h-4 w-4 shrink-0 text-[var(--primary)]","aria-hidden":"true"})]})})}ye.displayName="ComboboxItem";var kr=classVarianceAuthority.cva(["flex","w-full","items-center","justify-between","gap-2","rounded-md","border","bg-[var(--content-background)]","text-[var(--content-foreground)]","transition-colors","duration-200","outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2","hover:bg-[var(--accent)]/10","disabled:cursor-not-allowed","disabled:opacity-50","data-[loading=true]:cursor-wait","truncate"],{variants:{size:{sm:`${D.sm} pr-1`,default:`${D.default} pr-1.5`,lg:`${D.lg} pr-2`},isInvalid:{true:"border-[var(--destructive-background)]",false:"border-[var(--input-border)] hover:border-[var(--input-border)]/80"}},defaultVariants:{size:"default",isInvalid:false}}),Lr=classVarianceAuthority.cva(["relative","flex","w-full","cursor-pointer","select-none","items-center","rounded-sm","outline-none","transition-colors","pl-8","pr-2","hover:bg-[var(--accent)]","hover:text-[var(--accent-foreground)]","focus:bg-[var(--accent)]","focus:text-[var(--accent-foreground)]","data-[selected=true]:bg-[var(--accent)]","data-[selected=true]:text-[var(--accent-foreground)]","data-[disabled=true]:pointer-events-none","data-[disabled=true]:opacity-50","data-[disabled=true]:text-[var(--menu-muted)]"],{variants:{size:{sm:`${D.sm} py-1`,default:`${D.default} py-2`,lg:`${D.lg} py-3`}},defaultVariants:{size:"default"}}),_r=classVarianceAuthority.cva(["z-50","w-[--trigger-width]","rounded-md","border","border-[var(--menu-border)]","bg-[var(--menu-background)]","text-[var(--menu-foreground)]","outline-none","overflow-auto","data-[entering]:animate-in","data-[entering]:fade-in-0","data-[entering]:zoom-in-95","data-[exiting]:animate-out","data-[exiting]:fade-out-0","data-[exiting]:zoom-out-95"],{variants:{size:{sm:"max-h-[200px] p-1",default:"max-h-[300px] p-1",lg:"max-h-[400px] p-1"}},defaultVariants:{size:"default"}}),Or=classVarianceAuthority.cva(["px-2","py-1.5","text-xs","font-semibold","text-[var(--menu-muted)]","uppercase","tracking-wider"],{variants:{size:{sm:"px-2 py-1 text-[10px]",default:"px-2 py-1 text-xs",lg:"px-2 py-1.5 text-xs"}},defaultVariants:{size:"default"}}),Dr=classVarianceAuthority.cva(["flex","items-center","gap-1.5","text-sm","font-medium","text-[var(--destructive-background)]","mt-1"],{variants:{size:{sm:"text-xs mt-1",default:"text-sm mt-1",lg:"text-base mt-1"}},defaultVariants:{size:"default"}});var en=Array.from({length:3}).map((e,t)=>jsxRuntime.jsx("div",{className:"h-11 px-4 py-2",children:jsxRuntime.jsx("div",{className:"h-4 bg-[var(--accent-background)] rounded animate-pulse"})},`skeleton-${t}`));function Hr({ariaSelectProps:e,triggerContent:t,triggerRef:r,label:a,description:o,isRequired:s,isDisabled:d,isLoading:i,errorMessage:u,size:p,emptyStateMessage:f,childCount:l,children:n}){let c=react.useId(),b=react.useId(),g=react.useId(),y=!!u;return jsxRuntime.jsxs(reactAriaComponents.Select,{...e,isInvalid:y,children:[jsxRuntime.jsxs(reactAriaComponents.Label,{id:c,className:"text-sm font-medium text-[var(--content-foreground)]",children:[a,s&&jsxRuntime.jsx("span",{className:"text-[var(--destructive-background)] ml-1",children:"*"})]}),o&&jsxRuntime.jsx(reactAriaComponents.Text,{id:b,slot:"description",className:"text-sm text-[var(--menu-muted)] mt-1",children:o}),jsxRuntime.jsx("div",{className:K,children:jsxRuntime.jsxs(reactAriaComponents.Button,{ref:r,className:kr({size:p,isInvalid:y}),"aria-labelledby":c,"aria-describedby":o?b:u?g:void 0,"data-loading":i,...s&&{"aria-required":"true"},...i&&{"aria-busy":"true"},...(d||i)&&{"aria-disabled":"true"},children:[t,i?jsxRuntime.jsx(lucideReact.Loader2,{className:"ml-auto h-4 w-4 shrink-0 animate-spin text-[var(--menu-muted)]","aria-hidden":"true"}):jsxRuntime.jsx(lucideReact.ChevronDown,{className:"ml-auto h-4 w-4 shrink-0 text-[var(--menu-muted)]","aria-hidden":"true"})]})}),jsxRuntime.jsx(reactAriaComponents.FieldError,{id:g,className:Dr({size:p}),children:({validationErrors:h})=>{let C=u||h.join(" ");return C?jsxRuntime.jsx(jsxRuntime.Fragment,{children:C}):null}}),jsxRuntime.jsx(reactAriaComponents.Popover,{shouldCloseOnInteractOutside:de(),className:_r({size:p}),children:jsxRuntime.jsxs(reactAriaComponents.ListBox,{className:"outline-none",children:[i&&l>0&&en,!i&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[n,l===0&&jsxRuntime.jsx(reactAriaComponents.ListBoxItem,{id:"__empty__",textValue:"empty",isDisabled:true,className:"py-6 text-center text-sm text-[var(--menu-muted)] cursor-default pointer-events-none",children:jsxRuntime.jsx("span",{role:"status",children:f||"No options available"})})]})]})})]})}var zr=react.forwardRef(({label:e,placeholder:t,description:r,value:a,defaultValue:o,isOpen:s,isDisabled:d=false,isRequired:i=false,disabledKeys:u,validate:p,validationBehavior:f="aria",errorMessage:l,isLoading:n=false,emptyStateMessage:c,name:b,size:g="default",onChange:y,onOpenChange:h,className:C,children:E,...v},V)=>{let w=react.Children.count(E);return w>1e3&&console.warn("Select has >1000 items. Consider using Autocomplete component for better performance."),jsxRuntime.jsx(Hr,{ariaSelectProps:{value:a,defaultValue:o,onChange:T=>{y&&y(T);},placeholder:t,disabledKeys:u,isOpen:s,onOpenChange:h,isDisabled:d||n,isRequired:i,name:b,validate:p,validationBehavior:f,className:C,...v},triggerContent:jsxRuntime.jsx(reactAriaComponents.SelectValue,{className:"flex-1 text-left truncate"}),triggerRef:V,label:e,description:r,isRequired:i,isDisabled:d,isLoading:n,errorMessage:l,size:g,emptyStateMessage:c,childCount:w,children:E})});zr.displayName="Select";var Ur=react.forwardRef(({label:e,placeholder:t,description:r,value:a,defaultValue:o,selectionMode:s="multiple",isOpen:d,isDisabled:i=false,isRequired:u=false,disabledKeys:p,validate:f,validationBehavior:l="aria",errorMessage:n,isLoading:c=false,emptyStateMessage:b,name:g,size:y="default",onChange:h,onOpenChange:C,className:E,children:v,...V},w)=>{let T=react.Children.count(v);T>1e3&&console.warn("Select has >1000 items. Consider using Autocomplete component for better performance.");let I=react.useMemo(()=>{let k=new Map,P=O=>{react.Children.forEach(O,x=>{if(react.isValidElement(x)){let R=x;if(R.type===He||R.props?.value){let N=R.props.value,G=R.props.children;N&&typeof G=="string"&&k.set(N,G);}R.props?.children&&P(R.props.children);}});};return P(v),k},[v]),M=react.useMemo(()=>!a||!Array.isArray(a)||a.length===0?t||"":a.length<=2?a.map(P=>I.get(P)||P).join(", "):`${a.length} items selected`,[a,I,t]);return jsxRuntime.jsx(Hr,{ariaSelectProps:{value:a,defaultValue:o,onChange:k=>{h&&h(k);},selectionMode:"multiple",disabledKeys:p,isOpen:d,onOpenChange:C,isDisabled:i||c,isRequired:u,name:g,validate:f,validationBehavior:l,className:E,...V},triggerContent:jsxRuntime.jsx("span",{className:"flex-1 text-left truncate",children:M}),triggerRef:w,label:e,description:r,isRequired:u,isDisabled:i,isLoading:c,errorMessage:n,size:y,emptyStateMessage:b,childCount:T,children:v})});Ur.displayName="MultiSelect";var He=react.memo(function({children:t,textValue:r,value:a,isDisabled:o=false,className:s,...d}){if(!r&&typeof t!="string"){let i="Select.Item with custom children requires textValue prop for accessibility";if(process.env.NODE_ENV==="development")throw new Error(i);console.warn(i);}return jsxRuntime.jsx(reactAriaComponents.ListBoxItem,{id:a,textValue:r||(typeof t=="string"?t:void 0),className:`${Lr({size:"default"})} ${s||""}`,isDisabled:o,...d,children:({isSelected:i,selectionMode:u,isDisabled:p})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[u==="multiple"?jsxRuntime.jsx(lucideReact.CheckSquare,{className:`absolute left-2 h-4 w-4 ${i?"visible":"invisible"}`,"aria-hidden":"true"}):i&&jsxRuntime.jsx(lucideReact.Check,{className:"absolute left-2 h-4 w-4","aria-hidden":"true"}),jsxRuntime.jsx("span",{className:p?"text-[var(--menu-muted)]":"",children:t})]})})});He.displayName="SelectItem";function bt({children:e,className:t,...r}){return jsxRuntime.jsx(reactAriaComponents.ListBoxSection,{className:`border-t border-[var(--border)] first:border-t-0 ${t||""}`,...r,children:e})}bt.displayName="SelectSection";function xt({children:e,className:t,...r}){return jsxRuntime.jsx(reactAriaComponents.Header,{className:`${Or({size:"default"})} ${t||""}`,...r,children:e})}xt.displayName="SelectHeader";var Ee=Object.assign(zr,{Item:He,Section:bt,Header:xt});Object.assign(Ur,{Item:He,Section:bt,Header:xt});var Wr=classVarianceAuthority.cva(["relative inline-flex items-center justify-center","min-h-[44px] min-w-[44px]","focus-visible:outline-none","focus-visible:ring-2","focus-visible:ring-[var(--ring)]","focus-visible:ring-offset-2","focus-visible:ring-offset-[var(--page-background)]","disabled:pointer-events-none","disabled:opacity-50"],{variants:{},defaultVariants:{}}),jr=classVarianceAuthority.cva(["inline-flex items-center justify-center","gap-1","rounded-full","font-medium","whitespace-nowrap","transition-colors"],{variants:{variant:{primary:["bg-[var(--primary-action)]","text-[var(--primary-action-foreground)]","hover:bg-[var(--primary-action)]/90","data-[pressed]:bg-[var(--primary-action)]/80"],accent:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"],destructive:["bg-[var(--destructive-background)]","text-[var(--destructive-foreground)]","hover:bg-[var(--destructive-background)]/90","data-[pressed]:bg-[var(--destructive-background)]/80"],content:["bg-[var(--accent-background)]","text-[var(--accent-foreground)]","hover:bg-[var(--accent-background)]/90","data-[pressed]:bg-[var(--accent-background)]/80"]},size:{sm:"h-5 px-2 text-xs",default:"h-6 px-2.5 text-xs",lg:"h-7 px-3 text-sm"}},defaultVariants:{variant:"primary",size:"default"}});var nn={sm:"[&_svg]:h-2.5 [&_svg]:w-2.5",default:"[&_svg]:h-3 [&_svg]:w-3",lg:"[&_svg]:h-3.5 [&_svg]:w-3.5"},ue=react.memo(react.forwardRef(({className:e,variant:t="primary",size:r="default",children:a,icon:o,iconPosition:s="start",count:d,onPress:i,isDisabled:u,id:p,"aria-label":f,"aria-labelledby":l,"aria-describedby":n,"data-testid":c,...b},g)=>{let y=m(jr({variant:t,size:r}),nn[r],e),v=[!!o,d!==void 0,!!a].filter(Boolean).length>1,V=()=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[o&&s==="start"&&jsxRuntime.jsx("span",{className:"shrink-0","aria-hidden":"true",children:o}),a&&(v?jsxRuntime.jsx("span",{children:a}):a),d!==void 0&&jsxRuntime.jsx("span",{className:"font-mono tabular-nums",children:d}),o&&s==="end"&&jsxRuntime.jsx("span",{className:"shrink-0","aria-hidden":"true",children:o})]});return i?jsxRuntime.jsx(reactAriaComponents.Button,{ref:g,isDisabled:u,onPress:i,className:Wr(),id:p,"aria-label":f,"aria-labelledby":l,"aria-describedby":n,"data-testid":c,...b,children:w=>jsxRuntime.jsx("span",{className:m(y,be,"",re,ae),"data-pressed":w.isPressed||void 0,children:V()})}):jsxRuntime.jsx("span",{ref:g,className:y,id:p,"aria-label":f,"aria-labelledby":l,"aria-describedby":n,"data-testid":c,...b,children:V()})}));ue.displayName="Badge";var gt=classVarianceAuthority.cva(["flex flex-wrap items-center gap-2"]),Ne=classVarianceAuthority.cva(["inline-flex items-center gap-2"]),vt=classVarianceAuthority.cva(["min-w-[14rem] max-w-[20rem] rounded-md border border-[var(--border)]","bg-[var(--content-background)] p-2 shadow-md","motion-safe:data-[entering]:animate-in motion-safe:data-[entering]:fade-in-0","motion-safe:data-[exiting]:animate-out motion-safe:data-[exiting]:fade-out-0"]),ht=classVarianceAuthority.cva(["flex items-center justify-between gap-2 px-1 pb-2 mb-1","border-b border-[var(--border)]"]),St=classVarianceAuthority.cva(["flex items-center gap-2"],{variants:{scrollable:{true:"flex-nowrap overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden [&>*]:flex-none",false:"flex-wrap"}},defaultVariants:{scrollable:false}}),Yr=classVarianceAuthority.cva(["fixed inset-0 z-[80] bg-[rgb(23_23_23_/_0.42)]","motion-safe:data-[entering]:animate-in motion-safe:data-[entering]:fade-in-0","motion-safe:data-[exiting]:animate-out motion-safe:data-[exiting]:fade-out-0"]),qr=classVarianceAuthority.cva(["fixed inset-x-0 bottom-0 z-[81] flex max-h-[88vh] flex-col","rounded-t-3xl border-t border-[var(--border)] bg-[var(--content-background)]","motion-safe:data-[entering]:animate-in motion-safe:data-[entering]:slide-in-from-bottom","motion-safe:data-[exiting]:animate-out motion-safe:data-[exiting]:slide-out-to-bottom"]),Xr=classVarianceAuthority.cva(["flex items-center justify-between gap-2 px-5 py-3 border-b border-[var(--border)] flex-none"]),Zr=classVarianceAuthority.cva(["flex flex-col gap-5 overflow-auto p-5 flex-1","[&>*]:w-full"]),Kr=classVarianceAuthority.cva(["flex items-center justify-between gap-3 px-5 pt-3 flex-none","pb-[calc(0.75rem+env(safe-area-inset-bottom))] border-t border-[var(--border)]"]),Qr=classVarianceAuthority.cva(["mx-auto mt-2.5 mb-0.5 h-1.5 w-10 flex-none rounded-full bg-[var(--border)]"]),dn=classVarianceAuthority.cva(["inline-flex items-center gap-1.5 min-h-[44px] px-3 rounded-full","border border-[var(--border)] bg-[var(--accent-background)]","text-sm text-[var(--content-foreground)]","hover:bg-[var(--accent)] motion-safe:transition-colors","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:ring-offset-2","cursor-pointer"]);function Ve({label:e,badge:t,isActive:r=false,children:a,doneLabel:o,align:s="start",className:d}){let i=t!=null&&t!=="";return jsxRuntime.jsxs(reactAriaComponents.DialogTrigger,{children:[jsxRuntime.jsxs(_,{variant:r?"secondary":"outline",className:m(Ne(),d),children:[jsxRuntime.jsx("span",{children:e}),i&&jsxRuntime.jsx(ue,{size:"sm",children:String(t)}),jsxRuntime.jsx(lucideReact.ChevronDown,{"aria-hidden":"true",className:"h-4 w-4 opacity-60"})]}),jsxRuntime.jsx(reactAriaComponents.Popover,{isNonModal:true,shouldCloseOnInteractOutside:de(),placement:s==="end"?"bottom end":"bottom start",className:vt(),children:jsxRuntime.jsx(reactAriaComponents.Dialog,{"aria-label":e,className:"outline-none",children:({close:u})=>jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[o&&jsxRuntime.jsxs("div",{className:ht(),children:[jsxRuntime.jsx("span",{className:"text-xs font-bold uppercase tracking-wide text-[var(--menu-muted)]",children:e}),jsxRuntime.jsx(_,{variant:"link",onPress:u,children:o})]}),typeof a=="function"?a(u):a]})})})]})}function vn(e,t){typeof e=="function"?e(t):e&&(e.current=t);}var $e=react.forwardRef(({chips:e,onRemove:t,onClearAll:r,clearAllLabel:a,removeChipLabel:o,scrollable:s=false,"aria-label":d="Active filters",className:i,"data-testid":u="applied-filters"},p)=>{let f=react.useRef(null);if(e.length===0)return null;let l='button,a[href],input,select,textarea,[tabindex]:not([tabindex="-1"])',n=(c,b)=>{let g=f.current;if(e.length<=1&&g){let h=g.previousElementSibling;((h?.matches(l)?h:h?.querySelector(l))??g).focus(),t(c);return}t(c),requestAnimationFrame(()=>{let h=f.current;if(!h)return;let C=h.querySelectorAll("[data-chip]");C.length>0?C[Math.min(b,C.length-1)]?.focus():h.focus();});};return jsxRuntime.jsxs("div",{ref:c=>{f.current=c,vn(p,c);},role:"region","aria-label":d,tabIndex:-1,className:m(St({scrollable:s}),"outline-none",i),"data-testid":u,children:[e.map((c,b)=>jsxRuntime.jsxs(_,{variant:"outline","data-chip":true,"aria-label":o(`${c.group?`${c.group} `:""}${c.label}`),onPress:()=>n(c,b),children:[c.group&&jsxRuntime.jsx("span",{className:"text-xs font-bold uppercase tracking-wide opacity-60",children:c.group}),jsxRuntime.jsx("span",{className:"font-semibold",children:c.label}),jsxRuntime.jsx(lucideReact.X,{"aria-hidden":"true",className:"h-3.5 w-3.5 opacity-60"})]},c.id)),e.length>1&&jsxRuntime.jsx(_,{variant:"link",onPress:()=>{r(),requestAnimationFrame(()=>f.current?.focus());},children:a})]})});$e.displayName="AppliedFilters";var We=react.createContext(null);function j(e){let t=react.useContext(We);if(!t)throw new Error(`<${e}> must be rendered inside <Filters>.`);return t}var ta=react.forwardRef(({values:e,onChange:t,labels:r,narrow:a=false,children:o,"aria-label":s="Filters",className:d,"data-testid":i="filters"},u)=>{let p=react.useRef(new Map),[f,l]=react.useState(0),n=react.useRef(e);n.current=e;let c=react.useCallback((x,R)=>{t({...n.current,[x]:R});},[t]),b=react.useCallback(x=>t(x),[t]),g=react.useCallback((x,R)=>{R?p.current.set(x,R):p.current.delete(x),l(N=>N+1);},[]),y=react.useMemo(()=>({values:e,narrow:a,setValue:c,replaceValues:b,labels:r,registry:p,registryVersion:f,syncControl:g}),[e,a,c,b,r,f,g]),h=react.useMemo(()=>{let x=0;for(let[R,N]of p.current)N.isActive(e[R])&&(x+=1);return x},[e,f]),C=()=>{let x={...n.current};for(let[R,N]of p.current)x[R]=N.clearedValue;b(x);},[E,v]=react.useState(false),V=react.useRef(null),w=react.useRef(null),T=react.useRef(null),I=react.useCallback(()=>{v(false),requestAnimationFrame(()=>V.current?.focus());},[]);react.useEffect(()=>{if(!E)return;w.current?.querySelector('button,a[href],input,select,textarea,[tabindex]:not([tabindex="-1"])')?.focus();},[E]),react.useEffect(()=>{if(!E)return;let x=N=>{let G=N.target;T.current&&T.current.contains(G)&&I();},R=N=>{N.key==="Escape"&&(N.preventDefault(),I());};return document.addEventListener("pointerdown",x,true),document.addEventListener("keydown",R),()=>{document.removeEventListener("pointerdown",x,true),document.removeEventListener("keydown",R);}},[E,I]);let M=react.Children.toArray(o),k=x=>react.isValidElement(x)&&x.type===ra,P=M.filter(k),O=M.filter(x=>!k(x));return a?jsxRuntime.jsx(We.Provider,{value:y,children:jsxRuntime.jsxs("div",{ref:u,role:"region","aria-label":s,className:m("flex flex-col gap-3",d),"data-testid":i,children:[jsxRuntime.jsx("div",{children:jsxRuntime.jsxs(_,{ref:V,variant:"outline",className:Ne(),"aria-haspopup":"dialog","aria-expanded":E,onPress:()=>v(true),children:[jsxRuntime.jsx(lucideReact.SlidersHorizontal,{"aria-hidden":"true",className:"h-4 w-4"}),jsxRuntime.jsx("span",{children:r.filtersButton??s}),h>0&&jsxRuntime.jsx(ue,{size:"sm",children:String(h)})]})}),E&&jsxRuntime.jsx("div",{ref:T,className:Yr(),"aria-hidden":"true"}),jsxRuntime.jsx(reactAria.FocusScope,{contain:E,restoreFocus:true,children:jsxRuntime.jsxs("div",{ref:w,role:"dialog","aria-modal":E||void 0,"aria-label":s,className:E?qr():"hidden",children:[jsxRuntime.jsx("span",{className:Qr(),"aria-hidden":"true"}),jsxRuntime.jsxs("div",{className:Xr(),children:[jsxRuntime.jsx("span",{className:"text-lg font-semibold",children:r.filtersButton??s}),jsxRuntime.jsx(_,{variant:"ghost",visualSize:"icon","aria-label":r.close??"Close",onPress:I,children:jsxRuntime.jsx(lucideReact.X,{"aria-hidden":"true"})})]}),jsxRuntime.jsx("div",{className:Zr(),children:O}),jsxRuntime.jsxs("div",{className:Kr(),children:[jsxRuntime.jsx(_,{variant:"link",onPress:C,children:r.clearAll??r.clear}),jsxRuntime.jsx(_,{variant:"default",onPress:I,children:r.done})]})]})}),P]})}):jsxRuntime.jsx(We.Provider,{value:y,children:jsxRuntime.jsxs("div",{ref:u,role:"region","aria-label":s,className:m("flex flex-col gap-3",d),"data-testid":i,children:[jsxRuntime.jsx("div",{className:gt(),children:O}),P]})})});ta.displayName="Filters";function fe(e,t){let{syncControl:r}=j("Filter control");react.useEffect(()=>(r(e,t),()=>r(e,null)),[e,t,r]);}function Et(e){return e.map(t=>`${t.value}\0${t.label}`).join("")}function Nt(e,t){return e.find(r=>r.value===t)?.label??t}function Tn({name:e,label:t,placeholder:r,chipGroup:a,className:o}){let{values:s,setValue:d}=j("FilterSearch"),i=typeof s[e]=="string"?s[e]:"",u=react.useMemo(()=>({name:e,clearedValue:"",isActive:p=>typeof p=="string"&&p.trim()!=="",toChips:p=>typeof p=="string"&&p.trim()!==""?[{id:e,key:e,label:`\u201C${p}\u201D`,group:a??t}]:[]}),[e,t,a]);return fe(e,u),jsxRuntime.jsx(ke,{"aria-label":t,placeholder:r,value:i,onChange:p=>d(e,p),onClear:()=>d(e,""),className:m("min-w-[14rem]",o)})}function In({name:e,label:t,className:r}){let{values:a,setValue:o}=j("FilterToggle"),s=a[e]===true,d=react.useMemo(()=>({name:e,clearedValue:false,isActive:i=>i===true,toChips:i=>i===true?[{id:e,key:e,label:t}]:[]}),[e,t]);return fe(e,d),jsxRuntime.jsx(_e,{label:t,isSelected:s,onChange:i=>o(e,!!i),className:r})}var yt="__all__";function Pn({name:e,label:t,options:r,allLabel:a,className:o}){let{values:s,setValue:d,narrow:i}=j("FilterSelect"),u=typeof s[e]=="string"?s[e]:"",p=Et(r),f=react.useMemo(()=>({name:e,clearedValue:"",isActive:l=>typeof l=="string"&&l!=="",toChips:l=>typeof l=="string"&&l!==""?[{id:e,key:e,label:Nt(r,l),group:t}]:[]}),[e,t,p]);return fe(e,f),i?jsxRuntime.jsxs(Ee,{label:t,value:u===""?yt:u,onChange:l=>{let n=Array.isArray(l)?l[0]:l;d(e,!n||n===yt?"":n);},className:o,children:[jsxRuntime.jsx(Ee.Item,{value:yt,children:a??"All"}),r.map(l=>jsxRuntime.jsx(Ee.Item,{value:l.value,children:l.label},l.value))]}):jsxRuntime.jsx(Ve,{label:t,isActive:u!=="",className:o,children:l=>jsxRuntime.jsxs(he,{"aria-label":t,value:u,onChange:n=>{d(e,n),l();},children:[jsxRuntime.jsx(le,{value:"",children:a??"All"}),r.map(n=>jsxRuntime.jsx(le,{value:n.value,children:n.label},n.value))]})})}function Fn({name:e,label:t,presets:r,className:a}){let{values:o,setValue:s,narrow:d}=j("FilterWithin"),i=r[0]?.value??"",u=typeof o[e]=="string"?o[e]:i,p=Et(r),f=react.useMemo(()=>({name:e,clearedValue:i,isActive:n=>typeof n=="string"&&n!==i,toChips:n=>typeof n=="string"&&n!==i?[{id:e,key:e,label:Nt(r,n),group:t}]:[]}),[e,t,i,p]);fe(e,f);let l=n=>jsxRuntime.jsx(he,{label:d?t:void 0,"aria-label":d?void 0:t,value:u,onChange:c=>{s(e,c),n?.();},className:d?a:void 0,children:r.map(c=>jsxRuntime.jsx(le,{value:c.value,children:c.label},c.value))});return d?l():jsxRuntime.jsx(Ve,{label:t,isActive:u!==i,className:a,children:n=>l(n)})}function An({name:e,label:t,options:r,className:a}){let{values:o,setValue:s,labels:d,narrow:i}=j("FilterMulti"),u=Array.isArray(o[e])?o[e]:[],p=Et(r),f=react.useMemo(()=>({name:e,clearedValue:[],isActive:n=>Array.isArray(n)&&n.length>0,toChips:n=>Array.isArray(n)?n.map(c=>({id:`${e}:${c}`,key:e,optionValue:c,label:Nt(r,c),group:t})):[]}),[e,t,p]);fe(e,f);let l=jsxRuntime.jsx(Ge,{label:i?t:void 0,"aria-label":i?void 0:t,value:u,onChange:n=>s(e,n),className:i?a:void 0,children:r.map(n=>jsxRuntime.jsx(Be,{value:n.value,children:n.label},n.value))});return i?l:jsxRuntime.jsxs(Ve,{label:t,badge:u.length||null,isActive:u.length>0,doneLabel:d.done,className:a,children:[l,u.length>0&&jsxRuntime.jsx("div",{className:"pt-1",children:jsxRuntime.jsx(_,{variant:"link",onPress:()=>s(e,[]),children:d.clear})})]})}function wn({name:e,label:t,options:r,onSearch:a,isLoading:o,placeholder:s,className:d}){let{values:i,setValue:u}=j("FilterCombobox"),p=typeof i[e]=="string"?i[e]:"",f=react.useRef(new Map);for(let n of r)f.current.set(n.value,n.label);let l=react.useMemo(()=>({name:e,clearedValue:"",isActive:n=>typeof n=="string"&&n!=="",toChips:n=>typeof n=="string"&&n!==""?[{id:e,key:e,label:f.current.get(n)??n,group:t}]:[]}),[e,t]);return fe(e,l),jsxRuntime.jsx(Me,{"aria-label":t,placeholder:s,selectedKey:p||null,onSelectionChange:n=>u(e,n==null?"":String(n)),onInputChange:a,className:m("min-w-[14rem]",d),children:r.length===0&&o?jsxRuntime.jsx(ye,{id:"__loading",isDisabled:true,children:"Loading\u2026"}):r.map(n=>jsxRuntime.jsx(ye,{id:n.value,children:n.label},n.value))})}function ra({clearAllLabel:e,removeChipLabel:t,"aria-label":r,className:a,"data-testid":o}){let{values:s,setValue:d,replaceValues:i,registry:u,narrow:p}=j("FilterChips"),f=[];for(let[c,b]of u.current)f.push(...b.toChips(s[c]));return jsxRuntime.jsx($e,{chips:f,onRemove:c=>{if(c.optionValue!==void 0){let b=s[c.key],g=Array.isArray(b)?b:[];d(c.key,g.filter(y=>y!==c.optionValue));}else {let b=u.current.get(c.key);d(c.key,b?b.clearedValue:"");}},onClearAll:()=>{let c={...s};for(let[b,g]of u.current)c[b]=g.clearedValue;i(c);},clearAllLabel:e,removeChipLabel:t,scrollable:p,"aria-label":r,className:a,"data-testid":o})}var kn=zod.z.object({value:zod.z.string(),label:zod.z.string()});exports.AppliedFilters=$e;exports.FilterChips=ra;exports.FilterCombobox=wn;exports.FilterMulti=An;exports.FilterOptionSchema=kn;exports.FilterPopover=Ve;exports.FilterSearch=Tn;exports.FilterSelect=Pn;exports.FilterToggle=In;exports.FilterWithin=Fn;exports.Filters=ta;exports.appliedFiltersVariants=St;exports.filterChipVariants=dn;exports.filterPillVariants=Ne;exports.filterPopoverHeaderVariants=ht;exports.filterPopoverVariants=vt;exports.filtersBarVariants=gt;exports.useFiltersContext=j;//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|