@openwarelabs/ui 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/components/Avatar/Avatar.d.cts +13 -2
- package/dist/components/Avatar/Avatar.d.ts +13 -2
- package/dist/components/Avatar/AvatarGroup.d.cts +6 -5
- package/dist/components/Avatar/AvatarGroup.d.ts +6 -5
- package/dist/components/Steps/Steps.d.cts +1 -1
- package/dist/components/Steps/Steps.d.ts +1 -1
- package/dist/components/Table/Table.d.cts +6 -1
- package/dist/components/Table/Table.d.ts +6 -1
- package/dist/components/Text/Text.d.cts +26 -0
- package/dist/components/Text/Text.d.ts +26 -0
- package/dist/components/Tooltip/Tooltip.d.cts +3 -3
- package/dist/components/Tooltip/Tooltip.d.ts +3 -3
- package/dist/components.css +166 -22
- package/dist/hooks/useFloating.d.cts +2 -2
- package/dist/hooks/useFloating.d.ts +2 -2
- package/dist/index.cjs +616 -533
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +478 -395
- package/dist/index.js.map +4 -4
- package/dist/openware-ui.iife.js +6 -6
- package/dist/styles.css +170 -23
- package/dist/tailwind.css +1 -0
- package/dist/tokens.css +4 -1
- package/dist/tokens.json +12 -4
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/components/
|
|
4
|
-
"sourcesContent": ["// Openware UI. Import the components from here and the CSS once:\n// import \"@openwarelabs/ui/fonts.css\";\n// import \"@openwarelabs/ui/styles.css\";\n\n// Buttons\nexport { Button, buttonClassName } from \"./components/Button/Button\";\nexport type { ButtonProps, ButtonStyleOptions, ButtonVariant, ButtonSize, ButtonShape } from \"./components/Button/Button\";\nexport { ButtonGroup, CloseButton, ToggleButton } from \"./components/Button/ButtonGroup\";\nexport type { ButtonGroupProps, CloseButtonProps, ToggleButtonProps } from \"./components/Button/ButtonGroup\";\nexport { SegmentedControl } from \"./components/SegmentedControl/SegmentedControl\";\nexport type { SegmentedControlProps, SegmentedControlOption } from \"./components/SegmentedControl/SegmentedControl\";\nexport { ChoiceCard } from \"./components/ChoiceCard/ChoiceCard\";\nexport type { ChoiceCardProps } from \"./components/ChoiceCard/ChoiceCard\";\nexport { CopyButton, CodeBlock, Snippet } from \"./components/CodeBlock/CodeBlock\";\nexport type { CopyButtonProps, CodeBlockProps, SnippetProps } from \"./components/CodeBlock/CodeBlock\";\n\n// Forms\nexport { Field } from \"./components/Field/Field\";\nexport type { FieldProps } from \"./components/Field/Field\";\nexport { Input } from \"./components/Input/Input\";\nexport type { InputProps } from \"./components/Input/Input\";\nexport { SearchField } from \"./components/SearchField/SearchField\";\nexport type { SearchFieldProps } from \"./components/SearchField/SearchField\";\nexport { NumberField } from \"./components/NumberField/NumberField\";\nexport type { NumberFieldProps } from \"./components/NumberField/NumberField\";\nexport { InputOTP } from \"./components/InputOTP/InputOTP\";\nexport type { InputOTPProps } from \"./components/InputOTP/InputOTP\";\nexport { Textarea } from \"./components/Textarea/Textarea\";\nexport type { TextareaProps } from \"./components/Textarea/Textarea\";\nexport { Select } from \"./components/Select/Select\";\nexport type { SelectProps, SelectOption, SelectGroup, SelectItem } from \"./components/Select/Select\";\nexport { Combobox } from \"./components/Combobox/Combobox\";\nexport type { ComboboxProps, ComboboxOption } from \"./components/Combobox/Combobox\";\nexport { Checkbox, CheckboxGroup, Fieldset } from \"./components/Checkbox/Checkbox\";\nexport type { CheckboxProps, CheckboxGroupProps, FieldsetProps } from \"./components/Checkbox/Checkbox\";\nexport { RadioGroup, Radio } from \"./components/RadioGroup/RadioGroup\";\nexport type { RadioGroupProps, RadioProps } from \"./components/RadioGroup/RadioGroup\";\nexport { Switch } from \"./components/Switch/Switch\";\nexport type { SwitchProps } from \"./components/Switch/Switch\";\nexport { Slider } from \"./components/Slider/Slider\";\nexport type { SliderProps } from \"./components/Slider/Slider\";\nexport { FileDropZone } from \"./components/FileDropZone/FileDropZone\";\nexport type { FileDropZoneProps } from \"./components/FileDropZone/FileDropZone\";\n\n// Dates\nexport { Calendar } from \"./components/Calendar/Calendar\";\nexport type { CalendarProps, CalendarHandle } from \"./components/Calendar/Calendar\";\nexport { DatePicker } from \"./components/Calendar/DatePicker\";\nexport type { DatePickerProps } from \"./components/Calendar/DatePicker\";\nexport { todayISO, addDays, addMonths, formatDate, weekday, parseISO, toISO } from \"./components/Calendar/dates\";\nexport type { ISODate } from \"./components/Calendar/dates\";\n\n// Feedback\nexport { Alert } from \"./components/Alert/Alert\";\nexport type { AlertProps, AlertVariant } from \"./components/Alert/Alert\";\nexport { Badge } from \"./components/Badge/Badge\";\nexport type { BadgeProps, BadgeVariant } from \"./components/Badge/Badge\";\nexport { ProgressBar, ProgressCircle } from \"./components/Progress/Progress\";\nexport type { ProgressBarProps, ProgressCircleProps, ProgressTone } from \"./components/Progress/Progress\";\nexport { Spinner } from \"./components/Spinner/Spinner\";\nexport type { SpinnerProps } from \"./components/Spinner/Spinner\";\nexport { Skeleton, SkeletonRows } from \"./components/Skeleton/Skeleton\";\nexport type { SkeletonProps, SkeletonRowsProps } from \"./components/Skeleton/Skeleton\";\nexport { Toaster, toast } from \"./components/Toast/Toast\";\nexport type { ToasterProps, ToastOptions } from \"./components/Toast/Toast\";\nexport { Tooltip } from \"./components/Tooltip/Tooltip\";\nexport type { TooltipProps } from \"./components/Tooltip/Tooltip\";\n\n// Overlays\nexport { Dialog, ConfirmDialog } from \"./components/Dialog/Dialog\";\nexport type { DialogProps, ConfirmDialogProps } from \"./components/Dialog/Dialog\";\nexport { Drawer } from \"./components/Drawer/Drawer\";\nexport type { DrawerProps } from \"./components/Drawer/Drawer\";\nexport { Popover } from \"./components/Popover/Popover\";\nexport type { PopoverProps } from \"./components/Popover/Popover\";\nexport { Menu, MenuItem, MenuLabel, MenuSeparator } from \"./components/Menu/Menu\";\nexport type { MenuProps, MenuItemProps } from \"./components/Menu/Menu\";\nexport { CommandPalette } from \"./components/CommandPalette/CommandPalette\";\nexport type { Command, CommandPaletteProps } from \"./components/CommandPalette/CommandPalette\";\nexport { filterCommands } from \"./components/CommandPalette/filterCommands\";\n\n// Navigation\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs/Tabs\";\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps } from \"./components/Tabs/Tabs\";\nexport { Accordion, AccordionItem, Disclosure } from \"./components/Accordion/Accordion\";\nexport type { AccordionProps, AccordionItemProps, DisclosureProps } from \"./components/Accordion/Accordion\";\nexport { Breadcrumbs, Link, linkClassName } from \"./components/Breadcrumbs/Breadcrumbs\";\nexport type { BreadcrumbsProps, BreadcrumbItem, LinkProps, LinkStyleOptions } from \"./components/Breadcrumbs/Breadcrumbs\";\nexport { Pagination, paginationItems } from \"./components/Pagination/Pagination\";\nexport type { PaginationProps } from \"./components/Pagination/Pagination\";\nexport { Steps } from \"./components/Steps/Steps\";\nexport type { StepsProps, StepItem } from \"./components/Steps/Steps\";\nexport { NavList, NavItem } from \"./components/NavList/NavList\";\nexport type { NavListProps, NavItemProps } from \"./components/NavList/NavList\";\n\n// Data display\nexport { Table } from \"./components/Table/Table\";\nexport type { TableProps, TableColumn, TableSort } from \"./components/Table/Table\";\nexport { Stat } from \"./components/Stat/Stat\";\nexport type { StatProps } from \"./components/Stat/Stat\";\nexport { FileTree } from \"./components/FileTree/FileTree\";\nexport type { FileTreeProps, FileTreeNode } from \"./components/FileTree/FileTree\";\nexport { EmptyState } from \"./components/EmptyState/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState/EmptyState\";\nexport { Tag, TagGroup, ColorSwatch } from \"./components/Tag/Tag\";\nexport type { TagProps, TagGroupProps, ColorSwatchProps } from \"./components/Tag/Tag\";\nexport { Avatar } from \"./components/Avatar/Avatar\";\nexport type { AvatarProps } from \"./components/Avatar/Avatar\";\nexport { AvatarGroup, User } from \"./components/Avatar/AvatarGroup\";\nexport type { AvatarGroupProps, UserProps } from \"./components/Avatar/AvatarGroup\";\nexport { Kbd, Code } from \"./components/Kbd/Kbd\";\n\n// Layout\nexport { Card, SettingsRow } from \"./components/Card/Card\";\nexport type { CardProps, SettingsRowProps } from \"./components/Card/Card\";\nexport { Stack, Separator, ScrollShadow, VisuallyHidden } from \"./components/Layout/Layout\";\nexport type { StackProps, SeparatorProps, ScrollShadowProps, SpaceToken } from \"./components/Layout/Layout\";\n\n// Marketing\nexport { Chip, SectionHeading, SiteHeader, DotGrid } from \"./components/Marketing/Marketing\";\nexport type { SectionHeadingProps, SiteHeaderProps, DotGridProps } from \"./components/Marketing/Marketing\";\n\n// Hooks and helpers\nexport { ColorField, ColorPicker } from \"./components/ColorPicker/ColorPicker\";\nexport type { ColorFieldProps, ColorPickerProps, ColorSwatchOption } from \"./components/ColorPicker/ColorPicker\";\nexport { applyBrand, brandCss, brandPresets, brandScale, brandSteps, brandVariables } from \"./utils/brand\";\nexport type { BrandPreset, BrandScale, BrandStep } from \"./utils/brand\";\nexport { useModalDialog } from \"./hooks/useModalDialog\";\nexport { useMenuKeyboard } from \"./hooks/useMenuKeyboard\";\nexport { useControllableState } from \"./hooks/useControllableState\";\nexport { useFloating, useDismiss } from \"./hooks/useFloating\";\nexport { usePresence } from \"./hooks/usePresence\";\nexport type { Presence } from \"./hooks/usePresence\";\nexport type { Placement } from \"./hooks/useFloating\";\nexport { cx } from \"./utils/cx\";\nexport { getInitials } from \"./utils/text\";\nexport { copyText } from \"./utils/copyText\";\n", "import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { toAriaShortcut } from \"../../utils/text\";\nimport { Spinner } from \"../Spinner/Spinner\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n/** `rounded` is the app's 8px corner; `pill` is the marketing site's. */\nexport type ButtonShape = \"rounded\" | \"pill\";\n\nexport interface ButtonStyleOptions {\n /** primary for the one main action, secondary for the rest, ghost for low-stakes actions, danger for destructive ones.\n * @default \"secondary\" */\n variant?: ButtonVariant;\n /** sm 32px, md 40px, lg 44px (36, 40 and 46px as pills).\n * @default \"md\" */\n size?: ButtonSize;\n /** @default \"rounded\" */\n shape?: ButtonShape;\n /** A square button holding only an icon. Give it an aria-label.\n * @default false */\n iconOnly?: boolean;\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, ButtonStyleOptions {\n /** An icon before the label, usually a 16px lucide-react icon. */\n startIcon?: ReactNode;\n /** An icon after the label, such as an arrow or a chevron. */\n endIcon?: ReactNode;\n /** Keyboard shortcut shown at the end, e.g. \"\u2318N\". Only pass one that actually works. */\n shortcut?: string;\n /** Shows a spinner in place of the start icon and disables the button, keeping its width.\n * @default false */\n loading?: boolean;\n /** Stretches the button to its container's width.\n * @default false */\n fullWidth?: boolean;\n}\n\n/**\n * The class names of a button, for things that must be another element: a router <Link>, an <a>.\n * `<Link className={buttonClassName({ variant: \"primary\" })}>Pricing</Link>`\n */\nexport function buttonClassName({\n variant = \"secondary\",\n size = \"md\",\n shape = \"rounded\",\n iconOnly = false,\n}: ButtonStyleOptions = {}): string {\n return cx(\n \"ow-button\",\n `ow-button--${variant}`,\n `ow-button--${size}`,\n shape === \"pill\" && \"ow-button--pill\",\n iconOnly && \"ow-button--icon-only\",\n );\n}\n\n/**\n * A tactile button: a light top-to-bottom gradient, a highlight along the top edge and a soft shadow,\n * pressed in by a pixel on click.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n children,\n className,\n disabled,\n endIcon,\n fullWidth = false,\n iconOnly = false,\n loading = false,\n shape = \"rounded\",\n shortcut,\n size = \"md\",\n startIcon,\n type = \"button\",\n variant = \"secondary\",\n ...buttonProps\n },\n ref,\n) {\n const leading = loading ? <Spinner size=\"sm\" tone=\"current\" label=\"\" /> : startIcon;\n return (\n <button\n ref={ref}\n className={cx(\n buttonClassName({ variant, size, shape, iconOnly }),\n shortcut && !iconOnly && \"ow-button--with-shortcut\",\n loading && \"ow-button--loading\",\n fullWidth && \"ow-button--full\",\n className,\n )}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n aria-keyshortcuts={shortcut ? toAriaShortcut(shortcut) : undefined}\n {...buttonProps}\n >\n {leading ? <span className=\"ow-button__icon\">{leading}</span> : null}\n {iconOnly && loading ? null : children}\n {endIcon && !iconOnly ? <span className=\"ow-button__icon\">{endIcon}</span> : null}\n {shortcut && !iconOnly ? (\n <kbd aria-hidden=\"true\" className=\"ow-button__shortcut\">\n {shortcut}\n </kbd>\n ) : null}\n </button>\n );\n});\n", "type ClassValue = string | false | null | undefined | Record<string, boolean | undefined>;\n\n/** Joins class names, skipping falsy ones; an object adds each key whose value is true. */\nexport function cx(...values: ClassValue[]): string {\n const classes: string[] = [];\n for (const value of values) {\n if (!value) continue;\n if (typeof value === \"string\") {\n classes.push(value);\n continue;\n }\n for (const [name, on] of Object.entries(value)) if (on) classes.push(name);\n }\n return classes.join(\" \");\n}\n", "/** \"Alex Silver\" \u2192 \"AS\", \"alex\" \u2192 \"A\". Empty input returns \"\". */\nexport function getInitials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n const first = words[0]?.[0] ?? \"\";\n const last = words.length > 1 ? (words[words.length - 1]?.[0] ?? \"\") : \"\";\n\n return `${first}${last}`.toUpperCase();\n}\n\n/** \"\u2318N\" \u2192 \"Meta+N\", \"Ctrl+O\" \u2192 \"Control+O\", for aria-keyshortcuts. */\nexport function toAriaShortcut(shortcut: string): string {\n return shortcut.replace(\"\u2318\", \"Meta+\").replace(\"Ctrl+\", \"Control+\");\n}\n", "import { cx } from \"../../utils/cx\";\n\nexport interface SpinnerProps {\n /** sm 14px, md 20px, lg 28px.\n * @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** `primary` draws the arc in the progress colour; `current` takes the text colour, for use inside buttons.\n * @default \"primary\" */\n tone?: \"primary\" | \"current\";\n /** Read out by screen readers. Pass an empty string when something nearby already says it's loading.\n * @default \"Loading\" */\n label?: string;\n className?: string;\n}\n\n/** A small spinning ring for work that takes a moment. */\nexport function Spinner({ size = \"md\", tone = \"primary\", label = \"Loading\", className }: SpinnerProps) {\n return (\n <span\n className={cx(\"ow-spinner\", `ow-spinner--${size}`, `ow-spinner--${tone}`, className)}\n {...(label ? { role: \"status\", \"aria-label\": label } : { \"aria-hidden\": true })}\n />\n );\n}\n", "import { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { XIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Button, type ButtonProps } from \"./Button\";\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Joins the buttons into one control with shared borders. Off, they sit 8px apart.\n * @default true */\n attached?: boolean;\n /** @default \"horizontal\" */\n orientation?: \"horizontal\" | \"vertical\";\n}\n\n/** Buttons that belong together: a toolbar's actions, or a split choice like \"Day \u00B7 Week \u00B7 Month\". */\nexport function ButtonGroup({ attached = true, orientation = \"horizontal\", className, ...props }: ButtonGroupProps) {\n return (\n <div\n role=\"group\"\n className={cx(\n \"ow-button-group\",\n attached && \"ow-button-group--attached\",\n orientation === \"vertical\" && \"ow-button-group--vertical\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface CloseButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n /** sm 24px for toasts and tags, md 32px for dialogs and panels.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** What it closes, for screen readers.\n * @default \"Close\" */\n label?: string;\n}\n\n/** The \u2715 in a dialog, drawer or panel header. */\nexport const CloseButton = forwardRef<HTMLButtonElement, CloseButtonProps>(function CloseButton(\n { size = \"md\", label = \"Close\", className, type = \"button\", ...buttonProps },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type}\n aria-label={label}\n className={cx(\"ow-close-button\", `ow-close-button--${size}`, className)}\n {...buttonProps}\n >\n <XIcon size={size === \"sm\" ? 14 : 17} />\n </button>\n );\n});\n\nexport interface ToggleButtonProps extends Omit<ButtonProps, \"variant\"> {\n /** Whether it's on. Leave out to let the button keep its own state. */\n pressed?: boolean;\n /** The starting state when uncontrolled.\n * @default false */\n defaultPressed?: boolean;\n onPressedChange?(pressed: boolean): void;\n /** @default \"secondary\" */\n variant?: \"secondary\" | \"ghost\";\n}\n\n/** A button that stays pressed in while something is on: bold text, a filter, a view mode. */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(function ToggleButton(\n { pressed, defaultPressed = false, onPressedChange, onClick, className, variant = \"secondary\", ...buttonProps },\n ref,\n) {\n const [isPressed, setPressed] = useControllableState(pressed, defaultPressed, onPressedChange);\n return (\n <Button\n ref={ref}\n variant={variant}\n aria-pressed={isPressed}\n className={cx(isPressed && \"ow-button--pressed\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) setPressed(!isPressed);\n }}\n {...buttonProps}\n />\n );\n});\n", "import { useCallback, useRef, useState } from \"react\";\n\n/**\n * State that a parent may control (`value` + `onChange`) or leave to the component (`defaultValue`).\n * Returns the current value and a setter that calls `onChange` either way.\n */\nexport function useControllableState<T>(\n value: T | undefined,\n defaultValue: T,\n onChange?: (next: T) => void,\n): [T, (next: T | ((previous: T) => T)) => void] {\n const [internal, setInternal] = useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T | ((previous: T) => T)) => {\n const resolved =\n typeof next === \"function\" ? (next as (previous: T) => T)(currentRef.current) : next;\n if (Object.is(resolved, currentRef.current)) return;\n if (!isControlled) setInternal(resolved);\n onChangeRef.current?.(resolved);\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n", "import type { ReactNode, SVGProps } from \"react\";\n\n/*\n * The few icons the components draw themselves. They are Lucide shapes (ISC licence, lucide.dev):\n * a 24-unit grid, 2px round strokes in currentColor. For your own icons, use lucide-react.\n */\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, \"ref\"> {\n size?: number;\n}\n\nfunction icon(paths: ReactNode) {\n return function Icon({ size = 16, strokeWidth = 2, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...props}\n >\n {paths}\n </svg>\n );\n };\n}\n\nexport const CheckIcon = icon(<path d=\"M20 6 9 17l-5-5\" />);\nexport const ChevronDownIcon = icon(<path d=\"m6 9 6 6 6-6\" />);\nexport const SearchIcon = icon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </>,\n);\nexport const CornerDownLeftIcon = icon(\n <>\n <polyline points=\"9 10 4 15 9 20\" />\n <path d=\"M20 4v7a4 4 0 0 1-4 4H4\" />\n </>,\n);\nexport const XIcon = icon(\n <>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </>,\n);\nexport const UserIcon = icon(\n <>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </>,\n);\nexport const TrashIcon = icon(\n <>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </>,\n);\nexport const CircleCheckIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </>,\n);\nexport const CircleAlertIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\n </>,\n);\nexport const ChevronRightIcon = icon(<path d=\"m9 18 6-6-6-6\" />);\nexport const ChevronLeftIcon = icon(<path d=\"m15 18-6-6 6-6\" />);\nexport const ChevronUpIcon = icon(<path d=\"m18 15-6-6-6 6\" />);\nexport const MinusIcon = icon(<path d=\"M5 12h14\" />);\nexport const PlusIcon = icon(\n <>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </>,\n);\nexport const InfoIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </>,\n);\nexport const TriangleAlertIcon = icon(\n <>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </>,\n);\nexport const PipetteIcon = icon(\n <>\n <path d=\"m2 22 1-1h3l9-9\" />\n <path d=\"M3 21v-3l9-9\" />\n <path d=\"m15 6 3.4-3.4a2.1 2.1 0 1 1 3 3L18 9l.4.4a2.1 2.1 0 1 1-3 3l-3.8-3.8a2.1 2.1 0 1 1 3-3l.4.4Z\" />\n </>,\n);\nexport const CopyIcon = icon(\n <>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </>,\n);\nexport const CalendarIcon = icon(\n <>\n <path d=\"M8 2v4\" />\n <path d=\"M16 2v4\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n </>,\n);\nexport const FileIcon = icon(\n <>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n </>,\n);\nexport const FolderIcon = icon(\n <path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\" />,\n);\nexport const FolderOpenIcon = icon(\n <path d=\"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\" />,\n);\nexport const UploadIcon = icon(\n <>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\n </>,\n);\nexport const ArrowUpRightIcon = icon(\n <>\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </>,\n);\nexport const ArrowUpIcon = icon(\n <>\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </>,\n);\nexport const ArrowDownIcon = icon(\n <>\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </>,\n);\nexport const ChevronsUpDownIcon = icon(\n <>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </>,\n);\nexport const InboxIcon = icon(\n <>\n <polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" />\n <path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n </>,\n);\nexport const EllipsisIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </>,\n);\n", "import { useRef, type KeyboardEvent, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { useIndicator } from \"../../hooks/useIndicator\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface SegmentedControlOption {\n value: string;\n label: ReactNode;\n /** A 16px icon before the label. With no label, give the option an aria-label. */\n icon?: ReactNode;\n disabled?: boolean;\n \"aria-label\"?: string;\n}\n\nexport interface SegmentedControlProps {\n options: SegmentedControlOption[];\n value?: string;\n /** The starting value when uncontrolled. Defaults to the first option. */\n defaultValue?: string;\n onChange?(value: string): void;\n /** sm 28px, md 32px tall.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** Stretches the segments to fill the container.\n * @default false */\n fullWidth?: boolean;\n /** Names the choice for screen readers. */\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Two to five mutually exclusive options in a well, with the chosen one raised: a view switch, a filter.\n * It behaves like a radio group: the arrow keys move and choose.\n */\nexport function SegmentedControl({\n options,\n value,\n defaultValue,\n onChange,\n size = \"md\",\n fullWidth = false,\n disabled = false,\n className,\n ...aria\n}: SegmentedControlProps) {\n const [current, setCurrent] = useControllableState(value, defaultValue ?? options[0]?.value ?? \"\", onChange);\n const refs = useRef<Array<HTMLButtonElement | null>>([]);\n const groupRef = useRef<HTMLDivElement>(null);\n useIndicator(groupRef, '[aria-checked=\"true\"]', current);\n const enabled = options.map((option, index) => ({ option, index })).filter(({ option }) => !option.disabled);\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>, index: number) {\n const keys: Record<string, number> = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n let target: number | undefined;\n if (event.key in keys) {\n const position = enabled.findIndex((entry) => entry.index === index);\n target = enabled[(position + keys[event.key]! + enabled.length) % enabled.length]?.index;\n } else if (event.key === \"Home\") target = enabled[0]?.index;\n else if (event.key === \"End\") target = enabled[enabled.length - 1]?.index;\n if (target === undefined) return;\n event.preventDefault();\n refs.current[target]?.focus();\n setCurrent(options[target]!.value);\n }\n\n const focusable = options.some((option) => option.value === current && !option.disabled) ? current : enabled[0]?.option.value;\n\n return (\n <div\n ref={groupRef}\n role=\"radiogroup\"\n className={cx(\"ow-segmented\", `ow-segmented--${size}`, fullWidth && \"ow-segmented--full\", disabled && \"ow-segmented--disabled\", className)}\n {...aria}\n >\n {options.map((option, index) => {\n const isSelected = option.value === current;\n return (\n <button\n key={option.value}\n ref={(element) => {\n refs.current[index] = element;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={option[\"aria-label\"]}\n tabIndex={option.value === focusable ? 0 : -1}\n disabled={disabled || option.disabled}\n className={cx(\"ow-segmented__item\", isSelected && \"ow-segmented__item--selected\")}\n onClick={() => setCurrent(option.value)}\n onKeyDown={(event) => onKeyDown(event, index)}\n >\n {option.icon ? <span className=\"ow-segmented__icon\">{option.icon}</span> : null}\n {option.label}\n </button>\n );\n })}\n <span className=\"ow-indicator\" aria-hidden=\"true\" />\n </div>\n );\n}\n", "import { useLayoutEffect, type RefObject } from \"react\";\n\n/**\n * Measures the selected child of `containerRef` (the first match of `selector`) and writes its box to the\n * container as --ow-indicator-x, -y, -w and -h, so one absolutely placed element (.ow-indicator) can slide\n * between choices. The container gets data-indicator=\"placed\" on the first measure (no animation) and \"ready\"\n * a frame later (animated from then on). It re-measures when `key` changes or anything resizes.\n */\nexport function useIndicator(containerRef: RefObject<HTMLElement | null>, selector: string, key: unknown) {\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return undefined;\n let frame = 0;\n\n const measure = () => {\n const selected = container.querySelector<HTMLElement>(selector);\n if (!selected) {\n delete container.dataset.indicator;\n return;\n }\n container.style.setProperty(\"--ow-indicator-x\", `${selected.offsetLeft}px`);\n container.style.setProperty(\"--ow-indicator-y\", `${selected.offsetTop}px`);\n container.style.setProperty(\"--ow-indicator-w\", `${selected.offsetWidth}px`);\n container.style.setProperty(\"--ow-indicator-h\", `${selected.offsetHeight}px`);\n if (!container.dataset.indicator) {\n container.dataset.indicator = \"placed\";\n frame = requestAnimationFrame(() => {\n frame = requestAnimationFrame(() => {\n if (container.dataset.indicator) container.dataset.indicator = \"ready\";\n });\n });\n }\n };\n\n measure();\n if (typeof ResizeObserver === \"undefined\") return () => cancelAnimationFrame(frame);\n const observer = new ResizeObserver(measure);\n observer.observe(container);\n for (const child of container.children) observer.observe(child);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [containerRef, selector, key]);\n}\n", "import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { toAriaShortcut } from \"../../utils/text\";\n\nexport interface ChoiceCardProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n title: string;\n /** One line under the title saying what this choice does. */\n description: string;\n /** A 20px lucide-react icon, shown on a tinted tile. */\n icon: ReactNode;\n /** Marks the recommended choice with a tinted border. */\n recommended?: boolean;\n /** Keyboard shortcut shown in the top-right corner, e.g. \"\u2318N\". Only pass one that actually works. */\n shortcut?: string;\n}\n\n/** A large, card-shaped button for picking between a few options, e.g. on an empty state. */\nexport const ChoiceCard = forwardRef<HTMLButtonElement, ChoiceCardProps>(function ChoiceCard(\n { className, description, icon, recommended = false, shortcut, title, type = \"button\", ...buttonProps },\n ref,\n) {\n return (\n <button\n ref={ref}\n className={cx(\"ow-choice\", recommended && \"ow-choice--recommended\", className)}\n type={type}\n aria-keyshortcuts={shortcut ? toAriaShortcut(shortcut) : undefined}\n {...buttonProps}\n >\n <span className=\"ow-choice__top\">\n <span className=\"ow-choice__icon\">{icon}</span>\n {shortcut ? (\n <kbd aria-hidden=\"true\" className=\"ow-choice__shortcut\">\n {shortcut}\n </kbd>\n ) : null}\n </span>\n <span className=\"ow-choice__text\">\n <span className=\"ow-choice__title\">{title}</span>\n <span className=\"ow-choice__description\">{description}</span>\n </span>\n </button>\n );\n});\n", "import { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { CheckIcon, CopyIcon } from \"../../icons\";\nimport { copyText } from \"../../utils/copyText\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface CopyButtonProps {\n /** The text to copy. */\n value: string;\n /** Shown beside the icon, and read out.\n * @default \"Copy\" */\n label?: string;\n /** Shown for two seconds after copying.\n * @default \"Copied\" */\n copiedLabel?: string;\n /** Just the icon; the label is still read out.\n * @default false */\n iconOnly?: boolean;\n /** `default` sits on surfaces; `onDark` sits on a code block.\n * @default \"default\" */\n tone?: \"default\" | \"onDark\";\n onCopy?(): void;\n className?: string;\n}\n\n/** Copies a value and says so: the icon turns into a check for two seconds and screen readers hear \"Copied\". */\nexport function CopyButton({ value, label = \"Copy\", copiedLabel = \"Copied\", iconOnly = false, tone = \"default\", onCopy, className }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timer = useRef(0);\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n return (\n <button\n type=\"button\"\n className={cx(\n \"ow-copy-button\",\n tone === \"onDark\" && \"ow-copy-button--on-dark\",\n iconOnly && \"ow-copy-button--icon-only\",\n copied && \"ow-copy-button--copied\",\n className,\n )}\n aria-label={iconOnly ? (copied ? copiedLabel : label) : undefined}\n onClick={async () => {\n if (await copyText(value)) {\n setCopied(true);\n onCopy?.();\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setCopied(false), 2000);\n }\n }}\n >\n <span className=\"ow-copy-button__icon\" aria-hidden=\"true\">\n <CopyIcon size={14} />\n <CheckIcon size={14} />\n </span>\n {iconOnly ? null : <span>{copied ? copiedLabel : label}</span>}\n <span className=\"ow-visually-hidden\" aria-live=\"polite\">\n {copied ? copiedLabel : \"\"}\n </span>\n </button>\n );\n}\n\nexport interface CodeBlockProps {\n /** The code, as plain text. It's what the copy button copies. */\n code: string;\n /** Pre-highlighted HTML for the code (from Shiki or Prism, say). Without it the code shows plain. */\n html?: string;\n /** A file name or caption in the header. */\n title?: ReactNode;\n /** Shown on the right of the header, e.g. \"tsx\". */\n language?: string;\n /** @default false */\n showLineNumbers?: boolean;\n /** @default true */\n copyable?: boolean;\n /** Scrolls past this height (pixels). */\n maxHeight?: number;\n className?: string;\n}\n\n/** Code on a night ground, the same in both themes, with a copy button. */\nexport function CodeBlock({ code, html, title, language, showLineNumbers = false, copyable = true, maxHeight, className }: CodeBlockProps) {\n const hasHeader = title !== undefined || language !== undefined;\n const lines = code.replace(/\\n$/, \"\").split(\"\\n\");\n return (\n <div className={cx(\"ow-code-block\", showLineNumbers && \"ow-code-block--numbered\", className)}>\n {hasHeader ? (\n <div className=\"ow-code-block__header\">\n <span className=\"ow-code-block__title\">{title}</span>\n {language ? <span className=\"ow-code-block__language\">{language}</span> : null}\n {copyable ? <CopyButton value={code} tone=\"onDark\" iconOnly label=\"Copy code\" /> : null}\n </div>\n ) : copyable ? (\n <CopyButton value={code} tone=\"onDark\" iconOnly label=\"Copy code\" className=\"ow-code-block__floating-copy\" />\n ) : null}\n <pre className=\"ow-code-block__pre\" style={maxHeight ? { maxHeight } : undefined} tabIndex={0}>\n {showLineNumbers ? (\n <span className=\"ow-code-block__numbers\" aria-hidden=\"true\">\n {lines.map((_, index) => (\n <span key={index}>{index + 1}</span>\n ))}\n </span>\n ) : null}\n {html ? (\n <code className=\"ow-code-block__code\" dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <code className=\"ow-code-block__code\">{code.replace(/\\n$/, \"\")}</code>\n )}\n </pre>\n </div>\n );\n}\n\nexport interface SnippetProps {\n /** The command or value, copied as is. */\n value: string;\n /** A muted prompt before it, such as \"$\".\n * @default \"$\" */\n prompt?: string | null;\n className?: string;\n}\n\n/** One line to copy: an install command, an API key name, a URL. */\nexport function Snippet({ value, prompt = \"$\", className }: SnippetProps) {\n return (\n <div className={cx(\"ow-snippet\", className)}>\n <code className=\"ow-snippet__code\">\n {prompt ? (\n <span className=\"ow-snippet__prompt\" aria-hidden=\"true\">\n {prompt}\n </span>\n ) : null}\n {value}\n </code>\n <CopyButton value={value} iconOnly label={`Copy ${value}`} />\n </div>\n );\n}\n", "/** Copies text to the clipboard, falling back to a hidden textarea where the Clipboard API is refused. */\nexport async function copyText(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.opacity = \"0\";\n document.body.appendChild(area);\n area.select();\n let ok = false;\n try {\n ok = document.execCommand(\"copy\");\n } catch {\n ok = false;\n }\n area.remove();\n return ok;\n }\n}\n", "import { cloneElement, isValidElement, useId, type ReactElement, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface FieldProps {\n /** The label, set above the control. */\n label: ReactNode;\n /** One control: an Input, Textarea, Select, or any element that takes an id. */\n children: ReactElement;\n /** A muted line under the control. */\n hint?: ReactNode;\n /** An error under the control; it also marks the control invalid. */\n error?: ReactNode;\n className?: string;\n}\n\n/**\n * A label above a control, with an optional hint and error below. Field wires them together:\n * it gives the control an id (unless it has one), points aria-describedby at the hint and error,\n * and marks it invalid when there is an error.\n */\nexport function Field({ label, children, hint, error, className }: FieldProps) {\n const generatedId = useId();\n const hintId = `${generatedId}-hint`;\n const errorId = `${generatedId}-error`;\n\n const child = isValidElement<Record<string, unknown>>(children) ? children : null;\n const controlId = (child?.props.id as string | undefined) ?? `${generatedId}-control`;\n const describedBy =\n [child?.props[\"aria-describedby\"] as string | undefined, hint ? hintId : undefined, error ? errorId : undefined]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // Our own controls draw the invalid state from `isInvalid`; native elements get aria-invalid.\n const invalidProp =\n child && typeof child.type !== \"string\"\n ? { isInvalid: (child.props.isInvalid as boolean | undefined) ?? Boolean(error) }\n : { \"aria-invalid\": error ? true : undefined };\n\n return (\n <div className={cx(\"ow-field\", className)}>\n <label className=\"ow-field__label\" htmlFor={controlId}>\n {label}\n </label>\n {child\n ? cloneElement(child, { id: controlId, \"aria-describedby\": describedBy, ...invalidProp })\n : children}\n {hint ? (\n <p id={hintId} className=\"ow-field__hint\">\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={errorId} role=\"alert\" className=\"ow-field__error\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n", "import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n /** Shows the field as wrong: a red border, and a red halo when focused. Also sets aria-invalid.\n * @default false */\n isInvalid?: boolean;\n /** sm 32px for toolbars and settings rows, md 40px in forms.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** Inside the field, before the text: a 16px icon, a unit, a prefix like \"https://\". */\n startContent?: ReactNode;\n /** Inside the field, after the text: a unit, a small ghost Button, a Spinner. */\n endContent?: ReactNode;\n}\n\n/**\n * A single-line text field. With startContent or endContent, the field becomes a group and `className`\n * goes on the group, so width and margins apply to the whole field.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { className, isInvalid = false, size = \"md\", startContent, endContent, ...inputProps },\n ref,\n) {\n const invalid = isInvalid || undefined;\n if (startContent === undefined && endContent === undefined) {\n return (\n <input\n ref={ref}\n className={cx(\"ow-input\", size === \"sm\" && \"ow-input--sm\", isInvalid && \"ow-input--invalid\", className)}\n aria-invalid={invalid}\n {...inputProps}\n />\n );\n }\n return (\n <div\n className={cx(\n \"ow-input-group\",\n size === \"sm\" && \"ow-input-group--sm\",\n isInvalid && \"ow-input-group--invalid\",\n inputProps.disabled && \"ow-input-group--disabled\",\n className,\n )}\n >\n {startContent !== undefined ? <span className=\"ow-input-group__addon\">{startContent}</span> : null}\n <input ref={ref} className=\"ow-input-group__input\" aria-invalid={invalid} {...inputProps} />\n {endContent !== undefined ? <span className=\"ow-input-group__addon\">{endContent}</span> : null}\n </div>\n );\n});\n", "import { forwardRef, useRef, type ForwardedRef, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { SearchIcon } from \"../../icons\";\nimport { CloseButton } from \"../Button/ButtonGroup\";\nimport { Input, type InputProps } from \"../Input/Input\";\nimport { Spinner } from \"../Spinner/Spinner\";\n\nexport interface SearchFieldProps\n extends Omit<InputProps, \"value\" | \"defaultValue\" | \"onChange\" | \"type\" | \"startContent\" | \"endContent\" | \"onSubmit\"> {\n value?: string;\n /** @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** Called with the text when the person presses Enter. */\n onSubmit?(value: string): void;\n /** Shows a spinner in place of the clear button while results load.\n * @default false */\n loading?: boolean;\n /** Names the field when there's no visible label.\n * @default \"Search\" */\n \"aria-label\"?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/** A search box: a magnifier, the text, and a clear button once there's something to clear. Escape clears it. */\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(function SearchField(\n {\n value,\n defaultValue = \"\",\n onChange,\n onSubmit,\n loading = false,\n placeholder = \"Search\",\n \"aria-label\": ariaLabel = \"Search\",\n size = \"md\",\n onKeyDown,\n ...inputProps\n },\n ref,\n) {\n const [text, setText] = useControllableState(value, defaultValue, onChange);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === \"Escape\" && text) {\n event.preventDefault();\n event.stopPropagation();\n setText(\"\");\n } else if (event.key === \"Enter\") {\n onSubmit?.(text);\n }\n }\n\n return (\n <Input\n ref={(element) => {\n inputRef.current = element;\n assignRef(ref, element);\n }}\n type=\"search\"\n size={size}\n placeholder={placeholder}\n aria-label={ariaLabel}\n value={text}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={handleKeyDown}\n startContent={<SearchIcon size={size === \"sm\" ? 14 : 16} />}\n endContent={\n loading ? (\n <Spinner size=\"sm\" label=\"Searching\" />\n ) : text ? (\n <CloseButton\n size=\"sm\"\n label=\"Clear search\"\n onClick={() => {\n setText(\"\");\n inputRef.current?.focus();\n }}\n />\n ) : null\n }\n {...inputProps}\n />\n );\n});\n", "import { forwardRef, useState, type InputHTMLAttributes, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { MinusIcon, PlusIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface NumberFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"value\" | \"defaultValue\" | \"onChange\" | \"size\" | \"type\" | \"min\" | \"max\" | \"step\"> {\n /** The number, or null when empty. */\n value?: number | null;\n /** @default null */\n defaultValue?: number | null;\n onChange?(value: number | null): void;\n min?: number;\n max?: number;\n /** How much the buttons and arrow keys change it. PageUp and PageDown move ten steps.\n * @default 1 */\n step?: number;\n /** How the number is shown while the field isn't being edited, e.g. { style: \"currency\", currency: \"EUR\" }. */\n formatOptions?: Intl.NumberFormatOptions;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n /** Names the field when there's no visible label (Field gives it one). */\n \"aria-label\"?: string;\n}\n\nconst decimals = (step: number) => (String(step).split(\".\")[1] ?? \"\").length;\n\n/** A number with \u2212 and + buttons either side. Up and Down step it; the value is clamped to min and max. */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(\n {\n value,\n defaultValue = null,\n onChange,\n min,\n max,\n step = 1,\n formatOptions,\n size = \"md\",\n isInvalid = false,\n disabled,\n className,\n onBlur,\n onFocus,\n onKeyDown,\n ...inputProps\n },\n ref,\n) {\n const [number, setNumber] = useControllableState(value, defaultValue, onChange);\n const [draft, setDraft] = useState<string | null>(null);\n const format = (n: number | null) =>\n n === null ? \"\" : formatOptions ? new Intl.NumberFormat(undefined, formatOptions).format(n) : String(n);\n\n const clamp = (n: number) => {\n const rounded = Number(n.toFixed(decimals(step)));\n return Math.min(max ?? Infinity, Math.max(min ?? -Infinity, rounded));\n };\n\n // While the field has focus, `draft` holds the raw text; otherwise the number is shown formatted.\n function commit(text: string, keepEditing = false) {\n setDraft(keepEditing ? text : null);\n const cleaned = text.replace(/[^\\d.,-]/g, \"\").replace(\",\", \".\");\n if (cleaned === \"\" || cleaned === \"-\") {\n setNumber(null);\n return;\n }\n const parsed = Number(cleaned);\n if (Number.isNaN(parsed)) return;\n const next = clamp(parsed);\n setNumber(next);\n if (keepEditing) setDraft(String(next));\n }\n\n function stepBy(multiple: number) {\n const base = draft !== null && draft !== \"\" && !Number.isNaN(Number(draft)) ? Number(draft) : (number ?? min ?? 0);\n const next = clamp(base + step * multiple);\n setNumber(next);\n if (draft !== null) setDraft(String(next));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n const moves: Record<string, () => void> = {\n ArrowUp: () => stepBy(1),\n ArrowDown: () => stepBy(-1),\n PageUp: () => stepBy(10),\n PageDown: () => stepBy(-10),\n Home: () => min !== undefined && commit(String(min), draft !== null),\n End: () => max !== undefined && commit(String(max), draft !== null),\n Enter: () => draft !== null && commit(draft, true),\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n move();\n }\n\n const atMin = min !== undefined && number !== null && number <= min;\n const atMax = max !== undefined && number !== null && number >= max;\n\n return (\n <div\n className={cx(\n \"ow-number-field\",\n size === \"sm\" && \"ow-number-field--sm\",\n isInvalid && \"ow-number-field--invalid\",\n disabled && \"ow-number-field--disabled\",\n className,\n )}\n >\n <button\n type=\"button\"\n className=\"ow-number-field__step\"\n aria-label=\"Decrease\"\n tabIndex={-1}\n disabled={disabled || atMin}\n onClick={() => stepBy(-1)}\n >\n <MinusIcon size={14} />\n </button>\n <input\n ref={ref}\n type=\"text\"\n inputMode={decimals(step) > 0 || (min ?? 0) < 0 ? \"decimal\" : \"numeric\"}\n role=\"spinbutton\"\n autoComplete=\"off\"\n className=\"ow-number-field__input\"\n aria-valuenow={number ?? undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={number === null ? undefined : format(number)}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n value={draft ?? format(number)}\n onFocus={(event) => {\n onFocus?.(event);\n setDraft(number === null ? \"\" : String(number));\n }}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={(event) => {\n onBlur?.(event);\n commit(event.target.value);\n }}\n onKeyDown={handleKeyDown}\n {...inputProps}\n />\n <button\n type=\"button\"\n className=\"ow-number-field__step\"\n aria-label=\"Increase\"\n tabIndex={-1}\n disabled={disabled || atMax}\n onClick={() => stepBy(1)}\n >\n <PlusIcon size={14} />\n </button>\n </div>\n );\n});\n", "import { useRef, type ClipboardEvent, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface InputOTPProps {\n /** How many characters the code has.\n * @default 6 */\n length?: number;\n value?: string;\n /** @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** Called once every box is filled. */\n onComplete?(value: string): void;\n /** `numeric` accepts digits only; `alphanumeric` letters and digits (shown upper case).\n * @default \"numeric\" */\n type?: \"numeric\" | \"alphanumeric\";\n /** Splits the boxes into groups with a dash between, e.g. 3 for \"123\u2013456\". */\n groupSize?: number;\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n autoFocus?: boolean;\n /** Names the code for screen readers.\n * @default \"Verification code\" */\n \"aria-label\"?: string;\n /** The form field name; a hidden input carries the whole code. */\n name?: string;\n className?: string;\n}\n\n/**\n * A one-time code in separate boxes. Typing moves forward, Backspace moves back,\n * and pasting a code fills every box. The browser can fill it from a text message.\n */\nexport function InputOTP({\n length = 6,\n value,\n defaultValue = \"\",\n onChange,\n onComplete,\n type = \"numeric\",\n groupSize,\n isInvalid = false,\n disabled,\n autoFocus,\n \"aria-label\": ariaLabel = \"Verification code\",\n name,\n className,\n}: InputOTPProps) {\n const [code, setCode] = useControllableState(value, defaultValue, onChange);\n const refs = useRef<Array<HTMLInputElement | null>>([]);\n // The code as of the last change, read by handlers that run before React renders it,\n // such as the next box's onFocus when typing moves focus forward.\n const latest = useRef(code);\n latest.current = code;\n const allowed = type === \"numeric\" ? /\\d/ : /[a-z0-9]/i;\n const clean = (text: string) => [...text].filter((char) => allowed.test(char)).join(\"\").toUpperCase();\n const chars = Array.from({ length }, (_, index) => code[index] ?? \"\");\n\n function update(next: string, focusIndex: number) {\n const trimmed = next.slice(0, length);\n latest.current = trimmed;\n setCode(trimmed);\n refs.current[Math.min(focusIndex, length - 1)]?.focus();\n if (trimmed.length === length && !trimmed.includes(\" \")) onComplete?.(trimmed);\n }\n\n function setAt(index: number, char: string) {\n const next = chars.map((existing, i) => (i === index ? char : existing));\n // Keep the code contiguous: an empty box ends it.\n const firstGap = next.indexOf(\"\");\n return (firstGap === -1 ? next : next.slice(0, firstGap)).join(\"\");\n }\n\n function onInput(index: number, text: string) {\n const typed = clean(text);\n if (!typed) return;\n if (typed.length > 1) {\n // Autofill or a paste into one box.\n update(chars.slice(0, index).join(\"\") + typed, index + typed.length);\n return;\n }\n update(setAt(index, typed), index + 1);\n }\n\n function onKeyDown(index: number, event: KeyboardEvent<HTMLInputElement>) {\n if (event.key === \"Backspace\") {\n event.preventDefault();\n // Removes one character; the ones after it move back a box.\n if (chars[index]) update(code.slice(0, index) + code.slice(index + 1), index);\n else if (index > 0) update(code.slice(0, index - 1) + code.slice(index), index - 1);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n refs.current[Math.max(0, index - 1)]?.focus();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n refs.current[Math.min(length - 1, index + 1, code.length)]?.focus();\n }\n }\n\n function onPaste(index: number, event: ClipboardEvent<HTMLInputElement>) {\n event.preventDefault();\n const pasted = clean(event.clipboardData.getData(\"text\"));\n if (pasted) update(chars.slice(0, index).join(\"\") + pasted, index + pasted.length);\n }\n\n return (\n <div role=\"group\" aria-label={ariaLabel} className={cx(\"ow-otp\", isInvalid && \"ow-otp--invalid\", className)}>\n {chars.map((char, index) => (\n <span key={index} className=\"ow-otp__slot\">\n {groupSize && index > 0 && index % groupSize === 0 ? (\n <span className=\"ow-otp__separator\" aria-hidden=\"true\" />\n ) : null}\n <input\n ref={(element) => {\n refs.current[index] = element;\n }}\n className=\"ow-otp__input\"\n type=\"text\"\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n autoCapitalize=\"characters\"\n maxLength={length}\n aria-label={`Character ${index + 1} of ${length}`}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n autoFocus={autoFocus && index === 0}\n value={char}\n // Clicking an empty box past the end goes to the next one to fill.\n onFocus={(event) => {\n const filled = latest.current.length;\n if (index > filled) refs.current[filled]?.focus();\n else event.target.select();\n }}\n onChange={(event) => onInput(index, event.target.value.replace(char, \"\") || event.target.value)}\n onKeyDown={(event) => onKeyDown(index, event)}\n onPaste={(event) => onPaste(index, event)}\n />\n </span>\n ))}\n {name ? <input type=\"hidden\" name={name} value={code} /> : null}\n </div>\n );\n}\n", "import {\n forwardRef,\n useLayoutEffect,\n useRef,\n type ChangeEvent,\n type CSSProperties,\n type ForwardedRef,\n type TextareaHTMLAttributes,\n} from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { resizeTextArea } from \"../../utils/resizeTextArea\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Grows with its text, up to `autoGrowMaxHeight`, then scrolls. */\n autoGrow?: boolean;\n /** The tallest an auto-growing box gets. A number is pixels. Default 180. */\n autoGrowMaxHeight?: number | string;\n /** Borderless and transparent, for use inside your own field container (a chat composer). */\n bare?: boolean;\n isInvalid?: boolean;\n}\n\nconst defaultAutoGrowMaxHeight = 180;\n\nfunction assignRef(ref: ForwardedRef<HTMLTextAreaElement>, element: HTMLTextAreaElement | null) {\n if (typeof ref === \"function\") ref(element);\n else if (ref) ref.current = element;\n}\n\n/** A multi-line text field, 72px tall at least; it can grow with its text. */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n autoGrow = false,\n autoGrowMaxHeight = defaultAutoGrowMaxHeight,\n bare = false,\n className,\n isInvalid = false,\n onChange,\n style,\n value,\n ...textareaProps\n },\n ref,\n) {\n const textAreaRef = useRef<HTMLTextAreaElement | null>(null);\n\n useLayoutEffect(() => {\n if (autoGrow && textAreaRef.current) resizeTextArea(textAreaRef.current);\n }, [autoGrow, autoGrowMaxHeight, value]);\n\n function setTextAreaRef(element: HTMLTextAreaElement | null) {\n textAreaRef.current = element;\n assignRef(ref, element);\n if (autoGrow && element) resizeTextArea(element);\n }\n\n function handleChange(event: ChangeEvent<HTMLTextAreaElement>) {\n // A controlled box is resized once its new value renders (the layout effect above).\n if (autoGrow && value === undefined) resizeTextArea(event.currentTarget);\n onChange?.(event);\n }\n\n const textareaStyle: CSSProperties | undefined = autoGrow\n ? {\n ...style,\n maxHeight: typeof autoGrowMaxHeight === \"number\" ? `${autoGrowMaxHeight}px` : autoGrowMaxHeight,\n }\n : style;\n\n return (\n <textarea\n {...textareaProps}\n ref={setTextAreaRef}\n className={cx(\n \"ow-textarea\",\n bare && \"ow-textarea--bare\",\n isInvalid && !bare && \"ow-textarea--invalid\",\n autoGrow && \"ow-textarea--auto-grow\",\n className,\n )}\n aria-invalid={isInvalid || undefined}\n style={textareaStyle}\n value={value}\n onChange={handleChange}\n />\n );\n});\n", "/** Text longer than this can't fit under any auto-grow cap, however wide the box. */\nconst surelyOverflowingLength = 20_000;\n\n/**\n * Whether the text needs more lines than fit under maxHeight even before wrapping. Counting line breaks is cheap;\n * measuring (scrollHeight) lays out all of the text, which takes tens of milliseconds per keystroke for a long draft.\n */\nfunction surelyOverflows(textArea: HTMLTextAreaElement, maxHeight: number): boolean {\n const text = textArea.value;\n if (text.length > surelyOverflowingLength) return true;\n const style = window.getComputedStyle(textArea);\n const lineHeight = Number.parseFloat(style.lineHeight) || Number.parseFloat(style.fontSize) * 1.2;\n if (!lineHeight) return false;\n const needed = Math.ceil(maxHeight / lineHeight) + 1;\n let lines = 1;\n for (let index = text.indexOf(\"\\n\"); index !== -1 && lines < needed; index = text.indexOf(\"\\n\", index + 1))\n lines += 1;\n return lines >= needed;\n}\n\n/** Grows a textarea to fit its text, up to its CSS max-height, then scrolls. */\nexport function resizeTextArea(textArea: HTMLTextAreaElement): void {\n const maxHeight = Number.parseFloat(window.getComputedStyle(textArea).maxHeight);\n // Already past the cap: it stays at the cap and scrolls, with nothing to measure.\n if (Number.isFinite(maxHeight) && surelyOverflows(textArea, maxHeight)) {\n textArea.style.height = `${maxHeight.toString()}px`;\n textArea.style.overflowY = \"auto\";\n return;\n }\n\n textArea.style.height = \"auto\";\n\n const shouldScroll = Number.isFinite(maxHeight) && textArea.scrollHeight > maxHeight;\n\n textArea.style.height = `${textArea.scrollHeight}px`;\n textArea.style.overflowY = shouldScroll ? \"auto\" : \"hidden\";\n}\n", "import { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\n\nimport { manualPopover, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { CheckIcon, ChevronDownIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface SelectOption {\n value: string;\n label: ReactNode;\n /** Plain text for type-to-find and the trigger's tooltip, when `label` isn't a string. */\n textValue?: string;\n /** A muted line under the label. */\n description?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface SelectGroup {\n label: string;\n options: SelectOption[];\n}\n\nexport type SelectItem = SelectOption | SelectGroup;\n\nexport interface SelectProps {\n value: string;\n options: SelectItem[];\n onChange(value: string): void;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n id?: string;\n disabled?: boolean;\n /** Shown when no option matches `value`. Default \"Select\u2026\". */\n placeholder?: string;\n size?: \"sm\" | \"md\";\n isInvalid?: boolean;\n /** Classes for the trigger, e.g. a width. */\n className?: string;\n /** Classes for the trigger's and options' text, e.g. a monospace class. */\n valueClassName?: string;\n}\n\nconst menuGap = 4;\nconst menuMaxHeight = 288;\nconst typeaheadResetMs = 600;\n\nfunction isGroup(item: SelectItem): item is SelectGroup {\n return \"options\" in item;\n}\n\nfunction textOf(option: SelectOption): string {\n return option.textValue ?? (typeof option.label === \"string\" ? option.label : option.value);\n}\n\n/**\n * A dropdown: a button that opens a listbox of options, in place of a native <select>.\n * It works with the keyboard like a select (arrows, Home/End, type to find, Enter/Space to pick,\n * Escape/Tab to close), keeps focus on the trigger, and its menu sits in the top layer so it\n * isn't clipped by dialogs or scroll areas.\n */\nexport function Select({\n value,\n options,\n onChange,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n id,\n disabled = false,\n placeholder = \"Select\u2026\",\n size = \"md\",\n isInvalid = false,\n className,\n valueClassName,\n}: SelectProps) {\n const listboxId = useId();\n const optionIdPrefix = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const typeahead = useRef({ text: \"\", timer: 0 });\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const flat = useMemo(() => options.flatMap((item) => (isGroup(item) ? item.options : [item])), [options]);\n const selectedIndex = flat.findIndex((option) => option.value === value);\n const selected = flat[selectedIndex];\n const optionId = (index: number) => `${optionIdPrefix}-${index}`;\n\n const enabledFrom = useCallback(\n (start: number, step: 1 | -1): number => {\n for (let index = start; index >= 0 && index < flat.length; index += step) {\n if (!flat[index]!.disabled) return index;\n }\n return -1;\n },\n [flat],\n );\n\n const { mounted, state } = usePresence(isOpen);\n const floatingStyle = useFloating({\n open: mounted,\n anchorRef: triggerRef,\n floatingRef: menuRef,\n offset: menuGap,\n matchWidth: true,\n maxHeight: menuMaxHeight,\n });\n\n function open(startAt?: \"first\" | \"last\") {\n if (disabled || isOpen) return;\n setActiveIndex(\n startAt === \"first\"\n ? enabledFrom(0, 1)\n : startAt === \"last\"\n ? enabledFrom(flat.length - 1, -1)\n : selectedIndex >= 0 && !flat[selectedIndex]!.disabled\n ? selectedIndex\n : enabledFrom(0, 1),\n );\n setIsOpen(true);\n }\n\n function close() {\n setIsOpen(false);\n }\n\n function choose(index: number) {\n const option = flat[index];\n if (!option || option.disabled) return;\n close();\n triggerRef.current?.focus();\n if (option.value !== value) onChange(option.value);\n }\n\n // Keep the active option in view while moving with the keyboard.\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return;\n document.getElementById(optionId(activeIndex))?.scrollIntoView({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- optionId is stable for this component.\n }, [isOpen, activeIndex]);\n\n // Close on a click elsewhere. (useFloating follows the trigger when the page scrolls or resizes.)\n useEffect(() => {\n if (!isOpen) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (!menuRef.current?.contains(target) && !triggerRef.current?.contains(target)) close();\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown, true);\n }, [isOpen]);\n\n useEffect(() => {\n if (disabled) setIsOpen(false);\n }, [disabled]);\n\n useEffect(() => () => window.clearTimeout(typeahead.current.timer), []);\n\n function findByTyping(key: string) {\n const state = typeahead.current;\n window.clearTimeout(state.timer);\n state.text += key.toLowerCase();\n state.timer = window.setTimeout(() => {\n state.text = \"\";\n }, typeaheadResetMs);\n const from = isOpen ? activeIndex : selectedIndex;\n // A repeated single letter cycles through the matches.\n const repeated = state.text.length > 1 && [...state.text].every((letter) => letter === state.text[0]);\n const search = repeated ? state.text[0]! : state.text;\n const start = repeated || state.text.length === 1 ? from + 1 : from;\n for (let offset = 0; offset < flat.length; offset += 1) {\n const index = (Math.max(start, 0) + offset) % flat.length;\n const option = flat[index]!;\n if (!option.disabled && textOf(option).toLowerCase().startsWith(search)) {\n if (isOpen) setActiveIndex(index);\n else if (option.value !== value) onChange(option.value);\n return;\n }\n }\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n if (disabled) return;\n const { key } = event;\n\n if (!isOpen) {\n if (key === \"ArrowDown\" || key === \"ArrowUp\" || key === \"Enter\" || key === \" \") {\n event.preventDefault();\n open(key === \"ArrowUp\" && selectedIndex < 0 ? \"last\" : undefined);\n } else if (key.length === 1 && !event.metaKey && !event.ctrlKey) {\n findByTyping(key);\n }\n return;\n }\n\n switch (key) {\n case \"ArrowDown\": {\n event.preventDefault();\n const next = enabledFrom(activeIndex + 1, 1);\n if (next >= 0) setActiveIndex(next);\n return;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n const previous = enabledFrom(activeIndex - 1, -1);\n if (previous >= 0) setActiveIndex(previous);\n return;\n }\n case \"Home\":\n case \"PageUp\":\n event.preventDefault();\n setActiveIndex(enabledFrom(0, 1));\n return;\n case \"End\":\n case \"PageDown\":\n event.preventDefault();\n setActiveIndex(enabledFrom(flat.length - 1, -1));\n return;\n case \"Enter\":\n event.preventDefault();\n choose(activeIndex);\n return;\n case \" \":\n event.preventDefault();\n if (typeahead.current.text) findByTyping(\" \");\n else choose(activeIndex);\n return;\n case \"Escape\":\n // Close the menu, not the dialog around it.\n event.preventDefault();\n event.stopPropagation();\n close();\n return;\n case \"Tab\":\n close();\n return;\n default:\n if (key.length === 1 && !event.metaKey && !event.ctrlKey) findByTyping(key);\n }\n }\n\n let flatIndex = -1;\n\n const renderOption = (option: SelectOption) => {\n flatIndex += 1;\n const index = flatIndex;\n const isSelected = index === selectedIndex;\n const isActive = index === activeIndex;\n return (\n <div\n key={`${option.value}-${index}`}\n id={optionId(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled || undefined}\n className={cx(\"ow-option\", {\n \"ow-option--active\": isActive && !option.disabled,\n \"ow-option--selected\": isSelected,\n \"ow-option--disabled\": Boolean(option.disabled),\n })}\n onPointerMove={() => {\n if (!option.disabled && activeIndex !== index) setActiveIndex(index);\n }}\n // Keep focus on the trigger.\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => choose(index)}\n >\n <span className=\"ow-option__check\">{isSelected ? <CheckIcon size={14} /> : null}</span>\n <span className=\"ow-option__text\">\n <span className={cx(\"ow-option__label\", valueClassName)}>{option.label}</span>\n {option.description ? <span className=\"ow-option__description\">{option.description}</span> : null}\n </span>\n </div>\n );\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={isOpen && activeIndex >= 0 ? optionId(activeIndex) : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n title={selected ? textOf(selected) : undefined}\n className={cx(\"ow-select\", `ow-select--${size}`, { \"ow-select--open\": isOpen, \"ow-select--invalid\": isInvalid && !isOpen }, className)}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={onKeyDown}\n onBlur={(event) => {\n if (!menuRef.current?.contains(event.relatedTarget as Node)) close();\n }}\n >\n <span className={cx(\"ow-select__value\", !selected && \"ow-select__value--placeholder\", valueClassName)}>\n {selected ? selected.label : placeholder}\n </span>\n <ChevronDownIcon size={size === \"sm\" ? 14 : 16} className=\"ow-select__chevron\" />\n </button>\n {mounted ? (\n <div\n ref={menuRef}\n {...manualPopover}\n data-state={state}\n id={listboxId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n tabIndex={-1}\n className={cx(\"ow-listbox\", \"ow-floating\", `ow-listbox--${size}`)}\n style={floatingStyle}\n >\n {options.map((item, groupIndex) =>\n isGroup(item) ? (\n <div key={`group-${item.label}-${groupIndex}`} role=\"group\" aria-label={item.label} className=\"ow-listbox__group\">\n <div className=\"ow-listbox__group-label\" aria-hidden=\"true\">\n {item.label}\n </div>\n {item.options.map(renderOption)}\n </div>\n ) : (\n renderOption(item)\n ),\n )}\n {flat.length === 0 ? <div className=\"ow-listbox__empty\">No options</div> : null}\n </div>\n ) : null}\n </>\n );\n}\n", "import { useCallback, useEffect, useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\n\nexport type Placement = \"bottom-start\" | \"bottom-end\" | \"bottom\" | \"top-start\" | \"top-end\" | \"top\";\n\ninterface Options {\n open: boolean;\n anchorRef: RefObject<HTMLElement | null>;\n floatingRef: RefObject<HTMLElement | null>;\n placement?: Placement;\n /** Distance from the anchor in pixels. */\n offset?: number;\n /** Make the floating element at least as wide as the anchor. */\n matchWidth?: boolean;\n /** The tallest it gets before scrolling. */\n maxHeight?: number;\n}\n\nconst margin = 8;\n\n/**\n * Positions a floating element (a popover, a listbox) against its anchor with fixed coordinates, flips it above\n * or below when there's no room, keeps it on screen, and follows the anchor when the page scrolls or resizes.\n * It also puts the element in the browser's top layer (popover=\"manual\"), so dialogs and overflow can't clip it.\n * Pass the element's `mounted` from usePresence as `open`, so it stays placed while it animates out.\n */\nexport function useFloating({\n open,\n anchorRef,\n floatingRef,\n placement = \"bottom-start\",\n offset = 4,\n matchWidth = false,\n maxHeight = 360,\n}: Options): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({\n position: \"fixed\",\n inset: \"auto\",\n left: 0,\n right: \"auto\",\n top: 0,\n bottom: \"auto\",\n visibility: \"hidden\",\n });\n\n const place = useCallback(() => {\n const anchor = anchorRef.current;\n const floating = floatingRef.current;\n if (!anchor || !floating) return;\n const rect = anchor.getBoundingClientRect();\n const width = Math.max(floating.offsetWidth, matchWidth ? rect.width : 0);\n const height = floating.scrollHeight;\n const below = window.innerHeight - rect.bottom - offset - margin;\n const above = rect.top - offset - margin;\n const wantsTop = placement.startsWith(\"top\");\n const fitsBelow = height <= below;\n const fitsAbove = height <= above;\n const top = wantsTop ? fitsAbove || above > below : !fitsBelow && above > below;\n\n const align = placement.endsWith(\"start\") ? \"start\" : placement.endsWith(\"end\") ? \"end\" : \"center\";\n let left = align === \"start\" ? rect.left : align === \"end\" ? rect.right - width : rect.left + rect.width / 2 - width / 2;\n left = Math.min(Math.max(margin, left), window.innerWidth - width - margin);\n\n // Which way it opened, for the enter and exit animations (base.css: .ow-floating).\n floating.dataset.side = top ? \"top\" : \"bottom\";\n // Every edge is set, every time: a value React clears falls back to the browser's\n // [popover] { inset: 0 }, which pins the layer to the top of the window.\n setStyle({\n position: \"fixed\",\n inset: \"auto\",\n margin: 0,\n left,\n right: \"auto\",\n top: top ? \"auto\" : rect.bottom + offset,\n bottom: top ? window.innerHeight - rect.top + offset : \"auto\",\n minWidth: matchWidth ? rect.width : undefined,\n maxHeight: Math.max(120, Math.min(maxHeight, top ? above : below)),\n [\"--ow-floating-origin\" as string]: `${top ? \"bottom\" : \"top\"} ${align === \"start\" ? \"left\" : align === \"end\" ? \"right\" : \"center\"}`,\n });\n }, [anchorRef, floatingRef, placement, offset, matchWidth, maxHeight]);\n\n // Top layer: above modal dialogs and outside any overflow: hidden.\n useLayoutEffect(() => {\n const floating = floatingRef.current;\n if (!open || !floating) return;\n try {\n if (!floating.matches(\":popover-open\")) floating.showPopover();\n } catch {\n // Without popover support it still shows as a fixed element.\n }\n place();\n return () => {\n try {\n if (floating.matches(\":popover-open\")) floating.hidePopover();\n } catch {\n // Already hidden.\n }\n };\n }, [open, floatingRef, place]);\n\n useEffect(() => {\n if (!open) return;\n const onScroll = (event: Event) => {\n if (floatingRef.current?.contains(event.target as Node)) return;\n place();\n };\n const observer = typeof ResizeObserver === \"undefined\" ? undefined : new ResizeObserver(() => place());\n if (floatingRef.current) observer?.observe(floatingRef.current);\n window.addEventListener(\"scroll\", onScroll, true);\n window.addEventListener(\"resize\", place);\n return () => {\n observer?.disconnect();\n window.removeEventListener(\"scroll\", onScroll, true);\n window.removeEventListener(\"resize\", place);\n };\n }, [open, place, floatingRef]);\n\n return style;\n}\n\n/** Calls `onDismiss` on a press outside every given element, or on Escape. */\nexport function useDismiss(open: boolean, refs: Array<RefObject<HTMLElement | null>>, onDismiss: (reason: \"outside\" | \"escape\") => void) {\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (refs.every((ref) => !ref.current?.contains(target))) onDismiss(\"outside\");\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n // Close this layer, not the dialog around it.\n event.preventDefault();\n event.stopPropagation();\n onDismiss(\"escape\");\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refs are stable objects.\n }, [open, onDismiss]);\n}\n\n/** The attribute that makes an element a manual popover, typed loosely for React 18. */\nexport const manualPopover = { popover: \"manual\" } as Record<string, string>;\n", "import { useEffect, useState } from \"react\";\n\n/** How long a closing layer stays mounted for its exit animation (base.css: ow-floating-out). */\nexport const exitDuration = 140;\n\nexport interface Presence {\n /** Render the element while this is true: it stays true through the exit animation. */\n mounted: boolean;\n /** Put this on the element as data-state, so CSS can run the enter or the exit animation. */\n state: \"open\" | \"closed\";\n}\n\n/**\n * Keeps an element mounted for a moment after `open` turns false, so it can animate out instead of vanishing.\n * With reduced motion it unmounts at once.\n */\nexport function usePresence(open: boolean, exitMs = exitDuration): Presence {\n const [mounted, setMounted] = useState(open);\n if (open && !mounted) setMounted(true);\n\n useEffect(() => {\n if (open || !mounted) return undefined;\n const reduceMotion = typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const timer = window.setTimeout(() => setMounted(false), reduceMotion ? 0 : exitMs);\n return () => window.clearTimeout(timer);\n }, [open, mounted, exitMs]);\n\n return { mounted: open || mounted, state: open ? \"open\" : \"closed\" };\n}\n", "import {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ForwardedRef,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { CheckIcon, ChevronDownIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface ComboboxOption {\n value: string;\n /** The text shown and matched. */\n label: string;\n /** A muted line under the label; also matched. */\n description?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n /** The chosen option's value, or \"\" for none. */\n value?: string;\n /** @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** Called as the person types, to load options from a server. */\n onInputChange?(text: string): void;\n /** @default \"Search\u2026\" */\n placeholder?: string;\n /** Shown when nothing matches.\n * @default \"No matches\" */\n emptyMessage?: ReactNode;\n /** Keep what was typed even if it isn't an option; onChange gets the text.\n * @default false */\n allowCustomValue?: boolean;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n id?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n className?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/**\n * A text field that suggests options as you type: pick a country, a repository, a person.\n * Down opens the list, Up and Down move, Enter picks, Escape closes then clears.\n */\nexport const Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n value,\n defaultValue = \"\",\n onChange,\n onInputChange,\n placeholder = \"Search\u2026\",\n emptyMessage = \"No matches\",\n allowCustomValue = false,\n size = \"md\",\n isInvalid = false,\n disabled = false,\n id,\n className,\n ...aria\n },\n ref,\n) {\n const [selected, setSelected] = useControllableState(value, defaultValue, onChange);\n const labelOf = (v: string) => options.find((option) => option.value === v)?.label ?? (allowCustomValue ? v : \"\");\n const [text, setText] = useState(() => labelOf(selected));\n const [isOpen, setOpen] = useState(false);\n const [typed, setTyped] = useState(false);\n const [active, setActive] = useState(-1);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const fieldRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n const optionId = (index: number) => `${listId}-${index}`;\n\n const results = useMemo(() => {\n const query = text.trim().toLowerCase();\n if (!typed || !query) return options;\n return options.filter(\n (option) =>\n option.label.toLowerCase().includes(query) ||\n (typeof option.description === \"string\" && option.description.toLowerCase().includes(query)),\n );\n }, [options, text, typed]);\n\n // Show the chosen option's label when the value changes from outside.\n useEffect(() => {\n if (!isOpen) setText(labelOf(selected));\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only when the value or options change.\n }, [selected, options]);\n\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef: fieldRef, floatingRef: listRef, matchWidth: true, maxHeight: 288 });\n\n function open() {\n if (disabled || isOpen) return;\n setOpen(true);\n const index = results.findIndex((option) => option.value === selected);\n setActive(index >= 0 ? index : results.findIndex((option) => !option.disabled));\n }\n\n function close(restore = true) {\n setOpen(false);\n setTyped(false);\n if (!restore) return;\n if (allowCustomValue) {\n if (text !== labelOf(selected)) {\n const match = options.find((option) => option.label.toLowerCase() === text.trim().toLowerCase());\n setSelected(match ? match.value : text);\n }\n } else if (text.trim() === \"\") setSelected(\"\");\n else setText(labelOf(selected));\n }\n\n useDismiss(isOpen, [fieldRef, listRef], () => close());\n\n function choose(option: ComboboxOption | undefined) {\n if (!option || option.disabled) return;\n setSelected(option.value);\n setText(option.label);\n setOpen(false);\n setTyped(false);\n }\n\n function move(step: 1 | -1) {\n if (!results.length) return;\n let next = active;\n for (let tries = 0; tries < results.length; tries += 1) {\n next = (next + step + results.length) % results.length;\n if (!results[next]!.disabled) break;\n }\n setActive(next);\n }\n\n useEffect(() => {\n if (isOpen && active >= 0) document.getElementById(optionId(active))?.scrollIntoView({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- optionId is stable.\n }, [active, isOpen]);\n\n function onKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) open();\n else move(1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n if (!isOpen) open();\n else move(-1);\n break;\n case \"Enter\":\n if (isOpen && active >= 0) {\n event.preventDefault();\n choose(results[active]);\n } else if (isOpen) close();\n break;\n case \"Escape\":\n if (isOpen) return; // useDismiss closes it.\n if (text) {\n event.preventDefault();\n setText(\"\");\n setSelected(\"\");\n }\n break;\n case \"Tab\":\n if (isOpen) close();\n break;\n }\n }\n\n return (\n <>\n <div\n ref={fieldRef}\n className={cx(\n \"ow-input-group\",\n \"ow-combobox\",\n size === \"sm\" && \"ow-input-group--sm\",\n isInvalid && \"ow-input-group--invalid\",\n disabled && \"ow-input-group--disabled\",\n className,\n )}\n >\n <input\n ref={(element) => {\n inputRef.current = element;\n assignRef(ref, element);\n }}\n id={id}\n className=\"ow-input-group__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listId : undefined}\n aria-activedescendant={isOpen && active >= 0 ? optionId(active) : undefined}\n aria-invalid={isInvalid || undefined}\n autoComplete=\"off\"\n disabled={disabled}\n placeholder={placeholder}\n value={text}\n onChange={(event) => {\n setText(event.target.value);\n setTyped(true);\n onInputChange?.(event.target.value);\n if (!isOpen) setOpen(true);\n setActive(0);\n }}\n onClick={open}\n onKeyDown={onKeyDown}\n {...aria}\n />\n <button\n type=\"button\"\n className=\"ow-combobox__toggle\"\n tabIndex={-1}\n aria-label={isOpen ? \"Hide options\" : \"Show options\"}\n disabled={disabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (isOpen) close();\n else {\n open();\n inputRef.current?.focus();\n }\n }}\n >\n <ChevronDownIcon size={size === \"sm\" ? 14 : 16} className={cx(\"ow-select__chevron\", isOpen && \"ow-combobox__chevron--open\")} />\n </button>\n </div>\n {mounted ? (\n <div\n ref={listRef}\n {...manualPopover}\n data-state={state}\n id={listId}\n role=\"listbox\"\n aria-label={aria[\"aria-label\"]}\n aria-labelledby={aria[\"aria-labelledby\"]}\n className={cx(\"ow-listbox\", \"ow-floating\", `ow-listbox--${size}`)}\n style={style}\n >\n {results.map((option, index) => {\n const isSelected = option.value === selected;\n return (\n <div\n key={option.value}\n id={optionId(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled || undefined}\n className={cx(\"ow-option\", {\n \"ow-option--active\": index === active && !option.disabled,\n \"ow-option--selected\": isSelected,\n \"ow-option--disabled\": Boolean(option.disabled),\n })}\n onPointerMove={() => !option.disabled && setActive(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => choose(option)}\n >\n <span className=\"ow-option__check\">{isSelected ? <CheckIcon size={14} /> : null}</span>\n <span className=\"ow-option__text\">\n <span className=\"ow-option__label\">{option.label}</span>\n {option.description ? (\n <span className=\"ow-option__description\">{option.description}</span>\n ) : null}\n </span>\n </div>\n );\n })}\n {results.length === 0 ? (\n <div className=\"ow-listbox__empty\" role=\"presentation\">\n {emptyMessage}\n </div>\n ) : null}\n </div>\n ) : null}\n </>\n );\n});\n", "import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useRef,\n type ForwardedRef,\n type InputHTMLAttributes,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { CheckIcon, MinusIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\ninterface CheckboxGroupContextValue {\n value: string[];\n toggle(value: string, checked: boolean): void;\n name: string;\n disabled: boolean;\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null);\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\n /** `sm` is 14px, for dense rows; `md` is 16px.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** `danger` for choices that make an action destructive, like also deleting files.\n * @default \"primary\" */\n tone?: \"primary\" | \"danger\";\n /** Shows a dash: some, not all, of what it controls is checked (a \"select all\" box).\n * @default false */\n indeterminate?: boolean;\n /** The label. With it, Checkbox renders its own <label>; without it, wrap it in yours. */\n children?: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/**\n * A real checkbox input, restyled. It keeps native behaviour (Space to toggle, form submission, `disabled`).\n * Give it children for its label, or wrap the bare box in your own <label>. Inside a CheckboxGroup, give it a `value`.\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n className,\n size = \"md\",\n tone = \"primary\",\n indeterminate = false,\n children,\n description,\n value,\n checked,\n onChange,\n disabled,\n name,\n \"aria-describedby\": describedBy,\n ...inputProps\n },\n ref,\n) {\n const group = useContext(CheckboxGroupContext);\n const innerRef = useRef<HTMLInputElement | null>(null);\n const descriptionId = useId();\n const inGroup = group !== null && value !== undefined;\n\n useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const box = (\n <span\n className={cx(\n \"ow-checkbox\",\n `ow-checkbox--${size}`,\n tone === \"danger\" && \"ow-checkbox--danger\",\n children === undefined && className,\n )}\n >\n <input\n ref={(element) => {\n innerRef.current = element;\n assignRef(ref, element);\n }}\n type=\"checkbox\"\n className=\"ow-checkbox__input\"\n value={value}\n name={inGroup ? group.name : name}\n checked={inGroup ? group.value.includes(String(value)) : checked}\n disabled={disabled || (inGroup && group.disabled)}\n aria-describedby={[describedBy, description ? descriptionId : undefined].filter(Boolean).join(\" \") || undefined}\n onChange={(event) => {\n onChange?.(event);\n if (inGroup) group.toggle(String(value), event.target.checked);\n }}\n {...inputProps}\n />\n {indeterminate ? (\n <MinusIcon className=\"ow-checkbox__check ow-checkbox__check--dash\" size={size === \"sm\" ? 10 : 12} strokeWidth={3} />\n ) : (\n <CheckIcon className=\"ow-checkbox__check\" size={size === \"sm\" ? 10 : 12} strokeWidth={3} />\n )}\n </span>\n );\n\n if (children === undefined) return box;\n return (\n <label className={cx(\"ow-check-label\", (disabled || (inGroup && group.disabled)) && \"ow-check-label--disabled\", className)}>\n {box}\n <span className=\"ow-check-label__text\">\n <span>{children}</span>\n {description ? (\n <span id={descriptionId} className=\"ow-check-label__description\">\n {description}\n </span>\n ) : null}\n </span>\n </label>\n );\n});\n\nexport interface CheckboxGroupProps {\n /** The question, shown as the group's legend. */\n label: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n /** The checked values. */\n value?: string[];\n /** @default [] */\n defaultValue?: string[];\n onChange?(value: string[]): void;\n /** @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** An error under the options. */\n error?: ReactNode;\n disabled?: boolean;\n /** The form field name for every box. */\n name?: string;\n /** Checkboxes, each with a `value` and a label. */\n children: ReactNode;\n className?: string;\n}\n\n/** Several options where any number can be chosen, under one label. */\nexport function CheckboxGroup({\n label,\n description,\n value,\n defaultValue = [],\n onChange,\n orientation = \"vertical\",\n error,\n disabled = false,\n name,\n children,\n className,\n}: CheckboxGroupProps) {\n const [current, setCurrent] = useControllableState(value, defaultValue, onChange);\n const generatedName = useId();\n const errorId = useId();\n return (\n <CheckboxGroupContext.Provider\n value={{\n value: current,\n name: name ?? generatedName,\n disabled,\n toggle(item, checked) {\n setCurrent(checked ? [...current.filter((v) => v !== item), item] : current.filter((v) => v !== item));\n },\n }}\n >\n <Fieldset\n legend={label}\n description={description}\n error={error}\n errorId={errorId}\n className={cx(orientation === \"horizontal\" && \"ow-fieldset--horizontal\", className)}\n >\n {children}\n </Fieldset>\n </CheckboxGroupContext.Provider>\n );\n}\n\nexport interface FieldsetProps {\n /** The group's title. */\n legend: ReactNode;\n /** A muted line under the legend. */\n description?: ReactNode;\n /** An error under the content, announced when it appears. */\n error?: ReactNode;\n /** @internal */\n errorId?: string;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\n/** Groups related controls under a legend: a set of checkboxes, an address, a pair of dates. */\nexport function Fieldset({ legend, description, error, errorId, disabled, children, className }: FieldsetProps) {\n const generatedId = useId();\n const descriptionId = `${generatedId}-description`;\n const resolvedErrorId = errorId ?? `${generatedId}-error`;\n return (\n <fieldset\n className={cx(\"ow-fieldset\", className)}\n disabled={disabled}\n aria-describedby={[description ? descriptionId : \"\", error ? resolvedErrorId : \"\"].filter(Boolean).join(\" \") || undefined}\n >\n <legend className=\"ow-fieldset__legend\">{legend}</legend>\n {description ? (\n <p id={descriptionId} className=\"ow-fieldset__description\">\n {description}\n </p>\n ) : null}\n <div className=\"ow-fieldset__content\">{children}</div>\n {error ? (\n <p id={resolvedErrorId} role=\"alert\" className=\"ow-field__error\">\n {error}\n </p>\n ) : null}\n </fieldset>\n );\n}\n", "import { createContext, useContext, useId, type InputHTMLAttributes, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { cx } from \"../../utils/cx\";\nimport { Fieldset } from \"../Checkbox/Checkbox\";\n\ninterface RadioGroupContextValue {\n name: string;\n value: string;\n select(value: string): void;\n disabled: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nexport interface RadioGroupProps {\n /** The question, shown as the group's legend. */\n label: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n value?: string;\n /** The starting choice when uncontrolled.\n * @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** `default` is a dot and a label; `cards` turns each option into a bordered card, for choices that need a description.\n * @default \"default\" */\n variant?: \"default\" | \"cards\";\n /** An error under the options. */\n error?: ReactNode;\n disabled?: boolean;\n /** The form field name. Generated when left out. */\n name?: string;\n /** Radio options. */\n children: ReactNode;\n className?: string;\n}\n\n/** One choice from a few visible options. The arrow keys move between them, as with any radio group. */\nexport function RadioGroup({\n label,\n description,\n value,\n defaultValue = \"\",\n onChange,\n orientation = \"vertical\",\n variant = \"default\",\n error,\n disabled = false,\n name,\n children,\n className,\n}: RadioGroupProps) {\n const [current, select] = useControllableState(value, defaultValue, onChange);\n const generatedName = useId();\n return (\n <RadioGroupContext.Provider value={{ name: name ?? generatedName, value: current, select, disabled }}>\n <Fieldset\n legend={label}\n description={description}\n error={error}\n className={cx(\n \"ow-radio-group\",\n orientation === \"horizontal\" && \"ow-fieldset--horizontal\",\n variant === \"cards\" && \"ow-radio-group--cards\",\n className,\n )}\n >\n {children}\n </Fieldset>\n </RadioGroupContext.Provider>\n );\n}\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"value\" | \"size\"> {\n value: string;\n /** The label. */\n children: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n}\n\n/** One option in a RadioGroup. */\nexport function Radio({ value, children, description, disabled, className, ...inputProps }: RadioProps) {\n const group = useContext(RadioGroupContext);\n const descriptionId = useId();\n if (!group) throw new Error(\"Radio must be inside <RadioGroup>.\");\n const isDisabled = disabled || group.disabled;\n return (\n <label className={cx(\"ow-check-label\", \"ow-radio-label\", isDisabled && \"ow-check-label--disabled\", className)}>\n <span className=\"ow-radio\">\n <input\n type=\"radio\"\n className=\"ow-radio__input\"\n name={group.name}\n value={value}\n checked={group.value === value}\n disabled={isDisabled}\n aria-describedby={description ? descriptionId : undefined}\n onChange={() => group.select(value)}\n {...inputProps}\n />\n </span>\n <span className=\"ow-check-label__text\">\n <span>{children}</span>\n {description ? (\n <span id={descriptionId} className=\"ow-check-label__description\">\n {description}\n </span>\n ) : null}\n </span>\n </label>\n );\n}\n", "import { forwardRef, type ButtonHTMLAttributes } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\" | \"value\" | \"type\" | \"role\"> {\n checked: boolean;\n onChange(checked: boolean): void;\n /** What it turns on, for screen readers. Leave it out only when aria-labelledby names it. */\n label?: string;\n}\n\n/** A small on/off switch for settings rows; it takes effect at once, with no save button. */\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { checked, onChange, label, className, disabled, ...buttonProps },\n ref,\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n className={cx(\"ow-switch\", checked && \"ow-switch--on\", className)}\n onClick={() => onChange(!checked)}\n {...buttonProps}\n >\n <span className=\"ow-switch__knob\" />\n </button>\n );\n});\n", "import { useId, type CSSProperties, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { cx } from \"../../utils/cx\";\n\ntype SliderValue = number | [number, number];\n\nexport interface SliderProps<V extends SliderValue = number> {\n /** A number, or a [low, high] pair for a range with two handles. */\n value?: V;\n defaultValue?: V;\n onChange?(value: NoInfer<V>): void;\n /** Called when the person lets go, for work too slow to do on every move. */\n onChangeEnd?(value: NoInfer<V>): void;\n /** @default 0 */\n min?: number;\n /** @default 100 */\n max?: number;\n /** @default 1 */\n step?: number;\n /** Shown above the track, and names the slider for screen readers. */\n label?: ReactNode;\n /** Shows the current value at the right of the label.\n * @default true */\n showValue?: boolean;\n /** Turns a number into the text shown and read out, e.g. (v) => `${v}%`. */\n formatValue?(value: number): string;\n /** Names the slider when there's no visible label. */\n \"aria-label\"?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Picks a number, or a range, by dragging. It's built on native range inputs, so the arrow keys,\n * PageUp, PageDown, Home and End work as people expect.\n */\nexport function Slider<V extends SliderValue = number>({\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n min = 0,\n max = 100,\n step = 1,\n label,\n showValue = true,\n formatValue = String,\n \"aria-label\": ariaLabel,\n disabled,\n className,\n}: SliderProps<V>) {\n const [current, setCurrent] = useControllableState<V>(value, (defaultValue ?? min) as V, onChange);\n const labelId = useId();\n const isRange = Array.isArray(current);\n const [low, high] = isRange ? (current as [number, number]) : [min, current as number];\n const pct = (n: number) => ((n - min) / (max - min || 1)) * 100;\n const style = { \"--ow-slider-from\": `${isRange ? pct(low) : 0}%`, \"--ow-slider-to\": `${pct(high)}%` } as CSSProperties;\n const display = isRange ? `${formatValue(low)} \u2013 ${formatValue(high)}` : formatValue(high);\n const end = () => onChangeEnd?.(current);\n\n const input = (which: \"low\" | \"high\") => {\n const own = which === \"low\" ? low : high;\n return (\n <input\n type=\"range\"\n className={cx(\"ow-slider__input\", isRange && `ow-slider__input--${which}`)}\n // When the handles meet near the top, the low one must be on top to be draggable back down.\n style={which === \"low\" && low === high && pct(low) > 50 ? { zIndex: 3 } : undefined}\n min={min}\n max={max}\n step={step}\n value={own}\n disabled={disabled}\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : isRange ? `${ariaLabel ?? \"Range\"}, ${which === \"low\" ? \"minimum\" : \"maximum\"}` : ariaLabel}\n aria-valuetext={formatValue(own)}\n onChange={(event) => {\n const n = Number(event.target.value);\n if (!isRange) setCurrent(n as V);\n else if (which === \"low\") setCurrent([Math.min(n, high), high] as V);\n else setCurrent([low, Math.max(n, low)] as V);\n }}\n onPointerUp={end}\n onKeyUp={end}\n />\n );\n };\n\n return (\n <div className={cx(\"ow-slider\", disabled && \"ow-slider--disabled\", className)}>\n {label || showValue ? (\n <div className=\"ow-slider__header\">\n {label ? (\n <span id={labelId} className=\"ow-slider__label\">\n {label}\n </span>\n ) : (\n <span />\n )}\n {showValue ? (\n <output className=\"ow-slider__value\" aria-hidden=\"true\">\n {display}\n </output>\n ) : null}\n </div>\n ) : null}\n <div className=\"ow-slider__control\" style={style}>\n <span className=\"ow-slider__track\" aria-hidden=\"true\">\n <span className=\"ow-slider__fill\" />\n </span>\n {isRange ? input(\"low\") : null}\n {input(\"high\")}\n </div>\n </div>\n );\n}\n", "import { useId, useRef, useState, type DragEvent, type ReactNode } from \"react\";\n\nimport { UploadIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface FileDropZoneProps {\n /** Called with the accepted files, whether dropped or picked. */\n onFiles(files: File[]): void;\n /** File types to accept, as for <input accept>: \".png,.jpg\", \"image/*\". */\n accept?: string;\n /** @default false */\n multiple?: boolean;\n /** The largest file accepted, in bytes. */\n maxSize?: number;\n /** @default \"Drop files here, or browse\" */\n label?: ReactNode;\n /** A muted line under the label: what's accepted, how big. */\n hint?: ReactNode;\n /** An error to show in place of the hint, such as a failed upload. */\n error?: ReactNode;\n /** A 20px icon on the tile.\n * @default <UploadIcon /> */\n icon?: ReactNode;\n disabled?: boolean;\n /** The form field name for the file input. */\n name?: string;\n className?: string;\n}\n\nfunction matches(file: File, accept: string | undefined) {\n if (!accept) return true;\n return accept.split(\",\").some((rule) => {\n const pattern = rule.trim().toLowerCase();\n if (!pattern) return false;\n if (pattern.startsWith(\".\")) return file.name.toLowerCase().endsWith(pattern);\n if (pattern.endsWith(\"/*\")) return file.type.toLowerCase().startsWith(pattern.slice(0, -1));\n return file.type.toLowerCase() === pattern;\n });\n}\n\nconst formatSize = (bytes: number) =>\n bytes >= 1_048_576 ? `${Math.round(bytes / 104_857.6) / 10} MB` : `${Math.round(bytes / 1024)} KB`;\n\n/**\n * A drop zone for files: drop them on it, or press it to pick them.\n * It checks the type and size and says what was wrong.\n */\nexport function FileDropZone({\n onFiles,\n accept,\n multiple = false,\n maxSize,\n label = \"Drop files here, or browse\",\n hint,\n error,\n icon,\n disabled = false,\n name,\n className,\n}: FileDropZoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const depth = useRef(0);\n const [isDragging, setIsDragging] = useState(false);\n const [problem, setProblem] = useState<string>();\n const hintId = useId();\n\n function take(list: FileList | null) {\n if (!list || disabled) return;\n const files = [...list].slice(0, multiple ? undefined : 1);\n const wrongType = files.find((file) => !matches(file, accept));\n const tooBig = maxSize ? files.find((file) => file.size > maxSize) : undefined;\n if (!multiple && list.length > 1) setProblem(\"Drop one file at a time.\");\n else if (wrongType) setProblem(`\u201C${wrongType.name}\u201D isn't a file this accepts.`);\n else if (tooBig && maxSize) setProblem(`\u201C${tooBig.name}\u201D is over ${formatSize(maxSize)}.`);\n else {\n setProblem(undefined);\n if (files.length) onFiles(files);\n }\n }\n\n const hasFiles = (event: DragEvent) => event.dataTransfer.types.includes(\"Files\");\n\n return (\n <label\n className={cx(\n \"ow-dropzone\",\n isDragging && \"ow-dropzone--dragging\",\n Boolean(error || problem) && \"ow-dropzone--invalid\",\n disabled && \"ow-dropzone--disabled\",\n className,\n )}\n onDragEnter={(event) => {\n if (!hasFiles(event) || disabled) return;\n event.preventDefault();\n depth.current += 1;\n setIsDragging(true);\n }}\n onDragOver={(event) => {\n if (!hasFiles(event) || disabled) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n }}\n onDragLeave={() => {\n depth.current = Math.max(0, depth.current - 1);\n if (depth.current === 0) setIsDragging(false);\n }}\n onDrop={(event) => {\n if (!hasFiles(event)) return;\n event.preventDefault();\n depth.current = 0;\n setIsDragging(false);\n take(event.dataTransfer.files);\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"ow-visually-hidden\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n name={name}\n aria-describedby={hintId}\n onChange={(event) => {\n take(event.target.files);\n event.target.value = \"\";\n }}\n />\n <span className=\"ow-dropzone__icon\">{icon ?? <UploadIcon size={20} />}</span>\n <span className=\"ow-dropzone__label\">{isDragging ? \"Drop to add\" : label}</span>\n <span id={hintId} className=\"ow-dropzone__hint\" aria-live=\"polite\">\n {error ?? problem ?? hint}\n </span>\n </label>\n );\n}\n", "import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { addDays, addMonths, formatDate, parseISO, todayISO, toISO, weekday, type ISODate } from \"./dates\";\n\nexport interface CalendarProps {\n /** The chosen date as \"YYYY-MM-DD\", or \"\" for none. */\n value?: ISODate;\n /** @default \"\" */\n defaultValue?: ISODate;\n onChange?(value: ISODate): void;\n /** The earliest date that can be chosen, \"YYYY-MM-DD\". */\n min?: ISODate;\n /** The latest date that can be chosen. */\n max?: ISODate;\n /** Return true for dates that can't be chosen, such as weekends. */\n isDateDisabled?(date: ISODate): boolean;\n /** Month and day names follow this locale, e.g. \"en-IE\", \"de-CH\". Defaults to the browser's. */\n locale?: string;\n /** 1 starts weeks on Monday, 0 on Sunday.\n * @default 1 */\n weekStartsOn?: 0 | 1;\n /** Focus the chosen (or today's) date on mount, for use in a popover.\n * @default false */\n autoFocus?: boolean;\n className?: string;\n}\n\nexport interface CalendarHandle {\n focus(): void;\n}\n\n/**\n * A month grid for picking a date. Arrow keys move by day and week, PageUp and PageDown by month\n * (with Shift, by year), Home and End to the week's ends. Today is marked with a brass dot.\n */\nexport const Calendar = forwardRef<CalendarHandle, CalendarProps>(function Calendar(\n { value, defaultValue = \"\", onChange, min, max, isDateDisabled, locale, weekStartsOn = 1, autoFocus = false, className },\n ref,\n) {\n const [selected, setSelected] = useControllableState(value, defaultValue, onChange);\n const today = todayISO();\n const [focused, setFocused] = useState<ISODate>(() => selected || clampDate(today, min, max));\n const [shouldFocus, setShouldFocus] = useState(autoFocus);\n const gridRef = useRef<HTMLTableElement>(null);\n\n useImperativeHandle(ref, () => ({ focus: () => setShouldFocus(true) }), []);\n\n useEffect(() => {\n if (selected) setFocused(selected);\n }, [selected]);\n\n useEffect(() => {\n if (!shouldFocus) return;\n gridRef.current?.querySelector<HTMLButtonElement>('button[tabindex=\"0\"]')?.focus();\n setShouldFocus(false);\n }, [shouldFocus, focused]);\n\n const { year, month } = parseISO(focused);\n const first = toISO(year, month, 1);\n\n // Which way the month changed, so the new one slides in from that side.\n const monthIndex = year * 12 + month;\n const slide = useRef<{ month: number; direction?: \"next\" | \"previous\" }>({ month: monthIndex });\n if (slide.current.month !== monthIndex) {\n slide.current = { month: monthIndex, direction: monthIndex > slide.current.month ? \"next\" : \"previous\" };\n }\n const offset = (weekday(first) - weekStartsOn + 7) % 7;\n const gridStart = addDays(first, -offset);\n const weeks = useMemo(() => Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_, d) => addDays(gridStart, w * 7 + d))), [gridStart]);\n const weekdayNames = weeks[0]!.map((date) => ({\n short: formatDate(date, locale, { weekday: \"short\" }),\n long: formatDate(date, locale, { weekday: \"long\" }),\n }));\n\n const isDisabled = (date: ISODate) => (min !== undefined && date < min) || (max !== undefined && date > max) || Boolean(isDateDisabled?.(date));\n\n function moveTo(date: ISODate) {\n setFocused(clampDate(date, min, max));\n setShouldFocus(true);\n }\n\n function choose(date: ISODate) {\n if (isDisabled(date)) return;\n setSelected(date);\n setFocused(date);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>, date: ISODate) {\n const day = (weekday(date) - weekStartsOn + 7) % 7;\n const moves: Record<string, () => ISODate> = {\n ArrowLeft: () => addDays(date, -1),\n ArrowRight: () => addDays(date, 1),\n ArrowUp: () => addDays(date, -7),\n ArrowDown: () => addDays(date, 7),\n Home: () => addDays(date, -day),\n End: () => addDays(date, 6 - day),\n PageUp: () => addMonths(date, event.shiftKey ? -12 : -1),\n PageDown: () => addMonths(date, event.shiftKey ? 12 : 1),\n };\n const move = moves[event.key];\n if (move) {\n event.preventDefault();\n moveTo(move());\n }\n }\n\n const monthLabel = formatDate(first, locale, { month: \"long\", year: \"numeric\" });\n const prevMonth = addMonths(first, -1);\n const nextMonth = addMonths(first, 1);\n const canGoBack = !min || toISO(year, month, 0) >= min;\n const canGoForward = !max || nextMonth <= max;\n\n return (\n <div className={cx(\"ow-calendar\", className)}>\n <div className=\"ow-calendar__header\">\n <button\n type=\"button\"\n className=\"ow-calendar__nav\"\n aria-label={`Previous month, ${formatDate(prevMonth, locale, { month: \"long\", year: \"numeric\" })}`}\n disabled={!canGoBack}\n onClick={() => setFocused(clampDate(addMonths(focused, -1), min, max))}\n >\n <ChevronLeftIcon size={16} />\n </button>\n <h2 className=\"ow-calendar__title\" aria-live=\"polite\">\n <span\n key={monthIndex}\n className={cx(\"ow-calendar__title-text\", slide.current.direction && `ow-calendar__slide--${slide.current.direction}`)}\n >\n {monthLabel}\n </span>\n </h2>\n <button\n type=\"button\"\n className=\"ow-calendar__nav\"\n aria-label={`Next month, ${formatDate(nextMonth, locale, { month: \"long\", year: \"numeric\" })}`}\n disabled={!canGoForward}\n onClick={() => setFocused(clampDate(addMonths(focused, 1), min, max))}\n >\n <ChevronRightIcon size={16} />\n </button>\n </div>\n <table ref={gridRef} role=\"grid\" className=\"ow-calendar__grid\" aria-label={monthLabel}>\n <thead>\n <tr>\n {weekdayNames.map((name) => (\n <th key={name.long} scope=\"col\" abbr={name.long} className=\"ow-calendar__weekday\">\n {name.short.slice(0, 2)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody key={monthIndex} className={cx(slide.current.direction && `ow-calendar__slide--${slide.current.direction}`)}>\n {weeks.map((week) => (\n <tr key={week[0]}>\n {week.map((date) => {\n const inMonth = parseISO(date).month === month;\n const isSelected = date === selected;\n const disabled = isDisabled(date);\n return (\n <td key={date} role=\"gridcell\" aria-selected={isSelected} className=\"ow-calendar__cell\">\n <button\n type=\"button\"\n tabIndex={date === focused ? 0 : -1}\n aria-label={formatDate(date, locale, { dateStyle: \"full\" })}\n aria-current={date === today ? \"date\" : undefined}\n aria-disabled={disabled || undefined}\n className={cx(\"ow-calendar__day\", {\n \"ow-calendar__day--outside\": !inMonth,\n \"ow-calendar__day--selected\": isSelected,\n \"ow-calendar__day--today\": date === today,\n \"ow-calendar__day--disabled\": disabled,\n })}\n onClick={() => choose(date)}\n onKeyDown={(event) => onKeyDown(event, date)}\n onFocus={() => date !== focused && setFocused(date)}\n >\n {parseISO(date).day}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n});\n\nfunction clampDate(date: ISODate, min: ISODate | undefined, max: ISODate | undefined): ISODate {\n if (min && date < min) return min;\n if (max && date > max) return max;\n return date;\n}\n", "/** Dates as \"YYYY-MM-DD\" strings: no time, no time zone, so a date never shifts by a day. */\nexport type ISODate = string;\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nexport function toISO(year: number, month: number, day: number): ISODate {\n const date = new Date(Date.UTC(year, month, day));\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nexport function parseISO(iso: ISODate): { year: number; month: number; day: number } {\n const [year, month, day] = iso.split(\"-\").map(Number);\n return { year: year!, month: month! - 1, day: day! };\n}\n\nexport function todayISO(): ISODate {\n const now = new Date();\n return toISO(now.getFullYear(), now.getMonth(), now.getDate());\n}\n\nexport function addDays(iso: ISODate, days: number): ISODate {\n const { year, month, day } = parseISO(iso);\n return toISO(year, month, day + days);\n}\n\nexport function addMonths(iso: ISODate, months: number): ISODate {\n const { year, month, day } = parseISO(iso);\n const lastDay = new Date(Date.UTC(year, month + months + 1, 0)).getUTCDate();\n return toISO(year, month + months, Math.min(day, lastDay));\n}\n\n/** 0 = Sunday \u2026 6 = Saturday. */\nexport function weekday(iso: ISODate): number {\n const { year, month, day } = parseISO(iso);\n return new Date(Date.UTC(year, month, day)).getUTCDay();\n}\n\nexport function toDate(iso: ISODate): Date {\n const { year, month, day } = parseISO(iso);\n return new Date(Date.UTC(year, month, day));\n}\n\nexport function formatDate(iso: ISODate, locale: string | undefined, options: Intl.DateTimeFormatOptions): string {\n return new Intl.DateTimeFormat(locale, { ...options, timeZone: \"UTC\" }).format(toDate(iso));\n}\n", "import { forwardRef, useCallback, useId, useRef, useState, type ForwardedRef } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { CalendarIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Calendar, type CalendarProps } from \"./Calendar\";\nimport { formatDate, type ISODate } from \"./dates\";\n\nexport interface DatePickerProps extends Omit<CalendarProps, \"autoFocus\" | \"className\"> {\n /** Shown when no date is chosen.\n * @default \"Pick a date\" */\n placeholder?: string;\n /** How the chosen date is written in the field.\n * @default { dateStyle: \"medium\" } */\n formatOptions?: Intl.DateTimeFormatOptions;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n id?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n className?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/** A field that opens a Calendar. Choosing a date closes it; Escape closes it without changing anything. */\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(function DatePicker(\n {\n value,\n defaultValue = \"\",\n onChange,\n placeholder = \"Pick a date\",\n formatOptions = { dateStyle: \"medium\" },\n size = \"md\",\n isInvalid = false,\n disabled = false,\n id,\n className,\n locale,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n ...calendarProps\n },\n ref,\n) {\n const [date, setDate] = useControllableState<ISODate>(value, defaultValue, onChange);\n const [isOpen, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef: triggerRef, floatingRef: panelRef, placement: \"bottom-start\", offset: 6 });\n\n const close = useCallback((reason?: \"outside\" | \"escape\") => {\n setOpen(false);\n if (reason !== \"outside\") triggerRef.current?.focus();\n }, []);\n useDismiss(isOpen, [panelRef, triggerRef], close);\n\n const label = date ? formatDate(date, locale, formatOptions) : placeholder;\n\n return (\n <>\n <button\n ref={(element) => {\n triggerRef.current = element;\n assignRef(ref, element);\n }}\n id={id}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? panelId : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n // A label names the button; the chosen date is read as its description.\n aria-describedby={[`${panelId}-value`, ariaDescribedBy].filter(Boolean).join(\" \")}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n className={cx(\n \"ow-select\",\n \"ow-date-picker\",\n `ow-select--${size}`,\n { \"ow-select--open\": isOpen, \"ow-select--invalid\": isInvalid && !isOpen },\n className,\n )}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !isOpen) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n >\n <CalendarIcon size={size === \"sm\" ? 14 : 16} className=\"ow-date-picker__icon\" />\n <span id={`${panelId}-value`} className={cx(\"ow-select__value\", !date && \"ow-select__value--placeholder\")}>\n {label}\n </span>\n </button>\n {mounted ? (\n <div\n ref={panelRef}\n {...manualPopover}\n data-state={state}\n id={panelId}\n role=\"dialog\"\n aria-label=\"Choose a date\"\n className=\"ow-popover ow-floating ow-date-picker__panel\"\n style={style}\n >\n <Calendar\n {...calendarProps}\n locale={locale}\n value={date}\n autoFocus\n onChange={(next) => {\n setDate(next);\n close();\n }}\n />\n </div>\n ) : null}\n </>\n );\n});\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { CircleAlertIcon, CircleCheckIcon, InfoIcon, TriangleAlertIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { CloseButton } from \"../Button/ButtonGroup\";\n\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\";\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** info for news, success for something done, warning for something that needs the person, danger for something that failed.\n * @default \"info\" */\n variant?: AlertVariant;\n /** A short bold line. */\n title?: ReactNode;\n /** Replaces the variant's icon; false hides it. */\n icon?: ReactNode | false;\n /** Buttons under the text, usually small ones. */\n actions?: ReactNode;\n /** Shows a \u2715 that calls this. */\n onClose?(): void;\n children?: ReactNode;\n}\n\nconst icons: Record<AlertVariant, ReactNode> = {\n info: <InfoIcon size={16} />,\n success: <CircleCheckIcon size={16} />,\n warning: <TriangleAlertIcon size={16} />,\n danger: <CircleAlertIcon size={16} />,\n neutral: <InfoIcon size={16} />,\n};\n\n/** A message inside the page about the page: a notice, a warning before an action, an error that blocks the work. */\nexport function Alert({\n variant = \"info\",\n title,\n icon,\n actions,\n onClose,\n children,\n className,\n role,\n ...props\n}: AlertProps) {\n return (\n <div\n role={role ?? (variant === \"danger\" || variant === \"warning\" ? \"alert\" : \"status\")}\n className={cx(\"ow-alert\", `ow-alert--${variant}`, className)}\n {...props}\n >\n {icon === false ? null : <span className=\"ow-alert__icon\">{icon ?? icons[variant]}</span>}\n <div className=\"ow-alert__body\">\n {title ? <div className=\"ow-alert__title\">{title}</div> : null}\n {children ? <div className=\"ow-alert__description\">{children}</div> : null}\n {actions ? <div className=\"ow-alert__actions\">{actions}</div> : null}\n </div>\n {onClose ? <CloseButton size=\"sm\" label=\"Dismiss\" className=\"ow-alert__close\" onClick={onClose} /> : null}\n </div>\n );\n}\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\n/** `active` is for work in progress, so it isn't confused with `warning` (something needs you). */\nexport type BadgeVariant = \"neutral\" | \"active\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n /** A 12px icon before the text. */\n icon?: ReactNode;\n /** @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** @default \"neutral\" */\n variant?: BadgeVariant;\n}\n\n/** A pill-shaped status label: one or two words, with an optional icon. */\nexport function Badge({ children, className, icon, size = \"md\", variant = \"neutral\", ...spanProps }: BadgeProps) {\n return (\n <span className={cx(\"ow-badge\", `ow-badge--${size}`, `ow-badge--${variant}`, className)} {...spanProps}>\n {icon ? <span className=\"ow-badge__icon\">{icon}</span> : null}\n <span>{children}</span>\n </span>\n );\n}\n", "import { useId, type CSSProperties, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport type ProgressTone = \"primary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface ProgressBarProps {\n /** How far along, from 0 to max. Leave out for work of unknown length. */\n value?: number;\n /** @default 100 */\n max?: number;\n /** Shown above the bar, and names it for screen readers. */\n label?: ReactNode;\n /** Shows the value at the right of the label.\n * @default true */\n showValue?: boolean;\n /** The text shown and read out for the value, e.g. \"3 of 8 stages\". Defaults to a percentage. */\n valueLabel?: string;\n /** sm is 4px, for a pipeline bar; md is 8px.\n * @default \"sm\" */\n size?: \"sm\" | \"md\";\n /** @default \"primary\" */\n tone?: ProgressTone;\n \"aria-label\"?: string;\n className?: string;\n}\n\n/** How far a task has got: a thin bar, or a sliding segment when the length isn't known. */\nexport function ProgressBar({\n value,\n max = 100,\n label,\n showValue = true,\n valueLabel,\n size = \"sm\",\n tone = \"primary\",\n \"aria-label\": ariaLabel,\n className,\n}: ProgressBarProps) {\n const labelId = useId();\n const indeterminate = value === undefined;\n const pct = indeterminate ? 0 : Math.min(100, Math.max(0, (value / max) * 100));\n const text = valueLabel ?? `${Math.round(pct)}%`;\n return (\n <div className={cx(\"ow-progress\", `ow-progress--${size}`, `ow-progress--${tone}`, className)}>\n {label || (showValue && !indeterminate) ? (\n <div className=\"ow-progress__header\">\n {label ? (\n <span id={labelId} className=\"ow-progress__label\">\n {label}\n </span>\n ) : (\n <span />\n )}\n {showValue && !indeterminate ? <span className=\"ow-progress__value\">{text}</span> : null}\n </div>\n ) : null}\n <div\n role=\"progressbar\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : ariaLabel}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n aria-valuetext={indeterminate ? undefined : text}\n className={cx(\"ow-progress__track\", indeterminate && \"ow-progress__track--indeterminate\")}\n >\n <div className=\"ow-progress__fill\" style={indeterminate ? undefined : { width: `${pct}%` }} />\n </div>\n </div>\n );\n}\n\nexport interface ProgressCircleProps {\n /** From 0 to max. Leave out to spin, for work of unknown length. */\n value?: number;\n /** @default 100 */\n max?: number;\n /** sm 16px, md 24px, lg 48px (lg shows the percentage inside).\n * @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** @default \"primary\" */\n tone?: ProgressTone;\n /** Names it for screen readers.\n * @default \"Progress\" */\n \"aria-label\"?: string;\n className?: string;\n}\n\nconst circleSizes = { sm: { box: 16, stroke: 2.5 }, md: { box: 24, stroke: 3 }, lg: { box: 48, stroke: 4 } };\n\n/** Progress as a ring, for tight spaces: a row in a list, a file being uploaded. */\nexport function ProgressCircle({\n value,\n max = 100,\n size = \"md\",\n tone = \"primary\",\n \"aria-label\": ariaLabel = \"Progress\",\n className,\n}: ProgressCircleProps) {\n const { box, stroke } = circleSizes[size];\n const radius = (box - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const indeterminate = value === undefined;\n const pct = indeterminate ? 25 : Math.min(100, Math.max(0, (value / max) * 100));\n return (\n <span\n role=\"progressbar\"\n aria-label={ariaLabel}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n className={cx(\n \"ow-progress-circle\",\n `ow-progress--${tone}`,\n indeterminate && \"ow-progress-circle--indeterminate\",\n className,\n )}\n style={{ width: box, height: box } as CSSProperties}\n >\n <svg width={box} height={box} viewBox={`0 0 ${box} ${box}`} aria-hidden=\"true\">\n <circle className=\"ow-progress-circle__track\" cx={box / 2} cy={box / 2} r={radius} strokeWidth={stroke} fill=\"none\" />\n <circle\n className=\"ow-progress-circle__fill\"\n cx={box / 2}\n cy={box / 2}\n r={radius}\n strokeWidth={stroke}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - pct / 100)}\n transform={`rotate(-90 ${box / 2} ${box / 2})`}\n />\n </svg>\n {size === \"lg\" && !indeterminate ? <span className=\"ow-progress-circle__value\">{Math.round(pct)}%</span> : null}\n </span>\n );\n}\n", "import { useEffect, useState, type CSSProperties } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface SkeletonProps {\n /** CSS width, e.g. \"40%\" or 120. Default 100%. */\n width?: CSSProperties[\"width\"];\n /** CSS height. Default 14px. */\n height?: CSSProperties[\"height\"];\n /** The lighter grey, for second lines and control shapes. */\n soft?: boolean;\n /** `bar` has round ends; `block` has the field corners, for control placeholders. */\n shape?: \"bar\" | \"block\";\n className?: string;\n}\n\n/** One grey placeholder bar. Wrap a group of them in something with role=\"status\" and a label. */\nexport function Skeleton({ width = \"100%\", height = 14, soft = false, shape = \"bar\", className }: SkeletonProps) {\n return (\n <span\n className={cx(\"ow-skeleton\", soft && \"ow-skeleton--soft\", shape === \"block\" && \"ow-skeleton--block\", className)}\n style={{ width, height }}\n aria-hidden=\"true\"\n />\n );\n}\n\nexport interface SkeletonRowsProps {\n /** Read out by screen readers while it's showing. Default \"Loading\". */\n label?: string;\n rows?: number;\n /** Waits this long before appearing, so content that loads quickly never flashes it. Default 150. */\n delayMs?: number;\n}\n\n/**\n * A placeholder in the shape of settings rows (a label and description on the left, a control on the right),\n * so a panel keeps its layout while it loads.\n */\nexport function SkeletonRows({ label = \"Loading\", rows = 4, delayMs = 150 }: SkeletonRowsProps) {\n const [isVisible, setIsVisible] = useState(delayMs === 0);\n\n useEffect(() => {\n if (delayMs === 0) return;\n const timer = window.setTimeout(() => setIsVisible(true), delayMs);\n return () => window.clearTimeout(timer);\n }, [delayMs]);\n\n return (\n <div role=\"status\" aria-label={label} aria-busy=\"true\">\n {isVisible ? (\n <div className=\"ow-skeleton-rows\" aria-hidden=\"true\">\n {Array.from({ length: rows }, (_, index) => (\n <div key={index} className=\"ow-skeleton-rows__row\">\n <div className=\"ow-skeleton-rows__text\">\n <Skeleton width={`${28 + ((index * 17) % 22)}%`} height={14} />\n <Skeleton width={`${46 + ((index * 23) % 30)}%`} height={12} soft />\n </div>\n <Skeleton width={96} height={32} soft shape=\"block\" />\n </div>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n", "import { useEffect, useRef } from \"react\";\nimport { Toaster as SonnerToaster, toast, type ExternalToast, type ToasterProps as SonnerToasterProps } from \"sonner\";\n\nimport { manualPopover } from \"../../hooks/useFloating\";\nimport { CircleAlertIcon, CircleCheckIcon, InfoIcon, TriangleAlertIcon, XIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Spinner } from \"../Spinner/Spinner\";\n\n/**\n * Shows a toast; needs one <Toaster /> on the page. This is sonner's `toast`:\n * `toast(\"Copied\")`, `toast.success(\"Saved\", { description })`, `toast.error(\u2026)`, `toast.warning(\u2026)`, `toast.info(\u2026)`,\n * `toast.loading(\"Deploying\u2026\")`, `toast.promise(save(), { loading, success, error })`, `toast.dismiss(id)`.\n * Pass `action: { label: \"Undo\", onClick }` for a button, and reuse an `id` to replace a toast.\n */\nexport { toast };\n\n/** Everything a toast takes besides its message: description, action, cancel, id, duration, icon, onDismiss\u2026 */\nexport type ToastOptions = ExternalToast;\n\nexport interface ToasterProps {\n /** @default \"bottom-center\" */\n position?: SonnerToasterProps[\"position\"];\n /** Shows every toast in full, instead of a stack that fans out on hover.\n * @default false */\n expand?: boolean;\n /** How many show at once; the rest wait their turn.\n * @default 3 */\n visibleToasts?: number;\n /** Milliseconds before a toast goes. A toast's own `duration` wins; Infinity keeps it until closed.\n * @default 6000 */\n duration?: number;\n /** A \u2715 on each toast.\n * @default true */\n closeButton?: boolean;\n /** Distance from the edge of the window, in pixels.\n * @default 16 */\n offset?: number;\n /** Gap between toasts when the stack is open, in pixels.\n * @default 10 */\n gap?: number;\n /** For a second toaster that only shows toasts sent with the same `toasterId`. */\n id?: string;\n className?: string;\n}\n\nconst icons = {\n success: <CircleCheckIcon size={16} />,\n error: <CircleAlertIcon size={16} />,\n warning: <TriangleAlertIcon size={16} />,\n info: <InfoIcon size={16} />,\n loading: <Spinner size=\"sm\" label=\"\" />,\n close: <XIcon size={12} />,\n};\n\n/**\n * Where toasts appear: sonner's toaster in Openware's look. New toasts stack on top of each other; hovering\n * fans the stack out, a swipe dismisses one, and they pause while hovered or focused. Render one near the\n * root of the app. It keeps itself above modal dialogs, so a toast fired from a dialog shows over it.\n */\nexport function Toaster({\n position = \"bottom-center\",\n expand = false,\n visibleToasts = 3,\n duration = 6000,\n closeButton = true,\n offset = 16,\n gap = 10,\n id,\n className,\n}: ToasterProps) {\n const layerRef = useRef<HTMLDivElement>(null);\n\n // The toaster lives in the browser's top layer, and moves back to the top of it whenever a dialog opens,\n // so modal dialogs and their backdrop never cover it.\n useEffect(() => {\n const layer = layerRef.current;\n if (!layer || typeof layer.showPopover !== \"function\") return undefined;\n const raise = () => {\n try {\n if (layer.matches(\":popover-open\")) layer.hidePopover();\n layer.showPopover();\n } catch {\n // Not connected yet, or no popover support: it still shows as a fixed layer.\n }\n };\n raise();\n const observer = new MutationObserver((records) => {\n if (records.some((record) => record.target instanceof HTMLDialogElement && record.target.open)) raise();\n });\n observer.observe(document.body, { subtree: true, attributes: true, attributeFilter: [\"open\"] });\n return () => observer.disconnect();\n }, []);\n\n return (\n <div ref={layerRef} {...manualPopover} className=\"ow-toaster-layer\">\n <SonnerToaster\n id={id}\n position={position}\n expand={expand}\n visibleToasts={visibleToasts}\n duration={duration}\n closeButton={closeButton}\n offset={offset}\n mobileOffset={offset}\n gap={gap}\n icons={icons}\n className={cx(\"ow-toaster\", className)}\n containerAriaLabel=\"Notifications\"\n toastOptions={{ className: \"ow-toast\" }}\n />\n </div>\n );\n}\n", "import { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { manualPopover, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\n\nexport interface TooltipProps {\n /** A few words. */\n label: ReactNode;\n /** The thing it explains: usually an icon-only Button with the same words as its aria-label. */\n children: ReactNode;\n /** Which side it prefers; it flips when there's no room.\n * @default \"top\" */\n placement?: \"top\" | \"bottom\";\n /** Milliseconds of hovering before it shows. Moving to a neighbour while one is showing skips the wait.\n * @default 400 */\n delay?: number;\n}\n\n/** When the last tooltip closed: another one opened soon after shows at once, as people scan a toolbar. */\nlet lastClosedAt = 0;\nconst warmWindow = 500;\n\n/**\n * A small dark label above its child on hover or keyboard focus. It's for sighted users only: the child\n * carries the same words for screen readers (an aria-label, or visually hidden text), so they aren't read twice.\n * It sits in the top layer, so scroll areas and dialogs can't clip it.\n */\nexport function Tooltip({ children, label, placement = \"top\", delay = 400 }: TooltipProps) {\n const anchorRef = useRef<HTMLSpanElement>(null);\n const bubbleRef = useRef<HTMLSpanElement>(null);\n const timer = useRef(0);\n const [open, setOpen] = useState(false);\n const { mounted, state } = usePresence(open, 100);\n const style = useFloating({ open: mounted, anchorRef, floatingRef: bubbleRef, placement, offset: 6 });\n\n const show = (immediately = false) => {\n window.clearTimeout(timer.current);\n if (immediately || Date.now() - lastClosedAt < warmWindow) setOpen(true);\n else timer.current = window.setTimeout(() => setOpen(true), delay);\n };\n const hide = () => {\n window.clearTimeout(timer.current);\n setOpen((current) => {\n if (current) lastClosedAt = Date.now();\n return false;\n });\n };\n\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n // Escape hides it without moving focus, as WCAG 1.4.13 asks.\n useEffect(() => {\n if (!open) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") hide();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [open]);\n\n return (\n <span\n ref={anchorRef}\n className=\"ow-tooltip\"\n onPointerEnter={(event) => {\n if (event.pointerType === \"mouse\") show();\n }}\n onPointerLeave={hide}\n onPointerDown={hide}\n onFocus={(event) => {\n if (event.target.matches(\":focus-visible\")) show(true);\n }}\n onBlur={hide}\n >\n {children}\n {mounted ? (\n <span ref={bubbleRef} {...manualPopover} data-state={state} className=\"ow-tooltip__bubble ow-floating\" style={style} aria-hidden=\"true\">\n {label}\n </span>\n ) : null}\n </span>\n );\n}\n", "import { useId, useState, type FormEvent, type ReactNode } from \"react\";\n\nimport { useModalDialog } from \"../../hooks/useModalDialog\";\nimport { TrashIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Button } from \"../Button/Button\";\n\nexport interface DialogProps {\n open: boolean;\n /** Called when the person dismisses it (Escape, the backdrop) unless `dismissible` is false. Set `open` to false here. */\n onClose(): void;\n title: ReactNode;\n /** A muted line or two under the title. */\n description?: ReactNode;\n children?: ReactNode;\n /** Buttons at the bottom right, cancel first, the main action last. */\n actions?: ReactNode;\n /** Pixels. Default 420. */\n width?: number;\n /** False while saving, so Escape and the backdrop can't close it mid-way. Default true. */\n dismissible?: boolean;\n /** Makes the dialog a form; its submit button submits it. */\n onSubmit?(event: FormEvent<HTMLFormElement>): void;\n className?: string;\n}\n\n/**\n * A modal dialog on the native <dialog> element: it traps focus, sits above everything, closes with Escape\n * or a click on the backdrop, and fades and rises in.\n */\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n actions,\n width = 420,\n dismissible = true,\n onSubmit,\n className,\n}: DialogProps) {\n const titleId = useId();\n const descriptionId = useId();\n const { dialogRef, mounted } = useModalDialog(open, () => {\n if (dismissible) onClose();\n });\n\n if (!mounted) return null;\n\n const body = (\n <>\n <div className=\"ow-dialog__header\">\n <h2 id={titleId} className=\"ow-dialog__title\">\n {title}\n </h2>\n {description ? (\n <div id={descriptionId} className=\"ow-dialog__description\">\n {description}\n </div>\n ) : null}\n </div>\n {children}\n {actions ? <div className=\"ow-dialog__actions\">{actions}</div> : null}\n </>\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(\"ow-dialog\", className)}\n style={{ width: `min(${width}px, calc(100% - 32px))` }}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n {onSubmit ? (\n <form\n className=\"ow-dialog__body\"\n onSubmit={(event) => {\n event.preventDefault();\n onSubmit(event);\n }}\n >\n {body}\n </form>\n ) : (\n <div className=\"ow-dialog__body\">{body}</div>\n )}\n </dialog>\n );\n}\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onClose(): void;\n title: ReactNode;\n description: ReactNode;\n /** The verb on the confirm button: \"Delete project\", not \"OK\". */\n confirmLabel: string;\n /** Styles the confirm button and icon as a destructive action. */\n destructive?: boolean;\n /** Keeps the confirm button disabled, e.g. until a typed confirmation matches. */\n confirmDisabled?: boolean;\n /** Runs the action. The dialog closes when it resolves and shows the error's message when it throws. */\n onConfirm(): Promise<void> | void;\n /** Extra content between the description and the buttons, such as an option checkbox. */\n children?: ReactNode;\n}\n\n/** Asks before an action: a title, what will happen, Cancel and the action. Cancel has focus first. */\nexport function ConfirmDialog({\n open,\n onClose,\n title,\n description,\n confirmLabel,\n destructive = false,\n confirmDisabled = false,\n onConfirm,\n children,\n}: ConfirmDialogProps) {\n const [isWorking, setIsWorking] = useState(false);\n const [error, setError] = useState(\"\");\n\n async function confirm() {\n setIsWorking(true);\n setError(\"\");\n try {\n await onConfirm();\n onClose();\n } catch (confirmError) {\n setError(\n confirmError instanceof Error && confirmError.message\n ? confirmError.message\n : \"That didn't work. Try again.\",\n );\n } finally {\n setIsWorking(false);\n }\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n dismissible={!isWorking}\n width={380}\n className=\"ow-dialog--confirm\"\n title={\n <>\n {destructive ? (\n <span className=\"ow-dialog__danger-icon\" aria-hidden=\"true\">\n <TrashIcon size={18} />\n </span>\n ) : null}\n {title}\n </>\n }\n description={description}\n onSubmit={() => {\n if (!confirmDisabled && !isWorking) void confirm();\n }}\n actions={\n <>\n <Button type=\"button\" disabled={isWorking} autoFocus onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant={destructive ? \"danger\" : \"primary\"}\n disabled={isWorking || confirmDisabled}\n >\n {isWorking ? \"Working\u2026\" : confirmLabel}\n </Button>\n </>\n }\n >\n {children}\n {error ? (\n <span role=\"alert\" className=\"ow-dialog__error\">\n {error}\n </span>\n ) : null}\n </Dialog>\n );\n}\n", "import { useEffect, useRef, useState } from \"react\";\n\n/** Matches the dialog exit transition in dialog.css. */\nconst closeAnimationMs = 160;\n\n/**\n * Shows a <dialog> as a modal while `open` is true, and keeps it mounted long enough for its exit animation\n * once `open` turns false. Escape and a click on the backdrop fire the dialog's `cancel` event; the hook turns\n * that into `onCancel`, so a dialog that must stay open while it works can ignore it.\n */\nexport function useModalDialog(open: boolean, onCancel: () => void) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const onCancelRef = useRef(onCancel);\n const [mounted, setMounted] = useState(open);\n\n onCancelRef.current = onCancel;\n\n useEffect(() => {\n if (open) setMounted(true);\n }, [open]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open) {\n if (!dialog.open) dialog.showModal();\n return;\n }\n\n if (dialog.open) dialog.close();\n const reduceMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n const timer = window.setTimeout(() => setMounted(false), reduceMotion ? 0 : closeAnimationMs);\n return () => window.clearTimeout(timer);\n }, [open, mounted]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog || !mounted) return;\n\n const onCancelEvent = (event: Event) => {\n event.preventDefault();\n onCancelRef.current();\n };\n\n // A click on the backdrop (outside the dialog's box) counts as Escape. Both the press and the release\n // must be outside, so selecting text and dragging out doesn't close it.\n const isOutside = (event: MouseEvent) => {\n const rect = dialog.getBoundingClientRect();\n return (\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n );\n };\n let pressedOutside = false;\n const onPointerDown = (event: PointerEvent) => {\n pressedOutside = event.target === dialog && isOutside(event);\n };\n const onClick = (event: MouseEvent) => {\n if (\n pressedOutside &&\n event.target === dialog &&\n isOutside(event) &&\n // Clicks from the keyboard (Enter on a button) report 0,0.\n event.detail > 0\n )\n dialog.dispatchEvent(new Event(\"cancel\", { cancelable: true }));\n pressedOutside = false;\n };\n\n dialog.addEventListener(\"cancel\", onCancelEvent);\n dialog.addEventListener(\"pointerdown\", onPointerDown);\n dialog.addEventListener(\"click\", onClick);\n return () => {\n dialog.removeEventListener(\"cancel\", onCancelEvent);\n dialog.removeEventListener(\"pointerdown\", onPointerDown);\n dialog.removeEventListener(\"click\", onClick);\n };\n }, [mounted]);\n\n return { dialogRef, mounted };\n}\n", "import { useId, type ReactNode } from \"react\";\n\nimport { useModalDialog } from \"../../hooks/useModalDialog\";\nimport { cx } from \"../../utils/cx\";\nimport { CloseButton } from \"../Button/ButtonGroup\";\n\nexport interface DrawerProps {\n open: boolean;\n /** Called on Escape, the backdrop or the \u2715, unless `dismissible` is false. Set `open` to false here. */\n onClose(): void;\n title: ReactNode;\n /** A muted line under the title. */\n description?: ReactNode;\n children?: ReactNode;\n /** Buttons pinned to the bottom: Cancel first, the main action last. */\n footer?: ReactNode;\n /** Which edge it slides in from.\n * @default \"right\" */\n side?: \"right\" | \"left\" | \"bottom\";\n /** Width (or height, from the bottom) in pixels.\n * @default 420 */\n size?: number;\n /** @default true */\n dismissible?: boolean;\n className?: string;\n}\n\n/** A panel that slides in from an edge over the page, for details or a form beside what the person was doing. */\nexport function Drawer({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n side = \"right\",\n size = 420,\n dismissible = true,\n className,\n}: DrawerProps) {\n const titleId = useId();\n const descriptionId = useId();\n const { dialogRef, mounted } = useModalDialog(open, () => {\n if (dismissible) onClose();\n });\n\n if (!mounted) return null;\n\n const sizeStyle = side === \"bottom\" ? { height: `min(${size}px, 90dvh)` } : { width: `min(${size}px, 100vw - 24px)` };\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(\"ow-drawer\", `ow-drawer--${side}`, className)}\n style={sizeStyle}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n <header className=\"ow-drawer__header\">\n <div className=\"ow-drawer__titles\">\n <h2 id={titleId} className=\"ow-drawer__title\">\n {title}\n </h2>\n {description ? (\n <p id={descriptionId} className=\"ow-drawer__description\">\n {description}\n </p>\n ) : null}\n </div>\n {dismissible ? <CloseButton onClick={onClose} /> : null}\n </header>\n <div className=\"ow-drawer__body\">{children}</div>\n {footer ? <footer className=\"ow-drawer__footer\">{footer}</footer> : null}\n </dialog>\n );\n}\n", "import {\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating, type Placement } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface PopoverProps {\n /** The button that opens it. Popover adds the click handler and aria attributes. */\n trigger: ReactElement;\n children: ReactNode;\n open?: boolean;\n /** @default false */\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n /** Where it opens relative to the trigger; it flips when there's no room.\n * @default \"bottom-start\" */\n placement?: Placement;\n /** A heading at the top that also names the popover for screen readers. */\n title?: ReactNode;\n /** Names the popover when there's no title. */\n \"aria-label\"?: string;\n /** Pixels, or any CSS width.\n * @default 280 */\n width?: number | string;\n /** Moves focus into the popover when it opens.\n * @default true */\n autoFocus?: boolean;\n className?: string;\n}\n\n/**\n * A small panel attached to a button, for a few controls or details that don't need a dialog.\n * Escape, a click outside or the trigger closes it, and focus goes back to the trigger.\n */\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"bottom-start\",\n title,\n \"aria-label\": ariaLabel,\n width = 280,\n autoFocus = true,\n className,\n}: PopoverProps) {\n const [isOpen, setOpen] = useControllableState(open, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const id = useId();\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef, floatingRef: panelRef, placement, offset: 8, maxHeight: 640 });\n\n const close = useCallback(\n (reason?: \"outside\" | \"escape\") => {\n setOpen(false);\n if (reason !== \"outside\") triggerRef.current?.focus();\n },\n [setOpen],\n );\n useDismiss(isOpen, [panelRef, anchorRef], close);\n\n useEffect(() => {\n triggerRef.current = anchorRef.current?.firstElementChild as HTMLElement | null;\n });\n\n useEffect(() => {\n if (!isOpen || !autoFocus) return;\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current;\n const first = panel?.querySelector<HTMLElement>(\n 'input, select, textarea, button, [href], [tabindex]:not([tabindex=\"-1\"])',\n );\n (first ?? panel)?.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [isOpen, autoFocus]);\n\n const triggerElement = isValidElement<HTMLAttributes<HTMLElement>>(trigger)\n ? cloneElement(trigger, {\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? id : undefined,\n onClick: (event: MouseEvent<HTMLElement>) => {\n trigger.props.onClick?.(event);\n if (!event.defaultPrevented) setOpen(!isOpen);\n },\n })\n : trigger;\n\n return (\n <>\n <span ref={anchorRef} className=\"ow-popover-anchor\">\n {triggerElement}\n </span>\n {mounted ? (\n <div\n ref={panelRef}\n {...manualPopover}\n data-state={state}\n id={id}\n role=\"dialog\"\n aria-label={title ? undefined : ariaLabel}\n aria-labelledby={title ? `${id}-title` : undefined}\n tabIndex={-1}\n className={cx(\"ow-popover\", \"ow-floating\", className)}\n style={{ ...style, width }}\n // Focus leaving for anything but the trigger (Tab past the last control) closes it.\n onBlur={(event) => {\n const next = event.relatedTarget as Node | null;\n if (next && !panelRef.current?.contains(next) && !anchorRef.current?.contains(next)) setOpen(false);\n }}\n >\n {title ? (\n <div id={`${id}-title`} className=\"ow-popover__title\">\n {title}\n </div>\n ) : null}\n {children}\n </div>\n ) : null}\n </>\n );\n}\n", "import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport { manualPopover, useFloating } from \"../../hooks/useFloating\";\nimport { useMenuKeyboard } from \"../../hooks/useMenuKeyboard\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { cx } from \"../../utils/cx\";\n\nconst MenuContext = createContext<{ close(): void } | null>(null);\n\nexport interface MenuProps {\n /** The button that opens it, usually a Button. Menu adds the click handler and the aria attributes. */\n trigger: ReactElement;\n /** MenuItem, MenuLabel and MenuSeparator. */\n children: ReactNode;\n /** Names the menu for screen readers. */\n label: string;\n /** Which edge of the trigger it lines up with.\n * @default \"start\" */\n align?: \"start\" | \"end\";\n /** Prefers opening upward. Either way it flips when there's no room.\n * @default false */\n above?: boolean;\n /** CSS width; default fits the items, at least 200px. */\n width?: number | string;\n /** Starts open, for documentation and tests. */\n defaultOpen?: boolean;\n className?: string;\n}\n\n/**\n * A dropdown menu of actions under a button. Opening it focuses the first item; the arrow keys, Home and End\n * move; Escape closes it and returns focus to the button; a click outside or Tab closes it.\n */\nexport function Menu({ trigger, children, label, align = \"start\", above = false, width, defaultOpen = false, className }: MenuProps) {\n const [open, setOpen] = useState(defaultOpen);\n const rootRef = useRef<HTMLSpanElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const menuId = useId();\n const close = () => setOpen(false);\n const onMenuKeyDown = useMenuKeyboard({ open, menuRef, triggerRef, onClose: close });\n const { mounted, state } = usePresence(open);\n const floatingStyle = useFloating({\n open: mounted,\n anchorRef: rootRef,\n floatingRef: menuRef,\n placement: `${above ? \"top\" : \"bottom\"}-${align}`,\n offset: 8,\n });\n\n useEffect(() => {\n triggerRef.current = rootRef.current?.firstElementChild as HTMLElement | null;\n });\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown, true);\n }, [open]);\n\n const triggerElement = isValidElement<ButtonHTMLAttributes<HTMLElement>>(trigger)\n ? cloneElement(trigger, {\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? menuId : undefined,\n onClick: (event: MouseEvent<HTMLElement>) => {\n trigger.props.onClick?.(event);\n if (!event.defaultPrevented) setOpen((current) => !current);\n },\n })\n : trigger;\n\n return (\n <span ref={rootRef} className=\"ow-menu\">\n {triggerElement}\n {mounted ? (\n <MenuContext.Provider\n value={{\n close() {\n setOpen(false);\n triggerRef.current?.focus();\n },\n }}\n >\n <div\n ref={menuRef}\n {...manualPopover}\n data-state={state}\n id={menuId}\n role=\"menu\"\n aria-label={label}\n className={cx(\"ow-menu__panel\", \"ow-floating\", className)}\n style={width === undefined ? floatingStyle : { ...floatingStyle, width }}\n onKeyDown={onMenuKeyDown}\n >\n {children}\n </div>\n </MenuContext.Provider>\n ) : null}\n </span>\n );\n}\n\nexport interface MenuItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onSelect\"> {\n /** A 15px lucide-react icon before the label. */\n icon?: ReactNode;\n /** Runs the action; the menu then closes. */\n onSelect?(): void;\n /** Red, for actions that delete or can't be undone. */\n destructive?: boolean;\n /** Shown on the right, e.g. \"\u2318,\". Only a shortcut that actually works. */\n shortcut?: string;\n}\n\n/** One action in a Menu. */\nexport const MenuItem = forwardRef<HTMLButtonElement, MenuItemProps>(function MenuItem(\n { icon, onSelect, destructive = false, shortcut, className, children, onClick, ...buttonProps },\n ref,\n) {\n const menu = useContext(MenuContext);\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n className={cx(\"ow-menu__item\", destructive && \"ow-menu__item--destructive\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n menu?.close();\n onSelect?.();\n }}\n {...buttonProps}\n >\n {icon ? <span className=\"ow-menu__icon\">{icon}</span> : null}\n <span className=\"ow-menu__label\">{children}</span>\n {shortcut ? <kbd className=\"ow-menu__shortcut\">{shortcut}</kbd> : null}\n </button>\n );\n});\n\n/** A small uppercase heading for a group of items. */\nexport function MenuLabel({ children }: { children: ReactNode }) {\n return (\n <div className=\"ow-menu__group-label\" role=\"presentation\">\n {children}\n </div>\n );\n}\n\n/** A hairline between groups of items. */\nexport function MenuSeparator() {\n return <div className=\"ow-menu__separator\" role=\"separator\" />;\n}\n", "import { useEffect, type KeyboardEvent, type RefObject } from \"react\";\n\nconst itemSelector =\n '[role=\"menuitem\"]:not([disabled]):not([aria-disabled=\"true\"]), [role=\"menuitemradio\"]:not([disabled]), [role=\"menuitemcheckbox\"]:not([disabled])';\n\nfunction items(menu: HTMLElement | null): HTMLElement[] {\n return menu ? [...menu.querySelectorAll<HTMLElement>(itemSelector)] : [];\n}\n\n/**\n * Keyboard use for a `role=\"menu\"` popup, as people expect from menus: opening it moves focus to its first item,\n * the arrow keys (and Home and End) move between items, wrapping round, and Escape closes it and puts focus\n * back on the button that opened it. Attach the returned handler to the menu's `onKeyDown`.\n */\nexport function useMenuKeyboard({\n open,\n menuRef,\n triggerRef,\n onClose,\n}: {\n open: boolean;\n menuRef: RefObject<HTMLElement | null>;\n triggerRef?: RefObject<HTMLElement | null> | undefined;\n onClose(): void;\n}): (event: KeyboardEvent<HTMLElement>) => void {\n useEffect(() => {\n if (!open) return;\n const frame = window.requestAnimationFrame(() => {\n const menu = menuRef.current;\n // Something inside already has focus (e.g. a field at the top of the menu): leave it there.\n if (menu?.contains(document.activeElement)) return;\n items(menu)[0]?.focus();\n });\n return () => window.cancelAnimationFrame(frame);\n }, [open, menuRef]);\n\n return (event) => {\n const list = items(menuRef.current);\n const index = list.indexOf(document.activeElement as HTMLElement);\n const move = (next: number) => {\n event.preventDefault();\n list[(next + list.length) % list.length]?.focus();\n };\n switch (event.key) {\n case \"ArrowDown\":\n move(index + 1);\n break;\n case \"ArrowUp\":\n move(index < 0 ? list.length - 1 : index - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(list.length - 1);\n break;\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n onClose();\n triggerRef?.current?.focus();\n break;\n case \"Tab\":\n // Leaving the menu closes it; focus moves on as usual.\n onClose();\n break;\n }\n };\n}\n", "import { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport { useModalDialog } from \"../../hooks/useModalDialog\";\nimport { CornerDownLeftIcon, SearchIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { filterCommands } from \"./filterCommands\";\n\nexport interface Command {\n /** Unique in the list, e.g. \"project.new\". */\n id: string;\n title: string;\n /** Commands with the same group are listed together under its name (when nothing is typed). */\n group?: string;\n icon?: ReactNode;\n /** Extra words that should find this command, e.g. \"start go\" for Run. */\n keywords?: string;\n /** Shown on the right, e.g. a folder or \"Running\". */\n hint?: string;\n /** Shortcut shown on the right, e.g. \"\u2318,\". */\n shortcut?: string;\n /** Why it can't run right now; the command still shows, greyed out, with this as its hint. */\n disabled?: string;\n run(): void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onClose(): void;\n commands: Command[];\n /** Default \"Search commands\u2026\". */\n placeholder?: string;\n}\n\n/** \u2318K: search every action and run it from the keyboard. Arrow keys (or Ctrl+N and Ctrl+P) move, Enter runs. */\nexport function CommandPalette({ open, onClose, commands, placeholder = \"Search commands\u2026\" }: CommandPaletteProps) {\n const { dialogRef, mounted } = useModalDialog(open, onClose);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n const listRef = useRef<HTMLUListElement>(null);\n const listId = useId();\n const results = useMemo(() => filterCommands(commands, query), [commands, query]);\n const active = results[Math.min(activeIndex, results.length - 1)];\n\n useEffect(() => setActiveIndex(0), [query]);\n useEffect(() => {\n if (open) setQuery(\"\");\n }, [open]);\n useEffect(() => {\n listRef.current?.querySelector(\"[aria-selected=true]\")?.scrollIntoView({ block: \"nearest\" });\n }, [activeIndex, results]);\n\n if (!mounted) return null;\n\n function run(command: Command | undefined) {\n if (!command || command.disabled) return;\n onClose();\n // After the palette has closed, so dialogs the command opens get focus.\n window.setTimeout(() => command.run(), 0);\n }\n\n function move(step: number) {\n if (!results.length) return;\n setActiveIndex((index) => (Math.min(index, results.length - 1) + step + results.length) % results.length);\n }\n\n return (\n <dialog ref={dialogRef} className=\"ow-dialog ow-palette\" aria-label=\"Command palette\">\n <div className=\"ow-palette__search\">\n <SearchIcon size={16} className=\"ow-palette__search-icon\" />\n <input\n autoFocus\n className=\"ow-palette__input\"\n placeholder={placeholder}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-activedescendant={active ? `${listId}-${active.id}` : undefined}\n aria-autocomplete=\"list\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" || (event.ctrlKey && event.key === \"n\")) {\n event.preventDefault();\n move(1);\n } else if (event.key === \"ArrowUp\" || (event.ctrlKey && event.key === \"p\")) {\n event.preventDefault();\n move(-1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n run(active);\n }\n }}\n />\n <kbd className=\"ow-palette__esc\">esc</kbd>\n </div>\n <ul ref={listRef} id={listId} role=\"listbox\" aria-label=\"Commands\" className=\"ow-palette__list\">\n {results.length ? (\n results.map((command, index) => {\n const showGroup =\n !query.trim() && command.group && command.group !== results[index - 1]?.group;\n const isActive = command === active;\n return (\n <li key={command.id} role=\"presentation\">\n {showGroup ? <div className=\"ow-palette__group\">{command.group}</div> : null}\n <div\n id={`${listId}-${command.id}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={Boolean(command.disabled)}\n title={command.disabled}\n className={cx(\"ow-palette__option\", {\n \"ow-palette__option--active\": isActive,\n \"ow-palette__option--disabled\": Boolean(command.disabled),\n })}\n onMouseMove={() => setActiveIndex(index)}\n onClick={() => run(command)}\n >\n <span className=\"ow-palette__icon\" aria-hidden=\"true\">\n {command.icon}\n </span>\n <span className=\"ow-palette__title\">{command.title}</span>\n {command.disabled && isActive ? (\n <span className=\"ow-palette__hint\">{command.disabled}</span>\n ) : command.hint ? (\n <span className=\"ow-palette__hint\">{command.hint}</span>\n ) : null}\n {command.shortcut ? (\n <kbd className=\"ow-palette__shortcut\">{command.shortcut}</kbd>\n ) : null}\n {isActive && !command.disabled ? (\n <CornerDownLeftIcon size={13} className=\"ow-palette__enter\" />\n ) : null}\n </div>\n </li>\n );\n })\n ) : (\n <li className=\"ow-palette__empty\">No commands match “{query}”.</li>\n )}\n </ul>\n </dialog>\n );\n}\n", "import type { Command } from \"./CommandPalette\";\n\n/** How well a query matches some text: prefix and word-start matches beat letters in order; 0 = no match. */\nfunction score(query: string, text: string, loose = true): number {\n const haystack = text.toLowerCase();\n if (haystack.startsWith(query)) return 100 - Math.min(haystack.length, 50) / 10;\n const wordStart = haystack.indexOf(` ${query}`);\n if (wordStart >= 0) return 80 - wordStart / 10;\n const anywhere = haystack.indexOf(query);\n if (anywhere >= 0) return 60 - anywhere / 10;\n if (!loose) return 0;\n // Letters in order (\"rnp\" \u2192 \"Run pipeline\"), only against titles: in long keyword text almost anything matches.\n let position = 0;\n let gaps = 0;\n for (const letter of query) {\n const found = haystack.indexOf(letter, position);\n if (found < 0) return 0;\n gaps += found - position;\n position = found + 1;\n }\n return Math.max(1, 40 - gaps);\n}\n\n/** Commands matching every word of the query, best first; with no query, the list as given. */\nexport function filterCommands(commands: Command[], query: string): Command[] {\n const words = query.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (!words.length) return commands;\n return commands\n .map((command, index) => {\n const extra = `${command.group ?? \"\"} ${command.keywords ?? \"\"} ${command.hint ?? \"\"}`;\n let total = 0;\n for (const word of words) {\n const best = Math.max(score(word, command.title) * 1.5, score(word, extra, false));\n if (!best) return undefined;\n total += best;\n }\n // Runnable commands first, then the original order among equals.\n return { command, rank: total - (command.disabled ? 50 : 0) - index / 1000 };\n })\n .filter((entry): entry is { command: Command; rank: number } => Boolean(entry))\n .sort((a, b) => b.rank - a.rank)\n .map((entry) => entry.command);\n}\n", "import {\n createContext,\n useContext,\n useId,\n useLayoutEffect,\n useRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { useIndicator } from \"../../hooks/useIndicator\";\nimport { cx } from \"../../utils/cx\";\n\ninterface TabsContextValue {\n value: string;\n select(value: string): void;\n baseId: string;\n variant: \"segmented\" | \"line\";\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabs(component: string) {\n const context = useContext(TabsContext);\n if (!context) throw new Error(`${component} must be inside <Tabs>.`);\n return context;\n}\n\nconst idPart = (value: string) => value.replace(/[^\\w-]/g, \"_\");\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\"> {\n /** The selected tab's value. Leave out to let Tabs keep its own state. */\n value?: string;\n /** The tab selected first when uncontrolled. */\n defaultValue?: string;\n onValueChange?(value: string): void;\n /** `segmented` raises the chosen tab in a well; `line` underlines it.\n * @default \"segmented\" */\n variant?: \"segmented\" | \"line\";\n children: ReactNode;\n}\n\n/** Views of the same thing, one at a time: TabList with Tabs, then a TabPanel for each. */\nexport function Tabs({ value, defaultValue = \"\", onValueChange, variant = \"segmented\", className, children, ...props }: TabsProps) {\n const [current, select] = useControllableState(value, defaultValue, onValueChange);\n const baseId = useId();\n return (\n <TabsContext.Provider value={{ value: current, select, baseId, variant }}>\n <div className={cx(\"ow-tabs\", `ow-tabs--${variant}`, className)} {...props}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n /** Names the set of tabs for screen readers. */\n \"aria-label\"?: string;\n}\n\n/** The row of tabs. The arrow keys, Home and End move between them and select. */\nexport function TabList({ className, onKeyDown, children, ...props }: TabListProps) {\n const { value, select } = useTabs(\"TabList\");\n const listRef = useRef<HTMLDivElement>(null);\n useIndicator(listRef, '[role=\"tab\"][aria-selected=\"true\"]', value);\n\n // No tab matches the value (no defaultValue given): select the first one.\n useLayoutEffect(() => {\n const list = listRef.current;\n if (!list || list.querySelector('[role=\"tab\"][aria-selected=\"true\"]')) return;\n const first = list.querySelector<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)');\n if (first?.dataset.value) select(first.dataset.value);\n }, [value, select]);\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const tabs = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)')];\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n const moves: Record<string, number> = { ArrowRight: index + 1, ArrowLeft: index - 1, Home: 0, End: tabs.length - 1 };\n if (!(event.key in moves)) return;\n event.preventDefault();\n const next = tabs[(moves[event.key]! + tabs.length) % tabs.length]!;\n next.focus();\n if (next.dataset.value) select(next.dataset.value);\n }\n\n return (\n <div ref={listRef} role=\"tablist\" className={cx(\"ow-tabs__list\", className)} onKeyDown={handleKeyDown} {...props}>\n {children}\n <span className=\"ow-indicator\" aria-hidden=\"true\" />\n </div>\n );\n}\n\nexport interface TabProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"value\"> {\n value: string;\n /** A 16px icon before the label. */\n icon?: ReactNode;\n}\n\n/** One tab. Its `value` matches a TabPanel's. */\nexport function Tab({ value, icon, className, children, onClick, ...props }: TabProps) {\n const { value: current, select, baseId } = useTabs(\"Tab\");\n const selected = current === value;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${idPart(value)}`}\n aria-selected={selected}\n aria-controls={`${baseId}-panel-${idPart(value)}`}\n tabIndex={selected ? 0 : -1}\n data-value={value}\n className={cx(\"ow-tab\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) select(value);\n }}\n {...props}\n >\n {icon ? <span className=\"ow-tab__icon\">{icon}</span> : null}\n {children}\n </button>\n );\n}\n\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n value: string;\n /** Keep the panel in the page while hidden, so its state survives switching tabs.\n * @default false */\n keepMounted?: boolean;\n}\n\n/** The content for one tab. */\nexport function TabPanel({ value, keepMounted = false, className, children, ...props }: TabPanelProps) {\n const { value: current, baseId } = useTabs(\"TabPanel\");\n const selected = current === value;\n if (!selected && !keepMounted) return null;\n return (\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel-${idPart(value)}`}\n aria-labelledby={`${baseId}-tab-${idPart(value)}`}\n tabIndex={0}\n hidden={!selected}\n className={cx(\"ow-tabs__panel\", className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n", "import {\n createContext,\n useContext,\n useEffect,\n useId,\n useRef,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\ninterface DisclosureViewProps {\n open: boolean;\n onToggle(): void;\n title: ReactNode;\n subtitle?: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n headingLevel: 2 | 3 | 4 | 5 | 6;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n item?: boolean;\n}\n\nfunction DisclosureView({\n open,\n onToggle,\n title,\n subtitle,\n icon,\n actions,\n headingLevel,\n disabled,\n children,\n className,\n item,\n}: DisclosureViewProps) {\n const id = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const Heading = `h${headingLevel}` as \"h3\";\n\n // Closed content can't be tabbed into or read out.\n useEffect(() => {\n if (panelRef.current) panelRef.current.inert = !open;\n }, [open]);\n\n return (\n <div className={cx(item ? \"ow-accordion__item\" : \"ow-disclosure\", className)} data-open={open}>\n <div className=\"ow-disclosure__header\">\n <Heading className=\"ow-disclosure__heading\">\n <button\n type=\"button\"\n id={`${id}-trigger`}\n className=\"ow-disclosure__trigger\"\n aria-expanded={open}\n aria-controls={`${id}-panel`}\n disabled={disabled}\n data-accordion-trigger={item ? \"\" : undefined}\n onClick={onToggle}\n >\n <ChevronRightIcon size={14} className=\"ow-disclosure__chevron\" />\n {icon ? <span className=\"ow-disclosure__icon\">{icon}</span> : null}\n <span className=\"ow-disclosure__titles\">\n <span className=\"ow-disclosure__title\">{title}</span>\n {subtitle ? <span className=\"ow-disclosure__subtitle\">{subtitle}</span> : null}\n </span>\n </button>\n </Heading>\n {actions ? <div className=\"ow-disclosure__actions\">{actions}</div> : null}\n </div>\n <div\n ref={panelRef}\n id={`${id}-panel`}\n role=\"region\"\n aria-labelledby={`${id}-trigger`}\n className=\"ow-disclosure__panel\"\n >\n <div className=\"ow-disclosure__clip\">\n <div className=\"ow-disclosure__content\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n\nexport interface DisclosureProps {\n title: ReactNode;\n /** A muted line under the title. */\n subtitle?: ReactNode;\n /** A 15px icon between the chevron and the title. */\n icon?: ReactNode;\n /** Controls on the right of the header, outside the toggle (a ghost Button). */\n actions?: ReactNode;\n open?: boolean;\n /** @default false */\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n /** `card` is a bordered surface; `plain` is just the toggle and its content, for \"Show details\".\n * @default \"card\" */\n variant?: \"card\" | \"plain\";\n /** The heading level of the title, to fit the page's outline.\n * @default 3 */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\n/** A section that opens and closes under its title, like \"3 files changed\" in a code review. */\nexport function Disclosure({\n open,\n defaultOpen = false,\n onOpenChange,\n variant = \"card\",\n headingLevel = 3,\n className,\n ...props\n}: DisclosureProps) {\n const [isOpen, setOpen] = useControllableState(open, defaultOpen, onOpenChange);\n return (\n <DisclosureView\n {...props}\n open={isOpen}\n onToggle={() => setOpen(!isOpen)}\n headingLevel={headingLevel}\n className={cx(variant === \"plain\" && \"ow-disclosure--plain\", className)}\n />\n );\n}\n\ninterface AccordionContextValue {\n isOpen(value: string): boolean;\n toggle(value: string): void;\n headingLevel: 2 | 3 | 4 | 5 | 6;\n}\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null);\n\nexport interface AccordionProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> {\n /** `single` keeps one item open at a time; `multiple` lets any number be open.\n * @default \"single\" */\n type?: \"single\" | \"multiple\";\n /** The open items' values. */\n value?: string[];\n /** @default [] */\n defaultValue?: string[];\n onValueChange?(value: string[]): void;\n /** `bordered` puts the items in one card with hairlines between; `separated` gives each its own card.\n * @default \"bordered\" */\n variant?: \"bordered\" | \"separated\";\n /** @default 3 */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n children: ReactNode;\n}\n\n/** A stack of Disclosures, such as an FAQ. Up and Down move between the headers. */\nexport function Accordion({\n type = \"single\",\n value,\n defaultValue = [],\n onValueChange,\n variant = \"bordered\",\n headingLevel = 3,\n className,\n children,\n onKeyDown,\n ...props\n}: AccordionProps) {\n const [openValues, setOpenValues] = useControllableState(value, defaultValue, onValueChange);\n\n function toggle(item: string) {\n const isOpen = openValues.includes(item);\n if (type === \"single\") setOpenValues(isOpen ? [] : [item]);\n else setOpenValues(isOpen ? openValues.filter((open) => open !== item) : [...openValues, item]);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const triggers = [\n ...event.currentTarget.querySelectorAll<HTMLButtonElement>(\"[data-accordion-trigger]:not(:disabled)\"),\n ];\n const index = triggers.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n const moves: Record<string, number> = { ArrowDown: index + 1, ArrowUp: index - 1, Home: 0, End: triggers.length - 1 };\n if (!(event.key in moves)) return;\n event.preventDefault();\n triggers[(moves[event.key]! + triggers.length) % triggers.length]?.focus();\n }\n\n return (\n <AccordionContext.Provider value={{ isOpen: (item) => openValues.includes(item), toggle, headingLevel }}>\n <div className={cx(\"ow-accordion\", `ow-accordion--${variant}`, className)} onKeyDown={handleKeyDown} {...props}>\n {children}\n </div>\n </AccordionContext.Provider>\n );\n}\n\nexport interface AccordionItemProps {\n value: string;\n title: ReactNode;\n subtitle?: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\n/** One section of an Accordion. */\nexport function AccordionItem({ value, ...props }: AccordionItemProps) {\n const context = useContext(AccordionContext);\n if (!context) throw new Error(\"AccordionItem must be inside <Accordion>.\");\n return (\n <DisclosureView\n {...props}\n item\n open={context.isOpen(value)}\n onToggle={() => context.toggle(value)}\n headingLevel={context.headingLevel}\n />\n );\n}\n", "import { forwardRef, type AnchorHTMLAttributes, type MouseEvent, type ReactNode } from \"react\";\n\nimport { ArrowUpRightIcon, ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n /** Where it goes. The last item is the current page and isn't a link. */\n href?: string;\n onClick?(event: MouseEvent<HTMLElement>): void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n /** @default \"chevron\" */\n separator?: \"chevron\" | \"slash\";\n /** Names the trail for screen readers.\n * @default \"Breadcrumb\" */\n label?: string;\n className?: string;\n}\n\n/** Where the current page sits: a trail of links from the top level down. */\nexport function Breadcrumbs({ items, separator = \"chevron\", label = \"Breadcrumb\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label={label} className={cx(\"ow-breadcrumbs\", className)}>\n <ol className=\"ow-breadcrumbs__list\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className=\"ow-breadcrumbs__item\">\n {isLast ? (\n <span className=\"ow-breadcrumbs__current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : item.href ? (\n <a className=\"ow-breadcrumbs__link\" href={item.href} onClick={item.onClick}>\n {item.label}\n </a>\n ) : (\n <button type=\"button\" className=\"ow-breadcrumbs__link\" onClick={item.onClick}>\n {item.label}\n </button>\n )}\n {isLast ? null : (\n <span className=\"ow-breadcrumbs__separator\" aria-hidden=\"true\">\n {separator === \"slash\" ? \"/\" : <ChevronRightIcon size={14} />}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n\nexport interface LinkStyleOptions {\n /** `default` underlines in a hairline and turns brass on hover; `muted` is quieter, for footnotes; `standalone` has no underline until hovered, for lists of links.\n * @default \"default\" */\n variant?: \"default\" | \"muted\" | \"standalone\";\n}\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement>, LinkStyleOptions {\n /** Opens in a new tab with an \u2197 arrow, for links that leave your site.\n * @default false */\n external?: boolean;\n children?: ReactNode;\n}\n\n/** The class names of a link, for a router's own <Link>: `<RouterLink className={linkClassName()}>`. */\nexport function linkClassName({ variant = \"default\" }: LinkStyleOptions = {}): string {\n return cx(\"ow-link\", `ow-link--${variant}`);\n}\n\n/** A text link. Its hover turns brass, the one place brass is text on a light ground. */\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n { variant = \"default\", external = false, className, children, target, rel, ...props },\n ref,\n) {\n return (\n <a\n ref={ref}\n className={cx(linkClassName({ variant }), className)}\n target={external ? (target ?? \"_blank\") : target}\n rel={external ? (rel ?? \"noopener noreferrer\") : rel}\n {...props}\n >\n {children}\n {external ? (\n <>\n <ArrowUpRightIcon size={13} className=\"ow-link__external\" />\n <span className=\"ow-visually-hidden\"> (opens in a new tab)</span>\n </>\n ) : null}\n </a>\n );\n});\n", "import { ChevronLeftIcon, ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface PaginationProps {\n /** The current page, starting at 1. */\n page: number;\n pageCount: number;\n onPageChange(page: number): void;\n /** Pages shown either side of the current one.\n * @default 1 */\n siblingCount?: number;\n /** Pages always shown at each end.\n * @default 1 */\n boundaryCount?: number;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** Names the control for screen readers.\n * @default \"Pagination\" */\n label?: string;\n className?: string;\n}\n\ntype Item = number | \"start-gap\" | \"end-gap\";\n\n/** The page numbers to show, with gaps where pages are skipped. */\nexport function paginationItems(page: number, pageCount: number, siblingCount = 1, boundaryCount = 1): Item[] {\n const range = (from: number, to: number) => Array.from({ length: Math.max(0, to - from + 1) }, (_, i) => from + i);\n const startPages = range(1, Math.min(boundaryCount, pageCount));\n const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, pageCount - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n );\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0]! - 2 : pageCount - 1,\n );\n return [\n ...startPages,\n ...(siblingsStart > boundaryCount + 2\n ? ([\"start-gap\"] as Item[])\n : boundaryCount + 1 < pageCount - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < pageCount - boundaryCount - 1\n ? ([\"end-gap\"] as Item[])\n : pageCount - boundaryCount > boundaryCount\n ? [pageCount - boundaryCount]\n : []),\n ...endPages,\n ];\n}\n\n/** Moves through pages of results: previous, numbered pages with gaps, next. */\nexport function Pagination({\n page,\n pageCount,\n onPageChange,\n siblingCount = 1,\n boundaryCount = 1,\n size = \"md\",\n label = \"Pagination\",\n className,\n}: PaginationProps) {\n const items = paginationItems(page, pageCount, siblingCount, boundaryCount);\n const go = (next: number) => onPageChange(Math.min(Math.max(1, next), pageCount));\n return (\n <nav aria-label={label} className={cx(\"ow-pagination\", `ow-pagination--${size}`, className)}>\n <ul className=\"ow-pagination__list\">\n <li>\n <button\n type=\"button\"\n className=\"ow-pagination__button ow-pagination__step\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => go(page - 1)}\n >\n <ChevronLeftIcon size={16} />\n </button>\n </li>\n {items.map((item) =>\n typeof item === \"number\" ? (\n <li key={item}>\n <button\n type=\"button\"\n className=\"ow-pagination__button\"\n aria-current={item === page ? \"page\" : undefined}\n aria-label={`Page ${item}`}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={item} className=\"ow-pagination__gap\" aria-hidden=\"true\">\n \u2026\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n className=\"ow-pagination__button ow-pagination__step\"\n aria-label=\"Next page\"\n disabled={page >= pageCount}\n onClick={() => go(page + 1)}\n >\n <ChevronRightIcon size={16} />\n </button>\n </li>\n </ul>\n </nav>\n );\n}\n", "import { useId, type ReactNode } from \"react\";\n\nimport { CheckIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface StepItem {\n title: ReactNode;\n /** A line under the title. Hidden once the step is done, in the vertical layout. */\n description?: ReactNode;\n /** A control on the right of the current step, such as a small Button. */\n action?: ReactNode;\n /** Overrides the status worked out from `current`. */\n status?: \"done\" | \"current\" | \"upcoming\";\n}\n\nexport interface StepsProps {\n items: StepItem[];\n /** The index of the step in progress. Steps before it are done. Use items.length when every step is done.\n * @default 0 */\n current?: number;\n /** `vertical` is a first-run checklist; `horizontal` is a compact progress strip.\n * @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** A heading above a vertical list, with a \"2 of 4 done\" count beside it. */\n title?: ReactNode;\n /** Names the list for screen readers when there's no title.\n * @default \"Steps\" */\n label?: string;\n className?: string;\n}\n\n/** Numbered steps toward a goal. The current one is raised; finished ones are checked off. */\nexport function Steps({ items, current = 0, orientation = \"vertical\", title, label = \"Steps\", className }: StepsProps) {\n const statuses = items.map((item, index) => item.status ?? (index < current ? \"done\" : index === current ? \"current\" : \"upcoming\"));\n const doneCount = statuses.filter((status) => status === \"done\").length;\n const headingId = useId();\n\n const list = (\n <ol className=\"ow-steps__list\">\n {items.map((item, index) => {\n const status = statuses[index]!;\n return (\n <li\n key={index}\n className={cx(\"ow-steps__item\", `ow-steps__item--${status}`)}\n aria-current={status === \"current\" ? \"step\" : undefined}\n >\n <span className=\"ow-steps__marker\">\n {status === \"done\" ? <CheckIcon size={14} strokeWidth={3} /> : index + 1}\n </span>\n <span className=\"ow-steps__text\">\n <span className=\"ow-steps__title\">\n {status === \"done\" ? <span className=\"ow-visually-hidden\">Done: </span> : null}\n {item.title}\n </span>\n {item.description && (orientation === \"horizontal\" || status !== \"done\") ? (\n <span className=\"ow-steps__description\">{item.description}</span>\n ) : null}\n </span>\n {item.action && status !== \"done\" && orientation === \"vertical\" ? (\n <span className=\"ow-steps__action\">{item.action}</span>\n ) : null}\n </li>\n );\n })}\n </ol>\n );\n\n return (\n <section\n className={cx(\"ow-steps\", `ow-steps--${orientation}`, className)}\n aria-labelledby={title && orientation === \"vertical\" ? headingId : undefined}\n aria-label={title && orientation === \"vertical\" ? undefined : label}\n >\n {title && orientation === \"vertical\" ? (\n <div className=\"ow-steps__header\">\n <h3 id={headingId} className=\"ow-steps__heading\">\n {title}\n </h3>\n <span className=\"ow-steps__count\">\n {doneCount} of {items.length} done\n </span>\n </div>\n ) : null}\n {list}\n </section>\n );\n}\n", "import { forwardRef, type AnchorHTMLAttributes, type ButtonHTMLAttributes, type ReactNode, type Ref } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface NavListProps {\n /** Names the navigation for screen readers, e.g. \"Settings\". */\n label: string;\n /** A muted heading above the items (vertical only). */\n heading?: ReactNode;\n /** `vertical` for a sidebar; `horizontal` scrolls sideways, for narrow screens.\n * @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n children: ReactNode;\n className?: string;\n}\n\n/** A list of places to go, the way a settings dialog's sidebar lists its sections. Place it on ow-canvas. */\nexport function NavList({ label, heading, orientation = \"vertical\", children, className }: NavListProps) {\n return (\n <nav aria-label={label} className={cx(\"ow-nav\", `ow-nav--${orientation}`, className)}>\n {heading && orientation === \"vertical\" ? <span className=\"ow-nav__heading\">{heading}</span> : null}\n {children}\n </nav>\n );\n}\n\nexport interface NavItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** A 15px lucide-react icon. */\n icon?: ReactNode;\n /** The current section: raised on a surface, its icon in the primary colour.\n * @default false */\n active?: boolean;\n /** Makes the item a link to this address instead of a button. */\n href?: string;\n /** Muted text at the right: a count, a badge. */\n end?: ReactNode;\n}\n\n/** One place in a NavList: a button, or a link when given an href. */\nexport const NavItem = forwardRef<HTMLElement, NavItemProps>(function NavItem(\n { icon, active = false, className, children, type = \"button\", href, end, ...buttonProps },\n ref,\n) {\n const content = (\n <>\n {icon ? <span className=\"ow-nav__icon\">{icon}</span> : null}\n <span className=\"ow-nav__label\">{children}</span>\n {end !== undefined ? <span className=\"ow-nav__end\">{end}</span> : null}\n </>\n );\n const shared = {\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cx(\"ow-nav__item\", active && \"ow-nav__item--active\", className),\n };\n if (href !== undefined) {\n return (\n <a\n ref={ref as Ref<HTMLAnchorElement>}\n href={href}\n {...shared}\n {...(buttonProps as AnchorHTMLAttributes<HTMLAnchorElement>)}\n >\n {content}\n </a>\n );\n }\n return (\n <button ref={ref as Ref<HTMLButtonElement>} type={type} {...shared} {...buttonProps}>\n {content}\n </button>\n );\n});\n", "import { useMemo, type Key, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ArrowDownIcon, ArrowUpIcon, ChevronsUpDownIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Checkbox } from \"../Checkbox/Checkbox\";\n\nexport interface TableColumn<Row> {\n /** Unique; also the row field shown when there's no `render`. */\n key: string;\n header: ReactNode;\n /** Numbers and amounts go at the end, so their digits line up.\n * @default \"start\" */\n align?: \"start\" | \"center\" | \"end\";\n /** A CSS width, e.g. 120 or \"30%\". */\n width?: number | string;\n /** Lets the person sort by this column. */\n sortable?: boolean;\n /** What the cell shows. Defaults to the row's field named by `key`. */\n render?(row: Row): ReactNode;\n /** The value sorted by, when it isn't the field itself. */\n sortValue?(row: Row): string | number;\n}\n\nexport interface TableSort {\n key: string;\n direction: \"ascending\" | \"descending\";\n}\n\nexport interface TableProps<Row> {\n columns: Array<TableColumn<Row>>;\n rows: Row[];\n /** A field name or function giving each row a unique key.\n * @default \"id\" */\n rowKey?: keyof Row | ((row: Row) => Key);\n /** Describes the table for screen readers; shown above it unless `hideCaption`. */\n caption?: ReactNode;\n /** @default false */\n hideCaption?: boolean;\n sort?: TableSort;\n defaultSort?: TableSort;\n onSortChange?(sort: TableSort): void;\n /** Sort the rows yourself (e.g. on a server) and only show the arrows.\n * @default false */\n manualSort?: boolean;\n /** Adds a checkbox column.\n * @default \"none\" */\n selectionMode?: \"none\" | \"multiple\";\n selectedKeys?: Key[];\n defaultSelectedKeys?: Key[];\n onSelectionChange?(keys: Key[]): void;\n /** Shown in place of the rows when there are none, such as an EmptyState. */\n emptyContent?: ReactNode;\n /** `compact` rows are 36px; `comfortable` 44px.\n * @default \"comfortable\" */\n density?: \"compact\" | \"comfortable\";\n /** Keeps the header in view while the table scrolls; use with maxHeight. */\n stickyHeader?: boolean;\n maxHeight?: number | string;\n className?: string;\n}\n\nfunction compare(a: string | number, b: string | number) {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: \"base\" });\n}\n\n/** Rows of records with sortable columns and optional selection, in a bordered card. */\nexport function Table<Row extends object>({\n columns,\n rows,\n rowKey = \"id\" as keyof Row,\n caption,\n hideCaption = false,\n sort,\n defaultSort,\n onSortChange,\n manualSort = false,\n selectionMode = \"none\",\n selectedKeys,\n defaultSelectedKeys = [],\n onSelectionChange,\n emptyContent = \"Nothing here yet.\",\n density = \"comfortable\",\n stickyHeader = false,\n maxHeight,\n className,\n}: TableProps<Row>) {\n const [currentSort, setSort] = useControllableState<TableSort | undefined>(sort, defaultSort, onSortChange as (sort: TableSort | undefined) => void);\n const [selected, setSelected] = useControllableState(selectedKeys, defaultSelectedKeys, onSelectionChange);\n const keyOf = (row: Row): Key => (typeof rowKey === \"function\" ? rowKey(row) : (row[rowKey] as Key));\n const field = (row: Row, key: string) => (row as Record<string, unknown>)[key];\n\n const sorted = useMemo(() => {\n if (!currentSort || manualSort) return rows;\n const column = columns.find((c) => c.key === currentSort.key);\n if (!column) return rows;\n const value = (row: Row) => (column.sortValue ? column.sortValue(row) : (field(row, column.key) as string | number));\n const result = [...rows].sort((a, b) => compare(value(a), value(b)));\n return currentSort.direction === \"descending\" ? result.reverse() : result;\n }, [rows, columns, currentSort, manualSort]);\n\n const allKeys = sorted.map(keyOf);\n const selectedCount = allKeys.filter((key) => selected.includes(key)).length;\n\n function toggleSort(key: string) {\n setSort(\n currentSort?.key === key\n ? { key, direction: currentSort.direction === \"ascending\" ? \"descending\" : \"ascending\" }\n : { key, direction: \"ascending\" },\n );\n }\n\n const selectable = selectionMode === \"multiple\";\n\n return (\n <div\n className={cx(\"ow-table-wrap\", stickyHeader && \"ow-table-wrap--sticky\", className)}\n style={maxHeight ? { maxHeight } : undefined}\n tabIndex={maxHeight ? 0 : undefined}\n >\n <table className={cx(\"ow-table\", `ow-table--${density}`)}>\n {caption ? <caption className={cx(\"ow-table__caption\", hideCaption && \"ow-visually-hidden\")}>{caption}</caption> : null}\n <thead>\n <tr>\n {selectable ? (\n <th className=\"ow-table__select\" scope=\"col\">\n <Checkbox\n size=\"sm\"\n aria-label=\"Select all rows\"\n checked={sorted.length > 0 && selectedCount === sorted.length}\n indeterminate={selectedCount > 0 && selectedCount < sorted.length}\n onChange={(event) =>\n setSelected(\n event.target.checked\n ? [...new Set([...selected, ...allKeys])]\n : selected.filter((key) => !allKeys.includes(key)),\n )\n }\n />\n </th>\n ) : null}\n {columns.map((column) => {\n const direction = currentSort?.key === column.key ? currentSort.direction : undefined;\n return (\n <th\n key={column.key}\n scope=\"col\"\n aria-sort={direction ?? (column.sortable ? \"none\" : undefined)}\n className={cx(`ow-table__cell--${column.align ?? \"start\"}`)}\n style={column.width !== undefined ? { width: column.width } : undefined}\n >\n {column.sortable ? (\n <button type=\"button\" className=\"ow-table__sort\" onClick={() => toggleSort(column.key)}>\n {column.header}\n <span className={cx(\"ow-table__sort-icon\", direction && \"ow-table__sort-icon--active\")}>\n {direction === \"ascending\" ? (\n <ArrowUpIcon size={12} />\n ) : direction === \"descending\" ? (\n <ArrowDownIcon size={12} />\n ) : (\n <ChevronsUpDownIcon size={12} />\n )}\n </span>\n </button>\n ) : (\n column.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {sorted.length === 0 ? (\n <tr>\n <td className=\"ow-table__empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyContent}\n </td>\n </tr>\n ) : (\n sorted.map((row) => {\n const key = keyOf(row);\n const isSelected = selected.includes(key);\n return (\n <tr key={key} className={cx(isSelected && \"ow-table__row--selected\")}>\n {selectable ? (\n <td className=\"ow-table__select\">\n <Checkbox\n size=\"sm\"\n aria-label=\"Select row\"\n checked={isSelected}\n onChange={(event) =>\n setSelected(\n event.target.checked ? [...selected, key] : selected.filter((k) => k !== key),\n )\n }\n />\n </td>\n ) : null}\n {columns.map((column) => (\n <td key={column.key} className={cx(`ow-table__cell--${column.align ?? \"start\"}`)}>\n {column.render ? column.render(row) : (field(row, column.key) as ReactNode)}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n );\n}\n", "import type { ReactNode } from \"react\";\n\nimport { ArrowDownIcon, ArrowUpIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface StatProps {\n /** What's measured, in a few words: \"Tokens this week\". */\n label: ReactNode;\n /** The number, formatted: \"1.2M\", \"\u20AC48.20\". */\n value: ReactNode;\n /** A 14px icon on a small tile beside the label. */\n icon?: ReactNode;\n /** The change since last time, as text: \"+12%\", \"\u22123\". */\n change?: string;\n /** Whether the change is good or bad. Worked out from a leading + or \u2212 when left out; costs going up are negative, so set it. */\n changeTone?: \"positive\" | \"negative\" | \"neutral\";\n /** A muted line under the value: \"vs last week\". */\n description?: ReactNode;\n /** Recent values for a small line chart under the number. */\n trend?: number[];\n className?: string;\n}\n\nfunction Sparkline({ values }: { values: number[] }) {\n const max = Math.max(...values);\n const min = Math.min(...values);\n const span = max - min || 1;\n const points = values.map((value, index) => {\n const x = (index / (values.length - 1)) * 100;\n const y = 36 - ((value - min) / span) * 32;\n return [x, y] as const;\n });\n const line = points.map(([x, y], index) => `${index ? \"L\" : \"M\"}${x.toFixed(2)} ${y.toFixed(2)}`).join(\" \");\n const [lastX, lastY] = points[points.length - 1]!;\n return (\n <div className=\"ow-stat__trend\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 40\" preserveAspectRatio=\"none\">\n <path d={`${line} L100 40 L0 40 Z`} className=\"ow-stat__trend-area\" />\n <path d={line} className=\"ow-stat__trend-line\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n {/* The end point is HTML, so the stretched chart doesn't stretch it into an oval. */}\n <span className=\"ow-stat__trend-end\" style={{ left: `${lastX}%`, top: `${(lastY / 40) * 100}%` }} />\n </div>\n );\n}\n\n/** One headline number with its label, change and trend, for overview cards. */\nexport function Stat({ label, value, icon, change, changeTone, description, trend, className }: StatProps) {\n const tone = changeTone ?? (change?.startsWith(\"+\") ? \"positive\" : /^[-\u2212]/.test(change ?? \"\") ? \"negative\" : \"neutral\");\n const rising = change ? !/^[-\u2212]/.test(change) : false;\n return (\n <div className={cx(\"ow-stat\", className)}>\n <div className=\"ow-stat__label\">\n {icon ? <span className=\"ow-stat__icon\">{icon}</span> : null}\n <span>{label}</span>\n </div>\n <div className=\"ow-stat__row\">\n <span className=\"ow-stat__value\">{value}</span>\n {change ? (\n <span className={cx(\"ow-stat__change\", `ow-stat__change--${tone}`)}>\n {tone === \"neutral\" ? null : rising ? <ArrowUpIcon size={12} /> : <ArrowDownIcon size={12} />}\n {change}\n </span>\n ) : null}\n </div>\n {description ? <div className=\"ow-stat__description\">{description}</div> : null}\n {trend && trend.length > 1 ? <Sparkline values={trend} /> : null}\n </div>\n );\n}\n", "import { useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ChevronRightIcon, FileIcon, FolderIcon, FolderOpenIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface FileTreeNode {\n name: string;\n /** A folder's contents. Give folders an empty array if they're empty. */\n children?: FileTreeNode[];\n /** Replaces the file or folder icon. */\n icon?: ReactNode;\n /** Muted text at the right of the row, such as \"+12 \u22123\" or a size. */\n meta?: ReactNode;\n}\n\nexport interface FileTreeProps {\n items: FileTreeNode[];\n /** The selected file's path, \"src/app.tsx\". */\n selected?: string;\n defaultSelected?: string;\n onSelect?(path: string): void;\n /** Folder paths open at first, or \"all\".\n * @default \"all\" */\n defaultExpanded?: string[] | \"all\";\n /** Names the tree for screen readers.\n * @default \"Files\" */\n label?: string;\n className?: string;\n}\n\ninterface Row {\n node: FileTreeNode;\n path: string;\n level: number;\n parent?: string;\n isFolder: boolean;\n}\n\nfunction flatten(nodes: FileTreeNode[], expanded: Set<string>, parent?: string, level = 1): Row[] {\n return nodes.flatMap((node) => {\n const path = parent ? `${parent}/${node.name}` : node.name;\n const isFolder = node.children !== undefined;\n const row: Row = { node, path, level, parent, isFolder };\n return isFolder && expanded.has(path) ? [row, ...flatten(node.children!, expanded, path, level + 1)] : [row];\n });\n}\n\nfunction allFolders(nodes: FileTreeNode[], parent?: string): string[] {\n return nodes.flatMap((node) => {\n const path = parent ? `${parent}/${node.name}` : node.name;\n return node.children ? [path, ...allFolders(node.children, path)] : [];\n });\n}\n\n/**\n * A project structure explorer: folders open and close, files can be selected.\n * Up and Down move, Right opens a folder or goes into it, Left closes it or goes to its parent.\n */\nexport function FileTree({\n items,\n selected,\n defaultSelected = \"\",\n onSelect,\n defaultExpanded = \"all\",\n label = \"Files\",\n className,\n}: FileTreeProps) {\n const [current, setCurrent] = useControllableState(selected, defaultSelected, onSelect);\n const [expanded, setExpanded] = useState(() => new Set(defaultExpanded === \"all\" ? allFolders(items) : defaultExpanded));\n const rows = useMemo(() => flatten(items, expanded), [items, expanded]);\n const [focusPath, setFocusPath] = useState<string | undefined>();\n const refs = useRef(new Map<string, HTMLLIElement>());\n const tabStop = rows.some((row) => row.path === focusPath) ? focusPath : (rows.find((row) => row.path === current) ?? rows[0])?.path;\n\n function focus(path: string | undefined) {\n if (!path) return;\n setFocusPath(path);\n refs.current.get(path)?.focus();\n }\n\n function toggle(path: string, open?: boolean) {\n setExpanded((previous) => {\n const next = new Set(previous);\n if (open ?? !next.has(path)) next.add(path);\n else next.delete(path);\n return next;\n });\n }\n\n function activate(row: Row) {\n if (row.isFolder) toggle(row.path);\n else setCurrent(row.path);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLLIElement>, row: Row) {\n const index = rows.indexOf(row);\n const handlers: Record<string, () => void> = {\n ArrowDown: () => focus(rows[index + 1]?.path),\n ArrowUp: () => focus(rows[index - 1]?.path),\n Home: () => focus(rows[0]?.path),\n End: () => focus(rows[rows.length - 1]?.path),\n ArrowRight: () => {\n if (!row.isFolder) return;\n if (!expanded.has(row.path)) toggle(row.path, true);\n else focus(rows[index + 1]?.level === row.level + 1 ? rows[index + 1]!.path : undefined);\n },\n ArrowLeft: () => {\n if (row.isFolder && expanded.has(row.path)) toggle(row.path, false);\n else focus(row.parent);\n },\n Enter: () => activate(row),\n \" \": () => activate(row),\n };\n const handler = handlers[event.key];\n if (!handler) return;\n event.preventDefault();\n event.stopPropagation();\n handler();\n }\n\n function render(nodes: FileTreeNode[], parent?: string, level = 1): ReactNode {\n return nodes.map((node) => {\n const path = parent ? `${parent}/${node.name}` : node.name;\n const row = rows.find((entry) => entry.path === path);\n if (!row) return null;\n const isOpen = row.isFolder && expanded.has(path);\n const icon = node.icon ?? (row.isFolder ? isOpen ? <FolderOpenIcon size={16} /> : <FolderIcon size={16} /> : <FileIcon size={16} />);\n return (\n <li\n key={path}\n ref={(element) => {\n if (element) refs.current.set(path, element);\n else refs.current.delete(path);\n }}\n role=\"treeitem\"\n aria-level={level}\n aria-expanded={row.isFolder ? isOpen : undefined}\n aria-selected={row.isFolder ? undefined : current === path}\n tabIndex={tabStop === path ? 0 : -1}\n className=\"ow-tree__item\"\n onKeyDown={(event) => onKeyDown(event, row)}\n onFocus={(event) => {\n if (event.target === event.currentTarget) setFocusPath(path);\n }}\n >\n <div\n className={cx(\"ow-tree__row\", !row.isFolder && current === path && \"ow-tree__row--selected\")}\n title={path}\n onClick={() => {\n focus(path);\n activate(row);\n }}\n >\n {row.isFolder ? (\n <ChevronRightIcon size={14} className={cx(\"ow-tree__chevron\", isOpen && \"ow-tree__chevron--open\")} />\n ) : (\n <span className=\"ow-tree__spacer\" />\n )}\n <span className={cx(\"ow-tree__icon\", row.isFolder && \"ow-tree__icon--folder\")}>{icon}</span>\n <span className=\"ow-tree__name\">{node.name}</span>\n {node.meta ? <span className=\"ow-tree__meta\">{node.meta}</span> : null}\n </div>\n {isOpen && node.children!.length > 0 ? (\n <ul role=\"group\" className=\"ow-tree__group\">\n {render(node.children!, path, level + 1)}\n </ul>\n ) : null}\n </li>\n );\n });\n }\n\n return (\n <ul role=\"tree\" aria-label={label} className={cx(\"ow-tree\", className)}>\n {render(items)}\n </ul>\n );\n}\n", "import type { ReactNode } from \"react\";\n\nimport { InboxIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface EmptyStateProps {\n /** What's missing, as a plain statement: \"No projects yet\". */\n title: ReactNode;\n /** What to do about it, in a sentence. */\n description?: ReactNode;\n /** A 20px icon on a tile.\n * @default <InboxIcon /> */\n icon?: ReactNode;\n /** One primary Button, and maybe a secondary one. */\n actions?: ReactNode;\n /** Draws a dashed outline around it, for an empty area inside a page.\n * @default false */\n bordered?: boolean;\n className?: string;\n}\n\n/** What a list, table or panel shows when there's nothing in it yet, and the way to add the first thing. */\nexport function EmptyState({ title, description, icon, actions, bordered = false, className }: EmptyStateProps) {\n return (\n <div className={cx(\"ow-empty\", bordered && \"ow-empty--bordered\", className)}>\n <span className=\"ow-empty__icon\" aria-hidden=\"true\">\n {icon ?? <InboxIcon size={20} />}\n </span>\n <div className=\"ow-empty__text\">\n <p className=\"ow-empty__title\">{title}</p>\n {description ? <p className=\"ow-empty__description\">{description}</p> : null}\n </div>\n {actions ? <div className=\"ow-empty__actions\">{actions}</div> : null}\n </div>\n );\n}\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { XIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n /** Shows a \u2715 that calls this. */\n onRemove?(): void;\n /** `neutral` for labels and filters; `active` for the ones currently applied.\n * @default \"neutral\" */\n variant?: \"neutral\" | \"active\";\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** A 14px icon or a ColorSwatch before the text. */\n icon?: ReactNode;\n /** What the \u2715 removes, read out as \"Remove \u2026\". Defaults to the text when it's a string. */\n removeLabel?: string;\n children: ReactNode;\n}\n\n/** A label on something (a topic, a filter, a recipient) that can be removed. */\nexport function Tag({ onRemove, variant = \"neutral\", size = \"md\", icon, removeLabel, className, children, ...props }: TagProps) {\n const name = removeLabel ?? (typeof children === \"string\" ? children : \"tag\");\n return (\n <span className={cx(\"ow-tag\", `ow-tag--${variant}`, `ow-tag--${size}`, onRemove && \"ow-tag--removable\", className)} {...props}>\n {icon ? <span className=\"ow-tag__icon\">{icon}</span> : null}\n <span className=\"ow-tag__label\">{children}</span>\n {onRemove ? (\n <button type=\"button\" className=\"ow-tag__remove\" aria-label={`Remove ${name}`} onClick={onRemove}>\n <XIcon size={12} />\n </button>\n ) : null}\n </span>\n );\n}\n\nexport interface TagGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Names the set for screen readers, e.g. \"Filters\". */\n label?: string;\n children: ReactNode;\n}\n\n/** Tags in a wrapping row. */\nexport function TagGroup({ label, className, children, ...props }: TagGroupProps) {\n return (\n <div role=\"group\" aria-label={label} className={cx(\"ow-tag-group\", className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface ColorSwatchProps {\n /** Any CSS colour: \"#312c7e\", \"var(--ow-brass)\". */\n color: string;\n /** The colour's name, read out and shown beside the swatch. */\n name?: string;\n /** The value shown under the name, e.g. the hex. */\n value?: string;\n /** sm 16px, md 24px, lg 40px.\n * @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** @default \"square\" */\n shape?: \"square\" | \"circle\";\n className?: string;\n}\n\n/** A colour sample, with its name and value if given. */\nexport function ColorSwatch({ color, name, value, size = \"md\", shape = \"square\", className }: ColorSwatchProps) {\n const swatch = (\n <span\n className={cx(\"ow-swatch\", `ow-swatch--${size}`, shape === \"circle\" && \"ow-swatch--circle\")}\n style={{ background: color }}\n {...(name && !value ? { role: \"img\", \"aria-label\": name } : { \"aria-hidden\": true })}\n />\n );\n if (!name && !value) return <span className={className}>{swatch}</span>;\n return (\n <span className={cx(\"ow-swatch-label\", className)}>\n {swatch}\n <span className=\"ow-swatch-label__text\">\n {name ? <span className=\"ow-swatch-label__name\">{name}</span> : null}\n <span className=\"ow-swatch-label__value\">{value}</span>\n </span>\n </span>\n );\n}\n", "import { useState } from \"react\";\n\nimport { UserIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { getInitials } from \"../../utils/text\";\n\nexport interface AvatarProps {\n /** The person's name; its initials show when there's no image. */\n name: string;\n /** A photo URL. If it fails to load, the initials show instead. */\n src?: string;\n /** sm 24px, md 28px, lg 36px.\n * @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Give it when the avatar stands alone; beside the name, leave it out and it's hidden from screen readers. */\n label?: string;\n className?: string;\n}\n\n/** A round picture of a person: their photo, else their initials on the brand colour, else a person icon. */\nexport function Avatar({ name, src, size = \"md\", label, className }: AvatarProps) {\n const initials = getInitials(name);\n const [failedImage, setFailedImage] = useState<string>();\n const showImage = src && src !== failedImage;\n\n return (\n <span\n className={cx(\"ow-avatar\", `ow-avatar--${size}`, !initials && !showImage && \"ow-avatar--empty\", className)}\n {...(label ? { role: \"img\", \"aria-label\": label } : { \"aria-hidden\": true })}\n >\n {showImage ? (\n <img src={src} alt=\"\" className=\"ow-avatar__image\" onError={() => setFailedImage(src)} />\n ) : (\n initials || <UserIcon size={size === \"sm\" ? 13 : size === \"lg\" ? 18 : 15} />\n )}\n </span>\n );\n}\n", "import { Children, cloneElement, isValidElement, type ReactElement, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { Avatar, type AvatarProps } from \"./Avatar\";\n\nexport interface AvatarGroupProps {\n /** Avatars. */\n children: ReactNode;\n /** Shows this many, then a \"+3\" count.\n * @default 4 */\n max?: number;\n /** Applied to every avatar in the group.\n * @default \"md\" */\n size?: AvatarProps[\"size\"];\n /** Names the group for screen readers, e.g. \"5 people on this project\". */\n label?: string;\n className?: string;\n}\n\n/** Overlapping avatars for the people on something, with a count for the rest. */\nexport function AvatarGroup({ children, max = 4, size = \"md\", label, className }: AvatarGroupProps) {\n const avatars = Children.toArray(children).filter(isValidElement) as Array<ReactElement<AvatarProps>>;\n const shown = avatars.slice(0, max);\n const hidden = avatars.length - shown.length;\n return (\n <div role=\"group\" aria-label={label} className={cx(\"ow-avatar-group\", className)}>\n {shown.map((avatar) => cloneElement(avatar, { size }))}\n {hidden > 0 ? (\n <span className={cx(\"ow-avatar\", `ow-avatar--${size}`, \"ow-avatar--count\")}>\n <span aria-hidden=\"true\">+{hidden}</span>\n <span className=\"ow-visually-hidden\">and {hidden} more</span>\n </span>\n ) : null}\n </div>\n );\n}\n\nexport interface UserProps {\n name: string;\n /** A second line: an email, a role. */\n description?: ReactNode;\n src?: string;\n /** @default \"md\" */\n size?: AvatarProps[\"size\"];\n className?: string;\n}\n\n/** A person: avatar, name and a line about them, as in an account menu. */\nexport function User({ name, description, src, size = \"md\", className }: UserProps) {\n return (\n <div className={cx(\"ow-user\", `ow-user--${size}`, className)}>\n <Avatar name={name} src={src} size={size} />\n <div className=\"ow-user__text\">\n <span className=\"ow-user__name\">{name}</span>\n {description ? <span className=\"ow-user__description\">{description}</span> : null}\n </div>\n </div>\n );\n}\n", "import type { HTMLAttributes } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\n/** One keyboard key in running text, with a heavier bottom edge like a real key: <Kbd>\u2318</Kbd> <Kbd>K</Kbd>. */\nexport function Kbd({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return <kbd className={cx(\"ow-kbd\", className)} {...props} />;\n}\n\n/** Code, a path or a command inside a sentence. */\nexport function Code({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return <code className={cx(\"ow-code\", className)} {...props} />;\n}\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** `none` for a card that holds a list or table edge to edge; `md` is 16px, `lg` 24px.\n * @default \"md\" */\n padding?: \"none\" | \"md\" | \"lg\";\n}\n\n/** A surface with a hairline border and no shadow: borders before shadows. */\nexport function Card({ className, padding = \"md\", ...props }: CardProps) {\n return <div className={cx(\"ow-card\", `ow-card--pad-${padding}`, className)} {...props} />;\n}\n\nexport interface SettingsRowProps {\n label: ReactNode;\n /** A muted line or two under the label. */\n description?: ReactNode;\n /** The control: a Switch, a Select, a Button. */\n children: ReactNode;\n className?: string;\n}\n\n/** A label on the left and its control on the right, like macOS System Settings. Stack them in a Card. */\nexport function SettingsRow({ children, description, label, className }: SettingsRowProps) {\n return (\n <div className={cx(\"ow-settings-row\", className)}>\n <div className=\"ow-settings-row__text\">\n <span className=\"ow-settings-row__label\">{label}</span>\n {description ? <div className=\"ow-settings-row__description\">{description}</div> : null}\n </div>\n <div className=\"ow-settings-row__control\">{children}</div>\n </div>\n );\n}\n", "import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type JSX,\n type ReactNode,\n} from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport type SpaceToken = \"none\" | \"3xs\" | \"2xs\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\" | \"5xl\" | \"6xl\" | \"7xl\";\n\nconst space = (token: SpaceToken) => (token === \"none\" ? \"0\" : `var(--ow-space-${token})`);\n\nexport interface StackProps extends HTMLAttributes<HTMLElement> {\n /** @default \"column\" */\n direction?: \"row\" | \"column\";\n /** The space between children, from the spacing scale.\n * @default \"md\" */\n gap?: SpaceToken;\n /** Cross-axis alignment. */\n align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\n /** Main-axis alignment. */\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n /** Lets a row wrap onto more lines.\n * @default false */\n wrap?: boolean;\n /** The element to render.\n * @default \"div\" */\n as?: keyof JSX.IntrinsicElements;\n children?: ReactNode;\n}\n\nconst alignments = { start: \"flex-start\", center: \"center\", end: \"flex-end\", stretch: \"stretch\", baseline: \"baseline\", between: \"space-between\" };\n\n/** Lays children out in a row or a column with a gap from the spacing scale. */\nexport function Stack({\n direction = \"column\",\n gap = \"md\",\n align,\n justify,\n wrap = false,\n as = \"div\",\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const Element = as as \"div\";\n return (\n <Element\n className={cx(\"ow-stack\", className)}\n style={{\n flexDirection: direction,\n gap: space(gap),\n alignItems: align ? alignments[align] : undefined,\n justifyContent: justify ? alignments[justify] : undefined,\n flexWrap: wrap ? \"wrap\" : undefined,\n ...style,\n }}\n {...props}\n >\n {children}\n </Element>\n );\n}\n\nexport interface SeparatorProps {\n /** @default \"horizontal\" */\n orientation?: \"horizontal\" | \"vertical\";\n /** Text in the middle of a horizontal line, such as \"or\". */\n label?: ReactNode;\n /** Space before and after, from the spacing scale.\n * @default \"none\" */\n spacing?: SpaceToken;\n className?: string;\n}\n\n/** A hairline between groups of content. Prefer space; use a line when space alone doesn't separate. */\nexport function Separator({ orientation = \"horizontal\", label, spacing = \"none\", className }: SeparatorProps) {\n const margin = orientation === \"horizontal\" ? `${space(spacing)} 0` : `0 ${space(spacing)}`;\n if (label && orientation === \"horizontal\") {\n return (\n <div role=\"separator\" className={cx(\"ow-separator-label\", className)} style={{ margin }}>\n <span className=\"ow-separator-label__text\">{label}</span>\n </div>\n );\n }\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cx(\"ow-separator\", `ow-separator--${orientation}`, className)}\n style={{ margin }}\n />\n );\n}\n\nexport interface ScrollShadowProps extends HTMLAttributes<HTMLDivElement> {\n /** @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** How far the fade reaches, in pixels.\n * @default 32 */\n size?: number;\n /** Its height (vertical) or width; it scrolls past this. */\n maxSize?: number | string;\n /** Names the area; with it, the area becomes a focusable region so keyboards can scroll it. */\n \"aria-label\"?: string;\n children: ReactNode;\n}\n\n/** A scrolling area whose edges fade out where there's more to scroll, so nothing looks cut off. */\nexport function ScrollShadow({\n orientation = \"vertical\",\n size = 32,\n maxSize,\n className,\n style,\n children,\n \"aria-label\": ariaLabel,\n ...props\n}: ScrollShadowProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [edges, setEdges] = useState({ start: false, end: false });\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n const update = () => {\n const position = orientation === \"vertical\" ? element.scrollTop : element.scrollLeft;\n const extent = orientation === \"vertical\" ? element.scrollHeight - element.clientHeight : element.scrollWidth - element.clientWidth;\n setEdges({ start: position > 1, end: position < extent - 1 });\n };\n update();\n element.addEventListener(\"scroll\", update, { passive: true });\n const observer = typeof ResizeObserver === \"undefined\" ? undefined : new ResizeObserver(update);\n observer?.observe(element);\n if (element.firstElementChild) observer?.observe(element.firstElementChild);\n return () => {\n element.removeEventListener(\"scroll\", update);\n observer?.disconnect();\n };\n }, [orientation]);\n\n return (\n <div\n ref={ref}\n className={cx(\"ow-scroll-shadow\", `ow-scroll-shadow--${orientation}`, className)}\n data-start={edges.start || undefined}\n data-end={edges.end || undefined}\n tabIndex={ariaLabel ? 0 : undefined}\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n style={\n {\n \"--ow-scroll-shadow\": `${size}px`,\n [orientation === \"vertical\" ? \"maxHeight\" : \"maxWidth\"]: maxSize,\n ...style,\n } as CSSProperties\n }\n {...props}\n >\n {children}\n </div>\n );\n}\n\n/** Hides content visually but keeps it for screen readers: extra context for an icon, a table caption. */\nexport function VisuallyHidden({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={cx(\"ow-visually-hidden\", className)} {...props} />;\n}\n", "import { useRef, type HTMLAttributes, type PointerEvent, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\n/** A white pill with a brass dot that names a section, set just above its title. */\nexport function Chip({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={cx(\"ow-chip\", className)} {...props} />;\n}\n\nexport interface SectionHeadingProps {\n /** One to three words for the Chip above the title. */\n eyebrow?: ReactNode;\n title: ReactNode;\n /** One or two sentences under the title. */\n intro?: ReactNode;\n /** @default \"start\" */\n align?: \"start\" | \"center\";\n /** The heading level.\n * @default \"h2\" */\n as?: \"h1\" | \"h2\" | \"h3\";\n className?: string;\n}\n\n/** How a marketing section opens: a Chip, a big light title, then an intro in muted text. */\nexport function SectionHeading({\n eyebrow,\n title,\n intro,\n align = \"start\",\n as: Heading = \"h2\",\n className,\n}: SectionHeadingProps) {\n return (\n <div className={cx(\"ow-section-heading\", align === \"center\" && \"ow-section-heading--center\", className)}>\n {eyebrow ? <Chip>{eyebrow}</Chip> : null}\n <Heading className=\"ow-section-heading__title\">{title}</Heading>\n {intro ? <p className=\"ow-section-heading__intro\">{intro}</p> : null}\n </div>\n );\n}\n\nexport interface SiteHeaderProps {\n /** Your logo or name, usually a link home. */\n brand: ReactNode;\n /** Links in the middle; hidden under 760px wide. */\n nav?: ReactNode;\n /** On the right: one primary Button with shape=\"pill\". */\n actions?: ReactNode;\n className?: string;\n}\n\n/** The marketing site's header: a floating white pill over a blur, with a hairline border and a soft shadow. */\nexport function SiteHeader({ brand, nav, actions, className }: SiteHeaderProps) {\n return (\n <header className={cx(\"ow-site-header\", className)}>\n <div className=\"ow-site-header__brand\">{brand}</div>\n {nav ? <nav className=\"ow-site-header__nav\">{nav}</nav> : null}\n {actions ? <div className=\"ow-site-header__actions\">{actions}</div> : null}\n </header>\n );\n}\n\nexport interface DotGridProps extends HTMLAttributes<HTMLDivElement> {\n /** Fades the dots out toward the edges.\n * @default false */\n fade?: boolean;\n /** Turns the dots under the pointer brass.\n * @default false */\n interactive?: boolean;\n}\n\n/** A ground of 1px dots every 22px, like a sheet laid out for planning. Content goes inside. */\nexport function DotGrid({ fade = false, interactive = false, className, children, onPointerMove, ...props }: DotGridProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n function track(event: PointerEvent<HTMLDivElement>) {\n onPointerMove?.(event);\n const element = ref.current;\n if (!interactive || !element) return;\n const rect = element.getBoundingClientRect();\n element.style.setProperty(\"--ow-pointer-x\", `${event.clientX - rect.left}px`);\n element.style.setProperty(\"--ow-pointer-y\", `${event.clientY - rect.top}px`);\n }\n\n return (\n <div\n ref={ref}\n className={cx(\"ow-dot-grid\", fade && \"ow-dot-grid--fade\", interactive && \"ow-dot-grid--interactive\", className)}\n onPointerMove={track}\n {...props}\n >\n <span className=\"ow-dot-grid__dots\" aria-hidden=\"true\" />\n {interactive ? (\n <span className=\"ow-dot-grid__brass\" aria-hidden=\"true\" />\n ) : null}\n <div className=\"ow-dot-grid__content\">{children}</div>\n </div>\n );\n}\n", "import { forwardRef, useCallback, useEffect, useId, useRef, useState, type CSSProperties, type ForwardedRef } from \"react\";\nimport { HexAlphaColorPicker, HexColorInput, HexColorPicker } from \"react-colorful\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating, type Placement } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { ChevronDownIcon, PipetteIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\n/** What a swatch is: a colour, or a colour with a name to read out. */\nexport type ColorSwatchOption = string | { color: string; name: string };\n\nexport interface ColorPickerProps {\n /** A hex colour: \"#0d9488\", or \"#0d9488cc\" with alpha. */\n value?: string;\n /** @default \"#312c7e\" */\n defaultValue?: string;\n /** Called with a lowercase hex colour as the person drags, types or picks. */\n onChange?(color: string): void;\n /** Adds an opacity slider; colours come back as #rrggbbaa.\n * @default false */\n alpha?: boolean;\n /** Ready-made colours as swatches under the picker. */\n swatches?: ColorSwatchOption[];\n /** The hex field under the picker.\n * @default true */\n showInput?: boolean;\n /** A button that picks a colour from anywhere on the screen, where the browser can (Chrome and Edge).\n * @default true */\n eyeDropper?: boolean;\n /** Names the picker for screen readers.\n * @default \"Colour\" */\n \"aria-label\"?: string;\n className?: string;\n}\n\ninterface EyeDropperResult {\n sRGBHex: string;\n}\n\ndeclare global {\n interface Window {\n EyeDropper?: new () => { open(): Promise<EyeDropperResult> };\n }\n}\n\nconst swatchColor = (swatch: ColorSwatchOption) => (typeof swatch === \"string\" ? swatch : swatch.color);\nconst swatchName = (swatch: ColorSwatchOption) => (typeof swatch === \"string\" ? swatch : swatch.name);\nconst same = (a: string, b: string) => a.toLowerCase().replace(/^#/, \"\") === b.toLowerCase().replace(/^#/, \"\");\n\n/**\n * Picks a colour: a saturation area and a hue slider (react-colorful, dressed in Openware's look), a hex field,\n * an eyedropper where the browser has one, and optional swatches. The area and sliders work with the arrow keys.\n */\nexport function ColorPicker({\n value,\n defaultValue = \"#312c7e\",\n onChange,\n alpha = false,\n swatches,\n showInput = true,\n eyeDropper = true,\n \"aria-label\": ariaLabel = \"Colour\",\n className,\n}: ColorPickerProps) {\n const [color, setColor] = useControllableState(value, defaultValue, onChange);\n const [canPick, setCanPick] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n useEffect(() => setCanPick(typeof window !== \"undefined\" && \"EyeDropper\" in window), []);\n\n // react-colorful names its sliders \"Color\", \"Hue\" and \"Alpha\"; read them out in Openware's words.\n useEffect(() => {\n const names: Record<string, string> = { saturation: \"Colour\", hue: \"Hue\", alpha: \"Opacity\" };\n for (const [part, label] of Object.entries(names)) {\n rootRef.current?.querySelector(`.react-colorful__${part} .react-colorful__interactive`)?.setAttribute(\"aria-label\", label);\n }\n }, [alpha]);\n const Picker = alpha ? HexAlphaColorPicker : HexColorPicker;\n const change = (next: string) => setColor(next.toLowerCase());\n\n async function pickFromScreen() {\n if (!window.EyeDropper) return;\n try {\n const result = await new window.EyeDropper().open();\n change(result.sRGBHex);\n } catch {\n // Escape pressed: nothing picked.\n }\n }\n\n return (\n <div ref={rootRef} role=\"group\" aria-label={ariaLabel} className={cx(\"ow-color-picker\", className)}>\n <Picker color={color} onChange={change} />\n {showInput || (eyeDropper && canPick) ? (\n <div className=\"ow-color-picker__row\">\n {eyeDropper && canPick ? (\n <button type=\"button\" className=\"ow-color-picker__dropper\" aria-label=\"Pick a colour from the screen\" onClick={pickFromScreen}>\n <PipetteIcon size={15} />\n </button>\n ) : null}\n {showInput ? (\n <span className=\"ow-input-group ow-input-group--sm ow-color-picker__input\">\n <span className=\"ow-input-group__addon\" aria-hidden=\"true\">\n #\n </span>\n <HexColorInput\n className=\"ow-input-group__input\"\n color={color}\n onChange={change}\n alpha={alpha}\n aria-label=\"Hex colour\"\n spellCheck={false}\n />\n </span>\n ) : null}\n <span className=\"ow-color-picker__preview\" style={{ \"--ow-color-picker-value\": color } as CSSProperties} aria-hidden=\"true\" />\n </div>\n ) : null}\n {swatches?.length ? (\n <div className=\"ow-color-picker__swatches\" role=\"group\" aria-label=\"Swatches\">\n {swatches.map((swatch) => {\n const swatchValue = swatchColor(swatch);\n return (\n <button\n key={swatchValue}\n type=\"button\"\n className=\"ow-color-picker__swatch\"\n style={{ \"--ow-color-picker-value\": swatchValue } as CSSProperties}\n aria-label={swatchName(swatch)}\n aria-pressed={same(swatchValue, color)}\n title={swatchName(swatch)}\n onClick={() => change(swatchValue)}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport interface ColorFieldProps extends Omit<ColorPickerProps, \"className\" | \"aria-label\"> {\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n /** Where the picker opens; it flips when there's no room.\n * @default \"bottom-start\" */\n placement?: Placement;\n id?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n className?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/** A field that shows a colour and its hex, and opens a ColorPicker below. Escape or a click outside closes it. */\nexport const ColorField = forwardRef<HTMLButtonElement, ColorFieldProps>(function ColorField(\n {\n value,\n defaultValue = \"#312c7e\",\n onChange,\n size = \"md\",\n isInvalid = false,\n disabled = false,\n placement = \"bottom-start\",\n id,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n ...pickerProps\n },\n ref,\n) {\n const [color, setColor] = useControllableState(value, defaultValue, onChange);\n const [isOpen, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef: triggerRef, floatingRef: panelRef, placement, offset: 6, maxHeight: 640 });\n\n const close = useCallback((reason?: \"outside\" | \"escape\") => {\n setOpen(false);\n if (reason !== \"outside\") triggerRef.current?.focus();\n }, []);\n useDismiss(isOpen, [panelRef, triggerRef], close);\n\n // Focus the colour area when it opens, so the arrow keys work straight away.\n useEffect(() => {\n if (!isOpen) return undefined;\n const frame = requestAnimationFrame(() => panelRef.current?.querySelector<HTMLElement>(\".react-colorful__interactive\")?.focus());\n return () => cancelAnimationFrame(frame);\n }, [isOpen]);\n\n return (\n <>\n <button\n ref={(element) => {\n triggerRef.current = element;\n assignRef(ref, element);\n }}\n id={id}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? panelId : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={[`${panelId}-value`, ariaDescribedBy].filter(Boolean).join(\" \")}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n className={cx(\n \"ow-select\",\n \"ow-color-field\",\n `ow-select--${size}`,\n { \"ow-select--open\": isOpen, \"ow-select--invalid\": isInvalid && !isOpen },\n className,\n )}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !isOpen) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n >\n <span className=\"ow-color-field__swatch\" style={{ \"--ow-color-picker-value\": color } as CSSProperties} aria-hidden=\"true\" />\n <span id={`${panelId}-value`} className=\"ow-select__value ow-color-field__value\">\n {color.toUpperCase()}\n </span>\n <ChevronDownIcon size={size === \"sm\" ? 14 : 16} className=\"ow-select__chevron\" />\n </button>\n {mounted ? (\n <div\n ref={panelRef}\n {...manualPopover}\n data-state={state}\n id={panelId}\n role=\"dialog\"\n aria-label=\"Choose a colour\"\n className=\"ow-popover ow-floating ow-color-field__panel\"\n style={style}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && (event.target as HTMLElement).closest(\".react-colorful\")) close();\n }}\n >\n <ColorPicker {...pickerProps} value={color} onChange={setColor} />\n </div>\n ) : null}\n </>\n );\n});\n", "import type { CSSProperties } from \"react\";\n\n/** The eleven steps of a brand scale, as in --ow-brand-50 \u2026 --ow-brand-950. */\nexport const brandSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const;\n\nexport type BrandStep = (typeof brandSteps)[number];\nexport type BrandScale = Record<BrandStep, string>;\n\nexport interface BrandPreset {\n id: string;\n name: string;\n scale: BrandScale;\n}\n\n// Midnight's lightness and chroma at each step, in OKLCH. Every scale is built on this lightness curve, so white\n// text on step 600 (light) and 500 (dark), and the focus rings on 500 and 400, keep their contrast whatever the hue.\nconst lightness = [0.968, 0.94, 0.89, 0.81, 0.68, 0.53, 0.42, 0.33, 0.27, 0.22, 0.17];\nconst chroma = [0.012, 0.022, 0.04, 0.066, 0.1, 0.135, 0.134, 0.086, 0.072, 0.058, 0.045];\nconst peakChroma = 0.135;\n\ntype Lch = { l: number; c: number; h: number };\n\nfunction parseHex(color: string): [number, number, number] {\n let hex = color.trim().replace(/^#/, \"\");\n if (hex.length === 3 || hex.length === 4) hex = [...hex.slice(0, 3)].map((d) => d + d).join(\"\");\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(hex)) throw new Error(`brandScale: \"${color}\" isn't a hex colour like #2563eb.`);\n return [0, 2, 4].map((i) => parseInt(hex.slice(i, i + 2), 16) / 255) as [number, number, number];\n}\n\nconst toLinear = (v: number) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);\nconst fromLinear = (v: number) => (v <= 0.0031308 ? 12.92 * v : 1.055 * v ** (1 / 2.4) - 0.055);\n\nfunction hexToOklch(color: string): Lch {\n const [r, g, b] = parseHex(color).map(toLinear) as [number, number, number];\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;\n const A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;\n const B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;\n return { l: L, c: Math.hypot(A, B), h: ((Math.atan2(B, A) * 180) / Math.PI + 360) % 360 };\n}\n\nfunction oklchToLinear({ l: L, c, h }: Lch): [number, number, number] {\n const A = c * Math.cos((h * Math.PI) / 180);\n const B = c * Math.sin((h * Math.PI) / 180);\n const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;\n const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;\n const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n}\n\nconst inGamut = (rgb: number[]) => rgb.every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/** The colour at this lightness and hue, with as much of the wanted chroma as sRGB can show. */\nfunction toHex(color: Lch): string {\n let { c } = color;\n if (!inGamut(oklchToLinear(color))) {\n let low = 0;\n let high = c;\n for (let i = 0; i < 24; i += 1) {\n const mid = (low + high) / 2;\n if (inGamut(oklchToLinear({ ...color, c: mid }))) low = mid;\n else high = mid;\n }\n c = low;\n }\n return `#${oklchToLinear({ ...color, c })\n .map((v) => Math.round(Math.min(1, Math.max(0, fromLinear(Math.min(1, Math.max(0, v))))) * 255))\n .map((v) => v.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\n/**\n * Builds the eleven brand steps from one colour: its hue and colourfulness on Openware's lightness curve.\n * The steps keep midnight's contrast in both themes, so your exact colour may land a little lighter or\n * darker than given. A grey gives a neutral scale.\n *\n * `brandScale(\"#0d9488\")` \u2192 `{ 50: \"#ebf7f6\", \u2026, 600: \"#00595a\", \u2026, 950: \"#001414\" }`\n */\nexport function brandScale(color: string): BrandScale {\n const { c, h } = hexToOklch(color);\n const strength = Math.min(1.6, c / peakChroma);\n return Object.fromEntries(brandSteps.map((step, i) => [step, toHex({ l: lightness[i]!, c: chroma[i]! * strength, h })])) as BrandScale;\n}\n\n/** A colour or a scale as the --ow-brand-* custom properties, for a `style` prop or `element.style`. */\nexport function brandVariables(brand: string | BrandScale): CSSProperties {\n const scale = typeof brand === \"string\" ? brandScale(brand) : brand;\n return Object.fromEntries(brandSteps.map((step) => [`--ow-brand-${step}`, scale[step]])) as CSSProperties;\n}\n\n/** A colour or a scale as CSS to paste into a stylesheet. */\nexport function brandCss(brand: string | BrandScale, selector = \":root\"): string {\n const scale = typeof brand === \"string\" ? brandScale(brand) : brand;\n return `${selector} {\\n${brandSteps.map((step) => ` --ow-brand-${step}: ${scale[step]};`).join(\"\\n\")}\\n}`;\n}\n\n/**\n * Rebrands everything inside `element` (the whole page by default) by setting the --ow-brand-* properties on\n * it. Pass `null` to go back to midnight. Elements with their own data-theme set their own brand steps, so\n * give those the same properties, or use brandCss with `:root, [data-theme]` in a stylesheet.\n */\nexport function applyBrand(brand: string | BrandScale | null, element: HTMLElement = document.documentElement) {\n for (const step of brandSteps) element.style.removeProperty(`--ow-brand-${step}`);\n if (brand === null) return;\n const variables = brandVariables(brand) as Record<string, string>;\n for (const [name, value] of Object.entries(variables)) element.style.setProperty(name, value);\n}\n\n/** Seven ready-made scales, each checked for contrast in both themes. Midnight is the default. */\nexport const brandPresets: BrandPreset[] = [\n {\n id: \"midnight\",\n name: \"Midnight\",\n scale: {\n 50: \"#f2f3fc\",\n 100: \"#e7e9f9\",\n 200: \"#d4d7f4\",\n 300: \"#b7bbea\",\n 400: \"#898cd0\",\n 500: \"#5856ad\",\n 600: \"#312c7e\",\n 700: \"#1e1b4b\",\n 800: \"#18163d\",\n 900: \"#13112f\",\n 950: \"#0b0a20\",\n },\n },\n {\n id: \"ocean\",\n name: \"Ocean\",\n scale: {\n 50: \"#edf5fe\",\n 100: \"#dfedfd\",\n 200: \"#c3defa\",\n 300: \"#9ac5f3\",\n 400: \"#5a9de0\",\n 500: \"#006ebe\",\n 600: \"#004f8a\",\n 700: \"#003763\",\n 800: \"#00274a\",\n 900: \"#001b36\",\n 950: \"#001023\",\n },\n },\n {\n id: \"teal\",\n name: \"Teal\",\n scale: {\n 50: \"#ebf7f7\",\n 100: \"#daf1f0\",\n 200: \"#bae4e4\",\n 300: \"#87d0cf\",\n 400: \"#1fadad\",\n 500: \"#007c7c\",\n 600: \"#005959\",\n 700: \"#003e3e\",\n 800: \"#002d2d\",\n 900: \"#002020\",\n 950: \"#001313\",\n },\n },\n {\n id: \"forest\",\n name: \"Forest\",\n scale: {\n 50: \"#eef7f0\",\n 100: \"#e0f0e3\",\n 200: \"#c6e4cd\",\n 300: \"#9ecfaa\",\n 400: \"#5fac76\",\n 500: \"#008240\",\n 600: \"#005d2d\",\n 700: \"#00411d\",\n 800: \"#003014\",\n 900: \"#00220c\",\n 950: \"#001506\",\n },\n },\n {\n id: \"plum\",\n name: \"Plum\",\n scale: {\n 50: \"#f9f2f9\",\n 100: \"#f4e6f4\",\n 200: \"#ead1eb\",\n 300: \"#dab1db\",\n 400: \"#bb80be\",\n 500: \"#95489a\",\n 600: \"#732778\",\n 700: \"#4d2150\",\n 800: \"#39163b\",\n 900: \"#290e2b\",\n 950: \"#1a071b\",\n },\n },\n {\n id: \"rose\",\n name: \"Rose\",\n scale: {\n 50: \"#fef1f1\",\n 100: \"#fce5e6\",\n 200: \"#f8cfd1\",\n 300: \"#eeadb1\",\n 400: \"#d67981\",\n 500: \"#b43b4e\",\n 600: \"#8e1331\",\n 700: \"#5e1924\",\n 800: \"#470f19\",\n 900: \"#330910\",\n 950: \"#210408\",\n },\n },\n {\n id: \"ember\",\n name: \"Ember\",\n scale: {\n 50: \"#fdf2ec\",\n 100: \"#fae7dd\",\n 200: \"#f5d3c0\",\n 300: \"#eab395\",\n 400: \"#d18254\",\n 500: \"#a94e00\",\n 600: \"#7b3700\",\n 700: \"#572500\",\n 800: \"#411900\",\n 900: \"#2f1100\",\n 950: \"#1e0800\",\n },\n },\n];\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAsE;;;ACG/D,SAAS,MAAM,QAA8B;AAChD,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,QAAQ;AACxB,QAAI,CAAC,MAAO;AACZ,QAAI,OAAO,UAAU,UAAU;AAC3B,cAAQ,KAAK,KAAK;AAClB;AAAA,IACJ;AACA,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,KAAK,EAAG,KAAI,GAAI,SAAQ,KAAK,IAAI;AAAA,EAC7E;AACA,SAAO,QAAQ,KAAK,GAAG;AAC3B;;;ACbO,SAAS,YAAY,MAAsB;AAC9C,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACrD,QAAM,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAK;AAC/B,QAAM,OAAO,MAAM,SAAS,IAAK,MAAM,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,KAAM;AAEvE,SAAO,GAAG,KAAK,GAAG,IAAI,GAAG,YAAY;AACzC;AAGO,SAAS,eAAe,UAA0B;AACrD,SAAO,SAAS,QAAQ,UAAK,OAAO,EAAE,QAAQ,SAAS,UAAU;AACrE;;;ACMQ;AAFD,SAAS,QAAQ,EAAE,OAAO,MAAM,OAAO,WAAW,QAAQ,WAAW,UAAU,GAAiB;AACnG,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,cAAc,eAAe,IAAI,IAAI,eAAe,IAAI,IAAI,SAAS;AAAA,MAClF,GAAI,QAAQ,EAAE,MAAM,UAAU,cAAc,MAAM,IAAI,EAAE,eAAe,KAAK;AAAA;AAAA,EACjF;AAER;;;AH2D8B,IAAAA,sBAAA;AAtCvB,SAAS,gBAAgB;AAAA,EAC5B,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AACf,IAAwB,CAAC,GAAW;AAChC,SAAO;AAAA,IACH;AAAA,IACA,cAAc,OAAO;AAAA,IACrB,cAAc,IAAI;AAAA,IAClB,UAAU,UAAU;AAAA,IACpB,YAAY;AAAA,EAChB;AACJ;AAMO,IAAM,aAAS,yBAA2C,SAASC,QACtE;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,GAAG;AACP,GACA,KACF;AACE,QAAM,UAAU,UAAU,6CAAC,WAAQ,MAAK,MAAK,MAAK,WAAU,OAAM,IAAG,IAAK;AAC1E,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP,gBAAgB,EAAE,SAAS,MAAM,OAAO,SAAS,CAAC;AAAA,QAClD,YAAY,CAAC,YAAY;AAAA,QACzB,WAAW;AAAA,QACX,aAAa;AAAA,QACb;AAAA,MACJ;AAAA,MACA;AAAA,MACA,UAAU,YAAY;AAAA,MACtB,aAAW,WAAW;AAAA,MACtB,qBAAmB,WAAW,eAAe,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,MAEH;AAAA,kBAAU,6CAAC,UAAK,WAAU,mBAAmB,mBAAQ,IAAU;AAAA,QAC/D,YAAY,UAAU,OAAO;AAAA,QAC7B,WAAW,CAAC,WAAW,6CAAC,UAAK,WAAU,mBAAmB,mBAAQ,IAAU;AAAA,QAC5E,YAAY,CAAC,WACV,6CAAC,SAAI,eAAY,QAAO,WAAU,uBAC7B,oBACL,IACA;AAAA;AAAA;AAAA,EACR;AAER,CAAC;;;AI7GD,IAAAC,gBAA2E;;;ACA3E,IAAAC,gBAA8C;AAMvC,SAAS,qBACZ,OACA,cACA,UAC6C;AAC7C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAY,YAAY;AACxD,QAAM,eAAe,UAAU;AAC/B,QAAM,UAAU,eAAe,QAAQ;AACvC,QAAM,iBAAa,sBAAO,OAAO;AACjC,aAAW,UAAU;AACrB,QAAM,kBAAc,sBAAO,QAAQ;AACnC,cAAY,UAAU;AAEtB,QAAM,eAAW;AAAA,IACb,CAAC,SAAmC;AAChC,YAAM,WACF,OAAO,SAAS,aAAc,KAA4B,WAAW,OAAO,IAAI;AACpF,UAAI,OAAO,GAAG,UAAU,WAAW,OAAO,EAAG;AAC7C,UAAI,CAAC,aAAc,aAAY,QAAQ;AACvC,kBAAY,UAAU,QAAQ;AAAA,IAClC;AAAA,IACA,CAAC,YAAY;AAAA,EACjB;AAEA,SAAO,CAAC,SAAS,QAAQ;AAC7B;;;ACjBY,IAAAC,sBAAA;AAHZ,SAAS,KAAK,OAAkB;AAC5B,SAAO,SAAS,KAAK,EAAE,OAAO,IAAI,cAAc,GAAG,GAAG,MAAM,GAAc;AACtE,WACI;AAAA,MAAC;AAAA;AAAA,QACG,OAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,QAAO;AAAA,QACP;AAAA,QACA,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,eAAY;AAAA,QACZ,WAAU;AAAA,QACT,GAAG;AAAA,QAEH;AAAA;AAAA,IACL;AAAA,EAER;AACJ;AAEO,IAAM,YAAY,KAAK,6CAAC,UAAK,GAAE,mBAAkB,CAAE;AACnD,IAAM,kBAAkB,KAAK,6CAAC,UAAK,GAAE,gBAAe,CAAE;AACtD,IAAM,aAAa;AAAA,EACtB,8EACI;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,kBAAiB;AAAA,KAC7B;AACJ;AACO,IAAM,qBAAqB;AAAA,EAC9B,8EACI;AAAA,iDAAC,cAAS,QAAO,kBAAiB;AAAA,IAClC,6CAAC,UAAK,GAAE,2BAA0B;AAAA,KACtC;AACJ;AACO,IAAM,QAAQ;AAAA,EACjB,8EACI;AAAA,iDAAC,UAAK,GAAE,cAAa;AAAA,IACrB,6CAAC,UAAK,GAAE,cAAa;AAAA,KACzB;AACJ;AACO,IAAM,WAAW;AAAA,EACpB,8EACI;AAAA,iDAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,6CAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI;AAAA,KACjC;AACJ;AACO,IAAM,YAAY;AAAA,EACrB,8EACI;AAAA,iDAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,yCAAwC;AAAA,IAChD,6CAAC,UAAK,GAAE,sCAAqC;AAAA,IAC7C,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,IACtC,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,KAC1C;AACJ;AACO,IAAM,kBAAkB;AAAA,EAC3B,8EACI;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,6CAAC,UAAK,GAAE,iBAAgB;AAAA,KAC5B;AACJ;AACO,IAAM,kBAAkB;AAAA,EAC3B,8EACI;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,IACrC,6CAAC,UAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,MAAK,IAAG,MAAK;AAAA,KAC7C;AACJ;AACO,IAAM,mBAAmB,KAAK,6CAAC,UAAK,GAAE,iBAAgB,CAAE;AACxD,IAAM,kBAAkB,KAAK,6CAAC,UAAK,GAAE,kBAAiB,CAAE;AACxD,IAAM,gBAAgB,KAAK,6CAAC,UAAK,GAAE,kBAAiB,CAAE;AACtD,IAAM,YAAY,KAAK,6CAAC,UAAK,GAAE,YAAW,CAAE;AAC5C,IAAM,WAAW;AAAA,EACpB,8EACI;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AACJ;AACO,IAAM,WAAW;AAAA,EACpB,8EACI;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,6CAAC,UAAK,GAAE,aAAY;AAAA,IACpB,6CAAC,UAAK,GAAE,aAAY;AAAA,KACxB;AACJ;AACO,IAAM,oBAAoB;AAAA,EAC7B,8EACI;AAAA,iDAAC,UAAK,GAAE,4EAA2E;AAAA,IACnF,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,cAAa;AAAA,KACzB;AACJ;AACO,IAAM,cAAc;AAAA,EACvB,8EACI;AAAA,iDAAC,UAAK,GAAE,mBAAkB;AAAA,IAC1B,6CAAC,UAAK,GAAE,gBAAe;AAAA,IACvB,6CAAC,UAAK,GAAE,gGAA+F;AAAA,KAC3G;AACJ;AACO,IAAM,WAAW;AAAA,EACpB,8EACI;AAAA,iDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,IACvD,6CAAC,UAAK,GAAE,2DAA0D;AAAA,KACtE;AACJ;AACO,IAAM,eAAe;AAAA,EACxB,8EACI;AAAA,iDAAC,UAAK,GAAE,UAAS;AAAA,IACjB,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AACJ;AACO,IAAM,WAAW;AAAA,EACpB,8EACI;AAAA,iDAAC,UAAK,GAAE,8DAA6D;AAAA,IACrE,6CAAC,UAAK,GAAE,2BAA0B;AAAA,KACtC;AACJ;AACO,IAAM,aAAa;AAAA,EACtB,6CAAC,UAAK,GAAE,0HAAyH;AACrI;AACO,IAAM,iBAAiB;AAAA,EAC1B,6CAAC,UAAK,GAAE,qLAAoL;AAChM;AACO,IAAM,aAAa;AAAA,EACtB,8EACI;AAAA,iDAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,6CAAC,cAAS,QAAO,iBAAgB;AAAA,IACjC,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,KACzC;AACJ;AACO,IAAM,mBAAmB;AAAA,EAC5B,8EACI;AAAA,iDAAC,UAAK,GAAE,cAAa;AAAA,IACrB,6CAAC,UAAK,GAAE,cAAa;AAAA,KACzB;AACJ;AACO,IAAM,cAAc;AAAA,EACvB,8EACI;AAAA,iDAAC,UAAK,GAAE,iBAAgB;AAAA,IACxB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AACJ;AACO,IAAM,gBAAgB;AAAA,EACzB,8EACI;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,kBAAiB;AAAA,KAC7B;AACJ;AACO,IAAM,qBAAqB;AAAA,EAC9B,8EACI;AAAA,iDAAC,UAAK,GAAE,iBAAgB;AAAA,IACxB,6CAAC,UAAK,GAAE,gBAAe;AAAA,KAC3B;AACJ;AACO,IAAM,YAAY;AAAA,EACrB,8EACI;AAAA,iDAAC,cAAS,QAAO,qCAAoC;AAAA,IACrD,6CAAC,UAAK,GAAE,8GAA6G;AAAA,KACzH;AACJ;AACO,IAAM,eAAe;AAAA,EACxB,8EACI;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI;AAAA,KACjC;AACJ;;;AFpKQ,IAAAC,sBAAA;AAFD,SAAS,YAAY,EAAE,WAAW,MAAM,cAAc,cAAc,WAAW,GAAG,MAAM,GAAqB;AAChH,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAW;AAAA,QACP;AAAA,QACA,YAAY;AAAA,QACZ,gBAAgB,cAAc;AAAA,QAC9B;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;AAYO,IAAM,kBAAc,0BAAgD,SAASC,aAChF,EAAE,OAAO,MAAM,QAAQ,SAAS,WAAW,OAAO,UAAU,GAAG,YAAY,GAC3E,KACF;AACE,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,cAAY;AAAA,MACZ,WAAW,GAAG,mBAAmB,oBAAoB,IAAI,IAAI,SAAS;AAAA,MACrE,GAAG;AAAA,MAEJ,uDAAC,SAAM,MAAM,SAAS,OAAO,KAAK,IAAI;AAAA;AAAA,EAC1C;AAER,CAAC;AAcM,IAAM,mBAAe,0BAAiD,SAASC,cAClF,EAAE,SAAS,iBAAiB,OAAO,iBAAiB,SAAS,WAAW,UAAU,aAAa,GAAG,YAAY,GAC9G,KACF;AACE,QAAM,CAAC,WAAW,UAAU,IAAI,qBAAqB,SAAS,gBAAgB,eAAe;AAC7F,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,gBAAc;AAAA,MACd,WAAW,GAAG,aAAa,sBAAsB,SAAS;AAAA,MAC1D,SAAS,CAAC,UAAU;AAChB,kBAAU,KAAK;AACf,YAAI,CAAC,MAAM,iBAAkB,YAAW,CAAC,SAAS;AAAA,MACtD;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER,CAAC;;;AGxFD,IAAAC,gBAA2D;;;ACA3D,IAAAC,gBAAgD;AAQzC,SAAS,aAAa,cAA6C,UAAkB,KAAc;AACtG,qCAAgB,MAAM;AAClB,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW,QAAO;AACvB,QAAI,QAAQ;AAEZ,UAAM,UAAU,MAAM;AAClB,YAAM,WAAW,UAAU,cAA2B,QAAQ;AAC9D,UAAI,CAAC,UAAU;AACX,eAAO,UAAU,QAAQ;AACzB;AAAA,MACJ;AACA,gBAAU,MAAM,YAAY,oBAAoB,GAAG,SAAS,UAAU,IAAI;AAC1E,gBAAU,MAAM,YAAY,oBAAoB,GAAG,SAAS,SAAS,IAAI;AACzE,gBAAU,MAAM,YAAY,oBAAoB,GAAG,SAAS,WAAW,IAAI;AAC3E,gBAAU,MAAM,YAAY,oBAAoB,GAAG,SAAS,YAAY,IAAI;AAC5E,UAAI,CAAC,UAAU,QAAQ,WAAW;AAC9B,kBAAU,QAAQ,YAAY;AAC9B,gBAAQ,sBAAsB,MAAM;AAChC,kBAAQ,sBAAsB,MAAM;AAChC,gBAAI,UAAU,QAAQ,UAAW,WAAU,QAAQ,YAAY;AAAA,UACnE,CAAC;AAAA,QACL,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,YAAQ;AACR,QAAI,OAAO,mBAAmB,YAAa,QAAO,MAAM,qBAAqB,KAAK;AAClF,UAAM,WAAW,IAAI,eAAe,OAAO;AAC3C,aAAS,QAAQ,SAAS;AAC1B,eAAW,SAAS,UAAU,SAAU,UAAS,QAAQ,KAAK;AAC9D,WAAO,MAAM;AACT,2BAAqB,KAAK;AAC1B,eAAS,WAAW;AAAA,IACxB;AAAA,EACJ,GAAG,CAAC,cAAc,UAAU,GAAG,CAAC;AACpC;;;ADqCoB,IAAAC,sBAAA;AA3Cb,SAAS,iBAAiB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACP,GAA0B;AACtB,QAAM,CAAC,SAAS,UAAU,IAAI,qBAAqB,OAAO,gBAAgB,QAAQ,CAAC,GAAG,SAAS,IAAI,QAAQ;AAC3G,QAAM,WAAO,sBAAwC,CAAC,CAAC;AACvD,QAAM,eAAW,sBAAuB,IAAI;AAC5C,eAAa,UAAU,yBAAyB,OAAO;AACvD,QAAM,UAAU,QAAQ,IAAI,CAAC,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,MAAM,CAAC,OAAO,QAAQ;AAE3G,WAAS,UAAU,OAAyC,OAAe;AACvE,UAAM,OAA+B,EAAE,YAAY,GAAG,WAAW,GAAG,WAAW,IAAI,SAAS,GAAG;AAC/F,QAAI;AACJ,QAAI,MAAM,OAAO,MAAM;AACnB,YAAM,WAAW,QAAQ,UAAU,CAAC,UAAU,MAAM,UAAU,KAAK;AACnE,eAAS,SAAS,WAAW,KAAK,MAAM,GAAG,IAAK,QAAQ,UAAU,QAAQ,MAAM,GAAG;AAAA,IACvF,WAAW,MAAM,QAAQ,OAAQ,UAAS,QAAQ,CAAC,GAAG;AAAA,aAC7C,MAAM,QAAQ,MAAO,UAAS,QAAQ,QAAQ,SAAS,CAAC,GAAG;AACpE,QAAI,WAAW,OAAW;AAC1B,UAAM,eAAe;AACrB,SAAK,QAAQ,MAAM,GAAG,MAAM;AAC5B,eAAW,QAAQ,MAAM,EAAG,KAAK;AAAA,EACrC;AAEA,QAAM,YAAY,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,WAAW,CAAC,OAAO,QAAQ,IAAI,UAAU,QAAQ,CAAC,GAAG,OAAO;AAExH,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAW,GAAG,gBAAgB,iBAAiB,IAAI,IAAI,aAAa,sBAAsB,YAAY,0BAA0B,SAAS;AAAA,MACxI,GAAG;AAAA,MAEH;AAAA,gBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC5B,gBAAM,aAAa,OAAO,UAAU;AACpC,iBACI;AAAA,YAAC;AAAA;AAAA,cAEG,KAAK,CAAC,YAAY;AACd,qBAAK,QAAQ,KAAK,IAAI;AAAA,cAC1B;AAAA,cACA,MAAK;AAAA,cACL,MAAK;AAAA,cACL,gBAAc;AAAA,cACd,cAAY,OAAO,YAAY;AAAA,cAC/B,UAAU,OAAO,UAAU,YAAY,IAAI;AAAA,cAC3C,UAAU,YAAY,OAAO;AAAA,cAC7B,WAAW,GAAG,sBAAsB,cAAc,8BAA8B;AAAA,cAChF,SAAS,MAAM,WAAW,OAAO,KAAK;AAAA,cACtC,WAAW,CAAC,UAAU,UAAU,OAAO,KAAK;AAAA,cAE3C;AAAA,uBAAO,OAAO,6CAAC,UAAK,WAAU,sBAAsB,iBAAO,MAAK,IAAU;AAAA,gBAC1E,OAAO;AAAA;AAAA;AAAA,YAfH,OAAO;AAAA,UAgBhB;AAAA,QAER,CAAC;AAAA,QACD,6CAAC,UAAK,WAAU,gBAAe,eAAY,QAAO;AAAA;AAAA;AAAA,EACtD;AAER;;;AExGA,IAAAC,gBAAsE;AA8B1D,IAAAC,sBAAA;AAZL,IAAM,iBAAa,0BAA+C,SAASC,YAC9E,EAAE,WAAW,aAAa,MAAAC,OAAM,cAAc,OAAO,UAAU,OAAO,OAAO,UAAU,GAAG,YAAY,GACtG,KACF;AACE,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,aAAa,eAAe,0BAA0B,SAAS;AAAA,MAC7E;AAAA,MACA,qBAAmB,WAAW,eAAe,QAAQ,IAAI;AAAA,MACxD,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,WAAU,kBACZ;AAAA,uDAAC,UAAK,WAAU,mBAAmB,UAAAA,OAAK;AAAA,UACvC,WACG,6CAAC,SAAI,eAAY,QAAO,WAAU,uBAC7B,oBACL,IACA;AAAA,WACR;AAAA,QACA,8CAAC,UAAK,WAAU,mBACZ;AAAA,uDAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA,UAC1C,6CAAC,UAAK,WAAU,0BAA0B,uBAAY;AAAA,WAC1D;AAAA;AAAA;AAAA,EACJ;AAER,CAAC;;;AC5CD,IAAAC,gBAA4D;;;ACC5D,eAAsB,SAAS,MAAgC;AAC3D,MAAI;AACA,UAAM,UAAU,UAAU,UAAU,IAAI;AACxC,WAAO;AAAA,EACX,QAAQ;AACJ,UAAM,OAAO,SAAS,cAAc,UAAU;AAC9C,SAAK,QAAQ;AACb,SAAK,aAAa,YAAY,EAAE;AAChC,SAAK,MAAM,WAAW;AACtB,SAAK,MAAM,UAAU;AACrB,aAAS,KAAK,YAAY,IAAI;AAC9B,SAAK,OAAO;AACZ,QAAI,KAAK;AACT,QAAI;AACA,WAAK,SAAS,YAAY,MAAM;AAAA,IACpC,QAAQ;AACJ,WAAK;AAAA,IACT;AACA,SAAK,OAAO;AACZ,WAAO;AAAA,EACX;AACJ;;;AD6BY,IAAAC,sBAAA;AAzBL,SAAS,WAAW,EAAE,OAAO,QAAQ,QAAQ,cAAc,UAAU,WAAW,OAAO,OAAO,WAAW,QAAQ,UAAU,GAAoB;AAClJ,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,YAAQ,sBAAO,CAAC;AACtB,+BAAU,MAAM,MAAM,OAAO,aAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AAE5D,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAW;AAAA,QACP;AAAA,QACA,SAAS,YAAY;AAAA,QACrB,YAAY;AAAA,QACZ,UAAU;AAAA,QACV;AAAA,MACJ;AAAA,MACA,cAAY,WAAY,SAAS,cAAc,QAAS;AAAA,MACxD,SAAS,YAAY;AACjB,YAAI,MAAM,SAAS,KAAK,GAAG;AACvB,oBAAU,IAAI;AACd,mBAAS;AACT,iBAAO,aAAa,MAAM,OAAO;AACjC,gBAAM,UAAU,OAAO,WAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,QAClE;AAAA,MACJ;AAAA,MAEA;AAAA,sDAAC,UAAK,WAAU,wBAAuB,eAAY,QAC/C;AAAA,uDAAC,YAAS,MAAM,IAAI;AAAA,UACpB,6CAAC,aAAU,MAAM,IAAI;AAAA,WACzB;AAAA,QACC,WAAW,OAAO,6CAAC,UAAM,mBAAS,cAAc,OAAM;AAAA,QACvD,6CAAC,UAAK,WAAU,sBAAqB,aAAU,UAC1C,mBAAS,cAAc,IAC5B;AAAA;AAAA;AAAA,EACJ;AAER;AAqBO,SAAS,UAAU,EAAE,MAAM,MAAM,OAAO,UAAU,kBAAkB,OAAO,WAAW,MAAM,WAAW,UAAU,GAAmB;AACvI,QAAM,YAAY,UAAU,UAAa,aAAa;AACtD,QAAM,QAAQ,KAAK,QAAQ,OAAO,EAAE,EAAE,MAAM,IAAI;AAChD,SACI,8CAAC,SAAI,WAAW,GAAG,iBAAiB,mBAAmB,2BAA2B,SAAS,GACtF;AAAA,gBACG,8CAAC,SAAI,WAAU,yBACX;AAAA,mDAAC,UAAK,WAAU,wBAAwB,iBAAM;AAAA,MAC7C,WAAW,6CAAC,UAAK,WAAU,2BAA2B,oBAAS,IAAU;AAAA,MACzE,WAAW,6CAAC,cAAW,OAAO,MAAM,MAAK,UAAS,UAAQ,MAAC,OAAM,aAAY,IAAK;AAAA,OACvF,IACA,WACA,6CAAC,cAAW,OAAO,MAAM,MAAK,UAAS,UAAQ,MAAC,OAAM,aAAY,WAAU,gCAA+B,IAC3G;AAAA,IACJ,8CAAC,SAAI,WAAU,sBAAqB,OAAO,YAAY,EAAE,UAAU,IAAI,QAAW,UAAU,GACvF;AAAA,wBACG,6CAAC,UAAK,WAAU,0BAAyB,eAAY,QAChD,gBAAM,IAAI,CAAC,GAAG,UACX,6CAAC,UAAkB,kBAAQ,KAAhB,KAAkB,CAChC,GACL,IACA;AAAA,MACH,OACG,6CAAC,UAAK,WAAU,uBAAsB,yBAAyB,EAAE,QAAQ,KAAK,GAAG,IAEjF,6CAAC,UAAK,WAAU,uBAAuB,eAAK,QAAQ,OAAO,EAAE,GAAE;AAAA,OAEvE;AAAA,KACJ;AAER;AAYO,SAAS,QAAQ,EAAE,OAAO,SAAS,KAAK,UAAU,GAAiB;AACtE,SACI,8CAAC,SAAI,WAAW,GAAG,cAAc,SAAS,GACtC;AAAA,kDAAC,UAAK,WAAU,oBACX;AAAA,eACG,6CAAC,UAAK,WAAU,sBAAqB,eAAY,QAC5C,kBACL,IACA;AAAA,MACH;AAAA,OACL;AAAA,IACA,6CAAC,cAAW,OAAc,UAAQ,MAAC,OAAO,QAAQ,KAAK,IAAI;AAAA,KAC/D;AAER;;;AE1IA,IAAAC,gBAAuF;AAwC/E,IAAAC,sBAAA;AAnBD,SAAS,MAAM,EAAE,OAAO,UAAU,MAAM,OAAO,UAAU,GAAe;AAC3E,QAAM,kBAAc,qBAAM;AAC1B,QAAM,SAAS,GAAG,WAAW;AAC7B,QAAM,UAAU,GAAG,WAAW;AAE9B,QAAM,YAAQ,8BAAwC,QAAQ,IAAI,WAAW;AAC7E,QAAM,YAAa,OAAO,MAAM,MAA6B,GAAG,WAAW;AAC3E,QAAM,cACF,CAAC,OAAO,MAAM,kBAAkB,GAAyB,OAAO,SAAS,QAAW,QAAQ,UAAU,MAAS,EAC1G,OAAO,OAAO,EACd,KAAK,GAAG,KAAK;AAGtB,QAAM,cACF,SAAS,OAAO,MAAM,SAAS,WACzB,EAAE,WAAY,MAAM,MAAM,aAAqC,QAAQ,KAAK,EAAE,IAC9E,EAAE,gBAAgB,QAAQ,OAAO,OAAU;AAErD,SACI,8CAAC,SAAI,WAAW,GAAG,YAAY,SAAS,GACpC;AAAA,iDAAC,WAAM,WAAU,mBAAkB,SAAS,WACvC,iBACL;AAAA,IACC,YACK,4BAAa,OAAO,EAAE,IAAI,WAAW,oBAAoB,aAAa,GAAG,YAAY,CAAC,IACtF;AAAA,IACL,OACG,6CAAC,OAAE,IAAI,QAAQ,WAAU,kBACpB,gBACL,IACA;AAAA,IACH,QACG,6CAAC,OAAE,IAAI,SAAS,MAAK,SAAQ,WAAU,mBAClC,iBACL,IACA;AAAA,KACR;AAER;;;AC3DA,IAAAC,gBAAqE;AA4BzD,IAAAC,sBAAA;AAPL,IAAM,YAAQ,0BAAyC,SAASC,OACnE,EAAE,WAAW,YAAY,OAAO,OAAO,MAAM,cAAc,YAAY,GAAG,WAAW,GACrF,KACF;AACE,QAAM,UAAU,aAAa;AAC7B,MAAI,iBAAiB,UAAa,eAAe,QAAW;AACxD,WACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,YAAY,SAAS,QAAQ,gBAAgB,aAAa,qBAAqB,SAAS;AAAA,QACtG,gBAAc;AAAA,QACb,GAAG;AAAA;AAAA,IACR;AAAA,EAER;AACA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,aAAa;AAAA,QACb,WAAW,YAAY;AAAA,QACvB;AAAA,MACJ;AAAA,MAEC;AAAA,yBAAiB,SAAY,6CAAC,UAAK,WAAU,yBAAyB,wBAAa,IAAU;AAAA,QAC9F,6CAAC,WAAM,KAAU,WAAU,yBAAwB,gBAAc,SAAU,GAAG,YAAY;AAAA,QACzF,eAAe,SAAY,6CAAC,UAAK,WAAU,yBAAyB,sBAAW,IAAU;AAAA;AAAA;AAAA,EAC9F;AAER,CAAC;;;ACnDD,IAAAC,iBAA0E;AAyEhD,IAAAC,uBAAA;AAjD1B,SAAS,UAAa,KAAsB,OAAiB;AACzD,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,KAAI,UAAU;AAChC;AAGO,IAAM,kBAAc,2BAA+C,SAASC,aAC/E;AAAA,EACI;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,cAAc,YAAY;AAAA,EAC1B,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACP,GACA,KACF;AACE,QAAM,CAAC,MAAM,OAAO,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAC1E,QAAM,eAAW,uBAAgC,IAAI;AAErD,WAAS,cAAc,OAAwC;AAC3D,gBAAY,KAAK;AACjB,QAAI,MAAM,iBAAkB;AAC5B,QAAI,MAAM,QAAQ,YAAY,MAAM;AAChC,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,cAAQ,EAAE;AAAA,IACd,WAAW,MAAM,QAAQ,SAAS;AAC9B,iBAAW,IAAI;AAAA,IACnB;AAAA,EACJ;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK,CAAC,YAAY;AACd,iBAAS,UAAU;AACnB,kBAAU,KAAK,OAAO;AAAA,MAC1B;AAAA,MACA,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,cAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU,CAAC,UAAU,QAAQ,MAAM,OAAO,KAAK;AAAA,MAC/C,WAAW;AAAA,MACX,cAAc,8CAAC,cAAW,MAAM,SAAS,OAAO,KAAK,IAAI;AAAA,MACzD,YACI,UACI,8CAAC,WAAQ,MAAK,MAAK,OAAM,aAAY,IACrC,OACA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,OAAM;AAAA,UACN,SAAS,MAAM;AACX,oBAAQ,EAAE;AACV,qBAAS,SAAS,MAAM;AAAA,UAC5B;AAAA;AAAA,MACJ,IACA;AAAA,MAEP,GAAG;AAAA;AAAA,EACR;AAER,CAAC;;;AC3FD,IAAAC,iBAAmF;AAyG3E,IAAAC,uBAAA;AA7ER,IAAM,WAAW,CAAC,UAAkB,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAG/D,IAAM,kBAAc,2BAA+C,SAASC,aAC/E;AAAA,EACI;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GACA,KACF;AACE,QAAM,CAAC,QAAQ,SAAS,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAC9E,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAwB,IAAI;AACtD,QAAM,SAAS,CAAC,MACZ,MAAM,OAAO,KAAK,gBAAgB,IAAI,KAAK,aAAa,QAAW,aAAa,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC;AAE1G,QAAM,QAAQ,CAAC,MAAc;AACzB,UAAM,UAAU,OAAO,EAAE,QAAQ,SAAS,IAAI,CAAC,CAAC;AAChD,WAAO,KAAK,IAAI,OAAO,UAAU,KAAK,IAAI,OAAO,WAAW,OAAO,CAAC;AAAA,EACxE;AAGA,WAAS,OAAO,MAAc,cAAc,OAAO;AAC/C,aAAS,cAAc,OAAO,IAAI;AAClC,UAAM,UAAU,KAAK,QAAQ,aAAa,EAAE,EAAE,QAAQ,KAAK,GAAG;AAC9D,QAAI,YAAY,MAAM,YAAY,KAAK;AACnC,gBAAU,IAAI;AACd;AAAA,IACJ;AACA,UAAM,SAAS,OAAO,OAAO;AAC7B,QAAI,OAAO,MAAM,MAAM,EAAG;AAC1B,UAAM,OAAO,MAAM,MAAM;AACzB,cAAU,IAAI;AACd,QAAI,YAAa,UAAS,OAAO,IAAI,CAAC;AAAA,EAC1C;AAEA,WAAS,OAAO,UAAkB;AAC9B,UAAM,OAAO,UAAU,QAAQ,UAAU,MAAM,CAAC,OAAO,MAAM,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,IAAK,UAAU,OAAO;AAChH,UAAM,OAAO,MAAM,OAAO,OAAO,QAAQ;AACzC,cAAU,IAAI;AACd,QAAI,UAAU,KAAM,UAAS,OAAO,IAAI,CAAC;AAAA,EAC7C;AAEA,WAAS,cAAc,OAAwC;AAC3D,gBAAY,KAAK;AACjB,QAAI,MAAM,iBAAkB;AAC5B,UAAM,QAAoC;AAAA,MACtC,SAAS,MAAM,OAAO,CAAC;AAAA,MACvB,WAAW,MAAM,OAAO,EAAE;AAAA,MAC1B,QAAQ,MAAM,OAAO,EAAE;AAAA,MACvB,UAAU,MAAM,OAAO,GAAG;AAAA,MAC1B,MAAM,MAAM,QAAQ,UAAa,OAAO,OAAO,GAAG,GAAG,UAAU,IAAI;AAAA,MACnE,KAAK,MAAM,QAAQ,UAAa,OAAO,OAAO,GAAG,GAAG,UAAU,IAAI;AAAA,MAClE,OAAO,MAAM,UAAU,QAAQ,OAAO,OAAO,IAAI;AAAA,IACrD;AACA,UAAM,OAAO,MAAM,MAAM,GAAG;AAC5B,QAAI,CAAC,KAAM;AACX,UAAM,eAAe;AACrB,SAAK;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,UAAa,WAAW,QAAQ,UAAU;AAChE,QAAM,QAAQ,QAAQ,UAAa,WAAW,QAAQ,UAAU;AAEhE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,aAAa;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU;AAAA,YACV,UAAU,YAAY;AAAA,YACtB,SAAS,MAAM,OAAO,EAAE;AAAA,YAExB,wDAAC,aAAU,MAAM,IAAI;AAAA;AAAA,QACzB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,MAAK;AAAA,YACL,WAAW,SAAS,IAAI,IAAI,MAAM,OAAO,KAAK,IAAI,YAAY;AAAA,YAC9D,MAAK;AAAA,YACL,cAAa;AAAA,YACb,WAAU;AAAA,YACV,iBAAe,UAAU;AAAA,YACzB,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,kBAAgB,WAAW,OAAO,SAAY,OAAO,MAAM;AAAA,YAC3D,gBAAc,aAAa;AAAA,YAC3B;AAAA,YACA,OAAO,SAAS,OAAO,MAAM;AAAA,YAC7B,SAAS,CAAC,UAAU;AAChB,wBAAU,KAAK;AACf,uBAAS,WAAW,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,YAClD;AAAA,YACA,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,YAChD,QAAQ,CAAC,UAAU;AACf,uBAAS,KAAK;AACd,qBAAO,MAAM,OAAO,KAAK;AAAA,YAC7B;AAAA,YACA,WAAW;AAAA,YACV,GAAG;AAAA;AAAA,QACR;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAW;AAAA,YACX,UAAU;AAAA,YACV,UAAU,YAAY;AAAA,YACtB,SAAS,MAAM,OAAO,CAAC;AAAA,YAEvB,wDAAC,YAAS,MAAM,IAAI;AAAA;AAAA,QACxB;AAAA;AAAA;AAAA,EACJ;AAER,CAAC;;;AClKD,IAAAC,iBAAgE;AA+GhD,IAAAC,uBAAA;AA3ET,SAAS,SAAS;AAAA,EACrB,SAAS;AAAA,EACT;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,cAAc,YAAY;AAAA,EAC1B;AAAA,EACA;AACJ,GAAkB;AACd,QAAM,CAAC,MAAM,OAAO,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAC1E,QAAM,WAAO,uBAAuC,CAAC,CAAC;AAGtD,QAAM,aAAS,uBAAO,IAAI;AAC1B,SAAO,UAAU;AACjB,QAAM,UAAU,SAAS,YAAY,OAAO;AAC5C,QAAM,QAAQ,CAAC,SAAiB,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,SAAS,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY;AACpG,QAAM,QAAQ,MAAM,KAAK,EAAE,OAAO,GAAG,CAAC,GAAG,UAAU,KAAK,KAAK,KAAK,EAAE;AAEpE,WAAS,OAAO,MAAc,YAAoB;AAC9C,UAAM,UAAU,KAAK,MAAM,GAAG,MAAM;AACpC,WAAO,UAAU;AACjB,YAAQ,OAAO;AACf,SAAK,QAAQ,KAAK,IAAI,YAAY,SAAS,CAAC,CAAC,GAAG,MAAM;AACtD,QAAI,QAAQ,WAAW,UAAU,CAAC,QAAQ,SAAS,GAAG,EAAG,cAAa,OAAO;AAAA,EACjF;AAEA,WAAS,MAAM,OAAe,MAAc;AACxC,UAAM,OAAO,MAAM,IAAI,CAAC,UAAU,MAAO,MAAM,QAAQ,OAAO,QAAS;AAEvE,UAAM,WAAW,KAAK,QAAQ,EAAE;AAChC,YAAQ,aAAa,KAAK,OAAO,KAAK,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAAA,EACrE;AAEA,WAAS,QAAQ,OAAe,MAAc;AAC1C,UAAM,QAAQ,MAAM,IAAI;AACxB,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,SAAS,GAAG;AAElB,aAAO,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,OAAO,QAAQ,MAAM,MAAM;AACnE;AAAA,IACJ;AACA,WAAO,MAAM,OAAO,KAAK,GAAG,QAAQ,CAAC;AAAA,EACzC;AAEA,WAAS,UAAU,OAAe,OAAwC;AACtE,QAAI,MAAM,QAAQ,aAAa;AAC3B,YAAM,eAAe;AAErB,UAAI,MAAM,KAAK,EAAG,QAAO,KAAK,MAAM,GAAG,KAAK,IAAI,KAAK,MAAM,QAAQ,CAAC,GAAG,KAAK;AAAA,eACnE,QAAQ,EAAG,QAAO,KAAK,MAAM,GAAG,QAAQ,CAAC,IAAI,KAAK,MAAM,KAAK,GAAG,QAAQ,CAAC;AAAA,IACtF,WAAW,MAAM,QAAQ,aAAa;AAClC,YAAM,eAAe;AACrB,WAAK,QAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,GAAG,MAAM;AAAA,IAChD,WAAW,MAAM,QAAQ,cAAc;AACnC,YAAM,eAAe;AACrB,WAAK,QAAQ,KAAK,IAAI,SAAS,GAAG,QAAQ,GAAG,KAAK,MAAM,CAAC,GAAG,MAAM;AAAA,IACtE;AAAA,EACJ;AAEA,WAAS,QAAQ,OAAe,OAAyC;AACrE,UAAM,eAAe;AACrB,UAAM,SAAS,MAAM,MAAM,cAAc,QAAQ,MAAM,CAAC;AACxD,QAAI,OAAQ,QAAO,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,QAAQ,QAAQ,OAAO,MAAM;AAAA,EACrF;AAEA,SACI,+CAAC,SAAI,MAAK,SAAQ,cAAY,WAAW,WAAW,GAAG,UAAU,aAAa,mBAAmB,SAAS,GACrG;AAAA,UAAM,IAAI,CAAC,MAAM,UACd,+CAAC,UAAiB,WAAU,gBACvB;AAAA,mBAAa,QAAQ,KAAK,QAAQ,cAAc,IAC7C,8CAAC,UAAK,WAAU,qBAAoB,eAAY,QAAO,IACvD;AAAA,MACJ;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,CAAC,YAAY;AACd,iBAAK,QAAQ,KAAK,IAAI;AAAA,UAC1B;AAAA,UACA,WAAU;AAAA,UACV,MAAK;AAAA,UACL,WAAW,SAAS,YAAY,YAAY;AAAA,UAC5C,cAAc,UAAU,IAAI,kBAAkB;AAAA,UAC9C,gBAAe;AAAA,UACf,WAAW;AAAA,UACX,cAAY,aAAa,QAAQ,CAAC,OAAO,MAAM;AAAA,UAC/C,gBAAc,aAAa;AAAA,UAC3B;AAAA,UACA,WAAW,aAAa,UAAU;AAAA,UAClC,OAAO;AAAA,UAEP,SAAS,CAAC,UAAU;AAChB,kBAAM,SAAS,OAAO,QAAQ;AAC9B,gBAAI,QAAQ,OAAQ,MAAK,QAAQ,MAAM,GAAG,MAAM;AAAA,gBAC3C,OAAM,OAAO,OAAO;AAAA,UAC7B;AAAA,UACA,UAAU,CAAC,UAAU,QAAQ,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,EAAE,KAAK,MAAM,OAAO,KAAK;AAAA,UAC9F,WAAW,CAAC,UAAU,UAAU,OAAO,KAAK;AAAA,UAC5C,SAAS,CAAC,UAAU,QAAQ,OAAO,KAAK;AAAA;AAAA,MAC5C;AAAA,SA5BO,KA6BX,CACH;AAAA,IACA,OAAO,8CAAC,WAAM,MAAK,UAAS,MAAY,OAAO,MAAM,IAAK;AAAA,KAC/D;AAER;;;ACjJA,IAAAC,iBAQO;;;ACPP,IAAM,0BAA0B;AAMhC,SAAS,gBAAgB,UAA+B,WAA4B;AAChF,QAAM,OAAO,SAAS;AACtB,MAAI,KAAK,SAAS,wBAAyB,QAAO;AAClD,QAAM,QAAQ,OAAO,iBAAiB,QAAQ;AAC9C,QAAM,aAAa,OAAO,WAAW,MAAM,UAAU,KAAK,OAAO,WAAW,MAAM,QAAQ,IAAI;AAC9F,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,SAAS,KAAK,KAAK,YAAY,UAAU,IAAI;AACnD,MAAI,QAAQ;AACZ,WAAS,QAAQ,KAAK,QAAQ,IAAI,GAAG,UAAU,MAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACrG,aAAS;AACb,SAAO,SAAS;AACpB;AAGO,SAAS,eAAe,UAAqC;AAChE,QAAM,YAAY,OAAO,WAAW,OAAO,iBAAiB,QAAQ,EAAE,SAAS;AAE/E,MAAI,OAAO,SAAS,SAAS,KAAK,gBAAgB,UAAU,SAAS,GAAG;AACpE,aAAS,MAAM,SAAS,GAAG,UAAU,SAAS,CAAC;AAC/C,aAAS,MAAM,YAAY;AAC3B;AAAA,EACJ;AAEA,WAAS,MAAM,SAAS;AAExB,QAAM,eAAe,OAAO,SAAS,SAAS,KAAK,SAAS,eAAe;AAE3E,WAAS,MAAM,SAAS,GAAG,SAAS,YAAY;AAChD,WAAS,MAAM,YAAY,eAAe,SAAS;AACvD;;;ADmCQ,IAAAC,uBAAA;AAhDR,IAAM,2BAA2B;AAEjC,SAASC,WAAU,KAAwC,SAAqC;AAC5F,MAAI,OAAO,QAAQ,WAAY,KAAI,OAAO;AAAA,WACjC,IAAK,KAAI,UAAU;AAChC;AAGO,IAAM,eAAW,2BAA+C,SAASC,UAC5E;AAAA,EACI,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,OAAO;AAAA,EACP;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GACA,KACF;AACE,QAAM,kBAAc,uBAAmC,IAAI;AAE3D,sCAAgB,MAAM;AAClB,QAAI,YAAY,YAAY,QAAS,gBAAe,YAAY,OAAO;AAAA,EAC3E,GAAG,CAAC,UAAU,mBAAmB,KAAK,CAAC;AAEvC,WAAS,eAAe,SAAqC;AACzD,gBAAY,UAAU;AACtB,IAAAD,WAAU,KAAK,OAAO;AACtB,QAAI,YAAY,QAAS,gBAAe,OAAO;AAAA,EACnD;AAEA,WAAS,aAAa,OAAyC;AAE3D,QAAI,YAAY,UAAU,OAAW,gBAAe,MAAM,aAAa;AACvE,eAAW,KAAK;AAAA,EACpB;AAEA,QAAM,gBAA2C,WAC3C;AAAA,IACI,GAAG;AAAA,IACH,WAAW,OAAO,sBAAsB,WAAW,GAAG,iBAAiB,OAAO;AAAA,EAClF,IACA;AAEN,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,WAAW;AAAA,QACP;AAAA,QACA,QAAQ;AAAA,QACR,aAAa,CAAC,QAAQ;AAAA,QACtB,YAAY;AAAA,QACZ;AAAA,MACJ;AAAA,MACA,gBAAc,aAAa;AAAA,MAC3B,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA;AAAA,EACd;AAER,CAAC;;;AEvFD,IAAAE,iBAA6G;;;ACA7G,IAAAC,iBAAsG;AAiBtG,IAAM,SAAS;AAQR,SAAS,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,aAAa;AAAA,EACb,YAAY;AAChB,GAA2B;AACvB,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAwB;AAAA,IAC9C,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,EAChB,CAAC;AAED,QAAM,YAAQ,4BAAY,MAAM;AAC5B,UAAM,SAAS,UAAU;AACzB,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,UAAU,CAAC,SAAU;AAC1B,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,QAAQ,KAAK,IAAI,SAAS,aAAa,aAAa,KAAK,QAAQ,CAAC;AACxE,UAAM,SAAS,SAAS;AACxB,UAAM,QAAQ,OAAO,cAAc,KAAK,SAAS,SAAS;AAC1D,UAAM,QAAQ,KAAK,MAAM,SAAS;AAClC,UAAM,WAAW,UAAU,WAAW,KAAK;AAC3C,UAAM,YAAY,UAAU;AAC5B,UAAM,YAAY,UAAU;AAC5B,UAAM,MAAM,WAAW,aAAa,QAAQ,QAAQ,CAAC,aAAa,QAAQ;AAE1E,UAAM,QAAQ,UAAU,SAAS,OAAO,IAAI,UAAU,UAAU,SAAS,KAAK,IAAI,QAAQ;AAC1F,QAAI,OAAO,UAAU,UAAU,KAAK,OAAO,UAAU,QAAQ,KAAK,QAAQ,QAAQ,KAAK,OAAO,KAAK,QAAQ,IAAI,QAAQ;AACvH,WAAO,KAAK,IAAI,KAAK,IAAI,QAAQ,IAAI,GAAG,OAAO,aAAa,QAAQ,MAAM;AAG1E,aAAS,QAAQ,OAAO,MAAM,QAAQ;AAGtC,aAAS;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,MACP,KAAK,MAAM,SAAS,KAAK,SAAS;AAAA,MAClC,QAAQ,MAAM,OAAO,cAAc,KAAK,MAAM,SAAS;AAAA,MACvD,UAAU,aAAa,KAAK,QAAQ;AAAA,MACpC,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,WAAW,MAAM,QAAQ,KAAK,CAAC;AAAA,MACjE,CAAC,sBAAgC,GAAG,GAAG,MAAM,WAAW,KAAK,IAAI,UAAU,UAAU,SAAS,UAAU,QAAQ,UAAU,QAAQ;AAAA,IACtI,CAAC;AAAA,EACL,GAAG,CAAC,WAAW,aAAa,WAAW,QAAQ,YAAY,SAAS,CAAC;AAGrE,sCAAgB,MAAM;AAClB,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,QAAQ,CAAC,SAAU;AACxB,QAAI;AACA,UAAI,CAAC,SAAS,QAAQ,eAAe,EAAG,UAAS,YAAY;AAAA,IACjE,QAAQ;AAAA,IAER;AACA,UAAM;AACN,WAAO,MAAM;AACT,UAAI;AACA,YAAI,SAAS,QAAQ,eAAe,EAAG,UAAS,YAAY;AAAA,MAChE,QAAQ;AAAA,MAER;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,aAAa,KAAK,CAAC;AAE7B,gCAAU,MAAM;AACZ,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,CAAC,UAAiB;AAC/B,UAAI,YAAY,SAAS,SAAS,MAAM,MAAc,EAAG;AACzD,YAAM;AAAA,IACV;AACA,UAAM,WAAW,OAAO,mBAAmB,cAAc,SAAY,IAAI,eAAe,MAAM,MAAM,CAAC;AACrG,QAAI,YAAY,QAAS,WAAU,QAAQ,YAAY,OAAO;AAC9D,WAAO,iBAAiB,UAAU,UAAU,IAAI;AAChD,WAAO,iBAAiB,UAAU,KAAK;AACvC,WAAO,MAAM;AACT,gBAAU,WAAW;AACrB,aAAO,oBAAoB,UAAU,UAAU,IAAI;AACnD,aAAO,oBAAoB,UAAU,KAAK;AAAA,IAC9C;AAAA,EACJ,GAAG,CAAC,MAAM,OAAO,WAAW,CAAC;AAE7B,SAAO;AACX;AAGO,SAAS,WAAW,MAAe,MAA4C,WAAmD;AACrI,gCAAU,MAAM;AACZ,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,UAAwB;AAC3C,YAAM,SAAS,MAAM;AACrB,UAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,SAAS,SAAS,MAAM,CAAC,EAAG,WAAU,SAAS;AAAA,IAChF;AACA,UAAM,YAAY,CAAC,UAAyB;AACxC,UAAI,MAAM,QAAQ,YAAY,MAAM,iBAAkB;AAEtD,YAAM,eAAe;AACrB,YAAM,gBAAgB;AACtB,gBAAU,QAAQ;AAAA,IACtB;AACA,aAAS,iBAAiB,eAAe,eAAe,IAAI;AAC5D,aAAS,iBAAiB,WAAW,WAAW,IAAI;AACpD,WAAO,MAAM;AACT,eAAS,oBAAoB,eAAe,eAAe,IAAI;AAC/D,eAAS,oBAAoB,WAAW,WAAW,IAAI;AAAA,IAC3D;AAAA,EAEJ,GAAG,CAAC,MAAM,SAAS,CAAC;AACxB;AAGO,IAAM,gBAAgB,EAAE,SAAS,SAAS;;;ACjJjD,IAAAC,iBAAoC;AAG7B,IAAM,eAAe;AAarB,SAAS,YAAY,MAAe,SAAS,cAAwB;AACxE,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,MAAI,QAAQ,CAAC,QAAS,YAAW,IAAI;AAErC,gCAAU,MAAM;AACZ,QAAI,QAAQ,CAAC,QAAS,QAAO;AAC7B,UAAM,eAAe,OAAO,WAAW,eAAe,OAAO,aAAa,kCAAkC,EAAE;AAC9G,UAAM,QAAQ,OAAO,WAAW,MAAM,WAAW,KAAK,GAAG,eAAe,IAAI,MAAM;AAClF,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EAC1C,GAAG,CAAC,MAAM,SAAS,MAAM,CAAC;AAE1B,SAAO,EAAE,SAAS,QAAQ,SAAS,OAAO,OAAO,SAAS,SAAS;AACvE;;;AFgPiE,IAAAC,uBAAA;AAjOjE,IAAM,UAAU;AAChB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AAEzB,SAAS,QAAQ,MAAuC;AACpD,SAAO,aAAa;AACxB;AAEA,SAAS,OAAO,QAA8B;AAC1C,SAAO,OAAO,cAAc,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,OAAO;AACzF;AAQO,SAAS,OAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAAA,EACd,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA;AACJ,GAAgB;AACZ,QAAM,gBAAY,sBAAM;AACxB,QAAM,qBAAiB,sBAAM;AAC7B,QAAM,iBAAa,uBAA0B,IAAI;AACjD,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,gBAAY,uBAAO,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC;AAC/C,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,EAAE;AAEjD,QAAM,WAAO,wBAAQ,MAAM,QAAQ,QAAQ,CAAC,SAAU,QAAQ,IAAI,IAAI,KAAK,UAAU,CAAC,IAAI,CAAE,GAAG,CAAC,OAAO,CAAC;AACxG,QAAM,gBAAgB,KAAK,UAAU,CAAC,WAAW,OAAO,UAAU,KAAK;AACvE,QAAM,WAAW,KAAK,aAAa;AACnC,QAAM,WAAW,CAAC,UAAkB,GAAG,cAAc,IAAI,KAAK;AAE9D,QAAM,kBAAc;AAAA,IAChB,CAAC,OAAe,SAAyB;AACrC,eAAS,QAAQ,OAAO,SAAS,KAAK,QAAQ,KAAK,QAAQ,SAAS,MAAM;AACtE,YAAI,CAAC,KAAK,KAAK,EAAG,SAAU,QAAO;AAAA,MACvC;AACA,aAAO;AAAA,IACX;AAAA,IACA,CAAC,IAAI;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM;AAC7C,QAAM,gBAAgB,YAAY;AAAA,IAC9B,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,EACf,CAAC;AAED,WAAS,KAAK,SAA4B;AACtC,QAAI,YAAY,OAAQ;AACxB;AAAA,MACI,YAAY,UACN,YAAY,GAAG,CAAC,IAChB,YAAY,SACV,YAAY,KAAK,SAAS,GAAG,EAAE,IAC/B,iBAAiB,KAAK,CAAC,KAAK,aAAa,EAAG,WAC1C,gBACA,YAAY,GAAG,CAAC;AAAA,IAC9B;AACA,cAAU,IAAI;AAAA,EAClB;AAEA,WAAS,QAAQ;AACb,cAAU,KAAK;AAAA,EACnB;AAEA,WAAS,OAAO,OAAe;AAC3B,UAAM,SAAS,KAAK,KAAK;AACzB,QAAI,CAAC,UAAU,OAAO,SAAU;AAChC,UAAM;AACN,eAAW,SAAS,MAAM;AAC1B,QAAI,OAAO,UAAU,MAAO,UAAS,OAAO,KAAK;AAAA,EACrD;AAGA,gCAAU,MAAM;AACZ,QAAI,CAAC,UAAU,cAAc,EAAG;AAChC,aAAS,eAAe,SAAS,WAAW,CAAC,GAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,EAEvF,GAAG,CAAC,QAAQ,WAAW,CAAC;AAGxB,gCAAU,MAAM;AACZ,QAAI,CAAC,OAAQ;AACb,UAAM,gBAAgB,CAAC,UAAwB;AAC3C,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,KAAK,CAAC,WAAW,SAAS,SAAS,MAAM,EAAG,OAAM;AAAA,IAC3F;AACA,aAAS,iBAAiB,eAAe,eAAe,IAAI;AAC5D,WAAO,MAAM,SAAS,oBAAoB,eAAe,eAAe,IAAI;AAAA,EAChF,GAAG,CAAC,MAAM,CAAC;AAEX,gCAAU,MAAM;AACZ,QAAI,SAAU,WAAU,KAAK;AAAA,EACjC,GAAG,CAAC,QAAQ,CAAC;AAEb,gCAAU,MAAM,MAAM,OAAO,aAAa,UAAU,QAAQ,KAAK,GAAG,CAAC,CAAC;AAEtE,WAAS,aAAa,KAAa;AAC/B,UAAMC,SAAQ,UAAU;AACxB,WAAO,aAAaA,OAAM,KAAK;AAC/B,IAAAA,OAAM,QAAQ,IAAI,YAAY;AAC9B,IAAAA,OAAM,QAAQ,OAAO,WAAW,MAAM;AAClC,MAAAA,OAAM,OAAO;AAAA,IACjB,GAAG,gBAAgB;AACnB,UAAM,OAAO,SAAS,cAAc;AAEpC,UAAM,WAAWA,OAAM,KAAK,SAAS,KAAK,CAAC,GAAGA,OAAM,IAAI,EAAE,MAAM,CAAC,WAAW,WAAWA,OAAM,KAAK,CAAC,CAAC;AACpG,UAAM,SAAS,WAAWA,OAAM,KAAK,CAAC,IAAKA,OAAM;AACjD,UAAM,QAAQ,YAAYA,OAAM,KAAK,WAAW,IAAI,OAAO,IAAI;AAC/D,aAAS,SAAS,GAAG,SAAS,KAAK,QAAQ,UAAU,GAAG;AACpD,YAAM,SAAS,KAAK,IAAI,OAAO,CAAC,IAAI,UAAU,KAAK;AACnD,YAAM,SAAS,KAAK,KAAK;AACzB,UAAI,CAAC,OAAO,YAAY,OAAO,MAAM,EAAE,YAAY,EAAE,WAAW,MAAM,GAAG;AACrE,YAAI,OAAQ,gBAAe,KAAK;AAAA,iBACvB,OAAO,UAAU,MAAO,UAAS,OAAO,KAAK;AACtD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,WAAS,UAAU,OAAyC;AACxD,QAAI,SAAU;AACd,UAAM,EAAE,IAAI,IAAI;AAEhB,QAAI,CAAC,QAAQ;AACT,UAAI,QAAQ,eAAe,QAAQ,aAAa,QAAQ,WAAW,QAAQ,KAAK;AAC5E,cAAM,eAAe;AACrB,aAAK,QAAQ,aAAa,gBAAgB,IAAI,SAAS,MAAS;AAAA,MACpE,WAAW,IAAI,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC,MAAM,SAAS;AAC7D,qBAAa,GAAG;AAAA,MACpB;AACA;AAAA,IACJ;AAEA,YAAQ,KAAK;AAAA,MACT,KAAK,aAAa;AACd,cAAM,eAAe;AACrB,cAAM,OAAO,YAAY,cAAc,GAAG,CAAC;AAC3C,YAAI,QAAQ,EAAG,gBAAe,IAAI;AAClC;AAAA,MACJ;AAAA,MACA,KAAK,WAAW;AACZ,cAAM,eAAe;AACrB,cAAM,WAAW,YAAY,cAAc,GAAG,EAAE;AAChD,YAAI,YAAY,EAAG,gBAAe,QAAQ;AAC1C;AAAA,MACJ;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACD,cAAM,eAAe;AACrB,uBAAe,YAAY,GAAG,CAAC,CAAC;AAChC;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AACD,cAAM,eAAe;AACrB,uBAAe,YAAY,KAAK,SAAS,GAAG,EAAE,CAAC;AAC/C;AAAA,MACJ,KAAK;AACD,cAAM,eAAe;AACrB,eAAO,WAAW;AAClB;AAAA,MACJ,KAAK;AACD,cAAM,eAAe;AACrB,YAAI,UAAU,QAAQ,KAAM,cAAa,GAAG;AAAA,YACvC,QAAO,WAAW;AACvB;AAAA,MACJ,KAAK;AAED,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,cAAM;AACN;AAAA,MACJ,KAAK;AACD,cAAM;AACN;AAAA,MACJ;AACI,YAAI,IAAI,WAAW,KAAK,CAAC,MAAM,WAAW,CAAC,MAAM,QAAS,cAAa,GAAG;AAAA,IAClF;AAAA,EACJ;AAEA,MAAI,YAAY;AAEhB,QAAM,eAAe,CAAC,WAAyB;AAC3C,iBAAa;AACb,UAAM,QAAQ;AACd,UAAM,aAAa,UAAU;AAC7B,UAAM,WAAW,UAAU;AAC3B,WACI;AAAA,MAAC;AAAA;AAAA,QAEG,IAAI,SAAS,KAAK;AAAA,QAClB,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe,OAAO,YAAY;AAAA,QAClC,WAAW,GAAG,aAAa;AAAA,UACvB,qBAAqB,YAAY,CAAC,OAAO;AAAA,UACzC,uBAAuB;AAAA,UACvB,uBAAuB,QAAQ,OAAO,QAAQ;AAAA,QAClD,CAAC;AAAA,QACD,eAAe,MAAM;AACjB,cAAI,CAAC,OAAO,YAAY,gBAAgB,MAAO,gBAAe,KAAK;AAAA,QACvE;AAAA,QAEA,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,QAC7C,SAAS,MAAM,OAAO,KAAK;AAAA,QAE3B;AAAA,wDAAC,UAAK,WAAU,oBAAoB,uBAAa,8CAAC,aAAU,MAAM,IAAI,IAAK,MAAK;AAAA,UAChF,+CAAC,UAAK,WAAU,mBACZ;AAAA,0DAAC,UAAK,WAAW,GAAG,oBAAoB,cAAc,GAAI,iBAAO,OAAM;AAAA,YACtE,OAAO,cAAc,8CAAC,UAAK,WAAU,0BAA0B,iBAAO,aAAY,IAAU;AAAA,aACjG;AAAA;AAAA;AAAA,MArBK,GAAG,OAAO,KAAK,IAAI,KAAK;AAAA,IAsBjC;AAAA,EAER;AAEA,SACI,gFACI;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,SAAS,YAAY;AAAA,QACpC,yBAAuB,UAAU,eAAe,IAAI,SAAS,WAAW,IAAI;AAAA,QAC5E,cAAY;AAAA,QACZ,mBAAiB;AAAA,QACjB,oBAAkB;AAAA,QAClB,gBAAc,aAAa;AAAA,QAC3B;AAAA,QACA,OAAO,WAAW,OAAO,QAAQ,IAAI;AAAA,QACrC,WAAW,GAAG,aAAa,cAAc,IAAI,IAAI,EAAE,mBAAmB,QAAQ,sBAAsB,aAAa,CAAC,OAAO,GAAG,SAAS;AAAA,QACrI,SAAS,MAAO,SAAS,MAAM,IAAI,KAAK;AAAA,QACxC;AAAA,QACA,QAAQ,CAAC,UAAU;AACf,cAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,aAAqB,EAAG,OAAM;AAAA,QACvE;AAAA,QAEA;AAAA,wDAAC,UAAK,WAAW,GAAG,oBAAoB,CAAC,YAAY,iCAAiC,cAAc,GAC/F,qBAAW,SAAS,QAAQ,aACjC;AAAA,UACA,8CAAC,mBAAgB,MAAM,SAAS,OAAO,KAAK,IAAI,WAAU,sBAAqB;AAAA;AAAA;AAAA,IACnF;AAAA,IACC,UACG;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACJ,GAAG;AAAA,QACJ,cAAY;AAAA,QACZ,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,mBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,WAAW,GAAG,cAAc,eAAe,eAAe,IAAI,EAAE;AAAA,QAChE,OAAO;AAAA,QAEN;AAAA,kBAAQ;AAAA,YAAI,CAAC,MAAM,eAChB,QAAQ,IAAI,IACR,+CAAC,SAA8C,MAAK,SAAQ,cAAY,KAAK,OAAO,WAAU,qBAC1F;AAAA,4DAAC,SAAI,WAAU,2BAA0B,eAAY,QAChD,eAAK,OACV;AAAA,cACC,KAAK,QAAQ,IAAI,YAAY;AAAA,iBAJxB,SAAS,KAAK,KAAK,IAAI,UAAU,EAK3C,IAEA,aAAa,IAAI;AAAA,UAEzB;AAAA,UACC,KAAK,WAAW,IAAI,8CAAC,SAAI,WAAU,qBAAoB,wBAAU,IAAS;AAAA;AAAA;AAAA,IAC/E,IACA;AAAA,KACR;AAER;;;AGhVA,IAAAC,iBAUO;AAuLC,IAAAC,uBAAA;AAzIR,SAASC,WAAa,KAAsB,OAAiB;AACzD,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,KAAI,UAAU;AAChC;AAMO,IAAM,eAAW,2BAA4C,SAASC,UACzE;AAAA,EACI;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACP,GACA,KACF;AACE,QAAM,CAAC,UAAU,WAAW,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAClF,QAAM,UAAU,CAAC,MAAc,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,CAAC,GAAG,UAAU,mBAAmB,IAAI;AAC9G,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,MAAM,QAAQ,QAAQ,CAAC;AACxD,QAAM,CAAC,QAAQ,OAAO,QAAI,yBAAS,KAAK;AACxC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,KAAK;AACxC,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,EAAE;AACvC,QAAM,eAAW,uBAAgC,IAAI;AACrD,QAAM,eAAW,uBAAuB,IAAI;AAC5C,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,aAAS,sBAAM;AACrB,QAAM,WAAW,CAAC,UAAkB,GAAG,MAAM,IAAI,KAAK;AAEtD,QAAM,cAAU,wBAAQ,MAAM;AAC1B,UAAM,QAAQ,KAAK,KAAK,EAAE,YAAY;AACtC,QAAI,CAAC,SAAS,CAAC,MAAO,QAAO;AAC7B,WAAO,QAAQ;AAAA,MACX,CAAC,WACG,OAAO,MAAM,YAAY,EAAE,SAAS,KAAK,KACxC,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,YAAY,EAAE,SAAS,KAAK;AAAA,IAClG;AAAA,EACJ,GAAG,CAAC,SAAS,MAAM,KAAK,CAAC;AAGzB,gCAAU,MAAM;AACZ,QAAI,CAAC,OAAQ,SAAQ,QAAQ,QAAQ,CAAC;AAAA,EAE1C,GAAG,CAAC,UAAU,OAAO,CAAC;AAEtB,QAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM;AAC7C,QAAM,QAAQ,YAAY,EAAE,MAAM,SAAS,WAAW,UAAU,aAAa,SAAS,YAAY,MAAM,WAAW,IAAI,CAAC;AAExH,WAAS,OAAO;AACZ,QAAI,YAAY,OAAQ;AACxB,YAAQ,IAAI;AACZ,UAAM,QAAQ,QAAQ,UAAU,CAAC,WAAW,OAAO,UAAU,QAAQ;AACrE,cAAU,SAAS,IAAI,QAAQ,QAAQ,UAAU,CAAC,WAAW,CAAC,OAAO,QAAQ,CAAC;AAAA,EAClF;AAEA,WAAS,MAAM,UAAU,MAAM;AAC3B,YAAQ,KAAK;AACb,aAAS,KAAK;AACd,QAAI,CAAC,QAAS;AACd,QAAI,kBAAkB;AAClB,UAAI,SAAS,QAAQ,QAAQ,GAAG;AAC5B,cAAM,QAAQ,QAAQ,KAAK,CAAC,WAAW,OAAO,MAAM,YAAY,MAAM,KAAK,KAAK,EAAE,YAAY,CAAC;AAC/F,oBAAY,QAAQ,MAAM,QAAQ,IAAI;AAAA,MAC1C;AAAA,IACJ,WAAW,KAAK,KAAK,MAAM,GAAI,aAAY,EAAE;AAAA,QACxC,SAAQ,QAAQ,QAAQ,CAAC;AAAA,EAClC;AAEA,aAAW,QAAQ,CAAC,UAAU,OAAO,GAAG,MAAM,MAAM,CAAC;AAErD,WAAS,OAAO,QAAoC;AAChD,QAAI,CAAC,UAAU,OAAO,SAAU;AAChC,gBAAY,OAAO,KAAK;AACxB,YAAQ,OAAO,KAAK;AACpB,YAAQ,KAAK;AACb,aAAS,KAAK;AAAA,EAClB;AAEA,WAAS,KAAK,MAAc;AACxB,QAAI,CAAC,QAAQ,OAAQ;AACrB,QAAI,OAAO;AACX,aAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACpD,cAAQ,OAAO,OAAO,QAAQ,UAAU,QAAQ;AAChD,UAAI,CAAC,QAAQ,IAAI,EAAG,SAAU;AAAA,IAClC;AACA,cAAU,IAAI;AAAA,EAClB;AAEA,gCAAU,MAAM;AACZ,QAAI,UAAU,UAAU,EAAG,UAAS,eAAe,SAAS,MAAM,CAAC,GAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,EAE7G,GAAG,CAAC,QAAQ,MAAM,CAAC;AAEnB,WAAS,UAAU,OAAwC;AACvD,YAAQ,MAAM,KAAK;AAAA,MACf,KAAK;AACD,cAAM,eAAe;AACrB,YAAI,CAAC,OAAQ,MAAK;AAAA,YACb,MAAK,CAAC;AACX;AAAA,MACJ,KAAK;AACD,cAAM,eAAe;AACrB,YAAI,CAAC,OAAQ,MAAK;AAAA,YACb,MAAK,EAAE;AACZ;AAAA,MACJ,KAAK;AACD,YAAI,UAAU,UAAU,GAAG;AACvB,gBAAM,eAAe;AACrB,iBAAO,QAAQ,MAAM,CAAC;AAAA,QAC1B,WAAW,OAAQ,OAAM;AACzB;AAAA,MACJ,KAAK;AACD,YAAI,OAAQ;AACZ,YAAI,MAAM;AACN,gBAAM,eAAe;AACrB,kBAAQ,EAAE;AACV,sBAAY,EAAE;AAAA,QAClB;AACA;AAAA,MACJ,KAAK;AACD,YAAI,OAAQ,OAAM;AAClB;AAAA,IACR;AAAA,EACJ;AAEA,SACI,gFACI;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA,SAAS,QAAQ;AAAA,UACjB,aAAa;AAAA,UACb,YAAY;AAAA,UACZ;AAAA,QACJ;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK,CAAC,YAAY;AACd,yBAAS,UAAU;AACnB,gBAAAD,WAAU,KAAK,OAAO;AAAA,cAC1B;AAAA,cACA;AAAA,cACA,WAAU;AAAA,cACV,MAAK;AAAA,cACL,qBAAkB;AAAA,cAClB,iBAAe;AAAA,cACf,iBAAe,SAAS,SAAS;AAAA,cACjC,yBAAuB,UAAU,UAAU,IAAI,SAAS,MAAM,IAAI;AAAA,cAClE,gBAAc,aAAa;AAAA,cAC3B,cAAa;AAAA,cACb;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,UAAU,CAAC,UAAU;AACjB,wBAAQ,MAAM,OAAO,KAAK;AAC1B,yBAAS,IAAI;AACb,gCAAgB,MAAM,OAAO,KAAK;AAClC,oBAAI,CAAC,OAAQ,SAAQ,IAAI;AACzB,0BAAU,CAAC;AAAA,cACf;AAAA,cACA,SAAS;AAAA,cACT;AAAA,cACC,GAAG;AAAA;AAAA,UACR;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAU;AAAA,cACV,UAAU;AAAA,cACV,cAAY,SAAS,iBAAiB;AAAA,cACtC;AAAA,cACA,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,cAC7C,SAAS,MAAM;AACX,oBAAI,OAAQ,OAAM;AAAA,qBACb;AACD,uBAAK;AACL,2BAAS,SAAS,MAAM;AAAA,gBAC5B;AAAA,cACJ;AAAA,cAEA,wDAAC,mBAAgB,MAAM,SAAS,OAAO,KAAK,IAAI,WAAW,GAAG,sBAAsB,UAAU,4BAA4B,GAAG;AAAA;AAAA,UACjI;AAAA;AAAA;AAAA,IACJ;AAAA,IACC,UACG;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACJ,GAAG;AAAA,QACJ,cAAY;AAAA,QACZ,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,cAAY,KAAK,YAAY;AAAA,QAC7B,mBAAiB,KAAK,iBAAiB;AAAA,QACvC,WAAW,GAAG,cAAc,eAAe,eAAe,IAAI,EAAE;AAAA,QAChE;AAAA,QAEC;AAAA,kBAAQ,IAAI,CAAC,QAAQ,UAAU;AAC5B,kBAAM,aAAa,OAAO,UAAU;AACpC,mBACI;AAAA,cAAC;AAAA;AAAA,gBAEG,IAAI,SAAS,KAAK;AAAA,gBAClB,MAAK;AAAA,gBACL,iBAAe;AAAA,gBACf,iBAAe,OAAO,YAAY;AAAA,gBAClC,WAAW,GAAG,aAAa;AAAA,kBACvB,qBAAqB,UAAU,UAAU,CAAC,OAAO;AAAA,kBACjD,uBAAuB;AAAA,kBACvB,uBAAuB,QAAQ,OAAO,QAAQ;AAAA,gBAClD,CAAC;AAAA,gBACD,eAAe,MAAM,CAAC,OAAO,YAAY,UAAU,KAAK;AAAA,gBACxD,aAAa,CAAC,UAAU,MAAM,eAAe;AAAA,gBAC7C,SAAS,MAAM,OAAO,MAAM;AAAA,gBAE5B;AAAA,gEAAC,UAAK,WAAU,oBAAoB,uBAAa,8CAAC,aAAU,MAAM,IAAI,IAAK,MAAK;AAAA,kBAChF,+CAAC,UAAK,WAAU,mBACZ;AAAA,kEAAC,UAAK,WAAU,oBAAoB,iBAAO,OAAM;AAAA,oBAChD,OAAO,cACJ,8CAAC,UAAK,WAAU,0BAA0B,iBAAO,aAAY,IAC7D;AAAA,qBACR;AAAA;AAAA;AAAA,cApBK,OAAO;AAAA,YAqBhB;AAAA,UAER,CAAC;AAAA,UACA,QAAQ,WAAW,IAChB,8CAAC,SAAI,WAAU,qBAAoB,MAAK,gBACnC,wBACL,IACA;AAAA;AAAA;AAAA,IACR,IACA;AAAA,KACR;AAER,CAAC;;;AC5SD,IAAAE,iBAUO;AAoEC,IAAAC,uBAAA;AAvDR,IAAM,2BAAuB,8BAAgD,IAAI;AAkBjF,SAASC,WAAa,KAAsB,OAAiB;AACzD,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,KAAI,UAAU;AAChC;AAMO,IAAM,eAAW,2BAA4C,SAASC,UACzE;AAAA,EACI;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB,GAAG;AACP,GACA,KACF;AACE,QAAM,YAAQ,2BAAW,oBAAoB;AAC7C,QAAM,eAAW,uBAAgC,IAAI;AACrD,QAAM,oBAAgB,sBAAM;AAC5B,QAAM,UAAU,UAAU,QAAQ,UAAU;AAE5C,gCAAU,MAAM;AACZ,QAAI,SAAS,QAAS,UAAS,QAAQ,gBAAgB;AAAA,EAC3D,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,MACF;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,gBAAgB,IAAI;AAAA,QACpB,SAAS,YAAY;AAAA,QACrB,aAAa,UAAa;AAAA,MAC9B;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK,CAAC,YAAY;AACd,uBAAS,UAAU;AACnB,cAAAD,WAAU,KAAK,OAAO;AAAA,YAC1B;AAAA,YACA,MAAK;AAAA,YACL,WAAU;AAAA,YACV;AAAA,YACA,MAAM,UAAU,MAAM,OAAO;AAAA,YAC7B,SAAS,UAAU,MAAM,MAAM,SAAS,OAAO,KAAK,CAAC,IAAI;AAAA,YACzD,UAAU,YAAa,WAAW,MAAM;AAAA,YACxC,oBAAkB,CAAC,aAAa,cAAc,gBAAgB,MAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,YACtG,UAAU,CAAC,UAAU;AACjB,yBAAW,KAAK;AAChB,kBAAI,QAAS,OAAM,OAAO,OAAO,KAAK,GAAG,MAAM,OAAO,OAAO;AAAA,YACjE;AAAA,YACC,GAAG;AAAA;AAAA,QACR;AAAA,QACC,gBACG,8CAAC,aAAU,WAAU,+CAA8C,MAAM,SAAS,OAAO,KAAK,IAAI,aAAa,GAAG,IAElH,8CAAC,aAAU,WAAU,sBAAqB,MAAM,SAAS,OAAO,KAAK,IAAI,aAAa,GAAG;AAAA;AAAA;AAAA,EAEjG;AAGJ,MAAI,aAAa,OAAW,QAAO;AACnC,SACI,+CAAC,WAAM,WAAW,GAAG,mBAAmB,YAAa,WAAW,MAAM,aAAc,4BAA4B,SAAS,GACpH;AAAA;AAAA,IACD,+CAAC,UAAK,WAAU,wBACZ;AAAA,oDAAC,UAAM,UAAS;AAAA,MACf,cACG,8CAAC,UAAK,IAAI,eAAe,WAAU,+BAC9B,uBACL,IACA;AAAA,OACR;AAAA,KACJ;AAER,CAAC;AAyBM,SAAS,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAC;AAAA,EAChB;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACJ,GAAuB;AACnB,QAAM,CAAC,SAAS,UAAU,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAChF,QAAM,oBAAgB,sBAAM;AAC5B,QAAM,cAAU,sBAAM;AACtB,SACI;AAAA,IAAC,qBAAqB;AAAA,IAArB;AAAA,MACG,OAAO;AAAA,QACH,OAAO;AAAA,QACP,MAAM,QAAQ;AAAA,QACd;AAAA,QACA,OAAO,MAAM,SAAS;AAClB,qBAAW,UAAU,CAAC,GAAG,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,QACzG;AAAA,MACJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACG,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,GAAG,gBAAgB,gBAAgB,2BAA2B,SAAS;AAAA,UAEjF;AAAA;AAAA,MACL;AAAA;AAAA,EACJ;AAER;AAiBO,SAAS,SAAS,EAAE,QAAQ,aAAa,OAAO,SAAS,UAAU,UAAU,UAAU,GAAkB;AAC5G,QAAM,kBAAc,sBAAM;AAC1B,QAAM,gBAAgB,GAAG,WAAW;AACpC,QAAM,kBAAkB,WAAW,GAAG,WAAW;AACjD,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,eAAe,SAAS;AAAA,MACtC;AAAA,MACA,oBAAkB,CAAC,cAAc,gBAAgB,IAAI,QAAQ,kBAAkB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,MAEhH;AAAA,sDAAC,YAAO,WAAU,uBAAuB,kBAAO;AAAA,QAC/C,cACG,8CAAC,OAAE,IAAI,eAAe,WAAU,4BAC3B,uBACL,IACA;AAAA,QACJ,8CAAC,SAAI,WAAU,wBAAwB,UAAS;AAAA,QAC/C,QACG,8CAAC,OAAE,IAAI,iBAAiB,MAAK,SAAQ,WAAU,mBAC1C,iBACL,IACA;AAAA;AAAA;AAAA,EACR;AAER;;;ACtOA,IAAAE,iBAA2F;AA2D/E,IAAAC,uBAAA;AA9CZ,IAAM,wBAAoB,8BAA6C,IAAI;AA4BpE,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd,UAAU;AAAA,EACV;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACJ,GAAoB;AAChB,QAAM,CAAC,SAAS,MAAM,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAC5E,QAAM,oBAAgB,sBAAM;AAC5B,SACI,8CAAC,kBAAkB,UAAlB,EAA2B,OAAO,EAAE,MAAM,QAAQ,eAAe,OAAO,SAAS,QAAQ,SAAS,GAC/F;AAAA,IAAC;AAAA;AAAA,MACG,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,gBAAgB,gBAAgB;AAAA,QAChC,YAAY,WAAW;AAAA,QACvB;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL,GACJ;AAER;AAWO,SAAS,MAAM,EAAE,OAAO,UAAU,aAAa,UAAU,WAAW,GAAG,WAAW,GAAe;AACpG,QAAM,YAAQ,2BAAW,iBAAiB;AAC1C,QAAM,oBAAgB,sBAAM;AAC5B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,oCAAoC;AAChE,QAAM,aAAa,YAAY,MAAM;AACrC,SACI,+CAAC,WAAM,WAAW,GAAG,kBAAkB,kBAAkB,cAAc,4BAA4B,SAAS,GACxG;AAAA,kDAAC,UAAK,WAAU,YACZ;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAU;AAAA,QACV,MAAM,MAAM;AAAA,QACZ;AAAA,QACA,SAAS,MAAM,UAAU;AAAA,QACzB,UAAU;AAAA,QACV,oBAAkB,cAAc,gBAAgB;AAAA,QAChD,UAAU,MAAM,MAAM,OAAO,KAAK;AAAA,QACjC,GAAG;AAAA;AAAA,IACR,GACJ;AAAA,IACA,+CAAC,UAAK,WAAU,wBACZ;AAAA,oDAAC,UAAM,UAAS;AAAA,MACf,cACG,8CAAC,UAAK,IAAI,eAAe,WAAU,+BAC9B,uBACL,IACA;AAAA,OACR;AAAA,KACJ;AAER;;;ACnHA,IAAAC,iBAAsD;AA6B1C,IAAAC,uBAAA;AAhBL,IAAM,aAAS,2BAA2C,SAASC,QACtE,EAAE,SAAS,UAAU,OAAO,WAAW,UAAU,GAAG,YAAY,GAChE,KACF;AACE,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY;AAAA,MACZ;AAAA,MACA,WAAW,GAAG,aAAa,WAAW,iBAAiB,SAAS;AAAA,MAChE,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAC/B,GAAG;AAAA,MAEJ,wDAAC,UAAK,WAAU,mBAAkB;AAAA;AAAA,EACtC;AAER,CAAC;;;AChCD,IAAAC,iBAA0D;AAgE9C,IAAAC,uBAAA;AA3BL,SAAS,OAAuC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd;AAAA,EACA;AACJ,GAAmB;AACf,QAAM,CAAC,SAAS,UAAU,IAAI,qBAAwB,OAAQ,gBAAgB,KAAW,QAAQ;AACjG,QAAM,cAAU,sBAAM;AACtB,QAAM,UAAU,MAAM,QAAQ,OAAO;AACrC,QAAM,CAAC,KAAK,IAAI,IAAI,UAAW,UAA+B,CAAC,KAAK,OAAiB;AACrF,QAAM,MAAM,CAAC,OAAgB,IAAI,QAAQ,MAAM,OAAO,KAAM;AAC5D,QAAM,QAAQ,EAAE,oBAAoB,GAAG,UAAU,IAAI,GAAG,IAAI,CAAC,KAAK,kBAAkB,GAAG,IAAI,IAAI,CAAC,IAAI;AACpG,QAAM,UAAU,UAAU,GAAG,YAAY,GAAG,CAAC,WAAM,YAAY,IAAI,CAAC,KAAK,YAAY,IAAI;AACzF,QAAM,MAAM,MAAM,cAAc,OAAO;AAEvC,QAAM,QAAQ,CAAC,UAA0B;AACrC,UAAM,MAAM,UAAU,QAAQ,MAAM;AACpC,WACI;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAW,GAAG,oBAAoB,WAAW,qBAAqB,KAAK,EAAE;AAAA,QAEzE,OAAO,UAAU,SAAS,QAAQ,QAAQ,IAAI,GAAG,IAAI,KAAK,EAAE,QAAQ,EAAE,IAAI;AAAA,QAC1E;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,mBAAiB,QAAQ,UAAU;AAAA,QACnC,cAAY,QAAQ,SAAY,UAAU,GAAG,aAAa,OAAO,KAAK,UAAU,QAAQ,YAAY,SAAS,KAAK;AAAA,QAClH,kBAAgB,YAAY,GAAG;AAAA,QAC/B,UAAU,CAAC,UAAU;AACjB,gBAAM,IAAI,OAAO,MAAM,OAAO,KAAK;AACnC,cAAI,CAAC,QAAS,YAAW,CAAM;AAAA,mBACtB,UAAU,MAAO,YAAW,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,CAAM;AAAA,cAC9D,YAAW,CAAC,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC,CAAM;AAAA,QAChD;AAAA,QACA,aAAa;AAAA,QACb,SAAS;AAAA;AAAA,IACb;AAAA,EAER;AAEA,SACI,+CAAC,SAAI,WAAW,GAAG,aAAa,YAAY,uBAAuB,SAAS,GACvE;AAAA,aAAS,YACN,+CAAC,SAAI,WAAU,qBACV;AAAA,cACG,8CAAC,UAAK,IAAI,SAAS,WAAU,oBACxB,iBACL,IAEA,8CAAC,UAAK;AAAA,MAET,YACG,8CAAC,YAAO,WAAU,oBAAmB,eAAY,QAC5C,mBACL,IACA;AAAA,OACR,IACA;AAAA,IACJ,+CAAC,SAAI,WAAU,sBAAqB,OAChC;AAAA,oDAAC,UAAK,WAAU,oBAAmB,eAAY,QAC3C,wDAAC,UAAK,WAAU,mBAAkB,GACtC;AAAA,MACC,UAAU,MAAM,KAAK,IAAI;AAAA,MACzB,MAAM,MAAM;AAAA,OACjB;AAAA,KACJ;AAER;;;ACpHA,IAAAC,iBAAwE;AAmFhE,IAAAC,uBAAA;AAtDR,SAAS,QAAQ,MAAY,QAA4B;AACrD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO,MAAM,GAAG,EAAE,KAAK,CAAC,SAAS;AACpC,UAAM,UAAU,KAAK,KAAK,EAAE,YAAY;AACxC,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,QAAQ,WAAW,GAAG,EAAG,QAAO,KAAK,KAAK,YAAY,EAAE,SAAS,OAAO;AAC5E,QAAI,QAAQ,SAAS,IAAI,EAAG,QAAO,KAAK,KAAK,YAAY,EAAE,WAAW,QAAQ,MAAM,GAAG,EAAE,CAAC;AAC1F,WAAO,KAAK,KAAK,YAAY,MAAM;AAAA,EACvC,CAAC;AACL;AAEA,IAAM,aAAa,CAAC,UAChB,SAAS,UAAY,GAAG,KAAK,MAAM,QAAQ,QAAS,IAAI,EAAE,QAAQ,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC;AAM1F,SAAS,aAAa;AAAA,EACzB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,MAAAC;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACJ,GAAsB;AAClB,QAAM,eAAW,uBAAyB,IAAI;AAC9C,QAAM,YAAQ,uBAAO,CAAC;AACtB,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAiB;AAC/C,QAAM,aAAS,sBAAM;AAErB,WAAS,KAAK,MAAuB;AACjC,QAAI,CAAC,QAAQ,SAAU;AACvB,UAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,WAAW,SAAY,CAAC;AACzD,UAAM,YAAY,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,MAAM,MAAM,CAAC;AAC7D,UAAM,SAAS,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,OAAO,IAAI;AACrE,QAAI,CAAC,YAAY,KAAK,SAAS,EAAG,YAAW,0BAA0B;AAAA,aAC9D,UAAW,YAAW,SAAI,UAAU,IAAI,mCAA8B;AAAA,aACtE,UAAU,QAAS,YAAW,SAAI,OAAO,IAAI,kBAAa,WAAW,OAAO,CAAC,GAAG;AAAA,SACpF;AACD,iBAAW,MAAS;AACpB,UAAI,MAAM,OAAQ,SAAQ,KAAK;AAAA,IACnC;AAAA,EACJ;AAEA,QAAM,WAAW,CAAC,UAAqB,MAAM,aAAa,MAAM,SAAS,OAAO;AAEhF,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,cAAc;AAAA,QACd,QAAQ,SAAS,OAAO,KAAK;AAAA,QAC7B,YAAY;AAAA,QACZ;AAAA,MACJ;AAAA,MACA,aAAa,CAAC,UAAU;AACpB,YAAI,CAAC,SAAS,KAAK,KAAK,SAAU;AAClC,cAAM,eAAe;AACrB,cAAM,WAAW;AACjB,sBAAc,IAAI;AAAA,MACtB;AAAA,MACA,YAAY,CAAC,UAAU;AACnB,YAAI,CAAC,SAAS,KAAK,KAAK,SAAU;AAClC,cAAM,eAAe;AACrB,cAAM,aAAa,aAAa;AAAA,MACpC;AAAA,MACA,aAAa,MAAM;AACf,cAAM,UAAU,KAAK,IAAI,GAAG,MAAM,UAAU,CAAC;AAC7C,YAAI,MAAM,YAAY,EAAG,eAAc,KAAK;AAAA,MAChD;AAAA,MACA,QAAQ,CAAC,UAAU;AACf,YAAI,CAAC,SAAS,KAAK,EAAG;AACtB,cAAM,eAAe;AACrB,cAAM,UAAU;AAChB,sBAAc,KAAK;AACnB,aAAK,MAAM,aAAa,KAAK;AAAA,MACjC;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,MAAK;AAAA,YACL,WAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,oBAAkB;AAAA,YAClB,UAAU,CAAC,UAAU;AACjB,mBAAK,MAAM,OAAO,KAAK;AACvB,oBAAM,OAAO,QAAQ;AAAA,YACzB;AAAA;AAAA,QACJ;AAAA,QACA,8CAAC,UAAK,WAAU,qBAAqB,UAAAA,SAAQ,8CAAC,cAAW,MAAM,IAAI,GAAG;AAAA,QACtE,8CAAC,UAAK,WAAU,sBAAsB,uBAAa,gBAAgB,OAAM;AAAA,QACzE,8CAAC,UAAK,IAAI,QAAQ,WAAU,qBAAoB,aAAU,UACrD,mBAAS,WAAW,MACzB;AAAA;AAAA;AAAA,EACJ;AAER;;;ACvIA,IAAAC,iBAA0G;;;ACG1G,IAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAE7C,SAAS,MAAM,MAAc,OAAe,KAAsB;AACrE,QAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,GAAG,CAAC;AAChD,SAAO,GAAG,KAAK,eAAe,CAAC,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC;AAC5F;AAEO,SAAS,SAAS,KAA4D;AACjF,QAAM,CAAC,MAAM,OAAO,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AACpD,SAAO,EAAE,MAAa,OAAO,QAAS,GAAG,IAAU;AACvD;AAEO,SAAS,WAAoB;AAChC,QAAM,MAAM,oBAAI,KAAK;AACrB,SAAO,MAAM,IAAI,YAAY,GAAG,IAAI,SAAS,GAAG,IAAI,QAAQ,CAAC;AACjE;AAEO,SAAS,QAAQ,KAAc,MAAuB;AACzD,QAAM,EAAE,MAAM,OAAO,IAAI,IAAI,SAAS,GAAG;AACzC,SAAO,MAAM,MAAM,OAAO,MAAM,IAAI;AACxC;AAEO,SAAS,UAAU,KAAc,QAAyB;AAC7D,QAAM,EAAE,MAAM,OAAO,IAAI,IAAI,SAAS,GAAG;AACzC,QAAM,UAAU,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ,SAAS,GAAG,CAAC,CAAC,EAAE,WAAW;AAC3E,SAAO,MAAM,MAAM,QAAQ,QAAQ,KAAK,IAAI,KAAK,OAAO,CAAC;AAC7D;AAGO,SAAS,QAAQ,KAAsB;AAC1C,QAAM,EAAE,MAAM,OAAO,IAAI,IAAI,SAAS,GAAG;AACzC,SAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,GAAG,CAAC,EAAE,UAAU;AAC1D;AAEO,SAAS,OAAO,KAAoB;AACvC,QAAM,EAAE,MAAM,OAAO,IAAI,IAAI,SAAS,GAAG;AACzC,SAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,GAAG,CAAC;AAC9C;AAEO,SAAS,WAAW,KAAc,QAA4B,SAA6C;AAC9G,SAAO,IAAI,KAAK,eAAe,QAAQ,EAAE,GAAG,SAAS,UAAU,MAAM,CAAC,EAAE,OAAO,OAAO,GAAG,CAAC;AAC9F;;;ADyEY,IAAAC,uBAAA;AA/EL,IAAM,eAAW,2BAA0C,SAASC,UACvE,EAAE,OAAO,eAAe,IAAI,UAAU,KAAK,KAAK,gBAAgB,QAAQ,eAAe,GAAG,YAAY,OAAO,UAAU,GACvH,KACF;AACE,QAAM,CAAC,UAAU,WAAW,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAClF,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAkB,MAAM,YAAY,UAAU,OAAO,KAAK,GAAG,CAAC;AAC5F,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,SAAS;AACxD,QAAM,cAAU,uBAAyB,IAAI;AAE7C,0CAAoB,KAAK,OAAO,EAAE,OAAO,MAAM,eAAe,IAAI,EAAE,IAAI,CAAC,CAAC;AAE1E,gCAAU,MAAM;AACZ,QAAI,SAAU,YAAW,QAAQ;AAAA,EACrC,GAAG,CAAC,QAAQ,CAAC;AAEb,gCAAU,MAAM;AACZ,QAAI,CAAC,YAAa;AAClB,YAAQ,SAAS,cAAiC,sBAAsB,GAAG,MAAM;AACjF,mBAAe,KAAK;AAAA,EACxB,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,QAAM,EAAE,MAAM,MAAM,IAAI,SAAS,OAAO;AACxC,QAAM,QAAQ,MAAM,MAAM,OAAO,CAAC;AAGlC,QAAM,aAAa,OAAO,KAAK;AAC/B,QAAM,YAAQ,uBAA2D,EAAE,OAAO,WAAW,CAAC;AAC9F,MAAI,MAAM,QAAQ,UAAU,YAAY;AACpC,UAAM,UAAU,EAAE,OAAO,YAAY,WAAW,aAAa,MAAM,QAAQ,QAAQ,SAAS,WAAW;AAAA,EAC3G;AACA,QAAM,UAAU,QAAQ,KAAK,IAAI,eAAe,KAAK;AACrD,QAAM,YAAY,QAAQ,OAAO,CAAC,MAAM;AACxC,QAAM,YAAQ,wBAAQ,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAACC,IAAG,MAAM,QAAQ,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;AAChJ,QAAM,eAAe,MAAM,CAAC,EAAG,IAAI,CAAC,UAAU;AAAA,IAC1C,OAAO,WAAW,MAAM,QAAQ,EAAE,SAAS,QAAQ,CAAC;AAAA,IACpD,MAAM,WAAW,MAAM,QAAQ,EAAE,SAAS,OAAO,CAAC;AAAA,EACtD,EAAE;AAEF,QAAM,aAAa,CAAC,SAAmB,QAAQ,UAAa,OAAO,OAAS,QAAQ,UAAa,OAAO,OAAQ,QAAQ,iBAAiB,IAAI,CAAC;AAE9I,WAAS,OAAO,MAAe;AAC3B,eAAW,UAAU,MAAM,KAAK,GAAG,CAAC;AACpC,mBAAe,IAAI;AAAA,EACvB;AAEA,WAAS,OAAO,MAAe;AAC3B,QAAI,WAAW,IAAI,EAAG;AACtB,gBAAY,IAAI;AAChB,eAAW,IAAI;AAAA,EACnB;AAEA,WAAS,UAAU,OAAyC,MAAe;AACvE,UAAM,OAAO,QAAQ,IAAI,IAAI,eAAe,KAAK;AACjD,UAAM,QAAuC;AAAA,MACzC,WAAW,MAAM,QAAQ,MAAM,EAAE;AAAA,MACjC,YAAY,MAAM,QAAQ,MAAM,CAAC;AAAA,MACjC,SAAS,MAAM,QAAQ,MAAM,EAAE;AAAA,MAC/B,WAAW,MAAM,QAAQ,MAAM,CAAC;AAAA,MAChC,MAAM,MAAM,QAAQ,MAAM,CAAC,GAAG;AAAA,MAC9B,KAAK,MAAM,QAAQ,MAAM,IAAI,GAAG;AAAA,MAChC,QAAQ,MAAM,UAAU,MAAM,MAAM,WAAW,MAAM,EAAE;AAAA,MACvD,UAAU,MAAM,UAAU,MAAM,MAAM,WAAW,KAAK,CAAC;AAAA,IAC3D;AACA,UAAM,OAAO,MAAM,MAAM,GAAG;AAC5B,QAAI,MAAM;AACN,YAAM,eAAe;AACrB,aAAO,KAAK,CAAC;AAAA,IACjB;AAAA,EACJ;AAEA,QAAM,aAAa,WAAW,OAAO,QAAQ,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAC/E,QAAM,YAAY,UAAU,OAAO,EAAE;AACrC,QAAM,YAAY,UAAU,OAAO,CAAC;AACpC,QAAM,YAAY,CAAC,OAAO,MAAM,MAAM,OAAO,CAAC,KAAK;AACnD,QAAM,eAAe,CAAC,OAAO,aAAa;AAE1C,SACI,+CAAC,SAAI,WAAW,GAAG,eAAe,SAAS,GACvC;AAAA,mDAAC,SAAI,WAAU,uBACX;AAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAY,mBAAmB,WAAW,WAAW,QAAQ,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC,CAAC;AAAA,UAChG,UAAU,CAAC;AAAA,UACX,SAAS,MAAM,WAAW,UAAU,UAAU,SAAS,EAAE,GAAG,KAAK,GAAG,CAAC;AAAA,UAErE,wDAAC,mBAAgB,MAAM,IAAI;AAAA;AAAA,MAC/B;AAAA,MACA,8CAAC,QAAG,WAAU,sBAAqB,aAAU,UACzC;AAAA,QAAC;AAAA;AAAA,UAEG,WAAW,GAAG,2BAA2B,MAAM,QAAQ,aAAa,uBAAuB,MAAM,QAAQ,SAAS,EAAE;AAAA,UAEnH;AAAA;AAAA,QAHI;AAAA,MAIT,GACJ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAY,eAAe,WAAW,WAAW,QAAQ,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC,CAAC;AAAA,UAC5F,UAAU,CAAC;AAAA,UACX,SAAS,MAAM,WAAW,UAAU,UAAU,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,UAEpE,wDAAC,oBAAiB,MAAM,IAAI;AAAA;AAAA,MAChC;AAAA,OACJ;AAAA,IACA,+CAAC,WAAM,KAAK,SAAS,MAAK,QAAO,WAAU,qBAAoB,cAAY,YACvE;AAAA,oDAAC,WACG,wDAAC,QACI,uBAAa,IAAI,CAAC,SACf,8CAAC,QAAmB,OAAM,OAAM,MAAM,KAAK,MAAM,WAAU,wBACtD,eAAK,MAAM,MAAM,GAAG,CAAC,KADjB,KAAK,IAEd,CACH,GACL,GACJ;AAAA,MACA,8CAAC,WAAuB,WAAW,GAAG,MAAM,QAAQ,aAAa,uBAAuB,MAAM,QAAQ,SAAS,EAAE,GAC5G,gBAAM,IAAI,CAAC,SACR,8CAAC,QACI,eAAK,IAAI,CAAC,SAAS;AAChB,cAAM,UAAU,SAAS,IAAI,EAAE,UAAU;AACzC,cAAM,aAAa,SAAS;AAC5B,cAAM,WAAW,WAAW,IAAI;AAChC,eACI,8CAAC,QAAc,MAAK,YAAW,iBAAe,YAAY,WAAU,qBAChE;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,UAAU,SAAS,UAAU,IAAI;AAAA,YACjC,cAAY,WAAW,MAAM,QAAQ,EAAE,WAAW,OAAO,CAAC;AAAA,YAC1D,gBAAc,SAAS,QAAQ,SAAS;AAAA,YACxC,iBAAe,YAAY;AAAA,YAC3B,WAAW,GAAG,oBAAoB;AAAA,cAC9B,6BAA6B,CAAC;AAAA,cAC9B,8BAA8B;AAAA,cAC9B,2BAA2B,SAAS;AAAA,cACpC,8BAA8B;AAAA,YAClC,CAAC;AAAA,YACD,SAAS,MAAM,OAAO,IAAI;AAAA,YAC1B,WAAW,CAAC,UAAU,UAAU,OAAO,IAAI;AAAA,YAC3C,SAAS,MAAM,SAAS,WAAW,WAAW,IAAI;AAAA,YAEjD,mBAAS,IAAI,EAAE;AAAA;AAAA,QACpB,KAlBK,IAmBT;AAAA,MAER,CAAC,KA3BI,KAAK,CAAC,CA4Bf,CACH,KA/BO,UAgCZ;AAAA,OACJ;AAAA,KACJ;AAER,CAAC;AAED,SAAS,UAAU,MAAe,KAA0B,KAAmC;AAC3F,MAAI,OAAO,OAAO,IAAK,QAAO;AAC9B,MAAI,OAAO,OAAO,IAAK,QAAO;AAC9B,SAAO;AACX;;;AErMA,IAAAC,iBAAoF;AAwE5E,IAAAC,uBAAA;AA3CR,SAASC,WAAa,KAAsB,OAAiB;AACzD,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,KAAI,UAAU;AAChC;AAGO,IAAM,iBAAa,2BAA+C,SAASC,YAC9E;AAAA,EACI;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd,gBAAgB,EAAE,WAAW,SAAS;AAAA,EACtC,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,GAAG;AACP,GACA,KACF;AACE,QAAM,CAAC,MAAM,OAAO,IAAI,qBAA8B,OAAO,cAAc,QAAQ;AACnF,QAAM,CAAC,QAAQ,OAAO,QAAI,yBAAS,KAAK;AACxC,QAAM,iBAAa,uBAAiC,IAAI;AACxD,QAAM,eAAW,uBAAuB,IAAI;AAC5C,QAAM,cAAU,sBAAM;AACtB,QAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM;AAC7C,QAAM,QAAQ,YAAY,EAAE,MAAM,SAAS,WAAW,YAAY,aAAa,UAAU,WAAW,gBAAgB,QAAQ,EAAE,CAAC;AAE/H,QAAM,YAAQ,4BAAY,CAAC,WAAkC;AACzD,YAAQ,KAAK;AACb,QAAI,WAAW,UAAW,YAAW,SAAS,MAAM;AAAA,EACxD,GAAG,CAAC,CAAC;AACL,aAAW,QAAQ,CAAC,UAAU,UAAU,GAAG,KAAK;AAEhD,QAAM,QAAQ,OAAO,WAAW,MAAM,QAAQ,aAAa,IAAI;AAE/D,SACI,gFACI;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,CAAC,YAAY;AACd,qBAAW,UAAU;AACrB,UAAAD,WAAU,KAAK,OAAO;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,SAAS,UAAU;AAAA,QAClC,cAAY;AAAA,QACZ,mBAAiB;AAAA,QAEjB,oBAAkB,CAAC,GAAG,OAAO,UAAU,eAAe,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAChF,gBAAc,aAAa;AAAA,QAC3B;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA,cAAc,IAAI;AAAA,UAClB,EAAE,mBAAmB,QAAQ,sBAAsB,aAAa,CAAC,OAAO;AAAA,UACxE;AAAA,QACJ;AAAA,QACA,SAAS,MAAM,QAAQ,CAAC,MAAM;AAAA,QAC9B,WAAW,CAAC,UAAU;AAClB,cAAI,MAAM,QAAQ,eAAe,CAAC,QAAQ;AACtC,kBAAM,eAAe;AACrB,oBAAQ,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,QAEA;AAAA,wDAAC,gBAAa,MAAM,SAAS,OAAO,KAAK,IAAI,WAAU,wBAAuB;AAAA,UAC9E,8CAAC,UAAK,IAAI,GAAG,OAAO,UAAU,WAAW,GAAG,oBAAoB,CAAC,QAAQ,+BAA+B,GACnG,iBACL;AAAA;AAAA;AAAA,IACJ;AAAA,IACC,UACG;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACJ,GAAG;AAAA,QACJ,cAAY;AAAA,QACZ,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAU;AAAA,QACV;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACI,GAAG;AAAA,YACJ;AAAA,YACA,OAAO;AAAA,YACP,WAAS;AAAA,YACT,UAAU,CAAC,SAAS;AAChB,sBAAQ,IAAI;AACZ,oBAAM;AAAA,YACV;AAAA;AAAA,QACJ;AAAA;AAAA,IACJ,IACA;AAAA,KACR;AAER,CAAC;;;AC9GS,IAAAE,uBAAA;AADV,IAAM,QAAyC;AAAA,EAC3C,MAAM,8CAAC,YAAS,MAAM,IAAI;AAAA,EAC1B,SAAS,8CAAC,mBAAgB,MAAM,IAAI;AAAA,EACpC,SAAS,8CAAC,qBAAkB,MAAM,IAAI;AAAA,EACtC,QAAQ,8CAAC,mBAAgB,MAAM,IAAI;AAAA,EACnC,SAAS,8CAAC,YAAS,MAAM,IAAI;AACjC;AAGO,SAAS,MAAM;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAe;AACX,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAM,SAAS,YAAY,YAAY,YAAY,YAAY,UAAU;AAAA,MACzE,WAAW,GAAG,YAAY,aAAa,OAAO,IAAI,SAAS;AAAA,MAC1D,GAAG;AAAA,MAEH;AAAA,QAAAA,UAAS,QAAQ,OAAO,8CAAC,UAAK,WAAU,kBAAkB,UAAAA,SAAQ,MAAM,OAAO,GAAE;AAAA,QAClF,+CAAC,SAAI,WAAU,kBACV;AAAA,kBAAQ,8CAAC,SAAI,WAAU,mBAAmB,iBAAM,IAAS;AAAA,UACzD,WAAW,8CAAC,SAAI,WAAU,yBAAyB,UAAS,IAAS;AAAA,UACrE,UAAU,8CAAC,SAAI,WAAU,qBAAqB,mBAAQ,IAAS;AAAA,WACpE;AAAA,QACC,UAAU,8CAAC,eAAY,MAAK,MAAK,OAAM,WAAU,WAAU,mBAAkB,SAAS,SAAS,IAAK;AAAA;AAAA;AAAA,EACzG;AAER;;;ACvCQ,IAAAC,uBAAA;AAFD,SAAS,MAAM,EAAE,UAAU,WAAW,MAAAC,OAAM,OAAO,MAAM,UAAU,WAAW,GAAG,UAAU,GAAe;AAC7G,SACI,+CAAC,UAAK,WAAW,GAAG,YAAY,aAAa,IAAI,IAAI,aAAa,OAAO,IAAI,SAAS,GAAI,GAAG,WACxF;AAAA,IAAAA,QAAO,8CAAC,UAAK,WAAU,kBAAkB,UAAAA,OAAK,IAAU;AAAA,IACzD,8CAAC,UAAM,UAAS;AAAA,KACpB;AAER;;;ACxBA,IAAAC,iBAA0D;AA8C1C,IAAAC,uBAAA;AAlBT,SAAS,YAAY;AAAA,EACxB;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AACJ,GAAqB;AACjB,QAAM,cAAU,sBAAM;AACtB,QAAM,gBAAgB,UAAU;AAChC,QAAM,MAAM,gBAAgB,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,QAAQ,MAAO,GAAG,CAAC;AAC9E,QAAM,OAAO,cAAc,GAAG,KAAK,MAAM,GAAG,CAAC;AAC7C,SACI,+CAAC,SAAI,WAAW,GAAG,eAAe,gBAAgB,IAAI,IAAI,gBAAgB,IAAI,IAAI,SAAS,GACtF;AAAA,aAAU,aAAa,CAAC,gBACrB,+CAAC,SAAI,WAAU,uBACV;AAAA,cACG,8CAAC,UAAK,IAAI,SAAS,WAAU,sBACxB,iBACL,IAEA,8CAAC,UAAK;AAAA,MAET,aAAa,CAAC,gBAAgB,8CAAC,UAAK,WAAU,sBAAsB,gBAAK,IAAU;AAAA,OACxF,IACA;AAAA,IACJ;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,mBAAiB,QAAQ,UAAU;AAAA,QACnC,cAAY,QAAQ,SAAY;AAAA,QAChC,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,iBAAe,gBAAgB,SAAY;AAAA,QAC3C,kBAAgB,gBAAgB,SAAY;AAAA,QAC5C,WAAW,GAAG,sBAAsB,iBAAiB,mCAAmC;AAAA,QAExF,wDAAC,SAAI,WAAU,qBAAoB,OAAO,gBAAgB,SAAY,EAAE,OAAO,GAAG,GAAG,IAAI,GAAG;AAAA;AAAA,IAChG;AAAA,KACJ;AAER;AAkBA,IAAM,cAAc,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,IAAI,GAAG,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,GAAG,IAAI,EAAE,KAAK,IAAI,QAAQ,EAAE,EAAE;AAGpG,SAAS,eAAe;AAAA,EAC3B;AAAA,EACA,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,cAAc,YAAY;AAAA,EAC1B;AACJ,GAAwB;AACpB,QAAM,EAAE,KAAK,OAAO,IAAI,YAAY,IAAI;AACxC,QAAM,UAAU,MAAM,UAAU;AAChC,QAAM,gBAAgB,IAAI,KAAK,KAAK;AACpC,QAAM,gBAAgB,UAAU;AAChC,QAAM,MAAM,gBAAgB,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,QAAQ,MAAO,GAAG,CAAC;AAC/E,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,iBAAe;AAAA,MACf,iBAAe;AAAA,MACf,iBAAe,gBAAgB,SAAY;AAAA,MAC3C,WAAW;AAAA,QACP;AAAA,QACA,gBAAgB,IAAI;AAAA,QACpB,iBAAiB;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,OAAO,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,MAEjC;AAAA,uDAAC,SAAI,OAAO,KAAK,QAAQ,KAAK,SAAS,OAAO,GAAG,IAAI,GAAG,IAAI,eAAY,QACpE;AAAA,wDAAC,YAAO,WAAU,6BAA4B,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,GAAG,QAAQ,aAAa,QAAQ,MAAK,QAAO;AAAA,UACpH;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,IAAI,MAAM;AAAA,cACV,IAAI,MAAM;AAAA,cACV,GAAG;AAAA,cACH,aAAa;AAAA,cACb,MAAK;AAAA,cACL,eAAc;AAAA,cACd,iBAAiB;AAAA,cACjB,kBAAkB,iBAAiB,IAAI,MAAM;AAAA,cAC7C,WAAW,cAAc,MAAM,CAAC,IAAI,MAAM,CAAC;AAAA;AAAA,UAC/C;AAAA,WACJ;AAAA,QACC,SAAS,QAAQ,CAAC,gBAAgB,+CAAC,UAAK,WAAU,6BAA6B;AAAA,eAAK,MAAM,GAAG;AAAA,UAAE;AAAA,WAAC,IAAU;AAAA;AAAA;AAAA,EAC/G;AAER;;;AC1IA,IAAAC,iBAAwD;AAmBhD,IAAAC,uBAAA;AAFD,SAAS,SAAS,EAAE,QAAQ,QAAQ,SAAS,IAAI,OAAO,OAAO,QAAQ,OAAO,UAAU,GAAkB;AAC7G,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,eAAe,QAAQ,qBAAqB,UAAU,WAAW,sBAAsB,SAAS;AAAA,MAC9G,OAAO,EAAE,OAAO,OAAO;AAAA,MACvB,eAAY;AAAA;AAAA,EAChB;AAER;AAcO,SAAS,aAAa,EAAE,QAAQ,WAAW,OAAO,GAAG,UAAU,IAAI,GAAsB;AAC5F,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,YAAY,CAAC;AAExD,gCAAU,MAAM;AACZ,QAAI,YAAY,EAAG;AACnB,UAAM,QAAQ,OAAO,WAAW,MAAM,aAAa,IAAI,GAAG,OAAO;AACjE,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EAC1C,GAAG,CAAC,OAAO,CAAC;AAEZ,SACI,8CAAC,SAAI,MAAK,UAAS,cAAY,OAAO,aAAU,QAC3C,sBACG,8CAAC,SAAI,WAAU,oBAAmB,eAAY,QACzC,gBAAM,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,GAAG,UAC9B,+CAAC,SAAgB,WAAU,yBACvB;AAAA,mDAAC,SAAI,WAAU,0BACX;AAAA,oDAAC,YAAS,OAAO,GAAG,KAAO,QAAQ,KAAM,EAAG,KAAK,QAAQ,IAAI;AAAA,MAC7D,8CAAC,YAAS,OAAO,GAAG,KAAO,QAAQ,KAAM,EAAG,KAAK,QAAQ,IAAI,MAAI,MAAC;AAAA,OACtE;AAAA,IACA,8CAAC,YAAS,OAAO,IAAI,QAAQ,IAAI,MAAI,MAAC,OAAM,SAAQ;AAAA,OAL9C,KAMV,CACH,GACL,IACA,MACR;AAER;;;ACjEA,IAAAC,iBAAkC;AAClC,oBAA6G;AA6ChG,IAAAC,uBAAA;AADb,IAAMC,SAAQ;AAAA,EACV,SAAS,8CAAC,mBAAgB,MAAM,IAAI;AAAA,EACpC,OAAO,8CAAC,mBAAgB,MAAM,IAAI;AAAA,EAClC,SAAS,8CAAC,qBAAkB,MAAM,IAAI;AAAA,EACtC,MAAM,8CAAC,YAAS,MAAM,IAAI;AAAA,EAC1B,SAAS,8CAAC,WAAQ,MAAK,MAAK,OAAM,IAAG;AAAA,EACrC,OAAO,8CAAC,SAAM,MAAM,IAAI;AAC5B;AAOO,SAAS,QAAQ;AAAA,EACpB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,SAAS;AAAA,EACT,MAAM;AAAA,EACN;AAAA,EACA;AACJ,GAAiB;AACb,QAAM,eAAW,uBAAuB,IAAI;AAI5C,gCAAU,MAAM;AACZ,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,SAAS,OAAO,MAAM,gBAAgB,WAAY,QAAO;AAC9D,UAAM,QAAQ,MAAM;AAChB,UAAI;AACA,YAAI,MAAM,QAAQ,eAAe,EAAG,OAAM,YAAY;AACtD,cAAM,YAAY;AAAA,MACtB,QAAQ;AAAA,MAER;AAAA,IACJ;AACA,UAAM;AACN,UAAM,WAAW,IAAI,iBAAiB,CAAC,YAAY;AAC/C,UAAI,QAAQ,KAAK,CAAC,WAAW,OAAO,kBAAkB,qBAAqB,OAAO,OAAO,IAAI,EAAG,OAAM;AAAA,IAC1G,CAAC;AACD,aAAS,QAAQ,SAAS,MAAM,EAAE,SAAS,MAAM,YAAY,MAAM,iBAAiB,CAAC,MAAM,EAAE,CAAC;AAC9F,WAAO,MAAM,SAAS,WAAW;AAAA,EACrC,GAAG,CAAC,CAAC;AAEL,SACI,8CAAC,SAAI,KAAK,UAAW,GAAG,eAAe,WAAU,oBAC7C;AAAA,IAAC,cAAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd;AAAA,MACA,OAAOD;AAAA,MACP,WAAW,GAAG,cAAc,SAAS;AAAA,MACrC,oBAAmB;AAAA,MACnB,cAAc,EAAE,WAAW,WAAW;AAAA;AAAA,EAC1C,GACJ;AAER;;;AChHA,IAAAE,iBAA4D;AA6DpD,IAAAC,uBAAA;AA1CR,IAAI,eAAe;AACnB,IAAM,aAAa;AAOZ,SAAS,QAAQ,EAAE,UAAU,OAAO,YAAY,OAAO,QAAQ,IAAI,GAAiB;AACvF,QAAM,gBAAY,uBAAwB,IAAI;AAC9C,QAAM,gBAAY,uBAAwB,IAAI;AAC9C,QAAM,YAAQ,uBAAO,CAAC;AACtB,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM,GAAG;AAChD,QAAM,QAAQ,YAAY,EAAE,MAAM,SAAS,WAAW,aAAa,WAAW,WAAW,QAAQ,EAAE,CAAC;AAEpG,QAAM,OAAO,CAAC,cAAc,UAAU;AAClC,WAAO,aAAa,MAAM,OAAO;AACjC,QAAI,eAAe,KAAK,IAAI,IAAI,eAAe,WAAY,SAAQ,IAAI;AAAA,QAClE,OAAM,UAAU,OAAO,WAAW,MAAM,QAAQ,IAAI,GAAG,KAAK;AAAA,EACrE;AACA,QAAM,OAAO,MAAM;AACf,WAAO,aAAa,MAAM,OAAO;AACjC,YAAQ,CAAC,YAAY;AACjB,UAAI,QAAS,gBAAe,KAAK,IAAI;AACrC,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,gCAAU,MAAM,MAAM,OAAO,aAAa,MAAM,OAAO,GAAG,CAAC,CAAC;AAG5D,gCAAU,MAAM;AACZ,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,YAAY,CAAC,UAAyB;AACxC,UAAI,MAAM,QAAQ,SAAU,MAAK;AAAA,IACrC;AACA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM,SAAS,oBAAoB,WAAW,SAAS;AAAA,EAClE,GAAG,CAAC,IAAI,CAAC;AAET,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAU;AAAA,MACV,gBAAgB,CAAC,UAAU;AACvB,YAAI,MAAM,gBAAgB,QAAS,MAAK;AAAA,MAC5C;AAAA,MACA,gBAAgB;AAAA,MAChB,eAAe;AAAA,MACf,SAAS,CAAC,UAAU;AAChB,YAAI,MAAM,OAAO,QAAQ,gBAAgB,EAAG,MAAK,IAAI;AAAA,MACzD;AAAA,MACA,QAAQ;AAAA,MAEP;AAAA;AAAA,QACA,UACG,8CAAC,UAAK,KAAK,WAAY,GAAG,eAAe,cAAY,OAAO,WAAU,kCAAiC,OAAc,eAAY,QAC5H,iBACL,IACA;AAAA;AAAA;AAAA,EACR;AAER;;;AClFA,IAAAC,iBAAgE;;;ACAhE,IAAAC,iBAA4C;AAG5C,IAAM,mBAAmB;AAOlB,SAAS,eAAe,MAAe,UAAsB;AAChE,QAAM,gBAAY,uBAA0B,IAAI;AAChD,QAAM,kBAAc,uBAAO,QAAQ;AACnC,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAE3C,cAAY,UAAU;AAEtB,gCAAU,MAAM;AACZ,QAAI,KAAM,YAAW,IAAI;AAAA,EAC7B,GAAG,CAAC,IAAI,CAAC;AAET,gCAAU,MAAM;AACZ,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AAEb,QAAI,MAAM;AACN,UAAI,CAAC,OAAO,KAAM,QAAO,UAAU;AACnC;AAAA,IACJ;AAEA,QAAI,OAAO,KAAM,QAAO,MAAM;AAC9B,UAAM,eAAe,OAAO,WAAW,kCAAkC,EAAE;AAC3E,UAAM,QAAQ,OAAO,WAAW,MAAM,WAAW,KAAK,GAAG,eAAe,IAAI,gBAAgB;AAC5F,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EAC1C,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,gCAAU,MAAM;AACZ,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,UAAU,CAAC,QAAS;AAEzB,UAAM,gBAAgB,CAAC,UAAiB;AACpC,YAAM,eAAe;AACrB,kBAAY,QAAQ;AAAA,IACxB;AAIA,UAAM,YAAY,CAAC,UAAsB;AACrC,YAAM,OAAO,OAAO,sBAAsB;AAC1C,aACI,MAAM,UAAU,KAAK,QACrB,MAAM,UAAU,KAAK,SACrB,MAAM,UAAU,KAAK,OACrB,MAAM,UAAU,KAAK;AAAA,IAE7B;AACA,QAAI,iBAAiB;AACrB,UAAM,gBAAgB,CAAC,UAAwB;AAC3C,uBAAiB,MAAM,WAAW,UAAU,UAAU,KAAK;AAAA,IAC/D;AACA,UAAM,UAAU,CAAC,UAAsB;AACnC,UACI,kBACA,MAAM,WAAW,UACjB,UAAU,KAAK;AAAA,MAEf,MAAM,SAAS;AAEf,eAAO,cAAc,IAAI,MAAM,UAAU,EAAE,YAAY,KAAK,CAAC,CAAC;AAClE,uBAAiB;AAAA,IACrB;AAEA,WAAO,iBAAiB,UAAU,aAAa;AAC/C,WAAO,iBAAiB,eAAe,aAAa;AACpD,WAAO,iBAAiB,SAAS,OAAO;AACxC,WAAO,MAAM;AACT,aAAO,oBAAoB,UAAU,aAAa;AAClD,aAAO,oBAAoB,eAAe,aAAa;AACvD,aAAO,oBAAoB,SAAS,OAAO;AAAA,IAC/C;AAAA,EACJ,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,EAAE,WAAW,QAAQ;AAChC;;;ADhCQ,IAAAC,uBAAA;AArBD,SAAS,OAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA;AACJ,GAAgB;AACZ,QAAM,cAAU,sBAAM;AACtB,QAAM,oBAAgB,sBAAM;AAC5B,QAAM,EAAE,WAAW,QAAQ,IAAI,eAAe,MAAM,MAAM;AACtD,QAAI,YAAa,SAAQ;AAAA,EAC7B,CAAC;AAED,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,OACF,gFACI;AAAA,mDAAC,SAAI,WAAU,qBACX;AAAA,oDAAC,QAAG,IAAI,SAAS,WAAU,oBACtB,iBACL;AAAA,MACC,cACG,8CAAC,SAAI,IAAI,eAAe,WAAU,0BAC7B,uBACL,IACA;AAAA,OACR;AAAA,IACC;AAAA,IACA,UAAU,8CAAC,SAAI,WAAU,sBAAsB,mBAAQ,IAAS;AAAA,KACrE;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,GAAG,aAAa,SAAS;AAAA,MACpC,OAAO,EAAE,OAAO,OAAO,KAAK,yBAAyB;AAAA,MACrD,mBAAiB;AAAA,MACjB,oBAAkB,cAAc,gBAAgB;AAAA,MAE/C,qBACG;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,UAAU,CAAC,UAAU;AACjB,kBAAM,eAAe;AACrB,qBAAS,KAAK;AAAA,UAClB;AAAA,UAEC;AAAA;AAAA,MACL,IAEA,8CAAC,SAAI,WAAU,mBAAmB,gBAAK;AAAA;AAAA,EAE/C;AAER;AAoBO,SAAS,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB;AAAA,EACA;AACJ,GAAuB;AACnB,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AAErC,iBAAe,UAAU;AACrB,iBAAa,IAAI;AACjB,aAAS,EAAE;AACX,QAAI;AACA,YAAM,UAAU;AAChB,cAAQ;AAAA,IACZ,SAAS,cAAc;AACnB;AAAA,QACI,wBAAwB,SAAS,aAAa,UACxC,aAAa,UACb;AAAA,MACV;AAAA,IACJ,UAAE;AACE,mBAAa,KAAK;AAAA,IACtB;AAAA,EACJ;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,aAAa,CAAC;AAAA,MACd,OAAO;AAAA,MACP,WAAU;AAAA,MACV,OACI,gFACK;AAAA,sBACG,8CAAC,UAAK,WAAU,0BAAyB,eAAY,QACjD,wDAAC,aAAU,MAAM,IAAI,GACzB,IACA;AAAA,QACH;AAAA,SACL;AAAA,MAEJ;AAAA,MACA,UAAU,MAAM;AACZ,YAAI,CAAC,mBAAmB,CAAC,UAAW,MAAK,QAAQ;AAAA,MACrD;AAAA,MACA,SACI,gFACI;AAAA,sDAAC,UAAO,MAAK,UAAS,UAAU,WAAW,WAAS,MAAC,SAAS,SAAS,oBAEvE;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS,cAAc,WAAW;AAAA,YAClC,UAAU,aAAa;AAAA,YAEtB,sBAAY,kBAAa;AAAA;AAAA,QAC9B;AAAA,SACJ;AAAA,MAGH;AAAA;AAAA,QACA,QACG,8CAAC,UAAK,MAAK,SAAQ,WAAU,oBACxB,iBACL,IACA;AAAA;AAAA;AAAA,EACR;AAER;;;AEzLA,IAAAC,iBAAsC;AA2DtB,IAAAC,uBAAA;AA/BT,SAAS,OAAO;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,cAAc;AAAA,EACd;AACJ,GAAgB;AACZ,QAAM,cAAU,sBAAM;AACtB,QAAM,oBAAgB,sBAAM;AAC5B,QAAM,EAAE,WAAW,QAAQ,IAAI,eAAe,MAAM,MAAM;AACtD,QAAI,YAAa,SAAQ;AAAA,EAC7B,CAAC;AAED,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,YAAY,SAAS,WAAW,EAAE,QAAQ,OAAO,IAAI,aAAa,IAAI,EAAE,OAAO,OAAO,IAAI,oBAAoB;AAEpH,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,WAAW,GAAG,aAAa,cAAc,IAAI,IAAI,SAAS;AAAA,MAC1D,OAAO;AAAA,MACP,mBAAiB;AAAA,MACjB,oBAAkB,cAAc,gBAAgB;AAAA,MAEhD;AAAA,uDAAC,YAAO,WAAU,qBACd;AAAA,yDAAC,SAAI,WAAU,qBACX;AAAA,0DAAC,QAAG,IAAI,SAAS,WAAU,oBACtB,iBACL;AAAA,YACC,cACG,8CAAC,OAAE,IAAI,eAAe,WAAU,0BAC3B,uBACL,IACA;AAAA,aACR;AAAA,UACC,cAAc,8CAAC,eAAY,SAAS,SAAS,IAAK;AAAA,WACvD;AAAA,QACA,8CAAC,SAAI,WAAU,mBAAmB,UAAS;AAAA,QAC1C,SAAS,8CAAC,YAAO,WAAU,qBAAqB,kBAAO,IAAY;AAAA;AAAA;AAAA,EACxE;AAER;;;AC3EA,IAAAC,iBAWO;AA8FC,IAAAC,uBAAA;AA3DD,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AACJ,GAAiB;AACb,QAAM,CAAC,QAAQ,OAAO,IAAI,qBAAqB,MAAM,aAAa,YAAY;AAC9E,QAAM,iBAAa,uBAA2B,IAAI;AAClD,QAAM,eAAW,uBAAuB,IAAI;AAC5C,QAAM,gBAAY,uBAAwB,IAAI;AAC9C,QAAM,SAAK,sBAAM;AACjB,QAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM;AAC7C,QAAM,QAAQ,YAAY,EAAE,MAAM,SAAS,WAAW,aAAa,UAAU,WAAW,QAAQ,GAAG,WAAW,IAAI,CAAC;AAEnH,QAAM,YAAQ;AAAA,IACV,CAAC,WAAkC;AAC/B,cAAQ,KAAK;AACb,UAAI,WAAW,UAAW,YAAW,SAAS,MAAM;AAAA,IACxD;AAAA,IACA,CAAC,OAAO;AAAA,EACZ;AACA,aAAW,QAAQ,CAAC,UAAU,SAAS,GAAG,KAAK;AAE/C,gCAAU,MAAM;AACZ,eAAW,UAAU,UAAU,SAAS;AAAA,EAC5C,CAAC;AAED,gCAAU,MAAM;AACZ,QAAI,CAAC,UAAU,CAAC,UAAW;AAC3B,UAAM,QAAQ,sBAAsB,MAAM;AACtC,YAAM,QAAQ,SAAS;AACvB,YAAM,QAAQ,OAAO;AAAA,QACjB;AAAA,MACJ;AACA,OAAC,SAAS,QAAQ,MAAM;AAAA,IAC5B,CAAC;AACD,WAAO,MAAM,qBAAqB,KAAK;AAAA,EAC3C,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,QAAM,qBAAiB,+BAA4C,OAAO,QACpE,6BAAa,SAAS;AAAA,IAClB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,iBAAiB,SAAS,KAAK;AAAA,IAC/B,SAAS,CAAC,UAAmC;AACzC,cAAQ,MAAM,UAAU,KAAK;AAC7B,UAAI,CAAC,MAAM,iBAAkB,SAAQ,CAAC,MAAM;AAAA,IAChD;AAAA,EACJ,CAAC,IACD;AAEN,SACI,gFACI;AAAA,kDAAC,UAAK,KAAK,WAAW,WAAU,qBAC3B,0BACL;AAAA,IACC,UACG;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACJ,GAAG;AAAA,QACJ,cAAY;AAAA,QACZ;AAAA,QACA,MAAK;AAAA,QACL,cAAY,QAAQ,SAAY;AAAA,QAChC,mBAAiB,QAAQ,GAAG,EAAE,WAAW;AAAA,QACzC,UAAU;AAAA,QACV,WAAW,GAAG,cAAc,eAAe,SAAS;AAAA,QACpD,OAAO,EAAE,GAAG,OAAO,MAAM;AAAA,QAEzB,QAAQ,CAAC,UAAU;AACf,gBAAM,OAAO,MAAM;AACnB,cAAI,QAAQ,CAAC,SAAS,SAAS,SAAS,IAAI,KAAK,CAAC,UAAU,SAAS,SAAS,IAAI,EAAG,SAAQ,KAAK;AAAA,QACtG;AAAA,QAEC;AAAA,kBACG,8CAAC,SAAI,IAAI,GAAG,EAAE,UAAU,WAAU,qBAC7B,iBACL,IACA;AAAA,UACH;AAAA;AAAA;AAAA,IACL,IACA;AAAA,KACR;AAER;;;ACzIA,IAAAC,iBAcO;;;ACdP,IAAAC,iBAA8D;AAE9D,IAAM,eACF;AAEJ,SAAS,MAAM,MAAyC;AACpD,SAAO,OAAO,CAAC,GAAG,KAAK,iBAA8B,YAAY,CAAC,IAAI,CAAC;AAC3E;AAOO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKgD;AAC5C,gCAAU,MAAM;AACZ,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,OAAO,sBAAsB,MAAM;AAC7C,YAAM,OAAO,QAAQ;AAErB,UAAI,MAAM,SAAS,SAAS,aAAa,EAAG;AAC5C,YAAM,IAAI,EAAE,CAAC,GAAG,MAAM;AAAA,IAC1B,CAAC;AACD,WAAO,MAAM,OAAO,qBAAqB,KAAK;AAAA,EAClD,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,SAAO,CAAC,UAAU;AACd,UAAM,OAAO,MAAM,QAAQ,OAAO;AAClC,UAAM,QAAQ,KAAK,QAAQ,SAAS,aAA4B;AAChE,UAAM,OAAO,CAAC,SAAiB;AAC3B,YAAM,eAAe;AACrB,YAAM,OAAO,KAAK,UAAU,KAAK,MAAM,GAAG,MAAM;AAAA,IACpD;AACA,YAAQ,MAAM,KAAK;AAAA,MACf,KAAK;AACD,aAAK,QAAQ,CAAC;AACd;AAAA,MACJ,KAAK;AACD,aAAK,QAAQ,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC;AAC5C;AAAA,MACJ,KAAK;AACD,aAAK,CAAC;AACN;AAAA,MACJ,KAAK;AACD,aAAK,KAAK,SAAS,CAAC;AACpB;AAAA,MACJ,KAAK;AACD,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,gBAAQ;AACR,oBAAY,SAAS,MAAM;AAC3B;AAAA,MACJ,KAAK;AAED,gBAAQ;AACR;AAAA,IACR;AAAA,EACJ;AACJ;;;ADsBQ,IAAAC,uBAAA;AArER,IAAM,kBAAc,8BAAwC,IAAI;AA0BzD,SAAS,KAAK,EAAE,SAAS,UAAU,OAAO,QAAQ,SAAS,QAAQ,OAAO,OAAO,cAAc,OAAO,UAAU,GAAc;AACjI,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,WAAW;AAC5C,QAAM,cAAU,uBAAwB,IAAI;AAC5C,QAAM,cAAU,uBAAuB,IAAI;AAC3C,QAAM,iBAAa,uBAA2B,IAAI;AAClD,QAAM,aAAS,sBAAM;AACrB,QAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,QAAM,gBAAgB,gBAAgB,EAAE,MAAM,SAAS,YAAY,SAAS,MAAM,CAAC;AACnF,QAAM,EAAE,SAAS,MAAM,IAAI,YAAY,IAAI;AAC3C,QAAM,gBAAgB,YAAY;AAAA,IAC9B,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,WAAW,GAAG,QAAQ,QAAQ,QAAQ,IAAI,KAAK;AAAA,IAC/C,QAAQ;AAAA,EACZ,CAAC;AAED,gCAAU,MAAM;AACZ,eAAW,UAAU,QAAQ,SAAS;AAAA,EAC1C,CAAC;AAED,gCAAU,MAAM;AACZ,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,UAAwB;AAC3C,UAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,MAAc,EAAG,SAAQ,KAAK;AAAA,IACvE;AACA,aAAS,iBAAiB,eAAe,eAAe,IAAI;AAC5D,WAAO,MAAM,SAAS,oBAAoB,eAAe,eAAe,IAAI;AAAA,EAChF,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,qBAAiB,+BAAkD,OAAO,QAC1E,6BAAa,SAAS;AAAA,IAClB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,iBAAiB,OAAO,SAAS;AAAA,IACjC,SAAS,CAAC,UAAmC;AACzC,cAAQ,MAAM,UAAU,KAAK;AAC7B,UAAI,CAAC,MAAM,iBAAkB,SAAQ,CAAC,YAAY,CAAC,OAAO;AAAA,IAC9D;AAAA,EACJ,CAAC,IACD;AAEN,SACI,+CAAC,UAAK,KAAK,SAAS,WAAU,WACzB;AAAA;AAAA,IACA,UACG;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACG,OAAO;AAAA,UACH,QAAQ;AACJ,oBAAQ,KAAK;AACb,uBAAW,SAAS,MAAM;AAAA,UAC9B;AAAA,QACJ;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACJ,GAAG;AAAA,YACJ,cAAY;AAAA,YACZ,IAAI;AAAA,YACJ,MAAK;AAAA,YACL,cAAY;AAAA,YACZ,WAAW,GAAG,kBAAkB,eAAe,SAAS;AAAA,YACxD,OAAO,UAAU,SAAY,gBAAgB,EAAE,GAAG,eAAe,MAAM;AAAA,YACvE,WAAW;AAAA,YAEV;AAAA;AAAA,QACL;AAAA;AAAA,IACJ,IACA;AAAA,KACR;AAER;AAcO,IAAM,eAAW,2BAA6C,SAASC,UAC1E,EAAE,MAAAC,OAAM,UAAU,cAAc,OAAO,UAAU,WAAW,UAAU,SAAS,GAAG,YAAY,GAC9F,KACF;AACE,QAAM,WAAO,2BAAW,WAAW;AACnC,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,MAAK;AAAA,MACL,MAAK;AAAA,MACL,UAAU;AAAA,MACV,WAAW,GAAG,iBAAiB,eAAe,8BAA8B,SAAS;AAAA,MACrF,SAAS,CAAC,UAAU;AAChB,kBAAU,KAAK;AACf,YAAI,MAAM,iBAAkB;AAC5B,cAAM,MAAM;AACZ,mBAAW;AAAA,MACf;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,QAAAA,QAAO,8CAAC,UAAK,WAAU,iBAAiB,UAAAA,OAAK,IAAU;AAAA,QACxD,8CAAC,UAAK,WAAU,kBAAkB,UAAS;AAAA,QAC1C,WAAW,8CAAC,SAAI,WAAU,qBAAqB,oBAAS,IAAS;AAAA;AAAA;AAAA,EACtE;AAER,CAAC;AAGM,SAAS,UAAU,EAAE,SAAS,GAA4B;AAC7D,SACI,8CAAC,SAAI,WAAU,wBAAuB,MAAK,gBACtC,UACL;AAER;AAGO,SAAS,gBAAgB;AAC5B,SAAO,8CAAC,SAAI,WAAU,sBAAqB,MAAK,aAAY;AAChE;;;AE3KA,IAAAC,iBAA4E;;;ACG5E,SAAS,MAAM,OAAe,MAAc,QAAQ,MAAc;AAC9D,QAAM,WAAW,KAAK,YAAY;AAClC,MAAI,SAAS,WAAW,KAAK,EAAG,QAAO,MAAM,KAAK,IAAI,SAAS,QAAQ,EAAE,IAAI;AAC7E,QAAM,YAAY,SAAS,QAAQ,IAAI,KAAK,EAAE;AAC9C,MAAI,aAAa,EAAG,QAAO,KAAK,YAAY;AAC5C,QAAM,WAAW,SAAS,QAAQ,KAAK;AACvC,MAAI,YAAY,EAAG,QAAO,KAAK,WAAW;AAC1C,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,WAAW;AACf,MAAI,OAAO;AACX,aAAW,UAAU,OAAO;AACxB,UAAM,QAAQ,SAAS,QAAQ,QAAQ,QAAQ;AAC/C,QAAI,QAAQ,EAAG,QAAO;AACtB,YAAQ,QAAQ;AAChB,eAAW,QAAQ;AAAA,EACvB;AACA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI;AAChC;AAGO,SAAS,eAAe,UAAqB,OAA0B;AAC1E,QAAM,QAAQ,MAAM,KAAK,EAAE,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACpE,MAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,SAAO,SACF,IAAI,CAAC,SAAS,UAAU;AACrB,UAAM,QAAQ,GAAG,QAAQ,SAAS,EAAE,IAAI,QAAQ,YAAY,EAAE,IAAI,QAAQ,QAAQ,EAAE;AACpF,QAAI,QAAQ;AACZ,eAAW,QAAQ,OAAO;AACtB,YAAM,OAAO,KAAK,IAAI,MAAM,MAAM,QAAQ,KAAK,IAAI,KAAK,MAAM,MAAM,OAAO,KAAK,CAAC;AACjF,UAAI,CAAC,KAAM,QAAO;AAClB,eAAS;AAAA,IACb;AAEA,WAAO,EAAE,SAAS,MAAM,SAAS,QAAQ,WAAW,KAAK,KAAK,QAAQ,IAAK;AAAA,EAC/E,CAAC,EACA,OAAO,CAAC,UAAuD,QAAQ,KAAK,CAAC,EAC7E,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAC9B,IAAI,CAAC,UAAU,MAAM,OAAO;AACrC;;;ADyBY,IAAAC,uBAAA;AAjCL,SAAS,eAAe,EAAE,MAAM,SAAS,UAAU,cAAc,wBAAmB,GAAwB;AAC/G,QAAM,EAAE,WAAW,QAAQ,IAAI,eAAe,MAAM,OAAO;AAC3D,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,CAAC;AAChD,QAAM,cAAU,uBAAyB,IAAI;AAC7C,QAAM,aAAS,sBAAM;AACrB,QAAM,cAAU,wBAAQ,MAAM,eAAe,UAAU,KAAK,GAAG,CAAC,UAAU,KAAK,CAAC;AAChF,QAAM,SAAS,QAAQ,KAAK,IAAI,aAAa,QAAQ,SAAS,CAAC,CAAC;AAEhE,gCAAU,MAAM,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1C,gCAAU,MAAM;AACZ,QAAI,KAAM,UAAS,EAAE;AAAA,EACzB,GAAG,CAAC,IAAI,CAAC;AACT,gCAAU,MAAM;AACZ,YAAQ,SAAS,cAAc,sBAAsB,GAAG,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,EAC/F,GAAG,CAAC,aAAa,OAAO,CAAC;AAEzB,MAAI,CAAC,QAAS,QAAO;AAErB,WAAS,IAAI,SAA8B;AACvC,QAAI,CAAC,WAAW,QAAQ,SAAU;AAClC,YAAQ;AAER,WAAO,WAAW,MAAM,QAAQ,IAAI,GAAG,CAAC;AAAA,EAC5C;AAEA,WAAS,KAAK,MAAc;AACxB,QAAI,CAAC,QAAQ,OAAQ;AACrB,mBAAe,CAAC,WAAW,KAAK,IAAI,OAAO,QAAQ,SAAS,CAAC,IAAI,OAAO,QAAQ,UAAU,QAAQ,MAAM;AAAA,EAC5G;AAEA,SACI,+CAAC,YAAO,KAAK,WAAW,WAAU,wBAAuB,cAAW,mBAChE;AAAA,mDAAC,SAAI,WAAU,sBACX;AAAA,oDAAC,cAAW,MAAM,IAAI,WAAU,2BAA0B;AAAA,MAC1D;AAAA,QAAC;AAAA;AAAA,UACG,WAAS;AAAA,UACT,WAAU;AAAA,UACV;AAAA,UACA,MAAK;AAAA,UACL,iBAAc;AAAA,UACd,iBAAe;AAAA,UACf,yBAAuB,SAAS,GAAG,MAAM,IAAI,OAAO,EAAE,KAAK;AAAA,UAC3D,qBAAkB;AAAA,UAClB,OAAO;AAAA,UACP,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,UAChD,WAAW,CAAC,UAAU;AAClB,gBAAI,MAAM,QAAQ,eAAgB,MAAM,WAAW,MAAM,QAAQ,KAAM;AACnE,oBAAM,eAAe;AACrB,mBAAK,CAAC;AAAA,YACV,WAAW,MAAM,QAAQ,aAAc,MAAM,WAAW,MAAM,QAAQ,KAAM;AACxE,oBAAM,eAAe;AACrB,mBAAK,EAAE;AAAA,YACX,WAAW,MAAM,QAAQ,SAAS;AAC9B,oBAAM,eAAe;AACrB,kBAAI,MAAM;AAAA,YACd;AAAA,UACJ;AAAA;AAAA,MACJ;AAAA,MACA,8CAAC,SAAI,WAAU,mBAAkB,iBAAG;AAAA,OACxC;AAAA,IACA,8CAAC,QAAG,KAAK,SAAS,IAAI,QAAQ,MAAK,WAAU,cAAW,YAAW,WAAU,oBACxE,kBAAQ,SACL,QAAQ,IAAI,CAAC,SAAS,UAAU;AAC5B,YAAM,YACF,CAAC,MAAM,KAAK,KAAK,QAAQ,SAAS,QAAQ,UAAU,QAAQ,QAAQ,CAAC,GAAG;AAC5E,YAAM,WAAW,YAAY;AAC7B,aACI,+CAAC,QAAoB,MAAK,gBACrB;AAAA,oBAAY,8CAAC,SAAI,WAAU,qBAAqB,kBAAQ,OAAM,IAAS;AAAA,QACxE;AAAA,UAAC;AAAA;AAAA,YACG,IAAI,GAAG,MAAM,IAAI,QAAQ,EAAE;AAAA,YAC3B,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,iBAAe,QAAQ,QAAQ,QAAQ;AAAA,YACvC,OAAO,QAAQ;AAAA,YACf,WAAW,GAAG,sBAAsB;AAAA,cAChC,8BAA8B;AAAA,cAC9B,gCAAgC,QAAQ,QAAQ,QAAQ;AAAA,YAC5D,CAAC;AAAA,YACD,aAAa,MAAM,eAAe,KAAK;AAAA,YACvC,SAAS,MAAM,IAAI,OAAO;AAAA,YAE1B;AAAA,4DAAC,UAAK,WAAU,oBAAmB,eAAY,QAC1C,kBAAQ,MACb;AAAA,cACA,8CAAC,UAAK,WAAU,qBAAqB,kBAAQ,OAAM;AAAA,cAClD,QAAQ,YAAY,WACjB,8CAAC,UAAK,WAAU,oBAAoB,kBAAQ,UAAS,IACrD,QAAQ,OACR,8CAAC,UAAK,WAAU,oBAAoB,kBAAQ,MAAK,IACjD;AAAA,cACH,QAAQ,WACL,8CAAC,SAAI,WAAU,wBAAwB,kBAAQ,UAAS,IACxD;AAAA,cACH,YAAY,CAAC,QAAQ,WAClB,8CAAC,sBAAmB,MAAM,IAAI,WAAU,qBAAoB,IAC5D;AAAA;AAAA;AAAA,QACR;AAAA,WA9BK,QAAQ,EA+BjB;AAAA,IAER,CAAC,IAED,+CAAC,QAAG,WAAU,qBAAoB;AAAA;AAAA,MAA0B;AAAA,MAAM;AAAA,OAAQ,GAElF;AAAA,KACJ;AAER;;;AE9IA,IAAAC,iBAUO;AAyCK,IAAAC,uBAAA;AA5BZ,IAAM,kBAAc,8BAAuC,IAAI;AAE/D,SAAS,QAAQ,WAAmB;AAChC,QAAM,cAAU,2BAAW,WAAW;AACtC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,GAAG,SAAS,yBAAyB;AACnE,SAAO;AACX;AAEA,IAAM,SAAS,CAAC,UAAkB,MAAM,QAAQ,WAAW,GAAG;AAevD,SAAS,KAAK,EAAE,OAAO,eAAe,IAAI,eAAe,UAAU,aAAa,WAAW,UAAU,GAAG,MAAM,GAAc;AAC/H,QAAM,CAAC,SAAS,MAAM,IAAI,qBAAqB,OAAO,cAAc,aAAa;AACjF,QAAM,aAAS,sBAAM;AACrB,SACI,8CAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,OAAO,SAAS,QAAQ,QAAQ,QAAQ,GACnE,wDAAC,SAAI,WAAW,GAAG,WAAW,YAAY,OAAO,IAAI,SAAS,GAAI,GAAG,OAChE,UACL,GACJ;AAER;AAQO,SAAS,QAAQ,EAAE,WAAW,WAAW,UAAU,GAAG,MAAM,GAAiB;AAChF,QAAM,EAAE,OAAO,OAAO,IAAI,QAAQ,SAAS;AAC3C,QAAM,cAAU,uBAAuB,IAAI;AAC3C,eAAa,SAAS,sCAAsC,KAAK;AAGjE,sCAAgB,MAAM;AAClB,UAAM,OAAO,QAAQ;AACrB,QAAI,CAAC,QAAQ,KAAK,cAAc,oCAAoC,EAAG;AACvE,UAAM,QAAQ,KAAK,cAAiC,6BAA6B;AACjF,QAAI,OAAO,QAAQ,MAAO,QAAO,MAAM,QAAQ,KAAK;AAAA,EACxD,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,WAAS,cAAc,OAAsC;AACzD,gBAAY,KAAK;AACjB,UAAM,OAAO,CAAC,GAAG,MAAM,cAAc,iBAAoC,6BAA6B,CAAC;AACvG,UAAM,QAAQ,KAAK,QAAQ,SAAS,aAAkC;AACtE,QAAI,QAAQ,EAAG;AACf,UAAM,QAAgC,EAAE,YAAY,QAAQ,GAAG,WAAW,QAAQ,GAAG,MAAM,GAAG,KAAK,KAAK,SAAS,EAAE;AACnH,QAAI,EAAE,MAAM,OAAO,OAAQ;AAC3B,UAAM,eAAe;AACrB,UAAM,OAAO,MAAM,MAAM,MAAM,GAAG,IAAK,KAAK,UAAU,KAAK,MAAM;AACjE,SAAK,MAAM;AACX,QAAI,KAAK,QAAQ,MAAO,QAAO,KAAK,QAAQ,KAAK;AAAA,EACrD;AAEA,SACI,+CAAC,SAAI,KAAK,SAAS,MAAK,WAAU,WAAW,GAAG,iBAAiB,SAAS,GAAG,WAAW,eAAgB,GAAG,OACtG;AAAA;AAAA,IACD,8CAAC,UAAK,WAAU,gBAAe,eAAY,QAAO;AAAA,KACtD;AAER;AASO,SAAS,IAAI,EAAE,OAAO,MAAAC,OAAM,WAAW,UAAU,SAAS,GAAG,MAAM,GAAa;AACnF,QAAM,EAAE,OAAO,SAAS,QAAQ,OAAO,IAAI,QAAQ,KAAK;AACxD,QAAM,WAAW,YAAY;AAC7B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,MAAK;AAAA,MACL,IAAI,GAAG,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,MAClC,iBAAe;AAAA,MACf,iBAAe,GAAG,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC/C,UAAU,WAAW,IAAI;AAAA,MACzB,cAAY;AAAA,MACZ,WAAW,GAAG,UAAU,SAAS;AAAA,MACjC,SAAS,CAAC,UAAU;AAChB,kBAAU,KAAK;AACf,YAAI,CAAC,MAAM,iBAAkB,QAAO,KAAK;AAAA,MAC7C;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,QAAAA,QAAO,8CAAC,UAAK,WAAU,gBAAgB,UAAAA,OAAK,IAAU;AAAA,QACtD;AAAA;AAAA;AAAA,EACL;AAER;AAUO,SAAS,SAAS,EAAE,OAAO,cAAc,OAAO,WAAW,UAAU,GAAG,MAAM,GAAkB;AACnG,QAAM,EAAE,OAAO,SAAS,OAAO,IAAI,QAAQ,UAAU;AACrD,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,YAAY,CAAC,YAAa,QAAO;AACtC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,IAAI,GAAG,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACpC,mBAAiB,GAAG,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,MAC/C,UAAU;AAAA,MACV,QAAQ,CAAC;AAAA,MACT,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;;;AC3JA,IAAAC,iBASO;AAwDiB,IAAAC,uBAAA;AApCxB,SAAS,eAAe;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAwB;AACpB,QAAM,SAAK,sBAAM;AACjB,QAAM,eAAW,uBAAuB,IAAI;AAC5C,QAAM,UAAU,IAAI,YAAY;AAGhC,gCAAU,MAAM;AACZ,QAAI,SAAS,QAAS,UAAS,QAAQ,QAAQ,CAAC;AAAA,EACpD,GAAG,CAAC,IAAI,CAAC;AAET,SACI,+CAAC,SAAI,WAAW,GAAG,OAAO,uBAAuB,iBAAiB,SAAS,GAAG,aAAW,MACrF;AAAA,mDAAC,SAAI,WAAU,yBACX;AAAA,oDAAC,WAAQ,WAAU,0BACf;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,IAAI,GAAG,EAAE;AAAA,UACT,WAAU;AAAA,UACV,iBAAe;AAAA,UACf,iBAAe,GAAG,EAAE;AAAA,UACpB;AAAA,UACA,0BAAwB,OAAO,KAAK;AAAA,UACpC,SAAS;AAAA,UAET;AAAA,0DAAC,oBAAiB,MAAM,IAAI,WAAU,0BAAyB;AAAA,YAC9DA,QAAO,8CAAC,UAAK,WAAU,uBAAuB,UAAAA,OAAK,IAAU;AAAA,YAC9D,+CAAC,UAAK,WAAU,yBACZ;AAAA,4DAAC,UAAK,WAAU,wBAAwB,iBAAM;AAAA,cAC7C,WAAW,8CAAC,UAAK,WAAU,2BAA2B,oBAAS,IAAU;AAAA,eAC9E;AAAA;AAAA;AAAA,MACJ,GACJ;AAAA,MACC,UAAU,8CAAC,SAAI,WAAU,0BAA0B,mBAAQ,IAAS;AAAA,OACzE;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACL,IAAI,GAAG,EAAE;AAAA,QACT,MAAK;AAAA,QACL,mBAAiB,GAAG,EAAE;AAAA,QACtB,WAAU;AAAA,QAEV,wDAAC,SAAI,WAAU,uBACX,wDAAC,SAAI,WAAU,0BAA0B,UAAS,GACtD;AAAA;AAAA,IACJ;AAAA,KACJ;AAER;AA0BO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AAAA,EACf;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,CAAC,QAAQ,OAAO,IAAI,qBAAqB,MAAM,aAAa,YAAY;AAC9E,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAM;AAAA,MACN,UAAU,MAAM,QAAQ,CAAC,MAAM;AAAA,MAC/B;AAAA,MACA,WAAW,GAAG,YAAY,WAAW,wBAAwB,SAAS;AAAA;AAAA,EAC1E;AAER;AAQA,IAAM,uBAAmB,8BAA4C,IAAI;AAoBlE,SAAS,UAAU;AAAA,EACtB,OAAO;AAAA,EACP;AAAA,EACA,eAAe,CAAC;AAAA,EAChB;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAmB;AACf,QAAM,CAAC,YAAY,aAAa,IAAI,qBAAqB,OAAO,cAAc,aAAa;AAE3F,WAAS,OAAO,MAAc;AAC1B,UAAM,SAAS,WAAW,SAAS,IAAI;AACvC,QAAI,SAAS,SAAU,eAAc,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAAA,QACpD,eAAc,SAAS,WAAW,OAAO,CAAC,SAAS,SAAS,IAAI,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC;AAAA,EAClG;AAEA,WAAS,cAAc,OAAsC;AACzD,gBAAY,KAAK;AACjB,UAAM,WAAW;AAAA,MACb,GAAG,MAAM,cAAc,iBAAoC,yCAAyC;AAAA,IACxG;AACA,UAAM,QAAQ,SAAS,QAAQ,SAAS,aAAkC;AAC1E,QAAI,QAAQ,EAAG;AACf,UAAM,QAAgC,EAAE,WAAW,QAAQ,GAAG,SAAS,QAAQ,GAAG,MAAM,GAAG,KAAK,SAAS,SAAS,EAAE;AACpH,QAAI,EAAE,MAAM,OAAO,OAAQ;AAC3B,UAAM,eAAe;AACrB,cAAU,MAAM,MAAM,GAAG,IAAK,SAAS,UAAU,SAAS,MAAM,GAAG,MAAM;AAAA,EAC7E;AAEA,SACI,8CAAC,iBAAiB,UAAjB,EAA0B,OAAO,EAAE,QAAQ,CAAC,SAAS,WAAW,SAAS,IAAI,GAAG,QAAQ,aAAa,GAClG,wDAAC,SAAI,WAAW,GAAG,gBAAgB,iBAAiB,OAAO,IAAI,SAAS,GAAG,WAAW,eAAgB,GAAG,OACpG,UACL,GACJ;AAER;AAaO,SAAS,cAAc,EAAE,OAAO,GAAG,MAAM,GAAuB;AACnE,QAAM,cAAU,2BAAW,gBAAgB;AAC3C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,2CAA2C;AACzE,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAI;AAAA,MACJ,MAAM,QAAQ,OAAO,KAAK;AAAA,MAC1B,UAAU,MAAM,QAAQ,OAAO,KAAK;AAAA,MACpC,cAAc,QAAQ;AAAA;AAAA,EAC1B;AAER;;;AClOA,IAAAC,iBAAuF;AA8B/D,IAAAC,uBAAA;AAPjB,SAAS,YAAY,EAAE,OAAAC,QAAO,YAAY,WAAW,QAAQ,cAAc,UAAU,GAAqB;AAC7G,SACI,8CAAC,SAAI,cAAY,OAAO,WAAW,GAAG,kBAAkB,SAAS,GAC7D,wDAAC,QAAG,WAAU,wBACT,UAAAA,OAAM,IAAI,CAAC,MAAM,UAAU;AACxB,UAAM,SAAS,UAAUA,OAAM,SAAS;AACxC,WACI,+CAAC,QAAe,WAAU,wBACrB;AAAA,eACG,8CAAC,UAAK,WAAU,2BAA0B,gBAAa,QAClD,eAAK,OACV,IACA,KAAK,OACL,8CAAC,OAAE,WAAU,wBAAuB,MAAM,KAAK,MAAM,SAAS,KAAK,SAC9D,eAAK,OACV,IAEA,8CAAC,YAAO,MAAK,UAAS,WAAU,wBAAuB,SAAS,KAAK,SAChE,eAAK,OACV;AAAA,MAEH,SAAS,OACN,8CAAC,UAAK,WAAU,6BAA4B,eAAY,QACnD,wBAAc,UAAU,MAAM,8CAAC,oBAAiB,MAAM,IAAI,GAC/D;AAAA,SAjBC,KAmBT;AAAA,EAER,CAAC,GACL,GACJ;AAER;AAgBO,SAAS,cAAc,EAAE,UAAU,UAAU,IAAsB,CAAC,GAAW;AAClF,SAAO,GAAG,WAAW,YAAY,OAAO,EAAE;AAC9C;AAGO,IAAM,WAAO,2BAAyC,SAASC,MAClE,EAAE,UAAU,WAAW,WAAW,OAAO,WAAW,UAAU,QAAQ,KAAK,GAAG,MAAM,GACpF,KACF;AACE,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;AAAA,MACnD,QAAQ,WAAY,UAAU,WAAY;AAAA,MAC1C,KAAK,WAAY,OAAO,wBAAyB;AAAA,MAChD,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,WACG,gFACI;AAAA,wDAAC,oBAAiB,MAAM,IAAI,WAAU,qBAAoB;AAAA,UAC1D,8CAAC,UAAK,WAAU,sBAAqB,mCAAqB;AAAA,WAC9D,IACA;AAAA;AAAA;AAAA,EACR;AAER,CAAC;;;AC5BW,IAAAC,uBAAA;AA5CL,SAAS,gBAAgB,MAAc,WAAmB,eAAe,GAAG,gBAAgB,GAAW;AAC1G,QAAM,QAAQ,CAAC,MAAc,OAAe,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,KAAK,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC;AACjH,QAAM,aAAa,MAAM,GAAG,KAAK,IAAI,eAAe,SAAS,CAAC;AAC9D,QAAM,WAAW,MAAM,KAAK,IAAI,YAAY,gBAAgB,GAAG,gBAAgB,CAAC,GAAG,SAAS;AAC5F,QAAM,gBAAgB,KAAK;AAAA,IACvB,KAAK,IAAI,OAAO,cAAc,YAAY,gBAAgB,eAAe,IAAI,CAAC;AAAA,IAC9E,gBAAgB;AAAA,EACpB;AACA,QAAM,cAAc,KAAK;AAAA,IACrB,KAAK,IAAI,OAAO,cAAc,gBAAgB,eAAe,IAAI,CAAC;AAAA,IAClE,SAAS,SAAS,IAAI,SAAS,CAAC,IAAK,IAAI,YAAY;AAAA,EACzD;AACA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,GAAI,gBAAgB,gBAAgB,IAC7B,CAAC,WAAW,IACb,gBAAgB,IAAI,YAAY,gBAC9B,CAAC,gBAAgB,CAAC,IAClB,CAAC;AAAA,IACT,GAAG,MAAM,eAAe,WAAW;AAAA,IACnC,GAAI,cAAc,YAAY,gBAAgB,IACvC,CAAC,SAAS,IACX,YAAY,gBAAgB,gBAC1B,CAAC,YAAY,aAAa,IAC1B,CAAC;AAAA,IACT,GAAG;AAAA,EACP;AACJ;AAGO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AACJ,GAAoB;AAChB,QAAMC,SAAQ,gBAAgB,MAAM,WAAW,cAAc,aAAa;AAC1E,QAAM,KAAK,CAAC,SAAiB,aAAa,KAAK,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,SAAS,CAAC;AAChF,SACI,8CAAC,SAAI,cAAY,OAAO,WAAW,GAAG,iBAAiB,kBAAkB,IAAI,IAAI,SAAS,GACtF,yDAAC,QAAG,WAAU,uBACV;AAAA,kDAAC,QACG;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAW;AAAA,QACX,UAAU,QAAQ;AAAA,QAClB,SAAS,MAAM,GAAG,OAAO,CAAC;AAAA,QAE1B,wDAAC,mBAAgB,MAAM,IAAI;AAAA;AAAA,IAC/B,GACJ;AAAA,IACCA,OAAM;AAAA,MAAI,CAAC,SACR,OAAO,SAAS,WACZ,8CAAC,QACG;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,WAAU;AAAA,UACV,gBAAc,SAAS,OAAO,SAAS;AAAA,UACvC,cAAY,QAAQ,IAAI;AAAA,UACxB,SAAS,MAAM,GAAG,IAAI;AAAA,UAErB;AAAA;AAAA,MACL,KATK,IAUT,IAEA,8CAAC,QAAc,WAAU,sBAAqB,eAAY,QAAO,sBAAxD,IAET;AAAA,IAER;AAAA,IACA,8CAAC,QACG;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,WAAU;AAAA,QACV,cAAW;AAAA,QACX,UAAU,QAAQ;AAAA,QAClB,SAAS,MAAM,GAAG,OAAO,CAAC;AAAA,QAE1B,wDAAC,oBAAiB,MAAM,IAAI;AAAA;AAAA,IAChC,GACJ;AAAA,KACJ,GACJ;AAER;;;AClHA,IAAAC,iBAAsC;AAgDW,IAAAC,uBAAA;AAhB1C,SAAS,MAAM,EAAE,OAAAC,QAAO,UAAU,GAAG,cAAc,YAAY,OAAO,QAAQ,SAAS,UAAU,GAAe;AACnH,QAAM,WAAWA,OAAM,IAAI,CAAC,MAAM,UAAU,KAAK,WAAW,QAAQ,UAAU,SAAS,UAAU,UAAU,YAAY,WAAW;AAClI,QAAM,YAAY,SAAS,OAAO,CAAC,WAAW,WAAW,MAAM,EAAE;AACjE,QAAM,gBAAY,sBAAM;AAExB,QAAM,OACF,8CAAC,QAAG,WAAU,kBACT,UAAAA,OAAM,IAAI,CAAC,MAAM,UAAU;AACxB,UAAM,SAAS,SAAS,KAAK;AAC7B,WACI;AAAA,MAAC;AAAA;AAAA,QAEG,WAAW,GAAG,kBAAkB,mBAAmB,MAAM,EAAE;AAAA,QAC3D,gBAAc,WAAW,YAAY,SAAS;AAAA,QAE9C;AAAA,wDAAC,UAAK,WAAU,oBACX,qBAAW,SAAS,8CAAC,aAAU,MAAM,IAAI,aAAa,GAAG,IAAK,QAAQ,GAC3E;AAAA,UACA,+CAAC,UAAK,WAAU,kBACZ;AAAA,2DAAC,UAAK,WAAU,mBACX;AAAA,yBAAW,SAAS,8CAAC,UAAK,WAAU,sBAAqB,oBAAM,IAAU;AAAA,cACzE,KAAK;AAAA,eACV;AAAA,YACC,KAAK,gBAAgB,gBAAgB,gBAAgB,WAAW,UAC7D,8CAAC,UAAK,WAAU,yBAAyB,eAAK,aAAY,IAC1D;AAAA,aACR;AAAA,UACC,KAAK,UAAU,WAAW,UAAU,gBAAgB,aACjD,8CAAC,UAAK,WAAU,oBAAoB,eAAK,QAAO,IAChD;AAAA;AAAA;AAAA,MAlBC;AAAA,IAmBT;AAAA,EAER,CAAC,GACL;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,YAAY,aAAa,WAAW,IAAI,SAAS;AAAA,MAC/D,mBAAiB,SAAS,gBAAgB,aAAa,YAAY;AAAA,MACnE,cAAY,SAAS,gBAAgB,aAAa,SAAY;AAAA,MAE7D;AAAA,iBAAS,gBAAgB,aACtB,+CAAC,SAAI,WAAU,oBACX;AAAA,wDAAC,QAAG,IAAI,WAAW,WAAU,qBACxB,iBACL;AAAA,UACA,+CAAC,UAAK,WAAU,mBACX;AAAA;AAAA,YAAU;AAAA,YAAKA,OAAM;AAAA,YAAO;AAAA,aACjC;AAAA,WACJ,IACA;AAAA,QACH;AAAA;AAAA;AAAA,EACL;AAER;;;ACvFA,IAAAC,iBAA2G;AAmBnG,IAAAC,uBAAA;AAFD,SAAS,QAAQ,EAAE,OAAO,SAAS,cAAc,YAAY,UAAU,UAAU,GAAiB;AACrG,SACI,+CAAC,SAAI,cAAY,OAAO,WAAW,GAAG,UAAU,WAAW,WAAW,IAAI,SAAS,GAC9E;AAAA,eAAW,gBAAgB,aAAa,8CAAC,UAAK,WAAU,mBAAmB,mBAAQ,IAAU;AAAA,IAC7F;AAAA,KACL;AAER;AAeO,IAAM,cAAU,2BAAsC,SAASC,SAClE,EAAE,MAAAC,OAAM,SAAS,OAAO,WAAW,UAAU,OAAO,UAAU,MAAM,KAAK,GAAG,YAAY,GACxF,KACF;AACE,QAAM,UACF,gFACK;AAAA,IAAAA,QAAO,8CAAC,UAAK,WAAU,gBAAgB,UAAAA,OAAK,IAAU;AAAA,IACvD,8CAAC,UAAK,WAAU,iBAAiB,UAAS;AAAA,IACzC,QAAQ,SAAY,8CAAC,UAAK,WAAU,eAAe,eAAI,IAAU;AAAA,KACtE;AAEJ,QAAM,SAAS;AAAA,IACX,gBAAgB,SAAU,SAAmB;AAAA,IAC7C,WAAW,GAAG,gBAAgB,UAAU,wBAAwB,SAAS;AAAA,EAC7E;AACA,MAAI,SAAS,QAAW;AACpB,WACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACC,GAAG;AAAA,QACH,GAAI;AAAA,QAEJ;AAAA;AAAA,IACL;AAAA,EAER;AACA,SACI,8CAAC,YAAO,KAAoC,MAAa,GAAG,QAAS,GAAG,aACnE,mBACL;AAER,CAAC;;;ACvED,IAAAC,iBAAkD;AA0HvB,IAAAC,uBAAA;AA5D3B,SAAS,QAAQ,GAAoB,GAAoB;AACrD,MAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,IAAI;AAC/D,SAAO,OAAO,CAAC,EAAE,cAAc,OAAO,CAAC,GAAG,QAAW,EAAE,SAAS,MAAM,aAAa,OAAO,CAAC;AAC/F;AAGO,SAAS,MAA0B;AAAA,EACtC;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB;AAAA,EACA,sBAAsB,CAAC;AAAA,EACvB;AAAA,EACA,eAAe;AAAA,EACf,UAAU;AAAA,EACV,eAAe;AAAA,EACf;AAAA,EACA;AACJ,GAAoB;AAChB,QAAM,CAAC,aAAa,OAAO,IAAI,qBAA4C,MAAM,aAAa,YAAqD;AACnJ,QAAM,CAAC,UAAU,WAAW,IAAI,qBAAqB,cAAc,qBAAqB,iBAAiB;AACzG,QAAM,QAAQ,CAAC,QAAmB,OAAO,WAAW,aAAa,OAAO,GAAG,IAAK,IAAI,MAAM;AAC1F,QAAM,QAAQ,CAAC,KAAU,QAAiB,IAAgC,GAAG;AAE7E,QAAM,aAAS,wBAAQ,MAAM;AACzB,QAAI,CAAC,eAAe,WAAY,QAAO;AACvC,UAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,YAAY,GAAG;AAC5D,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,CAAC,QAAc,OAAO,YAAY,OAAO,UAAU,GAAG,IAAK,MAAM,KAAK,OAAO,GAAG;AAC9F,UAAM,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AACnE,WAAO,YAAY,cAAc,eAAe,OAAO,QAAQ,IAAI;AAAA,EACvE,GAAG,CAAC,MAAM,SAAS,aAAa,UAAU,CAAC;AAE3C,QAAM,UAAU,OAAO,IAAI,KAAK;AAChC,QAAM,gBAAgB,QAAQ,OAAO,CAAC,QAAQ,SAAS,SAAS,GAAG,CAAC,EAAE;AAEtE,WAAS,WAAW,KAAa;AAC7B;AAAA,MACI,aAAa,QAAQ,MACf,EAAE,KAAK,WAAW,YAAY,cAAc,cAAc,eAAe,YAAY,IACrF,EAAE,KAAK,WAAW,YAAY;AAAA,IACxC;AAAA,EACJ;AAEA,QAAM,aAAa,kBAAkB;AAErC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,iBAAiB,gBAAgB,yBAAyB,SAAS;AAAA,MACjF,OAAO,YAAY,EAAE,UAAU,IAAI;AAAA,MACnC,UAAU,YAAY,IAAI;AAAA,MAE1B,yDAAC,WAAM,WAAW,GAAG,YAAY,aAAa,OAAO,EAAE,GAClD;AAAA,kBAAU,8CAAC,aAAQ,WAAW,GAAG,qBAAqB,eAAe,oBAAoB,GAAI,mBAAQ,IAAa;AAAA,QACnH,8CAAC,WACG,yDAAC,QACI;AAAA,uBACG,8CAAC,QAAG,WAAU,oBAAmB,OAAM,OACnC;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,cAAW;AAAA,cACX,SAAS,OAAO,SAAS,KAAK,kBAAkB,OAAO;AAAA,cACvD,eAAe,gBAAgB,KAAK,gBAAgB,OAAO;AAAA,cAC3D,UAAU,CAAC,UACP;AAAA,gBACI,MAAM,OAAO,UACP,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,OAAO,CAAC,CAAC,IACtC,SAAS,OAAO,CAAC,QAAQ,CAAC,QAAQ,SAAS,GAAG,CAAC;AAAA,cACzD;AAAA;AAAA,UAER,GACJ,IACA;AAAA,UACH,QAAQ,IAAI,CAAC,WAAW;AACrB,kBAAM,YAAY,aAAa,QAAQ,OAAO,MAAM,YAAY,YAAY;AAC5E,mBACI;AAAA,cAAC;AAAA;AAAA,gBAEG,OAAM;AAAA,gBACN,aAAW,cAAc,OAAO,WAAW,SAAS;AAAA,gBACpD,WAAW,GAAG,mBAAmB,OAAO,SAAS,OAAO,EAAE;AAAA,gBAC1D,OAAO,OAAO,UAAU,SAAY,EAAE,OAAO,OAAO,MAAM,IAAI;AAAA,gBAE7D,iBAAO,WACJ,+CAAC,YAAO,MAAK,UAAS,WAAU,kBAAiB,SAAS,MAAM,WAAW,OAAO,GAAG,GAChF;AAAA,yBAAO;AAAA,kBACR,8CAAC,UAAK,WAAW,GAAG,uBAAuB,aAAa,6BAA6B,GAChF,wBAAc,cACX,8CAAC,eAAY,MAAM,IAAI,IACvB,cAAc,eACd,8CAAC,iBAAc,MAAM,IAAI,IAEzB,8CAAC,sBAAmB,MAAM,IAAI,GAEtC;AAAA,mBACJ,IAEA,OAAO;AAAA;AAAA,cApBN,OAAO;AAAA,YAsBhB;AAAA,UAER,CAAC;AAAA,WACL,GACJ;AAAA,QACA,8CAAC,WACI,iBAAO,WAAW,IACf,8CAAC,QACG,wDAAC,QAAG,WAAU,mBAAkB,SAAS,QAAQ,UAAU,aAAa,IAAI,IACvE,wBACL,GACJ,IAEA,OAAO,IAAI,CAAC,QAAQ;AAChB,gBAAM,MAAM,MAAM,GAAG;AACrB,gBAAM,aAAa,SAAS,SAAS,GAAG;AACxC,iBACI,+CAAC,QAAa,WAAW,GAAG,cAAc,yBAAyB,GAC9D;AAAA,yBACG,8CAAC,QAAG,WAAU,oBACV;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAW;AAAA,gBACX,SAAS;AAAA,gBACT,UAAU,CAAC,UACP;AAAA,kBACI,MAAM,OAAO,UAAU,CAAC,GAAG,UAAU,GAAG,IAAI,SAAS,OAAO,CAAC,MAAM,MAAM,GAAG;AAAA,gBAChF;AAAA;AAAA,YAER,GACJ,IACA;AAAA,YACH,QAAQ,IAAI,CAAC,WACV,8CAAC,QAAoB,WAAW,GAAG,mBAAmB,OAAO,SAAS,OAAO,EAAE,GAC1E,iBAAO,SAAS,OAAO,OAAO,GAAG,IAAK,MAAM,KAAK,OAAO,GAAG,KADvD,OAAO,GAEhB,CACH;AAAA,eAnBI,GAoBT;AAAA,QAER,CAAC,GAET;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;ACjLY,IAAAC,uBAAA;AAbZ,SAAS,UAAU,EAAE,OAAO,GAAyB;AACjD,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,MAAM,KAAK,IAAI,GAAG,MAAM;AAC9B,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,SAAS,OAAO,IAAI,CAAC,OAAO,UAAU;AACxC,UAAM,IAAK,SAAS,OAAO,SAAS,KAAM;AAC1C,UAAM,IAAI,MAAO,QAAQ,OAAO,OAAQ;AACxC,WAAO,CAAC,GAAG,CAAC;AAAA,EAChB,CAAC;AACD,QAAM,OAAO,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,QAAQ,MAAM,GAAG,GAAG,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAC1G,QAAM,CAAC,OAAO,KAAK,IAAI,OAAO,OAAO,SAAS,CAAC;AAC/C,SACI,+CAAC,SAAI,WAAU,kBAAiB,eAAY,QACxC;AAAA,mDAAC,SAAI,SAAQ,cAAa,qBAAoB,QAC1C;AAAA,oDAAC,UAAK,GAAG,GAAG,IAAI,oBAAoB,WAAU,uBAAsB;AAAA,MACpE,8CAAC,UAAK,GAAG,MAAM,WAAU,uBAAsB,cAAa,sBAAqB;AAAA,OACrF;AAAA,IAEA,8CAAC,UAAK,WAAU,sBAAqB,OAAO,EAAE,MAAM,GAAG,KAAK,KAAK,KAAK,GAAI,QAAQ,KAAM,GAAG,IAAI,GAAG;AAAA,KACtG;AAER;AAGO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAAC,OAAM,QAAQ,YAAY,aAAa,OAAO,UAAU,GAAc;AACvG,QAAM,OAAO,eAAe,QAAQ,WAAW,GAAG,IAAI,aAAa,QAAQ,KAAK,UAAU,EAAE,IAAI,aAAa;AAC7G,QAAM,SAAS,SAAS,CAAC,QAAQ,KAAK,MAAM,IAAI;AAChD,SACI,+CAAC,SAAI,WAAW,GAAG,WAAW,SAAS,GACnC;AAAA,mDAAC,SAAI,WAAU,kBACV;AAAA,MAAAA,QAAO,8CAAC,UAAK,WAAU,iBAAiB,UAAAA,OAAK,IAAU;AAAA,MACxD,8CAAC,UAAM,iBAAM;AAAA,OACjB;AAAA,IACA,+CAAC,SAAI,WAAU,gBACX;AAAA,oDAAC,UAAK,WAAU,kBAAkB,iBAAM;AAAA,MACvC,SACG,+CAAC,UAAK,WAAW,GAAG,mBAAmB,oBAAoB,IAAI,EAAE,GAC5D;AAAA,iBAAS,YAAY,OAAO,SAAS,8CAAC,eAAY,MAAM,IAAI,IAAK,8CAAC,iBAAc,MAAM,IAAI;AAAA,QAC1F;AAAA,SACL,IACA;AAAA,OACR;AAAA,IACC,cAAc,8CAAC,SAAI,WAAU,wBAAwB,uBAAY,IAAS;AAAA,IAC1E,SAAS,MAAM,SAAS,IAAI,8CAAC,aAAU,QAAQ,OAAO,IAAK;AAAA,KAChE;AAER;;;ACrEA,IAAAC,iBAA8E;AA+Hf,IAAAC,uBAAA;AAxF/D,SAAS,QAAQ,OAAuB,UAAuB,QAAiB,QAAQ,GAAU;AAC9F,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC3B,UAAM,OAAO,SAAS,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AACtD,UAAM,WAAW,KAAK,aAAa;AACnC,UAAM,MAAW,EAAE,MAAM,MAAM,OAAO,QAAQ,SAAS;AACvD,WAAO,YAAY,SAAS,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ,KAAK,UAAW,UAAU,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG;AAAA,EAC/G,CAAC;AACL;AAEA,SAAS,WAAW,OAAuB,QAA2B;AAClE,SAAO,MAAM,QAAQ,CAAC,SAAS;AAC3B,UAAM,OAAO,SAAS,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AACtD,WAAO,KAAK,WAAW,CAAC,MAAM,GAAG,WAAW,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC;AAAA,EACzE,CAAC;AACL;AAMO,SAAS,SAAS;AAAA,EACrB,OAAAC;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR;AACJ,GAAkB;AACd,QAAM,CAAC,SAAS,UAAU,IAAI,qBAAqB,UAAU,iBAAiB,QAAQ;AACtF,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,MAAM,IAAI,IAAI,oBAAoB,QAAQ,WAAWA,MAAK,IAAI,eAAe,CAAC;AACvH,QAAM,WAAO,wBAAQ,MAAM,QAAQA,QAAO,QAAQ,GAAG,CAACA,QAAO,QAAQ,CAAC;AACtE,QAAM,CAAC,WAAW,YAAY,QAAI,yBAA6B;AAC/D,QAAM,WAAO,uBAAO,oBAAI,IAA2B,CAAC;AACpD,QAAM,UAAU,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,SAAS,IAAI,aAAa,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,IAAI;AAEhI,WAAS,MAAM,MAA0B;AACrC,QAAI,CAAC,KAAM;AACX,iBAAa,IAAI;AACjB,SAAK,QAAQ,IAAI,IAAI,GAAG,MAAM;AAAA,EAClC;AAEA,WAAS,OAAO,MAAc,MAAgB;AAC1C,gBAAY,CAAC,aAAa;AACtB,YAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,UAAI,QAAQ,CAAC,KAAK,IAAI,IAAI,EAAG,MAAK,IAAI,IAAI;AAAA,UACrC,MAAK,OAAO,IAAI;AACrB,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAEA,WAAS,SAAS,KAAU;AACxB,QAAI,IAAI,SAAU,QAAO,IAAI,IAAI;AAAA,QAC5B,YAAW,IAAI,IAAI;AAAA,EAC5B;AAEA,WAAS,UAAU,OAAqC,KAAU;AAC9D,UAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAM,WAAuC;AAAA,MACzC,WAAW,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,IAAI;AAAA,MAC5C,SAAS,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,IAAI;AAAA,MAC1C,MAAM,MAAM,MAAM,KAAK,CAAC,GAAG,IAAI;AAAA,MAC/B,KAAK,MAAM,MAAM,KAAK,KAAK,SAAS,CAAC,GAAG,IAAI;AAAA,MAC5C,YAAY,MAAM;AACd,YAAI,CAAC,IAAI,SAAU;AACnB,YAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAG,QAAO,IAAI,MAAM,IAAI;AAAA,YAC7C,OAAM,KAAK,QAAQ,CAAC,GAAG,UAAU,IAAI,QAAQ,IAAI,KAAK,QAAQ,CAAC,EAAG,OAAO,MAAS;AAAA,MAC3F;AAAA,MACA,WAAW,MAAM;AACb,YAAI,IAAI,YAAY,SAAS,IAAI,IAAI,IAAI,EAAG,QAAO,IAAI,MAAM,KAAK;AAAA,YAC7D,OAAM,IAAI,MAAM;AAAA,MACzB;AAAA,MACA,OAAO,MAAM,SAAS,GAAG;AAAA,MACzB,KAAK,MAAM,SAAS,GAAG;AAAA,IAC3B;AACA,UAAM,UAAU,SAAS,MAAM,GAAG;AAClC,QAAI,CAAC,QAAS;AACd,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,YAAQ;AAAA,EACZ;AAEA,WAAS,OAAO,OAAuB,QAAiB,QAAQ,GAAc;AAC1E,WAAO,MAAM,IAAI,CAAC,SAAS;AACvB,YAAM,OAAO,SAAS,GAAG,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK;AACtD,YAAM,MAAM,KAAK,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AACpD,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,SAAS,IAAI,YAAY,SAAS,IAAI,IAAI;AAChD,YAAMC,QAAO,KAAK,SAAS,IAAI,WAAW,SAAS,8CAAC,kBAAe,MAAM,IAAI,IAAK,8CAAC,cAAW,MAAM,IAAI,IAAK,8CAAC,YAAS,MAAM,IAAI;AACjI,aACI;AAAA,QAAC;AAAA;AAAA,UAEG,KAAK,CAAC,YAAY;AACd,gBAAI,QAAS,MAAK,QAAQ,IAAI,MAAM,OAAO;AAAA,gBACtC,MAAK,QAAQ,OAAO,IAAI;AAAA,UACjC;AAAA,UACA,MAAK;AAAA,UACL,cAAY;AAAA,UACZ,iBAAe,IAAI,WAAW,SAAS;AAAA,UACvC,iBAAe,IAAI,WAAW,SAAY,YAAY;AAAA,UACtD,UAAU,YAAY,OAAO,IAAI;AAAA,UACjC,WAAU;AAAA,UACV,WAAW,CAAC,UAAU,UAAU,OAAO,GAAG;AAAA,UAC1C,SAAS,CAAC,UAAU;AAChB,gBAAI,MAAM,WAAW,MAAM,cAAe,cAAa,IAAI;AAAA,UAC/D;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACG,WAAW,GAAG,gBAAgB,CAAC,IAAI,YAAY,YAAY,QAAQ,wBAAwB;AAAA,gBAC3F,OAAO;AAAA,gBACP,SAAS,MAAM;AACX,wBAAM,IAAI;AACV,2BAAS,GAAG;AAAA,gBAChB;AAAA,gBAEC;AAAA,sBAAI,WACD,8CAAC,oBAAiB,MAAM,IAAI,WAAW,GAAG,oBAAoB,UAAU,wBAAwB,GAAG,IAEnG,8CAAC,UAAK,WAAU,mBAAkB;AAAA,kBAEtC,8CAAC,UAAK,WAAW,GAAG,iBAAiB,IAAI,YAAY,uBAAuB,GAAI,UAAAA,OAAK;AAAA,kBACrF,8CAAC,UAAK,WAAU,iBAAiB,eAAK,MAAK;AAAA,kBAC1C,KAAK,OAAO,8CAAC,UAAK,WAAU,iBAAiB,eAAK,MAAK,IAAU;AAAA;AAAA;AAAA,YACtE;AAAA,YACC,UAAU,KAAK,SAAU,SAAS,IAC/B,8CAAC,QAAG,MAAK,SAAQ,WAAU,kBACtB,iBAAO,KAAK,UAAW,MAAM,QAAQ,CAAC,GAC3C,IACA;AAAA;AAAA;AAAA,QArCC;AAAA,MAsCT;AAAA,IAER,CAAC;AAAA,EACL;AAEA,SACI,8CAAC,QAAG,MAAK,QAAO,cAAY,OAAO,WAAW,GAAG,WAAW,SAAS,GAChE,iBAAOD,MAAK,GACjB;AAER;;;ACxJyB,IAAAE,uBAAA;AAJlB,SAAS,WAAW,EAAE,OAAO,aAAa,MAAAC,OAAM,SAAS,WAAW,OAAO,UAAU,GAAoB;AAC5G,SACI,+CAAC,SAAI,WAAW,GAAG,YAAY,YAAY,sBAAsB,SAAS,GACtE;AAAA,kDAAC,UAAK,WAAU,kBAAiB,eAAY,QACxC,UAAAA,SAAQ,8CAAC,aAAU,MAAM,IAAI,GAClC;AAAA,IACA,+CAAC,SAAI,WAAU,kBACX;AAAA,oDAAC,OAAE,WAAU,mBAAmB,iBAAM;AAAA,MACrC,cAAc,8CAAC,OAAE,WAAU,yBAAyB,uBAAY,IAAO;AAAA,OAC5E;AAAA,IACC,UAAU,8CAAC,SAAI,WAAU,qBAAqB,mBAAQ,IAAS;AAAA,KACpE;AAER;;;ACXQ,IAAAC,uBAAA;AAHD,SAAS,IAAI,EAAE,UAAU,UAAU,WAAW,OAAO,MAAM,MAAAC,OAAM,aAAa,WAAW,UAAU,GAAG,MAAM,GAAa;AAC5H,QAAM,OAAO,gBAAgB,OAAO,aAAa,WAAW,WAAW;AACvE,SACI,+CAAC,UAAK,WAAW,GAAG,UAAU,WAAW,OAAO,IAAI,WAAW,IAAI,IAAI,YAAY,qBAAqB,SAAS,GAAI,GAAG,OACnH;AAAA,IAAAA,QAAO,8CAAC,UAAK,WAAU,gBAAgB,UAAAA,OAAK,IAAU;AAAA,IACvD,8CAAC,UAAK,WAAU,iBAAiB,UAAS;AAAA,IACzC,WACG,8CAAC,YAAO,MAAK,UAAS,WAAU,kBAAiB,cAAY,UAAU,IAAI,IAAI,SAAS,UACpF,wDAAC,SAAM,MAAM,IAAI,GACrB,IACA;AAAA,KACR;AAER;AASO,SAAS,SAAS,EAAE,OAAO,WAAW,UAAU,GAAG,MAAM,GAAkB;AAC9E,SACI,8CAAC,SAAI,MAAK,SAAQ,cAAY,OAAO,WAAW,GAAG,gBAAgB,SAAS,GAAI,GAAG,OAC9E,UACL;AAER;AAkBO,SAAS,YAAY,EAAE,OAAO,MAAM,OAAO,OAAO,MAAM,QAAQ,UAAU,UAAU,GAAqB;AAC5G,QAAM,SACF;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,aAAa,cAAc,IAAI,IAAI,UAAU,YAAY,mBAAmB;AAAA,MAC1F,OAAO,EAAE,YAAY,MAAM;AAAA,MAC1B,GAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,cAAc,KAAK,IAAI,EAAE,eAAe,KAAK;AAAA;AAAA,EACtF;AAEJ,MAAI,CAAC,QAAQ,CAAC,MAAO,QAAO,8CAAC,UAAK,WAAuB,kBAAO;AAChE,SACI,+CAAC,UAAK,WAAW,GAAG,mBAAmB,SAAS,GAC3C;AAAA;AAAA,IACD,+CAAC,UAAK,WAAU,yBACX;AAAA,aAAO,8CAAC,UAAK,WAAU,yBAAyB,gBAAK,IAAU;AAAA,MAChE,8CAAC,UAAK,WAAU,0BAA0B,iBAAM;AAAA,OACpD;AAAA,KACJ;AAER;;;ACrFA,IAAAC,iBAAyB;AA+BT,IAAAC,uBAAA;AAXT,SAAS,OAAO,EAAE,MAAM,KAAK,OAAO,MAAM,OAAO,UAAU,GAAgB;AAC9E,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAiB;AACvD,QAAM,YAAY,OAAO,QAAQ;AAEjC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,aAAa,cAAc,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,oBAAoB,SAAS;AAAA,MACxG,GAAI,QAAQ,EAAE,MAAM,OAAO,cAAc,MAAM,IAAI,EAAE,eAAe,KAAK;AAAA,MAEzE,sBACG,8CAAC,SAAI,KAAU,KAAI,IAAG,WAAU,oBAAmB,SAAS,MAAM,eAAe,GAAG,GAAG,IAEvF,YAAY,8CAAC,YAAS,MAAM,SAAS,OAAO,KAAK,SAAS,OAAO,KAAK,IAAI;AAAA;AAAA,EAElF;AAER;;;ACrCA,IAAAC,iBAA0F;AA6BtE,IAAAC,uBAAA;AATb,SAAS,YAAY,EAAE,UAAU,MAAM,GAAG,OAAO,MAAM,OAAO,UAAU,GAAqB;AAChG,QAAM,UAAU,wBAAS,QAAQ,QAAQ,EAAE,OAAO,6BAAc;AAChE,QAAM,QAAQ,QAAQ,MAAM,GAAG,GAAG;AAClC,QAAM,SAAS,QAAQ,SAAS,MAAM;AACtC,SACI,+CAAC,SAAI,MAAK,SAAQ,cAAY,OAAO,WAAW,GAAG,mBAAmB,SAAS,GAC1E;AAAA,UAAM,IAAI,CAAC,eAAW,6BAAa,QAAQ,EAAE,KAAK,CAAC,CAAC;AAAA,IACpD,SAAS,IACN,+CAAC,UAAK,WAAW,GAAG,aAAa,cAAc,IAAI,IAAI,kBAAkB,GACrE;AAAA,qDAAC,UAAK,eAAY,QAAO;AAAA;AAAA,QAAE;AAAA,SAAO;AAAA,MAClC,+CAAC,UAAK,WAAU,sBAAqB;AAAA;AAAA,QAAK;AAAA,QAAO;AAAA,SAAK;AAAA,OAC1D,IACA;AAAA,KACR;AAER;AAaO,SAAS,KAAK,EAAE,MAAM,aAAa,KAAK,OAAO,MAAM,UAAU,GAAc;AAChF,SACI,+CAAC,SAAI,WAAW,GAAG,WAAW,YAAY,IAAI,IAAI,SAAS,GACvD;AAAA,kDAAC,UAAO,MAAY,KAAU,MAAY;AAAA,IAC1C,+CAAC,SAAI,WAAU,iBACX;AAAA,oDAAC,UAAK,WAAU,iBAAiB,gBAAK;AAAA,MACrC,cAAc,8CAAC,UAAK,WAAU,wBAAwB,uBAAY,IAAU;AAAA,OACjF;AAAA,KACJ;AAER;;;ACpDW,IAAAC,uBAAA;AADJ,SAAS,IAAI,EAAE,WAAW,GAAG,MAAM,GAAgC;AACtE,SAAO,8CAAC,SAAI,WAAW,GAAG,UAAU,SAAS,GAAI,GAAG,OAAO;AAC/D;AAGO,SAAS,KAAK,EAAE,WAAW,GAAG,MAAM,GAAgC;AACvE,SAAO,8CAAC,UAAK,WAAW,GAAG,WAAW,SAAS,GAAI,GAAG,OAAO;AACjE;;;ACAW,IAAAC,uBAAA;AADJ,SAAS,KAAK,EAAE,WAAW,UAAU,MAAM,GAAG,MAAM,GAAc;AACrE,SAAO,8CAAC,SAAI,WAAW,GAAG,WAAW,gBAAgB,OAAO,IAAI,SAAS,GAAI,GAAG,OAAO;AAC3F;AAYO,SAAS,YAAY,EAAE,UAAU,aAAa,OAAO,UAAU,GAAqB;AACvF,SACI,+CAAC,SAAI,WAAW,GAAG,mBAAmB,SAAS,GAC3C;AAAA,mDAAC,SAAI,WAAU,yBACX;AAAA,oDAAC,UAAK,WAAU,0BAA0B,iBAAM;AAAA,MAC/C,cAAc,8CAAC,SAAI,WAAU,gCAAgC,uBAAY,IAAS;AAAA,OACvF;AAAA,IACA,8CAAC,SAAI,WAAU,4BAA4B,UAAS;AAAA,KACxD;AAER;;;ACnCA,IAAAC,iBAQO;AA4CC,IAAAC,uBAAA;AAtCR,IAAM,QAAQ,CAAC,UAAuB,UAAU,SAAS,MAAM,kBAAkB,KAAK;AAqBtF,IAAM,aAAa,EAAE,OAAO,cAAc,QAAQ,UAAU,KAAK,YAAY,SAAS,WAAW,UAAU,YAAY,SAAS,gBAAgB;AAGzI,SAAS,MAAM;AAAA,EAClB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAe;AACX,QAAM,UAAU;AAChB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,YAAY,SAAS;AAAA,MACnC,OAAO;AAAA,QACH,eAAe;AAAA,QACf,KAAK,MAAM,GAAG;AAAA,QACd,YAAY,QAAQ,WAAW,KAAK,IAAI;AAAA,QACxC,gBAAgB,UAAU,WAAW,OAAO,IAAI;AAAA,QAChD,UAAU,OAAO,SAAS;AAAA,QAC1B,GAAG;AAAA,MACP;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;AAcO,SAAS,UAAU,EAAE,cAAc,cAAc,OAAO,UAAU,QAAQ,UAAU,GAAmB;AAC1G,QAAMC,UAAS,gBAAgB,eAAe,GAAG,MAAM,OAAO,CAAC,OAAO,KAAK,MAAM,OAAO,CAAC;AACzF,MAAI,SAAS,gBAAgB,cAAc;AACvC,WACI,8CAAC,SAAI,MAAK,aAAY,WAAW,GAAG,sBAAsB,SAAS,GAAG,OAAO,EAAE,QAAAA,QAAO,GAClF,wDAAC,UAAK,WAAU,4BAA4B,iBAAM,GACtD;AAAA,EAER;AACA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,oBAAkB;AAAA,MAClB,WAAW,GAAG,gBAAgB,iBAAiB,WAAW,IAAI,SAAS;AAAA,MACvE,OAAO,EAAE,QAAAA,QAAO;AAAA;AAAA,EACpB;AAER;AAgBO,SAAS,aAAa;AAAA,EACzB,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,GAAG;AACP,GAAsB;AAClB,QAAM,UAAM,uBAAuB,IAAI;AACvC,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE,OAAO,OAAO,KAAK,MAAM,CAAC;AAE/D,gCAAU,MAAM;AACZ,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,QAAS;AACd,UAAM,SAAS,MAAM;AACjB,YAAM,WAAW,gBAAgB,aAAa,QAAQ,YAAY,QAAQ;AAC1E,YAAM,SAAS,gBAAgB,aAAa,QAAQ,eAAe,QAAQ,eAAe,QAAQ,cAAc,QAAQ;AACxH,eAAS,EAAE,OAAO,WAAW,GAAG,KAAK,WAAW,SAAS,EAAE,CAAC;AAAA,IAChE;AACA,WAAO;AACP,YAAQ,iBAAiB,UAAU,QAAQ,EAAE,SAAS,KAAK,CAAC;AAC5D,UAAM,WAAW,OAAO,mBAAmB,cAAc,SAAY,IAAI,eAAe,MAAM;AAC9F,cAAU,QAAQ,OAAO;AACzB,QAAI,QAAQ,kBAAmB,WAAU,QAAQ,QAAQ,iBAAiB;AAC1E,WAAO,MAAM;AACT,cAAQ,oBAAoB,UAAU,MAAM;AAC5C,gBAAU,WAAW;AAAA,IACzB;AAAA,EACJ,GAAG,CAAC,WAAW,CAAC;AAEhB,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,oBAAoB,qBAAqB,WAAW,IAAI,SAAS;AAAA,MAC/E,cAAY,MAAM,SAAS;AAAA,MAC3B,YAAU,MAAM,OAAO;AAAA,MACvB,UAAU,YAAY,IAAI;AAAA,MAC1B,MAAM,YAAY,WAAW;AAAA,MAC7B,cAAY;AAAA,MACZ,OACI;AAAA,QACI,sBAAsB,GAAG,IAAI;AAAA,QAC7B,CAAC,gBAAgB,aAAa,cAAc,UAAU,GAAG;AAAA,QACzD,GAAG;AAAA,MACP;AAAA,MAEH,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;AAGO,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAAoC;AACrF,SAAO,8CAAC,UAAK,WAAW,GAAG,sBAAsB,SAAS,GAAI,GAAG,OAAO;AAC5E;;;AC5KA,IAAAC,iBAA+E;AAMpE,IAAAC,uBAAA;AADJ,SAAS,KAAK,EAAE,WAAW,GAAG,MAAM,GAAoC;AAC3E,SAAO,8CAAC,UAAK,WAAW,GAAG,WAAW,SAAS,GAAI,GAAG,OAAO;AACjE;AAiBO,SAAS,eAAe;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,IAAI,UAAU;AAAA,EACd;AACJ,GAAwB;AACpB,SACI,+CAAC,SAAI,WAAW,GAAG,sBAAsB,UAAU,YAAY,8BAA8B,SAAS,GACjG;AAAA,cAAU,8CAAC,QAAM,mBAAQ,IAAU;AAAA,IACpC,8CAAC,WAAQ,WAAU,6BAA6B,iBAAM;AAAA,IACrD,QAAQ,8CAAC,OAAE,WAAU,6BAA6B,iBAAM,IAAO;AAAA,KACpE;AAER;AAaO,SAAS,WAAW,EAAE,OAAO,KAAK,SAAS,UAAU,GAAoB;AAC5E,SACI,+CAAC,YAAO,WAAW,GAAG,kBAAkB,SAAS,GAC7C;AAAA,kDAAC,SAAI,WAAU,yBAAyB,iBAAM;AAAA,IAC7C,MAAM,8CAAC,SAAI,WAAU,uBAAuB,eAAI,IAAS;AAAA,IACzD,UAAU,8CAAC,SAAI,WAAU,2BAA2B,mBAAQ,IAAS;AAAA,KAC1E;AAER;AAYO,SAAS,QAAQ,EAAE,OAAO,OAAO,cAAc,OAAO,WAAW,UAAU,eAAe,GAAG,MAAM,GAAiB;AACvH,QAAM,UAAM,uBAAuB,IAAI;AAEvC,WAAS,MAAM,OAAqC;AAChD,oBAAgB,KAAK;AACrB,UAAM,UAAU,IAAI;AACpB,QAAI,CAAC,eAAe,CAAC,QAAS;AAC9B,UAAM,OAAO,QAAQ,sBAAsB;AAC3C,YAAQ,MAAM,YAAY,kBAAkB,GAAG,MAAM,UAAU,KAAK,IAAI,IAAI;AAC5E,YAAQ,MAAM,YAAY,kBAAkB,GAAG,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,EAC/E;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,eAAe,QAAQ,qBAAqB,eAAe,4BAA4B,SAAS;AAAA,MAC9G,eAAe;AAAA,MACd,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,WAAU,qBAAoB,eAAY,QAAO;AAAA,QACtD,cACG,8CAAC,UAAK,WAAU,sBAAqB,eAAY,QAAO,IACxD;AAAA,QACJ,8CAAC,SAAI,WAAU,wBAAwB,UAAS;AAAA;AAAA;AAAA,EACpD;AAER;;;AClGA,IAAAC,iBAAmH;AACnH,4BAAmE;AA2FvD,IAAAC,uBAAA;AA9CZ,IAAM,cAAc,CAAC,WAA+B,OAAO,WAAW,WAAW,SAAS,OAAO;AACjG,IAAM,aAAa,CAAC,WAA+B,OAAO,WAAW,WAAW,SAAS,OAAO;AAChG,IAAM,OAAO,CAAC,GAAW,MAAc,EAAE,YAAY,EAAE,QAAQ,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,MAAM,EAAE;AAMtG,SAAS,YAAY;AAAA,EACxB;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc,YAAY;AAAA,EAC1B;AACJ,GAAqB;AACjB,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAC5E,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,cAAU,uBAAuB,IAAI;AAC3C,gCAAU,MAAM,WAAW,OAAO,WAAW,eAAe,gBAAgB,MAAM,GAAG,CAAC,CAAC;AAGvF,gCAAU,MAAM;AACZ,UAAM,QAAgC,EAAE,YAAY,UAAU,KAAK,OAAO,OAAO,UAAU;AAC3F,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,cAAQ,SAAS,cAAc,oBAAoB,IAAI,+BAA+B,GAAG,aAAa,cAAc,KAAK;AAAA,IAC7H;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AACV,QAAM,SAAS,QAAQ,4CAAsB;AAC7C,QAAM,SAAS,CAAC,SAAiB,SAAS,KAAK,YAAY,CAAC;AAE5D,iBAAe,iBAAiB;AAC5B,QAAI,CAAC,OAAO,WAAY;AACxB,QAAI;AACA,YAAM,SAAS,MAAM,IAAI,OAAO,WAAW,EAAE,KAAK;AAClD,aAAO,OAAO,OAAO;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACJ;AAEA,SACI,+CAAC,SAAI,KAAK,SAAS,MAAK,SAAQ,cAAY,WAAW,WAAW,GAAG,mBAAmB,SAAS,GAC7F;AAAA,kDAAC,UAAO,OAAc,UAAU,QAAQ;AAAA,IACvC,aAAc,cAAc,UACzB,+CAAC,SAAI,WAAU,wBACV;AAAA,oBAAc,UACX,8CAAC,YAAO,MAAK,UAAS,WAAU,4BAA2B,cAAW,iCAAgC,SAAS,gBAC3G,wDAAC,eAAY,MAAM,IAAI,GAC3B,IACA;AAAA,MACH,YACG,+CAAC,UAAK,WAAU,4DACZ;AAAA,sDAAC,UAAK,WAAU,yBAAwB,eAAY,QAAO,eAE3D;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA,cAAW;AAAA,YACX,YAAY;AAAA;AAAA,QAChB;AAAA,SACJ,IACA;AAAA,MACJ,8CAAC,UAAK,WAAU,4BAA2B,OAAO,EAAE,2BAA2B,MAAM,GAAoB,eAAY,QAAO;AAAA,OAChI,IACA;AAAA,IACH,UAAU,SACP,8CAAC,SAAI,WAAU,6BAA4B,MAAK,SAAQ,cAAW,YAC9D,mBAAS,IAAI,CAAC,WAAW;AACtB,YAAM,cAAc,YAAY,MAAM;AACtC,aACI;AAAA,QAAC;AAAA;AAAA,UAEG,MAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAO,EAAE,2BAA2B,YAAY;AAAA,UAChD,cAAY,WAAW,MAAM;AAAA,UAC7B,gBAAc,KAAK,aAAa,KAAK;AAAA,UACrC,OAAO,WAAW,MAAM;AAAA,UACxB,SAAS,MAAM,OAAO,WAAW;AAAA;AAAA,QAP5B;AAAA,MAQT;AAAA,IAER,CAAC,GACL,IACA;AAAA,KACR;AAER;AAkBA,SAASC,WAAa,KAAsB,OAAiB;AACzD,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,KAAI,UAAU;AAChC;AAGO,IAAM,iBAAa,2BAA+C,SAASC,YAC9E;AAAA,EACI;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,GAAG;AACP,GACA,KACF;AACE,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAAqB,OAAO,cAAc,QAAQ;AAC5E,QAAM,CAAC,QAAQ,OAAO,QAAI,yBAAS,KAAK;AACxC,QAAM,iBAAa,uBAAiC,IAAI;AACxD,QAAM,eAAW,uBAAuB,IAAI;AAC5C,QAAM,cAAU,sBAAM;AACtB,QAAM,EAAE,SAAS,MAAM,IAAI,YAAY,MAAM;AAC7C,QAAM,QAAQ,YAAY,EAAE,MAAM,SAAS,WAAW,YAAY,aAAa,UAAU,WAAW,QAAQ,GAAG,WAAW,IAAI,CAAC;AAE/H,QAAM,YAAQ,4BAAY,CAAC,WAAkC;AACzD,YAAQ,KAAK;AACb,QAAI,WAAW,UAAW,YAAW,SAAS,MAAM;AAAA,EACxD,GAAG,CAAC,CAAC;AACL,aAAW,QAAQ,CAAC,UAAU,UAAU,GAAG,KAAK;AAGhD,gCAAU,MAAM;AACZ,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,QAAQ,sBAAsB,MAAM,SAAS,SAAS,cAA2B,8BAA8B,GAAG,MAAM,CAAC;AAC/H,WAAO,MAAM,qBAAqB,KAAK;AAAA,EAC3C,GAAG,CAAC,MAAM,CAAC;AAEX,SACI,gFACI;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,CAAC,YAAY;AACd,qBAAW,UAAU;AACrB,UAAAD,WAAU,KAAK,OAAO;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe,SAAS,UAAU;AAAA,QAClC,cAAY;AAAA,QACZ,mBAAiB;AAAA,QACjB,oBAAkB,CAAC,GAAG,OAAO,UAAU,eAAe,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAChF,gBAAc,aAAa;AAAA,QAC3B;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA,cAAc,IAAI;AAAA,UAClB,EAAE,mBAAmB,QAAQ,sBAAsB,aAAa,CAAC,OAAO;AAAA,UACxE;AAAA,QACJ;AAAA,QACA,SAAS,MAAM,QAAQ,CAAC,MAAM;AAAA,QAC9B,WAAW,CAAC,UAAU;AAClB,cAAI,MAAM,QAAQ,eAAe,CAAC,QAAQ;AACtC,kBAAM,eAAe;AACrB,oBAAQ,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,QAEA;AAAA,wDAAC,UAAK,WAAU,0BAAyB,OAAO,EAAE,2BAA2B,MAAM,GAAoB,eAAY,QAAO;AAAA,UAC1H,8CAAC,UAAK,IAAI,GAAG,OAAO,UAAU,WAAU,0CACnC,gBAAM,YAAY,GACvB;AAAA,UACA,8CAAC,mBAAgB,MAAM,SAAS,OAAO,KAAK,IAAI,WAAU,sBAAqB;AAAA;AAAA;AAAA,IACnF;AAAA,IACC,UACG;AAAA,MAAC;AAAA;AAAA,QACG,KAAK;AAAA,QACJ,GAAG;AAAA,QACJ,cAAY;AAAA,QACZ,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAU;AAAA,QACV;AAAA,QACA,WAAW,CAAC,UAAU;AAClB,cAAI,MAAM,QAAQ,WAAY,MAAM,OAAuB,QAAQ,iBAAiB,EAAG,OAAM;AAAA,QACjG;AAAA,QAEA,wDAAC,eAAa,GAAG,aAAa,OAAO,OAAO,UAAU,UAAU;AAAA;AAAA,IACpE,IACA;AAAA,KACR;AAER,CAAC;;;AChQM,IAAM,aAAa,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAa/E,IAAM,YAAY,CAAC,OAAO,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,IAAI;AACpF,IAAM,SAAS,CAAC,OAAO,OAAO,MAAM,OAAO,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACxF,IAAM,aAAa;AAInB,SAAS,SAAS,OAAyC;AACvD,MAAI,MAAM,MAAM,KAAK,EAAE,QAAQ,MAAM,EAAE;AACvC,MAAI,IAAI,WAAW,KAAK,IAAI,WAAW,EAAG,OAAM,CAAC,GAAG,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;AAC9F,MAAI,CAAC,+BAA+B,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,gBAAgB,KAAK,oCAAoC;AACxH,SAAO,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG;AACvE;AAEA,IAAM,WAAW,CAAC,MAAe,KAAK,UAAU,IAAI,UAAU,IAAI,SAAS,UAAU;AACrF,IAAM,aAAa,CAAC,MAAe,KAAK,WAAY,QAAQ,IAAI,QAAQ,MAAM,IAAI,OAAO;AAEzF,SAAS,WAAW,OAAoB;AACpC,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,SAAS,KAAK,EAAE,IAAI,QAAQ;AAC9C,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,QAAM,IAAI,KAAK,KAAK,eAAe,IAAI,eAAe,IAAI,eAAe,CAAC;AAC1E,QAAM,IAAI,eAAe,IAAI,cAAc,IAAI,eAAe;AAC9D,QAAM,IAAI,eAAe,IAAI,cAAc,IAAI,eAAe;AAC9D,QAAM,IAAI,eAAe,IAAI,eAAe,IAAI,cAAc;AAC9D,SAAO,EAAE,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,IAAK,KAAK,MAAM,GAAG,CAAC,IAAI,MAAO,KAAK,KAAK,OAAO,IAAI;AAC5F;AAEA,SAAS,cAAc,EAAE,GAAG,GAAG,GAAG,EAAE,GAAkC;AAClE,QAAM,IAAI,IAAI,KAAK,IAAK,IAAI,KAAK,KAAM,GAAG;AAC1C,QAAM,IAAI,IAAI,KAAK,IAAK,IAAI,KAAK,KAAM,GAAG;AAC1C,QAAM,KAAK,IAAI,eAAe,IAAI,eAAe,MAAM;AACvD,QAAM,KAAK,IAAI,eAAe,IAAI,eAAe,MAAM;AACvD,QAAM,KAAK,IAAI,eAAe,IAAI,cAAc,MAAM;AACtD,SAAO;AAAA,IACH,eAAe,IAAI,eAAe,IAAI,eAAe;AAAA,IACrD,gBAAgB,IAAI,eAAe,IAAI,eAAe;AAAA,IACtD,gBAAgB,IAAI,eAAe,IAAI,cAAc;AAAA,EACzD;AACJ;AAEA,IAAM,UAAU,CAAC,QAAkB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,KAAK,IAAI,IAAI;AAG/E,SAAS,MAAM,OAAoB;AAC/B,MAAI,EAAE,EAAE,IAAI;AACZ,MAAI,CAAC,QAAQ,cAAc,KAAK,CAAC,GAAG;AAChC,QAAI,MAAM;AACV,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;AAC5B,YAAM,OAAO,MAAM,QAAQ;AAC3B,UAAI,QAAQ,cAAc,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,EAAG,OAAM;AAAA,UACnD,QAAO;AAAA,IAChB;AACA,QAAI;AAAA,EACR;AACA,SAAO,IAAI,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC,EACnC,IAAI,CAAC,MAAM,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAC9F,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,CAAC;AACjB;AASO,SAAS,WAAW,OAA2B;AAClD,QAAM,EAAE,GAAG,EAAE,IAAI,WAAW,KAAK;AACjC,QAAM,WAAW,KAAK,IAAI,KAAK,IAAI,UAAU;AAC7C,SAAO,OAAO,YAAY,WAAW,IAAI,CAAC,MAAM,MAAM,CAAC,MAAM,MAAM,EAAE,GAAG,UAAU,CAAC,GAAI,GAAG,OAAO,CAAC,IAAK,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3H;AAGO,SAAS,eAAe,OAA2C;AACtE,QAAM,QAAQ,OAAO,UAAU,WAAW,WAAW,KAAK,IAAI;AAC9D,SAAO,OAAO,YAAY,WAAW,IAAI,CAAC,SAAS,CAAC,cAAc,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC;AAC3F;AAGO,SAAS,SAAS,OAA4B,WAAW,SAAiB;AAC7E,QAAM,QAAQ,OAAO,UAAU,WAAW,WAAW,KAAK,IAAI;AAC9D,SAAO,GAAG,QAAQ;AAAA,EAAO,WAAW,IAAI,CAAC,SAAS,kBAAkB,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAC3G;AAOO,SAAS,WAAW,OAAmC,UAAuB,SAAS,iBAAiB;AAC3G,aAAW,QAAQ,WAAY,SAAQ,MAAM,eAAe,cAAc,IAAI,EAAE;AAChF,MAAI,UAAU,KAAM;AACpB,QAAM,YAAY,eAAe,KAAK;AACtC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,EAAG,SAAQ,MAAM,YAAY,MAAM,KAAK;AAChG;AAGO,IAAM,eAA8B;AAAA,EACvC;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACH,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACH,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACH,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACH,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACH,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACH,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACH,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ;AACJ;",
|
|
6
|
-
"names": ["import_jsx_runtime", "Button", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "CloseButton", "ToggleButton", "import_react", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "ChoiceCard", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "Input", "import_react", "import_jsx_runtime", "SearchField", "import_react", "import_jsx_runtime", "NumberField", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "assignRef", "Textarea", "import_react", "import_react", "import_react", "import_jsx_runtime", "state", "import_react", "import_jsx_runtime", "assignRef", "Combobox", "import_react", "import_jsx_runtime", "assignRef", "Checkbox", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "Switch", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "Calendar", "_", "import_react", "import_jsx_runtime", "assignRef", "DatePicker", "import_jsx_runtime", "icon", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "icons", "SonnerToaster", "import_react", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "MenuItem", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "items", "Link", "import_jsx_runtime", "items", "import_react", "import_jsx_runtime", "items", "import_react", "import_jsx_runtime", "NavItem", "icon", "import_react", "import_jsx_runtime", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "items", "icon", "import_jsx_runtime", "icon", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "margin", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "assignRef", "ColorField"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/utils/cx.ts", "../src/components/Text/Text.tsx", "../src/components/Button/Button.tsx", "../src/utils/text.ts", "../src/components/Spinner/Spinner.tsx", "../src/components/Button/ButtonGroup.tsx", "../src/hooks/useControllableState.ts", "../src/icons.tsx", "../src/components/SegmentedControl/SegmentedControl.tsx", "../src/hooks/useIndicator.ts", "../src/components/ChoiceCard/ChoiceCard.tsx", "../src/components/CodeBlock/CodeBlock.tsx", "../src/utils/copyText.ts", "../src/components/Field/Field.tsx", "../src/components/Input/Input.tsx", "../src/components/SearchField/SearchField.tsx", "../src/components/NumberField/NumberField.tsx", "../src/components/InputOTP/InputOTP.tsx", "../src/components/Textarea/Textarea.tsx", "../src/utils/resizeTextArea.ts", "../src/components/Select/Select.tsx", "../src/hooks/useFloating.ts", "../src/hooks/usePresence.ts", "../src/components/Combobox/Combobox.tsx", "../src/components/Checkbox/Checkbox.tsx", "../src/components/RadioGroup/RadioGroup.tsx", "../src/components/Switch/Switch.tsx", "../src/components/Slider/Slider.tsx", "../src/components/FileDropZone/FileDropZone.tsx", "../src/components/Calendar/Calendar.tsx", "../src/components/Calendar/dates.ts", "../src/components/Calendar/DatePicker.tsx", "../src/components/Alert/Alert.tsx", "../src/components/Badge/Badge.tsx", "../src/components/Progress/Progress.tsx", "../src/components/Skeleton/Skeleton.tsx", "../src/components/Toast/Toast.tsx", "../src/components/Tooltip/Tooltip.tsx", "../src/components/Dialog/Dialog.tsx", "../src/hooks/useModalDialog.ts", "../src/components/Drawer/Drawer.tsx", "../src/components/Popover/Popover.tsx", "../src/components/Menu/Menu.tsx", "../src/hooks/useMenuKeyboard.ts", "../src/components/CommandPalette/CommandPalette.tsx", "../src/components/CommandPalette/filterCommands.ts", "../src/components/Tabs/Tabs.tsx", "../src/components/Accordion/Accordion.tsx", "../src/components/Breadcrumbs/Breadcrumbs.tsx", "../src/components/Pagination/Pagination.tsx", "../src/components/Steps/Steps.tsx", "../src/components/NavList/NavList.tsx", "../src/components/Table/Table.tsx", "../src/components/Stat/Stat.tsx", "../src/components/FileTree/FileTree.tsx", "../src/components/EmptyState/EmptyState.tsx", "../src/components/Tag/Tag.tsx", "../src/components/Avatar/Avatar.tsx", "../src/components/Avatar/AvatarGroup.tsx", "../src/components/Kbd/Kbd.tsx", "../src/components/Card/Card.tsx", "../src/components/Layout/Layout.tsx", "../src/components/Marketing/Marketing.tsx", "../src/components/ColorPicker/ColorPicker.tsx", "../src/utils/brand.ts"],
|
|
4
|
+
"sourcesContent": ["// Openware UI. Import the components from here and the CSS once:\n// import \"@openwarelabs/ui/fonts.css\";\n// import \"@openwarelabs/ui/styles.css\";\n\n// Typography\nexport { Text } from \"./components/Text/Text\";\nexport type { TextProps, TextVariant, TextTone } from \"./components/Text/Text\";\n\n// Buttons\nexport { Button, buttonClassName } from \"./components/Button/Button\";\nexport type { ButtonProps, ButtonStyleOptions, ButtonVariant, ButtonSize, ButtonShape } from \"./components/Button/Button\";\nexport { ButtonGroup, CloseButton, ToggleButton } from \"./components/Button/ButtonGroup\";\nexport type { ButtonGroupProps, CloseButtonProps, ToggleButtonProps } from \"./components/Button/ButtonGroup\";\nexport { SegmentedControl } from \"./components/SegmentedControl/SegmentedControl\";\nexport type { SegmentedControlProps, SegmentedControlOption } from \"./components/SegmentedControl/SegmentedControl\";\nexport { ChoiceCard } from \"./components/ChoiceCard/ChoiceCard\";\nexport type { ChoiceCardProps } from \"./components/ChoiceCard/ChoiceCard\";\nexport { CopyButton, CodeBlock, Snippet } from \"./components/CodeBlock/CodeBlock\";\nexport type { CopyButtonProps, CodeBlockProps, SnippetProps } from \"./components/CodeBlock/CodeBlock\";\n\n// Forms\nexport { Field } from \"./components/Field/Field\";\nexport type { FieldProps } from \"./components/Field/Field\";\nexport { Input } from \"./components/Input/Input\";\nexport type { InputProps } from \"./components/Input/Input\";\nexport { SearchField } from \"./components/SearchField/SearchField\";\nexport type { SearchFieldProps } from \"./components/SearchField/SearchField\";\nexport { NumberField } from \"./components/NumberField/NumberField\";\nexport type { NumberFieldProps } from \"./components/NumberField/NumberField\";\nexport { InputOTP } from \"./components/InputOTP/InputOTP\";\nexport type { InputOTPProps } from \"./components/InputOTP/InputOTP\";\nexport { Textarea } from \"./components/Textarea/Textarea\";\nexport type { TextareaProps } from \"./components/Textarea/Textarea\";\nexport { Select } from \"./components/Select/Select\";\nexport type { SelectProps, SelectOption, SelectGroup, SelectItem } from \"./components/Select/Select\";\nexport { Combobox } from \"./components/Combobox/Combobox\";\nexport type { ComboboxProps, ComboboxOption } from \"./components/Combobox/Combobox\";\nexport { Checkbox, CheckboxGroup, Fieldset } from \"./components/Checkbox/Checkbox\";\nexport type { CheckboxProps, CheckboxGroupProps, FieldsetProps } from \"./components/Checkbox/Checkbox\";\nexport { RadioGroup, Radio } from \"./components/RadioGroup/RadioGroup\";\nexport type { RadioGroupProps, RadioProps } from \"./components/RadioGroup/RadioGroup\";\nexport { Switch } from \"./components/Switch/Switch\";\nexport type { SwitchProps } from \"./components/Switch/Switch\";\nexport { Slider } from \"./components/Slider/Slider\";\nexport type { SliderProps } from \"./components/Slider/Slider\";\nexport { FileDropZone } from \"./components/FileDropZone/FileDropZone\";\nexport type { FileDropZoneProps } from \"./components/FileDropZone/FileDropZone\";\n\n// Dates\nexport { Calendar } from \"./components/Calendar/Calendar\";\nexport type { CalendarProps, CalendarHandle } from \"./components/Calendar/Calendar\";\nexport { DatePicker } from \"./components/Calendar/DatePicker\";\nexport type { DatePickerProps } from \"./components/Calendar/DatePicker\";\nexport { todayISO, addDays, addMonths, formatDate, weekday, parseISO, toISO } from \"./components/Calendar/dates\";\nexport type { ISODate } from \"./components/Calendar/dates\";\n\n// Feedback\nexport { Alert } from \"./components/Alert/Alert\";\nexport type { AlertProps, AlertVariant } from \"./components/Alert/Alert\";\nexport { Badge } from \"./components/Badge/Badge\";\nexport type { BadgeProps, BadgeVariant } from \"./components/Badge/Badge\";\nexport { ProgressBar, ProgressCircle } from \"./components/Progress/Progress\";\nexport type { ProgressBarProps, ProgressCircleProps, ProgressTone } from \"./components/Progress/Progress\";\nexport { Spinner } from \"./components/Spinner/Spinner\";\nexport type { SpinnerProps } from \"./components/Spinner/Spinner\";\nexport { Skeleton, SkeletonRows } from \"./components/Skeleton/Skeleton\";\nexport type { SkeletonProps, SkeletonRowsProps } from \"./components/Skeleton/Skeleton\";\nexport { Toaster, toast } from \"./components/Toast/Toast\";\nexport type { ToasterProps, ToastOptions } from \"./components/Toast/Toast\";\nexport { Tooltip } from \"./components/Tooltip/Tooltip\";\nexport type { TooltipProps } from \"./components/Tooltip/Tooltip\";\n\n// Overlays\nexport { Dialog, ConfirmDialog } from \"./components/Dialog/Dialog\";\nexport type { DialogProps, ConfirmDialogProps } from \"./components/Dialog/Dialog\";\nexport { Drawer } from \"./components/Drawer/Drawer\";\nexport type { DrawerProps } from \"./components/Drawer/Drawer\";\nexport { Popover } from \"./components/Popover/Popover\";\nexport type { PopoverProps } from \"./components/Popover/Popover\";\nexport { Menu, MenuItem, MenuLabel, MenuSeparator } from \"./components/Menu/Menu\";\nexport type { MenuProps, MenuItemProps } from \"./components/Menu/Menu\";\nexport { CommandPalette } from \"./components/CommandPalette/CommandPalette\";\nexport type { Command, CommandPaletteProps } from \"./components/CommandPalette/CommandPalette\";\nexport { filterCommands } from \"./components/CommandPalette/filterCommands\";\n\n// Navigation\nexport { Tabs, TabList, Tab, TabPanel } from \"./components/Tabs/Tabs\";\nexport type { TabsProps, TabListProps, TabProps, TabPanelProps } from \"./components/Tabs/Tabs\";\nexport { Accordion, AccordionItem, Disclosure } from \"./components/Accordion/Accordion\";\nexport type { AccordionProps, AccordionItemProps, DisclosureProps } from \"./components/Accordion/Accordion\";\nexport { Breadcrumbs, Link, linkClassName } from \"./components/Breadcrumbs/Breadcrumbs\";\nexport type { BreadcrumbsProps, BreadcrumbItem, LinkProps, LinkStyleOptions } from \"./components/Breadcrumbs/Breadcrumbs\";\nexport { Pagination, paginationItems } from \"./components/Pagination/Pagination\";\nexport type { PaginationProps } from \"./components/Pagination/Pagination\";\nexport { Steps } from \"./components/Steps/Steps\";\nexport type { StepsProps, StepItem } from \"./components/Steps/Steps\";\nexport { NavList, NavItem } from \"./components/NavList/NavList\";\nexport type { NavListProps, NavItemProps } from \"./components/NavList/NavList\";\n\n// Data display\nexport { Table } from \"./components/Table/Table\";\nexport type { TableProps, TableColumn, TableSort } from \"./components/Table/Table\";\nexport { Stat } from \"./components/Stat/Stat\";\nexport type { StatProps } from \"./components/Stat/Stat\";\nexport { FileTree } from \"./components/FileTree/FileTree\";\nexport type { FileTreeProps, FileTreeNode } from \"./components/FileTree/FileTree\";\nexport { EmptyState } from \"./components/EmptyState/EmptyState\";\nexport type { EmptyStateProps } from \"./components/EmptyState/EmptyState\";\nexport { Tag, TagGroup, ColorSwatch } from \"./components/Tag/Tag\";\nexport type { TagProps, TagGroupProps, ColorSwatchProps } from \"./components/Tag/Tag\";\nexport { Avatar } from \"./components/Avatar/Avatar\";\nexport type { AvatarProps, AvatarSize } from \"./components/Avatar/Avatar\";\nexport { AvatarGroup, User } from \"./components/Avatar/AvatarGroup\";\nexport type { AvatarGroupProps, UserProps } from \"./components/Avatar/AvatarGroup\";\nexport { Kbd, Code } from \"./components/Kbd/Kbd\";\n\n// Layout\nexport { Card, SettingsRow } from \"./components/Card/Card\";\nexport type { CardProps, SettingsRowProps } from \"./components/Card/Card\";\nexport { Stack, Separator, ScrollShadow, VisuallyHidden } from \"./components/Layout/Layout\";\nexport type { StackProps, SeparatorProps, ScrollShadowProps, SpaceToken } from \"./components/Layout/Layout\";\n\n// Marketing\nexport { Chip, SectionHeading, SiteHeader, DotGrid } from \"./components/Marketing/Marketing\";\nexport type { SectionHeadingProps, SiteHeaderProps, DotGridProps } from \"./components/Marketing/Marketing\";\n\n// Hooks and helpers\nexport { ColorField, ColorPicker } from \"./components/ColorPicker/ColorPicker\";\nexport type { ColorFieldProps, ColorPickerProps, ColorSwatchOption } from \"./components/ColorPicker/ColorPicker\";\nexport { applyBrand, brandCss, brandPresets, brandScale, brandSteps, brandVariables } from \"./utils/brand\";\nexport type { BrandPreset, BrandScale, BrandStep } from \"./utils/brand\";\nexport { useModalDialog } from \"./hooks/useModalDialog\";\nexport { useMenuKeyboard } from \"./hooks/useMenuKeyboard\";\nexport { useControllableState } from \"./hooks/useControllableState\";\nexport { useFloating, useDismiss } from \"./hooks/useFloating\";\nexport { usePresence } from \"./hooks/usePresence\";\nexport type { Presence } from \"./hooks/usePresence\";\nexport type { Placement } from \"./hooks/useFloating\";\nexport { cx } from \"./utils/cx\";\nexport { getInitials } from \"./utils/text\";\nexport { copyText } from \"./utils/copyText\";\n", "type ClassValue = string | false | null | undefined | Record<string, boolean | undefined>;\n\n/** Joins class names, skipping falsy ones; an object adds each key whose value is true. */\nexport function cx(...values: ClassValue[]): string {\n const classes: string[] = [];\n for (const value of values) {\n if (!value) continue;\n if (typeof value === \"string\") {\n classes.push(value);\n continue;\n }\n for (const [name, on] of Object.entries(value)) if (on) classes.push(name);\n }\n return classes.join(\" \");\n}\n", "import type { HTMLAttributes, JSX, ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\n/** The text styles on the Typography page, by the same names: `lead` is the class ow-type-lead. */\nexport type TextVariant =\n | \"hero\"\n | \"page-title\"\n | \"section-title\"\n | \"heading\"\n | \"lead\"\n | \"prose\"\n | \"dialog-title\"\n | \"card-title\"\n | \"body\"\n | \"copy\"\n | \"label\"\n | \"button\"\n | \"caption\"\n | \"badge\"\n | \"overline\"\n | \"code\"\n | \"kbd\";\n\nexport type TextTone = \"default\" | \"soft\" | \"muted\" | \"primary\" | \"danger\" | \"success\" | \"warning\";\n\nexport interface TextProps extends HTMLAttributes<HTMLElement> {\n /** Which text style: size, leading, weight and tracking from the Typography page. The display styles shrink on phones.\n * @default \"body\" */\n variant?: TextVariant;\n /** The element, for the page's outline. Defaults to one that suits the variant: h1 for hero and page-title, h2 for\n * section-title, h3 for heading and the titles, p for running text, span for the rest. */\n as?: keyof JSX.IntrinsicElements;\n /** The colour. Left out, lead, copy, caption and overline are muted, as the styles ask, and the rest take the\n * colour around them. */\n tone?: TextTone;\n /** @default \"start\" */\n align?: \"start\" | \"center\" | \"end\";\n /** One line, cut off with an ellipsis.\n * @default false */\n truncate?: boolean;\n children?: ReactNode;\n}\n\nconst elements: Record<TextVariant, keyof JSX.IntrinsicElements> = {\n hero: \"h1\",\n \"page-title\": \"h1\",\n \"section-title\": \"h2\",\n heading: \"h3\",\n lead: \"p\",\n prose: \"p\",\n \"dialog-title\": \"h2\",\n \"card-title\": \"h3\",\n body: \"p\",\n copy: \"p\",\n label: \"span\",\n button: \"span\",\n caption: \"span\",\n badge: \"span\",\n overline: \"span\",\n code: \"code\",\n kbd: \"kbd\",\n};\n\nconst mutedByDefault: TextVariant[] = [\"lead\", \"copy\", \"caption\", \"overline\"];\n\n/**\n * Text in one of Openware's styles: `<Text variant=\"lead\">`. The variant sets the look and a sensible element;\n * `as` changes the element without changing the look, so the outline stays right.\n */\nexport function Text({ variant = \"body\", as, tone, align, truncate = false, className, children, ...props }: TextProps) {\n const Element = (as ?? elements[variant]) as \"p\";\n const colour = tone ?? (mutedByDefault.includes(variant) ? \"muted\" : undefined);\n return (\n <Element\n className={cx(\n \"ow-text\",\n `ow-type-${variant}`,\n `ow-text--${variant}`,\n colour && `ow-text--${colour}`,\n align && align !== \"start\" && `ow-text--${align}`,\n truncate && \"ow-text--truncate\",\n className,\n )}\n {...props}\n >\n {children}\n </Element>\n );\n}\n", "import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { toAriaShortcut } from \"../../utils/text\";\nimport { Spinner } from \"../Spinner/Spinner\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n/** `rounded` is the app's 8px corner; `pill` is the marketing site's. */\nexport type ButtonShape = \"rounded\" | \"pill\";\n\nexport interface ButtonStyleOptions {\n /** primary for the one main action, secondary for the rest, ghost for low-stakes actions, danger for destructive ones.\n * @default \"secondary\" */\n variant?: ButtonVariant;\n /** sm 32px, md 40px, lg 44px (36, 40 and 46px as pills).\n * @default \"md\" */\n size?: ButtonSize;\n /** @default \"rounded\" */\n shape?: ButtonShape;\n /** A square button holding only an icon. Give it an aria-label.\n * @default false */\n iconOnly?: boolean;\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, ButtonStyleOptions {\n /** An icon before the label, usually a 16px lucide-react icon. */\n startIcon?: ReactNode;\n /** An icon after the label, such as an arrow or a chevron. */\n endIcon?: ReactNode;\n /** Keyboard shortcut shown at the end, e.g. \"\u2318N\". Only pass one that actually works. */\n shortcut?: string;\n /** Shows a spinner in place of the start icon and disables the button, keeping its width.\n * @default false */\n loading?: boolean;\n /** Stretches the button to its container's width.\n * @default false */\n fullWidth?: boolean;\n}\n\n/**\n * The class names of a button, for things that must be another element: a router <Link>, an <a>.\n * `<Link className={buttonClassName({ variant: \"primary\" })}>Pricing</Link>`\n */\nexport function buttonClassName({\n variant = \"secondary\",\n size = \"md\",\n shape = \"rounded\",\n iconOnly = false,\n}: ButtonStyleOptions = {}): string {\n return cx(\n \"ow-button\",\n `ow-button--${variant}`,\n `ow-button--${size}`,\n shape === \"pill\" && \"ow-button--pill\",\n iconOnly && \"ow-button--icon-only\",\n );\n}\n\n/**\n * A tactile button: a light top-to-bottom gradient, a highlight along the top edge and a soft shadow,\n * pressed in by a pixel on click.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n children,\n className,\n disabled,\n endIcon,\n fullWidth = false,\n iconOnly = false,\n loading = false,\n shape = \"rounded\",\n shortcut,\n size = \"md\",\n startIcon,\n type = \"button\",\n variant = \"secondary\",\n ...buttonProps\n },\n ref,\n) {\n const leading = loading ? <Spinner size=\"sm\" tone=\"current\" label=\"\" /> : startIcon;\n return (\n <button\n ref={ref}\n className={cx(\n buttonClassName({ variant, size, shape, iconOnly }),\n shortcut && !iconOnly && \"ow-button--with-shortcut\",\n loading && \"ow-button--loading\",\n fullWidth && \"ow-button--full\",\n className,\n )}\n type={type}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n aria-keyshortcuts={shortcut ? toAriaShortcut(shortcut) : undefined}\n {...buttonProps}\n >\n {leading ? <span className=\"ow-button__icon\">{leading}</span> : null}\n {iconOnly && loading ? null : children}\n {endIcon && !iconOnly ? <span className=\"ow-button__icon\">{endIcon}</span> : null}\n {shortcut && !iconOnly ? (\n <kbd aria-hidden=\"true\" className=\"ow-button__shortcut\">\n {shortcut}\n </kbd>\n ) : null}\n </button>\n );\n});\n", "/** \"Alex Silver\" \u2192 \"AS\", \"alex\" \u2192 \"A\". Empty input returns \"\". */\nexport function getInitials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n const first = words[0]?.[0] ?? \"\";\n const last = words.length > 1 ? (words[words.length - 1]?.[0] ?? \"\") : \"\";\n\n return `${first}${last}`.toUpperCase();\n}\n\n/** \"\u2318N\" \u2192 \"Meta+N\", \"Ctrl+O\" \u2192 \"Control+O\", for aria-keyshortcuts. */\nexport function toAriaShortcut(shortcut: string): string {\n return shortcut.replace(\"\u2318\", \"Meta+\").replace(\"Ctrl+\", \"Control+\");\n}\n", "import { cx } from \"../../utils/cx\";\n\nexport interface SpinnerProps {\n /** sm 14px, md 20px, lg 28px.\n * @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** `primary` draws the arc in the progress colour; `current` takes the text colour, for use inside buttons.\n * @default \"primary\" */\n tone?: \"primary\" | \"current\";\n /** Read out by screen readers. Pass an empty string when something nearby already says it's loading.\n * @default \"Loading\" */\n label?: string;\n className?: string;\n}\n\n/** A small spinning ring for work that takes a moment. */\nexport function Spinner({ size = \"md\", tone = \"primary\", label = \"Loading\", className }: SpinnerProps) {\n return (\n <span\n className={cx(\"ow-spinner\", `ow-spinner--${size}`, `ow-spinner--${tone}`, className)}\n {...(label ? { role: \"status\", \"aria-label\": label } : { \"aria-hidden\": true })}\n />\n );\n}\n", "import { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { XIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Button, type ButtonProps } from \"./Button\";\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Joins the buttons into one control with shared borders. Off, they sit 8px apart.\n * @default true */\n attached?: boolean;\n /** @default \"horizontal\" */\n orientation?: \"horizontal\" | \"vertical\";\n}\n\n/** Buttons that belong together: a toolbar's actions, or a split choice like \"Day \u00B7 Week \u00B7 Month\". */\nexport function ButtonGroup({ attached = true, orientation = \"horizontal\", className, ...props }: ButtonGroupProps) {\n return (\n <div\n role=\"group\"\n className={cx(\n \"ow-button-group\",\n attached && \"ow-button-group--attached\",\n orientation === \"vertical\" && \"ow-button-group--vertical\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport interface CloseButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n /** sm 24px for toasts and tags, md 32px for dialogs and panels.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** What it closes, for screen readers.\n * @default \"Close\" */\n label?: string;\n}\n\n/** The \u2715 in a dialog, drawer or panel header. */\nexport const CloseButton = forwardRef<HTMLButtonElement, CloseButtonProps>(function CloseButton(\n { size = \"md\", label = \"Close\", className, type = \"button\", ...buttonProps },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type}\n aria-label={label}\n className={cx(\"ow-close-button\", `ow-close-button--${size}`, className)}\n {...buttonProps}\n >\n <XIcon size={size === \"sm\" ? 14 : 17} />\n </button>\n );\n});\n\nexport interface ToggleButtonProps extends Omit<ButtonProps, \"variant\"> {\n /** Whether it's on. Leave out to let the button keep its own state. */\n pressed?: boolean;\n /** The starting state when uncontrolled.\n * @default false */\n defaultPressed?: boolean;\n onPressedChange?(pressed: boolean): void;\n /** @default \"secondary\" */\n variant?: \"secondary\" | \"ghost\";\n}\n\n/** A button that stays pressed in while something is on: bold text, a filter, a view mode. */\nexport const ToggleButton = forwardRef<HTMLButtonElement, ToggleButtonProps>(function ToggleButton(\n { pressed, defaultPressed = false, onPressedChange, onClick, className, variant = \"secondary\", ...buttonProps },\n ref,\n) {\n const [isPressed, setPressed] = useControllableState(pressed, defaultPressed, onPressedChange);\n return (\n <Button\n ref={ref}\n variant={variant}\n aria-pressed={isPressed}\n className={cx(isPressed && \"ow-button--pressed\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) setPressed(!isPressed);\n }}\n {...buttonProps}\n />\n );\n});\n", "import { useCallback, useRef, useState } from \"react\";\n\n/**\n * State that a parent may control (`value` + `onChange`) or leave to the component (`defaultValue`).\n * Returns the current value and a setter that calls `onChange` either way.\n */\nexport function useControllableState<T>(\n value: T | undefined,\n defaultValue: T,\n onChange?: (next: T) => void,\n): [T, (next: T | ((previous: T) => T)) => void] {\n const [internal, setInternal] = useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : internal;\n const currentRef = useRef(current);\n currentRef.current = current;\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T | ((previous: T) => T)) => {\n const resolved =\n typeof next === \"function\" ? (next as (previous: T) => T)(currentRef.current) : next;\n if (Object.is(resolved, currentRef.current)) return;\n if (!isControlled) setInternal(resolved);\n onChangeRef.current?.(resolved);\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n", "import type { ReactNode, SVGProps } from \"react\";\n\n/*\n * The few icons the components draw themselves. They are Lucide shapes (ISC licence, lucide.dev):\n * a 24-unit grid, 2px round strokes in currentColor. For your own icons, use lucide-react.\n */\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, \"ref\"> {\n size?: number;\n}\n\nfunction icon(paths: ReactNode) {\n return function Icon({ size = 16, strokeWidth = 2, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...props}\n >\n {paths}\n </svg>\n );\n };\n}\n\nexport const CheckIcon = icon(<path d=\"M20 6 9 17l-5-5\" />);\nexport const ChevronDownIcon = icon(<path d=\"m6 9 6 6 6-6\" />);\nexport const SearchIcon = icon(\n <>\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </>,\n);\nexport const CornerDownLeftIcon = icon(\n <>\n <polyline points=\"9 10 4 15 9 20\" />\n <path d=\"M20 4v7a4 4 0 0 1-4 4H4\" />\n </>,\n);\nexport const XIcon = icon(\n <>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </>,\n);\nexport const UserIcon = icon(\n <>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </>,\n);\nexport const TrashIcon = icon(\n <>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </>,\n);\nexport const CircleCheckIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </>,\n);\nexport const CircleAlertIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\n </>,\n);\nexport const ChevronRightIcon = icon(<path d=\"m9 18 6-6-6-6\" />);\nexport const ChevronLeftIcon = icon(<path d=\"m15 18-6-6 6-6\" />);\nexport const ChevronUpIcon = icon(<path d=\"m18 15-6-6-6 6\" />);\nexport const MinusIcon = icon(<path d=\"M5 12h14\" />);\nexport const PlusIcon = icon(\n <>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </>,\n);\nexport const InfoIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </>,\n);\nexport const TriangleAlertIcon = icon(\n <>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </>,\n);\nexport const PipetteIcon = icon(\n <>\n <path d=\"m2 22 1-1h3l9-9\" />\n <path d=\"M3 21v-3l9-9\" />\n <path d=\"m15 6 3.4-3.4a2.1 2.1 0 1 1 3 3L18 9l.4.4a2.1 2.1 0 1 1-3 3l-3.8-3.8a2.1 2.1 0 1 1 3-3l.4.4Z\" />\n </>,\n);\nexport const CopyIcon = icon(\n <>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </>,\n);\nexport const CalendarIcon = icon(\n <>\n <path d=\"M8 2v4\" />\n <path d=\"M16 2v4\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n </>,\n);\nexport const FileIcon = icon(\n <>\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n </>,\n);\nexport const FolderIcon = icon(\n <path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\" />,\n);\nexport const FolderOpenIcon = icon(\n <path d=\"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\" />,\n);\nexport const UploadIcon = icon(\n <>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" x2=\"12\" y1=\"3\" y2=\"15\" />\n </>,\n);\nexport const ArrowUpRightIcon = icon(\n <>\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </>,\n);\nexport const ArrowUpIcon = icon(\n <>\n <path d=\"m5 12 7-7 7 7\" />\n <path d=\"M12 19V5\" />\n </>,\n);\nexport const ArrowDownIcon = icon(\n <>\n <path d=\"M12 5v14\" />\n <path d=\"m19 12-7 7-7-7\" />\n </>,\n);\nexport const ChevronsUpDownIcon = icon(\n <>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </>,\n);\nexport const InboxIcon = icon(\n <>\n <polyline points=\"22 12 16 12 14 15 10 15 8 12 2 12\" />\n <path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n </>,\n);\nexport const EllipsisIcon = icon(\n <>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </>,\n);\n", "import { useRef, type KeyboardEvent, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { useIndicator } from \"../../hooks/useIndicator\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface SegmentedControlOption {\n value: string;\n label: ReactNode;\n /** A 16px icon before the label. With no label, give the option an aria-label. */\n icon?: ReactNode;\n disabled?: boolean;\n \"aria-label\"?: string;\n}\n\nexport interface SegmentedControlProps {\n options: SegmentedControlOption[];\n value?: string;\n /** The starting value when uncontrolled. Defaults to the first option. */\n defaultValue?: string;\n onChange?(value: string): void;\n /** sm 28px, md 32px tall.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** Stretches the segments to fill the container.\n * @default false */\n fullWidth?: boolean;\n /** Names the choice for screen readers. */\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Two to five mutually exclusive options in a well, with the chosen one raised: a view switch, a filter.\n * It behaves like a radio group: the arrow keys move and choose.\n */\nexport function SegmentedControl({\n options,\n value,\n defaultValue,\n onChange,\n size = \"md\",\n fullWidth = false,\n disabled = false,\n className,\n ...aria\n}: SegmentedControlProps) {\n const [current, setCurrent] = useControllableState(value, defaultValue ?? options[0]?.value ?? \"\", onChange);\n const refs = useRef<Array<HTMLButtonElement | null>>([]);\n const groupRef = useRef<HTMLDivElement>(null);\n useIndicator(groupRef, '[aria-checked=\"true\"]', current);\n const enabled = options.map((option, index) => ({ option, index })).filter(({ option }) => !option.disabled);\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>, index: number) {\n const keys: Record<string, number> = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 };\n let target: number | undefined;\n if (event.key in keys) {\n const position = enabled.findIndex((entry) => entry.index === index);\n target = enabled[(position + keys[event.key]! + enabled.length) % enabled.length]?.index;\n } else if (event.key === \"Home\") target = enabled[0]?.index;\n else if (event.key === \"End\") target = enabled[enabled.length - 1]?.index;\n if (target === undefined) return;\n event.preventDefault();\n refs.current[target]?.focus();\n setCurrent(options[target]!.value);\n }\n\n const focusable = options.some((option) => option.value === current && !option.disabled) ? current : enabled[0]?.option.value;\n\n return (\n <div\n ref={groupRef}\n role=\"radiogroup\"\n className={cx(\"ow-segmented\", `ow-segmented--${size}`, fullWidth && \"ow-segmented--full\", disabled && \"ow-segmented--disabled\", className)}\n {...aria}\n >\n {options.map((option, index) => {\n const isSelected = option.value === current;\n return (\n <button\n key={option.value}\n ref={(element) => {\n refs.current[index] = element;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n aria-label={option[\"aria-label\"]}\n tabIndex={option.value === focusable ? 0 : -1}\n disabled={disabled || option.disabled}\n className={cx(\"ow-segmented__item\", isSelected && \"ow-segmented__item--selected\")}\n onClick={() => setCurrent(option.value)}\n onKeyDown={(event) => onKeyDown(event, index)}\n >\n {option.icon ? <span className=\"ow-segmented__icon\">{option.icon}</span> : null}\n {option.label}\n </button>\n );\n })}\n <span className=\"ow-indicator\" aria-hidden=\"true\" />\n </div>\n );\n}\n", "import { useLayoutEffect, type RefObject } from \"react\";\n\n/**\n * Measures the selected child of `containerRef` (the first match of `selector`) and writes its box to the\n * container as --ow-indicator-x, -y, -w and -h, so one absolutely placed element (.ow-indicator) can slide\n * between choices. The container gets data-indicator=\"placed\" on the first measure (no animation) and \"ready\"\n * a frame later (animated from then on). It re-measures when `key` changes or anything resizes.\n */\nexport function useIndicator(containerRef: RefObject<HTMLElement | null>, selector: string, key: unknown) {\n useLayoutEffect(() => {\n const container = containerRef.current;\n if (!container) return undefined;\n let frame = 0;\n\n const measure = () => {\n const selected = container.querySelector<HTMLElement>(selector);\n if (!selected) {\n delete container.dataset.indicator;\n return;\n }\n container.style.setProperty(\"--ow-indicator-x\", `${selected.offsetLeft}px`);\n container.style.setProperty(\"--ow-indicator-y\", `${selected.offsetTop}px`);\n container.style.setProperty(\"--ow-indicator-w\", `${selected.offsetWidth}px`);\n container.style.setProperty(\"--ow-indicator-h\", `${selected.offsetHeight}px`);\n if (!container.dataset.indicator) {\n container.dataset.indicator = \"placed\";\n frame = requestAnimationFrame(() => {\n frame = requestAnimationFrame(() => {\n if (container.dataset.indicator) container.dataset.indicator = \"ready\";\n });\n });\n }\n };\n\n measure();\n if (typeof ResizeObserver === \"undefined\") return () => cancelAnimationFrame(frame);\n const observer = new ResizeObserver(measure);\n observer.observe(container);\n for (const child of container.children) observer.observe(child);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [containerRef, selector, key]);\n}\n", "import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { toAriaShortcut } from \"../../utils/text\";\n\nexport interface ChoiceCardProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n title: string;\n /** One line under the title saying what this choice does. */\n description: string;\n /** A 20px lucide-react icon, shown on a tinted tile. */\n icon: ReactNode;\n /** Marks the recommended choice with a tinted border. */\n recommended?: boolean;\n /** Keyboard shortcut shown in the top-right corner, e.g. \"\u2318N\". Only pass one that actually works. */\n shortcut?: string;\n}\n\n/** A large, card-shaped button for picking between a few options, e.g. on an empty state. */\nexport const ChoiceCard = forwardRef<HTMLButtonElement, ChoiceCardProps>(function ChoiceCard(\n { className, description, icon, recommended = false, shortcut, title, type = \"button\", ...buttonProps },\n ref,\n) {\n return (\n <button\n ref={ref}\n className={cx(\"ow-choice\", recommended && \"ow-choice--recommended\", className)}\n type={type}\n aria-keyshortcuts={shortcut ? toAriaShortcut(shortcut) : undefined}\n {...buttonProps}\n >\n <span className=\"ow-choice__top\">\n <span className=\"ow-choice__icon\">{icon}</span>\n {shortcut ? (\n <kbd aria-hidden=\"true\" className=\"ow-choice__shortcut\">\n {shortcut}\n </kbd>\n ) : null}\n </span>\n <span className=\"ow-choice__text\">\n <span className=\"ow-choice__title\">{title}</span>\n <span className=\"ow-choice__description\">{description}</span>\n </span>\n </button>\n );\n});\n", "import { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { CheckIcon, CopyIcon } from \"../../icons\";\nimport { copyText } from \"../../utils/copyText\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface CopyButtonProps {\n /** The text to copy. */\n value: string;\n /** Shown beside the icon, and read out.\n * @default \"Copy\" */\n label?: string;\n /** Shown for two seconds after copying.\n * @default \"Copied\" */\n copiedLabel?: string;\n /** Just the icon; the label is still read out.\n * @default false */\n iconOnly?: boolean;\n /** `default` sits on surfaces; `onDark` sits on a code block.\n * @default \"default\" */\n tone?: \"default\" | \"onDark\";\n onCopy?(): void;\n className?: string;\n}\n\n/** Copies a value and says so: the icon turns into a check for two seconds and screen readers hear \"Copied\". */\nexport function CopyButton({ value, label = \"Copy\", copiedLabel = \"Copied\", iconOnly = false, tone = \"default\", onCopy, className }: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timer = useRef(0);\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n return (\n <button\n type=\"button\"\n className={cx(\n \"ow-copy-button\",\n tone === \"onDark\" && \"ow-copy-button--on-dark\",\n iconOnly && \"ow-copy-button--icon-only\",\n copied && \"ow-copy-button--copied\",\n className,\n )}\n aria-label={iconOnly ? (copied ? copiedLabel : label) : undefined}\n onClick={async () => {\n if (await copyText(value)) {\n setCopied(true);\n onCopy?.();\n window.clearTimeout(timer.current);\n timer.current = window.setTimeout(() => setCopied(false), 2000);\n }\n }}\n >\n <span className=\"ow-copy-button__icon\" aria-hidden=\"true\">\n <CopyIcon size={14} />\n <CheckIcon size={14} />\n </span>\n {iconOnly ? null : <span>{copied ? copiedLabel : label}</span>}\n <span className=\"ow-visually-hidden\" aria-live=\"polite\">\n {copied ? copiedLabel : \"\"}\n </span>\n </button>\n );\n}\n\nexport interface CodeBlockProps {\n /** The code, as plain text. It's what the copy button copies. */\n code: string;\n /** Pre-highlighted HTML for the code (from Shiki or Prism, say). Without it the code shows plain. */\n html?: string;\n /** A file name or caption in the header. */\n title?: ReactNode;\n /** Shown on the right of the header, e.g. \"tsx\". */\n language?: string;\n /** @default false */\n showLineNumbers?: boolean;\n /** @default true */\n copyable?: boolean;\n /** Scrolls past this height (pixels). */\n maxHeight?: number;\n className?: string;\n}\n\n/** Code on a night ground, the same in both themes, with a copy button. */\nexport function CodeBlock({ code, html, title, language, showLineNumbers = false, copyable = true, maxHeight, className }: CodeBlockProps) {\n const hasHeader = title !== undefined || language !== undefined;\n const lines = code.replace(/\\n$/, \"\").split(\"\\n\");\n return (\n <div className={cx(\"ow-code-block\", showLineNumbers && \"ow-code-block--numbered\", className)}>\n {hasHeader ? (\n <div className=\"ow-code-block__header\">\n <span className=\"ow-code-block__title\">{title}</span>\n {language ? <span className=\"ow-code-block__language\">{language}</span> : null}\n {copyable ? <CopyButton value={code} tone=\"onDark\" iconOnly label=\"Copy code\" /> : null}\n </div>\n ) : copyable ? (\n <CopyButton value={code} tone=\"onDark\" iconOnly label=\"Copy code\" className=\"ow-code-block__floating-copy\" />\n ) : null}\n <pre className=\"ow-code-block__pre\" style={maxHeight ? { maxHeight } : undefined} tabIndex={0}>\n {showLineNumbers ? (\n <span className=\"ow-code-block__numbers\" aria-hidden=\"true\">\n {lines.map((_, index) => (\n <span key={index}>{index + 1}</span>\n ))}\n </span>\n ) : null}\n {html ? (\n <code className=\"ow-code-block__code\" dangerouslySetInnerHTML={{ __html: html }} />\n ) : (\n <code className=\"ow-code-block__code\">{code.replace(/\\n$/, \"\")}</code>\n )}\n </pre>\n </div>\n );\n}\n\nexport interface SnippetProps {\n /** The command or value, copied as is. */\n value: string;\n /** A muted prompt before it, such as \"$\".\n * @default \"$\" */\n prompt?: string | null;\n className?: string;\n}\n\n/** One line to copy: an install command, an API key name, a URL. */\nexport function Snippet({ value, prompt = \"$\", className }: SnippetProps) {\n return (\n <div className={cx(\"ow-snippet\", className)}>\n <code className=\"ow-snippet__code\">\n {prompt ? (\n <span className=\"ow-snippet__prompt\" aria-hidden=\"true\">\n {prompt}\n </span>\n ) : null}\n {value}\n </code>\n <CopyButton value={value} iconOnly label={`Copy ${value}`} />\n </div>\n );\n}\n", "/** Copies text to the clipboard, falling back to a hidden textarea where the Clipboard API is refused. */\nexport async function copyText(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n const area = document.createElement(\"textarea\");\n area.value = text;\n area.setAttribute(\"readonly\", \"\");\n area.style.position = \"fixed\";\n area.style.opacity = \"0\";\n document.body.appendChild(area);\n area.select();\n let ok = false;\n try {\n ok = document.execCommand(\"copy\");\n } catch {\n ok = false;\n }\n area.remove();\n return ok;\n }\n}\n", "import { cloneElement, isValidElement, useId, type ReactElement, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface FieldProps {\n /** The label, set above the control. */\n label: ReactNode;\n /** One control: an Input, Textarea, Select, or any element that takes an id. */\n children: ReactElement;\n /** A muted line under the control. */\n hint?: ReactNode;\n /** An error under the control; it also marks the control invalid. */\n error?: ReactNode;\n className?: string;\n}\n\n/**\n * A label above a control, with an optional hint and error below. Field wires them together:\n * it gives the control an id (unless it has one), points aria-describedby at the hint and error,\n * and marks it invalid when there is an error.\n */\nexport function Field({ label, children, hint, error, className }: FieldProps) {\n const generatedId = useId();\n const hintId = `${generatedId}-hint`;\n const errorId = `${generatedId}-error`;\n\n const child = isValidElement<Record<string, unknown>>(children) ? children : null;\n const controlId = (child?.props.id as string | undefined) ?? `${generatedId}-control`;\n const describedBy =\n [child?.props[\"aria-describedby\"] as string | undefined, hint ? hintId : undefined, error ? errorId : undefined]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // Our own controls draw the invalid state from `isInvalid`; native elements get aria-invalid.\n const invalidProp =\n child && typeof child.type !== \"string\"\n ? { isInvalid: (child.props.isInvalid as boolean | undefined) ?? Boolean(error) }\n : { \"aria-invalid\": error ? true : undefined };\n\n return (\n <div className={cx(\"ow-field\", className)}>\n <label className=\"ow-field__label\" htmlFor={controlId}>\n {label}\n </label>\n {child\n ? cloneElement(child, { id: controlId, \"aria-describedby\": describedBy, ...invalidProp })\n : children}\n {hint ? (\n <p id={hintId} className=\"ow-field__hint\">\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={errorId} role=\"alert\" className=\"ow-field__error\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n", "import { forwardRef, type InputHTMLAttributes, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"size\"> {\n /** Shows the field as wrong: a red border, and a red halo when focused. Also sets aria-invalid.\n * @default false */\n isInvalid?: boolean;\n /** sm 32px for toolbars and settings rows, md 40px in forms.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** Inside the field, before the text: a 16px icon, a unit, a prefix like \"https://\". */\n startContent?: ReactNode;\n /** Inside the field, after the text: a unit, a small ghost Button, a Spinner. */\n endContent?: ReactNode;\n}\n\n/**\n * A single-line text field. With startContent or endContent, the field becomes a group and `className`\n * goes on the group, so width and margins apply to the whole field.\n */\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n { className, isInvalid = false, size = \"md\", startContent, endContent, ...inputProps },\n ref,\n) {\n const invalid = isInvalid || undefined;\n if (startContent === undefined && endContent === undefined) {\n return (\n <input\n ref={ref}\n className={cx(\"ow-input\", size === \"sm\" && \"ow-input--sm\", isInvalid && \"ow-input--invalid\", className)}\n aria-invalid={invalid}\n {...inputProps}\n />\n );\n }\n return (\n <div\n className={cx(\n \"ow-input-group\",\n size === \"sm\" && \"ow-input-group--sm\",\n isInvalid && \"ow-input-group--invalid\",\n inputProps.disabled && \"ow-input-group--disabled\",\n className,\n )}\n >\n {startContent !== undefined ? <span className=\"ow-input-group__addon\">{startContent}</span> : null}\n <input ref={ref} className=\"ow-input-group__input\" aria-invalid={invalid} {...inputProps} />\n {endContent !== undefined ? <span className=\"ow-input-group__addon\">{endContent}</span> : null}\n </div>\n );\n});\n", "import { forwardRef, useRef, type ForwardedRef, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { SearchIcon } from \"../../icons\";\nimport { CloseButton } from \"../Button/ButtonGroup\";\nimport { Input, type InputProps } from \"../Input/Input\";\nimport { Spinner } from \"../Spinner/Spinner\";\n\nexport interface SearchFieldProps\n extends Omit<InputProps, \"value\" | \"defaultValue\" | \"onChange\" | \"type\" | \"startContent\" | \"endContent\" | \"onSubmit\"> {\n value?: string;\n /** @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** Called with the text when the person presses Enter. */\n onSubmit?(value: string): void;\n /** Shows a spinner in place of the clear button while results load.\n * @default false */\n loading?: boolean;\n /** Names the field when there's no visible label.\n * @default \"Search\" */\n \"aria-label\"?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/** A search box: a magnifier, the text, and a clear button once there's something to clear. Escape clears it. */\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(function SearchField(\n {\n value,\n defaultValue = \"\",\n onChange,\n onSubmit,\n loading = false,\n placeholder = \"Search\",\n \"aria-label\": ariaLabel = \"Search\",\n size = \"md\",\n onKeyDown,\n ...inputProps\n },\n ref,\n) {\n const [text, setText] = useControllableState(value, defaultValue, onChange);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n if (event.key === \"Escape\" && text) {\n event.preventDefault();\n event.stopPropagation();\n setText(\"\");\n } else if (event.key === \"Enter\") {\n onSubmit?.(text);\n }\n }\n\n return (\n <Input\n ref={(element) => {\n inputRef.current = element;\n assignRef(ref, element);\n }}\n type=\"search\"\n size={size}\n placeholder={placeholder}\n aria-label={ariaLabel}\n value={text}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={handleKeyDown}\n startContent={<SearchIcon size={size === \"sm\" ? 14 : 16} />}\n endContent={\n loading ? (\n <Spinner size=\"sm\" label=\"Searching\" />\n ) : text ? (\n <CloseButton\n size=\"sm\"\n label=\"Clear search\"\n onClick={() => {\n setText(\"\");\n inputRef.current?.focus();\n }}\n />\n ) : null\n }\n {...inputProps}\n />\n );\n});\n", "import { forwardRef, useState, type InputHTMLAttributes, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { MinusIcon, PlusIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface NumberFieldProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, \"value\" | \"defaultValue\" | \"onChange\" | \"size\" | \"type\" | \"min\" | \"max\" | \"step\"> {\n /** The number, or null when empty. */\n value?: number | null;\n /** @default null */\n defaultValue?: number | null;\n onChange?(value: number | null): void;\n min?: number;\n max?: number;\n /** How much the buttons and arrow keys change it. PageUp and PageDown move ten steps.\n * @default 1 */\n step?: number;\n /** How the number is shown while the field isn't being edited, e.g. { style: \"currency\", currency: \"EUR\" }. */\n formatOptions?: Intl.NumberFormatOptions;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n /** Names the field when there's no visible label (Field gives it one). */\n \"aria-label\"?: string;\n}\n\nconst decimals = (step: number) => (String(step).split(\".\")[1] ?? \"\").length;\n\n/** A number with \u2212 and + buttons either side. Up and Down step it; the value is clamped to min and max. */\nexport const NumberField = forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(\n {\n value,\n defaultValue = null,\n onChange,\n min,\n max,\n step = 1,\n formatOptions,\n size = \"md\",\n isInvalid = false,\n disabled,\n className,\n onBlur,\n onFocus,\n onKeyDown,\n ...inputProps\n },\n ref,\n) {\n const [number, setNumber] = useControllableState(value, defaultValue, onChange);\n const [draft, setDraft] = useState<string | null>(null);\n const format = (n: number | null) =>\n n === null ? \"\" : formatOptions ? new Intl.NumberFormat(undefined, formatOptions).format(n) : String(n);\n\n const clamp = (n: number) => {\n const rounded = Number(n.toFixed(decimals(step)));\n return Math.min(max ?? Infinity, Math.max(min ?? -Infinity, rounded));\n };\n\n // While the field has focus, `draft` holds the raw text; otherwise the number is shown formatted.\n function commit(text: string, keepEditing = false) {\n setDraft(keepEditing ? text : null);\n const cleaned = text.replace(/[^\\d.,-]/g, \"\").replace(\",\", \".\");\n if (cleaned === \"\" || cleaned === \"-\") {\n setNumber(null);\n return;\n }\n const parsed = Number(cleaned);\n if (Number.isNaN(parsed)) return;\n const next = clamp(parsed);\n setNumber(next);\n if (keepEditing) setDraft(String(next));\n }\n\n function stepBy(multiple: number) {\n const base = draft !== null && draft !== \"\" && !Number.isNaN(Number(draft)) ? Number(draft) : (number ?? min ?? 0);\n const next = clamp(base + step * multiple);\n setNumber(next);\n if (draft !== null) setDraft(String(next));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n if (event.defaultPrevented) return;\n const moves: Record<string, () => void> = {\n ArrowUp: () => stepBy(1),\n ArrowDown: () => stepBy(-1),\n PageUp: () => stepBy(10),\n PageDown: () => stepBy(-10),\n Home: () => min !== undefined && commit(String(min), draft !== null),\n End: () => max !== undefined && commit(String(max), draft !== null),\n Enter: () => draft !== null && commit(draft, true),\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n move();\n }\n\n const atMin = min !== undefined && number !== null && number <= min;\n const atMax = max !== undefined && number !== null && number >= max;\n\n return (\n <div\n className={cx(\n \"ow-number-field\",\n size === \"sm\" && \"ow-number-field--sm\",\n isInvalid && \"ow-number-field--invalid\",\n disabled && \"ow-number-field--disabled\",\n className,\n )}\n >\n <button\n type=\"button\"\n className=\"ow-number-field__step\"\n aria-label=\"Decrease\"\n tabIndex={-1}\n disabled={disabled || atMin}\n onClick={() => stepBy(-1)}\n >\n <MinusIcon size={14} />\n </button>\n <input\n ref={ref}\n type=\"text\"\n inputMode={decimals(step) > 0 || (min ?? 0) < 0 ? \"decimal\" : \"numeric\"}\n role=\"spinbutton\"\n autoComplete=\"off\"\n className=\"ow-number-field__input\"\n aria-valuenow={number ?? undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={number === null ? undefined : format(number)}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n value={draft ?? format(number)}\n onFocus={(event) => {\n onFocus?.(event);\n setDraft(number === null ? \"\" : String(number));\n }}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={(event) => {\n onBlur?.(event);\n commit(event.target.value);\n }}\n onKeyDown={handleKeyDown}\n {...inputProps}\n />\n <button\n type=\"button\"\n className=\"ow-number-field__step\"\n aria-label=\"Increase\"\n tabIndex={-1}\n disabled={disabled || atMax}\n onClick={() => stepBy(1)}\n >\n <PlusIcon size={14} />\n </button>\n </div>\n );\n});\n", "import { useRef, type ClipboardEvent, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface InputOTPProps {\n /** How many characters the code has.\n * @default 6 */\n length?: number;\n value?: string;\n /** @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** Called once every box is filled. */\n onComplete?(value: string): void;\n /** `numeric` accepts digits only; `alphanumeric` letters and digits (shown upper case).\n * @default \"numeric\" */\n type?: \"numeric\" | \"alphanumeric\";\n /** Splits the boxes into groups with a dash between, e.g. 3 for \"123\u2013456\". */\n groupSize?: number;\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n autoFocus?: boolean;\n /** Names the code for screen readers.\n * @default \"Verification code\" */\n \"aria-label\"?: string;\n /** The form field name; a hidden input carries the whole code. */\n name?: string;\n className?: string;\n}\n\n/**\n * A one-time code in separate boxes. Typing moves forward, Backspace moves back,\n * and pasting a code fills every box. The browser can fill it from a text message.\n */\nexport function InputOTP({\n length = 6,\n value,\n defaultValue = \"\",\n onChange,\n onComplete,\n type = \"numeric\",\n groupSize,\n isInvalid = false,\n disabled,\n autoFocus,\n \"aria-label\": ariaLabel = \"Verification code\",\n name,\n className,\n}: InputOTPProps) {\n const [code, setCode] = useControllableState(value, defaultValue, onChange);\n const refs = useRef<Array<HTMLInputElement | null>>([]);\n // The code as of the last change, read by handlers that run before React renders it,\n // such as the next box's onFocus when typing moves focus forward.\n const latest = useRef(code);\n latest.current = code;\n const allowed = type === \"numeric\" ? /\\d/ : /[a-z0-9]/i;\n const clean = (text: string) => [...text].filter((char) => allowed.test(char)).join(\"\").toUpperCase();\n const chars = Array.from({ length }, (_, index) => code[index] ?? \"\");\n\n function update(next: string, focusIndex: number) {\n const trimmed = next.slice(0, length);\n latest.current = trimmed;\n setCode(trimmed);\n refs.current[Math.min(focusIndex, length - 1)]?.focus();\n if (trimmed.length === length && !trimmed.includes(\" \")) onComplete?.(trimmed);\n }\n\n function setAt(index: number, char: string) {\n const next = chars.map((existing, i) => (i === index ? char : existing));\n // Keep the code contiguous: an empty box ends it.\n const firstGap = next.indexOf(\"\");\n return (firstGap === -1 ? next : next.slice(0, firstGap)).join(\"\");\n }\n\n function onInput(index: number, text: string) {\n const typed = clean(text);\n if (!typed) return;\n if (typed.length > 1) {\n // Autofill or a paste into one box.\n update(chars.slice(0, index).join(\"\") + typed, index + typed.length);\n return;\n }\n update(setAt(index, typed), index + 1);\n }\n\n function onKeyDown(index: number, event: KeyboardEvent<HTMLInputElement>) {\n if (event.key === \"Backspace\") {\n event.preventDefault();\n // Removes one character; the ones after it move back a box.\n if (chars[index]) update(code.slice(0, index) + code.slice(index + 1), index);\n else if (index > 0) update(code.slice(0, index - 1) + code.slice(index), index - 1);\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n refs.current[Math.max(0, index - 1)]?.focus();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n refs.current[Math.min(length - 1, index + 1, code.length)]?.focus();\n }\n }\n\n function onPaste(index: number, event: ClipboardEvent<HTMLInputElement>) {\n event.preventDefault();\n const pasted = clean(event.clipboardData.getData(\"text\"));\n if (pasted) update(chars.slice(0, index).join(\"\") + pasted, index + pasted.length);\n }\n\n return (\n <div role=\"group\" aria-label={ariaLabel} className={cx(\"ow-otp\", isInvalid && \"ow-otp--invalid\", className)}>\n {chars.map((char, index) => (\n <span key={index} className=\"ow-otp__slot\">\n {groupSize && index > 0 && index % groupSize === 0 ? (\n <span className=\"ow-otp__separator\" aria-hidden=\"true\" />\n ) : null}\n <input\n ref={(element) => {\n refs.current[index] = element;\n }}\n className=\"ow-otp__input\"\n type=\"text\"\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n autoCapitalize=\"characters\"\n maxLength={length}\n aria-label={`Character ${index + 1} of ${length}`}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n autoFocus={autoFocus && index === 0}\n value={char}\n // Clicking an empty box past the end goes to the next one to fill.\n onFocus={(event) => {\n const filled = latest.current.length;\n if (index > filled) refs.current[filled]?.focus();\n else event.target.select();\n }}\n onChange={(event) => onInput(index, event.target.value.replace(char, \"\") || event.target.value)}\n onKeyDown={(event) => onKeyDown(index, event)}\n onPaste={(event) => onPaste(index, event)}\n />\n </span>\n ))}\n {name ? <input type=\"hidden\" name={name} value={code} /> : null}\n </div>\n );\n}\n", "import {\n forwardRef,\n useLayoutEffect,\n useRef,\n type ChangeEvent,\n type CSSProperties,\n type ForwardedRef,\n type TextareaHTMLAttributes,\n} from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { resizeTextArea } from \"../../utils/resizeTextArea\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Grows with its text, up to `autoGrowMaxHeight`, then scrolls. */\n autoGrow?: boolean;\n /** The tallest an auto-growing box gets. A number is pixels. Default 180. */\n autoGrowMaxHeight?: number | string;\n /** Borderless and transparent, for use inside your own field container (a chat composer). */\n bare?: boolean;\n isInvalid?: boolean;\n}\n\nconst defaultAutoGrowMaxHeight = 180;\n\nfunction assignRef(ref: ForwardedRef<HTMLTextAreaElement>, element: HTMLTextAreaElement | null) {\n if (typeof ref === \"function\") ref(element);\n else if (ref) ref.current = element;\n}\n\n/** A multi-line text field, 72px tall at least; it can grow with its text. */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n {\n autoGrow = false,\n autoGrowMaxHeight = defaultAutoGrowMaxHeight,\n bare = false,\n className,\n isInvalid = false,\n onChange,\n style,\n value,\n ...textareaProps\n },\n ref,\n) {\n const textAreaRef = useRef<HTMLTextAreaElement | null>(null);\n\n useLayoutEffect(() => {\n if (autoGrow && textAreaRef.current) resizeTextArea(textAreaRef.current);\n }, [autoGrow, autoGrowMaxHeight, value]);\n\n function setTextAreaRef(element: HTMLTextAreaElement | null) {\n textAreaRef.current = element;\n assignRef(ref, element);\n if (autoGrow && element) resizeTextArea(element);\n }\n\n function handleChange(event: ChangeEvent<HTMLTextAreaElement>) {\n // A controlled box is resized once its new value renders (the layout effect above).\n if (autoGrow && value === undefined) resizeTextArea(event.currentTarget);\n onChange?.(event);\n }\n\n const textareaStyle: CSSProperties | undefined = autoGrow\n ? {\n ...style,\n maxHeight: typeof autoGrowMaxHeight === \"number\" ? `${autoGrowMaxHeight}px` : autoGrowMaxHeight,\n }\n : style;\n\n return (\n <textarea\n {...textareaProps}\n ref={setTextAreaRef}\n className={cx(\n \"ow-textarea\",\n bare && \"ow-textarea--bare\",\n isInvalid && !bare && \"ow-textarea--invalid\",\n autoGrow && \"ow-textarea--auto-grow\",\n className,\n )}\n aria-invalid={isInvalid || undefined}\n style={textareaStyle}\n value={value}\n onChange={handleChange}\n />\n );\n});\n", "/** Text longer than this can't fit under any auto-grow cap, however wide the box. */\nconst surelyOverflowingLength = 20_000;\n\n/**\n * Whether the text needs more lines than fit under maxHeight even before wrapping. Counting line breaks is cheap;\n * measuring (scrollHeight) lays out all of the text, which takes tens of milliseconds per keystroke for a long draft.\n */\nfunction surelyOverflows(textArea: HTMLTextAreaElement, maxHeight: number): boolean {\n const text = textArea.value;\n if (text.length > surelyOverflowingLength) return true;\n const style = window.getComputedStyle(textArea);\n const lineHeight = Number.parseFloat(style.lineHeight) || Number.parseFloat(style.fontSize) * 1.2;\n if (!lineHeight) return false;\n const needed = Math.ceil(maxHeight / lineHeight) + 1;\n let lines = 1;\n for (let index = text.indexOf(\"\\n\"); index !== -1 && lines < needed; index = text.indexOf(\"\\n\", index + 1))\n lines += 1;\n return lines >= needed;\n}\n\n/** Grows a textarea to fit its text, up to its CSS max-height, then scrolls. */\nexport function resizeTextArea(textArea: HTMLTextAreaElement): void {\n const maxHeight = Number.parseFloat(window.getComputedStyle(textArea).maxHeight);\n // Already past the cap: it stays at the cap and scrolls, with nothing to measure.\n if (Number.isFinite(maxHeight) && surelyOverflows(textArea, maxHeight)) {\n textArea.style.height = `${maxHeight.toString()}px`;\n textArea.style.overflowY = \"auto\";\n return;\n }\n\n textArea.style.height = \"auto\";\n\n const shouldScroll = Number.isFinite(maxHeight) && textArea.scrollHeight > maxHeight;\n\n textArea.style.height = `${textArea.scrollHeight}px`;\n textArea.style.overflowY = shouldScroll ? \"auto\" : \"hidden\";\n}\n", "import { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\n\nimport { manualPopover, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { CheckIcon, ChevronDownIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface SelectOption {\n value: string;\n label: ReactNode;\n /** Plain text for type-to-find and the trigger's tooltip, when `label` isn't a string. */\n textValue?: string;\n /** A muted line under the label. */\n description?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface SelectGroup {\n label: string;\n options: SelectOption[];\n}\n\nexport type SelectItem = SelectOption | SelectGroup;\n\nexport interface SelectProps {\n value: string;\n options: SelectItem[];\n onChange(value: string): void;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n id?: string;\n disabled?: boolean;\n /** Shown when no option matches `value`. Default \"Select\u2026\". */\n placeholder?: string;\n size?: \"sm\" | \"md\";\n isInvalid?: boolean;\n /** Classes for the trigger, e.g. a width. */\n className?: string;\n /** Classes for the trigger's and options' text, e.g. a monospace class. */\n valueClassName?: string;\n}\n\nconst menuGap = 4;\nconst menuMaxHeight = 288;\nconst typeaheadResetMs = 600;\n\nfunction isGroup(item: SelectItem): item is SelectGroup {\n return \"options\" in item;\n}\n\nfunction textOf(option: SelectOption): string {\n return option.textValue ?? (typeof option.label === \"string\" ? option.label : option.value);\n}\n\n/**\n * A dropdown: a button that opens a listbox of options, in place of a native <select>.\n * It works with the keyboard like a select (arrows, Home/End, type to find, Enter/Space to pick,\n * Escape/Tab to close), keeps focus on the trigger, and its menu sits in the top layer so it\n * isn't clipped by dialogs or scroll areas.\n */\nexport function Select({\n value,\n options,\n onChange,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n id,\n disabled = false,\n placeholder = \"Select\u2026\",\n size = \"md\",\n isInvalid = false,\n className,\n valueClassName,\n}: SelectProps) {\n const listboxId = useId();\n const optionIdPrefix = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const typeahead = useRef({ text: \"\", timer: 0 });\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n\n const flat = useMemo(() => options.flatMap((item) => (isGroup(item) ? item.options : [item])), [options]);\n const selectedIndex = flat.findIndex((option) => option.value === value);\n const selected = flat[selectedIndex];\n const optionId = (index: number) => `${optionIdPrefix}-${index}`;\n\n const enabledFrom = useCallback(\n (start: number, step: 1 | -1): number => {\n for (let index = start; index >= 0 && index < flat.length; index += step) {\n if (!flat[index]!.disabled) return index;\n }\n return -1;\n },\n [flat],\n );\n\n const { mounted, state } = usePresence(isOpen);\n const floatingStyle = useFloating({\n open: mounted,\n anchorRef: triggerRef,\n floatingRef: menuRef,\n offset: menuGap,\n matchWidth: true,\n maxHeight: menuMaxHeight,\n });\n\n function open(startAt?: \"first\" | \"last\") {\n if (disabled || isOpen) return;\n setActiveIndex(\n startAt === \"first\"\n ? enabledFrom(0, 1)\n : startAt === \"last\"\n ? enabledFrom(flat.length - 1, -1)\n : selectedIndex >= 0 && !flat[selectedIndex]!.disabled\n ? selectedIndex\n : enabledFrom(0, 1),\n );\n setIsOpen(true);\n }\n\n function close() {\n setIsOpen(false);\n }\n\n function choose(index: number) {\n const option = flat[index];\n if (!option || option.disabled) return;\n close();\n triggerRef.current?.focus();\n if (option.value !== value) onChange(option.value);\n }\n\n // Keep the active option in view while moving with the keyboard.\n useEffect(() => {\n if (!isOpen || activeIndex < 0) return;\n document.getElementById(optionId(activeIndex))?.scrollIntoView({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- optionId is stable for this component.\n }, [isOpen, activeIndex]);\n\n // Close on a click elsewhere. (useFloating follows the trigger when the page scrolls or resizes.)\n useEffect(() => {\n if (!isOpen) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (!menuRef.current?.contains(target) && !triggerRef.current?.contains(target)) close();\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown, true);\n }, [isOpen]);\n\n useEffect(() => {\n if (disabled) setIsOpen(false);\n }, [disabled]);\n\n useEffect(() => () => window.clearTimeout(typeahead.current.timer), []);\n\n function findByTyping(key: string) {\n const state = typeahead.current;\n window.clearTimeout(state.timer);\n state.text += key.toLowerCase();\n state.timer = window.setTimeout(() => {\n state.text = \"\";\n }, typeaheadResetMs);\n const from = isOpen ? activeIndex : selectedIndex;\n // A repeated single letter cycles through the matches.\n const repeated = state.text.length > 1 && [...state.text].every((letter) => letter === state.text[0]);\n const search = repeated ? state.text[0]! : state.text;\n const start = repeated || state.text.length === 1 ? from + 1 : from;\n for (let offset = 0; offset < flat.length; offset += 1) {\n const index = (Math.max(start, 0) + offset) % flat.length;\n const option = flat[index]!;\n if (!option.disabled && textOf(option).toLowerCase().startsWith(search)) {\n if (isOpen) setActiveIndex(index);\n else if (option.value !== value) onChange(option.value);\n return;\n }\n }\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n if (disabled) return;\n const { key } = event;\n\n if (!isOpen) {\n if (key === \"ArrowDown\" || key === \"ArrowUp\" || key === \"Enter\" || key === \" \") {\n event.preventDefault();\n open(key === \"ArrowUp\" && selectedIndex < 0 ? \"last\" : undefined);\n } else if (key.length === 1 && !event.metaKey && !event.ctrlKey) {\n findByTyping(key);\n }\n return;\n }\n\n switch (key) {\n case \"ArrowDown\": {\n event.preventDefault();\n const next = enabledFrom(activeIndex + 1, 1);\n if (next >= 0) setActiveIndex(next);\n return;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n const previous = enabledFrom(activeIndex - 1, -1);\n if (previous >= 0) setActiveIndex(previous);\n return;\n }\n case \"Home\":\n case \"PageUp\":\n event.preventDefault();\n setActiveIndex(enabledFrom(0, 1));\n return;\n case \"End\":\n case \"PageDown\":\n event.preventDefault();\n setActiveIndex(enabledFrom(flat.length - 1, -1));\n return;\n case \"Enter\":\n event.preventDefault();\n choose(activeIndex);\n return;\n case \" \":\n event.preventDefault();\n if (typeahead.current.text) findByTyping(\" \");\n else choose(activeIndex);\n return;\n case \"Escape\":\n // Close the menu, not the dialog around it.\n event.preventDefault();\n event.stopPropagation();\n close();\n return;\n case \"Tab\":\n close();\n return;\n default:\n if (key.length === 1 && !event.metaKey && !event.ctrlKey) findByTyping(key);\n }\n }\n\n let flatIndex = -1;\n\n const renderOption = (option: SelectOption) => {\n flatIndex += 1;\n const index = flatIndex;\n const isSelected = index === selectedIndex;\n const isActive = index === activeIndex;\n return (\n <div\n key={`${option.value}-${index}`}\n id={optionId(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled || undefined}\n className={cx(\"ow-option\", {\n \"ow-option--active\": isActive && !option.disabled,\n \"ow-option--selected\": isSelected,\n \"ow-option--disabled\": Boolean(option.disabled),\n })}\n onPointerMove={() => {\n if (!option.disabled && activeIndex !== index) setActiveIndex(index);\n }}\n // Keep focus on the trigger.\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => choose(index)}\n >\n <span className=\"ow-option__check\">{isSelected ? <CheckIcon size={14} /> : null}</span>\n <span className=\"ow-option__text\">\n <span className={cx(\"ow-option__label\", valueClassName)}>{option.label}</span>\n {option.description ? <span className=\"ow-option__description\">{option.description}</span> : null}\n </span>\n </div>\n );\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={isOpen && activeIndex >= 0 ? optionId(activeIndex) : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n title={selected ? textOf(selected) : undefined}\n className={cx(\"ow-select\", `ow-select--${size}`, { \"ow-select--open\": isOpen, \"ow-select--invalid\": isInvalid && !isOpen }, className)}\n onClick={() => (isOpen ? close() : open())}\n onKeyDown={onKeyDown}\n onBlur={(event) => {\n if (!menuRef.current?.contains(event.relatedTarget as Node)) close();\n }}\n >\n <span className={cx(\"ow-select__value\", !selected && \"ow-select__value--placeholder\", valueClassName)}>\n {selected ? selected.label : placeholder}\n </span>\n <ChevronDownIcon size={size === \"sm\" ? 14 : 16} className=\"ow-select__chevron\" />\n </button>\n {mounted ? (\n <div\n ref={menuRef}\n {...manualPopover}\n data-state={state}\n id={listboxId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n tabIndex={-1}\n className={cx(\"ow-listbox\", \"ow-floating\", `ow-listbox--${size}`)}\n style={floatingStyle}\n >\n {options.map((item, groupIndex) =>\n isGroup(item) ? (\n <div key={`group-${item.label}-${groupIndex}`} role=\"group\" aria-label={item.label} className=\"ow-listbox__group\">\n <div className=\"ow-listbox__group-label\" aria-hidden=\"true\">\n {item.label}\n </div>\n {item.options.map(renderOption)}\n </div>\n ) : (\n renderOption(item)\n ),\n )}\n {flat.length === 0 ? <div className=\"ow-listbox__empty\">No options</div> : null}\n </div>\n ) : null}\n </>\n );\n}\n", "import { useCallback, useEffect, useLayoutEffect, useState, type CSSProperties, type RefObject } from \"react\";\n\nexport type Placement = \"bottom-start\" | \"bottom-end\" | \"bottom\" | \"top-start\" | \"top-end\" | \"top\" | \"left\" | \"right\";\n\ninterface Options {\n open: boolean;\n anchorRef: RefObject<HTMLElement | null>;\n floatingRef: RefObject<HTMLElement | null>;\n placement?: Placement;\n /** Distance from the anchor in pixels. */\n offset?: number;\n /** Make the floating element at least as wide as the anchor. */\n matchWidth?: boolean;\n /** The tallest it gets before scrolling. */\n maxHeight?: number;\n}\n\nconst margin = 8;\n\n/**\n * Positions a floating element (a popover, a listbox) against its anchor with fixed coordinates, flips it above\n * or below (or, for \"left\" and \"right\", to the other side) when there's no room, keeps it on screen, and follows the anchor when the page scrolls or resizes.\n * It also puts the element in the browser's top layer (popover=\"manual\"), so dialogs and overflow can't clip it.\n * Pass the element's `mounted` from usePresence as `open`, so it stays placed while it animates out.\n */\nexport function useFloating({\n open,\n anchorRef,\n floatingRef,\n placement = \"bottom-start\",\n offset = 4,\n matchWidth = false,\n maxHeight = 360,\n}: Options): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({\n position: \"fixed\",\n inset: \"auto\",\n left: 0,\n right: \"auto\",\n top: 0,\n bottom: \"auto\",\n visibility: \"hidden\",\n });\n\n const place = useCallback(() => {\n const anchor = anchorRef.current;\n const floating = floatingRef.current;\n if (!anchor || !floating) return;\n const rect = anchor.getBoundingClientRect();\n const width = Math.max(floating.offsetWidth, matchWidth ? rect.width : 0);\n const height = floating.scrollHeight;\n\n // Beside the anchor, centred on it: for a tooltip on a folded sidebar's icons.\n if (placement === \"left\" || placement === \"right\") {\n const roomLeft = rect.left - offset - margin;\n const roomRight = window.innerWidth - rect.right - offset - margin;\n const onLeft = placement === \"left\" ? width <= roomLeft || roomLeft > roomRight : width > roomRight && roomLeft > roomRight;\n const top = Math.min(Math.max(margin, rect.top + rect.height / 2 - height / 2), window.innerHeight - height - margin);\n floating.dataset.side = onLeft ? \"left\" : \"right\";\n setStyle({\n position: \"fixed\",\n inset: \"auto\",\n margin: 0,\n left: onLeft ? \"auto\" : rect.right + offset,\n right: onLeft ? window.innerWidth - rect.left + offset : \"auto\",\n top,\n bottom: \"auto\",\n maxHeight: Math.max(120, Math.min(maxHeight, window.innerHeight - 2 * margin)),\n [\"--ow-floating-origin\" as string]: `${onLeft ? \"right\" : \"left\"} center`,\n });\n return;\n }\n const below = window.innerHeight - rect.bottom - offset - margin;\n const above = rect.top - offset - margin;\n const wantsTop = placement.startsWith(\"top\");\n const fitsBelow = height <= below;\n const fitsAbove = height <= above;\n const top = wantsTop ? fitsAbove || above > below : !fitsBelow && above > below;\n\n const align = placement.endsWith(\"start\") ? \"start\" : placement.endsWith(\"end\") ? \"end\" : \"center\";\n let left = align === \"start\" ? rect.left : align === \"end\" ? rect.right - width : rect.left + rect.width / 2 - width / 2;\n left = Math.min(Math.max(margin, left), window.innerWidth - width - margin);\n\n // Which way it opened, for the enter and exit animations (base.css: .ow-floating).\n floating.dataset.side = top ? \"top\" : \"bottom\";\n // Every edge is set, every time: a value React clears falls back to the browser's\n // [popover] { inset: 0 }, which pins the layer to the top of the window.\n setStyle({\n position: \"fixed\",\n inset: \"auto\",\n margin: 0,\n left,\n right: \"auto\",\n top: top ? \"auto\" : rect.bottom + offset,\n bottom: top ? window.innerHeight - rect.top + offset : \"auto\",\n minWidth: matchWidth ? rect.width : undefined,\n maxHeight: Math.max(120, Math.min(maxHeight, top ? above : below)),\n [\"--ow-floating-origin\" as string]: `${top ? \"bottom\" : \"top\"} ${align === \"start\" ? \"left\" : align === \"end\" ? \"right\" : \"center\"}`,\n });\n }, [anchorRef, floatingRef, placement, offset, matchWidth, maxHeight]);\n\n // Top layer: above modal dialogs and outside any overflow: hidden.\n useLayoutEffect(() => {\n const floating = floatingRef.current;\n if (!open || !floating) return;\n try {\n if (!floating.matches(\":popover-open\")) floating.showPopover();\n } catch {\n // Without popover support it still shows as a fixed element.\n }\n place();\n return () => {\n try {\n if (floating.matches(\":popover-open\")) floating.hidePopover();\n } catch {\n // Already hidden.\n }\n };\n }, [open, floatingRef, place]);\n\n useEffect(() => {\n if (!open) return;\n const onScroll = (event: Event) => {\n if (floatingRef.current?.contains(event.target as Node)) return;\n place();\n };\n const observer = typeof ResizeObserver === \"undefined\" ? undefined : new ResizeObserver(() => place());\n if (floatingRef.current) observer?.observe(floatingRef.current);\n window.addEventListener(\"scroll\", onScroll, true);\n window.addEventListener(\"resize\", place);\n return () => {\n observer?.disconnect();\n window.removeEventListener(\"scroll\", onScroll, true);\n window.removeEventListener(\"resize\", place);\n };\n }, [open, place, floatingRef]);\n\n return style;\n}\n\n/** Calls `onDismiss` on a press outside every given element, or on Escape. */\nexport function useDismiss(open: boolean, refs: Array<RefObject<HTMLElement | null>>, onDismiss: (reason: \"outside\" | \"escape\") => void) {\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node;\n if (refs.every((ref) => !ref.current?.contains(target))) onDismiss(\"outside\");\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n // Close this layer, not the dialog around it.\n event.preventDefault();\n event.stopPropagation();\n onDismiss(\"escape\");\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refs are stable objects.\n }, [open, onDismiss]);\n}\n\n/** The attribute that makes an element a manual popover, typed loosely for React 18. */\nexport const manualPopover = { popover: \"manual\" } as Record<string, string>;\n", "import { useEffect, useState } from \"react\";\n\n/** How long a closing layer stays mounted for its exit animation (base.css: ow-floating-out). */\nexport const exitDuration = 140;\n\nexport interface Presence {\n /** Render the element while this is true: it stays true through the exit animation. */\n mounted: boolean;\n /** Put this on the element as data-state, so CSS can run the enter or the exit animation. */\n state: \"open\" | \"closed\";\n}\n\n/**\n * Keeps an element mounted for a moment after `open` turns false, so it can animate out instead of vanishing.\n * With reduced motion it unmounts at once.\n */\nexport function usePresence(open: boolean, exitMs = exitDuration): Presence {\n const [mounted, setMounted] = useState(open);\n if (open && !mounted) setMounted(true);\n\n useEffect(() => {\n if (open || !mounted) return undefined;\n const reduceMotion = typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const timer = window.setTimeout(() => setMounted(false), reduceMotion ? 0 : exitMs);\n return () => window.clearTimeout(timer);\n }, [open, mounted, exitMs]);\n\n return { mounted: open || mounted, state: open ? \"open\" : \"closed\" };\n}\n", "import {\n forwardRef,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ForwardedRef,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { CheckIcon, ChevronDownIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface ComboboxOption {\n value: string;\n /** The text shown and matched. */\n label: string;\n /** A muted line under the label; also matched. */\n description?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface ComboboxProps {\n options: ComboboxOption[];\n /** The chosen option's value, or \"\" for none. */\n value?: string;\n /** @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** Called as the person types, to load options from a server. */\n onInputChange?(text: string): void;\n /** @default \"Search\u2026\" */\n placeholder?: string;\n /** Shown when nothing matches.\n * @default \"No matches\" */\n emptyMessage?: ReactNode;\n /** Keep what was typed even if it isn't an option; onChange gets the text.\n * @default false */\n allowCustomValue?: boolean;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n id?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n className?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/**\n * A text field that suggests options as you type: pick a country, a repository, a person.\n * Down opens the list, Up and Down move, Enter picks, Escape closes then clears.\n */\nexport const Combobox = forwardRef<HTMLInputElement, ComboboxProps>(function Combobox(\n {\n options,\n value,\n defaultValue = \"\",\n onChange,\n onInputChange,\n placeholder = \"Search\u2026\",\n emptyMessage = \"No matches\",\n allowCustomValue = false,\n size = \"md\",\n isInvalid = false,\n disabled = false,\n id,\n className,\n ...aria\n },\n ref,\n) {\n const [selected, setSelected] = useControllableState(value, defaultValue, onChange);\n const labelOf = (v: string) => options.find((option) => option.value === v)?.label ?? (allowCustomValue ? v : \"\");\n const [text, setText] = useState(() => labelOf(selected));\n const [isOpen, setOpen] = useState(false);\n const [typed, setTyped] = useState(false);\n const [active, setActive] = useState(-1);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const fieldRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n const optionId = (index: number) => `${listId}-${index}`;\n\n const results = useMemo(() => {\n const query = text.trim().toLowerCase();\n if (!typed || !query) return options;\n return options.filter(\n (option) =>\n option.label.toLowerCase().includes(query) ||\n (typeof option.description === \"string\" && option.description.toLowerCase().includes(query)),\n );\n }, [options, text, typed]);\n\n // Show the chosen option's label when the value changes from outside.\n useEffect(() => {\n if (!isOpen) setText(labelOf(selected));\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only when the value or options change.\n }, [selected, options]);\n\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef: fieldRef, floatingRef: listRef, matchWidth: true, maxHeight: 288 });\n\n function open() {\n if (disabled || isOpen) return;\n setOpen(true);\n const index = results.findIndex((option) => option.value === selected);\n setActive(index >= 0 ? index : results.findIndex((option) => !option.disabled));\n }\n\n function close(restore = true) {\n setOpen(false);\n setTyped(false);\n if (!restore) return;\n if (allowCustomValue) {\n if (text !== labelOf(selected)) {\n const match = options.find((option) => option.label.toLowerCase() === text.trim().toLowerCase());\n setSelected(match ? match.value : text);\n }\n } else if (text.trim() === \"\") setSelected(\"\");\n else setText(labelOf(selected));\n }\n\n useDismiss(isOpen, [fieldRef, listRef], () => close());\n\n function choose(option: ComboboxOption | undefined) {\n if (!option || option.disabled) return;\n setSelected(option.value);\n setText(option.label);\n setOpen(false);\n setTyped(false);\n }\n\n function move(step: 1 | -1) {\n if (!results.length) return;\n let next = active;\n for (let tries = 0; tries < results.length; tries += 1) {\n next = (next + step + results.length) % results.length;\n if (!results[next]!.disabled) break;\n }\n setActive(next);\n }\n\n useEffect(() => {\n if (isOpen && active >= 0) document.getElementById(optionId(active))?.scrollIntoView({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- optionId is stable.\n }, [active, isOpen]);\n\n function onKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) open();\n else move(1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n if (!isOpen) open();\n else move(-1);\n break;\n case \"Enter\":\n if (isOpen && active >= 0) {\n event.preventDefault();\n choose(results[active]);\n } else if (isOpen) close();\n break;\n case \"Escape\":\n if (isOpen) return; // useDismiss closes it.\n if (text) {\n event.preventDefault();\n setText(\"\");\n setSelected(\"\");\n }\n break;\n case \"Tab\":\n if (isOpen) close();\n break;\n }\n }\n\n return (\n <>\n <div\n ref={fieldRef}\n className={cx(\n \"ow-input-group\",\n \"ow-combobox\",\n size === \"sm\" && \"ow-input-group--sm\",\n isInvalid && \"ow-input-group--invalid\",\n disabled && \"ow-input-group--disabled\",\n className,\n )}\n >\n <input\n ref={(element) => {\n inputRef.current = element;\n assignRef(ref, element);\n }}\n id={id}\n className=\"ow-input-group__input\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listId : undefined}\n aria-activedescendant={isOpen && active >= 0 ? optionId(active) : undefined}\n aria-invalid={isInvalid || undefined}\n autoComplete=\"off\"\n disabled={disabled}\n placeholder={placeholder}\n value={text}\n onChange={(event) => {\n setText(event.target.value);\n setTyped(true);\n onInputChange?.(event.target.value);\n if (!isOpen) setOpen(true);\n setActive(0);\n }}\n onClick={open}\n onKeyDown={onKeyDown}\n {...aria}\n />\n <button\n type=\"button\"\n className=\"ow-combobox__toggle\"\n tabIndex={-1}\n aria-label={isOpen ? \"Hide options\" : \"Show options\"}\n disabled={disabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n if (isOpen) close();\n else {\n open();\n inputRef.current?.focus();\n }\n }}\n >\n <ChevronDownIcon size={size === \"sm\" ? 14 : 16} className={cx(\"ow-select__chevron\", isOpen && \"ow-combobox__chevron--open\")} />\n </button>\n </div>\n {mounted ? (\n <div\n ref={listRef}\n {...manualPopover}\n data-state={state}\n id={listId}\n role=\"listbox\"\n aria-label={aria[\"aria-label\"]}\n aria-labelledby={aria[\"aria-labelledby\"]}\n className={cx(\"ow-listbox\", \"ow-floating\", `ow-listbox--${size}`)}\n style={style}\n >\n {results.map((option, index) => {\n const isSelected = option.value === selected;\n return (\n <div\n key={option.value}\n id={optionId(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled || undefined}\n className={cx(\"ow-option\", {\n \"ow-option--active\": index === active && !option.disabled,\n \"ow-option--selected\": isSelected,\n \"ow-option--disabled\": Boolean(option.disabled),\n })}\n onPointerMove={() => !option.disabled && setActive(index)}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => choose(option)}\n >\n <span className=\"ow-option__check\">{isSelected ? <CheckIcon size={14} /> : null}</span>\n <span className=\"ow-option__text\">\n <span className=\"ow-option__label\">{option.label}</span>\n {option.description ? (\n <span className=\"ow-option__description\">{option.description}</span>\n ) : null}\n </span>\n </div>\n );\n })}\n {results.length === 0 ? (\n <div className=\"ow-listbox__empty\" role=\"presentation\">\n {emptyMessage}\n </div>\n ) : null}\n </div>\n ) : null}\n </>\n );\n});\n", "import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useRef,\n type ForwardedRef,\n type InputHTMLAttributes,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { CheckIcon, MinusIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\ninterface CheckboxGroupContextValue {\n value: string[];\n toggle(value: string, checked: boolean): void;\n name: string;\n disabled: boolean;\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(null);\n\nexport interface CheckboxProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\"> {\n /** `sm` is 14px, for dense rows; `md` is 16px.\n * @default \"md\" */\n size?: \"sm\" | \"md\";\n /** `danger` for choices that make an action destructive, like also deleting files.\n * @default \"primary\" */\n tone?: \"primary\" | \"danger\";\n /** Shows a dash: some, not all, of what it controls is checked (a \"select all\" box).\n * @default false */\n indeterminate?: boolean;\n /** The label. With it, Checkbox renders its own <label>; without it, wrap it in yours. */\n children?: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/**\n * A real checkbox input, restyled. It keeps native behaviour (Space to toggle, form submission, `disabled`).\n * Give it children for its label, or wrap the bare box in your own <label>. Inside a CheckboxGroup, give it a `value`.\n */\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(function Checkbox(\n {\n className,\n size = \"md\",\n tone = \"primary\",\n indeterminate = false,\n children,\n description,\n value,\n checked,\n onChange,\n disabled,\n name,\n \"aria-describedby\": describedBy,\n ...inputProps\n },\n ref,\n) {\n const group = useContext(CheckboxGroupContext);\n const innerRef = useRef<HTMLInputElement | null>(null);\n const descriptionId = useId();\n const inGroup = group !== null && value !== undefined;\n\n useEffect(() => {\n if (innerRef.current) innerRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const box = (\n <span\n className={cx(\n \"ow-checkbox\",\n `ow-checkbox--${size}`,\n tone === \"danger\" && \"ow-checkbox--danger\",\n children === undefined && className,\n )}\n >\n <input\n ref={(element) => {\n innerRef.current = element;\n assignRef(ref, element);\n }}\n type=\"checkbox\"\n className=\"ow-checkbox__input\"\n value={value}\n name={inGroup ? group.name : name}\n checked={inGroup ? group.value.includes(String(value)) : checked}\n disabled={disabled || (inGroup && group.disabled)}\n aria-describedby={[describedBy, description ? descriptionId : undefined].filter(Boolean).join(\" \") || undefined}\n onChange={(event) => {\n onChange?.(event);\n if (inGroup) group.toggle(String(value), event.target.checked);\n }}\n {...inputProps}\n />\n {indeterminate ? (\n <MinusIcon className=\"ow-checkbox__check ow-checkbox__check--dash\" size={size === \"sm\" ? 10 : 12} strokeWidth={3} />\n ) : (\n <CheckIcon className=\"ow-checkbox__check\" size={size === \"sm\" ? 10 : 12} strokeWidth={3} />\n )}\n </span>\n );\n\n if (children === undefined) return box;\n return (\n <label className={cx(\"ow-check-label\", (disabled || (inGroup && group.disabled)) && \"ow-check-label--disabled\", className)}>\n {box}\n <span className=\"ow-check-label__text\">\n <span>{children}</span>\n {description ? (\n <span id={descriptionId} className=\"ow-check-label__description\">\n {description}\n </span>\n ) : null}\n </span>\n </label>\n );\n});\n\nexport interface CheckboxGroupProps {\n /** The question, shown as the group's legend. */\n label: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n /** The checked values. */\n value?: string[];\n /** @default [] */\n defaultValue?: string[];\n onChange?(value: string[]): void;\n /** @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** An error under the options. */\n error?: ReactNode;\n disabled?: boolean;\n /** The form field name for every box. */\n name?: string;\n /** Checkboxes, each with a `value` and a label. */\n children: ReactNode;\n className?: string;\n}\n\n/** Several options where any number can be chosen, under one label. */\nexport function CheckboxGroup({\n label,\n description,\n value,\n defaultValue = [],\n onChange,\n orientation = \"vertical\",\n error,\n disabled = false,\n name,\n children,\n className,\n}: CheckboxGroupProps) {\n const [current, setCurrent] = useControllableState(value, defaultValue, onChange);\n const generatedName = useId();\n const errorId = useId();\n return (\n <CheckboxGroupContext.Provider\n value={{\n value: current,\n name: name ?? generatedName,\n disabled,\n toggle(item, checked) {\n setCurrent(checked ? [...current.filter((v) => v !== item), item] : current.filter((v) => v !== item));\n },\n }}\n >\n <Fieldset\n legend={label}\n description={description}\n error={error}\n errorId={errorId}\n className={cx(orientation === \"horizontal\" && \"ow-fieldset--horizontal\", className)}\n >\n {children}\n </Fieldset>\n </CheckboxGroupContext.Provider>\n );\n}\n\nexport interface FieldsetProps {\n /** The group's title. */\n legend: ReactNode;\n /** A muted line under the legend. */\n description?: ReactNode;\n /** An error under the content, announced when it appears. */\n error?: ReactNode;\n /** @internal */\n errorId?: string;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\n/** Groups related controls under a legend: a set of checkboxes, an address, a pair of dates. */\nexport function Fieldset({ legend, description, error, errorId, disabled, children, className }: FieldsetProps) {\n const generatedId = useId();\n const descriptionId = `${generatedId}-description`;\n const resolvedErrorId = errorId ?? `${generatedId}-error`;\n return (\n <fieldset\n className={cx(\"ow-fieldset\", className)}\n disabled={disabled}\n aria-describedby={[description ? descriptionId : \"\", error ? resolvedErrorId : \"\"].filter(Boolean).join(\" \") || undefined}\n >\n <legend className=\"ow-fieldset__legend\">{legend}</legend>\n {description ? (\n <p id={descriptionId} className=\"ow-fieldset__description\">\n {description}\n </p>\n ) : null}\n <div className=\"ow-fieldset__content\">{children}</div>\n {error ? (\n <p id={resolvedErrorId} role=\"alert\" className=\"ow-field__error\">\n {error}\n </p>\n ) : null}\n </fieldset>\n );\n}\n", "import { createContext, useContext, useId, type InputHTMLAttributes, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { cx } from \"../../utils/cx\";\nimport { Fieldset } from \"../Checkbox/Checkbox\";\n\ninterface RadioGroupContextValue {\n name: string;\n value: string;\n select(value: string): void;\n disabled: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nexport interface RadioGroupProps {\n /** The question, shown as the group's legend. */\n label: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n value?: string;\n /** The starting choice when uncontrolled.\n * @default \"\" */\n defaultValue?: string;\n onChange?(value: string): void;\n /** @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** `default` is a dot and a label; `cards` turns each option into a bordered card, for choices that need a description.\n * @default \"default\" */\n variant?: \"default\" | \"cards\";\n /** An error under the options. */\n error?: ReactNode;\n disabled?: boolean;\n /** The form field name. Generated when left out. */\n name?: string;\n /** Radio options. */\n children: ReactNode;\n className?: string;\n}\n\n/** One choice from a few visible options. The arrow keys move between them, as with any radio group. */\nexport function RadioGroup({\n label,\n description,\n value,\n defaultValue = \"\",\n onChange,\n orientation = \"vertical\",\n variant = \"default\",\n error,\n disabled = false,\n name,\n children,\n className,\n}: RadioGroupProps) {\n const [current, select] = useControllableState(value, defaultValue, onChange);\n const generatedName = useId();\n return (\n <RadioGroupContext.Provider value={{ name: name ?? generatedName, value: current, select, disabled }}>\n <Fieldset\n legend={label}\n description={description}\n error={error}\n className={cx(\n \"ow-radio-group\",\n orientation === \"horizontal\" && \"ow-fieldset--horizontal\",\n variant === \"cards\" && \"ow-radio-group--cards\",\n className,\n )}\n >\n {children}\n </Fieldset>\n </RadioGroupContext.Provider>\n );\n}\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\" | \"value\" | \"size\"> {\n value: string;\n /** The label. */\n children: ReactNode;\n /** A muted line under the label. */\n description?: ReactNode;\n}\n\n/** One option in a RadioGroup. */\nexport function Radio({ value, children, description, disabled, className, ...inputProps }: RadioProps) {\n const group = useContext(RadioGroupContext);\n const descriptionId = useId();\n if (!group) throw new Error(\"Radio must be inside <RadioGroup>.\");\n const isDisabled = disabled || group.disabled;\n return (\n <label className={cx(\"ow-check-label\", \"ow-radio-label\", isDisabled && \"ow-check-label--disabled\", className)}>\n <span className=\"ow-radio\">\n <input\n type=\"radio\"\n className=\"ow-radio__input\"\n name={group.name}\n value={value}\n checked={group.value === value}\n disabled={isDisabled}\n aria-describedby={description ? descriptionId : undefined}\n onChange={() => group.select(value)}\n {...inputProps}\n />\n </span>\n <span className=\"ow-check-label__text\">\n <span>{children}</span>\n {description ? (\n <span id={descriptionId} className=\"ow-check-label__description\">\n {description}\n </span>\n ) : null}\n </span>\n </label>\n );\n}\n", "import { forwardRef, type ButtonHTMLAttributes } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\" | \"value\" | \"type\" | \"role\"> {\n checked: boolean;\n onChange(checked: boolean): void;\n /** What it turns on, for screen readers. Leave it out only when aria-labelledby names it. */\n label?: string;\n}\n\n/** A small on/off switch for settings rows; it takes effect at once, with no save button. */\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(function Switch(\n { checked, onChange, label, className, disabled, ...buttonProps },\n ref,\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n disabled={disabled}\n className={cx(\"ow-switch\", checked && \"ow-switch--on\", className)}\n onClick={() => onChange(!checked)}\n {...buttonProps}\n >\n <span className=\"ow-switch__knob\" />\n </button>\n );\n});\n", "import { useId, type CSSProperties, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { cx } from \"../../utils/cx\";\n\ntype SliderValue = number | [number, number];\n\nexport interface SliderProps<V extends SliderValue = number> {\n /** A number, or a [low, high] pair for a range with two handles. */\n value?: V;\n defaultValue?: V;\n onChange?(value: NoInfer<V>): void;\n /** Called when the person lets go, for work too slow to do on every move. */\n onChangeEnd?(value: NoInfer<V>): void;\n /** @default 0 */\n min?: number;\n /** @default 100 */\n max?: number;\n /** @default 1 */\n step?: number;\n /** Shown above the track, and names the slider for screen readers. */\n label?: ReactNode;\n /** Shows the current value at the right of the label.\n * @default true */\n showValue?: boolean;\n /** Turns a number into the text shown and read out, e.g. (v) => `${v}%`. */\n formatValue?(value: number): string;\n /** Names the slider when there's no visible label. */\n \"aria-label\"?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Picks a number, or a range, by dragging. It's built on native range inputs, so the arrow keys,\n * PageUp, PageDown, Home and End work as people expect.\n */\nexport function Slider<V extends SliderValue = number>({\n value,\n defaultValue,\n onChange,\n onChangeEnd,\n min = 0,\n max = 100,\n step = 1,\n label,\n showValue = true,\n formatValue = String,\n \"aria-label\": ariaLabel,\n disabled,\n className,\n}: SliderProps<V>) {\n const [current, setCurrent] = useControllableState<V>(value, (defaultValue ?? min) as V, onChange);\n const labelId = useId();\n const isRange = Array.isArray(current);\n const [low, high] = isRange ? (current as [number, number]) : [min, current as number];\n const pct = (n: number) => ((n - min) / (max - min || 1)) * 100;\n const style = { \"--ow-slider-from\": `${isRange ? pct(low) : 0}%`, \"--ow-slider-to\": `${pct(high)}%` } as CSSProperties;\n const display = isRange ? `${formatValue(low)} \u2013 ${formatValue(high)}` : formatValue(high);\n const end = () => onChangeEnd?.(current);\n\n const input = (which: \"low\" | \"high\") => {\n const own = which === \"low\" ? low : high;\n return (\n <input\n type=\"range\"\n className={cx(\"ow-slider__input\", isRange && `ow-slider__input--${which}`)}\n // When the handles meet near the top, the low one must be on top to be draggable back down.\n style={which === \"low\" && low === high && pct(low) > 50 ? { zIndex: 3 } : undefined}\n min={min}\n max={max}\n step={step}\n value={own}\n disabled={disabled}\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : isRange ? `${ariaLabel ?? \"Range\"}, ${which === \"low\" ? \"minimum\" : \"maximum\"}` : ariaLabel}\n aria-valuetext={formatValue(own)}\n onChange={(event) => {\n const n = Number(event.target.value);\n if (!isRange) setCurrent(n as V);\n else if (which === \"low\") setCurrent([Math.min(n, high), high] as V);\n else setCurrent([low, Math.max(n, low)] as V);\n }}\n onPointerUp={end}\n onKeyUp={end}\n />\n );\n };\n\n return (\n <div className={cx(\"ow-slider\", disabled && \"ow-slider--disabled\", className)}>\n {label || showValue ? (\n <div className=\"ow-slider__header\">\n {label ? (\n <span id={labelId} className=\"ow-slider__label\">\n {label}\n </span>\n ) : (\n <span />\n )}\n {showValue ? (\n <output className=\"ow-slider__value\" aria-hidden=\"true\">\n {display}\n </output>\n ) : null}\n </div>\n ) : null}\n <div className=\"ow-slider__control\" style={style}>\n <span className=\"ow-slider__track\" aria-hidden=\"true\">\n <span className=\"ow-slider__fill\" />\n </span>\n {isRange ? input(\"low\") : null}\n {input(\"high\")}\n </div>\n </div>\n );\n}\n", "import { useId, useRef, useState, type DragEvent, type ReactNode } from \"react\";\n\nimport { UploadIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface FileDropZoneProps {\n /** Called with the accepted files, whether dropped or picked. */\n onFiles(files: File[]): void;\n /** File types to accept, as for <input accept>: \".png,.jpg\", \"image/*\". */\n accept?: string;\n /** @default false */\n multiple?: boolean;\n /** The largest file accepted, in bytes. */\n maxSize?: number;\n /** @default \"Drop files here, or browse\" */\n label?: ReactNode;\n /** A muted line under the label: what's accepted, how big. */\n hint?: ReactNode;\n /** An error to show in place of the hint, such as a failed upload. */\n error?: ReactNode;\n /** A 20px icon on the tile.\n * @default <UploadIcon /> */\n icon?: ReactNode;\n disabled?: boolean;\n /** The form field name for the file input. */\n name?: string;\n className?: string;\n}\n\nfunction matches(file: File, accept: string | undefined) {\n if (!accept) return true;\n return accept.split(\",\").some((rule) => {\n const pattern = rule.trim().toLowerCase();\n if (!pattern) return false;\n if (pattern.startsWith(\".\")) return file.name.toLowerCase().endsWith(pattern);\n if (pattern.endsWith(\"/*\")) return file.type.toLowerCase().startsWith(pattern.slice(0, -1));\n return file.type.toLowerCase() === pattern;\n });\n}\n\nconst formatSize = (bytes: number) =>\n bytes >= 1_048_576 ? `${Math.round(bytes / 104_857.6) / 10} MB` : `${Math.round(bytes / 1024)} KB`;\n\n/**\n * A drop zone for files: drop them on it, or press it to pick them.\n * It checks the type and size and says what was wrong.\n */\nexport function FileDropZone({\n onFiles,\n accept,\n multiple = false,\n maxSize,\n label = \"Drop files here, or browse\",\n hint,\n error,\n icon,\n disabled = false,\n name,\n className,\n}: FileDropZoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const depth = useRef(0);\n const [isDragging, setIsDragging] = useState(false);\n const [problem, setProblem] = useState<string>();\n const hintId = useId();\n\n function take(list: FileList | null) {\n if (!list || disabled) return;\n const files = [...list].slice(0, multiple ? undefined : 1);\n const wrongType = files.find((file) => !matches(file, accept));\n const tooBig = maxSize ? files.find((file) => file.size > maxSize) : undefined;\n if (!multiple && list.length > 1) setProblem(\"Drop one file at a time.\");\n else if (wrongType) setProblem(`\u201C${wrongType.name}\u201D isn't a file this accepts.`);\n else if (tooBig && maxSize) setProblem(`\u201C${tooBig.name}\u201D is over ${formatSize(maxSize)}.`);\n else {\n setProblem(undefined);\n if (files.length) onFiles(files);\n }\n }\n\n const hasFiles = (event: DragEvent) => event.dataTransfer.types.includes(\"Files\");\n\n return (\n <label\n className={cx(\n \"ow-dropzone\",\n isDragging && \"ow-dropzone--dragging\",\n Boolean(error || problem) && \"ow-dropzone--invalid\",\n disabled && \"ow-dropzone--disabled\",\n className,\n )}\n onDragEnter={(event) => {\n if (!hasFiles(event) || disabled) return;\n event.preventDefault();\n depth.current += 1;\n setIsDragging(true);\n }}\n onDragOver={(event) => {\n if (!hasFiles(event) || disabled) return;\n event.preventDefault();\n event.dataTransfer.dropEffect = \"copy\";\n }}\n onDragLeave={() => {\n depth.current = Math.max(0, depth.current - 1);\n if (depth.current === 0) setIsDragging(false);\n }}\n onDrop={(event) => {\n if (!hasFiles(event)) return;\n event.preventDefault();\n depth.current = 0;\n setIsDragging(false);\n take(event.dataTransfer.files);\n }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"ow-visually-hidden\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n name={name}\n aria-describedby={hintId}\n onChange={(event) => {\n take(event.target.files);\n event.target.value = \"\";\n }}\n />\n <span className=\"ow-dropzone__icon\">{icon ?? <UploadIcon size={20} />}</span>\n <span className=\"ow-dropzone__label\">{isDragging ? \"Drop to add\" : label}</span>\n <span id={hintId} className=\"ow-dropzone__hint\" aria-live=\"polite\">\n {error ?? problem ?? hint}\n </span>\n </label>\n );\n}\n", "import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState, type KeyboardEvent } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { addDays, addMonths, formatDate, parseISO, todayISO, toISO, weekday, type ISODate } from \"./dates\";\n\nexport interface CalendarProps {\n /** The chosen date as \"YYYY-MM-DD\", or \"\" for none. */\n value?: ISODate;\n /** @default \"\" */\n defaultValue?: ISODate;\n onChange?(value: ISODate): void;\n /** The earliest date that can be chosen, \"YYYY-MM-DD\". */\n min?: ISODate;\n /** The latest date that can be chosen. */\n max?: ISODate;\n /** Return true for dates that can't be chosen, such as weekends. */\n isDateDisabled?(date: ISODate): boolean;\n /** Month and day names follow this locale, e.g. \"en-IE\", \"de-CH\". Defaults to the browser's. */\n locale?: string;\n /** 1 starts weeks on Monday, 0 on Sunday.\n * @default 1 */\n weekStartsOn?: 0 | 1;\n /** Focus the chosen (or today's) date on mount, for use in a popover.\n * @default false */\n autoFocus?: boolean;\n className?: string;\n}\n\nexport interface CalendarHandle {\n focus(): void;\n}\n\n/**\n * A month grid for picking a date. Arrow keys move by day and week, PageUp and PageDown by month\n * (with Shift, by year), Home and End to the week's ends. Today is marked with a brass dot.\n */\nexport const Calendar = forwardRef<CalendarHandle, CalendarProps>(function Calendar(\n { value, defaultValue = \"\", onChange, min, max, isDateDisabled, locale, weekStartsOn = 1, autoFocus = false, className },\n ref,\n) {\n const [selected, setSelected] = useControllableState(value, defaultValue, onChange);\n const today = todayISO();\n const [focused, setFocused] = useState<ISODate>(() => selected || clampDate(today, min, max));\n const [shouldFocus, setShouldFocus] = useState(autoFocus);\n const gridRef = useRef<HTMLTableElement>(null);\n\n useImperativeHandle(ref, () => ({ focus: () => setShouldFocus(true) }), []);\n\n useEffect(() => {\n if (selected) setFocused(selected);\n }, [selected]);\n\n useEffect(() => {\n if (!shouldFocus) return;\n gridRef.current?.querySelector<HTMLButtonElement>('button[tabindex=\"0\"]')?.focus();\n setShouldFocus(false);\n }, [shouldFocus, focused]);\n\n const { year, month } = parseISO(focused);\n const first = toISO(year, month, 1);\n\n // Which way the month changed, so the new one slides in from that side.\n const monthIndex = year * 12 + month;\n const slide = useRef<{ month: number; direction?: \"next\" | \"previous\" }>({ month: monthIndex });\n if (slide.current.month !== monthIndex) {\n slide.current = { month: monthIndex, direction: monthIndex > slide.current.month ? \"next\" : \"previous\" };\n }\n const offset = (weekday(first) - weekStartsOn + 7) % 7;\n const gridStart = addDays(first, -offset);\n const weeks = useMemo(() => Array.from({ length: 6 }, (_, w) => Array.from({ length: 7 }, (_, d) => addDays(gridStart, w * 7 + d))), [gridStart]);\n const weekdayNames = weeks[0]!.map((date) => ({\n short: formatDate(date, locale, { weekday: \"short\" }),\n long: formatDate(date, locale, { weekday: \"long\" }),\n }));\n\n const isDisabled = (date: ISODate) => (min !== undefined && date < min) || (max !== undefined && date > max) || Boolean(isDateDisabled?.(date));\n\n function moveTo(date: ISODate) {\n setFocused(clampDate(date, min, max));\n setShouldFocus(true);\n }\n\n function choose(date: ISODate) {\n if (isDisabled(date)) return;\n setSelected(date);\n setFocused(date);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLButtonElement>, date: ISODate) {\n const day = (weekday(date) - weekStartsOn + 7) % 7;\n const moves: Record<string, () => ISODate> = {\n ArrowLeft: () => addDays(date, -1),\n ArrowRight: () => addDays(date, 1),\n ArrowUp: () => addDays(date, -7),\n ArrowDown: () => addDays(date, 7),\n Home: () => addDays(date, -day),\n End: () => addDays(date, 6 - day),\n PageUp: () => addMonths(date, event.shiftKey ? -12 : -1),\n PageDown: () => addMonths(date, event.shiftKey ? 12 : 1),\n };\n const move = moves[event.key];\n if (move) {\n event.preventDefault();\n moveTo(move());\n }\n }\n\n const monthLabel = formatDate(first, locale, { month: \"long\", year: \"numeric\" });\n const prevMonth = addMonths(first, -1);\n const nextMonth = addMonths(first, 1);\n const canGoBack = !min || toISO(year, month, 0) >= min;\n const canGoForward = !max || nextMonth <= max;\n\n return (\n <div className={cx(\"ow-calendar\", className)}>\n <div className=\"ow-calendar__header\">\n <button\n type=\"button\"\n className=\"ow-calendar__nav\"\n aria-label={`Previous month, ${formatDate(prevMonth, locale, { month: \"long\", year: \"numeric\" })}`}\n disabled={!canGoBack}\n onClick={() => setFocused(clampDate(addMonths(focused, -1), min, max))}\n >\n <ChevronLeftIcon size={16} />\n </button>\n <h2 className=\"ow-calendar__title\" aria-live=\"polite\">\n <span\n key={monthIndex}\n className={cx(\"ow-calendar__title-text\", slide.current.direction && `ow-calendar__slide--${slide.current.direction}`)}\n >\n {monthLabel}\n </span>\n </h2>\n <button\n type=\"button\"\n className=\"ow-calendar__nav\"\n aria-label={`Next month, ${formatDate(nextMonth, locale, { month: \"long\", year: \"numeric\" })}`}\n disabled={!canGoForward}\n onClick={() => setFocused(clampDate(addMonths(focused, 1), min, max))}\n >\n <ChevronRightIcon size={16} />\n </button>\n </div>\n <table ref={gridRef} role=\"grid\" className=\"ow-calendar__grid\" aria-label={monthLabel}>\n <thead>\n <tr>\n {weekdayNames.map((name) => (\n <th key={name.long} scope=\"col\" abbr={name.long} className=\"ow-calendar__weekday\">\n {name.short.slice(0, 2)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody key={monthIndex} className={cx(slide.current.direction && `ow-calendar__slide--${slide.current.direction}`)}>\n {weeks.map((week) => (\n <tr key={week[0]}>\n {week.map((date) => {\n const inMonth = parseISO(date).month === month;\n const isSelected = date === selected;\n const disabled = isDisabled(date);\n return (\n <td key={date} role=\"gridcell\" aria-selected={isSelected} className=\"ow-calendar__cell\">\n <button\n type=\"button\"\n tabIndex={date === focused ? 0 : -1}\n aria-label={formatDate(date, locale, { dateStyle: \"full\" })}\n aria-current={date === today ? \"date\" : undefined}\n aria-disabled={disabled || undefined}\n className={cx(\"ow-calendar__day\", {\n \"ow-calendar__day--outside\": !inMonth,\n \"ow-calendar__day--selected\": isSelected,\n \"ow-calendar__day--today\": date === today,\n \"ow-calendar__day--disabled\": disabled,\n })}\n onClick={() => choose(date)}\n onKeyDown={(event) => onKeyDown(event, date)}\n onFocus={() => date !== focused && setFocused(date)}\n >\n {parseISO(date).day}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n});\n\nfunction clampDate(date: ISODate, min: ISODate | undefined, max: ISODate | undefined): ISODate {\n if (min && date < min) return min;\n if (max && date > max) return max;\n return date;\n}\n", "/** Dates as \"YYYY-MM-DD\" strings: no time, no time zone, so a date never shifts by a day. */\nexport type ISODate = string;\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\nexport function toISO(year: number, month: number, day: number): ISODate {\n const date = new Date(Date.UTC(year, month, day));\n return `${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-${pad(date.getUTCDate())}`;\n}\n\nexport function parseISO(iso: ISODate): { year: number; month: number; day: number } {\n const [year, month, day] = iso.split(\"-\").map(Number);\n return { year: year!, month: month! - 1, day: day! };\n}\n\nexport function todayISO(): ISODate {\n const now = new Date();\n return toISO(now.getFullYear(), now.getMonth(), now.getDate());\n}\n\nexport function addDays(iso: ISODate, days: number): ISODate {\n const { year, month, day } = parseISO(iso);\n return toISO(year, month, day + days);\n}\n\nexport function addMonths(iso: ISODate, months: number): ISODate {\n const { year, month, day } = parseISO(iso);\n const lastDay = new Date(Date.UTC(year, month + months + 1, 0)).getUTCDate();\n return toISO(year, month + months, Math.min(day, lastDay));\n}\n\n/** 0 = Sunday \u2026 6 = Saturday. */\nexport function weekday(iso: ISODate): number {\n const { year, month, day } = parseISO(iso);\n return new Date(Date.UTC(year, month, day)).getUTCDay();\n}\n\nexport function toDate(iso: ISODate): Date {\n const { year, month, day } = parseISO(iso);\n return new Date(Date.UTC(year, month, day));\n}\n\nexport function formatDate(iso: ISODate, locale: string | undefined, options: Intl.DateTimeFormatOptions): string {\n return new Intl.DateTimeFormat(locale, { ...options, timeZone: \"UTC\" }).format(toDate(iso));\n}\n", "import { forwardRef, useCallback, useId, useRef, useState, type ForwardedRef } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { CalendarIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Calendar, type CalendarProps } from \"./Calendar\";\nimport { formatDate, type ISODate } from \"./dates\";\n\nexport interface DatePickerProps extends Omit<CalendarProps, \"autoFocus\" | \"className\"> {\n /** Shown when no date is chosen.\n * @default \"Pick a date\" */\n placeholder?: string;\n /** How the chosen date is written in the field.\n * @default { dateStyle: \"medium\" } */\n formatOptions?: Intl.DateTimeFormatOptions;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n id?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n className?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/** A field that opens a Calendar. Choosing a date closes it; Escape closes it without changing anything. */\nexport const DatePicker = forwardRef<HTMLButtonElement, DatePickerProps>(function DatePicker(\n {\n value,\n defaultValue = \"\",\n onChange,\n placeholder = \"Pick a date\",\n formatOptions = { dateStyle: \"medium\" },\n size = \"md\",\n isInvalid = false,\n disabled = false,\n id,\n className,\n locale,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n ...calendarProps\n },\n ref,\n) {\n const [date, setDate] = useControllableState<ISODate>(value, defaultValue, onChange);\n const [isOpen, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef: triggerRef, floatingRef: panelRef, placement: \"bottom-start\", offset: 6 });\n\n const close = useCallback((reason?: \"outside\" | \"escape\") => {\n setOpen(false);\n if (reason !== \"outside\") triggerRef.current?.focus();\n }, []);\n useDismiss(isOpen, [panelRef, triggerRef], close);\n\n const label = date ? formatDate(date, locale, formatOptions) : placeholder;\n\n return (\n <>\n <button\n ref={(element) => {\n triggerRef.current = element;\n assignRef(ref, element);\n }}\n id={id}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? panelId : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n // A label names the button; the chosen date is read as its description.\n aria-describedby={[`${panelId}-value`, ariaDescribedBy].filter(Boolean).join(\" \")}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n className={cx(\n \"ow-select\",\n \"ow-date-picker\",\n `ow-select--${size}`,\n { \"ow-select--open\": isOpen, \"ow-select--invalid\": isInvalid && !isOpen },\n className,\n )}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !isOpen) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n >\n <CalendarIcon size={size === \"sm\" ? 14 : 16} className=\"ow-date-picker__icon\" />\n <span id={`${panelId}-value`} className={cx(\"ow-select__value\", !date && \"ow-select__value--placeholder\")}>\n {label}\n </span>\n </button>\n {mounted ? (\n <div\n ref={panelRef}\n {...manualPopover}\n data-state={state}\n id={panelId}\n role=\"dialog\"\n aria-label=\"Choose a date\"\n className=\"ow-popover ow-floating ow-date-picker__panel\"\n style={style}\n >\n <Calendar\n {...calendarProps}\n locale={locale}\n value={date}\n autoFocus\n onChange={(next) => {\n setDate(next);\n close();\n }}\n />\n </div>\n ) : null}\n </>\n );\n});\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { CircleAlertIcon, CircleCheckIcon, InfoIcon, TriangleAlertIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { CloseButton } from \"../Button/ButtonGroup\";\n\nexport type AlertVariant = \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\";\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** info for news, success for something done, warning for something that needs the person, danger for something that failed.\n * @default \"info\" */\n variant?: AlertVariant;\n /** A short bold line. */\n title?: ReactNode;\n /** Replaces the variant's icon; false hides it. */\n icon?: ReactNode | false;\n /** Buttons under the text, usually small ones. */\n actions?: ReactNode;\n /** Shows a \u2715 that calls this. */\n onClose?(): void;\n children?: ReactNode;\n}\n\nconst icons: Record<AlertVariant, ReactNode> = {\n info: <InfoIcon size={16} />,\n success: <CircleCheckIcon size={16} />,\n warning: <TriangleAlertIcon size={16} />,\n danger: <CircleAlertIcon size={16} />,\n neutral: <InfoIcon size={16} />,\n};\n\n/** A message inside the page about the page: a notice, a warning before an action, an error that blocks the work. */\nexport function Alert({\n variant = \"info\",\n title,\n icon,\n actions,\n onClose,\n children,\n className,\n role,\n ...props\n}: AlertProps) {\n return (\n <div\n role={role ?? (variant === \"danger\" || variant === \"warning\" ? \"alert\" : \"status\")}\n className={cx(\"ow-alert\", `ow-alert--${variant}`, className)}\n {...props}\n >\n {icon === false ? null : <span className=\"ow-alert__icon\">{icon ?? icons[variant]}</span>}\n <div className=\"ow-alert__body\">\n {title ? <div className=\"ow-alert__title\">{title}</div> : null}\n {children ? <div className=\"ow-alert__description\">{children}</div> : null}\n {actions ? <div className=\"ow-alert__actions\">{actions}</div> : null}\n </div>\n {onClose ? <CloseButton size=\"sm\" label=\"Dismiss\" className=\"ow-alert__close\" onClick={onClose} /> : null}\n </div>\n );\n}\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\n/** `active` is for work in progress, so it isn't confused with `warning` (something needs you). */\nexport type BadgeVariant = \"neutral\" | \"active\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n /** A 12px icon before the text. */\n icon?: ReactNode;\n /** @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** @default \"neutral\" */\n variant?: BadgeVariant;\n}\n\n/** A pill-shaped status label: one or two words, with an optional icon. */\nexport function Badge({ children, className, icon, size = \"md\", variant = \"neutral\", ...spanProps }: BadgeProps) {\n return (\n <span className={cx(\"ow-badge\", `ow-badge--${size}`, `ow-badge--${variant}`, className)} {...spanProps}>\n {icon ? <span className=\"ow-badge__icon\">{icon}</span> : null}\n <span>{children}</span>\n </span>\n );\n}\n", "import { useId, type CSSProperties, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport type ProgressTone = \"primary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface ProgressBarProps {\n /** How far along, from 0 to max. Leave out for work of unknown length. */\n value?: number;\n /** @default 100 */\n max?: number;\n /** Shown above the bar, and names it for screen readers. */\n label?: ReactNode;\n /** Shows the value at the right of the label.\n * @default true */\n showValue?: boolean;\n /** The text shown and read out for the value, e.g. \"3 of 8 stages\". Defaults to a percentage. */\n valueLabel?: string;\n /** sm is 4px, for a pipeline bar; md is 8px.\n * @default \"sm\" */\n size?: \"sm\" | \"md\";\n /** @default \"primary\" */\n tone?: ProgressTone;\n \"aria-label\"?: string;\n className?: string;\n}\n\n/** How far a task has got: a thin bar, or a sliding segment when the length isn't known. */\nexport function ProgressBar({\n value,\n max = 100,\n label,\n showValue = true,\n valueLabel,\n size = \"sm\",\n tone = \"primary\",\n \"aria-label\": ariaLabel,\n className,\n}: ProgressBarProps) {\n const labelId = useId();\n const indeterminate = value === undefined;\n const pct = indeterminate ? 0 : Math.min(100, Math.max(0, (value / max) * 100));\n const text = valueLabel ?? `${Math.round(pct)}%`;\n return (\n <div className={cx(\"ow-progress\", `ow-progress--${size}`, `ow-progress--${tone}`, className)}>\n {label || (showValue && !indeterminate) ? (\n <div className=\"ow-progress__header\">\n {label ? (\n <span id={labelId} className=\"ow-progress__label\">\n {label}\n </span>\n ) : (\n <span />\n )}\n {showValue && !indeterminate ? <span className=\"ow-progress__value\">{text}</span> : null}\n </div>\n ) : null}\n <div\n role=\"progressbar\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : ariaLabel}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n aria-valuetext={indeterminate ? undefined : text}\n className={cx(\"ow-progress__track\", indeterminate && \"ow-progress__track--indeterminate\")}\n >\n <div className=\"ow-progress__fill\" style={indeterminate ? undefined : { width: `${pct}%` }} />\n </div>\n </div>\n );\n}\n\nexport interface ProgressCircleProps {\n /** From 0 to max. Leave out to spin, for work of unknown length. */\n value?: number;\n /** @default 100 */\n max?: number;\n /** sm 16px, md 24px, lg 48px (lg shows the percentage inside).\n * @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** @default \"primary\" */\n tone?: ProgressTone;\n /** Names it for screen readers.\n * @default \"Progress\" */\n \"aria-label\"?: string;\n className?: string;\n}\n\nconst circleSizes = { sm: { box: 16, stroke: 2.5 }, md: { box: 24, stroke: 3 }, lg: { box: 48, stroke: 4 } };\n\n/** Progress as a ring, for tight spaces: a row in a list, a file being uploaded. */\nexport function ProgressCircle({\n value,\n max = 100,\n size = \"md\",\n tone = \"primary\",\n \"aria-label\": ariaLabel = \"Progress\",\n className,\n}: ProgressCircleProps) {\n const { box, stroke } = circleSizes[size];\n const radius = (box - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const indeterminate = value === undefined;\n const pct = indeterminate ? 25 : Math.min(100, Math.max(0, (value / max) * 100));\n return (\n <span\n role=\"progressbar\"\n aria-label={ariaLabel}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : value}\n className={cx(\n \"ow-progress-circle\",\n `ow-progress--${tone}`,\n indeterminate && \"ow-progress-circle--indeterminate\",\n className,\n )}\n style={{ width: box, height: box } as CSSProperties}\n >\n <svg width={box} height={box} viewBox={`0 0 ${box} ${box}`} aria-hidden=\"true\">\n <circle className=\"ow-progress-circle__track\" cx={box / 2} cy={box / 2} r={radius} strokeWidth={stroke} fill=\"none\" />\n <circle\n className=\"ow-progress-circle__fill\"\n cx={box / 2}\n cy={box / 2}\n r={radius}\n strokeWidth={stroke}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - pct / 100)}\n transform={`rotate(-90 ${box / 2} ${box / 2})`}\n />\n </svg>\n {size === \"lg\" && !indeterminate ? <span className=\"ow-progress-circle__value\">{Math.round(pct)}%</span> : null}\n </span>\n );\n}\n", "import { useEffect, useState, type CSSProperties } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface SkeletonProps {\n /** CSS width, e.g. \"40%\" or 120. Default 100%. */\n width?: CSSProperties[\"width\"];\n /** CSS height. Default 14px. */\n height?: CSSProperties[\"height\"];\n /** The lighter grey, for second lines and control shapes. */\n soft?: boolean;\n /** `bar` has round ends; `block` has the field corners, for control placeholders. */\n shape?: \"bar\" | \"block\";\n className?: string;\n}\n\n/** One grey placeholder bar. Wrap a group of them in something with role=\"status\" and a label. */\nexport function Skeleton({ width = \"100%\", height = 14, soft = false, shape = \"bar\", className }: SkeletonProps) {\n return (\n <span\n className={cx(\"ow-skeleton\", soft && \"ow-skeleton--soft\", shape === \"block\" && \"ow-skeleton--block\", className)}\n style={{ width, height }}\n aria-hidden=\"true\"\n />\n );\n}\n\nexport interface SkeletonRowsProps {\n /** Read out by screen readers while it's showing. Default \"Loading\". */\n label?: string;\n rows?: number;\n /** Waits this long before appearing, so content that loads quickly never flashes it. Default 150. */\n delayMs?: number;\n}\n\n/**\n * A placeholder in the shape of settings rows (a label and description on the left, a control on the right),\n * so a panel keeps its layout while it loads.\n */\nexport function SkeletonRows({ label = \"Loading\", rows = 4, delayMs = 150 }: SkeletonRowsProps) {\n const [isVisible, setIsVisible] = useState(delayMs === 0);\n\n useEffect(() => {\n if (delayMs === 0) return;\n const timer = window.setTimeout(() => setIsVisible(true), delayMs);\n return () => window.clearTimeout(timer);\n }, [delayMs]);\n\n return (\n <div role=\"status\" aria-label={label} aria-busy=\"true\">\n {isVisible ? (\n <div className=\"ow-skeleton-rows\" aria-hidden=\"true\">\n {Array.from({ length: rows }, (_, index) => (\n <div key={index} className=\"ow-skeleton-rows__row\">\n <div className=\"ow-skeleton-rows__text\">\n <Skeleton width={`${28 + ((index * 17) % 22)}%`} height={14} />\n <Skeleton width={`${46 + ((index * 23) % 30)}%`} height={12} soft />\n </div>\n <Skeleton width={96} height={32} soft shape=\"block\" />\n </div>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n", "import { useEffect, useRef } from \"react\";\nimport { Toaster as SonnerToaster, toast, type ExternalToast, type ToasterProps as SonnerToasterProps } from \"sonner\";\n\nimport { manualPopover } from \"../../hooks/useFloating\";\nimport { CircleAlertIcon, CircleCheckIcon, InfoIcon, TriangleAlertIcon, XIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Spinner } from \"../Spinner/Spinner\";\n\n/**\n * Shows a toast; needs one <Toaster /> on the page. This is sonner's `toast`:\n * `toast(\"Copied\")`, `toast.success(\"Saved\", { description })`, `toast.error(\u2026)`, `toast.warning(\u2026)`, `toast.info(\u2026)`,\n * `toast.loading(\"Deploying\u2026\")`, `toast.promise(save(), { loading, success, error })`, `toast.dismiss(id)`.\n * Pass `action: { label: \"Undo\", onClick }` for a button, and reuse an `id` to replace a toast.\n */\nexport { toast };\n\n/** Everything a toast takes besides its message: description, action, cancel, id, duration, icon, onDismiss\u2026 */\nexport type ToastOptions = ExternalToast;\n\nexport interface ToasterProps {\n /** @default \"bottom-center\" */\n position?: SonnerToasterProps[\"position\"];\n /** Shows every toast in full, instead of a stack that fans out on hover.\n * @default false */\n expand?: boolean;\n /** How many show at once; the rest wait their turn.\n * @default 3 */\n visibleToasts?: number;\n /** Milliseconds before a toast goes. A toast's own `duration` wins; Infinity keeps it until closed.\n * @default 6000 */\n duration?: number;\n /** A \u2715 on each toast.\n * @default true */\n closeButton?: boolean;\n /** Distance from the edge of the window, in pixels.\n * @default 16 */\n offset?: number;\n /** Gap between toasts when the stack is open, in pixels.\n * @default 10 */\n gap?: number;\n /** For a second toaster that only shows toasts sent with the same `toasterId`. */\n id?: string;\n className?: string;\n}\n\nconst icons = {\n success: <CircleCheckIcon size={16} />,\n error: <CircleAlertIcon size={16} />,\n warning: <TriangleAlertIcon size={16} />,\n info: <InfoIcon size={16} />,\n loading: <Spinner size=\"sm\" label=\"\" />,\n close: <XIcon size={12} />,\n};\n\n/**\n * Where toasts appear: sonner's toaster in Openware's look. New toasts stack on top of each other; hovering\n * fans the stack out, a swipe dismisses one, and they pause while hovered or focused. Render one near the\n * root of the app. It keeps itself above modal dialogs, so a toast fired from a dialog shows over it.\n */\nexport function Toaster({\n position = \"bottom-center\",\n expand = false,\n visibleToasts = 3,\n duration = 6000,\n closeButton = true,\n offset = 16,\n gap = 10,\n id,\n className,\n}: ToasterProps) {\n const layerRef = useRef<HTMLDivElement>(null);\n\n // The toaster lives in the browser's top layer, and moves back to the top of it whenever a dialog opens,\n // so modal dialogs and their backdrop never cover it.\n useEffect(() => {\n const layer = layerRef.current;\n if (!layer || typeof layer.showPopover !== \"function\") return undefined;\n const raise = () => {\n try {\n if (layer.matches(\":popover-open\")) layer.hidePopover();\n layer.showPopover();\n } catch {\n // Not connected yet, or no popover support: it still shows as a fixed layer.\n }\n };\n raise();\n const observer = new MutationObserver((records) => {\n if (records.some((record) => record.target instanceof HTMLDialogElement && record.target.open)) raise();\n });\n observer.observe(document.body, { subtree: true, attributes: true, attributeFilter: [\"open\"] });\n return () => observer.disconnect();\n }, []);\n\n return (\n <div ref={layerRef} {...manualPopover} className=\"ow-toaster-layer\">\n <SonnerToaster\n id={id}\n position={position}\n expand={expand}\n visibleToasts={visibleToasts}\n duration={duration}\n closeButton={closeButton}\n offset={offset}\n mobileOffset={offset}\n gap={gap}\n icons={icons}\n className={cx(\"ow-toaster\", className)}\n containerAriaLabel=\"Notifications\"\n toastOptions={{ className: \"ow-toast\" }}\n />\n </div>\n );\n}\n", "import { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { manualPopover, useFloating } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\n\nexport interface TooltipProps {\n /** A few words. */\n label: ReactNode;\n /** The thing it explains: usually an icon-only Button with the same words as its aria-label. */\n children: ReactNode;\n /** Which side it prefers; it flips to the opposite side when there's no room. `right` suits icons in a folded sidebar.\n * @default \"top\" */\n placement?: \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Milliseconds of hovering before it shows. Moving to a neighbour while one is showing skips the wait.\n * @default 400 */\n delay?: number;\n}\n\n/** When the last tooltip closed: another one opened soon after shows at once, as people scan a toolbar. */\nlet lastClosedAt = 0;\nconst warmWindow = 500;\n\n/**\n * A small dark label beside its child (above, unless `placement` says otherwise) on hover or keyboard focus. It's for sighted users only: the child\n * carries the same words for screen readers (an aria-label, or visually hidden text), so they aren't read twice.\n * It sits in the top layer, so scroll areas and dialogs can't clip it.\n */\nexport function Tooltip({ children, label, placement = \"top\", delay = 400 }: TooltipProps) {\n const anchorRef = useRef<HTMLSpanElement>(null);\n const bubbleRef = useRef<HTMLSpanElement>(null);\n const timer = useRef(0);\n const [open, setOpen] = useState(false);\n const { mounted, state } = usePresence(open, 100);\n const style = useFloating({ open: mounted, anchorRef, floatingRef: bubbleRef, placement, offset: 6 });\n\n const show = (immediately = false) => {\n window.clearTimeout(timer.current);\n if (immediately || Date.now() - lastClosedAt < warmWindow) setOpen(true);\n else timer.current = window.setTimeout(() => setOpen(true), delay);\n };\n const hide = () => {\n window.clearTimeout(timer.current);\n setOpen((current) => {\n if (current) lastClosedAt = Date.now();\n return false;\n });\n };\n\n useEffect(() => () => window.clearTimeout(timer.current), []);\n\n // Escape hides it without moving focus, as WCAG 1.4.13 asks.\n useEffect(() => {\n if (!open) return undefined;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") hide();\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [open]);\n\n return (\n <span\n ref={anchorRef}\n className=\"ow-tooltip\"\n onPointerEnter={(event) => {\n if (event.pointerType === \"mouse\") show();\n }}\n onPointerLeave={hide}\n onPointerDown={hide}\n onFocus={(event) => {\n if (event.target.matches(\":focus-visible\")) show(true);\n }}\n onBlur={hide}\n >\n {children}\n {mounted ? (\n <span ref={bubbleRef} {...manualPopover} data-state={state} className=\"ow-tooltip__bubble ow-floating\" style={style} aria-hidden=\"true\">\n {label}\n </span>\n ) : null}\n </span>\n );\n}\n", "import { useId, useState, type FormEvent, type ReactNode } from \"react\";\n\nimport { useModalDialog } from \"../../hooks/useModalDialog\";\nimport { TrashIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Button } from \"../Button/Button\";\n\nexport interface DialogProps {\n open: boolean;\n /** Called when the person dismisses it (Escape, the backdrop) unless `dismissible` is false. Set `open` to false here. */\n onClose(): void;\n title: ReactNode;\n /** A muted line or two under the title. */\n description?: ReactNode;\n children?: ReactNode;\n /** Buttons at the bottom right, cancel first, the main action last. */\n actions?: ReactNode;\n /** Pixels. Default 420. */\n width?: number;\n /** False while saving, so Escape and the backdrop can't close it mid-way. Default true. */\n dismissible?: boolean;\n /** Makes the dialog a form; its submit button submits it. */\n onSubmit?(event: FormEvent<HTMLFormElement>): void;\n className?: string;\n}\n\n/**\n * A modal dialog on the native <dialog> element: it traps focus, sits above everything, closes with Escape\n * or a click on the backdrop, and fades and rises in.\n */\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n actions,\n width = 420,\n dismissible = true,\n onSubmit,\n className,\n}: DialogProps) {\n const titleId = useId();\n const descriptionId = useId();\n const { dialogRef, mounted } = useModalDialog(open, () => {\n if (dismissible) onClose();\n });\n\n if (!mounted) return null;\n\n const body = (\n <>\n <div className=\"ow-dialog__header\">\n <h2 id={titleId} className=\"ow-dialog__title\">\n {title}\n </h2>\n {description ? (\n <div id={descriptionId} className=\"ow-dialog__description\">\n {description}\n </div>\n ) : null}\n </div>\n {children}\n {actions ? <div className=\"ow-dialog__actions\">{actions}</div> : null}\n </>\n );\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(\"ow-dialog\", className)}\n style={{ width: `min(${width}px, calc(100% - 32px))` }}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n {onSubmit ? (\n <form\n className=\"ow-dialog__body\"\n onSubmit={(event) => {\n event.preventDefault();\n onSubmit(event);\n }}\n >\n {body}\n </form>\n ) : (\n <div className=\"ow-dialog__body\">{body}</div>\n )}\n </dialog>\n );\n}\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onClose(): void;\n title: ReactNode;\n description: ReactNode;\n /** The verb on the confirm button: \"Delete project\", not \"OK\". */\n confirmLabel: string;\n /** Styles the confirm button and icon as a destructive action. */\n destructive?: boolean;\n /** Keeps the confirm button disabled, e.g. until a typed confirmation matches. */\n confirmDisabled?: boolean;\n /** Runs the action. The dialog closes when it resolves and shows the error's message when it throws. */\n onConfirm(): Promise<void> | void;\n /** Extra content between the description and the buttons, such as an option checkbox. */\n children?: ReactNode;\n}\n\n/** Asks before an action: a title, what will happen, Cancel and the action. Cancel has focus first. */\nexport function ConfirmDialog({\n open,\n onClose,\n title,\n description,\n confirmLabel,\n destructive = false,\n confirmDisabled = false,\n onConfirm,\n children,\n}: ConfirmDialogProps) {\n const [isWorking, setIsWorking] = useState(false);\n const [error, setError] = useState(\"\");\n\n async function confirm() {\n setIsWorking(true);\n setError(\"\");\n try {\n await onConfirm();\n onClose();\n } catch (confirmError) {\n setError(\n confirmError instanceof Error && confirmError.message\n ? confirmError.message\n : \"That didn't work. Try again.\",\n );\n } finally {\n setIsWorking(false);\n }\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n dismissible={!isWorking}\n width={380}\n className=\"ow-dialog--confirm\"\n title={\n <>\n {destructive ? (\n <span className=\"ow-dialog__danger-icon\" aria-hidden=\"true\">\n <TrashIcon size={18} />\n </span>\n ) : null}\n {title}\n </>\n }\n description={description}\n onSubmit={() => {\n if (!confirmDisabled && !isWorking) void confirm();\n }}\n actions={\n <>\n <Button type=\"button\" disabled={isWorking} autoFocus onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"submit\"\n variant={destructive ? \"danger\" : \"primary\"}\n disabled={isWorking || confirmDisabled}\n >\n {isWorking ? \"Working\u2026\" : confirmLabel}\n </Button>\n </>\n }\n >\n {children}\n {error ? (\n <span role=\"alert\" className=\"ow-dialog__error\">\n {error}\n </span>\n ) : null}\n </Dialog>\n );\n}\n", "import { useEffect, useRef, useState } from \"react\";\n\n/** Matches the dialog exit transition in dialog.css. */\nconst closeAnimationMs = 160;\n\n/**\n * Shows a <dialog> as a modal while `open` is true, and keeps it mounted long enough for its exit animation\n * once `open` turns false. Escape and a click on the backdrop fire the dialog's `cancel` event; the hook turns\n * that into `onCancel`, so a dialog that must stay open while it works can ignore it.\n */\nexport function useModalDialog(open: boolean, onCancel: () => void) {\n const dialogRef = useRef<HTMLDialogElement>(null);\n const onCancelRef = useRef(onCancel);\n const [mounted, setMounted] = useState(open);\n\n onCancelRef.current = onCancel;\n\n useEffect(() => {\n if (open) setMounted(true);\n }, [open]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n\n if (open) {\n if (!dialog.open) dialog.showModal();\n return;\n }\n\n if (dialog.open) dialog.close();\n const reduceMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n const timer = window.setTimeout(() => setMounted(false), reduceMotion ? 0 : closeAnimationMs);\n return () => window.clearTimeout(timer);\n }, [open, mounted]);\n\n useEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog || !mounted) return;\n\n const onCancelEvent = (event: Event) => {\n event.preventDefault();\n onCancelRef.current();\n };\n\n // A click on the backdrop (outside the dialog's box) counts as Escape. Both the press and the release\n // must be outside, so selecting text and dragging out doesn't close it.\n const isOutside = (event: MouseEvent) => {\n const rect = dialog.getBoundingClientRect();\n return (\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom\n );\n };\n let pressedOutside = false;\n const onPointerDown = (event: PointerEvent) => {\n pressedOutside = event.target === dialog && isOutside(event);\n };\n const onClick = (event: MouseEvent) => {\n if (\n pressedOutside &&\n event.target === dialog &&\n isOutside(event) &&\n // Clicks from the keyboard (Enter on a button) report 0,0.\n event.detail > 0\n )\n dialog.dispatchEvent(new Event(\"cancel\", { cancelable: true }));\n pressedOutside = false;\n };\n\n dialog.addEventListener(\"cancel\", onCancelEvent);\n dialog.addEventListener(\"pointerdown\", onPointerDown);\n dialog.addEventListener(\"click\", onClick);\n return () => {\n dialog.removeEventListener(\"cancel\", onCancelEvent);\n dialog.removeEventListener(\"pointerdown\", onPointerDown);\n dialog.removeEventListener(\"click\", onClick);\n };\n }, [mounted]);\n\n return { dialogRef, mounted };\n}\n", "import { useId, type ReactNode } from \"react\";\n\nimport { useModalDialog } from \"../../hooks/useModalDialog\";\nimport { cx } from \"../../utils/cx\";\nimport { CloseButton } from \"../Button/ButtonGroup\";\n\nexport interface DrawerProps {\n open: boolean;\n /** Called on Escape, the backdrop or the \u2715, unless `dismissible` is false. Set `open` to false here. */\n onClose(): void;\n title: ReactNode;\n /** A muted line under the title. */\n description?: ReactNode;\n children?: ReactNode;\n /** Buttons pinned to the bottom: Cancel first, the main action last. */\n footer?: ReactNode;\n /** Which edge it slides in from.\n * @default \"right\" */\n side?: \"right\" | \"left\" | \"bottom\";\n /** Width (or height, from the bottom) in pixels.\n * @default 420 */\n size?: number;\n /** @default true */\n dismissible?: boolean;\n className?: string;\n}\n\n/** A panel that slides in from an edge over the page, for details or a form beside what the person was doing. */\nexport function Drawer({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n side = \"right\",\n size = 420,\n dismissible = true,\n className,\n}: DrawerProps) {\n const titleId = useId();\n const descriptionId = useId();\n const { dialogRef, mounted } = useModalDialog(open, () => {\n if (dismissible) onClose();\n });\n\n if (!mounted) return null;\n\n const sizeStyle = side === \"bottom\" ? { height: `min(${size}px, 90dvh)` } : { width: `min(${size}px, 100vw - 24px)` };\n\n return (\n <dialog\n ref={dialogRef}\n className={cx(\"ow-drawer\", `ow-drawer--${side}`, className)}\n style={sizeStyle}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n <header className=\"ow-drawer__header\">\n <div className=\"ow-drawer__titles\">\n <h2 id={titleId} className=\"ow-drawer__title\">\n {title}\n </h2>\n {description ? (\n <p id={descriptionId} className=\"ow-drawer__description\">\n {description}\n </p>\n ) : null}\n </div>\n {dismissible ? <CloseButton onClick={onClose} /> : null}\n </header>\n <div className=\"ow-drawer__body\">{children}</div>\n {footer ? <footer className=\"ow-drawer__footer\">{footer}</footer> : null}\n </dialog>\n );\n}\n", "import {\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n type HTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating, type Placement } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface PopoverProps {\n /** The button that opens it. Popover adds the click handler and aria attributes. */\n trigger: ReactElement;\n children: ReactNode;\n open?: boolean;\n /** @default false */\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n /** Where it opens relative to the trigger; it flips when there's no room.\n * @default \"bottom-start\" */\n placement?: Placement;\n /** A heading at the top that also names the popover for screen readers. */\n title?: ReactNode;\n /** Names the popover when there's no title. */\n \"aria-label\"?: string;\n /** Pixels, or any CSS width.\n * @default 280 */\n width?: number | string;\n /** Moves focus into the popover when it opens.\n * @default true */\n autoFocus?: boolean;\n className?: string;\n}\n\n/**\n * A small panel attached to a button, for a few controls or details that don't need a dialog.\n * Escape, a click outside or the trigger closes it, and focus goes back to the trigger.\n */\nexport function Popover({\n trigger,\n children,\n open,\n defaultOpen = false,\n onOpenChange,\n placement = \"bottom-start\",\n title,\n \"aria-label\": ariaLabel,\n width = 280,\n autoFocus = true,\n className,\n}: PopoverProps) {\n const [isOpen, setOpen] = useControllableState(open, defaultOpen, onOpenChange);\n const triggerRef = useRef<HTMLElement | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const id = useId();\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef, floatingRef: panelRef, placement, offset: 8, maxHeight: 640 });\n\n const close = useCallback(\n (reason?: \"outside\" | \"escape\") => {\n setOpen(false);\n if (reason !== \"outside\") triggerRef.current?.focus();\n },\n [setOpen],\n );\n useDismiss(isOpen, [panelRef, anchorRef], close);\n\n useEffect(() => {\n triggerRef.current = anchorRef.current?.firstElementChild as HTMLElement | null;\n });\n\n useEffect(() => {\n if (!isOpen || !autoFocus) return;\n const frame = requestAnimationFrame(() => {\n const panel = panelRef.current;\n const first = panel?.querySelector<HTMLElement>(\n 'input, select, textarea, button, [href], [tabindex]:not([tabindex=\"-1\"])',\n );\n (first ?? panel)?.focus();\n });\n return () => cancelAnimationFrame(frame);\n }, [isOpen, autoFocus]);\n\n const triggerElement = isValidElement<HTMLAttributes<HTMLElement>>(trigger)\n ? cloneElement(trigger, {\n \"aria-haspopup\": \"dialog\",\n \"aria-expanded\": isOpen,\n \"aria-controls\": isOpen ? id : undefined,\n onClick: (event: MouseEvent<HTMLElement>) => {\n trigger.props.onClick?.(event);\n if (!event.defaultPrevented) setOpen(!isOpen);\n },\n })\n : trigger;\n\n return (\n <>\n <span ref={anchorRef} className=\"ow-popover-anchor\">\n {triggerElement}\n </span>\n {mounted ? (\n <div\n ref={panelRef}\n {...manualPopover}\n data-state={state}\n id={id}\n role=\"dialog\"\n aria-label={title ? undefined : ariaLabel}\n aria-labelledby={title ? `${id}-title` : undefined}\n tabIndex={-1}\n className={cx(\"ow-popover\", \"ow-floating\", className)}\n style={{ ...style, width }}\n // Focus leaving for anything but the trigger (Tab past the last control) closes it.\n onBlur={(event) => {\n const next = event.relatedTarget as Node | null;\n if (next && !panelRef.current?.contains(next) && !anchorRef.current?.contains(next)) setOpen(false);\n }}\n >\n {title ? (\n <div id={`${id}-title`} className=\"ow-popover__title\">\n {title}\n </div>\n ) : null}\n {children}\n </div>\n ) : null}\n </>\n );\n}\n", "import {\n cloneElement,\n createContext,\n forwardRef,\n isValidElement,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\n\nimport { manualPopover, useFloating } from \"../../hooks/useFloating\";\nimport { useMenuKeyboard } from \"../../hooks/useMenuKeyboard\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { cx } from \"../../utils/cx\";\n\nconst MenuContext = createContext<{ close(): void } | null>(null);\n\nexport interface MenuProps {\n /** The button that opens it, usually a Button. Menu adds the click handler and the aria attributes. */\n trigger: ReactElement;\n /** MenuItem, MenuLabel and MenuSeparator. */\n children: ReactNode;\n /** Names the menu for screen readers. */\n label: string;\n /** Which edge of the trigger it lines up with.\n * @default \"start\" */\n align?: \"start\" | \"end\";\n /** Prefers opening upward. Either way it flips when there's no room.\n * @default false */\n above?: boolean;\n /** CSS width; default fits the items, at least 200px. */\n width?: number | string;\n /** Starts open, for documentation and tests. */\n defaultOpen?: boolean;\n className?: string;\n}\n\n/**\n * A dropdown menu of actions under a button. Opening it focuses the first item; the arrow keys, Home and End\n * move; Escape closes it and returns focus to the button; a click outside or Tab closes it.\n */\nexport function Menu({ trigger, children, label, align = \"start\", above = false, width, defaultOpen = false, className }: MenuProps) {\n const [open, setOpen] = useState(defaultOpen);\n const rootRef = useRef<HTMLSpanElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement | null>(null);\n const menuId = useId();\n const close = () => setOpen(false);\n const onMenuKeyDown = useMenuKeyboard({ open, menuRef, triggerRef, onClose: close });\n const { mounted, state } = usePresence(open);\n const floatingStyle = useFloating({\n open: mounted,\n anchorRef: rootRef,\n floatingRef: menuRef,\n placement: `${above ? \"top\" : \"bottom\"}-${align}`,\n offset: 8,\n });\n\n useEffect(() => {\n triggerRef.current = rootRef.current?.firstElementChild as HTMLElement | null;\n });\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => document.removeEventListener(\"pointerdown\", onPointerDown, true);\n }, [open]);\n\n const triggerElement = isValidElement<ButtonHTMLAttributes<HTMLElement>>(trigger)\n ? cloneElement(trigger, {\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": open,\n \"aria-controls\": open ? menuId : undefined,\n onClick: (event: MouseEvent<HTMLElement>) => {\n trigger.props.onClick?.(event);\n if (!event.defaultPrevented) setOpen((current) => !current);\n },\n })\n : trigger;\n\n return (\n <span ref={rootRef} className=\"ow-menu\">\n {triggerElement}\n {mounted ? (\n <MenuContext.Provider\n value={{\n close() {\n setOpen(false);\n triggerRef.current?.focus();\n },\n }}\n >\n <div\n ref={menuRef}\n {...manualPopover}\n data-state={state}\n id={menuId}\n role=\"menu\"\n aria-label={label}\n className={cx(\"ow-menu__panel\", \"ow-floating\", className)}\n style={width === undefined ? floatingStyle : { ...floatingStyle, width }}\n onKeyDown={onMenuKeyDown}\n >\n {children}\n </div>\n </MenuContext.Provider>\n ) : null}\n </span>\n );\n}\n\nexport interface MenuItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onSelect\"> {\n /** A 15px lucide-react icon before the label. */\n icon?: ReactNode;\n /** Runs the action; the menu then closes. */\n onSelect?(): void;\n /** Red, for actions that delete or can't be undone. */\n destructive?: boolean;\n /** Shown on the right, e.g. \"\u2318,\". Only a shortcut that actually works. */\n shortcut?: string;\n}\n\n/** One action in a Menu. */\nexport const MenuItem = forwardRef<HTMLButtonElement, MenuItemProps>(function MenuItem(\n { icon, onSelect, destructive = false, shortcut, className, children, onClick, ...buttonProps },\n ref,\n) {\n const menu = useContext(MenuContext);\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n className={cx(\"ow-menu__item\", destructive && \"ow-menu__item--destructive\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented) return;\n menu?.close();\n onSelect?.();\n }}\n {...buttonProps}\n >\n {icon ? <span className=\"ow-menu__icon\">{icon}</span> : null}\n <span className=\"ow-menu__label\">{children}</span>\n {shortcut ? <kbd className=\"ow-menu__shortcut\">{shortcut}</kbd> : null}\n </button>\n );\n});\n\n/** A small uppercase heading for a group of items. */\nexport function MenuLabel({ children }: { children: ReactNode }) {\n return (\n <div className=\"ow-menu__group-label\" role=\"presentation\">\n {children}\n </div>\n );\n}\n\n/** A hairline between groups of items. */\nexport function MenuSeparator() {\n return <div className=\"ow-menu__separator\" role=\"separator\" />;\n}\n", "import { useEffect, type KeyboardEvent, type RefObject } from \"react\";\n\nconst itemSelector =\n '[role=\"menuitem\"]:not([disabled]):not([aria-disabled=\"true\"]), [role=\"menuitemradio\"]:not([disabled]), [role=\"menuitemcheckbox\"]:not([disabled])';\n\nfunction items(menu: HTMLElement | null): HTMLElement[] {\n return menu ? [...menu.querySelectorAll<HTMLElement>(itemSelector)] : [];\n}\n\n/**\n * Keyboard use for a `role=\"menu\"` popup, as people expect from menus: opening it moves focus to its first item,\n * the arrow keys (and Home and End) move between items, wrapping round, and Escape closes it and puts focus\n * back on the button that opened it. Attach the returned handler to the menu's `onKeyDown`.\n */\nexport function useMenuKeyboard({\n open,\n menuRef,\n triggerRef,\n onClose,\n}: {\n open: boolean;\n menuRef: RefObject<HTMLElement | null>;\n triggerRef?: RefObject<HTMLElement | null> | undefined;\n onClose(): void;\n}): (event: KeyboardEvent<HTMLElement>) => void {\n useEffect(() => {\n if (!open) return;\n const frame = window.requestAnimationFrame(() => {\n const menu = menuRef.current;\n // Something inside already has focus (e.g. a field at the top of the menu): leave it there.\n if (menu?.contains(document.activeElement)) return;\n items(menu)[0]?.focus();\n });\n return () => window.cancelAnimationFrame(frame);\n }, [open, menuRef]);\n\n return (event) => {\n const list = items(menuRef.current);\n const index = list.indexOf(document.activeElement as HTMLElement);\n const move = (next: number) => {\n event.preventDefault();\n list[(next + list.length) % list.length]?.focus();\n };\n switch (event.key) {\n case \"ArrowDown\":\n move(index + 1);\n break;\n case \"ArrowUp\":\n move(index < 0 ? list.length - 1 : index - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(list.length - 1);\n break;\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n onClose();\n triggerRef?.current?.focus();\n break;\n case \"Tab\":\n // Leaving the menu closes it; focus moves on as usual.\n onClose();\n break;\n }\n };\n}\n", "import { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport { useModalDialog } from \"../../hooks/useModalDialog\";\nimport { CornerDownLeftIcon, SearchIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { filterCommands } from \"./filterCommands\";\n\nexport interface Command {\n /** Unique in the list, e.g. \"project.new\". */\n id: string;\n title: string;\n /** Commands with the same group are listed together under its name (when nothing is typed). */\n group?: string;\n icon?: ReactNode;\n /** Extra words that should find this command, e.g. \"start go\" for Run. */\n keywords?: string;\n /** Shown on the right, e.g. a folder or \"Running\". */\n hint?: string;\n /** Shortcut shown on the right, e.g. \"\u2318,\". */\n shortcut?: string;\n /** Why it can't run right now; the command still shows, greyed out, with this as its hint. */\n disabled?: string;\n run(): void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onClose(): void;\n commands: Command[];\n /** Default \"Search commands\u2026\". */\n placeholder?: string;\n}\n\n/** \u2318K: search every action and run it from the keyboard. Arrow keys (or Ctrl+N and Ctrl+P) move, Enter runs. */\nexport function CommandPalette({ open, onClose, commands, placeholder = \"Search commands\u2026\" }: CommandPaletteProps) {\n const { dialogRef, mounted } = useModalDialog(open, onClose);\n const [query, setQuery] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(0);\n const listRef = useRef<HTMLUListElement>(null);\n const listId = useId();\n const results = useMemo(() => filterCommands(commands, query), [commands, query]);\n const active = results[Math.min(activeIndex, results.length - 1)];\n\n useEffect(() => setActiveIndex(0), [query]);\n useEffect(() => {\n if (open) setQuery(\"\");\n }, [open]);\n useEffect(() => {\n listRef.current?.querySelector(\"[aria-selected=true]\")?.scrollIntoView({ block: \"nearest\" });\n }, [activeIndex, results]);\n\n if (!mounted) return null;\n\n function run(command: Command | undefined) {\n if (!command || command.disabled) return;\n onClose();\n // After the palette has closed, so dialogs the command opens get focus.\n window.setTimeout(() => command.run(), 0);\n }\n\n function move(step: number) {\n if (!results.length) return;\n setActiveIndex((index) => (Math.min(index, results.length - 1) + step + results.length) % results.length);\n }\n\n return (\n <dialog ref={dialogRef} className=\"ow-dialog ow-palette\" aria-label=\"Command palette\">\n <div className=\"ow-palette__search\">\n <SearchIcon size={16} className=\"ow-palette__search-icon\" />\n <input\n autoFocus\n className=\"ow-palette__input\"\n placeholder={placeholder}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-activedescendant={active ? `${listId}-${active.id}` : undefined}\n aria-autocomplete=\"list\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" || (event.ctrlKey && event.key === \"n\")) {\n event.preventDefault();\n move(1);\n } else if (event.key === \"ArrowUp\" || (event.ctrlKey && event.key === \"p\")) {\n event.preventDefault();\n move(-1);\n } else if (event.key === \"Enter\") {\n event.preventDefault();\n run(active);\n }\n }}\n />\n <kbd className=\"ow-palette__esc\">esc</kbd>\n </div>\n <ul ref={listRef} id={listId} role=\"listbox\" aria-label=\"Commands\" className=\"ow-palette__list\">\n {results.length ? (\n results.map((command, index) => {\n const showGroup =\n !query.trim() && command.group && command.group !== results[index - 1]?.group;\n const isActive = command === active;\n return (\n <li key={command.id} role=\"presentation\">\n {showGroup ? <div className=\"ow-palette__group\">{command.group}</div> : null}\n <div\n id={`${listId}-${command.id}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={Boolean(command.disabled)}\n title={command.disabled}\n className={cx(\"ow-palette__option\", {\n \"ow-palette__option--active\": isActive,\n \"ow-palette__option--disabled\": Boolean(command.disabled),\n })}\n onMouseMove={() => setActiveIndex(index)}\n onClick={() => run(command)}\n >\n <span className=\"ow-palette__icon\" aria-hidden=\"true\">\n {command.icon}\n </span>\n <span className=\"ow-palette__title\">{command.title}</span>\n {command.disabled && isActive ? (\n <span className=\"ow-palette__hint\">{command.disabled}</span>\n ) : command.hint ? (\n <span className=\"ow-palette__hint\">{command.hint}</span>\n ) : null}\n {command.shortcut ? (\n <kbd className=\"ow-palette__shortcut\">{command.shortcut}</kbd>\n ) : null}\n {isActive && !command.disabled ? (\n <CornerDownLeftIcon size={13} className=\"ow-palette__enter\" />\n ) : null}\n </div>\n </li>\n );\n })\n ) : (\n <li className=\"ow-palette__empty\">No commands match “{query}”.</li>\n )}\n </ul>\n </dialog>\n );\n}\n", "import type { Command } from \"./CommandPalette\";\n\n/** How well a query matches some text: prefix and word-start matches beat letters in order; 0 = no match. */\nfunction score(query: string, text: string, loose = true): number {\n const haystack = text.toLowerCase();\n if (haystack.startsWith(query)) return 100 - Math.min(haystack.length, 50) / 10;\n const wordStart = haystack.indexOf(` ${query}`);\n if (wordStart >= 0) return 80 - wordStart / 10;\n const anywhere = haystack.indexOf(query);\n if (anywhere >= 0) return 60 - anywhere / 10;\n if (!loose) return 0;\n // Letters in order (\"rnp\" \u2192 \"Run pipeline\"), only against titles: in long keyword text almost anything matches.\n let position = 0;\n let gaps = 0;\n for (const letter of query) {\n const found = haystack.indexOf(letter, position);\n if (found < 0) return 0;\n gaps += found - position;\n position = found + 1;\n }\n return Math.max(1, 40 - gaps);\n}\n\n/** Commands matching every word of the query, best first; with no query, the list as given. */\nexport function filterCommands(commands: Command[], query: string): Command[] {\n const words = query.trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (!words.length) return commands;\n return commands\n .map((command, index) => {\n const extra = `${command.group ?? \"\"} ${command.keywords ?? \"\"} ${command.hint ?? \"\"}`;\n let total = 0;\n for (const word of words) {\n const best = Math.max(score(word, command.title) * 1.5, score(word, extra, false));\n if (!best) return undefined;\n total += best;\n }\n // Runnable commands first, then the original order among equals.\n return { command, rank: total - (command.disabled ? 50 : 0) - index / 1000 };\n })\n .filter((entry): entry is { command: Command; rank: number } => Boolean(entry))\n .sort((a, b) => b.rank - a.rank)\n .map((entry) => entry.command);\n}\n", "import {\n createContext,\n useContext,\n useId,\n useLayoutEffect,\n useRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { useIndicator } from \"../../hooks/useIndicator\";\nimport { cx } from \"../../utils/cx\";\n\ninterface TabsContextValue {\n value: string;\n select(value: string): void;\n baseId: string;\n variant: \"segmented\" | \"line\";\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabs(component: string) {\n const context = useContext(TabsContext);\n if (!context) throw new Error(`${component} must be inside <Tabs>.`);\n return context;\n}\n\nconst idPart = (value: string) => value.replace(/[^\\w-]/g, \"_\");\n\nexport interface TabsProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\" | \"defaultValue\"> {\n /** The selected tab's value. Leave out to let Tabs keep its own state. */\n value?: string;\n /** The tab selected first when uncontrolled. */\n defaultValue?: string;\n onValueChange?(value: string): void;\n /** `segmented` raises the chosen tab in a well; `line` underlines it.\n * @default \"segmented\" */\n variant?: \"segmented\" | \"line\";\n children: ReactNode;\n}\n\n/** Views of the same thing, one at a time: TabList with Tabs, then a TabPanel for each. */\nexport function Tabs({ value, defaultValue = \"\", onValueChange, variant = \"segmented\", className, children, ...props }: TabsProps) {\n const [current, select] = useControllableState(value, defaultValue, onValueChange);\n const baseId = useId();\n return (\n <TabsContext.Provider value={{ value: current, select, baseId, variant }}>\n <div className={cx(\"ow-tabs\", `ow-tabs--${variant}`, className)} {...props}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nexport interface TabListProps extends HTMLAttributes<HTMLDivElement> {\n /** Names the set of tabs for screen readers. */\n \"aria-label\"?: string;\n}\n\n/** The row of tabs. The arrow keys, Home and End move between them and select. */\nexport function TabList({ className, onKeyDown, children, ...props }: TabListProps) {\n const { value, select } = useTabs(\"TabList\");\n const listRef = useRef<HTMLDivElement>(null);\n useIndicator(listRef, '[role=\"tab\"][aria-selected=\"true\"]', value);\n\n // No tab matches the value (no defaultValue given): select the first one.\n useLayoutEffect(() => {\n const list = listRef.current;\n if (!list || list.querySelector('[role=\"tab\"][aria-selected=\"true\"]')) return;\n const first = list.querySelector<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)');\n if (first?.dataset.value) select(first.dataset.value);\n }, [value, select]);\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const tabs = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)')];\n const index = tabs.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n const moves: Record<string, number> = { ArrowRight: index + 1, ArrowLeft: index - 1, Home: 0, End: tabs.length - 1 };\n if (!(event.key in moves)) return;\n event.preventDefault();\n const next = tabs[(moves[event.key]! + tabs.length) % tabs.length]!;\n next.focus();\n if (next.dataset.value) select(next.dataset.value);\n }\n\n return (\n <div ref={listRef} role=\"tablist\" className={cx(\"ow-tabs__list\", className)} onKeyDown={handleKeyDown} {...props}>\n {children}\n <span className=\"ow-indicator\" aria-hidden=\"true\" />\n </div>\n );\n}\n\nexport interface TabProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"value\"> {\n value: string;\n /** A 16px icon before the label. */\n icon?: ReactNode;\n}\n\n/** One tab. Its `value` matches a TabPanel's. */\nexport function Tab({ value, icon, className, children, onClick, ...props }: TabProps) {\n const { value: current, select, baseId } = useTabs(\"Tab\");\n const selected = current === value;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${idPart(value)}`}\n aria-selected={selected}\n aria-controls={`${baseId}-panel-${idPart(value)}`}\n tabIndex={selected ? 0 : -1}\n data-value={value}\n className={cx(\"ow-tab\", className)}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) select(value);\n }}\n {...props}\n >\n {icon ? <span className=\"ow-tab__icon\">{icon}</span> : null}\n {children}\n </button>\n );\n}\n\nexport interface TabPanelProps extends HTMLAttributes<HTMLDivElement> {\n value: string;\n /** Keep the panel in the page while hidden, so its state survives switching tabs.\n * @default false */\n keepMounted?: boolean;\n}\n\n/** The content for one tab. */\nexport function TabPanel({ value, keepMounted = false, className, children, ...props }: TabPanelProps) {\n const { value: current, baseId } = useTabs(\"TabPanel\");\n const selected = current === value;\n if (!selected && !keepMounted) return null;\n return (\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel-${idPart(value)}`}\n aria-labelledby={`${baseId}-tab-${idPart(value)}`}\n tabIndex={0}\n hidden={!selected}\n className={cx(\"ow-tabs__panel\", className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n", "import {\n createContext,\n useContext,\n useEffect,\n useId,\n useRef,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\ninterface DisclosureViewProps {\n open: boolean;\n onToggle(): void;\n title: ReactNode;\n subtitle?: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n headingLevel: 2 | 3 | 4 | 5 | 6;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n item?: boolean;\n}\n\nfunction DisclosureView({\n open,\n onToggle,\n title,\n subtitle,\n icon,\n actions,\n headingLevel,\n disabled,\n children,\n className,\n item,\n}: DisclosureViewProps) {\n const id = useId();\n const panelRef = useRef<HTMLDivElement>(null);\n const Heading = `h${headingLevel}` as \"h3\";\n\n // Closed content can't be tabbed into or read out.\n useEffect(() => {\n if (panelRef.current) panelRef.current.inert = !open;\n }, [open]);\n\n return (\n <div className={cx(item ? \"ow-accordion__item\" : \"ow-disclosure\", className)} data-open={open}>\n <div className=\"ow-disclosure__header\">\n <Heading className=\"ow-disclosure__heading\">\n <button\n type=\"button\"\n id={`${id}-trigger`}\n className=\"ow-disclosure__trigger\"\n aria-expanded={open}\n aria-controls={`${id}-panel`}\n disabled={disabled}\n data-accordion-trigger={item ? \"\" : undefined}\n onClick={onToggle}\n >\n <ChevronRightIcon size={14} className=\"ow-disclosure__chevron\" />\n {icon ? <span className=\"ow-disclosure__icon\">{icon}</span> : null}\n <span className=\"ow-disclosure__titles\">\n <span className=\"ow-disclosure__title\">{title}</span>\n {subtitle ? <span className=\"ow-disclosure__subtitle\">{subtitle}</span> : null}\n </span>\n </button>\n </Heading>\n {actions ? <div className=\"ow-disclosure__actions\">{actions}</div> : null}\n </div>\n <div\n ref={panelRef}\n id={`${id}-panel`}\n role=\"region\"\n aria-labelledby={`${id}-trigger`}\n className=\"ow-disclosure__panel\"\n >\n <div className=\"ow-disclosure__clip\">\n <div className=\"ow-disclosure__content\">{children}</div>\n </div>\n </div>\n </div>\n );\n}\n\nexport interface DisclosureProps {\n title: ReactNode;\n /** A muted line under the title. */\n subtitle?: ReactNode;\n /** A 15px icon between the chevron and the title. */\n icon?: ReactNode;\n /** Controls on the right of the header, outside the toggle (a ghost Button). */\n actions?: ReactNode;\n open?: boolean;\n /** @default false */\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n /** `card` is a bordered surface; `plain` is just the toggle and its content, for \"Show details\".\n * @default \"card\" */\n variant?: \"card\" | \"plain\";\n /** The heading level of the title, to fit the page's outline.\n * @default 3 */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\n/** A section that opens and closes under its title, like \"3 files changed\" in a code review. */\nexport function Disclosure({\n open,\n defaultOpen = false,\n onOpenChange,\n variant = \"card\",\n headingLevel = 3,\n className,\n ...props\n}: DisclosureProps) {\n const [isOpen, setOpen] = useControllableState(open, defaultOpen, onOpenChange);\n return (\n <DisclosureView\n {...props}\n open={isOpen}\n onToggle={() => setOpen(!isOpen)}\n headingLevel={headingLevel}\n className={cx(variant === \"plain\" && \"ow-disclosure--plain\", className)}\n />\n );\n}\n\ninterface AccordionContextValue {\n isOpen(value: string): boolean;\n toggle(value: string): void;\n headingLevel: 2 | 3 | 4 | 5 | 6;\n}\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null);\n\nexport interface AccordionProps extends Omit<HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> {\n /** `single` keeps one item open at a time; `multiple` lets any number be open.\n * @default \"single\" */\n type?: \"single\" | \"multiple\";\n /** The open items' values. */\n value?: string[];\n /** @default [] */\n defaultValue?: string[];\n onValueChange?(value: string[]): void;\n /** `bordered` puts the items in one card with hairlines between; `separated` gives each its own card.\n * @default \"bordered\" */\n variant?: \"bordered\" | \"separated\";\n /** @default 3 */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n children: ReactNode;\n}\n\n/** A stack of Disclosures, such as an FAQ. Up and Down move between the headers. */\nexport function Accordion({\n type = \"single\",\n value,\n defaultValue = [],\n onValueChange,\n variant = \"bordered\",\n headingLevel = 3,\n className,\n children,\n onKeyDown,\n ...props\n}: AccordionProps) {\n const [openValues, setOpenValues] = useControllableState(value, defaultValue, onValueChange);\n\n function toggle(item: string) {\n const isOpen = openValues.includes(item);\n if (type === \"single\") setOpenValues(isOpen ? [] : [item]);\n else setOpenValues(isOpen ? openValues.filter((open) => open !== item) : [...openValues, item]);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const triggers = [\n ...event.currentTarget.querySelectorAll<HTMLButtonElement>(\"[data-accordion-trigger]:not(:disabled)\"),\n ];\n const index = triggers.indexOf(document.activeElement as HTMLButtonElement);\n if (index < 0) return;\n const moves: Record<string, number> = { ArrowDown: index + 1, ArrowUp: index - 1, Home: 0, End: triggers.length - 1 };\n if (!(event.key in moves)) return;\n event.preventDefault();\n triggers[(moves[event.key]! + triggers.length) % triggers.length]?.focus();\n }\n\n return (\n <AccordionContext.Provider value={{ isOpen: (item) => openValues.includes(item), toggle, headingLevel }}>\n <div className={cx(\"ow-accordion\", `ow-accordion--${variant}`, className)} onKeyDown={handleKeyDown} {...props}>\n {children}\n </div>\n </AccordionContext.Provider>\n );\n}\n\nexport interface AccordionItemProps {\n value: string;\n title: ReactNode;\n subtitle?: ReactNode;\n icon?: ReactNode;\n disabled?: boolean;\n children: ReactNode;\n className?: string;\n}\n\n/** One section of an Accordion. */\nexport function AccordionItem({ value, ...props }: AccordionItemProps) {\n const context = useContext(AccordionContext);\n if (!context) throw new Error(\"AccordionItem must be inside <Accordion>.\");\n return (\n <DisclosureView\n {...props}\n item\n open={context.isOpen(value)}\n onToggle={() => context.toggle(value)}\n headingLevel={context.headingLevel}\n />\n );\n}\n", "import { forwardRef, type AnchorHTMLAttributes, type MouseEvent, type ReactNode } from \"react\";\n\nimport { ArrowUpRightIcon, ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n /** Where it goes. The last item is the current page and isn't a link. */\n href?: string;\n onClick?(event: MouseEvent<HTMLElement>): void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n /** @default \"chevron\" */\n separator?: \"chevron\" | \"slash\";\n /** Names the trail for screen readers.\n * @default \"Breadcrumb\" */\n label?: string;\n className?: string;\n}\n\n/** Where the current page sits: a trail of links from the top level down. */\nexport function Breadcrumbs({ items, separator = \"chevron\", label = \"Breadcrumb\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label={label} className={cx(\"ow-breadcrumbs\", className)}>\n <ol className=\"ow-breadcrumbs__list\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n return (\n <li key={index} className=\"ow-breadcrumbs__item\">\n {isLast ? (\n <span className=\"ow-breadcrumbs__current\" aria-current=\"page\">\n {item.label}\n </span>\n ) : item.href ? (\n <a className=\"ow-breadcrumbs__link\" href={item.href} onClick={item.onClick}>\n {item.label}\n </a>\n ) : (\n <button type=\"button\" className=\"ow-breadcrumbs__link\" onClick={item.onClick}>\n {item.label}\n </button>\n )}\n {isLast ? null : (\n <span className=\"ow-breadcrumbs__separator\" aria-hidden=\"true\">\n {separator === \"slash\" ? \"/\" : <ChevronRightIcon size={14} />}\n </span>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n\nexport interface LinkStyleOptions {\n /** `default` underlines in a hairline and turns brass on hover; `muted` is quieter, for footnotes; `standalone` has no underline until hovered, for lists of links.\n * @default \"default\" */\n variant?: \"default\" | \"muted\" | \"standalone\";\n}\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement>, LinkStyleOptions {\n /** Opens in a new tab with an \u2197 arrow, for links that leave your site.\n * @default false */\n external?: boolean;\n children?: ReactNode;\n}\n\n/** The class names of a link, for a router's own <Link>: `<RouterLink className={linkClassName()}>`. */\nexport function linkClassName({ variant = \"default\" }: LinkStyleOptions = {}): string {\n return cx(\"ow-link\", `ow-link--${variant}`);\n}\n\n/** A text link. Its hover turns brass, the one place brass is text on a light ground. */\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(function Link(\n { variant = \"default\", external = false, className, children, target, rel, ...props },\n ref,\n) {\n return (\n <a\n ref={ref}\n className={cx(linkClassName({ variant }), className)}\n target={external ? (target ?? \"_blank\") : target}\n rel={external ? (rel ?? \"noopener noreferrer\") : rel}\n {...props}\n >\n {children}\n {external ? (\n <>\n <ArrowUpRightIcon size={13} className=\"ow-link__external\" />\n <span className=\"ow-visually-hidden\"> (opens in a new tab)</span>\n </>\n ) : null}\n </a>\n );\n});\n", "import { ChevronLeftIcon, ChevronRightIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface PaginationProps {\n /** The current page, starting at 1. */\n page: number;\n pageCount: number;\n onPageChange(page: number): void;\n /** Pages shown either side of the current one.\n * @default 1 */\n siblingCount?: number;\n /** Pages always shown at each end.\n * @default 1 */\n boundaryCount?: number;\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** Names the control for screen readers.\n * @default \"Pagination\" */\n label?: string;\n className?: string;\n}\n\ntype Item = number | \"start-gap\" | \"end-gap\";\n\n/** The page numbers to show, with gaps where pages are skipped. */\nexport function paginationItems(page: number, pageCount: number, siblingCount = 1, boundaryCount = 1): Item[] {\n const range = (from: number, to: number) => Array.from({ length: Math.max(0, to - from + 1) }, (_, i) => from + i);\n const startPages = range(1, Math.min(boundaryCount, pageCount));\n const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);\n const siblingsStart = Math.max(\n Math.min(page - siblingCount, pageCount - boundaryCount - siblingCount * 2 - 1),\n boundaryCount + 2,\n );\n const siblingsEnd = Math.min(\n Math.max(page + siblingCount, boundaryCount + siblingCount * 2 + 2),\n endPages.length > 0 ? endPages[0]! - 2 : pageCount - 1,\n );\n return [\n ...startPages,\n ...(siblingsStart > boundaryCount + 2\n ? ([\"start-gap\"] as Item[])\n : boundaryCount + 1 < pageCount - boundaryCount\n ? [boundaryCount + 1]\n : []),\n ...range(siblingsStart, siblingsEnd),\n ...(siblingsEnd < pageCount - boundaryCount - 1\n ? ([\"end-gap\"] as Item[])\n : pageCount - boundaryCount > boundaryCount\n ? [pageCount - boundaryCount]\n : []),\n ...endPages,\n ];\n}\n\n/** Moves through pages of results: previous, numbered pages with gaps, next. */\nexport function Pagination({\n page,\n pageCount,\n onPageChange,\n siblingCount = 1,\n boundaryCount = 1,\n size = \"md\",\n label = \"Pagination\",\n className,\n}: PaginationProps) {\n const items = paginationItems(page, pageCount, siblingCount, boundaryCount);\n const go = (next: number) => onPageChange(Math.min(Math.max(1, next), pageCount));\n return (\n <nav aria-label={label} className={cx(\"ow-pagination\", `ow-pagination--${size}`, className)}>\n <ul className=\"ow-pagination__list\">\n <li>\n <button\n type=\"button\"\n className=\"ow-pagination__button ow-pagination__step\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => go(page - 1)}\n >\n <ChevronLeftIcon size={16} />\n </button>\n </li>\n {items.map((item) =>\n typeof item === \"number\" ? (\n <li key={item}>\n <button\n type=\"button\"\n className=\"ow-pagination__button\"\n aria-current={item === page ? \"page\" : undefined}\n aria-label={`Page ${item}`}\n onClick={() => go(item)}\n >\n {item}\n </button>\n </li>\n ) : (\n <li key={item} className=\"ow-pagination__gap\" aria-hidden=\"true\">\n \u2026\n </li>\n ),\n )}\n <li>\n <button\n type=\"button\"\n className=\"ow-pagination__button ow-pagination__step\"\n aria-label=\"Next page\"\n disabled={page >= pageCount}\n onClick={() => go(page + 1)}\n >\n <ChevronRightIcon size={16} />\n </button>\n </li>\n </ul>\n </nav>\n );\n}\n", "import { useId, type ReactNode } from \"react\";\n\nimport { CheckIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface StepItem {\n title: ReactNode;\n /** A line under the title. Hidden once the step is done, in the vertical layout. */\n description?: ReactNode;\n /** A control on the right of the step while it's the current one, such as a small Button. Other steps don't show it. */\n action?: ReactNode;\n /** Overrides the status worked out from `current`. */\n status?: \"done\" | \"current\" | \"upcoming\";\n}\n\nexport interface StepsProps {\n items: StepItem[];\n /** The index of the step in progress. Steps before it are done. Use items.length when every step is done.\n * @default 0 */\n current?: number;\n /** `vertical` is a first-run checklist; `horizontal` is a compact progress strip.\n * @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** A heading above a vertical list, with a \"2 of 4 done\" count beside it. */\n title?: ReactNode;\n /** Names the list for screen readers when there's no title.\n * @default \"Steps\" */\n label?: string;\n className?: string;\n}\n\n/** Numbered steps toward a goal. The current one is raised; finished ones are checked off. */\nexport function Steps({ items, current = 0, orientation = \"vertical\", title, label = \"Steps\", className }: StepsProps) {\n const statuses = items.map((item, index) => item.status ?? (index < current ? \"done\" : index === current ? \"current\" : \"upcoming\"));\n const doneCount = statuses.filter((status) => status === \"done\").length;\n const headingId = useId();\n\n const list = (\n <ol className=\"ow-steps__list\">\n {items.map((item, index) => {\n const status = statuses[index]!;\n return (\n <li\n key={index}\n className={cx(\"ow-steps__item\", `ow-steps__item--${status}`)}\n aria-current={status === \"current\" ? \"step\" : undefined}\n >\n <span className=\"ow-steps__marker\">\n {status === \"done\" ? <CheckIcon size={14} strokeWidth={3} /> : index + 1}\n </span>\n <span className=\"ow-steps__text\">\n <span className=\"ow-steps__title\">\n {status === \"done\" ? <span className=\"ow-visually-hidden\">Done: </span> : null}\n {item.title}\n </span>\n {item.description && (orientation === \"horizontal\" || status !== \"done\") ? (\n <span className=\"ow-steps__description\">{item.description}</span>\n ) : null}\n </span>\n {item.action && status === \"current\" && orientation === \"vertical\" ? (\n <span className=\"ow-steps__action\">{item.action}</span>\n ) : null}\n </li>\n );\n })}\n </ol>\n );\n\n return (\n <section\n className={cx(\"ow-steps\", `ow-steps--${orientation}`, className)}\n aria-labelledby={title && orientation === \"vertical\" ? headingId : undefined}\n aria-label={title && orientation === \"vertical\" ? undefined : label}\n >\n {title && orientation === \"vertical\" ? (\n <div className=\"ow-steps__header\">\n <h3 id={headingId} className=\"ow-steps__heading\">\n {title}\n </h3>\n <span className=\"ow-steps__count\">\n {doneCount} of {items.length} done\n </span>\n </div>\n ) : null}\n {list}\n </section>\n );\n}\n", "import { forwardRef, type AnchorHTMLAttributes, type ButtonHTMLAttributes, type ReactNode, type Ref } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface NavListProps {\n /** Names the navigation for screen readers, e.g. \"Settings\". */\n label: string;\n /** A muted heading above the items (vertical only). */\n heading?: ReactNode;\n /** `vertical` for a sidebar; `horizontal` scrolls sideways, for narrow screens.\n * @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n children: ReactNode;\n className?: string;\n}\n\n/** A list of places to go, the way a settings dialog's sidebar lists its sections. Place it on ow-canvas. */\nexport function NavList({ label, heading, orientation = \"vertical\", children, className }: NavListProps) {\n return (\n <nav aria-label={label} className={cx(\"ow-nav\", `ow-nav--${orientation}`, className)}>\n {heading && orientation === \"vertical\" ? <span className=\"ow-nav__heading\">{heading}</span> : null}\n {children}\n </nav>\n );\n}\n\nexport interface NavItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** A 15px lucide-react icon. */\n icon?: ReactNode;\n /** The current section: raised on a surface, its icon in the primary colour.\n * @default false */\n active?: boolean;\n /** Makes the item a link to this address instead of a button. */\n href?: string;\n /** Muted text at the right: a count, a badge. */\n end?: ReactNode;\n}\n\n/** One place in a NavList: a button, or a link when given an href. */\nexport const NavItem = forwardRef<HTMLElement, NavItemProps>(function NavItem(\n { icon, active = false, className, children, type = \"button\", href, end, ...buttonProps },\n ref,\n) {\n const content = (\n <>\n {icon ? <span className=\"ow-nav__icon\">{icon}</span> : null}\n <span className=\"ow-nav__label\">{children}</span>\n {end !== undefined ? <span className=\"ow-nav__end\">{end}</span> : null}\n </>\n );\n const shared = {\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cx(\"ow-nav__item\", active && \"ow-nav__item--active\", className),\n };\n if (href !== undefined) {\n return (\n <a\n ref={ref as Ref<HTMLAnchorElement>}\n href={href}\n {...shared}\n {...(buttonProps as AnchorHTMLAttributes<HTMLAnchorElement>)}\n >\n {content}\n </a>\n );\n }\n return (\n <button ref={ref as Ref<HTMLButtonElement>} type={type} {...shared} {...buttonProps}>\n {content}\n </button>\n );\n});\n", "import { useMemo, type Key, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ArrowDownIcon, ArrowUpIcon, ChevronsUpDownIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { Checkbox } from \"../Checkbox/Checkbox\";\n\nexport interface TableColumn<Row> {\n /** Unique; also the row field shown when there's no `render`. */\n key: string;\n header: ReactNode;\n /** Numbers and amounts go at the end, so their digits line up.\n * @default \"start\" */\n align?: \"start\" | \"center\" | \"end\";\n /** A CSS width, e.g. 120 or \"30%\". */\n width?: number | string;\n /** Lets the person sort by this column. */\n sortable?: boolean;\n /** What the cell shows. Defaults to the row's field named by `key`. */\n render?(row: Row): ReactNode;\n /** The value sorted by, when it isn't the field itself. */\n sortValue?(row: Row): string | number;\n}\n\nexport interface TableSort {\n key: string;\n direction: \"ascending\" | \"descending\";\n}\n\nexport interface TableProps<Row> {\n columns: Array<TableColumn<Row>>;\n rows: Row[];\n /** A field name or function giving each row a unique key.\n * @default \"id\" */\n rowKey?: keyof Row | ((row: Row) => Key);\n /** Describes the table for screen readers; shown above it unless `hideCaption`. */\n caption?: ReactNode;\n /** @default false */\n hideCaption?: boolean;\n sort?: TableSort;\n defaultSort?: TableSort;\n onSortChange?(sort: TableSort): void;\n /** Sort the rows yourself (e.g. on a server) and only show the arrows.\n * @default false */\n manualSort?: boolean;\n /** Adds a checkbox column.\n * @default \"none\" */\n selectionMode?: \"none\" | \"multiple\";\n selectedKeys?: Key[];\n defaultSelectedKeys?: Key[];\n onSelectionChange?(keys: Key[]): void;\n /**\n * Names a row for its checkbox, read out as \"Select \u2026\": the person, the file, the project. Defaults to the\n * first column's value when it's text or a number, else \"row 3\".\n */\n rowLabel?(row: Row): string;\n /** Shown in place of the rows when there are none, such as an EmptyState. */\n emptyContent?: ReactNode;\n /** `compact` rows are 36px; `comfortable` 44px.\n * @default \"comfortable\" */\n density?: \"compact\" | \"comfortable\";\n /** Keeps the header in view while the table scrolls; use with maxHeight. */\n stickyHeader?: boolean;\n maxHeight?: number | string;\n className?: string;\n}\n\nfunction compare(a: string | number, b: string | number) {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: \"base\" });\n}\n\n/** Rows of records with sortable columns and optional selection, in a bordered card. */\nexport function Table<Row extends object>({\n columns,\n rows,\n rowKey = \"id\" as keyof Row,\n caption,\n hideCaption = false,\n sort,\n defaultSort,\n onSortChange,\n manualSort = false,\n selectionMode = \"none\",\n selectedKeys,\n defaultSelectedKeys = [],\n onSelectionChange,\n rowLabel,\n emptyContent = \"Nothing here yet.\",\n density = \"comfortable\",\n stickyHeader = false,\n maxHeight,\n className,\n}: TableProps<Row>) {\n const [currentSort, setSort] = useControllableState<TableSort | undefined>(sort, defaultSort, onSortChange as (sort: TableSort | undefined) => void);\n const [selected, setSelected] = useControllableState(selectedKeys, defaultSelectedKeys, onSelectionChange);\n const keyOf = (row: Row): Key => (typeof rowKey === \"function\" ? rowKey(row) : (row[rowKey] as Key));\n const labelOf = (row: Row, index: number): string => {\n if (rowLabel) return rowLabel(row);\n const first = columns[0] ? (row as Record<string, unknown>)[columns[0].key] : undefined;\n return typeof first === \"string\" || typeof first === \"number\" ? String(first) : `row ${index + 1}`;\n };\n const field = (row: Row, key: string) => (row as Record<string, unknown>)[key];\n\n const sorted = useMemo(() => {\n if (!currentSort || manualSort) return rows;\n const column = columns.find((c) => c.key === currentSort.key);\n if (!column) return rows;\n const value = (row: Row) => (column.sortValue ? column.sortValue(row) : (field(row, column.key) as string | number));\n const result = [...rows].sort((a, b) => compare(value(a), value(b)));\n return currentSort.direction === \"descending\" ? result.reverse() : result;\n }, [rows, columns, currentSort, manualSort]);\n\n const allKeys = sorted.map(keyOf);\n const selectedCount = allKeys.filter((key) => selected.includes(key)).length;\n\n function toggleSort(key: string) {\n setSort(\n currentSort?.key === key\n ? { key, direction: currentSort.direction === \"ascending\" ? \"descending\" : \"ascending\" }\n : { key, direction: \"ascending\" },\n );\n }\n\n const selectable = selectionMode === \"multiple\";\n\n return (\n <div\n className={cx(\"ow-table-wrap\", stickyHeader && \"ow-table-wrap--sticky\", className)}\n style={maxHeight ? { maxHeight } : undefined}\n tabIndex={maxHeight ? 0 : undefined}\n >\n <table className={cx(\"ow-table\", `ow-table--${density}`)}>\n {caption ? <caption className={cx(\"ow-table__caption\", hideCaption && \"ow-visually-hidden\")}>{caption}</caption> : null}\n <thead>\n <tr>\n {selectable ? (\n <th className=\"ow-table__select\" scope=\"col\">\n <Checkbox\n size=\"sm\"\n aria-label=\"Select all rows\"\n checked={sorted.length > 0 && selectedCount === sorted.length}\n indeterminate={selectedCount > 0 && selectedCount < sorted.length}\n onChange={(event) =>\n setSelected(\n event.target.checked\n ? [...new Set([...selected, ...allKeys])]\n : selected.filter((key) => !allKeys.includes(key)),\n )\n }\n />\n </th>\n ) : null}\n {columns.map((column) => {\n const direction = currentSort?.key === column.key ? currentSort.direction : undefined;\n return (\n <th\n key={column.key}\n scope=\"col\"\n aria-sort={direction ?? (column.sortable ? \"none\" : undefined)}\n className={cx(`ow-table__cell--${column.align ?? \"start\"}`)}\n style={column.width !== undefined ? { width: column.width } : undefined}\n >\n {column.sortable ? (\n <button type=\"button\" className=\"ow-table__sort\" onClick={() => toggleSort(column.key)}>\n {column.header}\n <span className={cx(\"ow-table__sort-icon\", direction && \"ow-table__sort-icon--active\")}>\n {direction === \"ascending\" ? (\n <ArrowUpIcon size={12} />\n ) : direction === \"descending\" ? (\n <ArrowDownIcon size={12} />\n ) : (\n <ChevronsUpDownIcon size={12} />\n )}\n </span>\n </button>\n ) : (\n column.header\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {sorted.length === 0 ? (\n <tr>\n <td className=\"ow-table__empty\" colSpan={columns.length + (selectable ? 1 : 0)}>\n {emptyContent}\n </td>\n </tr>\n ) : (\n sorted.map((row, index) => {\n const key = keyOf(row);\n const isSelected = selected.includes(key);\n return (\n <tr key={key} className={cx(isSelected && \"ow-table__row--selected\")}>\n {selectable ? (\n <td className=\"ow-table__select\">\n <Checkbox\n size=\"sm\"\n aria-label={`Select ${labelOf(row, index)}`}\n checked={isSelected}\n onChange={(event) =>\n setSelected(\n event.target.checked ? [...selected, key] : selected.filter((k) => k !== key),\n )\n }\n />\n </td>\n ) : null}\n {columns.map((column) => (\n <td key={column.key} className={cx(`ow-table__cell--${column.align ?? \"start\"}`)}>\n {column.render ? column.render(row) : (field(row, column.key) as ReactNode)}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n );\n}\n", "import type { ReactNode } from \"react\";\n\nimport { ArrowDownIcon, ArrowUpIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface StatProps {\n /** What's measured, in a few words: \"Tokens this week\". */\n label: ReactNode;\n /** The number, formatted: \"1.2M\", \"\u20AC48.20\". */\n value: ReactNode;\n /** A 14px icon on a small tile beside the label. */\n icon?: ReactNode;\n /** The change since last time, as text: \"+12%\", \"\u22123\". */\n change?: string;\n /** Whether the change is good or bad. Worked out from a leading + or \u2212 when left out; costs going up are negative, so set it. */\n changeTone?: \"positive\" | \"negative\" | \"neutral\";\n /** A muted line under the value: \"vs last week\". */\n description?: ReactNode;\n /** Recent values for a small line chart under the number. */\n trend?: number[];\n className?: string;\n}\n\nfunction Sparkline({ values }: { values: number[] }) {\n const max = Math.max(...values);\n const min = Math.min(...values);\n const span = max - min || 1;\n const points = values.map((value, index) => {\n const x = (index / (values.length - 1)) * 100;\n const y = 36 - ((value - min) / span) * 32;\n return [x, y] as const;\n });\n const line = points.map(([x, y], index) => `${index ? \"L\" : \"M\"}${x.toFixed(2)} ${y.toFixed(2)}`).join(\" \");\n const [lastX, lastY] = points[points.length - 1]!;\n return (\n <div className=\"ow-stat__trend\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 40\" preserveAspectRatio=\"none\">\n <path d={`${line} L100 40 L0 40 Z`} className=\"ow-stat__trend-area\" />\n <path d={line} className=\"ow-stat__trend-line\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n {/* The end point is HTML, so the stretched chart doesn't stretch it into an oval. */}\n <span className=\"ow-stat__trend-end\" style={{ left: `${lastX}%`, top: `${(lastY / 40) * 100}%` }} />\n </div>\n );\n}\n\n/** One headline number with its label, change and trend, for overview cards. */\nexport function Stat({ label, value, icon, change, changeTone, description, trend, className }: StatProps) {\n const tone = changeTone ?? (change?.startsWith(\"+\") ? \"positive\" : /^[-\u2212]/.test(change ?? \"\") ? \"negative\" : \"neutral\");\n const rising = change ? !/^[-\u2212]/.test(change) : false;\n return (\n <div className={cx(\"ow-stat\", className)}>\n <div className=\"ow-stat__label\">\n {icon ? <span className=\"ow-stat__icon\">{icon}</span> : null}\n <span>{label}</span>\n </div>\n <div className=\"ow-stat__row\">\n <span className=\"ow-stat__value\">{value}</span>\n {change ? (\n <span className={cx(\"ow-stat__change\", `ow-stat__change--${tone}`)}>\n {tone === \"neutral\" ? null : rising ? <ArrowUpIcon size={12} /> : <ArrowDownIcon size={12} />}\n {change}\n </span>\n ) : null}\n </div>\n {description ? <div className=\"ow-stat__description\">{description}</div> : null}\n {trend && trend.length > 1 ? <Sparkline values={trend} /> : null}\n </div>\n );\n}\n", "import { useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { ChevronRightIcon, FileIcon, FolderIcon, FolderOpenIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface FileTreeNode {\n name: string;\n /** A folder's contents. Give folders an empty array if they're empty. */\n children?: FileTreeNode[];\n /** Replaces the file or folder icon. */\n icon?: ReactNode;\n /** Muted text at the right of the row, such as \"+12 \u22123\" or a size. */\n meta?: ReactNode;\n}\n\nexport interface FileTreeProps {\n items: FileTreeNode[];\n /** The selected file's path, \"src/app.tsx\". */\n selected?: string;\n defaultSelected?: string;\n onSelect?(path: string): void;\n /** Folder paths open at first, or \"all\".\n * @default \"all\" */\n defaultExpanded?: string[] | \"all\";\n /** Names the tree for screen readers.\n * @default \"Files\" */\n label?: string;\n className?: string;\n}\n\ninterface Row {\n node: FileTreeNode;\n path: string;\n level: number;\n parent?: string;\n isFolder: boolean;\n}\n\nfunction flatten(nodes: FileTreeNode[], expanded: Set<string>, parent?: string, level = 1): Row[] {\n return nodes.flatMap((node) => {\n const path = parent ? `${parent}/${node.name}` : node.name;\n const isFolder = node.children !== undefined;\n const row: Row = { node, path, level, parent, isFolder };\n return isFolder && expanded.has(path) ? [row, ...flatten(node.children!, expanded, path, level + 1)] : [row];\n });\n}\n\nfunction allFolders(nodes: FileTreeNode[], parent?: string): string[] {\n return nodes.flatMap((node) => {\n const path = parent ? `${parent}/${node.name}` : node.name;\n return node.children ? [path, ...allFolders(node.children, path)] : [];\n });\n}\n\n/**\n * A project structure explorer: folders open and close, files can be selected.\n * Up and Down move, Right opens a folder or goes into it, Left closes it or goes to its parent.\n */\nexport function FileTree({\n items,\n selected,\n defaultSelected = \"\",\n onSelect,\n defaultExpanded = \"all\",\n label = \"Files\",\n className,\n}: FileTreeProps) {\n const [current, setCurrent] = useControllableState(selected, defaultSelected, onSelect);\n const [expanded, setExpanded] = useState(() => new Set(defaultExpanded === \"all\" ? allFolders(items) : defaultExpanded));\n const rows = useMemo(() => flatten(items, expanded), [items, expanded]);\n const [focusPath, setFocusPath] = useState<string | undefined>();\n const refs = useRef(new Map<string, HTMLLIElement>());\n const tabStop = rows.some((row) => row.path === focusPath) ? focusPath : (rows.find((row) => row.path === current) ?? rows[0])?.path;\n\n function focus(path: string | undefined) {\n if (!path) return;\n setFocusPath(path);\n refs.current.get(path)?.focus();\n }\n\n function toggle(path: string, open?: boolean) {\n setExpanded((previous) => {\n const next = new Set(previous);\n if (open ?? !next.has(path)) next.add(path);\n else next.delete(path);\n return next;\n });\n }\n\n function activate(row: Row) {\n if (row.isFolder) toggle(row.path);\n else setCurrent(row.path);\n }\n\n function onKeyDown(event: KeyboardEvent<HTMLLIElement>, row: Row) {\n const index = rows.indexOf(row);\n const handlers: Record<string, () => void> = {\n ArrowDown: () => focus(rows[index + 1]?.path),\n ArrowUp: () => focus(rows[index - 1]?.path),\n Home: () => focus(rows[0]?.path),\n End: () => focus(rows[rows.length - 1]?.path),\n ArrowRight: () => {\n if (!row.isFolder) return;\n if (!expanded.has(row.path)) toggle(row.path, true);\n else focus(rows[index + 1]?.level === row.level + 1 ? rows[index + 1]!.path : undefined);\n },\n ArrowLeft: () => {\n if (row.isFolder && expanded.has(row.path)) toggle(row.path, false);\n else focus(row.parent);\n },\n Enter: () => activate(row),\n \" \": () => activate(row),\n };\n const handler = handlers[event.key];\n if (!handler) return;\n event.preventDefault();\n event.stopPropagation();\n handler();\n }\n\n function render(nodes: FileTreeNode[], parent?: string, level = 1): ReactNode {\n return nodes.map((node) => {\n const path = parent ? `${parent}/${node.name}` : node.name;\n const row = rows.find((entry) => entry.path === path);\n if (!row) return null;\n const isOpen = row.isFolder && expanded.has(path);\n const icon = node.icon ?? (row.isFolder ? isOpen ? <FolderOpenIcon size={16} /> : <FolderIcon size={16} /> : <FileIcon size={16} />);\n return (\n <li\n key={path}\n ref={(element) => {\n if (element) refs.current.set(path, element);\n else refs.current.delete(path);\n }}\n role=\"treeitem\"\n aria-level={level}\n aria-expanded={row.isFolder ? isOpen : undefined}\n aria-selected={row.isFolder ? undefined : current === path}\n tabIndex={tabStop === path ? 0 : -1}\n className=\"ow-tree__item\"\n onKeyDown={(event) => onKeyDown(event, row)}\n onFocus={(event) => {\n if (event.target === event.currentTarget) setFocusPath(path);\n }}\n >\n <div\n className={cx(\"ow-tree__row\", !row.isFolder && current === path && \"ow-tree__row--selected\")}\n title={path}\n onClick={() => {\n focus(path);\n activate(row);\n }}\n >\n {row.isFolder ? (\n <ChevronRightIcon size={14} className={cx(\"ow-tree__chevron\", isOpen && \"ow-tree__chevron--open\")} />\n ) : (\n <span className=\"ow-tree__spacer\" />\n )}\n <span className={cx(\"ow-tree__icon\", row.isFolder && \"ow-tree__icon--folder\")}>{icon}</span>\n <span className=\"ow-tree__name\">{node.name}</span>\n {node.meta ? <span className=\"ow-tree__meta\">{node.meta}</span> : null}\n </div>\n {isOpen && node.children!.length > 0 ? (\n <ul role=\"group\" className=\"ow-tree__group\">\n {render(node.children!, path, level + 1)}\n </ul>\n ) : null}\n </li>\n );\n });\n }\n\n return (\n <ul role=\"tree\" aria-label={label} className={cx(\"ow-tree\", className)}>\n {render(items)}\n </ul>\n );\n}\n", "import type { ReactNode } from \"react\";\n\nimport { InboxIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface EmptyStateProps {\n /** What's missing, as a plain statement: \"No projects yet\". */\n title: ReactNode;\n /** What to do about it, in a sentence. */\n description?: ReactNode;\n /** A 20px icon on a tile.\n * @default <InboxIcon /> */\n icon?: ReactNode;\n /** One primary Button, and maybe a secondary one. */\n actions?: ReactNode;\n /** Draws a dashed outline around it, for an empty area inside a page.\n * @default false */\n bordered?: boolean;\n className?: string;\n}\n\n/** What a list, table or panel shows when there's nothing in it yet, and the way to add the first thing. */\nexport function EmptyState({ title, description, icon, actions, bordered = false, className }: EmptyStateProps) {\n return (\n <div className={cx(\"ow-empty\", bordered && \"ow-empty--bordered\", className)}>\n <span className=\"ow-empty__icon\" aria-hidden=\"true\">\n {icon ?? <InboxIcon size={20} />}\n </span>\n <div className=\"ow-empty__text\">\n <p className=\"ow-empty__title\">{title}</p>\n {description ? <p className=\"ow-empty__description\">{description}</p> : null}\n </div>\n {actions ? <div className=\"ow-empty__actions\">{actions}</div> : null}\n </div>\n );\n}\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { XIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n /** Shows a \u2715 that calls this. */\n onRemove?(): void;\n /** `neutral` for labels and filters; `active` for the ones currently applied.\n * @default \"neutral\" */\n variant?: \"neutral\" | \"active\";\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** A 14px icon or a ColorSwatch before the text. */\n icon?: ReactNode;\n /** What the \u2715 removes, read out as \"Remove \u2026\". Defaults to the text when it's a string. */\n removeLabel?: string;\n children: ReactNode;\n}\n\n/** A label on something (a topic, a filter, a recipient) that can be removed. */\nexport function Tag({ onRemove, variant = \"neutral\", size = \"md\", icon, removeLabel, className, children, ...props }: TagProps) {\n const name = removeLabel ?? (typeof children === \"string\" ? children : \"tag\");\n return (\n <span className={cx(\"ow-tag\", `ow-tag--${variant}`, `ow-tag--${size}`, onRemove && \"ow-tag--removable\", className)} {...props}>\n {icon ? <span className=\"ow-tag__icon\">{icon}</span> : null}\n <span className=\"ow-tag__label\">{children}</span>\n {onRemove ? (\n <button type=\"button\" className=\"ow-tag__remove\" aria-label={`Remove ${name}`} onClick={onRemove}>\n <XIcon size={12} />\n </button>\n ) : null}\n </span>\n );\n}\n\nexport interface TagGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** Names the set for screen readers, e.g. \"Filters\". */\n label?: string;\n children: ReactNode;\n}\n\n/** Tags in a wrapping row. */\nexport function TagGroup({ label, className, children, ...props }: TagGroupProps) {\n return (\n <div role=\"group\" aria-label={label} className={cx(\"ow-tag-group\", className)} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface ColorSwatchProps {\n /** Any CSS colour: \"#312c7e\", \"var(--ow-brass)\". */\n color: string;\n /** The colour's name, read out and shown beside the swatch. */\n name?: string;\n /** The value shown under the name, e.g. the hex. */\n value?: string;\n /** sm 16px, md 24px, lg 40px.\n * @default \"md\" */\n size?: \"sm\" | \"md\" | \"lg\";\n /** @default \"square\" */\n shape?: \"square\" | \"circle\";\n className?: string;\n}\n\n/** A colour sample, with its name and value if given. */\nexport function ColorSwatch({ color, name, value, size = \"md\", shape = \"square\", className }: ColorSwatchProps) {\n const swatch = (\n <span\n className={cx(\"ow-swatch\", `ow-swatch--${size}`, shape === \"circle\" && \"ow-swatch--circle\")}\n style={{ background: color }}\n {...(name && !value ? { role: \"img\", \"aria-label\": name } : { \"aria-hidden\": true })}\n />\n );\n if (!name && !value) return <span className={className}>{swatch}</span>;\n return (\n <span className={cx(\"ow-swatch-label\", className)}>\n {swatch}\n <span className=\"ow-swatch-label__text\">\n {name ? <span className=\"ow-swatch-label__name\">{name}</span> : null}\n <span className=\"ow-swatch-label__value\">{value}</span>\n </span>\n </span>\n );\n}\n", "import { useState, type CSSProperties } from \"react\";\n\nimport { UserIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\nimport { getInitials } from \"../../utils/text\";\n\nexport interface AvatarProps {\n /** The person's name; its initials show when there's no image. */\n name: string;\n /** A photo URL. If it fails to load, the initials show instead. */\n src?: string;\n /** sm 24px, md 28px, lg 36px, xl 48px, or any size in pixels, such as 96 for a team page. The initials scale with it.\n * @default \"md\" */\n size?: AvatarSize;\n /** Give it when the avatar stands alone; beside the name, leave it out and it's hidden from screen readers. */\n label?: string;\n className?: string;\n}\n\nexport type AvatarSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | number;\n\nconst namedSizes = { sm: 24, md: 28, lg: 36, xl: 48 } as const;\n\n/**\n * The class and style that size an avatar: a named size's class, or a pixel size through --ow-avatar-size.\n * @internal\n */\nexport function avatarSize(size: AvatarSize): { className: string; style?: CSSProperties; pixels: number } {\n if (typeof size === \"number\") {\n return { className: \"ow-avatar--custom\", style: { \"--ow-avatar-size\": `${size}px` } as CSSProperties, pixels: size };\n }\n return { className: `ow-avatar--${size}`, pixels: namedSizes[size] };\n}\n\n/** A round picture of a person: their photo, else their initials on the brand colour, else a person icon. */\nexport function Avatar({ name, src, size = \"md\", label, className }: AvatarProps) {\n const initials = getInitials(name);\n const [failedImage, setFailedImage] = useState<string>();\n const showImage = src && src !== failedImage;\n const sizing = avatarSize(size);\n\n return (\n <span\n className={cx(\"ow-avatar\", sizing.className, !initials && !showImage && \"ow-avatar--empty\", className)}\n style={sizing.style}\n {...(label ? { role: \"img\", \"aria-label\": label } : { \"aria-hidden\": true })}\n >\n {showImage ? (\n <img src={src} alt=\"\" className=\"ow-avatar__image\" onError={() => setFailedImage(src)} />\n ) : (\n initials || <UserIcon size={Math.round(sizing.pixels * 0.52)} />\n )}\n </span>\n );\n}\n", "import { Children, cloneElement, isValidElement, type ReactElement, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\nimport { Avatar, avatarSize, type AvatarSize } from \"./Avatar\";\n\nexport interface AvatarGroupProps {\n /** Avatars. */\n children: ReactNode;\n /** Shows this many, then a \"+3\" count.\n * @default 4 */\n max?: number;\n /** Applied to every avatar in the group: a named size or pixels.\n * @default \"md\" */\n size?: AvatarSize;\n /** Names the group for screen readers, e.g. \"5 people on this project\". */\n label?: string;\n className?: string;\n}\n\n/** Overlapping avatars for the people on something, with a count for the rest. */\nexport function AvatarGroup({ children, max = 4, size = \"md\", label, className }: AvatarGroupProps) {\n const avatars = Children.toArray(children).filter(isValidElement) as Array<ReactElement<{ size?: AvatarSize }>>;\n const sizing = avatarSize(size);\n const shown = avatars.slice(0, max);\n const hidden = avatars.length - shown.length;\n return (\n <div role=\"group\" aria-label={label} className={cx(\"ow-avatar-group\", className)}>\n {shown.map((avatar) => cloneElement(avatar, { size }))}\n {hidden > 0 ? (\n <span className={cx(\"ow-avatar\", sizing.className, \"ow-avatar--count\")} style={sizing.style}>\n <span aria-hidden=\"true\">+{hidden}</span>\n <span className=\"ow-visually-hidden\">and {hidden} more</span>\n </span>\n ) : null}\n </div>\n );\n}\n\nexport interface UserProps {\n name: string;\n /** A second line: an email, a role. */\n description?: ReactNode;\n src?: string;\n /** The avatar's size; the name and gap grow with it from xl (48px) up.\n * @default \"md\" */\n size?: AvatarSize;\n className?: string;\n}\n\n/** The User's class for a size: its own for named sizes; a pixel size uses the nearest named one. */\nfunction userSize(size: AvatarSize) {\n if (typeof size !== \"number\") return `ow-user--${size}`;\n return size >= 48 ? \"ow-user--xl\" : size >= 36 ? \"ow-user--lg\" : size >= 28 ? \"ow-user--md\" : \"ow-user--sm\";\n}\n\n/** A person: avatar, name and a line about them, as in an account menu. */\nexport function User({ name, description, src, size = \"md\", className }: UserProps) {\n return (\n <div className={cx(\"ow-user\", userSize(size), className)}>\n <Avatar name={name} src={src} size={size} />\n <div className=\"ow-user__text\">\n <span className=\"ow-user__name\">{name}</span>\n {description ? <span className=\"ow-user__description\">{description}</span> : null}\n </div>\n </div>\n );\n}\n", "import type { HTMLAttributes } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\n/** One keyboard key in running text, with a heavier bottom edge like a real key: <Kbd>\u2318</Kbd> <Kbd>K</Kbd>. */\nexport function Kbd({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return <kbd className={cx(\"ow-kbd\", className)} {...props} />;\n}\n\n/** Code, a path or a command inside a sentence. */\nexport function Code({ className, ...props }: HTMLAttributes<HTMLElement>) {\n return <code className={cx(\"ow-code\", className)} {...props} />;\n}\n", "import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** `none` for a card that holds a list or table edge to edge; `md` is 16px, `lg` 24px.\n * @default \"md\" */\n padding?: \"none\" | \"md\" | \"lg\";\n}\n\n/** A surface with a hairline border and no shadow: borders before shadows. */\nexport function Card({ className, padding = \"md\", ...props }: CardProps) {\n return <div className={cx(\"ow-card\", `ow-card--pad-${padding}`, className)} {...props} />;\n}\n\nexport interface SettingsRowProps {\n label: ReactNode;\n /** A muted line or two under the label. */\n description?: ReactNode;\n /** The control: a Switch, a Select, a Button. */\n children: ReactNode;\n className?: string;\n}\n\n/** A label on the left and its control on the right, like macOS System Settings. Stack them in a Card. */\nexport function SettingsRow({ children, description, label, className }: SettingsRowProps) {\n return (\n <div className={cx(\"ow-settings-row\", className)}>\n <div className=\"ow-settings-row__text\">\n <span className=\"ow-settings-row__label\">{label}</span>\n {description ? <div className=\"ow-settings-row__description\">{description}</div> : null}\n </div>\n <div className=\"ow-settings-row__control\">{children}</div>\n </div>\n );\n}\n", "import {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type JSX,\n type ReactNode,\n} from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\nexport type SpaceToken = \"none\" | \"3xs\" | \"2xs\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\" | \"5xl\" | \"6xl\" | \"7xl\";\n\nconst space = (token: SpaceToken) => (token === \"none\" ? \"0\" : `var(--ow-space-${token})`);\n\nexport interface StackProps extends HTMLAttributes<HTMLElement> {\n /** @default \"column\" */\n direction?: \"row\" | \"column\";\n /** The space between children, from the spacing scale.\n * @default \"md\" */\n gap?: SpaceToken;\n /** Cross-axis alignment. */\n align?: \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\n /** Main-axis alignment. */\n justify?: \"start\" | \"center\" | \"end\" | \"between\";\n /** Lets a row wrap onto more lines.\n * @default false */\n wrap?: boolean;\n /** The element to render.\n * @default \"div\" */\n as?: keyof JSX.IntrinsicElements;\n children?: ReactNode;\n}\n\nconst alignments = { start: \"flex-start\", center: \"center\", end: \"flex-end\", stretch: \"stretch\", baseline: \"baseline\", between: \"space-between\" };\n\n/** Lays children out in a row or a column with a gap from the spacing scale. */\nexport function Stack({\n direction = \"column\",\n gap = \"md\",\n align,\n justify,\n wrap = false,\n as = \"div\",\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const Element = as as \"div\";\n return (\n <Element\n className={cx(\"ow-stack\", className)}\n style={{\n flexDirection: direction,\n gap: space(gap),\n alignItems: align ? alignments[align] : undefined,\n justifyContent: justify ? alignments[justify] : undefined,\n flexWrap: wrap ? \"wrap\" : undefined,\n ...style,\n }}\n {...props}\n >\n {children}\n </Element>\n );\n}\n\nexport interface SeparatorProps {\n /** @default \"horizontal\" */\n orientation?: \"horizontal\" | \"vertical\";\n /** Text in the middle of a horizontal line, such as \"or\". */\n label?: ReactNode;\n /** Space before and after, from the spacing scale.\n * @default \"none\" */\n spacing?: SpaceToken;\n className?: string;\n}\n\n/** A hairline between groups of content. Prefer space; use a line when space alone doesn't separate. */\nexport function Separator({ orientation = \"horizontal\", label, spacing = \"none\", className }: SeparatorProps) {\n const margin = orientation === \"horizontal\" ? `${space(spacing)} 0` : `0 ${space(spacing)}`;\n if (label && orientation === \"horizontal\") {\n return (\n <div role=\"separator\" className={cx(\"ow-separator-label\", className)} style={{ margin }}>\n <span className=\"ow-separator-label__text\">{label}</span>\n </div>\n );\n }\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n className={cx(\"ow-separator\", `ow-separator--${orientation}`, className)}\n style={{ margin }}\n />\n );\n}\n\nexport interface ScrollShadowProps extends HTMLAttributes<HTMLDivElement> {\n /** @default \"vertical\" */\n orientation?: \"vertical\" | \"horizontal\";\n /** How far the fade reaches, in pixels.\n * @default 32 */\n size?: number;\n /** Its height (vertical) or width; it scrolls past this. */\n maxSize?: number | string;\n /** Names the area; with it, the area becomes a focusable region so keyboards can scroll it. */\n \"aria-label\"?: string;\n children: ReactNode;\n}\n\n/** A scrolling area whose edges fade out where there's more to scroll, so nothing looks cut off. */\nexport function ScrollShadow({\n orientation = \"vertical\",\n size = 32,\n maxSize,\n className,\n style,\n children,\n \"aria-label\": ariaLabel,\n ...props\n}: ScrollShadowProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [edges, setEdges] = useState({ start: false, end: false });\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n const update = () => {\n const position = orientation === \"vertical\" ? element.scrollTop : element.scrollLeft;\n const extent = orientation === \"vertical\" ? element.scrollHeight - element.clientHeight : element.scrollWidth - element.clientWidth;\n setEdges({ start: position > 1, end: position < extent - 1 });\n };\n update();\n element.addEventListener(\"scroll\", update, { passive: true });\n const observer = typeof ResizeObserver === \"undefined\" ? undefined : new ResizeObserver(update);\n observer?.observe(element);\n if (element.firstElementChild) observer?.observe(element.firstElementChild);\n return () => {\n element.removeEventListener(\"scroll\", update);\n observer?.disconnect();\n };\n }, [orientation]);\n\n return (\n <div\n ref={ref}\n className={cx(\"ow-scroll-shadow\", `ow-scroll-shadow--${orientation}`, className)}\n data-start={edges.start || undefined}\n data-end={edges.end || undefined}\n tabIndex={ariaLabel ? 0 : undefined}\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n style={\n {\n \"--ow-scroll-shadow\": `${size}px`,\n [orientation === \"vertical\" ? \"maxHeight\" : \"maxWidth\"]: maxSize,\n ...style,\n } as CSSProperties\n }\n {...props}\n >\n {children}\n </div>\n );\n}\n\n/** Hides content visually but keeps it for screen readers: extra context for an icon, a table caption. */\nexport function VisuallyHidden({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={cx(\"ow-visually-hidden\", className)} {...props} />;\n}\n", "import { useRef, type HTMLAttributes, type PointerEvent, type ReactNode } from \"react\";\n\nimport { cx } from \"../../utils/cx\";\n\n/** A white pill with a brass dot that names a section, set just above its title. */\nexport function Chip({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={cx(\"ow-chip\", className)} {...props} />;\n}\n\nexport interface SectionHeadingProps {\n /** One to three words for the Chip above the title. */\n eyebrow?: ReactNode;\n title: ReactNode;\n /** One or two sentences under the title. */\n intro?: ReactNode;\n /** @default \"start\" */\n align?: \"start\" | \"center\";\n /** The heading level.\n * @default \"h2\" */\n as?: \"h1\" | \"h2\" | \"h3\";\n className?: string;\n}\n\n/** How a marketing section opens: a Chip, a big light title, then an intro in muted text. */\nexport function SectionHeading({\n eyebrow,\n title,\n intro,\n align = \"start\",\n as: Heading = \"h2\",\n className,\n}: SectionHeadingProps) {\n return (\n <div className={cx(\"ow-section-heading\", align === \"center\" && \"ow-section-heading--center\", className)}>\n {eyebrow ? <Chip>{eyebrow}</Chip> : null}\n <Heading className=\"ow-section-heading__title\">{title}</Heading>\n {intro ? <p className=\"ow-section-heading__intro\">{intro}</p> : null}\n </div>\n );\n}\n\nexport interface SiteHeaderProps {\n /** Your logo or name, usually a link home. */\n brand: ReactNode;\n /** Links in the middle; hidden under 760px wide. */\n nav?: ReactNode;\n /** On the right: one primary Button with shape=\"pill\". */\n actions?: ReactNode;\n className?: string;\n}\n\n/** The marketing site's header: a floating white pill over a blur, with a hairline border and a soft shadow. */\nexport function SiteHeader({ brand, nav, actions, className }: SiteHeaderProps) {\n return (\n <header className={cx(\"ow-site-header\", className)}>\n <div className=\"ow-site-header__brand\">{brand}</div>\n {nav ? <nav className=\"ow-site-header__nav\">{nav}</nav> : null}\n {actions ? <div className=\"ow-site-header__actions\">{actions}</div> : null}\n </header>\n );\n}\n\nexport interface DotGridProps extends HTMLAttributes<HTMLDivElement> {\n /** Fades the dots out toward the edges.\n * @default false */\n fade?: boolean;\n /** Turns the dots under the pointer brass.\n * @default false */\n interactive?: boolean;\n}\n\n/** A ground of 1px dots every 22px, like a sheet laid out for planning. Content goes inside. */\nexport function DotGrid({ fade = false, interactive = false, className, children, onPointerMove, ...props }: DotGridProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n function track(event: PointerEvent<HTMLDivElement>) {\n onPointerMove?.(event);\n const element = ref.current;\n if (!interactive || !element) return;\n const rect = element.getBoundingClientRect();\n element.style.setProperty(\"--ow-pointer-x\", `${event.clientX - rect.left}px`);\n element.style.setProperty(\"--ow-pointer-y\", `${event.clientY - rect.top}px`);\n }\n\n return (\n <div\n ref={ref}\n className={cx(\"ow-dot-grid\", fade && \"ow-dot-grid--fade\", interactive && \"ow-dot-grid--interactive\", className)}\n onPointerMove={track}\n {...props}\n >\n <span className=\"ow-dot-grid__dots\" aria-hidden=\"true\" />\n {interactive ? (\n <span className=\"ow-dot-grid__brass\" aria-hidden=\"true\" />\n ) : null}\n <div className=\"ow-dot-grid__content\">{children}</div>\n </div>\n );\n}\n", "import { forwardRef, useCallback, useEffect, useId, useRef, useState, type CSSProperties, type ForwardedRef } from \"react\";\nimport { HexAlphaColorPicker, HexColorInput, HexColorPicker } from \"react-colorful\";\n\nimport { useControllableState } from \"../../hooks/useControllableState\";\nimport { manualPopover, useDismiss, useFloating, type Placement } from \"../../hooks/useFloating\";\nimport { usePresence } from \"../../hooks/usePresence\";\nimport { ChevronDownIcon, PipetteIcon } from \"../../icons\";\nimport { cx } from \"../../utils/cx\";\n\n/** What a swatch is: a colour, or a colour with a name to read out. */\nexport type ColorSwatchOption = string | { color: string; name: string };\n\nexport interface ColorPickerProps {\n /** A hex colour: \"#0d9488\", or \"#0d9488cc\" with alpha. */\n value?: string;\n /** @default \"#312c7e\" */\n defaultValue?: string;\n /** Called with a lowercase hex colour as the person drags, types or picks. */\n onChange?(color: string): void;\n /** Adds an opacity slider; colours come back as #rrggbbaa.\n * @default false */\n alpha?: boolean;\n /** Ready-made colours as swatches under the picker. */\n swatches?: ColorSwatchOption[];\n /** The hex field under the picker.\n * @default true */\n showInput?: boolean;\n /** A button that picks a colour from anywhere on the screen, where the browser can (Chrome and Edge).\n * @default true */\n eyeDropper?: boolean;\n /** Names the picker for screen readers.\n * @default \"Colour\" */\n \"aria-label\"?: string;\n className?: string;\n}\n\ninterface EyeDropperResult {\n sRGBHex: string;\n}\n\ndeclare global {\n interface Window {\n EyeDropper?: new () => { open(): Promise<EyeDropperResult> };\n }\n}\n\nconst swatchColor = (swatch: ColorSwatchOption) => (typeof swatch === \"string\" ? swatch : swatch.color);\nconst swatchName = (swatch: ColorSwatchOption) => (typeof swatch === \"string\" ? swatch : swatch.name);\nconst same = (a: string, b: string) => a.toLowerCase().replace(/^#/, \"\") === b.toLowerCase().replace(/^#/, \"\");\n\n/**\n * Picks a colour: a saturation area and a hue slider (react-colorful, dressed in Openware's look), a hex field,\n * an eyedropper where the browser has one, and optional swatches. The area and sliders work with the arrow keys.\n */\nexport function ColorPicker({\n value,\n defaultValue = \"#312c7e\",\n onChange,\n alpha = false,\n swatches,\n showInput = true,\n eyeDropper = true,\n \"aria-label\": ariaLabel = \"Colour\",\n className,\n}: ColorPickerProps) {\n const [color, setColor] = useControllableState(value, defaultValue, onChange);\n const [canPick, setCanPick] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n useEffect(() => setCanPick(typeof window !== \"undefined\" && \"EyeDropper\" in window), []);\n\n // react-colorful names its sliders \"Color\", \"Hue\" and \"Alpha\"; read them out in Openware's words.\n useEffect(() => {\n const names: Record<string, string> = { saturation: \"Colour\", hue: \"Hue\", alpha: \"Opacity\" };\n for (const [part, label] of Object.entries(names)) {\n rootRef.current?.querySelector(`.react-colorful__${part} .react-colorful__interactive`)?.setAttribute(\"aria-label\", label);\n }\n }, [alpha]);\n const Picker = alpha ? HexAlphaColorPicker : HexColorPicker;\n const change = (next: string) => setColor(next.toLowerCase());\n\n async function pickFromScreen() {\n if (!window.EyeDropper) return;\n try {\n const result = await new window.EyeDropper().open();\n change(result.sRGBHex);\n } catch {\n // Escape pressed: nothing picked.\n }\n }\n\n return (\n <div ref={rootRef} role=\"group\" aria-label={ariaLabel} className={cx(\"ow-color-picker\", className)}>\n <Picker color={color} onChange={change} />\n {showInput || (eyeDropper && canPick) ? (\n <div className=\"ow-color-picker__row\">\n {eyeDropper && canPick ? (\n <button type=\"button\" className=\"ow-color-picker__dropper\" aria-label=\"Pick a colour from the screen\" onClick={pickFromScreen}>\n <PipetteIcon size={15} />\n </button>\n ) : null}\n {showInput ? (\n <span className=\"ow-input-group ow-input-group--sm ow-color-picker__input\">\n <span className=\"ow-input-group__addon\" aria-hidden=\"true\">\n #\n </span>\n <HexColorInput\n className=\"ow-input-group__input\"\n color={color}\n onChange={change}\n alpha={alpha}\n aria-label=\"Hex colour\"\n spellCheck={false}\n />\n </span>\n ) : null}\n <span className=\"ow-color-picker__preview\" style={{ \"--ow-color-picker-value\": color } as CSSProperties} aria-hidden=\"true\" />\n </div>\n ) : null}\n {swatches?.length ? (\n <div className=\"ow-color-picker__swatches\" role=\"group\" aria-label=\"Swatches\">\n {swatches.map((swatch) => {\n const swatchValue = swatchColor(swatch);\n return (\n <button\n key={swatchValue}\n type=\"button\"\n className=\"ow-color-picker__swatch\"\n style={{ \"--ow-color-picker-value\": swatchValue } as CSSProperties}\n aria-label={swatchName(swatch)}\n aria-pressed={same(swatchValue, color)}\n title={swatchName(swatch)}\n onClick={() => change(swatchValue)}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport interface ColorFieldProps extends Omit<ColorPickerProps, \"className\" | \"aria-label\"> {\n /** @default \"md\" */\n size?: \"sm\" | \"md\";\n /** @default false */\n isInvalid?: boolean;\n disabled?: boolean;\n /** Where the picker opens; it flips when there's no room.\n * @default \"bottom-start\" */\n placement?: Placement;\n id?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n className?: string;\n}\n\nfunction assignRef<T>(ref: ForwardedRef<T>, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) ref.current = value;\n}\n\n/** A field that shows a colour and its hex, and opens a ColorPicker below. Escape or a click outside closes it. */\nexport const ColorField = forwardRef<HTMLButtonElement, ColorFieldProps>(function ColorField(\n {\n value,\n defaultValue = \"#312c7e\",\n onChange,\n size = \"md\",\n isInvalid = false,\n disabled = false,\n placement = \"bottom-start\",\n id,\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n ...pickerProps\n },\n ref,\n) {\n const [color, setColor] = useControllableState(value, defaultValue, onChange);\n const [isOpen, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const panelId = useId();\n const { mounted, state } = usePresence(isOpen);\n const style = useFloating({ open: mounted, anchorRef: triggerRef, floatingRef: panelRef, placement, offset: 6, maxHeight: 640 });\n\n const close = useCallback((reason?: \"outside\" | \"escape\") => {\n setOpen(false);\n if (reason !== \"outside\") triggerRef.current?.focus();\n }, []);\n useDismiss(isOpen, [panelRef, triggerRef], close);\n\n // Focus the colour area when it opens, so the arrow keys work straight away.\n useEffect(() => {\n if (!isOpen) return undefined;\n const frame = requestAnimationFrame(() => panelRef.current?.querySelector<HTMLElement>(\".react-colorful__interactive\")?.focus());\n return () => cancelAnimationFrame(frame);\n }, [isOpen]);\n\n return (\n <>\n <button\n ref={(element) => {\n triggerRef.current = element;\n assignRef(ref, element);\n }}\n id={id}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? panelId : undefined}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={[`${panelId}-value`, ariaDescribedBy].filter(Boolean).join(\" \")}\n aria-invalid={isInvalid || undefined}\n disabled={disabled}\n className={cx(\n \"ow-select\",\n \"ow-color-field\",\n `ow-select--${size}`,\n { \"ow-select--open\": isOpen, \"ow-select--invalid\": isInvalid && !isOpen },\n className,\n )}\n onClick={() => setOpen(!isOpen)}\n onKeyDown={(event) => {\n if (event.key === \"ArrowDown\" && !isOpen) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n >\n <span className=\"ow-color-field__swatch\" style={{ \"--ow-color-picker-value\": color } as CSSProperties} aria-hidden=\"true\" />\n <span id={`${panelId}-value`} className=\"ow-select__value ow-color-field__value\">\n {color.toUpperCase()}\n </span>\n <ChevronDownIcon size={size === \"sm\" ? 14 : 16} className=\"ow-select__chevron\" />\n </button>\n {mounted ? (\n <div\n ref={panelRef}\n {...manualPopover}\n data-state={state}\n id={panelId}\n role=\"dialog\"\n aria-label=\"Choose a colour\"\n className=\"ow-popover ow-floating ow-color-field__panel\"\n style={style}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && (event.target as HTMLElement).closest(\".react-colorful\")) close();\n }}\n >\n <ColorPicker {...pickerProps} value={color} onChange={setColor} />\n </div>\n ) : null}\n </>\n );\n});\n", "import type { CSSProperties } from \"react\";\n\n/** The eleven steps of a brand scale, as in --ow-brand-50 \u2026 --ow-brand-950. */\nexport const brandSteps = [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950] as const;\n\nexport type BrandStep = (typeof brandSteps)[number];\nexport type BrandScale = Record<BrandStep, string>;\n\nexport interface BrandPreset {\n id: string;\n name: string;\n scale: BrandScale;\n}\n\n// Midnight's lightness and chroma at each step, in OKLCH. Every scale is built on this lightness curve, so white\n// text on step 600 (light) and 500 (dark), and the focus rings on 500 and 400, keep their contrast whatever the hue.\nconst lightness = [0.968, 0.94, 0.89, 0.81, 0.68, 0.53, 0.42, 0.33, 0.27, 0.22, 0.17];\nconst chroma = [0.012, 0.022, 0.04, 0.066, 0.1, 0.135, 0.134, 0.086, 0.072, 0.058, 0.045];\nconst peakChroma = 0.135;\n\ntype Lch = { l: number; c: number; h: number };\n\nfunction parseHex(color: string): [number, number, number] {\n let hex = color.trim().replace(/^#/, \"\");\n if (hex.length === 3 || hex.length === 4) hex = [...hex.slice(0, 3)].map((d) => d + d).join(\"\");\n if (!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(hex)) throw new Error(`brandScale: \"${color}\" isn't a hex colour like #2563eb.`);\n return [0, 2, 4].map((i) => parseInt(hex.slice(i, i + 2), 16) / 255) as [number, number, number];\n}\n\nconst toLinear = (v: number) => (v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4);\nconst fromLinear = (v: number) => (v <= 0.0031308 ? 12.92 * v : 1.055 * v ** (1 / 2.4) - 0.055);\n\nfunction hexToOklch(color: string): Lch {\n const [r, g, b] = parseHex(color).map(toLinear) as [number, number, number];\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;\n const A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;\n const B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;\n return { l: L, c: Math.hypot(A, B), h: ((Math.atan2(B, A) * 180) / Math.PI + 360) % 360 };\n}\n\nfunction oklchToLinear({ l: L, c, h }: Lch): [number, number, number] {\n const A = c * Math.cos((h * Math.PI) / 180);\n const B = c * Math.sin((h * Math.PI) / 180);\n const l = (L + 0.3963377774 * A + 0.2158037573 * B) ** 3;\n const m = (L - 0.1055613458 * A - 0.0638541728 * B) ** 3;\n const s = (L - 0.0894841775 * A - 1.291485548 * B) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s,\n ];\n}\n\nconst inGamut = (rgb: number[]) => rgb.every((v) => v >= -1e-4 && v <= 1 + 1e-4);\n\n/** The colour at this lightness and hue, with as much of the wanted chroma as sRGB can show. */\nfunction toHex(color: Lch): string {\n let { c } = color;\n if (!inGamut(oklchToLinear(color))) {\n let low = 0;\n let high = c;\n for (let i = 0; i < 24; i += 1) {\n const mid = (low + high) / 2;\n if (inGamut(oklchToLinear({ ...color, c: mid }))) low = mid;\n else high = mid;\n }\n c = low;\n }\n return `#${oklchToLinear({ ...color, c })\n .map((v) => Math.round(Math.min(1, Math.max(0, fromLinear(Math.min(1, Math.max(0, v))))) * 255))\n .map((v) => v.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\n/**\n * Builds the eleven brand steps from one colour: its hue and colourfulness on Openware's lightness curve.\n * The steps keep midnight's contrast in both themes, so your exact colour may land a little lighter or\n * darker than given. A grey gives a neutral scale.\n *\n * `brandScale(\"#0d9488\")` \u2192 `{ 50: \"#ebf7f6\", \u2026, 600: \"#00595a\", \u2026, 950: \"#001414\" }`\n */\nexport function brandScale(color: string): BrandScale {\n const { c, h } = hexToOklch(color);\n const strength = Math.min(1.6, c / peakChroma);\n return Object.fromEntries(brandSteps.map((step, i) => [step, toHex({ l: lightness[i]!, c: chroma[i]! * strength, h })])) as BrandScale;\n}\n\n/** A colour or a scale as the --ow-brand-* custom properties, for a `style` prop or `element.style`. */\nexport function brandVariables(brand: string | BrandScale): CSSProperties {\n const scale = typeof brand === \"string\" ? brandScale(brand) : brand;\n return Object.fromEntries(brandSteps.map((step) => [`--ow-brand-${step}`, scale[step]])) as CSSProperties;\n}\n\n/** A colour or a scale as CSS to paste into a stylesheet. */\nexport function brandCss(brand: string | BrandScale, selector = \":root\"): string {\n const scale = typeof brand === \"string\" ? brandScale(brand) : brand;\n return `${selector} {\\n${brandSteps.map((step) => ` --ow-brand-${step}: ${scale[step]};`).join(\"\\n\")}\\n}`;\n}\n\n/**\n * Rebrands everything inside `element` (the whole page by default) by setting the --ow-brand-* properties on\n * it. Pass `null` to go back to midnight. Elements with their own data-theme set their own brand steps, so\n * give those the same properties, or use brandCss with `:root, [data-theme]` in a stylesheet.\n */\nexport function applyBrand(brand: string | BrandScale | null, element: HTMLElement = document.documentElement) {\n for (const step of brandSteps) element.style.removeProperty(`--ow-brand-${step}`);\n if (brand === null) return;\n const variables = brandVariables(brand) as Record<string, string>;\n for (const [name, value] of Object.entries(variables)) element.style.setProperty(name, value);\n}\n\n/** Seven ready-made scales, each checked for contrast in both themes. Midnight is the default. */\nexport const brandPresets: BrandPreset[] = [\n {\n id: \"midnight\",\n name: \"Midnight\",\n scale: {\n 50: \"#f2f3fc\",\n 100: \"#e7e9f9\",\n 200: \"#d4d7f4\",\n 300: \"#b7bbea\",\n 400: \"#898cd0\",\n 500: \"#5856ad\",\n 600: \"#312c7e\",\n 700: \"#1e1b4b\",\n 800: \"#18163d\",\n 900: \"#13112f\",\n 950: \"#0b0a20\",\n },\n },\n {\n id: \"ocean\",\n name: \"Ocean\",\n scale: {\n 50: \"#edf5fe\",\n 100: \"#dfedfd\",\n 200: \"#c3defa\",\n 300: \"#9ac5f3\",\n 400: \"#5a9de0\",\n 500: \"#006ebe\",\n 600: \"#004f8a\",\n 700: \"#003763\",\n 800: \"#00274a\",\n 900: \"#001b36\",\n 950: \"#001023\",\n },\n },\n {\n id: \"teal\",\n name: \"Teal\",\n scale: {\n 50: \"#ebf7f7\",\n 100: \"#daf1f0\",\n 200: \"#bae4e4\",\n 300: \"#87d0cf\",\n 400: \"#1fadad\",\n 500: \"#007c7c\",\n 600: \"#005959\",\n 700: \"#003e3e\",\n 800: \"#002d2d\",\n 900: \"#002020\",\n 950: \"#001313\",\n },\n },\n {\n id: \"forest\",\n name: \"Forest\",\n scale: {\n 50: \"#eef7f0\",\n 100: \"#e0f0e3\",\n 200: \"#c6e4cd\",\n 300: \"#9ecfaa\",\n 400: \"#5fac76\",\n 500: \"#008240\",\n 600: \"#005d2d\",\n 700: \"#00411d\",\n 800: \"#003014\",\n 900: \"#00220c\",\n 950: \"#001506\",\n },\n },\n {\n id: \"plum\",\n name: \"Plum\",\n scale: {\n 50: \"#f9f2f9\",\n 100: \"#f4e6f4\",\n 200: \"#ead1eb\",\n 300: \"#dab1db\",\n 400: \"#bb80be\",\n 500: \"#95489a\",\n 600: \"#732778\",\n 700: \"#4d2150\",\n 800: \"#39163b\",\n 900: \"#290e2b\",\n 950: \"#1a071b\",\n },\n },\n {\n id: \"rose\",\n name: \"Rose\",\n scale: {\n 50: \"#fef1f1\",\n 100: \"#fce5e6\",\n 200: \"#f8cfd1\",\n 300: \"#eeadb1\",\n 400: \"#d67981\",\n 500: \"#b43b4e\",\n 600: \"#8e1331\",\n 700: \"#5e1924\",\n 800: \"#470f19\",\n 900: \"#330910\",\n 950: \"#210408\",\n },\n },\n {\n id: \"ember\",\n name: \"Ember\",\n scale: {\n 50: \"#fdf2ec\",\n 100: \"#fae7dd\",\n 200: \"#f5d3c0\",\n 300: \"#eab395\",\n 400: \"#d18254\",\n 500: \"#a94e00\",\n 600: \"#7b3700\",\n 700: \"#572500\",\n 800: \"#411900\",\n 900: \"#2f1100\",\n 950: \"#1e0800\",\n },\n },\n];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_jsx_runtime", "import_jsx_runtime", "Button", "import_react", "import_react", "import_jsx_runtime", "import_jsx_runtime", "CloseButton", "ToggleButton", "import_react", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "ChoiceCard", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "Input", "import_react", "import_jsx_runtime", "SearchField", "import_react", "import_jsx_runtime", "NumberField", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "assignRef", "Textarea", "import_react", "import_react", "top", "import_react", "import_jsx_runtime", "state", "import_react", "import_jsx_runtime", "assignRef", "Combobox", "import_react", "import_jsx_runtime", "assignRef", "Checkbox", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "Switch", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "Calendar", "_", "import_react", "import_jsx_runtime", "assignRef", "DatePicker", "import_jsx_runtime", "icon", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "icons", "SonnerToaster", "import_react", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_react", "import_react", "import_jsx_runtime", "MenuItem", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "items", "Link", "import_jsx_runtime", "items", "import_react", "import_jsx_runtime", "items", "import_react", "import_jsx_runtime", "NavItem", "icon", "import_react", "import_jsx_runtime", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "items", "icon", "import_jsx_runtime", "icon", "import_jsx_runtime", "icon", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "import_jsx_runtime", "import_jsx_runtime", "import_react", "import_jsx_runtime", "margin", "import_react", "import_jsx_runtime", "import_react", "import_jsx_runtime", "assignRef", "ColorField"]
|
|
7
7
|
}
|