@proteos/ui 0.54.0 → 0.54.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/popover/popover.tsx","../src/components/file-field/file-field.tsx","../src/components/attachment-chip/attachment-chip.tsx","../src/components/attribute-type-icon/attribute-type-icon.tsx","../src/components/avatar/avatar.tsx","../src/components/avatar-group/avatar-group.tsx","../src/components/field/field.tsx","../src/components/icon-picker/icon-picker.tsx","../src/components/badge/badge.tsx","../src/components/badge-multi-select/badge-multi-select.tsx","../src/components/breadcrumbs/breadcrumbs.tsx","../src/components/card/card.tsx","../src/components/channel-icon/channel-icon.tsx","../src/components/checkbox/checkbox.tsx","../src/components/checkbox/checkbox-group.tsx","../src/components/color-input/color-input.tsx","../src/components/combobox/combobox.tsx","../src/lib/commands/parse-combo.ts","../src/lib/commands/protected-combos.ts","../src/lib/commands/platform.ts","../src/lib/commands/match-event.ts","../src/lib/commands/registry.ts","../src/lib/commands/use-command.ts","../src/lib/commands/discovery-store.ts","../src/components/kbd/kbd.tsx","../src/components/command/command-hint.tsx","../src/components/command/command.tsx","../src/lib/commands/use-escape-key.ts","../src/components/conversation-brief-card/conversation-brief-card.tsx","../src/components/select/select.tsx","../src/components/conversation-brief-card/types.ts","../src/components/conversation-brief-card/conversation-brief-preview.tsx","../src/components/modal/modal.tsx","../src/components/conversation-brief-card/conversation-brief-review.tsx","../src/components/conversation-brief-card/create-conversation-brief-client.ts","../src/components/currency-input/currency-input.tsx","../src/components/data-table/cells.tsx","../src/components/table/table.tsx","../src/components/data-table/states/data-table-empty.tsx","../src/components/data-table/states/data-table-error.tsx","../src/components/data-table/states/data-table-skeleton.tsx","../src/components/data-table/use-infinite-scroll-sentinel.ts","../src/components/data-table/data-table.tsx","../src/components/data-table/make-actions-column.ts","../src/components/date-picker/calendar-internals.tsx","../src/components/date-picker/date-picker.tsx","../src/components/date-time-picker/date-time-picker.tsx","../src/components/draft-message-card/draft-message-card.tsx","../src/components/draft-message-composer/create-draft-message-client.ts","../src/components/draft-message-composer/draft-message-actions-store.ts","../src/components/multi-select/multi-select.tsx","../src/components/recipient-select/recipient-select.tsx","../src/components/message-composer/message-composer.tsx","../src/components/draft-message-composer/draft-message-outcome-store.ts","../src/components/draft-message-composer/draft-status.ts","../src/components/draft-message-composer/draft-message-composer.tsx","../src/components/draft-message-card/draft-message-review.tsx","../src/components/empty-state/empty-state.tsx","../src/components/error-animation/error-animation.tsx","../src/components/file-viewer/fallback-card.tsx","../src/components/image-lightbox/image-lightbox.tsx","../src/components/file-viewer/image-view.tsx","../src/components/file-viewer/video-view.tsx","../src/components/file-viewer/file-viewer.tsx","../src/components/image-attachment/image-attachment.tsx","../src/components/image-attachment/is-previewable-image-name.ts","../src/components/input/input.tsx","../src/components/menu/menu.tsx","../src/components/nav/nav.tsx","../src/components/orb/orb.tsx","../src/components/progress-bar/progress-bar.tsx","../src/components/radio-group/radio-group.tsx","../src/components/record-filter/attribute-picker.tsx","../src/components/record-filter/field-label.ts","../src/components/record-filter/operators.ts","../src/components/record-filter/chip-value.tsx","../src/components/segmented-control/segmented-control.tsx","../src/components/tag-input/tag-input.tsx","../src/components/record-filter/filter-value-input.tsx","../src/components/record-filter/operator-picker.tsx","../src/components/record-filter/filter-row.tsx","../src/components/record-filter/group-mutations.ts","../src/components/record-filter/group-add-controls.tsx","../src/components/record-filter/nested-group.tsx","../src/components/record-filter/group-body.tsx","../src/components/record-filter/record-filter-editor.tsx","../src/components/record-filter/record-filter-builder-panel.tsx","../src/components/record-filter/show-details-store.ts","../src/components/record-filter/record-filter-button.tsx","../src/components/record-filter/record-filter-chips.tsx","../src/components/separator/separator.tsx","../src/components/success-animation/success-animation.tsx","../src/components/switch/switch.tsx","../src/components/tabs/tabs.tsx","../src/components/textarea/textarea.tsx","../src/components/time-field/time-field.tsx","../src/components/toast/toast.tsx","../src/components/tooltip/tooltip.tsx"],"names":["jsx","AriaDialogTrigger","AriaPopover","cn","AriaDialog","tv","FileIcon","FileImage","FileText","FileSpreadsheet","FileArchive","jsxs","Loader2","DropZone","Paperclip","Text","FileTrigger","Button","X","Fragment","Heading","Type","Hash","Calendar","CircleDot","ToggleLeft","Brackets","Braces","Link2","User","UsersRound","Banknote","BookText","Contact","useState","icons","useRef","styles","matches","useMemo","Label","Shapes","Popover","Search","AriaInput","ListBox","ListBoxItem","register","useEffect","AriaBreadcrumbs","AriaBreadcrumb","AriaLink","cardStyles","AriaButton","Mail","MessageCircle","Linkedin","Send","Camera","MessagesSquare","AtSign","Mic","Video","AudioLines","Phone","AriaCheckbox","AriaCheckboxGroup","FieldError","TextField","Pipette","AriaComboBox","AriaComboButton","useContext","ComboBoxStateContext","useSyncExternalStore","listenerInstalled","onWindowKeyDown","ensureListener","AriaSelect","AriaSelectButton","SelectValue","Pencil","AriaModalOverlay","AriaModal","useCallback","onBlur","formatAmount","emit","parseAmount","AriaSelectTrigger","ChevronDown","combine","draggable","dropTargetForElements","attachClosestEdge","extractClosestEdge","GripVertical","Skeleton","useReactTable","getCoreRowModel","useLayoutEffect","useVirtualizer","monitorForElements","closestEdge","reorderWithEdge","flexRender","ariaLabel","AriaDateTrigger","CalendarGrid","CalendarGridHeader","CalendarHeaderCell","CalendarGridBody","CalendarCell","AriaDatePicker","Group","DateInput","DateSegment","Dialog","DatePickerStateContext","AriaTimeField","listeners","onKeyDown","SendHorizontal","listenersByMessageId","CircleX","Download","lazy","Suspense","AriaMenuTrigger","AriaSubmenuTrigger","AriaMenu","AriaMenuItem","ChevronRight","createContext","Disclosure","DisclosurePanel","ThinkingOrb","AriaProgressBar","AriaRadioGroup","AriaRadio","useId","parseDate","setJoiner","Chip","AriaSeparator","CircleCheck","AriaSwitch","AriaTabs","AriaTabList","AriaTab","AriaTabPanel","AriaTextArea","AriaToastQueue","Info","CircleAlert","AriaToastRegion","AriaToast","AriaToastContent","AriaText","XLucide","AriaTooltipTrigger","AriaTooltip"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ReactNode, RefObject } from 'react'\nimport {\n Dialog as AriaDialog,\n type DialogProps as AriaDialogProps,\n DialogTrigger as AriaDialogTrigger,\n type DialogTriggerProps as AriaDialogTriggerProps,\n Popover as AriaPopover,\n type PopoverProps as AriaPopoverProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Popover — generic anchored panel. Two usage modes:\n\n 1. DialogTrigger mode (simplest, for Button-driven popovers):\n <Popover>\n <Button>Open</Button> // first child = trigger\n <PopoverContent>…panel…</PopoverContent>\n </Popover>\n\n 2. Controlled mode (for non-Button triggers, e.g. clickable chips):\n const ref = useRef<HTMLSpanElement>(null)\n const [open, setOpen] = useState(false)\n …\n <span ref={ref} onClick={…}>chip</span>\n <PopoverContent\n triggerRef={ref}\n isOpen={open}\n onOpenChange={setOpen}\n >…panel…</PopoverContent>\n\n Internally wraps RAC `Popover` + `Dialog` so focus management, outside-\n click, and Escape are handled correctly.\n ========================================================================= */\n\nexport function Popover(props: AriaDialogTriggerProps) {\n return <AriaDialogTrigger {...props} />\n}\n\nexport type PopoverContentProps = Omit<AriaPopoverProps, 'children'> & {\n /** Dialog children. Supports the render-prop form `({ close }) => …`. */\n children: AriaDialogProps['children']\n /** Visual override for the floating panel. */\n panelClassName?: string\n /** When in controlled mode, the element the popover should anchor to. */\n triggerRef?: RefObject<Element | null>\n}\n\nexport function PopoverContent({\n children,\n className,\n panelClassName,\n offset = 6,\n placement = 'bottom start',\n ...props\n}: PopoverContentProps) {\n return (\n <AriaPopover\n offset={offset}\n placement={placement}\n {...props}\n className={(renderProps) =>\n cn(\n 'rounded-md border border-rule bg-surface',\n 'shadow-[var(--shadow-float)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n panelClassName,\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <AriaDialog className=\"outline-none\">{children}</AriaDialog>\n </AriaPopover>\n )\n}\n\n/* =========================================================================\n PopoverPanelHeader / PopoverPanelBody / PopoverPanelFooter — slot\n primitives mirroring Modal's split. Consumers compose these to keep\n padding consistent across popovers.\n ========================================================================= */\n\nexport function PopoverPanelHeader({\n className,\n children,\n}: {\n className?: string\n children?: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'flex items-center justify-between gap-2',\n 'px-3.5 py-2.5 border-b border-rule',\n className,\n )}\n >\n {children}\n </div>\n )\n}\n\nexport function PopoverPanelBody({\n className,\n children,\n}: {\n className?: string\n children?: ReactNode\n}) {\n return <div className={cn('p-2', className)}>{children}</div>\n}\n\nexport function PopoverPanelFooter({\n className,\n children,\n}: {\n className?: string\n children?: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'flex items-center justify-between gap-2',\n 'px-3.5 py-2.5 border-t border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n 'rounded-b-md',\n className,\n )}\n >\n {children}\n </div>\n )\n}\n","import {\n File as FileIcon,\n FileArchive,\n FileImage,\n FileSpreadsheet,\n FileText,\n Loader2,\n Paperclip,\n X,\n} from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport type { ComponentProps } from 'react'\nimport { DropZone, FileTrigger, Heading, Text } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button'\nimport {\n PopoverContent,\n PopoverPanelBody,\n PopoverPanelFooter,\n PopoverPanelHeader,\n Popover,\n} from '../popover'\n\n/* =========================================================================\n FileField — presentational control for a single-file attachment.\n\n Pure presentation: it knows nothing about the storage-service. The\n consumer wires uploads/downloads/deletes through the callbacks. Two\n states:\n\n - empty → a click-to-pick control that doubles as a drop zone\n (highlights on drag-over). Picking or dropping a file\n calls `onSelectFile`.\n - filled → a card showing a file-type icon, the name (clicking the\n card calls `onDownload`), and below it the size + an (x)\n that opens a confirm popover before calling `onDelete`.\n\n One file per field — selecting a new file replaces the current one.\n ========================================================================= */\n\nexport interface FileFieldValue {\n /** Filename shown as the label. */\n name: string\n /** Size in bytes — rendered when known (resolved from storage on read). */\n sizeInBytes?: number\n /** MIME type — picks the file-type icon when known. */\n contentType?: string\n}\n\nexport interface FileFieldProps {\n /** The attached file, or null/undefined when empty. */\n value?: FileFieldValue | null\n /** True while an upload is in flight — shows a spinner, blocks re-pick. */\n isUploading?: boolean\n /** Read-only: no picker, no delete — download still works. */\n isReadOnly?: boolean\n /** Restrict the native picker (e.g. `['image/*', '.pdf']`). */\n acceptedFileTypes?: string[]\n /** Called with the picked/dropped File. */\n onSelectFile?: (file: File) => void\n /** Called when the filled card is clicked. */\n onDownload?: () => void\n /** Called after the user confirms removal in the (x) popover. */\n onDelete?: () => void\n /** Inline validation message (edit surface). */\n errorMessage?: string\n /** True iff the field is touched and currently invalid. */\n isInvalid?: boolean\n className?: string\n}\n\nconst dropZoneStyles = tv({\n base: [\n 'flex items-center justify-center gap-2 rounded-md border border-dashed border-rule',\n 'bg-surface-2/40 px-3 py-4 text-ink-3 transition-colors duration-150 outline-none',\n 'data-[drop-target]:border-ink-4 data-[drop-target]:bg-surface-2 data-[drop-target]:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n ],\n variants: {\n isInvalid: { true: 'border-danger' },\n },\n})\n\nconst cardStyles = tv({\n base: [\n 'group relative flex w-full items-start gap-3 rounded-md border border-rule bg-surface px-3 py-2.5',\n 'text-left transition-colors duration-150',\n ],\n variants: {\n isClickable: {\n true: 'cursor-pointer hover:border-ink-4 hover:bg-surface-2 outline-none focus-visible:shadow-[var(--shadow-focus)]',\n false: 'cursor-default',\n },\n },\n})\n\n/** Maps a MIME type to a file-type glyph. Falls back to a generic file. */\nexport function iconForContentType(contentType?: string): LucideIcon {\n if (!contentType) return FileIcon\n if (contentType.startsWith('image/')) return FileImage\n if (contentType === 'application/pdf') return FileText\n if (contentType.startsWith('text/')) return FileText\n if (\n contentType.includes('spreadsheet') ||\n contentType.includes('excel') ||\n contentType === 'text/csv'\n ) {\n return FileSpreadsheet\n }\n if (\n contentType.includes('zip') ||\n contentType.includes('tar') ||\n contentType.includes('compressed') ||\n contentType.includes('archive')\n ) {\n return FileArchive\n }\n return FileIcon\n}\n\n/** Human-readable byte size (1 KB = 1024 B). */\nexport function formatFileSize(bytes: number | undefined): string {\n if (bytes == null || !Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let size = bytes / 1024\n let unit = 0\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024\n unit += 1\n }\n return `${size < 10 ? size.toFixed(1) : Math.round(size)} ${units[unit]}`\n}\n\nexport function FileField({\n value,\n isUploading = false,\n isReadOnly = false,\n acceptedFileTypes,\n onSelectFile,\n onDownload,\n onDelete,\n errorMessage,\n isInvalid = false,\n className,\n}: FileFieldProps) {\n const handleSelect = (files: FileList | null) => {\n const file = files?.item(0)\n if (file) onSelectFile?.(file)\n }\n\n const handleDrop: NonNullable<ComponentProps<typeof DropZone>['onDrop']> = async (event) => {\n const item = event.items.find((candidate) => candidate.kind === 'file')\n if (item && item.kind === 'file') {\n onSelectFile?.(await item.getFile())\n }\n }\n\n // ---- Empty state -------------------------------------------------------\n if (!value) {\n if (isReadOnly) {\n return <span className={cn('text-ink-4', className)}>—</span>\n }\n\n if (isUploading) {\n return (\n <div className={cn(dropZoneStyles({ isInvalid }), className)}>\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n <span className=\"font-sans text-[12.5px]\">Uploading…</span>\n </div>\n )\n }\n\n return (\n <div className={className}>\n <DropZone\n aria-label=\"Drop a file to upload\"\n onDrop={handleDrop}\n className={dropZoneStyles({ isInvalid })}\n >\n <Paperclip className=\"size-3.5 shrink-0\" aria-hidden />\n <Text slot=\"label\" className=\"font-sans text-[12.5px]\">\n Drop a file here, or\n </Text>\n <FileTrigger\n onSelect={handleSelect}\n {...(acceptedFileTypes ? { acceptedFileTypes } : {})}\n >\n <Button variant=\"ghost\" size=\"sm\">\n Browse\n </Button>\n </FileTrigger>\n </DropZone>\n {isInvalid && errorMessage ? (\n <p className=\"mt-1 font-sans text-[11.5px] text-danger\">{errorMessage}</p>\n ) : null}\n </div>\n )\n }\n\n // ---- Filled state ------------------------------------------------------\n const Icon = isUploading ? Loader2 : iconForContentType(value.contentType)\n const isClickable = Boolean(onDownload) && !isUploading\n\n return (\n <div className={className}>\n <div className={cardStyles({ isClickable })}>\n {/* Download surface — the icon + name + size. A button so the whole\n card is one click target; the (x) is a sibling, never nested. */}\n <Button\n variant=\"subtle\"\n // Reset button chrome — this is a borderless full-bleed click target.\n className=\"m-0 flex min-w-0 flex-1 items-start gap-3 border-0 bg-transparent p-0 text-left hover:bg-transparent\"\n isDisabled={!isClickable}\n {...(onDownload ? { onPress: onDownload } : {})}\n >\n <Icon\n className={cn('mt-0.5 size-5 shrink-0 text-ink-3', isUploading && 'animate-spin')}\n aria-hidden\n strokeWidth={1.6}\n />\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-sans text-[13px] text-ink\">{value.name}</span>\n <span className=\"font-sans text-[11.5px] text-ink-4\">\n {isUploading ? 'Uploading…' : formatFileSize(value.sizeInBytes)}\n </span>\n </span>\n </Button>\n\n {!isReadOnly && onDelete && !isUploading ? (\n <Popover>\n <Button\n aria-label=\"Remove file\"\n size=\"icon-sm\"\n variant=\"subtle\"\n className=\"shrink-0 text-ink-4 hover:text-danger\"\n >\n <X className=\"size-3.5\" />\n </Button>\n <PopoverContent placement=\"top end\" panelClassName=\"w-[260px]\">\n {({ close }) => (\n <>\n <PopoverPanelHeader>\n <Heading\n slot=\"title\"\n className=\"m-0 font-sans text-[12.5px] font-medium text-ink\"\n >\n Delete this file?\n </Heading>\n </PopoverPanelHeader>\n <PopoverPanelBody className=\"px-3.5 py-3\">\n <p className=\"m-0 font-sans text-[12px] leading-snug text-ink-2\">\n This removes the attachment from this record.\n </p>\n </PopoverPanelBody>\n <PopoverPanelFooter>\n <Button variant=\"ghost\" size=\"sm\" onPress={close}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n className={cn('bg-danger border-danger', 'hover:bg-danger hover:border-danger')}\n onPress={() => {\n onDelete()\n close()\n }}\n >\n Delete\n </Button>\n </PopoverPanelFooter>\n </>\n )}\n </PopoverContent>\n </Popover>\n ) : null}\n </div>\n {isInvalid && errorMessage ? (\n <p className=\"mt-1 font-sans text-[11.5px] text-danger\">{errorMessage}</p>\n ) : null}\n </div>\n )\n}\n","import { Loader2 } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { formatFileSize, iconForContentType } from '../file-field'\n\n/* =========================================================================\n AttachmentChip — a small file token for chat composers and message\n bubbles. A file-type icon (or a spinner while uploading), a truncated\n name, the size (or upload state), and an optional (x) to remove. Pure\n presentation: the consumer owns upload / remove / download.\n ========================================================================= */\n\nexport const attachmentChipStyles = tv({\n base: [\n 'inline-flex items-center gap-1.5 max-w-[220px]',\n 'pl-2 pr-1 py-1 rounded-[6px] border',\n 'font-sans text-[12.5px] leading-none',\n ],\n variants: {\n status: {\n uploading: 'bg-surface-2 border-rule text-ink-3',\n ready: 'bg-surface-2 border-rule text-ink',\n error: 'bg-surface-2 border-danger text-danger',\n },\n isInteractive: {\n true: 'cursor-pointer hover:bg-surface-3',\n false: '',\n },\n },\n defaultVariants: { status: 'ready', isInteractive: false },\n})\n\nexport type AttachmentChipVariants = VariantProps<typeof attachmentChipStyles>\n\nexport interface AttachmentChipProps {\n /** File name shown (truncated). */\n name: string\n /** Size in bytes — rendered when known and the chip is in the `ready` state. */\n sizeInBytes?: number\n /** MIME type — picks the leading file-type icon. */\n contentType?: string\n /** Upload lifecycle: spinner while `uploading`, danger styling on `error`. */\n status?: 'uploading' | 'ready' | 'error'\n /** Tooltip text and the meta line shown in the `error` state (the failure reason). */\n errorMessage?: string\n /** When set, an (x) button is shown that calls this. */\n onRemove?: () => void\n /** When set, the chip body is pressable (e.g. to download an agent file). */\n onPress?: () => void\n className?: string\n}\n\nexport function AttachmentChip({\n name,\n sizeInBytes,\n contentType,\n status = 'ready',\n errorMessage,\n onRemove,\n onPress,\n className,\n}: AttachmentChipProps) {\n const Icon = status === 'uploading' ? Loader2 : iconForContentType(contentType)\n const meta =\n status === 'error'\n ? (errorMessage ?? 'Failed')\n : status === 'uploading'\n ? 'Uploading…'\n : formatFileSize(sizeInBytes)\n\n const body: ReactNode = (\n <>\n <Icon\n className={cn('size-3.5 shrink-0 text-ink-3', status === 'uploading' && 'animate-spin')}\n aria-hidden\n />\n <span className=\"min-w-0 truncate\">{name}</span>\n {meta ? (\n <span className={cn('shrink-0', status !== 'error' && 'text-ink-4')}>{meta}</span>\n ) : null}\n </>\n )\n\n return (\n <span\n className={cn(attachmentChipStyles({ status, isInteractive: Boolean(onPress) }), className)}\n title={errorMessage ?? name}\n >\n {onPress ? (\n <button\n type=\"button\"\n onClick={onPress}\n className=\"inline-flex min-w-0 cursor-pointer items-center gap-1.5 outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n {body}\n </button>\n ) : (\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">{body}</span>\n )}\n {onRemove ? (\n <button\n type=\"button\"\n aria-label={`Remove ${name}`}\n onClick={(event) => {\n event.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center',\n 'size-4 rounded-[3px]',\n 'cursor-pointer text-ink-3 hover:bg-surface-3 hover:text-ink',\n 'outline-none focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </span>\n )\n}\n","import {\n Banknote,\n BookText,\n Braces,\n Brackets,\n Calendar,\n CircleDot,\n Contact,\n Hash,\n Link2,\n type LucideIcon,\n type LucideProps,\n Paperclip,\n ToggleLeft,\n Type,\n User,\n UsersRound,\n} from 'lucide-react'\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n AttributeTypeIcon — one lucide-react glyph per attribute type. Generic\n over the lib so any attribute-aware UI (filter chips, attribute pickers,\n schema editors, table headers, etc.) can render a consistent icon for\n the same type without re-inventing the mapping.\n\n Four exports:\n\n - `AttributeType` — the canonical union of attribute-type\n literals.\n - `ATTRIBUTE_TYPE_ICONS` — `Record<AttributeType, LucideIcon>` for\n direct lookups (e.g. when a consumer wants\n the icon component itself, not a rendered\n element).\n - `useAttributeTypeIcon` — hook returning the matching `LucideIcon`.\n Useful when you need to compose the icon\n into a different layout (sized via\n parent's prop, wrapped in a button, etc.).\n - `AttributeTypeIcon` — convenience component with sane defaults\n (`size-3.5`, `aria-hidden`,\n `currentColor`).\n\n Mapping\n string → Type (\"Aa\" lowercase/uppercase glyph)\n number → Hash (\"#\")\n integer → Hash (same — they're conceptually one bucket)\n datetime → Calendar\n enum → CircleDot (filled-center radio metaphor)\n boolean → ToggleLeft (toggle switch)\n array → Brackets (\"[ ]\")\n object → Braces (\"{ }\")\n relation → Link2 (chain link — foreign-key reference)\n user → User (person glyph — platform-user reference)\n principal → UsersRound (a party that can HOLD ACCESS — user, team or org;\n a group glyph, distinct from `user`'s single person)\n currency → Banknote (money — amount + currency_code)\n knowledge-text → BookText (long text stored as a knowledge node)\n file → Paperclip (attachment — stored-file reference)\n contact-address → Contact (one canonical reachable address — email /\n phone / LinkedIn — binding the record to a\n conversation contact)\n ========================================================================= */\n\n/**\n * Attribute-type values the design system knows how to render. Exported as a\n * value (an enum-like const object) so consumers can both reference a single\n * member by name (`AttributeType.String`) and iterate the full set\n * (`Object.values(AttributeType)`) without re-declaring the list. The\n * matching type — derived from this same object — keeps the union and the\n * runtime list in lockstep: adding a member here surfaces it in every\n * consumer (icon mapping, type picker, designer config) automatically.\n */\nexport const AttributeType = {\n String: 'string',\n Number: 'number',\n Integer: 'integer',\n Datetime: 'datetime',\n Enum: 'enum',\n Boolean: 'boolean',\n Array: 'array',\n Object: 'object',\n Relation: 'relation',\n User: 'user',\n Principal: 'principal',\n Currency: 'currency',\n KnowledgeText: 'knowledge-text',\n File: 'file',\n ContactAddress: 'contact-address',\n} as const\nexport type AttributeType = (typeof AttributeType)[keyof typeof AttributeType]\n\n/** Iteration order for type pickers, dropdowns, etc. */\nexport const ATTRIBUTE_TYPES: ReadonlyArray<AttributeType> = Object.values(AttributeType)\n\nexport const ATTRIBUTE_TYPE_ICONS: Record<AttributeType, LucideIcon> = {\n [AttributeType.String]: Type,\n [AttributeType.Number]: Hash,\n [AttributeType.Integer]: Hash,\n [AttributeType.Datetime]: Calendar,\n [AttributeType.Enum]: CircleDot,\n [AttributeType.Boolean]: ToggleLeft,\n [AttributeType.Array]: Brackets,\n [AttributeType.Object]: Braces,\n [AttributeType.Relation]: Link2,\n [AttributeType.User]: User,\n [AttributeType.Principal]: UsersRound,\n [AttributeType.Currency]: Banknote,\n [AttributeType.KnowledgeText]: BookText,\n [AttributeType.File]: Paperclip,\n [AttributeType.ContactAddress]: Contact,\n}\n\nexport function useAttributeTypeIcon(type: AttributeType): LucideIcon {\n return ATTRIBUTE_TYPE_ICONS[type]\n}\n\nexport type AttributeTypeIconProps = Omit<LucideProps, 'ref'> & {\n type: AttributeType\n}\n\nexport function AttributeTypeIcon({\n type,\n className,\n strokeWidth,\n ...props\n}: AttributeTypeIconProps) {\n const Icon = useAttributeTypeIcon(type)\n return (\n <Icon\n aria-hidden\n strokeWidth={strokeWidth ?? 1.6}\n className={cn('size-3.5', className)}\n {...props}\n />\n )\n}\n","import { type HTMLAttributes, useState } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Avatar — round, paper-tinted initials chip. Mono glyph, hairline border.\n Given a `src` it paints the image over the same chrome and falls back to\n the initials the moment the image fails to load (missing, forbidden,\n broken) — a person never renders as a blank circle.\n For square colored \"app tiles\" use the AppSwitcher's internal tile —\n Avatar is reserved for people.\n ========================================================================= */\n\nexport const avatarStyles = tv({\n base: [\n 'inline-grid place-items-center shrink-0 select-none overflow-hidden',\n 'rounded-full border',\n 'font-mono font-medium tracking-[-0.005em]',\n ],\n variants: {\n size: {\n sm: 'size-[22px] text-[10px]',\n md: 'size-7 text-[12px]',\n lg: 'size-9 text-[13px]',\n xl: 'size-[120px] text-[34px]',\n },\n tone: {\n paper: 'bg-surface-3 text-ink border-rule',\n indigo: 'bg-accent text-[#f0efe8] border-transparent',\n moss: 'bg-[#5b7052] text-[#f0efe8] border-transparent',\n terra: 'bg-[#8a5a3f] text-[#f0efe8] border-transparent',\n slate: 'bg-ink text-surface border-transparent',\n },\n },\n defaultVariants: { size: 'md', tone: 'paper' },\n})\n\nexport type AvatarVariants = VariantProps<typeof avatarStyles>\nexport type AvatarProps = HTMLAttributes<HTMLSpanElement> &\n AvatarVariants & {\n /** 1–2 character initials. Ignored if `children` is provided. */\n initials?: string\n /**\n * Image URL. Rendered over the chip; on load error the chip reverts to\n * `children ?? initials`. `null`/`undefined` = no image.\n */\n src?: string | null\n /** Alt text for the image. Defaults to empty — the avatar is decorative. */\n alt?: string\n }\n\nexport function Avatar({\n size,\n tone,\n initials,\n src,\n alt = '',\n className,\n children,\n ...props\n}: AvatarProps) {\n // The URL that failed, not a bare flag: a new src automatically gets a\n // fresh chance without an effect — the error belongs to the URL, not the\n // person.\n const [failedSrc, setFailedSrc] = useState<string | null>(null)\n const showsImage = Boolean(src) && failedSrc !== src\n\n return (\n <span {...props} className={cn(avatarStyles({ size, tone }), className)}>\n {showsImage ? (\n <img\n src={src ?? undefined}\n alt={alt}\n className=\"size-full object-cover\"\n onError={() => setFailedSrc(src ?? null)}\n />\n ) : (\n (children ?? initials)\n )}\n </span>\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Avatar, type AvatarVariants } from '../avatar/avatar'\n\n/* =========================================================================\n AvatarGroup — a stack of overlapping people avatars with a +N overflow\n chip. Used to render a conversation's roster: one avatar for a 1:1 thread,\n several overlapping for a group. Each avatar wears a bg-colored ring so the\n overlap reads as separate chips.\n ========================================================================= */\n\nexport const avatarGroupStyles = tv({\n base: 'flex items-center',\n variants: {\n size: {\n sm: '-space-x-1.5',\n md: '-space-x-2',\n lg: '-space-x-2.5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type AvatarGroupVariants = VariantProps<typeof avatarGroupStyles>\n\n/** One person in the stack — initials plus an optional tone and photo. */\nexport interface AvatarGroupItem {\n initials: string\n tone?: AvatarVariants['tone']\n /** Photo URL; falls back to `initials` when absent or failing to load. */\n src?: string | null\n alt?: string\n /** Stable key (e.g. the participant's external id); falls back to the index. */\n key?: string\n}\n\nexport type AvatarGroupProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> &\n AvatarGroupVariants & {\n avatars: AvatarGroupItem[]\n /** Max avatars shown before the rest collapse into a +N chip. Default 3. */\n max?: number\n }\n\nexport function AvatarGroup({\n avatars,\n max = 3,\n size = 'md',\n className,\n ...props\n}: AvatarGroupProps) {\n const shown = avatars.slice(0, max)\n const overflow = avatars.length - shown.length\n return (\n <span {...props} className={cn(avatarGroupStyles({ size }), className)}>\n {shown.map((avatar, index) => (\n <span key={avatar.key ?? index} className=\"rounded-full ring-[1.5px] ring-surface\">\n <Avatar\n size={size}\n tone={avatar.tone ?? 'paper'}\n initials={avatar.initials}\n src={avatar.src ?? null}\n alt={avatar.alt ?? ''}\n />\n </span>\n ))}\n {overflow > 0 && (\n <span className=\"rounded-full ring-[1.5px] ring-surface\">\n <Avatar size={size} tone=\"paper\" initials={`+${overflow}`} />\n </span>\n )}\n </span>\n )\n}\n","import { tv, type VariantProps } from 'tailwind-variants'\n\n/* =========================================================================\n Shared field chrome — one source of truth for the hairline box that wraps\n Input, SelectTrigger, ComboboxInput, DatePicker, BadgeMultiSelect, etc.\n\n Two slots:\n - `box` — border + radius + bg + shadow + hover/focus/invalid/disabled.\n The \"field-ness\" of the control. No padding, no font, no\n text-size, so it can sit on either a single-element control\n OR an outer wrapper of a compound control without dictating\n internal spacing.\n - `content` — font + leading + placeholder color + padding + text-size.\n The \"interior\" of the field. Applied to the box itself for\n single-element controls (Input, Textarea, Select trigger),\n or to the inner editable element of compound controls\n (Combobox <input>, DatePicker <DateInput>) so the box can\n host a flex layout with siblings (chevron, calendar\n trigger) sharing the border + focus ring.\n\n `size` is the only knob that defines what \"compact\" vs \"comfortable\" means\n for any field-like control in the library. Change it here, every consumer\n shifts in lockstep.\n ========================================================================= */\n\nexport const fieldControlStyles = tv({\n slots: {\n box: [\n 'w-full rounded-md border bg-surface text-ink',\n 'outline-none shadow-[var(--shadow-inset)]',\n 'transition-[border-color,box-shadow] duration-150',\n 'hover:border-ink-4',\n 'focus:border-accent focus:shadow-[var(--shadow-focus)]',\n // RAC forwards data-focused/data-hovered/data-invalid on its components.\n // Keep both CSS :focus and RAC data-* states covered.\n 'data-[hovered]:border-ink-4',\n 'data-[focused]:border-accent data-[focused]:shadow-[var(--shadow-focus)]',\n 'data-[invalid]:border-danger data-[invalid]:shadow-[var(--shadow-focus-danger)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n ],\n content: 'font-sans leading-snug placeholder:text-ink-4',\n },\n variants: {\n size: {\n sm: { content: 'px-2.5 py-1.5 text-[13px]' },\n md: { content: 'px-3.5 py-2.5 text-[15px]' },\n },\n invalid: {\n true: { box: 'border-danger shadow-[var(--shadow-focus-danger)]' },\n false: { box: 'border-rule-strong' },\n },\n /* `cell` — flat, spreadsheet-style chrome for inline table editing\n (LUM-35). Squares the corners to 2px and removes BOTH the resting\n inset shadow and the focus/invalid halo, leaving just a border that\n turns accent on focus / danger on invalid. Declared after `invalid`\n so its `shadow-none` wins the tailwind-merge order over the invalid\n variant's danger halo; the compoundVariant below is belt-and-braces. */\n appearance: {\n field: {},\n cell: {\n // Fixed 29px editor: sits under the 32px table row so the cell's\n // items-center leaves a hairline gap top/bottom and the border reads\n // fully instead of merging with the row gridline. Explicit height is\n // more deterministic than relying on line-height + padding math.\n // `py-1` keeps the content box (≈19px) above the ~18px text line so\n // nothing clips. Both win over `size`'s values via tailwind-merge\n // order (appearance is declared after size).\n box: 'h-[29px] rounded-[4px] shadow-none focus:shadow-none data-[focused]:shadow-none data-[invalid]:shadow-none',\n content: 'py-1',\n },\n },\n /* `hasFocusRing: false` — keep the full field chrome but drop the\n focus/invalid ring, for tight hosts whose overflow clip would cut it\n off (e.g. the editor-header title). The border still turns accent on\n focus / danger on invalid. Declared after `appearance` so its\n shadow-none wins the tailwind-merge order. */\n hasFocusRing: {\n true: {},\n false: {\n box: 'focus:shadow-none data-[focused]:shadow-none data-[invalid]:shadow-none',\n },\n },\n },\n compoundVariants: [\n { appearance: 'cell', invalid: true, class: { box: 'shadow-none' } },\n // invalid:true's RESTING danger ring — reduce back to the inset shadow.\n { hasFocusRing: false, invalid: true, class: { box: 'shadow-[var(--shadow-inset)]' } },\n ],\n defaultVariants: { size: 'md', invalid: false, appearance: 'field', hasFocusRing: true },\n})\n\nexport type FieldControlVariants = VariantProps<typeof fieldControlStyles>\nexport type FieldSize = NonNullable<FieldControlVariants['size']>\nexport type FieldAppearance = NonNullable<FieldControlVariants['appearance']>\n\n/* =========================================================================\n Per-size lookups — for parts of compound controls that need *just* the\n text-size or a coherent min-height (e.g. BadgeMultiSelect/MultiSelect's\n chip wrapper, where the box has its own padding for the chip layout but\n the placeholder line + overall height should still scale with `size`).\n ========================================================================= */\n\nexport const fieldTextStyles: Record<FieldSize, string> = {\n sm: 'text-[13px]',\n md: 'text-[15px]',\n}\n\nexport const fieldMinHeight: Record<FieldSize, string> = {\n sm: 'min-h-[32px]',\n md: 'min-h-[42px]',\n}\n\n/* =========================================================================\n Padding for chip-wrapper field controls (BadgeMultiSelect, MultiSelect,\n TagInput) — these don't use `content`'s padding because the box hosts a\n flex layout of chips. The padding still has to scale with `size` so the\n total rendered height (wrapper-pad + chip-height) lines up with a\n single-element field at the same size.\n ========================================================================= */\n\nexport const fieldChipPadding: Record<FieldSize, string> = {\n sm: 'p-1',\n md: 'p-1.5',\n}\n\n/* =========================================================================\n Label / hint / error text styles — applied to RAC's Label / Text / FieldError\n components inside each form control. Strings rather than components so the\n existing monolithic APIs can keep their inline composition.\n ========================================================================= */\n\nexport const fieldLabelStyles = 'font-mono text-[11px] uppercase tracking-[0.08em] text-ink-4'\n\nexport const fieldHintStyles = 'font-mono text-[11px] text-ink-4'\n\nexport const fieldErrorStyles = 'font-mono text-[11px] text-danger'\n\n/* =========================================================================\n FieldCaret — the small down-chevron used in Select and Combobox triggers.\n Decorative; consumer elements carry their own aria semantics.\n ========================================================================= */\n\nexport function FieldCaret() {\n return (\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5 shrink-0 text-ink-3\" fill=\"none\">\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { icons, Search, Shapes, X } from 'lucide-react'\nimport { type ReactNode, useMemo, useRef, useState } from 'react'\nimport { Input as AriaInput, Label, ListBox, ListBoxItem, Popover } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n IconPicker — a form field for choosing a Lucide icon by name.\n\n The value is the icon's canonical PascalCase export name (\"TrendingUp\"),\n which is what the platform stores wherever an icon rides config (menu\n items, connectors, knowledge spaces). The picker resolves loosely on the\n way IN — kebab-case and lowercase resolve too — but always emits the\n canonical name, so data written through it never needs the fallback path.\n\n Built from the org's own field primitives (same chrome as Select/Input)\n plus a RAC grid ListBox, so arrow keys move through the grid and\n selection/focus/ARIA come from RAC rather than hand-rolled handlers.\n\n The full set is ~1.5k icons; rendering every SVG into one popover is\n noticeably slow, so the grid caps what it draws and tells you it did —\n the search input is the intended way in, not scrolling.\n ========================================================================= */\n\n/** Canonical icon names — the keys of lucide's alias-free `icons` record. */\nexport type LucideIconName = keyof typeof icons\n\nconst ICON_NAMES = Object.keys(icons) as LucideIconName[]\n\n/** Lookup by squashed lowercase name, so \"trending-up\" / \"trendingup\" resolve. */\nconst BY_NORMALIZED = new Map<string, LucideIconName>(\n ICON_NAMES.map((name) => [normalize(name), name]),\n)\n\nfunction normalize(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]/g, '')\n}\n\n/**\n * Resolves a free-form icon name to its Lucide component, or null when it\n * matches nothing. Null (rather than a baked-in placeholder) so each caller\n * chooses its own fallback glyph.\n */\nexport function resolveLucideIcon(name: string | null | undefined): LucideIcon | null {\n const canonical = resolveLucideIconName(name)\n return canonical ? icons[canonical] : null\n}\n\n/** Same resolution, returning the canonical PascalCase name instead. */\nexport function resolveLucideIconName(name: string | null | undefined): LucideIconName | null {\n if (!name) return null\n return BY_NORMALIZED.get(normalize(name)) ?? null\n}\n\n/** Cells drawn per batch; scrolling near the bottom appends another batch. */\nconst GRID_PAGE = 120\n\nexport type IconPickerProps = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Trigger text while nothing is chosen. */\n placeholder?: string\n /** Canonical or loose Lucide icon name; null/'' mean \"no icon\". */\n value: string | null\n /** Fires with the canonical PascalCase name, or null when cleared. */\n onChange: (name: LucideIconName | null) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Offer a clear affordance once a value is set. Default true. */\n allowClear?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the trigger box. */\n appearance?: FieldAppearance\n /** Square, icon-only trigger (no name, no caret) for dense rows. The\n * popover is unchanged. Pair with `aria-label` when there's no `label`. */\n compact?: boolean\n /** Accessible name when no visible `label` is rendered. */\n 'aria-label'?: string\n className?: string\n}\n\n/** Compact trigger edge — matches the height of a single-line field at that size. */\nconst COMPACT_SIZE: Record<FieldSize, string> = {\n sm: 'size-8',\n md: 'size-[42px]',\n}\n\nexport function IconPicker({\n label,\n description,\n errorMessage,\n placeholder = 'Choose an icon…',\n value,\n onChange,\n isDisabled = false,\n isInvalid = false,\n allowClear = true,\n size = 'md',\n appearance,\n compact = false,\n 'aria-label': ariaLabel,\n className,\n}: IconPickerProps) {\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [limit, setLimit] = useState(GRID_PAGE)\n const triggerRef = useRef<HTMLButtonElement>(null)\n\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const selectedName = resolveLucideIconName(value)\n const SelectedIcon = selectedName ? icons[selectedName] : null\n\n const matches = useMemo(() => {\n const q = normalize(query)\n return q ? ICON_NAMES.filter((name) => normalize(name).includes(q)) : ICON_NAMES\n }, [query])\n const visible = matches.slice(0, limit)\n const hiddenCount = matches.length - visible.length\n\n const open = (next: boolean) => {\n setIsOpen(next)\n if (!next) {\n setQuery('')\n setLimit(GRID_PAGE)\n }\n }\n\n const search = (next: string) => {\n setQuery(next)\n // A new query is a new list; the old scroll depth means nothing for it.\n setLimit(GRID_PAGE)\n }\n\n const onGridScroll = (element: HTMLDivElement) => {\n if (hiddenCount === 0) return\n const remaining = element.scrollHeight - element.scrollTop - element.clientHeight\n if (remaining < 120) setLimit((current) => current + GRID_PAGE)\n }\n\n const pick = (name: LucideIconName | null) => {\n onChange(name)\n open(false)\n triggerRef.current?.focus()\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n {compact ? (\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : 'Icon')}\n title={selectedName ?? placeholder}\n disabled={isDisabled}\n onClick={() => open(!isOpen)}\n data-invalid={isInvalid || undefined}\n className={cn(\n styles.box(),\n 'flex shrink-0 items-center justify-center cursor-pointer',\n appearance === 'cell' ? 'size-[29px]' : COMPACT_SIZE[size],\n 'disabled:cursor-not-allowed disabled:opacity-45',\n )}\n >\n {SelectedIcon ? (\n <SelectedIcon aria-hidden className=\"size-4 text-ink-2\" />\n ) : (\n <Shapes aria-hidden className=\"size-4 text-ink-4\" />\n )}\n </button>\n ) : (\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : 'Icon')}\n disabled={isDisabled}\n onClick={() => open(!isOpen)}\n data-invalid={isInvalid || undefined}\n className={cn(\n // box carries no padding by contract — content is what gives a\n // single-element control its interior (padding, font, text-size).\n styles.box(),\n styles.content(),\n 'flex w-full items-center gap-2 text-left cursor-pointer',\n 'disabled:cursor-not-allowed disabled:opacity-45',\n )}\n >\n {SelectedIcon ? (\n <SelectedIcon aria-hidden className=\"size-4 shrink-0 text-ink-2\" />\n ) : null}\n <span className={cn('min-w-0 flex-1 truncate', selectedName ? 'text-ink' : 'text-ink-4')}>\n {selectedName ?? placeholder}\n </span>\n <FieldCaret />\n </button>\n )}\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n\n <Popover\n isOpen={isOpen}\n onOpenChange={open}\n triggerRef={triggerRef}\n offset={6}\n placement=\"bottom start\"\n className={cn(\n 'w-[316px] rounded-md border border-rule bg-surface p-2',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <div className=\"flex items-center gap-1.5 pb-2\">\n <div\n className={cn(\n fieldControlStyles({ size: 'sm' }).box(),\n 'flex min-w-0 flex-1 items-center gap-1.5 px-2.5 py-1.5',\n 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]',\n )}\n >\n <Search aria-hidden className=\"size-3.5 shrink-0 text-ink-4\" />\n {/* Bare RAC input rather than the Input field: this is popover\n furniture, not a form field — no label/description slots. */}\n <AriaInput\n autoFocus\n aria-label=\"Search icons\"\n value={query}\n onChange={(event) => search(event.target.value)}\n placeholder=\"Search icons…\"\n className={cn(\n 'min-w-0 flex-1 bg-transparent font-sans outline-none',\n 'text-ink placeholder:text-ink-4',\n fieldTextStyles.sm,\n )}\n />\n </div>\n {allowClear && selectedName ? (\n <button\n type=\"button\"\n onClick={() => pick(null)}\n className={cn(\n 'flex shrink-0 items-center gap-1 rounded-[6px] px-2 py-1.5 cursor-pointer',\n 'font-sans text-[12px] text-ink-3 transition-colors',\n 'hover:bg-surface-2 hover:text-ink',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]',\n )}\n >\n <X aria-hidden className=\"size-3\" />\n Clear\n </button>\n ) : null}\n </div>\n\n {/* The scroll container is a wrapper rather than the ListBox itself:\n the ListBox must keep its natural height so appended batches grow\n it and the scrollHeight arithmetic stays meaningful. */}\n <div\n className=\"max-h-64 overflow-y-auto\"\n onScroll={(event) => onGridScroll(event.currentTarget)}\n >\n <ListBox\n aria-label=\"Icons\"\n layout=\"grid\"\n selectionMode=\"single\"\n selectedKeys={selectedName ? new Set([selectedName]) : new Set()}\n onSelectionChange={(keys) => {\n if (keys === 'all') return\n const next = [...keys][0]\n // Re-picking the selected icon reports an empty set; keep the\n // value — clearing has its own button.\n if (next !== undefined) pick(next as LucideIconName)\n }}\n className=\"grid grid-cols-8 gap-0.5 outline-none\"\n renderEmptyState={() => (\n <div className={cn('col-span-8 px-2 py-3 text-center', fieldHintStyles)}>\n No icons match\n </div>\n )}\n >\n {visible.map((name) => {\n const Icon = icons[name]\n return (\n <ListBoxItem\n key={name}\n id={name}\n textValue={name}\n // The cell's only content is an aria-hidden svg, so the name\n // must be explicit — it is also what the picker's tests and\n // any consumer's tests select on.\n aria-label={name}\n className={cn(\n 'flex size-[34px] items-center justify-center rounded-[6px]',\n 'cursor-pointer outline-none',\n 'data-[hovered]:bg-surface-2 data-[focused]:bg-surface-2',\n 'data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--color-accent)]',\n 'data-[selected]:bg-[color-mix(in_oklab,var(--color-accent)_12%,var(--color-surface))]',\n 'data-[selected]:text-accent text-ink-2',\n )}\n >\n <Icon aria-hidden className=\"size-4\" />\n </ListBoxItem>\n )\n })}\n </ListBox>\n </div>\n\n {hiddenCount > 0 ? (\n <p className={cn('px-1 pt-2', fieldHintStyles)}>\n {hiddenCount.toLocaleString()} more — keep scrolling, or search.\n </p>\n ) : null}\n </Popover>\n </div>\n )\n}\n","import type { CSSProperties, HTMLAttributes } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { resolveLucideIcon } from '../icon-picker/icon-picker'\n\n/* =========================================================================\n Badge — mono status chip. Matches the Proteos spec's six registers:\n default, neutral, active (indigo), success, warning, danger.\n Paper-compatible fills — never pure-color.\n\n Chrome knobs, orthogonal to the register:\n - `shape` — `pill` (default, status badges) or `rounded` (9px corners,\n the enum-value chip on record pages, tables, pickers and filters).\n - `hasDot` — the leading dot. Default on; enum chips turn it off so a\n value without an icon reads as plain text on tint.\n\n Two data-driven escape hatches for schema-defined values (enum options,\n labels): `color` — a #rrggbb tint that drives the dot, border and fill\n via color-mix while the text stays ink so any user-picked color keeps\n its contrast in light/dark/paper; and `icon` — a Lucide name that\n replaces the dot (whatever `hasDot` says).\n ========================================================================= */\n\nexport const badgeStyles = tv({\n base: [\n 'inline-flex items-center gap-1.5',\n 'font-mono text-[11.5px] tracking-[-0.005em]',\n 'px-2.5 py-0.5 border',\n ],\n variants: {\n variant: {\n default: 'border-rule bg-surface text-ink-3 before:bg-ink-4',\n neutral: 'border-rule bg-surface-3 text-ink-2 before:bg-ink-3',\n active: [\n 'text-accent-ink before:bg-accent',\n 'border-[color-mix(in_oklab,var(--color-accent)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-accent)_14%,var(--color-surface))]',\n ],\n success: [\n 'text-success before:bg-success',\n 'border-[color-mix(in_oklab,var(--color-success)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-success)_12%,var(--color-surface))]',\n ],\n warning: [\n 'text-warning before:bg-warning',\n 'border-[color-mix(in_oklab,var(--color-warning)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-warning)_14%,var(--color-surface))]',\n ],\n danger: [\n 'text-danger before:bg-danger',\n 'border-[color-mix(in_oklab,var(--color-danger)_40%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-danger)_12%,var(--color-surface))]',\n ],\n // Driven by the `--badge-color` custom property (set from the `color`\n // prop). Chrome only — text stays ink so contrast never depends on the\n // picked color.\n custom: [\n 'text-ink-2 before:bg-[var(--badge-color)]',\n 'border-[color-mix(in_oklab,var(--badge-color)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--badge-color)_12%,var(--color-surface))]',\n ],\n },\n shape: {\n pill: 'rounded-pill',\n rounded: 'rounded-chip',\n },\n // Leading dot — its color comes from the register's `before:bg-*`.\n hasDot: {\n true: 'before:content-[\"\"] before:block before:size-1.5 before:rounded-full',\n false: '',\n },\n },\n defaultVariants: { variant: 'default', shape: 'pill', hasDot: true },\n})\n\nexport type BadgeVariants = VariantProps<typeof badgeStyles>\nexport type BadgeProps = HTMLAttributes<HTMLSpanElement> &\n BadgeVariants & {\n /** `#rrggbb` tint. When set it overrides `variant` with the `custom` register. */\n color?: string\n /** Lucide icon name (any casing). Replaces the leading dot; unknown names keep the dot. */\n icon?: string\n }\n\n/** Icon tone per register — mirrors each variant's `before:bg-*` dot color. */\nconst ICON_TONE: Record<NonNullable<BadgeVariants['variant']>, string> = {\n default: 'text-ink-4',\n neutral: 'text-ink-3',\n active: 'text-accent',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n custom: 'text-[var(--badge-color)]',\n}\n\nexport function Badge({\n variant,\n shape,\n hasDot,\n color,\n icon,\n className,\n style,\n children,\n ...props\n}: BadgeProps) {\n const Icon = icon ? resolveLucideIcon(icon) : null\n const register: NonNullable<BadgeVariants['variant']> = color ? 'custom' : (variant ?? 'default')\n const mergedStyle = color ? ({ ...style, '--badge-color': color } as CSSProperties) : style\n // The register's `before:bg-*` classes alone materialize an empty ::before\n // (Tailwind injects `content` for every `before:` utility), which as a flex\n // child still eats one `gap`. Hide it whenever no dot should show.\n const showDot = hasDot !== false && !Icon\n return (\n <span\n {...props}\n style={mergedStyle}\n className={cn(\n badgeStyles({ variant: register, shape, hasDot }),\n showDot ? null : 'before:hidden',\n className,\n )}\n >\n {Icon ? <Icon aria-hidden className={cn('size-3 shrink-0', ICON_TONE[register])} /> : null}\n {children}\n </span>\n )\n}\n","import { type KeyboardEvent, type ReactNode, useEffect, useRef, useState } from 'react'\nimport { type Key, Label, ListBox, ListBoxItem, Popover } from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport { Badge, type BadgeVariants } from '../badge/badge'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldChipPadding,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldMinHeight,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n BadgeMultiSelect — a MultiSelect specialized for picking status-like\n values. Each option is a <Badge/> — both in the dropdown and as the\n selected pill. The × remove button lives INSIDE each selected badge\n (no extra chip chrome), so the color coding from the Badge variant is\n what you see, cleanly.\n ========================================================================= */\n\nexport type BadgeMultiSelectOption<T extends Key = Key> = {\n id: T\n /** Text shown inside the badge. Used as the accessible name too. */\n label: string\n /** Badge color register. Defaults to `default`. */\n variant?: BadgeVariants['variant']\n /** Badge corner shape. Defaults to `pill`; enum chips use `rounded`. */\n shape?: BadgeVariants['shape']\n /** Leading dot. Defaults to on; enum chips turn it off. */\n hasDot?: boolean\n /** `#rrggbb` tint — overrides `variant` (see Badge). */\n color?: string\n /** Lucide icon name; replaces the badge dot. */\n icon?: string\n isDisabled?: boolean\n}\n\ntype BadgeChrome = {\n variant?: BadgeVariants['variant'] | undefined\n shape?: BadgeVariants['shape'] | undefined\n hasDot?: boolean | undefined\n color?: string | undefined\n icon?: string | undefined\n}\n\n/** The Badge chrome props an option carries — spread onto every Badge it renders as. */\nfunction badgeChrome(option: BadgeChrome) {\n return {\n ...(option.variant ? { variant: option.variant } : {}),\n ...(option.shape ? { shape: option.shape } : {}),\n ...(option.hasDot !== undefined ? { hasDot: option.hasDot } : {}),\n ...(option.color ? { color: option.color } : {}),\n ...(option.icon ? { icon: option.icon } : {}),\n }\n}\n\nexport type BadgeMultiSelectProps<T extends Key = Key> = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<BadgeMultiSelectOption<T>>\n /** Controlled selection. Pass a `Set<T>` or any `Iterable<T>`. */\n selectedKeys: Iterable<T>\n onSelectionChange: (keys: Set<T>) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Hide already-selected options from the dropdown. Removal then only\n * happens via the chip × in the trigger. Default `false` (selected\n * options stay visible and can be toggled from the listbox). */\n hideSelectedOptions?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Focus the trigger on mount. Mirrors RAC's `autoFocus` prop on native\n * inputs; useful for keyboard chains where the trigger should take focus\n * when its surrounding context becomes ready. */\n autoFocus?: boolean\n className?: string\n}\n\nexport function BadgeMultiSelect<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Select…',\n options,\n selectedKeys,\n onSelectionChange,\n isDisabled = false,\n isInvalid = false,\n hideSelectedOptions = false,\n size = 'md',\n appearance,\n autoFocus = false,\n className,\n}: BadgeMultiSelectProps<T>) {\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n const minHeight = appearance === 'cell' ? 'min-h-[29px]' : fieldMinHeight[size]\n const [isOpen, setIsOpen] = useState(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (autoFocus) triggerRef.current?.focus()\n // mount-only — autoFocus is a one-shot signal, not sustained.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const selectedSet = new Set(selectedKeys)\n const selectedOptions = options.filter((o) => selectedSet.has(o.id))\n const listboxOptions = hideSelectedOptions\n ? options.filter((o) => !selectedSet.has(o.id))\n : options\n\n const remove = (id: T) => {\n const next = new Set(selectedSet)\n next.delete(id)\n onSelectionChange(next)\n }\n\n const onTriggerKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isDisabled) return\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n setIsOpen(true)\n }\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n ref={triggerRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled={isDisabled || undefined}\n aria-invalid={isInvalid || undefined}\n tabIndex={isDisabled ? -1 : 0}\n onClick={() => !isDisabled && setIsOpen((v) => !v)}\n onKeyDown={onTriggerKeyDown}\n data-invalid={isInvalid || undefined}\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex flex-wrap items-center gap-1.5 cursor-pointer',\n minHeight,\n fieldChipPadding[size],\n 'pr-2',\n focusWithin,\n )}\n >\n {selectedOptions.length === 0 ? (\n // No vertical padding — wrapper's p-1.5 + min-h-[size] govern the\n // overall height so it matches the Input/Select trigger at the same\n // size.\n <span className={cn('text-ink-4 font-sans px-1', fieldTextStyles[size])}>\n {placeholder}\n </span>\n ) : (\n selectedOptions.map((o) => (\n <RemovableBadge\n key={o.id}\n {...badgeChrome(o)}\n onRemove={() => remove(o.id)}\n isDisabled={isDisabled}\n >\n {o.label}\n </RemovableBadge>\n ))\n )}\n <span className=\"ml-auto pr-1\">\n <FieldCaret />\n </span>\n </div>\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n\n <Popover\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n triggerRef={triggerRef}\n offset={6}\n placement=\"bottom start\"\n className={cn(\n 'w-[var(--trigger-width)]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <ListBox\n aria-label={typeof label === 'string' ? label : 'Options'}\n selectionMode=\"multiple\"\n selectedKeys={selectedSet}\n onSelectionChange={(keys) => {\n if (keys === 'all') {\n onSelectionChange(new Set(options.map((o) => o.id)))\n return\n }\n onSelectionChange(keys as Set<T>)\n }}\n className=\"outline-none max-h-72 overflow-auto\"\n renderEmptyState={() => (\n <div className={cn('px-3 py-2', fieldHintStyles)}>All options selected</div>\n )}\n >\n {listboxOptions.map((option) => (\n <ListBoxItem\n key={option.id}\n id={option.id}\n textValue={option.label}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n className={cn(\n 'group flex items-center',\n 'rounded-[6px] px-3 py-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2',\n 'data-[focused]:bg-surface-2',\n 'data-[selected]:bg-surface-3',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <Badge {...badgeChrome(option)}>{option.label}</Badge>\n </ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </div>\n )\n}\n\n/* =========================================================================\n Internal: a Badge with a trailing × button baked into the pill.\n The × inherits the badge's text color via `currentColor`, so it reads\n correctly against every variant's fill.\n ========================================================================= */\n\nfunction RemovableBadge({\n children,\n onRemove,\n isDisabled,\n ...chrome\n}: BadgeChrome & {\n children: ReactNode\n onRemove: () => void\n isDisabled: boolean\n}) {\n return (\n <Badge {...badgeChrome(chrome)}>\n <span>{children}</span>\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex items-center justify-center shrink-0',\n 'size-3.5 rounded-full',\n 'text-current/70 hover:text-current hover:bg-current/10',\n 'outline-none cursor-pointer',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed',\n // Pull the button flush with the right edge so the pill still feels\n // symmetric around the leading dot.\n '-mr-1',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </Badge>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Breadcrumb as AriaBreadcrumb,\n Breadcrumbs as AriaBreadcrumbs,\n type BreadcrumbsProps as AriaBreadcrumbsProps,\n Link as AriaLink,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Breadcrumbs — RAC Breadcrumbs/Breadcrumb under the hood. Last item is\n rendered as a non-link span with `aria-current=\"page\"`; everything before\n it is a RAC Link with hover + focus-visible chrome.\n ========================================================================= */\n\nexport type BreadcrumbItem = {\n /** Stable key for the row. */\n id: string | number\n /** Display label. */\n label: ReactNode\n /** Optional href. Omit (or leave the last item without one) to render the\n * current page as plain text. */\n href?: string\n}\n\nexport type BreadcrumbsProps = Omit<AriaBreadcrumbsProps<never>, 'children' | 'items'> & {\n items: ReadonlyArray<BreadcrumbItem>\n /** Glyph between crumbs. Default `/`. */\n separator?: ReactNode\n}\n\nexport function Breadcrumbs({ items, separator = '/', className, ...props }: BreadcrumbsProps) {\n return (\n <AriaBreadcrumbs\n {...props}\n className={cn(\n 'flex items-center gap-2',\n 'font-mono text-[12px] text-ink-3',\n // RAC renders Breadcrumbs as <ol> — neutralise list defaults.\n 'list-none m-0 p-0',\n className,\n )}\n >\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n return (\n <AriaBreadcrumb\n key={item.id}\n className=\"flex items-center gap-2\"\n // The last crumb is the current page. Hides the trailing\n // separator and skips the link affordance.\n data-current={isLast || undefined}\n >\n {item.href !== undefined && !isLast ? (\n <AriaLink\n href={item.href}\n className={cn(\n 'rounded-sm outline-none cursor-pointer',\n 'transition-colors duration-150',\n 'hover:text-ink',\n 'data-[hovered]:text-ink',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n {item.label}\n </AriaLink>\n ) : (\n <span\n className={cn(isLast && 'text-ink font-semibold')}\n aria-current={isLast ? 'page' : undefined}\n >\n {item.label}\n </span>\n )}\n {!isLast ? (\n <span aria-hidden className=\"text-ink-4 select-none\">\n {separator}\n </span>\n ) : null}\n </AriaBreadcrumb>\n )\n })}\n </AriaBreadcrumbs>\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Card — chrome-only shell.\n Padding lives on the slot components (<CardHeader/>, <CardContent/>,\n <CardFooter/>), never on Card itself. Variants control cosmetics only —\n border tint, shadow depth — so slot composition and variant are orthogonal.\n ========================================================================= */\n\nexport const cardStyles = tv({\n base: [\n 'flex flex-col overflow-hidden',\n 'border border-rule bg-surface rounded-lg',\n 'shadow-[var(--shadow-rest)]',\n 'text-[14px] text-ink-2',\n ],\n variants: {\n variant: {\n default: '',\n accent: [\n 'text-accent-ink',\n 'border-[color-mix(in_oklab,var(--color-accent)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-accent)_6%,var(--color-surface))]',\n ],\n outline: 'shadow-none',\n raised: 'shadow-[var(--shadow-raised)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport type CardVariants = VariantProps<typeof cardStyles>\nexport type CardProps = HTMLAttributes<HTMLDivElement> & CardVariants\n\nexport function Card({ variant, className, ...props }: CardProps) {\n return <div {...props} className={cn(cardStyles({ variant }), className)} />\n}\n\n/* =========================================================================\n PressableCard — same chrome + variants, rendered as a keyboard-focusable\n RAC Button. Hover lifts the shadow, press sinks 1px, focus shows indigo ring.\n ========================================================================= */\n\nconst pressableCardStyles = tv({\n extend: cardStyles,\n base: [\n 'text-left w-full cursor-pointer outline-none',\n 'transition-[box-shadow,transform,border-color] duration-150',\n 'hover:shadow-[var(--shadow-raised)] hover:border-ink-4',\n 'pressed:translate-y-px',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed disabled:pointer-events-none',\n ],\n})\n\nexport type PressableCardProps = AriaButtonProps & CardVariants\n\nexport function PressableCard({ variant, className, ...props }: PressableCardProps) {\n return (\n <AriaButton\n {...props}\n className={(renderProps) =>\n cn(\n pressableCardStyles({ variant }),\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n\n/* =========================================================================\n Structural slots — each owns its padding. Drop-in composable.\n ========================================================================= */\n\n/**\n * Flush, full-bleed strip at the top of a Card.\n * Sand-tinted surface, uppercase mono, anchors a record identifier / status.\n * The strip bleeds to the card edges because the Card has no padding.\n */\nexport function CardHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n 'flex justify-between items-center',\n 'px-5 py-5 border-b border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n 'font-mono text-[11.5px] uppercase tracking-[0.06em] text-ink-4',\n className,\n )}\n />\n )\n}\n\n/**\n * Padded content block. This is where inline slots (CardEyebrow, CardTitle,\n * CardBody) must live — they do not carry their own padding. Repeatable for\n * multi-section layouts; separate sections with a `<hr class=\"border-rule\"/>`.\n */\nexport function CardContent({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div {...props} className={cn('flex flex-col gap-3 p-5', className)} />\n}\n\n/**\n * Footer anchored to the bottom of the card via `mt-auto`. Place a\n * `<Separator />` above it when you want the dashed divider.\n * Mono meta-sized text. Typically holds counts + a trailing arrow / action.\n */\nexport function CardFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n 'mt-auto flex justify-between items-center',\n 'px-5 py-4',\n 'font-mono text-[11.5px] text-ink-4',\n className,\n )}\n />\n )\n}\n\n/* =========================================================================\n Inline slots — no self-padding; must live inside CardContent / CardHeader.\n ========================================================================= */\n\nexport function CardEyebrow({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n 'flex justify-between items-center',\n 'font-mono text-[11px] uppercase tracking-[0.08em] text-ink-4',\n className,\n )}\n />\n )\n}\n\nexport function CardTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n {...props}\n className={cn(\n 'font-sans font-medium text-[20px] leading-[1.25] tracking-[-0.015em] text-ink',\n className,\n )}\n />\n )\n}\n\nexport function CardFeatureTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n {...props}\n className={cn(\n 'font-sans font-medium text-[26px] leading-[1.2] tracking-[-0.02em] text-ink',\n className,\n )}\n />\n )\n}\n\nexport function CardBody({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div {...props} className={cn('text-[14px] leading-[1.55] text-ink-3', className)} />\n}\n","import {\n AtSign,\n AudioLines,\n Camera,\n Hash,\n type LucideIcon,\n Linkedin,\n Mail,\n MessageCircle,\n MessagesSquare,\n Mic,\n Phone,\n Send,\n Video,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Channel glyphs — the one lucide lookup for a conversation channel, shared\n by every surface that shows where a message came from (hub sidebar,\n compose picker, draft-review card, custom components). Channels the\n platform gained but this map hasn't fall back to the generic conversation\n glyph rather than rendering nothing.\n\n Deliberately keyed by a loose `string`: `Message['channel']` widens over\n time and callers routinely hold a raw slug from the wire.\n ========================================================================= */\n\nconst CHANNEL_ICONS: Readonly<Record<string, LucideIcon>> = {\n slack: Hash,\n email: Mail,\n whatsapp: MessageCircle,\n linkedin: Linkedin,\n telegram: Send,\n instagram: Camera,\n messenger: MessagesSquare,\n x: AtSign,\n meeting: Mic,\n 'zoom-meeting': Video,\n 'google-meet': Video,\n 'teams-meeting': Video,\n 'webex-meeting': Video,\n adhoc: AudioLines,\n phone: Phone,\n}\n\n/** The channel's glyph component. Unknown channels get the generic one. */\nexport function channelIcon(channel: string): LucideIcon {\n return CHANNEL_ICONS[channel] ?? MessagesSquare\n}\n\nexport interface ChannelIconProps {\n channel: string\n className?: string\n /** Accessible name. Omitted (the default) renders the glyph aria-hidden —\n * correct whenever the channel is already named in adjacent text. */\n label?: string\n}\n\n/** Thin wrapper over {@link channelIcon} for the common inline case. */\nexport function ChannelIcon({ channel, className, label }: ChannelIconProps) {\n const Icon = channelIcon(channel)\n return label !== undefined ? (\n <Icon className={cn('size-4', className)} role=\"img\" aria-label={label} />\n ) : (\n <Icon className={cn('size-4', className)} aria-hidden />\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\nexport type CheckboxProps = Omit<AriaCheckboxProps, 'children'> & {\n children?: ReactNode\n}\n\nexport function Checkbox({ children, className, ...props }: CheckboxProps) {\n return (\n <AriaCheckbox\n {...props}\n className={(renderProps) =>\n cn(\n // `relative` so RAC's visually-hidden <input> — which is absolutely\n // positioned and is the element that actually receives focus — is\n // laid out against THIS checkbox. Without a positioned ancestor here\n // it resolves against a far-away container, ends up outside any\n // scroll clipping, and focusing it makes the browser scroll a\n // container the user cannot scroll back (the roles permission\n // matrix, where toggling a row threw the page off-screen).\n 'group relative inline-flex items-center gap-2.5 cursor-pointer',\n 'font-sans text-[14px] text-ink-2 select-none',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {(renderProps) => (\n <>\n <span\n aria-hidden\n className={cn(\n 'relative inline-flex items-center justify-center shrink-0',\n 'size-[18px] rounded-[4px] border bg-surface',\n 'border-ink-4',\n 'transition-[background-color,border-color,box-shadow] duration-150',\n // hovered\n 'group-data-[hovered]:border-ink',\n // checked / indeterminate — fill with ink\n 'group-data-[selected]:bg-ink group-data-[selected]:border-ink',\n 'group-data-[indeterminate]:bg-ink group-data-[indeterminate]:border-ink',\n // focus ring on the box\n 'group-data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n {renderProps.isIndeterminate ? (\n <span className=\"block h-px w-2.5 bg-surface\" />\n ) : (\n <svg\n viewBox=\"0 0 12 12\"\n className={cn(\n 'size-3 text-surface transition-opacity duration-150',\n renderProps.isSelected ? 'opacity-100' : 'opacity-0',\n )}\n aria-hidden\n >\n <path\n d=\"M2.5 6.25 5 8.75 9.5 3.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )}\n </span>\n {children}\n </>\n )}\n </AriaCheckbox>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n CheckboxGroup as AriaCheckboxGroup,\n type CheckboxGroupProps as AriaCheckboxGroupProps,\n FieldError,\n Label,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport { fieldErrorStyles, fieldHintStyles, fieldLabelStyles } from '../field/field'\n\n/* =========================================================================\n CheckboxGroup — multi-choice field, the checkbox counterpart to RadioGroup.\n Monolithic API to match it: label / description / errorMessage props on the\n group, `<Checkbox value=\"…\">` children. `value` is a string[] of selected\n values (controlled via value/onChange, or defaultValue).\n ========================================================================= */\n\nexport type CheckboxGroupProps = Omit<AriaCheckboxGroupProps, 'children'> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** `<Checkbox value=\"…\">` elements. Function-as-children is not supported at the group level. */\n children: ReactNode\n}\n\nexport function CheckboxGroup({\n label,\n description,\n errorMessage,\n children,\n className,\n ...props\n}: CheckboxGroupProps) {\n return (\n <AriaCheckboxGroup\n {...props}\n className={(renderProps) =>\n cn('grid gap-2', typeof className === 'function' ? className(renderProps) : className)\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <div className=\"grid gap-3\">{children}</div>\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage ? <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError> : null}\n </AriaCheckboxGroup>\n )\n}\n","import { Pipette } from 'lucide-react'\nimport { type ReactNode, useEffect, useRef, useState } from 'react'\nimport { Input as AriaInput, FieldError, Label, Text, TextField } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n ColorInput — a form field for a `#rrggbb` color.\n\n Text-first: the hex is what the platform stores (enum values, labels),\n so the field is a mono text input with a swatch in front of it. The\n swatch doubles as a trigger for the browser's native color picker, which\n is the \"good enough for now\" picker until a proper one lands — the API\n (value in, canonical hex out) won't change when it does.\n\n Commit discipline: `onChange` only ever fires with a canonical lowercase\n `#rrggbb` or `null` (cleared). While the draft is something else — half a\n hex, a named color — the field shows its invalid chrome and holds the\n last committed value, so consumers never see partial input. Shorthand\n (`#abc`) is accepted but only expanded on blur: typing `#ff0000` passes\n through `#ff0`, and committing that transiently would flash the wrong\n color at the consumer.\n ========================================================================= */\n\nconst HEX6 = /^#?([0-9a-f]{6})$/i\nconst HEX3 = /^#?([0-9a-f]{3})$/i\n\n/**\n * Normalizes free-form text to a canonical lowercase `#rrggbb`, or null when\n * it isn't a hex color. Accepts a missing `#` and 3-digit shorthand.\n */\nexport function normalizeHexColor(text: string | null | undefined): string | null {\n const raw = (text ?? '').trim()\n if (raw === '') return null\n const six = HEX6.exec(raw)\n if (six?.[1]) return `#${six[1].toLowerCase()}`\n const three = HEX3.exec(raw)\n if (three?.[1]) {\n const [r, g, b] = three[1].toLowerCase()\n return `#${r}${r}${g}${g}${b}${b}`\n }\n return null\n}\n\nexport type ColorInputProps = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Shown while empty. Defaults to a sample hex. */\n placeholder?: string\n /** Canonical or loose hex; null/'' mean \"no color\". */\n value: string | null\n /** Fires with the canonical lowercase `#rrggbb`, or null when cleared. */\n onChange: (hex: string | null) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Accessible name when no visible `label` is rendered. */\n 'aria-label'?: string\n className?: string\n}\n\nexport function ColorInput({\n label,\n description,\n errorMessage,\n placeholder = '#5b8def',\n value,\n onChange,\n isDisabled = false,\n isInvalid = false,\n size = 'md',\n appearance,\n 'aria-label': ariaLabel,\n className,\n}: ColorInputProps) {\n const committed = normalizeHexColor(value)\n const [draft, setDraft] = useState(committed ?? '')\n const nativeRef = useRef<HTMLInputElement>(null)\n\n // An outside change to `value` (reset, another picker) replaces the draft;\n // our own commits already match, so typing is never clobbered mid-word.\n useEffect(() => {\n setDraft((current) => (normalizeHexColor(current) === committed ? current : (committed ?? '')))\n }, [committed])\n\n const isDraftInvalid = draft.trim() !== '' && normalizeHexColor(draft) === null\n const invalid = isInvalid || isDraftInvalid\n const styles = fieldControlStyles({ size, invalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n\n const edit = (next: string) => {\n setDraft(next)\n if (next.trim() === '') {\n if (committed !== null) onChange(null)\n return\n }\n // Live commits need the full six digits; shorthand waits for blur.\n if (!HEX6.test(next.trim())) return\n const hex = normalizeHexColor(next)\n if (hex !== null && hex !== committed) onChange(hex)\n }\n\n const settle = () => {\n const hex = normalizeHexColor(draft)\n if (hex === null) return\n setDraft(hex)\n if (hex !== committed) onChange(hex)\n }\n\n const pick = (next: string) => {\n const hex = normalizeHexColor(next)\n if (hex === null) return\n setDraft(hex)\n if (hex !== committed) onChange(hex)\n }\n\n return (\n <TextField\n value={draft}\n onChange={edit}\n isDisabled={isDisabled}\n isInvalid={invalid}\n // Canonical formatting once the user leaves: \"ABC\" → \"#aabbcc\".\n onBlur={settle}\n {...(ariaLabel ? { 'aria-label': ariaLabel } : {})}\n className={cn('grid grid-cols-1 gap-1.5', className)}\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex items-center gap-2',\n size === 'sm' ? 'pl-2' : 'pl-2.5',\n focusWithin,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Pick color\"\n disabled={isDisabled}\n onClick={() => nativeRef.current?.click()}\n className={cn(\n 'relative flex shrink-0 items-center justify-center rounded-sm border border-rule',\n 'cursor-pointer outline-none',\n 'focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]',\n 'disabled:cursor-not-allowed',\n size === 'sm' ? 'size-4' : 'size-5',\n committed ? null : 'text-ink-4',\n )}\n style={committed ? { backgroundColor: committed } : undefined}\n >\n {committed ? null : <Pipette aria-hidden className=\"size-2.5\" />}\n {/* The browser picker rides a hidden native input — clicking the\n swatch forwards to it. Not tabbable: the text input is the\n keyboard path. */}\n <input\n ref={nativeRef}\n type=\"color\"\n tabIndex={-1}\n aria-hidden\n disabled={isDisabled}\n value={committed ?? '#000000'}\n onChange={(event) => pick(event.target.value)}\n className=\"pointer-events-none absolute inset-0 size-full opacity-0\"\n />\n </button>\n <AriaInput\n placeholder={placeholder}\n spellCheck={false}\n autoComplete=\"off\"\n className={cn(\n styles.content(),\n 'min-w-0 flex-1 bg-transparent font-mono outline-none',\n 'pl-0',\n fieldTextStyles[size],\n )}\n />\n </div>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </TextField>\n )\n}\n","import { type ReactNode, useContext } from 'react'\nimport {\n ComboBox as AriaComboBox,\n type ComboBoxProps as AriaComboBoxProps,\n ComboBoxStateContext,\n Button as AriaComboButton,\n Input as AriaInput,\n FieldError,\n type Key,\n Label,\n ListBox,\n ListBoxItem,\n type ListBoxItemProps,\n Popover,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type ComboboxOption<T extends Key = Key> = {\n id: T\n label: string\n description?: ReactNode\n isDisabled?: boolean\n /**\n * Per-row action UI rendered at the trailing edge of the option. Hidden\n * by default; revealed when the row is hovered or keyboard-focused. The\n * slot intercepts `pointerdown` / `click` propagation so interactions\n * inside it don't trigger option selection — put a real `<button>` /\n * `<Link>` here and it Just Works.\n */\n trailing?: ReactNode\n}\n\nexport type ComboboxProps<T extends Key = Key> = Omit<\n AriaComboBoxProps<never>,\n 'children' | 'items' | 'defaultItems'\n> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<ComboboxOption<T>>\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Visual override for the trigger input wrapper only. */\n inputWrapperClassName?: string\n /** Visual override for the inner `<input>` (size, padding, font). */\n inputClassName?: string\n /** Empty-state message shown in the popover when no options match. */\n emptyMessage?: ReactNode\n}\n\nexport function Combobox<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Type to search…',\n options,\n size,\n appearance,\n inputWrapperClassName,\n inputClassName,\n emptyMessage = 'No matches',\n className,\n // Default to keeping the popover open on an empty filter so the\n // `emptyMessage` slot actually renders. Callers can opt out.\n allowsEmptyCollection = true,\n ...props\n}: ComboboxProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n // In cell mode the wrapper's own focus-within halo must go too — only the\n // accent border remains on focus.\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n return (\n <AriaComboBox\n {...props}\n allowsEmptyCollection={allowsEmptyCollection}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n className={cn(\n // Box chrome on the wrapper; the inner <input> carries the padding\n // + font so the chevron button sits inside the same border + ring.\n styles.box(),\n 'flex items-center gap-1 pr-2',\n focusWithin,\n inputWrapperClassName,\n )}\n >\n <AriaInput\n placeholder={placeholder}\n className={cn(\n 'flex-1 min-w-0 bg-transparent outline-none',\n styles.content(),\n inputClassName,\n )}\n />\n <AriaComboButton\n className={cn(\n 'shrink-0 flex items-center justify-center',\n 'size-7 rounded-pill',\n 'text-ink-3 hover:text-ink outline-none cursor-pointer',\n )}\n >\n <FieldCaret />\n </AriaComboButton>\n </div>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n 'min-w-[var(--trigger-width)]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <ListBox\n className=\"outline-none max-h-72 overflow-auto\"\n renderEmptyState={() => (\n <div className={cn('px-3 py-2', fieldHintStyles)}>{emptyMessage}</div>\n )}\n >\n {options.map((option) => (\n <ComboboxItem\n key={option.id}\n id={option.id}\n textValue={option.label}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n >\n <span className=\"truncate\">{option.label}</span>\n {option.description ? (\n <span className=\"ml-3 shrink-0 font-mono text-[11.5px] text-ink-4\">\n {option.description}\n </span>\n ) : null}\n {option.trailing ? <TrailingSlot>{option.trailing}</TrailingSlot> : null}\n </ComboboxItem>\n ))}\n </ListBox>\n </Popover>\n </AriaComboBox>\n )\n}\n\n/**\n * Wraps the per-option trailing UI so that:\n * - The full pointer→click sequence is intercepted (so RAC's listbox\n * press handling on the surrounding ListBoxItem can never claim it\n * and select the row).\n * - On click, after the consumer's own handler runs (bubble order:\n * inner element → this wrapper), the combobox popover closes.\n * The trailing action is by nature \"do something with this option\" —\n * e.g. open a peek panel — which always takes the user away from the\n * field, so leaving the popover open underneath would be a UX bug.\n */\nfunction TrailingSlot({ children }: { children: ReactNode }) {\n const state = useContext(ComboBoxStateContext)\n return (\n <span\n className={cn(\n 'ml-auto pl-2 shrink-0 inline-flex items-center',\n // Hidden by default; revealed when the row is hovered or\n // keyboard-focused. `group/combobox-item` is set on ComboboxItem.\n 'hidden',\n 'group-data-[hovered]/combobox-item:inline-flex',\n 'group-data-[focused]/combobox-item:inline-flex',\n 'focus-within:inline-flex',\n )}\n // Block the full press lifecycle: `pointerdown` prevents usePress\n // from arming on the option, the rest cover the test-env mousedown\n // path and any third-party handlers.\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n // Bubble order means the consumer's onClick already ran; now\n // close the popover so the trailing action's target UI (e.g. a\n // peek modal) isn't sitting on top of an open dropdown.\n state?.close()\n }}\n >\n {children}\n </span>\n )\n}\n\nfunction ComboboxItem(props: ListBoxItemProps) {\n return (\n <ListBoxItem\n {...props}\n className={cn(\n // `group/combobox-item` exposes hover/focus state to the trailing\n // slot so it can reveal itself only when the row is engaged.\n 'group/combobox-item',\n 'flex items-center justify-between gap-3',\n 'rounded-[6px] px-3 py-2 text-[14px] text-ink-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n />\n )\n}\n","/* Parse a textual combo like \"mod+k\" into a typed KeyCombo. v1 supports\n exactly `mod+<key>` where the modifier resolves to Cmd on macOS and Ctrl\n elsewhere. Aliases `cmd` and `meta` normalize to `mod`. Any other shape\n (`alt+s`, `mod+shift+k`, bare `s`) throws with a clear message so misuse\n is caught at registration time, not at the next key press. */\n\nexport type KeyCombo = {\n /** Normalized form for registry keying. Always `mod+<key>`. */\n raw: string\n /** Key part, lowercased. Letters use `event.code` (`KeyS`); others match `event.key`. */\n key: string\n /** True when `key` is a single A–Z letter — match against `event.code` so the\n * binding stays on the physical key regardless of keyboard layout. */\n isLetter: boolean\n}\n\nconst MOD_ALIASES: ReadonlySet<string> = new Set(['mod', 'cmd', 'meta'])\nconst FORBIDDEN_EXTRA_MODS: ReadonlySet<string> = new Set(['shift', 'alt', 'option'])\n\nexport function parseCombo(input: string): KeyCombo {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error('Invalid key combo: empty string. Expected \"mod+<key>\".')\n }\n const parts = trimmed.toLowerCase().split('+').map((p) => p.trim())\n if (parts.length !== 2) {\n throw new Error(\n `Invalid key combo: \"${input}\". Expected \"mod+<key>\" — exactly one modifier and one key. ` +\n `v1 does not support bare keys, multiple modifiers, or sequences.`,\n )\n }\n const [modPart, keyPart] = parts as [string, string]\n if (!MOD_ALIASES.has(modPart)) {\n throw new Error(\n `Invalid key combo: \"${input}\". Modifier must be \"mod\" (or alias \"cmd\"/\"meta\"); got \"${modPart}\".`,\n )\n }\n if (!keyPart) {\n throw new Error(`Invalid key combo: \"${input}\". Missing key after modifier.`)\n }\n if (FORBIDDEN_EXTRA_MODS.has(keyPart)) {\n throw new Error(\n `Invalid key combo: \"${input}\". Multi-modifier combos (mod+shift+…, mod+alt+…) are not supported in v1.`,\n )\n }\n const isLetter = /^[a-z]$/.test(keyPart)\n return { raw: `mod+${keyPart}`, key: keyPart, isLetter }\n}\n","/* Browser/OS combos we refuse to bind. Catching this at registration time\n gives a clear error instead of silently shipping a shortcut the browser\n intercepts. `mod+shift+t` is listed for documentation; it can't be expressed\n in v1 anyway (the parser rejects multi-modifier combos). */\n\nimport type { KeyCombo } from './parse-combo'\n\n/* `mod+n` is intentionally NOT in this list. Chrome/Safari/Firefox on macOS\n intercept it at the OS/browser level for \"new window\" so the page's\n handler can't fire in those environments — but we still allow registration\n so it works on platforms/configurations where the browser does deliver the\n event, and so the discovery hint can advertise it. */\n\nexport const PROTECTED_COMBOS: ReadonlySet<string> = new Set([\n 'mod+w',\n 'mod+t',\n 'mod+q',\n 'mod+r',\n 'mod+l',\n 'mod+1',\n 'mod+2',\n 'mod+3',\n 'mod+4',\n 'mod+5',\n 'mod+6',\n 'mod+7',\n 'mod+8',\n 'mod+9',\n])\n\nexport function assertNotProtected(combo: KeyCombo): void {\n if (PROTECTED_COMBOS.has(combo.raw)) {\n throw new Error(\n `Cannot bind \"${combo.raw}\" — it is a protected browser/OS shortcut. ` +\n `Pick a different key.`,\n )\n }\n}\n","/* Platform detection for the command system. Resolves once at module load\n so `mod` always means the same thing in a given session. */\n\nexport type Platform = 'mac' | 'other'\n\nlet cached: Platform | undefined\n\nexport function getPlatform(): Platform {\n if (cached !== undefined) return cached\n cached = detect()\n return cached\n}\n\nfunction detect(): Platform {\n if (typeof navigator === 'undefined') return 'other'\n const ua = (navigator as { userAgentData?: { platform?: string } }).userAgentData\n if (ua?.platform) {\n return /mac/i.test(ua.platform) ? 'mac' : 'other'\n }\n const legacy = (navigator as { platform?: string }).platform ?? ''\n return /mac/i.test(legacy) ? 'mac' : 'other'\n}\n\n// Test-only: reset or force the cached platform.\nexport function _setPlatformForTests(p: Platform | undefined): void {\n cached = p\n}\n","/* Event matcher + editable-target guard. Letter combos match the physical\n key via `event.code` so QWERTY position is preserved across layouts;\n non-letter combos match `event.key`. Shift and Alt state are intentionally\n ignored so `Cmd+S`, `Cmd+Shift+S`, and `Cmd+Alt+S` all fire `mod+s` —\n this is what makes the discovery-hold-then-press flow work without dual\n registration. */\n\nimport type { KeyCombo } from './parse-combo'\nimport { getPlatform } from './platform'\n\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false\n const tag = target.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (target.isContentEditable) return true\n // jsdom doesn't always reflect contenteditable in isContentEditable; fall back\n // to the attribute so tests (and any quirky host) behave consistently.\n const attr = target.getAttribute('contenteditable')\n if (attr === '' || attr === 'true' || attr === 'plaintext-only') return true\n return false\n}\n\nexport function matches(event: KeyboardEvent, combo: KeyCombo): boolean {\n const platform = getPlatform()\n const modPressed = platform === 'mac' ? event.metaKey : event.ctrlKey\n if (!modPressed) return false\n if (combo.isLetter) {\n return event.code === `Key${combo.key.toUpperCase()}`\n }\n return event.key.toLowerCase() === combo.key.toLowerCase()\n}\n","/* Module-singleton registry. One window listener handles every command.\n Handlers for the same combo stack on push; the newest wins\n deterministically. preventDefault + stopImmediatePropagation on match so\n the page's own keydown listeners (and other registry entries) don't also\n fire.\n\n Editable targets are NOT skipped here — `mod+<key>` combos use a real\n modifier, so they can't be confused with text input the way bare keys\n can. Cmd+S in a form field should still save. (The `useEscapeKey` path\n keeps its editable-target skip because Escape is bare.) */\n\nimport { matches } from './match-event'\nimport type { KeyCombo } from './parse-combo'\n\ntype Handler = (event: KeyboardEvent) => void\ntype Entry = { combo: KeyCombo; handler: Handler }\n\nconst stacks = new Map<string, Entry[]>()\nlet listenerInstalled = false\n\nfunction onWindowKeyDown(event: KeyboardEvent): void {\n for (const entries of stacks.values()) {\n const top = entries[entries.length - 1]\n if (!top) continue\n if (matches(event, top.combo)) {\n event.preventDefault()\n event.stopImmediatePropagation()\n top.handler(event)\n return\n }\n }\n}\n\nfunction ensureListener(): void {\n if (listenerInstalled) return\n if (typeof window === 'undefined') return\n window.addEventListener('keydown', onWindowKeyDown, { capture: true })\n listenerInstalled = true\n}\n\nexport function register(combo: KeyCombo, handler: Handler): () => void {\n ensureListener()\n const list = stacks.get(combo.raw) ?? []\n const entry: Entry = { combo, handler }\n list.push(entry)\n stacks.set(combo.raw, list)\n return () => {\n const current = stacks.get(combo.raw)\n if (!current) return\n const idx = current.lastIndexOf(entry)\n if (idx >= 0) current.splice(idx, 1)\n if (current.length === 0) stacks.delete(combo.raw)\n }\n}\n\n// Test-only: clear the registry between cases.\nexport function _resetRegistry(): void {\n stacks.clear()\n}\n","/* Bind a `mod+<key>` command. The handler is wrapped in a ref so changing\n handler identity each render does not re-register; only `combo` and\n `enabled` are real dependencies. */\n\nimport { useEffect, useRef } from 'react'\n\nimport { parseCombo } from './parse-combo'\nimport { assertNotProtected } from './protected-combos'\nimport { register } from './registry'\n\nexport type UseCommandOptions = {\n /** Defaults to `true`. Set to `false` to temporarily disable without unmounting. */\n enabled?: boolean\n}\n\nexport function useCommand(\n combo: string,\n handler: (event: KeyboardEvent) => void,\n options?: UseCommandOptions,\n): void {\n const enabled = options?.enabled ?? true\n const handlerRef = useRef(handler)\n useEffect(() => {\n handlerRef.current = handler\n })\n useEffect(() => {\n if (!enabled) return undefined\n const parsed = parseCombo(combo)\n assertNotProtected(parsed)\n return register(parsed, (event) => handlerRef.current(event))\n }, [combo, enabled])\n}\n","/* Module-singleton store tracking the Cmd+Shift \"discovery hold\". One pair\n of window listeners regardless of how many <Command> wrappers subscribe.\n Subscribers re-render via useSyncExternalStore when the both-held flag\n flips. Resyncs from event modifier flags on every key event so it stays\n accurate even if the browser drops a modifier key event (focus changes,\n alt-tab, etc.). */\n\nimport { useSyncExternalStore } from 'react'\n\nimport { getPlatform } from './platform'\n\ntype Listener = () => void\n\nlet cmdHeld = false\nlet shiftHeld = false\nlet initialized = false\nconst listeners = new Set<Listener>()\n\nfunction getSnapshot(): boolean {\n return cmdHeld && shiftHeld\n}\n\nfunction getServerSnapshot(): boolean {\n return false\n}\n\nfunction emit(): void {\n for (const l of listeners) l()\n}\n\nfunction sync(cmdNow: boolean, shiftNow: boolean): void {\n if (cmdNow !== cmdHeld || shiftNow !== shiftHeld) {\n cmdHeld = cmdNow\n shiftHeld = shiftNow\n emit()\n }\n}\n\nfunction onKeyDown(e: KeyboardEvent): void {\n const platform = getPlatform()\n const cmdFlag = platform === 'mac' ? e.metaKey : e.ctrlKey\n // For the modifier key itself, trust the event type (the flag lags on press).\n if (e.key === 'Meta' || e.key === 'Control') {\n sync(true, e.shiftKey)\n return\n }\n if (e.key === 'Shift') {\n sync(cmdFlag, true)\n return\n }\n sync(cmdFlag, e.shiftKey)\n}\n\nfunction onKeyUp(e: KeyboardEvent): void {\n const platform = getPlatform()\n const cmdFlag = platform === 'mac' ? e.metaKey : e.ctrlKey\n if (e.key === 'Meta' || e.key === 'Control') {\n sync(false, e.shiftKey)\n return\n }\n if (e.key === 'Shift') {\n sync(cmdFlag, false)\n return\n }\n sync(cmdFlag, e.shiftKey)\n}\n\nfunction onBlur(): void {\n // The window lost focus — assume the user released everything. Without\n // this, holding Cmd+Shift then alt-tabbing would leave us stuck in\n // discovery mode until the next keydown.\n sync(false, false)\n}\n\nfunction ensureInitialized(): void {\n if (initialized) return\n if (typeof window === 'undefined') return\n window.addEventListener('keydown', onKeyDown, { capture: true })\n window.addEventListener('keyup', onKeyUp, { capture: true })\n window.addEventListener('blur', onBlur)\n initialized = true\n}\n\nfunction subscribe(listener: Listener): () => void {\n ensureInitialized()\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport function useDiscoveryActive(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n\n// Test-only: number of installed listeners is the number of subscribers.\n// The window-level listeners are installed at most once (initialized flag).\nexport function _getDiscoverySubscriberCount(): number {\n return listeners.size\n}\n\nexport function _resetDiscovery(): void {\n cmdHeld = false\n shiftHeld = false\n listeners.clear()\n}\n\nexport function _isDiscoveryInitialized(): boolean {\n return initialized\n}\n","import type { HTMLAttributes } from 'react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Kbd — small mono key-cap. Renders a real <kbd> element so screen readers\n announce it as keyboard input. Pure cosmetics; no behavior.\n ========================================================================= */\n\nexport type KbdProps = HTMLAttributes<HTMLElement>\n\nexport function Kbd({ className, children, ...props }: KbdProps) {\n return (\n <kbd\n {...props}\n className={cn(\n 'inline-flex items-center justify-center',\n 'font-mono text-[10.5px] leading-none text-ink-4',\n 'bg-surface-2 border border-rule rounded-[4px]',\n 'px-1.5 py-1',\n className,\n )}\n >\n {children}\n </kbd>\n )\n}\n","import { cn } from '../../lib/cn'\nimport { parseCombo } from '../../lib/commands/parse-combo'\nimport { getPlatform } from '../../lib/commands/platform'\nimport { Kbd } from '../kbd'\n\n/* =========================================================================\n CommandHint — visual representation of a `mod+<key>` combo. Renders a\n single `<Kbd>` so it slots in where the cosmetic `<Kbd>⌘K</Kbd>` lived\n before. On macOS the modifier is shown as `⌘` glued directly to the key\n (`⌘K`); on other platforms it reads `Ctrl+K`. Pure presentation — no\n binding, no listeners.\n\n `tone=\"prominent\"` flips the cap to a high-contrast surface for use on\n the discovery overlay where it needs to stand out against the backdrop.\n ========================================================================= */\n\nexport type CommandHintTone = 'subtle' | 'prominent'\n\nexport type CommandHintProps = {\n combo: string\n tone?: CommandHintTone\n className?: string\n}\n\nexport function CommandHint({ combo, tone = 'subtle', className }: CommandHintProps) {\n const parsed = parseCombo(combo)\n const platform = getPlatform()\n const modSymbol = platform === 'mac' ? '⌘' : 'Ctrl'\n const keyLabel = parsed.isLetter ? parsed.key.toUpperCase() : prettifyKey(parsed.key)\n const label = platform === 'mac' ? `${modSymbol}${keyLabel}` : `${modSymbol}+${keyLabel}`\n return (\n <Kbd\n className={cn(\n tone === 'prominent' && 'bg-ink text-surface border-transparent',\n className,\n )}\n >\n {label}\n </Kbd>\n )\n}\n\nfunction prettifyKey(key: string): string {\n if (key.length === 0) return key\n return key[0]!.toUpperCase() + key.slice(1)\n}\n","'use client'\n\nimport { type ReactNode, useRef } from 'react'\n\nimport { cn } from '../../lib/cn'\nimport { useCommand } from '../../lib/commands/use-command'\nimport { useDiscoveryActive } from '../../lib/commands/discovery-store'\n\nimport { CommandHint } from './command-hint'\n\n/* =========================================================================\n Command — discovery-aware wrapper around an interactive element. Binds\n `combo` to a synthetic click on the wrapped child (RAC `Button`'s\n `onPress` listens for native click events, so this fires the user's\n handler), and reveals a hint chip while Cmd+Shift is held so users can\n learn the bound shortcut.\n\n <Command combo=\"mod+s\">\n <Button onPress={onSave}>Save</Button>\n </Command>\n\n When the trigger isn't the immediate child (e.g. wrapped in a `<span>`\n for popover anchoring, or buried inside a list), pass `target` — a CSS\n selector resolved against the wrapper. The first matching descendant\n receives the synthetic click.\n\n <Command combo=\"mod+f\" target=\"[data-filter-trigger]\">\n <RecordFilterButton … />\n <RecordFilterChips … />\n </Command>\n\n `className` overrides the wrapper layout (default `inline-block`) for\n call sites where the wrapper needs to participate in a flex/grid layout.\n The wrapper stays `relative` either way so the discovery overlay can\n absolute-position against it.\n ========================================================================= */\n\nexport type CommandProps = {\n combo: string\n /** CSS selector for the click target. Defaults to the wrapper's first\n * element child — fine when that child IS the interactive control. */\n target?: string\n /** Layout overrides for the wrapper. `relative` is always applied. */\n className?: string\n children: ReactNode\n}\n\nexport function Command({ combo, target, className, children }: CommandProps) {\n const wrapperRef = useRef<HTMLDivElement>(null)\n const discoveryActive = useDiscoveryActive()\n\n useCommand(combo, () => {\n const root = wrapperRef.current\n if (!root) return\n const el = target\n ? root.querySelector<HTMLElement>(target)\n : (root.firstElementChild as HTMLElement | null)\n el?.click()\n })\n\n return (\n <div ref={wrapperRef} className={cn('relative inline-block', className)}>\n {children}\n {discoveryActive ? (\n <div\n aria-hidden\n className=\"absolute -inset-2 rounded-md bg-[color-mix(in_oklab,var(--color-ink)_28%,transparent)] pointer-events-none transition-opacity z-40\"\n >\n <span className=\"absolute -top-2.5 -left-2 pointer-events-none z-50\">\n <CommandHint combo={combo} tone=\"prominent\" />\n </span>\n </div>\n ) : null}\n </div>\n )\n}\n","/* Bare-Escape handler. Doesn't go through the `mod+<key>` registry because\n Escape has no modifier. Same editable-target guard. Multiple subscribers\n stack — only the newest fires per event, matching the \"newest wins\"\n semantics of the command registry so nested overlays (peek over a\n record stack, say) close one layer at a time. */\n\nimport { useEffect, useRef } from 'react'\n\nimport { isEditableTarget } from './match-event'\n\nexport type UseEscapeKeyOptions = {\n /** Defaults to `true`. Set to `false` to temporarily disable without unmounting. */\n enabled?: boolean\n}\n\ntype Entry = { handler: (event: KeyboardEvent) => void }\n\nconst stack: Entry[] = []\nlet listenerInstalled = false\n\nfunction onWindowKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return\n if (isEditableTarget(event.target)) return\n const top = stack[stack.length - 1]\n if (!top) return\n top.handler(event)\n}\n\nfunction ensureListener(): void {\n if (listenerInstalled) return\n if (typeof window === 'undefined') return\n window.addEventListener('keydown', onWindowKeyDown, { capture: true })\n listenerInstalled = true\n}\n\nexport function useEscapeKey(\n handler: (event: KeyboardEvent) => void,\n options?: UseEscapeKeyOptions,\n): void {\n const enabled = options?.enabled ?? true\n const handlerRef = useRef(handler)\n useEffect(() => {\n handlerRef.current = handler\n })\n useEffect(() => {\n if (!enabled) return undefined\n ensureListener()\n const entry: Entry = {\n handler: (event) => handlerRef.current(event),\n }\n stack.push(entry)\n return () => {\n const idx = stack.lastIndexOf(entry)\n if (idx >= 0) stack.splice(idx, 1)\n }\n }, [enabled])\n}\n\n// Test-only.\nexport function _resetEscapeStack(): void {\n stack.length = 0\n}\n","import { Phone } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport type { ConversationBriefOutcome } from './types'\n\n/* =========================================================================\n ConversationBriefCard — the compact entry point to a prepared call: phone glyph,\n eyebrow, the contact's name, the brief's type / opening line, and one\n action (\"Open Brief\"). Pure chrome — it neither fetches nor dials, so it can\n sit in a chat flow, a record page, a task list or a custom component alike.\n ConversationBriefReview is the connected wrapper; reach for this one only when the\n host already holds the brief.\n\n Once the brief is used or discarded the action is replaced by a status\n label rather than removed — the row keeps its shape and its record.\n ========================================================================= */\n\nexport const conversationBriefCardStyles = tv({\n slots: {\n root: [\n 'flex items-center gap-2.5 rounded-md border border-accent/40 px-3 py-2',\n 'bg-[color-mix(in_oklab,var(--color-accent)_6%,var(--color-surface))]',\n ],\n icon: [\n 'grid size-8 shrink-0 place-items-center rounded-full text-accent',\n 'bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n ],\n body: 'min-w-0 flex-1',\n eyebrow: 'font-mono text-[10px] uppercase tracking-[0.08em] text-accent',\n title: 'truncate text-[13px] font-medium text-ink',\n summary: 'truncate text-[12px] text-ink-3',\n action: [\n 'shrink-0 cursor-pointer rounded-sm border border-accent/50 px-2.5 py-1',\n 'font-mono text-[11px] text-accent outline-none',\n 'hover:bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:cursor-default disabled:opacity-50',\n ],\n outcome: 'shrink-0 font-mono text-[11px] text-ink-3',\n },\n})\n\nconst styles = conversationBriefCardStyles()\n\nexport const CONVERSATION_BRIEF_OUTCOME_LABEL: Record<ConversationBriefOutcome, string> = {\n used: 'Call held',\n discarded: 'Discarded',\n}\n\nexport interface ConversationBriefCardProps {\n /** Headline: the brief's subject, else the contact's name. */\n title: string\n /** Second line: the contact, channel, type and/or the opening line. */\n summary?: string\n /** Default 'Conversation brief — prepared'. */\n eyebrow?: ReactNode\n /** Default 'Open Brief'. */\n openLabel?: string\n /** Terminal outcome. Set ⇒ the action is replaced by its status label. */\n outcome?: ConversationBriefOutcome | null\n onOpen?: () => void\n isOpenDisabled?: boolean\n className?: string\n}\n\nexport function ConversationBriefCard({\n title,\n summary,\n eyebrow = 'Conversation brief — prepared',\n openLabel = 'Open Brief',\n outcome,\n onOpen,\n isOpenDisabled = false,\n className,\n}: ConversationBriefCardProps) {\n return (\n <div className={cn(styles.root(), className)}>\n <span className={styles.icon()}>\n <Phone className=\"size-4\" aria-hidden />\n </span>\n <div className={styles.body()}>\n <p className={styles.eyebrow()}>{eyebrow}</p>\n <p className={styles.title()}>{title}</p>\n {summary ? <p className={styles.summary()}>{summary}</p> : null}\n </div>\n {outcome ? (\n <span className={styles.outcome()}>{CONVERSATION_BRIEF_OUTCOME_LABEL[outcome]}</span>\n ) : (\n <AriaButton\n onPress={onOpen ?? (() => {})}\n isDisabled={isOpenDisabled}\n className={styles.action()}\n >\n {openLabel}\n </AriaButton>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Select as AriaSelect,\n Button as AriaSelectButton,\n type SelectProps as AriaSelectProps,\n FieldError,\n type Key,\n Label,\n ListBox,\n ListBoxItem,\n type ListBoxItemProps,\n Popover,\n SelectValue,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type SelectOption<T extends Key = Key> = {\n id: T\n label: ReactNode\n /** Plain-text stand-in for typeahead/accessibility when `label` is a\n * ReactNode. Optional for string labels (RAC derives the text itself). */\n textValue?: string\n description?: ReactNode\n isDisabled?: boolean\n}\n\nexport type SelectProps<T extends Key = Key> = Omit<AriaSelectProps<never>, 'children'> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<SelectOption<T>>\n /** Optional custom renderer for a ListBoxItem. */\n renderItem?: (option: SelectOption<T>) => ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the trigger box. */\n appearance?: FieldAppearance\n /** Visual override for the trigger only. */\n triggerClassName?: string\n /** Visual override for the popover — e.g. `min-w-[var(--trigger-width)]\n * w-max` to size to content when the trigger is intrinsic-width. Defaults\n * to matching the trigger width exactly. */\n popoverClassName?: string\n}\n\nexport function Select<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Select…',\n options,\n renderItem,\n size,\n appearance,\n triggerClassName,\n popoverClassName,\n className,\n ...props\n}: SelectProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n return (\n <AriaSelect\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <AriaSelectButton\n className={cn(\n styles.box(),\n styles.content(),\n 'flex items-center justify-between gap-3 text-left cursor-pointer',\n triggerClassName,\n )}\n >\n <SelectValue className=\"truncate\">\n {({ defaultChildren, isPlaceholder }) =>\n isPlaceholder ? <span className=\"text-ink-4\">{placeholder}</span> : defaultChildren\n }\n </SelectValue>\n <FieldCaret />\n </AriaSelectButton>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n // Match the trigger width exactly (RAC exposes --trigger-width on\n // the Popover when anchored to a Select button).\n 'w-[var(--trigger-width)]',\n // Float above modals + full-screen editors (e.g. agent-studio's\n // .as-editor z-1000 / a raised modal overlay), matching Menu's z-[1200].\n 'z-[1300]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n popoverClassName,\n )}\n >\n <ListBox className=\"outline-none max-h-72 overflow-auto\">\n {options.map((option) => (\n <SelectItem\n key={option.id}\n id={option.id}\n {...(option.textValue ? { textValue: option.textValue } : {})}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n >\n {renderItem ? renderItem(option) : option.label}\n </SelectItem>\n ))}\n </ListBox>\n {options.length === 0 ? (\n <div className={cn('px-3 py-2', fieldHintStyles)}>{placeholder}</div>\n ) : null}\n </Popover>\n </AriaSelect>\n )\n}\n\nfunction SelectItem(props: ListBoxItemProps) {\n return (\n <ListBoxItem\n {...props}\n className={cn(\n 'flex items-center justify-between gap-3',\n 'rounded-[6px] px-3 py-2 text-[14px] text-ink-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n />\n )\n}\n","import type { Contact, ConversationBrief } from '@proteos/sdk'\n\n/* =========================================================================\n ConversationBriefReview contracts — types-only @proteos/sdk imports, so the lib\n stays fetch-agnostic (the DraftMessageComposer precedent): the host injects\n the client, the component never talks to the network itself.\n ========================================================================= */\n\n/**\n * The minimal fetch surface the conversation-brief surfaces need, injected per host:\n * the web app builds it from `useSdk().conversation`, custom components from\n * `useSdk().conversations` — both via {@link createConversationBriefClient}.\n */\nexport interface ConversationBriefClient {\n /** One brief — also resolves terminal states (used / discarded) by id. */\n getConversationBrief(conversationBriefId: string): Promise<ConversationBrief>\n /** One of the brief's contacts: name + addresses (the phone numbers to dial). */\n getContact(contactId: string): Promise<Contact>\n}\n\n/** A brief's terminal state — what the card shows once it can no longer be\n * opened for a call. */\nexport type ConversationBriefOutcome = 'used' | 'discarded'\n\n/** The terminal outcome for a brief status, or null while it is open. */\nexport function conversationBriefOutcomeFor(\n status: ConversationBrief['status'],\n): ConversationBriefOutcome | null {\n if (status === 'used' || status === 'discarded') return status\n return null\n}\n\n/** Whether a brief can be turned into a phone call from the platform: pinned\n * to the phone channel, or not pinned at all (any channel). */\nexport function isDialableConversationBrief(brief: Pick<ConversationBrief, 'channel'>): boolean {\n return !brief.channel || brief.channel === 'phone'\n}\n\n/** The dialable numbers of a contact: its phone addresses, canonical (E.164)\n * value first-served, deduplicated. */\nexport function contactPhoneNumbers(\n contact: Pick<Contact, 'addresses'> | null | undefined,\n): string[] {\n const numbers: string[] = []\n for (const address of contact?.addresses ?? []) {\n if (address.kind !== 'phone' || !address.value) continue\n if (!numbers.includes(address.value)) numbers.push(address.value)\n }\n return numbers\n}\n","import type { Contact, ConversationBrief } from '@proteos/sdk'\nimport { Pencil, Phone } from 'lucide-react'\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button'\nimport { Select } from '../select'\nimport { contactPhoneNumbers } from './types'\n\n/* =========================================================================\n ConversationBriefPreview — the brief read in full before (and during) a call: the\n contact, the guidance text, and — when the host can dial — the number to\n call and the Call button. Fetch-agnostic and dial-agnostic: the host hands\n in the loaded brief + contact and, optionally, `onCall`; without `onCall`\n it is a read-only preview (a custom component's own modal, the hub's call\n panel). The host may slot extra controls (a caller-id picker) via\n `controls`.\n\n The guidance text is markdown-canonical but the lib carries no markdown\n renderer: hosts inject one via `renderContent` (the web app passes its\n MarkdownContent); without it the text shows as plain pre-wrapped lines.\n Editing follows the same seam — `onEdit` reveals a pencil on hover over\n the guidance box, and `editor` lets the host swap the box for its own\n editing surface while a draft is open.\n ========================================================================= */\n\nexport interface ConversationBriefPreviewProps {\n brief: ConversationBrief\n /** The brief's contacts (the resolved subset — a failed lookup is simply\n * absent). Names head the preview; phone addresses are the dial\n * candidates. */\n contacts: Contact[]\n /** Renders the contact/number pickers + Call button. Absent ⇒ read-only\n * preview. Receives the chosen contact and number. */\n onCall?: (contact: Contact, phoneNumber: string) => void\n /** Disables the Call button (softphone busy, another call running…). */\n isCallDisabled?: boolean\n /** Explains why calling is disabled (shown under the controls). */\n callDisabledReason?: string\n /** Host-slotted controls rendered next to the number picker (caller id). */\n controls?: ReactNode\n /** Hide the built-in Call button — for hosts that render the action in\n * their own footer; pair with `onSelectionChange` to know what to dial. */\n isCallButtonHidden?: boolean\n /** Fires whenever the chosen contact / number changes (and once on mount),\n * so a host rendering its own Call button knows the current target.\n * `phoneNumber` is '' when the chosen contact has no number. */\n onSelectionChange?: (contact: Contact | null, phoneNumber: string) => void\n /** Default 'Call'. */\n callLabel?: string\n className?: string\n /** Visual override for the guidance text box (e.g. a max height). */\n contentClassName?: string\n /** Renders the guidance text (markdown). Absent ⇒ plain pre-wrapped text. */\n renderContent?: (content: string) => ReactNode\n /** Shows an Edit button on hover over the guidance box. */\n onEdit?: () => void\n /** Replaces the guidance box wholesale — the host's editing surface. */\n editor?: ReactNode\n}\n\nexport function ConversationBriefPreview({\n brief,\n contacts,\n onCall,\n isCallDisabled = false,\n callDisabledReason,\n controls,\n isCallButtonHidden = false,\n onSelectionChange,\n callLabel = 'Call',\n className,\n contentClassName,\n renderContent,\n onEdit,\n editor,\n}: ConversationBriefPreviewProps) {\n const [pickedContactId, setPickedContactId] = useState('')\n const contact = contacts.find((entry) => entry.id === pickedContactId) ?? contacts[0] ?? null\n const numbers = useMemo(() => contactPhoneNumbers(contact), [contact])\n const [pickedNumber, setPickedNumber] = useState('')\n const phoneNumber = numbers.includes(pickedNumber) ? pickedNumber : numbers[0] || ''\n const isOpen = brief.status === 'prepared'\n const names = contacts\n .map((entry) => entry.name)\n .filter(Boolean)\n .join(', ')\n\n // Latest-closure ref: the host's callback is routinely a fresh arrow, and\n // the effect must fire on TARGET changes only.\n const onSelectionChangeRef = useRef(onSelectionChange)\n onSelectionChangeRef.current = onSelectionChange\n useEffect(() => {\n onSelectionChangeRef.current?.(contact, phoneNumber)\n }, [contact, phoneNumber])\n\n return (\n <div className={cn('flex flex-col gap-3', className)}>\n <div className=\"min-w-0\">\n <p className=\"truncate text-[14px] font-semibold text-ink\">\n {brief.subject || names || 'Prepared conversation'}\n </p>\n <p className=\"font-mono text-[10.5px] text-ink-4\">\n {[\n brief.subject ? names : '',\n brief.channel ? `Channel ${brief.channel}` : 'Any channel',\n brief.type_key ? `Type ${brief.type_key}` : '',\n brief.status === 'prepared'\n ? 'Prepared'\n : brief.status === 'used'\n ? 'Call held'\n : 'Discarded',\n ]\n .filter(Boolean)\n .join(' · ')}\n </p>\n </div>\n {editor ?? (\n <div className=\"group/brief-content relative\">\n <div\n className={cn(\n 'rounded-md border border-rule-2 bg-surface-2/60 px-3 py-2.5',\n 'text-[13px] leading-relaxed text-ink-2 overflow-y-auto [scrollbar-width:thin]',\n renderContent ? null : 'whitespace-pre-wrap',\n contentClassName,\n )}\n >\n {renderContent ? renderContent(brief.content) : brief.content}\n </div>\n {onEdit ? (\n <AriaButton\n aria-label=\"Edit brief\"\n onPress={onEdit}\n className={cn(\n 'absolute right-1.5 top-1.5 inline-flex size-7 cursor-pointer items-center justify-center',\n 'rounded-md bg-surface/80 text-ink-3 outline-none transition-opacity',\n 'opacity-0 group-hover/brief-content:opacity-100 focus-visible:opacity-100',\n 'data-[hovered]:bg-surface-3 data-[hovered]:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <Pencil className=\"size-3.5\" aria-hidden />\n </AriaButton>\n ) : null}\n </div>\n )}\n {onCall ? (\n <div className=\"flex flex-col gap-2 border-t border-rule-2 pt-3\">\n {contacts.length > 1 ? (\n <Select\n aria-label=\"Who to call\"\n selectedKey={contact?.id ?? ''}\n onSelectionChange={(key) => {\n setPickedContactId(String(key))\n setPickedNumber('')\n }}\n options={contacts.map((entry) => ({ id: entry.id, label: entry.name || entry.id }))}\n />\n ) : null}\n {numbers.length > 1 ? (\n <Select\n aria-label=\"Number to call\"\n selectedKey={phoneNumber}\n onSelectionChange={(key) => setPickedNumber(String(key))}\n options={numbers.map((number) => ({ id: number, label: number }))}\n />\n ) : (\n <p className=\"font-mono text-[12px] text-ink-3\">\n {phoneNumber ||\n (contact ? 'This contact has no phone number on file.' : 'No contact to call.')}\n </p>\n )}\n {controls}\n {callDisabledReason ? (\n <p className=\"text-[12px] text-warning\">{callDisabledReason}</p>\n ) : null}\n {isCallButtonHidden ? null : (\n <div className=\"flex justify-end\">\n <Button\n isDisabled={isCallDisabled || !isOpen || phoneNumber === '' || !contact}\n onPress={() => contact && onCall(contact, phoneNumber)}\n >\n <Phone className=\"size-3.5\" aria-hidden />\n {callLabel}\n </Button>\n </div>\n )}\n </div>\n ) : null}\n </div>\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport {\n Dialog as AriaDialog,\n type DialogProps as AriaDialogProps,\n DialogTrigger as AriaDialogTrigger,\n type DialogTriggerProps as AriaDialogTriggerProps,\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n type ModalOverlayProps as AriaModalOverlayProps,\n Heading,\n type HeadingProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Modal — shadcn-shaped API over RAC's DialogTrigger + ModalOverlay + Modal\n + Dialog primitives. Composition mirrors:\n\n <Modal> // stateful root (uncontrolled or controlled)\n <Button>Open</Button> // first child = trigger\n <ModalContent> // portaled overlay + panel\n <ModalHeader>\n <ModalTitle>…</ModalTitle> // auto-wires aria-labelledby\n <ModalDescription>…</ModalDescription>\n </ModalHeader>\n <ModalBody>…</ModalBody>\n <ModalFooter>\n <Button slot=\"close\" variant=\"ghost\">Cancel</Button>\n <Button>Confirm</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n ========================================================================= */\n\n/** Stateful root. Pass `isOpen` + `onOpenChange` for controlled usage. */\nexport function Modal(props: AriaDialogTriggerProps) {\n return <AriaDialogTrigger {...props} />\n}\n\nexport type ModalContentProps = AriaModalOverlayProps & {\n /** Disable backdrop click to close. Default: backdrop closes. */\n isDismissable?: boolean\n /** Children of the Dialog element. Supports render-prop form `({ close }) => …`. */\n children: AriaDialogProps['children']\n /** Visual override for the panel wrapper (affects width, padding, etc.). */\n modalClassName?: string\n}\n\n/**\n * Portaled overlay + floating panel + dialog role. Backdrop darkens the page\n * with a warm ink tint; panel uses vellum bg + rule border + the float shadow.\n */\nexport function ModalContent({\n children,\n className,\n modalClassName,\n isDismissable = true,\n ...props\n}: ModalContentProps) {\n return (\n <AriaModalOverlay\n isDismissable={isDismissable}\n {...props}\n className={(renderProps) =>\n cn(\n 'fixed inset-0 z-50 flex items-center justify-center p-4',\n // Warm ink scrim — stays in the Proteos palette (no pure black).\n 'bg-[color-mix(in_oklab,var(--color-ink)_40%,transparent)]',\n 'entering:animate-in entering:fade-in-0 entering:duration-150',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-100',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <AriaModal\n className={cn(\n 'w-full max-w-lg',\n // Cap the panel at the viewport (minus the overlay's p-4) and lay it\n // out as a column so a tall body scrolls instead of overflowing the\n // screen. Short modals are unaffected — height still tracks content.\n 'flex flex-col max-h-[calc(100dvh-2rem)]',\n 'bg-surface border border-rule rounded-lg',\n 'shadow-[var(--shadow-float)]',\n 'entering:animate-in entering:zoom-in-95 entering:slide-in-from-top-2 entering:duration-150',\n 'exiting:animate-out exiting:zoom-out-95 exiting:duration-100',\n modalClassName,\n )}\n >\n <AriaDialog className=\"outline-none flex flex-col min-h-0 overflow-hidden\">\n {children}\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n )\n}\n\n/* ---------- slots (each owns its padding, like Card) ----------------------- */\n\n/** Padded top block. Contains `<ModalTitle>` and optionally `<ModalDescription>`. */\nexport function ModalHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div {...props} className={cn('shrink-0 px-5 pt-5 pb-3 flex flex-col gap-1.5', className)} />\n}\n\n/** The modal's accessible name. Uses RAC `<Heading slot=\"title\">` so the\n * Dialog's `aria-labelledby` points here automatically. */\nexport function ModalTitle({ className, ...props }: Omit<HeadingProps, 'slot'>) {\n return (\n <Heading\n slot=\"title\"\n {...props}\n className={cn(\n 'font-sans font-medium text-[20px] leading-[1.25] tracking-[-0.015em] text-ink',\n className,\n )}\n />\n )\n}\n\n/** Supporting copy under the title. */\nexport function ModalDescription({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return <p {...props} className={cn('text-[14px] leading-[1.55] text-ink-3', className)} />\n}\n\n/** Padded main content block — put forms, text, lists, etc. here. */\nexport function ModalBody({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n // The scroll region: caps at the panel's spare height and scrolls when\n // the content is taller, leaving header + footer pinned.\n 'min-h-0 overflow-y-auto px-5 py-3 flex flex-col gap-3 text-[14px] text-ink-2',\n className,\n )}\n />\n )\n}\n\n/** Action row at the bottom. Right-aligned. Place a `<Separator />` above\n * it when you want the dashed divider between body and footer. */\nexport function ModalFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn('shrink-0 flex justify-end items-center gap-2', 'px-5 pt-3 pb-5', className)}\n />\n )\n}\n","import type { Contact, ConversationBrief } from '@proteos/sdk'\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { ModalBody, ModalContent, ModalHeader, ModalTitle } from '../modal'\nimport { ConversationBriefCard } from './conversation-brief-card'\nimport { ConversationBriefPreview } from './conversation-brief-preview'\nimport {\n type ConversationBriefClient,\n type ConversationBriefOutcome,\n conversationBriefOutcomeFor,\n isDialableConversationBrief,\n} from './types'\n\n/* =========================================================================\n ConversationBriefReview — the connected prepared-call entry point: loads the brief\n (and its contact) through the injected client, renders ConversationBriefCard, and\n owns what \"Open Brief\" does.\n\n The open action is the seam. Left alone it opens a modal with the\n ConversationBriefPreview — a read-only preview unless the host passes `onCall`\n (the web app does: it dials through its softphone). Passed `onOpenCall`,\n it hands the whole interaction to the host: the built-in modal is never\n rendered. That is how a sandboxed custom component opens a prepared call —\n an iframe cannot dial, so it asks the host (useOpenCall) to preview + dial.\n\n A brief that is ALREADY terminal when it loads (used on a call, discarded)\n settles the card immediately and reports `onOutcome` once.\n ========================================================================= */\n\nexport interface ConversationBriefReviewProps {\n conversationBriefId: string\n /** Injected fetch surface — see createConversationBriefClient. */\n client: ConversationBriefClient\n /**\n * FULL REPLACEMENT for the open action's default (the built-in preview\n * modal). When supplied the built-in modal is never rendered.\n */\n onOpenCall?: (conversationBriefId: string) => void\n /** Built-in modal only: place the call to this contact + number (the\n * host's dial). Absent ⇒ the modal is a read-only preview. */\n onCall?: (brief: ConversationBrief, contact: Contact, phoneNumber: string) => void\n /** Built-in modal only: disable the Call button + explain why. */\n isCallDisabled?: boolean\n callDisabledReason?: string\n /** Fires at most once, when the brief is (or becomes) terminal. */\n onOutcome?: (outcome: ConversationBriefOutcome, brief: ConversationBrief) => void\n /** The brief could not be loaded. The card renders nothing in that case. */\n onLoadError?: (error: Error) => void\n /** Built-in modal heading. Default 'Prepared conversation'. */\n modalTitle?: string\n modalClassName?: string\n /** Built-in modal overlay classes — where a host raises the z tier. */\n overlayClassName?: string\n openLabel?: string\n className?: string\n /** Built-in modal only: markdown renderer for the guidance text. */\n renderContent?: (content: string) => ReactNode\n}\n\nexport function ConversationBriefReview({\n conversationBriefId,\n client,\n onOpenCall,\n onCall,\n isCallDisabled = false,\n callDisabledReason,\n onOutcome,\n onLoadError,\n modalTitle = 'Prepared conversation',\n modalClassName = 'max-w-2xl',\n overlayClassName,\n openLabel,\n className,\n renderContent,\n}: ConversationBriefReviewProps) {\n const [brief, setBrief] = useState<ConversationBrief | null>(null)\n const [contacts, setContacts] = useState<Contact[]>([])\n const [isOpen, setIsOpen] = useState(false)\n const [outcome, setOutcome] = useState<ConversationBriefOutcome | null>(null)\n\n const onOutcomeRef = useRef(onOutcome)\n onOutcomeRef.current = onOutcome\n const onLoadErrorRef = useRef(onLoadError)\n onLoadErrorRef.current = onLoadError\n\n const hasSettledRef = useRef(false)\n const settle = useCallback((next: ConversationBriefOutcome, settled: ConversationBrief) => {\n setOutcome(next)\n setIsOpen(false)\n if (hasSettledRef.current) return\n hasSettledRef.current = true\n onOutcomeRef.current?.(next, settled)\n }, [])\n\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const loaded = await client.getConversationBrief(conversationBriefId)\n if (cancelled) return\n setBrief(loaded)\n const terminal = conversationBriefOutcomeFor(loaded.status)\n if (terminal) settle(terminal, loaded)\n const people = await Promise.all(\n loaded.contact_ids.map((contactId) => client.getContact(contactId).catch(() => null)),\n )\n if (!cancelled) setContacts(people.filter((person): person is Contact => person !== null))\n } catch (error) {\n if (cancelled) return\n onLoadErrorRef.current?.(error instanceof Error ? error : new Error(String(error)))\n }\n })()\n return () => {\n cancelled = true\n }\n }, [client, conversationBriefId, settle])\n\n const open = () => {\n if (onOpenCall) {\n onOpenCall(conversationBriefId)\n return\n }\n setIsOpen(true)\n }\n\n if (!brief) return null\n\n return (\n <>\n <ConversationBriefCard\n title={brief.subject || namesOf(contacts) || 'Prepared conversation'}\n summary={summaryFor(brief, contacts)}\n outcome={outcome}\n onOpen={open}\n {...(openLabel !== undefined ? { openLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n {onOpenCall ? null : (\n <ModalContent\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n modalClassName={modalClassName}\n {...(overlayClassName !== undefined ? { className: overlayClassName } : {})}\n >\n <ModalHeader>\n <ModalTitle>{modalTitle}</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"min-h-0 overflow-y-auto\">\n <ConversationBriefPreview\n brief={brief}\n contacts={contacts}\n contentClassName=\"max-h-[50dvh]\"\n isCallDisabled={isCallDisabled}\n {...(callDisabledReason !== undefined ? { callDisabledReason } : {})}\n {...(renderContent !== undefined ? { renderContent } : {})}\n {...(onCall && isDialableConversationBrief(brief)\n ? {\n onCall: (contact: Contact, phoneNumber: string) => {\n setIsOpen(false)\n onCall(brief, contact, phoneNumber)\n },\n }\n : {})}\n />\n </ModalBody>\n </ModalContent>\n )}\n </>\n )\n}\n\n/** The people's names, comma-joined. */\nexport function namesOf(contacts: Contact[]): string {\n return contacts\n .map((contact) => contact.name)\n .filter(Boolean)\n .join(', ')\n}\n\n/** Who + where + what: the people (when the subject took the headline),\n * the channel, the type, then the opening line. */\nexport function summaryFor(brief: ConversationBrief, contacts: Contact[]): string {\n const firstLine =\n brief.content\n .split('\\n')\n .find((line) => line.trim() !== '')\n ?.trim() ?? ''\n return [\n brief.subject ? namesOf(contacts) : '',\n brief.channel ?? '',\n brief.type_key ?? '',\n firstLine,\n ]\n .filter(Boolean)\n .join(' · ')\n}\n","import type { ConversationClient } from '@proteos/sdk'\n\nimport type { ConversationBriefClient } from './types'\n\n/**\n * One-liner adapter from the sdk ConversationClient (web app:\n * `useSdk().conversation`; custom components: `useSdk().conversations`) to\n * the conversation-brief surfaces' injected client. Type-only sdk import.\n */\nexport function createConversationBriefClient(\n conversation: Pick<ConversationClient, 'conversationBriefs' | 'contacts'>,\n): ConversationBriefClient {\n return {\n getConversationBrief: (conversationBriefId) =>\n conversation.conversationBriefs.get(conversationBriefId),\n getContact: (contactId) => conversation.contacts.get(contactId),\n }\n}\n","import { formatAmount, parseAmount } from '@proteos/sdk'\nimport { ChevronDown } from 'lucide-react'\nimport { type ReactNode, useEffect, useState } from 'react'\nimport {\n Button as AriaSelectTrigger,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport { type FieldAppearance, fieldControlStyles, fieldErrorStyles, type FieldSize } from '../field/field'\n\n/* =========================================================================\n CurrencyInput — a single money field: an amount input plus a trailing\n currency-symbol button that opens a symbol+code dropdown (the same shape as\n the date-picker's trailing calendar trigger).\n\n The amount is held and emitted as a canonical decimal STRING (never\n parseFloat'd) so precision and trailing zeros survive; it is *displayed* in\n the viewer's locale (grouping + decimal separator) and parsed back from that\n notation on input. The selectable currencies are passed in via\n `currencyOptions` so the lib stays free of any ISO/Intl dataset; the locale\n number helpers come from the SDK so there's one well-defined implementation.\n ========================================================================= */\n\nexport interface CurrencyInputValue {\n amount: string\n currency_code: string\n}\n\nexport interface CurrencyInputOption {\n code: string\n /** The currency's symbol (e.g. \"$\", \"€\"); falls back to the code. */\n symbol?: string\n}\n\nexport interface CurrencyInputProps {\n value: CurrencyInputValue | null\n onChange: (next: CurrencyInputValue | null) => void\n currencyOptions: ReadonlyArray<CurrencyInputOption>\n /** Locale for the amount's grouping + decimal separators. Defaults to runtime. */\n locale?: string\n isReadOnly?: boolean\n isInvalid?: boolean\n errorMessage?: ReactNode\n size?: FieldSize\n appearance?: FieldAppearance\n placeholder?: string\n autoFocus?: boolean\n 'aria-label'?: string\n onBlur?: () => void\n className?: string\n}\n\nexport function CurrencyInput({\n value,\n onChange,\n currencyOptions,\n locale,\n isReadOnly,\n isInvalid,\n errorMessage,\n size,\n appearance,\n placeholder,\n autoFocus,\n 'aria-label': ariaLabel,\n onBlur,\n className,\n}: CurrencyInputProps) {\n const amount = value?.amount ?? ''\n const code = value?.currency_code ?? ''\n\n // `draft` is the text shown in the input. It's grouped (e.g. \"1.234,56\") when\n // the field is idle and ungrouped (\"1234,56\") while editing, so grouping\n // doesn't fight the caret mid-type. The canonical value still flows out via\n // onChange on every keystroke.\n const [draft, setDraft] = useState(() => formatAmount(amount, locale, { grouped: true }))\n const [isEditing, setIsEditing] = useState(false)\n\n useEffect(() => {\n if (!isEditing) setDraft(formatAmount(amount, locale, { grouped: true }))\n }, [amount, locale, isEditing])\n\n const emit = (nextAmount: string, nextCode: string) => {\n if (nextAmount === '' && nextCode === '') {\n onChange(null)\n return\n }\n onChange({ amount: nextAmount, currency_code: nextCode })\n }\n\n const selectedSymbol = currencyOptions.find((option) => option.code === code)?.symbol ?? code\n\n const styles = fieldControlStyles({ size, appearance, ...(isInvalid ? { invalid: true } : {}) })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n <div className={cn(styles.box(), 'flex items-center gap-1 pr-1', focusWithin)}>\n <input\n className={cn(\n 'min-w-0 flex-1 bg-transparent text-ink outline-none tabular-nums',\n styles.content(),\n // Sit a touch lower than a standard field by trimming the vertical\n // padding (cell mode keeps the fixed 29px row-editor height).\n appearance === 'cell' ? '' : size === 'sm' ? 'py-1' : 'py-1.5',\n )}\n inputMode=\"decimal\"\n value={draft}\n onChange={(event) => {\n setDraft(event.target.value)\n emit(parseAmount(event.target.value, locale), code)\n }}\n onFocus={() => {\n setIsEditing(true)\n setDraft(formatAmount(amount, locale, { grouped: false }))\n }}\n onBlur={() => {\n setIsEditing(false)\n const canonical = parseAmount(draft, locale)\n setDraft(formatAmount(canonical, locale, { grouped: true }))\n emit(canonical, code)\n onBlur?.()\n }}\n readOnly={isReadOnly ?? false}\n autoFocus={autoFocus ?? false}\n placeholder={placeholder ?? ''}\n aria-label={ariaLabel ? `${ariaLabel} amount` : 'Amount'}\n />\n\n <AriaSelect\n aria-label={ariaLabel ? `${ariaLabel} currency` : 'Currency'}\n selectedKey={code === '' ? null : code}\n onSelectionChange={(key) => emit(amount, key == null ? '' : String(key))}\n isDisabled={isReadOnly ?? false}\n >\n <AriaSelectTrigger\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-0.5 rounded-md px-1.5',\n 'text-ink-2 outline-none hover:bg-surface-2 hover:text-ink',\n 'cursor-pointer focus-visible:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-45',\n )}\n >\n <span className=\"min-w-[1ch] text-center tabular-nums\">{selectedSymbol || '¤'}</span>\n <ChevronDown className=\"size-3 opacity-60\" aria-hidden />\n </AriaSelectTrigger>\n\n <Popover\n offset={6}\n className={cn(\n 'min-w-[9rem] rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <ListBox className=\"max-h-72 overflow-auto outline-none\">\n {currencyOptions.map((option) => (\n <ListBoxItem\n key={option.code}\n id={option.code}\n textValue={`${option.symbol ?? ''} ${option.code}`}\n className={cn(\n 'flex items-center gap-2 rounded-[6px] px-2.5 py-1.5 text-[14px] text-ink-2',\n 'cursor-pointer select-none outline-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n )}\n >\n <span className=\"w-5 shrink-0 text-ink-3 tabular-nums\">{option.symbol ?? ''}</span>\n <span className=\"font-medium\">{option.code}</span>\n </ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </AriaSelect>\n </div>\n\n {errorMessage && appearance !== 'cell' ? (\n <div className={fieldErrorStyles}>{errorMessage}</div>\n ) : null}\n </div>\n )\n}\n","import type { AnchorHTMLAttributes, MouseEvent, ReactNode } from 'react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Cell helpers — attribute-driven only.\n These exist because RecordTable auto-generates columns from\n Entity.attributes and dispatches the renderer at runtime by AttributeType.\n Bespoke per-domain cells (status pills, lane pairs, deltas, avatars+name)\n are NOT here — the consumer composes those inline via `column.cell`,\n matching the shadcn/TanStack idiom. The lib already exports Badge / Avatar\n / etc. for those compositions.\n ========================================================================= */\n\n/* ---------- DateCell ----------------------------------------------------- */\n\nexport type DateCellProps = {\n value: string | number | Date | null | undefined\n locale?: string\n options?: Intl.DateTimeFormatOptions\n fallback?: ReactNode\n className?: string\n}\n\nconst DEFAULT_DATE_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n}\n\nexport function DateCell({\n value,\n locale,\n options = DEFAULT_DATE_OPTIONS,\n fallback = '—',\n className,\n}: DateCellProps) {\n if (value == null || value === '') return <span className={className}>{fallback}</span>\n const date = value instanceof Date ? value : new Date(value)\n if (Number.isNaN(date.getTime())) return <span className={className}>{fallback}</span>\n return <span className={className}>{date.toLocaleDateString(locale, options)}</span>\n}\n\n/* ---------- DateTimeCell ------------------------------------------------- */\n\nexport type DateTimeCellProps = DateCellProps\n\nconst DEFAULT_DATETIME_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n}\n\nexport function DateTimeCell({\n value,\n locale,\n options = DEFAULT_DATETIME_OPTIONS,\n fallback = '—',\n className,\n}: DateTimeCellProps) {\n if (value == null || value === '') return <span className={className}>{fallback}</span>\n const date = value instanceof Date ? value : new Date(value)\n if (Number.isNaN(date.getTime())) return <span className={className}>{fallback}</span>\n return <span className={className}>{date.toLocaleString(locale, options)}</span>\n}\n\n/* ---------- BooleanCell -------------------------------------------------- */\n\nexport type BooleanCellProps = {\n value: boolean | null | undefined\n className?: string\n}\n\nexport function BooleanCell({ value, className }: BooleanCellProps) {\n if (value === true) {\n return (\n <span aria-label=\"true\" className={cn('text-success', className)}>\n <CheckIcon />\n </span>\n )\n }\n if (value === false) {\n return (\n <span aria-label=\"false\" className={cn('text-ink-4', className)}>\n <MinusIcon />\n </span>\n )\n }\n return <span className={cn('text-ink-4', className)}>—</span>\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.5 7.5 L5.5 10.5 L11.5 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction MinusIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 7 L11 7\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\n/* ---------- TruncateCell ------------------------------------------------- */\n\nexport type TruncateCellProps = {\n value: ReactNode\n title?: string\n className?: string\n}\n\n/**\n * The parent TableCell already clips with `overflow-hidden text-ellipsis`,\n * so this just adds a `title` attribute for the native tooltip when the\n * value is a string.\n */\nexport function TruncateCell({ value, title, className }: TruncateCellProps) {\n const tooltip = title ?? (typeof value === 'string' ? value : undefined)\n return (\n <span className={cn('truncate min-w-0', className)} title={tooltip}>\n {value ?? '—'}\n </span>\n )\n}\n\n/* ---------- LinkCell ----------------------------------------------------- */\n\nexport type LinkCellProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n children: ReactNode\n}\n\n/**\n * An anchor that stops click propagation so a row-click handler on the\n * parent <TableRow> doesn't fire alongside the link navigation.\n */\nexport function LinkCell({ children, onClick, className, ...props }: LinkCellProps) {\n return (\n <a\n {...props}\n onClick={(e: MouseEvent<HTMLAnchorElement>) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n className={cn(\n 'text-ink underline decoration-rule underline-offset-2 hover:decoration-ink',\n className,\n )}\n >\n {children}\n </a>\n )\n}\n","import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine'\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'\nimport {\n attachClosestEdge,\n type Edge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge'\nimport { GripVertical, X } from 'lucide-react'\nimport {\n type CSSProperties,\n type HTMLAttributes,\n type MouseEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Table — pure presentational chrome.\n Div + ARIA grid roles (not semantic <table>) so virtualizers can position\n rows absolutely. The slot pattern mirrors Card: each slot owns its own\n spacing; the root carries no padding. The same primitives compose for\n short non-virtualized tables and for the virtualized DataTable layer.\n ========================================================================= */\n\nconst tableStyles = tv({\n base: ['flex flex-col overflow-hidden min-h-0', 'text-[14px] text-ink-2'],\n variants: {\n variant: {\n // Tables sit on the page bg, not the raised surface color — rows read\n // as part of the page, framed by the panel border (Tonio's call, 2026-07).\n panel: ['bg-bg border border-rule rounded-lg', 'shadow-[var(--shadow-rest)]'],\n bare: '',\n },\n },\n defaultVariants: { variant: 'panel' },\n})\n\nexport type TableVariants = VariantProps<typeof tableStyles>\nexport type TableProps = HTMLAttributes<HTMLDivElement> &\n TableVariants & {\n 'aria-label'?: string\n }\n\nexport function Table({ variant, className, ...props }: TableProps) {\n return <div role=\"grid\" {...props} className={cn(tableStyles({ variant }), className)} />\n}\n\n/* ---------- Header row ---------------------------------------------------- */\n\nconst tableHeaderStyles = tv({\n base: [\n 'flex items-stretch shrink-0',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n 'border-b border-rule',\n ],\n variants: {\n sticky: { true: 'sticky top-0 z-[2]', false: '' },\n },\n defaultVariants: { sticky: false },\n})\n\nexport type TableHeaderProps = HTMLAttributes<HTMLDivElement> & {\n sticky?: boolean\n}\n\nexport function TableHeader({ sticky, className, ...props }: TableHeaderProps) {\n return <div role=\"row\" {...props} className={cn(tableHeaderStyles({ sticky }), className)} />\n}\n\n/* ---------- Header cell --------------------------------------------------- */\n\nexport const tableHeaderCellStyles = tv({\n base: [\n // `relative` is the default positioning context (for the drag-edge\n // indicator + sort affordance). Declared as a class — not an inline\n // style — so the `sticky` variant below can override it; an inline\n // `position` would always win and a sticky gutter header could never\n // freeze.\n 'relative',\n 'flex items-center gap-[7px] shrink-0 select-none',\n 'px-[14px] h-[36px]',\n 'border-r border-rule-2 last:border-r-0',\n 'font-mono text-[10.5px] font-normal uppercase tracking-[0.08em]',\n 'text-ink-4',\n 'transition-[background-color,color] duration-150',\n ],\n variants: {\n align: {\n left: 'justify-start text-left',\n right: 'justify-end text-right',\n center: 'justify-center text-center',\n },\n interactive: {\n true: [\n 'cursor-pointer outline-none appearance-none border-0 border-r border-rule-2 last:border-r-0 bg-transparent',\n 'hover:bg-surface-2 hover:text-ink-2',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n ],\n false: '',\n },\n active: {\n true: 'text-ink',\n false: '',\n },\n sticky: {\n left: 'sticky left-0 z-[3] bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n right: 'sticky right-0 z-[3] bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n false: '',\n },\n },\n defaultVariants: { align: 'left', interactive: false, active: false, sticky: false },\n})\n\nexport type SortDirection = 'asc' | 'desc' | null\n\n/** Discriminator stored on every column drag payload. */\nexport const COLUMN_DRAG_KIND = 'proteos:table:column' as const\n\nexport type ColumnDragData = {\n kind: typeof COLUMN_DRAG_KIND\n columnId: string\n}\n\nexport function isColumnDragData(\n data: Record<string | symbol, unknown>,\n): data is ColumnDragData & Record<string | symbol, unknown> {\n return data.kind === COLUMN_DRAG_KIND && typeof data.columnId === 'string'\n}\n\ntype DragState =\n | { kind: 'idle' }\n | { kind: 'dragging' }\n | { kind: 'over'; edge: Extract<Edge, 'left' | 'right'> }\n\nexport type TableHeaderCellProps = Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> & {\n width?: number | string\n align?: 'left' | 'right' | 'center'\n /** Pin the cell to the left or right edge during horizontal scroll. */\n sticky?: 'left' | 'right' | false\n /**\n * When non-null, renders a sort affordance and treats clicks on the cell\n * body as a sort toggle. `null` (the default) is \"not sortable\".\n */\n sortDirection?: SortDirection\n onSortToggle?: () => void\n /**\n * Make the header draggable for column reorder. Requires `columnId`.\n * The cell registers pragmatic-dnd `draggable` + `dropTargetForElements`\n * with left/right edge detection; the actual reorder runs in a global\n * `monitorForElements` (e.g. inside DataTable) by reading the published\n * `ColumnDragData`.\n */\n draggable?: boolean\n columnId?: string\n /**\n * When provided, renders a trailing `×` button. Click events\n * `stopPropagation` so removal never starts a drag or toggles sort.\n */\n onRemove?: () => void\n /** Aria label fragment used in the remove button label and any drag a11y. */\n ariaLabel?: string\n}\n\nexport function TableHeaderCell({\n width,\n align = 'left',\n className,\n style,\n children,\n sortDirection = null,\n onSortToggle,\n draggable: isDraggable = false,\n columnId,\n onRemove,\n ariaLabel,\n sticky = false,\n ...rest\n}: TableHeaderCellProps) {\n const cellRef = useRef<HTMLDivElement | null>(null)\n const handleRef = useRef<HTMLSpanElement | null>(null)\n const [dragState, setDragState] = useState<DragState>({ kind: 'idle' })\n\n useEffect(() => {\n if (!isDraggable || !columnId) return\n const cell = cellRef.current\n const handle = handleRef.current\n if (!cell || !handle) return\n\n const data: ColumnDragData = { kind: COLUMN_DRAG_KIND, columnId }\n\n return combine(\n draggable({\n element: cell,\n dragHandle: handle,\n getInitialData: () => ({ ...data }),\n onDragStart: () => setDragState({ kind: 'dragging' }),\n onDrop: () => setDragState({ kind: 'idle' }),\n }),\n dropTargetForElements({\n element: cell,\n canDrop: ({ source }) =>\n isColumnDragData(source.data) && source.data.columnId !== columnId,\n getData: ({ input, element }) =>\n attachClosestEdge(\n { ...data },\n { input, element, allowedEdges: ['left', 'right'] },\n ),\n getIsSticky: () => true,\n onDragEnter: ({ self }) => {\n const edge = extractClosestEdge(self.data)\n if (edge === 'left' || edge === 'right') setDragState({ kind: 'over', edge })\n },\n onDrag: ({ self }) => {\n const edge = extractClosestEdge(self.data)\n if (edge === 'left' || edge === 'right') {\n setDragState((prev) =>\n prev.kind === 'over' && prev.edge === edge ? prev : { kind: 'over', edge },\n )\n }\n },\n onDragLeave: () => setDragState({ kind: 'idle' }),\n onDrop: () => setDragState({ kind: 'idle' }),\n }),\n )\n }, [isDraggable, columnId])\n\n const widthStyle: CSSProperties = width != null ? { width, flexBasis: width } : {}\n const isSortable = !!onSortToggle\n const active = sortDirection !== null\n\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\n if (!isSortable) return\n const target = e.target as HTMLElement\n if (target.closest('[data-dnd-handle=\"true\"]')) return\n if (target.closest('[data-column-remove=\"true\"]')) return\n onSortToggle?.()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isSortable) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSortToggle?.()\n }\n }\n\n const ariaSort: 'ascending' | 'descending' | 'none' | undefined = isSortable\n ? sortDirection === 'asc'\n ? 'ascending'\n : sortDirection === 'desc'\n ? 'descending'\n : 'none'\n : undefined\n\n return (\n <div\n {...rest}\n ref={cellRef}\n role=\"columnheader\"\n aria-sort={ariaSort}\n tabIndex={isSortable ? 0 : undefined}\n style={{ ...widthStyle, ...style }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n tableHeaderCellStyles({ align, interactive: isSortable, active, sticky }),\n 'group/header',\n dragState.kind === 'dragging' ? 'opacity-40' : '',\n className,\n )}\n >\n {isDraggable && columnId ? (\n <span\n ref={handleRef}\n data-dnd-handle=\"true\"\n aria-hidden=\"true\"\n className={cn(\n 'inline-flex items-center justify-center shrink-0 -ml-1.5',\n 'cursor-grab active:cursor-grabbing text-ink-4',\n 'opacity-0 group-hover/header:opacity-100 transition-opacity',\n )}\n >\n <GripVertical className=\"size-3\" />\n </span>\n ) : null}\n\n <span\n className={cn(\n 'flex items-center gap-[7px] min-w-0 flex-1',\n align === 'right' ? 'justify-end' : align === 'center' ? 'justify-center' : 'justify-start',\n )}\n >\n <span className=\"truncate\">{children}</span>\n {isSortable ? <SortIcon dir={sortDirection} active={active} /> : null}\n </span>\n\n {onRemove ? (\n <button\n type=\"button\"\n data-column-remove=\"true\"\n aria-label={`Remove column ${ariaLabel ?? 'column'}`}\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex items-center justify-center shrink-0 size-4 rounded',\n 'text-ink-4 hover:text-ink hover:bg-surface-2',\n 'opacity-0 group-hover/header:opacity-100 focus-visible:opacity-100',\n 'transition-opacity outline-none focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n\n {dragState.kind === 'over' ? (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'pointer-events-none absolute inset-y-0 z-10 w-0.5 bg-accent',\n dragState.edge === 'left' ? '-left-px' : '-right-px',\n )}\n />\n ) : null}\n </div>\n )\n}\n\nfunction SortIcon({ dir, active }: { dir: SortDirection; active: boolean }) {\n return (\n <svg\n width=\"8\"\n height=\"11\"\n viewBox=\"0 0 8 11\"\n aria-hidden=\"true\"\n className={cn('shrink-0', active ? 'text-accent' : 'text-ink-4')}\n >\n <path d=\"M4 0.5 L7.5 4 L0.5 4 Z\" fill=\"currentColor\" opacity={dir === 'asc' ? 1 : 0.22} />\n <path d=\"M4 10.5 L0.5 7 L7.5 7 Z\" fill=\"currentColor\" opacity={dir === 'desc' ? 1 : 0.22} />\n </svg>\n )\n}\n\n/**\n * Trailing flexible spacer so the header row fills the full row width when\n * the sum of column widths is less than the viewport. Matches the design's\n * `pt-th--spacer`.\n */\nexport function TableHeaderSpacer({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n aria-hidden=\"true\"\n {...props}\n className={cn('flex-1 h-[36px] border-r-0', 'bg-transparent pointer-events-none', className)}\n />\n )\n}\n\n/* ---------- Body / scroll container -------------------------------------- */\n\n/* Scrollbar chrome shared by `TableBody` (standalone short-table scroller)\n and `TableScroller` (the virtualized DataTable's single both-axes scroller). */\nconst scrollbarChrome = [\n '[scrollbar-width:thin]',\n '[scrollbar-color:var(--color-rule)_transparent]',\n '[&::-webkit-scrollbar]:size-3',\n '[&::-webkit-scrollbar-thumb]:rounded-pill',\n '[&::-webkit-scrollbar-thumb]:bg-rule',\n '[&::-webkit-scrollbar-thumb]:border-[3px]',\n '[&::-webkit-scrollbar-thumb]:border-solid',\n '[&::-webkit-scrollbar-thumb]:border-bg',\n '[&::-webkit-scrollbar-thumb:hover]:bg-ink-4',\n '[&::-webkit-scrollbar-corner]:bg-bg',\n] as const\n\nconst tableBodyStyles = tv({\n base: ['flex-1 min-h-0 overflow-auto relative', ...scrollbarChrome],\n})\n\nexport type TableBodyProps = HTMLAttributes<HTMLDivElement> & {\n ref?: Ref<HTMLDivElement>\n}\n\nexport function TableBody({ className, ref, ...props }: TableBodyProps) {\n return <div role=\"rowgroup\" ref={ref} {...props} className={cn(tableBodyStyles(), className)} />\n}\n\n/* ---------- Scroller ------------------------------------------------------ */\n\n/* `TableScroller` — the single scroll container for the virtualized\n DataTable. It scrolls on BOTH axes so a min-width content track (sticky\n header + rows) scrolls horizontally as one unit, the sticky header pins to\n the top on vertical scroll, and any `sticky left-0` gutter column freezes\n to the left on horizontal scroll (Excel-style). `relative` makes it the\n offsetParent so the virtualizer can measure the row list's offset (the\n sticky header's height) for its `scrollMargin`. Presentational: ARIA sees\n through it to the header row + rowgroup it contains. */\nconst tableScrollerStyles = tv({\n base: ['relative flex-1 min-h-0 overflow-auto', ...scrollbarChrome],\n})\n\nexport function TableScroller({ className, ref, ...props }: TableBodyProps) {\n return (\n <div role=\"presentation\" ref={ref} {...props} className={cn(tableScrollerStyles(), className)} />\n )\n}\n\n/* ---------- Row ----------------------------------------------------------- */\n\n/* Stripe + hover tint rows by mixing ink into the page bg they sit on. Ink is\n always the opposing pole of bg, so one formula holds in every theme —\n stripes darken on paper/light and lighten on dark. surface-2 can't do this:\n it's a surface-relative step and collapses into bg in the light theme.\n Strength is a per-theme knob (--row-stripe/--row-hover in styles.css) since a\n near-white base shows a given delta more; --row-hover > --row-stripe keeps\n the states ordered in every theme. */\nconst rowStripeBg = 'bg-[color-mix(in_oklab,var(--color-ink)_var(--row-stripe),var(--color-bg))]'\nconst rowHoverBg =\n 'hover:bg-[color-mix(in_oklab,var(--color-ink)_var(--row-hover),var(--color-bg))]'\n\nconst tableRowStyles = tv({\n base: ['flex items-stretch', 'border-b border-rule-2 last:border-b-0', 'bg-bg'],\n variants: {\n alt: {\n true: rowStripeBg,\n false: '',\n },\n interactive: {\n true: `cursor-pointer ${rowHoverBg}`,\n false: rowHoverBg,\n },\n absolute: {\n true: 'absolute left-0 right-0',\n false: '',\n },\n },\n compoundVariants: [{ alt: true, interactive: true, class: rowHoverBg }],\n defaultVariants: { alt: false, interactive: false, absolute: false },\n})\n\nexport type TableRowProps = HTMLAttributes<HTMLDivElement> & {\n alt?: boolean\n interactive?: boolean\n /**\n * Position the row absolutely (used by virtualizers that translate rows\n * into place via inline `style.transform`).\n */\n absolute?: boolean\n onRowClick?: (e: MouseEvent<HTMLDivElement>) => void\n}\n\nexport function TableRow({\n alt,\n interactive,\n absolute,\n className,\n onRowClick,\n onClick,\n ...props\n}: TableRowProps) {\n return (\n <div\n role=\"row\"\n {...props}\n onClick={(e) => {\n onClick?.(e)\n onRowClick?.(e)\n }}\n className={cn(tableRowStyles({ alt, interactive, absolute }), className)}\n />\n )\n}\n\n/* ---------- Cell ---------------------------------------------------------- */\n\nexport const tableCellStyles = tv({\n base: [\n 'flex items-center shrink-0 min-w-0',\n 'px-[14px]',\n 'whitespace-nowrap overflow-hidden text-ellipsis',\n 'font-sans text-[13px] tracking-[-0.005em]',\n 'text-ink-2',\n ],\n variants: {\n align: {\n left: 'justify-start text-left',\n right: 'justify-end text-right [font-variant-numeric:tabular-nums]',\n center: 'justify-center text-center',\n },\n mono: {\n true: 'font-mono text-[12.5px] [font-feature-settings:\"tnum\",\"zero\"]',\n false: '',\n },\n ink: {\n true: 'text-ink',\n false: '',\n },\n sticky: {\n // Sticky cells inherit the row's background via bg-inherit so the\n // alternating-zebra + hover states pass through.\n left: 'sticky left-0 z-[1] bg-inherit',\n right: 'sticky right-0 z-[1] bg-inherit',\n false: '',\n },\n },\n defaultVariants: { align: 'left', mono: false, ink: false, sticky: false },\n})\n\nexport type TableCellProps = HTMLAttributes<HTMLDivElement> & {\n width?: number | string\n align?: 'left' | 'right' | 'center'\n mono?: boolean\n ink?: boolean\n /** Pin the cell to the left or right edge during horizontal scroll. */\n sticky?: 'left' | 'right' | false\n}\n\nexport function TableCell({\n width,\n align,\n mono,\n ink,\n sticky,\n className,\n style,\n ...props\n}: TableCellProps) {\n const widthStyle: CSSProperties = width != null ? { width, flexBasis: width } : {}\n return (\n <div\n role=\"gridcell\"\n {...props}\n style={{ ...widthStyle, ...style }}\n className={cn(tableCellStyles({ align, mono, ink, sticky }), className)}\n />\n )\n}\n","import type { ReactNode } from 'react'\n\nimport { cn } from '../../../lib/cn'\n\nexport type DataTableEmptyProps = {\n title?: string\n message?: string\n icon?: ReactNode\n action?: ReactNode\n className?: string\n}\n\n/**\n * Empty state shown when the query returns zero rows.\n * Mirrors the design's `pt-empty` block.\n */\nexport function DataTableEmpty({\n title = 'No results',\n message,\n icon,\n action,\n className,\n}: DataTableEmptyProps) {\n return (\n <div\n role=\"status\"\n className={cn(\n 'flex flex-col items-center justify-center gap-2',\n 'px-5 py-16 text-center',\n 'font-sans text-[13px] text-ink-3',\n className,\n )}\n >\n {icon ? <div className=\"text-ink-4\">{icon}</div> : null}\n <div className=\"text-ink text-[14px]\">{title}</div>\n {message ? <div className=\"text-ink-3 max-w-[36ch]\">{message}</div> : null}\n {action ? <div className=\"mt-3\">{action}</div> : null}\n </div>\n )\n}\n","import { cn } from '../../../lib/cn'\nimport { Button } from '../../button'\n\nexport type DataTableErrorProps = {\n error: Error\n onRetry?: () => void\n className?: string\n}\n\nexport function DataTableError({ error, onRetry, className }: DataTableErrorProps) {\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex flex-col items-center justify-center gap-3',\n 'px-5 py-16 text-center',\n 'font-sans text-[13px] text-ink-3',\n className,\n )}\n >\n <div className=\"text-danger text-[14px]\">Something went wrong</div>\n <div className=\"text-ink-3 max-w-[48ch] font-mono text-[12px]\">{error.message}</div>\n {onRetry ? (\n <Button variant=\"ghost\" size=\"sm\" onPress={onRetry}>\n Retry\n </Button>\n ) : null}\n </div>\n )\n}\n","import { Skeleton } from '../../skeleton'\nimport { TableBody, TableCell, TableRow } from '../../table'\n\nexport type DataTableSkeletonProps = {\n rows?: number\n columnWidths?: ReadonlyArray<number | string>\n rowHeight?: number\n}\n\n/**\n * Skeleton placeholder shown while the first page is loading.\n * Renders inside the same TableBody scroller, so the layout doesn't jump\n * when real rows replace it.\n */\nexport function DataTableSkeleton({\n rows = 8,\n columnWidths = [120, 240, 160, 120, 120],\n rowHeight = 32,\n}: DataTableSkeletonProps) {\n return (\n <TableBody role=\"rowgroup\" aria-label=\"Loading rows\">\n {Array.from({ length: rows }).map((_, rowIdx) => (\n <TableRow\n // biome-ignore lint/suspicious/noArrayIndexKey: deterministic placeholder rows\n key={rowIdx}\n alt={rowIdx % 2 === 1}\n style={{ height: rowHeight }}\n >\n {columnWidths.map((w, colIdx) => (\n <TableCell\n // biome-ignore lint/suspicious/noArrayIndexKey: deterministic placeholder cells\n key={colIdx}\n width={w}\n >\n <Skeleton shape=\"text\" className=\"h-3 max-w-[60%]\" />\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n )\n}\n","import { type RefObject, useEffect, useRef } from 'react'\n\nexport type UseInfiniteScrollSentinelOptions = {\n onIntersect: () => void\n /**\n * IntersectionObserver `rootMargin`. Default `200px` so the next page\n * starts fetching before the user scrolls all the way to the bottom.\n */\n rootMargin?: string\n /**\n * Optional scroll-container ref (passed as the observer's `root`). When\n * omitted, the observer uses the viewport.\n */\n root?: Element | null\n enabled?: boolean\n}\n\n/**\n * Mounts a sentinel element ref. When the element scrolls into view (with\n * the given rootMargin), `onIntersect` fires once per visible streak.\n * Used by DataTable to drive `query.fetchNextPage()`.\n */\nexport function useInfiniteScrollSentinel<T extends Element = HTMLDivElement>({\n onIntersect,\n rootMargin = '200px',\n root,\n enabled = true,\n}: UseInfiniteScrollSentinelOptions): RefObject<T | null> {\n const ref = useRef<T | null>(null)\n // Latest callback in a ref so the observer doesn't re-create on every render.\n const cbRef = useRef(onIntersect)\n cbRef.current = onIntersect\n\n useEffect(() => {\n if (!enabled) return\n const node = ref.current\n if (!node) return\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) cbRef.current()\n }\n },\n { root: root ?? null, rootMargin, threshold: 0 },\n )\n observer.observe(node)\n return () => observer.disconnect()\n }, [enabled, rootMargin, root])\n\n return ref\n}\n","import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'\nimport { extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge'\nimport { reorderWithEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/util/reorder-with-edge'\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n type OnChangeFn,\n type Row,\n type SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport {\n type CSSProperties,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { cn } from '../../lib/cn'\nimport { Checkbox } from '../checkbox'\nimport {\n isColumnDragData,\n type SortDirection,\n Table,\n TableCell,\n TableHeader,\n TableHeaderCell,\n TableHeaderSpacer,\n TableRow,\n TableScroller,\n type TableVariants,\n} from '../table'\nimport { DataTableEmpty } from './states/data-table-empty'\nimport { DataTableError } from './states/data-table-error'\nimport { DataTableSkeleton } from './states/data-table-skeleton'\nimport { useInfiniteScrollSentinel } from './use-infinite-scroll-sentinel'\n\n/* =========================================================================\n DataTable — generic virtualized infinite-scroll table.\n - TanStack Table v8 owns the column model and sorting state.\n - TanStack Virtual virtualizes the body against an internal scroller ref.\n - An IntersectionObserver sentinel triggers `query.fetchNextPage()` ~200 px\n before the user reaches the bottom. Visuals (loader, end marker, empty,\n error) match the Anthropic design's `pt-loader`/`pt-end`/`pt-empty`.\n - The component is data-fetching-shape-agnostic: it accepts anything\n conforming to InfiniteQueryLike (matches @tanstack/react-query's\n useInfiniteQuery return shape).\n ========================================================================= */\n\ntype InfinitePage<TRow> = { data: TRow[]; meta?: { items_total?: number } }\n\nexport type InfiniteQueryLike<TRow> = {\n data?: { pages: InfinitePage<TRow>[] } | undefined\n isLoading: boolean\n isFetchingNextPage: boolean\n hasNextPage: boolean | undefined\n error: Error | null\n fetchNextPage: () => void\n refetch?: () => void\n}\n\nexport type DataTableProps<TRow> = {\n query: InfiniteQueryLike<TRow>\n columns: ColumnDef<TRow>[]\n sorting?: SortingState\n onSortingChange?: OnChangeFn<SortingState>\n rowHeight?: number\n overscan?: number\n /**\n * Called when a row is clicked. Provides both the original data row and\n * the underlying event so consumers can inspect modifier keys.\n */\n onRowClick?: (\n row: TRow,\n event: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>,\n ) => void\n zebra?: boolean\n emptyState?: ReactNode\n errorState?: ReactNode\n loadingState?: ReactNode\n /**\n * Optional accessor used as the React key for each row. Defaults to a\n * row's `id` field (if present), then `slug`, then index.\n */\n getRowId?: (row: TRow, index: number) => string\n className?: string\n ariaLabel?: string\n /**\n * Enable horizontal drag-and-drop reordering of columns. When on, a grip\n * handle and `monitorForElements` are wired up; on a successful reorder\n * `onReorderColumn` fires with the moved column's id and its new index.\n * Each `ColumnDef` must carry a stable `id` for events to be routable.\n */\n enableColumnReordering?: boolean\n /**\n * Enable an `×` remove affordance on each column header. The handler is\n * called with the column's id; the parent decides what removal means\n * (e.g. filter the displayed `columns` array).\n */\n enableColumnRemoval?: boolean\n onReorderColumn?: (params: { id: string; toIndex: number }) => void\n onRemoveColumn?: (id: string) => void\n /**\n * Visual chrome around the table. `panel` (default) wraps the table in a\n * bordered, rounded, soft-shadowed card. `bare` strips that chrome so the\n * table can sit flush with its container — used when the surrounding\n * surface already supplies borders (e.g. the Query Builder's results pane).\n */\n variant?: TableVariants['variant']\n /**\n * Optional per-row wrapper. When provided, the row's cell content is\n * passed through this function, which may render context providers (e.g.\n * a row-scoped TanStack Form for inline editing) around the cells. The\n * default is identity — cells render directly inside the `<TableRow>`.\n */\n rowWrapper?: (row: Row<TRow>, cells: ReactNode) => ReactNode\n /**\n * Extra rows rendered alongside the server data. Used for inline-editable\n * draft rows that are not yet persisted. `start` rows render above the\n * server data, `end` rows below. They participate in the same column\n * model, virtualization, and `rowWrapper` as server rows.\n */\n extraRows?: { start?: TRow[]; end?: TRow[] }\n /**\n * Slot rendered ABOVE the body (above the virtualized region). Used for\n * controls like an Add row button at slot='start'. Stays put when the\n * body scrolls (sits inside the header sticky region or just below it).\n */\n bodyBefore?: ReactNode\n /**\n * Slot rendered BELOW the body. Used for controls like an Add row button\n * at slot='end'. Sits inside the scrollable area below the rows.\n */\n bodyAfter?: ReactNode\n /**\n * Row selection. `none` (default) renders no checkbox column; `multiple`\n * prepends a sticky leading checkbox column and turns the header checkbox\n * into a tri-state select-all.\n *\n * Selection is CONTROLLED — the owner holds the ids because it is the one\n * that acts on them (running a batch action, clearing after a save). The\n * header checkbox covers the rows currently LOADED: an infinite list can't\n * honestly claim to select rows it has never fetched, so \"select everything\n * matching the filter\" belongs to the owner's toolbar, not here.\n */\n selectionMode?: 'none' | 'multiple'\n selectedIds?: Set<string>\n onSelectionChange?: (ids: Set<string>) => void\n /**\n * Draw vertical gridlines between body cells. The header always has them;\n * the body opts in (e.g. inline-edit mode wants the full Excel-style grid).\n * Default false — read-only tables stay borderless in the body.\n */\n columnBorders?: boolean\n /**\n * Group consecutive rows under a full-width heading. Returns the group a row\n * belongs to, or null to leave it ungrouped; a heading is emitted whenever\n * the group id CHANGES between neighbours, so the caller is responsible for\n * ordering rows by their group (with server-side sorting, sort by the\n * grouping column first). That contract is what lets grouping work with\n * infinite scroll — a group may continue on the next page without the table\n * having to know the full row set up front.\n */\n groupBy?: (row: TRow) => { id: string; label: ReactNode } | null\n /** Height of a group heading row. Defaults to `rowHeight`. */\n groupHeaderHeight?: number\n}\n\n/** One entry of the virtualized list: either a data row or a group heading. */\ntype ListItem<TRow> =\n | { kind: 'row'; row: Row<TRow>; dataIndex: number }\n | { kind: 'group'; id: string; label: ReactNode }\n\nconst DEFAULT_ROW_HEIGHT = 32\n\n/** Column id of the leading checkbox column added by `selectionMode`. */\nexport const SELECTION_COLUMN_ID = '__select__' \n\nexport function DataTable<TRow>({\n query,\n columns,\n sorting,\n onSortingChange,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscan = 8,\n onRowClick,\n zebra = true,\n emptyState,\n errorState,\n loadingState,\n getRowId,\n className,\n ariaLabel,\n enableColumnReordering = false,\n enableColumnRemoval = false,\n onReorderColumn,\n onRemoveColumn,\n variant = 'panel',\n rowWrapper,\n extraRows,\n bodyBefore,\n bodyAfter,\n selectionMode = 'none',\n selectedIds,\n onSelectionChange,\n columnBorders = false,\n groupBy,\n groupHeaderHeight,\n}: DataTableProps<TRow>) {\n const rows = useMemo<TRow[]>(() => {\n const pages = query.data?.pages\n const dataRows = pages && pages.length > 0 ? pages.flatMap((p) => p.data) : []\n const startExtras = extraRows?.start ?? []\n const endExtras = extraRows?.end ?? []\n if (startExtras.length === 0 && endExtras.length === 0) return dataRows\n return [...startExtras, ...dataRows, ...endExtras]\n }, [query.data, extraRows])\n\n const resolveRowId = useMemo(\n () =>\n getRowId ??\n ((row: TRow, index: number) => {\n const r = row as Record<string, unknown>\n if (typeof r.id === 'string' || typeof r.id === 'number') return String(r.id)\n if (typeof r.slug === 'string') return r.slug\n return String(index)\n }),\n [getRowId],\n )\n\n const selectionEnabled = selectionMode === 'multiple'\n const selected = useMemo(() => selectedIds ?? new Set<string>(), [selectedIds])\n // Ids of the rows currently LOADED — what the header checkbox operates on.\n const loadedIds = useMemo(\n () => (selectionEnabled ? rows.map((row, index) => resolveRowId(row, index)) : []),\n [selectionEnabled, rows, resolveRowId],\n )\n // Anchor for shift-click range selection, in loaded-row index space.\n const lastToggledIndexRef = useRef<number | null>(null)\n\n const toggleRow = (id: string, index: number, isRange: boolean) => {\n if (!onSelectionChange) return\n const next = new Set(selected)\n const anchor = lastToggledIndexRef.current\n if (isRange && anchor !== null) {\n const [from, to] = anchor <= index ? [anchor, index] : [index, anchor]\n // A range drag always ADDS — matching how file managers and mail\n // clients behave; use individual clicks to take rows back out.\n for (let i = from; i <= to; i += 1) {\n const rangeId = loadedIds[i]\n if (rangeId !== undefined) next.add(rangeId)\n }\n } else if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n lastToggledIndexRef.current = index\n onSelectionChange(next)\n }\n\n const loadedSelectedCount = loadedIds.reduce((count, id) => count + (selected.has(id) ? 1 : 0), 0)\n const allLoadedSelected = loadedIds.length > 0 && loadedSelectedCount === loadedIds.length\n\n const toggleAllLoaded = () => {\n if (!onSelectionChange) return\n const next = new Set(selected)\n if (allLoadedSelected) {\n for (const id of loadedIds) next.delete(id)\n } else {\n for (const id of loadedIds) next.add(id)\n }\n lastToggledIndexRef.current = null\n onSelectionChange(next)\n }\n\n // RAC's Checkbox onChange carries no modifier keys, so the shift state is\n // captured on the preceding pointer event.\n const rangeModifierRef = useRef(false)\n\n const selectionColumn = useMemo<ColumnDef<TRow>>(\n () => ({\n id: SELECTION_COLUMN_ID,\n size: 36,\n enableSorting: false,\n meta: { align: 'center', sticky: 'left', cellClassName: 'px-0 justify-center' },\n header: () => (\n <span className=\"inline-flex items-center justify-center w-full\">\n <Checkbox\n aria-label={allLoadedSelected ? 'Deselect all rows' : 'Select all rows'}\n isSelected={allLoadedSelected}\n isIndeterminate={loadedSelectedCount > 0 && !allLoadedSelected}\n isDisabled={loadedIds.length === 0}\n onChange={toggleAllLoaded}\n />\n </span>\n ),\n cell: ({ row }) => (\n // Stop the click here: selecting a row must never also open it.\n <span\n className=\"inline-flex items-center justify-center w-full\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation()\n rangeModifierRef.current = event.shiftKey\n }}\n onPointerDownCapture={(event) => {\n rangeModifierRef.current = event.shiftKey\n }}\n role=\"presentation\"\n >\n <Checkbox\n aria-label={`Select row ${row.index + 1}`}\n isSelected={selected.has(row.id)}\n onChange={() => toggleRow(row.id, row.index, rangeModifierRef.current)}\n />\n </span>\n ),\n }),\n // biome-ignore lint/correctness/useExhaustiveDependencies: handlers read the latest selection via closure recreated on these inputs\n [selected, loadedIds, allLoadedSelected, loadedSelectedCount],\n )\n\n const tableColumns = useMemo(\n () => (selectionEnabled ? [selectionColumn, ...columns] : columns),\n [selectionEnabled, selectionColumn, columns],\n )\n\n const table = useReactTable({\n data: rows,\n columns: tableColumns,\n state: { sorting: sorting ?? [] },\n ...(onSortingChange ? { onSortingChange } : {}),\n manualSorting: true,\n getCoreRowModel: getCoreRowModel(),\n getRowId: (row, index) => resolveRowId(row, index),\n })\n\n const tableRows = table.getRowModel().rows\n const tableRowCount = tableRows.length\n\n // Flatten rows into the virtualized list, splicing a heading in wherever the\n // group changes. Without `groupBy` this is the rows themselves.\n const listItems = useMemo<ListItem<TRow>[]>(() => {\n if (!groupBy) {\n return tableRows.map((row, dataIndex) => ({ kind: 'row', row, dataIndex }) as const)\n }\n const items: ListItem<TRow>[] = []\n let currentGroupId: string | null = null\n tableRows.forEach((row, dataIndex) => {\n const group = groupBy(row.original)\n if (group && group.id !== currentGroupId) {\n currentGroupId = group.id\n items.push({ kind: 'group', id: group.id, label: group.label })\n } else if (!group) {\n currentGroupId = null\n }\n items.push({ kind: 'row', row, dataIndex })\n })\n return items\n }, [tableRows, groupBy])\n\n // Reset scroll to top when sorting changes — without this, the user is\n // staring at a different slice of a freshly-sorted dataset.\n const scrollerRef = useRef<HTMLDivElement | null>(null)\n // biome-ignore lint/correctness/useExhaustiveDependencies: intentional — scroll resets on sort change only\n useEffect(() => {\n scrollerRef.current?.scrollTo({ top: 0 })\n }, [sorting])\n\n // The sticky header lives inside the scroller, ABOVE the row list, so the\n // list starts at an offset (the header's height, plus any `bodyBefore`).\n // Feed that offset to the virtualizer as `scrollMargin` so its visible\n // window math accounts for it; render rows at `start - scrollMargin`.\n const listRef = useRef<HTMLDivElement | null>(null)\n const [listOffset, setListOffset] = useState(0)\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-measure every render; cheap offsetTop read, guarded setState\n useLayoutEffect(() => {\n const top = listRef.current?.offsetTop ?? 0\n setListOffset((prev) => (prev === top ? prev : top))\n })\n\n const headingHeight = groupHeaderHeight ?? rowHeight\n\n const virtualizer = useVirtualizer({\n count: listItems.length,\n getScrollElement: () => scrollerRef.current,\n estimateSize: (index) => (listItems[index]?.kind === 'group' ? headingHeight : rowHeight),\n overscan,\n scrollMargin: listOffset,\n })\n\n const sentinelRef = useInfiniteScrollSentinel<HTMLDivElement>({\n onIntersect: () => {\n if (query.hasNextPage && !query.isFetchingNextPage && !query.isLoading) {\n query.fetchNextPage()\n }\n },\n rootMargin: '200px',\n root: scrollerRef.current,\n enabled: !!query.hasNextPage,\n })\n\n const totalColumnWidth = useMemo(\n () => tableColumns.reduce((sum, c) => sum + (c.size ?? 140), 0),\n [tableColumns],\n )\n\n // Single global pragmatic-dnd monitor for column reorder. We mirror the\n // entity-designer pattern: read the latest columns + handler via refs so\n // the monitor doesn't re-register on every render. Gated on\n // `enableColumnReordering` so it's a no-op when the feature is off.\n const columnsRef = useRef(columns)\n columnsRef.current = columns\n const onReorderRef = useRef(onReorderColumn)\n onReorderRef.current = onReorderColumn\n\n useEffect(() => {\n if (!enableColumnReordering) return\n return monitorForElements({\n canMonitor: ({ source }) => isColumnDragData(source.data),\n onDrop: ({ source, location }) => {\n const target = location.current.dropTargets[0]\n if (!target) return\n if (!isColumnDragData(source.data) || !isColumnDragData(target.data)) return\n if (source.data.columnId === target.data.columnId) return\n\n const ids = columnsRef.current.map((c) => c.id).filter((id): id is string => !!id)\n const startIndex = ids.indexOf(source.data.columnId)\n const indexOfTarget = ids.indexOf(target.data.columnId)\n if (startIndex === -1 || indexOfTarget === -1) return\n\n const closestEdge = extractClosestEdge(target.data)\n const reordered = reorderWithEdge({\n list: ids,\n startIndex,\n indexOfTarget,\n closestEdgeOfTarget: closestEdge,\n axis: 'horizontal',\n })\n if (reordered === ids) return\n\n const sourceId = source.data.columnId\n onReorderRef.current?.({ id: sourceId, toIndex: reordered.indexOf(sourceId) })\n },\n })\n }, [enableColumnReordering])\n\n const showEmpty =\n !query.isLoading && !query.error && tableRowCount === 0 && !query.isFetchingNextPage\n const showInitialLoading = query.isLoading && tableRowCount === 0\n const showError = !!query.error && tableRowCount === 0\n const showEndMarker =\n !query.isLoading && !query.isFetchingNextPage && !query.hasNextPage && tableRowCount > 0\n\n const totalSize = virtualizer.getTotalSize()\n const virtualItems = virtualizer.getVirtualItems()\n\n const headerGroups = table.getHeaderGroups()\n const minPanelWidth = totalColumnWidth + 24\n\n return (\n <Table\n {...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {})}\n variant={variant}\n className={cn('flex-1 min-h-0', className)}\n >\n {/* Single both-axes scroll container. Horizontal wheel/trackpad scrolls\n the columns; vertical scrolls the rows. The sticky header pins to the\n top, and any `sticky left-0` gutter column freezes to the left. */}\n <TableScroller ref={scrollerRef}>\n {/* Content track — owns the horizontal min-width so the header + rows\n scroll horizontally together as one unit. */}\n <div className=\"flex flex-col\" style={{ minWidth: minPanelWidth }}>\n {/* Header row(s) — sticky-top so they pin while the rows scroll. */}\n {headerGroups.map((group) => (\n <TableHeader key={group.id} sticky>\n {group.headers.map((header) => {\n const meta = header.column.columnDef.meta as\n | {\n align?: 'left' | 'right' | 'center'\n sticky?: 'left' | 'right' | false\n cellClassName?: string\n }\n | undefined\n const align = meta?.align ?? 'left'\n const sticky = meta?.sticky ?? false\n const headerSize = header.getSize() || undefined\n const headerNode = header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())\n\n const sorted = header.column.getIsSorted()\n const direction: SortDirection = sorted === false ? null : sorted\n const canSort = header.column.getCanSort()\n const handleSort = header.column.getToggleSortingHandler()\n const ariaLabel =\n typeof header.column.columnDef.header === 'string'\n ? header.column.columnDef.header\n : header.column.id\n\n return (\n <TableHeaderCell\n key={header.id}\n align={align}\n ariaLabel={ariaLabel}\n draggable={enableColumnReordering && !!header.column.id}\n {...(header.column.id ? { columnId: header.column.id } : {})}\n {...(headerSize !== undefined ? { width: headerSize } : {})}\n {...(sticky !== false ? { sticky } : {})}\n {...(meta?.cellClassName ? { className: meta.cellClassName } : {})}\n {...(canSort\n ? {\n sortDirection: direction,\n onSortToggle: () => handleSort?.({} as never),\n }\n : {})}\n {...(enableColumnRemoval && onRemoveColumn && header.column.id\n ? { onRemove: () => onRemoveColumn(header.column.id) }\n : {})}\n >\n {headerNode}\n </TableHeaderCell>\n )\n })}\n <TableHeaderSpacer />\n </TableHeader>\n ))}\n\n {bodyBefore}\n\n {showInitialLoading ? (\n (loadingState ?? <DataTableSkeleton rowHeight={rowHeight} />)\n ) : showError ? (\n <div role=\"rowgroup\">\n {errorState ?? (query.error ? <DataTableError error={query.error} /> : null)}\n </div>\n ) : (\n <div role=\"rowgroup\">\n {showEmpty ? (\n (emptyState ?? <DataTableEmpty />)\n ) : (\n <div\n ref={listRef}\n role=\"presentation\"\n style={{ height: totalSize, position: 'relative', width: '100%' }}\n >\n {virtualItems.map((vRow) => {\n const item = listItems[vRow.index]\n if (!item) return null\n const rowStyle: CSSProperties = {\n // Items' `start` includes the virtualizer's scrollMargin\n // (the list's offset below the sticky header); subtract\n // it to position relative to the list container.\n transform: `translateY(${vRow.start - listOffset}px)`,\n height: vRow.size,\n }\n if (item.kind === 'group') {\n return (\n <GroupHeaderRow key={`group:${item.id}`} style={rowStyle}>\n {item.label}\n </GroupHeaderRow>\n )\n }\n return (\n <DataRow\n key={item.row.id}\n row={item.row}\n index={item.dataIndex}\n zebra={zebra}\n onRowClick={onRowClick}\n style={rowStyle}\n columnBorders={columnBorders}\n {...(rowWrapper ? { rowWrapper } : {})}\n />\n )\n })}\n </div>\n )}\n\n {/* Sentinel — visually empty, positioned just above the loader/end\n marker so it intersects ~200 px before the bottom. */}\n {!showEmpty && (\n <div ref={sentinelRef} aria-hidden=\"true\" style={{ height: 1, width: '100%' }} />\n )}\n\n {query.isFetchingNextPage ? <LoaderRow /> : null}\n {showEndMarker ? <EndMarker count={tableRowCount} /> : null}\n </div>\n )}\n\n {bodyAfter}\n </div>\n </TableScroller>\n </Table>\n )\n}\n\n/* ---------- Group heading ------------------------------------------------ */\n\nfunction GroupHeaderRow({ style, children }: { style: CSSProperties; children: ReactNode }) {\n return (\n <TableRow\n absolute\n style={style}\n className={cn(\n 'bg-surface-2 border-b border-rule',\n 'font-mono text-[11px] uppercase tracking-[0.06em] text-ink-3',\n )}\n >\n {/* One cell spanning the row — the heading labels the rows beneath it\n rather than any single column. */}\n <TableCell className=\"gap-2 text-inherit\">{children}</TableCell>\n </TableRow>\n )\n}\n\n/* ---------- Row ---------------------------------------------------------- */\n\ntype DataRowProps<TRow> = {\n row: Row<TRow>\n index: number\n zebra: boolean\n onRowClick?: DataTableProps<TRow>['onRowClick']\n style: CSSProperties\n rowWrapper?: (row: Row<TRow>, cells: ReactNode) => ReactNode\n columnBorders?: boolean\n}\n\nfunction DataRow<TRow>({\n row,\n index,\n zebra,\n onRowClick,\n style,\n rowWrapper,\n columnBorders = false,\n}: DataRowProps<TRow>) {\n const isAlt = zebra && index % 2 === 1\n const interactive = !!onRowClick\n\n const cells = row.getVisibleCells().map((cell) => {\n const meta = cell.column.columnDef.meta as\n | {\n align?: 'left' | 'right' | 'center'\n mono?: boolean\n ink?: boolean\n sticky?: 'left' | 'right' | false\n /** Extra classes merged onto the cell — e.g. to drop the default\n * horizontal padding for a narrow fixed-width gutter column. */\n cellClassName?: string\n }\n | undefined\n const cellSize = cell.column.getSize() || undefined\n const cellClassName = cn(\n columnBorders ? 'border-r border-rule-2' : undefined,\n meta?.cellClassName,\n )\n return (\n <TableCell\n key={cell.id}\n {...(cellSize !== undefined ? { width: cellSize } : {})}\n align={meta?.align ?? 'left'}\n {...(meta?.mono !== undefined ? { mono: meta.mono } : {})}\n {...(meta?.ink !== undefined ? { ink: meta.ink } : {})}\n {...(meta?.sticky ? { sticky: meta.sticky } : {})}\n {...(cellClassName ? { className: cellClassName } : {})}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n )\n })\n\n const body = rowWrapper ? rowWrapper(row, cells) : cells\n\n return (\n <TableRow\n absolute\n alt={isAlt}\n interactive={interactive}\n style={style}\n data-row-id={row.id}\n tabIndex={interactive ? 0 : undefined}\n onClick={interactive ? (e) => onRowClick?.(row.original, e) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onRowClick?.(row.original, e)\n }\n }\n : undefined\n }\n >\n {body}\n </TableRow>\n )\n}\n\n/* ---------- Loader & end marker ----------------------------------------- */\n\nfunction LoaderRow() {\n return (\n <div\n className={cn(\n 'flex items-center justify-center gap-3',\n 'h-8 font-mono text-[11px] tracking-[0.04em]',\n 'text-ink-4',\n )}\n >\n <span\n aria-hidden=\"true\"\n className=\"relative inline-block h-[2px] w-24 overflow-hidden rounded-pill bg-rule\"\n >\n <span className=\"absolute inset-0 w-[30%] rounded-pill bg-accent animate-[pt-slide_1.1s_ease-in-out_infinite]\" />\n </span>\n <span>loading more</span>\n <style>{`\n @keyframes pt-slide {\n 0% { transform: translateX(-110%); }\n 100% { transform: translateX(360%); }\n }\n `}</style>\n </div>\n )\n}\n\nfunction EndMarker({ count }: { count: number }) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'h-8 font-mono text-[10.5px] uppercase tracking-[0.08em]',\n 'text-ink-4',\n )}\n >\n end · {count.toLocaleString()} rows\n </div>\n )\n}\n","import type { ColumnDef } from '@tanstack/react-table'\nimport type { ReactNode } from 'react'\n\nexport type ActionsColumnOptions<TData> = {\n id?: string\n header?: string\n width?: number\n cell: (row: TData) => ReactNode\n}\n\n/**\n * Convenience builder for a non-sortable, right-aligned actions column.\n * Carries `meta.align: 'right'` so DataTable renders the header/cell\n * end-aligned even though the column has no value to sort by.\n */\nexport function makeActionsColumn<TData>({\n id = 'actions',\n header = '',\n width = 80,\n cell,\n}: ActionsColumnOptions<TData>): ColumnDef<TData> {\n return {\n id,\n header,\n size: width,\n enableSorting: false,\n meta: { align: 'right' as const },\n cell: ({ row }) => cell(row.original),\n }\n}\n","import {\n Button as AriaDateTrigger,\n Calendar,\n CalendarCell,\n CalendarGrid,\n CalendarGridBody,\n CalendarGridHeader,\n CalendarHeaderCell,\n Heading,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\n\n/* Shared calendar chrome for DatePicker + DateTimePicker. Internal — NOT\n barrelled from the package root. Both pickers render\n `<Popover><Dialog><CalendarSurface/>…</Dialog></Popover>`; DateTimePicker\n additionally renders a TimeField under the grid. Keeping the icons + grid\n here means the two pickers can never visually drift apart. */\n\n/* ----- icons (decorative) --------------------------------------------------- */\n\nexport function CalendarGlyph() {\n return (\n <svg aria-hidden viewBox=\"0 0 16 16\" className=\"size-4\" fill=\"none\">\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"11\"\n height=\"10\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path d=\"M2.5 6.5H13.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M5.5 2V5M10.5 2V5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction ChevronLeft() {\n return (\n <svg aria-hidden viewBox=\"0 0 12 12\" className=\"size-3\" fill=\"none\">\n <path\n d=\"M7.5 3L4.5 6L7.5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg aria-hidden viewBox=\"0 0 12 12\" className=\"size-3\" fill=\"none\">\n <path\n d=\"M4.5 3L7.5 6L4.5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\n/* --------------------------------------------------------------------------- */\n\n/** The `<Calendar>` block — month header (prev/next + heading) plus the day\n * grid. Rendered inside the picker's `<Dialog>`. Cosmetics-only; the\n * surrounding Popover/Dialog and any TimeField are the consumer's job. */\nexport function CalendarSurface() {\n return (\n <Calendar>\n <header className=\"flex items-center justify-between mb-3\">\n <AriaDateTrigger\n slot=\"previous\"\n aria-label=\"Previous month\"\n className={cn(\n 'size-7 rounded-md inline-flex items-center justify-center',\n 'text-ink-3 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <ChevronLeft />\n </AriaDateTrigger>\n <Heading className=\"font-sans font-medium text-[14px] text-ink tracking-[-0.01em]\" />\n <AriaDateTrigger\n slot=\"next\"\n aria-label=\"Next month\"\n className={cn(\n 'size-7 rounded-md inline-flex items-center justify-center',\n 'text-ink-3 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <ChevronRight />\n </AriaDateTrigger>\n </header>\n\n <CalendarGrid className=\"w-full border-collapse table-fixed\">\n <CalendarGridHeader>\n {(day) => (\n <CalendarHeaderCell\n className={cn(\n 'font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-4',\n 'pb-2 text-center',\n )}\n >\n {day}\n </CalendarHeaderCell>\n )}\n </CalendarGridHeader>\n <CalendarGridBody>\n {(date) => (\n <CalendarCell\n date={date}\n className={cn(\n // aspect-square + table-fixed makes each cell a perfect\n // square that scales with popover width.\n 'aspect-square flex items-center justify-center cursor-pointer',\n 'font-mono text-[12.5px] text-ink-2 rounded-[6px] outline-none',\n 'transition-[background-color,color] duration-150',\n 'data-[outside-month]:text-ink-4',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)]',\n 'data-[selected]:bg-accent data-[selected]:text-[#f0efe8]',\n 'data-[selected]:data-[hovered]:bg-accent-2',\n 'data-[disabled]:opacity-30 data-[disabled]:cursor-not-allowed',\n 'data-[unavailable]:line-through data-[unavailable]:text-ink-4',\n )}\n />\n )}\n </CalendarGridBody>\n </CalendarGrid>\n </Calendar>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n DatePicker as AriaDatePicker,\n type DatePickerProps as AriaDatePickerProps,\n Button as AriaDateTrigger,\n DateInput,\n DateSegment,\n type DateValue,\n Dialog,\n FieldError,\n Group,\n Label,\n Popover,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\nimport { CalendarGlyph, CalendarSurface } from './calendar-internals'\n\nexport type DatePickerProps<T extends DateValue> = AriaDatePickerProps<T> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n}\n\nexport function DatePicker<T extends DateValue>({\n label,\n description,\n errorMessage,\n size,\n appearance,\n className,\n ...props\n}: DatePickerProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n return (\n <AriaDatePicker\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <Group\n className={cn(\n // Box chrome on the wrapper; the DateInput inside carries padding +\n // font so the calendar trigger sits inside the same border + ring.\n styles.box(),\n 'flex items-center gap-1 pr-1',\n focusWithin,\n )}\n >\n <DateInput\n className={cn(\n 'flex-1 flex items-center min-w-0 text-ink',\n styles.content(),\n // Tabular alignment for date segments — overrides content's\n // font-sans on purpose.\n 'font-mono',\n )}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={cn(\n 'px-px tabular-nums outline-none select-none',\n 'data-[placeholder]:text-ink-4',\n 'data-[type=literal]:text-ink-4',\n // segment focus treatment: indigo fill, paper text\n 'data-[focused]:bg-accent data-[focused]:text-[#f0efe8] data-[focused]:rounded-[3px]',\n 'data-[disabled]:cursor-not-allowed',\n )}\n />\n )}\n </DateInput>\n\n <AriaDateTrigger\n className={cn(\n 'shrink-0 inline-flex items-center justify-center',\n 'size-7 rounded-md',\n 'text-ink-3 hover:text-ink hover:bg-surface-2',\n 'outline-none cursor-pointer',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <CalendarGlyph />\n </AriaDateTrigger>\n </Group>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n // Match the anchoring field's width exactly. `--trigger-width` is\n // set by RAC on the Popover when it's inside a DatePicker. Floor at\n // 18rem so the calendar stays legible when the input is unusually\n // narrow, and cap at 600px so it doesn't sprawl behind a very wide\n // field.\n 'w-[var(--trigger-width)] min-w-[18rem] max-w-[500px]',\n 'rounded-md border border-rule bg-surface p-4',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <Dialog className=\"outline-none\">\n <CalendarSurface />\n </Dialog>\n </Popover>\n </AriaDatePicker>\n )\n}\n","import { type ReactNode, useContext } from 'react'\nimport {\n DatePicker as AriaDatePicker,\n type DatePickerProps as AriaDatePickerProps,\n Button as AriaDateTrigger,\n TimeField as AriaTimeField,\n DateInput,\n DatePickerStateContext,\n DateSegment,\n type DateValue,\n Dialog,\n FieldError,\n Group,\n Label,\n Popover,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\nimport { CalendarGlyph, CalendarSurface } from '../date-picker/calendar-internals'\n\nexport type DateTimePickerProps<T extends DateValue> = AriaDatePickerProps<T> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n}\n\n/* Shared segment treatment for the inline DateInput + the popover TimeField,\n so the two never drift. Matches DatePicker's date segments. */\nconst segmentStyles = cn(\n 'px-px tabular-nums outline-none select-none',\n 'data-[placeholder]:text-ink-4',\n 'data-[type=literal]:text-ink-4',\n // segment focus treatment: indigo fill, paper text\n 'data-[focused]:bg-accent data-[focused]:text-[#f0efe8] data-[focused]:rounded-[3px]',\n 'data-[disabled]:cursor-not-allowed',\n)\n\n/* The popover's dedicated time editor. Reads the live DatePicker state so it\n stays in sync with both the inline segments and the calendar selection:\n `state.timeValue` / `state.setTimeValue` are RAC's split-out time portion of\n the combined value. Renders nothing until the picker actually has a time\n component (`hasTime` — i.e. granularity is finer than 'day'). */\nfunction PopoverTimeField({\n granularity,\n hourCycle,\n hideTimeZone,\n}: {\n granularity: 'hour' | 'minute' | 'second'\n hourCycle?: 12 | 24\n hideTimeZone?: boolean\n}) {\n const state = useContext(DatePickerStateContext)\n if (!state?.hasTime) return null\n return (\n <div className=\"mt-3 pt-3 border-t border-rule flex items-center justify-between gap-3\">\n <span className={fieldLabelStyles}>Time</span>\n <AriaTimeField\n aria-label=\"Time\"\n value={state.timeValue}\n onChange={(next) => {\n if (next) state.setTimeValue(next)\n }}\n granularity={granularity}\n {...(hourCycle !== undefined ? { hourCycle } : {})}\n {...(hideTimeZone !== undefined ? { hideTimeZone } : {})}\n >\n <DateInput\n className={cn(\n 'inline-flex items-center rounded-md border border-rule bg-surface px-2.5 py-1.5',\n 'font-mono text-[13px] text-ink',\n 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]',\n 'transition-[border-color,box-shadow] duration-150',\n )}\n >\n {(segment) => <DateSegment segment={segment} className={segmentStyles} />}\n </DateInput>\n </AriaTimeField>\n </div>\n )\n}\n\nexport function DateTimePicker<T extends DateValue>({\n label,\n description,\n errorMessage,\n size,\n appearance,\n className,\n // Time-aware defaults: minute precision, locale hour cycle, no timezone\n // segment, and keep the popover open after a calendar day-click so the user\n // can still set a time.\n granularity = 'minute',\n hideTimeZone = true,\n shouldCloseOnSelect = false,\n ...props\n}: DateTimePickerProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n // `granularity` is never 'day' here (defaulted to 'minute'); narrow for the\n // TimeField, which only accepts hour/minute/second.\n const timeGranularity = granularity === 'day' ? 'minute' : granularity\n const { hourCycle } = props\n return (\n <AriaDatePicker\n {...props}\n granularity={granularity}\n hideTimeZone={hideTimeZone}\n shouldCloseOnSelect={shouldCloseOnSelect}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <Group\n className={cn(\n // Box chrome on the wrapper; the DateInput inside carries padding +\n // font so the calendar trigger sits inside the same border + ring.\n styles.box(),\n 'flex items-center gap-1 pr-1',\n focusWithin,\n )}\n >\n <DateInput\n className={cn(\n 'flex-1 flex items-center min-w-0 text-ink',\n styles.content(),\n // Tabular alignment for date/time segments — overrides content's\n // font-sans on purpose.\n 'font-mono',\n )}\n >\n {(segment) => <DateSegment segment={segment} className={segmentStyles} />}\n </DateInput>\n\n <AriaDateTrigger\n className={cn(\n 'shrink-0 inline-flex items-center justify-center',\n 'size-7 rounded-md',\n 'text-ink-3 hover:text-ink hover:bg-surface-2',\n 'outline-none cursor-pointer',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <CalendarGlyph />\n </AriaDateTrigger>\n </Group>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n // Match the anchoring field's width exactly. `--trigger-width` is\n // set by RAC on the Popover when it's inside a DatePicker. Floor at\n // 18rem so the calendar stays legible when the input is unusually\n // narrow, and cap at 500px so it doesn't sprawl behind a very wide\n // field.\n 'w-[var(--trigger-width)] min-w-[18rem] max-w-[500px]',\n 'rounded-md border border-rule bg-surface p-4',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <Dialog className=\"outline-none\">\n <CalendarSurface />\n <PopoverTimeField\n granularity={timeGranularity}\n hideTimeZone={hideTimeZone}\n {...(hourCycle !== undefined ? { hourCycle } : {})}\n />\n </Dialog>\n </Popover>\n </AriaDatePicker>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { ChannelIcon } from '../channel-icon'\nimport type { DraftReviewOutcome } from '../draft-message-composer'\n\n/* =========================================================================\n DraftMessageCard — the compact entry point to reviewing an agent-drafted\n outbound message: channel glyph, eyebrow, headline (subject or first body\n line), the To line, and one action. Pure chrome — it neither fetches nor\n decides anything, so it can sit in a chat flow, a record page, a task list\n or a custom component alike. DraftMessageReview is the connected wrapper;\n reach for this one only when the host already holds the draft.\n\n Once decided the action is replaced by a status label rather than removed:\n the row keeps its shape, and the reader keeps the record of what happened.\n ========================================================================= */\n\nexport const draftMessageCardStyles = tv({\n slots: {\n root: [\n 'flex items-center gap-2.5 rounded-md border border-accent/40 px-3 py-2',\n 'bg-[color-mix(in_oklab,var(--color-accent)_6%,var(--color-surface))]',\n ],\n icon: [\n 'grid size-8 shrink-0 place-items-center rounded-full text-accent',\n 'bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n ],\n body: 'min-w-0 flex-1',\n eyebrow: 'font-mono text-[10px] uppercase tracking-[0.08em] text-accent',\n title: 'truncate text-[13px] font-medium text-ink',\n recipients: 'truncate text-[12px] text-ink-3',\n action: [\n 'shrink-0 cursor-pointer rounded-sm border border-accent/50 px-2.5 py-1',\n 'font-mono text-[11px] text-accent outline-none',\n 'hover:bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:cursor-default disabled:opacity-50',\n ],\n outcome: 'shrink-0 font-mono text-[11px] text-ink-3',\n },\n})\n\nconst styles = draftMessageCardStyles()\n\n/** Terminal-state wording. `failed` is deliberately explicit: the human DID\n * approve the send, and hiding that behind a bare \"Failed\" reads as though\n * the review itself failed. */\nexport const DRAFT_OUTCOME_LABEL: Record<DraftReviewOutcome, string> = {\n sent: 'Sent',\n rejected: 'Rejected',\n failed: 'Approved, but delivery failed',\n}\n\nexport interface DraftMessageCardProps {\n /** Channel slug driving the glyph — see channelIcon. */\n channel: string\n /** Headline: the conversation subject, or the draft's first body line. */\n title: string\n /** Rendered as \"To a, b\". Empty or omitted hides the row. */\n recipients?: string[]\n /** Default 'Draft — awaiting review'. */\n eyebrow?: ReactNode\n /** Default 'Review'. */\n previewLabel?: string\n /** Terminal outcome. Set ⇒ the action is replaced by its status label. */\n outcome?: DraftReviewOutcome | null\n onPreview?: () => void\n isPreviewDisabled?: boolean\n className?: string\n}\n\nexport function DraftMessageCard({\n channel,\n title,\n recipients,\n eyebrow = 'Draft — awaiting review',\n previewLabel = 'Review',\n outcome,\n onPreview,\n isPreviewDisabled = false,\n className,\n}: DraftMessageCardProps) {\n return (\n <div className={cn(styles.root(), className)}>\n <span className={styles.icon()}>\n <ChannelIcon channel={channel} />\n </span>\n <div className={styles.body()}>\n <p className={styles.eyebrow()}>{eyebrow}</p>\n <p className={styles.title()}>{title}</p>\n {recipients && recipients.length > 0 ? (\n <p className={styles.recipients()}>To {recipients.join(', ')}</p>\n ) : null}\n </div>\n {outcome ? (\n <span className={styles.outcome()}>{DRAFT_OUTCOME_LABEL[outcome]}</span>\n ) : (\n <AriaButton\n onPress={onPreview ?? (() => {})}\n isDisabled={isPreviewDisabled}\n className={styles.action()}\n >\n {previewLabel}\n </AriaButton>\n )}\n </div>\n )\n}\n","import type { ConversationClient } from '@proteos/sdk'\n\nimport type { DraftMessageClient } from './types'\n\n/**\n * One-liner adapter from the sdk ConversationClient (web app:\n * `useSdk().conversation`; custom components: `useSdk().conversations`) to\n * the composer's injected client. Type-only sdk import — no runtime coupling.\n */\nexport function createDraftMessageClient(\n conversation: Pick<ConversationClient, 'messages' | 'conversations' | 'connections'>,\n): DraftMessageClient {\n return {\n getMessage: (messageId) => conversation.messages.get(messageId),\n getConversation: (conversationId) => conversation.conversations.get(conversationId),\n updateDraft: (messageId, patch) => conversation.messages.updateDraft(messageId, patch),\n sendDraft: (messageId) => conversation.messages.sendDraft(messageId),\n rejectDraft: (messageId) => conversation.messages.rejectDraft(messageId),\n searchRecipients: async (connectionId, q) =>\n (\n await conversation.connections.listContactAddresses(connectionId, {\n page_size: 100,\n ...(q ? { q } : {}),\n })\n ).data,\n }\n}\n","import { useSyncExternalStore } from 'react'\n\n/* =========================================================================\n Draft-actions registry — how EXTERNAL controls (a task-list row's\n \"Execute\" button, any sibling in the same realm) drive a mounted\n DraftMessageComposer without a ref. The composer registers its imperative\n handlers per message id on mount and unregisters on unmount; callers grab\n them with useDraftMessageActions and get real promises back. Outcomes\n additionally flow through the outcome store + onSent/onRejected.\n\n Same per-JS-realm scope as the outcome store (per page in the web app,\n per iframe in the component runtime). Multiple composers mounted for one\n message id: the last-registered wins.\n ========================================================================= */\n\nexport interface DraftMessageActions {\n /** Persists dirty edits, then delivers — the internal Send button's path. */\n send(): Promise<void>\n /** Declines the draft. Bypasses the inline confirm — the external UI owns confirmation. */\n reject(): Promise<void>\n /** Persists the current edits without sending. */\n saveDraft(): Promise<void>\n /** True while the composer is saving/sending/rejecting — disable external buttons. */\n isBusy: boolean\n}\n\nconst actionsByMessageId = new Map<string, DraftMessageActions>()\nconst listenersByMessageId = new Map<string, Set<() => void>>()\n\nfunction notify(messageId: string): void {\n for (const listener of listenersByMessageId.get(messageId) ?? []) listener()\n}\n\n/**\n * Registers a composer's handlers for its message id; returns the\n * unregister. Re-register (a fresh object) whenever isBusy flips so\n * subscribers re-render. Unregistering only clears the entry while it still\n * owns it (last-registered wins across overlapping mounts).\n */\nexport function registerDraftMessageActions(\n messageId: string,\n actions: DraftMessageActions,\n): () => void {\n actionsByMessageId.set(messageId, actions)\n notify(messageId)\n return () => {\n if (actionsByMessageId.get(messageId) === actions) {\n actionsByMessageId.delete(messageId)\n notify(messageId)\n }\n }\n}\n\n/**\n * The mounted composer's actions for this draft, or null while none is\n * mounted (disable the external button).\n */\nexport function useDraftMessageActions(messageId: string): DraftMessageActions | null {\n return useSyncExternalStore(\n (listener) => {\n let listeners = listenersByMessageId.get(messageId)\n if (!listeners) {\n listeners = new Set()\n listenersByMessageId.set(messageId, listeners)\n }\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n if (listeners.size === 0) listenersByMessageId.delete(messageId)\n }\n },\n () => actionsByMessageId.get(messageId) ?? null,\n () => null,\n )\n}\n\n/** Test-only escape hatch — clears every registration and listener. */\nexport function __resetDraftMessageActions(): void {\n actionsByMessageId.clear()\n listenersByMessageId.clear()\n}\n","import { type KeyboardEvent, type ReactNode, useRef, useState } from 'react'\nimport { type Key, Label, ListBox, ListBoxItem, Popover } from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldChipPadding,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldMinHeight,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n MultiSelect — pick many from a list. Trigger shows selected items as\n removable chips; popover hosts a multi-select ListBox.\n\n Each option accepts a `content: ReactNode` so consumers can render plain\n text, a Badge, an icon + label, or anything else — and the same content\n is reused inside the selected chip.\n ========================================================================= */\n\nexport type MultiSelectOption<T extends Key = Key> = {\n id: T\n /** Plain-text label — used as the option's accessible name and fallback\n * when `content` isn't provided. */\n label: string\n /** Optional rich render. Applied to BOTH the listbox row and the selected\n * chip (wrapped by the chip's × button). Falls back to `label`. */\n content?: ReactNode\n isDisabled?: boolean\n}\n\nexport type MultiSelectProps<T extends Key = Key> = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<MultiSelectOption<T>>\n /** Controlled selection. Pass a `Set<T>` or any `Iterable<T>`. */\n selectedKeys: Iterable<T>\n onSelectionChange: (keys: Set<T>) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Hide already-selected options from the dropdown. Removal then only\n * happens via the chip × in the trigger. Default `false` (selected\n * options stay visible and can be toggled off from the listbox). */\n hideSelectedOptions?: boolean\n /** Render a search input at the top of the popover that filters options\n * by label (case-insensitive substring). Default `false`. */\n isSearchable?: boolean\n /** Fires as the search text changes — lets consumers drive a server-side\n * directory search alongside the local filter. */\n onSearchChange?: (needle: string) => void\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n className?: string\n}\n\nexport function MultiSelect<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Select…',\n options,\n selectedKeys,\n onSelectionChange,\n isDisabled = false,\n isInvalid = false,\n hideSelectedOptions = false,\n isSearchable = false,\n onSearchChange,\n size = 'md',\n appearance,\n className,\n}: MultiSelectProps<T>) {\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n // Cell mode sits under the table row so the border reads clean instead of\n // merging with the row gridline.\n const minHeight = appearance === 'cell' ? 'min-h-[29px]' : fieldMinHeight[size]\n const [isOpen, setIsOpen] = useState(false)\n const [search, setSearch] = useState('')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const selectedSet = new Set(selectedKeys)\n const selectedOptions = options.filter((o) => selectedSet.has(o.id))\n const needle = search.trim().toLowerCase()\n const listboxOptions = (\n hideSelectedOptions ? options.filter((o) => !selectedSet.has(o.id)) : options\n ).filter((o) => needle === '' || o.label.toLowerCase().includes(needle))\n\n const updateSearch = (next: string) => {\n setSearch(next)\n onSearchChange?.(next)\n }\n const openPopover = (open: boolean) => {\n setIsOpen(open)\n if (!open && search !== '') updateSearch('')\n }\n\n const remove = (id: T) => {\n const next = new Set(selectedSet)\n next.delete(id)\n onSelectionChange(next)\n }\n\n const onTriggerKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isDisabled) return\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n openPopover(true)\n }\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n ref={triggerRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled={isDisabled || undefined}\n aria-invalid={isInvalid || undefined}\n tabIndex={isDisabled ? -1 : 0}\n onClick={() => !isDisabled && openPopover(!isOpen)}\n onKeyDown={onTriggerKeyDown}\n data-invalid={isInvalid || undefined}\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex flex-wrap items-center gap-1.5 cursor-pointer',\n minHeight,\n fieldChipPadding[size],\n 'pr-2',\n // Let focus-within light up the ring on both the trigger and any\n // chip's remove button without any extra JS.\n focusWithin,\n )}\n >\n {selectedOptions.length === 0 ? (\n // No vertical padding — wrapper's p-1.5 + min-h-[size] govern the\n // overall height so it matches the Input/Select trigger at the same\n // size.\n <span className={cn('text-ink-4 font-sans px-1', fieldTextStyles[size])}>\n {placeholder}\n </span>\n ) : (\n selectedOptions.map((o) => (\n <Chip key={o.id} onRemove={() => remove(o.id)} isDisabled={isDisabled}>\n {o.content ?? o.label}\n </Chip>\n ))\n )}\n <span className=\"ml-auto pr-1\">\n <FieldCaret />\n </span>\n </div>\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n\n <Popover\n isOpen={isOpen}\n onOpenChange={openPopover}\n triggerRef={triggerRef}\n offset={6}\n placement=\"bottom start\"\n className={cn(\n 'w-[var(--trigger-width)]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n {isSearchable ? (\n <div className=\"border-b border-rule-2 px-1 pb-1 mb-1\">\n <input\n // biome-ignore lint/a11y/noAutofocus: the popover just opened by explicit user action — focus belongs in its search box.\n autoFocus\n value={search}\n onChange={(e) => updateSearch(e.target.value)}\n placeholder=\"Search…\"\n aria-label=\"Search options\"\n className={cn(\n 'w-full bg-transparent outline-none rounded-[6px] px-2 py-1.5',\n 'font-sans text-[13px] text-ink placeholder:text-ink-4',\n )}\n />\n </div>\n ) : null}\n <ListBox\n aria-label={typeof label === 'string' ? label : 'Options'}\n selectionMode=\"multiple\"\n selectedKeys={selectedSet}\n onSelectionChange={(keys) => {\n if (keys === 'all') {\n onSelectionChange(new Set(options.map((o) => o.id)))\n return\n }\n onSelectionChange(keys as Set<T>)\n }}\n className=\"outline-none max-h-72 overflow-auto\"\n renderEmptyState={() => (\n <div className={cn('px-3 py-2', fieldHintStyles)}>\n {needle !== '' ? 'No matches' : 'All options selected'}\n </div>\n )}\n >\n {listboxOptions.map((option) => (\n <ListBoxItem\n key={option.id}\n id={option.id}\n textValue={option.label}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n className={cn(\n 'group flex items-center gap-2.5',\n 'rounded-[6px] px-3 py-2 text-[14px] text-ink-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <Checkmark />\n <span className=\"flex-1 truncate\">{option.content ?? option.label}</span>\n </ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </div>\n )\n}\n\n/* =========================================================================\n Internal: selected chip with × remove button.\n Minimal chrome (sand bg, hairline border, rounded-6) so that rich content\n like a <Badge/> still reads cleanly inside it.\n ========================================================================= */\n\nfunction Chip({\n children,\n onRemove,\n isDisabled,\n}: {\n children: ReactNode\n onRemove: () => void\n isDisabled: boolean\n}) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5',\n 'pl-2 pr-1 py-0.5 rounded-[6px]',\n 'bg-surface-2 border border-rule',\n 'font-sans text-[13px] text-ink',\n )}\n >\n <span className=\"inline-flex items-center\">{children}</span>\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={isDisabled}\n onClick={(e) => {\n // Keep the click from bubbling to the trigger div (which would\n // toggle the popover open/closed).\n e.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex items-center justify-center shrink-0',\n 'size-4 rounded-[3px]',\n 'text-ink-3 hover:text-ink hover:bg-surface-3 cursor-pointer',\n 'outline-none focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n )\n}\n\n/* =========================================================================\n Internal: empty box → indigo tick when the row is selected.\n ========================================================================= */\n\nfunction Checkmark() {\n return (\n <span\n aria-hidden\n className={cn(\n 'relative inline-flex items-center justify-center shrink-0',\n 'size-[16px] rounded-[3px] border border-ink-4 bg-surface',\n 'transition-[background-color,border-color] duration-150',\n 'group-data-[selected]:bg-ink group-data-[selected]:border-ink',\n )}\n >\n <svg\n viewBox=\"0 0 12 12\"\n className={cn(\n 'size-3 text-surface transition-opacity duration-150',\n 'opacity-0 group-data-[selected]:opacity-100',\n )}\n aria-hidden\n >\n <path\n d=\"M2.5 6.25 5 8.75 9.5 3.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </span>\n )\n}\n","import type { ContactAddress, SendRecipient } from '@proteos/sdk'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nimport type { SearchRecipients } from '../message-composer/message-composer'\nimport { MultiSelect, type MultiSelectOption } from '../multi-select/multi-select'\n\n/** Debounce for the injected directory search (`q`). */\nconst SEARCH_DEBOUNCE_MS = 250\n\n/* =========================================================================\n RecipientSelect — a searchable multi-select over the contact-address\n directory a connection can reach, emitting SendRecipient[] (all\n kind=contact-address). Backs the composer's To/Cc/Bcc rows. Typing filters\n the loaded options locally AND (debounced) runs the injected\n `searchRecipients` server-side, so parties beyond the first page are\n findable; already-selected ids are always included so their chips render\n even when off the current result page. Fetch-agnostic: the host injects\n the search; stale responses are ignored and a failed search keeps the\n previous options (best-effort).\n ========================================================================= */\n\nexport interface RecipientSelectProps {\n connectionId: string\n searchRecipients: SearchRecipients\n value: SendRecipient[]\n onChange: (next: SendRecipient[]) => void\n placeholder?: string\n}\n\nexport function RecipientSelect({\n connectionId,\n searchRecipients,\n value,\n onChange,\n placeholder,\n}: RecipientSelectProps) {\n const [search, setSearch] = useState('')\n const [debouncedSearch, setDebouncedSearch] = useState('')\n useEffect(() => {\n const handle = window.setTimeout(() => setDebouncedSearch(search.trim()), SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(handle)\n }, [search])\n\n const [addresses, setAddresses] = useState<ContactAddress[]>([])\n // Monotonic request counter — only the latest in-flight search may land.\n const requestIdRef = useRef(0)\n useEffect(() => {\n if (connectionId === '') return\n const requestId = ++requestIdRef.current\n searchRecipients(connectionId, debouncedSearch)\n .then((results) => {\n if (requestId === requestIdRef.current) setAddresses(results)\n })\n .catch(() => {\n // Best-effort directory: keep the previous options on failure.\n })\n }, [connectionId, debouncedSearch, searchRecipients])\n\n const options = useMemo<MultiSelectOption<string>[]>(() => {\n const map = new Map<string, MultiSelectOption<string>>()\n for (const recipient of value) {\n map.set(recipient.external_id, { id: recipient.external_id, label: recipient.external_id })\n }\n for (const address of addresses) {\n const identifier = address.raw_value || address.value\n map.set(identifier, {\n id: identifier,\n label: address.name || identifier,\n })\n }\n return Array.from(map.values())\n }, [addresses, value])\n\n // The composer renders the row label (inline mono, like the Via/Subject\n // rows) — none here.\n return (\n <MultiSelect\n size=\"sm\"\n isSearchable\n onSearchChange={setSearch}\n {...(placeholder !== undefined ? { placeholder } : {})}\n options={options}\n selectedKeys={value.map((recipient) => recipient.external_id)}\n onSelectionChange={(keys) =>\n onChange(\n Array.from(keys).map((id) => ({\n kind: 'contact-address' as const,\n external_id: String(id),\n })),\n )\n }\n />\n )\n}\n","import type { ContactAddress, SendRecipient } from '@proteos/sdk'\nimport { Paperclip, SendHorizontal } from 'lucide-react'\nimport { type KeyboardEvent, type ReactNode, useCallback, useEffect, useRef, useState } from 'react'\nimport { Button as AriaButton, FileTrigger } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { AttachmentChip } from '../attachment-chip/attachment-chip'\nimport { Button } from '../button/button'\nimport { RecipientSelect } from '../recipient-select/recipient-select'\nimport { Select } from '../select/select'\n\n/* =========================================================================\n MessageComposer — shared chrome (Field contract: rule border, inset\n shadow, accent + halo on focus), channel-aware behavior:\n chat : ↵ send, ⇧↵ newline\n email : subject row, ⌘↵ send\n The active binding is printed as a mono hint next to send. A failed send\n NEVER clears the input. Disabled states replace the composer with honest\n copy.\n\n Fetch-agnostic: text + subject are controlled (`value`/`onValueChange` —\n draft persistence lives with the host), the To/Cc/Bcc directory search is\n injected (`searchRecipients`), and attachments are presentational — the\n host owns its upload queue and maps it onto `ComposerAttachment`.\n ========================================================================= */\n\n/** Controlled text + subject. Draft persistence lives with the host. */\nexport interface ComposerValue {\n text: string\n subject?: string\n}\n\nexport interface ComposerSendInput {\n text: string\n subject?: string\n /** Only when the composer owns addressing (`showToField` — compose). */\n to?: SendRecipient[]\n cc?: SendRecipient[]\n bcc?: SendRecipient[]\n}\n\n/** The compose view's connection switcher, rendered as the composer's top row. */\nexport interface ComposerConnectionPicker {\n options: ReadonlyArray<{\n id: string\n /** Rich render (channel icon + name); `textValue` carries the plain name. */\n label: ReactNode\n textValue: string\n }>\n selectedId: string\n onSelect: (connectionId: string) => void\n}\n\n/** Presentational attachment chip input — hosts map their own upload model onto it. */\nexport interface ComposerAttachment {\n localId: string\n name: string\n /** Bytes when known — server-loaded attachments may not know their size. */\n sizeInBytes?: number\n contentType?: string\n status: 'uploading' | 'ready' | 'error'\n errorMessage?: string\n}\n\n/** Directory search backing the To/Cc/Bcc pickers — injected per host (the lib never fetches). */\nexport type SearchRecipients = (connectionId: string, q: string) => Promise<ContactAddress[]>\n\n/** Per-file cap for conversation-channel sends (the backend rejects larger\n * with `attachment_too_large`; Slack additionally caps at 10 files/message,\n * surfaced through the send error line). */\nexport const MAX_COMPOSER_ATTACHMENT_BYTES = 25 * 1024 * 1024\n\n/** Outer box chrome — exported so hosts can re-apply the same shell. */\nexport const messageComposerStyles = tv({\n base: [\n 'rounded-[10px] border border-rule bg-surface shadow-[var(--shadow-inset)]',\n 'transition-[border-color,box-shadow] duration-150',\n 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]',\n ],\n})\n\n/** Shared row-label chrome: fixed width so the Via/To/Cc/Bcc controls all\n * start at the same x (Subject keeps its own natural label). */\nconst ROW_LABEL = 'w-7 shrink-0 font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4'\n\nexport interface MessageComposerProps {\n mode: 'chat' | 'email'\n /** Controlled text+subject (draft persistence lives with the host). */\n value: ComposerValue\n onValueChange: (value: ComposerValue) => void\n placeholder: string\n /** Email replies arrive with `re: <subject>` prefilled. */\n subjectPrefill?: string\n /** When true (email mode), the Subject row renders the subject as static\n * text — reply drafts where the subject is derived from the thread and\n * must not be edited. The Cc/Bcc reveal stays functional. Default false. */\n isSubjectReadOnly?: boolean\n /** When set, the composer is replaced by this banner (ended conversation,\n * read-only transcript). */\n disabledReason?: ReactNode\n onSend: (input: ComposerSendInput) => Promise<unknown>\n /** Connection whose directory backs the To/Cc/Bcc pickers. */\n connectionId?: string\n /** Compose only: a connection switcher as the composer's top row. */\n connectionPicker?: ComposerConnectionPicker\n /** Compose only: the composer owns addressing — a To recipient row; the\n * picks arrive on `ComposerSendInput.to` and gate send. */\n showToField?: boolean\n /** Email originate only: reveal Cc/Bcc recipient rows. */\n showRecipientFields?: boolean\n /** Required for the To/Cc/Bcc rows to render (with `connectionId`). */\n searchRecipients?: SearchRecipients\n /** Controlled-if-provided recipients; internal state otherwise. Internal\n * recipient state resets when `connectionId` changes and clears after a\n * successful send — controlled parents own their own resets. */\n to?: SendRecipient[]\n cc?: SendRecipient[]\n bcc?: SendRecipient[]\n onToChange?: (next: SendRecipient[]) => void\n onCcChange?: (next: SendRecipient[]) => void\n onBccChange?: (next: SendRecipient[]) => void\n /** The host-owned pending queue, rendered as chips above the input. */\n attachments?: ComposerAttachment[]\n /** When set, the paperclip renders and picked files flow to the host. */\n onAddFiles?: (files: File[]) => void\n onRemoveAttachment?: (localId: string) => void\n /** True while any attachment is still uploading — blocks send. */\n hasUploadingAttachments?: boolean\n /**\n * Default true. When false: the send button AND the keybinding hint are\n * hidden and the ↵/⌘↵ submit combo is disabled — submission is fully\n * delegated to an external driver (e.g. the draft review surface).\n */\n showSendButton?: boolean\n /** Composes onto the outer box chrome (`messageComposerStyles`). */\n className?: string\n /** Composes onto the body textarea — review surfaces override the default\n * `max-h-48` growth cap (e.g. `max-h-[55dvh]`) so a whole email fits. */\n bodyClassName?: string\n}\n\nexport function MessageComposer({\n mode,\n value,\n onValueChange,\n placeholder,\n subjectPrefill,\n isSubjectReadOnly,\n disabledReason,\n onSend,\n connectionId,\n connectionPicker,\n showToField,\n showRecipientFields,\n searchRecipients,\n to: toProp,\n cc: ccProp,\n bcc: bccProp,\n onToChange,\n onCcChange,\n onBccChange,\n attachments,\n onAddFiles,\n onRemoveAttachment,\n hasUploadingAttachments,\n showSendButton,\n className,\n bodyClassName,\n}: MessageComposerProps) {\n const [isSending, setIsSending] = useState(false)\n const [sendError, setSendError] = useState<string | null>(null)\n const [internalTo, setInternalTo] = useState<SendRecipient[]>([])\n const [internalCc, setInternalCc] = useState<SendRecipient[]>([])\n const [internalBcc, setInternalBcc] = useState<SendRecipient[]>([])\n const [showCcBcc, setShowCcBcc] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n // Size-to-content on every text change — including a seeded value (a loaded\n // draft body), which never fires onChange.\n // biome-ignore lint/correctness/useExhaustiveDependencies: value.text is the trigger — the height reads the DOM, not the value.\n useEffect(() => {\n if (textareaRef.current) autoGrow(textareaRef.current)\n }, [value.text])\n\n // Controlled-if-provided, per group: a provided prop wins over internal\n // state; setters mirror into internal state only when uncontrolled.\n const to = toProp ?? internalTo\n const cc = ccProp ?? internalCc\n const bcc = bccProp ?? internalBcc\n const setTo = (next: SendRecipient[]) => {\n if (toProp === undefined) setInternalTo(next)\n onToChange?.(next)\n }\n const setCc = (next: SendRecipient[]) => {\n if (ccProp === undefined) setInternalCc(next)\n onCcChange?.(next)\n }\n const setBcc = (next: SendRecipient[]) => {\n if (bccProp === undefined) setInternalBcc(next)\n onBccChange?.(next)\n }\n\n // The recipient rows need a directory to search — both halves, or nothing.\n const directory =\n searchRecipients !== undefined && connectionId ? { searchRecipients, connectionId } : undefined\n const canPickRecipients =\n mode === 'email' && (showRecipientFields ?? false) && directory !== undefined\n const needsTo = (showToField ?? false) && directory !== undefined\n const isSendButtonShown = showSendButton ?? true\n\n // INTERNAL recipients belong to one connection's directory — switching (the\n // compose picker) drops them. Controlled parents own their own resets.\n // biome-ignore lint/correctness/useExhaustiveDependencies: connectionId is the trigger — the pickers must reset exactly when the directory changes.\n useEffect(() => {\n setInternalTo([])\n setInternalCc([])\n setInternalBcc([])\n }, [connectionId])\n\n const subject = value.subject ?? subjectPrefill ?? ''\n const readyCount = (attachments ?? []).filter(\n (attachment) => attachment.status === 'ready',\n ).length\n const canSend =\n (value.text.trim() !== '' || readyCount > 0) &&\n (mode !== 'email' || subject.trim() !== '') &&\n (!needsTo || to.length > 0) &&\n !(hasUploadingAttachments ?? false)\n\n const submit = useCallback(async () => {\n if (!canSend || isSending) return\n setIsSending(true)\n setSendError(null)\n try {\n await onSend({\n text: value.text.trim(),\n ...(mode === 'email' ? { subject: subject.trim() } : {}),\n ...(needsTo ? { to } : {}),\n ...(cc.length > 0 ? { cc } : {}),\n ...(bcc.length > 0 ? { bcc } : {}),\n })\n // Success: hand the cleared value back (subject key omitted) and drop\n // INTERNAL recipients only — controlled recipients stay the parent's.\n onValueChange({ text: '' })\n setInternalTo([])\n setInternalCc([])\n setInternalBcc([])\n } catch (error) {\n // Never clear the input on failure — the text is the user's work.\n setSendError(error instanceof Error ? error.message : 'Send failed')\n } finally {\n setIsSending(false)\n }\n }, [canSend, isSending, onSend, value.text, mode, subject, needsTo, to, cc, bcc, onValueChange])\n\n if (disabledReason) {\n return (\n <div className=\"px-[18px] py-3\">\n <p\n className={cn(\n 'rounded-[10px] border border-rule bg-surface-2 px-3.5 py-2.5',\n 'text-[12.5px] text-ink-3 text-center',\n )}\n >\n {disabledReason}\n </p>\n </div>\n )\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isSendButtonShown) return\n const isSendCombo =\n mode === 'email'\n ? event.key === 'Enter' && (event.metaKey || event.ctrlKey)\n : event.key === 'Enter' && !event.shiftKey\n if (isSendCombo) {\n event.preventDefault()\n void submit()\n }\n }\n\n const ccBccReveal =\n canPickRecipients && !showCcBcc ? (\n <AriaButton\n onPress={() => setShowCcBcc(true)}\n className=\"shrink-0 font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4 cursor-pointer outline-none hover:text-ink-3 focus-visible:shadow-[var(--shadow-focus)] rounded\"\n >\n Cc/Bcc\n </AriaButton>\n ) : null\n\n return (\n <div className=\"px-[18px] pb-3.5 pt-1\">\n <div className={cn(messageComposerStyles(), className)}>\n {connectionPicker ? (\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>Via</span>\n <Select\n aria-label=\"Connection\"\n size=\"sm\"\n options={connectionPicker.options.map((option) => ({\n id: option.id,\n label: option.label,\n textValue: option.textValue,\n }))}\n selectedKey={connectionPicker.selectedId}\n onSelectionChange={(key) => connectionPicker.onSelect(String(key))}\n triggerClassName=\"font-mono text-[11px]\"\n popoverClassName=\"min-w-[var(--trigger-width)] w-max max-w-80\"\n />\n </div>\n ) : null}\n\n {mode === 'email' ? (\n isSubjectReadOnly ? (\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">\n Subject\n </span>\n <span className=\"flex-1 min-w-0 truncate text-[13px] text-ink\">{subject}</span>\n {ccBccReveal}\n </div>\n ) : (\n <label className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">\n Subject\n </span>\n <input\n value={subject}\n onChange={(event) => onValueChange({ ...value, subject: event.target.value })}\n placeholder=\"Subject\"\n className=\"flex-1 bg-transparent outline-none text-[13px] text-ink placeholder:text-ink-4\"\n />\n {ccBccReveal}\n </label>\n )\n ) : null}\n\n {needsTo && directory ? (\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>To</span>\n <div className=\"flex-1 min-w-0\">\n <RecipientSelect\n connectionId={directory.connectionId}\n searchRecipients={directory.searchRecipients}\n placeholder=\"Pick recipients…\"\n value={to}\n onChange={setTo}\n />\n </div>\n </div>\n ) : null}\n\n {canPickRecipients && directory && showCcBcc ? (\n <>\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>Cc</span>\n <div className=\"flex-1 min-w-0\">\n <RecipientSelect\n connectionId={directory.connectionId}\n searchRecipients={directory.searchRecipients}\n placeholder=\"Add cc…\"\n value={cc}\n onChange={setCc}\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>Bcc</span>\n <div className=\"flex-1 min-w-0\">\n <RecipientSelect\n connectionId={directory.connectionId}\n searchRecipients={directory.searchRecipients}\n placeholder=\"Add bcc…\"\n value={bcc}\n onChange={setBcc}\n />\n </div>\n </div>\n </>\n ) : null}\n\n {attachments && attachments.length > 0 ? (\n // Single horizontally-scrollable row so the chips never grow the composer tall.\n <div className=\"flex gap-1.5 overflow-x-auto px-3.5 pt-2 pb-0.5\">\n {attachments.map((attachment) => (\n <AttachmentChip\n key={attachment.localId}\n name={attachment.name}\n status={attachment.status}\n {...(attachment.sizeInBytes !== undefined\n ? { sizeInBytes: attachment.sizeInBytes }\n : {})}\n {...(attachment.contentType ? { contentType: attachment.contentType } : {})}\n {...(attachment.errorMessage ? { errorMessage: attachment.errorMessage } : {})}\n {...(onRemoveAttachment\n ? { onRemove: () => onRemoveAttachment(attachment.localId) }\n : {})}\n className=\"shrink-0\"\n />\n ))}\n </div>\n ) : null}\n\n {/* Stacked like Ask Proteos: the input is its own full-width row (typing\n grows it upward), the actions sit in a row beneath — clip on the left,\n send on the right — so the text always starts at the box's left edge. */}\n <div className=\"flex flex-col gap-2 px-3.5 py-2\">\n <textarea\n ref={textareaRef}\n value={value.text}\n placeholder={placeholder}\n rows={1}\n onChange={(event) => onValueChange({ ...value, text: event.target.value })}\n onKeyDown={onKeyDown}\n className={cn(\n 'w-full resize-none bg-transparent outline-none',\n 'min-h-[40px] max-h-48 text-[14px] leading-[1.5] text-ink placeholder:text-ink-4',\n bodyClassName,\n )}\n data-conversations-composer\n />\n\n <div className=\"flex items-center justify-between gap-2\">\n {onAddFiles ? (\n <FileTrigger\n allowsMultiple\n onSelect={(files) => {\n if (files) onAddFiles(Array.from(files))\n }}\n >\n <Button\n variant=\"subtle\"\n size=\"icon-md\"\n aria-label=\"Attach files\"\n className=\"shrink-0\"\n >\n <Paperclip className=\"size-4\" aria-hidden />\n </Button>\n </FileTrigger>\n ) : (\n <span />\n )}\n\n {isSendButtonShown ? (\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-[10px] text-ink-4 select-none\" aria-hidden>\n {mode === 'email' ? '⌘↵' : '↵'}\n </span>\n <AriaButton\n aria-label=\"Send\"\n isDisabled={!canSend || isSending}\n onPress={() => void submit()}\n className={cn(\n 'grid place-items-center size-8 rounded-[8px] cursor-pointer',\n 'bg-accent text-tile-fg transition-opacity duration-150',\n 'disabled:opacity-40 disabled:cursor-default',\n 'outline-none focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <SendHorizontal className=\"size-3.5\" />\n </AriaButton>\n </div>\n ) : null}\n </div>\n </div>\n </div>\n\n {sendError ? (\n <p className=\"mt-1.5 font-mono text-[11px] text-danger\">\n {sendError} — your message is kept above.{' '}\n <AriaButton\n onPress={() => void submit()}\n className=\"inline underline cursor-pointer outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n retry\n </AriaButton>\n </p>\n ) : null}\n </div>\n )\n}\n\n// Sizes the textarea to its content; the CSS max-h on the element clips the\n// growth (and scrolls) so the cap stays a style concern, overridable per host.\nfunction autoGrow(node: HTMLTextAreaElement) {\n node.style.height = 'auto'\n node.style.height = `${node.scrollHeight}px`\n}\n","import { useSyncExternalStore } from 'react'\n\nimport type { DraftMessageOutcome } from './types'\n\n/* =========================================================================\n Draft-outcome pub/sub — how SIBLING components learn a draft was sent or\n rejected without prop drilling (the show-details-store pattern, keyed by\n message id, plus last-value replay so a subscriber mounting AFTER the\n outcome still sees it).\n\n Scope: a per-JS-realm module singleton. In the web app that is the whole\n page. In the component runtime the import map makes @proteos/ui a\n singleton PER IFRAME — sibling components inside the SAME custom component\n share outcomes; separate custom components are separate iframes and do\n not (cross-iframe reaction stays host-side via query invalidation).\n ========================================================================= */\n\nconst listenersByMessageId = new Map<string, Set<() => void>>()\nconst lastOutcomeByMessageId = new Map<string, DraftMessageOutcome>()\n\nexport function publishDraftMessageOutcome(messageId: string, outcome: DraftMessageOutcome): void {\n lastOutcomeByMessageId.set(messageId, outcome)\n for (const listener of listenersByMessageId.get(messageId) ?? []) listener()\n}\n\nexport function subscribeDraftMessageOutcome(messageId: string, listener: () => void): () => void {\n let listeners = listenersByMessageId.get(messageId)\n if (!listeners) {\n listeners = new Set()\n listenersByMessageId.set(messageId, listeners)\n }\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n if (listeners.size === 0) listenersByMessageId.delete(messageId)\n }\n}\n\n/**\n * The last outcome for this draft, or null while it is still under review.\n * Re-renders when the outcome lands — including for subscribers that mounted\n * after it (last-value replay).\n */\nexport function useDraftMessageOutcome(messageId: string): DraftMessageOutcome | null {\n return useSyncExternalStore(\n (listener) => subscribeDraftMessageOutcome(messageId, listener),\n () => lastOutcomeByMessageId.get(messageId) ?? null,\n () => null,\n )\n}\n\n/** Test-only escape hatch — clears every stored outcome and listener. */\nexport function __resetDraftMessageOutcomes(): void {\n listenersByMessageId.clear()\n lastOutcomeByMessageId.clear()\n}\n","import type { Message } from '@proteos/sdk'\n\n/* =========================================================================\n Draft status → terminal state. One switch, two narrowings: the composer\n needs to distinguish \"this id isn't a draft at all\" (it renders a distinct\n terminal notice) while review surfaces only care whether a decision has\n been reached. Both were duplicated before — keep them here so a new\n Message['status'] value is handled in exactly one place.\n ========================================================================= */\n\n/** What a reviewed draft ended up as. The wire shape of the\n * `present_message_draft` client tool's outcome, and of the value a\n * host-rendered review modal closes with. */\nexport type DraftReviewOutcome = 'sent' | 'rejected' | 'failed'\n\n/** Terminal states a draft id can be in, plus the \"never was a draft\" case. */\nexport type TerminalKind = DraftReviewOutcome | 'not-draft'\n\nconst OUTCOME_BY_STATUS: Partial<Record<Message['status'], DraftReviewOutcome>> = {\n // `pending` is already handed to the transport — from the reviewer's side\n // the decision was \"send\".\n pending: 'sent',\n sent: 'sent',\n rejected: 'rejected',\n failed: 'failed',\n}\n\n/** Terminal state of the message, or null while it is still reviewable. */\nexport function terminalKindFor(status: Message['status']): TerminalKind | null {\n if (status === 'draft') return null\n return OUTCOME_BY_STATUS[status] ?? 'not-draft'\n}\n\n/**\n * The review-surface narrowing: the outcome a card should settle on, or null\n * while the draft is still reviewable. A status that was never a draft\n * (`received`, …) is not an outcome — it leaves the card pending rather than\n * inventing a decision the human never made.\n */\nexport function draftOutcomeFor(status: Message['status']): DraftReviewOutcome | null {\n const kind = terminalKindFor(status)\n return kind === null || kind === 'not-draft' ? null : kind\n}\n\n/** Narrows the `unknown` a host modal resolves with (a dismissed modal\n * resolves `undefined`). */\nexport function isDraftReviewOutcome(value: unknown): value is DraftReviewOutcome {\n return value === 'sent' || value === 'rejected' || value === 'failed'\n}\n","import type { Conversation, Message, SendRecipient, UpdateDraftRequest } from '@proteos/sdk'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button'\nimport { type ComposerAttachment, type ComposerValue, MessageComposer } from '../message-composer'\nimport { registerDraftMessageActions } from './draft-message-actions-store'\nimport { publishDraftMessageOutcome } from './draft-message-outcome-store'\nimport { type TerminalKind, terminalKindFor } from './draft-status'\nimport type { DraftMessageClient } from './types'\n\n/* =========================================================================\n DraftMessageComposer — the human-review surface for an agent-drafted\n outbound message (status=draft). Pass a draft's message id + an injected\n client (createDraftMessageClient); it loads the draft into the shared\n MessageComposer, lets the human edit body / subject-on-originate-drafts /\n recipients-on-email-drafts, then Send (persists dirty edits first) or\n Reject. Outcomes reach the host three ways: onSent/onRejected callbacks,\n the keyed outcome store (useDraftMessageOutcome — sibling components), and\n the actions registry (useDraftMessageActions — external Send/Reject\n buttons, e.g. a task list's \"Execute\"; pair with showActions={false}).\n\n Known v1 limits: attachments are display-only; a `failed` delivery is a\n terminal surface here (host-side retry = a new send, matching the\n timeline's failed-retry pattern).\n ========================================================================= */\n\nexport const draftMessageComposerStyles = tv({\n slots: {\n root: 'flex flex-col gap-1.5',\n header: 'flex items-center gap-2 px-[18px] pt-2',\n badge: [\n 'inline-flex items-center gap-1 rounded-pill border border-rule px-2 py-0.5',\n 'font-mono text-[10px] uppercase tracking-[0.08em] text-ink-3 bg-surface-2',\n ],\n sender: 'text-[12.5px] text-ink-3 truncate',\n actions: 'flex items-center justify-between gap-2 px-[18px] pb-3',\n terminal: [\n 'mx-[18px] my-3 rounded-[10px] border border-rule bg-surface-2 px-3.5 py-2.5',\n 'text-[12.5px] text-ink-3',\n ],\n error: 'px-[18px] font-mono text-[11px] text-danger',\n },\n})\n\nconst styles = draftMessageComposerStyles()\n\ntype Phase = 'loading' | 'load-error' | 'ready' | 'terminal'\ntype Busy = 'idle' | 'saving' | 'sending' | 'rejecting'\n\ninterface DraftSnapshot {\n text: string\n subject: string\n to: SendRecipient[]\n cc: SendRecipient[]\n bcc: SendRecipient[]\n}\n\nexport interface DraftMessageComposerProps {\n /** The status=draft message to review. */\n messageId: string\n /** Injected fetch surface — see createDraftMessageClient. */\n client: DraftMessageClient\n /** Fires once the draft delivered (send resolved pending/sent). */\n onSent?: (message: Message) => void\n /** Fires once the draft was declined. */\n onRejected?: (message: Message) => void\n /** Fires when the human approved the send but delivery failed. */\n onFailed?: (message: Message) => void\n /**\n * Default true. When false the internal Send / Save draft / Reject row is\n * hidden — the composer becomes a pure preview/edit surface driven by\n * external controls via useDraftMessageActions.\n */\n showActions?: boolean\n className?: string\n /** Composes onto the body textarea (MessageComposer.bodyClassName) — review\n * surfaces raise the growth cap so a whole email fits. */\n bodyClassName?: string\n}\n\n/** Maps stored recipient snapshots back to editable send targets (contact\n * addresses only; snapshots without an external id cannot be re-addressed). */\nfunction sendRecipientsFromMessage(message: Message, role: 'to' | 'cc' | 'bcc'): SendRecipient[] {\n return (message.recipients ?? [])\n .filter((recipient) => recipient.role === role && !!recipient.external_id)\n .map((recipient) => ({\n kind: 'contact-address' as const,\n external_id: recipient.external_id as string,\n }))\n}\n\nexport function DraftMessageComposer({\n messageId,\n client,\n onSent,\n onRejected,\n onFailed,\n showActions = true,\n className,\n bodyClassName,\n}: DraftMessageComposerProps) {\n const [phase, setPhase] = useState<Phase>('loading')\n const [busy, setBusy] = useState<Busy>('idle')\n const [terminalKind, setTerminalKind] = useState<TerminalKind>('not-draft')\n const [message, setMessage] = useState<Message | null>(null)\n const [conversation, setConversation] = useState<Conversation | null>(null)\n const [loadError, setLoadError] = useState<string | null>(null)\n const [actionError, setActionError] = useState<string | null>(null)\n const [isConfirmingReject, setIsConfirmingReject] = useState(false)\n const [value, setValue] = useState<ComposerValue>({ text: '' })\n const [to, setTo] = useState<SendRecipient[]>([])\n const [cc, setCc] = useState<SendRecipient[]>([])\n const [bcc, setBcc] = useState<SendRecipient[]>([])\n // State (not a ref): isDirty/buildPatch must recompute when a save moves it.\n const [snapshot, setSnapshot] = useState<DraftSnapshot>({\n text: '',\n subject: '',\n to: [],\n cc: [],\n bcc: [],\n })\n const [loadNonce, setLoadNonce] = useState(0)\n\n const isEmail = message?.channel === 'email'\n const isSubjectEditable = isEmail && conversation?.status === 'draft'\n const areRecipientsEditable = isEmail && !conversation?.room_id\n\n const seed = useCallback((draft: Message, thread: Conversation | null) => {\n const text = draft.content.find((block) => block.type === 'text')?.text ?? ''\n const subject = thread?.subject ?? ''\n const seededTo = sendRecipientsFromMessage(draft, 'to')\n const seededCc = sendRecipientsFromMessage(draft, 'cc')\n const seededBcc = sendRecipientsFromMessage(draft, 'bcc')\n setSnapshot({ text, subject, to: seededTo, cc: seededCc, bcc: seededBcc })\n setValue({ text, ...(draft.channel === 'email' ? { subject } : {}) })\n setTo(seededTo)\n setCc(seededCc)\n setBcc(seededBcc)\n }, [])\n\n // Load (and reload on retry): the message, then its conversation.\n // biome-ignore lint/correctness/useExhaustiveDependencies: loadNonce is the retry trigger — bumping it re-runs the load.\n useEffect(() => {\n let isStale = false\n setPhase('loading')\n setLoadError(null)\n setActionError(null)\n client\n .getMessage(messageId)\n .then(async (draft) => {\n const thread = draft.conversation_id\n ? await client.getConversation(draft.conversation_id)\n : null\n if (isStale) return\n setMessage(draft)\n setConversation(thread)\n const terminal = terminalKindFor(draft.status)\n if (terminal) {\n setTerminalKind(terminal)\n setPhase('terminal')\n return\n }\n seed(draft, thread)\n setPhase('ready')\n })\n .catch((error: unknown) => {\n if (isStale) return\n setLoadError(error instanceof Error ? error.message : 'Loading the draft failed')\n setPhase('load-error')\n })\n return () => {\n isStale = true\n }\n }, [client, messageId, seed, loadNonce])\n\n const isDirty = useMemo(() => {\n return (\n value.text !== snapshot.text ||\n (isSubjectEditable && (value.subject ?? '') !== snapshot.subject) ||\n JSON.stringify(to) !== JSON.stringify(snapshot.to) ||\n JSON.stringify(cc) !== JSON.stringify(snapshot.cc) ||\n JSON.stringify(bcc) !== JSON.stringify(snapshot.bcc)\n )\n }, [value, to, cc, bcc, snapshot, isSubjectEditable])\n\n const buildPatch = useCallback((): UpdateDraftRequest => {\n const current = message as Message\n const isBodyEdited = value.text !== snapshot.text\n const hasRecipientEdit =\n areRecipientsEditable &&\n (JSON.stringify(to) !== JSON.stringify(snapshot.to) ||\n JSON.stringify(cc) !== JSON.stringify(snapshot.cc) ||\n JSON.stringify(bcc) !== JSON.stringify(snapshot.bcc))\n const attachmentRefs = (current.attachments ?? []).map((attachment) => attachment.file)\n return {\n // Body edits collapse to one text block; an untouched body echoes the\n // stored blocks so an agent-provided html part survives the edit.\n content: isBodyEdited\n ? [{ type: 'text' as const, text: value.text.trim() }]\n : current.content,\n ...(isSubjectEditable ? { subject: value.subject ?? '' } : {}),\n // Presence-based replacement: any recipient edit ships ALL three groups\n // verbatim — [] is an explicit clear, an omitted group keeps the stored\n // one. Shipping only non-empty groups would silently resurrect removed\n // recipients at send time.\n ...(hasRecipientEdit ? { to, cc, bcc } : {}),\n ...(attachmentRefs.length > 0 ? { attachments: attachmentRefs } : {}),\n }\n }, [message, value, to, cc, bcc, snapshot, areRecipientsEditable, isSubjectEditable])\n\n const persistDirtyEdits = useCallback(async (): Promise<Message> => {\n const current = message as Message\n if (!isDirty) return current\n const updated = await client.updateDraft(messageId, buildPatch())\n setMessage(updated)\n setConversation((thread) =>\n thread && isSubjectEditable ? { ...thread, subject: value.subject ?? '' } : thread,\n )\n setSnapshot({ text: value.text, subject: value.subject ?? '', to, cc, bcc })\n return updated\n }, [message, isDirty, client, messageId, buildPatch, isSubjectEditable, value, to, cc, bcc])\n\n const saveDraft = useCallback(async () => {\n if (phase !== 'ready' || busy !== 'idle') return\n setBusy('saving')\n setActionError(null)\n try {\n await persistDirtyEdits()\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Saving the draft failed')\n } finally {\n setBusy('idle')\n }\n }, [phase, busy, persistDirtyEdits])\n\n const send = useCallback(async () => {\n if (phase !== 'ready' || busy !== 'idle') return\n // An originate draft addresses people directly — sending it with every\n // recipient removed can never deliver. (Reply drafts may legitimately go\n // recipient-less: they deliver into the thread.) Guards the actions\n // registry too, which bypasses the composer's own canSend gating.\n if (areRecipientsEditable && conversation?.status === 'draft' && to.length === 0) {\n setActionError('Add at least one recipient before sending')\n return\n }\n setBusy('sending')\n setActionError(null)\n try {\n await persistDirtyEdits()\n const result = await client.sendDraft(messageId)\n setMessage(result)\n if (result.status === 'failed') {\n // Delivery failed AFTER the human approved: terminal here, no outcome\n // published — the timeline's failed-retry pattern owns what's next.\n setTerminalKind('failed')\n setPhase('terminal')\n onFailed?.(result)\n return\n }\n setTerminalKind('sent')\n setPhase('terminal')\n publishDraftMessageOutcome(messageId, { type: 'sent', message: result })\n onSent?.(result)\n } catch (error) {\n // Transport/validation failure keeps the edits — the text is the\n // reviewer's work. Rethrow so the composer's onSend rejects too:\n // MessageComposer only clears its value on a RESOLVED send.\n setActionError(error instanceof Error ? error.message : 'Sending the draft failed')\n throw error\n } finally {\n setBusy('idle')\n }\n }, [\n phase,\n busy,\n persistDirtyEdits,\n client,\n messageId,\n onSent,\n onFailed,\n areRecipientsEditable,\n conversation,\n to,\n ])\n\n const reject = useCallback(\n async (isConfirmed: boolean) => {\n if (phase !== 'ready' || busy !== 'idle') return\n if (!isConfirmed) {\n setIsConfirmingReject(true)\n return\n }\n setBusy('rejecting')\n setActionError(null)\n try {\n // Deliberately ignores dirty edits — declining discards them.\n const result = await client.rejectDraft(messageId)\n setMessage(result)\n setTerminalKind('rejected')\n setPhase('terminal')\n publishDraftMessageOutcome(messageId, { type: 'rejected', message: result })\n onRejected?.(result)\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Rejecting the draft failed')\n } finally {\n setBusy('idle')\n setIsConfirmingReject(false)\n }\n },\n [phase, busy, client, messageId, onRejected],\n )\n\n // Actions registry: external controls (task-list Execute buttons, any\n // sibling in this realm) drive the mounted composer. Latest-closure refs so\n // the registered handlers never go stale; re-registered on busy flips so\n // subscribers see isBusy.\n const sendRef = useRef(send)\n const rejectRef = useRef(reject)\n const saveRef = useRef(saveDraft)\n sendRef.current = send\n rejectRef.current = reject\n saveRef.current = saveDraft\n useEffect(() => {\n if (phase !== 'ready') return\n return registerDraftMessageActions(messageId, {\n // Failures surface via actionError/outcomes — external drivers get a\n // settled promise, not a rejection to remember to catch.\n send: () => sendRef.current().catch(() => undefined),\n // External UIs own their confirmation — bypass the inline confirm.\n reject: () => rejectRef.current(true),\n saveDraft: () => saveRef.current(),\n isBusy: busy !== 'idle',\n })\n }, [messageId, phase, busy])\n\n const attachments = useMemo<ComposerAttachment[]>(\n () =>\n (message?.attachments ?? []).map((attachment) => ({\n localId: attachment.id,\n name: attachment.file.name || attachment.file.id,\n status: 'ready' as const,\n ...(attachment.file.content_type ? { contentType: attachment.file.content_type } : {}),\n })),\n [message?.attachments],\n )\n\n if (phase === 'loading') {\n return (\n <div className={cn(styles.root(), className)}>\n <p className={styles.terminal()}>Loading draft…</p>\n </div>\n )\n }\n\n if (phase === 'load-error') {\n return (\n <div className={cn(styles.root(), className)}>\n <p className={styles.terminal()}>\n {loadError ?? 'Loading the draft failed.'}{' '}\n <AriaButton\n onPress={() => setLoadNonce((nonce) => nonce + 1)}\n className=\"inline underline cursor-pointer outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n retry\n </AriaButton>\n </p>\n </div>\n )\n }\n\n if (phase === 'terminal' || !message) {\n const line =\n terminalKind === 'sent'\n ? 'This draft was sent.'\n : terminalKind === 'rejected'\n ? 'This draft was rejected.'\n : terminalKind === 'failed'\n ? `Sending failed${message?.error ? ` — ${message.error}` : ''}.`\n : 'This message is not a reviewable draft.'\n return (\n <div className={cn(styles.root(), className)} data-draft-terminal={terminalKind}>\n <p className={styles.terminal()}>{line}</p>\n </div>\n )\n }\n\n return (\n <div className={cn(styles.root(), className)}>\n <div className={styles.header()}>\n <span className={styles.badge()}>Draft · awaiting review</span>\n <span className={styles.sender()}>from {message.sender.name}</span>\n </div>\n\n <MessageComposer\n mode={isEmail ? 'email' : 'chat'}\n value={value}\n onValueChange={setValue}\n placeholder=\"Draft body…\"\n {...(bodyClassName !== undefined ? { bodyClassName } : {})}\n {...(isEmail && !isSubjectEditable ? { isSubjectReadOnly: true } : {})}\n onSend={async () => send()}\n {...(areRecipientsEditable && message.connection_id\n ? {\n connectionId: message.connection_id,\n searchRecipients: client.searchRecipients,\n showToField: true,\n showRecipientFields: true,\n to,\n cc,\n bcc,\n onToChange: setTo,\n onCcChange: setCc,\n onBccChange: setBcc,\n }\n : {})}\n {...(attachments.length > 0 ? { attachments } : {})}\n showSendButton={showActions}\n />\n\n {actionError ? <p className={styles.error()}>{actionError} — your edits are kept.</p> : null}\n\n {showActions ? (\n <div className={styles.actions()}>\n {isConfirmingReject ? (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[12.5px] text-ink-3\">Reject draft?</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => void reject(true)}\n isDisabled={busy !== 'idle'}\n >\n Confirm reject\n </Button>\n <Button size=\"sm\" variant=\"subtle\" onPress={() => setIsConfirmingReject(false)}>\n Cancel\n </Button>\n </div>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => void reject(false)}\n isDisabled={busy !== 'idle'}\n >\n Reject\n </Button>\n )}\n <Button\n size=\"sm\"\n variant=\"subtle\"\n onPress={() => void saveDraft()}\n isDisabled={busy !== 'idle' || !isDirty}\n >\n {busy === 'saving' ? 'Saving…' : 'Save draft'}\n </Button>\n </div>\n ) : null}\n </div>\n )\n}\n","import type { Message } from '@proteos/sdk'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport {\n DraftMessageComposer,\n type DraftMessageClient,\n type DraftReviewOutcome,\n draftOutcomeFor,\n useDraftMessageOutcome,\n} from '../draft-message-composer'\nimport { ModalBody, ModalContent, ModalHeader, ModalTitle } from '../modal'\nimport { DraftMessageCard } from './draft-message-card'\n\n/* =========================================================================\n DraftMessageReview — the connected draft-review entry point: loads the\n draft through the injected client, renders DraftMessageCard, and owns what\n the preview action does.\n\n The preview action is the seam. Left alone it opens a modal wrapping\n DraftMessageComposer — the zero-config path the platform chat uses. Passed\n `onPreview`, it hands the whole interaction over: the built-in modal is\n never rendered, and the host settles the card by resolving the outcome.\n That is how a sandboxed custom component reviews a draft — its iframe-local\n modal would layer below the host chrome, so it instead asks the host to\n open one (useComponentModal) and resolves with what the host closed with.\n\n A draft that is ALREADY terminal when it loads settles immediately: the\n human may have reviewed it in the platform UI before this card ever\n rendered, and an un-reviewable card that never resolves would hang whatever\n is waiting on the outcome (e.g. an agent turn).\n ========================================================================= */\n\nexport interface DraftMessageReviewProps {\n /** The status=draft message to review. */\n messageId: string\n /** Injected fetch surface — see createDraftMessageClient. */\n client: DraftMessageClient\n /**\n * FULL REPLACEMENT for the preview action's default (open the built-in\n * modal). When supplied the built-in modal is never rendered. Resolve with\n * the outcome so the card settles, or with null when the reviewer dismissed\n * without deciding (the card stays reviewable).\n */\n onPreview?: (messageId: string) => Promise<DraftReviewOutcome | null>\n /** Fires at most once, when the draft reaches a terminal state — whether it\n * was decided here, by `onPreview`, or before this card ever mounted. */\n onOutcome?: (outcome: DraftReviewOutcome, message?: Message) => void\n /** The draft could not be loaded. The card renders nothing in that case. */\n onLoadError?: (error: Error) => void\n /** Built-in modal heading. Default 'Review draft'. */\n modalTitle?: string\n /** Built-in modal panel width. Default 'max-w-3xl'. */\n modalClassName?: string\n /** Built-in modal overlay classes — this is where a host raises the z tier\n * above the surface that launched it. */\n overlayClassName?: string\n previewLabel?: string\n className?: string\n}\n\nexport function DraftMessageReview({\n messageId,\n client,\n onPreview,\n onOutcome,\n onLoadError,\n modalTitle = 'Review draft',\n modalClassName = 'max-w-3xl',\n overlayClassName,\n previewLabel,\n className,\n}: DraftMessageReviewProps) {\n const [message, setMessage] = useState<Message | null>(null)\n const [subject, setSubject] = useState('')\n const [isOpen, setIsOpen] = useState(false)\n const [isPreviewing, setIsPreviewing] = useState(false)\n const [outcome, setOutcome] = useState<DraftReviewOutcome | null>(null)\n\n // Latest-closure refs: the host's callbacks are referentially unstable (they\n // routinely close over a react-query mutation), and depending on them would\n // re-run the load effect on every host re-render.\n const onOutcomeRef = useRef(onOutcome)\n onOutcomeRef.current = onOutcome\n const onLoadErrorRef = useRef(onLoadError)\n onLoadErrorRef.current = onLoadError\n\n // One-shot: the outcome can arrive from the built-in composer, from\n // `onPreview`, from the load itself, or from the outcome store — the host\n // must still hear about it exactly once.\n const hasSettledRef = useRef(false)\n const settle = useCallback((next: DraftReviewOutcome, settled?: Message) => {\n setOutcome(next)\n setIsOpen(false)\n if (hasSettledRef.current) return\n hasSettledRef.current = true\n onOutcomeRef.current?.(next, settled)\n }, [])\n\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const loaded = await client.getMessage(messageId)\n if (cancelled) return\n setMessage(loaded)\n const terminal = draftOutcomeFor(loaded.status)\n if (terminal) {\n settle(terminal, loaded)\n return\n }\n if (loaded.conversation_id) {\n const conversation = await client.getConversation(loaded.conversation_id)\n if (!cancelled) setSubject(conversation.subject ?? '')\n }\n } catch (error) {\n if (cancelled) return\n onLoadErrorRef.current?.(error instanceof Error ? error : new Error(String(error)))\n }\n })()\n return () => {\n cancelled = true\n }\n }, [client, messageId, settle])\n\n // A composer for this same draft elsewhere in this JS realm (a detail panel,\n // a sibling embed) settles the card too — no prop drilling between them.\n const published = useDraftMessageOutcome(messageId)\n useEffect(() => {\n if (published) settle(published.type, published.message)\n }, [published, settle])\n\n const preview = () => {\n if (!onPreview) {\n setIsOpen(true)\n return\n }\n setIsPreviewing(true)\n void onPreview(messageId)\n .then((result) => {\n if (result) settle(result)\n })\n .finally(() => setIsPreviewing(false))\n }\n\n if (!message) return null\n\n return (\n <>\n <DraftMessageCard\n channel={message.channel}\n title={titleFor(message, subject)}\n recipients={toRecipients(message)}\n outcome={outcome}\n onPreview={preview}\n isPreviewDisabled={isPreviewing}\n {...(previewLabel !== undefined ? { previewLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n {onPreview ? null : (\n <ModalContent\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n modalClassName={modalClassName}\n {...(overlayClassName !== undefined ? { className: overlayClassName } : {})}\n >\n <ModalHeader>\n <ModalTitle>{modalTitle}</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"min-h-0 overflow-y-auto\">\n <DraftMessageComposer\n messageId={messageId}\n client={client}\n bodyClassName=\"max-h-[55dvh]\"\n onSent={(sent) => settle(draftOutcomeFor(sent.status) ?? 'sent', sent)}\n onRejected={(rejected) => settle('rejected', rejected)}\n onFailed={(failed) => settle('failed', failed)}\n />\n </ModalBody>\n </ModalContent>\n )}\n </>\n )\n}\n\n/** Subject first; an unsubjected draft (chat channels) leads with its opening\n * line so the card still says something about the message. */\nfunction titleFor(message: Message, subject: string): string {\n const firstLine = message.content.find((block) => block.type === 'text')?.text?.split('\\n')[0]\n return subject || firstLine || 'Draft message'\n}\n\nfunction toRecipients(message: Message): string[] {\n return (message.recipients ?? [])\n .filter((recipient) => recipient.role === 'to')\n .map((recipient) => recipient.name || recipient.email || recipient.external_id)\n .filter((label): label is string => !!label)\n}\n","import type { ReactNode } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n EmptyState — zero-state callout. Centred art tile + title + description\n + optional action. Used by the page-designer inspector's \"Nothing\n selected\" panel and re-usable wherever a panel needs a friendly empty\n state. Plan §7.2.\n ========================================================================= */\n\nexport const emptyStateStyles = tv({\n slots: {\n root: 'flex flex-col items-center text-center px-6',\n art: 'inline-grid place-items-center rounded-[12px] bg-surface-2 text-ink-3 mb-3',\n title: 'text-[14px] text-ink font-medium mb-1',\n description: 'text-[12.5px] text-ink-3 leading-[1.5] max-w-[220px] mx-auto',\n actions: 'mt-3',\n },\n variants: {\n size: {\n sm: {\n root: 'py-6',\n art: 'size-9',\n },\n md: {\n root: 'py-9',\n art: 'size-12',\n },\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type EmptyStateVariants = VariantProps<typeof emptyStateStyles>\n\nexport interface EmptyStateProps extends EmptyStateVariants {\n icon?: ReactNode\n title: ReactNode\n description?: ReactNode\n action?: ReactNode\n className?: string\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n size,\n className,\n}: EmptyStateProps) {\n const styles = emptyStateStyles({ size })\n return (\n <div className={cn(styles.root(), className)}>\n {icon ? <div className={styles.art()}>{icon}</div> : null}\n <div className={styles.title()}>{title}</div>\n {description ? <div className={styles.description()}>{description}</div> : null}\n {action ? <div className={styles.actions()}>{action}</div> : null}\n </div>\n )\n}\n","import { CircleX } from 'lucide-react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n ErrorAnimation — failure indicator: a large red X in a circle (token\n `--color-danger`), entering with the one-shot status-pop scale+fade\n (suppressed under prefers-reduced-motion). Decorative: rendered with\n `aria-hidden`, since the surrounding text region carries the\n announcement. Size via className (default 96×96).\n ========================================================================= */\n\nexport type ErrorAnimationProps = {\n className?: string\n}\n\nexport function ErrorAnimation({ className }: ErrorAnimationProps) {\n return (\n <div\n aria-hidden\n className={cn('size-24 text-danger motion-safe:animate-status-pop', className)}\n >\n <CircleX className=\"size-full\" strokeWidth={1.5} />\n </div>\n )\n}\n","import { Download } from 'lucide-react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button/button'\nimport { formatFileSize, iconForContentType } from '../file-field/file-field'\n\n/* =========================================================================\n FileViewerFallbackCard — what the FileViewer shows when it cannot render\n the file inline (unpreviewable type, load error, oversized). Mirrors the\n FileField card chrome: type icon, name, meta line, download action.\n ========================================================================= */\n\nexport const fileViewerFallbackCardStyles = tv({\n base: [\n 'flex w-full items-start gap-3 rounded-md border border-rule bg-surface px-3 py-2.5',\n 'text-left',\n ],\n})\n\nexport type FileViewerFallbackCardVariants = VariantProps<typeof fileViewerFallbackCardStyles>\n\nexport interface FileViewerFallbackCardProps {\n name: string\n contentType?: string\n sizeInBytes?: number\n /** Why the preview is unavailable (e.g. \"Too large to preview\"). */\n note?: string\n /** Load failure — rendered in the danger tone, wins over `note`. */\n errorMessage?: string\n onDownload?: () => void\n className?: string\n}\n\nexport function FileViewerFallbackCard({\n name,\n contentType,\n sizeInBytes,\n note,\n errorMessage,\n onDownload,\n className,\n}: FileViewerFallbackCardProps) {\n const Icon = iconForContentType(contentType)\n const size = formatFileSize(sizeInBytes)\n const meta = [size, note].filter(Boolean).join(' · ')\n\n return (\n <div className={cn(fileViewerFallbackCardStyles(), className)}>\n <span className=\"mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-md bg-surface-2 text-ink-3\">\n <Icon aria-hidden className=\"size-4\" />\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate font-sans text-[13px] font-medium text-ink\">{name}</span>\n {errorMessage ? (\n <span className=\"truncate font-sans text-[12px] text-danger\">{errorMessage}</span>\n ) : meta ? (\n <span className=\"truncate font-sans text-[12px] text-ink-3\">{meta}</span>\n ) : null}\n </span>\n {onDownload ? (\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label={`Download ${name}`} onPress={onDownload}>\n <Download aria-hidden />\n </Button>\n ) : null}\n </div>\n )\n}\n","import { Download, X } from 'lucide-react'\nimport {\n Dialog as AriaDialog,\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button/button'\n\n/* =========================================================================\n ImageLightbox — a full-viewport image overlay (Slack-style). Unlike\n Modal there is no surface panel: the image floats on a deep scrim with\n a small caption bar (file name + optional download + close) beneath it.\n Controlled-only — the trigger is the consumer's thumbnail, so there is\n no DialogTrigger composition. RAC provides Esc dismissal, backdrop\n click, and focus trap/restore.\n ========================================================================= */\n\nexport const imageLightboxStyles = tv({\n base: [\n 'fixed inset-0 z-50 flex items-center justify-center p-4',\n // Deeper scrim than Modal's 40% — the image needs the page fully dimmed.\n 'bg-[color-mix(in_oklab,var(--color-ink)_72%,transparent)]',\n 'entering:animate-in entering:fade-in-0 entering:duration-150',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-100',\n ],\n})\n\nexport type ImageLightboxVariants = VariantProps<typeof imageLightboxStyles>\n\nexport interface ImageLightboxProps {\n isOpen: boolean\n onOpenChange: (isOpen: boolean) => void\n /** Full-size image URL; nothing renders in the frame while undefined. */\n src?: string\n /** File name — the dialog's accessible name, alt text, and caption. */\n name: string\n /** When set, a download action renders in the caption bar. */\n onDownload?: () => void\n}\n\nexport function ImageLightbox({ isOpen, onOpenChange, src, name, onDownload }: ImageLightboxProps) {\n return (\n <AriaModalOverlay\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n isDismissable\n className={imageLightboxStyles()}\n >\n <AriaModal className=\"outline-none\">\n <AriaDialog\n aria-label={name}\n className=\"outline-none flex flex-col items-center gap-3\"\n >\n {src ? (\n <img\n src={src}\n alt={name}\n className=\"block max-h-[82dvh] max-w-[90dvw] rounded-[8px] object-contain\"\n />\n ) : null}\n {/* Caption chip sits on its own surface so tokens stay legible over\n the dark scrim. */}\n <div\n className={cn(\n 'flex items-center gap-1.5',\n 'rounded-[8px] border border-rule bg-surface py-1 pl-3 pr-1',\n 'shadow-[var(--shadow-float)]',\n )}\n >\n <span className=\"max-w-[320px] truncate font-sans text-[12.5px] text-ink\">{name}</span>\n {onDownload ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`Download ${name}`}\n onPress={onDownload}\n >\n <Download aria-hidden />\n </Button>\n ) : null}\n <Button slot=\"close\" variant=\"ghost\" size=\"icon-sm\" aria-label=\"Close\">\n <X aria-hidden />\n </Button>\n </div>\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n )\n}\n","import { useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\n\nimport { ImageLightbox } from '../image-lightbox/image-lightbox'\n\n/* =========================================================================\n ImageView — the FileViewer's image pane. The image letterboxes inside\n the viewer box; pressing it opens the full-viewport lightbox.\n ========================================================================= */\n\nexport interface ImageViewProps {\n name: string\n src: string\n onDownload?: () => void\n}\n\nexport function ImageView({ name, src, onDownload }: ImageViewProps) {\n const [isLightboxOpen, setIsLightboxOpen] = useState(false)\n\n return (\n <>\n <AriaButton\n aria-label={`Preview ${name}`}\n onPress={() => setIsLightboxOpen(true)}\n className=\"flex h-full w-full cursor-zoom-in items-center justify-center outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <img src={src} alt={name} className=\"max-h-full max-w-full object-contain\" />\n </AriaButton>\n <ImageLightbox\n isOpen={isLightboxOpen}\n onOpenChange={setIsLightboxOpen}\n src={src}\n name={name}\n {...(onDownload ? { onDownload } : {})}\n />\n </>\n )\n}\n","/* =========================================================================\n VideoView — the FileViewer's video pane. Native playback controls; the\n video letterboxes inside the viewer box.\n ========================================================================= */\n\nexport interface VideoViewProps {\n name: string\n src: string\n}\n\nexport function VideoView({ name, src }: VideoViewProps) {\n return (\n // biome-ignore lint/a11y/useMediaCaption: user-stored files carry no caption tracks\n <video controls src={src} aria-label={name} className=\"h-full w-full object-contain\" />\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Skeleton } from '../skeleton/skeleton'\nimport { FileViewerFallbackCard } from './fallback-card'\nimport { ImageView } from './image-view'\nimport { VideoView } from './video-view'\n\n/* =========================================================================\n FileViewer — inline preview for a stored file. Renders the file itself\n when the content type is previewable (image / video / PDF), otherwise a\n file-type card with a download action. Pure presentation: the consumer\n fetches the bytes (authenticated) and hands in a blob object URL — the\n viewer never fetches anything itself.\n\n The PDF renderer (react-pdf + the pdf.js worker) is lazy-loaded so it\n lands in its own chunk and non-PDF surfaces never pay for it.\n ========================================================================= */\n\n// Code-split: pdf.js is heavy and only needed when a PDF is actually shown.\nconst PdfView = lazy(() => import('./pdf-view'))\n\nexport const fileViewerStyles = tv({\n base: [\n 'relative flex w-full flex-col overflow-hidden',\n 'rounded-md border border-rule bg-surface-2',\n ],\n})\n\nexport type FileViewerVariants = VariantProps<typeof fileViewerStyles>\n\n/** Which renderer a content type maps to (`none` → fallback card). */\nexport type FileViewerKind = 'image' | 'video' | 'pdf' | 'none'\n\n/**\n * Maps a MIME type to the viewer that can render it inline. Consumers use\n * this to decide whether fetching the bytes is worthwhile at all.\n */\nexport function viewerKindForContentType(contentType?: string): FileViewerKind {\n if (!contentType) return 'none'\n if (contentType.startsWith('image/')) return 'image'\n if (contentType.startsWith('video/')) return 'video'\n if (contentType === 'application/pdf') return 'pdf'\n return 'none'\n}\n\nexport interface FileViewerProps {\n /** Filename — labels, alt text and the fallback card. */\n name: string\n /** MIME type; unknown/unpreviewable types render the fallback card. */\n contentType?: string\n /** Blob object URL of the file bytes. While undefined (and previewable), the skeleton renders. */\n src?: string\n /** Size in bytes — shown on the fallback card when known. */\n sizeInBytes?: number\n /** Viewer height in px for previewable files (the fallback card keeps its natural height). */\n heightPx?: number\n /** Error loading the file — renders the fallback card with the message. */\n errorMessage?: string\n /** File too large for inline preview — renders the fallback card. */\n isOversized?: boolean\n /** When set, download actions render (card button, lightbox, PDF toolbar). */\n onDownload?: () => void\n className?: string\n}\n\nconst DEFAULT_HEIGHT_PX = 640\n\nexport function FileViewer({\n name,\n contentType,\n src,\n sizeInBytes,\n heightPx = DEFAULT_HEIGHT_PX,\n errorMessage,\n isOversized = false,\n onDownload,\n className,\n}: FileViewerProps) {\n const kind = viewerKindForContentType(contentType)\n\n const fallback = (\n <FileViewerFallbackCard\n name={name}\n {...(contentType !== undefined ? { contentType } : {})}\n {...(sizeInBytes !== undefined ? { sizeInBytes } : {})}\n {...(errorMessage !== undefined ? { errorMessage } : {})}\n {...(isOversized ? { note: 'Too large to preview' } : {})}\n {...(onDownload ? { onDownload } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n\n if (kind === 'none' || errorMessage || isOversized) return fallback\n\n const skeleton = (\n <Skeleton aria-label={`Loading preview of ${name}`} className=\"h-full w-full rounded-none\" />\n )\n\n return (\n <div className={cn(fileViewerStyles(), className)} style={{ height: heightPx }}>\n {!src ? (\n skeleton\n ) : kind === 'image' ? (\n <ImageView name={name} src={src} {...(onDownload ? { onDownload } : {})} />\n ) : kind === 'video' ? (\n <VideoView name={name} src={src} />\n ) : (\n <Suspense fallback={skeleton}>\n <PdfView name={name} src={src} {...(onDownload ? { onDownload } : {})} />\n </Suspense>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Skeleton } from '../skeleton/skeleton'\n\n/* =========================================================================\n ImageAttachment — a pressable image thumbnail for chat/message rows.\n Shows a skeleton while the URL resolves and the image loads, then the\n image constrained to a Slack-style thumbnail box. Pure presentation:\n the consumer resolves the src, opens the lightbox on press, and decides\n what to do when the image fails to load (typically fall back to a\n plain file chip).\n ========================================================================= */\n\nexport const imageAttachmentStyles = tv({\n base: [\n 'relative block overflow-hidden',\n 'rounded-[8px] border border-rule bg-surface-2',\n 'cursor-pointer outline-none focus-visible:shadow-[var(--shadow-focus)]',\n ],\n})\n\nexport type ImageAttachmentVariants = VariantProps<typeof imageAttachmentStyles>\n\nexport interface ImageAttachmentProps {\n /** File name — the alt text and the accessible button name. */\n name: string\n /** Resolved image URL. While undefined, the skeleton placeholder renders. */\n src?: string\n /** Fired when the browser fails to load `src` (e.g. not actually an image). */\n onLoadError?: () => void\n /** Fired on thumbnail press (consumer opens the lightbox). */\n onPress?: () => void\n className?: string\n}\n\nexport function ImageAttachment({\n name,\n src,\n onLoadError,\n onPress,\n className,\n}: ImageAttachmentProps) {\n // Tracks which src has finished loading, so a swapped-out URL goes back to\n // the skeleton instead of flashing the stale image.\n const [loadedSrc, setLoadedSrc] = useState<string | null>(null)\n const isLoaded = src !== undefined && loadedSrc === src\n\n return (\n <AriaButton\n aria-label={`Preview ${name}`}\n {...(onPress ? { onPress } : {})}\n className={cn(imageAttachmentStyles(), className)}\n >\n {src ? (\n // Kept in the DOM (invisible) while loading so onLoad still fires\n // behind the skeleton.\n <img\n src={src}\n alt={name}\n loading=\"lazy\"\n onLoad={() => setLoadedSrc(src)}\n onError={() => onLoadError?.()}\n className={cn(\n 'block max-h-[220px] max-w-[280px] object-contain',\n !isLoaded && 'invisible absolute inset-0',\n )}\n />\n ) : null}\n {/* Fixed footprint — intrinsic dimensions are unknown until load, and a\n 0-height placeholder would make the row jump. */}\n {!isLoaded ? <Skeleton className=\"h-[140px] w-[200px]\" /> : null}\n </AriaButton>\n )\n}\n","const PREVIEWABLE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'avif', 'svg', 'bmp'])\n\n/**\n * True when a filename's extension is one the browser renders natively in\n * `<img>`. A heuristic for contexts where only a name is known (e.g. a\n * FileRef carries no MIME type) — a wrong guess should degrade gracefully via\n * the consumer's img-error fallback. SVG is deliberately included: scripts do\n * not execute in an `<img>` context.\n */\nexport function isPreviewableImageName(name: string): boolean {\n const dot = name.lastIndexOf('.')\n if (dot <= 0 || dot === name.length - 1) return false\n return PREVIEWABLE_EXTENSIONS.has(name.slice(dot + 1).toLowerCase())\n}\n","import type { ReactNode } from 'react'\nimport {\n Input as AriaInput,\n type InputProps as AriaInputProps,\n type TextFieldProps as AriaTextFieldProps,\n FieldError,\n Label,\n Text,\n TextField,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type InputProps = AriaTextFieldProps & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n /** Field size. Defaults to `md`. Use `sm` for compact rows (filter builder, toolbars). */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box for\n * spreadsheet-style inline editing (2px radius, no halo / resting shadow). */\n appearance?: FieldAppearance\n /** Set false to drop the focus/invalid ring — for tight hosts whose\n * overflow clip would cut it off. Border states stay. Defaults to true. */\n hasFocusRing?: boolean\n /** Extra props forwarded to the underlying <input>. */\n inputProps?: Omit<AriaInputProps, 'className'>\n /** Visual override for the input control only. */\n inputClassName?: string\n}\n\nexport function Input({\n label,\n description,\n errorMessage,\n placeholder,\n size,\n appearance,\n hasFocusRing,\n inputProps,\n inputClassName,\n className,\n ...props\n}: InputProps) {\n const styles = fieldControlStyles({ size, appearance, hasFocusRing })\n return (\n <TextField\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <AriaInput\n {...inputProps}\n placeholder={placeholder ?? ''}\n className={cn(styles.box(), styles.content(), inputClassName)}\n />\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </TextField>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport {\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n type MenuItemProps as AriaMenuItemProps,\n type MenuProps as AriaMenuProps,\n MenuTrigger as AriaMenuTrigger,\n Popover as AriaPopover,\n type PopoverProps as AriaPopoverProps,\n SubmenuTrigger as AriaSubmenuTrigger,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Menu — a dropdown menu with Windows-style cascading submenus, built on\n React Aria Components (keyboard nav, focus, typeahead, ARIA handled by RAC).\n\n <MenuTrigger>\n <Button>Open</Button> // first child = the trigger\n <MenuPopover>\n <Menu>\n <MenuItem onAction={…}>Edit</MenuItem>\n <SubmenuTrigger>\n <MenuItem hasSubmenu>More…</MenuItem> // the parent row\n <MenuPopover placement=\"end top\"> // the flyout\n <Menu>\n <MenuItem onAction={…}>Nested</MenuItem>\n </Menu>\n </MenuPopover>\n </SubmenuTrigger>\n </Menu>\n </MenuPopover>\n </MenuTrigger>\n\n MenuTrigger / SubmenuTrigger are RAC primitives re-exported unchanged;\n MenuPopover / Menu / MenuItem carry the design-system chrome.\n ========================================================================= */\n\n/** Stateful root (RAC). Wraps the trigger element + the MenuPopover. */\nexport const MenuTrigger = AriaMenuTrigger\n\n/**\n * Submenu wrapper (RAC). Wraps a parent MenuItem and the nested MenuPopover so\n * the flyout opens on hover/right-arrow. Use `placement=\"end top\"` on the nested\n * MenuPopover so it cascades to the side, Windows-style.\n */\nexport const SubmenuTrigger = AriaSubmenuTrigger\n\nexport type MenuPopoverProps = AriaPopoverProps\n\n/** The floating panel. Defaults to opening below-start; pass `placement=\"end top\"` for a submenu flyout. */\nexport function MenuPopover({ className, offset = 4, placement = 'bottom start', ...props }: MenuPopoverProps) {\n return (\n <AriaPopover\n offset={offset}\n placement={placement}\n {...props}\n className={(renderProps) =>\n cn(\n 'min-w-[200px] p-1 bg-surface border border-rule rounded-md',\n 'shadow-[var(--shadow-float)] outline-none z-[1200]',\n 'entering:animate-in entering:fade-in-0 entering:zoom-in-95',\n 'exiting:animate-out exiting:fade-out-0 exiting:zoom-out-95',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n\nexport type MenuProps<T extends object> = AriaMenuProps<T>\n\n/** The menu list. Holds MenuItem / SubmenuTrigger children. */\nexport function Menu<T extends object>({ className, ...props }: MenuProps<T>) {\n return (\n <AriaMenu\n {...props}\n className={(renderProps) =>\n cn(\n 'flex flex-col gap-px outline-none',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n\nexport type MenuItemProps = Omit<AriaMenuItemProps, 'children'> & {\n /** Leading icon slot. */\n icon?: ReactNode\n /** Renders a trailing chevron marking this row as a submenu parent. */\n hasSubmenu?: boolean\n children?: ReactNode\n}\n\nconst menuItemStyles = cn(\n 'flex items-center gap-2.5 px-2.5 py-1.5 rounded-md cursor-pointer outline-none',\n 'font-sans text-[13px] text-ink-2 select-none',\n 'hover:bg-surface-2 hover:text-ink focus:bg-surface-2 focus:text-ink',\n 'data-[open]:bg-surface-2 data-[open]:text-ink', // submenu-parent stays lit while its flyout is open\n 'aria-disabled:opacity-50 aria-disabled:cursor-default aria-disabled:hover:bg-transparent aria-disabled:hover:text-ink-2',\n '[&_svg]:size-3.5 [&_svg]:text-ink-3 hover:[&_svg]:text-ink focus:[&_svg]:text-ink',\n)\n\n/** A single menu row. Pass `onAction` to handle selection; `isDisabled` to dim it. */\nexport function MenuItem({ icon, hasSubmenu, children, className, ...props }: MenuItemProps) {\n return (\n <AriaMenuItem\n {...props}\n className={(renderProps) =>\n cn(menuItemStyles, typeof className === 'function' ? className(renderProps) : className)\n }\n >\n {icon ? <span className=\"flex shrink-0 items-center\">{icon}</span> : null}\n <span className=\"flex-1 truncate\">{children}</span>\n {hasSubmenu ? <ChevronRight className=\"ml-2 size-3 shrink-0 text-ink-4\" /> : null}\n </AriaMenuItem>\n )\n}\n","import { createContext, type ReactNode, useContext } from 'react'\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n type DisclosureProps as AriaDisclosureProps,\n Disclosure,\n DisclosurePanel,\n Heading,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Nav — vertical navigation primitives for sidebars / drawers. Three pieces:\n - <NavSection> — labelled grouping with optional count + trailing slot.\n - <NavItem> — leaf entry (RAC Button) with icon, label, badge slot,\n and an `isActive` state (raised paper card + accent rail).\n - <NavGroup> — collapsible parent (RAC Disclosure + DisclosurePanel)\n that auto-tags its children as nested via context.\n\n The primitives don't know about \"collapsed sidebar\" — that visual cascade\n lives in the consuming app, which can hide labels / center icons via CSS\n on a wrapping element.\n ========================================================================= */\n\n/* ---------- nested context ----------------------------------------------- */\n\nconst NavNestedContext = createContext(false)\n/** True when a NavItem is rendered inside a NavGroup's panel. */\nfunction useIsNested() {\n return useContext(NavNestedContext)\n}\n\n/* ---------- NavSection --------------------------------------------------- */\n\nexport type NavSectionProps = {\n /** Uppercase mono label rendered above the items. */\n label?: ReactNode\n /** Counter rendered at the right of the label (e.g. `5`). */\n count?: ReactNode\n /** Trailing slot at the right of the heading row, e.g. an action button. */\n action?: ReactNode\n className?: string\n children?: ReactNode\n /** Stable test/automation id, forwarded to the section root. */\n 'data-testid'?: string\n}\n\n/** Visually-grouped block of nav entries. Use one per logical section\n * (\"Workspace\", \"Operations\", \"Finance\"). */\nexport function NavSection({\n label,\n count,\n action,\n className,\n children,\n 'data-testid': dataTestid,\n}: NavSectionProps) {\n const hasHead = label !== undefined || count !== undefined || action !== undefined\n return (\n <div className={cn('mt-[18px] first:mt-1', className)} data-testid={dataTestid}>\n {hasHead ? (\n <div className=\"flex items-center justify-between px-2 pt-1 pb-2\">\n {label !== undefined ? (\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-4\">\n {label}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n {count !== undefined ? (\n <span className=\"font-mono text-[10px] text-ink-4\">{count}</span>\n ) : null}\n {action}\n </div>\n </div>\n ) : null}\n {children}\n </div>\n )\n}\n\n/* ---------- NavItem ------------------------------------------------------ */\n\nexport const navItemStyles = tv({\n base: [\n 'group/nav-item relative w-full',\n 'flex items-center gap-2.5',\n 'px-2 py-[7px] rounded-[7px]',\n 'text-[13.5px] tracking-[-0.005em] text-ink-2',\n 'cursor-pointer outline-none text-left',\n 'transition-[background-color,color,border-color,box-shadow] duration-150',\n 'border border-transparent',\n 'hover:bg-surface-2 hover:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed disabled:pointer-events-none',\n ],\n variants: {\n isActive: {\n // Match the hover state's fill (bg-surface-2 + ink) so the selected color\n // doesn't read brighter than the surrounding chrome. The hairline\n // border + accent rail still mark the current page.\n true: [\n 'bg-surface-2 text-ink border-rule',\n // accent rail anchored to the section's left edge\n 'before:content-[\"\"] before:absolute before:-left-2.5 before:top-2 before:bottom-2',\n 'before:w-0.5 before:rounded-[2px] before:bg-accent',\n ],\n false: '',\n },\n isNested: {\n true: 'text-[13px] text-ink-3 py-1.5',\n false: '',\n },\n },\n compoundVariants: [\n // Nested + active: raise to ink rather than accent-ink so the indented\n // hierarchy still reads \"softer than top-level\".\n { isNested: true, isActive: true, class: 'text-ink' },\n ],\n defaultVariants: { isActive: false, isNested: false },\n})\n\nexport type NavItemVariants = VariantProps<typeof navItemStyles>\n\nexport type NavItemProps = Omit<AriaButtonProps, 'children'> & {\n /** Leading icon. Pass an SVG element; it's wrapped in a 16px box. */\n icon?: ReactNode\n /** Trailing slot — typically a count or status dot. */\n badge?: ReactNode\n /** Mark the item as the current page. */\n isActive?: boolean\n children?: ReactNode\n}\n\n/** Leaf nav entry. RAC Button under the hood — full keyboard, focus-visible\n * ring, and disabled state included. For routing, apply `navItemStyles({...})`\n * to a RAC `<Link>` instead. */\nexport function NavItem({ icon, badge, isActive, className, children, ...props }: NavItemProps) {\n const isNested = useIsNested()\n return (\n <AriaButton\n {...props}\n className={(renderProps) =>\n cn(\n navItemStyles({ isActive, isNested }),\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {icon !== undefined ? (\n <span\n aria-hidden\n className={cn(\n 'grid place-items-center shrink-0 size-4',\n isActive ? 'text-accent' : 'text-ink-3',\n '[&>svg]:size-4',\n )}\n >\n {icon}\n </span>\n ) : null}\n <span className=\"flex-1 min-w-0 truncate\">{children}</span>\n {badge !== undefined ? (\n <span className=\"shrink-0 font-mono text-[10.5px] tracking-[0.02em] text-ink-4\">\n {badge}\n </span>\n ) : null}\n </AriaButton>\n )\n}\n\n/* ---------- NavGroup ----------------------------------------------------- */\n\nexport type NavGroupProps = Omit<AriaDisclosureProps, 'children'> & {\n /** Leading icon for the group head. */\n icon?: ReactNode\n /** Group label rendered next to the icon. */\n label: ReactNode\n /** Children get auto-styled as nested NavItems via context. */\n children: ReactNode\n className?: string\n}\n\n/** Collapsible parent. RAC Disclosure handles aria-expanded / aria-controls\n * and keyboard activation. Children render inside an indented panel with a\n * vertical guide rule and pick up nested styling automatically. */\nexport function NavGroup({ icon, label, children, className, ...props }: NavGroupProps) {\n return (\n <Disclosure {...props} className={cn('group/nav-group my-px', className)}>\n <Heading className=\"m-0\">\n <AriaButton\n slot=\"trigger\"\n className={cn(\n 'flex w-full items-center gap-2.5',\n 'px-2 py-[7px] rounded-[7px]',\n 'text-[13.5px] tracking-[-0.005em] text-ink-2 text-left',\n 'cursor-pointer outline-none border border-transparent',\n 'transition-colors duration-150',\n 'hover:bg-surface-2 hover:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n {icon !== undefined ? (\n <span\n aria-hidden\n className=\"grid place-items-center shrink-0 size-4 text-ink-3 [&>svg]:size-4\"\n >\n {icon}\n </span>\n ) : null}\n <span className=\"flex-1 min-w-0 truncate\">{label}</span>\n <svg\n viewBox=\"0 0 12 12\"\n aria-hidden\n className=\"size-2.5 shrink-0 text-ink-4 transition-transform duration-200 group-data-[expanded]/nav-group:rotate-90\"\n >\n <path\n d=\"m4.5 3 3 3-3 3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </AriaButton>\n </Heading>\n <DisclosurePanel>\n <div\n className={cn(\n 'relative pl-[22px] py-px',\n // Vertical guide rule — sits under where the parent's icon center\n // would be (14px from the panel's left edge).\n 'before:content-[\"\"] before:absolute before:left-[14px] before:top-1 before:bottom-1',\n 'before:w-px before:bg-rule',\n )}\n >\n <NavNestedContext.Provider value={true}>{children}</NavNestedContext.Provider>\n </div>\n </DisclosurePanel>\n </Disclosure>\n )\n}\n","import { type OrbState, type OrbTheme, ThinkingOrb } from 'thinking-orbs'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Orb — the \"agent is working\" indicator, backed by the `thinking-orbs`\n package (https://orbs.jakubantalik.com): a canvas-rendered dotted orb\n (state: solving), monochrome ink that auto-resolves against `data-theme`\n / OS scheme, with a reduced-motion static frame built in.\n\n The package ships two hand-tuned designs — 20px (inline) and 64px\n (avatar). `sm` and `lg` render them at native size; `xs` gently\n downscales the 20px design, `md` downscales the 64px one (downscaling\n stays crisp — the canvas buffer is the larger design).\n\n Purely decorative by default — pass `label` to expose it as an img with\n an accessible name (e.g. \"Agent working\").\n ========================================================================= */\n\nexport type OrbSizeToken = 'xs' | 'sm' | 'md' | 'lg'\n\n/** CSS box per token. sm/lg match the native designs exactly (no scaling). */\nconst SIZE_PX: Record<OrbSizeToken, number> = { xs: 12, sm: 20, md: 40, lg: 64 }\n\n/** Which native design each token rides. */\nconst DESIGN: Record<OrbSizeToken, 20 | 64> = { xs: 20, sm: 20, md: 64, lg: 64 }\n\nexport interface OrbProps {\n /** xs 12 · sm 20 (native inline) · md 40 · lg 64 (native avatar). Default `sm`. */\n size?: OrbSizeToken\n /** Animation state; defaults to `solving` (the working indicator). */\n state?: OrbState\n /** Speed multiplier (1 = tuned speed); e.g. 0.2 for a slow idle shimmer. */\n speed?: number\n /** Pin the ink instead of auto-detecting — `dark` renders light dots (for\n * a dark chip like the launcher's black circle). */\n theme?: OrbTheme\n className?: string\n /** Accessible name; omitting it hides the orb from assistive tech. */\n label?: string\n}\n\nexport function Orb({ size = 'sm', state = 'solving', speed, theme, className, label }: OrbProps) {\n const px = SIZE_PX[size]\n const design = DESIGN[size]\n return (\n <ThinkingOrb\n state={state}\n size={design}\n {...(speed !== undefined ? { speed } : {})}\n {...(theme !== undefined ? { theme } : {})}\n className={cn('inline-block shrink-0', className)}\n {...(px !== design ? { style: { width: px, height: px } } : {})}\n {...(label ? { 'aria-label': label } : { 'aria-hidden': true })}\n />\n )\n}\n","import {\n ProgressBar as AriaProgressBar,\n type ProgressBarProps as AriaProgressBarProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n ProgressBar — wraps RAC's headless ProgressBar (state + ARIA only) and\n adds the visual track + fill. Supports both determinate (`value`) and\n indeterminate (`isIndeterminate`) modes.\n\n The indeterminate fill rides the `animate-indeterminate-progress` utility\n declared in styles.css — a 35%-wide segment that slides off the right edge\n and re-enters from the left on a continuous loop.\n ========================================================================= */\n\nexport const progressBarStyles = tv({\n slots: {\n track: 'relative overflow-hidden rounded-pill bg-surface-2 w-full',\n fill: 'h-full rounded-pill bg-accent',\n },\n variants: {\n size: {\n sm: { track: 'h-1' },\n md: { track: 'h-2' },\n },\n },\n defaultVariants: { size: 'sm' },\n})\n\nexport type ProgressBarVariants = VariantProps<typeof progressBarStyles>\nexport type ProgressBarProps = Omit<AriaProgressBarProps, 'children' | 'className'> &\n ProgressBarVariants & {\n className?: string\n }\n\nexport function ProgressBar({ size, className, ...props }: ProgressBarProps) {\n const { track, fill } = progressBarStyles({ size })\n return (\n <AriaProgressBar {...props} className={cn('block', className)}>\n {({ percentage, isIndeterminate }) => (\n <div className={track()}>\n {isIndeterminate ? (\n <div className={cn(fill(), 'absolute w-[35%] animate-indeterminate-progress')} />\n ) : (\n <div\n className={cn(fill(), 'transition-[width] duration-150')}\n style={{ width: `${percentage ?? 0}%` }}\n />\n )}\n </div>\n )}\n </AriaProgressBar>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n FieldError,\n Label,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport { fieldErrorStyles, fieldHintStyles, fieldLabelStyles } from '../field/field'\n\n/* =========================================================================\n RadioGroup — exclusive-choice field. Monolithic API to match Input/Select/\n Combobox/DatePicker: label / description / errorMessage props on the group,\n `<Radio>` children for each option.\n ========================================================================= */\n\nexport type RadioGroupProps = Omit<AriaRadioGroupProps, 'children'> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** `<Radio>` elements. Function-as-children is not supported at the group level. */\n children: ReactNode\n}\n\nexport function RadioGroup({\n label,\n description,\n errorMessage,\n orientation = 'vertical',\n children,\n className,\n ...props\n}: RadioGroupProps) {\n return (\n <AriaRadioGroup\n {...props}\n orientation={orientation}\n className={(renderProps) =>\n cn('grid gap-2', typeof className === 'function' ? className(renderProps) : className)\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <div\n className={cn(\n orientation === 'horizontal'\n ? 'flex flex-wrap items-center gap-x-4 gap-y-2'\n : 'grid gap-3',\n )}\n >\n {children}\n </div>\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage ? <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError> : null}\n </AriaRadioGroup>\n )\n}\n\nexport type RadioProps = Omit<AriaRadioProps, 'children'> & {\n children?: ReactNode\n}\n\nexport function Radio({ children, className, ...props }: RadioProps) {\n return (\n <AriaRadio\n {...props}\n className={(renderProps) =>\n cn(\n // `relative` for the same reason as Checkbox / Switch: RAC's\n // visually-hidden <input> is absolutely positioned and must resolve\n // against this radio, not a far-away shell, or focusing it scrolls\n // the clipped page.\n 'group relative inline-flex items-center gap-2.5 cursor-pointer',\n 'font-sans text-[14px] text-ink-2 select-none',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <span\n aria-hidden\n className={cn(\n 'relative inline-flex items-center justify-center shrink-0',\n 'size-[18px] rounded-full border bg-surface border-ink-4',\n 'transition-[border-color,box-shadow] duration-150',\n 'group-data-[hovered]:border-ink',\n 'group-data-[selected]:border-ink',\n 'group-data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n <span\n className={cn(\n 'block size-[10px] rounded-full bg-accent',\n 'transition-opacity duration-150 opacity-0',\n 'group-data-[selected]:opacity-100',\n )}\n />\n </span>\n {children}\n </AriaRadio>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Combobox, type ComboboxOption } from '../combobox/combobox'\nimport type { FieldSize } from '../field/field'\nimport type { FilterField } from './types'\n\n/* =========================================================================\n AttributePicker — inline typeahead picker for filterable fields. Thin\n wrapper over lib `Combobox` that maps `FilterField[]` into options and\n surfaces the type tag in each row's description slot.\n\n Rendered inline (no outer popover) so it can occupy the field cell of a\n filter row directly. The Combobox's internal popover hosts the dropdown.\n With `autoFocus + menuTrigger=\"focus\"`, the menu opens immediately on\n mount — the standard \"click + Add → row appears with picker open\"\n experience.\n ========================================================================= */\n\nexport type AttributePickerProps = {\n fields: ReadonlyArray<FilterField>\n /** Currently picked field path. Empty string means \"no field picked yet\". */\n value: string\n onChange: (picked: FilterField) => void\n autoFocus?: boolean\n isDisabled?: boolean\n /** Field size. Defaults to `sm` since this picker only ships inside the\n * filter row; `md` is exposed for future stand-alone uses. */\n size?: FieldSize\n /** Visual override for the field wrapper. */\n className?: string\n}\n\nexport function AttributePicker({\n fields,\n value,\n onChange,\n autoFocus = false,\n isDisabled,\n size = 'sm',\n className,\n}: AttributePickerProps) {\n const options: ComboboxOption<string>[] = fields.map((f) => ({\n id: f.path,\n label: f.label,\n description: <FieldTypeTag>{f.type}</FieldTypeTag>,\n }))\n\n return (\n <Combobox<string>\n aria-label=\"Find attribute\"\n placeholder=\"Find attribute…\"\n options={options}\n selectedKey={value === '' ? null : value}\n onSelectionChange={(key) => {\n if (key == null) return\n const picked = fields.find((f) => f.path === String(key))\n if (picked) onChange(picked)\n }}\n // Auto-open the dropdown on focus so a freshly-mounted picker shows\n // its options without a second click.\n menuTrigger=\"focus\"\n autoFocus={autoFocus}\n size={size}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n className={cn('w-full', className)}\n />\n )\n}\n\nfunction FieldTypeTag({ children }: { children: ReactNode }) {\n return (\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">{children}</span>\n )\n}\n","/* =========================================================================\n Field-label composition — how a nested or related field reads in the\n picker, the chips rail and the operator row.\n\n A `FilterField` path is hierarchical: an object leaf (`address.city`) and\n a field reached through a relation (`company_id.name`) both render as a\n breadcrumb. The separator lives here because BOTH sides compose it — the\n consumer builds `FilterField.label` from an entity, and the chips rail\n builds its own breadcrumb from `parentLabel` — and a mismatch between the\n two shows up as one chip reading \"Company · Name\" next to another reading\n \"Company / Name\".\n ========================================================================= */\n\n/**\n * U+00B7 MIDDLE DOT, spaced. The same separator the app already uses for\n * breadcrumb-ish text (\"Segment · SaaS decision makers\"), and quieter than a\n * slash at the small type sizes these labels render at — the eye reads the\n * words, not the punctuation.\n */\nexport const FIELD_LABEL_SEPARATOR = ' · '\n\n/**\n * Joins breadcrumb parts with {@link FIELD_LABEL_SEPARATOR}, skipping empties\n * so a field with no parent renders as its own label rather than with a\n * leading separator.\n */\nexport function joinFieldLabel(...parts: ReadonlyArray<string | undefined | null>): string {\n return parts.filter((part): part is string => !!part && part.length > 0).join(FIELD_LABEL_SEPARATOR)\n}\n","import type {\n ComparisonOperator,\n FilterFieldType,\n FilterValue,\n OperatorArity,\n OperatorDescriptor,\n} from './types'\n\n/* =========================================================================\n Operator catalogue — single source of truth for which operators apply\n to which field types and how many values each takes. Mirrors the\n backend enum at `core-model/comparison-operator.go` and the design's\n `OPERATORS` table.\n ========================================================================= */\n\nexport const OPERATORS: ReadonlyArray<OperatorDescriptor> = [\n {\n id: 'eq',\n label: 'is',\n arity: 1,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n {\n id: 'ne',\n label: 'is not',\n arity: 1,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n {\n id: 'in',\n label: 'is any of',\n arity: 'n',\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'enum',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n {\n id: 'not_in',\n label: 'is none of',\n arity: 'n',\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'enum',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n { id: 'contains', label: 'contains', arity: 1, types: ['string', 'array', 'contact-address'] },\n { id: 'starts_with', label: 'starts with', arity: 1, types: ['string', 'contact-address'] },\n { id: 'ends_with', label: 'ends with', arity: 1, types: ['string', 'contact-address'] },\n {\n id: 'gt',\n label: 'is greater than',\n arity: 1,\n types: ['number', 'integer', 'currency', 'datetime'],\n },\n { id: 'gte', label: 'is on or after', arity: 1, types: ['datetime'] },\n {\n id: 'lt',\n label: 'is less than',\n arity: 1,\n types: ['number', 'integer', 'currency', 'datetime'],\n },\n { id: 'lte', label: 'is on or before', arity: 1, types: ['datetime'] },\n {\n id: 'empty',\n label: 'is empty',\n arity: 0,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'array',\n 'relation',\n 'user',\n 'principal',\n 'file',\n 'contact-address',\n ],\n },\n {\n id: 'not_empty',\n label: 'is not empty',\n arity: 0,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'array',\n 'relation',\n 'user',\n 'principal',\n 'file',\n 'contact-address',\n ],\n },\n]\n\nconst OP_LABEL_OVERRIDES: Partial<\n Record<FilterFieldType, Partial<Record<ComparisonOperator, string>>>\n> = {\n number: { gt: 'is greater than', lt: 'is less than', eq: 'equals', ne: 'does not equal' },\n integer: { gt: 'is greater than', lt: 'is less than', eq: 'equals', ne: 'does not equal' },\n currency: { gt: 'is greater than', lt: 'is less than', eq: 'equals', ne: 'does not equal' },\n datetime: { eq: 'is on', ne: 'is not on', gt: 'is after', lt: 'is before' },\n array: { contains: 'contains', empty: 'is empty', not_empty: 'is not empty' },\n boolean: { eq: 'is', ne: 'is not' },\n}\n\nexport function operatorsForType(type: FilterFieldType): ReadonlyArray<OperatorDescriptor> {\n return OPERATORS.filter((op) => op.types.includes(type)).map((op) => {\n const override = OP_LABEL_OVERRIDES[type]?.[op.id]\n return override ? { ...op, label: override } : op\n })\n}\n\nexport function operatorById(id: ComparisonOperator): OperatorDescriptor | undefined {\n return OPERATORS.find((o) => o.id === id)\n}\n\nexport function arityOf(operator: ComparisonOperator): OperatorArity {\n return operatorById(operator)?.arity ?? 1\n}\n\n/* =========================================================================\n Default value for a fresh row, given the field type and the chosen\n operator's arity. Keeps the value shape consistent with `FilterValue`.\n ========================================================================= */\nexport function defaultValueFor(type: FilterFieldType, arity: OperatorArity): FilterValue {\n if (arity === 0) return null\n if (arity === 'n') return []\n if (type === 'boolean') return true\n return ''\n}\n","import { createContext, type ReactNode, useContext } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Badge } from '../badge/badge'\nimport { arityOf } from './operators'\nimport type { ComparisonOperator, FilterField, FilterValue } from './types'\n\n/* =========================================================================\n ChipValue — renders the value cell shown inside an active filter chip.\n\n Arity orchestration lives here (single value vs list with \"+N\" overflow\n vs nothing). Per-item rendering can be overridden via `renderItem` —\n LUM-34 wires this to the page-layout control registry's Display so\n chip rendering matches what's on the record-detail page (proper\n relation titles, formatted dates, etc.). Lib default keeps the legacy\n enum-Badge + truncate-text behaviour for callers without the registry.\n ========================================================================= */\n\n/**\n * Per-value-item renderer. Called once per value (twice for arity 'n'\n * with two items, etc.) AFTER arity orchestration. Return `undefined`\n * to fall through to the lib default for that item.\n */\nexport type ChipValueItemRenderer = (props: {\n field: FilterField\n operator: ComparisonOperator\n value: string\n}) => ReactNode | undefined\n\n/* =========================================================================\n Context — same pattern as RenderValueInputProvider. A top-level\n provider lets every <ChipValue> in the tree inherit one renderer\n without per-mount wiring. The provider skips wrapping when\n `renderer === undefined` so intermediate components don't shadow an\n outer provider with `undefined`.\n ========================================================================= */\n\nconst RenderChipItemContext = createContext<ChipValueItemRenderer | undefined>(undefined)\n\nexport function RenderChipItemProvider({\n renderer,\n children,\n}: {\n renderer: ChipValueItemRenderer | undefined\n children: ReactNode\n}) {\n if (renderer === undefined) return <>{children}</>\n return (\n <RenderChipItemContext.Provider value={renderer}>{children}</RenderChipItemContext.Provider>\n )\n}\n\nexport function useRenderChipItem(): ChipValueItemRenderer | undefined {\n return useContext(RenderChipItemContext)\n}\n\nexport type ChipValueProps = {\n field: FilterField\n operator: ComparisonOperator\n value: FilterValue\n /** Override per-value-item rendering (LUM-34: registry dispatch). */\n renderItem?: ChipValueItemRenderer\n}\n\nexport function ChipValue({ field, operator, value, renderItem }: ChipValueProps) {\n const arity = arityOf(operator)\n if (arity === 0) return null\n\n if (arity === 'n') {\n const arr = Array.isArray(value)\n ? value\n : typeof value === 'string' && value.length > 0\n ? value.split(',').filter(Boolean)\n : []\n if (arr.length === 0) return <Em>—</Em>\n const shown = arr.slice(0, 2)\n return (\n <span className=\"inline-flex items-center gap-1\">\n {shown.map((v) => (\n <ChipItem\n key={v}\n field={field}\n operator={operator}\n value={v}\n {...(renderItem !== undefined ? { renderItem } : {})}\n />\n ))}\n {arr.length > 2 ? (\n <span className=\"font-mono text-[11px] text-ink-3\">+{arr.length - 2}</span>\n ) : null}\n </span>\n )\n }\n\n // arity 1\n if (value === '' || value == null) return <Em>—</Em>\n return (\n <ChipItem\n field={field}\n operator={operator}\n value={String(value)}\n {...(renderItem !== undefined ? { renderItem } : {})}\n />\n )\n}\n\nfunction ChipItem({\n field,\n operator,\n value,\n renderItem,\n}: {\n field: FilterField\n operator: ComparisonOperator\n value: string\n renderItem?: ChipValueItemRenderer\n}) {\n // Explicit prop wins; otherwise fall back to context (set by a\n // top-level RenderChipItemProvider); finally the lib default below.\n const contextRenderer = useRenderChipItem()\n const effectiveRenderer = renderItem ?? contextRenderer\n if (effectiveRenderer) {\n const custom = effectiveRenderer({ field, operator, value })\n if (custom !== undefined) return <>{custom}</>\n }\n // Lib default: enum → Badge with variant lookup; other → truncated mono text.\n if (field.type === 'enum') {\n const option = findEnumOption(field, value)\n return (\n <Badge\n variant={option?.variant}\n shape=\"rounded\"\n hasDot={false}\n {...(option?.color ? { color: option.color } : {})}\n {...(option?.icon ? { icon: option.icon } : {})}\n >\n {option?.label ?? value}\n </Badge>\n )\n }\n return (\n <span className={cn('font-mono text-[12px] text-ink max-w-[10rem] truncate')}>\n {formatValue(field, operator, value)}\n </span>\n )\n}\n\nfunction Em({ children }: { children: string }) {\n return <span className=\"font-mono text-[12px] text-ink-4\">{children}</span>\n}\n\n/** The declared option for an enum value, if the field carries one. Central so\n * the badge, the multi-value summary and the single-value summary agree on\n * what a stored value is called. */\nfunction findEnumOption(field: FilterField, value: string) {\n return field.options?.find((option) => option.value === value)\n}\n\nexport function formatValue(\n field: FilterField,\n operator: ComparisonOperator,\n value: FilterValue,\n): string {\n const arity = arityOf(operator)\n if (arity === 0) return ''\n if (arity === 'n') {\n const arr = Array.isArray(value)\n ? value\n : typeof value === 'string' && value.length > 0\n ? value.split(',')\n : []\n if (arr.length === 0) return '—'\n if (field.type === 'enum') {\n const labels = arr.map((v) => findEnumOption(field, v)?.label ?? v)\n return labels.length <= 2\n ? labels.join(', ')\n : `${labels[0]}, ${labels[1]} +${labels.length - 2}`\n }\n return arr.length <= 2 ? arr.join(', ') : `${arr[0]}, ${arr[1]} +${arr.length - 2}`\n }\n if (field.type === 'boolean') return value === true || value === 'true' ? 'true' : 'false'\n if (value === '' || value == null) return '—'\n // An enum stores a system value (\"technical_decider\") and displays its\n // declared label (\"Technical Decider\"). The multi-value branch above and the\n // badge below already do this; a single value read as the raw slug, so the\n // same filter said \"is technical_decider\" or \"is any of Technical Decider\"\n // depending only on the operator.\n if (field.type === 'enum') {\n return findEnumOption(field, String(value))?.label ?? String(value)\n }\n if (field.type === 'number' || field.type === 'integer') {\n const n = Number(value)\n return Number.isFinite(n) ? n.toLocaleString() : String(value)\n }\n return String(value)\n}\n","import type { Key, ReactNode } from 'react'\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n type RadioGroupProps as AriaRadioGroupProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n SegmentedControl — small horizontal exclusive-choice group with pill\n chrome. Wraps RAC RadioGroup so keyboard nav and focus management are\n correct (arrow keys move between segments). Used for compact toggles\n like AND/OR joiners and true/false booleans where a full RadioGroup\n feels heavy.\n ========================================================================= */\n\nexport const segmentedControlStyles = tv({\n slots: {\n // `w-fit` keeps the group content-width even as a flex/grid item under a\n // stretching parent (e.g. a `flex flex-col` card body, whose default\n // align-items:stretch would otherwise pull it to full width). Consumers\n // can still opt into full width by passing `w-full` via className.\n group: 'inline-flex w-fit rounded-sm border border-rule-strong bg-surface p-0.5 gap-0.5',\n segment: [\n 'inline-flex items-center justify-center cursor-pointer',\n 'font-mono tracking-[0.04em] rounded-[3px] outline-none select-none',\n 'transition-[background-color,color] duration-150',\n 'data-[hovered]:text-ink',\n 'data-[selected]:bg-ink data-[selected]:text-surface',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n ],\n },\n variants: {\n size: {\n sm: { segment: 'px-2 py-0.5 text-[10.5px] tracking-[0.08em]' },\n md: { segment: 'px-2.5 py-1 text-[12px]' },\n },\n tone: {\n // Default: ink fill on selected.\n default: { segment: 'text-ink-3' },\n },\n },\n defaultVariants: { size: 'sm', tone: 'default' },\n})\n\nexport type SegmentedControlVariants = VariantProps<typeof segmentedControlStyles>\n\nexport type SegmentedControlOption<T extends Key = Key> = {\n id: T\n label: ReactNode\n isDisabled?: boolean\n}\n\nexport type SegmentedControlProps<T extends Key = Key> = Omit<\n AriaRadioGroupProps,\n 'children' | 'value' | 'onChange'\n> & {\n options: ReadonlyArray<SegmentedControlOption<T>>\n value: T\n onChange: (value: T) => void\n size?: SegmentedControlVariants['size']\n /** Focus the selected segment on mount. RAC's RadioGroup doesn't surface\n * `autoFocus` itself — it's a per-Radio prop — so we apply it to the\n * Radio whose value matches `value`. */\n autoFocus?: boolean\n /** Visual override for the group wrapper. */\n className?: string\n}\n\nexport function SegmentedControl<T extends Key>({\n options,\n value,\n onChange,\n size,\n autoFocus = false,\n className,\n orientation = 'horizontal',\n ...props\n}: SegmentedControlProps<T>) {\n const styles = segmentedControlStyles({ size })\n return (\n <AriaRadioGroup\n {...props}\n orientation={orientation}\n value={String(value)}\n onChange={(next) => onChange(next as T)}\n className={cn(styles.group(), className)}\n >\n {options.map((option) => (\n <AriaRadio\n key={String(option.id)}\n value={String(option.id)}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n {...(autoFocus && option.id === value ? { autoFocus: true } : {})}\n className={styles.segment()}\n >\n {option.label}\n </AriaRadio>\n ))}\n </AriaRadioGroup>\n )\n}\n","import { type KeyboardEvent, type ReactNode, useEffect, useId, useRef, useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldChipPadding,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldMinHeight,\n type FieldSize,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n TagInput — free-form list of strings rendered as removable chips.\n Used for filter `in`/`not_in` value entry on non-enum types where the\n set of valid values isn't known up front.\n\n Behaviour:\n - Type into the trailing input → Enter or `,` commits as a tag.\n - Backspace on empty input → removes the last tag.\n - Click × on a chip → removes it.\n\n Controlled API only — `value: string[]` + `onChange`.\n ========================================================================= */\n\nexport type TagInputProps = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Placeholder shown in the trailing input when there are no tags. */\n placeholder?: string\n /** Underlying `<input>` type. Use `'number'` to constrain numeric tags. */\n inputType?: 'text' | 'number'\n value: string[]\n onChange: (next: string[]) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Focus the trailing input on mount. Used by the filter-row chain so\n * picking an operator with arity 'n' (and a non-enum field) lands focus\n * directly on the tag-entry input. */\n autoFocus?: boolean\n /** Visual override for the field wrapper. */\n className?: string\n}\n\nexport function TagInput({\n label,\n description,\n errorMessage,\n placeholder = 'Type, Enter to add',\n inputType = 'text',\n value,\n onChange,\n isDisabled = false,\n isInvalid = false,\n size = 'md',\n appearance,\n autoFocus = false,\n className,\n}: TagInputProps) {\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n const minHeight = appearance === 'cell' ? 'min-h-[29px]' : fieldMinHeight[size]\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus()\n // mount-only — autoFocus is a one-shot signal, not sustained.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const inputId = useId()\n const [draft, setDraft] = useState('')\n\n const commit = () => {\n const v = draft.trim()\n if (!v) return\n if (value.includes(v)) {\n setDraft('')\n return\n }\n onChange([...value, v])\n setDraft('')\n }\n\n const remove = (idx: number) => {\n onChange(value.filter((_, i) => i !== idx))\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault()\n commit()\n return\n }\n if (e.key === 'Backspace' && !draft && value.length > 0) {\n e.preventDefault()\n onChange(value.slice(0, -1))\n }\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? (\n <label htmlFor={inputId} className={fieldLabelStyles}>\n {label}\n </label>\n ) : null}\n\n <div\n data-invalid={isInvalid || undefined}\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex flex-wrap items-center gap-1',\n minHeight,\n fieldChipPadding[size],\n focusWithin,\n )}\n >\n {value.map((tag, idx) => (\n // tags are kept unique on commit, so the value alone is a stable key\n <span\n key={tag}\n className={cn(\n 'inline-flex items-center gap-1',\n 'px-1.5 py-0.5 rounded-sm bg-surface-3',\n 'font-mono text-[12px] text-ink-2',\n )}\n >\n <span className=\"max-w-[10rem] truncate\">{tag}</span>\n <button\n type=\"button\"\n aria-label={`Remove ${tag}`}\n disabled={isDisabled}\n onClick={() => remove(idx)}\n className={cn(\n 'inline-flex items-center justify-center',\n 'size-3.5 rounded-full text-ink-3 hover:text-ink hover:bg-surface-2',\n 'cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n type={inputType}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={commit}\n disabled={isDisabled}\n placeholder={value.length === 0 ? placeholder : ''}\n className={cn(\n 'flex-1 min-w-[6rem] bg-transparent outline-none',\n 'font-sans text-ink placeholder:text-ink-4',\n fieldTextStyles[size],\n // No vertical padding — wrapper's p-1.5 + min-h-[size] govern the\n // overall height so it matches Input/Select at the same size.\n 'px-1.5',\n 'disabled:cursor-not-allowed disabled:opacity-45',\n )}\n />\n </div>\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n </div>\n )\n}\n","import { type CalendarDate, parseDate } from '@internationalized/date'\nimport { createContext, type ReactNode, useContext } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Badge } from '../badge/badge'\nimport {\n BadgeMultiSelect,\n type BadgeMultiSelectOption,\n} from '../badge-multi-select/badge-multi-select'\nimport { DatePicker } from '../date-picker/date-picker'\nimport { Input } from '../input/input'\nimport { SegmentedControl } from '../segmented-control/segmented-control'\nimport { Select, type SelectOption } from '../select/select'\nimport { TagInput } from '../tag-input/tag-input'\nimport { arityOf } from './operators'\nimport type { ComparisonOperator, FilterField, FilterValue } from './types'\n\n/* =========================================================================\n FilterValueInput — type-aware value editor for a single filter element.\n Routes to the right primitive based on `(field.type, operator.arity)`:\n\n arity 0 → null (no input — for empty / not_empty)\n arity 'n' (in / not_in)\n enum → BadgeMultiSelect\n other → TagInput (free-form list)\n arity 1\n enum → Select with Badge in renderItem\n boolean → SegmentedControl (true / false)\n datetime → DatePicker\n other → Input (text or number)\n ========================================================================= */\n\n/**\n * Render-prop signature for overriding the default value editor. Called\n * with everything `FilterValueInput` knows about the leaf. Return a\n * `ReactNode` to take over rendering, or `undefined` to fall through to\n * the built-in branches (the common pattern: override one specific\n * `field.type`, return `undefined` for the rest).\n *\n * Used to plug in product-specific editors the lib can't know about —\n * e.g. a related-record picker that hits the SDK for typeahead.\n */\nexport type FilterValueInputRenderer = (props: {\n field: FilterField\n operator: ComparisonOperator\n value: FilterValue\n onChange: (next: FilterValue) => void\n autoFocus?: boolean\n isDisabled?: boolean\n}) => ReactNode | undefined\n\n/* =========================================================================\n Context — the renderer is injected via React context rather than a\n prop drilled through five levels of intermediates. Top-level entry\n points (RecordFilterEditor, RecordFilterButton, RecordFilterChips,\n RecordFilterBuilderPanel) wrap their tree in `RenderValueInputProvider`;\n `FilterValueInput` reads from `useRenderValueInput()`. Adding future\n slots (operator picker, attribute picker) follows the same shape\n without growing the public prop surface of internal components.\n ========================================================================= */\n\nconst RenderValueInputContext = createContext<FilterValueInputRenderer | undefined>(undefined)\n\nexport function RenderValueInputProvider({\n renderer,\n children,\n}: {\n renderer: FilterValueInputRenderer | undefined\n children: ReactNode\n}) {\n // Skip wrapping when there's no renderer so intermediate components\n // (e.g. RecordFilterEditor when invoked inside RecordFilterBuilderPanel)\n // don't shadow the outer provider's value with `undefined`. The closest\n // provider wins in React's context model, so an undefined-wrapping\n // intermediate would silently break the chain from outer entry points.\n if (renderer === undefined) return <>{children}</>\n return (\n <RenderValueInputContext.Provider value={renderer}>{children}</RenderValueInputContext.Provider>\n )\n}\n\nexport function useRenderValueInput(): FilterValueInputRenderer | undefined {\n return useContext(RenderValueInputContext)\n}\n\nexport type FilterValueInputProps = {\n field: FilterField\n operator: ComparisonOperator\n value: FilterValue\n onChange: (next: FilterValue) => void\n isDisabled?: boolean\n /** When true, focus the routed leaf on mount. The wrapping `<div>` is\n * keyed on `${field.path}-${operator}`, so an operator change remounts\n * the leaf and re-fires its `autoFocus` reliably across all six leaf\n * branches. Committed values come from props so they survive remount;\n * mid-typed drafts (TagInput buffer, DatePicker partial segment,\n * Combobox search) are reset — acceptable since the user took the\n * deliberate operator-change action. */\n autoFocus?: boolean\n className?: string\n}\n\nexport function FilterValueInput({\n field,\n operator,\n value,\n onChange,\n isDisabled,\n autoFocus = false,\n className,\n}: FilterValueInputProps) {\n const renderValueInput = useRenderValueInput()\n const arity = arityOf(operator)\n if (arity === 0) return null\n\n // Context-provided override (e.g. relation picker). Called first so\n // it can claim any (field.type, operator) combination; returning\n // `undefined` falls through to the built-in branches below.\n if (renderValueInput) {\n const custom = renderValueInput({\n field,\n operator,\n value,\n onChange,\n autoFocus,\n ...(isDisabled !== undefined ? { isDisabled } : {}),\n })\n if (custom !== undefined) {\n return <div key={`${field.path}-${operator}`}>{custom}</div>\n }\n }\n\n const leaf = (() => {\n /* ---------- multi-value (in / not_in) ---------- */\n if (arity === 'n') {\n if (field.type === 'enum') {\n return (\n <EnumMultiValue\n field={field}\n value={asStringArray(value)}\n onChange={(next) => onChange(next)}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n return (\n <TagInput\n size=\"sm\"\n value={asStringArray(value)}\n onChange={(next) => onChange(next)}\n inputType={\n field.type === 'number' || field.type === 'integer' || field.type === 'currency'\n ? 'number'\n : 'text'\n }\n placeholder=\"Type, Enter to add\"\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n\n /* ---------- single value ---------- */\n if (field.type === 'enum') {\n return (\n <EnumSingleValue\n field={field}\n value={asString(value)}\n onChange={(next) => onChange(next)}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n\n if (field.type === 'boolean') {\n return (\n <SegmentedControl<'true' | 'false'>\n size=\"md\"\n aria-label=\"Boolean value\"\n options={[\n { id: 'true', label: 'true' },\n { id: 'false', label: 'false' },\n ]}\n value={asBoolean(value) ? 'true' : 'false'}\n onChange={(v) => onChange(v === 'true')}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n\n if (field.type === 'datetime') {\n const stringValue = asString(value)\n let parsed: CalendarDate | null = null\n try {\n parsed = stringValue ? parseDate(stringValue) : null\n } catch {\n parsed = null\n }\n return (\n <DatePicker\n size=\"sm\"\n aria-label={field.label}\n value={parsed}\n onChange={(next) => onChange(next ? next.toString() : '')}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n className={cn('w-full', className)}\n />\n )\n }\n\n // string / number / integer\n return (\n <Input\n size=\"sm\"\n aria-label={field.label}\n value={asString(value)}\n onChange={(next) => onChange(next)}\n placeholder={placeholderFor(field, operator)}\n inputProps={{\n type:\n field.type === 'number' || field.type === 'integer' || field.type === 'currency'\n ? 'number'\n : (field.inputType ?? 'text'),\n ...(autoFocus ? { autoFocus: true } : {}),\n }}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n className={cn('w-full', className)}\n />\n )\n })()\n\n // Key forces a fresh mount on every operator change so the leaf's\n // `autoFocus` re-fires reliably even when the leaf component type is\n // unchanged (e.g. `eq` → `not_eq`, both string-arity-1 → both `Input`).\n return <div key={`${field.path}-${operator}`}>{leaf}</div>\n}\n\n/* ----- enum single via lib `Select` with Badge in renderItem ----------- */\nfunction EnumSingleValue({\n field,\n value,\n onChange,\n isDisabled,\n autoFocus,\n className,\n}: {\n field: FilterField\n value: string\n onChange: (next: string) => void\n isDisabled?: boolean\n autoFocus?: boolean\n className?: string\n}) {\n const options: SelectOption<string>[] = (field.options ?? []).map((o) => ({\n id: o.value,\n label: o.label,\n }))\n return (\n <Select<string>\n size=\"sm\"\n aria-label={field.label}\n options={options}\n selectedKey={value === '' ? null : value}\n onSelectionChange={(next) => onChange(next == null ? '' : String(next))}\n renderItem={(o) => {\n const option = field.options?.find((x) => x.value === o.id)\n return (\n <Badge\n variant={option?.variant}\n {...(option?.color ? { color: option.color } : {})}\n {...(option?.icon ? { icon: option.icon } : {})}\n >\n {o.label}\n </Badge>\n )\n }}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(autoFocus ? { autoFocus: true } : {})}\n className={cn('w-full', className)}\n />\n )\n}\n\n/* ----- enum multi via lib `BadgeMultiSelect` --------------------------- */\nfunction EnumMultiValue({\n field,\n value,\n onChange,\n isDisabled,\n autoFocus,\n className,\n}: {\n field: FilterField\n value: string[]\n onChange: (next: string[]) => void\n isDisabled?: boolean\n autoFocus?: boolean\n className?: string\n}) {\n const options: BadgeMultiSelectOption<string>[] = (field.options ?? []).map((o) => ({\n id: o.value,\n label: o.label,\n ...(o.variant ? { variant: o.variant } : {}),\n ...(o.color ? { color: o.color } : {}),\n ...(o.icon ? { icon: o.icon } : {}),\n }))\n return (\n <BadgeMultiSelect<string>\n size=\"sm\"\n options={options}\n selectedKeys={value}\n onSelectionChange={(keys) => onChange(Array.from(keys))}\n placeholder=\"Select values…\"\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(autoFocus ? { autoFocus: true } : {})}\n className={cn('w-full', className)}\n />\n )\n}\n\n/* ----- value coercers --------------------------------------------------- */\n\nfunction asString(v: FilterValue): string {\n if (v == null) return ''\n if (typeof v === 'string') return v\n if (typeof v === 'boolean') return v ? 'true' : 'false'\n if (Array.isArray(v)) return v.join(',')\n return ''\n}\n\nfunction asStringArray(v: FilterValue): string[] {\n if (Array.isArray(v)) return v\n if (typeof v === 'string' && v.length > 0)\n return v\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n return []\n}\n\nfunction asBoolean(v: FilterValue): boolean {\n if (typeof v === 'boolean') return v\n if (typeof v === 'string') return v === 'true'\n return false\n}\n\nfunction placeholderFor(field: FilterField, operator: ComparisonOperator): string {\n if (field.type === 'datetime') return 'yyyy-mm-dd'\n if (field.type === 'number' || field.type === 'integer' || field.type === 'currency') return '0'\n if (operator === 'starts_with') return 'starts with…'\n if (operator === 'ends_with') return 'ends with…'\n if (operator === 'contains') return 'contains…'\n return 'value'\n}\n","import { cn } from '../../lib/cn'\nimport type { FieldSize } from '../field/field'\nimport { Select, type SelectOption } from '../select/select'\nimport { operatorsForType } from './operators'\nimport type { ComparisonOperator, FilterFieldType } from './types'\n\n/* =========================================================================\n OperatorPicker — small dropdown of operators valid for the given field\n type. Wraps lib `Select` and inherits its compact `sm` chrome so it lines\n up byte-for-byte with the AttributePicker beside it.\n ========================================================================= */\n\nexport type OperatorPickerProps = {\n fieldType: FilterFieldType\n value: ComparisonOperator\n onChange: (next: ComparisonOperator) => void\n isDisabled?: boolean\n /** Auto-focus the trigger on mount. Used by the chip mini-editor so focus\n * lands on the operator (the field is already chosen, the operator is the\n * natural next thing to tweak). */\n autoFocus?: boolean\n /** Field size. Defaults to `sm` to match the filter row. */\n size?: FieldSize\n /** Visual override for the trigger wrapper (sizing). */\n className?: string\n /** Per-field allowlist override (LUM-34). When provided, picks operators\n * from this list instead of `operatorsForType(fieldType)`. */\n operators?: ReadonlyArray<ComparisonOperator>\n}\n\nexport function OperatorPicker({\n fieldType,\n value,\n onChange,\n isDisabled,\n autoFocus,\n size = 'sm',\n className,\n operators,\n}: OperatorPickerProps) {\n const allForType = operatorsForType(fieldType)\n const ops = operators ? allForType.filter((op) => operators.includes(op.id)) : allForType\n const options: SelectOption<ComparisonOperator>[] = ops.map((op) => ({\n id: op.id,\n label: op.label,\n }))\n\n return (\n <Select<ComparisonOperator>\n aria-label=\"Operator\"\n options={options}\n selectedKey={value}\n onSelectionChange={(next) => onChange(next as ComparisonOperator)}\n size={size}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(autoFocus ? { autoFocus: true } : {})}\n className={cn('w-full', className)}\n // `min-w-0` lets the trigger shrink so its <SelectValue> can truncate.\n triggerClassName=\"min-w-0\"\n />\n )\n}\n","import { useEffect } from 'react'\nimport { cn } from '../../lib/cn'\nimport { AttributePicker } from './attribute-picker'\nimport { FilterValueInput } from './filter-value-input'\nimport { OperatorPicker } from './operator-picker'\nimport { defaultValueFor, operatorById, operatorsForType } from './operators'\nimport type {\n ComparisonOperator,\n FilterElement,\n FilterField,\n FilterValue,\n LogicalOperator,\n} from './types'\n\n/* =========================================================================\n FilterRow — one element in the builder body. Layout:\n\n [ joiner gutter ] [ AttributePicker ] [ operator ] [ value-input ] … [ × ]\n\n The first cell is always an inline `AttributePicker` (Combobox). When\n the row's field is unset (empty path), only the picker renders — the\n operator/value/× cells appear as soon as a field is chosen. This is\n how \"+ Add filter\" produces a fresh row that auto-focuses the picker\n with its dropdown open.\n ========================================================================= */\n\nexport type FilterRowProps = {\n index: number\n joiner: LogicalOperator\n /** Resolved field metadata. `undefined` means the row's field is unset. */\n field?: FilterField\n element: FilterElement\n fields: ReadonlyArray<FilterField>\n /** Auto-focus the AttributePicker on mount (e.g. for newly added rows). */\n autoFocus?: boolean\n /** Auto-focus the OperatorPicker on mount. Used right after a pending\n * row's field is picked: the row remounts (its `key` changes), and we\n * want focus to advance from the AttributePicker to the operator. */\n autoFocusOperator?: boolean\n /** Fires once after a mount that consumed `autoFocusOperator`, so the\n * parent can clear its tracking index. */\n onAutoFocusOperatorConsumed?: () => void\n /** Auto-focus the value cell on mount. Forwarded into FilterValueInput,\n * whose key-based remount on operator change makes this re-fire reliably\n * across leaf types. */\n autoFocusValue?: boolean\n /** Fires once after a mount that consumed `autoFocusValue`. */\n onAutoFocusValueConsumed?: () => void\n /** Fires when the user submits the row from a plain text/number value\n * Input (Enter). Used by the builder panel to chain \"commit + add new\n * pending row\". The chip mini-editor passes its own form-submit handler\n * here if it wants the same behaviour. */\n onSubmit?: () => void\n onChangeField: (next: FilterField) => void\n onChangeOperator: (next: ComparisonOperator) => void\n onChangeValue: (next: FilterValue) => void\n onRemove: () => void\n /** Optional \"wrap in group\" affordance — when present, a hover-only icon\n * appears next to the remove button. Used by the recursive popover panel\n * when `isComplexEnabled` is on. */\n onWrap?: () => void\n}\n\nexport function FilterRow({\n index,\n joiner,\n field,\n element,\n fields,\n autoFocus = false,\n autoFocusOperator = false,\n onAutoFocusOperatorConsumed,\n autoFocusValue = false,\n onAutoFocusValueConsumed,\n onSubmit,\n onChangeField,\n onChangeOperator,\n onChangeValue,\n onRemove,\n onWrap,\n}: FilterRowProps) {\n // One-shot: tell the parent to clear its tracking index so a future remount\n // at the same index doesn't re-trigger.\n useEffect(() => {\n if (autoFocusOperator) onAutoFocusOperatorConsumed?.()\n if (autoFocusValue) onAutoFocusValueConsumed?.()\n // Mount-only — these are hand-off signals, not sustained props.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n return (\n <div\n className={cn(\n 'group flex items-center gap-2 px-1.5 py-1 rounded-sm',\n 'hover:bg-[color-mix(in_oklab,var(--color-surface-2)_50%,var(--color-surface))]',\n )}\n >\n {/* Joiner gutter — narrow fixed column to keep all rows aligned. The\n three editor cells below flex to fill the remaining width. */}\n <span className=\"w-12 shrink-0 inline-flex justify-end pr-1\">\n <span\n className={cn(\n 'font-mono text-[10.5px] tracking-[0.08em]',\n index === 0 ? 'text-ink-4' : 'text-accent-ink',\n )}\n >\n {index === 0 ? 'WHERE' : joiner.toUpperCase()}\n </span>\n </span>\n\n {/* Field picker — flex column. min-w guarantees the typeahead stays\n legible at typical popover widths; basis-0 lets flex distribute\n excess space proportionally. */}\n <div className=\"flex-1 basis-0 min-w-[140px]\">\n <AttributePicker\n fields={fields}\n value={element.field}\n onChange={onChangeField}\n autoFocus={autoFocus}\n className=\"w-full\"\n />\n </div>\n\n {/* Operator + value — only render once a field is picked. */}\n {field ? (\n <>\n <div className=\"flex-1 basis-0 min-w-[110px]\">\n <OperatorPicker\n fieldType={field.type}\n value={element.operator}\n onChange={onChangeOperator}\n autoFocus={autoFocusOperator}\n className=\"w-full\"\n {...(field.filterOperators !== undefined\n ? { operators: field.filterOperators }\n : {})}\n />\n </div>\n {/* Value gets ~2× the share of field/operator since values like\n chip lists or date pickers are widest. */}\n <div\n className=\"flex-[2] basis-0 min-w-0\"\n onKeyDown={(e) => {\n // Enter inside a plain text/number <input> commits the row\n // (state already lives in `filter`) and lets the parent add a\n // fresh pending row. RAC controls (Combobox, Select, TagInput,\n // BadgeMultiSelect) all `preventDefault` on Enter for their\n // own selection/commit semantics, so `defaultPrevented` filters\n // them out. DateSegment renders as a <div role=\"spinbutton\">,\n // not INPUT — so the tagName check excludes it too.\n if (e.key !== 'Enter' || e.defaultPrevented) return\n const t = e.target as HTMLElement\n if (t.tagName !== 'INPUT') return\n const inputType = (t as HTMLInputElement).type\n if (inputType !== 'text' && inputType !== 'number') return\n if (!onSubmit) return\n e.preventDefault()\n onSubmit()\n }}\n >\n <FilterValueInput\n field={field}\n operator={element.operator}\n value={element.value}\n onChange={onChangeValue}\n autoFocus={autoFocusValue}\n />\n </div>\n </>\n ) : (\n // Spacer reserves the operator + value flex share so the field\n // picker doesn't balloon across the whole row before a field is\n // chosen.\n <div className=\"flex-[3] basis-0 min-w-0\" />\n )}\n\n {onWrap && field ? (\n <button\n type=\"button\"\n onClick={onWrap}\n aria-label=\"Wrap in group\"\n title=\"Wrap in a group with the opposite operator\"\n className={cn(\n 'shrink-0 size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'opacity-0 group-hover:opacity-100 focus-visible:opacity-100',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3M9 3a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3\" />\n </svg>\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={field ? 'Remove filter' : 'Cancel'}\n className={cn(\n 'shrink-0 size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-4 hover:text-danger hover:bg-surface-2 cursor-pointer outline-none',\n field ? 'opacity-0 group-hover:opacity-100 focus-visible:opacity-100' : 'opacity-100',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 4h8M5 4V3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1M4.5 4l.5 7a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1l.5-7\" />\n </svg>\n </button>\n </div>\n )\n}\n\n/* =========================================================================\n When the user changes the field on a row, decide whether the existing\n operator is still valid. If yes, keep the value. If no, swap to the\n first operator for the new type and reset the value to its default.\n Exported so the builder + chip mini-editor can share the rule.\n ========================================================================= */\nexport function rebaseRowOnFieldChange(element: FilterElement, next: FilterField): FilterElement {\n const newOps = operatorsForType(next.type)\n const stillValid = newOps.find((o) => o.id === element.operator)\n const nextOp = stillValid ?? newOps[0]\n if (!nextOp) {\n return { ...element, field: next.path }\n }\n return {\n field: next.path,\n operator: nextOp.id,\n value: stillValid ? element.value : defaultValueFor(next.type, nextOp.arity),\n }\n}\n\nexport function rebaseRowOnOperatorChange(\n element: FilterElement,\n field: FilterField,\n nextOperator: ComparisonOperator,\n): FilterElement {\n const next = operatorById(nextOperator)\n const prev = operatorById(element.operator)\n const arityChanged = next?.arity !== prev?.arity\n return {\n ...element,\n operator: nextOperator,\n value: arityChanged ? defaultValueFor(field.type, next?.arity ?? 1) : element.value,\n }\n}\n","import { defaultValueFor, operatorsForType } from './operators'\nimport type { FilterElement, FilterField, FilterGroup, LogicalOperator } from './types'\n\n/* =========================================================================\n group-mutations — pure immutable helpers that produce a new `FilterGroup`\n from the previous one + an action. The recursive popover panel composes\n these instead of inlining `{ ...g, elements: g.elements.map(...) }`\n spaghetti.\n\n Invariants:\n - Inputs are never mutated.\n - Index parameters refer to position within the relevant sub-array\n (`elements` for leaves, `groups` for sub-groups). The two arrays are\n addressed independently — the renderer treats them as ordered children\n by concatenation (leaves first, then groups).\n ========================================================================= */\n\nexport function addLeaf(group: FilterGroup, field: FilterField): FilterGroup {\n const ops = operatorsForType(field.type)\n const op = ops[0]\n if (!op) return group\n const next: FilterElement = {\n field: field.path,\n operator: op.id,\n value: defaultValueFor(field.type, op.arity),\n }\n return { ...group, elements: [...(group.elements ?? []), next] }\n}\n\nexport function addPendingLeaf(group: FilterGroup): FilterGroup {\n const next: FilterElement = { field: '', operator: 'eq', value: '' }\n return { ...group, elements: [...(group.elements ?? []), next] }\n}\n\nexport function addSubgroup(\n group: FilterGroup,\n joiner: LogicalOperator = oppositeJoiner(group.logicalOperator),\n): FilterGroup {\n const sub: FilterGroup = { logicalOperator: joiner, elements: [], groups: [] }\n return { ...group, groups: [...(group.groups ?? []), sub] }\n}\n\nexport function removeLeaf(group: FilterGroup, index: number): FilterGroup {\n const elements = group.elements ?? []\n return { ...group, elements: elements.filter((_, i) => i !== index) }\n}\n\nexport function removeSubgroup(group: FilterGroup, index: number): FilterGroup {\n const groups = group.groups ?? []\n return { ...group, groups: groups.filter((_, i) => i !== index) }\n}\n\nexport function updateLeaf(\n group: FilterGroup,\n index: number,\n patch: Partial<FilterElement> | FilterElement,\n): FilterGroup {\n const elements = group.elements ?? []\n return {\n ...group,\n elements: elements.map((el, i) => (i === index ? { ...el, ...patch } : el)),\n }\n}\n\nexport function replaceLeaf(\n group: FilterGroup,\n index: number,\n next: FilterElement,\n): FilterGroup {\n const elements = group.elements ?? []\n return { ...group, elements: elements.map((el, i) => (i === index ? next : el)) }\n}\n\nexport function updateSubgroup(\n group: FilterGroup,\n index: number,\n next: FilterGroup,\n): FilterGroup {\n const groups = group.groups ?? []\n return { ...group, groups: groups.map((g, i) => (i === index ? next : g)) }\n}\n\n/* Wrap an existing leaf in a new sub-group with the opposite joiner.\n Leaves the rest of the group untouched. The leaf is moved into the new\n sub-group's `elements`. Used by the \"wrap in group\" hover action. */\nexport function wrapLeafInGroup(group: FilterGroup, index: number): FilterGroup {\n const elements = group.elements ?? []\n const leaf = elements[index]\n if (!leaf) return group\n const sub: FilterGroup = {\n logicalOperator: oppositeJoiner(group.logicalOperator),\n elements: [leaf],\n groups: [],\n }\n return {\n ...group,\n elements: elements.filter((_, i) => i !== index),\n groups: [...(group.groups ?? []), sub],\n }\n}\n\nexport function setJoiner(group: FilterGroup, joiner: LogicalOperator): FilterGroup {\n return { ...group, logicalOperator: joiner }\n}\n\n/* Recursively count leaf filters in a group. Used by the chip pill badge\n and for filter-button counts when nested groups are present. */\nexport function countLeaves(group: FilterGroup): number {\n const direct = (group.elements ?? []).length\n const nested = (group.groups ?? []).reduce((n, g) => n + countLeaves(g), 0)\n return direct + nested\n}\n\nfunction oppositeJoiner(j: LogicalOperator): LogicalOperator {\n return j === 'and' ? 'or' : 'and'\n}\n","import { cn } from '../../lib/cn'\n\n/* =========================================================================\n GroupAddControls — \"+ Add filter\" / \"+ Add group\" footer rendered at the\n bottom of any group body. The \"+ Add group\" affordance is gated behind\n `isComplexEnabled`; in flat mode (the back-compat default) only \"+ Add\n filter\" appears, exactly matching the pre-nesting builder panel.\n\n \"+ Add filter\" follows the existing pattern: it adds a *pending* row\n (field === '') whose AttributePicker auto-focuses on mount, rather than\n opening a separate popover. Keeps consistency with `RecordFilterChips`\n and avoids a second popover layer inside the builder.\n ========================================================================= */\n\nexport type GroupAddControlsProps = {\n onAddFilter: () => void\n onAddGroup?: () => void\n isComplexEnabled: boolean\n}\n\nexport function GroupAddControls({\n onAddFilter,\n onAddGroup,\n isComplexEnabled,\n}: GroupAddControlsProps) {\n return (\n <div className=\"flex items-center gap-1 pl-12 pt-1\">\n <button\n type=\"button\"\n onClick={onAddFilter}\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-sm',\n 'text-ink-2 hover:bg-surface-2 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n <span className=\"font-sans text-[12.5px]\">Add filter</span>\n </button>\n {isComplexEnabled && onAddGroup ? (\n <button\n type=\"button\"\n onClick={onAddGroup}\n title=\"Add a nested group with its own logical operator\"\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-sm',\n 'text-ink-2 hover:bg-surface-2 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3M9 3a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3\" />\n <path d=\"M7 5v4M5 7h4\" />\n </svg>\n <span className=\"font-sans text-[12.5px]\">Add group</span>\n </button>\n ) : null}\n </div>\n )\n}\n","import { cn } from '../../lib/cn'\nimport { SegmentedControl } from '../segmented-control/segmented-control'\nimport { GroupBody } from './group-body'\nimport type { FilterField, FilterGroup, LogicalOperator } from './types'\n\n/* =========================================================================\n NestedGroup — non-root group rendered as a bordered, indented panel.\n Layout:\n\n [WHERE/AND/OR ] [ ┌─ Group · AND/OR ───────────── × ┐ ]\n [ FilterRow ]\n [ FilterRow ]\n [ + Add filter + Add group ]\n [ └────────────────────────────────┘ ]\n\n The left gutter aligns with sibling FilterRows so the joiner (\"AND\" /\n \"OR\" or the leading \"WHERE\") sits in the same column. The bordered panel\n carries the group's own AND/OR header + remove button; its body recurses\n into another `GroupBody`.\n ========================================================================= */\n\nexport type NestedGroupProps = {\n /** Sibling index inside the parent group's combined children list (leaves\n * first, groups last). Drives the joiner label. */\n index: number\n /** Parent group's logical operator — that's what joins this sub-group to\n * its siblings. */\n joiner: LogicalOperator\n group: FilterGroup\n fields: ReadonlyArray<FilterField>\n fieldsByPath: Record<string, FilterField>\n onChange: (next: FilterGroup) => void\n onRemove: () => void\n showFieldIcons: boolean\n showJoinerToggle: boolean\n isComplexEnabled: boolean\n}\n\nexport function NestedGroup({\n index,\n joiner,\n group,\n fields,\n fieldsByPath,\n onChange,\n onRemove,\n showFieldIcons,\n showJoinerToggle,\n isComplexEnabled,\n}: NestedGroupProps) {\n const elementCount = (group.elements?.length ?? 0) + (group.groups?.length ?? 0)\n const showJoinerSegment = showJoinerToggle && elementCount >= 2\n\n return (\n <div className=\"flex items-stretch gap-2 px-1.5\">\n {/* Joiner gutter — same width as a FilterRow's gutter so siblings line\n up vertically. `px-1.5` matches FilterRow's horizontal padding so\n the gutter labels and the group-panel left edge align with sibling\n rows. `pt-2` aligns the label with the group header text. */}\n <span className=\"w-12 shrink-0 inline-flex justify-end pr-1 pt-2\">\n <span\n className={cn(\n 'font-mono text-[10.5px] tracking-[0.08em]',\n index === 0 ? 'text-ink-4' : 'text-accent-ink',\n )}\n >\n {index === 0 ? 'WHERE' : joiner.toUpperCase()}\n </span>\n </span>\n\n <div\n className={cn(\n 'flex-1 min-w-0 rounded-sm border border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n )}\n >\n {/* Group header — eyebrow + AND/OR + remove */}\n <div className=\"flex items-center justify-between px-2.5 py-1.5 border-b border-rule\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">\n Group\n </span>\n {showJoinerSegment ? (\n <SegmentedControl<LogicalOperator>\n aria-label=\"Group joiner\"\n options={[\n { id: 'and', label: 'AND' },\n { id: 'or', label: 'OR' },\n ]}\n value={group.logicalOperator}\n onChange={(next) => onChange({ ...group, logicalOperator: next })}\n />\n ) : (\n <span className=\"font-mono text-[10.5px] tracking-[0.08em] text-ink-3 uppercase\">\n {group.logicalOperator}\n </span>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove group\"\n className={cn(\n 'size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-4 hover:text-danger hover:bg-surface cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 4h8M5 4V3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1M4.5 4l.5 7a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1l.5-7\" />\n </svg>\n </button>\n </div>\n\n <div className=\"px-1.5 py-1.5\">\n <GroupBody\n group={group}\n fields={fields}\n fieldsByPath={fieldsByPath}\n onChange={onChange}\n isRoot={false}\n isComplexEnabled={isComplexEnabled}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n />\n </div>\n </div>\n </div>\n )\n}\n","import { FilterRow, rebaseRowOnFieldChange, rebaseRowOnOperatorChange } from './filter-row'\nimport { GroupAddControls } from './group-add-controls'\nimport {\n addPendingLeaf,\n addSubgroup,\n removeLeaf,\n removeSubgroup,\n replaceLeaf,\n updateLeaf,\n updateSubgroup,\n wrapLeafInGroup,\n} from './group-mutations'\nimport { NestedGroup } from './nested-group'\nimport { arityOf } from './operators'\nimport type { FilterField, FilterGroup } from './types'\n\n/* =========================================================================\n GroupBody — body of a single FilterGroup, used at the root of the popover\n panel and recursively inside `NestedGroup`. Renders:\n\n 1. one `FilterRow` per leaf (`group.elements`)\n 2. one `NestedGroup` per sub-group (`group.groups`) — only when\n `isComplexEnabled`; otherwise sub-groups are silently skipped (the\n chip row still surfaces them as a read-only pill)\n 3. a `GroupAddControls` footer with \"+ Add filter\" (always) and\n \"+ Add group\" (only when `isComplexEnabled`)\n\n Auto-focus signals are only wired at the root — nested groups don't get\n the field→operator→value focus chain. This is a deliberate scope cut:\n adding to a nested group is a click action, and tracking root-vs-nested\n focus paths through arbitrary depth wasn't worth the v1 complexity.\n ========================================================================= */\n\nexport type GroupBodyProps = {\n group: FilterGroup\n fields: ReadonlyArray<FilterField>\n fieldsByPath: Record<string, FilterField>\n onChange: (next: FilterGroup) => void\n isRoot: boolean\n isComplexEnabled: boolean\n showFieldIcons: boolean\n showJoinerToggle: boolean\n /** Root-only auto-focus index for the AttributePicker. */\n autoFocusIndex?: number | null\n setAutoFocusIndex?: (next: number | null) => void\n /** Root-only auto-focus index for the OperatorPicker. */\n autoFocusOperatorIndex?: number | null\n setAutoFocusOperatorIndex?: (next: number | null) => void\n /** Root-only auto-focus index for the value cell. */\n autoFocusValueIndex?: number | null\n setAutoFocusValueIndex?: (next: number | null) => void\n /** Optional submit chain — Enter on a text/number value adds a new pending\n * row at the end of *this* group. Forwarded by the panel for the root. */\n onSubmitLeaf?: () => void\n /** Empty-state copy override. Defaults vary per `isRoot`. */\n emptyText?: string\n}\n\nexport function GroupBody({\n group,\n fields,\n fieldsByPath,\n onChange,\n isRoot,\n isComplexEnabled,\n showFieldIcons,\n showJoinerToggle,\n autoFocusIndex = null,\n setAutoFocusIndex,\n autoFocusOperatorIndex = null,\n setAutoFocusOperatorIndex,\n autoFocusValueIndex = null,\n setAutoFocusValueIndex,\n onSubmitLeaf,\n emptyText,\n}: GroupBodyProps) {\n const elements = group.elements ?? []\n const subgroups = group.groups ?? []\n\n const handleAddFilter = () => {\n const nextIndex = elements.length\n onChange(addPendingLeaf(group))\n setAutoFocusIndex?.(nextIndex)\n }\n const handleAddGroup = () => onChange(addSubgroup(group))\n\n const handleRemoveLeaf = (i: number) => {\n if (autoFocusIndex === i) setAutoFocusIndex?.(null)\n if (autoFocusOperatorIndex === i) setAutoFocusOperatorIndex?.(null)\n if (autoFocusValueIndex === i) setAutoFocusValueIndex?.(null)\n onChange(removeLeaf(group, i))\n }\n\n const isEmpty = elements.length === 0 && (!isComplexEnabled || subgroups.length === 0)\n\n return (\n <div className=\"flex flex-col gap-1\">\n {isEmpty ? (\n <div\n className={\n (isRoot ? 'px-3 py-6' : 'px-2 py-3') +\n ' text-center font-mono text-[11.5px] text-ink-4'\n }\n >\n {emptyText ?? (isRoot\n ? 'No filters. Add one to narrow the list.'\n : 'Empty group. Add a filter or another group.')}\n </div>\n ) : null}\n\n {elements.map((el, i) => {\n const field = fieldsByPath[el.field]\n return (\n <FilterRow\n // biome-ignore lint/suspicious/noArrayIndexKey: filter elements have no stable id; index disambiguates duplicate-field rows\n key={`${el.field}-${i}`}\n index={i}\n joiner={group.logicalOperator}\n {...(field ? { field } : {})}\n element={el}\n fields={fields}\n autoFocus={autoFocusIndex === i}\n autoFocusOperator={autoFocusOperatorIndex === i}\n onAutoFocusOperatorConsumed={() => setAutoFocusOperatorIndex?.(null)}\n autoFocusValue={autoFocusValueIndex === i}\n onAutoFocusValueConsumed={() => setAutoFocusValueIndex?.(null)}\n {...(onSubmitLeaf ? { onSubmit: onSubmitLeaf } : {})}\n onChangeField={(picked) => {\n if (autoFocusIndex === i) setAutoFocusIndex?.(null)\n setAutoFocusOperatorIndex?.(i)\n onChange(replaceLeaf(group, i, rebaseRowOnFieldChange(el, picked)))\n }}\n onChangeOperator={(opId) => {\n if (!field) return\n if (arityOf(opId) !== 0) setAutoFocusValueIndex?.(i)\n onChange(replaceLeaf(group, i, rebaseRowOnOperatorChange(el, field, opId)))\n }}\n onChangeValue={(v) => onChange(updateLeaf(group, i, { value: v }))}\n onRemove={() => handleRemoveLeaf(i)}\n {...(isComplexEnabled && field\n ? { onWrap: () => onChange(wrapLeafInGroup(group, i)) }\n : {})}\n />\n )\n })}\n\n {isComplexEnabled\n ? subgroups.map((sub, i) => (\n <NestedGroup\n // biome-ignore lint/suspicious/noArrayIndexKey: sub-groups have no stable id\n key={`group-${i}`}\n index={elements.length + i}\n joiner={group.logicalOperator}\n group={sub}\n fields={fields}\n fieldsByPath={fieldsByPath}\n onChange={(next) => onChange(updateSubgroup(group, i, next))}\n onRemove={() => onChange(removeSubgroup(group, i))}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n isComplexEnabled={isComplexEnabled}\n />\n ))\n : null}\n\n <GroupAddControls\n onAddFilter={handleAddFilter}\n onAddGroup={handleAddGroup}\n isComplexEnabled={isComplexEnabled}\n />\n </div>\n )\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport { type FilterValueInputRenderer, RenderValueInputProvider } from './filter-value-input'\nimport { GroupBody } from './group-body'\nimport { addPendingLeaf } from './group-mutations'\nimport type { FilterField, FilterGroup } from './types'\n\n/* =========================================================================\n RecordFilterEditor — the recursive AND/OR filter editor with no popover\n chrome. Owns the auto-focus state for the field → operator → value chain\n and seeds an initial pending row when mounted empty so the user can start\n typing immediately. Used inline (e.g. as the always-open editor in the\n Query Builder) and as the body of `RecordFilterBuilderPanel`.\n\n Pure presentation of one `FilterGroup`; persistence and toolbar chrome\n (joiner toggle, close, footer, save-as-view) are the caller's concern.\n ========================================================================= */\n\nexport type RecordFilterEditorProps = {\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n /** Show \"+ Add group\", \"Wrap in group\", and render nested sub-groups. */\n isComplexEnabled?: boolean\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** Drop in a pending row on mount when the filter is empty so the user\n * lands on an auto-focused AttributePicker. Defaults to `true`. */\n seedPendingRow?: boolean\n /**\n * Optional override for the value editor. Lets product code plug in\n * editors the lib can't know about (e.g. a record picker that hits the\n * SDK). Return `undefined` from the renderer to fall through to the\n * built-in branches per `(field.type, operator)` combination.\n */\n renderValueInput?: FilterValueInputRenderer\n}\n\nexport function RecordFilterEditor({\n fields,\n filter,\n onChange,\n isComplexEnabled = false,\n showFieldIcons = true,\n showJoinerToggle = true,\n seedPendingRow = true,\n renderValueInput,\n}: RecordFilterEditorProps) {\n const fieldsByPath = useMemo(() => Object.fromEntries(fields.map((f) => [f.path, f])), [fields])\n const elements = filter.elements ?? []\n const subgroups = filter.groups ?? []\n\n const [autoFocusIndex, setAutoFocusIndex] = useState<number | null>(null)\n const [autoFocusOperatorIndex, setAutoFocusOperatorIndex] = useState<number | null>(null)\n const [autoFocusValueIndex, setAutoFocusValueIndex] = useState<number | null>(null)\n\n const addPendingRow = () => {\n const nextIndex = (filter.elements ?? []).length\n onChange(addPendingLeaf(filter))\n setAutoFocusIndex(nextIndex)\n }\n\n // Mount-only seed. Re-running on `elements` changes would re-add a pending\n // row whenever the user clears all filters.\n // biome-ignore lint/correctness/useExhaustiveDependencies: mount-only by design\n useEffect(() => {\n if (!seedPendingRow) return\n if (elements.length === 0 && subgroups.length === 0) addPendingRow()\n }, [])\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <GroupBody\n group={filter}\n fields={fields}\n fieldsByPath={fieldsByPath}\n onChange={onChange}\n isRoot\n isComplexEnabled={isComplexEnabled}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n autoFocusIndex={autoFocusIndex}\n setAutoFocusIndex={setAutoFocusIndex}\n autoFocusOperatorIndex={autoFocusOperatorIndex}\n setAutoFocusOperatorIndex={setAutoFocusOperatorIndex}\n autoFocusValueIndex={autoFocusValueIndex}\n setAutoFocusValueIndex={setAutoFocusValueIndex}\n onSubmitLeaf={addPendingRow}\n />\n </RenderValueInputProvider>\n )\n}\n","import { cn } from '../../lib/cn'\nimport { SegmentedControl } from '../segmented-control/segmented-control'\nimport { type FilterValueInputRenderer, RenderValueInputProvider } from './filter-value-input'\nimport { RecordFilterEditor } from './record-filter-editor'\nimport type { FilterField, FilterGroup, LogicalOperator } from './types'\n\n/* =========================================================================\n RecordFilterBuilderPanel — the popover panel content for the Filter\n button. Composition:\n\n [Header joiner-segmented (≥2 rows) ··· Expand-inline · ×Close]\n [Body one FilterRow per element, plus optional pending row]\n [Add \"+ Add filter\" appends a new row in-place]\n [Footer Clear all · Save view · Done]\n\n \"+ Add filter\" appends a row with `field: ''`. That row's first cell\n is an auto-focused inline AttributePicker (Combobox) with the dropdown\n open — exactly one click to start picking. The other cells (operator,\n value, remove) only appear once a field is chosen.\n ========================================================================= */\n\nexport type RecordFilterBuilderPanelProps = {\n /** Display label shown in the header when fewer than 2 rows exist. */\n entityLabel?: string\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n onClose: () => void\n /** Optional \"Save as view\" affordance. Hidden when not provided. */\n onSaveView?: () => void\n /** Optional \"Expand inline\" affordance — surface chips outside the popover. */\n onExpand?: () => void\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** Opt-in to nested-group affordances: \"+ Add group\" button, \"Wrap in\n * group\" hover icon on leaves, and rendering of any sub-groups in the\n * filter tree. Defaults to `false` for back-compat. */\n isComplexEnabled?: boolean\n /** Optional override for the value editor. Forwarded to RecordFilterEditor. */\n renderValueInput?: FilterValueInputRenderer\n}\n\nexport function RecordFilterBuilderPanel({\n entityLabel,\n fields,\n filter,\n onChange,\n onClose,\n onSaveView,\n onExpand,\n showFieldIcons = true,\n showJoinerToggle = true,\n isComplexEnabled = false,\n renderValueInput,\n}: RecordFilterBuilderPanelProps) {\n const elements = filter.elements ?? []\n const subgroups = filter.groups ?? []\n\n const setJoiner = (next: LogicalOperator) => onChange({ ...filter, logicalOperator: next })\n\n const clearAll = () => {\n onChange({ ...filter, elements: [], groups: [] })\n }\n\n const totalChildren = elements.length + (isComplexEnabled ? subgroups.length : 0)\n const showJoinerSegment = showJoinerToggle && totalChildren >= 2\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <div\n className=\"w-[min(640px,92vw)] flex flex-col\"\n onKeyDown={(e) => {\n // Cmd/Ctrl+Enter anywhere in the panel = \"save & close\" (Done\n // equivalent). Plain Enter on a value Input is handled per-row in\n // FilterRow's value-cell wrapper. Escape is handled by RAC's Dialog.\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n onClose()\n }\n }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-rule\">\n <div className=\"flex items-center gap-2.5\">\n {showJoinerSegment ? (\n <SegmentedControl<LogicalOperator>\n aria-label=\"Joiner\"\n options={[\n { id: 'and', label: 'AND' },\n { id: 'or', label: 'OR' },\n ]}\n value={filter.logicalOperator}\n onChange={setJoiner}\n />\n ) : (\n <>\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-4\">\n Filters\n </span>\n {entityLabel ? (\n <>\n <span className=\"font-mono text-[11px] text-ink-3\">·</span>\n <span className=\"font-mono text-[11px] text-ink-3\">{entityLabel}</span>\n </>\n ) : null}\n </>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n {onExpand ? (\n <button\n type=\"button\"\n onClick={onExpand}\n title=\"Show filter chips inline above the table\"\n className={cn(\n 'inline-flex items-center gap-1 px-2 py-1 rounded-sm',\n 'font-mono text-[11.5px] text-ink-3 hover:text-ink hover:bg-surface-2',\n 'cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m3 3 3 3-3 3M7 3l3 3-3 3\" />\n </svg>\n Expand inline\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className={cn(\n 'size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-3 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l6 6M9 3l-6 6\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"px-2 py-2 max-h-[420px] overflow-auto\">\n <RecordFilterEditor\n fields={fields}\n filter={filter}\n onChange={onChange}\n isComplexEnabled={isComplexEnabled}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n />\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n 'flex items-center justify-between px-3.5 py-2.5 border-t border-rule rounded-b-md',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n )}\n >\n <button\n type=\"button\"\n onClick={clearAll}\n disabled={totalChildren === 0}\n className={cn(\n 'font-mono text-[11.5px] text-ink-3 hover:text-ink',\n 'disabled:opacity-40 disabled:pointer-events-none',\n 'outline-none cursor-pointer',\n )}\n >\n Clear all\n </button>\n <div className=\"flex items-center gap-1.5\">\n {onSaveView ? (\n <button\n type=\"button\"\n onClick={onSaveView}\n disabled={totalChildren === 0}\n className={cn(\n 'inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-sm',\n 'font-sans text-[13px] text-ink-2 hover:bg-surface-2 hover:text-ink',\n 'disabled:opacity-40 disabled:pointer-events-none',\n 'outline-none cursor-pointer',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 2h7l2 2v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z\" />\n <path d=\"M5 2v3h4V2\" />\n </svg>\n Save as view\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n className={cn(\n 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-sm',\n 'bg-ink text-surface font-mono text-[12px]',\n 'hover:bg-accent-ink outline-none cursor-pointer',\n )}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n </RenderValueInputProvider>\n )\n}\n","import { useEffect, useState } from 'react'\n\n/* =========================================================================\n showDetails persistence — a tiny pub/sub on top of localStorage so the\n FilterButton (collapsed) and the FilterChips (expanded) stay in sync\n regardless of where they're mounted in the page. Keyed by a configurable\n storage key so multiple filter UIs can coexist.\n ========================================================================= */\n\ntype Listener = (next: boolean) => void\n\nconst stores = new Map<string, Set<Listener>>()\n\nfunction listeners(key: string): Set<Listener> {\n let set = stores.get(key)\n if (!set) {\n set = new Set()\n stores.set(key, set)\n }\n return set\n}\n\nfunction read(key: string): boolean {\n if (typeof window === 'undefined') return false\n try {\n // Default collapsed: only an explicit '1' expands. Unset / '0' → collapsed.\n return window.localStorage.getItem(key) === '1'\n } catch {\n return false\n }\n}\n\nfunction write(key: string, next: boolean) {\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.setItem(key, next ? '1' : '0')\n } catch {\n /* ignore quota / privacy-mode errors */\n }\n }\n for (const fn of listeners(key)) fn(next)\n}\n\nexport function useShowDetails(storageKey = 'rf.showDetails') {\n const [value, setValue] = useState<boolean>(() => read(storageKey))\n\n useEffect(() => {\n const fn: Listener = (next) => setValue(next)\n listeners(storageKey).add(fn)\n setValue(read(storageKey))\n return () => {\n listeners(storageKey).delete(fn)\n }\n }, [storageKey])\n\n const toggle = () => write(storageKey, !read(storageKey))\n const set = (next: boolean) => write(storageKey, next)\n\n return [value, toggle, set] as const\n}\n\n/** Test-only escape hatch — clears all listeners and storage values. */\nexport function __resetShowDetailsStores() {\n stores.clear()\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.clear()\n } catch {\n /* ignore */\n }\n }\n}\n","import { useRef, useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport { PopoverContent } from '../popover/popover'\nimport { type FilterValueInputRenderer, RenderValueInputProvider } from './filter-value-input'\nimport { countLeaves } from './group-mutations'\nimport { RecordFilterBuilderPanel } from './record-filter-builder-panel'\nimport { useShowDetails } from './show-details-store'\nimport type { FilterField, FilterGroup } from './types'\n\n/* =========================================================================\n RecordFilterButton — the inline trigger that opens the builder popover.\n Sized to sit on the same row as other table actions (Columns / Sort /\n New customer). When the chips row is expanded AND has at least one\n active filter, this button hides itself — the chip row is the single\n source of UI in that mode.\n ========================================================================= */\n\nexport type RecordFilterButtonProps = {\n /** Display label shown in the builder header. */\n entityLabel?: string\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** Optional save-as-view affordance forwarded to the builder. */\n onSaveView?: () => void\n /** localStorage key shared with `RecordFilterChips`. */\n storageKey?: string\n /** Opt-in to nested-group affordances inside the builder popover. Defaults\n * to `false` for back-compat. Forwarded to `RecordFilterBuilderPanel`. */\n isComplexEnabled?: boolean\n /** Optional override for the value editor. Forwarded to the builder panel. */\n renderValueInput?: FilterValueInputRenderer\n}\n\nexport function RecordFilterButton({\n entityLabel,\n fields,\n filter,\n onChange,\n showFieldIcons = true,\n showJoinerToggle = true,\n onSaveView,\n storageKey,\n isComplexEnabled = false,\n renderValueInput,\n}: RecordFilterButtonProps) {\n const ref = useRef<HTMLSpanElement>(null)\n const [open, setOpen] = useState(false)\n const [showDetails, toggleDetails] = useShowDetails(storageKey)\n\n const filterCount = countLeaves(filter)\n const hasFilters = filterCount > 0\n\n // Expanded mode hides the Filter button entirely — the chip row is the\n // single source of UI in that mode (+ Add pill is the entry point).\n if (showDetails) return null\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <span ref={ref} className=\"inline-flex\">\n <button\n type=\"button\"\n data-filter-trigger=\"collapsed\"\n onClick={() => setOpen((v) => !v)}\n className={cn(\n 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md border',\n 'font-mono text-[12px] cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n hasFilters\n ? cn(\n 'border-[color-mix(in_oklab,var(--color-accent)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-accent)_8%,var(--color-surface))]',\n 'text-accent-ink',\n )\n : 'border-rule bg-surface text-ink-2 hover:border-ink-4 hover:text-ink',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 3h10M4 7h6M6 11h2\" />\n </svg>\n Filter\n {hasFilters ? (\n <span className=\"font-mono text-[10.5px] px-1.5 py-px rounded-pill bg-accent text-surface\">\n {filterCount}\n </span>\n ) : null}\n </button>\n </span>\n\n <PopoverContent\n triggerRef={ref}\n isOpen={open}\n onOpenChange={setOpen}\n placement=\"bottom start\"\n panelClassName=\"p-0 bg-bg\"\n >\n <RecordFilterBuilderPanel\n {...(entityLabel ? { entityLabel } : {})}\n fields={fields}\n filter={filter}\n onChange={onChange}\n onClose={() => setOpen(false)}\n {...(onSaveView ? { onSaveView } : {})}\n onExpand={() => {\n if (!showDetails) toggleDetails()\n setOpen(false)\n }}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n isComplexEnabled={isComplexEnabled}\n />\n </PopoverContent>\n </RenderValueInputProvider>\n )\n}\n","import { Fragment, type RefObject, useEffect, useMemo, useRef, useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport { PopoverContent } from '../popover/popover'\nimport { AttributePicker } from './attribute-picker'\nimport { ChipValue, type ChipValueItemRenderer } from './chip-value'\nimport { rebaseRowOnFieldChange, rebaseRowOnOperatorChange } from './filter-row'\nimport {\n FilterValueInput,\n type FilterValueInputRenderer,\n RenderValueInputProvider,\n} from './filter-value-input'\nimport { countLeaves } from './group-mutations'\nimport { OperatorPicker } from './operator-picker'\nimport { operatorById, operatorsForType } from './operators'\nimport { useShowDetails } from './show-details-store'\nimport { AttributeTypeIcon } from '../attribute-type-icon'\nimport { FIELD_LABEL_SEPARATOR } from './field-label'\nimport type { ComparisonOperator, FilterField, FilterGroup, FilterValue } from './types'\n\n/* =========================================================================\n RecordFilterChips — chip row above the table. Renders one chip per\n active filter, with AND/OR joiner pills between them and an inline\n \"+ Add filter\" affordance at the end. A \"« Collapse\" text-button sits\n above the chips to fold the row back to the icon-only `RecordFilterButton`.\n\n \"+ Add filter\" appends a pending element with `field: ''` directly into\n the FilterGroup state and renders an inline auto-focused AttributePicker\n in its place. Once the user picks a field, the picker becomes a real\n chip. Same pattern is used inside `ChipMiniEditor` for editing the\n field of an existing chip.\n\n When collapsed (`!showDetails`), returns null — the `RecordFilterButton`\n takes over.\n ========================================================================= */\n\nexport type RecordFilterChipsProps = {\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** localStorage key used to share the collapsed/expanded state with the\n * RecordFilterButton. Pass the same value to both components. */\n storageKey?: string\n /** Optional override for the value editor inside the chip's mini-editor. */\n renderValueInput?: FilterValueInputRenderer\n /** Optional override for per-value-item rendering inside chip pills.\n * Called once per value (or once per item for arity 'n'); returning\n * `undefined` falls through to the lib default. LUM-34 wires this to\n * the page-layout control registry's Display. */\n renderChipItem?: ChipValueItemRenderer\n}\n\nexport function RecordFilterChips({\n fields,\n filter,\n onChange,\n showFieldIcons = true,\n showJoinerToggle = true,\n storageKey,\n renderValueInput,\n renderChipItem,\n}: RecordFilterChipsProps) {\n const fieldsByPath = useMemo(() => Object.fromEntries(fields.map((f) => [f.path, f])), [fields])\n const elements = filter.elements ?? []\n const subgroups = filter.groups ?? []\n const [showDetails, toggleDetails] = useShowDetails(storageKey)\n // Index of the chip whose AttributePicker should auto-focus this render.\n const [autoFocusIndex, setAutoFocusIndex] = useState<number | null>(null)\n // Index of the chip whose mini-editor should auto-open on mount — set when\n // a pending row's AttributePicker resolves, so the user lands directly on\n // the value editor (operator is already pre-selected by\n // rebaseRowOnFieldChange).\n const [autoOpenIndex, setAutoOpenIndex] = useState<number | null>(null)\n\n if (!showDetails) return null\n\n const addPending = () => {\n const nextIndex = elements.length\n onChange({\n ...filter,\n elements: [...elements, { field: '', operator: 'eq', value: '' }],\n })\n setAutoFocusIndex(nextIndex)\n }\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <div className=\"flex flex-col items-start gap-1.5\">\n <CollapseToggle onClick={toggleDetails} />\n <div className=\"flex items-center gap-2 flex-wrap\">\n {elements.map((el, i) => {\n const field = fieldsByPath[el.field]\n return (\n <Fragment\n // biome-ignore lint/suspicious/noArrayIndexKey: filter elements have no stable id; index disambiguates duplicate-field rows\n key={`${el.field}-${i}`}\n >\n {i > 0 ? (\n showJoinerToggle ? (\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...filter,\n logicalOperator: filter.logicalOperator === 'and' ? 'or' : 'and',\n })\n }\n title=\"Toggle joiner\"\n className={cn(\n 'inline-flex items-center px-1.5 py-0.5 rounded-sm border border-dashed border-rule',\n 'font-mono text-[10.5px] tracking-[0.08em] text-ink-3',\n 'hover:text-ink hover:border-ink-4 cursor-pointer outline-none',\n )}\n >\n {filter.logicalOperator.toUpperCase()}\n </button>\n ) : (\n <span className=\"font-mono text-[10.5px] tracking-[0.08em] text-ink-4 px-1\">\n {filter.logicalOperator.toUpperCase()}\n </span>\n )\n ) : null}\n\n {field ? (\n <Chip\n index={i}\n field={field}\n element={el}\n fields={fields}\n showFieldIcons={showFieldIcons}\n autoOpen={autoOpenIndex === i}\n onAutoOpenConsumed={() => setAutoOpenIndex(null)}\n {...(renderChipItem !== undefined ? { renderChipItem } : {})}\n onChangeField={(picked) =>\n onChange({\n ...filter,\n elements: elements.map((e, idx) =>\n idx === i ? rebaseRowOnFieldChange(e, picked) : e,\n ),\n })\n }\n onChangeOperator={(opId) =>\n onChange({\n ...filter,\n elements: elements.map((e, idx) =>\n idx === i ? rebaseRowOnOperatorChange(e, field, opId) : e,\n ),\n })\n }\n onChangeValue={(v) =>\n onChange({\n ...filter,\n elements: elements.map((e, idx) => (idx === i ? { ...e, value: v } : e)),\n })\n }\n onRemove={() =>\n onChange({\n ...filter,\n elements: elements.filter((_, idx) => idx !== i),\n })\n }\n />\n ) : (\n // Pending chip — inline AttributePicker.\n <div className=\"inline-flex items-center gap-1\">\n <AttributePicker\n fields={fields}\n value=\"\"\n autoFocus={autoFocusIndex === i}\n onChange={(picked) => {\n if (autoFocusIndex === i) setAutoFocusIndex(null)\n // Hand off to the resolved Chip: open its mini-editor\n // immediately so the user can fill the value.\n setAutoOpenIndex(i)\n onChange({\n ...filter,\n elements: elements.map((e, idx) =>\n idx === i ? rebaseRowOnFieldChange(e, picked) : e,\n ),\n })\n }}\n />\n <button\n type=\"button\"\n aria-label=\"Cancel\"\n onClick={() => {\n if (autoFocusIndex === i) setAutoFocusIndex(null)\n onChange({\n ...filter,\n elements: elements.filter((_, idx) => idx !== i),\n })\n }}\n className={cn(\n 'size-5 inline-flex items-center justify-center rounded-[3px]',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 10 10\"\n className=\"size-2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l6 6M8 2l-6 6\" />\n </svg>\n </button>\n </div>\n )}\n </Fragment>\n )\n })}\n\n {subgroups.map((sub, i) => {\n const showLeadingJoiner = elements.length > 0 || i > 0\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: sub-groups have no stable id\n <Fragment key={`group-${i}`}>\n {showLeadingJoiner ? (\n <span className=\"font-mono text-[10.5px] tracking-[0.08em] text-ink-4 px-1\">\n {filter.logicalOperator.toUpperCase()}\n </span>\n ) : null}\n <GroupPill group={sub} />\n </Fragment>\n )\n })}\n\n <InlineAddFilter onClick={addPending} />\n </div>\n </div>\n </RenderValueInputProvider>\n )\n}\n\n/* ---------- GroupPill -----------------------------------------------------\n Read-only pill that surfaces a sub-group's existence in the chip row.\n By design, group editing only happens inside the builder popover — so\n this pill points users there with a `title` hint and no click handler.\n ------------------------------------------------------------------------- */\nfunction GroupPill({ group }: { group: FilterGroup }) {\n const count = countLeaves(group)\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-sm border border-dashed border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n )}\n title=\"Nested group — open the filter popover to edit\"\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3 text-ink-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3M9 3a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3\" />\n </svg>\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-3\">\n {group.logicalOperator} group\n </span>\n <span className=\"font-mono text-[11px] text-ink-4\">· {count}</span>\n </span>\n )\n}\n\n/* ---------- Collapse toggle ----------------------------------------------- */\nfunction CollapseToggle({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'inline-flex items-center gap-1',\n 'font-mono text-[11px] uppercase tracking-[0.08em]',\n 'text-ink-3 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m8 3-3 4 3 4M11 3l-3 4 3 4\" />\n </svg>\n Collapse\n </button>\n )\n}\n\n/* ---------- Chip ---------------------------------------------------------- */\nfunction Chip({\n index,\n field,\n element,\n fields,\n showFieldIcons,\n autoOpen = false,\n onAutoOpenConsumed,\n onChangeField,\n onChangeOperator,\n onChangeValue,\n onRemove,\n renderChipItem,\n}: {\n index: number\n field: FilterField\n element: { field: string; operator: ComparisonOperator; value: FilterValue }\n fields: ReadonlyArray<FilterField>\n showFieldIcons: boolean\n /** When true, the mini-editor opens immediately on mount. Used to chain\n * \"+ Add filter → pick attribute → land on value editor\" without an\n * intermediate click. */\n autoOpen?: boolean\n onAutoOpenConsumed?: () => void\n onChangeField: (next: FilterField) => void\n onChangeOperator: (next: ComparisonOperator) => void\n onChangeValue: (next: FilterValue) => void\n onRemove: () => void\n renderChipItem?: ChipValueItemRenderer\n}) {\n const ref = useRef<HTMLSpanElement>(null)\n const [editing, setEditing] = useState(autoOpen)\n // Tell the parent to clear its `autoOpenIndex` so a subsequent chip\n // mounting at the same index doesn't inherit the open flag.\n useEffect(() => {\n if (autoOpen) onAutoOpenConsumed?.()\n // We deliberately only run this on mount — autoOpen is a hand-off signal,\n // not a sustained prop.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const op = operatorById(element.operator) ?? operatorsForType(field.type)[0]\n\n return (\n <>\n {/* biome-ignore lint/a11y/useSemanticElements: chip contains a nested remove <button>; HTML disallows nested <button>, so we use an aria-button span */}\n <span\n ref={ref}\n role=\"button\"\n tabIndex={0}\n aria-label={`Edit filter ${index + 1}: ${field.label}`}\n onClick={() => setEditing((v) => !v)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setEditing((v) => !v)\n }\n }}\n className={cn(\n 'group inline-flex items-center gap-1.5 pl-2 pr-1 py-1 rounded-sm border cursor-pointer',\n editing\n ? 'border-accent shadow-[var(--shadow-focus)] bg-surface'\n : 'border-rule bg-surface hover:border-ink-4',\n )}\n >\n {showFieldIcons ? (\n <span className=\"text-ink-3\">\n <AttributeTypeIcon type={field.type} />\n </span>\n ) : null}\n <span className=\"font-sans text-[12.5px] text-ink-2\">\n {field.parentLabel ? (\n <span className=\"text-ink-4\">\n {field.parentLabel}\n {FIELD_LABEL_SEPARATOR}\n </span>\n ) : null}\n <span className=\"text-ink\">{field.shortLabel}</span>\n </span>\n <span className=\"font-mono text-[11px] text-ink-3\">{op?.label}</span>\n <ChipValue\n field={field}\n operator={element.operator}\n value={element.value}\n {...(renderChipItem !== undefined ? { renderItem: renderChipItem } : {})}\n />\n <button\n type=\"button\"\n aria-label=\"Remove filter\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n if (editing) setEditing(false)\n }}\n className={cn(\n 'ml-0.5 size-4 inline-flex items-center justify-center rounded-[3px]',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 10 10\"\n className=\"size-2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l6 6M8 2l-6 6\" />\n </svg>\n </button>\n </span>\n\n <PopoverContent\n triggerRef={ref as RefObject<Element | null>}\n isOpen={editing}\n onOpenChange={setEditing}\n >\n <ChipMiniEditor\n field={field}\n element={element}\n fields={fields}\n onChangeField={onChangeField}\n onChangeOperator={onChangeOperator}\n onChangeValue={onChangeValue}\n onClose={() => setEditing(false)}\n />\n </PopoverContent>\n </>\n )\n}\n\n/* ---------- ChipMiniEditor -----------------------------------------------\n Single horizontal row: AttributePicker · OperatorPicker · FilterValueInput\n · Save. No header — clicking outside or pressing Escape closes the popover\n too (RAC handles both). Uses the same flex shares as the builder panel's\n filter row so the cells stay coherent across surfaces.\n\n Enter to save: the row is wrapped in a `<form>`. A plain text Input\n bubbles Enter up as a native form submit — closing the popover. RAC's\n Combobox/Select/TagInput/DatePicker all `preventDefault` on Enter for\n their own selection/commit semantics, so the form only submits when no\n child claimed the keypress. The trailing Save button is `type=\"submit\"`\n and triggers the same path.\n ----------------------------------------------------------------------- */\nfunction ChipMiniEditor({\n field,\n element,\n fields,\n onChangeField,\n onChangeOperator,\n onChangeValue,\n onClose,\n}: {\n field: FilterField\n element: { field: string; operator: ComparisonOperator; value: FilterValue }\n fields: ReadonlyArray<FilterField>\n onChangeField: (next: FilterField) => void\n onChangeOperator: (next: ComparisonOperator) => void\n onChangeValue: (next: FilterValue) => void\n onClose: () => void\n}) {\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onClose()\n }}\n className=\"w-[min(560px,92vw)] p-2 flex items-center gap-1.5\"\n >\n <div className=\"flex-1 basis-0 min-w-[140px]\">\n <AttributePicker fields={fields} value={element.field} onChange={onChangeField} />\n </div>\n <div className=\"flex-1 basis-0 min-w-[110px]\">\n <OperatorPicker\n fieldType={field.type}\n value={element.operator}\n onChange={onChangeOperator}\n autoFocus\n />\n </div>\n <div className=\"flex-[2] basis-0 min-w-0\">\n <FilterValueInput\n field={field}\n operator={element.operator}\n value={element.value}\n onChange={onChangeValue}\n />\n </div>\n <button\n type=\"submit\"\n className={cn(\n 'shrink-0 inline-flex items-center px-2.5 py-1.5 rounded-md',\n 'bg-ink text-surface font-mono text-[12px]',\n 'hover:bg-accent-ink cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n Save\n </button>\n </form>\n )\n}\n\n/* ---------- InlineAddFilter ---------------------------------------------- */\nfunction InlineAddFilter({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n data-filter-trigger=\"expanded\"\n onClick={onClick}\n className={cn(\n 'inline-flex items-center gap-1 px-2 py-1 rounded-sm',\n 'text-ink-3 hover:bg-surface-2 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n <span className=\"font-sans text-[12.5px]\">Add filter</span>\n </button>\n )\n}\n","import {\n Separator as AriaSeparator,\n type SeparatorProps as AriaSeparatorProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Separator — hairline divider between sections.\n - Default: dashed horizontal rule (matches the Proteos card/modal convention).\n - `variant=\"solid\"` for a continuous hairline (section breaks inside dense\n tables, sidebars, etc. — see the spec's sub-label rows).\n - `orientation=\"vertical\"` for inline toolbars / nav separators.\n ========================================================================= */\n\nexport const separatorStyles = tv({\n base: 'm-0 border-0 border-rule',\n variants: {\n orientation: {\n horizontal: 'w-full border-t',\n vertical: 'h-full border-l',\n },\n variant: {\n dashed: 'border-dashed',\n solid: 'border-solid',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n variant: 'dashed',\n },\n})\n\nexport type SeparatorVariants = VariantProps<typeof separatorStyles>\nexport type SeparatorProps = AriaSeparatorProps & { variant?: SeparatorVariants['variant'] }\n\nexport function Separator({\n className,\n orientation = 'horizontal',\n variant = 'dashed',\n ...props\n}: SeparatorProps) {\n return (\n <AriaSeparator\n {...props}\n orientation={orientation}\n className={cn(separatorStyles({ orientation, variant }), className)}\n />\n )\n}\n","import { CircleCheck } from 'lucide-react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n SuccessAnimation — success confirmation: a large green checkmark in a\n circle (token `--color-success`), entering with the one-shot status-pop\n scale+fade (suppressed under prefers-reduced-motion). Decorative:\n rendered with `aria-hidden`, since the surrounding text region carries\n the announcement. Size via className (default 96×96).\n ========================================================================= */\n\nexport type SuccessAnimationProps = {\n className?: string\n}\n\nexport function SuccessAnimation({ className }: SuccessAnimationProps) {\n return (\n <div\n aria-hidden\n className={cn('size-24 text-success motion-safe:animate-status-pop', className)}\n >\n <CircleCheck className=\"size-full\" strokeWidth={1.5} />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Switch as AriaSwitch, type SwitchProps as AriaSwitchProps } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\nexport type SwitchProps = Omit<AriaSwitchProps, 'children'> & {\n children?: ReactNode\n /** Render the label before the track instead of after it. */\n labelPlacement?: 'start' | 'end'\n}\n\nexport function Switch({ children, labelPlacement = 'end', className, ...props }: SwitchProps) {\n return (\n <AriaSwitch\n {...props}\n className={(renderProps) =>\n cn(\n // `relative`: RAC's visually-hidden <input> is absolutely positioned;\n // without a positioned label it escapes an overflow-auto ancestor and\n // its containing block becomes the page shell, so focusing it (any\n // press) scrolls the clipped shell and the whole tab goes blank.\n 'group relative inline-flex items-center gap-3 cursor-pointer select-none',\n 'font-sans text-[14px] text-ink-2',\n labelPlacement === 'start' && 'flex-row-reverse',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <span\n aria-hidden\n className={cn(\n 'relative inline-block shrink-0',\n 'w-[38px] h-[22px] rounded-pill border',\n 'bg-surface-3 border-rule',\n 'transition-[background-color,border-color] duration-150',\n 'group-data-[selected]:bg-accent group-data-[selected]:border-accent',\n 'group-data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n <span\n className={cn(\n 'absolute top-[1px] left-[1px]',\n 'block size-[18px] rounded-full bg-surface',\n 'transition-transform duration-200',\n 'group-data-[selected]:translate-x-[16px]',\n )}\n />\n </span>\n {children}\n </AriaSwitch>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Tab as AriaTab,\n TabList as AriaTabList,\n TabPanel as AriaTabPanel,\n Tabs as AriaTabs,\n type TabListProps as AriaTabListProps,\n type TabPanelProps as AriaTabPanelProps,\n type TabProps as AriaTabProps,\n type TabsProps as AriaTabsProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Tabs — generic tab strip wrapping RAC `<Tabs>` / `<TabList>` / `<Tab>` /\n `<TabPanel>`. Chrome only — no product knowledge. Used in the page\n renderer's `TabsElement` and the page-designer inspector (`Style /\n Settings / Rules`).\n\n Sub-component form (`<Tabs.Root>` / `<Tabs.List>` / `<Tabs.Trigger>` /\n `<Tabs.Panel>`) so each tab's content participates separately in the\n designer drop-zone tree. The compound names follow the lib's existing\n slot-style components (Card, Modal).\n ========================================================================= */\n\nexport const tabsStyles = tv({\n slots: {\n root: 'flex flex-col gap-3 outline-none',\n list: 'flex gap-[18px] border-b border-rule pl-0.5',\n trigger: [\n 'cursor-pointer outline-none select-none',\n 'border-b-[1.5px] -mb-px transition-[color,border-color] duration-150',\n 'text-ink-3 border-transparent',\n 'data-[hovered]:text-ink',\n 'data-[selected]:text-ink data-[selected]:border-accent',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)] data-[focus-visible]:rounded-sm',\n ],\n panel: 'outline-none',\n },\n variants: {\n size: {\n sm: {\n list: 'gap-3',\n trigger:\n 'py-1.5 font-mono text-[11px] uppercase tracking-[0.08em]',\n },\n md: {\n list: 'gap-[18px]',\n trigger: 'py-2 text-[13px]',\n },\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type TabsVariants = VariantProps<typeof tabsStyles>\n\nexport type TabsRootProps = Omit<AriaTabsProps, 'children'> &\n TabsVariants & {\n children?: ReactNode\n }\n\nfunction Root({ size, className, children, ...props }: TabsRootProps) {\n const styles = tabsStyles({ size })\n return (\n <AriaTabs\n {...props}\n className={(rp) =>\n cn(styles.root(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children}\n </AriaTabs>\n )\n}\n\nexport type TabsListProps = Omit<AriaTabListProps<object>, 'children'> &\n TabsVariants & {\n children?: ReactNode\n }\n\nfunction List({ size, className, children, ...props }: TabsListProps) {\n const styles = tabsStyles({ size })\n return (\n <AriaTabList\n {...(props as AriaTabListProps<object>)}\n className={(rp) =>\n cn(styles.list(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children as never}\n </AriaTabList>\n )\n}\n\nexport type TabsTriggerProps = Omit<AriaTabProps, 'children'> &\n TabsVariants & {\n children?: ReactNode\n }\n\nfunction Trigger({ size, className, children, ...props }: TabsTriggerProps) {\n const styles = tabsStyles({ size })\n return (\n <AriaTab\n {...props}\n className={(rp) =>\n cn(styles.trigger(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children}\n </AriaTab>\n )\n}\n\nexport type TabsPanelProps = Omit<AriaTabPanelProps, 'children'> & {\n children?: ReactNode\n}\n\nfunction Panel({ className, children, ...props }: TabsPanelProps) {\n const styles = tabsStyles({})\n return (\n <AriaTabPanel\n {...props}\n className={(rp) =>\n cn(styles.panel(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children}\n </AriaTabPanel>\n )\n}\n\nexport const Tabs = Object.assign(Root, {\n Root,\n List,\n Trigger,\n Panel,\n})\n","import type { ReactNode } from 'react'\nimport {\n TextArea as AriaTextArea,\n type TextAreaProps as AriaTextAreaProps,\n type TextFieldProps as AriaTextFieldProps,\n FieldError,\n Label,\n Text,\n TextField,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type TextareaProps = AriaTextFieldProps & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n /** Visible rows. Height can still grow via vertical resize (consumer). */\n rows?: number\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Extra props forwarded to the underlying <textarea>. */\n textareaProps?: Omit<AriaTextAreaProps, 'className'>\n /** Visual override for the textarea control only. */\n textareaClassName?: string\n}\n\nexport function Textarea({\n label,\n description,\n errorMessage,\n placeholder,\n rows = 4,\n size,\n appearance,\n textareaProps,\n textareaClassName,\n className,\n ...props\n}: TextareaProps) {\n const styles = fieldControlStyles({ size, appearance })\n return (\n <TextField\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <AriaTextArea\n {...textareaProps}\n rows={rows}\n placeholder={placeholder ?? ''}\n className={cn(\n // Same hairline chrome as Input, but allow vertical resize and set a\n // sensible minimum height so short content doesn't collapse.\n styles.box(),\n styles.content(),\n 'min-h-[100px] resize-y',\n textareaClassName,\n )}\n />\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </TextField>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n TimeField as AriaTimeField,\n type TimeFieldProps as AriaTimeFieldProps,\n DateInput,\n DateSegment,\n FieldError,\n Label,\n Text,\n type TimeValue,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type TimeFieldProps<T extends TimeValue> = AriaTimeFieldProps<T> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n}\n\n/* Standalone time editor — backs the `time-picker` control (naive `HH:mm:ss`).\n Just the segmented input: no calendar, no popover. Box chrome + content\n padding both ride on the DateInput since there's no sibling trigger to share\n the border with. */\nexport function TimeField<T extends TimeValue = TimeValue>({\n label,\n description,\n errorMessage,\n size,\n appearance,\n className,\n ...props\n}: TimeFieldProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n return (\n <AriaTimeField\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <DateInput\n className={cn(\n styles.box(),\n styles.content(),\n 'flex items-center min-w-0 text-ink',\n // Tabular alignment for time segments — overrides content's\n // font-sans on purpose.\n 'font-mono',\n focusWithin,\n )}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={cn(\n 'px-px tabular-nums outline-none select-none',\n 'data-[placeholder]:text-ink-4',\n 'data-[type=literal]:text-ink-4',\n // segment focus treatment: indigo fill, paper text\n 'data-[focused]:bg-accent data-[focused]:text-[#f0efe8] data-[focused]:rounded-[3px]',\n 'data-[disabled]:cursor-not-allowed',\n )}\n />\n )}\n </DateInput>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </AriaTimeField>\n )\n}\n","import { CircleAlert, CircleCheck, Info, X as XLucide } from 'lucide-react'\nimport {\n Button as AriaButton,\n Text as AriaText,\n UNSTABLE_Toast as AriaToast,\n UNSTABLE_ToastContent as AriaToastContent,\n type ToastOptions as AriaToastOptions,\n UNSTABLE_ToastQueue as AriaToastQueue,\n UNSTABLE_ToastRegion as AriaToastRegion,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Toast — brief, transient notification stack (bottom-right). Wraps RAC's\n ToastRegion / Toast (queue, ARIA live region, focus management, timeouts).\n\n Usage: create ONE queue per app (`createToastQueue()`), mount ONE\n `<ToastRegion queue={queue} />` near the root, and push from anywhere\n with `queue.add({ title, description?, variant? }, { timeout })`.\n ========================================================================= */\n\nexport type ToastVariant = 'info' | 'success' | 'danger'\n\n/** The payload a caller enqueues. Pure data — the region renders it. */\nexport interface ToastContent {\n title: string\n description?: string\n variant?: ToastVariant\n}\n\nexport type ToastQueue = AriaToastQueue<ToastContent>\nexport type ToastOptions = AriaToastOptions\n\n/** Creates the app-wide queue. `maxVisibleToasts` bounds the on-screen stack. */\nexport function createToastQueue(options: { maxVisibleToasts?: number } = {}): ToastQueue {\n return new AriaToastQueue<ToastContent>({ maxVisibleToasts: options.maxVisibleToasts ?? 3 })\n}\n\nexport const toastStyles = tv({\n slots: {\n root: [\n 'flex items-start gap-3 w-[360px] max-w-[calc(100vw-32px)]',\n 'rounded-lg border border-rule bg-surface shadow-float',\n 'px-3.5 py-3 outline-none',\n 'focus-visible:shadow-focus',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-bottom-2 entering:duration-200',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-150',\n ],\n icon: 'size-4 shrink-0 mt-0.5',\n title: 'font-sans text-[13px] font-medium leading-[1.4] text-ink',\n description: 'font-sans text-[12.5px] leading-[1.5] text-ink-3 break-words',\n },\n variants: {\n variant: {\n info: { icon: 'text-ink-3' },\n success: { icon: 'text-success' },\n danger: { icon: 'text-danger' },\n },\n },\n defaultVariants: { variant: 'info' },\n})\n\nexport type ToastVariants = VariantProps<typeof toastStyles>\n\nconst VARIANT_ICON = {\n info: Info,\n success: CircleCheck,\n danger: CircleAlert,\n} as const\n\nexport interface ToastRegionProps {\n queue: ToastQueue\n className?: string\n}\n\n/** The single live region that renders queued toasts. */\nexport function ToastRegion({ queue, className }: ToastRegionProps) {\n return (\n <AriaToastRegion\n queue={queue}\n className={cn(\n 'fixed bottom-4 right-4 z-[1300] flex flex-col-reverse gap-2 outline-none',\n className,\n )}\n >\n {({ toast }) => {\n const variant = toast.content.variant ?? 'info'\n const Icon = VARIANT_ICON[variant]\n const { root, icon, title, description } = toastStyles({ variant })\n return (\n <AriaToast toast={toast} className={root()}>\n <Icon className={icon()} aria-hidden />\n <AriaToastContent className=\"flex flex-col gap-0.5 flex-1 min-w-0\">\n <AriaText slot=\"title\" className={title()}>\n {toast.content.title}\n </AriaText>\n {toast.content.description ? (\n <AriaText slot=\"description\" className={description()}>\n {toast.content.description}\n </AriaText>\n ) : null}\n </AriaToastContent>\n <AriaButton\n slot=\"close\"\n aria-label=\"Dismiss\"\n className={cn(\n 'shrink-0 inline-flex items-center justify-center size-6 rounded-md',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'focus-visible:shadow-focus',\n )}\n >\n <XLucide className=\"size-3.5\" />\n </AriaButton>\n </AriaToast>\n )\n }}\n </AriaToastRegion>\n )\n}\n","import {\n Tooltip as AriaTooltip,\n type TooltipProps as AriaTooltipProps,\n TooltipTrigger as AriaTooltipTrigger,\n type TooltipTriggerComponentProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Tooltip — small mono label on hover/focus. Composition follows RAC:\n <TooltipTrigger>\n <Button>…</Button> // the hover/focus target\n <Tooltip>Copy</Tooltip> // the floating label\n </TooltipTrigger>\n Use for icon-button labels, truncated text hints, keyboard shortcuts.\n ========================================================================= */\n\n/** Stateful root. RAC handles hover delay + focus visibility.\n *\n * - `delay` — ms of hover before the tooltip opens. Keyboard focus opens\n * instantly regardless. Default **500** (RAC's own default is 1500 which\n * feels sluggish for a dense app). Set `0` for instant tooltips.\n * - `closeDelay` — ms after the pointer leaves before the tooltip hides.\n * Default **0** (close immediately). Raise it if adjacent targets share\n * tooltips and you want them to chain without re-waiting.\n */\nexport function TooltipTrigger({\n delay = 500,\n closeDelay = 0,\n ...props\n}: TooltipTriggerComponentProps) {\n return <AriaTooltipTrigger delay={delay} closeDelay={closeDelay} {...props} />\n}\n\nexport type TooltipProps = AriaTooltipProps\n\nexport function Tooltip({ className, offset = 6, ...props }: TooltipProps) {\n return (\n <AriaTooltip\n {...props}\n offset={offset}\n className={(renderProps) =>\n cn(\n 'z-50 max-w-xs',\n 'rounded-md border border-rule bg-surface shadow-[var(--shadow-raised)]',\n 'px-2.5 py-1.5',\n 'font-mono text-[11.5px] text-ink-2',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1 entering:duration-150',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-100',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/popover/popover.tsx","../src/components/file-field/file-field.tsx","../src/components/attachment-chip/attachment-chip.tsx","../src/components/attribute-type-icon/attribute-type-icon.tsx","../src/components/avatar/avatar.tsx","../src/components/avatar-group/avatar-group.tsx","../src/components/field/field.tsx","../src/components/icon-picker/icon-picker.tsx","../src/components/badge/badge.tsx","../src/components/badge-multi-select/badge-multi-select.tsx","../src/components/breadcrumbs/breadcrumbs.tsx","../src/components/card/card.tsx","../src/components/channel-icon/channel-icon.tsx","../src/components/checkbox/checkbox.tsx","../src/components/checkbox/checkbox-group.tsx","../src/components/color-input/color-input.tsx","../src/components/combobox/combobox.tsx","../src/lib/commands/parse-combo.ts","../src/lib/commands/protected-combos.ts","../src/lib/commands/platform.ts","../src/lib/commands/match-event.ts","../src/lib/commands/registry.ts","../src/lib/commands/use-command.ts","../src/lib/commands/discovery-store.ts","../src/components/kbd/kbd.tsx","../src/components/command/command-hint.tsx","../src/components/command/command.tsx","../src/lib/commands/use-escape-key.ts","../src/components/conversation-brief-card/conversation-brief-card.tsx","../src/components/select/select.tsx","../src/components/conversation-brief-card/types.ts","../src/components/conversation-brief-card/conversation-brief-preview.tsx","../src/components/modal/modal.tsx","../src/components/conversation-brief-card/conversation-brief-review.tsx","../src/components/conversation-brief-card/create-conversation-brief-client.ts","../src/components/currency-input/currency-input.tsx","../src/components/data-table/cells.tsx","../src/components/table/table.tsx","../src/components/data-table/states/data-table-empty.tsx","../src/components/data-table/states/data-table-error.tsx","../src/components/data-table/states/data-table-skeleton.tsx","../src/components/data-table/use-infinite-scroll-sentinel.ts","../src/components/data-table/data-table.tsx","../src/components/data-table/make-actions-column.ts","../src/components/date-picker/calendar-internals.tsx","../src/components/date-picker/date-picker.tsx","../src/components/date-time-picker/date-time-picker.tsx","../src/components/draft-message-card/draft-message-card.tsx","../src/components/draft-message-composer/create-draft-message-client.ts","../src/components/draft-message-composer/draft-message-actions-store.ts","../src/components/multi-select/multi-select.tsx","../src/components/recipient-select/recipient-select.tsx","../src/components/message-composer/message-composer.tsx","../src/components/draft-message-composer/draft-message-outcome-store.ts","../src/components/draft-message-composer/draft-status.ts","../src/components/draft-message-composer/draft-message-composer.tsx","../src/components/draft-message-card/draft-message-review.tsx","../src/components/empty-state/empty-state.tsx","../src/components/error-animation/error-animation.tsx","../src/components/file-viewer/fallback-card.tsx","../src/components/image-lightbox/image-lightbox.tsx","../src/components/file-viewer/image-view.tsx","../src/components/file-viewer/video-view.tsx","../src/components/file-viewer/file-viewer.tsx","../src/components/image-attachment/image-attachment.tsx","../src/components/image-attachment/is-previewable-image-name.ts","../src/components/input/input.tsx","../src/components/menu/menu.tsx","../src/components/nav/nav.tsx","../src/components/orb/orb.tsx","../src/components/progress-bar/progress-bar.tsx","../src/components/radio-group/radio-group.tsx","../src/components/record-filter/attribute-picker.tsx","../src/components/record-filter/field-label.ts","../src/components/record-filter/operators.ts","../src/components/record-filter/chip-value.tsx","../src/components/segmented-control/segmented-control.tsx","../src/components/tag-input/tag-input.tsx","../src/components/record-filter/filter-value-input.tsx","../src/components/record-filter/operator-picker.tsx","../src/components/record-filter/filter-row.tsx","../src/components/record-filter/group-mutations.ts","../src/components/record-filter/group-add-controls.tsx","../src/components/record-filter/nested-group.tsx","../src/components/record-filter/group-body.tsx","../src/components/record-filter/record-filter-editor.tsx","../src/components/record-filter/record-filter-builder-panel.tsx","../src/components/record-filter/show-details-store.ts","../src/components/record-filter/record-filter-button.tsx","../src/components/record-filter/record-filter-chips.tsx","../src/components/separator/separator.tsx","../src/components/success-animation/success-animation.tsx","../src/components/switch/switch.tsx","../src/components/tabs/tabs.tsx","../src/components/textarea/textarea.tsx","../src/components/time-field/time-field.tsx","../src/components/toast/toast.tsx","../src/components/tooltip/tooltip.tsx"],"names":["jsx","AriaDialogTrigger","AriaPopover","cn","AriaDialog","tv","FileIcon","FileImage","FileText","FileSpreadsheet","FileArchive","jsxs","Loader2","DropZone","Paperclip","Text","FileTrigger","Button","X","Fragment","Heading","Type","Hash","Calendar","CircleDot","ToggleLeft","Brackets","Braces","Link2","User","UsersRound","Banknote","BookText","Contact","useState","icons","useRef","styles","matches","useMemo","Label","Shapes","Popover","Search","AriaInput","ListBox","ListBoxItem","register","useEffect","AriaBreadcrumbs","AriaBreadcrumb","AriaLink","cardStyles","AriaButton","Mail","MessageCircle","Linkedin","Send","Camera","MessagesSquare","AtSign","Mic","Video","AudioLines","Phone","AriaCheckbox","AriaCheckboxGroup","FieldError","TextField","Pipette","AriaComboBox","AriaComboButton","useContext","ComboBoxStateContext","useSyncExternalStore","listenerInstalled","onWindowKeyDown","ensureListener","AriaSelect","AriaSelectButton","SelectValue","Pencil","AriaModalOverlay","AriaModal","useCallback","onBlur","formatAmount","emit","parseAmount","AriaSelectTrigger","ChevronDown","combine","draggable","dropTargetForElements","attachClosestEdge","extractClosestEdge","GripVertical","Skeleton","useReactTable","getCoreRowModel","useLayoutEffect","useVirtualizer","monitorForElements","closestEdge","reorderWithEdge","flexRender","ariaLabel","AriaDateTrigger","CalendarGrid","CalendarGridHeader","CalendarHeaderCell","CalendarGridBody","CalendarCell","AriaDatePicker","Group","DateInput","DateSegment","Dialog","DatePickerStateContext","AriaTimeField","listeners","onKeyDown","SendHorizontal","listenersByMessageId","CircleX","Download","lazy","Suspense","AriaMenuTrigger","AriaSubmenuTrigger","AriaMenu","AriaMenuItem","ChevronRight","createContext","Disclosure","DisclosurePanel","ThinkingOrb","AriaProgressBar","AriaRadioGroup","AriaRadio","useId","parseDate","setJoiner","Chip","AriaSeparator","CircleCheck","AriaSwitch","AriaTabs","AriaTabList","AriaTab","AriaTabPanel","AriaTextArea","AriaToastQueue","Info","CircleAlert","AriaToastRegion","AriaToast","AriaToastContent","AriaText","XLucide","AriaTooltipTrigger","AriaTooltip"],"mappings":";;;;;;;;;;;;;;;;;;AAoCO,SAAS,QAAQ,KAAA,EAA+B;AACrD,EAAA,uBAAOA,cAAA,CAACC,iCAAA,EAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AACvC;AAWO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA,GAAS,CAAA;AAAA,EACT,SAAA,GAAY,cAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAwB;AACtB,EAAA,uBACED,cAAA;AAAA,IAACE,2BAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,SAAA;AAAA,MACC,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVC,oBAAA;AAAA,QACE,0CAAA;AAAA,QACA,8BAAA;AAAA,QACA,qEAAA;AAAA,QACA,mEAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGF,QAAA,kBAAAH,cAAA,CAACI,0BAAA,EAAA,EAAW,SAAA,EAAU,cAAA,EAAgB,QAAA,EAAS;AAAA;AAAA,GACjD;AAEJ;AAQO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEJ,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWG,oBAAA;AAAA,QACT,yCAAA;AAAA,QACA,oCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,SAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,sCAAQ,KAAA,EAAA,EAAI,SAAA,EAAWA,qBAAG,KAAA,EAAO,SAAS,GAAI,QAAA,EAAS,CAAA;AACzD;AAEO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,uBACEH,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWG,oBAAA;AAAA,QACT,yCAAA;AAAA,QACA,oCAAA;AAAA,QACA,0EAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AC7DA,IAAM,iBAAiBE,mBAAA,CAAG;AAAA,EACxB,IAAA,EAAM;AAAA,IACJ,oFAAA;AAAA,IACA,kFAAA;AAAA,IACA,6FAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,SAAA,EAAW,EAAE,IAAA,EAAM,eAAA;AAAgB;AAEvC,CAAC,CAAA;AAED,IAAM,aAAaA,mBAAA,CAAG;AAAA,EACpB,IAAA,EAAM;AAAA,IACJ,mGAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,8GAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT;AAEJ,CAAC,CAAA;AAGM,SAAS,mBAAmB,WAAA,EAAkC;AACnE,EAAA,IAAI,CAAC,aAAa,OAAOC,gBAAA;AACzB,EAAA,IAAI,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAOC,qBAAA;AAC7C,EAAA,IAAI,WAAA,KAAgB,mBAAmB,OAAOC,oBAAA;AAC9C,EAAA,IAAI,WAAA,CAAY,UAAA,CAAW,OAAO,CAAA,EAAG,OAAOA,oBAAA;AAC5C,EAAA,IACE,WAAA,CAAY,SAAS,aAAa,CAAA,IAClC,YAAY,QAAA,CAAS,OAAO,CAAA,IAC5B,WAAA,KAAgB,UAAA,EAChB;AACA,IAAA,OAAOC,2BAAA;AAAA,EACT;AACA,EAAA,IACE,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,IAC1B,YAAY,QAAA,CAAS,KAAK,CAAA,IAC1B,WAAA,CAAY,SAAS,YAAY,CAAA,IACjC,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAC9B;AACA,IAAA,OAAOC,uBAAA;AAAA,EACT;AACA,EAAA,OAAOJ,gBAAA;AACT;AAGO,SAAS,eAAe,KAAA,EAAmC;AAChE,EAAA,IAAI,KAAA,IAAS,QAAQ,CAAC,MAAA,CAAO,SAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,EAAG,OAAO,EAAA;AAClE,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AACrC,EAAA,IAAI,OAAO,KAAA,GAAQ,IAAA;AACnB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,IAAA,GAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AAC9C,IAAA,IAAA,IAAQ,IAAA;AACR,IAAA,IAAA,IAAQ,CAAA;AAAA,EACV;AACA,EAAA,OAAO,CAAA,EAAG,IAAA,GAAO,EAAA,GAAK,IAAA,CAAK,QAAQ,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA;AACzE;AAEO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,UAAA,GAAa,KAAA;AAAA,EACb,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA2B;AAC/C,IAAA,MAAM,IAAA,GAAO,KAAA,EAAO,IAAA,CAAK,CAAC,CAAA;AAC1B,IAAA,IAAI,IAAA,iBAAqB,IAAI,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,UAAA,GAAqE,OAAO,KAAA,KAAU;AAC1F,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,SAAA,KAAc,SAAA,CAAU,SAAS,MAAM,CAAA;AACtE,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAChC,MAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAA;AAGA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,uBAAON,eAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,qBAAG,YAAA,EAAc,SAAS,GAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,IACxD;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,uBACEQ,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,oBAAA,CAAG,cAAA,CAAe,EAAE,SAAA,EAAW,CAAA,EAAG,SAAS,CAAA,EACzD,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAACY,mBAAA,EAAA,EAAQ,SAAA,EAAU,uBAAA,EAAwB,eAAW,IAAA,EAAC,CAAA;AAAA,wBACvDZ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,iBAAA,EAAU;AAAA,OAAA,EACtD,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEW,eAAA,CAAC,SAAI,SAAA,EACH,QAAA,EAAA;AAAA,sBAAAA,eAAA;AAAA,QAACE,4BAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,uBAAA;AAAA,UACX,MAAA,EAAQ,UAAA;AAAA,UACR,SAAA,EAAW,cAAA,CAAe,EAAE,SAAA,EAAW,CAAA;AAAA,UAEvC,QAAA,EAAA;AAAA,4BAAAb,cAAAA,CAACc,qBAAA,EAAA,EAAU,SAAA,EAAU,mBAAA,EAAoB,eAAW,IAAA,EAAC,CAAA;AAAA,4BACrDd,cAAAA,CAACe,wBAAA,EAAA,EAAK,MAAK,OAAA,EAAQ,SAAA,EAAU,2BAA0B,QAAA,EAAA,sBAAA,EAEvD,CAAA;AAAA,4BACAf,cAAAA;AAAA,cAACgB,+BAAA;AAAA,cAAA;AAAA,gBACC,QAAA,EAAU,YAAA;AAAA,gBACT,GAAI,iBAAA,GAAoB,EAAE,iBAAA,KAAsB,EAAC;AAAA,gBAElD,0BAAAhB,cAAAA,CAACiB,wBAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,IAAA,EAAK,MAAK,QAAA,EAAA,QAAA,EAElC;AAAA;AAAA;AACF;AAAA;AAAA,OACF;AAAA,MACC,SAAA,IAAa,+BACZjB,cAAAA,CAAC,OAAE,SAAA,EAAU,0CAAA,EAA4C,wBAAa,CAAA,GACpE;AAAA,KAAA,EACN,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,IAAA,GAAO,WAAA,GAAcY,mBAAA,GAAU,kBAAA,CAAmB,MAAM,WAAW,CAAA;AACzE,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,UAAU,CAAA,IAAK,CAAC,WAAA;AAE5C,EAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,SAAI,SAAA,EAAW,UAAA,CAAW,EAAE,WAAA,EAAa,CAAA,EAGxC,QAAA,EAAA;AAAA,sBAAAA,eAAA;AAAA,QAACM,wBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,QAAA;AAAA,UAER,SAAA,EAAU,sGAAA;AAAA,UACV,YAAY,CAAC,WAAA;AAAA,UACZ,GAAI,UAAA,GAAa,EAAE,OAAA,EAAS,UAAA,KAAe,EAAC;AAAA,UAE7C,QAAA,EAAA;AAAA,4BAAAjB,cAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWG,oBAAA,CAAG,mCAAA,EAAqC,WAAA,IAAe,cAAc,CAAA;AAAA,gBAChF,aAAA,EAAW,IAAA;AAAA,gBACX,WAAA,EAAa;AAAA;AAAA,aACf;AAAA,4BACAQ,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACd,QAAA,EAAA;AAAA,8BAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EAA2C,gBAAM,IAAA,EAAK,CAAA;AAAA,8BACtEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,wBAAc,iBAAA,GAAe,cAAA,CAAe,KAAA,CAAM,WAAW,CAAA,EAChE;AAAA,aAAA,EACF;AAAA;AAAA;AAAA,OACF;AAAA,MAEC,CAAC,UAAA,IAAc,QAAA,IAAY,CAAC,WAAA,mCAC1B,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAA,cAAAA;AAAA,UAACiB,wBAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,aAAA;AAAA,YACX,IAAA,EAAK,SAAA;AAAA,YACL,OAAA,EAAQ,QAAA;AAAA,YACR,SAAA,EAAU,uCAAA;AAAA,YAEV,QAAA,kBAAAjB,cAAAA,CAACkB,aAAA,EAAA,EAAE,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,SAC1B;AAAA,wBACAlB,cAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,SAAA,EAAU,cAAA,EAAe,WAAA,EAChD,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,qBACRW,eAAA,CAAAQ,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAnB,cAAAA,CAAC,sBACC,QAAA,kBAAAA,cAAAA;AAAA,YAACoB,2BAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,SAAA,EAAU,kDAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA,WAED,EACF,CAAA;AAAA,0BACApB,cAAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAAU,aAAA,EAC1B,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EAAoD,QAAA,EAAA,+CAAA,EAEjE,CAAA,EACF,CAAA;AAAA,0CACC,kBAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAA,cAAAA,CAACiB,4BAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,OAAO,QAAA,EAAA,QAAA,EAElD,CAAA;AAAA,4BACAjB,cAAAA;AAAA,cAACiB,wBAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,SAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,SAAA,EAAWd,oBAAA,CAAG,yBAAA,EAA2B,qCAAqC,CAAA;AAAA,gBAC9E,SAAS,MAAM;AACb,kBAAA,QAAA,EAAS;AACT,kBAAA,KAAA,EAAM;AAAA,gBACR,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF;AAAA,SAAA,EACF,CAAA,EAEJ;AAAA,OAAA,EACF,CAAA,GACE;AAAA,KAAA,EACN,CAAA;AAAA,IACC,SAAA,IAAa,+BACZH,cAAAA,CAAC,OAAE,SAAA,EAAU,0CAAA,EAA4C,wBAAa,CAAA,GACpE;AAAA,GAAA,EACN,CAAA;AAEJ;AC9QO,IAAM,uBAAuBK,mBAAAA,CAAG;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,gDAAA;AAAA,IACA,qCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,qCAAA;AAAA,MACX,KAAA,EAAO,mCAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,IACA,aAAA,EAAe;AAAA,MACb,IAAA,EAAM,mCAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,MAAA,EAAQ,OAAA,EAAS,eAAe,KAAA;AACrD,CAAC;AAsBM,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA,GAAS,OAAA;AAAA,EACT,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,IAAA,GAAO,MAAA,KAAW,WAAA,GAAcO,mBAAAA,GAAU,mBAAmB,WAAW,CAAA;AAC9E,EAAA,MAAM,IAAA,GACJ,WAAW,OAAA,GACN,YAAA,IAAgB,WACjB,MAAA,KAAW,WAAA,GACT,iBAAA,GACA,cAAA,CAAe,WAAW,CAAA;AAElC,EAAA,MAAM,IAAA,mBACJD,eAAAA,CAAAQ,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAnB,cAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,oBAAA,CAAG,8BAAA,EAAgC,MAAA,KAAW,eAAe,cAAc,CAAA;AAAA,QACtF,aAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBACAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAoB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IACxC,IAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,oBAAA,CAAG,UAAA,EAAY,MAAA,KAAW,OAAA,IAAW,YAAY,CAAA,EAAI,QAAA,EAAA,IAAA,EAAK,CAAA,GACzE;AAAA,GAAA,EACN,CAAA;AAGF,EAAA,uBACEQ,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWR,oBAAA,CAAG,oBAAA,CAAqB,EAAE,MAAA,EAAQ,aAAA,EAAe,OAAA,CAAQ,OAAO,CAAA,EAAG,CAAA,EAAG,SAAS,CAAA;AAAA,MAC1F,OAAO,YAAA,IAAgB,IAAA;AAAA,MAEtB,QAAA,EAAA;AAAA,QAAA,OAAA,mBACCH,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAU,iHAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA,4BAGHA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAA4C,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QAElE,2BACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAY,UAAU,IAAI,CAAA,CAAA;AAAA,YAC1B,OAAA,EAAS,CAAC,KAAA,KAAU;AAClB,cAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,cAAA,QAAA,EAAS;AAAA,YACX,CAAA;AAAA,YACA,SAAA,EAAWG,oBAAA;AAAA,cACT,kDAAA;AAAA,cACA,sBAAA;AAAA,cACA,6DAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,UAAA,EAAW,IAAA,EAAK,MAAA,EAC7D,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAE,mBAAA;AAAA,gBACF,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,KAAA;AAAA,gBACZ,aAAA,EAAc;AAAA;AAAA,aAChB,EACF;AAAA;AAAA,SACF,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;ACxDO,IAAM,aAAA,GAAgB;AAAA,EAC3B,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,aAAA,EAAe,gBAAA;AAAA,EACf,IAAA,EAAM,MAAA;AAAA,EACN,cAAA,EAAgB;AAClB;AAIO,IAAM,eAAA,GAAgD,MAAA,CAAO,MAAA,CAAO,aAAa;AAEjF,IAAM,oBAAA,GAA0D;AAAA,EACrE,CAAC,aAAA,CAAc,MAAM,GAAGqB,gBAAA;AAAA,EACxB,CAAC,aAAA,CAAc,MAAM,GAAGC,gBAAA;AAAA,EACxB,CAAC,aAAA,CAAc,OAAO,GAAGA,gBAAA;AAAA,EACzB,CAAC,aAAA,CAAc,QAAQ,GAAGC,oBAAA;AAAA,EAC1B,CAAC,aAAA,CAAc,IAAI,GAAGC,qBAAA;AAAA,EACtB,CAAC,aAAA,CAAc,OAAO,GAAGC,sBAAA;AAAA,EACzB,CAAC,aAAA,CAAc,KAAK,GAAGC,oBAAA;AAAA,EACvB,CAAC,aAAA,CAAc,MAAM,GAAGC,kBAAA;AAAA,EACxB,CAAC,aAAA,CAAc,QAAQ,GAAGC,iBAAA;AAAA,EAC1B,CAAC,aAAA,CAAc,IAAI,GAAGC,gBAAA;AAAA,EACtB,CAAC,aAAA,CAAc,SAAS,GAAGC,sBAAA;AAAA,EAC3B,CAAC,aAAA,CAAc,QAAQ,GAAGC,oBAAA;AAAA,EAC1B,CAAC,aAAA,CAAc,aAAa,GAAGC,oBAAA;AAAA,EAC/B,CAAC,aAAA,CAAc,IAAI,GAAGlB,qBAAAA;AAAA,EACtB,CAAC,aAAA,CAAc,cAAc,GAAGmB;AAClC;AAEO,SAAS,qBAAqB,IAAA,EAAiC;AACpE,EAAA,OAAO,qBAAqB,IAAI,CAAA;AAClC;AAMO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM,IAAA,GAAO,qBAAqB,IAAI,CAAA;AACtC,EAAA,uBACEjC,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,aAAa,WAAA,IAAe,GAAA;AAAA,MAC5B,SAAA,EAAWG,oBAAA,CAAG,UAAA,EAAY,SAAS,CAAA;AAAA,MAClC,GAAG;AAAA;AAAA,GACN;AAEJ;ACzHO,IAAM,eAAeE,mBAAAA,CAAG;AAAA,EAC7B,IAAA,EAAM;AAAA,IACJ,qEAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,yBAAA;AAAA,MACJ,EAAA,EAAI,oBAAA;AAAA,MACJ,EAAA,EAAI,oBAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,mCAAA;AAAA,MACP,MAAA,EAAQ,6CAAA;AAAA,MACR,IAAA,EAAM,gDAAA;AAAA,MACN,KAAA,EAAO,gDAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,OAAA;AACvC,CAAC;AAgBM,SAAS,MAAA,CAAO;AAAA,EACrB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAgB;AAId,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI6B,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAG,CAAA,IAAK,SAAA,KAAc,GAAA;AAEjD,EAAA,uBACElC,cAAAA,CAAC,MAAA,EAAA,EAAM,GAAG,KAAA,EAAO,WAAWG,oBAAA,CAAG,YAAA,CAAa,EAAE,IAAA,EAAM,MAAM,CAAA,EAAG,SAAS,CAAA,EACnE,uCACCH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAK,GAAA,IAAO,MAAA;AAAA,MACZ,GAAA;AAAA,MACA,SAAA,EAAU,wBAAA;AAAA,MACV,OAAA,EAAS,MAAM,YAAA,CAAa,GAAA,IAAO,IAAI;AAAA;AAAA,GACzC,GAEC,YAAY,QAAA,EAEjB,CAAA;AAEJ;ACrEO,IAAM,oBAAoBK,mBAAAA,CAAG;AAAA,EAClC,IAAA,EAAM,mBAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,cAAA;AAAA,MACJ,EAAA,EAAI,YAAA;AAAA,MACJ,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA;AAC3B,CAAC;AAsBM,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,GAAA,GAAM,CAAA;AAAA,EACN,IAAA,GAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,MAAA;AACxC,EAAA,uBACEM,eAAAA,CAAC,MAAA,EAAA,EAAM,GAAG,KAAA,EAAO,SAAA,EAAWR,oBAAA,CAAG,iBAAA,CAAkB,EAAE,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA,EAClE,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBAClBH,cAAAA,CAAC,MAAA,EAAA,EAA+B,SAAA,EAAU,wCAAA,EACxC,QAAA,kBAAAA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,IAAA,EAAM,OAAO,IAAA,IAAQ,OAAA;AAAA,QACrB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,GAAA,EAAK,OAAO,GAAA,IAAO,IAAA;AAAA,QACnB,GAAA,EAAK,OAAO,GAAA,IAAO;AAAA;AAAA,KACrB,EAAA,EAPS,MAAA,CAAO,GAAA,IAAO,KAQzB,CACD,CAAA;AAAA,IACA,WAAW,CAAA,oBACVA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAO,MAAY,IAAA,EAAK,OAAA,EAAQ,UAAU,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,EAC7D;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjDO,IAAM,qBAAqBK,mBAAAA,CAAG;AAAA,EACnC,KAAA,EAAO;AAAA,IACL,GAAA,EAAK;AAAA,MACH,8CAAA;AAAA,MACA,2CAAA;AAAA,MACA,mDAAA;AAAA,MACA,oBAAA;AAAA,MACA,wDAAA;AAAA;AAAA;AAAA,MAGA,6BAAA;AAAA,MACA,0EAAA;AAAA,MACA,iFAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,EAAE,OAAA,EAAS,2BAAA,EAA4B;AAAA,MAC3C,EAAA,EAAI,EAAE,OAAA,EAAS,2BAAA;AAA4B,KAC7C;AAAA,IACA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAE,GAAA,EAAK,mDAAA,EAAoD;AAAA,MACjE,KAAA,EAAO,EAAE,GAAA,EAAK,oBAAA;AAAqB,KACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,UAAA,EAAY;AAAA,MACV,OAAO,EAAC;AAAA,MACR,IAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQJ,GAAA,EAAK,4GAAA;AAAA,QACL,OAAA,EAAS;AAAA;AACX,KACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,YAAA,EAAc;AAAA,MACZ,MAAM,EAAC;AAAA,MACP,KAAA,EAAO;AAAA,QACL,GAAA,EAAK;AAAA;AACP;AACF,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,EAAE,YAAY,MAAA,EAAQ,OAAA,EAAS,MAAM,KAAA,EAAO,EAAE,GAAA,EAAK,aAAA,EAAc,EAAE;AAAA;AAAA,IAEnE,EAAE,cAAc,KAAA,EAAO,OAAA,EAAS,MAAM,KAAA,EAAO,EAAE,GAAA,EAAK,8BAAA,EAA+B;AAAE,GACvF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,SAAS,KAAA,EAAO,UAAA,EAAY,OAAA,EAAS,YAAA,EAAc,IAAA;AACpF,CAAC;AAaM,IAAM,eAAA,GAA6C;AAAA,EACxD,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,IAAM,cAAA,GAA4C;AAAA,EACvD,EAAA,EAAI,cAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAUO,IAAM,gBAAA,GAA8C;AAAA,EACzD,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAQO,IAAM,gBAAA,GAAmB;AAEzB,IAAM,eAAA,GAAkB;AAExB,IAAM,gBAAA,GAAmB;AAOzB,SAAS,UAAA,GAAa;AAC3B,EAAA,uBACEL,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,8BAAA,EAA+B,IAAA,EAAK,MAAA,EACjF,QAAA,kBAAAA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,cAAA;AAAA,MACF,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe;AAAA;AAAA,GACjB,EACF,CAAA;AAEJ;ACpHA,IAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAKmC,iBAAK,CAAA;AAGpC,IAAM,gBAAgB,IAAI,GAAA;AAAA,EACxB,UAAA,CAAW,IAAI,CAAC,IAAA,KAAS,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG,IAAI,CAAC;AAClD,CAAA;AAEA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AACpD;AAOO,SAAS,kBAAkB,IAAA,EAAoD;AACpF,EAAA,MAAM,SAAA,GAAY,sBAAsB,IAAI,CAAA;AAC5C,EAAA,OAAO,SAAA,GAAYA,iBAAA,CAAM,SAAS,CAAA,GAAI,IAAA;AACxC;AAGO,SAAS,sBAAsB,IAAA,EAAwD;AAC5F,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,IAAK,IAAA;AAC/C;AAGA,IAAM,SAAA,GAAY,GAAA;AA6BlB,IAAM,YAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,sBAAA;AAAA,EACd,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,IAAA;AAAA,EACb,IAAA,GAAO,IAAA;AAAA,EACP,UAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,EAAc,SAAA;AAAA,EACd;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,SAAS,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAaE,aAA0B,IAAI,CAAA;AAEjD,EAAA,MAAMC,UAAS,kBAAA,CAAmB,EAAE,MAAM,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAC1E,EAAA,MAAM,YAAA,GAAe,sBAAsB,KAAK,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,YAAA,GAAeF,iBAAA,CAAM,YAAY,CAAA,GAAI,IAAA;AAE1D,EAAA,MAAMG,QAAAA,GAAUC,cAAQ,MAAM;AAC5B,IAAA,MAAM,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,IAAA,OAAO,CAAA,GAAI,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,GAAI,UAAA;AAAA,EACxE,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,MAAM,OAAA,GAAUD,QAAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACtC,EAAA,MAAM,WAAA,GAAcA,QAAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,MAAA;AAE7C,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAkB;AAC9B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAiB;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,QAAA,CAAS,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAA4B;AAChD,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACvB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,GAAe,OAAA,CAAQ,YAAY,OAAA,CAAQ,YAAA;AACrE,IAAA,IAAI,YAAY,GAAA,EAAK,QAAA,CAAS,CAAC,OAAA,KAAY,UAAU,SAAS,CAAA;AAAA,EAChE,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAgC;AAC5C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAA,CAAK,KAAK,CAAA;AACV,IAAA,UAAA,CAAW,SAAS,KAAA,EAAM;AAAA,EAC5B,CAAA;AAEA,EAAA,uBACE3B,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWR,oBAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA,EACrD,QAAA,EAAA;AAAA,IAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,IAE9D,0BACCxC,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAe,MAAA;AAAA,QACf,YAAA,EAAY,SAAA,KAAc,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,MAAA,CAAA;AAAA,QAC9D,OAAO,YAAA,IAAgB,WAAA;AAAA,QACvB,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA;AAAA,QAC3B,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,SAAA,EAAWG,oBAAA;AAAA,UACTkC,QAAO,GAAA,EAAI;AAAA,UACX,0DAAA;AAAA,UACA,UAAA,KAAe,MAAA,GAAS,aAAA,GAAgB,YAAA,CAAa,IAAI,CAAA;AAAA,UACzD;AAAA,SACF;AAAA,QAEC,QAAA,EAAA,YAAA,mBACCrC,cAAAA,CAAC,YAAA,EAAA,EAAa,eAAW,IAAA,EAAC,SAAA,EAAU,mBAAA,EAAoB,CAAA,mBAExDA,cAAAA,CAACyC,kBAAA,EAAA,EAAO,aAAA,EAAW,IAAA,EAAC,WAAU,mBAAA,EAAoB;AAAA;AAAA,wBAItD9B,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAe,MAAA;AAAA,QACf,YAAA,EAAY,SAAA,KAAc,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,MAAA,CAAA;AAAA,QAC9D,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,MAAM,IAAA,CAAK,CAAC,MAAM,CAAA;AAAA,QAC3B,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,SAAA,EAAWR,oBAAA;AAAA;AAAA;AAAA,UAGTkC,QAAO,GAAA,EAAI;AAAA,UACXA,QAAO,OAAA,EAAQ;AAAA,UACf,yDAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,YAAA,mBACCrC,cAAAA,CAAC,YAAA,EAAA,EAAa,eAAW,IAAA,EAAC,SAAA,EAAU,8BAA6B,CAAA,GAC/D,IAAA;AAAA,0BACJA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,oBAAA,CAAG,yBAAA,EAA2B,YAAA,GAAe,UAAA,GAAa,YAAY,CAAA,EACpF,QAAA,EAAA,YAAA,IAAgB,WAAA,EACnB,CAAA;AAAA,0BACAH,eAAC,UAAA,EAAA,EAAW;AAAA;AAAA;AAAA,KACd;AAAA,IAGD,8BAAcA,cAAAA,CAAC,OAAE,SAAA,EAAW,eAAA,EAAkB,uBAAY,CAAA,GAAO,IAAA;AAAA,IACjE,YAAA,IAAgB,eAAe,MAAA,mBAC9BA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GAC5C,IAAA;AAAA,oBAEJW,eAAAA;AAAA,MAAC+B,2BAAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,YAAA,EAAc,IAAA;AAAA,QACd,UAAA;AAAA,QACA,MAAA,EAAQ,CAAA;AAAA,QACR,SAAA,EAAU,cAAA;AAAA,QACV,SAAA,EAAWvC,oBAAA;AAAA,UACT,wDAAA;AAAA,UACA,+BAAA;AAAA,UACA,qEAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAQ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWR,oBAAA;AAAA,kBACT,mBAAmB,EAAE,IAAA,EAAM,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,kBACvC,wDAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,cAAAA,CAAC2C,kBAAA,EAAA,EAAO,aAAA,EAAW,IAAA,EAAC,WAAU,8BAAA,EAA+B,CAAA;AAAA,kCAG7D3C,cAAAA;AAAA,oBAAC4C,yBAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAS,IAAA;AAAA,sBACT,YAAA,EAAW,cAAA;AAAA,sBACX,KAAA,EAAO,KAAA;AAAA,sBACP,UAAU,CAAC,KAAA,KAAU,MAAA,CAAO,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,sBAC9C,WAAA,EAAY,oBAAA;AAAA,sBACZ,SAAA,EAAWzC,oBAAA;AAAA,wBACT,sDAAA;AAAA,wBACA,iCAAA;AAAA,wBACA,eAAA,CAAgB;AAAA;AAClB;AAAA;AACF;AAAA;AAAA,aACF;AAAA,YACC,UAAA,IAAc,+BACbQ,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,MAAM,IAAA,CAAK,IAAI,CAAA;AAAA,gBACxB,SAAA,EAAWR,oBAAA;AAAA,kBACT,2EAAA;AAAA,kBACA,oDAAA;AAAA,kBACA,mCAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,eAACkB,aAAAA,EAAA,EAAE,aAAA,EAAW,IAAA,EAAC,WAAU,QAAA,EAAS,CAAA;AAAA,kBAAE;AAAA;AAAA;AAAA,aAEtC,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BAKAlB,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,0BAAA;AAAA,cACV,QAAA,EAAU,CAAC,KAAA,KAAU,YAAA,CAAa,MAAM,aAAa,CAAA;AAAA,cAErD,QAAA,kBAAAA,cAAAA;AAAA,gBAAC6C,2BAAA;AAAA,gBAAA;AAAA,kBACC,YAAA,EAAW,OAAA;AAAA,kBACX,MAAA,EAAO,MAAA;AAAA,kBACP,aAAA,EAAc,QAAA;AAAA,kBACd,YAAA,EAAc,+BAAe,IAAI,GAAA,CAAI,CAAC,YAAY,CAAC,CAAA,mBAAI,IAAI,GAAA,EAAI;AAAA,kBAC/D,iBAAA,EAAmB,CAAC,IAAA,KAAS;AAC3B,oBAAA,IAAI,SAAS,KAAA,EAAO;AACpB,oBAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;AAGxB,oBAAA,IAAI,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,IAAsB,CAAA;AAAA,kBACrD,CAAA;AAAA,kBACA,SAAA,EAAU,uCAAA;AAAA,kBACV,gBAAA,EAAkB,sBAChB7C,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWG,oBAAA,CAAG,kCAAA,EAAoC,eAAe,CAAA,EAAG,QAAA,EAAA,gBAAA,EAEzE,CAAA;AAAA,kBAGD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS;AACrB,oBAAA,MAAM,IAAA,GAAOgC,kBAAM,IAAI,CAAA;AACvB,oBAAA,uBACEnC,cAAAA;AAAA,sBAAC8C,+BAAA;AAAA,sBAAA;AAAA,wBAEC,EAAA,EAAI,IAAA;AAAA,wBACJ,SAAA,EAAW,IAAA;AAAA,wBAIX,YAAA,EAAY,IAAA;AAAA,wBACZ,SAAA,EAAW3C,oBAAA;AAAA,0BACT,4DAAA;AAAA,0BACA,6BAAA;AAAA,0BACA,yDAAA;AAAA,0BACA,6EAAA;AAAA,0BACA,uFAAA;AAAA,0BACA;AAAA,yBACF;AAAA,wBAEA,0BAAAH,cAAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,QAAA,EAAS;AAAA,uBAAA;AAAA,sBAhBhC;AAAA,qBAiBP;AAAA,kBAEJ,CAAC;AAAA;AAAA;AACH;AAAA,WACF;AAAA,UAEC,WAAA,GAAc,oBACbW,eAAAA,CAAC,OAAE,SAAA,EAAWR,oBAAA,CAAG,WAAA,EAAa,eAAe,CAAA,EAC1C,QAAA,EAAA;AAAA,YAAA,WAAA,CAAY,cAAA,EAAe;AAAA,YAAE;AAAA,WAAA,EAChC,CAAA,GACE;AAAA;AAAA;AAAA;AACN,GAAA,EACF,CAAA;AAEJ;ACvTO,IAAM,cAAcE,mBAAAA,CAAG;AAAA,EAC5B,IAAA,EAAM;AAAA,IACJ,kCAAA;AAAA,IACA,6CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,mDAAA;AAAA,MACT,OAAA,EAAS,qDAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,kCAAA;AAAA,QACA,wEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,gCAAA;AAAA,QACA,yEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,gCAAA;AAAA,QACA,yEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,8BAAA;AAAA,QACA,wEAAA;AAAA,QACA;AAAA,OACF;AAAA;AAAA;AAAA;AAAA,MAIA,MAAA,EAAQ;AAAA,QACN,2CAAA;AAAA,QACA,uEAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA;AAAA,IAEA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,sEAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,iBAAiB,EAAE,OAAA,EAAS,WAAW,KAAA,EAAO,MAAA,EAAQ,QAAQ,IAAA;AAChE,CAAC;AAYD,IAAM,SAAA,GAAmE;AAAA,EACvE,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,aAAA;AAAA,EACR,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ,aAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,KAAA,CAAM;AAAA,EACpB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAe;AACb,EAAA,MAAM,IAAA,GAAO,IAAA,GAAO,iBAAA,CAAkB,IAAI,CAAA,GAAI,IAAA;AAC9C,EAAA,MAAM0C,SAAAA,GAAkD,KAAA,GAAQ,QAAA,GAAY,OAAA,IAAW,SAAA;AACvF,EAAA,MAAM,cAAc,KAAA,GAAS,EAAE,GAAG,KAAA,EAAO,eAAA,EAAiB,OAAM,GAAsB,KAAA;AAItF,EAAA,MAAM,OAAA,GAAU,MAAA,KAAW,KAAA,IAAS,CAAC,IAAA;AACrC,EAAA,uBACEpC,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,KAAA,EAAO,WAAA;AAAA,MACP,SAAA,EAAWR,oBAAA;AAAA,QACT,YAAY,EAAE,OAAA,EAAS4C,SAAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,QAChD,UAAU,IAAA,GAAO,eAAA;AAAA,QACjB;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAO/C,cAAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAWG,oBAAA,CAAG,iBAAA,EAAmB,SAAA,CAAU4C,SAAQ,CAAC,CAAA,EAAG,CAAA,GAAK,IAAA;AAAA,QACrF;AAAA;AAAA;AAAA,GACH;AAEJ;AC7EA,SAAS,YAAY,MAAA,EAAqB;AACxC,EAAA,OAAO;AAAA,IACL,GAAI,OAAO,OAAA,GAAU,EAAE,SAAS,MAAA,CAAO,OAAA,KAAY,EAAC;AAAA,IACpD,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,IAC9C,GAAI,OAAO,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,GAAI,EAAC;AAAA,IAC/D,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,IAC9C,GAAI,OAAO,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,KAAS;AAAC,GAC7C;AACF;AA4BO,SAAS,gBAAA,CAAgC;AAAA,EAC9C,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,cAAA;AAAA,EACd,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,mBAAA,GAAsB,KAAA;AAAA,EACtB,IAAA,GAAO,IAAA;AAAA,EACP,UAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAMV,UAAS,kBAAA,CAAmB,EAAE,MAAM,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAC1E,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AACN,EAAA,MAAM,SAAA,GAAY,UAAA,KAAe,MAAA,GAAS,cAAA,GAAiB,eAAe,IAAI,CAAA;AAC9E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAaE,aAAuB,IAAI,CAAA;AAE9C,EAAAY,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW,UAAA,CAAW,OAAA,EAAS,KAAA,EAAM;AAAA,EAG3C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,YAAY,CAAA;AACxC,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAA,CAAO,CAAC,MAAM,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AACnE,EAAA,MAAM,cAAA,GAAiB,mBAAA,GACnB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,GAC5C,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAU;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,WAAW,CAAA;AAChC,IAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAqC;AAC7D,IAAA,IAAI,UAAA,EAAY;AAChB,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC/D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB;AAAA,EACF,CAAA;AAEA,EAAA,uBACErC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWR,oBAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA,EACrD,QAAA,EAAA;AAAA,IAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,oBAE/D7B,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,MAAA;AAAA,QACf,eAAA,EAAc,SAAA;AAAA,QACd,iBAAe,UAAA,IAAc,MAAA;AAAA,QAC7B,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,QAC5B,OAAA,EAAS,MAAM,CAAC,UAAA,IAAc,UAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QACjD,SAAA,EAAW,gBAAA;AAAA,QACX,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,iBAAe,UAAA,IAAc,MAAA;AAAA,QAC7B,SAAA,EAAWR,oBAAA;AAAA,UACTkC,QAAO,GAAA,EAAI;AAAA,UACX,oDAAA;AAAA,UACA,SAAA;AAAA,UACA,iBAAiB,IAAI,CAAA;AAAA,UACrB,MAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,eAAA,CAAgB,MAAA,KAAW,CAAA;AAAA;AAAA;AAAA;AAAA,4BAI1BrC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,oBAAA,CAAG,6BAA6B,eAAA,CAAgB,IAAI,CAAC,CAAA,EACnE,QAAA,EAAA,WAAA,EACH;AAAA,cAEA,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,qBACnBH,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cAEE,GAAG,YAAY,CAAC,CAAA;AAAA,cACjB,QAAA,EAAU,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,cAC3B,UAAA;AAAA,cAEC,QAAA,EAAA,CAAA,CAAE;AAAA,aAAA;AAAA,YALE,CAAA,CAAE;AAAA,WAOV,CAAA;AAAA,0BAEHA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBACd,QAAA,kBAAAA,cAAAA,CAAC,cAAW,CAAA,EACd;AAAA;AAAA;AAAA,KACF;AAAA,IAEC,8BAAcA,cAAAA,CAAC,OAAE,SAAA,EAAW,eAAA,EAAkB,uBAAY,CAAA,GAAO,IAAA;AAAA,IACjE,YAAA,IAAgB,eAAe,MAAA,mBAC9BA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GAC5C,IAAA;AAAA,oBAEJA,cAAAA;AAAA,MAAC0C,2BAAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,YAAA,EAAc,SAAA;AAAA,QACd,UAAA;AAAA,QACA,MAAA,EAAQ,CAAA;AAAA,QACR,SAAA,EAAU,cAAA;AAAA,QACV,SAAA,EAAWvC,oBAAA;AAAA,UACT,0BAAA;AAAA,UACA,8CAAA;AAAA,UACA,+BAAA;AAAA,UACA,qEAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAAH,cAAAA;AAAA,UAAC6C,2BAAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,SAAA;AAAA,YAChD,aAAA,EAAc,UAAA;AAAA,YACd,YAAA,EAAc,WAAA;AAAA,YACd,iBAAA,EAAmB,CAAC,IAAA,KAAS;AAC3B,cAAA,IAAI,SAAS,KAAA,EAAO;AAClB,gBAAA,iBAAA,CAAkB,IAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACnD,gBAAA;AAAA,cACF;AACA,cAAA,iBAAA,CAAkB,IAAc,CAAA;AAAA,YAClC,CAAA;AAAA,YACA,SAAA,EAAU,qCAAA;AAAA,YACV,gBAAA,EAAkB,sBAChB7C,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWG,oBAAA,CAAG,WAAA,EAAa,eAAe,CAAA,EAAG,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,YAGvE,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,qBACnBH,cAAAA;AAAA,cAAC8C,+BAAAA;AAAA,cAAA;AAAA,gBAEC,IAAI,MAAA,CAAO,EAAA;AAAA,gBACX,WAAW,MAAA,CAAO,KAAA;AAAA,gBACjB,GAAI,MAAA,CAAO,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,KAAS,EAAC;AAAA,gBACjD,SAAA,EAAW3C,oBAAA;AAAA,kBACT,yBAAA;AAAA,kBACA,yBAAA;AAAA,kBACA,yCAAA;AAAA,kBACA,6BAAA;AAAA,kBACA,6BAAA;AAAA,kBACA,8BAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,kBAAAH,eAAC,KAAA,EAAA,EAAO,GAAG,YAAY,MAAM,CAAA,EAAI,iBAAO,KAAA,EAAM;AAAA,eAAA;AAAA,cAdzC,MAAA,CAAO;AAAA,aAgBf;AAAA;AAAA;AACH;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAQA,SAAS,cAAA,CAAe;AAAA,EACtB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,GAAG;AACL,CAAA,EAIG;AACD,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAO,GAAG,WAAA,CAAY,MAAM,CAAA,EAC3B,QAAA,EAAA;AAAA,oBAAAX,cAAAA,CAAC,UAAM,QAAA,EAAS,CAAA;AAAA,oBAChBA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,QAAA;AAAA,QACX,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,EAAS;AAAA,QACX,CAAA;AAAA,QACA,SAAA,EAAWG,oBAAA;AAAA,UACT,kDAAA;AAAA,UACA,uBAAA;AAAA,UACA,wDAAA;AAAA,UACA,6BAAA;AAAA,UACA,4CAAA;AAAA,UACA,iDAAA;AAAA;AAAA;AAAA,UAGA;AAAA,SACF;AAAA,QAEA,QAAA,kBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,UAAA,EAAW,IAAA,EAAK,MAAA,EAC7D,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,mBAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA,SAChB,EACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACzQO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,SAAA,GAAY,KAAK,SAAA,EAAW,GAAG,OAAM,EAAqB;AAC7F,EAAA,uBACEA,cAAAA;AAAA,IAACiD,+BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW9C,oBAAA;AAAA,QACT,yBAAA;AAAA,QACA,kCAAA;AAAA;AAAA,QAEA,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AACtB,QAAA,MAAM,MAAA,GAAS,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AACpC,QAAA,uBACEQ,eAAAA;AAAA,UAACuC,8BAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAU,yBAAA;AAAA,YAGV,gBAAc,MAAA,IAAU,MAAA;AAAA,YAEvB,QAAA,EAAA;AAAA,cAAA,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,CAAC,MAAA,mBAC3BlD,cAAAA;AAAA,gBAACmD,wBAAA;AAAA,gBAAA;AAAA,kBACC,MAAM,IAAA,CAAK,IAAA;AAAA,kBACX,SAAA,EAAWhD,oBAAA;AAAA,oBACT,wCAAA;AAAA,oBACA,gCAAA;AAAA,oBACA,gBAAA;AAAA,oBACA,yBAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,kCAGRH,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAWG,oBAAA,CAAG,MAAA,IAAU,wBAAwB,CAAA;AAAA,kBAChD,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,kBAE/B,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,eACR;AAAA,cAED,CAAC,MAAA,mBACAH,cAAAA,CAAC,MAAA,EAAA,EAAK,eAAW,IAAA,EAAC,SAAA,EAAU,wBAAA,EACzB,QAAA,EAAA,SAAA,EACH,CAAA,GACE;AAAA;AAAA,WAAA;AAAA,UA/BC,IAAA,CAAK;AAAA,SAgCZ;AAAA,MAEJ,CAAC;AAAA;AAAA,GACH;AAEJ;ACxEO,IAAMoD,cAAa/C,mBAAAA,CAAG;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,+BAAA;AAAA,IACA,0CAAA;AAAA,IACA,6BAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,EAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,iBAAA;AAAA,QACA,wEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS;AAAA;AAEb,CAAC;AAKM,SAAS,KAAK,EAAE,OAAA,EAAS,SAAA,EAAW,GAAG,OAAM,EAAc;AAChE,EAAA,uBAAOL,cAAAA,CAAC,KAAA,EAAA,EAAK,GAAG,KAAA,EAAO,SAAA,EAAWG,oBAAA,CAAGiD,WAAAA,CAAW,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA;AAC5E;AAOA,IAAM,sBAAsB/C,mBAAAA,CAAG;AAAA,EAC7B,MAAA,EAAQ+C,WAAAA;AAAA,EACR,IAAA,EAAM;AAAA,IACJ,8CAAA;AAAA,IACA,6DAAA;AAAA,IACA,wDAAA;AAAA,IACA,wBAAA;AAAA,IACA,4CAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA;AAIM,SAAS,cAAc,EAAE,OAAA,EAAS,SAAA,EAAW,GAAG,OAAM,EAAuB;AAClF,EAAA,uBACEpD,cAAAA;AAAA,IAACqD,0BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVlD,oBAAA;AAAA,QACE,mBAAA,CAAoB,EAAE,OAAA,EAAS,CAAA;AAAA,QAC/B,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA;AAC7D;AAAA,GAEJ;AAEJ;AAWO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AAClF,EAAA,uBACEH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA;AAAA,QACT,mCAAA;AAAA,QACA,gCAAA;AAAA,QACA,0EAAA;AAAA,QACA,gEAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAOO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AACnF,EAAA,uBAAOH,eAAC,KAAA,EAAA,EAAK,GAAG,OAAO,SAAA,EAAWG,oBAAA,CAAG,yBAAA,EAA2B,SAAS,CAAA,EAAG,CAAA;AAC9E;AAOO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AAClF,EAAA,uBACEH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA;AAAA,QACT,2CAAA;AAAA,QACA,WAAA;AAAA,QACA,oCAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAMO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AACnF,EAAA,uBACEH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA;AAAA,QACT,mCAAA;AAAA,QACA,8DAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAEO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAuC;AACrF,EAAA,uBACEH,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA;AAAA,QACT,+EAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAEO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAuC;AAC5F,EAAA,uBACEH,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA;AAAA,QACT,6EAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAEO,SAAS,QAAA,CAAS,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AAChF,EAAA,uBAAOH,eAAC,KAAA,EAAA,EAAK,GAAG,OAAO,SAAA,EAAWG,oBAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA,EAAG,CAAA;AAC5F;AC/IA,IAAM,aAAA,GAAsD;AAAA,EAC1D,KAAA,EAAOmB,gBAAAA;AAAA,EACP,KAAA,EAAOgC,gBAAA;AAAA,EACP,QAAA,EAAUC,yBAAA;AAAA,EACV,QAAA,EAAUC,oBAAA;AAAA,EACV,QAAA,EAAUC,gBAAA;AAAA,EACV,SAAA,EAAWC,kBAAA;AAAA,EACX,SAAA,EAAWC,0BAAA;AAAA,EACX,CAAA,EAAGC,kBAAA;AAAA,EACH,OAAA,EAASC,eAAA;AAAA,EACT,cAAA,EAAgBC,iBAAA;AAAA,EAChB,aAAA,EAAeA,iBAAA;AAAA,EACf,eAAA,EAAiBA,iBAAA;AAAA,EACjB,eAAA,EAAiBA,iBAAA;AAAA,EACjB,KAAA,EAAOC,sBAAA;AAAA,EACP,KAAA,EAAOC;AACT,CAAA;AAGO,SAAS,YAAY,OAAA,EAA6B;AACvD,EAAA,OAAO,aAAA,CAAc,OAAO,CAAA,IAAKL,0BAAA;AACnC;AAWO,SAAS,WAAA,CAAY,EAAE,OAAA,EAAS,SAAA,EAAW,OAAM,EAAqB;AAC3E,EAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAChC,EAAA,OAAO,KAAA,KAAU,MAAA,mBACf3D,cAAAA,CAAC,IAAA,EAAA,EAAK,WAAWG,oBAAA,CAAG,QAAA,EAAU,SAAS,CAAA,EAAG,IAAA,EAAK,KAAA,EAAM,cAAY,KAAA,EAAO,CAAA,mBAExEH,cAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAWG,qBAAG,QAAA,EAAU,SAAS,CAAA,EAAG,aAAA,EAAW,IAAA,EAAC,CAAA;AAE1D;ACxDO,SAAS,SAAS,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,OAAM,EAAkB;AACzE,EAAA,uBACEH,cAAAA;AAAA,IAACiE,4BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACV9D,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQE,gEAAA;AAAA,QACA,8CAAA;AAAA,QACA,+DAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA,CAAC,WAAA,qBACAQ,eAAAA,CAAAQ,qBAAA,EACE,QAAA,EAAA;AAAA,wBAAAnB,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAWG,oBAAA;AAAA,cACT,2DAAA;AAAA,cACA,6CAAA;AAAA,cACA,cAAA;AAAA,cACA,oEAAA;AAAA;AAAA,cAEA,iCAAA;AAAA;AAAA,cAEA,+DAAA;AAAA,cACA,yEAAA;AAAA;AAAA,cAEA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA,WAAA,CAAY,kCACXH,cAAAA,CAAC,UAAK,SAAA,EAAU,6BAAA,EAA8B,oBAE9CA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,WAAA;AAAA,gBACR,SAAA,EAAWG,oBAAA;AAAA,kBACT,qDAAA;AAAA,kBACA,WAAA,CAAY,aAAa,aAAA,GAAgB;AAAA,iBAC3C;AAAA,gBACA,aAAA,EAAW,IAAA;AAAA,gBAEX,QAAA,kBAAAH,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,CAAA,EAAE,2BAAA;AAAA,oBACF,MAAA,EAAO,cAAA;AAAA,oBACP,WAAA,EAAY,KAAA;AAAA,oBACZ,aAAA,EAAc,OAAA;AAAA,oBACd,cAAA,EAAe,OAAA;AAAA,oBACf,IAAA,EAAK;AAAA;AAAA;AACP;AAAA;AACF;AAAA,SAEJ;AAAA,QACC;AAAA,OAAA,EACH;AAAA;AAAA,GAEJ;AAEJ;ACnDO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,uBACEW,eAAAA;AAAA,IAACuD,iCAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACV/D,oBAAA,CAAG,YAAA,EAAc,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI,SAAS,CAAA;AAAA,MAGtF,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAC/DxC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAc,QAAA,EAAS,CAAA;AAAA,QACrC,WAAA,mBACCA,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,+BAAef,cAAAA,CAACmE,kCAAW,SAAA,EAAW,gBAAA,EAAmB,wBAAa,CAAA,GAAgB;AAAA;AAAA;AAAA,GACzF;AAEJ;AClBA,IAAM,IAAA,GAAO,oBAAA;AACb,IAAM,IAAA,GAAO,oBAAA;AAMN,SAAS,kBAAkB,IAAA,EAAgD;AAChF,EAAA,MAAM,GAAA,GAAA,CAAO,IAAA,IAAQ,EAAA,EAAI,IAAA,EAAK;AAC9B,EAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,IAAI,GAAA,GAAM,CAAC,CAAA,EAAG,OAAO,IAAI,GAAA,CAAI,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC3B,EAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,EAAG;AACd,IAAA,MAAM,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY;AACvC,IAAA,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,IAAA;AACT;AAuBO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,SAAA;AAAA,EACd,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,IAAA,GAAO,IAAA;AAAA,EACP,UAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,SAAA,GAAY,kBAAkB,KAAK,CAAA;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIjC,cAAAA,CAAS,aAAa,EAAE,CAAA;AAClD,EAAA,MAAM,SAAA,GAAYE,aAAyB,IAAI,CAAA;AAI/C,EAAAY,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,CAAC,YAAa,iBAAA,CAAkB,OAAO,MAAM,SAAA,GAAY,OAAA,GAAW,aAAa,EAAI,CAAA;AAAA,EAChG,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,iBAAiB,KAAA,CAAM,IAAA,OAAW,EAAA,IAAM,iBAAA,CAAkB,KAAK,CAAA,KAAM,IAAA;AAC3E,EAAA,MAAM,UAAU,SAAA,IAAa,cAAA;AAC7B,EAAA,MAAMX,UAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,CAAA;AAC/D,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AAEN,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB;AAC7B,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,EAAI;AACtB,MAAA,IAAI,SAAA,KAAc,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC7B,IAAA,MAAM,GAAA,GAAM,kBAAkB,IAAI,CAAA;AAClC,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,SAAA,WAAoB,GAAG,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,GAAA,GAAM,kBAAkB,KAAK,CAAA;AACnC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,IAAA,QAAA,CAAS,GAAG,CAAA;AACZ,IAAA,IAAI,GAAA,KAAQ,SAAA,EAAW,QAAA,CAAS,GAAG,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAiB;AAC7B,IAAA,MAAM,GAAA,GAAM,kBAAkB,IAAI,CAAA;AAClC,IAAA,IAAI,QAAQ,IAAA,EAAM;AAClB,IAAA,QAAA,CAAS,GAAG,CAAA;AACZ,IAAA,IAAI,GAAA,KAAQ,SAAA,EAAW,QAAA,CAAS,GAAG,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,uBACE1B,eAAAA;AAAA,IAACyD,6BAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,IAAA;AAAA,MACV,UAAA;AAAA,MACA,SAAA,EAAW,OAAA;AAAA,MAEX,MAAA,EAAQ,MAAA;AAAA,MACP,GAAI,SAAA,GAAY,EAAE,YAAA,EAAc,SAAA,KAAc,EAAC;AAAA,MAChD,SAAA,EAAWjE,oBAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,MAElD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAE/D7B,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,iBAAe,UAAA,IAAc,MAAA;AAAA,YAC7B,SAAA,EAAWR,oBAAA;AAAA,cACTkC,QAAO,GAAA,EAAI;AAAA,cACX,yBAAA;AAAA,cACA,IAAA,KAAS,OAAO,MAAA,GAAS,QAAA;AAAA,cACzB;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA1B,eAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,YAAA,EAAW,YAAA;AAAA,kBACX,QAAA,EAAU,UAAA;AAAA,kBACV,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA,EAAS,KAAA,EAAM;AAAA,kBACxC,SAAA,EAAWR,oBAAA;AAAA,oBACT,kFAAA;AAAA,oBACA,6BAAA;AAAA,oBACA,+DAAA;AAAA,oBACA,6BAAA;AAAA,oBACA,IAAA,KAAS,OAAO,QAAA,GAAW,QAAA;AAAA,oBAC3B,YAAY,IAAA,GAAO;AAAA,mBACrB;AAAA,kBACA,KAAA,EAAO,SAAA,GAAY,EAAE,eAAA,EAAiB,WAAU,GAAI,MAAA;AAAA,kBAEnD,QAAA,EAAA;AAAA,oBAAA,SAAA,GAAY,uBAAOH,cAAAA,CAACqE,uBAAQ,aAAA,EAAW,IAAA,EAAC,WAAU,UAAA,EAAW,CAAA;AAAA,oCAI9DrE,cAAAA;AAAA,sBAAC,OAAA;AAAA,sBAAA;AAAA,wBACC,GAAA,EAAK,SAAA;AAAA,wBACL,IAAA,EAAK,OAAA;AAAA,wBACL,QAAA,EAAU,EAAA;AAAA,wBACV,aAAA,EAAW,IAAA;AAAA,wBACX,QAAA,EAAU,UAAA;AAAA,wBACV,OAAO,SAAA,IAAa,SAAA;AAAA,wBACpB,UAAU,CAAC,KAAA,KAAU,IAAA,CAAK,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,wBAC5C,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,eACF;AAAA,8BACAA,cAAAA;AAAA,gBAAC4C,yBAAAA;AAAA,gBAAA;AAAA,kBACC,WAAA;AAAA,kBACA,UAAA,EAAY,KAAA;AAAA,kBACZ,YAAA,EAAa,KAAA;AAAA,kBACb,SAAA,EAAWzC,oBAAA;AAAA,oBACTkC,QAAO,OAAA,EAAQ;AAAA,oBACf,sDAAA;AAAA,oBACA,MAAA;AAAA,oBACA,gBAAgB,IAAI;AAAA;AACtB;AAAA;AACF;AAAA;AAAA,SACF;AAAA,QAEC,WAAA,mBACCrC,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD;AAAA;AAAA;AAAA,GACN;AAEJ;AChJO,SAAS,QAAA,CAAwB;AAAA,EACtC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,sBAAA;AAAA,EACd,OAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,qBAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA,GAAe,YAAA;AAAA,EACf,SAAA;AAAA;AAAA;AAAA,EAGA,qBAAA,GAAwB,IAAA;AAAA,EACxB,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM9B,OAAAA,GAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,YAAY,CAAA;AAGtD,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AACN,EAAA,uBACE1B,eAAAA;AAAA,IAAC2D,4BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,qBAAA;AAAA,MACA,SAAA,EAAW,CAAC,WAAA,KACVnE,oBAAA;AAAA,QACE,0BAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAE/D7B,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWR,oBAAA;AAAA;AAAA;AAAA,cAGTkC,QAAO,GAAA,EAAI;AAAA,cACX,8BAAA;AAAA,cACA,WAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAArC,cAAAA;AAAA,gBAAC4C,yBAAAA;AAAA,gBAAA;AAAA,kBACC,WAAA;AAAA,kBACA,SAAA,EAAWzC,oBAAA;AAAA,oBACT,4CAAA;AAAA,oBACAkC,QAAO,OAAA,EAAQ;AAAA,oBACf;AAAA;AACF;AAAA,eACF;AAAA,8BACArC,cAAAA;AAAA,gBAACuE,0BAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAWpE,oBAAA;AAAA,oBACT,2CAAA;AAAA,oBACA,qBAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBAEA,QAAA,kBAAAH,eAAC,UAAA,EAAA,EAAW;AAAA;AAAA;AACd;AAAA;AAAA,SACF;AAAA,QAEC,WAAA,mBACCA,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD,IAAA;AAAA,wBAEJnE,cAAAA;AAAA,UAAC0C,2BAAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,CAAA;AAAA,YACR,SAAA,EAAWvC,oBAAA;AAAA,cACT,8BAAA;AAAA,cACA,8CAAA;AAAA,cACA,+BAAA;AAAA,cACA,qEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA;AAAA,cAAC6C,2BAAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qCAAA;AAAA,gBACV,gBAAA,EAAkB,sBAChB7C,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWG,oBAAA,CAAG,WAAA,EAAa,eAAe,CAAA,EAAI,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,gBAGjE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZQ,eAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBAEC,IAAI,MAAA,CAAO,EAAA;AAAA,oBACX,WAAW,MAAA,CAAO,KAAA;AAAA,oBACjB,GAAI,MAAA,CAAO,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,KAAS,EAAC;AAAA,oBAEjD,QAAA,EAAA;AAAA,sCAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,iBAAO,KAAA,EAAM,CAAA;AAAA,sBACxC,MAAA,CAAO,8BACNA,cAAAA,CAAC,UAAK,SAAA,EAAU,kDAAA,EACb,QAAA,EAAA,MAAA,CAAO,WAAA,EACV,CAAA,GACE,IAAA;AAAA,sBACH,OAAO,QAAA,mBAAWA,eAAC,YAAA,EAAA,EAAc,QAAA,EAAA,MAAA,CAAO,UAAS,CAAA,GAAkB;AAAA;AAAA,mBAAA;AAAA,kBAX/D,MAAA,CAAO;AAAA,iBAaf;AAAA;AAAA;AACH;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAaA,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAC3D,EAAA,MAAM,KAAA,GAAQwE,iBAAWC,wCAAoB,CAAA;AAC7C,EAAA,uBACEzE,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWG,oBAAA;AAAA,QACT,gDAAA;AAAA;AAAA;AAAA,QAGA,QAAA;AAAA,QACA,gDAAA;AAAA,QACA,gDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAIA,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MACxC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MACtC,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MACtC,SAAA,EAAW,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,MACpC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,CAAA,CAAE,eAAA,EAAgB;AAIlB,QAAA,KAAA,EAAO,KAAA,EAAM;AAAA,MACf,CAAA;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,uBACEH,cAAAA;AAAA,IAAC8C,+BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW3C,oBAAA;AAAA;AAAA;AAAA,QAGT,qBAAA;AAAA,QACA,yCAAA;AAAA,QACA,gDAAA;AAAA,QACA,yCAAA;AAAA,QACA,qDAAA;AAAA,QACA,qDAAA;AAAA,QACA,uDAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;;;AC9NA,IAAM,8BAAmC,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,EAAO,MAAM,CAAC,CAAA;AACvE,IAAM,uCAA4C,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAE7E,SAAS,WAAW,KAAA,EAAyB;AAClD,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,EAC1E;AACA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAClE,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uBAAuB,KAAK,CAAA,iIAAA;AAAA,KAE9B;AAAA,EACF;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,KAAA;AAC3B,EAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oBAAA,EAAuB,KAAK,CAAA,wDAAA,EAA2D,OAAO,CAAA,EAAA;AAAA,KAChG;AAAA,EACF;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAAA,EAC9E;AACA,EAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uBAAuB,KAAK,CAAA,oFAAA;AAAA,KAC9B;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACvC,EAAA,OAAO,EAAE,GAAA,EAAK,CAAA,IAAA,EAAO,OAAO,CAAA,CAAA,EAAI,GAAA,EAAK,SAAS,QAAA,EAAS;AACzD;;;AClCO,IAAM,gBAAA,uBAA4C,GAAA,CAAI;AAAA,EAC3D,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,aAAA,EAAgB,MAAM,GAAG,CAAA,qEAAA;AAAA,KAE3B;AAAA,EACF;AACF;;;AChCA,IAAI,MAAA;AAEG,SAAS,WAAA,GAAwB;AACtC,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,MAAA,GAAS,MAAA,EAAO;AAChB,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,MAAA,GAAmB;AAC1B,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,OAAA;AAC7C,EAAA,MAAM,KAAM,SAAA,CAAwD,aAAA;AACpE,EAAA,IAAI,IAAI,QAAA,EAAU;AAChB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,QAAQ,IAAI,KAAA,GAAQ,OAAA;AAAA,EAC5C;AACA,EAAA,MAAM,MAAA,GAAU,UAAoC,QAAA,IAAY,EAAA;AAChE,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA,GAAQ,OAAA;AACvC;;;ACXO,SAAS,iBAAiB,MAAA,EAAqC;AACpE,EAAA,IAAI,EAAE,MAAA,YAAkB,WAAA,CAAA,EAAc,OAAO,KAAA;AAC7C,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AACnB,EAAA,IAAI,QAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,IAAc,GAAA,KAAQ,UAAU,OAAO,IAAA;AACtE,EAAA,IAAI,MAAA,CAAO,mBAAmB,OAAO,IAAA;AAGrC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,iBAAiB,CAAA;AAClD,EAAA,IAAI,SAAS,EAAA,IAAM,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,kBAAkB,OAAO,IAAA;AACxE,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,OAAA,CAAQ,OAAsB,KAAA,EAA0B;AACtE,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAA,GAAa,QAAA,KAAa,KAAA,GAAQ,KAAA,CAAM,UAAU,KAAA,CAAM,OAAA;AAC9D,EAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,OAAO,MAAM,IAAA,KAAS,CAAA,GAAA,EAAM,KAAA,CAAM,GAAA,CAAI,aAAa,CAAA,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,MAAM,GAAA,CAAI,WAAA,EAAY,KAAM,KAAA,CAAM,IAAI,WAAA,EAAY;AAC3D;;;ACbA,IAAM,MAAA,uBAAa,GAAA,EAAqB;AACxC,IAAI,iBAAA,GAAoB,KAAA;AAExB,SAAS,gBAAgB,KAAA,EAA4B;AACnD,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,MAAA,EAAO,EAAG;AACrC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACtC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,OAAA,CAAQ,KAAA,EAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,wBAAA,EAAyB;AAC/B,MAAA,GAAA,CAAI,QAAQ,KAAK,CAAA;AACjB,MAAA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,cAAA,GAAuB;AAC9B,EAAA,IAAI,iBAAA,EAAmB;AACvB,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,eAAA,EAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AACrE,EAAA,iBAAA,GAAoB,IAAA;AACtB;AAEO,SAAS,QAAA,CAAS,OAAiB,OAAA,EAA8B;AACtE,EAAA,cAAA,EAAe;AACf,EAAA,MAAM,OAAO,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAG,KAAK,EAAC;AACvC,EAAA,MAAM,KAAA,GAAe,EAAE,KAAA,EAAO,OAAA,EAAQ;AACtC,EAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,EAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AAC1B,EAAA,OAAO,MAAM;AACX,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AACpC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,WAAA,CAAY,KAAK,CAAA;AACrC,IAAA,IAAI,GAAA,IAAO,CAAA,EAAG,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AACnC,IAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA;AAAA,EACnD,CAAA;AACF;;;ACtCO,SAAS,UAAA,CACd,KAAA,EACA,OAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AACpC,EAAA,MAAM,UAAA,GAAaiC,aAAO,OAAO,CAAA;AACjC,EAAAY,gBAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAAA,EACvB,CAAC,CAAA;AACD,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,IAAA,kBAAA,CAAmB,MAAM,CAAA;AACzB,IAAA,OAAO,SAAS,MAAA,EAAQ,CAAC,UAAU,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AACrB;AClBA,IAAI,OAAA,GAAU,KAAA;AACd,IAAI,SAAA,GAAY,KAAA;AAChB,IAAI,WAAA,GAAc,KAAA;AAClB,IAAM,SAAA,uBAAgB,GAAA,EAAc;AAEpC,SAAS,WAAA,GAAuB;AAC9B,EAAA,OAAO,OAAA,IAAW,SAAA;AACpB;AAEA,SAAS,iBAAA,GAA6B;AACpC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,IAAA,GAAa;AACpB,EAAA,KAAA,MAAW,CAAA,IAAK,WAAW,CAAA,EAAE;AAC/B;AAEA,SAAS,IAAA,CAAK,QAAiB,QAAA,EAAyB;AACtD,EAAA,IAAI,MAAA,KAAW,OAAA,IAAW,QAAA,KAAa,SAAA,EAAW;AAChD,IAAA,OAAA,GAAU,MAAA;AACV,IAAA,SAAA,GAAY,QAAA;AACZ,IAAA,IAAA,EAAK;AAAA,EACP;AACF;AAEA,SAAS,UAAU,CAAA,EAAwB;AACzC,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAA,GAAU,QAAA,KAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA;AAEnD,EAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,IAAU,CAAA,CAAE,QAAQ,SAAA,EAAW;AAC3C,IAAA,IAAA,CAAK,IAAA,EAAM,EAAE,QAAQ,CAAA;AACrB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,IAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAClB,IAAA;AAAA,EACF;AACA,EAAA,IAAA,CAAK,OAAA,EAAS,EAAE,QAAQ,CAAA;AAC1B;AAEA,SAAS,QAAQ,CAAA,EAAwB;AACvC,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAA,GAAU,QAAA,KAAa,KAAA,GAAQ,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA;AACnD,EAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,IAAU,CAAA,CAAE,QAAQ,SAAA,EAAW;AAC3C,IAAA,IAAA,CAAK,KAAA,EAAO,EAAE,QAAQ,CAAA;AACtB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,IAAA;AAAA,EACF;AACA,EAAA,IAAA,CAAK,OAAA,EAAS,EAAE,QAAQ,CAAA;AAC1B;AAEA,SAAS,MAAA,GAAe;AAItB,EAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AACnB;AAEA,SAAS,iBAAA,GAA0B;AACjC,EAAA,IAAI,WAAA,EAAa;AACjB,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,SAAA,EAAW,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/D,EAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3D,EAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AACtC,EAAA,WAAA,GAAc,IAAA;AAChB;AAEA,SAAS,UAAU,QAAA,EAAgC;AACjD,EAAA,iBAAA,EAAkB;AAClB,EAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,OAAO,MAAM;AACX,IAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,EAC3B,CAAA;AACF;AAEO,SAAS,kBAAA,GAA8B;AAC5C,EAAA,OAAO0B,0BAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,iBAAiB,CAAA;AACvE;AClFO,SAAS,IAAI,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,OAAM,EAAa;AAC/D,EAAA,uBACE1E,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA;AAAA,QACT,yCAAA;AAAA,QACA,iDAAA;AAAA,QACA,+CAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACFO,SAAS,YAAY,EAAE,KAAA,EAAO,IAAA,GAAO,QAAA,EAAU,WAAU,EAAqB;AACnF,EAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,SAAA,GAAY,QAAA,KAAa,KAAA,GAAQ,QAAA,GAAM,MAAA;AAC7C,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,GAAW,MAAA,CAAO,IAAI,WAAA,EAAY,GAAI,WAAA,CAAY,MAAA,CAAO,GAAG,CAAA;AACpF,EAAA,MAAM,KAAA,GAAQ,QAAA,KAAa,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAA,EAAG,QAAQ,CAAA,CAAA,GAAK,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACvF,EAAA,uBACEH,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWG,oBAAA;AAAA,QACT,SAAS,WAAA,IAAe,wCAAA;AAAA,QACxB;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC7B,EAAA,OAAO,IAAI,CAAC,CAAA,CAAG,aAAY,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAC5C;ACEO,SAAS,QAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,UAAS,EAAiB;AAC5E,EAAA,MAAM,UAAA,GAAaiC,aAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,kBAAkB,kBAAA,EAAmB;AAE3C,EAAA,UAAA,CAAW,OAAO,MAAM;AACtB,IAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAK,MAAA,GACP,IAAA,CAAK,aAAA,CAA2B,MAAM,IACrC,IAAA,CAAK,iBAAA;AACV,IAAA,EAAA,EAAI,KAAA,EAAM;AAAA,EACZ,CAAC,CAAA;AAED,EAAA,uBACEzB,gBAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAY,SAAA,EAAWR,oBAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA,EACnE,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,kCACCH,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAU,oIAAA;AAAA,QAEV,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,IAAA,EAAK,WAAA,EAAY,CAAA,EAC9C;AAAA;AAAA,KACF,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AC1DA,IAAM,QAAiB,EAAC;AACxB,IAAI2E,kBAAAA,GAAoB,KAAA;AAExB,SAASC,iBAAgB,KAAA,EAA4B;AACnD,EAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC5B,EAAA,IAAI,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA,EAAG;AACpC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,GAAA,CAAI,QAAQ,KAAK,CAAA;AACnB;AAEA,SAASC,eAAAA,GAAuB;AAC9B,EAAA,IAAIF,kBAAAA,EAAmB;AACvB,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,MAAA,CAAO,iBAAiB,SAAA,EAAWC,gBAAAA,EAAiB,EAAE,OAAA,EAAS,MAAM,CAAA;AACrE,EAAAD,kBAAAA,GAAoB,IAAA;AACtB;AAEO,SAAS,YAAA,CACd,SACA,OAAA,EACM;AACN,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,IAAA;AACpC,EAAA,MAAM,UAAA,GAAavC,aAAO,OAAO,CAAA;AACjC,EAAAY,gBAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAAA,EACvB,CAAC,CAAA;AACD,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA6B,eAAAA,EAAe;AACf,IAAA,MAAM,KAAA,GAAe;AAAA,MACnB,OAAA,EAAS,CAAC,KAAA,KAAU,UAAA,CAAW,QAAQ,KAAK;AAAA,KAC9C;AACA,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,WAAA,CAAY,KAAK,CAAA;AACnC,MAAA,IAAI,GAAA,IAAO,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACnC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACd;ACpCO,IAAM,8BAA8BxE,mBAAAA,CAAG;AAAA,EAC5C,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,wEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,kEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,+DAAA;AAAA,IACT,KAAA,EAAO,2CAAA;AAAA,IACP,OAAA,EAAS,iCAAA;AAAA,IACT,MAAA,EAAQ;AAAA,MACN,wEAAA;AAAA,MACA,gDAAA;AAAA,MACA,oEAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA;AAEb,CAAC;AAED,IAAM,SAAS,2BAAA,EAA4B;AAEpC,IAAM,gCAAA,GAA6E;AAAA,EACxF,IAAA,EAAM,WAAA;AAAA,EACN,SAAA,EAAW;AACb;AAkBO,SAAS,qBAAA,CAAsB;AAAA,EACpC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA,GAAU,oCAAA;AAAA,EACV,SAAA,GAAY,YAAA;AAAA,EACZ,OAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB;AACF,CAAA,EAA+B;AAC7B,EAAA,uBACEM,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,qBAAG,MAAA,CAAO,IAAA,EAAK,EAAG,SAAS,CAAA,EACzC,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,MAAK,EAC3B,QAAA,kBAAAA,cAAAA,CAACgE,iBAAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,aAAA,EAAW,MAAC,CAAA,EACxC,CAAA;AAAA,oBACArD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,MAAK,EAC1B,QAAA,EAAA;AAAA,sBAAAX,eAAC,GAAA,EAAA,EAAE,SAAA,EAAW,MAAA,CAAO,OAAA,IAAY,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBACzCA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,MAAA,CAAO,KAAA,IAAU,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACpC,OAAA,mBAAUA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAW,MAAA,CAAO,OAAA,EAAQ,EAAI,QAAA,EAAA,OAAA,EAAQ,CAAA,GAAO;AAAA,KAAA,EAC7D,CAAA;AAAA,IACC,OAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,OAAA,EAAQ,EAAI,QAAA,EAAA,gCAAA,CAAiC,OAAO,CAAA,EAAE,CAAA,mBAE9EA,cAAAA;AAAA,MAACqD,0BAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,WAAW,MAAM;AAAA,QAAC,CAAA,CAAA;AAAA,QAC3B,UAAA,EAAY,cAAA;AAAA,QACZ,SAAA,EAAW,OAAO,MAAA,EAAO;AAAA,QAExB,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;AC7CO,SAAS,MAAA,CAAsB;AAAA,EACpC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,cAAA;AAAA,EACd,OAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAMhB,OAAAA,GAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,YAAY,CAAA;AACtD,EAAA,uBACE1B,eAAAA;AAAA,IAACmE,0BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACV3E,oBAAA;AAAA,QACE,0BAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAC/D7B,eAAAA;AAAA,UAACoE,0BAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW5E,oBAAA;AAAA,cACTkC,QAAO,GAAA,EAAI;AAAA,cACXA,QAAO,OAAA,EAAQ;AAAA,cACf,kEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAArC,eAACgF,+BAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EACpB,QAAA,EAAA,CAAC,EAAE,eAAA,EAAiB,aAAA,EAAc,KACjC,aAAA,mBAAgBhF,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,YAAA,EAAc,QAAA,EAAA,WAAA,EAAY,IAAU,eAAA,EAExE,CAAA;AAAA,8BACAA,eAAC,UAAA,EAAA,EAAW;AAAA;AAAA;AAAA,SACd;AAAA,QAEC,WAAA,mBACCA,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD,IAAA;AAAA,wBAEJxD,eAAAA;AAAA,UAAC+B,2BAAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,CAAA;AAAA,YACR,SAAA,EAAWvC,oBAAA;AAAA;AAAA;AAAA,cAGT,0BAAA;AAAA;AAAA;AAAA,cAGA,UAAA;AAAA,cACA,8CAAA;AAAA,cACA,+BAAA;AAAA,cACA,qEAAA;AAAA,cACA,mEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAH,cAAAA,CAAC6C,6BAAA,EAAQ,SAAA,EAAU,uCAChB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZ7C,cAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBAEC,IAAI,MAAA,CAAO,EAAA;AAAA,kBACV,GAAI,OAAO,SAAA,GAAY,EAAE,WAAW,MAAA,CAAO,SAAA,KAAc,EAAC;AAAA,kBAC1D,GAAI,MAAA,CAAO,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,KAAS,EAAC;AAAA,kBAEhD,QAAA,EAAA,UAAA,GAAa,UAAA,CAAW,MAAM,CAAA,GAAI,MAAA,CAAO;AAAA,iBAAA;AAAA,gBALrC,MAAA,CAAO;AAAA,eAOf,CAAA,EACH,CAAA;AAAA,cACC,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,oBAAA,CAAG,WAAA,EAAa,eAAe,CAAA,EAAI,QAAA,EAAA,WAAA,EAAY,CAAA,GAC7D;AAAA;AAAA;AAAA;AACN;AAAA;AAAA,GACF;AAEJ;AAEA,SAAS,WAAW,KAAA,EAAyB;AAC3C,EAAA,uBACEH,cAAAA;AAAA,IAAC8C,+BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW3C,oBAAA;AAAA,QACT,yCAAA;AAAA,QACA,gDAAA;AAAA,QACA,yCAAA;AAAA,QACA,qDAAA;AAAA,QACA,qDAAA;AAAA,QACA,uDAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;;;ACrIO,SAAS,4BACd,MAAA,EACiC;AACjC,EAAA,IAAI,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,WAAA,EAAa,OAAO,MAAA;AACxD,EAAA,OAAO,IAAA;AACT;AAIO,SAAS,4BAA4B,KAAA,EAAoD;AAC9F,EAAA,OAAO,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,KAAY,OAAA;AAC7C;AAIO,SAAS,oBACd,OAAA,EACU;AACV,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,OAAA,IAAW,OAAA,EAAS,SAAA,IAAa,EAAC,EAAG;AAC9C,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,CAAC,QAAQ,KAAA,EAAO;AAChD,IAAA,IAAI,CAAC,QAAQ,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,OAAA;AACT;ACaO,SAAS,wBAAA,CAAyB;AAAA,EACvC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,kBAAA;AAAA,EACA,QAAA;AAAA,EACA,kBAAA,GAAqB,KAAA;AAAA,EACrB,iBAAA;AAAA,EACA,SAAA,GAAY,MAAA;AAAA,EACZ,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI+B,eAAS,EAAE,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,eAAe,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AACzF,EAAA,MAAM,OAAA,GAAUK,cAAQ,MAAM,mBAAA,CAAoB,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIL,eAAS,EAAE,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,YAAY,IAAI,YAAA,GAAe,OAAA,CAAQ,CAAC,CAAA,IAAK,EAAA;AAClF,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,KAAW,UAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,QAAA,CACX,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAI,CAAA,CACzB,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,IAAI,CAAA;AAIZ,EAAA,MAAM,oBAAA,GAAuBE,aAAO,iBAAiB,CAAA;AACrD,EAAA,oBAAA,CAAqB,OAAA,GAAU,iBAAA;AAC/B,EAAAY,gBAAU,MAAM;AACd,IAAA,oBAAA,CAAqB,OAAA,GAAU,SAAS,WAAW,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,OAAA,EAAS,WAAW,CAAC,CAAA;AAEzB,EAAA,uBACErC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWR,oBAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EACjD,QAAA,EAAA;AAAA,oBAAAQ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CACV,QAAA,EAAA,KAAA,CAAM,OAAA,IAAW,SAAS,uBAAA,EAC7B,CAAA;AAAA,sBACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,QAAA,EAAA;AAAA,QACC,KAAA,CAAM,UAAU,KAAA,GAAQ,EAAA;AAAA,QACxB,KAAA,CAAM,OAAA,GAAU,CAAA,QAAA,EAAW,KAAA,CAAM,OAAO,CAAA,CAAA,GAAK,aAAA;AAAA,QAC7C,KAAA,CAAM,QAAA,GAAW,CAAA,KAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA,CAAA,GAAK,EAAA;AAAA,QAC5C,MAAM,MAAA,KAAW,UAAA,GACb,aACA,KAAA,CAAM,MAAA,KAAW,SACf,WAAA,GACA;AAAA,QAEL,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,QAAK,CAAA,EACf;AAAA,KAAA,EACF,CAAA;AAAA,IACC,MAAA,oBACCW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAAX,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWG,oBAAA;AAAA,YACT,6DAAA;AAAA,YACA,+EAAA;AAAA,YACA,gBAAgB,IAAA,GAAO,qBAAA;AAAA,YACvB;AAAA,WACF;AAAA,UAEC,QAAA,EAAA,aAAA,GAAgB,aAAA,CAAc,KAAA,CAAM,OAAO,IAAI,KAAA,CAAM;AAAA;AAAA,OACxD;AAAA,MACC,yBACCH,cAAAA;AAAA,QAACqD,0BAAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,YAAA;AAAA,UACX,OAAA,EAAS,MAAA;AAAA,UACT,SAAA,EAAWlD,oBAAA;AAAA,YACT,0FAAA;AAAA,YACA,qEAAA;AAAA,YACA,2EAAA;AAAA,YACA,qDAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEA,0BAAAH,cAAAA,CAACiF,kBAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA,OAC3C,GACE;AAAA,KAAA,EACN,CAAA;AAAA,IAED,MAAA,mBACCtE,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,MAAA,GAAS,oBACjBX,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,aAAA;AAAA,UACX,WAAA,EAAa,SAAS,EAAA,IAAM,EAAA;AAAA,UAC5B,iBAAA,EAAmB,CAAC,GAAA,KAAQ;AAC1B,YAAA,kBAAA,CAAmB,MAAA,CAAO,GAAG,CAAC,CAAA;AAC9B,YAAA,eAAA,CAAgB,EAAE,CAAA;AAAA,UACpB,CAAA;AAAA,UACA,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAC,WAAW,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAG,CAAE;AAAA;AAAA,OACpF,GACE,IAAA;AAAA,MACH,OAAA,CAAQ,MAAA,GAAS,CAAA,mBAChBA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,gBAAA;AAAA,UACX,WAAA,EAAa,WAAA;AAAA,UACb,mBAAmB,CAAC,GAAA,KAAQ,eAAA,CAAgB,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,UACvD,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,CAAE;AAAA;AAAA,OAClE,mBAEAA,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,kCAAA,EACV,QAAA,EAAA,WAAA,KACE,OAAA,GAAU,2CAAA,GAA8C,qBAAA,CAAA,EAC7D,CAAA;AAAA,MAED,QAAA;AAAA,MACA,qCACCA,cAAAA,CAAC,OAAE,SAAA,EAAU,0BAAA,EAA4B,8BAAmB,CAAA,GAC1D,IAAA;AAAA,MACH,qBAAqB,IAAA,mBACpBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAW,eAAAA;AAAA,QAACM,wBAAA;AAAA,QAAA;AAAA,UACC,YAAY,cAAA,IAAkB,CAAC,MAAA,IAAU,WAAA,KAAgB,MAAM,CAAC,OAAA;AAAA,UAChE,OAAA,EAAS,MAAM,OAAA,IAAW,MAAA,CAAO,SAAS,WAAW,CAAA;AAAA,UAErD,QAAA,EAAA;AAAA,4BAAAjB,eAACgE,iBAAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC,CAAA;AAAA,YACvC;AAAA;AAAA;AAAA,OACH,EACF;AAAA,KAAA,EAEJ,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AC5JO,SAAS,MAAM,KAAA,EAA+B;AACnD,EAAA,uBAAOhE,cAAAA,CAACC,iCAAAA,EAAA,EAAmB,GAAG,KAAA,EAAO,CAAA;AACvC;AAeO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA,GAAgB,IAAA;AAAA,EAChB,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,uBACED,cAAAA;AAAA,IAACkF,gCAAA;AAAA,IAAA;AAAA,MACC,aAAA;AAAA,MACC,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACV/E,oBAAA;AAAA,QACE,yDAAA;AAAA;AAAA,QAEA,2DAAA;AAAA,QACA,8DAAA;AAAA,QACA,6DAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGF,QAAA,kBAAAH,cAAAA;AAAA,QAACmF,yBAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWhF,oBAAA;AAAA,YACT,iBAAA;AAAA;AAAA;AAAA;AAAA,YAIA,yCAAA;AAAA,YACA,0CAAA;AAAA,YACA,8BAAA;AAAA,YACA,4FAAA;AAAA,YACA,8DAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEA,0BAAAH,cAAAA,CAACI,0BAAAA,EAAA,EAAW,SAAA,EAAU,sDACnB,QAAA,EACH;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;AAKO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AACnF,EAAA,uBAAOJ,eAAC,KAAA,EAAA,EAAK,GAAG,OAAO,SAAA,EAAWG,oBAAA,CAAG,+CAAA,EAAiD,SAAS,CAAA,EAAG,CAAA;AACpG;AAIO,SAAS,UAAA,CAAW,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AAC9E,EAAA,uBACEH,cAAAA;AAAA,IAACoB,2BAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACJ,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWjB,oBAAA;AAAA,QACT,+EAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAGO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAyC;AAC9F,EAAA,uBAAOH,eAAC,GAAA,EAAA,EAAG,GAAG,OAAO,SAAA,EAAWG,oBAAA,CAAG,uCAAA,EAAyC,SAAS,CAAA,EAAG,CAAA;AAC1F;AAGO,SAAS,SAAA,CAAU,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AACjF,EAAA,uBACEH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA;AAAA;AAAA;AAAA,QAGT,8EAAA;AAAA,QACA;AAAA;AACF;AAAA,GACF;AAEJ;AAIO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AACnF,EAAA,uBACEH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA,CAAG,8CAAA,EAAgD,gBAAA,EAAkB,SAAS;AAAA;AAAA,GAC3F;AAEJ;ACzFO,SAAS,uBAAA,CAAwB;AAAA,EACtC,mBAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA,GAAa,uBAAA;AAAA,EACb,cAAA,GAAiB,WAAA;AAAA,EACjB,gBAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI+B,eAAmC,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA0C,IAAI,CAAA;AAE5E,EAAA,MAAM,YAAA,GAAeE,aAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,EAAA,MAAM,cAAA,GAAiBA,aAAO,WAAW,CAAA;AACzC,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAEzB,EAAA,MAAM,aAAA,GAAgBA,aAAO,KAAK,CAAA;AAClC,EAAA,MAAM,MAAA,GAASgD,iBAAA,CAAY,CAAC,IAAA,EAAgC,OAAA,KAA+B;AACzF,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,IAAI,cAAc,OAAA,EAAS;AAC3B,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,YAAA,CAAa,OAAA,GAAU,MAAM,OAAO,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAApC,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,oBAAA,CAAqB,mBAAmB,CAAA;AACpE,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,MAAM,QAAA,GAAW,2BAAA,CAA4B,MAAA,CAAO,MAAM,CAAA;AAC1D,QAAA,IAAI,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,MAAM,CAAA;AACrC,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA;AAAA,UAC3B,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,SAAA,KAAc,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAC;AAAA,SACtF;AACA,QAAA,IAAI,CAAC,WAAW,WAAA,CAAY,MAAA,CAAO,OAAO,CAAC,MAAA,KAA8B,MAAA,KAAW,IAAI,CAAC,CAAA;AAAA,MAC3F,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,cAAA,CAAe,OAAA,GAAU,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,MACpF;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,mBAAA,EAAqB,MAAM,CAAC,CAAA;AAExC,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,mBAAmB,CAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,uBACErC,eAAAA,CAAAQ,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAnB,cAAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,KAAA,CAAM,OAAA,IAAW,OAAA,CAAQ,QAAQ,CAAA,IAAK,uBAAA;AAAA,QAC7C,OAAA,EAAS,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AAAA,QACnC,OAAA;AAAA,QACA,MAAA,EAAQ,IAAA;AAAA,QACP,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,QAC/C,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA,KAClD;AAAA,IACC,UAAA,GAAa,uBACZW,eAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,YAAA,EAAc,SAAA;AAAA,QACd,cAAA;AAAA,QACC,GAAI,gBAAA,KAAqB,MAAA,GAAY,EAAE,SAAA,EAAW,gBAAA,KAAqB,EAAC;AAAA,QAEzE,QAAA,EAAA;AAAA,0BAAAX,eAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,cAAAA,CAAC,UAAA,EAAA,EAAY,sBAAW,CAAA,EAC1B,CAAA;AAAA,0BACAA,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,2BACnB,QAAA,kBAAAA,cAAAA;AAAA,YAAC,wBAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,QAAA;AAAA,cACA,gBAAA,EAAiB,eAAA;AAAA,cACjB,cAAA;AAAA,cACC,GAAI,kBAAA,KAAuB,MAAA,GAAY,EAAE,kBAAA,KAAuB,EAAC;AAAA,cACjE,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,KAAkB,EAAC;AAAA,cACvD,GAAI,MAAA,IAAU,2BAAA,CAA4B,KAAK,CAAA,GAC5C;AAAA,gBACE,MAAA,EAAQ,CAAC,OAAA,EAAkB,WAAA,KAAwB;AACjD,kBAAA,SAAA,CAAU,KAAK,CAAA;AACf,kBAAA,MAAA,CAAO,KAAA,EAAO,SAAS,WAAW,CAAA;AAAA,gBACpC;AAAA,kBAEF;AAAC;AAAA,WACP,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AAGO,SAAS,QAAQ,QAAA,EAA6B;AACnD,EAAA,OAAO,QAAA,CACJ,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAI,CAAA,CAC7B,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,IAAI,CAAA;AACd;AAIO,SAAS,UAAA,CAAW,OAA0B,QAAA,EAA6B;AAChF,EAAA,MAAM,SAAA,GACJ,KAAA,CAAM,OAAA,CACH,KAAA,CAAM,IAAI,CAAA,CACV,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,IAAA,EAAK,KAAM,EAAE,CAAA,EAChC,MAAK,IAAK,EAAA;AAChB,EAAA,OAAO;AAAA,IACL,KAAA,CAAM,OAAA,GAAU,OAAA,CAAQ,QAAQ,CAAA,GAAI,EAAA;AAAA,IACpC,MAAM,OAAA,IAAW,EAAA;AAAA,IACjB,MAAM,QAAA,IAAY,EAAA;AAAA,IAClB;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,QAAK,CAAA;AACf;;;AC1LO,SAAS,8BACd,YAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,sBAAsB,CAAC,mBAAA,KACrB,YAAA,CAAa,kBAAA,CAAmB,IAAI,mBAAmB,CAAA;AAAA,IACzD,YAAY,CAAC,SAAA,KAAc,YAAA,CAAa,QAAA,CAAS,IAAI,SAAS;AAAA,GAChE;AACF;ACuCO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA,EAAc,SAAA;AAAA,EACd,MAAA,EAAAqF,OAAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,EAAA;AAChC,EAAA,MAAM,IAAA,GAAO,OAAO,aAAA,IAAiB,EAAA;AAMrC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAInD,cAAAA,CAAS,MAAMoD,gBAAA,CAAa,MAAA,EAAQ,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACxF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIpD,eAAS,KAAK,CAAA;AAEhD,EAAAc,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAASsC,gBAAA,CAAa,MAAA,EAAQ,QAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,EAC1E,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,SAAS,CAAC,CAAA;AAE9B,EAAA,MAAMC,KAAAA,GAAO,CAAC,UAAA,EAAoB,QAAA,KAAqB;AACrD,IAAA,IAAI,UAAA,KAAe,EAAA,IAAM,QAAA,KAAa,EAAA,EAAI;AACxC,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,UAAA,EAAY,aAAA,EAAe,UAAU,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,gBAAgB,IAAA,CAAK,CAAC,WAAW,MAAA,CAAO,IAAA,KAAS,IAAI,CAAA,EAAG,MAAA,IAAU,IAAA;AAEzF,EAAA,MAAMlD,OAAAA,GAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,UAAA,EAAY,GAAI,SAAA,GAAY,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,IAAK,CAAA;AAC/F,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AAEN,EAAA,uBACE1B,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWR,oBAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA,EACtD,QAAA,EAAA;AAAA,oBAAAQ,eAAAA,CAAC,SAAI,SAAA,EAAWR,oBAAA,CAAGkC,QAAO,GAAA,EAAI,EAAG,8BAAA,EAAgC,WAAW,CAAA,EAC1E,QAAA,EAAA;AAAA,sBAAArC,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAWG,oBAAA;AAAA,YACT,kEAAA;AAAA,YACAkC,QAAO,OAAA,EAAQ;AAAA;AAAA;AAAA,YAGf,UAAA,KAAe,MAAA,GAAS,EAAA,GAAK,IAAA,KAAS,OAAO,MAAA,GAAS;AAAA,WACxD;AAAA,UACA,SAAA,EAAU,SAAA;AAAA,UACV,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,YAAA,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAC3B,YAAAkD,MAAKC,eAAA,CAAY,KAAA,CAAM,OAAO,KAAA,EAAO,MAAM,GAAG,IAAI,CAAA;AAAA,UACpD,CAAA;AAAA,UACA,SAAS,MAAM;AACb,YAAA,YAAA,CAAa,IAAI,CAAA;AACjB,YAAA,QAAA,CAASF,iBAAa,MAAA,EAAQ,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAAA,UAC3D,CAAA;AAAA,UACA,QAAQ,MAAM;AACZ,YAAA,YAAA,CAAa,KAAK,CAAA;AAClB,YAAA,MAAM,SAAA,GAAYE,eAAA,CAAY,KAAA,EAAO,MAAM,CAAA;AAC3C,YAAA,QAAA,CAASF,iBAAa,SAAA,EAAW,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,YAAAC,KAAAA,CAAK,WAAW,IAAI,CAAA;AACpB,YAAAF,OAAAA,IAAS;AAAA,UACX,CAAA;AAAA,UACA,UAAU,UAAA,IAAc,KAAA;AAAA,UACxB,WAAW,SAAA,IAAa,KAAA;AAAA,UACxB,aAAa,WAAA,IAAe,EAAA;AAAA,UAC5B,YAAA,EAAY,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,OAAA,CAAA,GAAY;AAAA;AAAA,OAClD;AAAA,sBAEA1E,eAAAA;AAAA,QAACmE,0BAAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAY,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,SAAA,CAAA,GAAc,UAAA;AAAA,UAClD,WAAA,EAAa,IAAA,KAAS,EAAA,GAAK,IAAA,GAAO,IAAA;AAAA,UAClC,iBAAA,EAAmB,CAAC,GAAA,KAAQS,KAAAA,CAAK,MAAA,EAAQ,OAAO,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,UACvE,YAAY,UAAA,IAAc,KAAA;AAAA,UAE1B,QAAA,EAAA;AAAA,4BAAA5E,eAAAA;AAAA,cAAC8E,0BAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWtF,oBAAA;AAAA,kBACT,iEAAA;AAAA,kBACA,2DAAA;AAAA,kBACA,2DAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAwC,4BAAkB,MAAA,EAAI,CAAA;AAAA,kCAC9EA,cAAAA,CAAC0F,uBAAA,EAAA,EAAY,SAAA,EAAU,mBAAA,EAAoB,eAAW,IAAA,EAAC;AAAA;AAAA;AAAA,aACzD;AAAA,4BAEA1F,cAAAA;AAAA,cAAC0C,2BAAAA;AAAA,cAAA;AAAA,gBACC,MAAA,EAAQ,CAAA;AAAA,gBACR,SAAA,EAAWvC,oBAAA;AAAA,kBACT,2DAAA;AAAA,kBACA,+BAAA;AAAA,kBACA,qEAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,kBAAAH,cAAAA,CAAC6C,2BAAAA,EAAA,EAAQ,SAAA,EAAU,uCAChB,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,qBACpBlC,eAAAA;AAAA,kBAACmC,+BAAAA;AAAA,kBAAA;AAAA,oBAEC,IAAI,MAAA,CAAO,IAAA;AAAA,oBACX,WAAW,CAAA,EAAG,MAAA,CAAO,UAAU,EAAE,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,oBAChD,SAAA,EAAW3C,oBAAA;AAAA,sBACT,4EAAA;AAAA,sBACA,yCAAA;AAAA,sBACA,qDAAA;AAAA,sBACA,qDAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAH,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAA,EAAwC,QAAA,EAAA,MAAA,CAAO,UAAU,EAAA,EAAG,CAAA;AAAA,sCAC5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,iBAAO,IAAA,EAAK;AAAA;AAAA,mBAAA;AAAA,kBAZtC,MAAA,CAAO;AAAA,iBAcf,CAAA,EACH;AAAA;AAAA;AACF;AAAA;AAAA;AACF,KAAA,EACF,CAAA;AAAA,IAEC,YAAA,IAAgB,eAAe,MAAA,mBAC9BA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GAC9C;AAAA,GAAA,EACN,CAAA;AAEJ;ACvKA,IAAM,oBAAA,GAAmD;AAAA,EACvD,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,oBAAA;AAAA,EACV,QAAA,GAAW,QAAA;AAAA,EACX;AACF,CAAA,EAAkB;AAChB,EAAA,IAAI,KAAA,IAAS,QAAQ,KAAA,KAAU,EAAA,yBAAWA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,QAAA,EAAS,CAAA;AAChF,EAAA,MAAM,OAAO,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AAC3D,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,QAAA,EAAS,CAAA;AAC/E,EAAA,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,eAAK,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAA,EAAE,CAAA;AAC/E;AAMA,IAAM,wBAAA,GAAuD;AAAA,EAC3D,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,wBAAA;AAAA,EACV,QAAA,GAAW,QAAA;AAAA,EACX;AACF,CAAA,EAAsB;AACpB,EAAA,IAAI,KAAA,IAAS,QAAQ,KAAA,KAAU,EAAA,yBAAWA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,QAAA,EAAS,CAAA;AAChF,EAAA,MAAM,OAAO,KAAA,YAAiB,IAAA,GAAO,KAAA,GAAQ,IAAI,KAAK,KAAK,CAAA;AAC3D,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,uBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,QAAA,EAAS,CAAA;AAC/E,EAAA,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,eAAK,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA,EAAE,CAAA;AAC3E;AASO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,SAAA,EAAU,EAAqB;AAClE,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAW,MAAA,EAAO,SAAA,EAAWG,oBAAA,CAAG,cAAA,EAAgB,SAAS,CAAA,EAC7D,QAAA,kBAAAH,cAAAA,CAAC,aAAU,CAAA,EACb,CAAA;AAAA,EAEJ;AACA,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,YAAA,EAAW,OAAA,EAAQ,SAAA,EAAWG,oBAAA,CAAG,YAAA,EAAc,SAAS,CAAA,EAC5D,QAAA,kBAAAH,cAAAA,CAAC,aAAU,CAAA,EACb,CAAA;AAAA,EAEJ;AACA,EAAA,uBAAOA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,qBAAG,YAAA,EAAc,SAAS,GAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AACxD;AAEA,SAAS,SAAA,GAAY;AACnB,EAAA,uBACEH,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,QACtE,QAAA,kBAAAA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,4BAAA;AAAA,MACF,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe;AAAA;AAAA,GACjB,EACF,CAAA;AAEJ;AAEA,SAAS,SAAA,GAAY;AACnB,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAY,QACtE,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,CAAA,EACrF,CAAA;AAEJ;AAeO,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,KAAA,EAAO,WAAU,EAAsB;AAC3E,EAAA,MAAM,OAAA,GAAU,KAAA,KAAU,OAAO,KAAA,KAAU,WAAW,KAAA,GAAQ,MAAA,CAAA;AAC9D,EAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,oBAAA,CAAG,kBAAA,EAAoB,SAAS,CAAA,EAAG,KAAA,EAAO,OAAA,EACxD,QAAA,EAAA,KAAA,IAAS,QAAA,EACZ,CAAA;AAEJ;AAYO,SAAS,SAAS,EAAE,QAAA,EAAU,SAAS,SAAA,EAAW,GAAG,OAAM,EAAkB;AAClF,EAAA,uBACEH,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,OAAA,EAAS,CAAC,CAAA,KAAqC;AAC7C,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAAA,MACA,SAAA,EAAWG,oBAAA;AAAA,QACT,4EAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACvIA,IAAM,cAAcE,mBAAAA,CAAG;AAAA,EACrB,IAAA,EAAM,CAAC,uCAAA,EAAyC,wBAAwB,CAAA;AAAA,EACxE,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA;AAAA;AAAA,MAGP,KAAA,EAAO,CAAC,qCAAA,EAAuC,6BAA6B,CAAA;AAAA,MAC5E,IAAA,EAAM;AAAA;AACR,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,OAAA,EAAS,OAAA;AAC9B,CAAC,CAAA;AAQM,SAAS,MAAM,EAAE,OAAA,EAAS,SAAA,EAAW,GAAG,OAAM,EAAe;AAClE,EAAA,uBAAOL,cAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAQ,GAAG,KAAA,EAAO,SAAA,EAAWG,oBAAA,CAAG,YAAY,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA;AACzF;AAIA,IAAM,oBAAoBE,mBAAAA,CAAG;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,6BAAA;AAAA,IACA,0EAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ,EAAE,IAAA,EAAM,oBAAA,EAAsB,OAAO,EAAA;AAAG,GAClD;AAAA,EACA,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA;AAC7B,CAAC,CAAA;AAMM,SAAS,YAAY,EAAE,MAAA,EAAQ,SAAA,EAAW,GAAG,OAAM,EAAqB;AAC7E,EAAA,uBAAOL,cAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,OAAO,GAAG,KAAA,EAAO,SAAA,EAAWG,oBAAA,CAAG,kBAAkB,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA;AAC7F;AAIO,IAAM,wBAAwBE,mBAAAA,CAAG;AAAA,EACtC,IAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMJ,UAAA;AAAA,IACA,kDAAA;AAAA,IACA,oBAAA;AAAA,IACA,wCAAA;AAAA,IACA,iEAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,yBAAA;AAAA,MACN,KAAA,EAAO,wBAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,4GAAA;AAAA,QACA,qCAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,8FAAA;AAAA,MACN,KAAA,EAAO,+FAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,KAAA,EAAO,MAAA,EAAQ,aAAa,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,KAAA;AAC/E,CAAC;AAKM,IAAM,gBAAA,GAAmB;AAOzB,SAAS,iBACd,IAAA,EAC2D;AAC3D,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,gBAAA,IAAoB,OAAO,KAAK,QAAA,KAAa,QAAA;AACpE;AAoCO,SAAS,eAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgB,IAAA;AAAA,EAChB,YAAA;AAAA,EACA,WAAW,WAAA,GAAc,KAAA;AAAA,EACzB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,GAAG;AACL,CAAA,EAAyB;AACvB,EAAA,MAAM,OAAA,GAAU+B,aAA8B,IAAI,CAAA;AAClD,EAAA,MAAM,SAAA,GAAYA,aAA+B,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,WAAW,YAAY,CAAA,GAAIF,eAAoB,EAAE,IAAA,EAAM,QAAQ,CAAA;AAEtE,EAAAc,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,QAAA,EAAU;AAC/B,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,EAAQ;AAEtB,IAAA,MAAM,IAAA,GAAuB,EAAE,IAAA,EAAM,gBAAA,EAAkB,QAAA,EAAS;AAEhE,IAAA,OAAO2C,eAAA;AAAA,MACLC,iBAAA,CAAU;AAAA,QACR,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,MAAA;AAAA,QACZ,cAAA,EAAgB,OAAO,EAAE,GAAG,IAAA,EAAK,CAAA;AAAA,QACjC,aAAa,MAAM,YAAA,CAAa,EAAE,IAAA,EAAM,YAAY,CAAA;AAAA,QACpD,QAAQ,MAAM,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ;AAAA,OAC5C,CAAA;AAAA,MACDC,6BAAA,CAAsB;AAAA,QACpB,OAAA,EAAS,IAAA;AAAA,QACT,OAAA,EAAS,CAAC,EAAE,MAAA,EAAO,KACjB,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,QAAA,KAAa,QAAA;AAAA,QAC5D,OAAA,EAAS,CAAC,EAAE,KAAA,EAAO,SAAQ,KACzBC,6BAAA;AAAA,UACE,EAAE,GAAG,IAAA,EAAK;AAAA,UACV,EAAE,KAAA,EAAO,OAAA,EAAS,cAAc,CAAC,MAAA,EAAQ,OAAO,CAAA;AAAE,SACpD;AAAA,QACF,aAAa,MAAM,IAAA;AAAA,QACnB,WAAA,EAAa,CAAC,EAAE,IAAA,EAAK,KAAM;AACzB,UAAA,MAAM,IAAA,GAAOC,8BAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AACzC,UAAA,IAAI,IAAA,KAAS,UAAU,IAAA,KAAS,OAAA,eAAsB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,QAC9E,CAAA;AAAA,QACA,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAK,KAAM;AACpB,UAAA,MAAM,IAAA,GAAOA,8BAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AACzC,UAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,OAAA,EAAS;AACvC,YAAA,YAAA;AAAA,cAAa,CAAC,IAAA,KACZ,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA;AAAK,aAC3E;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,aAAa,MAAM,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,QAChD,QAAQ,MAAM,YAAA,CAAa,EAAE,IAAA,EAAM,QAAQ;AAAA,OAC5C;AAAA,KACH;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,QAAQ,CAAC,CAAA;AAE1B,EAAA,MAAM,UAAA,GAA4B,SAAS,IAAA,GAAO,EAAE,OAAO,SAAA,EAAW,KAAA,KAAU,EAAC;AACjF,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,YAAA;AACrB,EAAA,MAAM,SAAS,aAAA,KAAkB,IAAA;AAEjC,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkC;AACrD,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,0BAA0B,CAAA,EAAG;AAChD,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,6BAA6B,CAAA,EAAG;AACnD,IAAA,YAAA,IAAe;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2C;AAChE,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,IAAe;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAA,GAA4D,aAC9D,aAAA,KAAkB,KAAA,GAChB,cACA,aAAA,KAAkB,MAAA,GAChB,eACA,MAAA,GACJ,MAAA;AAEJ,EAAA,uBACEpF,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAK,cAAA;AAAA,MACL,WAAA,EAAW,QAAA;AAAA,MACX,QAAA,EAAU,aAAa,CAAA,GAAI,MAAA;AAAA,MAC3B,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,GAAG,KAAA,EAAM;AAAA,MACjC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAWR,oBAAA;AAAA,QACT,sBAAsB,EAAE,KAAA,EAAO,aAAa,UAAA,EAAY,MAAA,EAAQ,QAAQ,CAAA;AAAA,QACxE,cAAA;AAAA,QACA,SAAA,CAAU,IAAA,KAAS,UAAA,GAAa,YAAA,GAAe,EAAA;AAAA,QAC/C;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,WAAA,IAAe,2BACdH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,SAAA;AAAA,YACL,iBAAA,EAAgB,MAAA;AAAA,YAChB,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAWG,oBAAA;AAAA,cACT,0DAAA;AAAA,cACA,+CAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA,CAACgG,wBAAA,EAAA,EAAa,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,SACnC,GACE,IAAA;AAAA,wBAEJrF,eAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWR,oBAAA;AAAA,cACT,4CAAA;AAAA,cACA,KAAA,KAAU,OAAA,GAAU,aAAA,GAAgB,KAAA,KAAU,WAAW,gBAAA,GAAmB;AAAA,aAC9E;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,QAAA,EAAS,CAAA;AAAA,cACpC,6BAAaA,cAAAA,CAAC,YAAS,GAAA,EAAK,aAAA,EAAe,QAAgB,CAAA,GAAK;AAAA;AAAA;AAAA,SACnE;AAAA,QAEC,2BACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,oBAAA,EAAmB,MAAA;AAAA,YACnB,YAAA,EAAY,CAAA,cAAA,EAAiB,SAAA,IAAa,QAAQ,CAAA,CAAA;AAAA,YAClD,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,QAAA,EAAS;AAAA,YACX,CAAA;AAAA,YACA,SAAA,EAAWG,oBAAA;AAAA,cACT,iEAAA;AAAA,cACA,8CAAA;AAAA,cACA,oEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA,CAACkB,aAAAA,EAAA,EAAE,WAAU,QAAA,EAAS;AAAA;AAAA,SACxB,GACE,IAAA;AAAA,QAEH,SAAA,CAAU,IAAA,KAAS,MAAA,mBAClBlB,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAWG,oBAAA;AAAA,cACT,6DAAA;AAAA,cACA,SAAA,CAAU,IAAA,KAAS,MAAA,GAAS,UAAA,GAAa;AAAA;AAC3C;AAAA,SACF,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,QAAA,CAAS,EAAE,GAAA,EAAK,MAAA,EAAO,EAA4C;AAC1E,EAAA,uBACEQ,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,GAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,UAAA;AAAA,MACR,aAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAWR,oBAAA,CAAG,UAAA,EAAY,MAAA,GAAS,gBAAgB,YAAY,CAAA;AAAA,MAE/D,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAA,EAAyB,IAAA,EAAK,gBAAe,OAAA,EAAS,GAAA,KAAQ,KAAA,GAAQ,CAAA,GAAI,IAAA,EAAM,CAAA;AAAA,wBACxFA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yBAAA,EAA0B,IAAA,EAAK,cAAA,EAAe,OAAA,EAAS,GAAA,KAAQ,MAAA,GAAS,CAAA,GAAI,IAAA,EAAM;AAAA;AAAA;AAAA,GAC5F;AAEJ;AAOO,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAmC;AACzF,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,MAAA;AAAA,MACX,GAAG,KAAA;AAAA,MACJ,SAAA,EAAWG,oBAAA,CAAG,4BAAA,EAA8B,oCAAA,EAAsC,SAAS;AAAA;AAAA,GAC7F;AAEJ;AAMA,IAAM,eAAA,GAAkB;AAAA,EACtB,wBAAA;AAAA,EACA,iDAAA;AAAA,EACA,+BAAA;AAAA,EACA,2CAAA;AAAA,EACA,sCAAA;AAAA,EACA,2CAAA;AAAA,EACA,2CAAA;AAAA,EACA,wCAAA;AAAA,EACA,6CAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,kBAAkBE,mBAAAA,CAAG;AAAA,EACzB,IAAA,EAAM,CAAC,uCAAA,EAAyC,GAAG,eAAe;AACpE,CAAC,CAAA;AAMM,SAAS,UAAU,EAAE,SAAA,EAAW,GAAA,EAAK,GAAG,OAAM,EAAmB;AACtE,EAAA,uBAAOL,cAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,UAAA,EAAW,GAAA,EAAW,GAAG,KAAA,EAAO,SAAA,EAAWG,oBAAA,CAAG,eAAA,EAAgB,EAAG,SAAS,CAAA,EAAG,CAAA;AAChG;AAYA,IAAM,sBAAsBE,mBAAAA,CAAG;AAAA,EAC7B,IAAA,EAAM,CAAC,uCAAA,EAAyC,GAAG,eAAe;AACpE,CAAC,CAAA;AAEM,SAAS,cAAc,EAAE,SAAA,EAAW,GAAA,EAAK,GAAG,OAAM,EAAmB;AAC1E,EAAA,uBACEL,cAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,cAAA,EAAe,GAAA,EAAW,GAAG,KAAA,EAAO,SAAA,EAAWG,oBAAA,CAAG,mBAAA,EAAoB,EAAG,SAAS,CAAA,EAAG,CAAA;AAEnG;AAWA,IAAM,WAAA,GAAc,6EAAA;AACpB,IAAM,UAAA,GACJ,kFAAA;AAEF,IAAM,iBAAiBE,mBAAAA,CAAG;AAAA,EACxB,IAAA,EAAM,CAAC,oBAAA,EAAsB,wCAAA,EAA0C,OAAO,CAAA;AAAA,EAC9E,QAAA,EAAU;AAAA,IACR,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,kBAAkB,UAAU,CAAA,CAAA;AAAA,MAClC,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,yBAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,gBAAA,EAAkB,CAAC,EAAE,GAAA,EAAK,MAAM,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,CAAA;AAAA,EACtE,iBAAiB,EAAE,GAAA,EAAK,OAAO,WAAA,EAAa,KAAA,EAAO,UAAU,KAAA;AAC/D,CAAC,CAAA;AAaM,SAAS,QAAA,CAAS;AAAA,EACvB,GAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,uBACEL,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,KAAA;AAAA,MACJ,GAAG,KAAA;AAAA,MACJ,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,OAAA,GAAU,CAAC,CAAA;AACX,QAAA,UAAA,GAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,SAAA,EAAWG,qBAAG,cAAA,CAAe,EAAE,KAAK,WAAA,EAAa,QAAA,EAAU,CAAA,EAAG,SAAS;AAAA;AAAA,GACzE;AAEJ;AAIO,IAAM,kBAAkBE,mBAAAA,CAAG;AAAA,EAChC,IAAA,EAAM;AAAA,IACJ,oCAAA;AAAA,IACA,WAAA;AAAA,IACA,iDAAA;AAAA,IACA,2CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO;AAAA,MACL,IAAA,EAAM,yBAAA;AAAA,MACN,KAAA,EAAO,4DAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,+DAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,GAAA,EAAK;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA,MAAA,EAAQ;AAAA;AAAA;AAAA,MAGN,IAAA,EAAM,gCAAA;AAAA,MACN,KAAA,EAAO,iCAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,KAAA;AACrE,CAAC;AAWM,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,MAAM,UAAA,GAA4B,SAAS,IAAA,GAAO,EAAE,OAAO,SAAA,EAAW,KAAA,KAAU,EAAC;AACjF,EAAA,uBACEL,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,UAAA;AAAA,MACJ,GAAG,KAAA;AAAA,MACJ,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,GAAG,KAAA,EAAM;AAAA,MACjC,SAAA,EAAWG,oBAAA,CAAG,eAAA,CAAgB,EAAE,KAAA,EAAO,MAAM,GAAA,EAAK,MAAA,EAAQ,CAAA,EAAG,SAAS;AAAA;AAAA,GACxE;AAEJ;AC9gBO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA,GAAQ,YAAA;AAAA,EACR,OAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,uBACEQ,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAWR,oBAAA;AAAA,QACT,iDAAA;AAAA,QACA,wBAAA;AAAA,QACA,kCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAOH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAc,gBAAK,CAAA,GAAS,IAAA;AAAA,wBACnDA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAwB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QAC5C,0BAAUA,cAAAA,CAAC,SAAI,SAAA,EAAU,yBAAA,EAA2B,mBAAQ,CAAA,GAAS,IAAA;AAAA,QACrE,yBAASA,cAAAA,CAAC,SAAI,SAAA,EAAU,MAAA,EAAQ,kBAAO,CAAA,GAAS;AAAA;AAAA;AAAA,GACnD;AAEJ;AC9BO,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,OAAA,EAAS,WAAU,EAAwB;AACjF,EAAA,uBACEW,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAWR,oBAAA;AAAA,QACT,iDAAA;AAAA,QACA,wBAAA;AAAA,QACA,kCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,sBAAA,EAAoB,CAAA;AAAA,wBAC7DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EAAiD,gBAAM,OAAA,EAAQ,CAAA;AAAA,QAC7E,OAAA,mBACCA,cAAAA,CAACiB,wBAAA,EAAA,EAAO,OAAA,EAAQ,OAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,OAAA,EAAS,QAAA,EAAA,OAAA,EAEpD,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;ACfO,SAAS,iBAAA,CAAkB;AAAA,EAChC,IAAA,GAAO,CAAA;AAAA,EACP,eAAe,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAAA,EACvC,SAAA,GAAY;AACd,CAAA,EAA2B;AACzB,EAAA,uBACEjB,cAAAA,CAAC,SAAA,EAAA,EAAU,MAAK,UAAA,EAAW,YAAA,EAAW,gBACnC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,2BACpCA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAGC,GAAA,EAAK,SAAS,CAAA,KAAM,CAAA;AAAA,MACpB,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,EAAU;AAAA,MAE1B,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,2BACpBA,cAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAGC,KAAA,EAAO,CAAA;AAAA,UAEP,0BAAAA,cAAAA,CAACiG,0BAAA,EAAA,EAAS,KAAA,EAAM,MAAA,EAAO,WAAU,iBAAA,EAAkB;AAAA,SAAA;AAAA,QAH9C;AAAA,OAKR;AAAA,KAAA;AAAA,IAZI;AAAA,GAcR,CAAA,EACH,CAAA;AAEJ;ACnBO,SAAS,yBAAA,CAA8D;AAAA,EAC5E,WAAA;AAAA,EACA,UAAA,GAAa,OAAA;AAAA,EACb,IAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAA0D;AACxD,EAAA,MAAM,GAAA,GAAM7D,aAAiB,IAAI,CAAA;AAEjC,EAAA,MAAM,KAAA,GAAQA,aAAO,WAAW,CAAA;AAChC,EAAA,KAAA,CAAM,OAAA,GAAU,WAAA;AAEhB,EAAAY,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,KAAY;AACX,QAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,IAAI,KAAA,CAAM,cAAA,EAAgB,KAAA,CAAM,OAAA,EAAQ;AAAA,QAC1C;AAAA,MACF,CAAA;AAAA,MACA,EAAE,IAAA,EAAM,IAAA,IAAQ,IAAA,EAAM,UAAA,EAAY,WAAW,CAAA;AAAE,KACjD;AACA,IAAA,QAAA,CAAS,QAAQ,IAAI,CAAA;AACrB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,IAAI,CAAC,CAAA;AAE9B,EAAA,OAAO,GAAA;AACT;ACkIA,IAAM,kBAAA,GAAqB,EAAA;AAGpB,IAAM,mBAAA,GAAsB;AAE5B,SAAS,SAAA,CAAgB;AAAA,EAC9B,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA,GAAY,kBAAA;AAAA,EACZ,QAAA,GAAW,CAAA;AAAA,EACX,UAAA;AAAA,EACA,KAAA,GAAQ,IAAA;AAAA,EACR,UAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,sBAAA,GAAyB,KAAA;AAAA,EACzB,mBAAA,GAAsB,KAAA;AAAA,EACtB,eAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA,GAAU,OAAA;AAAA,EACV,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,GAAgB,MAAA;AAAA,EAChB,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,OAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,IAAA,GAAOT,cAAgB,MAAM;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,EAAM,KAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,GAAI,EAAC;AAC7E,IAAA,MAAM,WAAA,GAAc,SAAA,EAAW,KAAA,IAAS,EAAC;AACzC,IAAA,MAAM,SAAA,GAAY,SAAA,EAAW,GAAA,IAAO,EAAC;AACrC,IAAA,IAAI,YAAY,MAAA,KAAW,CAAA,IAAK,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,QAAA;AAC/D,IAAA,OAAO,CAAC,GAAG,WAAA,EAAa,GAAG,QAAA,EAAU,GAAG,SAAS,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,KAAA,CAAM,IAAA,EAAM,SAAS,CAAC,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAeA,aAAAA;AAAA,IACnB,MACE,QAAA,KACC,CAAC,GAAA,EAAW,KAAA,KAAkB;AAC7B,MAAA,MAAM,CAAA,GAAI,GAAA;AACV,MAAA,IAAI,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,EAAU,OAAO,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAC5E,MAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,SAAiB,CAAA,CAAE,IAAA;AACzC,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,CAAA,CAAA;AAAA,IACF,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,mBAAmB,aAAA,KAAkB,UAAA;AAC3C,EAAA,MAAM,QAAA,GAAWA,cAAQ,MAAM,WAAA,wBAAmB,GAAA,EAAY,EAAG,CAAC,WAAW,CAAC,CAAA;AAE9E,EAAA,MAAM,SAAA,GAAYA,aAAAA;AAAA,IAChB,MAAO,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,KAAA,KAAU,YAAA,CAAa,GAAA,EAAK,KAAK,CAAC,CAAA,GAAI,EAAC;AAAA,IAChF,CAAC,gBAAA,EAAkB,IAAA,EAAM,YAAY;AAAA,GACvC;AAEA,EAAA,MAAM,mBAAA,GAAsBH,aAAsB,IAAI,CAAA;AAEtD,EAAA,MAAM,SAAA,GAAY,CAAC,EAAA,EAAY,KAAA,EAAe,OAAA,KAAqB;AACjE,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,MAAM,SAAS,mBAAA,CAAoB,OAAA;AACnC,IAAA,IAAI,OAAA,IAAW,WAAW,IAAA,EAAM;AAC9B,MAAA,MAAM,CAAC,IAAA,EAAM,EAAE,CAAA,GAAI,MAAA,IAAU,KAAA,GAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA,GAAI,CAAC,KAAA,EAAO,MAAM,CAAA;AAGrE,MAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,IAAK,EAAA,EAAI,KAAK,CAAA,EAAG;AAClC,QAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,QAAA,IAAI,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAAA,MAC7C;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,IACb;AACA,IAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,SAAA,CAAU,MAAA,CAAO,CAAC,KAAA,EAAO,EAAA,KAAO,KAAA,IAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AACjG,EAAA,MAAM,iBAAA,GAAoB,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,wBAAwB,SAAA,CAAU,MAAA;AAEpF,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC7B,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,KAAA,MAAW,EAAA,IAAM,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,EAAA,IAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,IACzC;AACA,IAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA;AAIA,EAAA,MAAM,gBAAA,GAAmBA,aAAO,KAAK,CAAA;AAErC,EAAA,MAAM,eAAA,GAAkBG,aAAAA;AAAA,IACtB,OAAO;AAAA,MACL,EAAA,EAAI,mBAAA;AAAA,MACJ,IAAA,EAAM,EAAA;AAAA,MACN,aAAA,EAAe,KAAA;AAAA,MACf,MAAM,EAAE,KAAA,EAAO,UAAU,MAAA,EAAQ,MAAA,EAAQ,eAAe,qBAAA,EAAsB;AAAA,MAC9E,QAAQ,sBACNvC,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDACd,QAAA,kBAAAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAY,oBAAoB,mBAAA,GAAsB,iBAAA;AAAA,UACtD,UAAA,EAAY,iBAAA;AAAA,UACZ,eAAA,EAAiB,mBAAA,GAAsB,CAAA,IAAK,CAAC,iBAAA;AAAA,UAC7C,UAAA,EAAY,UAAU,MAAA,KAAW,CAAA;AAAA,UACjC,QAAA,EAAU;AAAA;AAAA,OACZ,EACF,CAAA;AAAA,MAEF,IAAA,EAAM,CAAC,EAAE,GAAA,EAAI;AAAA;AAAA,wBAEXA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,gDAAA;AAAA,YACV,OAAA,EAAS,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,EAAgB;AAAA,YAC1C,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,cAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,cAAA,gBAAA,CAAiB,UAAU,KAAA,CAAM,QAAA;AAAA,YACnC,CAAA;AAAA,YACA,oBAAA,EAAsB,CAAC,KAAA,KAAU;AAC/B,cAAA,gBAAA,CAAiB,UAAU,KAAA,CAAM,QAAA;AAAA,YACnC,CAAA;AAAA,YACA,IAAA,EAAK,cAAA;AAAA,YAEL,QAAA,kBAAAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,YAAA,EAAY,CAAA,WAAA,EAAc,GAAA,CAAI,KAAA,GAAQ,CAAC,CAAA,CAAA;AAAA,gBACvC,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AAAA,gBAC/B,QAAA,EAAU,MAAM,SAAA,CAAU,GAAA,CAAI,IAAI,GAAA,CAAI,KAAA,EAAO,iBAAiB,OAAO;AAAA;AAAA;AACvE;AAAA;AACF;AAAA,KAEJ,CAAA;AAAA;AAAA,IAEA,CAAC,QAAA,EAAU,SAAA,EAAW,iBAAA,EAAmB,mBAAmB;AAAA,GAC9D;AAEA,EAAA,MAAM,YAAA,GAAeuC,aAAAA;AAAA,IACnB,MAAO,gBAAA,GAAmB,CAAC,eAAA,EAAiB,GAAG,OAAO,CAAA,GAAI,OAAA;AAAA,IAC1D,CAAC,gBAAA,EAAkB,eAAA,EAAiB,OAAO;AAAA,GAC7C;AAEA,EAAA,MAAM,QAAQ2D,wBAAA,CAAc;AAAA,IAC1B,IAAA,EAAM,IAAA;AAAA,IACN,OAAA,EAAS,YAAA;AAAA,IACT,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,IAAW,EAAC,EAAE;AAAA,IAChC,GAAI,eAAA,GAAkB,EAAE,eAAA,KAAoB,EAAC;AAAA,IAC7C,aAAA,EAAe,IAAA;AAAA,IACf,iBAAiBC,0BAAA,EAAgB;AAAA,IACjC,UAAU,CAAC,GAAA,EAAK,KAAA,KAAU,YAAA,CAAa,KAAK,KAAK;AAAA,GAClD,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA;AACtC,EAAA,MAAM,gBAAgB,SAAA,CAAU,MAAA;AAIhC,EAAA,MAAM,SAAA,GAAY5D,cAA0B,MAAM;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,EAAK,SAAA,MAAe,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,SAAA,EAAU,CAAW,CAAA;AAAA,IACrF;AACA,IAAA,MAAM,QAA0B,EAAC;AACjC,IAAA,IAAI,cAAA,GAAgC,IAAA;AACpC,IAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,GAAA,EAAK,SAAA,KAAc;AACpC,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAClC,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,EAAA,KAAO,cAAA,EAAgB;AACxC,QAAA,cAAA,GAAiB,KAAA,CAAM,EAAA;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,MAAM,EAAA,EAAI,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,MAChE,CAAA,MAAA,IAAW,CAAC,KAAA,EAAO;AACjB,QAAA,cAAA,GAAiB,IAAA;AAAA,MACnB;AACA,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,WAAW,CAAA;AAAA,IAC5C,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAA,EAAW,OAAO,CAAC,CAAA;AAIvB,EAAA,MAAM,WAAA,GAAcH,aAA8B,IAAI,CAAA;AAEtD,EAAAY,gBAAU,MAAM;AACd,IAAA,WAAA,CAAY,OAAA,EAAS,QAAA,CAAS,EAAE,GAAA,EAAK,GAAG,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAMZ,EAAA,MAAM,OAAA,GAAUZ,aAA8B,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIF,eAAS,CAAC,CAAA;AAE9C,EAAAkE,qBAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,SAAA,IAAa,CAAA;AAC1C,IAAA,aAAA,CAAc,CAAC,IAAA,KAAU,IAAA,KAAS,GAAA,GAAM,OAAO,GAAI,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,MAAM,gBAAgB,iBAAA,IAAqB,SAAA;AAE3C,EAAA,MAAM,cAAcC,2BAAA,CAAe;AAAA,IACjC,OAAO,SAAA,CAAU,MAAA;AAAA,IACjB,gBAAA,EAAkB,MAAM,WAAA,CAAY,OAAA;AAAA,IACpC,YAAA,EAAc,CAAC,KAAA,KAAW,SAAA,CAAU,KAAK,CAAA,EAAG,IAAA,KAAS,UAAU,aAAA,GAAgB,SAAA;AAAA,IAC/E,QAAA;AAAA,IACA,YAAA,EAAc;AAAA,GACf,CAAA;AAED,EAAA,MAAM,cAAc,yBAAA,CAA0C;AAAA,IAC5D,aAAa,MAAM;AACjB,MAAA,IAAI,MAAM,WAAA,IAAe,CAAC,MAAM,kBAAA,IAAsB,CAAC,MAAM,SAAA,EAAW;AACtE,QAAA,KAAA,CAAM,aAAA,EAAc;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,UAAA,EAAY,OAAA;AAAA,IACZ,MAAM,WAAA,CAAY,OAAA;AAAA,IAClB,OAAA,EAAS,CAAC,CAAC,KAAA,CAAM;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB9D,aAAAA;AAAA,IACvB,MAAM,YAAA,CAAa,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,IAAO,CAAA,CAAE,IAAA,IAAQ,GAAA,CAAA,EAAM,CAAC,CAAA;AAAA,IAC9D,CAAC,YAAY;AAAA,GACf;AAMA,EAAA,MAAM,UAAA,GAAaH,aAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,MAAM,YAAA,GAAeA,aAAO,eAAe,CAAA;AAC3C,EAAA,YAAA,CAAa,OAAA,GAAU,eAAA;AAEvB,EAAAY,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,sBAAA,EAAwB;AAC7B,IAAA,OAAOsD,0BAAA,CAAmB;AAAA,MACxB,YAAY,CAAC,EAAE,QAAO,KAAM,gBAAA,CAAiB,OAAO,IAAI,CAAA;AAAA,MACxD,MAAA,EAAQ,CAAC,EAAE,MAAA,EAAQ,UAAS,KAAM;AAChC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,WAAA,CAAY,CAAC,CAAA;AAC7C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,IAAI,CAAC,iBAAiB,MAAA,CAAO,IAAI,KAAK,CAAC,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA,EAAG;AACtE,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAA,KAAa,MAAA,CAAO,KAAK,QAAA,EAAU;AAEnD,QAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAqB,CAAC,CAAC,EAAE,CAAA;AACjF,QAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,QAAQ,CAAA;AACnD,QAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,QAAQ,CAAA;AACtD,QAAA,IAAI,UAAA,KAAe,EAAA,IAAM,aAAA,KAAkB,EAAA,EAAI;AAE/C,QAAA,MAAMC,aAAA,GAAcR,8BAAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AAClD,QAAA,MAAM,YAAYS,+BAAA,CAAgB;AAAA,UAChC,IAAA,EAAM,GAAA;AAAA,UACN,UAAA;AAAA,UACA,aAAA;AAAA,UACA,mBAAA,EAAqBD,aAAA;AAAA,UACrB,IAAA,EAAM;AAAA,SACP,CAAA;AACD,QAAA,IAAI,cAAc,GAAA,EAAK;AAEvB,QAAA,MAAM,QAAA,GAAW,OAAO,IAAA,CAAK,QAAA;AAC7B,QAAA,YAAA,CAAa,OAAA,GAAU,EAAE,EAAA,EAAI,QAAA,EAAU,SAAS,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA;AAAA,MAC/E;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,sBAAsB,CAAC,CAAA;AAE3B,EAAA,MAAM,SAAA,GACJ,CAAC,KAAA,CAAM,SAAA,IAAa,CAAC,MAAM,KAAA,IAAS,aAAA,KAAkB,CAAA,IAAK,CAAC,KAAA,CAAM,kBAAA;AACpE,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,SAAA,IAAa,aAAA,KAAkB,CAAA;AAChE,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,CAAM,SAAS,aAAA,KAAkB,CAAA;AACrD,EAAA,MAAM,aAAA,GACJ,CAAC,KAAA,CAAM,SAAA,IAAa,CAAC,MAAM,kBAAA,IAAsB,CAAC,KAAA,CAAM,WAAA,IAAe,aAAA,GAAgB,CAAA;AAEzF,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,EAAa;AAC3C,EAAA,MAAM,YAAA,GAAe,YAAY,eAAA,EAAgB;AAEjD,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,EAAgB;AAC3C,EAAA,MAAM,gBAAgB,gBAAA,GAAmB,EAAA;AAEzC,EAAA,uBACEvG,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,YAAA,EAAc,SAAA,KAAc,EAAC;AAAA,MAC9D,OAAA;AAAA,MACA,SAAA,EAAWG,oBAAA,CAAG,gBAAA,EAAkB,SAAS,CAAA;AAAA,MAKzC,QAAA,kBAAAH,cAAAA,CAAC,aAAA,EAAA,EAAc,GAAA,EAAK,aAGlB,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,QAAA,EAAU,eAAc,EAE7D,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,IAAI,CAAC,KAAA,qBACjBA,eAAAA,CAAC,WAAA,EAAA,EAA2B,QAAM,IAAA,EAC/B,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,YAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,IAAA;AAOrC,YAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,MAAA;AAC7B,YAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,KAAA;AAC/B,YAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,EAAQ,IAAK,MAAA;AACvC,YAAA,MAAM,UAAA,GAAa,MAAA,CAAO,aAAA,GACtB,IAAA,GACA8F,qBAAA,CAAW,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,UAAA,EAAY,CAAA;AAElE,YAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AACzC,YAAA,MAAM,SAAA,GAA2B,MAAA,KAAW,KAAA,GAAQ,IAAA,GAAO,MAAA;AAC3D,YAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,UAAA,EAAW;AACzC,YAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,uBAAA,EAAwB;AACzD,YAAA,MAAMC,UAAAA,GACJ,OAAO,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,QAAA,GACtC,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,MAAA,GACxB,MAAA,CAAO,MAAA,CAAO,EAAA;AAEpB,YAAA,uBACE1G,cAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBAEC,KAAA;AAAA,gBACA,SAAA,EAAW0G,UAAAA;AAAA,gBACX,SAAA,EAAW,sBAAA,IAA0B,CAAC,CAAC,OAAO,MAAA,CAAO,EAAA;AAAA,gBACpD,GAAI,MAAA,CAAO,MAAA,CAAO,EAAA,GAAK,EAAE,UAAU,MAAA,CAAO,MAAA,CAAO,EAAA,EAAG,GAAI,EAAC;AAAA,gBACzD,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,KAAA,EAAO,UAAA,KAAe,EAAC;AAAA,gBACxD,GAAI,MAAA,KAAW,KAAA,GAAQ,EAAE,MAAA,KAAW,EAAC;AAAA,gBACrC,GAAI,MAAM,aAAA,GAAgB,EAAE,WAAW,IAAA,CAAK,aAAA,KAAkB,EAAC;AAAA,gBAC/D,GAAI,OAAA,GACD;AAAA,kBACE,aAAA,EAAe,SAAA;AAAA,kBACf,YAAA,EAAc,MAAM,UAAA,GAAa,EAAW;AAAA,oBAE9C,EAAC;AAAA,gBACJ,GAAI,mBAAA,IAAuB,cAAA,IAAkB,MAAA,CAAO,OAAO,EAAA,GACxD,EAAE,QAAA,EAAU,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,KACjD,EAAC;AAAA,gBAEJ,QAAA,EAAA;AAAA,eAAA;AAAA,cAlBI,MAAA,CAAO;AAAA,aAmBd;AAAA,UAEJ,CAAC,CAAA;AAAA,0BACD1G,eAAC,iBAAA,EAAA,EAAkB;AAAA,SAAA,EAAA,EAjDH,KAAA,CAAM,EAkDxB,CACD,CAAA;AAAA,QAEA,UAAA;AAAA,QAEA,kBAAA,GACE,YAAA,oBAAgBA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAsB,CAAA,GACxD,SAAA,mBACFA,cAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,UAAA,EACP,QAAA,EAAA,UAAA,KAAe,KAAA,CAAM,KAAA,mBAAQA,cAAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA,GAAK,IAAA,CAAA,EACzE,CAAA,mBAEAW,eAAAA,CAAC,KAAA,EAAA,EAAI,MAAK,UAAA,EACP,QAAA,EAAA;AAAA,UAAA,SAAA,GACE,UAAA,oBAAcX,cAAAA,CAAC,cAAA,EAAA,EAAe,oBAE/BA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,OAAA;AAAA,cACL,IAAA,EAAK,cAAA;AAAA,cACL,OAAO,EAAE,MAAA,EAAQ,WAAW,QAAA,EAAU,UAAA,EAAY,OAAO,MAAA,EAAO;AAAA,cAE/D,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS;AAC1B,gBAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AACjC,gBAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,gBAAA,MAAM,QAAA,GAA0B;AAAA;AAAA;AAAA;AAAA,kBAI9B,SAAA,EAAW,CAAA,WAAA,EAAc,IAAA,CAAK,KAAA,GAAQ,UAAU,CAAA,GAAA,CAAA;AAAA,kBAChD,QAAQ,IAAA,CAAK;AAAA,iBACf;AACA,gBAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,kBAAA,uBACEA,cAAAA,CAAC,cAAA,EAAA,EAAwC,KAAA,EAAO,QAAA,EAC7C,eAAK,KAAA,EAAA,EADa,CAAA,MAAA,EAAS,IAAA,CAAK,EAAE,CAAA,CAErC,CAAA;AAAA,gBAEJ;AACA,gBAAA,uBACEA,cAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBAEC,KAAK,IAAA,CAAK,GAAA;AAAA,oBACV,OAAO,IAAA,CAAK,SAAA;AAAA,oBACZ,KAAA;AAAA,oBACA,UAAA;AAAA,oBACA,KAAA,EAAO,QAAA;AAAA,oBACP,aAAA;AAAA,oBACC,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC,mBAAA;AAAA,kBAP/B,KAAK,GAAA,CAAI;AAAA,iBAQhB;AAAA,cAEJ,CAAC;AAAA;AAAA,WACH;AAAA,UAKD,CAAC,SAAA,oBACAA,cAAAA,CAAC,SAAI,GAAA,EAAK,WAAA,EAAa,aAAA,EAAY,MAAA,EAAO,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,QAAO,EAAG,CAAA;AAAA,UAGhF,KAAA,CAAM,kBAAA,mBAAqBA,cAAAA,CAAC,aAAU,CAAA,GAAK,IAAA;AAAA,UAC3C,gCAAgBA,cAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,eAAe,CAAA,GAAK;AAAA,SAAA,EACzD,CAAA;AAAA,QAGD;AAAA,OAAA,EACH,CAAA,EACF;AAAA;AAAA,GACF;AAEJ;AAIA,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAS,EAAkD;AAC1F,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAQ,IAAA;AAAA,MACR,KAAA;AAAA,MACA,SAAA,EAAWG,oBAAA;AAAA,QACT,mCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAIA,QAAA,kBAAAH,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,sBAAsB,QAAA,EAAS;AAAA;AAAA,GACtD;AAEJ;AAcA,SAAS,OAAA,CAAc;AAAA,EACrB,GAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA,GAAgB;AAClB,CAAA,EAAuB;AACrB,EAAA,MAAM,KAAA,GAAQ,KAAA,IAAS,KAAA,GAAQ,CAAA,KAAM,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,CAAC,CAAC,UAAA;AAEtB,EAAA,MAAM,QAAQ,GAAA,CAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AAChD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,IAAA;AAWnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ,IAAK,MAAA;AAC1C,IAAA,MAAM,aAAA,GAAgBG,oBAAA;AAAA,MACpB,gBAAgB,wBAAA,GAA2B,MAAA;AAAA,MAC3C,IAAA,EAAM;AAAA,KACR;AACA,IAAA,uBACEH,cAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEE,GAAI,QAAA,KAAa,MAAA,GAAY,EAAE,KAAA,EAAO,QAAA,KAAa,EAAC;AAAA,QACrD,KAAA,EAAO,MAAM,KAAA,IAAS,MAAA;AAAA,QACrB,GAAI,MAAM,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,QACtD,GAAI,MAAM,GAAA,KAAQ,MAAA,GAAY,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAI,GAAI,EAAC;AAAA,QACnD,GAAI,MAAM,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW,EAAC;AAAA,QAC9C,GAAI,aAAA,GAAgB,EAAE,SAAA,EAAW,aAAA,KAAkB,EAAC;AAAA,QAEpD,gCAAW,IAAA,CAAK,MAAA,CAAO,UAAU,IAAA,EAAM,IAAA,CAAK,YAAY;AAAA,OAAA;AAAA,MARpD,IAAA,CAAK;AAAA,KASZ;AAAA,EAEJ,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,UAAA,GAAa,UAAA,CAAW,GAAA,EAAK,KAAK,CAAA,GAAI,KAAA;AAEnD,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAQ,IAAA;AAAA,MACR,GAAA,EAAK,KAAA;AAAA,MACL,WAAA;AAAA,MACA,KAAA;AAAA,MACA,eAAa,GAAA,CAAI,EAAA;AAAA,MACjB,QAAA,EAAU,cAAc,CAAA,GAAI,MAAA;AAAA,MAC5B,OAAA,EAAS,cAAc,CAAC,CAAA,KAAM,aAAa,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA,GAAI,MAAA;AAAA,MAC9D,SAAA,EACE,WAAA,GACI,CAAC,CAAA,KAAM;AACL,QAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,UAAA,GAAa,GAAA,CAAI,UAAU,CAAC,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA,GACA,MAAA;AAAA,MAGL,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAIA,SAAS,SAAA,GAAY;AACnB,EAAA,uBACEW,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWR,oBAAA;AAAA,QACT,wCAAA;AAAA,QACA,6CAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU,yEAAA;AAAA,YAEV,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8FAAA,EAA+F;AAAA;AAAA,SACjH;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBAClBA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAKN;AAAA;AAAA;AAAA,GACJ;AAEJ;AAEA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAM,EAAsB;AAC/C,EAAA,uBACEW,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWR,oBAAA;AAAA,QACT,kCAAA;AAAA,QACA,yDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACD,QAAA,EAAA;AAAA,QAAA,WAAA;AAAA,QACQ,MAAM,cAAA,EAAe;AAAA,QAAE;AAAA;AAAA;AAAA,GAChC;AAEJ;;;AC5tBO,SAAS,iBAAA,CAAyB;AAAA,EACvC,EAAA,GAAK,SAAA;AAAA,EACL,MAAA,GAAS,EAAA;AAAA,EACT,KAAA,GAAQ,EAAA;AAAA,EACR;AACF,CAAA,EAAkD;AAChD,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,KAAA;AAAA,IACN,aAAA,EAAe,KAAA;AAAA,IACf,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAiB;AAAA,IAChC,MAAM,CAAC,EAAE,KAAI,KAAM,IAAA,CAAK,IAAI,QAAQ;AAAA,GACtC;AACF;ACTO,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBACEQ,eAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,SAAQ,WAAA,EAAY,SAAA,EAAU,QAAA,EAAS,IAAA,EAAK,MAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAX,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,KAAA;AAAA,QACF,CAAA,EAAE,KAAA;AAAA,QACF,KAAA,EAAM,IAAA;AAAA,QACN,MAAA,EAAO,IAAA;AAAA,QACP,EAAA,EAAG,KAAA;AAAA,QACH,MAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAY;AAAA;AAAA,KACd;AAAA,oBACAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iBAAgB,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,CAAA;AAAA,oBAChEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ;AAAA,GAAA,EAC5F,CAAA;AAEJ;AAEA,SAAS,WAAA,GAAc;AACrB,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,QAAA,EAAS,IAAA,EAAK,MAAA,EAC3D,QAAA,kBAAAA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,oBAAA;AAAA,MACF,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe;AAAA;AAAA,GACjB,EACF,CAAA;AAEJ;AAEA,SAAS,YAAA,GAAe;AACtB,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,QAAA,EAAS,IAAA,EAAK,MAAA,EAC3D,QAAA,kBAAAA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAE,oBAAA;AAAA,MACF,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe;AAAA;AAAA,GACjB,EACF,CAAA;AAEJ;AAOO,SAAS,eAAA,GAAkB;AAChC,EAAA,uBACEW,eAAAA,CAACY,4BAAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAZ,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAChB,QAAA,EAAA;AAAA,sBAAAX,cAAAA;AAAA,QAAC2G,0BAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,UAAA;AAAA,UACL,YAAA,EAAW,gBAAA;AAAA,UACX,SAAA,EAAWxG,oBAAA;AAAA,YACT,2DAAA;AAAA,YACA,0EAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEA,QAAA,kBAAAH,eAAC,WAAA,EAAA,EAAY;AAAA;AAAA,OACf;AAAA,sBACAA,cAAAA,CAACoB,2BAAAA,EAAA,EAAQ,WAAU,+DAAA,EAAgE,CAAA;AAAA,sBACnFpB,cAAAA;AAAA,QAAC2G,0BAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,YAAA,EAAW,YAAA;AAAA,UACX,SAAA,EAAWxG,oBAAA;AAAA,YACT,2DAAA;AAAA,YACA,0EAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEA,QAAA,kBAAAH,eAAC,YAAA,EAAA,EAAa;AAAA;AAAA;AAChB,KAAA,EACF,CAAA;AAAA,oBAEAW,eAAAA,CAACiG,gCAAA,EAAA,EAAa,SAAA,EAAU,oCAAA,EACtB,QAAA,EAAA;AAAA,sBAAA5G,cAAAA,CAAC6G,sCAAA,EAAA,EACE,QAAA,EAAA,CAAC,GAAA,qBACA7G,cAAAA;AAAA,QAAC8G,sCAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW3G,oBAAA;AAAA,YACT,gEAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA,OACH,EAEJ,CAAA;AAAA,sBACAH,cAAAA,CAAC+G,oCAAA,EAAA,EACE,QAAA,EAAA,CAAC,yBACA/G,cAAAA;AAAA,QAACgH,gCAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,SAAA,EAAW7G,oBAAA;AAAA;AAAA;AAAA,YAGT,+DAAA;AAAA,YACA,+DAAA;AAAA,YACA,kDAAA;AAAA,YACA,iCAAA;AAAA,YACA,qDAAA;AAAA,YACA,mDAAA;AAAA,YACA,0DAAA;AAAA,YACA,4CAAA;AAAA,YACA,+DAAA;AAAA,YACA;AAAA;AACF;AAAA,OACF,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACrGO,SAAS,UAAA,CAAgC;AAAA,EAC9C,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAuB;AACrB,EAAA,MAAMkC,OAAAA,GAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AACN,EAAA,uBACE1B,eAAAA;AAAA,IAACsG,8BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACV9G,oBAAA;AAAA,QACE,0BAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAE/D7B,eAAAA;AAAA,UAACuG,yBAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW/G,oBAAA;AAAA;AAAA;AAAA,cAGTkC,QAAO,GAAA,EAAI;AAAA,cACX,8BAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAArC,cAAAA;AAAA,gBAACmH,6BAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAWhH,oBAAA;AAAA,oBACT,2CAAA;AAAA,oBACAkC,QAAO,OAAA,EAAQ;AAAA;AAAA;AAAA,oBAGf;AAAA,mBACF;AAAA,kBAEC,QAAA,EAAA,CAAC,4BACArC,cAAAA;AAAA,oBAACoH,+BAAA;AAAA,oBAAA;AAAA,sBACC,OAAA;AAAA,sBACA,SAAA,EAAWjH,oBAAA;AAAA,wBACT,6CAAA;AAAA,wBACA,+BAAA;AAAA,wBACA,gCAAA;AAAA;AAAA,wBAEA,qFAAA;AAAA,wBACA;AAAA;AACF;AAAA;AACF;AAAA,eAEJ;AAAA,8BAEAH,cAAAA;AAAA,gBAAC2G,0BAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAWxG,oBAAA;AAAA,oBACT,kDAAA;AAAA,oBACA,mBAAA;AAAA,oBACA,8CAAA;AAAA,oBACA,6BAAA;AAAA,oBACA,4CAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBAEA,QAAA,kBAAAH,eAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AACjB;AAAA;AAAA,SACF;AAAA,QAEC,WAAA,mBACCA,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD,IAAA;AAAA,wBAEJnE,cAAAA;AAAA,UAAC0C,2BAAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,CAAA;AAAA,YACR,SAAA,EAAWvC,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMT,sDAAA;AAAA,cACA,8CAAA;AAAA,cACA,+BAAA;AAAA,cACA,qEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,eAACqH,0BAAA,EAAA,EAAO,SAAA,EAAU,gBAChB,QAAA,kBAAArH,cAAAA,CAAC,mBAAgB,CAAA,EACnB;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;ACnGA,IAAM,aAAA,GAAgBG,oBAAA;AAAA,EACpB,6CAAA;AAAA,EACA,+BAAA;AAAA,EACA,gCAAA;AAAA;AAAA,EAEA,qFAAA;AAAA,EACA;AACF,CAAA;AAOA,SAAS,gBAAA,CAAiB;AAAA,EACxB,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,KAAA,GAAQqE,iBAAW8C,0CAAsB,CAAA;AAC/C,EAAA,IAAI,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO,IAAA;AAC5B,EAAA,uBACE3G,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACb,QAAA,EAAA;AAAA,oBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,gBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,oBACvCA,cAAAA;AAAA,MAACuH,6BAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,MAAA;AAAA,QACX,OAAO,KAAA,CAAM,SAAA;AAAA,QACb,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,IAAA,EAAM,KAAA,CAAM,YAAA,CAAa,IAAI,CAAA;AAAA,QACnC,CAAA;AAAA,QACA,WAAA;AAAA,QACC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,QAC/C,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB,EAAC;AAAA,QAEtD,QAAA,kBAAAvH,cAAAA;AAAA,UAACmH,6BAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWhH,oBAAA;AAAA,cACT,iFAAA;AAAA,cACA,gCAAA;AAAA,cACA,sEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA,CAAC,4BAAYH,cAAAA,CAACoH,iCAAA,EAAY,OAAA,EAAkB,WAAW,aAAA,EAAe;AAAA;AAAA;AACzE;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,cAAA,CAAoC;AAAA,EAClD,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA,GAAc,QAAA;AAAA,EACd,YAAA,GAAe,IAAA;AAAA,EACf,mBAAA,GAAsB,KAAA;AAAA,EACtB,GAAG;AACL,CAAA,EAA2B;AACzB,EAAA,MAAM/E,OAAAA,GAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AAGN,EAAA,MAAM,eAAA,GAAkB,WAAA,KAAgB,KAAA,GAAQ,QAAA,GAAW,WAAA;AAC3D,EAAA,MAAM,EAAE,WAAU,GAAI,KAAA;AACtB,EAAA,uBACE1B,eAAAA;AAAA,IAACsG,8BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,WAAA;AAAA,MACA,YAAA;AAAA,MACA,mBAAA;AAAA,MACA,SAAA,EAAW,CAAC,WAAA,KACV9G,oBAAA;AAAA,QACE,0BAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAE/D7B,eAAAA;AAAA,UAACuG,yBAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW/G,oBAAA;AAAA;AAAA;AAAA,cAGTkC,QAAO,GAAA,EAAI;AAAA,cACX,8BAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAArC,cAAAA;AAAA,gBAACmH,6BAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAWhH,oBAAA;AAAA,oBACT,2CAAA;AAAA,oBACAkC,QAAO,OAAA,EAAQ;AAAA;AAAA;AAAA,oBAGf;AAAA,mBACF;AAAA,kBAEC,QAAA,EAAA,CAAC,4BAAYrC,cAAAA,CAACoH,iCAAA,EAAY,OAAA,EAAkB,WAAW,aAAA,EAAe;AAAA;AAAA,eACzE;AAAA,8BAEApH,cAAAA;AAAA,gBAAC2G,0BAAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAWxG,oBAAA;AAAA,oBACT,kDAAA;AAAA,oBACA,mBAAA;AAAA,oBACA,8CAAA;AAAA,oBACA,6BAAA;AAAA,oBACA,4CAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBAEA,QAAA,kBAAAH,eAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AACjB;AAAA;AAAA,SACF;AAAA,QAEC,WAAA,mBACCA,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD,IAAA;AAAA,wBAEJnE,cAAAA;AAAA,UAAC0C,2BAAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,CAAA;AAAA,YACR,SAAA,EAAWvC,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMT,sDAAA;AAAA,cACA,8CAAA;AAAA,cACA,+BAAA;AAAA,cACA,qEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAQ,eAAAA,CAAC0G,0BAAAA,EAAA,EAAO,WAAU,cAAA,EAChB,QAAA,EAAA;AAAA,8BAAArH,eAAC,eAAA,EAAA,EAAgB,CAAA;AAAA,8BACjBA,cAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EAAa,eAAA;AAAA,kBACb,YAAA;AAAA,kBACC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA;AAClD,aAAA,EACF;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;ACtLO,IAAM,yBAAyBK,mBAAAA,CAAG;AAAA,EACvC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,wEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,kEAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,+DAAA;AAAA,IACT,KAAA,EAAO,2CAAA;AAAA,IACP,UAAA,EAAY,iCAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,wEAAA;AAAA,MACA,gDAAA;AAAA,MACA,oEAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS;AAAA;AAEb,CAAC;AAED,IAAMgC,UAAS,sBAAA,EAAuB;AAK/B,IAAM,mBAAA,GAA0D;AAAA,EACrE,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ;AACV;AAoBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,8BAAA;AAAA,EACV,YAAA,GAAe,QAAA;AAAA,EACf,OAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA,GAAoB,KAAA;AAAA,EACpB;AACF,CAAA,EAA0B;AACxB,EAAA,uBACE1B,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,qBAAGkC,OAAAA,CAAO,IAAA,EAAK,EAAG,SAAS,CAAA,EACzC,QAAA,EAAA;AAAA,oBAAArC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWqC,OAAAA,CAAO,IAAA,IACtB,QAAA,kBAAArC,cAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAkB,CAAA,EACjC,CAAA;AAAA,oBACAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW0B,OAAAA,CAAO,MAAK,EAC1B,QAAA,EAAA;AAAA,sBAAArC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAWqC,OAAAA,CAAO,OAAA,IAAY,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,sBACzCrC,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAWqC,OAAAA,CAAO,KAAA,IAAU,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACpC,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,mBACjC1B,gBAAC,GAAA,EAAA,EAAE,SAAA,EAAW0B,OAAAA,CAAO,UAAA,EAAW,EAAG,QAAA,EAAA;AAAA,QAAA,KAAA;AAAA,QAAI,UAAA,CAAW,KAAK,IAAI;AAAA,OAAA,EAAE,CAAA,GAC3D;AAAA,KAAA,EACN,CAAA;AAAA,IACC,OAAA,mBACCrC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWqC,OAAAA,CAAO,OAAA,EAAQ,EAAI,QAAA,EAAA,mBAAA,CAAoB,OAAO,CAAA,EAAE,CAAA,mBAEjErC,cAAAA;AAAA,MAACqD,0BAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,cAAc,MAAM;AAAA,QAAC,CAAA,CAAA;AAAA,QAC9B,UAAA,EAAY,iBAAA;AAAA,QACZ,SAAA,EAAWhB,QAAO,MAAA,EAAO;AAAA,QAExB,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;;;ACrGO,SAAS,yBACd,YAAA,EACoB;AACpB,EAAA,OAAO;AAAA,IACL,YAAY,CAAC,SAAA,KAAc,YAAA,CAAa,QAAA,CAAS,IAAI,SAAS,CAAA;AAAA,IAC9D,iBAAiB,CAAC,cAAA,KAAmB,YAAA,CAAa,aAAA,CAAc,IAAI,cAAc,CAAA;AAAA,IAClF,WAAA,EAAa,CAAC,SAAA,EAAW,KAAA,KAAU,aAAa,QAAA,CAAS,WAAA,CAAY,WAAW,KAAK,CAAA;AAAA,IACrF,WAAW,CAAC,SAAA,KAAc,YAAA,CAAa,QAAA,CAAS,UAAU,SAAS,CAAA;AAAA,IACnE,aAAa,CAAC,SAAA,KAAc,YAAA,CAAa,QAAA,CAAS,YAAY,SAAS,CAAA;AAAA,IACvE,gBAAA,EAAkB,OAAO,YAAA,EAAc,CAAA,KAAA,CAEnC,MAAM,YAAA,CAAa,WAAA,CAAY,qBAAqB,YAAA,EAAc;AAAA,MAChE,SAAA,EAAW,GAAA;AAAA,MACX,GAAI,CAAA,GAAI,EAAE,CAAA,KAAM;AAAC,KAClB,CAAA,EACD;AAAA,GACN;AACF;ACAA,IAAM,kBAAA,uBAAyB,GAAA,EAAiC;AAChE,IAAM,oBAAA,uBAA2B,GAAA,EAA6B;AAE9D,SAAS,OAAO,SAAA,EAAyB;AACvC,EAAA,KAAA,MAAW,YAAY,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA,IAAK,IAAI,QAAA,EAAS;AAC7E;AAQO,SAAS,2BAAA,CACd,WACA,OAAA,EACY;AACZ,EAAA,kBAAA,CAAmB,GAAA,CAAI,WAAW,OAAO,CAAA;AACzC,EAAA,MAAA,CAAO,SAAS,CAAA;AAChB,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,SAAS,CAAA,KAAM,OAAA,EAAS;AACjD,MAAA,kBAAA,CAAmB,OAAO,SAAS,CAAA;AACnC,MAAA,MAAA,CAAO,SAAS,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AACF;AAMO,SAAS,uBAAuB,SAAA,EAA+C;AACpF,EAAA,OAAOqC,0BAAAA;AAAA,IACL,CAAC,QAAA,KAAa;AACZ,MAAA,IAAI8C,UAAAA,GAAY,oBAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAClD,MAAA,IAAI,CAACA,UAAAA,EAAW;AACd,QAAAA,UAAAA,uBAAgB,GAAA,EAAI;AACpB,QAAA,oBAAA,CAAqB,GAAA,CAAI,WAAWA,UAAS,CAAA;AAAA,MAC/C;AACA,MAAAA,UAAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,MAAA,OAAO,MAAM;AACX,QAAAA,UAAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,QAAA,IAAIA,UAAAA,CAAU,IAAA,KAAS,CAAA,EAAG,oBAAA,CAAqB,OAAO,SAAS,CAAA;AAAA,MACjE,CAAA;AAAA,IACF,CAAA;AAAA,IACA,MAAM,kBAAA,CAAmB,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAAA,IAC3C,MAAM;AAAA,GACR;AACF;AAGO,SAAS,0BAAA,GAAmC;AACjD,EAAA,kBAAA,CAAmB,KAAA,EAAM;AACzB,EAAA,oBAAA,CAAqB,KAAA,EAAM;AAC7B;AChBO,SAAS,WAAA,CAA2B;AAAA,EACzC,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,cAAA;AAAA,EACd,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,mBAAA,GAAsB,KAAA;AAAA,EACtB,YAAA,GAAe,KAAA;AAAA,EACf,cAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,UAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAMnF,UAAS,kBAAA,CAAmB,EAAE,MAAM,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAC1E,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AAGN,EAAA,MAAM,SAAA,GAAY,UAAA,KAAe,MAAA,GAAS,cAAA,GAAiB,eAAe,IAAI,CAAA;AAC9E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,UAAA,GAAaE,aAAuB,IAAI,CAAA;AAE9C,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,YAAY,CAAA;AACxC,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAA,CAAO,CAAC,MAAM,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AACnE,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACzC,EAAA,MAAM,cAAA,GAAA,CACJ,mBAAA,GAAsB,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,IAAI,OAAA,EACtE,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,KAAW,EAAA,IAAM,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAEvE,EAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB;AACrC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,cAAA,GAAiB,IAAI,CAAA;AAAA,EACvB,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAkB;AACrC,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,KAAW,EAAA,eAAiB,EAAE,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAU;AACxB,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,WAAW,CAAA;AAChC,IAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAqC;AAC7D,IAAA,IAAI,UAAA,EAAY;AAChB,IAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,WAAA,EAAa;AAC/D,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEzB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWR,oBAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA,EACrD,QAAA,EAAA;AAAA,IAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,oBAE/D7B,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,UAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,MAAA;AAAA,QACf,eAAA,EAAc,SAAA;AAAA,QACd,iBAAe,UAAA,IAAc,MAAA;AAAA,QAC7B,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,QAAA,EAAU,aAAa,EAAA,GAAK,CAAA;AAAA,QAC5B,SAAS,MAAM,CAAC,UAAA,IAAc,WAAA,CAAY,CAAC,MAAM,CAAA;AAAA,QACjD,SAAA,EAAW,gBAAA;AAAA,QACX,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,iBAAe,UAAA,IAAc,MAAA;AAAA,QAC7B,SAAA,EAAWR,oBAAA;AAAA,UACTkC,QAAO,GAAA,EAAI;AAAA,UACX,oDAAA;AAAA,UACA,SAAA;AAAA,UACA,iBAAiB,IAAI,CAAA;AAAA,UACrB,MAAA;AAAA;AAAA;AAAA,UAGA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,eAAA,CAAgB,MAAA,KAAW,CAAA;AAAA;AAAA;AAAA;AAAA,4BAI1BrC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,oBAAA,CAAG,6BAA6B,eAAA,CAAgB,IAAI,CAAC,CAAA,EACnE,QAAA,EAAA,WAAA,EACH;AAAA,cAEA,eAAA,CAAgB,IAAI,CAAC,CAAA,qBACnBH,cAAAA,CAAC,IAAA,EAAA,EAAgB,UAAU,MAAM,MAAA,CAAO,EAAE,EAAE,CAAA,EAAG,YAC5C,QAAA,EAAA,CAAA,CAAE,OAAA,IAAW,EAAE,KAAA,EAAA,EADP,CAAA,CAAE,EAEb,CACD,CAAA;AAAA,0BAEHA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBACd,QAAA,kBAAAA,cAAAA,CAAC,cAAW,CAAA,EACd;AAAA;AAAA;AAAA,KACF;AAAA,IAEC,8BAAcA,cAAAA,CAAC,OAAE,SAAA,EAAW,eAAA,EAAkB,uBAAY,CAAA,GAAO,IAAA;AAAA,IACjE,YAAA,IAAgB,eAAe,MAAA,mBAC9BA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GAC5C,IAAA;AAAA,oBAEJW,eAAAA;AAAA,MAAC+B,2BAAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,YAAA,EAAc,WAAA;AAAA,QACd,UAAA;AAAA,QACA,MAAA,EAAQ,CAAA;AAAA,QACR,SAAA,EAAU,cAAA;AAAA,QACV,SAAA,EAAWvC,oBAAA;AAAA,UACT,0BAAA;AAAA,UACA,8CAAA;AAAA,UACA,+BAAA;AAAA,UACA,qEAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,YAAA,mBACCH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cAEC,SAAA,EAAS,IAAA;AAAA,cACT,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cAC5C,WAAA,EAAY,cAAA;AAAA,cACZ,YAAA,EAAW,gBAAA;AAAA,cACX,SAAA,EAAWG,oBAAA;AAAA,gBACT,8DAAA;AAAA,gBACA;AAAA;AACF;AAAA,aAEJ,CAAA,GACE,IAAA;AAAA,0BACJH,cAAAA;AAAA,YAAC6C,2BAAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,SAAA;AAAA,cAChD,aAAA,EAAc,UAAA;AAAA,cACd,YAAA,EAAc,WAAA;AAAA,cACd,iBAAA,EAAmB,CAAC,IAAA,KAAS;AAC3B,gBAAA,IAAI,SAAS,KAAA,EAAO;AAClB,kBAAA,iBAAA,CAAkB,IAAI,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AACnD,kBAAA;AAAA,gBACF;AACA,gBAAA,iBAAA,CAAkB,IAAc,CAAA;AAAA,cAClC,CAAA;AAAA,cACA,SAAA,EAAU,qCAAA;AAAA,cACV,gBAAA,EAAkB,sBAChB7C,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,oBAAA,CAAG,WAAA,EAAa,eAAe,CAAA,EAC5C,QAAA,EAAA,MAAA,KAAW,EAAA,GAAK,eAAe,sBAAA,EAClC,CAAA;AAAA,cAGD,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,qBACnBQ,eAAAA;AAAA,gBAACmC,+BAAAA;AAAA,gBAAA;AAAA,kBAEC,IAAI,MAAA,CAAO,EAAA;AAAA,kBACX,WAAW,MAAA,CAAO,KAAA;AAAA,kBACjB,GAAI,MAAA,CAAO,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,KAAS,EAAC;AAAA,kBACjD,SAAA,EAAW3C,oBAAA;AAAA,oBACT,iCAAA;AAAA,oBACA,gDAAA;AAAA,oBACA,yCAAA;AAAA,oBACA,qDAAA;AAAA,oBACA,qDAAA;AAAA,oBACA,uDAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAH,eAAC,SAAA,EAAA,EAAU,CAAA;AAAA,oCACXA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,MAAA,CAAO,OAAA,IAAW,OAAO,KAAA,EAAM;AAAA;AAAA,iBAAA;AAAA,gBAf7D,MAAA,CAAO;AAAA,eAiBf;AAAA;AAAA;AACH;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAQA,SAAS,IAAA,CAAK;AAAA,EACZ,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACEW,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWR,oBAAA;AAAA,QACT,kCAAA;AAAA,QACA,gCAAA;AAAA,QACA,iCAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAS,CAAA;AAAA,wBACrDA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,QAAA;AAAA,YACX,QAAA,EAAU,UAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAA,KAAM;AAGd,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,QAAA,EAAS;AAAA,YACX,CAAA;AAAA,YACA,SAAA,EAAWG,oBAAA;AAAA,cACT,kDAAA;AAAA,cACA,sBAAA;AAAA,cACA,6DAAA;AAAA,cACA,yDAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,UAAA,EAAW,IAAA,EAAK,MAAA,EAC7D,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAE,mBAAA;AAAA,gBACF,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,KAAA;AAAA,gBACZ,aAAA,EAAc;AAAA;AAAA,aAChB,EACF;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAMA,SAAS,SAAA,GAAY;AACnB,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWG,oBAAA;AAAA,QACT,2DAAA;AAAA,QACA,0DAAA;AAAA,QACA,yDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAH,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,WAAA;AAAA,UACR,SAAA,EAAWG,oBAAA;AAAA,YACT,qDAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,aAAA,EAAW,IAAA;AAAA,UAEX,QAAA,kBAAAH,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAE,2BAAA;AAAA,cACF,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,IAAA,EAAK;AAAA;AAAA;AACP;AAAA;AACF;AAAA,GACF;AAEJ;AC3UA,IAAM,kBAAA,GAAqB,GAAA;AAsBpB,SAAS,eAAA,CAAgB;AAAA,EAC9B,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIkC,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,EAAE,CAAA;AACzD,EAAAc,gBAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,OAAO,UAAA,CAAW,MAAM,mBAAmB,MAAA,CAAO,IAAA,EAAM,CAAA,EAAG,kBAAkB,CAAA;AAC5F,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,cAAAA,CAA2B,EAAE,CAAA;AAE/D,EAAA,MAAM,YAAA,GAAeE,aAAO,CAAC,CAAA;AAC7B,EAAAY,gBAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,EAAA,EAAI;AACzB,IAAA,MAAM,SAAA,GAAY,EAAE,YAAA,CAAa,OAAA;AACjC,IAAA,gBAAA,CAAiB,YAAA,EAAc,eAAe,CAAA,CAC3C,IAAA,CAAK,CAAC,OAAA,KAAY;AACjB,MAAA,IAAI,SAAA,KAAc,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,OAAO,CAAA;AAAA,IAC9D,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,YAAA,EAAc,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAEpD,EAAA,MAAM,OAAA,GAAUT,cAAqC,MAAM;AACzD,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAuC;AACvD,IAAA,KAAA,MAAW,aAAa,KAAA,EAAO;AAC7B,MAAA,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,EAAE,EAAA,EAAI,UAAU,WAAA,EAAa,KAAA,EAAO,SAAA,CAAU,WAAA,EAAa,CAAA;AAAA,IAC5F;AACA,IAAA,KAAA,MAAW,WAAW,SAAA,EAAW;AAC/B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,KAAA;AAChD,MAAA,GAAA,CAAI,IAAI,UAAA,EAAY;AAAA,QAClB,EAAA,EAAI,UAAA;AAAA,QACJ,KAAA,EAAO,QAAQ,IAAA,IAAQ;AAAA,OACxB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,SAAA,EAAW,KAAK,CAAC,CAAA;AAIrB,EAAA,uBACEvC,cAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,IAAA;AAAA,MACL,YAAA,EAAY,IAAA;AAAA,MACZ,cAAA,EAAgB,SAAA;AAAA,MACf,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,MACpD,OAAA;AAAA,MACA,cAAc,KAAA,CAAM,GAAA,CAAI,CAAC,SAAA,KAAc,UAAU,WAAW,CAAA;AAAA,MAC5D,iBAAA,EAAmB,CAAC,IAAA,KAClB,QAAA;AAAA,QACE,MAAM,IAAA,CAAK,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UAC5B,IAAA,EAAM,iBAAA;AAAA,UACN,WAAA,EAAa,OAAO,EAAE;AAAA,SACxB,CAAE;AAAA;AACJ;AAAA,GAEJ;AAEJ;ACtBO,IAAM,6BAAA,GAAgC,KAAK,IAAA,GAAO;AAGlD,IAAM,wBAAwBK,mBAAAA,CAAG;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,2EAAA;AAAA,IACA,mDAAA;AAAA,IACA;AAAA;AAEJ,CAAC;AAID,IAAM,SAAA,GAAY,2EAAA;AA0DX,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,mBAAA;AAAA,EACA,gBAAA;AAAA,EACA,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,GAAA,EAAK,OAAA;AAAA,EACL,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,uBAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI6B,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAClE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,WAAA,GAAcE,aAA4B,IAAI,CAAA;AAKpD,EAAAY,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA,CAAY,OAAA,EAAS,QAAA,CAAS,WAAA,CAAY,OAAO,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,KAAA,CAAM,IAAI,CAAC,CAAA;AAIf,EAAA,MAAM,KAAK,MAAA,IAAU,UAAA;AACrB,EAAA,MAAM,KAAK,MAAA,IAAU,UAAA;AACrB,EAAA,MAAM,MAAM,OAAA,IAAW,WAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAA0B;AACvC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,aAAA,CAAc,IAAI,CAAA;AAC5C,IAAA,UAAA,GAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAA0B;AACvC,IAAA,IAAI,MAAA,KAAW,MAAA,EAAW,aAAA,CAAc,IAAI,CAAA;AAC5C,IAAA,UAAA,GAAa,IAAI,CAAA;AAAA,EACnB,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAA0B;AACxC,IAAA,IAAI,OAAA,KAAY,MAAA,EAAW,cAAA,CAAe,IAAI,CAAA;AAC9C,IAAA,WAAA,GAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,YACJ,gBAAA,KAAqB,MAAA,IAAa,eAAe,EAAE,gBAAA,EAAkB,cAAa,GAAI,MAAA;AACxF,EAAA,MAAM,iBAAA,GACJ,IAAA,KAAS,OAAA,KAAY,mBAAA,IAAuB,UAAU,SAAA,KAAc,MAAA;AACtE,EAAA,MAAM,OAAA,GAAA,CAAW,WAAA,IAAe,KAAA,KAAU,SAAA,KAAc,MAAA;AACxD,EAAA,MAAM,oBAAoB,cAAA,IAAkB,IAAA;AAK5C,EAAAA,gBAAU,MAAM;AACd,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,cAAA,CAAe,EAAE,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,cAAA,IAAkB,EAAA;AACnD,EAAA,MAAM,UAAA,GAAA,CAAc,WAAA,IAAe,EAAC,EAAG,MAAA;AAAA,IACrC,CAAC,UAAA,KAAe,UAAA,CAAW,MAAA,KAAW;AAAA,GACxC,CAAE,MAAA;AACF,EAAA,MAAM,OAAA,GAAA,CACH,MAAM,IAAA,CAAK,IAAA,OAAW,EAAA,IAAM,UAAA,GAAa,OACzC,IAAA,KAAS,OAAA,IAAW,QAAQ,IAAA,EAAK,KAAM,QACvC,CAAC,OAAA,IAAW,GAAG,MAAA,GAAS,CAAA,CAAA,IACzB,EAAE,uBAAA,IAA2B,KAAA,CAAA;AAE/B,EAAA,MAAM,MAAA,GAASoC,kBAAY,YAAY;AACrC,IAAA,IAAI,CAAC,WAAW,SAAA,EAAW;AAC3B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO;AAAA,QACX,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK;AAAA,QACtB,GAAI,SAAS,OAAA,GAAU,EAAE,SAAS,OAAA,CAAQ,IAAA,EAAK,EAAE,GAAI,EAAC;AAAA,QACtD,GAAI,OAAA,GAAU,EAAE,EAAA,KAAO,EAAC;AAAA,QACxB,GAAI,EAAA,CAAG,MAAA,GAAS,IAAI,EAAE,EAAA,KAAO,EAAC;AAAA,QAC9B,GAAI,GAAA,CAAI,MAAA,GAAS,IAAI,EAAE,GAAA,KAAQ;AAAC,OACjC,CAAA;AAGD,MAAA,aAAA,CAAc,EAAE,IAAA,EAAM,EAAA,EAAI,CAAA;AAC1B,MAAA,aAAA,CAAc,EAAE,CAAA;AAChB,MAAA,aAAA,CAAc,EAAE,CAAA;AAChB,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AAEd,MAAA,YAAA,CAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,aAAa,CAAA;AAAA,IACrE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,SAAA,EAAW,QAAQ,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,aAAa,CAAC,CAAA;AAE/F,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,uBACEpF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAA,cAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,oBAAA;AAAA,UACT,8DAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAMsH,UAAAA,GAAY,CAAC,KAAA,KAA8C;AAC/D,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,MAAM,WAAA,GACJ,IAAA,KAAS,OAAA,GACL,KAAA,CAAM,QAAQ,OAAA,KAAY,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAA,GACjD,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,CAAC,KAAA,CAAM,QAAA;AACtC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAK,MAAA,EAAO;AAAA,IACd;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GACJ,iBAAA,IAAqB,CAAC,SAAA,mBACpBzH,cAAAA;AAAA,IAACqD,0BAAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,MAChC,SAAA,EAAU,uKAAA;AAAA,MACX,QAAA,EAAA;AAAA;AAAA,GAED,GACE,IAAA;AAEN,EAAA,uBACE1C,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,qBAAG,qBAAA,EAAsB,EAAG,SAAS,CAAA,EAClD,QAAA,EAAA;AAAA,MAAA,gBAAA,mBACCQ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,EAAW,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,wBAC/BA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,YAAA,EAAW,YAAA;AAAA,YACX,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,gBAAA,CAAiB,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,cACjD,IAAI,MAAA,CAAO,EAAA;AAAA,cACX,OAAO,MAAA,CAAO,KAAA;AAAA,cACd,WAAW,MAAA,CAAO;AAAA,aACpB,CAAE,CAAA;AAAA,YACF,aAAa,gBAAA,CAAiB,UAAA;AAAA,YAC9B,mBAAmB,CAAC,GAAA,KAAQ,iBAAiB,QAAA,CAAS,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,YACjE,gBAAA,EAAiB,uBAAA;AAAA,YACjB,gBAAA,EAAiB;AAAA;AAAA;AACnB,OAAA,EACF,CAAA,GACE,IAAA;AAAA,MAEH,SAAS,OAAA,GACR,iBAAA,mBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8DAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAAA,EAA+D,QAAA,EAAA,SAAA,EAE/E,CAAA;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAgD,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,QACvE;AAAA,OAAA,EACH,CAAA,mBAEAW,eAAAA,CAAC,OAAA,EAAA,EAAM,WAAU,8DAAA,EACf,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAAA,EAA+D,QAAA,EAAA,SAAA,EAE/E,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,OAAA;AAAA,YACP,QAAA,EAAU,CAAC,KAAA,KAAU,aAAA,CAAc,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,YAC5E,WAAA,EAAY,SAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QACC;AAAA,OAAA,EACH,CAAA,GAEA,IAAA;AAAA,MAEH,WAAW,SAAA,mBACVW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8DAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,EAAW,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,wBAC9BA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,cAAc,SAAA,CAAU,YAAA;AAAA,YACxB,kBAAkB,SAAA,CAAU,gBAAA;AAAA,YAC5B,WAAA,EAAY,uBAAA;AAAA,YACZ,KAAA,EAAO,EAAA;AAAA,YACP,QAAA,EAAU;AAAA;AAAA,SACZ,EACF;AAAA,OAAA,EACF,CAAA,GACE,IAAA;AAAA,MAEH,qBAAqB,SAAA,IAAa,SAAA,mBACjCW,eAAAA,CAAAQ,qBAAA,EACE,QAAA,EAAA;AAAA,wBAAAR,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,EAAW,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,0BAC9BA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,cAAc,SAAA,CAAU,YAAA;AAAA,cACxB,kBAAkB,SAAA,CAAU,gBAAA;AAAA,cAC5B,WAAA,EAAY,cAAA;AAAA,cACZ,KAAA,EAAO,EAAA;AAAA,cACP,QAAA,EAAU;AAAA;AAAA,WACZ,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAAA,EACb,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,SAAA,EAAW,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,0BAC/BA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,cAAc,SAAA,CAAU,YAAA;AAAA,cACxB,kBAAkB,SAAA,CAAU,gBAAA;AAAA,cAC5B,WAAA,EAAY,eAAA;AAAA,cACZ,KAAA,EAAO,GAAA;AAAA,cACP,QAAA,EAAU;AAAA;AAAA,WACZ,EACF;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA,GACE,IAAA;AAAA,MAEH,WAAA,IAAe,YAAY,MAAA,GAAS,CAAA;AAAA;AAAA,wBAEnCA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDACZ,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,qBAChBA,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YAEC,MAAM,UAAA,CAAW,IAAA;AAAA,YACjB,QAAQ,UAAA,CAAW,MAAA;AAAA,YAClB,GAAI,WAAW,WAAA,KAAgB,MAAA,GAC5B,EAAE,WAAA,EAAa,UAAA,CAAW,WAAA,EAAY,GACtC,EAAC;AAAA,YACJ,GAAI,WAAW,WAAA,GAAc,EAAE,aAAa,UAAA,CAAW,WAAA,KAAgB,EAAC;AAAA,YACxE,GAAI,WAAW,YAAA,GAAe,EAAE,cAAc,UAAA,CAAW,YAAA,KAAiB,EAAC;AAAA,YAC3E,GAAI,kBAAA,GACD,EAAE,QAAA,EAAU,MAAM,mBAAmB,UAAA,CAAW,OAAO,CAAA,EAAE,GACzD,EAAC;AAAA,YACL,SAAA,EAAU;AAAA,WAAA;AAAA,UAXL,UAAA,CAAW;AAAA,SAanB,CAAA,EACH;AAAA,UACE,IAAA;AAAA,sBAKJW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,WAAA;AAAA,YACL,OAAO,KAAA,CAAM,IAAA;AAAA,YACb,WAAA;AAAA,YACA,IAAA,EAAM,CAAA;AAAA,YACN,QAAA,EAAU,CAAC,KAAA,KAAU,aAAA,CAAc,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,YACzE,SAAA,EAAWyH,UAAAA;AAAA,YACX,SAAA,EAAWtH,oBAAA;AAAA,cACT,gDAAA;AAAA,cACA,iFAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,6BAAA,EAA2B;AAAA;AAAA,SAC7B;AAAA,wBAEAQ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,UAAA,mBACCX,cAAAA;AAAA,YAACgB,+BAAAA;AAAA,YAAA;AAAA,cACC,cAAA,EAAc,IAAA;AAAA,cACd,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,gBAAA,IAAI,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,cACzC,CAAA;AAAA,cAEA,QAAA,kBAAAhB,cAAAA;AAAA,gBAACiB,wBAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,QAAA;AAAA,kBACR,IAAA,EAAK,SAAA;AAAA,kBACL,YAAA,EAAW,cAAA;AAAA,kBACX,SAAA,EAAU,UAAA;AAAA,kBAEV,0BAAAjB,cAAAA,CAACc,qBAAAA,EAAA,EAAU,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA;AAC5C;AAAA,WACF,mBAEAd,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,UAGP,iBAAA,mBACCW,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAX,cAAAA,CAAC,UAAK,SAAA,EAAU,8CAAA,EAA+C,eAAW,IAAA,EACvE,QAAA,EAAA,IAAA,KAAS,OAAA,GAAU,cAAA,GAAO,QAAA,EAC7B,CAAA;AAAA,4BACAA,cAAAA;AAAA,cAACqD,0BAAAA;AAAA,cAAA;AAAA,gBACC,YAAA,EAAW,MAAA;AAAA,gBACX,UAAA,EAAY,CAAC,OAAA,IAAW,SAAA;AAAA,gBACxB,OAAA,EAAS,MAAM,KAAK,MAAA,EAAO;AAAA,gBAC3B,SAAA,EAAWlD,oBAAA;AAAA,kBACT,6DAAA;AAAA,kBACA,wDAAA;AAAA,kBACA,6CAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,kBAAAH,cAAAA,CAAC0H,0BAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AACvC,WAAA,EACF,CAAA,GACE;AAAA,SAAA,EACN;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,SAAA,mBACC/G,eAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0CAAA,EACV,QAAA,EAAA;AAAA,MAAA,SAAA;AAAA,MAAU,qCAAA;AAAA,MAA+B,GAAA;AAAA,sBAC1CX,cAAAA;AAAA,QAACqD,0BAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,KAAK,MAAA,EAAO;AAAA,UAC3B,SAAA,EAAU,yFAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAIA,SAAS,SAAS,IAAA,EAA2B;AAC3C,EAAA,IAAA,CAAK,MAAM,MAAA,GAAS,MAAA;AACpB,EAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA,EAAA,CAAA;AAC1C;ACzdA,IAAMsE,qBAAAA,uBAA2B,GAAA,EAA6B;AAC9D,IAAM,sBAAA,uBAA6B,GAAA,EAAiC;AAE7D,SAAS,0BAAA,CAA2B,WAAmB,OAAA,EAAoC;AAChG,EAAA,sBAAA,CAAuB,GAAA,CAAI,WAAW,OAAO,CAAA;AAC7C,EAAA,KAAA,MAAW,YAAYA,qBAAAA,CAAqB,GAAA,CAAI,SAAS,CAAA,IAAK,IAAI,QAAA,EAAS;AAC7E;AAEO,SAAS,4BAAA,CAA6B,WAAmB,QAAA,EAAkC;AAChG,EAAA,IAAIH,UAAAA,GAAYG,qBAAAA,CAAqB,GAAA,CAAI,SAAS,CAAA;AAClD,EAAA,IAAI,CAACH,UAAAA,EAAW;AACd,IAAAA,UAAAA,uBAAgB,GAAA,EAAI;AACpB,IAAAG,qBAAAA,CAAqB,GAAA,CAAI,SAAA,EAAWH,UAAS,CAAA;AAAA,EAC/C;AACA,EAAAA,UAAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,EAAA,OAAO,MAAM;AACX,IAAAA,UAAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,IAAA,IAAIA,WAAU,IAAA,KAAS,CAAA,EAAGG,qBAAAA,CAAqB,OAAO,SAAS,CAAA;AAAA,EACjE,CAAA;AACF;AAOO,SAAS,uBAAuB,SAAA,EAA+C;AACpF,EAAA,OAAOjD,0BAAAA;AAAA,IACL,CAAC,QAAA,KAAa,4BAAA,CAA6B,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC9D,MAAM,sBAAA,CAAuB,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAAA,IAC/C,MAAM;AAAA,GACR;AACF;AAGO,SAAS,2BAAA,GAAoC;AAClD,EAAAiD,sBAAqB,KAAA,EAAM;AAC3B,EAAA,sBAAA,CAAuB,KAAA,EAAM;AAC/B;;;ACrCA,IAAM,iBAAA,GAA4E;AAAA;AAAA;AAAA,EAGhF,OAAA,EAAS,MAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAGO,SAAS,gBAAgB,MAAA,EAAgD;AAC9E,EAAA,IAAI,MAAA,KAAW,SAAS,OAAO,IAAA;AAC/B,EAAA,OAAO,iBAAA,CAAkB,MAAM,CAAA,IAAK,WAAA;AACtC;AAQO,SAAS,gBAAgB,MAAA,EAAsD;AACpF,EAAA,MAAM,IAAA,GAAO,gBAAgB,MAAM,CAAA;AACnC,EAAA,OAAO,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,WAAA,GAAc,IAAA,GAAO,IAAA;AACxD;AAIO,SAAS,qBAAqB,KAAA,EAA6C;AAChF,EAAA,OAAO,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,QAAA;AAC/D;ACnBO,IAAM,6BAA6BtH,mBAAAA,CAAG;AAAA,EAC3C,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,uBAAA;AAAA,IACN,MAAA,EAAQ,wCAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,4EAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ,mCAAA;AAAA,IACR,OAAA,EAAS,wDAAA;AAAA,IACT,QAAA,EAAU;AAAA,MACR,6EAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA;AAEX,CAAC;AAED,IAAMgC,UAAS,0BAAA,EAA2B;AAsC1C,SAAS,yBAAA,CAA0B,SAAkB,IAAA,EAA4C;AAC/F,EAAA,OAAA,CAAQ,QAAQ,UAAA,IAAc,EAAC,EAC5B,MAAA,CAAO,CAAC,SAAA,KAAc,SAAA,CAAU,IAAA,KAAS,IAAA,IAAQ,CAAC,CAAC,SAAA,CAAU,WAAW,CAAA,CACxE,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,IACnB,IAAA,EAAM,iBAAA;AAAA,IACN,aAAa,SAAA,CAAU;AAAA,GACzB,CAAE,CAAA;AACN;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,IAAA;AAAA,EACd,SAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,eAAgB,SAAS,CAAA;AACnD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAe,MAAM,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAuB,WAAW,CAAA;AAC1E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAyB,IAAI,CAAA;AAC3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA8B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAIA,eAAwB,EAAE,IAAA,EAAM,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAChD,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAChD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,cAAAA,CAA0B,EAAE,CAAA;AAElD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAwB;AAAA,IACtD,IAAA,EAAM,EAAA;AAAA,IACN,OAAA,EAAS,EAAA;AAAA,IACT,IAAI,EAAC;AAAA,IACL,IAAI,EAAC;AAAA,IACL,KAAK;AAAC,GACP,CAAA;AACD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,CAAC,CAAA;AAE5C,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,OAAA;AACrC,EAAA,MAAM,iBAAA,GAAoB,OAAA,IAAW,YAAA,EAAc,MAAA,KAAW,OAAA;AAC9D,EAAA,MAAM,qBAAA,GAAwB,OAAA,IAAW,CAAC,YAAA,EAAc,OAAA;AAExD,EAAA,MAAM,IAAA,GAAOkD,iBAAAA,CAAY,CAAC,KAAA,EAAgB,MAAA,KAAgC;AACxE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,UAAU,KAAA,CAAM,IAAA,KAAS,MAAM,CAAA,EAAG,IAAA,IAAQ,EAAA;AAC3E,IAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,EAAA;AACnC,IAAA,MAAM,QAAA,GAAW,yBAAA,CAA0B,KAAA,EAAO,IAAI,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,yBAAA,CAA0B,KAAA,EAAO,IAAI,CAAA;AACtD,IAAA,MAAM,SAAA,GAAY,yBAAA,CAA0B,KAAA,EAAO,KAAK,CAAA;AACxD,IAAA,WAAA,CAAY,EAAE,MAAM,OAAA,EAAS,EAAA,EAAI,UAAU,EAAA,EAAI,QAAA,EAAU,GAAA,EAAK,SAAA,EAAW,CAAA;AACzE,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,GAAI,KAAA,CAAM,OAAA,KAAY,OAAA,GAAU,EAAE,OAAA,EAAQ,GAAI,EAAC,EAAI,CAAA;AACpE,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,MAAA,CAAO,SAAS,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAIL,EAAApC,gBAAU,MAAM;AACd,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,QAAA,CAAS,SAAS,CAAA;AAClB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,MAAA,CACG,UAAA,CAAW,SAAS,CAAA,CACpB,IAAA,CAAK,OAAO,KAAA,KAAU;AACrB,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,GACjB,MAAM,OAAO,eAAA,CAAgB,KAAA,CAAM,eAAe,CAAA,GAClD,IAAA;AACJ,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAA;AAC7C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,QAAA,QAAA,CAAS,UAAU,CAAA;AACnB,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,OAAO,MAAM,CAAA;AAClB,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AACzB,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,YAAA,CAAa,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAA0B,CAAA;AAChF,MAAA,QAAA,CAAS,YAAY,CAAA;AAAA,IACvB,CAAC,CAAA;AACH,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,CAAA;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,SAAS,CAAC,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAUT,cAAQ,MAAM;AAC5B,IAAA,OACE,KAAA,CAAM,IAAA,KAAS,QAAA,CAAS,IAAA,IACvB,sBAAsB,KAAA,CAAM,OAAA,IAAW,EAAA,MAAQ,QAAA,CAAS,WACzD,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA,KAAM,KAAK,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA,IACjD,KAAK,SAAA,CAAU,EAAE,CAAA,KAAM,IAAA,CAAK,UAAU,QAAA,CAAS,EAAE,CAAA,IACjD,IAAA,CAAK,UAAU,GAAG,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,SAAS,GAAG,CAAA;AAAA,EAEvD,CAAA,EAAG,CAAC,KAAA,EAAO,EAAA,EAAI,IAAI,GAAA,EAAK,QAAA,EAAU,iBAAiB,CAAC,CAAA;AAEpD,EAAA,MAAM,UAAA,GAAa6C,kBAAY,MAA0B;AACvD,IAAA,MAAM,OAAA,GAAU,OAAA;AAChB,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,KAAS,QAAA,CAAS,IAAA;AAC7C,IAAA,MAAM,gBAAA,GACJ,qBAAA,KACC,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA,IAChD,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA,IACjD,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,CAAA;AACvD,IAAA,MAAM,cAAA,GAAA,CAAkB,QAAQ,WAAA,IAAe,IAAI,GAAA,CAAI,CAAC,UAAA,KAAe,UAAA,CAAW,IAAI,CAAA;AACtF,IAAA,OAAO;AAAA;AAAA;AAAA,MAGL,OAAA,EAAS,YAAA,GACL,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,EAAG,IACnD,OAAA,CAAQ,OAAA;AAAA,MACZ,GAAI,oBAAoB,EAAE,OAAA,EAAS,MAAM,OAAA,IAAW,EAAA,KAAO,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAK5D,GAAI,gBAAA,GAAmB,EAAE,IAAI,EAAA,EAAI,GAAA,KAAQ,EAAC;AAAA,MAC1C,GAAI,eAAe,MAAA,GAAS,CAAA,GAAI,EAAE,WAAA,EAAa,cAAA,KAAmB;AAAC,KACrE;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,IAAI,GAAA,EAAK,QAAA,EAAU,qBAAA,EAAuB,iBAAiB,CAAC,CAAA;AAEpF,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,YAA8B;AAClE,IAAA,MAAM,OAAA,GAAU,OAAA;AAChB,IAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,WAAA,CAAY,SAAA,EAAW,YAAY,CAAA;AAChE,IAAA,UAAA,CAAW,OAAO,CAAA;AAClB,IAAA,eAAA;AAAA,MAAgB,CAAC,MAAA,KACf,MAAA,IAAU,iBAAA,GAAoB,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAA,EAAG,GAAI;AAAA,KAC9E;AACA,IAAA,WAAA,CAAY,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAA,EAAK,CAAA;AAC3E,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAY,iBAAA,EAAmB,KAAA,EAAO,EAAA,EAAI,EAAA,EAAI,GAAG,CAAC,CAAA;AAE3F,EAAA,MAAM,SAAA,GAAYA,kBAAY,YAAY;AACxC,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,IAAA,KAAS,MAAA,EAAQ;AAC1C,IAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,iBAAA,EAAkB;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,cAAA,CAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,yBAAyB,CAAA;AAAA,IACnF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,IAAA,EAAM,iBAAiB,CAAC,CAAA;AAEnC,EAAA,MAAM,IAAA,GAAOA,kBAAY,YAAY;AACnC,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,IAAA,KAAS,MAAA,EAAQ;AAK1C,IAAA,IAAI,yBAAyB,YAAA,EAAc,MAAA,KAAW,OAAA,IAAW,EAAA,CAAG,WAAW,CAAA,EAAG;AAChF,MAAA,cAAA,CAAe,2CAA2C,CAAA;AAC1D,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,iBAAA,EAAkB;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,CAAU,SAAS,CAAA;AAC/C,MAAA,UAAA,CAAW,MAAM,CAAA;AACjB,MAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAG9B,QAAA,eAAA,CAAgB,QAAQ,CAAA;AACxB,QAAA,QAAA,CAAS,UAAU,CAAA;AACnB,QAAA,QAAA,GAAW,MAAM,CAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,MAAA,QAAA,CAAS,UAAU,CAAA;AACnB,MAAA,0BAAA,CAA2B,WAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AACvE,MAAA,MAAA,GAAS,MAAM,CAAA;AAAA,IACjB,SAAS,KAAA,EAAO;AAId,MAAA,cAAA,CAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAA0B,CAAA;AAClF,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,EAAG;AAAA,IACD,KAAA;AAAA,IACA,IAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,qBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAASA,iBAAAA;AAAA,IACb,OAAO,WAAA,KAAyB;AAC9B,MAAA,IAAI,KAAA,KAAU,OAAA,IAAW,IAAA,KAAS,MAAA,EAAQ;AAC1C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,WAAW,CAAA;AACnB,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA;AACjD,QAAA,UAAA,CAAW,MAAM,CAAA;AACjB,QAAA,eAAA,CAAgB,UAAU,CAAA;AAC1B,QAAA,QAAA,CAAS,UAAU,CAAA;AACnB,QAAA,0BAAA,CAA2B,WAAW,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,QAAQ,CAAA;AAC3E,QAAA,UAAA,GAAa,MAAM,CAAA;AAAA,MACrB,SAAS,KAAA,EAAO;AACd,QAAA,cAAA,CAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,4BAA4B,CAAA;AAAA,MACtF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,MAAM,CAAA;AACd,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,WAAW,UAAU;AAAA,GAC7C;AAMA,EAAA,MAAM,OAAA,GAAUhD,aAAO,IAAI,CAAA;AAC3B,EAAA,MAAM,SAAA,GAAYA,aAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAUA,aAAO,SAAS,CAAA;AAChC,EAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,OAAA,CAAQ,OAAA,GAAU,SAAA;AAClB,EAAAY,gBAAU,MAAM;AACd,IAAA,IAAI,UAAU,OAAA,EAAS;AACvB,IAAA,OAAO,4BAA4B,SAAA,EAAW;AAAA;AAAA;AAAA,MAG5C,MAAM,MAAM,OAAA,CAAQ,SAAQ,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA;AAAA,MAEnD,MAAA,EAAQ,MAAM,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,MACpC,SAAA,EAAW,MAAM,OAAA,CAAQ,OAAA,EAAQ;AAAA,MACjC,QAAQ,IAAA,KAAS;AAAA,KAClB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,SAAA,EAAW,KAAA,EAAO,IAAI,CAAC,CAAA;AAE3B,EAAA,MAAM,WAAA,GAAcT,aAAAA;AAAA,IAClB,OACG,OAAA,EAAS,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,MAChD,SAAS,UAAA,CAAW,EAAA;AAAA,MACpB,IAAA,EAAM,UAAA,CAAW,IAAA,CAAK,IAAA,IAAQ,WAAW,IAAA,CAAK,EAAA;AAAA,MAC9C,MAAA,EAAQ,OAAA;AAAA,MACR,GAAI,UAAA,CAAW,IAAA,CAAK,YAAA,GAAe,EAAE,aAAa,UAAA,CAAW,IAAA,CAAK,YAAA,EAAa,GAAI;AAAC,KACtF,CAAE,CAAA;AAAA,IACJ,CAAC,SAAS,WAAW;AAAA,GACvB;AAEA,EAAA,IAAI,UAAU,SAAA,EAAW;AACvB,IAAA,uBACEvC,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWG,oBAAA,CAAGkC,OAAAA,CAAO,MAAK,EAAG,SAAS,CAAA,EACzC,QAAA,kBAAArC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAWqC,QAAO,QAAA,EAAS,EAAG,iCAAc,CAAA,EACjD,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,IAAA,uBACErC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,oBAAA,CAAGkC,QAAO,IAAA,EAAK,EAAG,SAAS,CAAA,EACzC,0BAAA1B,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW0B,OAAAA,CAAO,UAAS,EAC3B,QAAA,EAAA;AAAA,MAAA,SAAA,IAAa,2BAAA;AAAA,MAA6B,GAAA;AAAA,sBAC3CrC,cAAAA;AAAA,QAACqD,0BAAAA;AAAA,QAAA;AAAA,UACC,SAAS,MAAM,YAAA,CAAa,CAAC,KAAA,KAAU,QAAQ,CAAC,CAAA;AAAA,UAChD,SAAA,EAAU,yFAAA;AAAA,UACX,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,CAAC,OAAA,EAAS;AACpC,IAAA,MAAM,OACJ,YAAA,KAAiB,MAAA,GACb,sBAAA,GACA,YAAA,KAAiB,aACf,0BAAA,GACA,YAAA,KAAiB,QAAA,GACf,CAAA,cAAA,EAAiB,SAAS,KAAA,GAAQ,CAAA,QAAA,EAAM,QAAQ,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAA,GAC5D,yCAAA;AACV,IAAA,uBACErD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,qBAAGkC,OAAAA,CAAO,IAAA,IAAQ,SAAS,CAAA,EAAG,uBAAqB,YAAA,EACjE,QAAA,kBAAArC,eAAC,GAAA,EAAA,EAAE,SAAA,EAAWqC,QAAO,QAAA,EAAS,EAAI,gBAAK,CAAA,EACzC,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE1B,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,qBAAGkC,OAAAA,CAAO,IAAA,EAAK,EAAG,SAAS,CAAA,EACzC,QAAA,EAAA;AAAA,oBAAA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW0B,OAAAA,CAAO,QAAO,EAC5B,QAAA,EAAA;AAAA,sBAAArC,eAAC,MAAA,EAAA,EAAK,SAAA,EAAWqC,OAAAA,CAAO,KAAA,IAAS,QAAA,EAAA,4BAAA,EAAuB,CAAA;AAAA,sBACxD1B,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW0B,OAAAA,CAAO,QAAO,EAAG,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QAAM,QAAQ,MAAA,CAAO;AAAA,OAAA,EAAK;AAAA,KAAA,EAC9D,CAAA;AAAA,oBAEArC,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,UAAU,OAAA,GAAU,MAAA;AAAA,QAC1B,KAAA;AAAA,QACA,aAAA,EAAe,QAAA;AAAA,QACf,WAAA,EAAY,kBAAA;AAAA,QACX,GAAI,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,KAAkB,EAAC;AAAA,QACvD,GAAI,WAAW,CAAC,iBAAA,GAAoB,EAAE,iBAAA,EAAmB,IAAA,KAAS,EAAC;AAAA,QACpE,MAAA,EAAQ,YAAY,IAAA,EAAK;AAAA,QACxB,GAAI,qBAAA,IAAyB,OAAA,CAAQ,aAAA,GAClC;AAAA,UACE,cAAc,OAAA,CAAQ,aAAA;AAAA,UACtB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,UACzB,WAAA,EAAa,IAAA;AAAA,UACb,mBAAA,EAAqB,IAAA;AAAA,UACrB,EAAA;AAAA,UACA,EAAA;AAAA,UACA,GAAA;AAAA,UACA,UAAA,EAAY,KAAA;AAAA,UACZ,UAAA,EAAY,KAAA;AAAA,UACZ,WAAA,EAAa;AAAA,YAEf,EAAC;AAAA,QACJ,GAAI,WAAA,CAAY,MAAA,GAAS,IAAI,EAAE,WAAA,KAAgB,EAAC;AAAA,QACjD,cAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,IAEC,8BAAcW,eAAAA,CAAC,OAAE,SAAA,EAAW0B,OAAAA,CAAO,OAAM,EAAI,QAAA,EAAA;AAAA,MAAA,WAAA;AAAA,MAAY;AAAA,KAAA,EAAuB,CAAA,GAAO,IAAA;AAAA,IAEvF,8BACC1B,eAAAA,CAAC,SAAI,SAAA,EAAW0B,OAAAA,CAAO,SAAQ,EAC5B,QAAA,EAAA;AAAA,MAAA,kBAAA,mBACC1B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,wBACxDA,cAAAA;AAAA,UAACiB,wBAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAQ,OAAA;AAAA,YACR,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,IAAI,CAAA;AAAA,YAC/B,YAAY,IAAA,KAAS,MAAA;AAAA,YACtB,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAjB,cAAAA,CAACiB,wBAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAQ,QAAA,EAAS,OAAA,EAAS,MAAM,qBAAA,CAAsB,KAAK,CAAA,EAAG,QAAA,EAAA,QAAA,EAEhF;AAAA,OAAA,EACF,oBAEAjB,cAAAA;AAAA,QAACiB,wBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,KAAK,CAAA;AAAA,UAChC,YAAY,IAAA,KAAS,MAAA;AAAA,UACtB,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBAEFjB,cAAAA;AAAA,QAACiB,wBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS,MAAM,KAAK,SAAA,EAAU;AAAA,UAC9B,UAAA,EAAY,IAAA,KAAS,MAAA,IAAU,CAAC,OAAA;AAAA,UAE/B,QAAA,EAAA,IAAA,KAAS,WAAW,cAAA,GAAY;AAAA;AAAA;AACnC,KAAA,EACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;ACnZO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA,GAAa,cAAA;AAAA,EACb,cAAA,GAAiB,WAAA;AAAA,EACjB,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIiB,eAAyB,IAAI,CAAA;AAC3D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAoC,IAAI,CAAA;AAKtE,EAAA,MAAM,YAAA,GAAeE,aAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,EAAA,MAAM,cAAA,GAAiBA,aAAO,WAAW,CAAA;AACzC,EAAA,cAAA,CAAe,OAAA,GAAU,WAAA;AAKzB,EAAA,MAAM,aAAA,GAAgBA,aAAO,KAAK,CAAA;AAClC,EAAA,MAAM,MAAA,GAASgD,iBAAAA,CAAY,CAAC,IAAA,EAA0B,OAAA,KAAsB;AAC1E,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,IAAI,cAAc,OAAA,EAAS;AAC3B,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,YAAA,CAAa,OAAA,GAAU,MAAM,OAAO,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAApC,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAA,CAAM,YAAY;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA;AAChD,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,UAAA,CAAW,MAAM,CAAA;AACjB,QAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAC9C,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAA,CAAO,UAAU,MAAM,CAAA;AACvB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,UAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,eAAA,CAAgB,OAAO,eAAe,CAAA;AACxE,UAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,YAAA,CAAa,WAAW,EAAE,CAAA;AAAA,QACvD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,cAAA,CAAe,OAAA,GAAU,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,MACpF;AAAA,IACF,CAAA,GAAG;AACH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAC,CAAA;AAI9B,EAAA,MAAM,SAAA,GAAY,uBAAuB,SAAS,CAAA;AAClD,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,IAAA,EAAM,UAAU,OAAO,CAAA;AAAA,EACzD,CAAA,EAAG,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AAEtB,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,KAAK,SAAA,CAAU,SAAS,CAAA,CACrB,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,IAAI,MAAA,SAAe,MAAM,CAAA;AAAA,IAC3B,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,uBACErC,eAAAA,CAAAQ,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAnB,cAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAA,EAAO,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,QAChC,UAAA,EAAY,aAAa,OAAO,CAAA;AAAA,QAChC,OAAA;AAAA,QACA,SAAA,EAAW,OAAA;AAAA,QACX,iBAAA,EAAmB,YAAA;AAAA,QAClB,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB,EAAC;AAAA,QACrD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA,KAClD;AAAA,IACC,SAAA,GAAY,uBACXW,eAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,YAAA,EAAc,SAAA;AAAA,QACd,cAAA;AAAA,QACC,GAAI,gBAAA,KAAqB,MAAA,GAAY,EAAE,SAAA,EAAW,gBAAA,KAAqB,EAAC;AAAA,QAEzE,QAAA,EAAA;AAAA,0BAAAX,eAAC,WAAA,EAAA,EACC,QAAA,kBAAAA,cAAAA,CAAC,UAAA,EAAA,EAAY,sBAAW,CAAA,EAC1B,CAAA;AAAA,0BACAA,cAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,2BACnB,QAAA,kBAAAA,cAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,SAAA;AAAA,cACA,MAAA;AAAA,cACA,aAAA,EAAc,eAAA;AAAA,cACd,MAAA,EAAQ,CAAC,IAAA,KAAS,MAAA,CAAO,gBAAgB,IAAA,CAAK,MAAM,CAAA,IAAK,MAAA,EAAQ,IAAI,CAAA;AAAA,cACrE,UAAA,EAAY,CAAC,QAAA,KAAa,MAAA,CAAO,YAAY,QAAQ,CAAA;AAAA,cACrD,QAAA,EAAU,CAAC,MAAA,KAAW,MAAA,CAAO,UAAU,MAAM;AAAA;AAAA,WAC/C,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ;AAIA,SAAS,QAAA,CAAS,SAAkB,OAAA,EAAyB;AAC3D,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,KAAS,MAAM,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA;AAC7F,EAAA,OAAO,WAAW,SAAA,IAAa,eAAA;AACjC;AAEA,SAAS,aAAa,OAAA,EAA4B;AAChD,EAAA,OAAA,CAAQ,OAAA,CAAQ,UAAA,IAAc,EAAC,EAC5B,MAAA,CAAO,CAAC,SAAA,KAAc,SAAA,CAAU,IAAA,KAAS,IAAI,CAAA,CAC7C,GAAA,CAAI,CAAC,cAAc,SAAA,CAAU,IAAA,IAAQ,SAAA,CAAU,KAAA,IAAS,SAAA,CAAU,WAAW,CAAA,CAC7E,MAAA,CAAO,CAAC,KAAA,KAA2B,CAAC,CAAC,KAAK,CAAA;AAC/C;ACxLO,IAAM,mBAAmBK,mBAAAA,CAAG;AAAA,EACjC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,6CAAA;AAAA,IACN,GAAA,EAAK,4EAAA;AAAA,IACL,KAAA,EAAO,uCAAA;AAAA,IACP,WAAA,EAAa,8DAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,MAAA;AAAA,QACN,GAAA,EAAK;AAAA,OACP;AAAA,MACA,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,MAAA;AAAA,QACN,GAAA,EAAK;AAAA;AACP;AACF,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA;AAC3B,CAAC;AAYM,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAMgC,OAAAA,GAAS,gBAAA,CAAiB,EAAE,IAAA,EAAM,CAAA;AACxC,EAAA,uBACE1B,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,qBAAGkC,OAAAA,CAAO,IAAA,EAAK,EAAG,SAAS,CAAA,EACxC,QAAA,EAAA;AAAA,IAAA,IAAA,mBAAOrC,eAAC,KAAA,EAAA,EAAI,SAAA,EAAWqC,QAAO,GAAA,EAAI,EAAI,gBAAK,CAAA,GAAS,IAAA;AAAA,oBACrDrC,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWqC,OAAAA,CAAO,KAAA,IAAU,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACtC,WAAA,mBAAcrC,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWqC,OAAAA,CAAO,WAAA,EAAY,EAAI,QAAA,EAAA,WAAA,EAAY,CAAA,GAAS,IAAA;AAAA,IAC1E,MAAA,mBAASrC,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAWqC,OAAAA,CAAO,OAAA,EAAQ,EAAI,QAAA,EAAA,MAAA,EAAO,CAAA,GAAS;AAAA,GAAA,EAC/D,CAAA;AAEJ;AC9CO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAU,EAAwB;AACjE,EAAA,uBACErC,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWG,oBAAA,CAAG,oDAAA,EAAsD,SAAS,CAAA;AAAA,MAE7E,0BAAAH,cAAAA,CAAC4H,mBAAA,EAAA,EAAQ,SAAA,EAAU,WAAA,EAAY,aAAa,GAAA,EAAK;AAAA;AAAA,GACnD;AAEJ;ACZO,IAAM,+BAA+BvH,mBAAAA,CAAG;AAAA,EAC7C,IAAA,EAAM;AAAA,IACJ,oFAAA;AAAA,IACA;AAAA;AAEJ,CAAC;AAgBM,SAAS,sBAAA,CAAuB;AAAA,EACrC,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,IAAA,GAAO,mBAAmB,WAAW,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,eAAe,WAAW,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAM,IAAI,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,QAAK,CAAA;AAEpD,EAAA,uBACEM,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,qBAAG,4BAAA,EAA6B,EAAG,SAAS,CAAA,EAC1D,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4FAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,IAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAU,QAAA,EAAS,CAAA,EACvC,CAAA;AAAA,oBACAW,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAAA,EACd,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EAAuD,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,MAC3E,YAAA,mBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4CAAA,EAA8C,QAAA,EAAA,YAAA,EAAa,CAAA,GACzE,IAAA,mBACFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2CAAA,EAA6C,gBAAK,CAAA,GAChE;AAAA,KAAA,EACN,CAAA;AAAA,IACC,UAAA,mBACCA,cAAAA,CAACiB,wBAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,IAAA,EAAK,WAAU,YAAA,EAAY,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,EAAI,OAAA,EAAS,YAC9E,QAAA,kBAAAjB,cAAAA,CAAC6H,wBAAS,aAAA,EAAW,IAAA,EAAC,GACxB,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AC/CO,IAAM,sBAAsBxH,mBAAAA,CAAG;AAAA,EACpC,IAAA,EAAM;AAAA,IACJ,yDAAA;AAAA;AAAA,IAEA,2DAAA;AAAA,IACA,8DAAA;AAAA,IACA;AAAA;AAEJ,CAAC;AAeM,SAAS,cAAc,EAAE,MAAA,EAAQ,cAAc,GAAA,EAAK,IAAA,EAAM,YAAW,EAAuB;AACjG,EAAA,uBACEL,cAAAA;AAAA,IAACkF,gCAAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA,EAAa,IAAA;AAAA,MACb,WAAW,mBAAA,EAAoB;AAAA,MAE/B,0BAAAlF,cAAAA,CAACmF,yBAAAA,EAAA,EAAU,SAAA,EAAU,gBACnB,QAAA,kBAAAxE,eAAAA;AAAA,QAACP,0BAAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAY,IAAA;AAAA,UACZ,SAAA,EAAU,+CAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,GAAA,mBACCJ,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,GAAA;AAAA,gBACA,GAAA,EAAK,IAAA;AAAA,gBACL,SAAA,EAAU;AAAA;AAAA,aACZ,GACE,IAAA;AAAA,4BAGJW,eAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWR,oBAAA;AAAA,kBACT,2BAAA;AAAA,kBACA,4DAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EAA2D,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,kBAC/E,6BACCA,cAAAA;AAAA,oBAACiB,wBAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAQ,OAAA;AAAA,sBACR,IAAA,EAAK,SAAA;AAAA,sBACL,YAAA,EAAY,YAAY,IAAI,CAAA,CAAA;AAAA,sBAC5B,OAAA,EAAS,UAAA;AAAA,sBAET,QAAA,kBAAAjB,cAAAA,CAAC6H,oBAAAA,EAAA,EAAS,eAAW,IAAA,EAAC;AAAA;AAAA,mBACxB,GACE,IAAA;AAAA,kCACJ7H,cAAAA,CAACiB,wBAAA,EAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,SAAQ,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,YAAA,EAAW,SAC7D,QAAA,kBAAAjB,cAAAA,CAACkB,eAAA,EAAE,aAAA,EAAW,MAAC,CAAA,EACjB;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,OACF,EACF;AAAA;AAAA,GACF;AAEJ;AC3EO,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,GAAA,EAAK,YAAW,EAAmB;AACnE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIgB,eAAS,KAAK,CAAA;AAE1D,EAAA,uBACEvB,eAAAA,CAAAQ,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAnB,cAAAA;AAAA,MAACqD,0BAAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAY,WAAW,IAAI,CAAA,CAAA;AAAA,QAC3B,OAAA,EAAS,MAAM,iBAAA,CAAkB,IAAI,CAAA;AAAA,QACrC,SAAA,EAAU,uHAAA;AAAA,QAEV,0BAAArD,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAU,GAAA,EAAK,IAAA,EAAM,WAAU,sCAAA,EAAuC;AAAA;AAAA,KAC7E;AAAA,oBACAA,cAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,cAAA;AAAA,QACR,YAAA,EAAc,iBAAA;AAAA,QACd,GAAA;AAAA,QACA,IAAA;AAAA,QACC,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC;AAAA;AACtC,GAAA,EACF,CAAA;AAEJ;AC3BO,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,GAAA,EAAI,EAAmB;AACvD,EAAA;AAAA;AAAA,oBAEEA,eAAC,OAAA,EAAA,EAAM,QAAA,EAAQ,MAAC,GAAA,EAAU,YAAA,EAAY,IAAA,EAAM,SAAA,EAAU,8BAAA,EAA+B;AAAA;AAEzF;ACMA,IAAM,OAAA,GAAU8H,UAAA,CAAK,MAAM,OAAO,yBAAY,CAAC,CAAA;AAExC,IAAM,mBAAmBzH,mBAAAA,CAAG;AAAA,EACjC,IAAA,EAAM;AAAA,IACJ,+CAAA;AAAA,IACA;AAAA;AAEJ,CAAC;AAWM,SAAS,yBAAyB,WAAA,EAAsC;AAC7E,EAAA,IAAI,CAAC,aAAa,OAAO,MAAA;AACzB,EAAA,IAAI,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,OAAA;AAC7C,EAAA,IAAI,WAAA,CAAY,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,OAAA;AAC7C,EAAA,IAAI,WAAA,KAAgB,mBAAmB,OAAO,KAAA;AAC9C,EAAA,OAAO,MAAA;AACT;AAsBA,IAAM,iBAAA,GAAoB,GAAA;AAEnB,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA,GAAW,iBAAA;AAAA,EACX,YAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,UAAA;AAAA,EACA;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,IAAA,GAAO,yBAAyB,WAAW,CAAA;AAEjD,EAAA,MAAM,2BACJL,cAAAA;AAAA,IAAC,sBAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACC,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,MACnD,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB,EAAC;AAAA,MACnD,GAAI,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,KAAiB,EAAC;AAAA,MACrD,GAAI,WAAA,GAAc,EAAE,IAAA,EAAM,sBAAA,KAA2B,EAAC;AAAA,MACtD,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,MACnC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA,GAClD;AAGF,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,YAAA,IAAgB,WAAA,EAAa,OAAO,QAAA;AAE3D,EAAA,MAAM,QAAA,mBACJA,cAAAA,CAACiG,0BAAA,EAAA,EAAS,cAAY,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAG7F,EAAA,uBACEjG,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,oBAAA,CAAG,gBAAA,EAAiB,EAAG,SAAS,CAAA,EAAG,KAAA,EAAO,EAAE,MAAA,EAAQ,QAAA,EAAS,EAC1E,QAAA,EAAA,CAAC,GAAA,GACA,QAAA,GACE,IAAA,KAAS,OAAA,mBACXH,cAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAY,GAAA,EAAW,GAAI,UAAA,GAAa,EAAE,UAAA,EAAW,GAAI,EAAC,EAAI,CAAA,GACvE,IAAA,KAAS,OAAA,mBACXA,cAAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAY,GAAA,EAAU,CAAA,mBAEjCA,cAAAA,CAAC+H,cAAA,EAAA,EAAS,QAAA,EAAU,QAAA,EAClB,QAAA,kBAAA/H,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,GAAA,EAAW,GAAI,UAAA,GAAa,EAAE,UAAA,EAAW,GAAI,EAAC,EAAI,CAAA,EACzE,CAAA,EAEJ,CAAA;AAEJ;ACnGO,IAAM,wBAAwBK,mBAAAA,CAAG;AAAA,EACtC,IAAA,EAAM;AAAA,IACJ,gCAAA;AAAA,IACA,+CAAA;AAAA,IACA;AAAA;AAEJ,CAAC;AAgBM,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAyB;AAGvB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI6B,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,GAAA,KAAQ,MAAA,IAAa,SAAA,KAAc,GAAA;AAEpD,EAAA,uBACEvB,eAAAA;AAAA,IAAC0C,0BAAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,WAAW,IAAI,CAAA,CAAA;AAAA,MAC1B,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAAA,MAC9B,SAAA,EAAWlD,oBAAA,CAAG,qBAAA,EAAsB,EAAG,SAAS,CAAA;AAAA,MAE/C,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA;AAAA;AAAA,0BAGCH,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,GAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,MAAA;AAAA,cACR,MAAA,EAAQ,MAAM,YAAA,CAAa,GAAG,CAAA;AAAA,cAC9B,OAAA,EAAS,MAAM,WAAA,IAAc;AAAA,cAC7B,SAAA,EAAWG,oBAAA;AAAA,gBACT,kDAAA;AAAA,gBACA,CAAC,QAAA,IAAY;AAAA;AACf;AAAA;AACF,YACE,IAAA;AAAA,QAGH,CAAC,QAAA,mBAAWH,eAACiG,0BAAA,EAAA,EAAS,SAAA,EAAU,uBAAsB,CAAA,GAAK;AAAA;AAAA;AAAA,GAC9D;AAEJ;;;AC5EA,IAAM,sBAAA,mBAAyB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAC,CAAA;AAS3F,SAAS,uBAAuB,IAAA,EAAuB;AAC5D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAChC,EAAA,IAAI,OAAO,CAAA,IAAK,GAAA,KAAQ,IAAA,CAAK,MAAA,GAAS,GAAG,OAAO,KAAA;AAChD,EAAA,OAAO,sBAAA,CAAuB,IAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,aAAa,CAAA;AACrE;AC0BO,SAAS,KAAA,CAAM;AAAA,EACpB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAe;AACb,EAAA,MAAM5D,UAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,UAAA,EAAY,cAAc,CAAA;AACpE,EAAA,uBACE1B,eAAAA;AAAA,IAACyD,6BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVjE,oBAAA;AAAA,QACE,0BAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAC/DxC,cAAAA;AAAA,UAAC4C,yBAAAA;AAAA,UAAA;AAAA,YACE,GAAG,UAAA;AAAA,YACJ,aAAa,WAAA,IAAe,EAAA;AAAA,YAC5B,SAAA,EAAWzC,qBAAGkC,OAAAA,CAAO,GAAA,IAAOA,OAAAA,CAAO,OAAA,IAAW,cAAc;AAAA;AAAA,SAC9D;AAAA,QACC,WAAA,mBACCrC,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD;AAAA;AAAA;AAAA,GACN;AAEJ;ACtCO,IAAM,WAAA,GAAc6D;AAOpB,IAAM,cAAA,GAAiBC;AAKvB,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,MAAA,GAAS,GAAG,SAAA,GAAY,cAAA,EAAgB,GAAG,KAAA,EAAM,EAAqB;AAC7G,EAAA,uBACEjI,cAAAA;AAAA,IAACE,2BAAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,SAAA;AAAA,MACC,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVC,oBAAA;AAAA,QACE,4DAAA;AAAA,QACA,oDAAA;AAAA,QACA,4DAAA;AAAA,QACA,4DAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA;AAC7D;AAAA,GAEJ;AAEJ;AAKO,SAAS,IAAA,CAAuB,EAAE,SAAA,EAAW,GAAG,OAAM,EAAiB;AAC5E,EAAA,uBACEH,cAAAA;AAAA,IAACkI,wBAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACV/H,oBAAA;AAAA,QACE,mCAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA;AAC7D;AAAA,GAEJ;AAEJ;AAUA,IAAM,cAAA,GAAiBA,oBAAA;AAAA,EACrB,gFAAA;AAAA,EACA,8CAAA;AAAA,EACA,qEAAA;AAAA,EACA,+CAAA;AAAA;AAAA,EACA,yHAAA;AAAA,EACA;AACF,CAAA;AAGO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,SAAA,EAAW,GAAG,OAAM,EAAkB;AAC3F,EAAA,uBACEQ,eAAAA;AAAA,IAACwH,4BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVhI,oBAAA,CAAG,cAAA,EAAgB,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI,SAAS,CAAA;AAAA,MAGxF,QAAA,EAAA;AAAA,QAAA,IAAA,mBAAOH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,gBAAK,CAAA,GAAU,IAAA;AAAA,wBACrEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAS,CAAA;AAAA,QAC3C,6BAAaA,cAAAA,CAACoI,0BAAA,EAAa,SAAA,EAAU,mCAAkC,CAAA,GAAK;AAAA;AAAA;AAAA,GAC/E;AAEJ;AC5FA,IAAM,gBAAA,GAAmBC,oBAAc,KAAK,CAAA;AAE5C,SAAS,WAAA,GAAc;AACrB,EAAA,OAAO7D,iBAAW,gBAAgB,CAAA;AACpC;AAmBO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,EAAe;AACjB,CAAA,EAAoB;AAClB,EAAA,MAAM,OAAA,GAAU,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,UAAa,MAAA,KAAW,MAAA;AACzE,EAAA,uBACE7D,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAWR,qBAAG,sBAAA,EAAwB,SAAS,CAAA,EAAG,aAAA,EAAa,UAAA,EACjE,QAAA,EAAA;AAAA,IAAA,OAAA,mBACCQ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,KAAU,MAAA,mBACTX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEACb,QAAA,EAAA,KAAA,EACH,CAAA,mBAEAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,sBAERW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,KAAA,KAAU,yBACTX,cAAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EAAoC,iBAAM,CAAA,GACxD,IAAA;AAAA,QACH;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IACH;AAAA,GAAA,EACH,CAAA;AAEJ;AAIO,IAAM,gBAAgBK,mBAAAA,CAAG;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,gCAAA;AAAA,IACA,2BAAA;AAAA,IACA,6BAAA;AAAA,IACA,8CAAA;AAAA,IACA,uCAAA;AAAA,IACA,0EAAA;AAAA,IACA,2BAAA;AAAA,IACA,mCAAA;AAAA,IACA,4CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA,MAIR,IAAA,EAAM;AAAA,QACJ,mCAAA;AAAA;AAAA,QAEA,mFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,+BAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA;AAAA;AAAA,IAGhB,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,OAAO,UAAA;AAAW,GACtD;AAAA,EACA,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,UAAU,KAAA;AAChD,CAAC;AAiBM,SAAS,OAAA,CAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,UAAU,SAAA,EAAW,QAAA,EAAU,GAAG,KAAA,EAAM,EAAiB;AAC9F,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,uBACEM,eAAAA;AAAA,IAAC0C,0BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVlD,oBAAA;AAAA,QACE,aAAA,CAAc,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,QACpC,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,IAAA,KAAS,yBACRH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAWG,oBAAA;AAAA,cACT,yCAAA;AAAA,cACA,WAAW,aAAA,GAAgB,YAAA;AAAA,cAC3B;AAAA,aACF;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH,GACE,IAAA;AAAA,wBACJH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA2B,QAAA,EAAS,CAAA;AAAA,QACnD,KAAA,KAAU,yBACTA,cAAAA,CAAC,UAAK,SAAA,EAAU,+DAAA,EACb,iBACH,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAiBO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,KAAA,EAAO,UAAU,SAAA,EAAW,GAAG,OAAM,EAAkB;AACtF,EAAA,uBACEW,gBAAC2H,8BAAA,EAAA,EAAY,GAAG,OAAO,SAAA,EAAWnI,oBAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA,EACrE,QAAA,EAAA;AAAA,oBAAAH,cAAAA,CAACoB,2BAAAA,EAAA,EAAQ,SAAA,EAAU,OACjB,QAAA,kBAAAT,eAAAA;AAAA,MAAC0C,0BAAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,SAAA;AAAA,QACL,SAAA,EAAWlD,oBAAA;AAAA,UACT,kCAAA;AAAA,UACA,6BAAA;AAAA,UACA,wDAAA;AAAA,UACA,uDAAA;AAAA,UACA,gCAAA;AAAA,UACA,mCAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,KAAS,yBACRH,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAU,mEAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WACH,GACE,IAAA;AAAA,0BACJA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA2B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACjDA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAQ,WAAA;AAAA,cACR,aAAA,EAAW,IAAA;AAAA,cACX,SAAA,EAAU,0GAAA;AAAA,cAEV,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,CAAA,EAAE,gBAAA;AAAA,kBACF,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAY,KAAA;AAAA,kBACZ,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AACF;AAAA;AAAA,KACF,EACF,CAAA;AAAA,oBACAA,cAAAA,CAACuI,mCAAA,EAAA,EACC,QAAA,kBAAAvI,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,oBAAA;AAAA,UACT,0BAAA;AAAA;AAAA;AAAA,UAGA,qFAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,0BAAAH,cAAAA,CAAC,gBAAA,CAAiB,UAAjB,EAA0B,KAAA,EAAO,MAAO,QAAA,EAAS;AAAA;AAAA,KACpD,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AC/NA,IAAM,OAAA,GAAwC,EAAE,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAG;AAG/E,IAAM,MAAA,GAAwC,EAAE,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAG;AAiBxE,SAAS,GAAA,CAAI,EAAE,IAAA,GAAO,IAAA,EAAM,KAAA,GAAQ,WAAW,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,KAAA,EAAM,EAAa;AAChG,EAAA,MAAM,EAAA,GAAK,QAAQ,IAAI,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,EAAA,uBACEA,cAAAA;AAAA,IAACwI,wBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACL,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,MACvC,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,KAAU,EAAC;AAAA,MACxC,SAAA,EAAWrI,oBAAA,CAAG,uBAAA,EAAyB,SAAS,CAAA;AAAA,MAC/C,GAAI,EAAA,KAAO,MAAA,GAAS,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAG,EAAE,GAAI,EAAC;AAAA,MAC5D,GAAI,QAAQ,EAAE,YAAA,EAAc,OAAM,GAAI,EAAE,eAAe,IAAA;AAAK;AAAA,GAC/D;AAEJ;ACtCO,IAAM,oBAAoBE,mBAAAA,CAAG;AAAA,EAClC,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,2DAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,EAAE,KAAA,EAAO,KAAA,EAAM;AAAA,MACnB,EAAA,EAAI,EAAE,KAAA,EAAO,KAAA;AAAM;AACrB,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA;AAC3B,CAAC;AAQM,SAAS,YAAY,EAAE,IAAA,EAAM,SAAA,EAAW,GAAG,OAAM,EAAqB;AAC3E,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,KAAS,iBAAA,CAAkB,EAAE,MAAM,CAAA;AAClD,EAAA,uBACEL,cAAAA,CAACyI,+BAAA,EAAA,EAAiB,GAAG,OAAO,SAAA,EAAWtI,oBAAA,CAAG,OAAA,EAAS,SAAS,CAAA,EACzD,QAAA,EAAA,CAAC,EAAE,UAAA,EAAY,iBAAgB,qBAC9BH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,KAAA,EAAM,EACnB,QAAA,EAAA,eAAA,mBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWG,oBAAA,CAAG,IAAA,EAAK,EAAG,iDAAiD,CAAA,EAAG,oBAE/EH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWG,oBAAA,CAAG,IAAA,EAAK,EAAG,iCAAiC,CAAA;AAAA,MACvD,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,UAAA,IAAc,CAAC,CAAA,CAAA,CAAA;AAAI;AAAA,KAG5C,CAAA,EAEJ,CAAA;AAEJ;AC7BO,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,UAAA;AAAA,EACd,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoB;AAClB,EAAA,uBACEQ,eAAAA;AAAA,IAAC+H,8BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,WAAA;AAAA,MACA,SAAA,EAAW,CAAC,WAAA,KACVvI,oBAAA,CAAG,YAAA,EAAc,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI,SAAS,CAAA;AAAA,MAGtF,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAC/DxC,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWG,oBAAA;AAAA,cACT,WAAA,KAAgB,eACZ,6CAAA,GACA;AAAA,aACN;AAAA,YAEC;AAAA;AAAA,SACH;AAAA,QACC,WAAA,mBACCH,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,mBAAef,cAAAA,CAACmE,8BAAAA,EAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,wBAAa,CAAA,GAAgB;AAAA;AAAA;AAAA,GACzF;AAEJ;AAMO,SAAS,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,OAAM,EAAe;AACnE,EAAA,uBACExD,eAAAA;AAAA,IAACgI,yBAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVxI,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKE,gEAAA;AAAA,QACA,8CAAA;AAAA,QACA,+DAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGF,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAWG,oBAAA;AAAA,cACT,2DAAA;AAAA,cACA,yDAAA;AAAA,cACA,mDAAA;AAAA,cACA,iCAAA;AAAA,cACA,kCAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWG,oBAAA;AAAA,kBACT,0CAAA;AAAA,kBACA,2CAAA;AAAA,kBACA;AAAA;AACF;AAAA;AACF;AAAA,SACF;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;AC3EO,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,OAAA,GAAoC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC3D,IAAI,CAAA,CAAE,IAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,WAAA,kBAAaH,cAAAA,CAAC,YAAA,EAAA,EAAc,YAAE,IAAA,EAAK;AAAA,GACrC,CAAE,CAAA;AAEF,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,gBAAA;AAAA,MACX,WAAA,EAAY,sBAAA;AAAA,MACZ,OAAA;AAAA,MACA,WAAA,EAAa,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,KAAA;AAAA,MACnC,iBAAA,EAAmB,CAAC,GAAA,KAAQ;AAC1B,QAAA,IAAI,OAAO,IAAA,EAAM;AACjB,QAAA,MAAM,MAAA,GAAS,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,GAAG,CAAC,CAAA;AACxD,QAAA,IAAI,MAAA,WAAiB,MAAM,CAAA;AAAA,MAC7B,CAAA;AAAA,MAGA,WAAA,EAAY,OAAA;AAAA,MACZ,SAAA;AAAA,MACA,IAAA;AAAA,MACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,MAClD,SAAA,EAAWG,oBAAA,CAAG,QAAA,EAAU,SAAS;AAAA;AAAA,GACnC;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAC3D,EAAA,uBACEH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAgE,QAAA,EAAS,CAAA;AAE7F;;;ACtDO,IAAM,qBAAA,GAAwB;AAO9B,SAAS,kBAAkB,KAAA,EAAyD;AACzF,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAyB,CAAC,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA,CAAK,qBAAqB,CAAA;AACrG;;;ACbO,IAAM,SAAA,GAA+C;AAAA,EAC1D;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,GAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,GAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAC,QAAA,EAAU,OAAA,EAAS,iBAAiB,CAAA,EAAE;AAAA,EAC7F,EAAE,EAAA,EAAI,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAC,QAAA,EAAU,iBAAiB,CAAA,EAAE;AAAA,EAC1F,EAAE,EAAA,EAAI,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAC,QAAA,EAAU,iBAAiB,CAAA,EAAE;AAAA,EACtF;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO,CAAC,QAAA,EAAU,SAAA,EAAW,YAAY,UAAU;AAAA,GACrD;AAAA,EACA,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAkB,OAAO,CAAA,EAAG,KAAA,EAAO,CAAC,UAAU,CAAA,EAAE;AAAA,EACpE;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO,CAAC,QAAA,EAAU,SAAA,EAAW,YAAY,UAAU;AAAA,GACrD;AAAA,EACA,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,iBAAA,EAAmB,OAAO,CAAA,EAAG,KAAA,EAAO,CAAC,UAAU,CAAA,EAAE;AAAA,EACrE;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA;AACF;AAEJ;AAEA,IAAM,kBAAA,GAEF;AAAA,EACF,MAAA,EAAQ,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAI,cAAA,EAAgB,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,gBAAA,EAAiB;AAAA,EACxF,OAAA,EAAS,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAI,cAAA,EAAgB,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,gBAAA,EAAiB;AAAA,EACzF,QAAA,EAAU,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAI,cAAA,EAAgB,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,gBAAA,EAAiB;AAAA,EAC1F,QAAA,EAAU,EAAE,EAAA,EAAI,OAAA,EAAS,IAAI,WAAA,EAAa,EAAA,EAAI,UAAA,EAAY,EAAA,EAAI,WAAA,EAAY;AAAA,EAC1E,OAAO,EAAE,QAAA,EAAU,YAAY,KAAA,EAAO,UAAA,EAAY,WAAW,cAAA,EAAe;AAAA,EAC5E,OAAA,EAAS,EAAE,EAAA,EAAI,IAAA,EAAM,IAAI,QAAA;AAC3B,CAAA;AAEO,SAAS,iBAAiB,IAAA,EAA0D;AACzF,EAAA,OAAO,SAAA,CAAU,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO;AACnE,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAI,CAAA,GAAI,GAAG,EAAE,CAAA;AACjD,IAAA,OAAO,WAAW,EAAE,GAAG,EAAA,EAAI,KAAA,EAAO,UAAS,GAAI,EAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAEO,SAAS,aAAa,EAAA,EAAwD;AACnF,EAAA,OAAO,UAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC1C;AAEO,SAAS,QAAQ,QAAA,EAA6C;AACnE,EAAA,OAAO,YAAA,CAAa,QAAQ,CAAA,EAAG,KAAA,IAAS,CAAA;AAC1C;AAMO,SAAS,eAAA,CAAgB,MAAuB,KAAA,EAAmC;AACxF,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AACxB,EAAA,IAAI,KAAA,KAAU,GAAA,EAAK,OAAO,EAAC;AAC3B,EAAA,IAAI,IAAA,KAAS,WAAW,OAAO,IAAA;AAC/B,EAAA,OAAO,EAAA;AACT;AC9IA,IAAM,qBAAA,GAAwBqI,oBAAiD,MAAS,CAAA;AAEjF,SAAS,sBAAA,CAAuB;AAAA,EACrC,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,IAAI,aAAa,MAAA,EAAW,uBAAOrI,cAAAA,CAAAmB,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAC/C,EAAA,uBACEnB,cAAAA,CAAC,qBAAA,CAAsB,UAAtB,EAA+B,KAAA,EAAO,UAAW,QAAA,EAAS,CAAA;AAE/D;AAEO,SAAS,iBAAA,GAAuD;AACrE,EAAA,OAAOwE,iBAAW,qBAAqB,CAAA;AACzC;AAUO,SAAS,UAAU,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,YAAW,EAAmB;AAChF,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAQ,CAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AAExB,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAC3B,KAAA,GACA,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,MAAA,GAAS,CAAA,GAC1C,MAAM,KAAA,CAAM,GAAG,EAAE,MAAA,CAAO,OAAO,IAC/B,EAAC;AACP,IAAA,IAAI,IAAI,MAAA,KAAW,CAAA,yBAAUxE,cAAAA,CAAC,MAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC5B,IAAA,uBACEW,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVX,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UAEC,KAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA,EAAO,CAAA;AAAA,UACN,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe;AAAC,SAAA;AAAA,QAJ7C;AAAA,OAMR,CAAA;AAAA,MACA,IAAI,MAAA,GAAS,CAAA,mBACZW,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,kCAAA,EAAmC,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE,IAAI,MAAA,GAAS;AAAA,OAAA,EAAE,CAAA,GAClE;AAAA,KAAA,EACN,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,KAAA,KAAU,MAAM,KAAA,IAAS,IAAA,yBAAaX,cAAAA,CAAC,MAAG,QAAA,EAAA,QAAA,EAAC,CAAA;AAC/C,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,MAClB,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe;AAAC;AAAA,GACpD;AAEJ;AAEA,SAAS,QAAA,CAAS;AAAA,EAChB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AAGD,EAAA,MAAM,kBAAkB,iBAAA,EAAkB;AAC1C,EAAA,MAAM,oBAAoB,UAAA,IAAc,eAAA;AACxC,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,MAAM,SAAS,iBAAA,CAAkB,EAAE,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAC3D,IAAA,IAAI,WAAW,MAAA,EAAW,uBAAOA,cAAAA,CAAAmB,mBAAAA,EAAA,EAAG,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,KAAA,EAAO,KAAK,CAAA;AAC1C,IAAA,uBACEnB,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAA,EAAQ,OAAA;AAAA,QACjB,KAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACP,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,QAC/C,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,KAAS,EAAC;AAAA,QAE5C,kBAAQ,KAAA,IAAS;AAAA;AAAA,KACpB;AAAA,EAEJ;AACA,EAAA,uBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWG,oBAAA,CAAG,uDAAuD,CAAA,EACxE,QAAA,EAAA,WAAA,CAAY,KAAA,EAAO,QAAA,EAAU,KAAK,CAAA,EACrC,CAAA;AAEJ;AAEA,SAAS,EAAA,CAAG,EAAE,QAAA,EAAS,EAAyB;AAC9C,EAAA,uBAAOH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAS,CAAA;AACtE;AAKA,SAAS,cAAA,CAAe,OAAoB,KAAA,EAAe;AACzD,EAAA,OAAO,MAAM,OAAA,EAAS,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,UAAU,KAAK,CAAA;AAC/D;AAEO,SAAS,WAAA,CACd,KAAA,EACA,QAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAQ,CAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,EAAA;AACxB,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAC3B,QACA,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA,GAC1C,KAAA,CAAM,KAAA,CAAM,GAAG,IACf,EAAC;AACP,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,QAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,eAAe,KAAA,EAAO,CAAC,CAAA,EAAG,KAAA,IAAS,CAAC,CAAA;AAClE,MAAA,OAAO,OAAO,MAAA,IAAU,CAAA,GACpB,OAAO,IAAA,CAAK,IAAI,IAChB,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,KAAK,MAAA,CAAO,CAAC,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,SAAS,CAAC,CAAA,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAI,MAAA,IAAU,CAAA,GAAI,IAAI,IAAA,CAAK,IAAI,IAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,KAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA;AAAA,EACnF;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW,OAAO,UAAU,IAAA,IAAQ,KAAA,KAAU,SAAS,MAAA,GAAS,OAAA;AACnF,EAAA,IAAI,KAAA,KAAU,EAAA,IAAM,KAAA,IAAS,IAAA,EAAM,OAAO,QAAA;AAM1C,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,OAAO,cAAA,CAAe,OAAO,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,KAAA,IAAS,OAAO,KAAK,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,SAAS,SAAA,EAAW;AACvD,IAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,IAAA,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA,GAAI,EAAE,cAAA,EAAe,GAAI,OAAO,KAAK,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AChLO,IAAM,yBAAyBK,mBAAAA,CAAG;AAAA,EACvC,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKL,KAAA,EAAO,iFAAA;AAAA,IACP,OAAA,EAAS;AAAA,MACP,wDAAA;AAAA,MACA,oEAAA;AAAA,MACA,kDAAA;AAAA,MACA,yBAAA;AAAA,MACA,qDAAA;AAAA,MACA,mDAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,EAAE,OAAA,EAAS,6CAAA,EAA8C;AAAA,MAC7D,EAAA,EAAI,EAAE,OAAA,EAAS,yBAAA;AAA0B,KAC3C;AAAA,IACA,IAAA,EAAM;AAAA;AAAA,MAEJ,OAAA,EAAS,EAAE,OAAA,EAAS,YAAA;AAAa;AACnC,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,SAAA;AACvC,CAAC;AA0BM,SAAS,gBAAA,CAAgC;AAAA,EAC9C,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,GAAG;AACL,CAAA,EAA6B;AAC3B,EAAA,MAAMgC,OAAAA,GAAS,sBAAA,CAAuB,EAAE,IAAA,EAAM,CAAA;AAC9C,EAAA,uBACErC,cAAAA;AAAA,IAAC0I,8BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,WAAA;AAAA,MACA,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,MACnB,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,IAAS,CAAA;AAAA,MACtC,SAAA,EAAWvI,oBAAA,CAAGkC,OAAAA,CAAO,KAAA,IAAS,SAAS,CAAA;AAAA,MAEtC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZrC,cAAAA;AAAA,QAAC2I,yBAAAA;AAAA,QAAA;AAAA,UAEC,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,UACtB,GAAI,MAAA,CAAO,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,KAAS,EAAC;AAAA,UAChD,GAAI,aAAa,MAAA,CAAO,EAAA,KAAO,QAAQ,EAAE,SAAA,EAAW,IAAA,EAAK,GAAI,EAAC;AAAA,UAC/D,SAAA,EAAWtG,QAAO,OAAA,EAAQ;AAAA,UAEzB,QAAA,EAAA,MAAA,CAAO;AAAA,SAAA;AAAA,QANH,MAAA,CAAO,OAAO,EAAE;AAAA,OAQxB;AAAA;AAAA,GACH;AAEJ;ACrDO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,oBAAA;AAAA,EACd,SAAA,GAAY,MAAA;AAAA,EACZ,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,IAAA,GAAO,IAAA;AAAA,EACP,UAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAAkB;AAChB,EAAA,MAAMA,UAAS,kBAAA,CAAmB,EAAE,MAAM,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAC1E,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AACN,EAAA,MAAM,SAAA,GAAY,UAAA,KAAe,MAAA,GAAS,cAAA,GAAiB,eAAe,IAAI,CAAA;AAC9E,EAAA,MAAM,QAAA,GAAWD,aAAyB,IAAI,CAAA;AAE9C,EAAAY,gBAAU,MAAM;AACd,IAAA,IAAI,SAAA,EAAW,QAAA,CAAS,OAAA,EAAS,KAAA,EAAM;AAAA,EAGzC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,UAAU4F,WAAA,EAAM;AACtB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI1G,eAAS,EAAE,CAAA;AAErC,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,EAAG;AACrB,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,CAAC,CAAC,CAAA;AACtB,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAgB;AAC9B,IAAA,QAAA,CAAS,MAAM,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,KAAM,GAAG,CAAC,CAAA;AAAA,EAC5C,CAAA;AAEA,EAAA,MAAMuF,UAAAA,GAAY,CAAC,CAAA,KAAuC;AACxD,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAA,EAAO;AACP,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAE,GAAA,KAAQ,WAAA,IAAe,CAAC,KAAA,IAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AACvD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,uBACE9G,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWR,oBAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA,EACrD,QAAA,EAAA;AAAA,IAAA,KAAA,mBACCH,eAAC,OAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAW,gBAAA,EACjC,iBACH,CAAA,GACE,IAAA;AAAA,oBAEJW,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,gBAAc,SAAA,IAAa,MAAA;AAAA,QAC3B,iBAAe,UAAA,IAAc,MAAA;AAAA,QAC7B,SAAA,EAAWR,oBAAA;AAAA,UACTkC,QAAO,GAAA,EAAI;AAAA,UACX,mCAAA;AAAA,UACA,SAAA;AAAA,UACA,iBAAiB,IAAI,CAAA;AAAA,UACrB;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA;AAAA;AAAA,4BAEf1B,eAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAWR,oBAAA;AAAA,kBACT,gCAAA;AAAA,kBACA,uCAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,GAAA,EAAI,CAAA;AAAA,kCAC9CA,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,YAAA,EAAY,UAAU,GAAG,CAAA,CAAA;AAAA,sBACzB,QAAA,EAAU,UAAA;AAAA,sBACV,OAAA,EAAS,MAAM,MAAA,CAAO,GAAG,CAAA;AAAA,sBACzB,SAAA,EAAWG,oBAAA;AAAA,wBACT,yCAAA;AAAA,wBACA,oEAAA;AAAA,wBACA,6BAAA;AAAA,wBACA,4CAAA;AAAA,wBACA;AAAA,uBACF;AAAA,sBAEA,QAAA,kBAAAH,cAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,QAAA,EAAS,IAAA,EAAK,MAAA,EAC3D,QAAA,kBAAAA,cAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,CAAA,EAAE,mBAAA;AAAA,0BACF,MAAA,EAAO,cAAA;AAAA,0BACP,WAAA,EAAY,KAAA;AAAA,0BACZ,aAAA,EAAc;AAAA;AAAA,uBAChB,EACF;AAAA;AAAA;AACF;AAAA,eAAA;AAAA,cA7BK;AAAA;AA8BP,WACD,CAAA;AAAA,0BAEDA,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,EAAA,EAAI,OAAA;AAAA,cACJ,IAAA,EAAM,SAAA;AAAA,cACN,KAAA,EAAO,KAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxC,SAAA,EAAWyH,UAAAA;AAAA,cACX,MAAA,EAAQ,MAAA;AAAA,cACR,QAAA,EAAU,UAAA;AAAA,cACV,WAAA,EAAa,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,WAAA,GAAc,EAAA;AAAA,cAChD,SAAA,EAAWtH,oBAAA;AAAA,gBACT,iDAAA;AAAA,gBACA,2CAAA;AAAA,gBACA,gBAAgB,IAAI,CAAA;AAAA;AAAA;AAAA,gBAGpB,QAAA;AAAA,gBACA;AAAA;AACF;AAAA;AACF;AAAA;AAAA,KACF;AAAA,IAEC,8BAAcH,cAAAA,CAAC,OAAE,SAAA,EAAW,eAAA,EAAkB,uBAAY,CAAA,GAAO,IAAA;AAAA,IACjE,YAAA,IAAgB,eAAe,MAAA,mBAC9BA,eAAC,GAAA,EAAA,EAAE,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GAC5C;AAAA,GAAA,EACN,CAAA;AAEJ;ACpIA,IAAM,uBAAA,GAA0BqI,oBAAoD,MAAS,CAAA;AAEtF,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA;AACF,CAAA,EAGG;AAMD,EAAA,IAAI,aAAa,MAAA,EAAW,uBAAOrI,cAAAA,CAAAmB,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAC/C,EAAA,uBACEnB,cAAAA,CAAC,uBAAA,CAAwB,UAAxB,EAAiC,KAAA,EAAO,UAAW,QAAA,EAAS,CAAA;AAEjE;AAEO,SAAS,mBAAA,GAA4D;AAC1E,EAAA,OAAOwE,iBAAW,uBAAuB,CAAA;AAC3C;AAmBO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,KAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,mBAAmB,mBAAA,EAAoB;AAC7C,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAQ,CAAA;AAC9B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA;AAKxB,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,SAAS,gBAAA,CAAiB;AAAA,MAC9B,KAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe;AAAC,KAClD,CAAA;AACD,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,uBAAOxE,eAAC,KAAA,EAAA,EAAuC,QAAA,EAAA,MAAA,EAAA,EAA9B,GAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAY,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,MAAM;AAElB,IAAA,IAAI,UAAU,GAAA,EAAK;AACjB,MAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,QAAA,uBACEA,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,KAAA,EAAO,cAAc,KAAK,CAAA;AAAA,YAC1B,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA;AAAA,YACjC,SAAA;AAAA,YACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,YACjD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA,SAClD;AAAA,MAEJ;AACA,MAAA,uBACEA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,KAAA,EAAO,cAAc,KAAK,CAAA;AAAA,UAC1B,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA;AAAA,UACjC,SAAA,EACE,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,SAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,UAAA,GAClE,QAAA,GACA,MAAA;AAAA,UAEN,WAAA,EAAY,oBAAA;AAAA,UACZ,SAAA;AAAA,UACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,UACjD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA,OAClD;AAAA,IAEJ;AAGA,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,MAAA,uBACEA,cAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,UACrB,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA;AAAA,UACjC,SAAA;AAAA,UACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,UACjD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA,OAClD;AAAA,IAEJ;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,MAAA,uBACEA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,YAAA,EAAW,eAAA;AAAA,UACX,OAAA,EAAS;AAAA,YACP,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,YAC5B,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ,WAChC;AAAA,UACA,KAAA,EAAO,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,GAAS,OAAA;AAAA,UACnC,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,UACtC,SAAA;AAAA,UACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,UACjD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc;AAAC;AAAA,OAClD;AAAA,IAEJ;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,MAAA,MAAM,WAAA,GAAc,SAAS,KAAK,CAAA;AAClC,MAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,WAAA,GAAc6I,cAAA,CAAU,WAAW,CAAA,GAAI,IAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AACN,QAAA,MAAA,GAAS,IAAA;AAAA,MACX;AACA,MAAA,uBACE7I,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,IAAA;AAAA,UACL,cAAY,KAAA,CAAM,KAAA;AAAA,UAClB,KAAA,EAAO,MAAA;AAAA,UACP,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,OAAO,IAAA,CAAK,QAAA,KAAa,EAAE,CAAA;AAAA,UACxD,SAAA;AAAA,UACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,UAClD,SAAA,EAAWG,oBAAA,CAAG,QAAA,EAAU,SAAS;AAAA;AAAA,OACnC;AAAA,IAEJ;AAGA,IAAA,uBACEH,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,cAAY,KAAA,CAAM,KAAA;AAAA,QAClB,KAAA,EAAO,SAAS,KAAK,CAAA;AAAA,QACrB,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA;AAAA,QACjC,WAAA,EAAa,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA;AAAA,QAC3C,UAAA,EAAY;AAAA,UACV,IAAA,EACE,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,UAAA,GAClE,QAAA,GACC,KAAA,CAAM,SAAA,IAAa,MAAA;AAAA,UAC1B,GAAI,SAAA,GAAY,EAAE,SAAA,EAAW,IAAA,KAAS;AAAC,SACzC;AAAA,QACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,QAClD,SAAA,EAAWG,oBAAA,CAAG,QAAA,EAAU,SAAS;AAAA;AAAA,KACnC;AAAA,EAEJ,CAAA,GAAG;AAKH,EAAA,uBAAOH,eAAC,KAAA,EAAA,EAAuC,QAAA,EAAA,IAAA,EAAA,EAA9B,GAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAU,CAAA;AACtD;AAGA,SAAS,eAAA,CAAgB;AAAA,EACvB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,WAAmC,KAAA,CAAM,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACxE,IAAI,CAAA,CAAE,KAAA;AAAA,IACN,OAAO,CAAA,CAAE;AAAA,GACX,CAAE,CAAA;AACF,EAAA,uBACEA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,IAAA;AAAA,MACL,cAAY,KAAA,CAAM,KAAA;AAAA,MAClB,OAAA;AAAA,MACA,WAAA,EAAa,KAAA,KAAU,EAAA,GAAK,IAAA,GAAO,KAAA;AAAA,MACnC,iBAAA,EAAmB,CAAC,IAAA,KAAS,QAAA,CAAS,QAAQ,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,MACtE,UAAA,EAAY,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,EAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,EAAE,CAAA;AAC1D,QAAA,uBACEA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAS,MAAA,EAAQ,OAAA;AAAA,YAChB,GAAI,QAAQ,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,YAC/C,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,KAAS,EAAC;AAAA,YAE5C,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,SACL;AAAA,MAEJ,CAAA;AAAA,MACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,MACjD,GAAI,SAAA,GAAY,EAAE,SAAA,EAAW,IAAA,KAAS,EAAC;AAAA,MACxC,SAAA,EAAWG,oBAAA,CAAG,QAAA,EAAU,SAAS;AAAA;AAAA,GACnC;AAEJ;AAGA,SAAS,cAAA,CAAe;AAAA,EACtB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAOG;AACD,EAAA,MAAM,WAA6C,KAAA,CAAM,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAClF,IAAI,CAAA,CAAE,KAAA;AAAA,IACN,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,GAAI,EAAE,OAAA,GAAU,EAAE,SAAS,CAAA,CAAE,OAAA,KAAY,EAAC;AAAA,IAC1C,GAAI,EAAE,KAAA,GAAQ,EAAE,OAAO,CAAA,CAAE,KAAA,KAAU,EAAC;AAAA,IACpC,GAAI,EAAE,IAAA,GAAO,EAAE,MAAM,CAAA,CAAE,IAAA,KAAS;AAAC,GACnC,CAAE,CAAA;AACF,EAAA,uBACEH,cAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,IAAA;AAAA,MACL,OAAA;AAAA,MACA,YAAA,EAAc,KAAA;AAAA,MACd,mBAAmB,CAAC,IAAA,KAAS,SAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MACtD,WAAA,EAAY,qBAAA;AAAA,MACX,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,MACjD,GAAI,SAAA,GAAY,EAAE,SAAA,EAAW,IAAA,KAAS,EAAC;AAAA,MACxC,SAAA,EAAWG,oBAAA,CAAG,QAAA,EAAU,SAAS;AAAA;AAAA,GACnC;AAEJ;AAIA,SAAS,SAAS,CAAA,EAAwB;AACxC,EAAA,IAAI,CAAA,IAAK,MAAM,OAAO,EAAA;AACtB,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,IAAI,OAAO,CAAA,KAAM,SAAA,EAAW,OAAO,IAAI,MAAA,GAAS,OAAA;AAChD,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,GAAG,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACvC,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,cAAc,CAAA,EAA0B;AAC/C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7B,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,CAAA;AACtC,IAAA,OAAO,CAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,OAAO,CAAA;AACnB,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,UAAU,CAAA,EAAyB;AAC1C,EAAA,IAAI,OAAO,CAAA,KAAM,SAAA,EAAW,OAAO,CAAA;AACnC,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA,KAAM,MAAA;AACxC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CAAe,OAAoB,QAAA,EAAsC;AAChF,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY,OAAO,YAAA;AACtC,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,IAAY,KAAA,CAAM,SAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY,OAAO,GAAA;AAC7F,EAAA,IAAI,QAAA,KAAa,eAAe,OAAO,mBAAA;AACvC,EAAA,IAAI,QAAA,KAAa,aAAa,OAAO,iBAAA;AACrC,EAAA,IAAI,QAAA,KAAa,YAAY,OAAO,gBAAA;AACpC,EAAA,OAAO,OAAA;AACT;AC1UO,SAAS,cAAA,CAAe;AAAA,EAC7B,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,UAAA,GAAa,iBAAiB,SAAS,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,CAAC,EAAA,KAAO,SAAA,CAAU,QAAA,CAAS,EAAA,CAAG,EAAE,CAAC,CAAA,GAAI,UAAA;AAC/E,EAAA,MAAM,OAAA,GAA8C,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,IACnE,IAAI,EAAA,CAAG,EAAA;AAAA,IACP,OAAO,EAAA,CAAG;AAAA,GACZ,CAAE,CAAA;AAEF,EAAA,uBACEH,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,UAAA;AAAA,MACX,OAAA;AAAA,MACA,WAAA,EAAa,KAAA;AAAA,MACb,iBAAA,EAAmB,CAAC,IAAA,KAAS,QAAA,CAAS,IAA0B,CAAA;AAAA,MAChE,IAAA;AAAA,MACC,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,MACjD,GAAI,SAAA,GAAY,EAAE,SAAA,EAAW,IAAA,KAAS,EAAC;AAAA,MACxC,SAAA,EAAWG,oBAAA,CAAG,QAAA,EAAU,SAAS,CAAA;AAAA,MAEjC,gBAAA,EAAiB;AAAA;AAAA,GACnB;AAEJ;ACEO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,iBAAA,GAAoB,KAAA;AAAA,EACpB,2BAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,wBAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAmB;AAGjB,EAAA6C,gBAAU,MAAM;AACd,IAAA,IAAI,mBAAmB,2BAAA,IAA8B;AACrD,IAAA,IAAI,gBAAgB,wBAAA,IAA2B;AAAA,EAGjD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACErC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWR,oBAAA;AAAA,QACT,sDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAIA,QAAA,EAAA;AAAA,wBAAAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACd,QAAA,kBAAAA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWG,oBAAA;AAAA,cACT,2CAAA;AAAA,cACA,KAAA,KAAU,IAAI,YAAA,GAAe;AAAA,aAC/B;AAAA,YAEC,QAAA,EAAA,KAAA,KAAU,CAAA,GAAI,OAAA,GAAU,MAAA,CAAO,WAAA;AAAY;AAAA,SAC9C,EACF,CAAA;AAAA,wBAKAH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,QAAA,EAAU,aAAA;AAAA,YACV,SAAA;AAAA,YACA,SAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,QAGC,KAAA,mBACCW,eAAAA,CAAAQ,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAnB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,WAAW,KAAA,CAAM,IAAA;AAAA,cACjB,OAAO,OAAA,CAAQ,QAAA;AAAA,cACf,QAAA,EAAU,gBAAA;AAAA,cACV,SAAA,EAAW,iBAAA;AAAA,cACX,SAAA,EAAU,QAAA;AAAA,cACT,GAAI,MAAM,eAAA,KAAoB,MAAA,GAC3B,EAAE,SAAA,EAAW,KAAA,CAAM,eAAA,EAAgB,GACnC;AAAC;AAAA,WACP,EACF,CAAA;AAAA,0BAGAA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,0BAAA;AAAA,cACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAQhB,gBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,gBAAA,EAAkB;AAC7C,gBAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,gBAAA,IAAI,CAAA,CAAE,YAAY,OAAA,EAAS;AAC3B,gBAAA,MAAM,YAAa,CAAA,CAAuB,IAAA;AAC1C,gBAAA,IAAI,SAAA,KAAc,MAAA,IAAU,SAAA,KAAc,QAAA,EAAU;AACpD,gBAAA,IAAI,CAAC,QAAA,EAAU;AACf,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,QAAA,EAAS;AAAA,cACX,CAAA;AAAA,cAEA,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,KAAA;AAAA,kBACA,UAAU,OAAA,CAAQ,QAAA;AAAA,kBAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,kBACf,QAAA,EAAU,aAAA;AAAA,kBACV,SAAA,EAAW;AAAA;AAAA;AACb;AAAA;AACF,SAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,0BAKAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B;AAAA,SAAA;AAAA,QAG3C,MAAA,IAAU,wBACTA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,YAAA,EAAW,eAAA;AAAA,YACX,KAAA,EAAM,4CAAA;AAAA,YACN,SAAA,EAAWG,oBAAA;AAAA,cACT,oEAAA;AAAA,cACA,0EAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAW,IAAA;AAAA,gBACX,OAAA,EAAQ,WAAA;AAAA,gBACR,SAAA,EAAU,UAAA;AAAA,gBACV,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,KAAA;AAAA,gBACZ,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBAEf,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sEAAA,EAAuE;AAAA;AAAA;AACjF;AAAA,SACF,GACE,IAAA;AAAA,wBACJA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,YAAA,EAAY,QAAQ,eAAA,GAAkB,QAAA;AAAA,YACtC,SAAA,EAAWG,oBAAA;AAAA,cACT,oEAAA;AAAA,cACA,6EAAA;AAAA,cACA,QAAQ,6DAAA,GAAgE;AAAA,aAC1E;AAAA,YAEA,QAAA,kBAAAH,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAW,IAAA;AAAA,gBACX,OAAA,EAAQ,WAAA;AAAA,gBACR,SAAA,EAAU,UAAA;AAAA,gBACV,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,KAAA;AAAA,gBACZ,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe,OAAA;AAAA,gBAEf,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4FAAA,EAA6F;AAAA;AAAA;AACvG;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAQO,SAAS,sBAAA,CAAuB,SAAwB,IAAA,EAAkC;AAC/F,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,QAAQ,CAAA;AAC/D,EAAA,MAAM,MAAA,GAAS,UAAA,IAAc,MAAA,CAAO,CAAC,CAAA;AACrC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,KAAK,IAAA,EAAK;AAAA,EACxC;AACA,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,IAAA;AAAA,IACZ,UAAU,MAAA,CAAO,EAAA;AAAA,IACjB,KAAA,EAAO,aAAa,OAAA,CAAQ,KAAA,GAAQ,gBAAgB,IAAA,CAAK,IAAA,EAAM,OAAO,KAAK;AAAA,GAC7E;AACF;AAEO,SAAS,yBAAA,CACd,OAAA,EACA,KAAA,EACA,YAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,aAAa,YAAY,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,QAAQ,CAAA;AAC1C,EAAA,MAAM,YAAA,GAAe,IAAA,EAAM,KAAA,KAAU,IAAA,EAAM,KAAA;AAC3C,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,QAAA,EAAU,YAAA;AAAA,IACV,KAAA,EAAO,eAAe,eAAA,CAAgB,KAAA,CAAM,MAAM,IAAA,EAAM,KAAA,IAAS,CAAC,CAAA,GAAI,OAAA,CAAQ;AAAA,GAChF;AACF;;;ACpPO,SAAS,OAAA,CAAQ,OAAoB,KAAA,EAAiC;AAC3E,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,KAAA,CAAM,IAAI,CAAA;AACvC,EAAA,MAAM,EAAA,GAAK,IAAI,CAAC,CAAA;AAChB,EAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,EAAA,MAAM,IAAA,GAAsB;AAAA,IAC1B,OAAO,KAAA,CAAM,IAAA;AAAA,IACb,UAAU,EAAA,CAAG,EAAA;AAAA,IACb,KAAA,EAAO,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAM,GAAG,KAAK;AAAA,GAC7C;AACA,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,CAAC,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC,EAAI,IAAI,CAAA,EAAE;AACjE;AAEO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,MAAM,OAAsB,EAAE,KAAA,EAAO,IAAI,QAAA,EAAU,IAAA,EAAM,OAAO,EAAA,EAAG;AACnE,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,CAAC,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC,EAAI,IAAI,CAAA,EAAE;AACjE;AAEO,SAAS,YACd,KAAA,EACA,MAAA,GAA0B,cAAA,CAAe,KAAA,CAAM,eAAe,CAAA,EACjD;AACb,EAAA,MAAM,GAAA,GAAmB,EAAE,eAAA,EAAiB,MAAA,EAAQ,UAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAC7E,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,CAAC,GAAI,KAAA,CAAM,MAAA,IAAU,EAAC,EAAI,GAAG,CAAA,EAAE;AAC5D;AAEO,SAAS,UAAA,CAAW,OAAoB,KAAA,EAA4B;AACzE,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAA,EAAE;AACtE;AAEO,SAAS,cAAA,CAAe,OAAoB,KAAA,EAA4B;AAC7E,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,EAAC;AAChC,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,KAAM,KAAK,CAAA,EAAE;AAClE;AAEO,SAAS,UAAA,CACd,KAAA,EACA,KAAA,EACA,KAAA,EACa;AACb,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,IAAI,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,EAAE,GAAG,EAAA,EAAI,GAAG,KAAA,KAAU,EAAG;AAAA,GAC5E;AACF;AAEO,SAAS,WAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACa;AACb,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,IAAA,GAAO,EAAG,CAAA,EAAE;AAClF;AAEO,SAAS,cAAA,CACd,KAAA,EACA,KAAA,EACA,IAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,EAAC;AAChC,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,IAAA,GAAO,CAAE,CAAA,EAAE;AAC5E;AAKO,SAAS,eAAA,CAAgB,OAAoB,KAAA,EAA4B;AAC9E,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,MAAM,IAAA,GAAO,SAAS,KAAK,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,MAAM,GAAA,GAAmB;AAAA,IACvB,eAAA,EAAiB,cAAA,CAAe,KAAA,CAAM,eAAe,CAAA;AAAA,IACrD,QAAA,EAAU,CAAC,IAAI,CAAA;AAAA,IACf,QAAQ;AAAC,GACX;AACA,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,UAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,KAAK,CAAA;AAAA,IAC/C,QAAQ,CAAC,GAAI,MAAM,MAAA,IAAU,IAAK,GAAG;AAAA,GACvC;AACF;AAEO,SAAS,SAAA,CAAU,OAAoB,MAAA,EAAsC;AAClF,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,eAAA,EAAiB,MAAA,EAAO;AAC7C;AAIO,SAAS,YAAY,KAAA,EAA4B;AACtD,EAAA,MAAM,MAAA,GAAA,CAAU,KAAA,CAAM,QAAA,IAAY,EAAC,EAAG,MAAA;AACtC,EAAA,MAAM,MAAA,GAAA,CAAU,KAAA,CAAM,MAAA,IAAU,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,WAAA,CAAY,CAAC,GAAG,CAAC,CAAA;AAC1E,EAAA,OAAO,MAAA,GAAS,MAAA;AAClB;AAEA,SAAS,eAAe,CAAA,EAAqC;AAC3D,EAAA,OAAO,CAAA,KAAM,QAAQ,IAAA,GAAO,KAAA;AAC9B;AC/FO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QACT,SAAA,EAAWR,oBAAA;AAAA,UACT,uDAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAH,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,OAAA,EAAQ,WAAA;AAAA,cACR,SAAA,EAAU,QAAA;AAAA,cACV,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cAEd,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA,WACzB;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,YAAA,EAAU;AAAA;AAAA;AAAA,KACtD;AAAA,IACC,gBAAA,IAAoB,6BACnBW,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,KAAA,EAAM,kDAAA;AAAA,QACN,SAAA,EAAWR,oBAAA;AAAA,UACT,uDAAA;AAAA,UACA;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAQ,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,OAAA,EAAQ,WAAA;AAAA,cACR,SAAA,EAAU,QAAA;AAAA,cACV,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cAEf,QAAA,EAAA;AAAA,gCAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sEAAA,EAAuE,CAAA;AAAA,gCAC/EA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA;AAAA,WACzB;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,WAAA,EAAS;AAAA;AAAA;AAAA,KACrD,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;ACtCO,SAAS,WAAA,CAAY;AAAA,EAC1B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,gBAAgB,KAAA,CAAM,QAAA,EAAU,UAAU,CAAA,KAAM,KAAA,CAAM,QAAQ,MAAA,IAAU,CAAA,CAAA;AAC9E,EAAA,MAAM,iBAAA,GAAoB,oBAAoB,YAAA,IAAgB,CAAA;AAE9D,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAKb,QAAA,EAAA;AAAA,oBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAA,EACd,QAAA,kBAAAA,cAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWG,oBAAA;AAAA,UACT,2CAAA;AAAA,UACA,KAAA,KAAU,IAAI,YAAA,GAAe;AAAA,SAC/B;AAAA,QAEC,QAAA,EAAA,KAAA,KAAU,CAAA,GAAI,OAAA,GAAU,MAAA,CAAO,WAAA;AAAY;AAAA,KAC9C,EACF,CAAA;AAAA,oBAEAQ,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWR,oBAAA;AAAA,UACT,8CAAA;AAAA,UACA;AAAA,SACF;AAAA,QAGA,QAAA,EAAA;AAAA,0BAAAQ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAAA,EAA+D,QAAA,EAAA,OAAA,EAE/E,CAAA;AAAA,cACC,oCACCA,cAAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBACC,YAAA,EAAW,cAAA;AAAA,kBACX,OAAA,EAAS;AAAA,oBACP,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,oBAC1B,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,IAAA;AAAK,mBAC1B;AAAA,kBACA,OAAO,KAAA,CAAM,eAAA;AAAA,kBACb,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM;AAAA;AAAA,kCAGlEA,cAAAA,CAAC,UAAK,SAAA,EAAU,gEAAA,EACb,gBAAM,eAAA,EACT;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,QAAA;AAAA,gBACT,YAAA,EAAW,cAAA;AAAA,gBACX,SAAA,EAAWG,oBAAA;AAAA,kBACT,2DAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,kBAAAH,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAW,IAAA;AAAA,oBACX,OAAA,EAAQ,WAAA;AAAA,oBACR,SAAA,EAAU,UAAA;AAAA,oBACV,IAAA,EAAK,MAAA;AAAA,oBACL,MAAA,EAAO,cAAA;AAAA,oBACP,WAAA,EAAY,KAAA;AAAA,oBACZ,aAAA,EAAc,OAAA;AAAA,oBACd,cAAA,EAAe,OAAA;AAAA,oBAEf,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4FAAA,EAA6F;AAAA;AAAA;AACvG;AAAA;AACF,WAAA,EACF,CAAA;AAAA,0BAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACb,QAAA,kBAAAA,cAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,MAAA;AAAA,cACA,YAAA;AAAA,cACA,QAAA;AAAA,cACA,MAAA,EAAQ,KAAA;AAAA,cACR,gBAAA;AAAA,cACA,cAAA;AAAA,cACA;AAAA;AAAA,WACF,EACF;AAAA;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AC/EO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,iBAAA;AAAA,EACA,sBAAA,GAAyB,IAAA;AAAA,EACzB,yBAAA;AAAA,EACA,mBAAA,GAAsB,IAAA;AAAA,EACtB,sBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,EAAC;AACpC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,IAAU,EAAC;AAEnC,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,YAAY,QAAA,CAAS,MAAA;AAC3B,IAAA,QAAA,CAAS,cAAA,CAAe,KAAK,CAAC,CAAA;AAC9B,IAAA,iBAAA,GAAoB,SAAS,CAAA;AAAA,EAC/B,CAAA;AACA,EAAA,MAAM,cAAA,GAAiB,MAAM,QAAA,CAAS,WAAA,CAAY,KAAK,CAAC,CAAA;AAExD,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAc;AACtC,IAAA,IAAI,cAAA,KAAmB,CAAA,EAAG,iBAAA,GAAoB,IAAI,CAAA;AAClD,IAAA,IAAI,sBAAA,KAA2B,CAAA,EAAG,yBAAA,GAA4B,IAAI,CAAA;AAClE,IAAA,IAAI,mBAAA,KAAwB,CAAA,EAAG,sBAAA,GAAyB,IAAI,CAAA;AAC5D,IAAA,QAAA,CAAS,UAAA,CAAW,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,EAC/B,CAAA;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,MAAA,KAAW,MAAM,CAAC,gBAAA,IAAoB,UAAU,MAAA,KAAW,CAAA,CAAA;AAEpF,EAAA,uBACEW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA,mBACCX,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAA,CACG,MAAA,GAAS,WAAA,GAAc,WAAA,IACxB,iDAAA;AAAA,QAGD,QAAA,EAAA,SAAA,KAAc,SACX,yCAAA,GACA,6CAAA;AAAA;AAAA,KACN,GACE,IAAA;AAAA,IAEH,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,KAAM;AACvB,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,EAAA,CAAG,KAAK,CAAA;AACnC,MAAA,uBACEA,cAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAGC,KAAA,EAAO,CAAA;AAAA,UACP,QAAQ,KAAA,CAAM,eAAA;AAAA,UACb,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,UAC1B,OAAA,EAAS,EAAA;AAAA,UACT,MAAA;AAAA,UACA,WAAW,cAAA,KAAmB,CAAA;AAAA,UAC9B,mBAAmB,sBAAA,KAA2B,CAAA;AAAA,UAC9C,2BAAA,EAA6B,MAAM,yBAAA,GAA4B,IAAI,CAAA;AAAA,UACnE,gBAAgB,mBAAA,KAAwB,CAAA;AAAA,UACxC,wBAAA,EAA0B,MAAM,sBAAA,GAAyB,IAAI,CAAA;AAAA,UAC5D,GAAI,YAAA,GAAe,EAAE,QAAA,EAAU,YAAA,KAAiB,EAAC;AAAA,UAClD,aAAA,EAAe,CAAC,MAAA,KAAW;AACzB,YAAA,IAAI,cAAA,KAAmB,CAAA,EAAG,iBAAA,GAAoB,IAAI,CAAA;AAClD,YAAA,yBAAA,GAA4B,CAAC,CAAA;AAC7B,YAAA,QAAA,CAAS,YAAY,KAAA,EAAO,CAAA,EAAG,uBAAuB,EAAA,EAAI,MAAM,CAAC,CAAC,CAAA;AAAA,UACpE,CAAA;AAAA,UACA,gBAAA,EAAkB,CAAC,IAAA,KAAS;AAC1B,YAAA,IAAI,CAAC,KAAA,EAAO;AACZ,YAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,KAAM,CAAA,2BAA4B,CAAC,CAAA;AACnD,YAAA,QAAA,CAAS,WAAA,CAAY,OAAO,CAAA,EAAG,yBAAA,CAA0B,IAAI,KAAA,EAAO,IAAI,CAAC,CAAC,CAAA;AAAA,UAC5E,CAAA;AAAA,UACA,aAAA,EAAe,CAAC,CAAA,KAAM,QAAA,CAAS,UAAA,CAAW,KAAA,EAAO,CAAA,EAAG,EAAE,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAAA,UACjE,QAAA,EAAU,MAAM,gBAAA,CAAiB,CAAC,CAAA;AAAA,UACjC,GAAI,gBAAA,IAAoB,KAAA,GACrB,EAAE,MAAA,EAAQ,MAAM,QAAA,CAAS,eAAA,CAAgB,KAAA,EAAO,CAAC,CAAC,CAAA,KAClD;AAAC,SAAA;AAAA,QA1BA,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,OA2BvB;AAAA,IAEJ,CAAC,CAAA;AAAA,IAEA,mBACG,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,EAAK,sBAClBA,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAGC,KAAA,EAAO,SAAS,MAAA,GAAS,CAAA;AAAA,QACzB,QAAQ,KAAA,CAAM,eAAA;AAAA,QACd,KAAA,EAAO,GAAA;AAAA,QACP,MAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA,EAAU,CAAC,IAAA,KAAS,QAAA,CAAS,eAAe,KAAA,EAAO,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,QAC3D,UAAU,MAAM,QAAA,CAAS,cAAA,CAAe,KAAA,EAAO,CAAC,CAAC,CAAA;AAAA,QACjD,cAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAVK,SAAS,CAAC,CAAA;AAAA,KAYlB,CAAA,GACD,IAAA;AAAA,oBAEJA,cAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,eAAA;AAAA,QACb,UAAA,EAAY,cAAA;AAAA,QACZ;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACvIO,SAAS,kBAAA,CAAmB;AAAA,EACjC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,cAAA,GAAiB,IAAA;AAAA,EACjB,gBAAA,GAAmB,IAAA;AAAA,EACnB,cAAA,GAAiB,IAAA;AAAA,EACjB;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,eAAeuC,aAAAA,CAAQ,MAAM,OAAO,WAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC/F,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,EAAC;AACrC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,IAAU,EAAC;AAEpC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIL,eAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACxF,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAElF,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,MAAM,SAAA,GAAA,CAAa,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG,MAAA;AAC1C,IAAA,QAAA,CAAS,cAAA,CAAe,MAAM,CAAC,CAAA;AAC/B,IAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,EAC7B,CAAA;AAKA,EAAAc,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,IAAI,SAAS,MAAA,KAAW,CAAA,IAAK,SAAA,CAAU,MAAA,KAAW,GAAG,aAAA,EAAc;AAAA,EACrE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEhD,cAAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAU,kBAClC,QAAA,kBAAAA,cAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,MAAA;AAAA,MACP,MAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAM,IAAA;AAAA,MACN,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA,sBAAA;AAAA,MACA,yBAAA;AAAA,MACA,mBAAA;AAAA,MACA,sBAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB,EACF,CAAA;AAEJ;AChDO,SAAS,wBAAA,CAAyB;AAAA,EACvC,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,gBAAA,GAAmB,IAAA;AAAA,EACnB,gBAAA,GAAmB,KAAA;AAAA,EACnB;AACF,CAAA,EAAkC;AAChC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,EAAC;AACrC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,IAAU,EAAC;AAEpC,EAAA,MAAM8I,UAAAA,GAAY,CAAC,IAAA,KAA0B,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,eAAA,EAAiB,IAAA,EAAM,CAAA;AAE1F,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,CAAA;AAAA,EAClD,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAA,IAAU,gBAAA,GAAmB,UAAU,MAAA,GAAS,CAAA,CAAA;AAC/E,EAAA,MAAM,iBAAA,GAAoB,oBAAoB,aAAA,IAAiB,CAAA;AAE/D,EAAA,uBACE9I,cAAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAU,kBACpC,QAAA,kBAAAW,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,mCAAA;AAAA,MACV,SAAA,EAAW,CAAC,CAAA,KAAM;AAIhB,QAAA,IAAA,CAAK,EAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAA,CAAE,QAAQ,OAAA,EAAS;AACjD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,EAAA;AAAA,0BAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,8CACCA,cAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAW,QAAA;AAAA,cACX,OAAA,EAAS;AAAA,gBACP,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,gBAC1B,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,IAAA;AAAK,eAC1B;AAAA,cACA,OAAO,MAAA,CAAO,eAAA;AAAA,cACd,QAAA,EAAU8I;AAAA;AAAA,WACZ,mBAEAnI,eAAAA,CAAAQ,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAnB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EAAiE,QAAA,EAAA,SAAA,EAEjF,CAAA;AAAA,YACC,WAAA,mBACCW,eAAAA,CAAAQ,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAnB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA,MAAA,EAAC,CAAA;AAAA,8BACpDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAoC,QAAA,EAAA,WAAA,EAAY;AAAA,aAAA,EAClE,CAAA,GACE;AAAA,WAAA,EACN,CAAA,EAEJ,CAAA;AAAA,0BACAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,YAAA,QAAA,mBACCA,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,QAAA;AAAA,gBACT,KAAA,EAAM,0CAAA;AAAA,gBACN,SAAA,EAAWR,oBAAA;AAAA,kBACT,qDAAA;AAAA,kBACA,sEAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,cAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACC,aAAA,EAAW,IAAA;AAAA,sBACX,OAAA,EAAQ,WAAA;AAAA,sBACR,SAAA,EAAU,QAAA;AAAA,sBACV,IAAA,EAAK,MAAA;AAAA,sBACL,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAY,KAAA;AAAA,sBACZ,aAAA,EAAc,OAAA;AAAA,sBACd,cAAA,EAAe,OAAA;AAAA,sBAEf,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA;AAAA,mBACrC;AAAA,kBAAM;AAAA;AAAA;AAAA,aAER,GACE,IAAA;AAAA,4BACJA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,OAAA;AAAA,gBACT,YAAA,EAAW,OAAA;AAAA,gBACX,SAAA,EAAWG,oBAAA;AAAA,kBACT,2DAAA;AAAA,kBACA;AAAA,iBACF;AAAA,gBAEA,QAAA,kBAAAH,cAAAA;AAAA,kBAAC,KAAA;AAAA,kBAAA;AAAA,oBACC,aAAA,EAAW,IAAA;AAAA,oBACX,OAAA,EAAQ,WAAA;AAAA,oBACR,SAAA,EAAU,QAAA;AAAA,oBACV,IAAA,EAAK,MAAA;AAAA,oBACL,MAAA,EAAO,cAAA;AAAA,oBACP,WAAA,EAAY,KAAA;AAAA,oBACZ,aAAA,EAAc,OAAA;AAAA,oBAEd,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB;AAAA;AAAA;AAC9B;AAAA;AACF,WAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,MAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA;AAAA,YACA,gBAAA;AAAA,YACA,cAAA;AAAA,YACA;AAAA;AAAA,SACF,EACF,CAAA;AAAA,wBAGAW,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWR,oBAAA;AAAA,cACT,mFAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAH,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,QAAA;AAAA,kBACT,UAAU,aAAA,KAAkB,CAAA;AAAA,kBAC5B,SAAA,EAAWG,oBAAA;AAAA,oBACT,mDAAA;AAAA,oBACA,kDAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBACD,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,8BACAQ,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,UAAA,mBACCA,eAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,UAAA;AAAA,oBACT,UAAU,aAAA,KAAkB,CAAA;AAAA,oBAC5B,SAAA,EAAWR,oBAAA;AAAA,sBACT,2DAAA;AAAA,sBACA,oEAAA;AAAA,sBACA,kDAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAQ,eAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BACC,aAAA,EAAW,IAAA;AAAA,0BACX,OAAA,EAAQ,WAAA;AAAA,0BACR,SAAA,EAAU,QAAA;AAAA,0BACV,IAAA,EAAK,MAAA;AAAA,0BACL,MAAA,EAAO,cAAA;AAAA,0BACP,WAAA,EAAY,KAAA;AAAA,0BACZ,aAAA,EAAc,OAAA;AAAA,0BACd,cAAA,EAAe,OAAA;AAAA,0BAEf,QAAA,EAAA;AAAA,4CAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6DAAA,EAA8D,CAAA;AAAA,4CACtEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,YAAA,EAAa;AAAA;AAAA;AAAA,uBACvB;AAAA,sBAAM;AAAA;AAAA;AAAA,iBAER,GACE,IAAA;AAAA,gCACJA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,OAAA;AAAA,oBACT,SAAA,EAAWG,oBAAA;AAAA,sBACT,yDAAA;AAAA,sBACA,2CAAA;AAAA,sBACA;AAAA,qBACF;AAAA,oBACD,QAAA,EAAA;AAAA;AAAA;AAED,eAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,GACF,EACA,CAAA;AAEJ;AChOA,IAAM,MAAA,uBAAa,GAAA,EAA2B;AAE9C,SAASqH,WAAU,GAAA,EAA4B;AAC7C,EAAA,IAAI,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,uBAAU,GAAA,EAAI;AACd,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,KAAK,GAAA,EAAsB;AAClC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,IAAI;AAEF,IAAA,OAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA,KAAM,GAAA;AAAA,EAC9C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,KAAA,CAAM,KAAa,IAAA,EAAe;AACzC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,GAAO,MAAM,GAAG,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,KAAA,MAAW,EAAA,IAAMA,UAAAA,CAAU,GAAG,CAAA,KAAM,IAAI,CAAA;AAC1C;AAEO,SAAS,cAAA,CAAe,aAAa,gBAAA,EAAkB;AAC5D,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAItF,eAAkB,MAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAElE,EAAAc,gBAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAe,CAAC,IAAA,KAAS,QAAA,CAAS,IAAI,CAAA;AAC5C,IAAAwE,UAAAA,CAAU,UAAU,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA;AAC5B,IAAA,QAAA,CAAS,IAAA,CAAK,UAAU,CAAC,CAAA;AACzB,IAAA,OAAO,MAAM;AACX,MAAAA,UAAAA,CAAU,UAAU,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,SAAS,MAAM,KAAA,CAAM,YAAY,CAAC,IAAA,CAAK,UAAU,CAAC,CAAA;AACxD,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAkB,KAAA,CAAM,YAAY,IAAI,CAAA;AAErD,EAAA,OAAO,CAAC,KAAA,EAAO,MAAA,EAAQ,GAAG,CAAA;AAC5B;ACvBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,gBAAA,GAAmB,IAAA;AAAA,EACnB,UAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,GAAA,GAAMpF,aAAwB,IAAI,CAAA;AACxC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,WAAA,EAAa,aAAa,CAAA,GAAI,eAAe,UAAU,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM,CAAA;AACtC,EAAA,MAAM,aAAa,WAAA,GAAc,CAAA;AAIjC,EAAA,IAAI,aAAa,OAAO,IAAA;AAExB,EAAA,uBACEvB,eAAAA,CAAC,wBAAA,EAAA,EAAyB,QAAA,EAAU,gBAAA,EAClC,QAAA,EAAA;AAAA,oBAAAX,cAAAA,CAAC,MAAA,EAAA,EAAK,GAAA,EAAU,SAAA,EAAU,eACxB,QAAA,kBAAAW,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,qBAAA,EAAoB,WAAA;AAAA,QACpB,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EAAWR,oBAAA;AAAA,UACT,gEAAA;AAAA,UACA,mDAAA;AAAA,UACA,4CAAA;AAAA,UACA,UAAA,GACIA,oBAAA;AAAA,YACE,wEAAA;AAAA,YACA,sEAAA;AAAA,YACA;AAAA,WACF,GACA;AAAA,SACN;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAH,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAW,IAAA;AAAA,cACX,OAAA,EAAQ,WAAA;AAAA,cACR,SAAA,EAAU,QAAA;AAAA,cACV,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cAEf,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA;AAAA,WACjC;AAAA,UAAM,QAAA;AAAA,UAEL,6BACCA,cAAAA,CAAC,UAAK,SAAA,EAAU,0EAAA,EACb,uBACH,CAAA,GACE;AAAA;AAAA;AAAA,KACN,EACF,CAAA;AAAA,oBAEAA,cAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAQ,IAAA;AAAA,QACR,YAAA,EAAc,OAAA;AAAA,QACd,SAAA,EAAU,cAAA;AAAA,QACV,cAAA,EAAe,WAAA;AAAA,QAEf,QAAA,kBAAAA,cAAAA;AAAA,UAAC,wBAAA;AAAA,UAAA;AAAA,YACE,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB,EAAC;AAAA,YACtC,MAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,YAC3B,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,YACpC,UAAU,MAAM;AACd,cAAA,IAAI,CAAC,aAAa,aAAA,EAAc;AAChC,cAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,YACf,CAAA;AAAA,YACA,cAAA;AAAA,YACA,gBAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;ACxEO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,gBAAA,GAAmB,IAAA;AAAA,EACnB,UAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,eAAeuC,aAAAA,CAAQ,MAAM,OAAO,WAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAM,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAC/F,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,EAAC;AACrC,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,MAAA,IAAU,EAAC;AACpC,EAAA,MAAM,CAAC,WAAA,EAAa,aAAa,CAAA,GAAI,eAAe,UAAU,CAAA;AAE9D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIL,eAAwB,IAAI,CAAA;AAKxE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtE,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,YAAY,QAAA,CAAS,MAAA;AAC3B,IAAA,QAAA,CAAS;AAAA,MACP,GAAG,MAAA;AAAA,MACH,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,EAAA,EAAI;AAAA,KACjE,CAAA;AACD,IAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,EAC7B,CAAA;AAEA,EAAA,uBACElC,eAAC,wBAAA,EAAA,EAAyB,QAAA,EAAU,kBACpC,QAAA,kBAAAW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oBAAAX,cAAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAS,aAAA,EAAe,CAAA;AAAA,oBACxCW,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,KAAM;AACvB,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,EAAA,CAAG,KAAK,CAAA;AACnC,QAAA,uBACEA,eAAAA;AAAA,UAACQ,cAAAA;AAAA,UAAA;AAAA,YAIE,QAAA,EAAA;AAAA,cAAA,CAAA,GAAI,CAAA,GACH,mCACEnB,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,MACP,QAAA,CAAS;AAAA,oBACP,GAAG,MAAA;AAAA,oBACH,eAAA,EAAiB,MAAA,CAAO,eAAA,KAAoB,KAAA,GAAQ,IAAA,GAAO;AAAA,mBAC5D,CAAA;AAAA,kBAEH,KAAA,EAAM,eAAA;AAAA,kBACN,SAAA,EAAWG,oBAAA;AAAA,oBACT,oFAAA;AAAA,oBACA,sDAAA;AAAA,oBACA;AAAA,mBACF;AAAA,kBAEC,QAAA,EAAA,MAAA,CAAO,gBAAgB,WAAA;AAAY;AAAA,eACtC,mBAEAH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6DACb,QAAA,EAAA,MAAA,CAAO,eAAA,CAAgB,WAAA,EAAY,EACtC,CAAA,GAEA,IAAA;AAAA,cAEH,wBACCA,cAAAA;AAAA,gBAAC+I,KAAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAO,CAAA;AAAA,kBACP,KAAA;AAAA,kBACA,OAAA,EAAS,EAAA;AAAA,kBACT,MAAA;AAAA,kBACA,cAAA;AAAA,kBACA,UAAU,aAAA,KAAkB,CAAA;AAAA,kBAC5B,kBAAA,EAAoB,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,kBAC9C,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,KAAmB,EAAC;AAAA,kBAC1D,aAAA,EAAe,CAAC,MAAA,KACd,QAAA,CAAS;AAAA,oBACP,GAAG,MAAA;AAAA,oBACH,UAAU,QAAA,CAAS,GAAA;AAAA,sBAAI,CAAC,GAAG,GAAA,KACzB,GAAA,KAAQ,IAAI,sBAAA,CAAuB,CAAA,EAAG,MAAM,CAAA,GAAI;AAAA;AAClD,mBACD,CAAA;AAAA,kBAEH,gBAAA,EAAkB,CAAC,IAAA,KACjB,QAAA,CAAS;AAAA,oBACP,GAAG,MAAA;AAAA,oBACH,UAAU,QAAA,CAAS,GAAA;AAAA,sBAAI,CAAC,GAAG,GAAA,KACzB,GAAA,KAAQ,IAAI,yBAAA,CAA0B,CAAA,EAAG,KAAA,EAAO,IAAI,CAAA,GAAI;AAAA;AAC1D,mBACD,CAAA;AAAA,kBAEH,aAAA,EAAe,CAAC,CAAA,KACd,QAAA,CAAS;AAAA,oBACP,GAAG,MAAA;AAAA,oBACH,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,GAAA,KAAS,GAAA,KAAQ,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,KAAM,CAAE;AAAA,mBACxE,CAAA;AAAA,kBAEH,QAAA,EAAU,MACR,QAAA,CAAS;AAAA,oBACP,GAAG,MAAA;AAAA,oBACH,UAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,KAAQ,QAAQ,CAAC;AAAA,mBAChD;AAAA;AAAA,eAEL;AAAA;AAAA,gCAGApI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACb,QAAA,EAAA;AAAA,kCAAAX,cAAAA;AAAA,oBAAC,eAAA;AAAA,oBAAA;AAAA,sBACC,MAAA;AAAA,sBACA,KAAA,EAAM,EAAA;AAAA,sBACN,WAAW,cAAA,KAAmB,CAAA;AAAA,sBAC9B,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,wBAAA,IAAI,cAAA,KAAmB,CAAA,EAAG,iBAAA,CAAkB,IAAI,CAAA;AAGhD,wBAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,wBAAA,QAAA,CAAS;AAAA,0BACP,GAAG,MAAA;AAAA,0BACH,UAAU,QAAA,CAAS,GAAA;AAAA,4BAAI,CAAC,GAAG,GAAA,KACzB,GAAA,KAAQ,IAAI,sBAAA,CAAuB,CAAA,EAAG,MAAM,CAAA,GAAI;AAAA;AAClD,yBACD,CAAA;AAAA,sBACH;AAAA;AAAA,mBACF;AAAA,kCACAA,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,YAAA,EAAW,QAAA;AAAA,sBACX,SAAS,MAAM;AACb,wBAAA,IAAI,cAAA,KAAmB,CAAA,EAAG,iBAAA,CAAkB,IAAI,CAAA;AAChD,wBAAA,QAAA,CAAS;AAAA,0BACP,GAAG,MAAA;AAAA,0BACH,UAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,KAAQ,QAAQ,CAAC;AAAA,yBAChD,CAAA;AAAA,sBACH,CAAA;AAAA,sBACA,SAAA,EAAWG,oBAAA;AAAA,wBACT,8DAAA;AAAA,wBACA;AAAA,uBACF;AAAA,sBAEA,QAAA,kBAAAH,cAAAA;AAAA,wBAAC,KAAA;AAAA,wBAAA;AAAA,0BACC,aAAA,EAAW,IAAA;AAAA,0BACX,OAAA,EAAQ,WAAA;AAAA,0BACR,SAAA,EAAU,QAAA;AAAA,0BACV,IAAA,EAAK,MAAA;AAAA,0BACL,MAAA,EAAO,cAAA;AAAA,0BACP,WAAA,EAAY,KAAA;AAAA,0BACZ,aAAA,EAAc,OAAA;AAAA,0BAEd,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB;AAAA;AAAA;AAC9B;AAAA;AACF,iBAAA,EACF;AAAA;AAAA;AAAA,WAAA;AAAA,UAlHG,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,SAoHvB;AAAA,MAEJ,CAAC,CAAA;AAAA,MAEA,SAAA,CAAU,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AACzB,QAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,CAAA,GAAI,CAAA;AACrD,QAAA;AAAA;AAAA,0BAEEW,eAAAA,CAACQ,cAAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,iBAAA,mBACCnB,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6DACb,QAAA,EAAA,MAAA,CAAO,eAAA,CAAgB,WAAA,EAAY,EACtC,CAAA,GACE,IAAA;AAAA,4BACJA,cAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,GAAA,EAAK;AAAA,WAAA,EAAA,EANV,CAAA,MAAA,EAAS,CAAC,CAAA,CAOzB;AAAA;AAAA,MAEJ,CAAC,CAAA;AAAA,sBAEDA,cAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,UAAA,EAAY;AAAA,KAAA,EACxC;AAAA,GAAA,EACF,CAAA,EACA,CAAA;AAEJ;AAOA,SAAS,SAAA,CAAU,EAAE,KAAA,EAAM,EAA2B;AACpD,EAAA,MAAM,KAAA,GAAQ,YAAY,KAAK,CAAA;AAC/B,EAAA,uBACEW,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWR,oBAAA;AAAA,QACT,wFAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,KAAA,EAAM,qDAAA;AAAA,MAEN,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,OAAA,EAAQ,WAAA;AAAA,YACR,SAAA,EAAU,mBAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YAEf,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sEAAA,EAAuE;AAAA;AAAA,SACjF;AAAA,wBACAW,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EACb,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,eAAA;AAAA,UAAgB;AAAA,SAAA,EACzB,CAAA;AAAA,wBACAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAmC,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,UAAG;AAAA,SAAA,EAAM;AAAA;AAAA;AAAA,GAC9D;AAEJ;AAGA,SAAS,cAAA,CAAe,EAAE,OAAA,EAAQ,EAA4B;AAC5D,EAAA,uBACEA,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAWR,oBAAA;AAAA,QACT,gCAAA;AAAA,QACA,mDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,OAAA,EAAQ,WAAA;AAAA,YACR,SAAA,EAAU,QAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe,OAAA;AAAA,YAEf,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4BAAA,EAA6B;AAAA;AAAA,SACvC;AAAA,QAAM;AAAA;AAAA;AAAA,GAER;AAEJ;AAGA,SAAS+I,KAAAA,CAAK;AAAA,EACZ,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAgBG;AACD,EAAA,MAAM,GAAA,GAAM3G,aAAwB,IAAI,CAAA;AACxC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,eAAS,QAAQ,CAAA;AAG/C,EAAAc,gBAAU,MAAM;AACd,IAAA,IAAI,UAAU,kBAAA,IAAqB;AAAA,EAIrC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,EAAA,GAAK,aAAa,OAAA,CAAQ,QAAQ,KAAK,gBAAA,CAAiB,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA;AAE3E,EAAA,uBACErC,eAAAA,CAAAQ,mBAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAR,eAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,cAAY,CAAA,YAAA,EAAe,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,MAAM,KAAK,CAAA,CAAA;AAAA,QACpD,SAAS,MAAM,UAAA,CAAW,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QACnC,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,UACtB;AAAA,QACF,CAAA;AAAA,QACA,SAAA,EAAWR,oBAAA;AAAA,UACT,wFAAA;AAAA,UACA,UACI,uDAAA,GACA;AAAA,SACN;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,cAAA,mBACCH,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EACd,QAAA,kBAAAA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA,EACvC,CAAA,GACE,IAAA;AAAA,0BACJW,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EACb,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,WAAA,mBACLA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,YAAA,EACb,QAAA,EAAA;AAAA,cAAA,KAAA,CAAM,WAAA;AAAA,cACN;AAAA,aAAA,EACH,CAAA,GACE,IAAA;AAAA,4BACJX,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,gBAAM,UAAA,EAAW;AAAA,WAAA,EAC/C,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAA,EAAoC,cAAI,KAAA,EAAM,CAAA;AAAA,0BAC9DA,cAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,KAAA;AAAA,cACA,UAAU,OAAA,CAAQ,QAAA;AAAA,cAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,cACd,GAAI,cAAA,KAAmB,MAAA,GAAY,EAAE,UAAA,EAAY,cAAA,KAAmB;AAAC;AAAA,WACxE;AAAA,0BACAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAW,eAAA;AAAA,cACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,QAAA,EAAS;AACT,gBAAA,IAAI,OAAA,aAAoB,KAAK,CAAA;AAAA,cAC/B,CAAA;AAAA,cACA,SAAA,EAAWG,oBAAA;AAAA,gBACT,qEAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,kBAAAH,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAW,IAAA;AAAA,kBACX,OAAA,EAAQ,WAAA;AAAA,kBACR,SAAA,EAAU,QAAA;AAAA,kBACV,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAY,KAAA;AAAA,kBACZ,aAAA,EAAc,OAAA;AAAA,kBAEd,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB;AAAA;AAAA;AAC9B;AAAA;AACF;AAAA;AAAA,KACF;AAAA,oBAEAA,cAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAQ,OAAA;AAAA,QACR,YAAA,EAAc,UAAA;AAAA,QAEd,QAAA,kBAAAA,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,OAAA;AAAA,YACA,MAAA;AAAA,YACA,aAAA;AAAA,YACA,gBAAA;AAAA,YACA,aAAA;AAAA,YACA,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK;AAAA;AAAA;AACjC;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAeA,SAAS,cAAA,CAAe;AAAA,EACtB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAQG;AACD,EAAA,uBACEW,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAAA,MACA,SAAA,EAAU,mDAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAgB,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,QAAA,EAAU,eAAe,CAAA,EAClF,CAAA;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,WAAW,KAAA,CAAM,IAAA;AAAA,YACjB,OAAO,OAAA,CAAQ,QAAA;AAAA,YACf,QAAA,EAAU,gBAAA;AAAA,YACV,SAAA,EAAS;AAAA;AAAA,SACX,EACF,CAAA;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,QAAA,EAAU;AAAA;AAAA,SACZ,EACF,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAWG,oBAAA;AAAA,cACT,4DAAA;AAAA,cACA,2CAAA;AAAA,cACA,iDAAA;AAAA,cACA;AAAA,aACF;AAAA,YACD,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;AAGA,SAAS,eAAA,CAAgB,EAAE,OAAA,EAAQ,EAA4B;AAC7D,EAAA,uBACEQ,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,qBAAA,EAAoB,UAAA;AAAA,MACpB,OAAA;AAAA,MACA,SAAA,EAAWR,oBAAA;AAAA,QACT,qDAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,OAAA,EAAQ,WAAA;AAAA,YACR,SAAA,EAAU,QAAA;AAAA,YACV,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YAEd,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA,SACzB;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,YAAA,EAAU;AAAA;AAAA;AAAA,GACtD;AAEJ;ACpgBO,IAAM,kBAAkBK,mBAAAA,CAAG;AAAA,EAChC,IAAA,EAAM,0BAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,WAAA,EAAa;AAAA,MACX,UAAA,EAAY,iBAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,eAAA;AAAA,MACR,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,WAAA,EAAa,YAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;AAKM,SAAS,SAAA,CAAU;AAAA,EACxB,SAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,OAAA,GAAU,QAAA;AAAA,EACV,GAAG;AACL,CAAA,EAAmB;AACjB,EAAA,uBACEL,cAAAA;AAAA,IAACgJ,6BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,WAAA;AAAA,MACA,SAAA,EAAW7I,qBAAG,eAAA,CAAgB,EAAE,aAAa,OAAA,EAAS,GAAG,SAAS;AAAA;AAAA,GACpE;AAEJ;AClCO,SAAS,gBAAA,CAAiB,EAAE,SAAA,EAAU,EAA0B;AACrE,EAAA,uBACEH,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAWG,oBAAA,CAAG,qDAAA,EAAuD,SAAS,CAAA;AAAA,MAE9E,0BAAAH,cAAAA,CAACiJ,uBAAA,EAAA,EAAY,SAAA,EAAU,WAAA,EAAY,aAAa,GAAA,EAAK;AAAA;AAAA,GACvD;AAEJ;ACdO,SAAS,MAAA,CAAO,EAAE,QAAA,EAAU,cAAA,GAAiB,OAAO,SAAA,EAAW,GAAG,OAAM,EAAgB;AAC7F,EAAA,uBACEtI,eAAAA;AAAA,IAACuI,0BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACV/I,oBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKE,0EAAA;AAAA,QACA,kCAAA;AAAA,QACA,mBAAmB,OAAA,IAAW,kBAAA;AAAA,QAC9B,+DAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGF,QAAA,EAAA;AAAA,wBAAAH,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAWG,oBAAA;AAAA,cACT,gCAAA;AAAA,cACA,uCAAA;AAAA,cACA,0BAAA;AAAA,cACA,yDAAA;AAAA,cACA,qEAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEA,QAAA,kBAAAH,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAWG,oBAAA;AAAA,kBACT,+BAAA;AAAA,kBACA,2CAAA;AAAA,kBACA,mCAAA;AAAA,kBACA;AAAA;AACF;AAAA;AACF;AAAA,SACF;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ;ACzBO,IAAM,aAAaE,mBAAAA,CAAG;AAAA,EAC3B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,kCAAA;AAAA,IACN,IAAA,EAAM,6CAAA;AAAA,IACN,OAAA,EAAS;AAAA,MACP,yCAAA;AAAA,MACA,sEAAA;AAAA,MACA,+BAAA;AAAA,MACA,yBAAA;AAAA,MACA,wDAAA;AAAA,MACA,+DAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EACE;AAAA,OACJ;AAAA,MACA,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS;AAAA;AACX;AACF,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,IAAA,EAAM,IAAA;AAC3B,CAAC;AASD,SAAS,KAAK,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,GAAG,OAAM,EAAkB;AACpE,EAAA,MAAMgC,OAAAA,GAAS,UAAA,CAAW,EAAE,IAAA,EAAM,CAAA;AAClC,EAAA,uBACErC,cAAAA;AAAA,IAACmJ,wBAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,EAAA,KACVhJ,oBAAA,CAAGkC,OAAAA,CAAO,IAAA,EAAK,EAAG,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,EAAE,IAAI,SAAS,CAAA;AAAA,MAG9E;AAAA;AAAA,GACH;AAEJ;AAOA,SAAS,KAAK,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,GAAG,OAAM,EAAkB;AACpE,EAAA,MAAMA,OAAAA,GAAS,UAAA,CAAW,EAAE,IAAA,EAAM,CAAA;AAClC,EAAA,uBACErC,cAAAA;AAAA,IAACoJ,2BAAA;AAAA,IAAA;AAAA,MACE,GAAI,KAAA;AAAA,MACL,SAAA,EAAW,CAAC,EAAA,KACVjJ,oBAAA,CAAGkC,OAAAA,CAAO,IAAA,EAAK,EAAG,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,EAAE,IAAI,SAAS,CAAA;AAAA,MAG9E;AAAA;AAAA,GACH;AAEJ;AAOA,SAAS,QAAQ,EAAE,IAAA,EAAM,WAAW,QAAA,EAAU,GAAG,OAAM,EAAqB;AAC1E,EAAA,MAAMA,OAAAA,GAAS,UAAA,CAAW,EAAE,IAAA,EAAM,CAAA;AAClC,EAAA,uBACErC,cAAAA;AAAA,IAACqJ,uBAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,EAAA,KACVlJ,oBAAA,CAAGkC,OAAAA,CAAO,OAAA,EAAQ,EAAG,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,EAAE,IAAI,SAAS,CAAA;AAAA,MAGjF;AAAA;AAAA,GACH;AAEJ;AAMA,SAAS,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,GAAG,OAAM,EAAmB;AAChE,EAAA,MAAMA,OAAAA,GAAS,UAAA,CAAW,EAAE,CAAA;AAC5B,EAAA,uBACErC,cAAAA;AAAA,IAACsJ,4BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,EAAA,KACVnJ,oBAAA,CAAGkC,OAAAA,CAAO,KAAA,EAAM,EAAG,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,EAAE,IAAI,SAAS,CAAA;AAAA,MAG/E;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AAAA,EACtC,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC;ACvGM,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,GAAO,CAAA;AAAA,EACP,IAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAkB;AAChB,EAAA,MAAMA,OAAAA,GAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,YAAY,CAAA;AACtD,EAAA,uBACE1B,eAAAA;AAAA,IAACyD,6BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVjE,oBAAA;AAAA,QACE,0BAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAC/DxC,cAAAA;AAAA,UAACuJ,4BAAA;AAAA,UAAA;AAAA,YACE,GAAG,aAAA;AAAA,YACJ,IAAA;AAAA,YACA,aAAa,WAAA,IAAe,EAAA;AAAA,YAC5B,SAAA,EAAWpJ,oBAAA;AAAA;AAAA;AAAA,cAGTkC,QAAO,GAAA,EAAI;AAAA,cACXA,QAAO,OAAA,EAAQ;AAAA,cACf,wBAAA;AAAA,cACA;AAAA;AACF;AAAA,SACF;AAAA,QACC,WAAA,mBACCrC,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD;AAAA;AAAA;AAAA,GACN;AAEJ;AClDO,SAAS,SAAA,CAA2C;AAAA,EACzD,KAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAsB;AACpB,EAAA,MAAM9B,OAAAA,GAAS,kBAAA,CAAmB,EAAE,IAAA,EAAM,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GACJ,UAAA,KAAe,MAAA,GACX,qDAAA,GACA,sEAAA;AACN,EAAA,uBACE1B,eAAAA;AAAA,IAAC4G,6BAAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,CAAC,WAAA,KACVpH,oBAAA;AAAA,QACE,0BAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA,OAC7D;AAAA,MAGD,QAAA,EAAA;AAAA,QAAA,KAAA,mBAAQH,cAAAA,CAACwC,yBAAAA,EAAA,EAAM,SAAA,EAAW,gBAAA,EAAmB,iBAAM,CAAA,GAAW,IAAA;AAAA,wBAE/DxC,cAAAA;AAAA,UAACmH,6BAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWhH,oBAAA;AAAA,cACTkC,QAAO,GAAA,EAAI;AAAA,cACXA,QAAO,OAAA,EAAQ;AAAA,cACf,oCAAA;AAAA;AAAA;AAAA,cAGA,WAAA;AAAA,cACA;AAAA,aACF;AAAA,YAEC,QAAA,EAAA,CAAC,4BACArC,cAAAA;AAAA,cAACoH,+BAAAA;AAAA,cAAA;AAAA,gBACC,OAAA;AAAA,gBACA,SAAA,EAAWjH,oBAAA;AAAA,kBACT,6CAAA;AAAA,kBACA,+BAAA;AAAA,kBACA,gCAAA;AAAA;AAAA,kBAEA,qFAAA;AAAA,kBACA;AAAA;AACF;AAAA;AACF;AAAA,SAEJ;AAAA,QAEC,WAAA,mBACCH,cAAAA,CAACe,wBAAAA,EAAA,EAAK,MAAK,aAAA,EAAc,SAAA,EAAW,eAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,YAAA,IAAgB,UAAA,KAAe,MAAA,mBAC9Bf,cAAAA,CAACmE,gCAAA,EAAW,SAAA,EAAW,gBAAA,EAAmB,QAAA,EAAA,YAAA,EAAa,CAAA,GACrD;AAAA;AAAA;AAAA,GACN;AAEJ;AC7DO,SAAS,gBAAA,CAAiB,OAAA,GAAyC,EAAC,EAAe;AACxF,EAAA,OAAO,IAAIqF,uCAAA,CAA6B,EAAE,kBAAkB,OAAA,CAAQ,gBAAA,IAAoB,GAAG,CAAA;AAC7F;AAEO,IAAM,cAAcnJ,mBAAAA,CAAG;AAAA,EAC5B,KAAA,EAAO;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,2DAAA;AAAA,MACA,uDAAA;AAAA,MACA,0BAAA;AAAA,MACA,4BAAA;AAAA,MACA,8FAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO,0DAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,EAAa;AAAA,MAC3B,OAAA,EAAS,EAAE,IAAA,EAAM,cAAA,EAAe;AAAA,MAChC,MAAA,EAAQ,EAAE,IAAA,EAAM,aAAA;AAAc;AAChC,GACF;AAAA,EACA,eAAA,EAAiB,EAAE,OAAA,EAAS,MAAA;AAC9B,CAAC;AAID,IAAM,YAAA,GAAe;AAAA,EACnB,IAAA,EAAMoJ,gBAAA;AAAA,EACN,OAAA,EAASR,uBAAAA;AAAA,EACT,MAAA,EAAQS;AACV,CAAA;AAQO,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,SAAA,EAAU,EAAqB;AAClE,EAAA,uBACE1J,cAAAA;AAAA,IAAC2J,wCAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,SAAA,EAAWxJ,oBAAA;AAAA,QACT,0EAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,CAAC,EAAE,KAAA,EAAM,KAAM;AACd,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,IAAW,MAAA;AACzC,QAAA,MAAM,IAAA,GAAO,aAAa,OAAO,CAAA;AACjC,QAAA,MAAM,EAAE,MAAM,IAAA,EAAM,KAAA,EAAO,aAAY,GAAI,WAAA,CAAY,EAAE,OAAA,EAAS,CAAA;AAClE,QAAA,uBACEQ,eAAAA,CAACiJ,kCAAA,EAAA,EAAU,KAAA,EAAc,SAAA,EAAW,MAAK,EACvC,QAAA,EAAA;AAAA,0BAAA5J,eAAC,IAAA,EAAA,EAAK,SAAA,EAAW,IAAA,EAAK,EAAG,eAAW,IAAA,EAAC,CAAA;AAAA,0BACrCW,eAAAA,CAACkJ,yCAAA,EAAA,EAAiB,SAAA,EAAU,sCAAA,EAC1B,QAAA,EAAA;AAAA,4BAAA7J,cAAAA,CAAC8J,4BAAS,IAAA,EAAK,OAAA,EAAQ,WAAW,KAAA,EAAM,EACrC,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,EACjB,CAAA;AAAA,YACC,KAAA,CAAM,OAAA,CAAQ,WAAA,mBACb9J,eAAC8J,wBAAA,EAAA,EAAS,IAAA,EAAK,aAAA,EAAc,SAAA,EAAW,WAAA,EAAY,EACjD,QAAA,EAAA,KAAA,CAAM,OAAA,CAAQ,aACjB,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,0BACA9J,cAAAA;AAAA,YAACqD,0BAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,OAAA;AAAA,cACL,YAAA,EAAW,SAAA;AAAA,cACX,SAAA,EAAWlD,oBAAA;AAAA,gBACT,oEAAA;AAAA,gBACA,0EAAA;AAAA,gBACA;AAAA,eACF;AAAA,cAEA,QAAA,kBAAAH,cAAAA,CAAC+J,aAAA,EAAA,EAAQ,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AAChC,SAAA,EACF,CAAA;AAAA,MAEJ;AAAA;AAAA,GACF;AAEJ;AC7FO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA,GAAQ,GAAA;AAAA,EACR,UAAA,GAAa,CAAA;AAAA,EACb,GAAG;AACL,CAAA,EAAiC;AAC/B,EAAA,uBAAO/J,cAAAA,CAACgK,kCAAA,EAAA,EAAmB,KAAA,EAAc,UAAA,EAAyB,GAAG,KAAA,EAAO,CAAA;AAC9E;AAIO,SAAS,QAAQ,EAAE,SAAA,EAAW,SAAS,CAAA,EAAG,GAAG,OAAM,EAAiB;AACzE,EAAA,uBACEhK,cAAAA;AAAA,IAACiK,2BAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,MAAA;AAAA,MACA,SAAA,EAAW,CAAC,WAAA,KACV9J,oBAAA;AAAA,QACE,eAAA;AAAA,QACA,wEAAA;AAAA,QACA,eAAA;AAAA,QACA,oCAAA;AAAA,QACA,2FAAA;AAAA,QACA,6DAAA;AAAA,QACA,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA,CAAU,WAAW,CAAA,GAAI;AAAA;AAC7D;AAAA,GAEJ;AAEJ","file":"index.cjs","sourcesContent":["import type { ReactNode, RefObject } from 'react'\nimport {\n Dialog as AriaDialog,\n type DialogProps as AriaDialogProps,\n DialogTrigger as AriaDialogTrigger,\n type DialogTriggerProps as AriaDialogTriggerProps,\n Popover as AriaPopover,\n type PopoverProps as AriaPopoverProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Popover — generic anchored panel. Two usage modes:\n\n 1. DialogTrigger mode (simplest, for Button-driven popovers):\n <Popover>\n <Button>Open</Button> // first child = trigger\n <PopoverContent>…panel…</PopoverContent>\n </Popover>\n\n 2. Controlled mode (for non-Button triggers, e.g. clickable chips):\n const ref = useRef<HTMLSpanElement>(null)\n const [open, setOpen] = useState(false)\n …\n <span ref={ref} onClick={…}>chip</span>\n <PopoverContent\n triggerRef={ref}\n isOpen={open}\n onOpenChange={setOpen}\n >…panel…</PopoverContent>\n\n Internally wraps RAC `Popover` + `Dialog` so focus management, outside-\n click, and Escape are handled correctly.\n ========================================================================= */\n\nexport function Popover(props: AriaDialogTriggerProps) {\n return <AriaDialogTrigger {...props} />\n}\n\nexport type PopoverContentProps = Omit<AriaPopoverProps, 'children'> & {\n /** Dialog children. Supports the render-prop form `({ close }) => …`. */\n children: AriaDialogProps['children']\n /** Visual override for the floating panel. */\n panelClassName?: string\n /** When in controlled mode, the element the popover should anchor to. */\n triggerRef?: RefObject<Element | null>\n}\n\nexport function PopoverContent({\n children,\n className,\n panelClassName,\n offset = 6,\n placement = 'bottom start',\n ...props\n}: PopoverContentProps) {\n return (\n <AriaPopover\n offset={offset}\n placement={placement}\n {...props}\n className={(renderProps) =>\n cn(\n 'rounded-md border border-rule bg-surface',\n 'shadow-[var(--shadow-float)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n panelClassName,\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <AriaDialog className=\"outline-none\">{children}</AriaDialog>\n </AriaPopover>\n )\n}\n\n/* =========================================================================\n PopoverPanelHeader / PopoverPanelBody / PopoverPanelFooter — slot\n primitives mirroring Modal's split. Consumers compose these to keep\n padding consistent across popovers.\n ========================================================================= */\n\nexport function PopoverPanelHeader({\n className,\n children,\n}: {\n className?: string\n children?: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'flex items-center justify-between gap-2',\n 'px-3.5 py-2.5 border-b border-rule',\n className,\n )}\n >\n {children}\n </div>\n )\n}\n\nexport function PopoverPanelBody({\n className,\n children,\n}: {\n className?: string\n children?: ReactNode\n}) {\n return <div className={cn('p-2', className)}>{children}</div>\n}\n\nexport function PopoverPanelFooter({\n className,\n children,\n}: {\n className?: string\n children?: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'flex items-center justify-between gap-2',\n 'px-3.5 py-2.5 border-t border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n 'rounded-b-md',\n className,\n )}\n >\n {children}\n </div>\n )\n}\n","import {\n File as FileIcon,\n FileArchive,\n FileImage,\n FileSpreadsheet,\n FileText,\n Loader2,\n Paperclip,\n X,\n} from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport type { ComponentProps } from 'react'\nimport { DropZone, FileTrigger, Heading, Text } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button'\nimport {\n PopoverContent,\n PopoverPanelBody,\n PopoverPanelFooter,\n PopoverPanelHeader,\n Popover,\n} from '../popover'\n\n/* =========================================================================\n FileField — presentational control for a single-file attachment.\n\n Pure presentation: it knows nothing about the storage-service. The\n consumer wires uploads/downloads/deletes through the callbacks. Two\n states:\n\n - empty → a click-to-pick control that doubles as a drop zone\n (highlights on drag-over). Picking or dropping a file\n calls `onSelectFile`.\n - filled → a card showing a file-type icon, the name (clicking the\n card calls `onDownload`), and below it the size + an (x)\n that opens a confirm popover before calling `onDelete`.\n\n One file per field — selecting a new file replaces the current one.\n ========================================================================= */\n\nexport interface FileFieldValue {\n /** Filename shown as the label. */\n name: string\n /** Size in bytes — rendered when known (resolved from storage on read). */\n sizeInBytes?: number\n /** MIME type — picks the file-type icon when known. */\n contentType?: string\n}\n\nexport interface FileFieldProps {\n /** The attached file, or null/undefined when empty. */\n value?: FileFieldValue | null\n /** True while an upload is in flight — shows a spinner, blocks re-pick. */\n isUploading?: boolean\n /** Read-only: no picker, no delete — download still works. */\n isReadOnly?: boolean\n /** Restrict the native picker (e.g. `['image/*', '.pdf']`). */\n acceptedFileTypes?: string[]\n /** Called with the picked/dropped File. */\n onSelectFile?: (file: File) => void\n /** Called when the filled card is clicked. */\n onDownload?: () => void\n /** Called after the user confirms removal in the (x) popover. */\n onDelete?: () => void\n /** Inline validation message (edit surface). */\n errorMessage?: string\n /** True iff the field is touched and currently invalid. */\n isInvalid?: boolean\n className?: string\n}\n\nconst dropZoneStyles = tv({\n base: [\n 'flex items-center justify-center gap-2 rounded-md border border-dashed border-rule',\n 'bg-surface-2/40 px-3 py-4 text-ink-3 transition-colors duration-150 outline-none',\n 'data-[drop-target]:border-ink-4 data-[drop-target]:bg-surface-2 data-[drop-target]:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n ],\n variants: {\n isInvalid: { true: 'border-danger' },\n },\n})\n\nconst cardStyles = tv({\n base: [\n 'group relative flex w-full items-start gap-3 rounded-md border border-rule bg-surface px-3 py-2.5',\n 'text-left transition-colors duration-150',\n ],\n variants: {\n isClickable: {\n true: 'cursor-pointer hover:border-ink-4 hover:bg-surface-2 outline-none focus-visible:shadow-[var(--shadow-focus)]',\n false: 'cursor-default',\n },\n },\n})\n\n/** Maps a MIME type to a file-type glyph. Falls back to a generic file. */\nexport function iconForContentType(contentType?: string): LucideIcon {\n if (!contentType) return FileIcon\n if (contentType.startsWith('image/')) return FileImage\n if (contentType === 'application/pdf') return FileText\n if (contentType.startsWith('text/')) return FileText\n if (\n contentType.includes('spreadsheet') ||\n contentType.includes('excel') ||\n contentType === 'text/csv'\n ) {\n return FileSpreadsheet\n }\n if (\n contentType.includes('zip') ||\n contentType.includes('tar') ||\n contentType.includes('compressed') ||\n contentType.includes('archive')\n ) {\n return FileArchive\n }\n return FileIcon\n}\n\n/** Human-readable byte size (1 KB = 1024 B). */\nexport function formatFileSize(bytes: number | undefined): string {\n if (bytes == null || !Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let size = bytes / 1024\n let unit = 0\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024\n unit += 1\n }\n return `${size < 10 ? size.toFixed(1) : Math.round(size)} ${units[unit]}`\n}\n\nexport function FileField({\n value,\n isUploading = false,\n isReadOnly = false,\n acceptedFileTypes,\n onSelectFile,\n onDownload,\n onDelete,\n errorMessage,\n isInvalid = false,\n className,\n}: FileFieldProps) {\n const handleSelect = (files: FileList | null) => {\n const file = files?.item(0)\n if (file) onSelectFile?.(file)\n }\n\n const handleDrop: NonNullable<ComponentProps<typeof DropZone>['onDrop']> = async (event) => {\n const item = event.items.find((candidate) => candidate.kind === 'file')\n if (item && item.kind === 'file') {\n onSelectFile?.(await item.getFile())\n }\n }\n\n // ---- Empty state -------------------------------------------------------\n if (!value) {\n if (isReadOnly) {\n return <span className={cn('text-ink-4', className)}>—</span>\n }\n\n if (isUploading) {\n return (\n <div className={cn(dropZoneStyles({ isInvalid }), className)}>\n <Loader2 className=\"size-3.5 animate-spin\" aria-hidden />\n <span className=\"font-sans text-[12.5px]\">Uploading…</span>\n </div>\n )\n }\n\n return (\n <div className={className}>\n <DropZone\n aria-label=\"Drop a file to upload\"\n onDrop={handleDrop}\n className={dropZoneStyles({ isInvalid })}\n >\n <Paperclip className=\"size-3.5 shrink-0\" aria-hidden />\n <Text slot=\"label\" className=\"font-sans text-[12.5px]\">\n Drop a file here, or\n </Text>\n <FileTrigger\n onSelect={handleSelect}\n {...(acceptedFileTypes ? { acceptedFileTypes } : {})}\n >\n <Button variant=\"ghost\" size=\"sm\">\n Browse\n </Button>\n </FileTrigger>\n </DropZone>\n {isInvalid && errorMessage ? (\n <p className=\"mt-1 font-sans text-[11.5px] text-danger\">{errorMessage}</p>\n ) : null}\n </div>\n )\n }\n\n // ---- Filled state ------------------------------------------------------\n const Icon = isUploading ? Loader2 : iconForContentType(value.contentType)\n const isClickable = Boolean(onDownload) && !isUploading\n\n return (\n <div className={className}>\n <div className={cardStyles({ isClickable })}>\n {/* Download surface — the icon + name + size. A button so the whole\n card is one click target; the (x) is a sibling, never nested. */}\n <Button\n variant=\"subtle\"\n // Reset button chrome — this is a borderless full-bleed click target.\n className=\"m-0 flex min-w-0 flex-1 items-start gap-3 border-0 bg-transparent p-0 text-left hover:bg-transparent\"\n isDisabled={!isClickable}\n {...(onDownload ? { onPress: onDownload } : {})}\n >\n <Icon\n className={cn('mt-0.5 size-5 shrink-0 text-ink-3', isUploading && 'animate-spin')}\n aria-hidden\n strokeWidth={1.6}\n />\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate font-sans text-[13px] text-ink\">{value.name}</span>\n <span className=\"font-sans text-[11.5px] text-ink-4\">\n {isUploading ? 'Uploading…' : formatFileSize(value.sizeInBytes)}\n </span>\n </span>\n </Button>\n\n {!isReadOnly && onDelete && !isUploading ? (\n <Popover>\n <Button\n aria-label=\"Remove file\"\n size=\"icon-sm\"\n variant=\"subtle\"\n className=\"shrink-0 text-ink-4 hover:text-danger\"\n >\n <X className=\"size-3.5\" />\n </Button>\n <PopoverContent placement=\"top end\" panelClassName=\"w-[260px]\">\n {({ close }) => (\n <>\n <PopoverPanelHeader>\n <Heading\n slot=\"title\"\n className=\"m-0 font-sans text-[12.5px] font-medium text-ink\"\n >\n Delete this file?\n </Heading>\n </PopoverPanelHeader>\n <PopoverPanelBody className=\"px-3.5 py-3\">\n <p className=\"m-0 font-sans text-[12px] leading-snug text-ink-2\">\n This removes the attachment from this record.\n </p>\n </PopoverPanelBody>\n <PopoverPanelFooter>\n <Button variant=\"ghost\" size=\"sm\" onPress={close}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n size=\"sm\"\n className={cn('bg-danger border-danger', 'hover:bg-danger hover:border-danger')}\n onPress={() => {\n onDelete()\n close()\n }}\n >\n Delete\n </Button>\n </PopoverPanelFooter>\n </>\n )}\n </PopoverContent>\n </Popover>\n ) : null}\n </div>\n {isInvalid && errorMessage ? (\n <p className=\"mt-1 font-sans text-[11.5px] text-danger\">{errorMessage}</p>\n ) : null}\n </div>\n )\n}\n","import { Loader2 } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { formatFileSize, iconForContentType } from '../file-field'\n\n/* =========================================================================\n AttachmentChip — a small file token for chat composers and message\n bubbles. A file-type icon (or a spinner while uploading), a truncated\n name, the size (or upload state), and an optional (x) to remove. Pure\n presentation: the consumer owns upload / remove / download.\n ========================================================================= */\n\nexport const attachmentChipStyles = tv({\n base: [\n 'inline-flex items-center gap-1.5 max-w-[220px]',\n 'pl-2 pr-1 py-1 rounded-[6px] border',\n 'font-sans text-[12.5px] leading-none',\n ],\n variants: {\n status: {\n uploading: 'bg-surface-2 border-rule text-ink-3',\n ready: 'bg-surface-2 border-rule text-ink',\n error: 'bg-surface-2 border-danger text-danger',\n },\n isInteractive: {\n true: 'cursor-pointer hover:bg-surface-3',\n false: '',\n },\n },\n defaultVariants: { status: 'ready', isInteractive: false },\n})\n\nexport type AttachmentChipVariants = VariantProps<typeof attachmentChipStyles>\n\nexport interface AttachmentChipProps {\n /** File name shown (truncated). */\n name: string\n /** Size in bytes — rendered when known and the chip is in the `ready` state. */\n sizeInBytes?: number\n /** MIME type — picks the leading file-type icon. */\n contentType?: string\n /** Upload lifecycle: spinner while `uploading`, danger styling on `error`. */\n status?: 'uploading' | 'ready' | 'error'\n /** Tooltip text and the meta line shown in the `error` state (the failure reason). */\n errorMessage?: string\n /** When set, an (x) button is shown that calls this. */\n onRemove?: () => void\n /** When set, the chip body is pressable (e.g. to download an agent file). */\n onPress?: () => void\n className?: string\n}\n\nexport function AttachmentChip({\n name,\n sizeInBytes,\n contentType,\n status = 'ready',\n errorMessage,\n onRemove,\n onPress,\n className,\n}: AttachmentChipProps) {\n const Icon = status === 'uploading' ? Loader2 : iconForContentType(contentType)\n const meta =\n status === 'error'\n ? (errorMessage ?? 'Failed')\n : status === 'uploading'\n ? 'Uploading…'\n : formatFileSize(sizeInBytes)\n\n const body: ReactNode = (\n <>\n <Icon\n className={cn('size-3.5 shrink-0 text-ink-3', status === 'uploading' && 'animate-spin')}\n aria-hidden\n />\n <span className=\"min-w-0 truncate\">{name}</span>\n {meta ? (\n <span className={cn('shrink-0', status !== 'error' && 'text-ink-4')}>{meta}</span>\n ) : null}\n </>\n )\n\n return (\n <span\n className={cn(attachmentChipStyles({ status, isInteractive: Boolean(onPress) }), className)}\n title={errorMessage ?? name}\n >\n {onPress ? (\n <button\n type=\"button\"\n onClick={onPress}\n className=\"inline-flex min-w-0 cursor-pointer items-center gap-1.5 outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n {body}\n </button>\n ) : (\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">{body}</span>\n )}\n {onRemove ? (\n <button\n type=\"button\"\n aria-label={`Remove ${name}`}\n onClick={(event) => {\n event.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex shrink-0 items-center justify-center',\n 'size-4 rounded-[3px]',\n 'cursor-pointer text-ink-3 hover:bg-surface-3 hover:text-ink',\n 'outline-none focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </span>\n )\n}\n","import {\n Banknote,\n BookText,\n Braces,\n Brackets,\n Calendar,\n CircleDot,\n Contact,\n Hash,\n Link2,\n type LucideIcon,\n type LucideProps,\n Paperclip,\n ToggleLeft,\n Type,\n User,\n UsersRound,\n} from 'lucide-react'\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n AttributeTypeIcon — one lucide-react glyph per attribute type. Generic\n over the lib so any attribute-aware UI (filter chips, attribute pickers,\n schema editors, table headers, etc.) can render a consistent icon for\n the same type without re-inventing the mapping.\n\n Four exports:\n\n - `AttributeType` — the canonical union of attribute-type\n literals.\n - `ATTRIBUTE_TYPE_ICONS` — `Record<AttributeType, LucideIcon>` for\n direct lookups (e.g. when a consumer wants\n the icon component itself, not a rendered\n element).\n - `useAttributeTypeIcon` — hook returning the matching `LucideIcon`.\n Useful when you need to compose the icon\n into a different layout (sized via\n parent's prop, wrapped in a button, etc.).\n - `AttributeTypeIcon` — convenience component with sane defaults\n (`size-3.5`, `aria-hidden`,\n `currentColor`).\n\n Mapping\n string → Type (\"Aa\" lowercase/uppercase glyph)\n number → Hash (\"#\")\n integer → Hash (same — they're conceptually one bucket)\n datetime → Calendar\n enum → CircleDot (filled-center radio metaphor)\n boolean → ToggleLeft (toggle switch)\n array → Brackets (\"[ ]\")\n object → Braces (\"{ }\")\n relation → Link2 (chain link — foreign-key reference)\n user → User (person glyph — platform-user reference)\n principal → UsersRound (a party that can HOLD ACCESS — user, team or org;\n a group glyph, distinct from `user`'s single person)\n currency → Banknote (money — amount + currency_code)\n knowledge-text → BookText (long text stored as a knowledge node)\n file → Paperclip (attachment — stored-file reference)\n contact-address → Contact (one canonical reachable address — email /\n phone / LinkedIn — binding the record to a\n conversation contact)\n ========================================================================= */\n\n/**\n * Attribute-type values the design system knows how to render. Exported as a\n * value (an enum-like const object) so consumers can both reference a single\n * member by name (`AttributeType.String`) and iterate the full set\n * (`Object.values(AttributeType)`) without re-declaring the list. The\n * matching type — derived from this same object — keeps the union and the\n * runtime list in lockstep: adding a member here surfaces it in every\n * consumer (icon mapping, type picker, designer config) automatically.\n */\nexport const AttributeType = {\n String: 'string',\n Number: 'number',\n Integer: 'integer',\n Datetime: 'datetime',\n Enum: 'enum',\n Boolean: 'boolean',\n Array: 'array',\n Object: 'object',\n Relation: 'relation',\n User: 'user',\n Principal: 'principal',\n Currency: 'currency',\n KnowledgeText: 'knowledge-text',\n File: 'file',\n ContactAddress: 'contact-address',\n} as const\nexport type AttributeType = (typeof AttributeType)[keyof typeof AttributeType]\n\n/** Iteration order for type pickers, dropdowns, etc. */\nexport const ATTRIBUTE_TYPES: ReadonlyArray<AttributeType> = Object.values(AttributeType)\n\nexport const ATTRIBUTE_TYPE_ICONS: Record<AttributeType, LucideIcon> = {\n [AttributeType.String]: Type,\n [AttributeType.Number]: Hash,\n [AttributeType.Integer]: Hash,\n [AttributeType.Datetime]: Calendar,\n [AttributeType.Enum]: CircleDot,\n [AttributeType.Boolean]: ToggleLeft,\n [AttributeType.Array]: Brackets,\n [AttributeType.Object]: Braces,\n [AttributeType.Relation]: Link2,\n [AttributeType.User]: User,\n [AttributeType.Principal]: UsersRound,\n [AttributeType.Currency]: Banknote,\n [AttributeType.KnowledgeText]: BookText,\n [AttributeType.File]: Paperclip,\n [AttributeType.ContactAddress]: Contact,\n}\n\nexport function useAttributeTypeIcon(type: AttributeType): LucideIcon {\n return ATTRIBUTE_TYPE_ICONS[type]\n}\n\nexport type AttributeTypeIconProps = Omit<LucideProps, 'ref'> & {\n type: AttributeType\n}\n\nexport function AttributeTypeIcon({\n type,\n className,\n strokeWidth,\n ...props\n}: AttributeTypeIconProps) {\n const Icon = useAttributeTypeIcon(type)\n return (\n <Icon\n aria-hidden\n strokeWidth={strokeWidth ?? 1.6}\n className={cn('size-3.5', className)}\n {...props}\n />\n )\n}\n","import { type HTMLAttributes, useState } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Avatar — round, paper-tinted initials chip. Mono glyph, hairline border.\n Given a `src` it paints the image over the same chrome and falls back to\n the initials the moment the image fails to load (missing, forbidden,\n broken) — a person never renders as a blank circle.\n For square colored \"app tiles\" use the AppSwitcher's internal tile —\n Avatar is reserved for people.\n ========================================================================= */\n\nexport const avatarStyles = tv({\n base: [\n 'inline-grid place-items-center shrink-0 select-none overflow-hidden',\n 'rounded-full border',\n 'font-mono font-medium tracking-[-0.005em]',\n ],\n variants: {\n size: {\n sm: 'size-[22px] text-[10px]',\n md: 'size-7 text-[12px]',\n lg: 'size-9 text-[13px]',\n xl: 'size-[120px] text-[34px]',\n },\n tone: {\n paper: 'bg-surface-3 text-ink border-rule',\n indigo: 'bg-accent text-[#f0efe8] border-transparent',\n moss: 'bg-[#5b7052] text-[#f0efe8] border-transparent',\n terra: 'bg-[#8a5a3f] text-[#f0efe8] border-transparent',\n slate: 'bg-ink text-surface border-transparent',\n },\n },\n defaultVariants: { size: 'md', tone: 'paper' },\n})\n\nexport type AvatarVariants = VariantProps<typeof avatarStyles>\nexport type AvatarProps = HTMLAttributes<HTMLSpanElement> &\n AvatarVariants & {\n /** 1–2 character initials. Ignored if `children` is provided. */\n initials?: string\n /**\n * Image URL. Rendered over the chip; on load error the chip reverts to\n * `children ?? initials`. `null`/`undefined` = no image.\n */\n src?: string | null\n /** Alt text for the image. Defaults to empty — the avatar is decorative. */\n alt?: string\n }\n\nexport function Avatar({\n size,\n tone,\n initials,\n src,\n alt = '',\n className,\n children,\n ...props\n}: AvatarProps) {\n // The URL that failed, not a bare flag: a new src automatically gets a\n // fresh chance without an effect — the error belongs to the URL, not the\n // person.\n const [failedSrc, setFailedSrc] = useState<string | null>(null)\n const showsImage = Boolean(src) && failedSrc !== src\n\n return (\n <span {...props} className={cn(avatarStyles({ size, tone }), className)}>\n {showsImage ? (\n <img\n src={src ?? undefined}\n alt={alt}\n className=\"size-full object-cover\"\n onError={() => setFailedSrc(src ?? null)}\n />\n ) : (\n (children ?? initials)\n )}\n </span>\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Avatar, type AvatarVariants } from '../avatar/avatar'\n\n/* =========================================================================\n AvatarGroup — a stack of overlapping people avatars with a +N overflow\n chip. Used to render a conversation's roster: one avatar for a 1:1 thread,\n several overlapping for a group. Each avatar wears a bg-colored ring so the\n overlap reads as separate chips.\n ========================================================================= */\n\nexport const avatarGroupStyles = tv({\n base: 'flex items-center',\n variants: {\n size: {\n sm: '-space-x-1.5',\n md: '-space-x-2',\n lg: '-space-x-2.5',\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type AvatarGroupVariants = VariantProps<typeof avatarGroupStyles>\n\n/** One person in the stack — initials plus an optional tone and photo. */\nexport interface AvatarGroupItem {\n initials: string\n tone?: AvatarVariants['tone']\n /** Photo URL; falls back to `initials` when absent or failing to load. */\n src?: string | null\n alt?: string\n /** Stable key (e.g. the participant's external id); falls back to the index. */\n key?: string\n}\n\nexport type AvatarGroupProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children'> &\n AvatarGroupVariants & {\n avatars: AvatarGroupItem[]\n /** Max avatars shown before the rest collapse into a +N chip. Default 3. */\n max?: number\n }\n\nexport function AvatarGroup({\n avatars,\n max = 3,\n size = 'md',\n className,\n ...props\n}: AvatarGroupProps) {\n const shown = avatars.slice(0, max)\n const overflow = avatars.length - shown.length\n return (\n <span {...props} className={cn(avatarGroupStyles({ size }), className)}>\n {shown.map((avatar, index) => (\n <span key={avatar.key ?? index} className=\"rounded-full ring-[1.5px] ring-surface\">\n <Avatar\n size={size}\n tone={avatar.tone ?? 'paper'}\n initials={avatar.initials}\n src={avatar.src ?? null}\n alt={avatar.alt ?? ''}\n />\n </span>\n ))}\n {overflow > 0 && (\n <span className=\"rounded-full ring-[1.5px] ring-surface\">\n <Avatar size={size} tone=\"paper\" initials={`+${overflow}`} />\n </span>\n )}\n </span>\n )\n}\n","import { tv, type VariantProps } from 'tailwind-variants'\n\n/* =========================================================================\n Shared field chrome — one source of truth for the hairline box that wraps\n Input, SelectTrigger, ComboboxInput, DatePicker, BadgeMultiSelect, etc.\n\n Two slots:\n - `box` — border + radius + bg + shadow + hover/focus/invalid/disabled.\n The \"field-ness\" of the control. No padding, no font, no\n text-size, so it can sit on either a single-element control\n OR an outer wrapper of a compound control without dictating\n internal spacing.\n - `content` — font + leading + placeholder color + padding + text-size.\n The \"interior\" of the field. Applied to the box itself for\n single-element controls (Input, Textarea, Select trigger),\n or to the inner editable element of compound controls\n (Combobox <input>, DatePicker <DateInput>) so the box can\n host a flex layout with siblings (chevron, calendar\n trigger) sharing the border + focus ring.\n\n `size` is the only knob that defines what \"compact\" vs \"comfortable\" means\n for any field-like control in the library. Change it here, every consumer\n shifts in lockstep.\n ========================================================================= */\n\nexport const fieldControlStyles = tv({\n slots: {\n box: [\n 'w-full rounded-md border bg-surface text-ink',\n 'outline-none shadow-[var(--shadow-inset)]',\n 'transition-[border-color,box-shadow] duration-150',\n 'hover:border-ink-4',\n 'focus:border-accent focus:shadow-[var(--shadow-focus)]',\n // RAC forwards data-focused/data-hovered/data-invalid on its components.\n // Keep both CSS :focus and RAC data-* states covered.\n 'data-[hovered]:border-ink-4',\n 'data-[focused]:border-accent data-[focused]:shadow-[var(--shadow-focus)]',\n 'data-[invalid]:border-danger data-[invalid]:shadow-[var(--shadow-focus-danger)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n ],\n content: 'font-sans leading-snug placeholder:text-ink-4',\n },\n variants: {\n size: {\n sm: { content: 'px-2.5 py-1.5 text-[13px]' },\n md: { content: 'px-3.5 py-2.5 text-[15px]' },\n },\n invalid: {\n true: { box: 'border-danger shadow-[var(--shadow-focus-danger)]' },\n false: { box: 'border-rule-strong' },\n },\n /* `cell` — flat, spreadsheet-style chrome for inline table editing\n (LUM-35). Squares the corners to 2px and removes BOTH the resting\n inset shadow and the focus/invalid halo, leaving just a border that\n turns accent on focus / danger on invalid. Declared after `invalid`\n so its `shadow-none` wins the tailwind-merge order over the invalid\n variant's danger halo; the compoundVariant below is belt-and-braces. */\n appearance: {\n field: {},\n cell: {\n // Fixed 29px editor: sits under the 32px table row so the cell's\n // items-center leaves a hairline gap top/bottom and the border reads\n // fully instead of merging with the row gridline. Explicit height is\n // more deterministic than relying on line-height + padding math.\n // `py-1` keeps the content box (≈19px) above the ~18px text line so\n // nothing clips. Both win over `size`'s values via tailwind-merge\n // order (appearance is declared after size).\n box: 'h-[29px] rounded-[4px] shadow-none focus:shadow-none data-[focused]:shadow-none data-[invalid]:shadow-none',\n content: 'py-1',\n },\n },\n /* `hasFocusRing: false` — keep the full field chrome but drop the\n focus/invalid ring, for tight hosts whose overflow clip would cut it\n off (e.g. the editor-header title). The border still turns accent on\n focus / danger on invalid. Declared after `appearance` so its\n shadow-none wins the tailwind-merge order. */\n hasFocusRing: {\n true: {},\n false: {\n box: 'focus:shadow-none data-[focused]:shadow-none data-[invalid]:shadow-none',\n },\n },\n },\n compoundVariants: [\n { appearance: 'cell', invalid: true, class: { box: 'shadow-none' } },\n // invalid:true's RESTING danger ring — reduce back to the inset shadow.\n { hasFocusRing: false, invalid: true, class: { box: 'shadow-[var(--shadow-inset)]' } },\n ],\n defaultVariants: { size: 'md', invalid: false, appearance: 'field', hasFocusRing: true },\n})\n\nexport type FieldControlVariants = VariantProps<typeof fieldControlStyles>\nexport type FieldSize = NonNullable<FieldControlVariants['size']>\nexport type FieldAppearance = NonNullable<FieldControlVariants['appearance']>\n\n/* =========================================================================\n Per-size lookups — for parts of compound controls that need *just* the\n text-size or a coherent min-height (e.g. BadgeMultiSelect/MultiSelect's\n chip wrapper, where the box has its own padding for the chip layout but\n the placeholder line + overall height should still scale with `size`).\n ========================================================================= */\n\nexport const fieldTextStyles: Record<FieldSize, string> = {\n sm: 'text-[13px]',\n md: 'text-[15px]',\n}\n\nexport const fieldMinHeight: Record<FieldSize, string> = {\n sm: 'min-h-[32px]',\n md: 'min-h-[42px]',\n}\n\n/* =========================================================================\n Padding for chip-wrapper field controls (BadgeMultiSelect, MultiSelect,\n TagInput) — these don't use `content`'s padding because the box hosts a\n flex layout of chips. The padding still has to scale with `size` so the\n total rendered height (wrapper-pad + chip-height) lines up with a\n single-element field at the same size.\n ========================================================================= */\n\nexport const fieldChipPadding: Record<FieldSize, string> = {\n sm: 'p-1',\n md: 'p-1.5',\n}\n\n/* =========================================================================\n Label / hint / error text styles — applied to RAC's Label / Text / FieldError\n components inside each form control. Strings rather than components so the\n existing monolithic APIs can keep their inline composition.\n ========================================================================= */\n\nexport const fieldLabelStyles = 'font-mono text-[11px] uppercase tracking-[0.08em] text-ink-4'\n\nexport const fieldHintStyles = 'font-mono text-[11px] text-ink-4'\n\nexport const fieldErrorStyles = 'font-mono text-[11px] text-danger'\n\n/* =========================================================================\n FieldCaret — the small down-chevron used in Select and Combobox triggers.\n Decorative; consumer elements carry their own aria semantics.\n ========================================================================= */\n\nexport function FieldCaret() {\n return (\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5 shrink-0 text-ink-3\" fill=\"none\">\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n","import type { LucideIcon } from 'lucide-react'\nimport { icons, Search, Shapes, X } from 'lucide-react'\nimport { type ReactNode, useMemo, useRef, useState } from 'react'\nimport { Input as AriaInput, Label, ListBox, ListBoxItem, Popover } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n IconPicker — a form field for choosing a Lucide icon by name.\n\n The value is the icon's canonical PascalCase export name (\"TrendingUp\"),\n which is what the platform stores wherever an icon rides config (menu\n items, connectors, knowledge spaces). The picker resolves loosely on the\n way IN — kebab-case and lowercase resolve too — but always emits the\n canonical name, so data written through it never needs the fallback path.\n\n Built from the org's own field primitives (same chrome as Select/Input)\n plus a RAC grid ListBox, so arrow keys move through the grid and\n selection/focus/ARIA come from RAC rather than hand-rolled handlers.\n\n The full set is ~1.5k icons; rendering every SVG into one popover is\n noticeably slow, so the grid caps what it draws and tells you it did —\n the search input is the intended way in, not scrolling.\n ========================================================================= */\n\n/** Canonical icon names — the keys of lucide's alias-free `icons` record. */\nexport type LucideIconName = keyof typeof icons\n\nconst ICON_NAMES = Object.keys(icons) as LucideIconName[]\n\n/** Lookup by squashed lowercase name, so \"trending-up\" / \"trendingup\" resolve. */\nconst BY_NORMALIZED = new Map<string, LucideIconName>(\n ICON_NAMES.map((name) => [normalize(name), name]),\n)\n\nfunction normalize(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]/g, '')\n}\n\n/**\n * Resolves a free-form icon name to its Lucide component, or null when it\n * matches nothing. Null (rather than a baked-in placeholder) so each caller\n * chooses its own fallback glyph.\n */\nexport function resolveLucideIcon(name: string | null | undefined): LucideIcon | null {\n const canonical = resolveLucideIconName(name)\n return canonical ? icons[canonical] : null\n}\n\n/** Same resolution, returning the canonical PascalCase name instead. */\nexport function resolveLucideIconName(name: string | null | undefined): LucideIconName | null {\n if (!name) return null\n return BY_NORMALIZED.get(normalize(name)) ?? null\n}\n\n/** Cells drawn per batch; scrolling near the bottom appends another batch. */\nconst GRID_PAGE = 120\n\nexport type IconPickerProps = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Trigger text while nothing is chosen. */\n placeholder?: string\n /** Canonical or loose Lucide icon name; null/'' mean \"no icon\". */\n value: string | null\n /** Fires with the canonical PascalCase name, or null when cleared. */\n onChange: (name: LucideIconName | null) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Offer a clear affordance once a value is set. Default true. */\n allowClear?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the trigger box. */\n appearance?: FieldAppearance\n /** Square, icon-only trigger (no name, no caret) for dense rows. The\n * popover is unchanged. Pair with `aria-label` when there's no `label`. */\n compact?: boolean\n /** Accessible name when no visible `label` is rendered. */\n 'aria-label'?: string\n className?: string\n}\n\n/** Compact trigger edge — matches the height of a single-line field at that size. */\nconst COMPACT_SIZE: Record<FieldSize, string> = {\n sm: 'size-8',\n md: 'size-[42px]',\n}\n\nexport function IconPicker({\n label,\n description,\n errorMessage,\n placeholder = 'Choose an icon…',\n value,\n onChange,\n isDisabled = false,\n isInvalid = false,\n allowClear = true,\n size = 'md',\n appearance,\n compact = false,\n 'aria-label': ariaLabel,\n className,\n}: IconPickerProps) {\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [limit, setLimit] = useState(GRID_PAGE)\n const triggerRef = useRef<HTMLButtonElement>(null)\n\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const selectedName = resolveLucideIconName(value)\n const SelectedIcon = selectedName ? icons[selectedName] : null\n\n const matches = useMemo(() => {\n const q = normalize(query)\n return q ? ICON_NAMES.filter((name) => normalize(name).includes(q)) : ICON_NAMES\n }, [query])\n const visible = matches.slice(0, limit)\n const hiddenCount = matches.length - visible.length\n\n const open = (next: boolean) => {\n setIsOpen(next)\n if (!next) {\n setQuery('')\n setLimit(GRID_PAGE)\n }\n }\n\n const search = (next: string) => {\n setQuery(next)\n // A new query is a new list; the old scroll depth means nothing for it.\n setLimit(GRID_PAGE)\n }\n\n const onGridScroll = (element: HTMLDivElement) => {\n if (hiddenCount === 0) return\n const remaining = element.scrollHeight - element.scrollTop - element.clientHeight\n if (remaining < 120) setLimit((current) => current + GRID_PAGE)\n }\n\n const pick = (name: LucideIconName | null) => {\n onChange(name)\n open(false)\n triggerRef.current?.focus()\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n {compact ? (\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : 'Icon')}\n title={selectedName ?? placeholder}\n disabled={isDisabled}\n onClick={() => open(!isOpen)}\n data-invalid={isInvalid || undefined}\n className={cn(\n styles.box(),\n 'flex shrink-0 items-center justify-center cursor-pointer',\n appearance === 'cell' ? 'size-[29px]' : COMPACT_SIZE[size],\n 'disabled:cursor-not-allowed disabled:opacity-45',\n )}\n >\n {SelectedIcon ? (\n <SelectedIcon aria-hidden className=\"size-4 text-ink-2\" />\n ) : (\n <Shapes aria-hidden className=\"size-4 text-ink-4\" />\n )}\n </button>\n ) : (\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={isOpen}\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : 'Icon')}\n disabled={isDisabled}\n onClick={() => open(!isOpen)}\n data-invalid={isInvalid || undefined}\n className={cn(\n // box carries no padding by contract — content is what gives a\n // single-element control its interior (padding, font, text-size).\n styles.box(),\n styles.content(),\n 'flex w-full items-center gap-2 text-left cursor-pointer',\n 'disabled:cursor-not-allowed disabled:opacity-45',\n )}\n >\n {SelectedIcon ? (\n <SelectedIcon aria-hidden className=\"size-4 shrink-0 text-ink-2\" />\n ) : null}\n <span className={cn('min-w-0 flex-1 truncate', selectedName ? 'text-ink' : 'text-ink-4')}>\n {selectedName ?? placeholder}\n </span>\n <FieldCaret />\n </button>\n )}\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n\n <Popover\n isOpen={isOpen}\n onOpenChange={open}\n triggerRef={triggerRef}\n offset={6}\n placement=\"bottom start\"\n className={cn(\n 'w-[316px] rounded-md border border-rule bg-surface p-2',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <div className=\"flex items-center gap-1.5 pb-2\">\n <div\n className={cn(\n fieldControlStyles({ size: 'sm' }).box(),\n 'flex min-w-0 flex-1 items-center gap-1.5 px-2.5 py-1.5',\n 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]',\n )}\n >\n <Search aria-hidden className=\"size-3.5 shrink-0 text-ink-4\" />\n {/* Bare RAC input rather than the Input field: this is popover\n furniture, not a form field — no label/description slots. */}\n <AriaInput\n autoFocus\n aria-label=\"Search icons\"\n value={query}\n onChange={(event) => search(event.target.value)}\n placeholder=\"Search icons…\"\n className={cn(\n 'min-w-0 flex-1 bg-transparent font-sans outline-none',\n 'text-ink placeholder:text-ink-4',\n fieldTextStyles.sm,\n )}\n />\n </div>\n {allowClear && selectedName ? (\n <button\n type=\"button\"\n onClick={() => pick(null)}\n className={cn(\n 'flex shrink-0 items-center gap-1 rounded-[6px] px-2 py-1.5 cursor-pointer',\n 'font-sans text-[12px] text-ink-3 transition-colors',\n 'hover:bg-surface-2 hover:text-ink',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]',\n )}\n >\n <X aria-hidden className=\"size-3\" />\n Clear\n </button>\n ) : null}\n </div>\n\n {/* The scroll container is a wrapper rather than the ListBox itself:\n the ListBox must keep its natural height so appended batches grow\n it and the scrollHeight arithmetic stays meaningful. */}\n <div\n className=\"max-h-64 overflow-y-auto\"\n onScroll={(event) => onGridScroll(event.currentTarget)}\n >\n <ListBox\n aria-label=\"Icons\"\n layout=\"grid\"\n selectionMode=\"single\"\n selectedKeys={selectedName ? new Set([selectedName]) : new Set()}\n onSelectionChange={(keys) => {\n if (keys === 'all') return\n const next = [...keys][0]\n // Re-picking the selected icon reports an empty set; keep the\n // value — clearing has its own button.\n if (next !== undefined) pick(next as LucideIconName)\n }}\n className=\"grid grid-cols-8 gap-0.5 outline-none\"\n renderEmptyState={() => (\n <div className={cn('col-span-8 px-2 py-3 text-center', fieldHintStyles)}>\n No icons match\n </div>\n )}\n >\n {visible.map((name) => {\n const Icon = icons[name]\n return (\n <ListBoxItem\n key={name}\n id={name}\n textValue={name}\n // The cell's only content is an aria-hidden svg, so the name\n // must be explicit — it is also what the picker's tests and\n // any consumer's tests select on.\n aria-label={name}\n className={cn(\n 'flex size-[34px] items-center justify-center rounded-[6px]',\n 'cursor-pointer outline-none',\n 'data-[hovered]:bg-surface-2 data-[focused]:bg-surface-2',\n 'data-[focus-visible]:ring-2 data-[focus-visible]:ring-[var(--color-accent)]',\n 'data-[selected]:bg-[color-mix(in_oklab,var(--color-accent)_12%,var(--color-surface))]',\n 'data-[selected]:text-accent text-ink-2',\n )}\n >\n <Icon aria-hidden className=\"size-4\" />\n </ListBoxItem>\n )\n })}\n </ListBox>\n </div>\n\n {hiddenCount > 0 ? (\n <p className={cn('px-1 pt-2', fieldHintStyles)}>\n {hiddenCount.toLocaleString()} more — keep scrolling, or search.\n </p>\n ) : null}\n </Popover>\n </div>\n )\n}\n","import type { CSSProperties, HTMLAttributes } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { resolveLucideIcon } from '../icon-picker/icon-picker'\n\n/* =========================================================================\n Badge — mono status chip. Matches the Proteos spec's six registers:\n default, neutral, active (indigo), success, warning, danger.\n Paper-compatible fills — never pure-color.\n\n Chrome knobs, orthogonal to the register:\n - `shape` — `pill` (default, status badges) or `rounded` (9px corners,\n the enum-value chip on record pages, tables, pickers and filters).\n - `hasDot` — the leading dot. Default on; enum chips turn it off so a\n value without an icon reads as plain text on tint.\n\n Two data-driven escape hatches for schema-defined values (enum options,\n labels): `color` — a #rrggbb tint that drives the dot, border and fill\n via color-mix while the text stays ink so any user-picked color keeps\n its contrast in light/dark/paper; and `icon` — a Lucide name that\n replaces the dot (whatever `hasDot` says).\n ========================================================================= */\n\nexport const badgeStyles = tv({\n base: [\n 'inline-flex items-center gap-1.5',\n 'font-mono text-[11.5px] tracking-[-0.005em]',\n 'px-2.5 py-0.5 border',\n ],\n variants: {\n variant: {\n default: 'border-rule bg-surface text-ink-3 before:bg-ink-4',\n neutral: 'border-rule bg-surface-3 text-ink-2 before:bg-ink-3',\n active: [\n 'text-accent-ink before:bg-accent',\n 'border-[color-mix(in_oklab,var(--color-accent)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-accent)_14%,var(--color-surface))]',\n ],\n success: [\n 'text-success before:bg-success',\n 'border-[color-mix(in_oklab,var(--color-success)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-success)_12%,var(--color-surface))]',\n ],\n warning: [\n 'text-warning before:bg-warning',\n 'border-[color-mix(in_oklab,var(--color-warning)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-warning)_14%,var(--color-surface))]',\n ],\n danger: [\n 'text-danger before:bg-danger',\n 'border-[color-mix(in_oklab,var(--color-danger)_40%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-danger)_12%,var(--color-surface))]',\n ],\n // Driven by the `--badge-color` custom property (set from the `color`\n // prop). Chrome only — text stays ink so contrast never depends on the\n // picked color.\n custom: [\n 'text-ink-2 before:bg-[var(--badge-color)]',\n 'border-[color-mix(in_oklab,var(--badge-color)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--badge-color)_12%,var(--color-surface))]',\n ],\n },\n shape: {\n pill: 'rounded-pill',\n rounded: 'rounded-chip',\n },\n // Leading dot — its color comes from the register's `before:bg-*`.\n hasDot: {\n true: 'before:content-[\"\"] before:block before:size-1.5 before:rounded-full',\n false: '',\n },\n },\n defaultVariants: { variant: 'default', shape: 'pill', hasDot: true },\n})\n\nexport type BadgeVariants = VariantProps<typeof badgeStyles>\nexport type BadgeProps = HTMLAttributes<HTMLSpanElement> &\n BadgeVariants & {\n /** `#rrggbb` tint. When set it overrides `variant` with the `custom` register. */\n color?: string\n /** Lucide icon name (any casing). Replaces the leading dot; unknown names keep the dot. */\n icon?: string\n }\n\n/** Icon tone per register — mirrors each variant's `before:bg-*` dot color. */\nconst ICON_TONE: Record<NonNullable<BadgeVariants['variant']>, string> = {\n default: 'text-ink-4',\n neutral: 'text-ink-3',\n active: 'text-accent',\n success: 'text-success',\n warning: 'text-warning',\n danger: 'text-danger',\n custom: 'text-[var(--badge-color)]',\n}\n\nexport function Badge({\n variant,\n shape,\n hasDot,\n color,\n icon,\n className,\n style,\n children,\n ...props\n}: BadgeProps) {\n const Icon = icon ? resolveLucideIcon(icon) : null\n const register: NonNullable<BadgeVariants['variant']> = color ? 'custom' : (variant ?? 'default')\n const mergedStyle = color ? ({ ...style, '--badge-color': color } as CSSProperties) : style\n // The register's `before:bg-*` classes alone materialize an empty ::before\n // (Tailwind injects `content` for every `before:` utility), which as a flex\n // child still eats one `gap`. Hide it whenever no dot should show.\n const showDot = hasDot !== false && !Icon\n return (\n <span\n {...props}\n style={mergedStyle}\n className={cn(\n badgeStyles({ variant: register, shape, hasDot }),\n showDot ? null : 'before:hidden',\n className,\n )}\n >\n {Icon ? <Icon aria-hidden className={cn('size-3 shrink-0', ICON_TONE[register])} /> : null}\n {children}\n </span>\n )\n}\n","import { type KeyboardEvent, type ReactNode, useEffect, useRef, useState } from 'react'\nimport { type Key, Label, ListBox, ListBoxItem, Popover } from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport { Badge, type BadgeVariants } from '../badge/badge'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldChipPadding,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldMinHeight,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n BadgeMultiSelect — a MultiSelect specialized for picking status-like\n values. Each option is a <Badge/> — both in the dropdown and as the\n selected pill. The × remove button lives INSIDE each selected badge\n (no extra chip chrome), so the color coding from the Badge variant is\n what you see, cleanly.\n ========================================================================= */\n\nexport type BadgeMultiSelectOption<T extends Key = Key> = {\n id: T\n /** Text shown inside the badge. Used as the accessible name too. */\n label: string\n /** Badge color register. Defaults to `default`. */\n variant?: BadgeVariants['variant']\n /** Badge corner shape. Defaults to `pill`; enum chips use `rounded`. */\n shape?: BadgeVariants['shape']\n /** Leading dot. Defaults to on; enum chips turn it off. */\n hasDot?: boolean\n /** `#rrggbb` tint — overrides `variant` (see Badge). */\n color?: string\n /** Lucide icon name; replaces the badge dot. */\n icon?: string\n isDisabled?: boolean\n}\n\ntype BadgeChrome = {\n variant?: BadgeVariants['variant'] | undefined\n shape?: BadgeVariants['shape'] | undefined\n hasDot?: boolean | undefined\n color?: string | undefined\n icon?: string | undefined\n}\n\n/** The Badge chrome props an option carries — spread onto every Badge it renders as. */\nfunction badgeChrome(option: BadgeChrome) {\n return {\n ...(option.variant ? { variant: option.variant } : {}),\n ...(option.shape ? { shape: option.shape } : {}),\n ...(option.hasDot !== undefined ? { hasDot: option.hasDot } : {}),\n ...(option.color ? { color: option.color } : {}),\n ...(option.icon ? { icon: option.icon } : {}),\n }\n}\n\nexport type BadgeMultiSelectProps<T extends Key = Key> = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<BadgeMultiSelectOption<T>>\n /** Controlled selection. Pass a `Set<T>` or any `Iterable<T>`. */\n selectedKeys: Iterable<T>\n onSelectionChange: (keys: Set<T>) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Hide already-selected options from the dropdown. Removal then only\n * happens via the chip × in the trigger. Default `false` (selected\n * options stay visible and can be toggled from the listbox). */\n hideSelectedOptions?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Focus the trigger on mount. Mirrors RAC's `autoFocus` prop on native\n * inputs; useful for keyboard chains where the trigger should take focus\n * when its surrounding context becomes ready. */\n autoFocus?: boolean\n className?: string\n}\n\nexport function BadgeMultiSelect<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Select…',\n options,\n selectedKeys,\n onSelectionChange,\n isDisabled = false,\n isInvalid = false,\n hideSelectedOptions = false,\n size = 'md',\n appearance,\n autoFocus = false,\n className,\n}: BadgeMultiSelectProps<T>) {\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n const minHeight = appearance === 'cell' ? 'min-h-[29px]' : fieldMinHeight[size]\n const [isOpen, setIsOpen] = useState(false)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (autoFocus) triggerRef.current?.focus()\n // mount-only — autoFocus is a one-shot signal, not sustained.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const selectedSet = new Set(selectedKeys)\n const selectedOptions = options.filter((o) => selectedSet.has(o.id))\n const listboxOptions = hideSelectedOptions\n ? options.filter((o) => !selectedSet.has(o.id))\n : options\n\n const remove = (id: T) => {\n const next = new Set(selectedSet)\n next.delete(id)\n onSelectionChange(next)\n }\n\n const onTriggerKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isDisabled) return\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n setIsOpen(true)\n }\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n ref={triggerRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled={isDisabled || undefined}\n aria-invalid={isInvalid || undefined}\n tabIndex={isDisabled ? -1 : 0}\n onClick={() => !isDisabled && setIsOpen((v) => !v)}\n onKeyDown={onTriggerKeyDown}\n data-invalid={isInvalid || undefined}\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex flex-wrap items-center gap-1.5 cursor-pointer',\n minHeight,\n fieldChipPadding[size],\n 'pr-2',\n focusWithin,\n )}\n >\n {selectedOptions.length === 0 ? (\n // No vertical padding — wrapper's p-1.5 + min-h-[size] govern the\n // overall height so it matches the Input/Select trigger at the same\n // size.\n <span className={cn('text-ink-4 font-sans px-1', fieldTextStyles[size])}>\n {placeholder}\n </span>\n ) : (\n selectedOptions.map((o) => (\n <RemovableBadge\n key={o.id}\n {...badgeChrome(o)}\n onRemove={() => remove(o.id)}\n isDisabled={isDisabled}\n >\n {o.label}\n </RemovableBadge>\n ))\n )}\n <span className=\"ml-auto pr-1\">\n <FieldCaret />\n </span>\n </div>\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n\n <Popover\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n triggerRef={triggerRef}\n offset={6}\n placement=\"bottom start\"\n className={cn(\n 'w-[var(--trigger-width)]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <ListBox\n aria-label={typeof label === 'string' ? label : 'Options'}\n selectionMode=\"multiple\"\n selectedKeys={selectedSet}\n onSelectionChange={(keys) => {\n if (keys === 'all') {\n onSelectionChange(new Set(options.map((o) => o.id)))\n return\n }\n onSelectionChange(keys as Set<T>)\n }}\n className=\"outline-none max-h-72 overflow-auto\"\n renderEmptyState={() => (\n <div className={cn('px-3 py-2', fieldHintStyles)}>All options selected</div>\n )}\n >\n {listboxOptions.map((option) => (\n <ListBoxItem\n key={option.id}\n id={option.id}\n textValue={option.label}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n className={cn(\n 'group flex items-center',\n 'rounded-[6px] px-3 py-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2',\n 'data-[focused]:bg-surface-2',\n 'data-[selected]:bg-surface-3',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <Badge {...badgeChrome(option)}>{option.label}</Badge>\n </ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </div>\n )\n}\n\n/* =========================================================================\n Internal: a Badge with a trailing × button baked into the pill.\n The × inherits the badge's text color via `currentColor`, so it reads\n correctly against every variant's fill.\n ========================================================================= */\n\nfunction RemovableBadge({\n children,\n onRemove,\n isDisabled,\n ...chrome\n}: BadgeChrome & {\n children: ReactNode\n onRemove: () => void\n isDisabled: boolean\n}) {\n return (\n <Badge {...badgeChrome(chrome)}>\n <span>{children}</span>\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={isDisabled}\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex items-center justify-center shrink-0',\n 'size-3.5 rounded-full',\n 'text-current/70 hover:text-current hover:bg-current/10',\n 'outline-none cursor-pointer',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed',\n // Pull the button flush with the right edge so the pill still feels\n // symmetric around the leading dot.\n '-mr-1',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </Badge>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Breadcrumb as AriaBreadcrumb,\n Breadcrumbs as AriaBreadcrumbs,\n type BreadcrumbsProps as AriaBreadcrumbsProps,\n Link as AriaLink,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Breadcrumbs — RAC Breadcrumbs/Breadcrumb under the hood. Last item is\n rendered as a non-link span with `aria-current=\"page\"`; everything before\n it is a RAC Link with hover + focus-visible chrome.\n ========================================================================= */\n\nexport type BreadcrumbItem = {\n /** Stable key for the row. */\n id: string | number\n /** Display label. */\n label: ReactNode\n /** Optional href. Omit (or leave the last item without one) to render the\n * current page as plain text. */\n href?: string\n}\n\nexport type BreadcrumbsProps = Omit<AriaBreadcrumbsProps<never>, 'children' | 'items'> & {\n items: ReadonlyArray<BreadcrumbItem>\n /** Glyph between crumbs. Default `/`. */\n separator?: ReactNode\n}\n\nexport function Breadcrumbs({ items, separator = '/', className, ...props }: BreadcrumbsProps) {\n return (\n <AriaBreadcrumbs\n {...props}\n className={cn(\n 'flex items-center gap-2',\n 'font-mono text-[12px] text-ink-3',\n // RAC renders Breadcrumbs as <ol> — neutralise list defaults.\n 'list-none m-0 p-0',\n className,\n )}\n >\n {items.map((item, i) => {\n const isLast = i === items.length - 1\n return (\n <AriaBreadcrumb\n key={item.id}\n className=\"flex items-center gap-2\"\n // The last crumb is the current page. Hides the trailing\n // separator and skips the link affordance.\n data-current={isLast || undefined}\n >\n {item.href !== undefined && !isLast ? (\n <AriaLink\n href={item.href}\n className={cn(\n 'rounded-sm outline-none cursor-pointer',\n 'transition-colors duration-150',\n 'hover:text-ink',\n 'data-[hovered]:text-ink',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n {item.label}\n </AriaLink>\n ) : (\n <span\n className={cn(isLast && 'text-ink font-semibold')}\n aria-current={isLast ? 'page' : undefined}\n >\n {item.label}\n </span>\n )}\n {!isLast ? (\n <span aria-hidden className=\"text-ink-4 select-none\">\n {separator}\n </span>\n ) : null}\n </AriaBreadcrumb>\n )\n })}\n </AriaBreadcrumbs>\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Card — chrome-only shell.\n Padding lives on the slot components (<CardHeader/>, <CardContent/>,\n <CardFooter/>), never on Card itself. Variants control cosmetics only —\n border tint, shadow depth — so slot composition and variant are orthogonal.\n ========================================================================= */\n\nexport const cardStyles = tv({\n base: [\n 'flex flex-col overflow-hidden',\n 'border border-rule bg-surface rounded-lg',\n 'shadow-[var(--shadow-rest)]',\n 'text-[14px] text-ink-2',\n ],\n variants: {\n variant: {\n default: '',\n accent: [\n 'text-accent-ink',\n 'border-[color-mix(in_oklab,var(--color-accent)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-accent)_6%,var(--color-surface))]',\n ],\n outline: 'shadow-none',\n raised: 'shadow-[var(--shadow-raised)]',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport type CardVariants = VariantProps<typeof cardStyles>\nexport type CardProps = HTMLAttributes<HTMLDivElement> & CardVariants\n\nexport function Card({ variant, className, ...props }: CardProps) {\n return <div {...props} className={cn(cardStyles({ variant }), className)} />\n}\n\n/* =========================================================================\n PressableCard — same chrome + variants, rendered as a keyboard-focusable\n RAC Button. Hover lifts the shadow, press sinks 1px, focus shows indigo ring.\n ========================================================================= */\n\nconst pressableCardStyles = tv({\n extend: cardStyles,\n base: [\n 'text-left w-full cursor-pointer outline-none',\n 'transition-[box-shadow,transform,border-color] duration-150',\n 'hover:shadow-[var(--shadow-raised)] hover:border-ink-4',\n 'pressed:translate-y-px',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed disabled:pointer-events-none',\n ],\n})\n\nexport type PressableCardProps = AriaButtonProps & CardVariants\n\nexport function PressableCard({ variant, className, ...props }: PressableCardProps) {\n return (\n <AriaButton\n {...props}\n className={(renderProps) =>\n cn(\n pressableCardStyles({ variant }),\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n\n/* =========================================================================\n Structural slots — each owns its padding. Drop-in composable.\n ========================================================================= */\n\n/**\n * Flush, full-bleed strip at the top of a Card.\n * Sand-tinted surface, uppercase mono, anchors a record identifier / status.\n * The strip bleeds to the card edges because the Card has no padding.\n */\nexport function CardHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n 'flex justify-between items-center',\n 'px-5 py-3 border-b border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n 'font-mono text-[11.5px] uppercase tracking-[0.06em] text-ink-4',\n className,\n )}\n />\n )\n}\n\n/**\n * Padded content block. This is where inline slots (CardEyebrow, CardTitle,\n * CardBody) must live — they do not carry their own padding. Repeatable for\n * multi-section layouts; separate sections with a `<hr class=\"border-rule\"/>`.\n */\nexport function CardContent({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div {...props} className={cn('flex flex-col gap-3 p-5', className)} />\n}\n\n/**\n * Footer anchored to the bottom of the card via `mt-auto`. Place a\n * `<Separator />` above it when you want the dashed divider.\n * Mono meta-sized text. Typically holds counts + a trailing arrow / action.\n */\nexport function CardFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n 'mt-auto flex justify-between items-center',\n 'px-5 py-4',\n 'font-mono text-[11.5px] text-ink-4',\n className,\n )}\n />\n )\n}\n\n/* =========================================================================\n Inline slots — no self-padding; must live inside CardContent / CardHeader.\n ========================================================================= */\n\nexport function CardEyebrow({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n 'flex justify-between items-center',\n 'font-mono text-[11px] uppercase tracking-[0.08em] text-ink-4',\n className,\n )}\n />\n )\n}\n\nexport function CardTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n {...props}\n className={cn(\n 'font-sans font-medium text-[20px] leading-[1.25] tracking-[-0.015em] text-ink',\n className,\n )}\n />\n )\n}\n\nexport function CardFeatureTitle({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h3\n {...props}\n className={cn(\n 'font-sans font-medium text-[26px] leading-[1.2] tracking-[-0.02em] text-ink',\n className,\n )}\n />\n )\n}\n\nexport function CardBody({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div {...props} className={cn('text-[14px] leading-[1.55] text-ink-3', className)} />\n}\n","import {\n AtSign,\n AudioLines,\n Camera,\n Hash,\n type LucideIcon,\n Linkedin,\n Mail,\n MessageCircle,\n MessagesSquare,\n Mic,\n Phone,\n Send,\n Video,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Channel glyphs — the one lucide lookup for a conversation channel, shared\n by every surface that shows where a message came from (hub sidebar,\n compose picker, draft-review card, custom components). Channels the\n platform gained but this map hasn't fall back to the generic conversation\n glyph rather than rendering nothing.\n\n Deliberately keyed by a loose `string`: `Message['channel']` widens over\n time and callers routinely hold a raw slug from the wire.\n ========================================================================= */\n\nconst CHANNEL_ICONS: Readonly<Record<string, LucideIcon>> = {\n slack: Hash,\n email: Mail,\n whatsapp: MessageCircle,\n linkedin: Linkedin,\n telegram: Send,\n instagram: Camera,\n messenger: MessagesSquare,\n x: AtSign,\n meeting: Mic,\n 'zoom-meeting': Video,\n 'google-meet': Video,\n 'teams-meeting': Video,\n 'webex-meeting': Video,\n adhoc: AudioLines,\n phone: Phone,\n}\n\n/** The channel's glyph component. Unknown channels get the generic one. */\nexport function channelIcon(channel: string): LucideIcon {\n return CHANNEL_ICONS[channel] ?? MessagesSquare\n}\n\nexport interface ChannelIconProps {\n channel: string\n className?: string\n /** Accessible name. Omitted (the default) renders the glyph aria-hidden —\n * correct whenever the channel is already named in adjacent text. */\n label?: string\n}\n\n/** Thin wrapper over {@link channelIcon} for the common inline case. */\nexport function ChannelIcon({ channel, className, label }: ChannelIconProps) {\n const Icon = channelIcon(channel)\n return label !== undefined ? (\n <Icon className={cn('size-4', className)} role=\"img\" aria-label={label} />\n ) : (\n <Icon className={cn('size-4', className)} aria-hidden />\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Checkbox as AriaCheckbox,\n type CheckboxProps as AriaCheckboxProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\nexport type CheckboxProps = Omit<AriaCheckboxProps, 'children'> & {\n children?: ReactNode\n}\n\nexport function Checkbox({ children, className, ...props }: CheckboxProps) {\n return (\n <AriaCheckbox\n {...props}\n className={(renderProps) =>\n cn(\n // `relative` so RAC's visually-hidden <input> — which is absolutely\n // positioned and is the element that actually receives focus — is\n // laid out against THIS checkbox. Without a positioned ancestor here\n // it resolves against a far-away container, ends up outside any\n // scroll clipping, and focusing it makes the browser scroll a\n // container the user cannot scroll back (the roles permission\n // matrix, where toggling a row threw the page off-screen).\n 'group relative inline-flex items-center gap-2.5 cursor-pointer',\n 'font-sans text-[14px] text-ink-2 select-none',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {(renderProps) => (\n <>\n <span\n aria-hidden\n className={cn(\n 'relative inline-flex items-center justify-center shrink-0',\n 'size-[18px] rounded-[4px] border bg-surface',\n 'border-ink-4',\n 'transition-[background-color,border-color,box-shadow] duration-150',\n // hovered\n 'group-data-[hovered]:border-ink',\n // checked / indeterminate — fill with ink\n 'group-data-[selected]:bg-ink group-data-[selected]:border-ink',\n 'group-data-[indeterminate]:bg-ink group-data-[indeterminate]:border-ink',\n // focus ring on the box\n 'group-data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n {renderProps.isIndeterminate ? (\n <span className=\"block h-px w-2.5 bg-surface\" />\n ) : (\n <svg\n viewBox=\"0 0 12 12\"\n className={cn(\n 'size-3 text-surface transition-opacity duration-150',\n renderProps.isSelected ? 'opacity-100' : 'opacity-0',\n )}\n aria-hidden\n >\n <path\n d=\"M2.5 6.25 5 8.75 9.5 3.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )}\n </span>\n {children}\n </>\n )}\n </AriaCheckbox>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n CheckboxGroup as AriaCheckboxGroup,\n type CheckboxGroupProps as AriaCheckboxGroupProps,\n FieldError,\n Label,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport { fieldErrorStyles, fieldHintStyles, fieldLabelStyles } from '../field/field'\n\n/* =========================================================================\n CheckboxGroup — multi-choice field, the checkbox counterpart to RadioGroup.\n Monolithic API to match it: label / description / errorMessage props on the\n group, `<Checkbox value=\"…\">` children. `value` is a string[] of selected\n values (controlled via value/onChange, or defaultValue).\n ========================================================================= */\n\nexport type CheckboxGroupProps = Omit<AriaCheckboxGroupProps, 'children'> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** `<Checkbox value=\"…\">` elements. Function-as-children is not supported at the group level. */\n children: ReactNode\n}\n\nexport function CheckboxGroup({\n label,\n description,\n errorMessage,\n children,\n className,\n ...props\n}: CheckboxGroupProps) {\n return (\n <AriaCheckboxGroup\n {...props}\n className={(renderProps) =>\n cn('grid gap-2', typeof className === 'function' ? className(renderProps) : className)\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <div className=\"grid gap-3\">{children}</div>\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage ? <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError> : null}\n </AriaCheckboxGroup>\n )\n}\n","import { Pipette } from 'lucide-react'\nimport { type ReactNode, useEffect, useRef, useState } from 'react'\nimport { Input as AriaInput, FieldError, Label, Text, TextField } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n ColorInput — a form field for a `#rrggbb` color.\n\n Text-first: the hex is what the platform stores (enum values, labels),\n so the field is a mono text input with a swatch in front of it. The\n swatch doubles as a trigger for the browser's native color picker, which\n is the \"good enough for now\" picker until a proper one lands — the API\n (value in, canonical hex out) won't change when it does.\n\n Commit discipline: `onChange` only ever fires with a canonical lowercase\n `#rrggbb` or `null` (cleared). While the draft is something else — half a\n hex, a named color — the field shows its invalid chrome and holds the\n last committed value, so consumers never see partial input. Shorthand\n (`#abc`) is accepted but only expanded on blur: typing `#ff0000` passes\n through `#ff0`, and committing that transiently would flash the wrong\n color at the consumer.\n ========================================================================= */\n\nconst HEX6 = /^#?([0-9a-f]{6})$/i\nconst HEX3 = /^#?([0-9a-f]{3})$/i\n\n/**\n * Normalizes free-form text to a canonical lowercase `#rrggbb`, or null when\n * it isn't a hex color. Accepts a missing `#` and 3-digit shorthand.\n */\nexport function normalizeHexColor(text: string | null | undefined): string | null {\n const raw = (text ?? '').trim()\n if (raw === '') return null\n const six = HEX6.exec(raw)\n if (six?.[1]) return `#${six[1].toLowerCase()}`\n const three = HEX3.exec(raw)\n if (three?.[1]) {\n const [r, g, b] = three[1].toLowerCase()\n return `#${r}${r}${g}${g}${b}${b}`\n }\n return null\n}\n\nexport type ColorInputProps = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Shown while empty. Defaults to a sample hex. */\n placeholder?: string\n /** Canonical or loose hex; null/'' mean \"no color\". */\n value: string | null\n /** Fires with the canonical lowercase `#rrggbb`, or null when cleared. */\n onChange: (hex: string | null) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Accessible name when no visible `label` is rendered. */\n 'aria-label'?: string\n className?: string\n}\n\nexport function ColorInput({\n label,\n description,\n errorMessage,\n placeholder = '#5b8def',\n value,\n onChange,\n isDisabled = false,\n isInvalid = false,\n size = 'md',\n appearance,\n 'aria-label': ariaLabel,\n className,\n}: ColorInputProps) {\n const committed = normalizeHexColor(value)\n const [draft, setDraft] = useState(committed ?? '')\n const nativeRef = useRef<HTMLInputElement>(null)\n\n // An outside change to `value` (reset, another picker) replaces the draft;\n // our own commits already match, so typing is never clobbered mid-word.\n useEffect(() => {\n setDraft((current) => (normalizeHexColor(current) === committed ? current : (committed ?? '')))\n }, [committed])\n\n const isDraftInvalid = draft.trim() !== '' && normalizeHexColor(draft) === null\n const invalid = isInvalid || isDraftInvalid\n const styles = fieldControlStyles({ size, invalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n\n const edit = (next: string) => {\n setDraft(next)\n if (next.trim() === '') {\n if (committed !== null) onChange(null)\n return\n }\n // Live commits need the full six digits; shorthand waits for blur.\n if (!HEX6.test(next.trim())) return\n const hex = normalizeHexColor(next)\n if (hex !== null && hex !== committed) onChange(hex)\n }\n\n const settle = () => {\n const hex = normalizeHexColor(draft)\n if (hex === null) return\n setDraft(hex)\n if (hex !== committed) onChange(hex)\n }\n\n const pick = (next: string) => {\n const hex = normalizeHexColor(next)\n if (hex === null) return\n setDraft(hex)\n if (hex !== committed) onChange(hex)\n }\n\n return (\n <TextField\n value={draft}\n onChange={edit}\n isDisabled={isDisabled}\n isInvalid={invalid}\n // Canonical formatting once the user leaves: \"ABC\" → \"#aabbcc\".\n onBlur={settle}\n {...(ariaLabel ? { 'aria-label': ariaLabel } : {})}\n className={cn('grid grid-cols-1 gap-1.5', className)}\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex items-center gap-2',\n size === 'sm' ? 'pl-2' : 'pl-2.5',\n focusWithin,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Pick color\"\n disabled={isDisabled}\n onClick={() => nativeRef.current?.click()}\n className={cn(\n 'relative flex shrink-0 items-center justify-center rounded-sm border border-rule',\n 'cursor-pointer outline-none',\n 'focus-visible:ring-2 focus-visible:ring-[var(--color-accent)]',\n 'disabled:cursor-not-allowed',\n size === 'sm' ? 'size-4' : 'size-5',\n committed ? null : 'text-ink-4',\n )}\n style={committed ? { backgroundColor: committed } : undefined}\n >\n {committed ? null : <Pipette aria-hidden className=\"size-2.5\" />}\n {/* The browser picker rides a hidden native input — clicking the\n swatch forwards to it. Not tabbable: the text input is the\n keyboard path. */}\n <input\n ref={nativeRef}\n type=\"color\"\n tabIndex={-1}\n aria-hidden\n disabled={isDisabled}\n value={committed ?? '#000000'}\n onChange={(event) => pick(event.target.value)}\n className=\"pointer-events-none absolute inset-0 size-full opacity-0\"\n />\n </button>\n <AriaInput\n placeholder={placeholder}\n spellCheck={false}\n autoComplete=\"off\"\n className={cn(\n styles.content(),\n 'min-w-0 flex-1 bg-transparent font-mono outline-none',\n 'pl-0',\n fieldTextStyles[size],\n )}\n />\n </div>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </TextField>\n )\n}\n","import { type ReactNode, useContext } from 'react'\nimport {\n ComboBox as AriaComboBox,\n type ComboBoxProps as AriaComboBoxProps,\n ComboBoxStateContext,\n Button as AriaComboButton,\n Input as AriaInput,\n FieldError,\n type Key,\n Label,\n ListBox,\n ListBoxItem,\n type ListBoxItemProps,\n Popover,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type ComboboxOption<T extends Key = Key> = {\n id: T\n label: string\n description?: ReactNode\n isDisabled?: boolean\n /**\n * Per-row action UI rendered at the trailing edge of the option. Hidden\n * by default; revealed when the row is hovered or keyboard-focused. The\n * slot intercepts `pointerdown` / `click` propagation so interactions\n * inside it don't trigger option selection — put a real `<button>` /\n * `<Link>` here and it Just Works.\n */\n trailing?: ReactNode\n}\n\nexport type ComboboxProps<T extends Key = Key> = Omit<\n AriaComboBoxProps<never>,\n 'children' | 'items' | 'defaultItems'\n> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<ComboboxOption<T>>\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Visual override for the trigger input wrapper only. */\n inputWrapperClassName?: string\n /** Visual override for the inner `<input>` (size, padding, font). */\n inputClassName?: string\n /** Empty-state message shown in the popover when no options match. */\n emptyMessage?: ReactNode\n}\n\nexport function Combobox<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Type to search…',\n options,\n size,\n appearance,\n inputWrapperClassName,\n inputClassName,\n emptyMessage = 'No matches',\n className,\n // Default to keeping the popover open on an empty filter so the\n // `emptyMessage` slot actually renders. Callers can opt out.\n allowsEmptyCollection = true,\n ...props\n}: ComboboxProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n // In cell mode the wrapper's own focus-within halo must go too — only the\n // accent border remains on focus.\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n return (\n <AriaComboBox\n {...props}\n allowsEmptyCollection={allowsEmptyCollection}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n className={cn(\n // Box chrome on the wrapper; the inner <input> carries the padding\n // + font so the chevron button sits inside the same border + ring.\n styles.box(),\n 'flex items-center gap-1 pr-2',\n focusWithin,\n inputWrapperClassName,\n )}\n >\n <AriaInput\n placeholder={placeholder}\n className={cn(\n 'flex-1 min-w-0 bg-transparent outline-none',\n styles.content(),\n inputClassName,\n )}\n />\n <AriaComboButton\n className={cn(\n 'shrink-0 flex items-center justify-center',\n 'size-7 rounded-pill',\n 'text-ink-3 hover:text-ink outline-none cursor-pointer',\n )}\n >\n <FieldCaret />\n </AriaComboButton>\n </div>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n 'min-w-[var(--trigger-width)]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <ListBox\n className=\"outline-none max-h-72 overflow-auto\"\n renderEmptyState={() => (\n <div className={cn('px-3 py-2', fieldHintStyles)}>{emptyMessage}</div>\n )}\n >\n {options.map((option) => (\n <ComboboxItem\n key={option.id}\n id={option.id}\n textValue={option.label}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n >\n <span className=\"truncate\">{option.label}</span>\n {option.description ? (\n <span className=\"ml-3 shrink-0 font-mono text-[11.5px] text-ink-4\">\n {option.description}\n </span>\n ) : null}\n {option.trailing ? <TrailingSlot>{option.trailing}</TrailingSlot> : null}\n </ComboboxItem>\n ))}\n </ListBox>\n </Popover>\n </AriaComboBox>\n )\n}\n\n/**\n * Wraps the per-option trailing UI so that:\n * - The full pointer→click sequence is intercepted (so RAC's listbox\n * press handling on the surrounding ListBoxItem can never claim it\n * and select the row).\n * - On click, after the consumer's own handler runs (bubble order:\n * inner element → this wrapper), the combobox popover closes.\n * The trailing action is by nature \"do something with this option\" —\n * e.g. open a peek panel — which always takes the user away from the\n * field, so leaving the popover open underneath would be a UX bug.\n */\nfunction TrailingSlot({ children }: { children: ReactNode }) {\n const state = useContext(ComboBoxStateContext)\n return (\n <span\n className={cn(\n 'ml-auto pl-2 shrink-0 inline-flex items-center',\n // Hidden by default; revealed when the row is hovered or\n // keyboard-focused. `group/combobox-item` is set on ComboboxItem.\n 'hidden',\n 'group-data-[hovered]/combobox-item:inline-flex',\n 'group-data-[focused]/combobox-item:inline-flex',\n 'focus-within:inline-flex',\n )}\n // Block the full press lifecycle: `pointerdown` prevents usePress\n // from arming on the option, the rest cover the test-env mousedown\n // path and any third-party handlers.\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n // Bubble order means the consumer's onClick already ran; now\n // close the popover so the trailing action's target UI (e.g. a\n // peek modal) isn't sitting on top of an open dropdown.\n state?.close()\n }}\n >\n {children}\n </span>\n )\n}\n\nfunction ComboboxItem(props: ListBoxItemProps) {\n return (\n <ListBoxItem\n {...props}\n className={cn(\n // `group/combobox-item` exposes hover/focus state to the trailing\n // slot so it can reveal itself only when the row is engaged.\n 'group/combobox-item',\n 'flex items-center justify-between gap-3',\n 'rounded-[6px] px-3 py-2 text-[14px] text-ink-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n />\n )\n}\n","/* Parse a textual combo like \"mod+k\" into a typed KeyCombo. v1 supports\n exactly `mod+<key>` where the modifier resolves to Cmd on macOS and Ctrl\n elsewhere. Aliases `cmd` and `meta` normalize to `mod`. Any other shape\n (`alt+s`, `mod+shift+k`, bare `s`) throws with a clear message so misuse\n is caught at registration time, not at the next key press. */\n\nexport type KeyCombo = {\n /** Normalized form for registry keying. Always `mod+<key>`. */\n raw: string\n /** Key part, lowercased. Letters use `event.code` (`KeyS`); others match `event.key`. */\n key: string\n /** True when `key` is a single A–Z letter — match against `event.code` so the\n * binding stays on the physical key regardless of keyboard layout. */\n isLetter: boolean\n}\n\nconst MOD_ALIASES: ReadonlySet<string> = new Set(['mod', 'cmd', 'meta'])\nconst FORBIDDEN_EXTRA_MODS: ReadonlySet<string> = new Set(['shift', 'alt', 'option'])\n\nexport function parseCombo(input: string): KeyCombo {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error('Invalid key combo: empty string. Expected \"mod+<key>\".')\n }\n const parts = trimmed.toLowerCase().split('+').map((p) => p.trim())\n if (parts.length !== 2) {\n throw new Error(\n `Invalid key combo: \"${input}\". Expected \"mod+<key>\" — exactly one modifier and one key. ` +\n `v1 does not support bare keys, multiple modifiers, or sequences.`,\n )\n }\n const [modPart, keyPart] = parts as [string, string]\n if (!MOD_ALIASES.has(modPart)) {\n throw new Error(\n `Invalid key combo: \"${input}\". Modifier must be \"mod\" (or alias \"cmd\"/\"meta\"); got \"${modPart}\".`,\n )\n }\n if (!keyPart) {\n throw new Error(`Invalid key combo: \"${input}\". Missing key after modifier.`)\n }\n if (FORBIDDEN_EXTRA_MODS.has(keyPart)) {\n throw new Error(\n `Invalid key combo: \"${input}\". Multi-modifier combos (mod+shift+…, mod+alt+…) are not supported in v1.`,\n )\n }\n const isLetter = /^[a-z]$/.test(keyPart)\n return { raw: `mod+${keyPart}`, key: keyPart, isLetter }\n}\n","/* Browser/OS combos we refuse to bind. Catching this at registration time\n gives a clear error instead of silently shipping a shortcut the browser\n intercepts. `mod+shift+t` is listed for documentation; it can't be expressed\n in v1 anyway (the parser rejects multi-modifier combos). */\n\nimport type { KeyCombo } from './parse-combo'\n\n/* `mod+n` is intentionally NOT in this list. Chrome/Safari/Firefox on macOS\n intercept it at the OS/browser level for \"new window\" so the page's\n handler can't fire in those environments — but we still allow registration\n so it works on platforms/configurations where the browser does deliver the\n event, and so the discovery hint can advertise it. */\n\nexport const PROTECTED_COMBOS: ReadonlySet<string> = new Set([\n 'mod+w',\n 'mod+t',\n 'mod+q',\n 'mod+r',\n 'mod+l',\n 'mod+1',\n 'mod+2',\n 'mod+3',\n 'mod+4',\n 'mod+5',\n 'mod+6',\n 'mod+7',\n 'mod+8',\n 'mod+9',\n])\n\nexport function assertNotProtected(combo: KeyCombo): void {\n if (PROTECTED_COMBOS.has(combo.raw)) {\n throw new Error(\n `Cannot bind \"${combo.raw}\" — it is a protected browser/OS shortcut. ` +\n `Pick a different key.`,\n )\n }\n}\n","/* Platform detection for the command system. Resolves once at module load\n so `mod` always means the same thing in a given session. */\n\nexport type Platform = 'mac' | 'other'\n\nlet cached: Platform | undefined\n\nexport function getPlatform(): Platform {\n if (cached !== undefined) return cached\n cached = detect()\n return cached\n}\n\nfunction detect(): Platform {\n if (typeof navigator === 'undefined') return 'other'\n const ua = (navigator as { userAgentData?: { platform?: string } }).userAgentData\n if (ua?.platform) {\n return /mac/i.test(ua.platform) ? 'mac' : 'other'\n }\n const legacy = (navigator as { platform?: string }).platform ?? ''\n return /mac/i.test(legacy) ? 'mac' : 'other'\n}\n\n// Test-only: reset or force the cached platform.\nexport function _setPlatformForTests(p: Platform | undefined): void {\n cached = p\n}\n","/* Event matcher + editable-target guard. Letter combos match the physical\n key via `event.code` so QWERTY position is preserved across layouts;\n non-letter combos match `event.key`. Shift and Alt state are intentionally\n ignored so `Cmd+S`, `Cmd+Shift+S`, and `Cmd+Alt+S` all fire `mod+s` —\n this is what makes the discovery-hold-then-press flow work without dual\n registration. */\n\nimport type { KeyCombo } from './parse-combo'\nimport { getPlatform } from './platform'\n\nexport function isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false\n const tag = target.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true\n if (target.isContentEditable) return true\n // jsdom doesn't always reflect contenteditable in isContentEditable; fall back\n // to the attribute so tests (and any quirky host) behave consistently.\n const attr = target.getAttribute('contenteditable')\n if (attr === '' || attr === 'true' || attr === 'plaintext-only') return true\n return false\n}\n\nexport function matches(event: KeyboardEvent, combo: KeyCombo): boolean {\n const platform = getPlatform()\n const modPressed = platform === 'mac' ? event.metaKey : event.ctrlKey\n if (!modPressed) return false\n if (combo.isLetter) {\n return event.code === `Key${combo.key.toUpperCase()}`\n }\n return event.key.toLowerCase() === combo.key.toLowerCase()\n}\n","/* Module-singleton registry. One window listener handles every command.\n Handlers for the same combo stack on push; the newest wins\n deterministically. preventDefault + stopImmediatePropagation on match so\n the page's own keydown listeners (and other registry entries) don't also\n fire.\n\n Editable targets are NOT skipped here — `mod+<key>` combos use a real\n modifier, so they can't be confused with text input the way bare keys\n can. Cmd+S in a form field should still save. (The `useEscapeKey` path\n keeps its editable-target skip because Escape is bare.) */\n\nimport { matches } from './match-event'\nimport type { KeyCombo } from './parse-combo'\n\ntype Handler = (event: KeyboardEvent) => void\ntype Entry = { combo: KeyCombo; handler: Handler }\n\nconst stacks = new Map<string, Entry[]>()\nlet listenerInstalled = false\n\nfunction onWindowKeyDown(event: KeyboardEvent): void {\n for (const entries of stacks.values()) {\n const top = entries[entries.length - 1]\n if (!top) continue\n if (matches(event, top.combo)) {\n event.preventDefault()\n event.stopImmediatePropagation()\n top.handler(event)\n return\n }\n }\n}\n\nfunction ensureListener(): void {\n if (listenerInstalled) return\n if (typeof window === 'undefined') return\n window.addEventListener('keydown', onWindowKeyDown, { capture: true })\n listenerInstalled = true\n}\n\nexport function register(combo: KeyCombo, handler: Handler): () => void {\n ensureListener()\n const list = stacks.get(combo.raw) ?? []\n const entry: Entry = { combo, handler }\n list.push(entry)\n stacks.set(combo.raw, list)\n return () => {\n const current = stacks.get(combo.raw)\n if (!current) return\n const idx = current.lastIndexOf(entry)\n if (idx >= 0) current.splice(idx, 1)\n if (current.length === 0) stacks.delete(combo.raw)\n }\n}\n\n// Test-only: clear the registry between cases.\nexport function _resetRegistry(): void {\n stacks.clear()\n}\n","/* Bind a `mod+<key>` command. The handler is wrapped in a ref so changing\n handler identity each render does not re-register; only `combo` and\n `enabled` are real dependencies. */\n\nimport { useEffect, useRef } from 'react'\n\nimport { parseCombo } from './parse-combo'\nimport { assertNotProtected } from './protected-combos'\nimport { register } from './registry'\n\nexport type UseCommandOptions = {\n /** Defaults to `true`. Set to `false` to temporarily disable without unmounting. */\n enabled?: boolean\n}\n\nexport function useCommand(\n combo: string,\n handler: (event: KeyboardEvent) => void,\n options?: UseCommandOptions,\n): void {\n const enabled = options?.enabled ?? true\n const handlerRef = useRef(handler)\n useEffect(() => {\n handlerRef.current = handler\n })\n useEffect(() => {\n if (!enabled) return undefined\n const parsed = parseCombo(combo)\n assertNotProtected(parsed)\n return register(parsed, (event) => handlerRef.current(event))\n }, [combo, enabled])\n}\n","/* Module-singleton store tracking the Cmd+Shift \"discovery hold\". One pair\n of window listeners regardless of how many <Command> wrappers subscribe.\n Subscribers re-render via useSyncExternalStore when the both-held flag\n flips. Resyncs from event modifier flags on every key event so it stays\n accurate even if the browser drops a modifier key event (focus changes,\n alt-tab, etc.). */\n\nimport { useSyncExternalStore } from 'react'\n\nimport { getPlatform } from './platform'\n\ntype Listener = () => void\n\nlet cmdHeld = false\nlet shiftHeld = false\nlet initialized = false\nconst listeners = new Set<Listener>()\n\nfunction getSnapshot(): boolean {\n return cmdHeld && shiftHeld\n}\n\nfunction getServerSnapshot(): boolean {\n return false\n}\n\nfunction emit(): void {\n for (const l of listeners) l()\n}\n\nfunction sync(cmdNow: boolean, shiftNow: boolean): void {\n if (cmdNow !== cmdHeld || shiftNow !== shiftHeld) {\n cmdHeld = cmdNow\n shiftHeld = shiftNow\n emit()\n }\n}\n\nfunction onKeyDown(e: KeyboardEvent): void {\n const platform = getPlatform()\n const cmdFlag = platform === 'mac' ? e.metaKey : e.ctrlKey\n // For the modifier key itself, trust the event type (the flag lags on press).\n if (e.key === 'Meta' || e.key === 'Control') {\n sync(true, e.shiftKey)\n return\n }\n if (e.key === 'Shift') {\n sync(cmdFlag, true)\n return\n }\n sync(cmdFlag, e.shiftKey)\n}\n\nfunction onKeyUp(e: KeyboardEvent): void {\n const platform = getPlatform()\n const cmdFlag = platform === 'mac' ? e.metaKey : e.ctrlKey\n if (e.key === 'Meta' || e.key === 'Control') {\n sync(false, e.shiftKey)\n return\n }\n if (e.key === 'Shift') {\n sync(cmdFlag, false)\n return\n }\n sync(cmdFlag, e.shiftKey)\n}\n\nfunction onBlur(): void {\n // The window lost focus — assume the user released everything. Without\n // this, holding Cmd+Shift then alt-tabbing would leave us stuck in\n // discovery mode until the next keydown.\n sync(false, false)\n}\n\nfunction ensureInitialized(): void {\n if (initialized) return\n if (typeof window === 'undefined') return\n window.addEventListener('keydown', onKeyDown, { capture: true })\n window.addEventListener('keyup', onKeyUp, { capture: true })\n window.addEventListener('blur', onBlur)\n initialized = true\n}\n\nfunction subscribe(listener: Listener): () => void {\n ensureInitialized()\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport function useDiscoveryActive(): boolean {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n\n// Test-only: number of installed listeners is the number of subscribers.\n// The window-level listeners are installed at most once (initialized flag).\nexport function _getDiscoverySubscriberCount(): number {\n return listeners.size\n}\n\nexport function _resetDiscovery(): void {\n cmdHeld = false\n shiftHeld = false\n listeners.clear()\n}\n\nexport function _isDiscoveryInitialized(): boolean {\n return initialized\n}\n","import type { HTMLAttributes } from 'react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Kbd — small mono key-cap. Renders a real <kbd> element so screen readers\n announce it as keyboard input. Pure cosmetics; no behavior.\n ========================================================================= */\n\nexport type KbdProps = HTMLAttributes<HTMLElement>\n\nexport function Kbd({ className, children, ...props }: KbdProps) {\n return (\n <kbd\n {...props}\n className={cn(\n 'inline-flex items-center justify-center',\n 'font-mono text-[10.5px] leading-none text-ink-4',\n 'bg-surface-2 border border-rule rounded-[4px]',\n 'px-1.5 py-1',\n className,\n )}\n >\n {children}\n </kbd>\n )\n}\n","import { cn } from '../../lib/cn'\nimport { parseCombo } from '../../lib/commands/parse-combo'\nimport { getPlatform } from '../../lib/commands/platform'\nimport { Kbd } from '../kbd'\n\n/* =========================================================================\n CommandHint — visual representation of a `mod+<key>` combo. Renders a\n single `<Kbd>` so it slots in where the cosmetic `<Kbd>⌘K</Kbd>` lived\n before. On macOS the modifier is shown as `⌘` glued directly to the key\n (`⌘K`); on other platforms it reads `Ctrl+K`. Pure presentation — no\n binding, no listeners.\n\n `tone=\"prominent\"` flips the cap to a high-contrast surface for use on\n the discovery overlay where it needs to stand out against the backdrop.\n ========================================================================= */\n\nexport type CommandHintTone = 'subtle' | 'prominent'\n\nexport type CommandHintProps = {\n combo: string\n tone?: CommandHintTone\n className?: string\n}\n\nexport function CommandHint({ combo, tone = 'subtle', className }: CommandHintProps) {\n const parsed = parseCombo(combo)\n const platform = getPlatform()\n const modSymbol = platform === 'mac' ? '⌘' : 'Ctrl'\n const keyLabel = parsed.isLetter ? parsed.key.toUpperCase() : prettifyKey(parsed.key)\n const label = platform === 'mac' ? `${modSymbol}${keyLabel}` : `${modSymbol}+${keyLabel}`\n return (\n <Kbd\n className={cn(\n tone === 'prominent' && 'bg-ink text-surface border-transparent',\n className,\n )}\n >\n {label}\n </Kbd>\n )\n}\n\nfunction prettifyKey(key: string): string {\n if (key.length === 0) return key\n return key[0]!.toUpperCase() + key.slice(1)\n}\n","'use client'\n\nimport { type ReactNode, useRef } from 'react'\n\nimport { cn } from '../../lib/cn'\nimport { useCommand } from '../../lib/commands/use-command'\nimport { useDiscoveryActive } from '../../lib/commands/discovery-store'\n\nimport { CommandHint } from './command-hint'\n\n/* =========================================================================\n Command — discovery-aware wrapper around an interactive element. Binds\n `combo` to a synthetic click on the wrapped child (RAC `Button`'s\n `onPress` listens for native click events, so this fires the user's\n handler), and reveals a hint chip while Cmd+Shift is held so users can\n learn the bound shortcut.\n\n <Command combo=\"mod+s\">\n <Button onPress={onSave}>Save</Button>\n </Command>\n\n When the trigger isn't the immediate child (e.g. wrapped in a `<span>`\n for popover anchoring, or buried inside a list), pass `target` — a CSS\n selector resolved against the wrapper. The first matching descendant\n receives the synthetic click.\n\n <Command combo=\"mod+f\" target=\"[data-filter-trigger]\">\n <RecordFilterButton … />\n <RecordFilterChips … />\n </Command>\n\n `className` overrides the wrapper layout (default `inline-block`) for\n call sites where the wrapper needs to participate in a flex/grid layout.\n The wrapper stays `relative` either way so the discovery overlay can\n absolute-position against it.\n ========================================================================= */\n\nexport type CommandProps = {\n combo: string\n /** CSS selector for the click target. Defaults to the wrapper's first\n * element child — fine when that child IS the interactive control. */\n target?: string\n /** Layout overrides for the wrapper. `relative` is always applied. */\n className?: string\n children: ReactNode\n}\n\nexport function Command({ combo, target, className, children }: CommandProps) {\n const wrapperRef = useRef<HTMLDivElement>(null)\n const discoveryActive = useDiscoveryActive()\n\n useCommand(combo, () => {\n const root = wrapperRef.current\n if (!root) return\n const el = target\n ? root.querySelector<HTMLElement>(target)\n : (root.firstElementChild as HTMLElement | null)\n el?.click()\n })\n\n return (\n <div ref={wrapperRef} className={cn('relative inline-block', className)}>\n {children}\n {discoveryActive ? (\n <div\n aria-hidden\n className=\"absolute -inset-2 rounded-md bg-[color-mix(in_oklab,var(--color-ink)_28%,transparent)] pointer-events-none transition-opacity z-40\"\n >\n <span className=\"absolute -top-2.5 -left-2 pointer-events-none z-50\">\n <CommandHint combo={combo} tone=\"prominent\" />\n </span>\n </div>\n ) : null}\n </div>\n )\n}\n","/* Bare-Escape handler. Doesn't go through the `mod+<key>` registry because\n Escape has no modifier. Same editable-target guard. Multiple subscribers\n stack — only the newest fires per event, matching the \"newest wins\"\n semantics of the command registry so nested overlays (peek over a\n record stack, say) close one layer at a time. */\n\nimport { useEffect, useRef } from 'react'\n\nimport { isEditableTarget } from './match-event'\n\nexport type UseEscapeKeyOptions = {\n /** Defaults to `true`. Set to `false` to temporarily disable without unmounting. */\n enabled?: boolean\n}\n\ntype Entry = { handler: (event: KeyboardEvent) => void }\n\nconst stack: Entry[] = []\nlet listenerInstalled = false\n\nfunction onWindowKeyDown(event: KeyboardEvent): void {\n if (event.key !== 'Escape') return\n if (isEditableTarget(event.target)) return\n const top = stack[stack.length - 1]\n if (!top) return\n top.handler(event)\n}\n\nfunction ensureListener(): void {\n if (listenerInstalled) return\n if (typeof window === 'undefined') return\n window.addEventListener('keydown', onWindowKeyDown, { capture: true })\n listenerInstalled = true\n}\n\nexport function useEscapeKey(\n handler: (event: KeyboardEvent) => void,\n options?: UseEscapeKeyOptions,\n): void {\n const enabled = options?.enabled ?? true\n const handlerRef = useRef(handler)\n useEffect(() => {\n handlerRef.current = handler\n })\n useEffect(() => {\n if (!enabled) return undefined\n ensureListener()\n const entry: Entry = {\n handler: (event) => handlerRef.current(event),\n }\n stack.push(entry)\n return () => {\n const idx = stack.lastIndexOf(entry)\n if (idx >= 0) stack.splice(idx, 1)\n }\n }, [enabled])\n}\n\n// Test-only.\nexport function _resetEscapeStack(): void {\n stack.length = 0\n}\n","import { Phone } from 'lucide-react'\nimport type { ReactNode } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport type { ConversationBriefOutcome } from './types'\n\n/* =========================================================================\n ConversationBriefCard — the compact entry point to a prepared call: phone glyph,\n eyebrow, the contact's name, the brief's type / opening line, and one\n action (\"Open Brief\"). Pure chrome — it neither fetches nor dials, so it can\n sit in a chat flow, a record page, a task list or a custom component alike.\n ConversationBriefReview is the connected wrapper; reach for this one only when the\n host already holds the brief.\n\n Once the brief is used or discarded the action is replaced by a status\n label rather than removed — the row keeps its shape and its record.\n ========================================================================= */\n\nexport const conversationBriefCardStyles = tv({\n slots: {\n root: [\n 'flex items-center gap-2.5 rounded-md border border-accent/40 px-3 py-2',\n 'bg-[color-mix(in_oklab,var(--color-accent)_6%,var(--color-surface))]',\n ],\n icon: [\n 'grid size-8 shrink-0 place-items-center rounded-full text-accent',\n 'bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n ],\n body: 'min-w-0 flex-1',\n eyebrow: 'font-mono text-[10px] uppercase tracking-[0.08em] text-accent',\n title: 'truncate text-[13px] font-medium text-ink',\n summary: 'truncate text-[12px] text-ink-3',\n action: [\n 'shrink-0 cursor-pointer rounded-sm border border-accent/50 px-2.5 py-1',\n 'font-mono text-[11px] text-accent outline-none',\n 'hover:bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:cursor-default disabled:opacity-50',\n ],\n outcome: 'shrink-0 font-mono text-[11px] text-ink-3',\n },\n})\n\nconst styles = conversationBriefCardStyles()\n\nexport const CONVERSATION_BRIEF_OUTCOME_LABEL: Record<ConversationBriefOutcome, string> = {\n used: 'Call held',\n discarded: 'Discarded',\n}\n\nexport interface ConversationBriefCardProps {\n /** Headline: the brief's subject, else the contact's name. */\n title: string\n /** Second line: the contact, channel, type and/or the opening line. */\n summary?: string\n /** Default 'Conversation brief — prepared'. */\n eyebrow?: ReactNode\n /** Default 'Open Brief'. */\n openLabel?: string\n /** Terminal outcome. Set ⇒ the action is replaced by its status label. */\n outcome?: ConversationBriefOutcome | null\n onOpen?: () => void\n isOpenDisabled?: boolean\n className?: string\n}\n\nexport function ConversationBriefCard({\n title,\n summary,\n eyebrow = 'Conversation brief — prepared',\n openLabel = 'Open Brief',\n outcome,\n onOpen,\n isOpenDisabled = false,\n className,\n}: ConversationBriefCardProps) {\n return (\n <div className={cn(styles.root(), className)}>\n <span className={styles.icon()}>\n <Phone className=\"size-4\" aria-hidden />\n </span>\n <div className={styles.body()}>\n <p className={styles.eyebrow()}>{eyebrow}</p>\n <p className={styles.title()}>{title}</p>\n {summary ? <p className={styles.summary()}>{summary}</p> : null}\n </div>\n {outcome ? (\n <span className={styles.outcome()}>{CONVERSATION_BRIEF_OUTCOME_LABEL[outcome]}</span>\n ) : (\n <AriaButton\n onPress={onOpen ?? (() => {})}\n isDisabled={isOpenDisabled}\n className={styles.action()}\n >\n {openLabel}\n </AriaButton>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Select as AriaSelect,\n Button as AriaSelectButton,\n type SelectProps as AriaSelectProps,\n FieldError,\n type Key,\n Label,\n ListBox,\n ListBoxItem,\n type ListBoxItemProps,\n Popover,\n SelectValue,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type SelectOption<T extends Key = Key> = {\n id: T\n label: ReactNode\n /** Plain-text stand-in for typeahead/accessibility when `label` is a\n * ReactNode. Optional for string labels (RAC derives the text itself). */\n textValue?: string\n description?: ReactNode\n isDisabled?: boolean\n}\n\nexport type SelectProps<T extends Key = Key> = Omit<AriaSelectProps<never>, 'children'> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<SelectOption<T>>\n /** Optional custom renderer for a ListBoxItem. */\n renderItem?: (option: SelectOption<T>) => ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the trigger box. */\n appearance?: FieldAppearance\n /** Visual override for the trigger only. */\n triggerClassName?: string\n /** Visual override for the popover — e.g. `min-w-[var(--trigger-width)]\n * w-max` to size to content when the trigger is intrinsic-width. Defaults\n * to matching the trigger width exactly. */\n popoverClassName?: string\n}\n\nexport function Select<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Select…',\n options,\n renderItem,\n size,\n appearance,\n triggerClassName,\n popoverClassName,\n className,\n ...props\n}: SelectProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n return (\n <AriaSelect\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <AriaSelectButton\n className={cn(\n styles.box(),\n styles.content(),\n 'flex items-center justify-between gap-3 text-left cursor-pointer',\n triggerClassName,\n )}\n >\n <SelectValue className=\"truncate\">\n {({ defaultChildren, isPlaceholder }) =>\n isPlaceholder ? <span className=\"text-ink-4\">{placeholder}</span> : defaultChildren\n }\n </SelectValue>\n <FieldCaret />\n </AriaSelectButton>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n // Match the trigger width exactly (RAC exposes --trigger-width on\n // the Popover when anchored to a Select button).\n 'w-[var(--trigger-width)]',\n // Float above modals + full-screen editors (e.g. agent-studio's\n // .as-editor z-1000 / a raised modal overlay), matching Menu's z-[1200].\n 'z-[1300]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n popoverClassName,\n )}\n >\n <ListBox className=\"outline-none max-h-72 overflow-auto\">\n {options.map((option) => (\n <SelectItem\n key={option.id}\n id={option.id}\n {...(option.textValue ? { textValue: option.textValue } : {})}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n >\n {renderItem ? renderItem(option) : option.label}\n </SelectItem>\n ))}\n </ListBox>\n {options.length === 0 ? (\n <div className={cn('px-3 py-2', fieldHintStyles)}>{placeholder}</div>\n ) : null}\n </Popover>\n </AriaSelect>\n )\n}\n\nfunction SelectItem(props: ListBoxItemProps) {\n return (\n <ListBoxItem\n {...props}\n className={cn(\n 'flex items-center justify-between gap-3',\n 'rounded-[6px] px-3 py-2 text-[14px] text-ink-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n />\n )\n}\n","import type { Contact, ConversationBrief } from '@proteos/sdk'\n\n/* =========================================================================\n ConversationBriefReview contracts — types-only @proteos/sdk imports, so the lib\n stays fetch-agnostic (the DraftMessageComposer precedent): the host injects\n the client, the component never talks to the network itself.\n ========================================================================= */\n\n/**\n * The minimal fetch surface the conversation-brief surfaces need, injected per host:\n * the web app builds it from `useSdk().conversation`, custom components from\n * `useSdk().conversations` — both via {@link createConversationBriefClient}.\n */\nexport interface ConversationBriefClient {\n /** One brief — also resolves terminal states (used / discarded) by id. */\n getConversationBrief(conversationBriefId: string): Promise<ConversationBrief>\n /** One of the brief's contacts: name + addresses (the phone numbers to dial). */\n getContact(contactId: string): Promise<Contact>\n}\n\n/** A brief's terminal state — what the card shows once it can no longer be\n * opened for a call. */\nexport type ConversationBriefOutcome = 'used' | 'discarded'\n\n/** The terminal outcome for a brief status, or null while it is open. */\nexport function conversationBriefOutcomeFor(\n status: ConversationBrief['status'],\n): ConversationBriefOutcome | null {\n if (status === 'used' || status === 'discarded') return status\n return null\n}\n\n/** Whether a brief can be turned into a phone call from the platform: pinned\n * to the phone channel, or not pinned at all (any channel). */\nexport function isDialableConversationBrief(brief: Pick<ConversationBrief, 'channel'>): boolean {\n return !brief.channel || brief.channel === 'phone'\n}\n\n/** The dialable numbers of a contact: its phone addresses, canonical (E.164)\n * value first-served, deduplicated. */\nexport function contactPhoneNumbers(\n contact: Pick<Contact, 'addresses'> | null | undefined,\n): string[] {\n const numbers: string[] = []\n for (const address of contact?.addresses ?? []) {\n if (address.kind !== 'phone' || !address.value) continue\n if (!numbers.includes(address.value)) numbers.push(address.value)\n }\n return numbers\n}\n","import type { Contact, ConversationBrief } from '@proteos/sdk'\nimport { Pencil, Phone } from 'lucide-react'\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button'\nimport { Select } from '../select'\nimport { contactPhoneNumbers } from './types'\n\n/* =========================================================================\n ConversationBriefPreview — the brief read in full before (and during) a call: the\n contact, the guidance text, and — when the host can dial — the number to\n call and the Call button. Fetch-agnostic and dial-agnostic: the host hands\n in the loaded brief + contact and, optionally, `onCall`; without `onCall`\n it is a read-only preview (a custom component's own modal, the hub's call\n panel). The host may slot extra controls (a caller-id picker) via\n `controls`.\n\n The guidance text is markdown-canonical but the lib carries no markdown\n renderer: hosts inject one via `renderContent` (the web app passes its\n MarkdownContent); without it the text shows as plain pre-wrapped lines.\n Editing follows the same seam — `onEdit` reveals a pencil on hover over\n the guidance box, and `editor` lets the host swap the box for its own\n editing surface while a draft is open.\n ========================================================================= */\n\nexport interface ConversationBriefPreviewProps {\n brief: ConversationBrief\n /** The brief's contacts (the resolved subset — a failed lookup is simply\n * absent). Names head the preview; phone addresses are the dial\n * candidates. */\n contacts: Contact[]\n /** Renders the contact/number pickers + Call button. Absent ⇒ read-only\n * preview. Receives the chosen contact and number. */\n onCall?: (contact: Contact, phoneNumber: string) => void\n /** Disables the Call button (softphone busy, another call running…). */\n isCallDisabled?: boolean\n /** Explains why calling is disabled (shown under the controls). */\n callDisabledReason?: string\n /** Host-slotted controls rendered next to the number picker (caller id). */\n controls?: ReactNode\n /** Hide the built-in Call button — for hosts that render the action in\n * their own footer; pair with `onSelectionChange` to know what to dial. */\n isCallButtonHidden?: boolean\n /** Fires whenever the chosen contact / number changes (and once on mount),\n * so a host rendering its own Call button knows the current target.\n * `phoneNumber` is '' when the chosen contact has no number. */\n onSelectionChange?: (contact: Contact | null, phoneNumber: string) => void\n /** Default 'Call'. */\n callLabel?: string\n className?: string\n /** Visual override for the guidance text box (e.g. a max height). */\n contentClassName?: string\n /** Renders the guidance text (markdown). Absent ⇒ plain pre-wrapped text. */\n renderContent?: (content: string) => ReactNode\n /** Shows an Edit button on hover over the guidance box. */\n onEdit?: () => void\n /** Replaces the guidance box wholesale — the host's editing surface. */\n editor?: ReactNode\n}\n\nexport function ConversationBriefPreview({\n brief,\n contacts,\n onCall,\n isCallDisabled = false,\n callDisabledReason,\n controls,\n isCallButtonHidden = false,\n onSelectionChange,\n callLabel = 'Call',\n className,\n contentClassName,\n renderContent,\n onEdit,\n editor,\n}: ConversationBriefPreviewProps) {\n const [pickedContactId, setPickedContactId] = useState('')\n const contact = contacts.find((entry) => entry.id === pickedContactId) ?? contacts[0] ?? null\n const numbers = useMemo(() => contactPhoneNumbers(contact), [contact])\n const [pickedNumber, setPickedNumber] = useState('')\n const phoneNumber = numbers.includes(pickedNumber) ? pickedNumber : numbers[0] || ''\n const isOpen = brief.status === 'prepared'\n const names = contacts\n .map((entry) => entry.name)\n .filter(Boolean)\n .join(', ')\n\n // Latest-closure ref: the host's callback is routinely a fresh arrow, and\n // the effect must fire on TARGET changes only.\n const onSelectionChangeRef = useRef(onSelectionChange)\n onSelectionChangeRef.current = onSelectionChange\n useEffect(() => {\n onSelectionChangeRef.current?.(contact, phoneNumber)\n }, [contact, phoneNumber])\n\n return (\n <div className={cn('flex flex-col gap-3', className)}>\n <div className=\"min-w-0\">\n <p className=\"truncate text-[14px] font-semibold text-ink\">\n {brief.subject || names || 'Prepared conversation'}\n </p>\n <p className=\"font-mono text-[10.5px] text-ink-4\">\n {[\n brief.subject ? names : '',\n brief.channel ? `Channel ${brief.channel}` : 'Any channel',\n brief.type_key ? `Type ${brief.type_key}` : '',\n brief.status === 'prepared'\n ? 'Prepared'\n : brief.status === 'used'\n ? 'Call held'\n : 'Discarded',\n ]\n .filter(Boolean)\n .join(' · ')}\n </p>\n </div>\n {editor ?? (\n <div className=\"group/brief-content relative\">\n <div\n className={cn(\n 'rounded-md border border-rule-2 bg-surface-2/60 px-3 py-2.5',\n 'text-[13px] leading-relaxed text-ink-2 overflow-y-auto [scrollbar-width:thin]',\n renderContent ? null : 'whitespace-pre-wrap',\n contentClassName,\n )}\n >\n {renderContent ? renderContent(brief.content) : brief.content}\n </div>\n {onEdit ? (\n <AriaButton\n aria-label=\"Edit brief\"\n onPress={onEdit}\n className={cn(\n 'absolute right-1.5 top-1.5 inline-flex size-7 cursor-pointer items-center justify-center',\n 'rounded-md bg-surface/80 text-ink-3 outline-none transition-opacity',\n 'opacity-0 group-hover/brief-content:opacity-100 focus-visible:opacity-100',\n 'data-[hovered]:bg-surface-3 data-[hovered]:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <Pencil className=\"size-3.5\" aria-hidden />\n </AriaButton>\n ) : null}\n </div>\n )}\n {onCall ? (\n <div className=\"flex flex-col gap-2 border-t border-rule-2 pt-3\">\n {contacts.length > 1 ? (\n <Select\n aria-label=\"Who to call\"\n selectedKey={contact?.id ?? ''}\n onSelectionChange={(key) => {\n setPickedContactId(String(key))\n setPickedNumber('')\n }}\n options={contacts.map((entry) => ({ id: entry.id, label: entry.name || entry.id }))}\n />\n ) : null}\n {numbers.length > 1 ? (\n <Select\n aria-label=\"Number to call\"\n selectedKey={phoneNumber}\n onSelectionChange={(key) => setPickedNumber(String(key))}\n options={numbers.map((number) => ({ id: number, label: number }))}\n />\n ) : (\n <p className=\"font-mono text-[12px] text-ink-3\">\n {phoneNumber ||\n (contact ? 'This contact has no phone number on file.' : 'No contact to call.')}\n </p>\n )}\n {controls}\n {callDisabledReason ? (\n <p className=\"text-[12px] text-warning\">{callDisabledReason}</p>\n ) : null}\n {isCallButtonHidden ? null : (\n <div className=\"flex justify-end\">\n <Button\n isDisabled={isCallDisabled || !isOpen || phoneNumber === '' || !contact}\n onPress={() => contact && onCall(contact, phoneNumber)}\n >\n <Phone className=\"size-3.5\" aria-hidden />\n {callLabel}\n </Button>\n </div>\n )}\n </div>\n ) : null}\n </div>\n )\n}\n","import type { HTMLAttributes } from 'react'\nimport {\n Dialog as AriaDialog,\n type DialogProps as AriaDialogProps,\n DialogTrigger as AriaDialogTrigger,\n type DialogTriggerProps as AriaDialogTriggerProps,\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n type ModalOverlayProps as AriaModalOverlayProps,\n Heading,\n type HeadingProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Modal — shadcn-shaped API over RAC's DialogTrigger + ModalOverlay + Modal\n + Dialog primitives. Composition mirrors:\n\n <Modal> // stateful root (uncontrolled or controlled)\n <Button>Open</Button> // first child = trigger\n <ModalContent> // portaled overlay + panel\n <ModalHeader>\n <ModalTitle>…</ModalTitle> // auto-wires aria-labelledby\n <ModalDescription>…</ModalDescription>\n </ModalHeader>\n <ModalBody>…</ModalBody>\n <ModalFooter>\n <Button slot=\"close\" variant=\"ghost\">Cancel</Button>\n <Button>Confirm</Button>\n </ModalFooter>\n </ModalContent>\n </Modal>\n ========================================================================= */\n\n/** Stateful root. Pass `isOpen` + `onOpenChange` for controlled usage. */\nexport function Modal(props: AriaDialogTriggerProps) {\n return <AriaDialogTrigger {...props} />\n}\n\nexport type ModalContentProps = AriaModalOverlayProps & {\n /** Disable backdrop click to close. Default: backdrop closes. */\n isDismissable?: boolean\n /** Children of the Dialog element. Supports render-prop form `({ close }) => …`. */\n children: AriaDialogProps['children']\n /** Visual override for the panel wrapper (affects width, padding, etc.). */\n modalClassName?: string\n}\n\n/**\n * Portaled overlay + floating panel + dialog role. Backdrop darkens the page\n * with a warm ink tint; panel uses vellum bg + rule border + the float shadow.\n */\nexport function ModalContent({\n children,\n className,\n modalClassName,\n isDismissable = true,\n ...props\n}: ModalContentProps) {\n return (\n <AriaModalOverlay\n isDismissable={isDismissable}\n {...props}\n className={(renderProps) =>\n cn(\n 'fixed inset-0 z-50 flex items-center justify-center p-4',\n // Warm ink scrim — stays in the Proteos palette (no pure black).\n 'bg-[color-mix(in_oklab,var(--color-ink)_40%,transparent)]',\n 'entering:animate-in entering:fade-in-0 entering:duration-150',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-100',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <AriaModal\n className={cn(\n 'w-full max-w-lg',\n // Cap the panel at the viewport (minus the overlay's p-4) and lay it\n // out as a column so a tall body scrolls instead of overflowing the\n // screen. Short modals are unaffected — height still tracks content.\n 'flex flex-col max-h-[calc(100dvh-2rem)]',\n 'bg-surface border border-rule rounded-lg',\n 'shadow-[var(--shadow-float)]',\n 'entering:animate-in entering:zoom-in-95 entering:slide-in-from-top-2 entering:duration-150',\n 'exiting:animate-out exiting:zoom-out-95 exiting:duration-100',\n modalClassName,\n )}\n >\n <AriaDialog className=\"outline-none flex flex-col min-h-0 overflow-hidden\">\n {children}\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n )\n}\n\n/* ---------- slots (each owns its padding, like Card) ----------------------- */\n\n/** Padded top block. Contains `<ModalTitle>` and optionally `<ModalDescription>`. */\nexport function ModalHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div {...props} className={cn('shrink-0 px-5 pt-5 pb-3 flex flex-col gap-1.5', className)} />\n}\n\n/** The modal's accessible name. Uses RAC `<Heading slot=\"title\">` so the\n * Dialog's `aria-labelledby` points here automatically. */\nexport function ModalTitle({ className, ...props }: Omit<HeadingProps, 'slot'>) {\n return (\n <Heading\n slot=\"title\"\n {...props}\n className={cn(\n 'font-sans font-medium text-[20px] leading-[1.25] tracking-[-0.015em] text-ink',\n className,\n )}\n />\n )\n}\n\n/** Supporting copy under the title. */\nexport function ModalDescription({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return <p {...props} className={cn('text-[14px] leading-[1.55] text-ink-3', className)} />\n}\n\n/** Padded main content block — put forms, text, lists, etc. here. */\nexport function ModalBody({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn(\n // The scroll region: caps at the panel's spare height and scrolls when\n // the content is taller, leaving header + footer pinned.\n 'min-h-0 overflow-y-auto px-5 py-3 flex flex-col gap-3 text-[14px] text-ink-2',\n className,\n )}\n />\n )\n}\n\n/** Action row at the bottom. Right-aligned. Place a `<Separator />` above\n * it when you want the dashed divider between body and footer. */\nexport function ModalFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n {...props}\n className={cn('shrink-0 flex justify-end items-center gap-2', 'px-5 pt-3 pb-5', className)}\n />\n )\n}\n","import type { Contact, ConversationBrief } from '@proteos/sdk'\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from 'react'\n\nimport { ModalBody, ModalContent, ModalHeader, ModalTitle } from '../modal'\nimport { ConversationBriefCard } from './conversation-brief-card'\nimport { ConversationBriefPreview } from './conversation-brief-preview'\nimport {\n type ConversationBriefClient,\n type ConversationBriefOutcome,\n conversationBriefOutcomeFor,\n isDialableConversationBrief,\n} from './types'\n\n/* =========================================================================\n ConversationBriefReview — the connected prepared-call entry point: loads the brief\n (and its contact) through the injected client, renders ConversationBriefCard, and\n owns what \"Open Brief\" does.\n\n The open action is the seam. Left alone it opens a modal with the\n ConversationBriefPreview — a read-only preview unless the host passes `onCall`\n (the web app does: it dials through its softphone). Passed `onOpenCall`,\n it hands the whole interaction to the host: the built-in modal is never\n rendered. That is how a sandboxed custom component opens a prepared call —\n an iframe cannot dial, so it asks the host (useOpenCall) to preview + dial.\n\n A brief that is ALREADY terminal when it loads (used on a call, discarded)\n settles the card immediately and reports `onOutcome` once.\n ========================================================================= */\n\nexport interface ConversationBriefReviewProps {\n conversationBriefId: string\n /** Injected fetch surface — see createConversationBriefClient. */\n client: ConversationBriefClient\n /**\n * FULL REPLACEMENT for the open action's default (the built-in preview\n * modal). When supplied the built-in modal is never rendered.\n */\n onOpenCall?: (conversationBriefId: string) => void\n /** Built-in modal only: place the call to this contact + number (the\n * host's dial). Absent ⇒ the modal is a read-only preview. */\n onCall?: (brief: ConversationBrief, contact: Contact, phoneNumber: string) => void\n /** Built-in modal only: disable the Call button + explain why. */\n isCallDisabled?: boolean\n callDisabledReason?: string\n /** Fires at most once, when the brief is (or becomes) terminal. */\n onOutcome?: (outcome: ConversationBriefOutcome, brief: ConversationBrief) => void\n /** The brief could not be loaded. The card renders nothing in that case. */\n onLoadError?: (error: Error) => void\n /** Built-in modal heading. Default 'Prepared conversation'. */\n modalTitle?: string\n modalClassName?: string\n /** Built-in modal overlay classes — where a host raises the z tier. */\n overlayClassName?: string\n openLabel?: string\n className?: string\n /** Built-in modal only: markdown renderer for the guidance text. */\n renderContent?: (content: string) => ReactNode\n}\n\nexport function ConversationBriefReview({\n conversationBriefId,\n client,\n onOpenCall,\n onCall,\n isCallDisabled = false,\n callDisabledReason,\n onOutcome,\n onLoadError,\n modalTitle = 'Prepared conversation',\n modalClassName = 'max-w-2xl',\n overlayClassName,\n openLabel,\n className,\n renderContent,\n}: ConversationBriefReviewProps) {\n const [brief, setBrief] = useState<ConversationBrief | null>(null)\n const [contacts, setContacts] = useState<Contact[]>([])\n const [isOpen, setIsOpen] = useState(false)\n const [outcome, setOutcome] = useState<ConversationBriefOutcome | null>(null)\n\n const onOutcomeRef = useRef(onOutcome)\n onOutcomeRef.current = onOutcome\n const onLoadErrorRef = useRef(onLoadError)\n onLoadErrorRef.current = onLoadError\n\n const hasSettledRef = useRef(false)\n const settle = useCallback((next: ConversationBriefOutcome, settled: ConversationBrief) => {\n setOutcome(next)\n setIsOpen(false)\n if (hasSettledRef.current) return\n hasSettledRef.current = true\n onOutcomeRef.current?.(next, settled)\n }, [])\n\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const loaded = await client.getConversationBrief(conversationBriefId)\n if (cancelled) return\n setBrief(loaded)\n const terminal = conversationBriefOutcomeFor(loaded.status)\n if (terminal) settle(terminal, loaded)\n const people = await Promise.all(\n loaded.contact_ids.map((contactId) => client.getContact(contactId).catch(() => null)),\n )\n if (!cancelled) setContacts(people.filter((person): person is Contact => person !== null))\n } catch (error) {\n if (cancelled) return\n onLoadErrorRef.current?.(error instanceof Error ? error : new Error(String(error)))\n }\n })()\n return () => {\n cancelled = true\n }\n }, [client, conversationBriefId, settle])\n\n const open = () => {\n if (onOpenCall) {\n onOpenCall(conversationBriefId)\n return\n }\n setIsOpen(true)\n }\n\n if (!brief) return null\n\n return (\n <>\n <ConversationBriefCard\n title={brief.subject || namesOf(contacts) || 'Prepared conversation'}\n summary={summaryFor(brief, contacts)}\n outcome={outcome}\n onOpen={open}\n {...(openLabel !== undefined ? { openLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n {onOpenCall ? null : (\n <ModalContent\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n modalClassName={modalClassName}\n {...(overlayClassName !== undefined ? { className: overlayClassName } : {})}\n >\n <ModalHeader>\n <ModalTitle>{modalTitle}</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"min-h-0 overflow-y-auto\">\n <ConversationBriefPreview\n brief={brief}\n contacts={contacts}\n contentClassName=\"max-h-[50dvh]\"\n isCallDisabled={isCallDisabled}\n {...(callDisabledReason !== undefined ? { callDisabledReason } : {})}\n {...(renderContent !== undefined ? { renderContent } : {})}\n {...(onCall && isDialableConversationBrief(brief)\n ? {\n onCall: (contact: Contact, phoneNumber: string) => {\n setIsOpen(false)\n onCall(brief, contact, phoneNumber)\n },\n }\n : {})}\n />\n </ModalBody>\n </ModalContent>\n )}\n </>\n )\n}\n\n/** The people's names, comma-joined. */\nexport function namesOf(contacts: Contact[]): string {\n return contacts\n .map((contact) => contact.name)\n .filter(Boolean)\n .join(', ')\n}\n\n/** Who + where + what: the people (when the subject took the headline),\n * the channel, the type, then the opening line. */\nexport function summaryFor(brief: ConversationBrief, contacts: Contact[]): string {\n const firstLine =\n brief.content\n .split('\\n')\n .find((line) => line.trim() !== '')\n ?.trim() ?? ''\n return [\n brief.subject ? namesOf(contacts) : '',\n brief.channel ?? '',\n brief.type_key ?? '',\n firstLine,\n ]\n .filter(Boolean)\n .join(' · ')\n}\n","import type { ConversationClient } from '@proteos/sdk'\n\nimport type { ConversationBriefClient } from './types'\n\n/**\n * One-liner adapter from the sdk ConversationClient (web app:\n * `useSdk().conversation`; custom components: `useSdk().conversations`) to\n * the conversation-brief surfaces' injected client. Type-only sdk import.\n */\nexport function createConversationBriefClient(\n conversation: Pick<ConversationClient, 'conversationBriefs' | 'contacts'>,\n): ConversationBriefClient {\n return {\n getConversationBrief: (conversationBriefId) =>\n conversation.conversationBriefs.get(conversationBriefId),\n getContact: (contactId) => conversation.contacts.get(contactId),\n }\n}\n","import { formatAmount, parseAmount } from '@proteos/sdk'\nimport { ChevronDown } from 'lucide-react'\nimport { type ReactNode, useEffect, useState } from 'react'\nimport {\n Button as AriaSelectTrigger,\n ListBox,\n ListBoxItem,\n Popover,\n Select as AriaSelect,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\nimport { type FieldAppearance, fieldControlStyles, fieldErrorStyles, type FieldSize } from '../field/field'\n\n/* =========================================================================\n CurrencyInput — a single money field: an amount input plus a trailing\n currency-symbol button that opens a symbol+code dropdown (the same shape as\n the date-picker's trailing calendar trigger).\n\n The amount is held and emitted as a canonical decimal STRING (never\n parseFloat'd) so precision and trailing zeros survive; it is *displayed* in\n the viewer's locale (grouping + decimal separator) and parsed back from that\n notation on input. The selectable currencies are passed in via\n `currencyOptions` so the lib stays free of any ISO/Intl dataset; the locale\n number helpers come from the SDK so there's one well-defined implementation.\n ========================================================================= */\n\nexport interface CurrencyInputValue {\n amount: string\n currency_code: string\n}\n\nexport interface CurrencyInputOption {\n code: string\n /** The currency's symbol (e.g. \"$\", \"€\"); falls back to the code. */\n symbol?: string\n}\n\nexport interface CurrencyInputProps {\n value: CurrencyInputValue | null\n onChange: (next: CurrencyInputValue | null) => void\n currencyOptions: ReadonlyArray<CurrencyInputOption>\n /** Locale for the amount's grouping + decimal separators. Defaults to runtime. */\n locale?: string\n isReadOnly?: boolean\n isInvalid?: boolean\n errorMessage?: ReactNode\n size?: FieldSize\n appearance?: FieldAppearance\n placeholder?: string\n autoFocus?: boolean\n 'aria-label'?: string\n onBlur?: () => void\n className?: string\n}\n\nexport function CurrencyInput({\n value,\n onChange,\n currencyOptions,\n locale,\n isReadOnly,\n isInvalid,\n errorMessage,\n size,\n appearance,\n placeholder,\n autoFocus,\n 'aria-label': ariaLabel,\n onBlur,\n className,\n}: CurrencyInputProps) {\n const amount = value?.amount ?? ''\n const code = value?.currency_code ?? ''\n\n // `draft` is the text shown in the input. It's grouped (e.g. \"1.234,56\") when\n // the field is idle and ungrouped (\"1234,56\") while editing, so grouping\n // doesn't fight the caret mid-type. The canonical value still flows out via\n // onChange on every keystroke.\n const [draft, setDraft] = useState(() => formatAmount(amount, locale, { grouped: true }))\n const [isEditing, setIsEditing] = useState(false)\n\n useEffect(() => {\n if (!isEditing) setDraft(formatAmount(amount, locale, { grouped: true }))\n }, [amount, locale, isEditing])\n\n const emit = (nextAmount: string, nextCode: string) => {\n if (nextAmount === '' && nextCode === '') {\n onChange(null)\n return\n }\n onChange({ amount: nextAmount, currency_code: nextCode })\n }\n\n const selectedSymbol = currencyOptions.find((option) => option.code === code)?.symbol ?? code\n\n const styles = fieldControlStyles({ size, appearance, ...(isInvalid ? { invalid: true } : {}) })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n <div className={cn(styles.box(), 'flex items-center gap-1 pr-1', focusWithin)}>\n <input\n className={cn(\n 'min-w-0 flex-1 bg-transparent text-ink outline-none tabular-nums',\n styles.content(),\n // Sit a touch lower than a standard field by trimming the vertical\n // padding (cell mode keeps the fixed 29px row-editor height).\n appearance === 'cell' ? '' : size === 'sm' ? 'py-1' : 'py-1.5',\n )}\n inputMode=\"decimal\"\n value={draft}\n onChange={(event) => {\n setDraft(event.target.value)\n emit(parseAmount(event.target.value, locale), code)\n }}\n onFocus={() => {\n setIsEditing(true)\n setDraft(formatAmount(amount, locale, { grouped: false }))\n }}\n onBlur={() => {\n setIsEditing(false)\n const canonical = parseAmount(draft, locale)\n setDraft(formatAmount(canonical, locale, { grouped: true }))\n emit(canonical, code)\n onBlur?.()\n }}\n readOnly={isReadOnly ?? false}\n autoFocus={autoFocus ?? false}\n placeholder={placeholder ?? ''}\n aria-label={ariaLabel ? `${ariaLabel} amount` : 'Amount'}\n />\n\n <AriaSelect\n aria-label={ariaLabel ? `${ariaLabel} currency` : 'Currency'}\n selectedKey={code === '' ? null : code}\n onSelectionChange={(key) => emit(amount, key == null ? '' : String(key))}\n isDisabled={isReadOnly ?? false}\n >\n <AriaSelectTrigger\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-0.5 rounded-md px-1.5',\n 'text-ink-2 outline-none hover:bg-surface-2 hover:text-ink',\n 'cursor-pointer focus-visible:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:opacity-45',\n )}\n >\n <span className=\"min-w-[1ch] text-center tabular-nums\">{selectedSymbol || '¤'}</span>\n <ChevronDown className=\"size-3 opacity-60\" aria-hidden />\n </AriaSelectTrigger>\n\n <Popover\n offset={6}\n className={cn(\n 'min-w-[9rem] rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <ListBox className=\"max-h-72 overflow-auto outline-none\">\n {currencyOptions.map((option) => (\n <ListBoxItem\n key={option.code}\n id={option.code}\n textValue={`${option.symbol ?? ''} ${option.code}`}\n className={cn(\n 'flex items-center gap-2 rounded-[6px] px-2.5 py-1.5 text-[14px] text-ink-2',\n 'cursor-pointer select-none outline-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n )}\n >\n <span className=\"w-5 shrink-0 text-ink-3 tabular-nums\">{option.symbol ?? ''}</span>\n <span className=\"font-medium\">{option.code}</span>\n </ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </AriaSelect>\n </div>\n\n {errorMessage && appearance !== 'cell' ? (\n <div className={fieldErrorStyles}>{errorMessage}</div>\n ) : null}\n </div>\n )\n}\n","import type { AnchorHTMLAttributes, MouseEvent, ReactNode } from 'react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Cell helpers — attribute-driven only.\n These exist because RecordTable auto-generates columns from\n Entity.attributes and dispatches the renderer at runtime by AttributeType.\n Bespoke per-domain cells (status pills, lane pairs, deltas, avatars+name)\n are NOT here — the consumer composes those inline via `column.cell`,\n matching the shadcn/TanStack idiom. The lib already exports Badge / Avatar\n / etc. for those compositions.\n ========================================================================= */\n\n/* ---------- DateCell ----------------------------------------------------- */\n\nexport type DateCellProps = {\n value: string | number | Date | null | undefined\n locale?: string\n options?: Intl.DateTimeFormatOptions\n fallback?: ReactNode\n className?: string\n}\n\nconst DEFAULT_DATE_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n}\n\nexport function DateCell({\n value,\n locale,\n options = DEFAULT_DATE_OPTIONS,\n fallback = '—',\n className,\n}: DateCellProps) {\n if (value == null || value === '') return <span className={className}>{fallback}</span>\n const date = value instanceof Date ? value : new Date(value)\n if (Number.isNaN(date.getTime())) return <span className={className}>{fallback}</span>\n return <span className={className}>{date.toLocaleDateString(locale, options)}</span>\n}\n\n/* ---------- DateTimeCell ------------------------------------------------- */\n\nexport type DateTimeCellProps = DateCellProps\n\nconst DEFAULT_DATETIME_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n}\n\nexport function DateTimeCell({\n value,\n locale,\n options = DEFAULT_DATETIME_OPTIONS,\n fallback = '—',\n className,\n}: DateTimeCellProps) {\n if (value == null || value === '') return <span className={className}>{fallback}</span>\n const date = value instanceof Date ? value : new Date(value)\n if (Number.isNaN(date.getTime())) return <span className={className}>{fallback}</span>\n return <span className={className}>{date.toLocaleString(locale, options)}</span>\n}\n\n/* ---------- BooleanCell -------------------------------------------------- */\n\nexport type BooleanCellProps = {\n value: boolean | null | undefined\n className?: string\n}\n\nexport function BooleanCell({ value, className }: BooleanCellProps) {\n if (value === true) {\n return (\n <span aria-label=\"true\" className={cn('text-success', className)}>\n <CheckIcon />\n </span>\n )\n }\n if (value === false) {\n return (\n <span aria-label=\"false\" className={cn('text-ink-4', className)}>\n <MinusIcon />\n </span>\n )\n }\n return <span className={cn('text-ink-4', className)}>—</span>\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M2.5 7.5 L5.5 10.5 L11.5 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction MinusIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M3 7 L11 7\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\n/* ---------- TruncateCell ------------------------------------------------- */\n\nexport type TruncateCellProps = {\n value: ReactNode\n title?: string\n className?: string\n}\n\n/**\n * The parent TableCell already clips with `overflow-hidden text-ellipsis`,\n * so this just adds a `title` attribute for the native tooltip when the\n * value is a string.\n */\nexport function TruncateCell({ value, title, className }: TruncateCellProps) {\n const tooltip = title ?? (typeof value === 'string' ? value : undefined)\n return (\n <span className={cn('truncate min-w-0', className)} title={tooltip}>\n {value ?? '—'}\n </span>\n )\n}\n\n/* ---------- LinkCell ----------------------------------------------------- */\n\nexport type LinkCellProps = AnchorHTMLAttributes<HTMLAnchorElement> & {\n children: ReactNode\n}\n\n/**\n * An anchor that stops click propagation so a row-click handler on the\n * parent <TableRow> doesn't fire alongside the link navigation.\n */\nexport function LinkCell({ children, onClick, className, ...props }: LinkCellProps) {\n return (\n <a\n {...props}\n onClick={(e: MouseEvent<HTMLAnchorElement>) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n className={cn(\n 'text-ink underline decoration-rule underline-offset-2 hover:decoration-ink',\n className,\n )}\n >\n {children}\n </a>\n )\n}\n","import { combine } from '@atlaskit/pragmatic-drag-and-drop/combine'\nimport { draggable, dropTargetForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'\nimport {\n attachClosestEdge,\n type Edge,\n extractClosestEdge,\n} from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge'\nimport { GripVertical, X } from 'lucide-react'\nimport {\n type CSSProperties,\n type HTMLAttributes,\n type MouseEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Table — pure presentational chrome.\n Div + ARIA grid roles (not semantic <table>) so virtualizers can position\n rows absolutely. The slot pattern mirrors Card: each slot owns its own\n spacing; the root carries no padding. The same primitives compose for\n short non-virtualized tables and for the virtualized DataTable layer.\n ========================================================================= */\n\nconst tableStyles = tv({\n base: ['flex flex-col overflow-hidden min-h-0', 'text-[14px] text-ink-2'],\n variants: {\n variant: {\n // Tables sit on the page bg, not the raised surface color — rows read\n // as part of the page, framed by the panel border (Tonio's call, 2026-07).\n panel: ['bg-bg border border-rule rounded-lg', 'shadow-[var(--shadow-rest)]'],\n bare: '',\n },\n },\n defaultVariants: { variant: 'panel' },\n})\n\nexport type TableVariants = VariantProps<typeof tableStyles>\nexport type TableProps = HTMLAttributes<HTMLDivElement> &\n TableVariants & {\n 'aria-label'?: string\n }\n\nexport function Table({ variant, className, ...props }: TableProps) {\n return <div role=\"grid\" {...props} className={cn(tableStyles({ variant }), className)} />\n}\n\n/* ---------- Header row ---------------------------------------------------- */\n\nconst tableHeaderStyles = tv({\n base: [\n 'flex items-stretch shrink-0',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n 'border-b border-rule',\n ],\n variants: {\n sticky: { true: 'sticky top-0 z-[2]', false: '' },\n },\n defaultVariants: { sticky: false },\n})\n\nexport type TableHeaderProps = HTMLAttributes<HTMLDivElement> & {\n sticky?: boolean\n}\n\nexport function TableHeader({ sticky, className, ...props }: TableHeaderProps) {\n return <div role=\"row\" {...props} className={cn(tableHeaderStyles({ sticky }), className)} />\n}\n\n/* ---------- Header cell --------------------------------------------------- */\n\nexport const tableHeaderCellStyles = tv({\n base: [\n // `relative` is the default positioning context (for the drag-edge\n // indicator + sort affordance). Declared as a class — not an inline\n // style — so the `sticky` variant below can override it; an inline\n // `position` would always win and a sticky gutter header could never\n // freeze.\n 'relative',\n 'flex items-center gap-[7px] shrink-0 select-none',\n 'px-[14px] h-[36px]',\n 'border-r border-rule-2 last:border-r-0',\n 'font-mono text-[10.5px] font-normal uppercase tracking-[0.08em]',\n 'text-ink-4',\n 'transition-[background-color,color] duration-150',\n ],\n variants: {\n align: {\n left: 'justify-start text-left',\n right: 'justify-end text-right',\n center: 'justify-center text-center',\n },\n interactive: {\n true: [\n 'cursor-pointer outline-none appearance-none border-0 border-r border-rule-2 last:border-r-0 bg-transparent',\n 'hover:bg-surface-2 hover:text-ink-2',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n ],\n false: '',\n },\n active: {\n true: 'text-ink',\n false: '',\n },\n sticky: {\n left: 'sticky left-0 z-[3] bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n right: 'sticky right-0 z-[3] bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n false: '',\n },\n },\n defaultVariants: { align: 'left', interactive: false, active: false, sticky: false },\n})\n\nexport type SortDirection = 'asc' | 'desc' | null\n\n/** Discriminator stored on every column drag payload. */\nexport const COLUMN_DRAG_KIND = 'proteos:table:column' as const\n\nexport type ColumnDragData = {\n kind: typeof COLUMN_DRAG_KIND\n columnId: string\n}\n\nexport function isColumnDragData(\n data: Record<string | symbol, unknown>,\n): data is ColumnDragData & Record<string | symbol, unknown> {\n return data.kind === COLUMN_DRAG_KIND && typeof data.columnId === 'string'\n}\n\ntype DragState =\n | { kind: 'idle' }\n | { kind: 'dragging' }\n | { kind: 'over'; edge: Extract<Edge, 'left' | 'right'> }\n\nexport type TableHeaderCellProps = Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> & {\n width?: number | string\n align?: 'left' | 'right' | 'center'\n /** Pin the cell to the left or right edge during horizontal scroll. */\n sticky?: 'left' | 'right' | false\n /**\n * When non-null, renders a sort affordance and treats clicks on the cell\n * body as a sort toggle. `null` (the default) is \"not sortable\".\n */\n sortDirection?: SortDirection\n onSortToggle?: () => void\n /**\n * Make the header draggable for column reorder. Requires `columnId`.\n * The cell registers pragmatic-dnd `draggable` + `dropTargetForElements`\n * with left/right edge detection; the actual reorder runs in a global\n * `monitorForElements` (e.g. inside DataTable) by reading the published\n * `ColumnDragData`.\n */\n draggable?: boolean\n columnId?: string\n /**\n * When provided, renders a trailing `×` button. Click events\n * `stopPropagation` so removal never starts a drag or toggles sort.\n */\n onRemove?: () => void\n /** Aria label fragment used in the remove button label and any drag a11y. */\n ariaLabel?: string\n}\n\nexport function TableHeaderCell({\n width,\n align = 'left',\n className,\n style,\n children,\n sortDirection = null,\n onSortToggle,\n draggable: isDraggable = false,\n columnId,\n onRemove,\n ariaLabel,\n sticky = false,\n ...rest\n}: TableHeaderCellProps) {\n const cellRef = useRef<HTMLDivElement | null>(null)\n const handleRef = useRef<HTMLSpanElement | null>(null)\n const [dragState, setDragState] = useState<DragState>({ kind: 'idle' })\n\n useEffect(() => {\n if (!isDraggable || !columnId) return\n const cell = cellRef.current\n const handle = handleRef.current\n if (!cell || !handle) return\n\n const data: ColumnDragData = { kind: COLUMN_DRAG_KIND, columnId }\n\n return combine(\n draggable({\n element: cell,\n dragHandle: handle,\n getInitialData: () => ({ ...data }),\n onDragStart: () => setDragState({ kind: 'dragging' }),\n onDrop: () => setDragState({ kind: 'idle' }),\n }),\n dropTargetForElements({\n element: cell,\n canDrop: ({ source }) =>\n isColumnDragData(source.data) && source.data.columnId !== columnId,\n getData: ({ input, element }) =>\n attachClosestEdge(\n { ...data },\n { input, element, allowedEdges: ['left', 'right'] },\n ),\n getIsSticky: () => true,\n onDragEnter: ({ self }) => {\n const edge = extractClosestEdge(self.data)\n if (edge === 'left' || edge === 'right') setDragState({ kind: 'over', edge })\n },\n onDrag: ({ self }) => {\n const edge = extractClosestEdge(self.data)\n if (edge === 'left' || edge === 'right') {\n setDragState((prev) =>\n prev.kind === 'over' && prev.edge === edge ? prev : { kind: 'over', edge },\n )\n }\n },\n onDragLeave: () => setDragState({ kind: 'idle' }),\n onDrop: () => setDragState({ kind: 'idle' }),\n }),\n )\n }, [isDraggable, columnId])\n\n const widthStyle: CSSProperties = width != null ? { width, flexBasis: width } : {}\n const isSortable = !!onSortToggle\n const active = sortDirection !== null\n\n const handleClick = (e: MouseEvent<HTMLDivElement>) => {\n if (!isSortable) return\n const target = e.target as HTMLElement\n if (target.closest('[data-dnd-handle=\"true\"]')) return\n if (target.closest('[data-column-remove=\"true\"]')) return\n onSortToggle?.()\n }\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (!isSortable) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSortToggle?.()\n }\n }\n\n const ariaSort: 'ascending' | 'descending' | 'none' | undefined = isSortable\n ? sortDirection === 'asc'\n ? 'ascending'\n : sortDirection === 'desc'\n ? 'descending'\n : 'none'\n : undefined\n\n return (\n <div\n {...rest}\n ref={cellRef}\n role=\"columnheader\"\n aria-sort={ariaSort}\n tabIndex={isSortable ? 0 : undefined}\n style={{ ...widthStyle, ...style }}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n tableHeaderCellStyles({ align, interactive: isSortable, active, sticky }),\n 'group/header',\n dragState.kind === 'dragging' ? 'opacity-40' : '',\n className,\n )}\n >\n {isDraggable && columnId ? (\n <span\n ref={handleRef}\n data-dnd-handle=\"true\"\n aria-hidden=\"true\"\n className={cn(\n 'inline-flex items-center justify-center shrink-0 -ml-1.5',\n 'cursor-grab active:cursor-grabbing text-ink-4',\n 'opacity-0 group-hover/header:opacity-100 transition-opacity',\n )}\n >\n <GripVertical className=\"size-3\" />\n </span>\n ) : null}\n\n <span\n className={cn(\n 'flex items-center gap-[7px] min-w-0 flex-1',\n align === 'right' ? 'justify-end' : align === 'center' ? 'justify-center' : 'justify-start',\n )}\n >\n <span className=\"truncate\">{children}</span>\n {isSortable ? <SortIcon dir={sortDirection} active={active} /> : null}\n </span>\n\n {onRemove ? (\n <button\n type=\"button\"\n data-column-remove=\"true\"\n aria-label={`Remove column ${ariaLabel ?? 'column'}`}\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex items-center justify-center shrink-0 size-4 rounded',\n 'text-ink-4 hover:text-ink hover:bg-surface-2',\n 'opacity-0 group-hover/header:opacity-100 focus-visible:opacity-100',\n 'transition-opacity outline-none focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <X className=\"size-3\" />\n </button>\n ) : null}\n\n {dragState.kind === 'over' ? (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'pointer-events-none absolute inset-y-0 z-10 w-0.5 bg-accent',\n dragState.edge === 'left' ? '-left-px' : '-right-px',\n )}\n />\n ) : null}\n </div>\n )\n}\n\nfunction SortIcon({ dir, active }: { dir: SortDirection; active: boolean }) {\n return (\n <svg\n width=\"8\"\n height=\"11\"\n viewBox=\"0 0 8 11\"\n aria-hidden=\"true\"\n className={cn('shrink-0', active ? 'text-accent' : 'text-ink-4')}\n >\n <path d=\"M4 0.5 L7.5 4 L0.5 4 Z\" fill=\"currentColor\" opacity={dir === 'asc' ? 1 : 0.22} />\n <path d=\"M4 10.5 L0.5 7 L7.5 7 Z\" fill=\"currentColor\" opacity={dir === 'desc' ? 1 : 0.22} />\n </svg>\n )\n}\n\n/**\n * Trailing flexible spacer so the header row fills the full row width when\n * the sum of column widths is less than the viewport. Matches the design's\n * `pt-th--spacer`.\n */\nexport function TableHeaderSpacer({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n aria-hidden=\"true\"\n {...props}\n className={cn('flex-1 h-[36px] border-r-0', 'bg-transparent pointer-events-none', className)}\n />\n )\n}\n\n/* ---------- Body / scroll container -------------------------------------- */\n\n/* Scrollbar chrome shared by `TableBody` (standalone short-table scroller)\n and `TableScroller` (the virtualized DataTable's single both-axes scroller). */\nconst scrollbarChrome = [\n '[scrollbar-width:thin]',\n '[scrollbar-color:var(--color-rule)_transparent]',\n '[&::-webkit-scrollbar]:size-3',\n '[&::-webkit-scrollbar-thumb]:rounded-pill',\n '[&::-webkit-scrollbar-thumb]:bg-rule',\n '[&::-webkit-scrollbar-thumb]:border-[3px]',\n '[&::-webkit-scrollbar-thumb]:border-solid',\n '[&::-webkit-scrollbar-thumb]:border-bg',\n '[&::-webkit-scrollbar-thumb:hover]:bg-ink-4',\n '[&::-webkit-scrollbar-corner]:bg-bg',\n] as const\n\nconst tableBodyStyles = tv({\n base: ['flex-1 min-h-0 overflow-auto relative', ...scrollbarChrome],\n})\n\nexport type TableBodyProps = HTMLAttributes<HTMLDivElement> & {\n ref?: Ref<HTMLDivElement>\n}\n\nexport function TableBody({ className, ref, ...props }: TableBodyProps) {\n return <div role=\"rowgroup\" ref={ref} {...props} className={cn(tableBodyStyles(), className)} />\n}\n\n/* ---------- Scroller ------------------------------------------------------ */\n\n/* `TableScroller` — the single scroll container for the virtualized\n DataTable. It scrolls on BOTH axes so a min-width content track (sticky\n header + rows) scrolls horizontally as one unit, the sticky header pins to\n the top on vertical scroll, and any `sticky left-0` gutter column freezes\n to the left on horizontal scroll (Excel-style). `relative` makes it the\n offsetParent so the virtualizer can measure the row list's offset (the\n sticky header's height) for its `scrollMargin`. Presentational: ARIA sees\n through it to the header row + rowgroup it contains. */\nconst tableScrollerStyles = tv({\n base: ['relative flex-1 min-h-0 overflow-auto', ...scrollbarChrome],\n})\n\nexport function TableScroller({ className, ref, ...props }: TableBodyProps) {\n return (\n <div role=\"presentation\" ref={ref} {...props} className={cn(tableScrollerStyles(), className)} />\n )\n}\n\n/* ---------- Row ----------------------------------------------------------- */\n\n/* Stripe + hover tint rows by mixing ink into the page bg they sit on. Ink is\n always the opposing pole of bg, so one formula holds in every theme —\n stripes darken on paper/light and lighten on dark. surface-2 can't do this:\n it's a surface-relative step and collapses into bg in the light theme.\n Strength is a per-theme knob (--row-stripe/--row-hover in styles.css) since a\n near-white base shows a given delta more; --row-hover > --row-stripe keeps\n the states ordered in every theme. */\nconst rowStripeBg = 'bg-[color-mix(in_oklab,var(--color-ink)_var(--row-stripe),var(--color-bg))]'\nconst rowHoverBg =\n 'hover:bg-[color-mix(in_oklab,var(--color-ink)_var(--row-hover),var(--color-bg))]'\n\nconst tableRowStyles = tv({\n base: ['flex items-stretch', 'border-b border-rule-2 last:border-b-0', 'bg-bg'],\n variants: {\n alt: {\n true: rowStripeBg,\n false: '',\n },\n interactive: {\n true: `cursor-pointer ${rowHoverBg}`,\n false: rowHoverBg,\n },\n absolute: {\n true: 'absolute left-0 right-0',\n false: '',\n },\n },\n compoundVariants: [{ alt: true, interactive: true, class: rowHoverBg }],\n defaultVariants: { alt: false, interactive: false, absolute: false },\n})\n\nexport type TableRowProps = HTMLAttributes<HTMLDivElement> & {\n alt?: boolean\n interactive?: boolean\n /**\n * Position the row absolutely (used by virtualizers that translate rows\n * into place via inline `style.transform`).\n */\n absolute?: boolean\n onRowClick?: (e: MouseEvent<HTMLDivElement>) => void\n}\n\nexport function TableRow({\n alt,\n interactive,\n absolute,\n className,\n onRowClick,\n onClick,\n ...props\n}: TableRowProps) {\n return (\n <div\n role=\"row\"\n {...props}\n onClick={(e) => {\n onClick?.(e)\n onRowClick?.(e)\n }}\n className={cn(tableRowStyles({ alt, interactive, absolute }), className)}\n />\n )\n}\n\n/* ---------- Cell ---------------------------------------------------------- */\n\nexport const tableCellStyles = tv({\n base: [\n 'flex items-center shrink-0 min-w-0',\n 'px-[14px]',\n 'whitespace-nowrap overflow-hidden text-ellipsis',\n 'font-sans text-[13px] tracking-[-0.005em]',\n 'text-ink-2',\n ],\n variants: {\n align: {\n left: 'justify-start text-left',\n right: 'justify-end text-right [font-variant-numeric:tabular-nums]',\n center: 'justify-center text-center',\n },\n mono: {\n true: 'font-mono text-[12.5px] [font-feature-settings:\"tnum\",\"zero\"]',\n false: '',\n },\n ink: {\n true: 'text-ink',\n false: '',\n },\n sticky: {\n // Sticky cells inherit the row's background via bg-inherit so the\n // alternating-zebra + hover states pass through.\n left: 'sticky left-0 z-[1] bg-inherit',\n right: 'sticky right-0 z-[1] bg-inherit',\n false: '',\n },\n },\n defaultVariants: { align: 'left', mono: false, ink: false, sticky: false },\n})\n\nexport type TableCellProps = HTMLAttributes<HTMLDivElement> & {\n width?: number | string\n align?: 'left' | 'right' | 'center'\n mono?: boolean\n ink?: boolean\n /** Pin the cell to the left or right edge during horizontal scroll. */\n sticky?: 'left' | 'right' | false\n}\n\nexport function TableCell({\n width,\n align,\n mono,\n ink,\n sticky,\n className,\n style,\n ...props\n}: TableCellProps) {\n const widthStyle: CSSProperties = width != null ? { width, flexBasis: width } : {}\n return (\n <div\n role=\"gridcell\"\n {...props}\n style={{ ...widthStyle, ...style }}\n className={cn(tableCellStyles({ align, mono, ink, sticky }), className)}\n />\n )\n}\n","import type { ReactNode } from 'react'\n\nimport { cn } from '../../../lib/cn'\n\nexport type DataTableEmptyProps = {\n title?: string\n message?: string\n icon?: ReactNode\n action?: ReactNode\n className?: string\n}\n\n/**\n * Empty state shown when the query returns zero rows.\n * Mirrors the design's `pt-empty` block.\n */\nexport function DataTableEmpty({\n title = 'No results',\n message,\n icon,\n action,\n className,\n}: DataTableEmptyProps) {\n return (\n <div\n role=\"status\"\n className={cn(\n 'flex flex-col items-center justify-center gap-2',\n 'px-5 py-16 text-center',\n 'font-sans text-[13px] text-ink-3',\n className,\n )}\n >\n {icon ? <div className=\"text-ink-4\">{icon}</div> : null}\n <div className=\"text-ink text-[14px]\">{title}</div>\n {message ? <div className=\"text-ink-3 max-w-[36ch]\">{message}</div> : null}\n {action ? <div className=\"mt-3\">{action}</div> : null}\n </div>\n )\n}\n","import { cn } from '../../../lib/cn'\nimport { Button } from '../../button'\n\nexport type DataTableErrorProps = {\n error: Error\n onRetry?: () => void\n className?: string\n}\n\nexport function DataTableError({ error, onRetry, className }: DataTableErrorProps) {\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex flex-col items-center justify-center gap-3',\n 'px-5 py-16 text-center',\n 'font-sans text-[13px] text-ink-3',\n className,\n )}\n >\n <div className=\"text-danger text-[14px]\">Something went wrong</div>\n <div className=\"text-ink-3 max-w-[48ch] font-mono text-[12px]\">{error.message}</div>\n {onRetry ? (\n <Button variant=\"ghost\" size=\"sm\" onPress={onRetry}>\n Retry\n </Button>\n ) : null}\n </div>\n )\n}\n","import { Skeleton } from '../../skeleton'\nimport { TableBody, TableCell, TableRow } from '../../table'\n\nexport type DataTableSkeletonProps = {\n rows?: number\n columnWidths?: ReadonlyArray<number | string>\n rowHeight?: number\n}\n\n/**\n * Skeleton placeholder shown while the first page is loading.\n * Renders inside the same TableBody scroller, so the layout doesn't jump\n * when real rows replace it.\n */\nexport function DataTableSkeleton({\n rows = 8,\n columnWidths = [120, 240, 160, 120, 120],\n rowHeight = 32,\n}: DataTableSkeletonProps) {\n return (\n <TableBody role=\"rowgroup\" aria-label=\"Loading rows\">\n {Array.from({ length: rows }).map((_, rowIdx) => (\n <TableRow\n // biome-ignore lint/suspicious/noArrayIndexKey: deterministic placeholder rows\n key={rowIdx}\n alt={rowIdx % 2 === 1}\n style={{ height: rowHeight }}\n >\n {columnWidths.map((w, colIdx) => (\n <TableCell\n // biome-ignore lint/suspicious/noArrayIndexKey: deterministic placeholder cells\n key={colIdx}\n width={w}\n >\n <Skeleton shape=\"text\" className=\"h-3 max-w-[60%]\" />\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n )\n}\n","import { type RefObject, useEffect, useRef } from 'react'\n\nexport type UseInfiniteScrollSentinelOptions = {\n onIntersect: () => void\n /**\n * IntersectionObserver `rootMargin`. Default `200px` so the next page\n * starts fetching before the user scrolls all the way to the bottom.\n */\n rootMargin?: string\n /**\n * Optional scroll-container ref (passed as the observer's `root`). When\n * omitted, the observer uses the viewport.\n */\n root?: Element | null\n enabled?: boolean\n}\n\n/**\n * Mounts a sentinel element ref. When the element scrolls into view (with\n * the given rootMargin), `onIntersect` fires once per visible streak.\n * Used by DataTable to drive `query.fetchNextPage()`.\n */\nexport function useInfiniteScrollSentinel<T extends Element = HTMLDivElement>({\n onIntersect,\n rootMargin = '200px',\n root,\n enabled = true,\n}: UseInfiniteScrollSentinelOptions): RefObject<T | null> {\n const ref = useRef<T | null>(null)\n // Latest callback in a ref so the observer doesn't re-create on every render.\n const cbRef = useRef(onIntersect)\n cbRef.current = onIntersect\n\n useEffect(() => {\n if (!enabled) return\n const node = ref.current\n if (!node) return\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) cbRef.current()\n }\n },\n { root: root ?? null, rootMargin, threshold: 0 },\n )\n observer.observe(node)\n return () => observer.disconnect()\n }, [enabled, rootMargin, root])\n\n return ref\n}\n","import { monitorForElements } from '@atlaskit/pragmatic-drag-and-drop/element/adapter'\nimport { extractClosestEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge'\nimport { reorderWithEdge } from '@atlaskit/pragmatic-drag-and-drop-hitbox/util/reorder-with-edge'\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n type OnChangeFn,\n type Row,\n type SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport { useVirtualizer } from '@tanstack/react-virtual'\nimport {\n type CSSProperties,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport { cn } from '../../lib/cn'\nimport { Checkbox } from '../checkbox'\nimport {\n isColumnDragData,\n type SortDirection,\n Table,\n TableCell,\n TableHeader,\n TableHeaderCell,\n TableHeaderSpacer,\n TableRow,\n TableScroller,\n type TableVariants,\n} from '../table'\nimport { DataTableEmpty } from './states/data-table-empty'\nimport { DataTableError } from './states/data-table-error'\nimport { DataTableSkeleton } from './states/data-table-skeleton'\nimport { useInfiniteScrollSentinel } from './use-infinite-scroll-sentinel'\n\n/* =========================================================================\n DataTable — generic virtualized infinite-scroll table.\n - TanStack Table v8 owns the column model and sorting state.\n - TanStack Virtual virtualizes the body against an internal scroller ref.\n - An IntersectionObserver sentinel triggers `query.fetchNextPage()` ~200 px\n before the user reaches the bottom. Visuals (loader, end marker, empty,\n error) match the Anthropic design's `pt-loader`/`pt-end`/`pt-empty`.\n - The component is data-fetching-shape-agnostic: it accepts anything\n conforming to InfiniteQueryLike (matches @tanstack/react-query's\n useInfiniteQuery return shape).\n ========================================================================= */\n\ntype InfinitePage<TRow> = { data: TRow[]; meta?: { items_total?: number } }\n\nexport type InfiniteQueryLike<TRow> = {\n data?: { pages: InfinitePage<TRow>[] } | undefined\n isLoading: boolean\n isFetchingNextPage: boolean\n hasNextPage: boolean | undefined\n error: Error | null\n fetchNextPage: () => void\n refetch?: () => void\n}\n\nexport type DataTableProps<TRow> = {\n query: InfiniteQueryLike<TRow>\n columns: ColumnDef<TRow>[]\n sorting?: SortingState\n onSortingChange?: OnChangeFn<SortingState>\n rowHeight?: number\n overscan?: number\n /**\n * Called when a row is clicked. Provides both the original data row and\n * the underlying event so consumers can inspect modifier keys.\n */\n onRowClick?: (\n row: TRow,\n event: MouseEvent<HTMLDivElement> | KeyboardEvent<HTMLDivElement>,\n ) => void\n zebra?: boolean\n emptyState?: ReactNode\n errorState?: ReactNode\n loadingState?: ReactNode\n /**\n * Optional accessor used as the React key for each row. Defaults to a\n * row's `id` field (if present), then `slug`, then index.\n */\n getRowId?: (row: TRow, index: number) => string\n className?: string\n ariaLabel?: string\n /**\n * Enable horizontal drag-and-drop reordering of columns. When on, a grip\n * handle and `monitorForElements` are wired up; on a successful reorder\n * `onReorderColumn` fires with the moved column's id and its new index.\n * Each `ColumnDef` must carry a stable `id` for events to be routable.\n */\n enableColumnReordering?: boolean\n /**\n * Enable an `×` remove affordance on each column header. The handler is\n * called with the column's id; the parent decides what removal means\n * (e.g. filter the displayed `columns` array).\n */\n enableColumnRemoval?: boolean\n onReorderColumn?: (params: { id: string; toIndex: number }) => void\n onRemoveColumn?: (id: string) => void\n /**\n * Visual chrome around the table. `panel` (default) wraps the table in a\n * bordered, rounded, soft-shadowed card. `bare` strips that chrome so the\n * table can sit flush with its container — used when the surrounding\n * surface already supplies borders (e.g. the Query Builder's results pane).\n */\n variant?: TableVariants['variant']\n /**\n * Optional per-row wrapper. When provided, the row's cell content is\n * passed through this function, which may render context providers (e.g.\n * a row-scoped TanStack Form for inline editing) around the cells. The\n * default is identity — cells render directly inside the `<TableRow>`.\n */\n rowWrapper?: (row: Row<TRow>, cells: ReactNode) => ReactNode\n /**\n * Extra rows rendered alongside the server data. Used for inline-editable\n * draft rows that are not yet persisted. `start` rows render above the\n * server data, `end` rows below. They participate in the same column\n * model, virtualization, and `rowWrapper` as server rows.\n */\n extraRows?: { start?: TRow[]; end?: TRow[] }\n /**\n * Slot rendered ABOVE the body (above the virtualized region). Used for\n * controls like an Add row button at slot='start'. Stays put when the\n * body scrolls (sits inside the header sticky region or just below it).\n */\n bodyBefore?: ReactNode\n /**\n * Slot rendered BELOW the body. Used for controls like an Add row button\n * at slot='end'. Sits inside the scrollable area below the rows.\n */\n bodyAfter?: ReactNode\n /**\n * Row selection. `none` (default) renders no checkbox column; `multiple`\n * prepends a sticky leading checkbox column and turns the header checkbox\n * into a tri-state select-all.\n *\n * Selection is CONTROLLED — the owner holds the ids because it is the one\n * that acts on them (running a batch action, clearing after a save). The\n * header checkbox covers the rows currently LOADED: an infinite list can't\n * honestly claim to select rows it has never fetched, so \"select everything\n * matching the filter\" belongs to the owner's toolbar, not here.\n */\n selectionMode?: 'none' | 'multiple'\n selectedIds?: Set<string>\n onSelectionChange?: (ids: Set<string>) => void\n /**\n * Draw vertical gridlines between body cells. The header always has them;\n * the body opts in (e.g. inline-edit mode wants the full Excel-style grid).\n * Default false — read-only tables stay borderless in the body.\n */\n columnBorders?: boolean\n /**\n * Group consecutive rows under a full-width heading. Returns the group a row\n * belongs to, or null to leave it ungrouped; a heading is emitted whenever\n * the group id CHANGES between neighbours, so the caller is responsible for\n * ordering rows by their group (with server-side sorting, sort by the\n * grouping column first). That contract is what lets grouping work with\n * infinite scroll — a group may continue on the next page without the table\n * having to know the full row set up front.\n */\n groupBy?: (row: TRow) => { id: string; label: ReactNode } | null\n /** Height of a group heading row. Defaults to `rowHeight`. */\n groupHeaderHeight?: number\n}\n\n/** One entry of the virtualized list: either a data row or a group heading. */\ntype ListItem<TRow> =\n | { kind: 'row'; row: Row<TRow>; dataIndex: number }\n | { kind: 'group'; id: string; label: ReactNode }\n\nconst DEFAULT_ROW_HEIGHT = 32\n\n/** Column id of the leading checkbox column added by `selectionMode`. */\nexport const SELECTION_COLUMN_ID = '__select__' \n\nexport function DataTable<TRow>({\n query,\n columns,\n sorting,\n onSortingChange,\n rowHeight = DEFAULT_ROW_HEIGHT,\n overscan = 8,\n onRowClick,\n zebra = true,\n emptyState,\n errorState,\n loadingState,\n getRowId,\n className,\n ariaLabel,\n enableColumnReordering = false,\n enableColumnRemoval = false,\n onReorderColumn,\n onRemoveColumn,\n variant = 'panel',\n rowWrapper,\n extraRows,\n bodyBefore,\n bodyAfter,\n selectionMode = 'none',\n selectedIds,\n onSelectionChange,\n columnBorders = false,\n groupBy,\n groupHeaderHeight,\n}: DataTableProps<TRow>) {\n const rows = useMemo<TRow[]>(() => {\n const pages = query.data?.pages\n const dataRows = pages && pages.length > 0 ? pages.flatMap((p) => p.data) : []\n const startExtras = extraRows?.start ?? []\n const endExtras = extraRows?.end ?? []\n if (startExtras.length === 0 && endExtras.length === 0) return dataRows\n return [...startExtras, ...dataRows, ...endExtras]\n }, [query.data, extraRows])\n\n const resolveRowId = useMemo(\n () =>\n getRowId ??\n ((row: TRow, index: number) => {\n const r = row as Record<string, unknown>\n if (typeof r.id === 'string' || typeof r.id === 'number') return String(r.id)\n if (typeof r.slug === 'string') return r.slug\n return String(index)\n }),\n [getRowId],\n )\n\n const selectionEnabled = selectionMode === 'multiple'\n const selected = useMemo(() => selectedIds ?? new Set<string>(), [selectedIds])\n // Ids of the rows currently LOADED — what the header checkbox operates on.\n const loadedIds = useMemo(\n () => (selectionEnabled ? rows.map((row, index) => resolveRowId(row, index)) : []),\n [selectionEnabled, rows, resolveRowId],\n )\n // Anchor for shift-click range selection, in loaded-row index space.\n const lastToggledIndexRef = useRef<number | null>(null)\n\n const toggleRow = (id: string, index: number, isRange: boolean) => {\n if (!onSelectionChange) return\n const next = new Set(selected)\n const anchor = lastToggledIndexRef.current\n if (isRange && anchor !== null) {\n const [from, to] = anchor <= index ? [anchor, index] : [index, anchor]\n // A range drag always ADDS — matching how file managers and mail\n // clients behave; use individual clicks to take rows back out.\n for (let i = from; i <= to; i += 1) {\n const rangeId = loadedIds[i]\n if (rangeId !== undefined) next.add(rangeId)\n }\n } else if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n lastToggledIndexRef.current = index\n onSelectionChange(next)\n }\n\n const loadedSelectedCount = loadedIds.reduce((count, id) => count + (selected.has(id) ? 1 : 0), 0)\n const allLoadedSelected = loadedIds.length > 0 && loadedSelectedCount === loadedIds.length\n\n const toggleAllLoaded = () => {\n if (!onSelectionChange) return\n const next = new Set(selected)\n if (allLoadedSelected) {\n for (const id of loadedIds) next.delete(id)\n } else {\n for (const id of loadedIds) next.add(id)\n }\n lastToggledIndexRef.current = null\n onSelectionChange(next)\n }\n\n // RAC's Checkbox onChange carries no modifier keys, so the shift state is\n // captured on the preceding pointer event.\n const rangeModifierRef = useRef(false)\n\n const selectionColumn = useMemo<ColumnDef<TRow>>(\n () => ({\n id: SELECTION_COLUMN_ID,\n size: 36,\n enableSorting: false,\n meta: { align: 'center', sticky: 'left', cellClassName: 'px-0 justify-center' },\n header: () => (\n <span className=\"inline-flex items-center justify-center w-full\">\n <Checkbox\n aria-label={allLoadedSelected ? 'Deselect all rows' : 'Select all rows'}\n isSelected={allLoadedSelected}\n isIndeterminate={loadedSelectedCount > 0 && !allLoadedSelected}\n isDisabled={loadedIds.length === 0}\n onChange={toggleAllLoaded}\n />\n </span>\n ),\n cell: ({ row }) => (\n // Stop the click here: selecting a row must never also open it.\n <span\n className=\"inline-flex items-center justify-center w-full\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n event.stopPropagation()\n rangeModifierRef.current = event.shiftKey\n }}\n onPointerDownCapture={(event) => {\n rangeModifierRef.current = event.shiftKey\n }}\n role=\"presentation\"\n >\n <Checkbox\n aria-label={`Select row ${row.index + 1}`}\n isSelected={selected.has(row.id)}\n onChange={() => toggleRow(row.id, row.index, rangeModifierRef.current)}\n />\n </span>\n ),\n }),\n // biome-ignore lint/correctness/useExhaustiveDependencies: handlers read the latest selection via closure recreated on these inputs\n [selected, loadedIds, allLoadedSelected, loadedSelectedCount],\n )\n\n const tableColumns = useMemo(\n () => (selectionEnabled ? [selectionColumn, ...columns] : columns),\n [selectionEnabled, selectionColumn, columns],\n )\n\n const table = useReactTable({\n data: rows,\n columns: tableColumns,\n state: { sorting: sorting ?? [] },\n ...(onSortingChange ? { onSortingChange } : {}),\n manualSorting: true,\n getCoreRowModel: getCoreRowModel(),\n getRowId: (row, index) => resolveRowId(row, index),\n })\n\n const tableRows = table.getRowModel().rows\n const tableRowCount = tableRows.length\n\n // Flatten rows into the virtualized list, splicing a heading in wherever the\n // group changes. Without `groupBy` this is the rows themselves.\n const listItems = useMemo<ListItem<TRow>[]>(() => {\n if (!groupBy) {\n return tableRows.map((row, dataIndex) => ({ kind: 'row', row, dataIndex }) as const)\n }\n const items: ListItem<TRow>[] = []\n let currentGroupId: string | null = null\n tableRows.forEach((row, dataIndex) => {\n const group = groupBy(row.original)\n if (group && group.id !== currentGroupId) {\n currentGroupId = group.id\n items.push({ kind: 'group', id: group.id, label: group.label })\n } else if (!group) {\n currentGroupId = null\n }\n items.push({ kind: 'row', row, dataIndex })\n })\n return items\n }, [tableRows, groupBy])\n\n // Reset scroll to top when sorting changes — without this, the user is\n // staring at a different slice of a freshly-sorted dataset.\n const scrollerRef = useRef<HTMLDivElement | null>(null)\n // biome-ignore lint/correctness/useExhaustiveDependencies: intentional — scroll resets on sort change only\n useEffect(() => {\n scrollerRef.current?.scrollTo({ top: 0 })\n }, [sorting])\n\n // The sticky header lives inside the scroller, ABOVE the row list, so the\n // list starts at an offset (the header's height, plus any `bodyBefore`).\n // Feed that offset to the virtualizer as `scrollMargin` so its visible\n // window math accounts for it; render rows at `start - scrollMargin`.\n const listRef = useRef<HTMLDivElement | null>(null)\n const [listOffset, setListOffset] = useState(0)\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-measure every render; cheap offsetTop read, guarded setState\n useLayoutEffect(() => {\n const top = listRef.current?.offsetTop ?? 0\n setListOffset((prev) => (prev === top ? prev : top))\n })\n\n const headingHeight = groupHeaderHeight ?? rowHeight\n\n const virtualizer = useVirtualizer({\n count: listItems.length,\n getScrollElement: () => scrollerRef.current,\n estimateSize: (index) => (listItems[index]?.kind === 'group' ? headingHeight : rowHeight),\n overscan,\n scrollMargin: listOffset,\n })\n\n const sentinelRef = useInfiniteScrollSentinel<HTMLDivElement>({\n onIntersect: () => {\n if (query.hasNextPage && !query.isFetchingNextPage && !query.isLoading) {\n query.fetchNextPage()\n }\n },\n rootMargin: '200px',\n root: scrollerRef.current,\n enabled: !!query.hasNextPage,\n })\n\n const totalColumnWidth = useMemo(\n () => tableColumns.reduce((sum, c) => sum + (c.size ?? 140), 0),\n [tableColumns],\n )\n\n // Single global pragmatic-dnd monitor for column reorder. We mirror the\n // entity-designer pattern: read the latest columns + handler via refs so\n // the monitor doesn't re-register on every render. Gated on\n // `enableColumnReordering` so it's a no-op when the feature is off.\n const columnsRef = useRef(columns)\n columnsRef.current = columns\n const onReorderRef = useRef(onReorderColumn)\n onReorderRef.current = onReorderColumn\n\n useEffect(() => {\n if (!enableColumnReordering) return\n return monitorForElements({\n canMonitor: ({ source }) => isColumnDragData(source.data),\n onDrop: ({ source, location }) => {\n const target = location.current.dropTargets[0]\n if (!target) return\n if (!isColumnDragData(source.data) || !isColumnDragData(target.data)) return\n if (source.data.columnId === target.data.columnId) return\n\n const ids = columnsRef.current.map((c) => c.id).filter((id): id is string => !!id)\n const startIndex = ids.indexOf(source.data.columnId)\n const indexOfTarget = ids.indexOf(target.data.columnId)\n if (startIndex === -1 || indexOfTarget === -1) return\n\n const closestEdge = extractClosestEdge(target.data)\n const reordered = reorderWithEdge({\n list: ids,\n startIndex,\n indexOfTarget,\n closestEdgeOfTarget: closestEdge,\n axis: 'horizontal',\n })\n if (reordered === ids) return\n\n const sourceId = source.data.columnId\n onReorderRef.current?.({ id: sourceId, toIndex: reordered.indexOf(sourceId) })\n },\n })\n }, [enableColumnReordering])\n\n const showEmpty =\n !query.isLoading && !query.error && tableRowCount === 0 && !query.isFetchingNextPage\n const showInitialLoading = query.isLoading && tableRowCount === 0\n const showError = !!query.error && tableRowCount === 0\n const showEndMarker =\n !query.isLoading && !query.isFetchingNextPage && !query.hasNextPage && tableRowCount > 0\n\n const totalSize = virtualizer.getTotalSize()\n const virtualItems = virtualizer.getVirtualItems()\n\n const headerGroups = table.getHeaderGroups()\n const minPanelWidth = totalColumnWidth + 24\n\n return (\n <Table\n {...(ariaLabel !== undefined ? { 'aria-label': ariaLabel } : {})}\n variant={variant}\n className={cn('flex-1 min-h-0', className)}\n >\n {/* Single both-axes scroll container. Horizontal wheel/trackpad scrolls\n the columns; vertical scrolls the rows. The sticky header pins to the\n top, and any `sticky left-0` gutter column freezes to the left. */}\n <TableScroller ref={scrollerRef}>\n {/* Content track — owns the horizontal min-width so the header + rows\n scroll horizontally together as one unit. */}\n <div className=\"flex flex-col\" style={{ minWidth: minPanelWidth }}>\n {/* Header row(s) — sticky-top so they pin while the rows scroll. */}\n {headerGroups.map((group) => (\n <TableHeader key={group.id} sticky>\n {group.headers.map((header) => {\n const meta = header.column.columnDef.meta as\n | {\n align?: 'left' | 'right' | 'center'\n sticky?: 'left' | 'right' | false\n cellClassName?: string\n }\n | undefined\n const align = meta?.align ?? 'left'\n const sticky = meta?.sticky ?? false\n const headerSize = header.getSize() || undefined\n const headerNode = header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())\n\n const sorted = header.column.getIsSorted()\n const direction: SortDirection = sorted === false ? null : sorted\n const canSort = header.column.getCanSort()\n const handleSort = header.column.getToggleSortingHandler()\n const ariaLabel =\n typeof header.column.columnDef.header === 'string'\n ? header.column.columnDef.header\n : header.column.id\n\n return (\n <TableHeaderCell\n key={header.id}\n align={align}\n ariaLabel={ariaLabel}\n draggable={enableColumnReordering && !!header.column.id}\n {...(header.column.id ? { columnId: header.column.id } : {})}\n {...(headerSize !== undefined ? { width: headerSize } : {})}\n {...(sticky !== false ? { sticky } : {})}\n {...(meta?.cellClassName ? { className: meta.cellClassName } : {})}\n {...(canSort\n ? {\n sortDirection: direction,\n onSortToggle: () => handleSort?.({} as never),\n }\n : {})}\n {...(enableColumnRemoval && onRemoveColumn && header.column.id\n ? { onRemove: () => onRemoveColumn(header.column.id) }\n : {})}\n >\n {headerNode}\n </TableHeaderCell>\n )\n })}\n <TableHeaderSpacer />\n </TableHeader>\n ))}\n\n {bodyBefore}\n\n {showInitialLoading ? (\n (loadingState ?? <DataTableSkeleton rowHeight={rowHeight} />)\n ) : showError ? (\n <div role=\"rowgroup\">\n {errorState ?? (query.error ? <DataTableError error={query.error} /> : null)}\n </div>\n ) : (\n <div role=\"rowgroup\">\n {showEmpty ? (\n (emptyState ?? <DataTableEmpty />)\n ) : (\n <div\n ref={listRef}\n role=\"presentation\"\n style={{ height: totalSize, position: 'relative', width: '100%' }}\n >\n {virtualItems.map((vRow) => {\n const item = listItems[vRow.index]\n if (!item) return null\n const rowStyle: CSSProperties = {\n // Items' `start` includes the virtualizer's scrollMargin\n // (the list's offset below the sticky header); subtract\n // it to position relative to the list container.\n transform: `translateY(${vRow.start - listOffset}px)`,\n height: vRow.size,\n }\n if (item.kind === 'group') {\n return (\n <GroupHeaderRow key={`group:${item.id}`} style={rowStyle}>\n {item.label}\n </GroupHeaderRow>\n )\n }\n return (\n <DataRow\n key={item.row.id}\n row={item.row}\n index={item.dataIndex}\n zebra={zebra}\n onRowClick={onRowClick}\n style={rowStyle}\n columnBorders={columnBorders}\n {...(rowWrapper ? { rowWrapper } : {})}\n />\n )\n })}\n </div>\n )}\n\n {/* Sentinel — visually empty, positioned just above the loader/end\n marker so it intersects ~200 px before the bottom. */}\n {!showEmpty && (\n <div ref={sentinelRef} aria-hidden=\"true\" style={{ height: 1, width: '100%' }} />\n )}\n\n {query.isFetchingNextPage ? <LoaderRow /> : null}\n {showEndMarker ? <EndMarker count={tableRowCount} /> : null}\n </div>\n )}\n\n {bodyAfter}\n </div>\n </TableScroller>\n </Table>\n )\n}\n\n/* ---------- Group heading ------------------------------------------------ */\n\nfunction GroupHeaderRow({ style, children }: { style: CSSProperties; children: ReactNode }) {\n return (\n <TableRow\n absolute\n style={style}\n className={cn(\n 'bg-surface-2 border-b border-rule',\n 'font-mono text-[11px] uppercase tracking-[0.06em] text-ink-3',\n )}\n >\n {/* One cell spanning the row — the heading labels the rows beneath it\n rather than any single column. */}\n <TableCell className=\"gap-2 text-inherit\">{children}</TableCell>\n </TableRow>\n )\n}\n\n/* ---------- Row ---------------------------------------------------------- */\n\ntype DataRowProps<TRow> = {\n row: Row<TRow>\n index: number\n zebra: boolean\n onRowClick?: DataTableProps<TRow>['onRowClick']\n style: CSSProperties\n rowWrapper?: (row: Row<TRow>, cells: ReactNode) => ReactNode\n columnBorders?: boolean\n}\n\nfunction DataRow<TRow>({\n row,\n index,\n zebra,\n onRowClick,\n style,\n rowWrapper,\n columnBorders = false,\n}: DataRowProps<TRow>) {\n const isAlt = zebra && index % 2 === 1\n const interactive = !!onRowClick\n\n const cells = row.getVisibleCells().map((cell) => {\n const meta = cell.column.columnDef.meta as\n | {\n align?: 'left' | 'right' | 'center'\n mono?: boolean\n ink?: boolean\n sticky?: 'left' | 'right' | false\n /** Extra classes merged onto the cell — e.g. to drop the default\n * horizontal padding for a narrow fixed-width gutter column. */\n cellClassName?: string\n }\n | undefined\n const cellSize = cell.column.getSize() || undefined\n const cellClassName = cn(\n columnBorders ? 'border-r border-rule-2' : undefined,\n meta?.cellClassName,\n )\n return (\n <TableCell\n key={cell.id}\n {...(cellSize !== undefined ? { width: cellSize } : {})}\n align={meta?.align ?? 'left'}\n {...(meta?.mono !== undefined ? { mono: meta.mono } : {})}\n {...(meta?.ink !== undefined ? { ink: meta.ink } : {})}\n {...(meta?.sticky ? { sticky: meta.sticky } : {})}\n {...(cellClassName ? { className: cellClassName } : {})}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n )\n })\n\n const body = rowWrapper ? rowWrapper(row, cells) : cells\n\n return (\n <TableRow\n absolute\n alt={isAlt}\n interactive={interactive}\n style={style}\n data-row-id={row.id}\n tabIndex={interactive ? 0 : undefined}\n onClick={interactive ? (e) => onRowClick?.(row.original, e) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onRowClick?.(row.original, e)\n }\n }\n : undefined\n }\n >\n {body}\n </TableRow>\n )\n}\n\n/* ---------- Loader & end marker ----------------------------------------- */\n\nfunction LoaderRow() {\n return (\n <div\n className={cn(\n 'flex items-center justify-center gap-3',\n 'h-8 font-mono text-[11px] tracking-[0.04em]',\n 'text-ink-4',\n )}\n >\n <span\n aria-hidden=\"true\"\n className=\"relative inline-block h-[2px] w-24 overflow-hidden rounded-pill bg-rule\"\n >\n <span className=\"absolute inset-0 w-[30%] rounded-pill bg-accent animate-[pt-slide_1.1s_ease-in-out_infinite]\" />\n </span>\n <span>loading more</span>\n <style>{`\n @keyframes pt-slide {\n 0% { transform: translateX(-110%); }\n 100% { transform: translateX(360%); }\n }\n `}</style>\n </div>\n )\n}\n\nfunction EndMarker({ count }: { count: number }) {\n return (\n <div\n className={cn(\n 'flex items-center justify-center',\n 'h-8 font-mono text-[10.5px] uppercase tracking-[0.08em]',\n 'text-ink-4',\n )}\n >\n end · {count.toLocaleString()} rows\n </div>\n )\n}\n","import type { ColumnDef } from '@tanstack/react-table'\nimport type { ReactNode } from 'react'\n\nexport type ActionsColumnOptions<TData> = {\n id?: string\n header?: string\n width?: number\n cell: (row: TData) => ReactNode\n}\n\n/**\n * Convenience builder for a non-sortable, right-aligned actions column.\n * Carries `meta.align: 'right'` so DataTable renders the header/cell\n * end-aligned even though the column has no value to sort by.\n */\nexport function makeActionsColumn<TData>({\n id = 'actions',\n header = '',\n width = 80,\n cell,\n}: ActionsColumnOptions<TData>): ColumnDef<TData> {\n return {\n id,\n header,\n size: width,\n enableSorting: false,\n meta: { align: 'right' as const },\n cell: ({ row }) => cell(row.original),\n }\n}\n","import {\n Button as AriaDateTrigger,\n Calendar,\n CalendarCell,\n CalendarGrid,\n CalendarGridBody,\n CalendarGridHeader,\n CalendarHeaderCell,\n Heading,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\n\n/* Shared calendar chrome for DatePicker + DateTimePicker. Internal — NOT\n barrelled from the package root. Both pickers render\n `<Popover><Dialog><CalendarSurface/>…</Dialog></Popover>`; DateTimePicker\n additionally renders a TimeField under the grid. Keeping the icons + grid\n here means the two pickers can never visually drift apart. */\n\n/* ----- icons (decorative) --------------------------------------------------- */\n\nexport function CalendarGlyph() {\n return (\n <svg aria-hidden viewBox=\"0 0 16 16\" className=\"size-4\" fill=\"none\">\n <rect\n x=\"2.5\"\n y=\"3.5\"\n width=\"11\"\n height=\"10\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path d=\"M2.5 6.5H13.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M5.5 2V5M10.5 2V5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\nfunction ChevronLeft() {\n return (\n <svg aria-hidden viewBox=\"0 0 12 12\" className=\"size-3\" fill=\"none\">\n <path\n d=\"M7.5 3L4.5 6L7.5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg aria-hidden viewBox=\"0 0 12 12\" className=\"size-3\" fill=\"none\">\n <path\n d=\"M4.5 3L7.5 6L4.5 9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\n/* --------------------------------------------------------------------------- */\n\n/** The `<Calendar>` block — month header (prev/next + heading) plus the day\n * grid. Rendered inside the picker's `<Dialog>`. Cosmetics-only; the\n * surrounding Popover/Dialog and any TimeField are the consumer's job. */\nexport function CalendarSurface() {\n return (\n <Calendar>\n <header className=\"flex items-center justify-between mb-3\">\n <AriaDateTrigger\n slot=\"previous\"\n aria-label=\"Previous month\"\n className={cn(\n 'size-7 rounded-md inline-flex items-center justify-center',\n 'text-ink-3 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <ChevronLeft />\n </AriaDateTrigger>\n <Heading className=\"font-sans font-medium text-[14px] text-ink tracking-[-0.01em]\" />\n <AriaDateTrigger\n slot=\"next\"\n aria-label=\"Next month\"\n className={cn(\n 'size-7 rounded-md inline-flex items-center justify-center',\n 'text-ink-3 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <ChevronRight />\n </AriaDateTrigger>\n </header>\n\n <CalendarGrid className=\"w-full border-collapse table-fixed\">\n <CalendarGridHeader>\n {(day) => (\n <CalendarHeaderCell\n className={cn(\n 'font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-4',\n 'pb-2 text-center',\n )}\n >\n {day}\n </CalendarHeaderCell>\n )}\n </CalendarGridHeader>\n <CalendarGridBody>\n {(date) => (\n <CalendarCell\n date={date}\n className={cn(\n // aspect-square + table-fixed makes each cell a perfect\n // square that scales with popover width.\n 'aspect-square flex items-center justify-center cursor-pointer',\n 'font-mono text-[12.5px] text-ink-2 rounded-[6px] outline-none',\n 'transition-[background-color,color] duration-150',\n 'data-[outside-month]:text-ink-4',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)]',\n 'data-[selected]:bg-accent data-[selected]:text-[#f0efe8]',\n 'data-[selected]:data-[hovered]:bg-accent-2',\n 'data-[disabled]:opacity-30 data-[disabled]:cursor-not-allowed',\n 'data-[unavailable]:line-through data-[unavailable]:text-ink-4',\n )}\n />\n )}\n </CalendarGridBody>\n </CalendarGrid>\n </Calendar>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n DatePicker as AriaDatePicker,\n type DatePickerProps as AriaDatePickerProps,\n Button as AriaDateTrigger,\n DateInput,\n DateSegment,\n type DateValue,\n Dialog,\n FieldError,\n Group,\n Label,\n Popover,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\nimport { CalendarGlyph, CalendarSurface } from './calendar-internals'\n\nexport type DatePickerProps<T extends DateValue> = AriaDatePickerProps<T> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n}\n\nexport function DatePicker<T extends DateValue>({\n label,\n description,\n errorMessage,\n size,\n appearance,\n className,\n ...props\n}: DatePickerProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n return (\n <AriaDatePicker\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <Group\n className={cn(\n // Box chrome on the wrapper; the DateInput inside carries padding +\n // font so the calendar trigger sits inside the same border + ring.\n styles.box(),\n 'flex items-center gap-1 pr-1',\n focusWithin,\n )}\n >\n <DateInput\n className={cn(\n 'flex-1 flex items-center min-w-0 text-ink',\n styles.content(),\n // Tabular alignment for date segments — overrides content's\n // font-sans on purpose.\n 'font-mono',\n )}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={cn(\n 'px-px tabular-nums outline-none select-none',\n 'data-[placeholder]:text-ink-4',\n 'data-[type=literal]:text-ink-4',\n // segment focus treatment: indigo fill, paper text\n 'data-[focused]:bg-accent data-[focused]:text-[#f0efe8] data-[focused]:rounded-[3px]',\n 'data-[disabled]:cursor-not-allowed',\n )}\n />\n )}\n </DateInput>\n\n <AriaDateTrigger\n className={cn(\n 'shrink-0 inline-flex items-center justify-center',\n 'size-7 rounded-md',\n 'text-ink-3 hover:text-ink hover:bg-surface-2',\n 'outline-none cursor-pointer',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <CalendarGlyph />\n </AriaDateTrigger>\n </Group>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n // Match the anchoring field's width exactly. `--trigger-width` is\n // set by RAC on the Popover when it's inside a DatePicker. Floor at\n // 18rem so the calendar stays legible when the input is unusually\n // narrow, and cap at 600px so it doesn't sprawl behind a very wide\n // field.\n 'w-[var(--trigger-width)] min-w-[18rem] max-w-[500px]',\n 'rounded-md border border-rule bg-surface p-4',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <Dialog className=\"outline-none\">\n <CalendarSurface />\n </Dialog>\n </Popover>\n </AriaDatePicker>\n )\n}\n","import { type ReactNode, useContext } from 'react'\nimport {\n DatePicker as AriaDatePicker,\n type DatePickerProps as AriaDatePickerProps,\n Button as AriaDateTrigger,\n TimeField as AriaTimeField,\n DateInput,\n DatePickerStateContext,\n DateSegment,\n type DateValue,\n Dialog,\n FieldError,\n Group,\n Label,\n Popover,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\nimport { CalendarGlyph, CalendarSurface } from '../date-picker/calendar-internals'\n\nexport type DateTimePickerProps<T extends DateValue> = AriaDatePickerProps<T> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n}\n\n/* Shared segment treatment for the inline DateInput + the popover TimeField,\n so the two never drift. Matches DatePicker's date segments. */\nconst segmentStyles = cn(\n 'px-px tabular-nums outline-none select-none',\n 'data-[placeholder]:text-ink-4',\n 'data-[type=literal]:text-ink-4',\n // segment focus treatment: indigo fill, paper text\n 'data-[focused]:bg-accent data-[focused]:text-[#f0efe8] data-[focused]:rounded-[3px]',\n 'data-[disabled]:cursor-not-allowed',\n)\n\n/* The popover's dedicated time editor. Reads the live DatePicker state so it\n stays in sync with both the inline segments and the calendar selection:\n `state.timeValue` / `state.setTimeValue` are RAC's split-out time portion of\n the combined value. Renders nothing until the picker actually has a time\n component (`hasTime` — i.e. granularity is finer than 'day'). */\nfunction PopoverTimeField({\n granularity,\n hourCycle,\n hideTimeZone,\n}: {\n granularity: 'hour' | 'minute' | 'second'\n hourCycle?: 12 | 24\n hideTimeZone?: boolean\n}) {\n const state = useContext(DatePickerStateContext)\n if (!state?.hasTime) return null\n return (\n <div className=\"mt-3 pt-3 border-t border-rule flex items-center justify-between gap-3\">\n <span className={fieldLabelStyles}>Time</span>\n <AriaTimeField\n aria-label=\"Time\"\n value={state.timeValue}\n onChange={(next) => {\n if (next) state.setTimeValue(next)\n }}\n granularity={granularity}\n {...(hourCycle !== undefined ? { hourCycle } : {})}\n {...(hideTimeZone !== undefined ? { hideTimeZone } : {})}\n >\n <DateInput\n className={cn(\n 'inline-flex items-center rounded-md border border-rule bg-surface px-2.5 py-1.5',\n 'font-mono text-[13px] text-ink',\n 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]',\n 'transition-[border-color,box-shadow] duration-150',\n )}\n >\n {(segment) => <DateSegment segment={segment} className={segmentStyles} />}\n </DateInput>\n </AriaTimeField>\n </div>\n )\n}\n\nexport function DateTimePicker<T extends DateValue>({\n label,\n description,\n errorMessage,\n size,\n appearance,\n className,\n // Time-aware defaults: minute precision, locale hour cycle, no timezone\n // segment, and keep the popover open after a calendar day-click so the user\n // can still set a time.\n granularity = 'minute',\n hideTimeZone = true,\n shouldCloseOnSelect = false,\n ...props\n}: DateTimePickerProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n // `granularity` is never 'day' here (defaulted to 'minute'); narrow for the\n // TimeField, which only accepts hour/minute/second.\n const timeGranularity = granularity === 'day' ? 'minute' : granularity\n const { hourCycle } = props\n return (\n <AriaDatePicker\n {...props}\n granularity={granularity}\n hideTimeZone={hideTimeZone}\n shouldCloseOnSelect={shouldCloseOnSelect}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <Group\n className={cn(\n // Box chrome on the wrapper; the DateInput inside carries padding +\n // font so the calendar trigger sits inside the same border + ring.\n styles.box(),\n 'flex items-center gap-1 pr-1',\n focusWithin,\n )}\n >\n <DateInput\n className={cn(\n 'flex-1 flex items-center min-w-0 text-ink',\n styles.content(),\n // Tabular alignment for date/time segments — overrides content's\n // font-sans on purpose.\n 'font-mono',\n )}\n >\n {(segment) => <DateSegment segment={segment} className={segmentStyles} />}\n </DateInput>\n\n <AriaDateTrigger\n className={cn(\n 'shrink-0 inline-flex items-center justify-center',\n 'size-7 rounded-md',\n 'text-ink-3 hover:text-ink hover:bg-surface-2',\n 'outline-none cursor-pointer',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <CalendarGlyph />\n </AriaDateTrigger>\n </Group>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n\n <Popover\n offset={6}\n className={cn(\n // Match the anchoring field's width exactly. `--trigger-width` is\n // set by RAC on the Popover when it's inside a DatePicker. Floor at\n // 18rem so the calendar stays legible when the input is unusually\n // narrow, and cap at 500px so it doesn't sprawl behind a very wide\n // field.\n 'w-[var(--trigger-width)] min-w-[18rem] max-w-[500px]',\n 'rounded-md border border-rule bg-surface p-4',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n <Dialog className=\"outline-none\">\n <CalendarSurface />\n <PopoverTimeField\n granularity={timeGranularity}\n hideTimeZone={hideTimeZone}\n {...(hourCycle !== undefined ? { hourCycle } : {})}\n />\n </Dialog>\n </Popover>\n </AriaDatePicker>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { ChannelIcon } from '../channel-icon'\nimport type { DraftReviewOutcome } from '../draft-message-composer'\n\n/* =========================================================================\n DraftMessageCard — the compact entry point to reviewing an agent-drafted\n outbound message: channel glyph, eyebrow, headline (subject or first body\n line), the To line, and one action. Pure chrome — it neither fetches nor\n decides anything, so it can sit in a chat flow, a record page, a task list\n or a custom component alike. DraftMessageReview is the connected wrapper;\n reach for this one only when the host already holds the draft.\n\n Once decided the action is replaced by a status label rather than removed:\n the row keeps its shape, and the reader keeps the record of what happened.\n ========================================================================= */\n\nexport const draftMessageCardStyles = tv({\n slots: {\n root: [\n 'flex items-center gap-2.5 rounded-md border border-accent/40 px-3 py-2',\n 'bg-[color-mix(in_oklab,var(--color-accent)_6%,var(--color-surface))]',\n ],\n icon: [\n 'grid size-8 shrink-0 place-items-center rounded-full text-accent',\n 'bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n ],\n body: 'min-w-0 flex-1',\n eyebrow: 'font-mono text-[10px] uppercase tracking-[0.08em] text-accent',\n title: 'truncate text-[13px] font-medium text-ink',\n recipients: 'truncate text-[12px] text-ink-3',\n action: [\n 'shrink-0 cursor-pointer rounded-sm border border-accent/50 px-2.5 py-1',\n 'font-mono text-[11px] text-accent outline-none',\n 'hover:bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:cursor-default disabled:opacity-50',\n ],\n outcome: 'shrink-0 font-mono text-[11px] text-ink-3',\n },\n})\n\nconst styles = draftMessageCardStyles()\n\n/** Terminal-state wording. `failed` is deliberately explicit: the human DID\n * approve the send, and hiding that behind a bare \"Failed\" reads as though\n * the review itself failed. */\nexport const DRAFT_OUTCOME_LABEL: Record<DraftReviewOutcome, string> = {\n sent: 'Sent',\n rejected: 'Rejected',\n failed: 'Approved, but delivery failed',\n}\n\nexport interface DraftMessageCardProps {\n /** Channel slug driving the glyph — see channelIcon. */\n channel: string\n /** Headline: the conversation subject, or the draft's first body line. */\n title: string\n /** Rendered as \"To a, b\". Empty or omitted hides the row. */\n recipients?: string[]\n /** Default 'Draft — awaiting review'. */\n eyebrow?: ReactNode\n /** Default 'Review'. */\n previewLabel?: string\n /** Terminal outcome. Set ⇒ the action is replaced by its status label. */\n outcome?: DraftReviewOutcome | null\n onPreview?: () => void\n isPreviewDisabled?: boolean\n className?: string\n}\n\nexport function DraftMessageCard({\n channel,\n title,\n recipients,\n eyebrow = 'Draft — awaiting review',\n previewLabel = 'Review',\n outcome,\n onPreview,\n isPreviewDisabled = false,\n className,\n}: DraftMessageCardProps) {\n return (\n <div className={cn(styles.root(), className)}>\n <span className={styles.icon()}>\n <ChannelIcon channel={channel} />\n </span>\n <div className={styles.body()}>\n <p className={styles.eyebrow()}>{eyebrow}</p>\n <p className={styles.title()}>{title}</p>\n {recipients && recipients.length > 0 ? (\n <p className={styles.recipients()}>To {recipients.join(', ')}</p>\n ) : null}\n </div>\n {outcome ? (\n <span className={styles.outcome()}>{DRAFT_OUTCOME_LABEL[outcome]}</span>\n ) : (\n <AriaButton\n onPress={onPreview ?? (() => {})}\n isDisabled={isPreviewDisabled}\n className={styles.action()}\n >\n {previewLabel}\n </AriaButton>\n )}\n </div>\n )\n}\n","import type { ConversationClient } from '@proteos/sdk'\n\nimport type { DraftMessageClient } from './types'\n\n/**\n * One-liner adapter from the sdk ConversationClient (web app:\n * `useSdk().conversation`; custom components: `useSdk().conversations`) to\n * the composer's injected client. Type-only sdk import — no runtime coupling.\n */\nexport function createDraftMessageClient(\n conversation: Pick<ConversationClient, 'messages' | 'conversations' | 'connections'>,\n): DraftMessageClient {\n return {\n getMessage: (messageId) => conversation.messages.get(messageId),\n getConversation: (conversationId) => conversation.conversations.get(conversationId),\n updateDraft: (messageId, patch) => conversation.messages.updateDraft(messageId, patch),\n sendDraft: (messageId) => conversation.messages.sendDraft(messageId),\n rejectDraft: (messageId) => conversation.messages.rejectDraft(messageId),\n searchRecipients: async (connectionId, q) =>\n (\n await conversation.connections.listContactAddresses(connectionId, {\n page_size: 100,\n ...(q ? { q } : {}),\n })\n ).data,\n }\n}\n","import { useSyncExternalStore } from 'react'\n\n/* =========================================================================\n Draft-actions registry — how EXTERNAL controls (a task-list row's\n \"Execute\" button, any sibling in the same realm) drive a mounted\n DraftMessageComposer without a ref. The composer registers its imperative\n handlers per message id on mount and unregisters on unmount; callers grab\n them with useDraftMessageActions and get real promises back. Outcomes\n additionally flow through the outcome store + onSent/onRejected.\n\n Same per-JS-realm scope as the outcome store (per page in the web app,\n per iframe in the component runtime). Multiple composers mounted for one\n message id: the last-registered wins.\n ========================================================================= */\n\nexport interface DraftMessageActions {\n /** Persists dirty edits, then delivers — the internal Send button's path. */\n send(): Promise<void>\n /** Declines the draft. Bypasses the inline confirm — the external UI owns confirmation. */\n reject(): Promise<void>\n /** Persists the current edits without sending. */\n saveDraft(): Promise<void>\n /** True while the composer is saving/sending/rejecting — disable external buttons. */\n isBusy: boolean\n}\n\nconst actionsByMessageId = new Map<string, DraftMessageActions>()\nconst listenersByMessageId = new Map<string, Set<() => void>>()\n\nfunction notify(messageId: string): void {\n for (const listener of listenersByMessageId.get(messageId) ?? []) listener()\n}\n\n/**\n * Registers a composer's handlers for its message id; returns the\n * unregister. Re-register (a fresh object) whenever isBusy flips so\n * subscribers re-render. Unregistering only clears the entry while it still\n * owns it (last-registered wins across overlapping mounts).\n */\nexport function registerDraftMessageActions(\n messageId: string,\n actions: DraftMessageActions,\n): () => void {\n actionsByMessageId.set(messageId, actions)\n notify(messageId)\n return () => {\n if (actionsByMessageId.get(messageId) === actions) {\n actionsByMessageId.delete(messageId)\n notify(messageId)\n }\n }\n}\n\n/**\n * The mounted composer's actions for this draft, or null while none is\n * mounted (disable the external button).\n */\nexport function useDraftMessageActions(messageId: string): DraftMessageActions | null {\n return useSyncExternalStore(\n (listener) => {\n let listeners = listenersByMessageId.get(messageId)\n if (!listeners) {\n listeners = new Set()\n listenersByMessageId.set(messageId, listeners)\n }\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n if (listeners.size === 0) listenersByMessageId.delete(messageId)\n }\n },\n () => actionsByMessageId.get(messageId) ?? null,\n () => null,\n )\n}\n\n/** Test-only escape hatch — clears every registration and listener. */\nexport function __resetDraftMessageActions(): void {\n actionsByMessageId.clear()\n listenersByMessageId.clear()\n}\n","import { type KeyboardEvent, type ReactNode, useRef, useState } from 'react'\nimport { type Key, Label, ListBox, ListBoxItem, Popover } from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n FieldCaret,\n type FieldSize,\n fieldChipPadding,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldMinHeight,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n MultiSelect — pick many from a list. Trigger shows selected items as\n removable chips; popover hosts a multi-select ListBox.\n\n Each option accepts a `content: ReactNode` so consumers can render plain\n text, a Badge, an icon + label, or anything else — and the same content\n is reused inside the selected chip.\n ========================================================================= */\n\nexport type MultiSelectOption<T extends Key = Key> = {\n id: T\n /** Plain-text label — used as the option's accessible name and fallback\n * when `content` isn't provided. */\n label: string\n /** Optional rich render. Applied to BOTH the listbox row and the selected\n * chip (wrapped by the chip's × button). Falls back to `label`. */\n content?: ReactNode\n isDisabled?: boolean\n}\n\nexport type MultiSelectProps<T extends Key = Key> = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n options: ReadonlyArray<MultiSelectOption<T>>\n /** Controlled selection. Pass a `Set<T>` or any `Iterable<T>`. */\n selectedKeys: Iterable<T>\n onSelectionChange: (keys: Set<T>) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Hide already-selected options from the dropdown. Removal then only\n * happens via the chip × in the trigger. Default `false` (selected\n * options stay visible and can be toggled off from the listbox). */\n hideSelectedOptions?: boolean\n /** Render a search input at the top of the popover that filters options\n * by label (case-insensitive substring). Default `false`. */\n isSearchable?: boolean\n /** Fires as the search text changes — lets consumers drive a server-side\n * directory search alongside the local filter. */\n onSearchChange?: (needle: string) => void\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n className?: string\n}\n\nexport function MultiSelect<T extends Key>({\n label,\n description,\n errorMessage,\n placeholder = 'Select…',\n options,\n selectedKeys,\n onSelectionChange,\n isDisabled = false,\n isInvalid = false,\n hideSelectedOptions = false,\n isSearchable = false,\n onSearchChange,\n size = 'md',\n appearance,\n className,\n}: MultiSelectProps<T>) {\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n // Cell mode sits under the table row so the border reads clean instead of\n // merging with the row gridline.\n const minHeight = appearance === 'cell' ? 'min-h-[29px]' : fieldMinHeight[size]\n const [isOpen, setIsOpen] = useState(false)\n const [search, setSearch] = useState('')\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const selectedSet = new Set(selectedKeys)\n const selectedOptions = options.filter((o) => selectedSet.has(o.id))\n const needle = search.trim().toLowerCase()\n const listboxOptions = (\n hideSelectedOptions ? options.filter((o) => !selectedSet.has(o.id)) : options\n ).filter((o) => needle === '' || o.label.toLowerCase().includes(needle))\n\n const updateSearch = (next: string) => {\n setSearch(next)\n onSearchChange?.(next)\n }\n const openPopover = (open: boolean) => {\n setIsOpen(open)\n if (!open && search !== '') updateSearch('')\n }\n\n const remove = (id: T) => {\n const next = new Set(selectedSet)\n next.delete(id)\n onSelectionChange(next)\n }\n\n const onTriggerKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (isDisabled) return\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n openPopover(true)\n }\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <div\n ref={triggerRef}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-disabled={isDisabled || undefined}\n aria-invalid={isInvalid || undefined}\n tabIndex={isDisabled ? -1 : 0}\n onClick={() => !isDisabled && openPopover(!isOpen)}\n onKeyDown={onTriggerKeyDown}\n data-invalid={isInvalid || undefined}\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex flex-wrap items-center gap-1.5 cursor-pointer',\n minHeight,\n fieldChipPadding[size],\n 'pr-2',\n // Let focus-within light up the ring on both the trigger and any\n // chip's remove button without any extra JS.\n focusWithin,\n )}\n >\n {selectedOptions.length === 0 ? (\n // No vertical padding — wrapper's p-1.5 + min-h-[size] govern the\n // overall height so it matches the Input/Select trigger at the same\n // size.\n <span className={cn('text-ink-4 font-sans px-1', fieldTextStyles[size])}>\n {placeholder}\n </span>\n ) : (\n selectedOptions.map((o) => (\n <Chip key={o.id} onRemove={() => remove(o.id)} isDisabled={isDisabled}>\n {o.content ?? o.label}\n </Chip>\n ))\n )}\n <span className=\"ml-auto pr-1\">\n <FieldCaret />\n </span>\n </div>\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n\n <Popover\n isOpen={isOpen}\n onOpenChange={openPopover}\n triggerRef={triggerRef}\n offset={6}\n placement=\"bottom start\"\n className={cn(\n 'w-[var(--trigger-width)]',\n 'rounded-md border border-rule bg-surface p-1',\n 'shadow-[var(--shadow-raised)]',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1',\n 'exiting:animate-out exiting:fade-out-0 exiting:slide-out-to-top-1',\n )}\n >\n {isSearchable ? (\n <div className=\"border-b border-rule-2 px-1 pb-1 mb-1\">\n <input\n // biome-ignore lint/a11y/noAutofocus: the popover just opened by explicit user action — focus belongs in its search box.\n autoFocus\n value={search}\n onChange={(e) => updateSearch(e.target.value)}\n placeholder=\"Search…\"\n aria-label=\"Search options\"\n className={cn(\n 'w-full bg-transparent outline-none rounded-[6px] px-2 py-1.5',\n 'font-sans text-[13px] text-ink placeholder:text-ink-4',\n )}\n />\n </div>\n ) : null}\n <ListBox\n aria-label={typeof label === 'string' ? label : 'Options'}\n selectionMode=\"multiple\"\n selectedKeys={selectedSet}\n onSelectionChange={(keys) => {\n if (keys === 'all') {\n onSelectionChange(new Set(options.map((o) => o.id)))\n return\n }\n onSelectionChange(keys as Set<T>)\n }}\n className=\"outline-none max-h-72 overflow-auto\"\n renderEmptyState={() => (\n <div className={cn('px-3 py-2', fieldHintStyles)}>\n {needle !== '' ? 'No matches' : 'All options selected'}\n </div>\n )}\n >\n {listboxOptions.map((option) => (\n <ListBoxItem\n key={option.id}\n id={option.id}\n textValue={option.label}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n className={cn(\n 'group flex items-center gap-2.5',\n 'rounded-[6px] px-3 py-2 text-[14px] text-ink-2',\n 'cursor-pointer outline-none select-none',\n 'data-[hovered]:bg-surface-2 data-[hovered]:text-ink',\n 'data-[focused]:bg-surface-2 data-[focused]:text-ink',\n 'data-[selected]:bg-surface-3 data-[selected]:text-ink',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n )}\n >\n <Checkmark />\n <span className=\"flex-1 truncate\">{option.content ?? option.label}</span>\n </ListBoxItem>\n ))}\n </ListBox>\n </Popover>\n </div>\n )\n}\n\n/* =========================================================================\n Internal: selected chip with × remove button.\n Minimal chrome (sand bg, hairline border, rounded-6) so that rich content\n like a <Badge/> still reads cleanly inside it.\n ========================================================================= */\n\nfunction Chip({\n children,\n onRemove,\n isDisabled,\n}: {\n children: ReactNode\n onRemove: () => void\n isDisabled: boolean\n}) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5',\n 'pl-2 pr-1 py-0.5 rounded-[6px]',\n 'bg-surface-2 border border-rule',\n 'font-sans text-[13px] text-ink',\n )}\n >\n <span className=\"inline-flex items-center\">{children}</span>\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={isDisabled}\n onClick={(e) => {\n // Keep the click from bubbling to the trigger div (which would\n // toggle the popover open/closed).\n e.stopPropagation()\n onRemove()\n }}\n className={cn(\n 'inline-flex items-center justify-center shrink-0',\n 'size-4 rounded-[3px]',\n 'text-ink-3 hover:text-ink hover:bg-surface-3 cursor-pointer',\n 'outline-none focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n )\n}\n\n/* =========================================================================\n Internal: empty box → indigo tick when the row is selected.\n ========================================================================= */\n\nfunction Checkmark() {\n return (\n <span\n aria-hidden\n className={cn(\n 'relative inline-flex items-center justify-center shrink-0',\n 'size-[16px] rounded-[3px] border border-ink-4 bg-surface',\n 'transition-[background-color,border-color] duration-150',\n 'group-data-[selected]:bg-ink group-data-[selected]:border-ink',\n )}\n >\n <svg\n viewBox=\"0 0 12 12\"\n className={cn(\n 'size-3 text-surface transition-opacity duration-150',\n 'opacity-0 group-data-[selected]:opacity-100',\n )}\n aria-hidden\n >\n <path\n d=\"M2.5 6.25 5 8.75 9.5 3.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </span>\n )\n}\n","import type { ContactAddress, SendRecipient } from '@proteos/sdk'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nimport type { SearchRecipients } from '../message-composer/message-composer'\nimport { MultiSelect, type MultiSelectOption } from '../multi-select/multi-select'\n\n/** Debounce for the injected directory search (`q`). */\nconst SEARCH_DEBOUNCE_MS = 250\n\n/* =========================================================================\n RecipientSelect — a searchable multi-select over the contact-address\n directory a connection can reach, emitting SendRecipient[] (all\n kind=contact-address). Backs the composer's To/Cc/Bcc rows. Typing filters\n the loaded options locally AND (debounced) runs the injected\n `searchRecipients` server-side, so parties beyond the first page are\n findable; already-selected ids are always included so their chips render\n even when off the current result page. Fetch-agnostic: the host injects\n the search; stale responses are ignored and a failed search keeps the\n previous options (best-effort).\n ========================================================================= */\n\nexport interface RecipientSelectProps {\n connectionId: string\n searchRecipients: SearchRecipients\n value: SendRecipient[]\n onChange: (next: SendRecipient[]) => void\n placeholder?: string\n}\n\nexport function RecipientSelect({\n connectionId,\n searchRecipients,\n value,\n onChange,\n placeholder,\n}: RecipientSelectProps) {\n const [search, setSearch] = useState('')\n const [debouncedSearch, setDebouncedSearch] = useState('')\n useEffect(() => {\n const handle = window.setTimeout(() => setDebouncedSearch(search.trim()), SEARCH_DEBOUNCE_MS)\n return () => window.clearTimeout(handle)\n }, [search])\n\n const [addresses, setAddresses] = useState<ContactAddress[]>([])\n // Monotonic request counter — only the latest in-flight search may land.\n const requestIdRef = useRef(0)\n useEffect(() => {\n if (connectionId === '') return\n const requestId = ++requestIdRef.current\n searchRecipients(connectionId, debouncedSearch)\n .then((results) => {\n if (requestId === requestIdRef.current) setAddresses(results)\n })\n .catch(() => {\n // Best-effort directory: keep the previous options on failure.\n })\n }, [connectionId, debouncedSearch, searchRecipients])\n\n const options = useMemo<MultiSelectOption<string>[]>(() => {\n const map = new Map<string, MultiSelectOption<string>>()\n for (const recipient of value) {\n map.set(recipient.external_id, { id: recipient.external_id, label: recipient.external_id })\n }\n for (const address of addresses) {\n const identifier = address.raw_value || address.value\n map.set(identifier, {\n id: identifier,\n label: address.name || identifier,\n })\n }\n return Array.from(map.values())\n }, [addresses, value])\n\n // The composer renders the row label (inline mono, like the Via/Subject\n // rows) — none here.\n return (\n <MultiSelect\n size=\"sm\"\n isSearchable\n onSearchChange={setSearch}\n {...(placeholder !== undefined ? { placeholder } : {})}\n options={options}\n selectedKeys={value.map((recipient) => recipient.external_id)}\n onSelectionChange={(keys) =>\n onChange(\n Array.from(keys).map((id) => ({\n kind: 'contact-address' as const,\n external_id: String(id),\n })),\n )\n }\n />\n )\n}\n","import type { ContactAddress, SendRecipient } from '@proteos/sdk'\nimport { Paperclip, SendHorizontal } from 'lucide-react'\nimport { type KeyboardEvent, type ReactNode, useCallback, useEffect, useRef, useState } from 'react'\nimport { Button as AriaButton, FileTrigger } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { AttachmentChip } from '../attachment-chip/attachment-chip'\nimport { Button } from '../button/button'\nimport { RecipientSelect } from '../recipient-select/recipient-select'\nimport { Select } from '../select/select'\n\n/* =========================================================================\n MessageComposer — shared chrome (Field contract: rule border, inset\n shadow, accent + halo on focus), channel-aware behavior:\n chat : ↵ send, ⇧↵ newline\n email : subject row, ⌘↵ send\n The active binding is printed as a mono hint next to send. A failed send\n NEVER clears the input. Disabled states replace the composer with honest\n copy.\n\n Fetch-agnostic: text + subject are controlled (`value`/`onValueChange` —\n draft persistence lives with the host), the To/Cc/Bcc directory search is\n injected (`searchRecipients`), and attachments are presentational — the\n host owns its upload queue and maps it onto `ComposerAttachment`.\n ========================================================================= */\n\n/** Controlled text + subject. Draft persistence lives with the host. */\nexport interface ComposerValue {\n text: string\n subject?: string\n}\n\nexport interface ComposerSendInput {\n text: string\n subject?: string\n /** Only when the composer owns addressing (`showToField` — compose). */\n to?: SendRecipient[]\n cc?: SendRecipient[]\n bcc?: SendRecipient[]\n}\n\n/** The compose view's connection switcher, rendered as the composer's top row. */\nexport interface ComposerConnectionPicker {\n options: ReadonlyArray<{\n id: string\n /** Rich render (channel icon + name); `textValue` carries the plain name. */\n label: ReactNode\n textValue: string\n }>\n selectedId: string\n onSelect: (connectionId: string) => void\n}\n\n/** Presentational attachment chip input — hosts map their own upload model onto it. */\nexport interface ComposerAttachment {\n localId: string\n name: string\n /** Bytes when known — server-loaded attachments may not know their size. */\n sizeInBytes?: number\n contentType?: string\n status: 'uploading' | 'ready' | 'error'\n errorMessage?: string\n}\n\n/** Directory search backing the To/Cc/Bcc pickers — injected per host (the lib never fetches). */\nexport type SearchRecipients = (connectionId: string, q: string) => Promise<ContactAddress[]>\n\n/** Per-file cap for conversation-channel sends (the backend rejects larger\n * with `attachment_too_large`; Slack additionally caps at 10 files/message,\n * surfaced through the send error line). */\nexport const MAX_COMPOSER_ATTACHMENT_BYTES = 25 * 1024 * 1024\n\n/** Outer box chrome — exported so hosts can re-apply the same shell. */\nexport const messageComposerStyles = tv({\n base: [\n 'rounded-[10px] border border-rule bg-surface shadow-[var(--shadow-inset)]',\n 'transition-[border-color,box-shadow] duration-150',\n 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]',\n ],\n})\n\n/** Shared row-label chrome: fixed width so the Via/To/Cc/Bcc controls all\n * start at the same x (Subject keeps its own natural label). */\nconst ROW_LABEL = 'w-7 shrink-0 font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4'\n\nexport interface MessageComposerProps {\n mode: 'chat' | 'email'\n /** Controlled text+subject (draft persistence lives with the host). */\n value: ComposerValue\n onValueChange: (value: ComposerValue) => void\n placeholder: string\n /** Email replies arrive with `re: <subject>` prefilled. */\n subjectPrefill?: string\n /** When true (email mode), the Subject row renders the subject as static\n * text — reply drafts where the subject is derived from the thread and\n * must not be edited. The Cc/Bcc reveal stays functional. Default false. */\n isSubjectReadOnly?: boolean\n /** When set, the composer is replaced by this banner (ended conversation,\n * read-only transcript). */\n disabledReason?: ReactNode\n onSend: (input: ComposerSendInput) => Promise<unknown>\n /** Connection whose directory backs the To/Cc/Bcc pickers. */\n connectionId?: string\n /** Compose only: a connection switcher as the composer's top row. */\n connectionPicker?: ComposerConnectionPicker\n /** Compose only: the composer owns addressing — a To recipient row; the\n * picks arrive on `ComposerSendInput.to` and gate send. */\n showToField?: boolean\n /** Email originate only: reveal Cc/Bcc recipient rows. */\n showRecipientFields?: boolean\n /** Required for the To/Cc/Bcc rows to render (with `connectionId`). */\n searchRecipients?: SearchRecipients\n /** Controlled-if-provided recipients; internal state otherwise. Internal\n * recipient state resets when `connectionId` changes and clears after a\n * successful send — controlled parents own their own resets. */\n to?: SendRecipient[]\n cc?: SendRecipient[]\n bcc?: SendRecipient[]\n onToChange?: (next: SendRecipient[]) => void\n onCcChange?: (next: SendRecipient[]) => void\n onBccChange?: (next: SendRecipient[]) => void\n /** The host-owned pending queue, rendered as chips above the input. */\n attachments?: ComposerAttachment[]\n /** When set, the paperclip renders and picked files flow to the host. */\n onAddFiles?: (files: File[]) => void\n onRemoveAttachment?: (localId: string) => void\n /** True while any attachment is still uploading — blocks send. */\n hasUploadingAttachments?: boolean\n /**\n * Default true. When false: the send button AND the keybinding hint are\n * hidden and the ↵/⌘↵ submit combo is disabled — submission is fully\n * delegated to an external driver (e.g. the draft review surface).\n */\n showSendButton?: boolean\n /** Composes onto the outer box chrome (`messageComposerStyles`). */\n className?: string\n /** Composes onto the body textarea — review surfaces override the default\n * `max-h-48` growth cap (e.g. `max-h-[55dvh]`) so a whole email fits. */\n bodyClassName?: string\n}\n\nexport function MessageComposer({\n mode,\n value,\n onValueChange,\n placeholder,\n subjectPrefill,\n isSubjectReadOnly,\n disabledReason,\n onSend,\n connectionId,\n connectionPicker,\n showToField,\n showRecipientFields,\n searchRecipients,\n to: toProp,\n cc: ccProp,\n bcc: bccProp,\n onToChange,\n onCcChange,\n onBccChange,\n attachments,\n onAddFiles,\n onRemoveAttachment,\n hasUploadingAttachments,\n showSendButton,\n className,\n bodyClassName,\n}: MessageComposerProps) {\n const [isSending, setIsSending] = useState(false)\n const [sendError, setSendError] = useState<string | null>(null)\n const [internalTo, setInternalTo] = useState<SendRecipient[]>([])\n const [internalCc, setInternalCc] = useState<SendRecipient[]>([])\n const [internalBcc, setInternalBcc] = useState<SendRecipient[]>([])\n const [showCcBcc, setShowCcBcc] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n // Size-to-content on every text change — including a seeded value (a loaded\n // draft body), which never fires onChange.\n // biome-ignore lint/correctness/useExhaustiveDependencies: value.text is the trigger — the height reads the DOM, not the value.\n useEffect(() => {\n if (textareaRef.current) autoGrow(textareaRef.current)\n }, [value.text])\n\n // Controlled-if-provided, per group: a provided prop wins over internal\n // state; setters mirror into internal state only when uncontrolled.\n const to = toProp ?? internalTo\n const cc = ccProp ?? internalCc\n const bcc = bccProp ?? internalBcc\n const setTo = (next: SendRecipient[]) => {\n if (toProp === undefined) setInternalTo(next)\n onToChange?.(next)\n }\n const setCc = (next: SendRecipient[]) => {\n if (ccProp === undefined) setInternalCc(next)\n onCcChange?.(next)\n }\n const setBcc = (next: SendRecipient[]) => {\n if (bccProp === undefined) setInternalBcc(next)\n onBccChange?.(next)\n }\n\n // The recipient rows need a directory to search — both halves, or nothing.\n const directory =\n searchRecipients !== undefined && connectionId ? { searchRecipients, connectionId } : undefined\n const canPickRecipients =\n mode === 'email' && (showRecipientFields ?? false) && directory !== undefined\n const needsTo = (showToField ?? false) && directory !== undefined\n const isSendButtonShown = showSendButton ?? true\n\n // INTERNAL recipients belong to one connection's directory — switching (the\n // compose picker) drops them. Controlled parents own their own resets.\n // biome-ignore lint/correctness/useExhaustiveDependencies: connectionId is the trigger — the pickers must reset exactly when the directory changes.\n useEffect(() => {\n setInternalTo([])\n setInternalCc([])\n setInternalBcc([])\n }, [connectionId])\n\n const subject = value.subject ?? subjectPrefill ?? ''\n const readyCount = (attachments ?? []).filter(\n (attachment) => attachment.status === 'ready',\n ).length\n const canSend =\n (value.text.trim() !== '' || readyCount > 0) &&\n (mode !== 'email' || subject.trim() !== '') &&\n (!needsTo || to.length > 0) &&\n !(hasUploadingAttachments ?? false)\n\n const submit = useCallback(async () => {\n if (!canSend || isSending) return\n setIsSending(true)\n setSendError(null)\n try {\n await onSend({\n text: value.text.trim(),\n ...(mode === 'email' ? { subject: subject.trim() } : {}),\n ...(needsTo ? { to } : {}),\n ...(cc.length > 0 ? { cc } : {}),\n ...(bcc.length > 0 ? { bcc } : {}),\n })\n // Success: hand the cleared value back (subject key omitted) and drop\n // INTERNAL recipients only — controlled recipients stay the parent's.\n onValueChange({ text: '' })\n setInternalTo([])\n setInternalCc([])\n setInternalBcc([])\n } catch (error) {\n // Never clear the input on failure — the text is the user's work.\n setSendError(error instanceof Error ? error.message : 'Send failed')\n } finally {\n setIsSending(false)\n }\n }, [canSend, isSending, onSend, value.text, mode, subject, needsTo, to, cc, bcc, onValueChange])\n\n if (disabledReason) {\n return (\n <div className=\"px-[18px] py-3\">\n <p\n className={cn(\n 'rounded-[10px] border border-rule bg-surface-2 px-3.5 py-2.5',\n 'text-[12.5px] text-ink-3 text-center',\n )}\n >\n {disabledReason}\n </p>\n </div>\n )\n }\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isSendButtonShown) return\n const isSendCombo =\n mode === 'email'\n ? event.key === 'Enter' && (event.metaKey || event.ctrlKey)\n : event.key === 'Enter' && !event.shiftKey\n if (isSendCombo) {\n event.preventDefault()\n void submit()\n }\n }\n\n const ccBccReveal =\n canPickRecipients && !showCcBcc ? (\n <AriaButton\n onPress={() => setShowCcBcc(true)}\n className=\"shrink-0 font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4 cursor-pointer outline-none hover:text-ink-3 focus-visible:shadow-[var(--shadow-focus)] rounded\"\n >\n Cc/Bcc\n </AriaButton>\n ) : null\n\n return (\n <div className=\"px-[18px] pb-3.5 pt-1\">\n <div className={cn(messageComposerStyles(), className)}>\n {connectionPicker ? (\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>Via</span>\n <Select\n aria-label=\"Connection\"\n size=\"sm\"\n options={connectionPicker.options.map((option) => ({\n id: option.id,\n label: option.label,\n textValue: option.textValue,\n }))}\n selectedKey={connectionPicker.selectedId}\n onSelectionChange={(key) => connectionPicker.onSelect(String(key))}\n triggerClassName=\"font-mono text-[11px]\"\n popoverClassName=\"min-w-[var(--trigger-width)] w-max max-w-80\"\n />\n </div>\n ) : null}\n\n {mode === 'email' ? (\n isSubjectReadOnly ? (\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">\n Subject\n </span>\n <span className=\"flex-1 min-w-0 truncate text-[13px] text-ink\">{subject}</span>\n {ccBccReveal}\n </div>\n ) : (\n <label className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">\n Subject\n </span>\n <input\n value={subject}\n onChange={(event) => onValueChange({ ...value, subject: event.target.value })}\n placeholder=\"Subject\"\n className=\"flex-1 bg-transparent outline-none text-[13px] text-ink placeholder:text-ink-4\"\n />\n {ccBccReveal}\n </label>\n )\n ) : null}\n\n {needsTo && directory ? (\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>To</span>\n <div className=\"flex-1 min-w-0\">\n <RecipientSelect\n connectionId={directory.connectionId}\n searchRecipients={directory.searchRecipients}\n placeholder=\"Pick recipients…\"\n value={to}\n onChange={setTo}\n />\n </div>\n </div>\n ) : null}\n\n {canPickRecipients && directory && showCcBcc ? (\n <>\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>Cc</span>\n <div className=\"flex-1 min-w-0\">\n <RecipientSelect\n connectionId={directory.connectionId}\n searchRecipients={directory.searchRecipients}\n placeholder=\"Add cc…\"\n value={cc}\n onChange={setCc}\n />\n </div>\n </div>\n <div className=\"flex items-center gap-2 border-b border-rule-2 px-3.5 py-1.5\">\n <span className={ROW_LABEL}>Bcc</span>\n <div className=\"flex-1 min-w-0\">\n <RecipientSelect\n connectionId={directory.connectionId}\n searchRecipients={directory.searchRecipients}\n placeholder=\"Add bcc…\"\n value={bcc}\n onChange={setBcc}\n />\n </div>\n </div>\n </>\n ) : null}\n\n {attachments && attachments.length > 0 ? (\n // Single horizontally-scrollable row so the chips never grow the composer tall.\n <div className=\"flex gap-1.5 overflow-x-auto px-3.5 pt-2 pb-0.5\">\n {attachments.map((attachment) => (\n <AttachmentChip\n key={attachment.localId}\n name={attachment.name}\n status={attachment.status}\n {...(attachment.sizeInBytes !== undefined\n ? { sizeInBytes: attachment.sizeInBytes }\n : {})}\n {...(attachment.contentType ? { contentType: attachment.contentType } : {})}\n {...(attachment.errorMessage ? { errorMessage: attachment.errorMessage } : {})}\n {...(onRemoveAttachment\n ? { onRemove: () => onRemoveAttachment(attachment.localId) }\n : {})}\n className=\"shrink-0\"\n />\n ))}\n </div>\n ) : null}\n\n {/* Stacked like Ask Proteos: the input is its own full-width row (typing\n grows it upward), the actions sit in a row beneath — clip on the left,\n send on the right — so the text always starts at the box's left edge. */}\n <div className=\"flex flex-col gap-2 px-3.5 py-2\">\n <textarea\n ref={textareaRef}\n value={value.text}\n placeholder={placeholder}\n rows={1}\n onChange={(event) => onValueChange({ ...value, text: event.target.value })}\n onKeyDown={onKeyDown}\n className={cn(\n 'w-full resize-none bg-transparent outline-none',\n 'min-h-[40px] max-h-48 text-[14px] leading-[1.5] text-ink placeholder:text-ink-4',\n bodyClassName,\n )}\n data-conversations-composer\n />\n\n <div className=\"flex items-center justify-between gap-2\">\n {onAddFiles ? (\n <FileTrigger\n allowsMultiple\n onSelect={(files) => {\n if (files) onAddFiles(Array.from(files))\n }}\n >\n <Button\n variant=\"subtle\"\n size=\"icon-md\"\n aria-label=\"Attach files\"\n className=\"shrink-0\"\n >\n <Paperclip className=\"size-4\" aria-hidden />\n </Button>\n </FileTrigger>\n ) : (\n <span />\n )}\n\n {isSendButtonShown ? (\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-[10px] text-ink-4 select-none\" aria-hidden>\n {mode === 'email' ? '⌘↵' : '↵'}\n </span>\n <AriaButton\n aria-label=\"Send\"\n isDisabled={!canSend || isSending}\n onPress={() => void submit()}\n className={cn(\n 'grid place-items-center size-8 rounded-[8px] cursor-pointer',\n 'bg-accent text-tile-fg transition-opacity duration-150',\n 'disabled:opacity-40 disabled:cursor-default',\n 'outline-none focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n <SendHorizontal className=\"size-3.5\" />\n </AriaButton>\n </div>\n ) : null}\n </div>\n </div>\n </div>\n\n {sendError ? (\n <p className=\"mt-1.5 font-mono text-[11px] text-danger\">\n {sendError} — your message is kept above.{' '}\n <AriaButton\n onPress={() => void submit()}\n className=\"inline underline cursor-pointer outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n retry\n </AriaButton>\n </p>\n ) : null}\n </div>\n )\n}\n\n// Sizes the textarea to its content; the CSS max-h on the element clips the\n// growth (and scrolls) so the cap stays a style concern, overridable per host.\nfunction autoGrow(node: HTMLTextAreaElement) {\n node.style.height = 'auto'\n node.style.height = `${node.scrollHeight}px`\n}\n","import { useSyncExternalStore } from 'react'\n\nimport type { DraftMessageOutcome } from './types'\n\n/* =========================================================================\n Draft-outcome pub/sub — how SIBLING components learn a draft was sent or\n rejected without prop drilling (the show-details-store pattern, keyed by\n message id, plus last-value replay so a subscriber mounting AFTER the\n outcome still sees it).\n\n Scope: a per-JS-realm module singleton. In the web app that is the whole\n page. In the component runtime the import map makes @proteos/ui a\n singleton PER IFRAME — sibling components inside the SAME custom component\n share outcomes; separate custom components are separate iframes and do\n not (cross-iframe reaction stays host-side via query invalidation).\n ========================================================================= */\n\nconst listenersByMessageId = new Map<string, Set<() => void>>()\nconst lastOutcomeByMessageId = new Map<string, DraftMessageOutcome>()\n\nexport function publishDraftMessageOutcome(messageId: string, outcome: DraftMessageOutcome): void {\n lastOutcomeByMessageId.set(messageId, outcome)\n for (const listener of listenersByMessageId.get(messageId) ?? []) listener()\n}\n\nexport function subscribeDraftMessageOutcome(messageId: string, listener: () => void): () => void {\n let listeners = listenersByMessageId.get(messageId)\n if (!listeners) {\n listeners = new Set()\n listenersByMessageId.set(messageId, listeners)\n }\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n if (listeners.size === 0) listenersByMessageId.delete(messageId)\n }\n}\n\n/**\n * The last outcome for this draft, or null while it is still under review.\n * Re-renders when the outcome lands — including for subscribers that mounted\n * after it (last-value replay).\n */\nexport function useDraftMessageOutcome(messageId: string): DraftMessageOutcome | null {\n return useSyncExternalStore(\n (listener) => subscribeDraftMessageOutcome(messageId, listener),\n () => lastOutcomeByMessageId.get(messageId) ?? null,\n () => null,\n )\n}\n\n/** Test-only escape hatch — clears every stored outcome and listener. */\nexport function __resetDraftMessageOutcomes(): void {\n listenersByMessageId.clear()\n lastOutcomeByMessageId.clear()\n}\n","import type { Message } from '@proteos/sdk'\n\n/* =========================================================================\n Draft status → terminal state. One switch, two narrowings: the composer\n needs to distinguish \"this id isn't a draft at all\" (it renders a distinct\n terminal notice) while review surfaces only care whether a decision has\n been reached. Both were duplicated before — keep them here so a new\n Message['status'] value is handled in exactly one place.\n ========================================================================= */\n\n/** What a reviewed draft ended up as. The wire shape of the\n * `present_message_draft` client tool's outcome, and of the value a\n * host-rendered review modal closes with. */\nexport type DraftReviewOutcome = 'sent' | 'rejected' | 'failed'\n\n/** Terminal states a draft id can be in, plus the \"never was a draft\" case. */\nexport type TerminalKind = DraftReviewOutcome | 'not-draft'\n\nconst OUTCOME_BY_STATUS: Partial<Record<Message['status'], DraftReviewOutcome>> = {\n // `pending` is already handed to the transport — from the reviewer's side\n // the decision was \"send\".\n pending: 'sent',\n sent: 'sent',\n rejected: 'rejected',\n failed: 'failed',\n}\n\n/** Terminal state of the message, or null while it is still reviewable. */\nexport function terminalKindFor(status: Message['status']): TerminalKind | null {\n if (status === 'draft') return null\n return OUTCOME_BY_STATUS[status] ?? 'not-draft'\n}\n\n/**\n * The review-surface narrowing: the outcome a card should settle on, or null\n * while the draft is still reviewable. A status that was never a draft\n * (`received`, …) is not an outcome — it leaves the card pending rather than\n * inventing a decision the human never made.\n */\nexport function draftOutcomeFor(status: Message['status']): DraftReviewOutcome | null {\n const kind = terminalKindFor(status)\n return kind === null || kind === 'not-draft' ? null : kind\n}\n\n/** Narrows the `unknown` a host modal resolves with (a dismissed modal\n * resolves `undefined`). */\nexport function isDraftReviewOutcome(value: unknown): value is DraftReviewOutcome {\n return value === 'sent' || value === 'rejected' || value === 'failed'\n}\n","import type { Conversation, Message, SendRecipient, UpdateDraftRequest } from '@proteos/sdk'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button'\nimport { type ComposerAttachment, type ComposerValue, MessageComposer } from '../message-composer'\nimport { registerDraftMessageActions } from './draft-message-actions-store'\nimport { publishDraftMessageOutcome } from './draft-message-outcome-store'\nimport { type TerminalKind, terminalKindFor } from './draft-status'\nimport type { DraftMessageClient } from './types'\n\n/* =========================================================================\n DraftMessageComposer — the human-review surface for an agent-drafted\n outbound message (status=draft). Pass a draft's message id + an injected\n client (createDraftMessageClient); it loads the draft into the shared\n MessageComposer, lets the human edit body / subject-on-originate-drafts /\n recipients-on-email-drafts, then Send (persists dirty edits first) or\n Reject. Outcomes reach the host three ways: onSent/onRejected callbacks,\n the keyed outcome store (useDraftMessageOutcome — sibling components), and\n the actions registry (useDraftMessageActions — external Send/Reject\n buttons, e.g. a task list's \"Execute\"; pair with showActions={false}).\n\n Known v1 limits: attachments are display-only; a `failed` delivery is a\n terminal surface here (host-side retry = a new send, matching the\n timeline's failed-retry pattern).\n ========================================================================= */\n\nexport const draftMessageComposerStyles = tv({\n slots: {\n root: 'flex flex-col gap-1.5',\n header: 'flex items-center gap-2 px-[18px] pt-2',\n badge: [\n 'inline-flex items-center gap-1 rounded-pill border border-rule px-2 py-0.5',\n 'font-mono text-[10px] uppercase tracking-[0.08em] text-ink-3 bg-surface-2',\n ],\n sender: 'text-[12.5px] text-ink-3 truncate',\n actions: 'flex items-center justify-between gap-2 px-[18px] pb-3',\n terminal: [\n 'mx-[18px] my-3 rounded-[10px] border border-rule bg-surface-2 px-3.5 py-2.5',\n 'text-[12.5px] text-ink-3',\n ],\n error: 'px-[18px] font-mono text-[11px] text-danger',\n },\n})\n\nconst styles = draftMessageComposerStyles()\n\ntype Phase = 'loading' | 'load-error' | 'ready' | 'terminal'\ntype Busy = 'idle' | 'saving' | 'sending' | 'rejecting'\n\ninterface DraftSnapshot {\n text: string\n subject: string\n to: SendRecipient[]\n cc: SendRecipient[]\n bcc: SendRecipient[]\n}\n\nexport interface DraftMessageComposerProps {\n /** The status=draft message to review. */\n messageId: string\n /** Injected fetch surface — see createDraftMessageClient. */\n client: DraftMessageClient\n /** Fires once the draft delivered (send resolved pending/sent). */\n onSent?: (message: Message) => void\n /** Fires once the draft was declined. */\n onRejected?: (message: Message) => void\n /** Fires when the human approved the send but delivery failed. */\n onFailed?: (message: Message) => void\n /**\n * Default true. When false the internal Send / Save draft / Reject row is\n * hidden — the composer becomes a pure preview/edit surface driven by\n * external controls via useDraftMessageActions.\n */\n showActions?: boolean\n className?: string\n /** Composes onto the body textarea (MessageComposer.bodyClassName) — review\n * surfaces raise the growth cap so a whole email fits. */\n bodyClassName?: string\n}\n\n/** Maps stored recipient snapshots back to editable send targets (contact\n * addresses only; snapshots without an external id cannot be re-addressed). */\nfunction sendRecipientsFromMessage(message: Message, role: 'to' | 'cc' | 'bcc'): SendRecipient[] {\n return (message.recipients ?? [])\n .filter((recipient) => recipient.role === role && !!recipient.external_id)\n .map((recipient) => ({\n kind: 'contact-address' as const,\n external_id: recipient.external_id as string,\n }))\n}\n\nexport function DraftMessageComposer({\n messageId,\n client,\n onSent,\n onRejected,\n onFailed,\n showActions = true,\n className,\n bodyClassName,\n}: DraftMessageComposerProps) {\n const [phase, setPhase] = useState<Phase>('loading')\n const [busy, setBusy] = useState<Busy>('idle')\n const [terminalKind, setTerminalKind] = useState<TerminalKind>('not-draft')\n const [message, setMessage] = useState<Message | null>(null)\n const [conversation, setConversation] = useState<Conversation | null>(null)\n const [loadError, setLoadError] = useState<string | null>(null)\n const [actionError, setActionError] = useState<string | null>(null)\n const [isConfirmingReject, setIsConfirmingReject] = useState(false)\n const [value, setValue] = useState<ComposerValue>({ text: '' })\n const [to, setTo] = useState<SendRecipient[]>([])\n const [cc, setCc] = useState<SendRecipient[]>([])\n const [bcc, setBcc] = useState<SendRecipient[]>([])\n // State (not a ref): isDirty/buildPatch must recompute when a save moves it.\n const [snapshot, setSnapshot] = useState<DraftSnapshot>({\n text: '',\n subject: '',\n to: [],\n cc: [],\n bcc: [],\n })\n const [loadNonce, setLoadNonce] = useState(0)\n\n const isEmail = message?.channel === 'email'\n const isSubjectEditable = isEmail && conversation?.status === 'draft'\n const areRecipientsEditable = isEmail && !conversation?.room_id\n\n const seed = useCallback((draft: Message, thread: Conversation | null) => {\n const text = draft.content.find((block) => block.type === 'text')?.text ?? ''\n const subject = thread?.subject ?? ''\n const seededTo = sendRecipientsFromMessage(draft, 'to')\n const seededCc = sendRecipientsFromMessage(draft, 'cc')\n const seededBcc = sendRecipientsFromMessage(draft, 'bcc')\n setSnapshot({ text, subject, to: seededTo, cc: seededCc, bcc: seededBcc })\n setValue({ text, ...(draft.channel === 'email' ? { subject } : {}) })\n setTo(seededTo)\n setCc(seededCc)\n setBcc(seededBcc)\n }, [])\n\n // Load (and reload on retry): the message, then its conversation.\n // biome-ignore lint/correctness/useExhaustiveDependencies: loadNonce is the retry trigger — bumping it re-runs the load.\n useEffect(() => {\n let isStale = false\n setPhase('loading')\n setLoadError(null)\n setActionError(null)\n client\n .getMessage(messageId)\n .then(async (draft) => {\n const thread = draft.conversation_id\n ? await client.getConversation(draft.conversation_id)\n : null\n if (isStale) return\n setMessage(draft)\n setConversation(thread)\n const terminal = terminalKindFor(draft.status)\n if (terminal) {\n setTerminalKind(terminal)\n setPhase('terminal')\n return\n }\n seed(draft, thread)\n setPhase('ready')\n })\n .catch((error: unknown) => {\n if (isStale) return\n setLoadError(error instanceof Error ? error.message : 'Loading the draft failed')\n setPhase('load-error')\n })\n return () => {\n isStale = true\n }\n }, [client, messageId, seed, loadNonce])\n\n const isDirty = useMemo(() => {\n return (\n value.text !== snapshot.text ||\n (isSubjectEditable && (value.subject ?? '') !== snapshot.subject) ||\n JSON.stringify(to) !== JSON.stringify(snapshot.to) ||\n JSON.stringify(cc) !== JSON.stringify(snapshot.cc) ||\n JSON.stringify(bcc) !== JSON.stringify(snapshot.bcc)\n )\n }, [value, to, cc, bcc, snapshot, isSubjectEditable])\n\n const buildPatch = useCallback((): UpdateDraftRequest => {\n const current = message as Message\n const isBodyEdited = value.text !== snapshot.text\n const hasRecipientEdit =\n areRecipientsEditable &&\n (JSON.stringify(to) !== JSON.stringify(snapshot.to) ||\n JSON.stringify(cc) !== JSON.stringify(snapshot.cc) ||\n JSON.stringify(bcc) !== JSON.stringify(snapshot.bcc))\n const attachmentRefs = (current.attachments ?? []).map((attachment) => attachment.file)\n return {\n // Body edits collapse to one text block; an untouched body echoes the\n // stored blocks so an agent-provided html part survives the edit.\n content: isBodyEdited\n ? [{ type: 'text' as const, text: value.text.trim() }]\n : current.content,\n ...(isSubjectEditable ? { subject: value.subject ?? '' } : {}),\n // Presence-based replacement: any recipient edit ships ALL three groups\n // verbatim — [] is an explicit clear, an omitted group keeps the stored\n // one. Shipping only non-empty groups would silently resurrect removed\n // recipients at send time.\n ...(hasRecipientEdit ? { to, cc, bcc } : {}),\n ...(attachmentRefs.length > 0 ? { attachments: attachmentRefs } : {}),\n }\n }, [message, value, to, cc, bcc, snapshot, areRecipientsEditable, isSubjectEditable])\n\n const persistDirtyEdits = useCallback(async (): Promise<Message> => {\n const current = message as Message\n if (!isDirty) return current\n const updated = await client.updateDraft(messageId, buildPatch())\n setMessage(updated)\n setConversation((thread) =>\n thread && isSubjectEditable ? { ...thread, subject: value.subject ?? '' } : thread,\n )\n setSnapshot({ text: value.text, subject: value.subject ?? '', to, cc, bcc })\n return updated\n }, [message, isDirty, client, messageId, buildPatch, isSubjectEditable, value, to, cc, bcc])\n\n const saveDraft = useCallback(async () => {\n if (phase !== 'ready' || busy !== 'idle') return\n setBusy('saving')\n setActionError(null)\n try {\n await persistDirtyEdits()\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Saving the draft failed')\n } finally {\n setBusy('idle')\n }\n }, [phase, busy, persistDirtyEdits])\n\n const send = useCallback(async () => {\n if (phase !== 'ready' || busy !== 'idle') return\n // An originate draft addresses people directly — sending it with every\n // recipient removed can never deliver. (Reply drafts may legitimately go\n // recipient-less: they deliver into the thread.) Guards the actions\n // registry too, which bypasses the composer's own canSend gating.\n if (areRecipientsEditable && conversation?.status === 'draft' && to.length === 0) {\n setActionError('Add at least one recipient before sending')\n return\n }\n setBusy('sending')\n setActionError(null)\n try {\n await persistDirtyEdits()\n const result = await client.sendDraft(messageId)\n setMessage(result)\n if (result.status === 'failed') {\n // Delivery failed AFTER the human approved: terminal here, no outcome\n // published — the timeline's failed-retry pattern owns what's next.\n setTerminalKind('failed')\n setPhase('terminal')\n onFailed?.(result)\n return\n }\n setTerminalKind('sent')\n setPhase('terminal')\n publishDraftMessageOutcome(messageId, { type: 'sent', message: result })\n onSent?.(result)\n } catch (error) {\n // Transport/validation failure keeps the edits — the text is the\n // reviewer's work. Rethrow so the composer's onSend rejects too:\n // MessageComposer only clears its value on a RESOLVED send.\n setActionError(error instanceof Error ? error.message : 'Sending the draft failed')\n throw error\n } finally {\n setBusy('idle')\n }\n }, [\n phase,\n busy,\n persistDirtyEdits,\n client,\n messageId,\n onSent,\n onFailed,\n areRecipientsEditable,\n conversation,\n to,\n ])\n\n const reject = useCallback(\n async (isConfirmed: boolean) => {\n if (phase !== 'ready' || busy !== 'idle') return\n if (!isConfirmed) {\n setIsConfirmingReject(true)\n return\n }\n setBusy('rejecting')\n setActionError(null)\n try {\n // Deliberately ignores dirty edits — declining discards them.\n const result = await client.rejectDraft(messageId)\n setMessage(result)\n setTerminalKind('rejected')\n setPhase('terminal')\n publishDraftMessageOutcome(messageId, { type: 'rejected', message: result })\n onRejected?.(result)\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Rejecting the draft failed')\n } finally {\n setBusy('idle')\n setIsConfirmingReject(false)\n }\n },\n [phase, busy, client, messageId, onRejected],\n )\n\n // Actions registry: external controls (task-list Execute buttons, any\n // sibling in this realm) drive the mounted composer. Latest-closure refs so\n // the registered handlers never go stale; re-registered on busy flips so\n // subscribers see isBusy.\n const sendRef = useRef(send)\n const rejectRef = useRef(reject)\n const saveRef = useRef(saveDraft)\n sendRef.current = send\n rejectRef.current = reject\n saveRef.current = saveDraft\n useEffect(() => {\n if (phase !== 'ready') return\n return registerDraftMessageActions(messageId, {\n // Failures surface via actionError/outcomes — external drivers get a\n // settled promise, not a rejection to remember to catch.\n send: () => sendRef.current().catch(() => undefined),\n // External UIs own their confirmation — bypass the inline confirm.\n reject: () => rejectRef.current(true),\n saveDraft: () => saveRef.current(),\n isBusy: busy !== 'idle',\n })\n }, [messageId, phase, busy])\n\n const attachments = useMemo<ComposerAttachment[]>(\n () =>\n (message?.attachments ?? []).map((attachment) => ({\n localId: attachment.id,\n name: attachment.file.name || attachment.file.id,\n status: 'ready' as const,\n ...(attachment.file.content_type ? { contentType: attachment.file.content_type } : {}),\n })),\n [message?.attachments],\n )\n\n if (phase === 'loading') {\n return (\n <div className={cn(styles.root(), className)}>\n <p className={styles.terminal()}>Loading draft…</p>\n </div>\n )\n }\n\n if (phase === 'load-error') {\n return (\n <div className={cn(styles.root(), className)}>\n <p className={styles.terminal()}>\n {loadError ?? 'Loading the draft failed.'}{' '}\n <AriaButton\n onPress={() => setLoadNonce((nonce) => nonce + 1)}\n className=\"inline underline cursor-pointer outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n retry\n </AriaButton>\n </p>\n </div>\n )\n }\n\n if (phase === 'terminal' || !message) {\n const line =\n terminalKind === 'sent'\n ? 'This draft was sent.'\n : terminalKind === 'rejected'\n ? 'This draft was rejected.'\n : terminalKind === 'failed'\n ? `Sending failed${message?.error ? ` — ${message.error}` : ''}.`\n : 'This message is not a reviewable draft.'\n return (\n <div className={cn(styles.root(), className)} data-draft-terminal={terminalKind}>\n <p className={styles.terminal()}>{line}</p>\n </div>\n )\n }\n\n return (\n <div className={cn(styles.root(), className)}>\n <div className={styles.header()}>\n <span className={styles.badge()}>Draft · awaiting review</span>\n <span className={styles.sender()}>from {message.sender.name}</span>\n </div>\n\n <MessageComposer\n mode={isEmail ? 'email' : 'chat'}\n value={value}\n onValueChange={setValue}\n placeholder=\"Draft body…\"\n {...(bodyClassName !== undefined ? { bodyClassName } : {})}\n {...(isEmail && !isSubjectEditable ? { isSubjectReadOnly: true } : {})}\n onSend={async () => send()}\n {...(areRecipientsEditable && message.connection_id\n ? {\n connectionId: message.connection_id,\n searchRecipients: client.searchRecipients,\n showToField: true,\n showRecipientFields: true,\n to,\n cc,\n bcc,\n onToChange: setTo,\n onCcChange: setCc,\n onBccChange: setBcc,\n }\n : {})}\n {...(attachments.length > 0 ? { attachments } : {})}\n showSendButton={showActions}\n />\n\n {actionError ? <p className={styles.error()}>{actionError} — your edits are kept.</p> : null}\n\n {showActions ? (\n <div className={styles.actions()}>\n {isConfirmingReject ? (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[12.5px] text-ink-3\">Reject draft?</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => void reject(true)}\n isDisabled={busy !== 'idle'}\n >\n Confirm reject\n </Button>\n <Button size=\"sm\" variant=\"subtle\" onPress={() => setIsConfirmingReject(false)}>\n Cancel\n </Button>\n </div>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onPress={() => void reject(false)}\n isDisabled={busy !== 'idle'}\n >\n Reject\n </Button>\n )}\n <Button\n size=\"sm\"\n variant=\"subtle\"\n onPress={() => void saveDraft()}\n isDisabled={busy !== 'idle' || !isDirty}\n >\n {busy === 'saving' ? 'Saving…' : 'Save draft'}\n </Button>\n </div>\n ) : null}\n </div>\n )\n}\n","import type { Message } from '@proteos/sdk'\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport {\n DraftMessageComposer,\n type DraftMessageClient,\n type DraftReviewOutcome,\n draftOutcomeFor,\n useDraftMessageOutcome,\n} from '../draft-message-composer'\nimport { ModalBody, ModalContent, ModalHeader, ModalTitle } from '../modal'\nimport { DraftMessageCard } from './draft-message-card'\n\n/* =========================================================================\n DraftMessageReview — the connected draft-review entry point: loads the\n draft through the injected client, renders DraftMessageCard, and owns what\n the preview action does.\n\n The preview action is the seam. Left alone it opens a modal wrapping\n DraftMessageComposer — the zero-config path the platform chat uses. Passed\n `onPreview`, it hands the whole interaction over: the built-in modal is\n never rendered, and the host settles the card by resolving the outcome.\n That is how a sandboxed custom component reviews a draft — its iframe-local\n modal would layer below the host chrome, so it instead asks the host to\n open one (useComponentModal) and resolves with what the host closed with.\n\n A draft that is ALREADY terminal when it loads settles immediately: the\n human may have reviewed it in the platform UI before this card ever\n rendered, and an un-reviewable card that never resolves would hang whatever\n is waiting on the outcome (e.g. an agent turn).\n ========================================================================= */\n\nexport interface DraftMessageReviewProps {\n /** The status=draft message to review. */\n messageId: string\n /** Injected fetch surface — see createDraftMessageClient. */\n client: DraftMessageClient\n /**\n * FULL REPLACEMENT for the preview action's default (open the built-in\n * modal). When supplied the built-in modal is never rendered. Resolve with\n * the outcome so the card settles, or with null when the reviewer dismissed\n * without deciding (the card stays reviewable).\n */\n onPreview?: (messageId: string) => Promise<DraftReviewOutcome | null>\n /** Fires at most once, when the draft reaches a terminal state — whether it\n * was decided here, by `onPreview`, or before this card ever mounted. */\n onOutcome?: (outcome: DraftReviewOutcome, message?: Message) => void\n /** The draft could not be loaded. The card renders nothing in that case. */\n onLoadError?: (error: Error) => void\n /** Built-in modal heading. Default 'Review draft'. */\n modalTitle?: string\n /** Built-in modal panel width. Default 'max-w-3xl'. */\n modalClassName?: string\n /** Built-in modal overlay classes — this is where a host raises the z tier\n * above the surface that launched it. */\n overlayClassName?: string\n previewLabel?: string\n className?: string\n}\n\nexport function DraftMessageReview({\n messageId,\n client,\n onPreview,\n onOutcome,\n onLoadError,\n modalTitle = 'Review draft',\n modalClassName = 'max-w-3xl',\n overlayClassName,\n previewLabel,\n className,\n}: DraftMessageReviewProps) {\n const [message, setMessage] = useState<Message | null>(null)\n const [subject, setSubject] = useState('')\n const [isOpen, setIsOpen] = useState(false)\n const [isPreviewing, setIsPreviewing] = useState(false)\n const [outcome, setOutcome] = useState<DraftReviewOutcome | null>(null)\n\n // Latest-closure refs: the host's callbacks are referentially unstable (they\n // routinely close over a react-query mutation), and depending on them would\n // re-run the load effect on every host re-render.\n const onOutcomeRef = useRef(onOutcome)\n onOutcomeRef.current = onOutcome\n const onLoadErrorRef = useRef(onLoadError)\n onLoadErrorRef.current = onLoadError\n\n // One-shot: the outcome can arrive from the built-in composer, from\n // `onPreview`, from the load itself, or from the outcome store — the host\n // must still hear about it exactly once.\n const hasSettledRef = useRef(false)\n const settle = useCallback((next: DraftReviewOutcome, settled?: Message) => {\n setOutcome(next)\n setIsOpen(false)\n if (hasSettledRef.current) return\n hasSettledRef.current = true\n onOutcomeRef.current?.(next, settled)\n }, [])\n\n useEffect(() => {\n let cancelled = false\n void (async () => {\n try {\n const loaded = await client.getMessage(messageId)\n if (cancelled) return\n setMessage(loaded)\n const terminal = draftOutcomeFor(loaded.status)\n if (terminal) {\n settle(terminal, loaded)\n return\n }\n if (loaded.conversation_id) {\n const conversation = await client.getConversation(loaded.conversation_id)\n if (!cancelled) setSubject(conversation.subject ?? '')\n }\n } catch (error) {\n if (cancelled) return\n onLoadErrorRef.current?.(error instanceof Error ? error : new Error(String(error)))\n }\n })()\n return () => {\n cancelled = true\n }\n }, [client, messageId, settle])\n\n // A composer for this same draft elsewhere in this JS realm (a detail panel,\n // a sibling embed) settles the card too — no prop drilling between them.\n const published = useDraftMessageOutcome(messageId)\n useEffect(() => {\n if (published) settle(published.type, published.message)\n }, [published, settle])\n\n const preview = () => {\n if (!onPreview) {\n setIsOpen(true)\n return\n }\n setIsPreviewing(true)\n void onPreview(messageId)\n .then((result) => {\n if (result) settle(result)\n })\n .finally(() => setIsPreviewing(false))\n }\n\n if (!message) return null\n\n return (\n <>\n <DraftMessageCard\n channel={message.channel}\n title={titleFor(message, subject)}\n recipients={toRecipients(message)}\n outcome={outcome}\n onPreview={preview}\n isPreviewDisabled={isPreviewing}\n {...(previewLabel !== undefined ? { previewLabel } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n {onPreview ? null : (\n <ModalContent\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n modalClassName={modalClassName}\n {...(overlayClassName !== undefined ? { className: overlayClassName } : {})}\n >\n <ModalHeader>\n <ModalTitle>{modalTitle}</ModalTitle>\n </ModalHeader>\n <ModalBody className=\"min-h-0 overflow-y-auto\">\n <DraftMessageComposer\n messageId={messageId}\n client={client}\n bodyClassName=\"max-h-[55dvh]\"\n onSent={(sent) => settle(draftOutcomeFor(sent.status) ?? 'sent', sent)}\n onRejected={(rejected) => settle('rejected', rejected)}\n onFailed={(failed) => settle('failed', failed)}\n />\n </ModalBody>\n </ModalContent>\n )}\n </>\n )\n}\n\n/** Subject first; an unsubjected draft (chat channels) leads with its opening\n * line so the card still says something about the message. */\nfunction titleFor(message: Message, subject: string): string {\n const firstLine = message.content.find((block) => block.type === 'text')?.text?.split('\\n')[0]\n return subject || firstLine || 'Draft message'\n}\n\nfunction toRecipients(message: Message): string[] {\n return (message.recipients ?? [])\n .filter((recipient) => recipient.role === 'to')\n .map((recipient) => recipient.name || recipient.email || recipient.external_id)\n .filter((label): label is string => !!label)\n}\n","import type { ReactNode } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n EmptyState — zero-state callout. Centred art tile + title + description\n + optional action. Used by the page-designer inspector's \"Nothing\n selected\" panel and re-usable wherever a panel needs a friendly empty\n state. Plan §7.2.\n ========================================================================= */\n\nexport const emptyStateStyles = tv({\n slots: {\n root: 'flex flex-col items-center text-center px-6',\n art: 'inline-grid place-items-center rounded-[12px] bg-surface-2 text-ink-3 mb-3',\n title: 'text-[14px] text-ink font-medium mb-1',\n description: 'text-[12.5px] text-ink-3 leading-[1.5] max-w-[220px] mx-auto',\n actions: 'mt-3',\n },\n variants: {\n size: {\n sm: {\n root: 'py-6',\n art: 'size-9',\n },\n md: {\n root: 'py-9',\n art: 'size-12',\n },\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type EmptyStateVariants = VariantProps<typeof emptyStateStyles>\n\nexport interface EmptyStateProps extends EmptyStateVariants {\n icon?: ReactNode\n title: ReactNode\n description?: ReactNode\n action?: ReactNode\n className?: string\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n size,\n className,\n}: EmptyStateProps) {\n const styles = emptyStateStyles({ size })\n return (\n <div className={cn(styles.root(), className)}>\n {icon ? <div className={styles.art()}>{icon}</div> : null}\n <div className={styles.title()}>{title}</div>\n {description ? <div className={styles.description()}>{description}</div> : null}\n {action ? <div className={styles.actions()}>{action}</div> : null}\n </div>\n )\n}\n","import { CircleX } from 'lucide-react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n ErrorAnimation — failure indicator: a large red X in a circle (token\n `--color-danger`), entering with the one-shot status-pop scale+fade\n (suppressed under prefers-reduced-motion). Decorative: rendered with\n `aria-hidden`, since the surrounding text region carries the\n announcement. Size via className (default 96×96).\n ========================================================================= */\n\nexport type ErrorAnimationProps = {\n className?: string\n}\n\nexport function ErrorAnimation({ className }: ErrorAnimationProps) {\n return (\n <div\n aria-hidden\n className={cn('size-24 text-danger motion-safe:animate-status-pop', className)}\n >\n <CircleX className=\"size-full\" strokeWidth={1.5} />\n </div>\n )\n}\n","import { Download } from 'lucide-react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button/button'\nimport { formatFileSize, iconForContentType } from '../file-field/file-field'\n\n/* =========================================================================\n FileViewerFallbackCard — what the FileViewer shows when it cannot render\n the file inline (unpreviewable type, load error, oversized). Mirrors the\n FileField card chrome: type icon, name, meta line, download action.\n ========================================================================= */\n\nexport const fileViewerFallbackCardStyles = tv({\n base: [\n 'flex w-full items-start gap-3 rounded-md border border-rule bg-surface px-3 py-2.5',\n 'text-left',\n ],\n})\n\nexport type FileViewerFallbackCardVariants = VariantProps<typeof fileViewerFallbackCardStyles>\n\nexport interface FileViewerFallbackCardProps {\n name: string\n contentType?: string\n sizeInBytes?: number\n /** Why the preview is unavailable (e.g. \"Too large to preview\"). */\n note?: string\n /** Load failure — rendered in the danger tone, wins over `note`. */\n errorMessage?: string\n onDownload?: () => void\n className?: string\n}\n\nexport function FileViewerFallbackCard({\n name,\n contentType,\n sizeInBytes,\n note,\n errorMessage,\n onDownload,\n className,\n}: FileViewerFallbackCardProps) {\n const Icon = iconForContentType(contentType)\n const size = formatFileSize(sizeInBytes)\n const meta = [size, note].filter(Boolean).join(' · ')\n\n return (\n <div className={cn(fileViewerFallbackCardStyles(), className)}>\n <span className=\"mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-md bg-surface-2 text-ink-3\">\n <Icon aria-hidden className=\"size-4\" />\n </span>\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate font-sans text-[13px] font-medium text-ink\">{name}</span>\n {errorMessage ? (\n <span className=\"truncate font-sans text-[12px] text-danger\">{errorMessage}</span>\n ) : meta ? (\n <span className=\"truncate font-sans text-[12px] text-ink-3\">{meta}</span>\n ) : null}\n </span>\n {onDownload ? (\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label={`Download ${name}`} onPress={onDownload}>\n <Download aria-hidden />\n </Button>\n ) : null}\n </div>\n )\n}\n","import { Download, X } from 'lucide-react'\nimport {\n Dialog as AriaDialog,\n Modal as AriaModal,\n ModalOverlay as AriaModalOverlay,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Button } from '../button/button'\n\n/* =========================================================================\n ImageLightbox — a full-viewport image overlay (Slack-style). Unlike\n Modal there is no surface panel: the image floats on a deep scrim with\n a small caption bar (file name + optional download + close) beneath it.\n Controlled-only — the trigger is the consumer's thumbnail, so there is\n no DialogTrigger composition. RAC provides Esc dismissal, backdrop\n click, and focus trap/restore.\n ========================================================================= */\n\nexport const imageLightboxStyles = tv({\n base: [\n 'fixed inset-0 z-50 flex items-center justify-center p-4',\n // Deeper scrim than Modal's 40% — the image needs the page fully dimmed.\n 'bg-[color-mix(in_oklab,var(--color-ink)_72%,transparent)]',\n 'entering:animate-in entering:fade-in-0 entering:duration-150',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-100',\n ],\n})\n\nexport type ImageLightboxVariants = VariantProps<typeof imageLightboxStyles>\n\nexport interface ImageLightboxProps {\n isOpen: boolean\n onOpenChange: (isOpen: boolean) => void\n /** Full-size image URL; nothing renders in the frame while undefined. */\n src?: string\n /** File name — the dialog's accessible name, alt text, and caption. */\n name: string\n /** When set, a download action renders in the caption bar. */\n onDownload?: () => void\n}\n\nexport function ImageLightbox({ isOpen, onOpenChange, src, name, onDownload }: ImageLightboxProps) {\n return (\n <AriaModalOverlay\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n isDismissable\n className={imageLightboxStyles()}\n >\n <AriaModal className=\"outline-none\">\n <AriaDialog\n aria-label={name}\n className=\"outline-none flex flex-col items-center gap-3\"\n >\n {src ? (\n <img\n src={src}\n alt={name}\n className=\"block max-h-[82dvh] max-w-[90dvw] rounded-[8px] object-contain\"\n />\n ) : null}\n {/* Caption chip sits on its own surface so tokens stay legible over\n the dark scrim. */}\n <div\n className={cn(\n 'flex items-center gap-1.5',\n 'rounded-[8px] border border-rule bg-surface py-1 pl-3 pr-1',\n 'shadow-[var(--shadow-float)]',\n )}\n >\n <span className=\"max-w-[320px] truncate font-sans text-[12.5px] text-ink\">{name}</span>\n {onDownload ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`Download ${name}`}\n onPress={onDownload}\n >\n <Download aria-hidden />\n </Button>\n ) : null}\n <Button slot=\"close\" variant=\"ghost\" size=\"icon-sm\" aria-label=\"Close\">\n <X aria-hidden />\n </Button>\n </div>\n </AriaDialog>\n </AriaModal>\n </AriaModalOverlay>\n )\n}\n","import { useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\n\nimport { ImageLightbox } from '../image-lightbox/image-lightbox'\n\n/* =========================================================================\n ImageView — the FileViewer's image pane. The image letterboxes inside\n the viewer box; pressing it opens the full-viewport lightbox.\n ========================================================================= */\n\nexport interface ImageViewProps {\n name: string\n src: string\n onDownload?: () => void\n}\n\nexport function ImageView({ name, src, onDownload }: ImageViewProps) {\n const [isLightboxOpen, setIsLightboxOpen] = useState(false)\n\n return (\n <>\n <AriaButton\n aria-label={`Preview ${name}`}\n onPress={() => setIsLightboxOpen(true)}\n className=\"flex h-full w-full cursor-zoom-in items-center justify-center outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <img src={src} alt={name} className=\"max-h-full max-w-full object-contain\" />\n </AriaButton>\n <ImageLightbox\n isOpen={isLightboxOpen}\n onOpenChange={setIsLightboxOpen}\n src={src}\n name={name}\n {...(onDownload ? { onDownload } : {})}\n />\n </>\n )\n}\n","/* =========================================================================\n VideoView — the FileViewer's video pane. Native playback controls; the\n video letterboxes inside the viewer box.\n ========================================================================= */\n\nexport interface VideoViewProps {\n name: string\n src: string\n}\n\nexport function VideoView({ name, src }: VideoViewProps) {\n return (\n // biome-ignore lint/a11y/useMediaCaption: user-stored files carry no caption tracks\n <video controls src={src} aria-label={name} className=\"h-full w-full object-contain\" />\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Skeleton } from '../skeleton/skeleton'\nimport { FileViewerFallbackCard } from './fallback-card'\nimport { ImageView } from './image-view'\nimport { VideoView } from './video-view'\n\n/* =========================================================================\n FileViewer — inline preview for a stored file. Renders the file itself\n when the content type is previewable (image / video / PDF), otherwise a\n file-type card with a download action. Pure presentation: the consumer\n fetches the bytes (authenticated) and hands in a blob object URL — the\n viewer never fetches anything itself.\n\n The PDF renderer (react-pdf + the pdf.js worker) is lazy-loaded so it\n lands in its own chunk and non-PDF surfaces never pay for it.\n ========================================================================= */\n\n// Code-split: pdf.js is heavy and only needed when a PDF is actually shown.\nconst PdfView = lazy(() => import('./pdf-view'))\n\nexport const fileViewerStyles = tv({\n base: [\n 'relative flex w-full flex-col overflow-hidden',\n 'rounded-md border border-rule bg-surface-2',\n ],\n})\n\nexport type FileViewerVariants = VariantProps<typeof fileViewerStyles>\n\n/** Which renderer a content type maps to (`none` → fallback card). */\nexport type FileViewerKind = 'image' | 'video' | 'pdf' | 'none'\n\n/**\n * Maps a MIME type to the viewer that can render it inline. Consumers use\n * this to decide whether fetching the bytes is worthwhile at all.\n */\nexport function viewerKindForContentType(contentType?: string): FileViewerKind {\n if (!contentType) return 'none'\n if (contentType.startsWith('image/')) return 'image'\n if (contentType.startsWith('video/')) return 'video'\n if (contentType === 'application/pdf') return 'pdf'\n return 'none'\n}\n\nexport interface FileViewerProps {\n /** Filename — labels, alt text and the fallback card. */\n name: string\n /** MIME type; unknown/unpreviewable types render the fallback card. */\n contentType?: string\n /** Blob object URL of the file bytes. While undefined (and previewable), the skeleton renders. */\n src?: string\n /** Size in bytes — shown on the fallback card when known. */\n sizeInBytes?: number\n /** Viewer height in px for previewable files (the fallback card keeps its natural height). */\n heightPx?: number\n /** Error loading the file — renders the fallback card with the message. */\n errorMessage?: string\n /** File too large for inline preview — renders the fallback card. */\n isOversized?: boolean\n /** When set, download actions render (card button, lightbox, PDF toolbar). */\n onDownload?: () => void\n className?: string\n}\n\nconst DEFAULT_HEIGHT_PX = 640\n\nexport function FileViewer({\n name,\n contentType,\n src,\n sizeInBytes,\n heightPx = DEFAULT_HEIGHT_PX,\n errorMessage,\n isOversized = false,\n onDownload,\n className,\n}: FileViewerProps) {\n const kind = viewerKindForContentType(contentType)\n\n const fallback = (\n <FileViewerFallbackCard\n name={name}\n {...(contentType !== undefined ? { contentType } : {})}\n {...(sizeInBytes !== undefined ? { sizeInBytes } : {})}\n {...(errorMessage !== undefined ? { errorMessage } : {})}\n {...(isOversized ? { note: 'Too large to preview' } : {})}\n {...(onDownload ? { onDownload } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n\n if (kind === 'none' || errorMessage || isOversized) return fallback\n\n const skeleton = (\n <Skeleton aria-label={`Loading preview of ${name}`} className=\"h-full w-full rounded-none\" />\n )\n\n return (\n <div className={cn(fileViewerStyles(), className)} style={{ height: heightPx }}>\n {!src ? (\n skeleton\n ) : kind === 'image' ? (\n <ImageView name={name} src={src} {...(onDownload ? { onDownload } : {})} />\n ) : kind === 'video' ? (\n <VideoView name={name} src={src} />\n ) : (\n <Suspense fallback={skeleton}>\n <PdfView name={name} src={src} {...(onDownload ? { onDownload } : {})} />\n </Suspense>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport { Button as AriaButton } from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\nimport { Skeleton } from '../skeleton/skeleton'\n\n/* =========================================================================\n ImageAttachment — a pressable image thumbnail for chat/message rows.\n Shows a skeleton while the URL resolves and the image loads, then the\n image constrained to a Slack-style thumbnail box. Pure presentation:\n the consumer resolves the src, opens the lightbox on press, and decides\n what to do when the image fails to load (typically fall back to a\n plain file chip).\n ========================================================================= */\n\nexport const imageAttachmentStyles = tv({\n base: [\n 'relative block overflow-hidden',\n 'rounded-[8px] border border-rule bg-surface-2',\n 'cursor-pointer outline-none focus-visible:shadow-[var(--shadow-focus)]',\n ],\n})\n\nexport type ImageAttachmentVariants = VariantProps<typeof imageAttachmentStyles>\n\nexport interface ImageAttachmentProps {\n /** File name — the alt text and the accessible button name. */\n name: string\n /** Resolved image URL. While undefined, the skeleton placeholder renders. */\n src?: string\n /** Fired when the browser fails to load `src` (e.g. not actually an image). */\n onLoadError?: () => void\n /** Fired on thumbnail press (consumer opens the lightbox). */\n onPress?: () => void\n className?: string\n}\n\nexport function ImageAttachment({\n name,\n src,\n onLoadError,\n onPress,\n className,\n}: ImageAttachmentProps) {\n // Tracks which src has finished loading, so a swapped-out URL goes back to\n // the skeleton instead of flashing the stale image.\n const [loadedSrc, setLoadedSrc] = useState<string | null>(null)\n const isLoaded = src !== undefined && loadedSrc === src\n\n return (\n <AriaButton\n aria-label={`Preview ${name}`}\n {...(onPress ? { onPress } : {})}\n className={cn(imageAttachmentStyles(), className)}\n >\n {src ? (\n // Kept in the DOM (invisible) while loading so onLoad still fires\n // behind the skeleton.\n <img\n src={src}\n alt={name}\n loading=\"lazy\"\n onLoad={() => setLoadedSrc(src)}\n onError={() => onLoadError?.()}\n className={cn(\n 'block max-h-[220px] max-w-[280px] object-contain',\n !isLoaded && 'invisible absolute inset-0',\n )}\n />\n ) : null}\n {/* Fixed footprint — intrinsic dimensions are unknown until load, and a\n 0-height placeholder would make the row jump. */}\n {!isLoaded ? <Skeleton className=\"h-[140px] w-[200px]\" /> : null}\n </AriaButton>\n )\n}\n","const PREVIEWABLE_EXTENSIONS = new Set(['png', 'jpg', 'jpeg', 'gif', 'webp', 'avif', 'svg', 'bmp'])\n\n/**\n * True when a filename's extension is one the browser renders natively in\n * `<img>`. A heuristic for contexts where only a name is known (e.g. a\n * FileRef carries no MIME type) — a wrong guess should degrade gracefully via\n * the consumer's img-error fallback. SVG is deliberately included: scripts do\n * not execute in an `<img>` context.\n */\nexport function isPreviewableImageName(name: string): boolean {\n const dot = name.lastIndexOf('.')\n if (dot <= 0 || dot === name.length - 1) return false\n return PREVIEWABLE_EXTENSIONS.has(name.slice(dot + 1).toLowerCase())\n}\n","import type { ReactNode } from 'react'\nimport {\n Input as AriaInput,\n type InputProps as AriaInputProps,\n type TextFieldProps as AriaTextFieldProps,\n FieldError,\n Label,\n Text,\n TextField,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n type FieldSize,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type InputProps = AriaTextFieldProps & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n /** Field size. Defaults to `md`. Use `sm` for compact rows (filter builder, toolbars). */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box for\n * spreadsheet-style inline editing (2px radius, no halo / resting shadow). */\n appearance?: FieldAppearance\n /** Set false to drop the focus/invalid ring — for tight hosts whose\n * overflow clip would cut it off. Border states stay. Defaults to true. */\n hasFocusRing?: boolean\n /** Extra props forwarded to the underlying <input>. */\n inputProps?: Omit<AriaInputProps, 'className'>\n /** Visual override for the input control only. */\n inputClassName?: string\n}\n\nexport function Input({\n label,\n description,\n errorMessage,\n placeholder,\n size,\n appearance,\n hasFocusRing,\n inputProps,\n inputClassName,\n className,\n ...props\n}: InputProps) {\n const styles = fieldControlStyles({ size, appearance, hasFocusRing })\n return (\n <TextField\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <AriaInput\n {...inputProps}\n placeholder={placeholder ?? ''}\n className={cn(styles.box(), styles.content(), inputClassName)}\n />\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </TextField>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport {\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n type MenuItemProps as AriaMenuItemProps,\n type MenuProps as AriaMenuProps,\n MenuTrigger as AriaMenuTrigger,\n Popover as AriaPopover,\n type PopoverProps as AriaPopoverProps,\n SubmenuTrigger as AriaSubmenuTrigger,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Menu — a dropdown menu with Windows-style cascading submenus, built on\n React Aria Components (keyboard nav, focus, typeahead, ARIA handled by RAC).\n\n <MenuTrigger>\n <Button>Open</Button> // first child = the trigger\n <MenuPopover>\n <Menu>\n <MenuItem onAction={…}>Edit</MenuItem>\n <SubmenuTrigger>\n <MenuItem hasSubmenu>More…</MenuItem> // the parent row\n <MenuPopover placement=\"end top\"> // the flyout\n <Menu>\n <MenuItem onAction={…}>Nested</MenuItem>\n </Menu>\n </MenuPopover>\n </SubmenuTrigger>\n </Menu>\n </MenuPopover>\n </MenuTrigger>\n\n MenuTrigger / SubmenuTrigger are RAC primitives re-exported unchanged;\n MenuPopover / Menu / MenuItem carry the design-system chrome.\n ========================================================================= */\n\n/** Stateful root (RAC). Wraps the trigger element + the MenuPopover. */\nexport const MenuTrigger = AriaMenuTrigger\n\n/**\n * Submenu wrapper (RAC). Wraps a parent MenuItem and the nested MenuPopover so\n * the flyout opens on hover/right-arrow. Use `placement=\"end top\"` on the nested\n * MenuPopover so it cascades to the side, Windows-style.\n */\nexport const SubmenuTrigger = AriaSubmenuTrigger\n\nexport type MenuPopoverProps = AriaPopoverProps\n\n/** The floating panel. Defaults to opening below-start; pass `placement=\"end top\"` for a submenu flyout. */\nexport function MenuPopover({ className, offset = 4, placement = 'bottom start', ...props }: MenuPopoverProps) {\n return (\n <AriaPopover\n offset={offset}\n placement={placement}\n {...props}\n className={(renderProps) =>\n cn(\n 'min-w-[200px] p-1 bg-surface border border-rule rounded-md',\n 'shadow-[var(--shadow-float)] outline-none z-[1200]',\n 'entering:animate-in entering:fade-in-0 entering:zoom-in-95',\n 'exiting:animate-out exiting:fade-out-0 exiting:zoom-out-95',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n\nexport type MenuProps<T extends object> = AriaMenuProps<T>\n\n/** The menu list. Holds MenuItem / SubmenuTrigger children. */\nexport function Menu<T extends object>({ className, ...props }: MenuProps<T>) {\n return (\n <AriaMenu\n {...props}\n className={(renderProps) =>\n cn(\n 'flex flex-col gap-px outline-none',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n\nexport type MenuItemProps = Omit<AriaMenuItemProps, 'children'> & {\n /** Leading icon slot. */\n icon?: ReactNode\n /** Renders a trailing chevron marking this row as a submenu parent. */\n hasSubmenu?: boolean\n children?: ReactNode\n}\n\nconst menuItemStyles = cn(\n 'flex items-center gap-2.5 px-2.5 py-1.5 rounded-md cursor-pointer outline-none',\n 'font-sans text-[13px] text-ink-2 select-none',\n 'hover:bg-surface-2 hover:text-ink focus:bg-surface-2 focus:text-ink',\n 'data-[open]:bg-surface-2 data-[open]:text-ink', // submenu-parent stays lit while its flyout is open\n 'aria-disabled:opacity-50 aria-disabled:cursor-default aria-disabled:hover:bg-transparent aria-disabled:hover:text-ink-2',\n '[&_svg]:size-3.5 [&_svg]:text-ink-3 hover:[&_svg]:text-ink focus:[&_svg]:text-ink',\n)\n\n/** A single menu row. Pass `onAction` to handle selection; `isDisabled` to dim it. */\nexport function MenuItem({ icon, hasSubmenu, children, className, ...props }: MenuItemProps) {\n return (\n <AriaMenuItem\n {...props}\n className={(renderProps) =>\n cn(menuItemStyles, typeof className === 'function' ? className(renderProps) : className)\n }\n >\n {icon ? <span className=\"flex shrink-0 items-center\">{icon}</span> : null}\n <span className=\"flex-1 truncate\">{children}</span>\n {hasSubmenu ? <ChevronRight className=\"ml-2 size-3 shrink-0 text-ink-4\" /> : null}\n </AriaMenuItem>\n )\n}\n","import { createContext, type ReactNode, useContext } from 'react'\nimport {\n Button as AriaButton,\n type ButtonProps as AriaButtonProps,\n type DisclosureProps as AriaDisclosureProps,\n Disclosure,\n DisclosurePanel,\n Heading,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Nav — vertical navigation primitives for sidebars / drawers. Three pieces:\n - <NavSection> — labelled grouping with optional count + trailing slot.\n - <NavItem> — leaf entry (RAC Button) with icon, label, badge slot,\n and an `isActive` state (raised paper card + accent rail).\n - <NavGroup> — collapsible parent (RAC Disclosure + DisclosurePanel)\n that auto-tags its children as nested via context.\n\n The primitives don't know about \"collapsed sidebar\" — that visual cascade\n lives in the consuming app, which can hide labels / center icons via CSS\n on a wrapping element.\n ========================================================================= */\n\n/* ---------- nested context ----------------------------------------------- */\n\nconst NavNestedContext = createContext(false)\n/** True when a NavItem is rendered inside a NavGroup's panel. */\nfunction useIsNested() {\n return useContext(NavNestedContext)\n}\n\n/* ---------- NavSection --------------------------------------------------- */\n\nexport type NavSectionProps = {\n /** Uppercase mono label rendered above the items. */\n label?: ReactNode\n /** Counter rendered at the right of the label (e.g. `5`). */\n count?: ReactNode\n /** Trailing slot at the right of the heading row, e.g. an action button. */\n action?: ReactNode\n className?: string\n children?: ReactNode\n /** Stable test/automation id, forwarded to the section root. */\n 'data-testid'?: string\n}\n\n/** Visually-grouped block of nav entries. Use one per logical section\n * (\"Workspace\", \"Operations\", \"Finance\"). */\nexport function NavSection({\n label,\n count,\n action,\n className,\n children,\n 'data-testid': dataTestid,\n}: NavSectionProps) {\n const hasHead = label !== undefined || count !== undefined || action !== undefined\n return (\n <div className={cn('mt-[18px] first:mt-1', className)} data-testid={dataTestid}>\n {hasHead ? (\n <div className=\"flex items-center justify-between px-2 pt-1 pb-2\">\n {label !== undefined ? (\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-4\">\n {label}\n </span>\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n {count !== undefined ? (\n <span className=\"font-mono text-[10px] text-ink-4\">{count}</span>\n ) : null}\n {action}\n </div>\n </div>\n ) : null}\n {children}\n </div>\n )\n}\n\n/* ---------- NavItem ------------------------------------------------------ */\n\nexport const navItemStyles = tv({\n base: [\n 'group/nav-item relative w-full',\n 'flex items-center gap-2.5',\n 'px-2 py-[7px] rounded-[7px]',\n 'text-[13.5px] tracking-[-0.005em] text-ink-2',\n 'cursor-pointer outline-none text-left',\n 'transition-[background-color,color,border-color,box-shadow] duration-150',\n 'border border-transparent',\n 'hover:bg-surface-2 hover:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed disabled:pointer-events-none',\n ],\n variants: {\n isActive: {\n // Match the hover state's fill (bg-surface-2 + ink) so the selected color\n // doesn't read brighter than the surrounding chrome. The hairline\n // border + accent rail still mark the current page.\n true: [\n 'bg-surface-2 text-ink border-rule',\n // accent rail anchored to the section's left edge\n 'before:content-[\"\"] before:absolute before:-left-2.5 before:top-2 before:bottom-2',\n 'before:w-0.5 before:rounded-[2px] before:bg-accent',\n ],\n false: '',\n },\n isNested: {\n true: 'text-[13px] text-ink-3 py-1.5',\n false: '',\n },\n },\n compoundVariants: [\n // Nested + active: raise to ink rather than accent-ink so the indented\n // hierarchy still reads \"softer than top-level\".\n { isNested: true, isActive: true, class: 'text-ink' },\n ],\n defaultVariants: { isActive: false, isNested: false },\n})\n\nexport type NavItemVariants = VariantProps<typeof navItemStyles>\n\nexport type NavItemProps = Omit<AriaButtonProps, 'children'> & {\n /** Leading icon. Pass an SVG element; it's wrapped in a 16px box. */\n icon?: ReactNode\n /** Trailing slot — typically a count or status dot. */\n badge?: ReactNode\n /** Mark the item as the current page. */\n isActive?: boolean\n children?: ReactNode\n}\n\n/** Leaf nav entry. RAC Button under the hood — full keyboard, focus-visible\n * ring, and disabled state included. For routing, apply `navItemStyles({...})`\n * to a RAC `<Link>` instead. */\nexport function NavItem({ icon, badge, isActive, className, children, ...props }: NavItemProps) {\n const isNested = useIsNested()\n return (\n <AriaButton\n {...props}\n className={(renderProps) =>\n cn(\n navItemStyles({ isActive, isNested }),\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {icon !== undefined ? (\n <span\n aria-hidden\n className={cn(\n 'grid place-items-center shrink-0 size-4',\n isActive ? 'text-accent' : 'text-ink-3',\n '[&>svg]:size-4',\n )}\n >\n {icon}\n </span>\n ) : null}\n <span className=\"flex-1 min-w-0 truncate\">{children}</span>\n {badge !== undefined ? (\n <span className=\"shrink-0 font-mono text-[10.5px] tracking-[0.02em] text-ink-4\">\n {badge}\n </span>\n ) : null}\n </AriaButton>\n )\n}\n\n/* ---------- NavGroup ----------------------------------------------------- */\n\nexport type NavGroupProps = Omit<AriaDisclosureProps, 'children'> & {\n /** Leading icon for the group head. */\n icon?: ReactNode\n /** Group label rendered next to the icon. */\n label: ReactNode\n /** Children get auto-styled as nested NavItems via context. */\n children: ReactNode\n className?: string\n}\n\n/** Collapsible parent. RAC Disclosure handles aria-expanded / aria-controls\n * and keyboard activation. Children render inside an indented panel with a\n * vertical guide rule and pick up nested styling automatically. */\nexport function NavGroup({ icon, label, children, className, ...props }: NavGroupProps) {\n return (\n <Disclosure {...props} className={cn('group/nav-group my-px', className)}>\n <Heading className=\"m-0\">\n <AriaButton\n slot=\"trigger\"\n className={cn(\n 'flex w-full items-center gap-2.5',\n 'px-2 py-[7px] rounded-[7px]',\n 'text-[13.5px] tracking-[-0.005em] text-ink-2 text-left',\n 'cursor-pointer outline-none border border-transparent',\n 'transition-colors duration-150',\n 'hover:bg-surface-2 hover:text-ink',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n {icon !== undefined ? (\n <span\n aria-hidden\n className=\"grid place-items-center shrink-0 size-4 text-ink-3 [&>svg]:size-4\"\n >\n {icon}\n </span>\n ) : null}\n <span className=\"flex-1 min-w-0 truncate\">{label}</span>\n <svg\n viewBox=\"0 0 12 12\"\n aria-hidden\n className=\"size-2.5 shrink-0 text-ink-4 transition-transform duration-200 group-data-[expanded]/nav-group:rotate-90\"\n >\n <path\n d=\"m4.5 3 3 3-3 3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </AriaButton>\n </Heading>\n <DisclosurePanel>\n <div\n className={cn(\n 'relative pl-[22px] py-px',\n // Vertical guide rule — sits under where the parent's icon center\n // would be (14px from the panel's left edge).\n 'before:content-[\"\"] before:absolute before:left-[14px] before:top-1 before:bottom-1',\n 'before:w-px before:bg-rule',\n )}\n >\n <NavNestedContext.Provider value={true}>{children}</NavNestedContext.Provider>\n </div>\n </DisclosurePanel>\n </Disclosure>\n )\n}\n","import { type OrbState, type OrbTheme, ThinkingOrb } from 'thinking-orbs'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Orb — the \"agent is working\" indicator, backed by the `thinking-orbs`\n package (https://orbs.jakubantalik.com): a canvas-rendered dotted orb\n (state: solving), monochrome ink that auto-resolves against `data-theme`\n / OS scheme, with a reduced-motion static frame built in.\n\n The package ships two hand-tuned designs — 20px (inline) and 64px\n (avatar). `sm` and `lg` render them at native size; `xs` gently\n downscales the 20px design, `md` downscales the 64px one (downscaling\n stays crisp — the canvas buffer is the larger design).\n\n Purely decorative by default — pass `label` to expose it as an img with\n an accessible name (e.g. \"Agent working\").\n ========================================================================= */\n\nexport type OrbSizeToken = 'xs' | 'sm' | 'md' | 'lg'\n\n/** CSS box per token. sm/lg match the native designs exactly (no scaling). */\nconst SIZE_PX: Record<OrbSizeToken, number> = { xs: 12, sm: 20, md: 40, lg: 64 }\n\n/** Which native design each token rides. */\nconst DESIGN: Record<OrbSizeToken, 20 | 64> = { xs: 20, sm: 20, md: 64, lg: 64 }\n\nexport interface OrbProps {\n /** xs 12 · sm 20 (native inline) · md 40 · lg 64 (native avatar). Default `sm`. */\n size?: OrbSizeToken\n /** Animation state; defaults to `solving` (the working indicator). */\n state?: OrbState\n /** Speed multiplier (1 = tuned speed); e.g. 0.2 for a slow idle shimmer. */\n speed?: number\n /** Pin the ink instead of auto-detecting — `dark` renders light dots (for\n * a dark chip like the launcher's black circle). */\n theme?: OrbTheme\n className?: string\n /** Accessible name; omitting it hides the orb from assistive tech. */\n label?: string\n}\n\nexport function Orb({ size = 'sm', state = 'solving', speed, theme, className, label }: OrbProps) {\n const px = SIZE_PX[size]\n const design = DESIGN[size]\n return (\n <ThinkingOrb\n state={state}\n size={design}\n {...(speed !== undefined ? { speed } : {})}\n {...(theme !== undefined ? { theme } : {})}\n className={cn('inline-block shrink-0', className)}\n {...(px !== design ? { style: { width: px, height: px } } : {})}\n {...(label ? { 'aria-label': label } : { 'aria-hidden': true })}\n />\n )\n}\n","import {\n ProgressBar as AriaProgressBar,\n type ProgressBarProps as AriaProgressBarProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n ProgressBar — wraps RAC's headless ProgressBar (state + ARIA only) and\n adds the visual track + fill. Supports both determinate (`value`) and\n indeterminate (`isIndeterminate`) modes.\n\n The indeterminate fill rides the `animate-indeterminate-progress` utility\n declared in styles.css — a 35%-wide segment that slides off the right edge\n and re-enters from the left on a continuous loop.\n ========================================================================= */\n\nexport const progressBarStyles = tv({\n slots: {\n track: 'relative overflow-hidden rounded-pill bg-surface-2 w-full',\n fill: 'h-full rounded-pill bg-accent',\n },\n variants: {\n size: {\n sm: { track: 'h-1' },\n md: { track: 'h-2' },\n },\n },\n defaultVariants: { size: 'sm' },\n})\n\nexport type ProgressBarVariants = VariantProps<typeof progressBarStyles>\nexport type ProgressBarProps = Omit<AriaProgressBarProps, 'children' | 'className'> &\n ProgressBarVariants & {\n className?: string\n }\n\nexport function ProgressBar({ size, className, ...props }: ProgressBarProps) {\n const { track, fill } = progressBarStyles({ size })\n return (\n <AriaProgressBar {...props} className={cn('block', className)}>\n {({ percentage, isIndeterminate }) => (\n <div className={track()}>\n {isIndeterminate ? (\n <div className={cn(fill(), 'absolute w-[35%] animate-indeterminate-progress')} />\n ) : (\n <div\n className={cn(fill(), 'transition-[width] duration-150')}\n style={{ width: `${percentage ?? 0}%` }}\n />\n )}\n </div>\n )}\n </AriaProgressBar>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n type RadioGroupProps as AriaRadioGroupProps,\n type RadioProps as AriaRadioProps,\n FieldError,\n Label,\n Text,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport { fieldErrorStyles, fieldHintStyles, fieldLabelStyles } from '../field/field'\n\n/* =========================================================================\n RadioGroup — exclusive-choice field. Monolithic API to match Input/Select/\n Combobox/DatePicker: label / description / errorMessage props on the group,\n `<Radio>` children for each option.\n ========================================================================= */\n\nexport type RadioGroupProps = Omit<AriaRadioGroupProps, 'children'> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** `<Radio>` elements. Function-as-children is not supported at the group level. */\n children: ReactNode\n}\n\nexport function RadioGroup({\n label,\n description,\n errorMessage,\n orientation = 'vertical',\n children,\n className,\n ...props\n}: RadioGroupProps) {\n return (\n <AriaRadioGroup\n {...props}\n orientation={orientation}\n className={(renderProps) =>\n cn('grid gap-2', typeof className === 'function' ? className(renderProps) : className)\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <div\n className={cn(\n orientation === 'horizontal'\n ? 'flex flex-wrap items-center gap-x-4 gap-y-2'\n : 'grid gap-3',\n )}\n >\n {children}\n </div>\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage ? <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError> : null}\n </AriaRadioGroup>\n )\n}\n\nexport type RadioProps = Omit<AriaRadioProps, 'children'> & {\n children?: ReactNode\n}\n\nexport function Radio({ children, className, ...props }: RadioProps) {\n return (\n <AriaRadio\n {...props}\n className={(renderProps) =>\n cn(\n // `relative` for the same reason as Checkbox / Switch: RAC's\n // visually-hidden <input> is absolutely positioned and must resolve\n // against this radio, not a far-away shell, or focusing it scrolls\n // the clipped page.\n 'group relative inline-flex items-center gap-2.5 cursor-pointer',\n 'font-sans text-[14px] text-ink-2 select-none',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <span\n aria-hidden\n className={cn(\n 'relative inline-flex items-center justify-center shrink-0',\n 'size-[18px] rounded-full border bg-surface border-ink-4',\n 'transition-[border-color,box-shadow] duration-150',\n 'group-data-[hovered]:border-ink',\n 'group-data-[selected]:border-ink',\n 'group-data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n <span\n className={cn(\n 'block size-[10px] rounded-full bg-accent',\n 'transition-opacity duration-150 opacity-0',\n 'group-data-[selected]:opacity-100',\n )}\n />\n </span>\n {children}\n </AriaRadio>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Combobox, type ComboboxOption } from '../combobox/combobox'\nimport type { FieldSize } from '../field/field'\nimport type { FilterField } from './types'\n\n/* =========================================================================\n AttributePicker — inline typeahead picker for filterable fields. Thin\n wrapper over lib `Combobox` that maps `FilterField[]` into options and\n surfaces the type tag in each row's description slot.\n\n Rendered inline (no outer popover) so it can occupy the field cell of a\n filter row directly. The Combobox's internal popover hosts the dropdown.\n With `autoFocus + menuTrigger=\"focus\"`, the menu opens immediately on\n mount — the standard \"click + Add → row appears with picker open\"\n experience.\n ========================================================================= */\n\nexport type AttributePickerProps = {\n fields: ReadonlyArray<FilterField>\n /** Currently picked field path. Empty string means \"no field picked yet\". */\n value: string\n onChange: (picked: FilterField) => void\n autoFocus?: boolean\n isDisabled?: boolean\n /** Field size. Defaults to `sm` since this picker only ships inside the\n * filter row; `md` is exposed for future stand-alone uses. */\n size?: FieldSize\n /** Visual override for the field wrapper. */\n className?: string\n}\n\nexport function AttributePicker({\n fields,\n value,\n onChange,\n autoFocus = false,\n isDisabled,\n size = 'sm',\n className,\n}: AttributePickerProps) {\n const options: ComboboxOption<string>[] = fields.map((f) => ({\n id: f.path,\n label: f.label,\n description: <FieldTypeTag>{f.type}</FieldTypeTag>,\n }))\n\n return (\n <Combobox<string>\n aria-label=\"Find attribute\"\n placeholder=\"Find attribute…\"\n options={options}\n selectedKey={value === '' ? null : value}\n onSelectionChange={(key) => {\n if (key == null) return\n const picked = fields.find((f) => f.path === String(key))\n if (picked) onChange(picked)\n }}\n // Auto-open the dropdown on focus so a freshly-mounted picker shows\n // its options without a second click.\n menuTrigger=\"focus\"\n autoFocus={autoFocus}\n size={size}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n className={cn('w-full', className)}\n />\n )\n}\n\nfunction FieldTypeTag({ children }: { children: ReactNode }) {\n return (\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">{children}</span>\n )\n}\n","/* =========================================================================\n Field-label composition — how a nested or related field reads in the\n picker, the chips rail and the operator row.\n\n A `FilterField` path is hierarchical: an object leaf (`address.city`) and\n a field reached through a relation (`company_id.name`) both render as a\n breadcrumb. The separator lives here because BOTH sides compose it — the\n consumer builds `FilterField.label` from an entity, and the chips rail\n builds its own breadcrumb from `parentLabel` — and a mismatch between the\n two shows up as one chip reading \"Company · Name\" next to another reading\n \"Company / Name\".\n ========================================================================= */\n\n/**\n * U+00B7 MIDDLE DOT, spaced. The same separator the app already uses for\n * breadcrumb-ish text (\"Segment · SaaS decision makers\"), and quieter than a\n * slash at the small type sizes these labels render at — the eye reads the\n * words, not the punctuation.\n */\nexport const FIELD_LABEL_SEPARATOR = ' · '\n\n/**\n * Joins breadcrumb parts with {@link FIELD_LABEL_SEPARATOR}, skipping empties\n * so a field with no parent renders as its own label rather than with a\n * leading separator.\n */\nexport function joinFieldLabel(...parts: ReadonlyArray<string | undefined | null>): string {\n return parts.filter((part): part is string => !!part && part.length > 0).join(FIELD_LABEL_SEPARATOR)\n}\n","import type {\n ComparisonOperator,\n FilterFieldType,\n FilterValue,\n OperatorArity,\n OperatorDescriptor,\n} from './types'\n\n/* =========================================================================\n Operator catalogue — single source of truth for which operators apply\n to which field types and how many values each takes. Mirrors the\n backend enum at `core-model/comparison-operator.go` and the design's\n `OPERATORS` table.\n ========================================================================= */\n\nexport const OPERATORS: ReadonlyArray<OperatorDescriptor> = [\n {\n id: 'eq',\n label: 'is',\n arity: 1,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n {\n id: 'ne',\n label: 'is not',\n arity: 1,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n {\n id: 'in',\n label: 'is any of',\n arity: 'n',\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'enum',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n {\n id: 'not_in',\n label: 'is none of',\n arity: 'n',\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'enum',\n 'relation',\n 'user',\n 'principal',\n 'contact-address',\n ],\n },\n { id: 'contains', label: 'contains', arity: 1, types: ['string', 'array', 'contact-address'] },\n { id: 'starts_with', label: 'starts with', arity: 1, types: ['string', 'contact-address'] },\n { id: 'ends_with', label: 'ends with', arity: 1, types: ['string', 'contact-address'] },\n {\n id: 'gt',\n label: 'is greater than',\n arity: 1,\n types: ['number', 'integer', 'currency', 'datetime'],\n },\n { id: 'gte', label: 'is on or after', arity: 1, types: ['datetime'] },\n {\n id: 'lt',\n label: 'is less than',\n arity: 1,\n types: ['number', 'integer', 'currency', 'datetime'],\n },\n { id: 'lte', label: 'is on or before', arity: 1, types: ['datetime'] },\n {\n id: 'empty',\n label: 'is empty',\n arity: 0,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'array',\n 'relation',\n 'user',\n 'principal',\n 'file',\n 'contact-address',\n ],\n },\n {\n id: 'not_empty',\n label: 'is not empty',\n arity: 0,\n types: [\n 'string',\n 'number',\n 'integer',\n 'currency',\n 'datetime',\n 'enum',\n 'boolean',\n 'array',\n 'relation',\n 'user',\n 'principal',\n 'file',\n 'contact-address',\n ],\n },\n]\n\nconst OP_LABEL_OVERRIDES: Partial<\n Record<FilterFieldType, Partial<Record<ComparisonOperator, string>>>\n> = {\n number: { gt: 'is greater than', lt: 'is less than', eq: 'equals', ne: 'does not equal' },\n integer: { gt: 'is greater than', lt: 'is less than', eq: 'equals', ne: 'does not equal' },\n currency: { gt: 'is greater than', lt: 'is less than', eq: 'equals', ne: 'does not equal' },\n datetime: { eq: 'is on', ne: 'is not on', gt: 'is after', lt: 'is before' },\n array: { contains: 'contains', empty: 'is empty', not_empty: 'is not empty' },\n boolean: { eq: 'is', ne: 'is not' },\n}\n\nexport function operatorsForType(type: FilterFieldType): ReadonlyArray<OperatorDescriptor> {\n return OPERATORS.filter((op) => op.types.includes(type)).map((op) => {\n const override = OP_LABEL_OVERRIDES[type]?.[op.id]\n return override ? { ...op, label: override } : op\n })\n}\n\nexport function operatorById(id: ComparisonOperator): OperatorDescriptor | undefined {\n return OPERATORS.find((o) => o.id === id)\n}\n\nexport function arityOf(operator: ComparisonOperator): OperatorArity {\n return operatorById(operator)?.arity ?? 1\n}\n\n/* =========================================================================\n Default value for a fresh row, given the field type and the chosen\n operator's arity. Keeps the value shape consistent with `FilterValue`.\n ========================================================================= */\nexport function defaultValueFor(type: FilterFieldType, arity: OperatorArity): FilterValue {\n if (arity === 0) return null\n if (arity === 'n') return []\n if (type === 'boolean') return true\n return ''\n}\n","import { createContext, type ReactNode, useContext } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Badge } from '../badge/badge'\nimport { arityOf } from './operators'\nimport type { ComparisonOperator, FilterField, FilterValue } from './types'\n\n/* =========================================================================\n ChipValue — renders the value cell shown inside an active filter chip.\n\n Arity orchestration lives here (single value vs list with \"+N\" overflow\n vs nothing). Per-item rendering can be overridden via `renderItem` —\n LUM-34 wires this to the page-layout control registry's Display so\n chip rendering matches what's on the record-detail page (proper\n relation titles, formatted dates, etc.). Lib default keeps the legacy\n enum-Badge + truncate-text behaviour for callers without the registry.\n ========================================================================= */\n\n/**\n * Per-value-item renderer. Called once per value (twice for arity 'n'\n * with two items, etc.) AFTER arity orchestration. Return `undefined`\n * to fall through to the lib default for that item.\n */\nexport type ChipValueItemRenderer = (props: {\n field: FilterField\n operator: ComparisonOperator\n value: string\n}) => ReactNode | undefined\n\n/* =========================================================================\n Context — same pattern as RenderValueInputProvider. A top-level\n provider lets every <ChipValue> in the tree inherit one renderer\n without per-mount wiring. The provider skips wrapping when\n `renderer === undefined` so intermediate components don't shadow an\n outer provider with `undefined`.\n ========================================================================= */\n\nconst RenderChipItemContext = createContext<ChipValueItemRenderer | undefined>(undefined)\n\nexport function RenderChipItemProvider({\n renderer,\n children,\n}: {\n renderer: ChipValueItemRenderer | undefined\n children: ReactNode\n}) {\n if (renderer === undefined) return <>{children}</>\n return (\n <RenderChipItemContext.Provider value={renderer}>{children}</RenderChipItemContext.Provider>\n )\n}\n\nexport function useRenderChipItem(): ChipValueItemRenderer | undefined {\n return useContext(RenderChipItemContext)\n}\n\nexport type ChipValueProps = {\n field: FilterField\n operator: ComparisonOperator\n value: FilterValue\n /** Override per-value-item rendering (LUM-34: registry dispatch). */\n renderItem?: ChipValueItemRenderer\n}\n\nexport function ChipValue({ field, operator, value, renderItem }: ChipValueProps) {\n const arity = arityOf(operator)\n if (arity === 0) return null\n\n if (arity === 'n') {\n const arr = Array.isArray(value)\n ? value\n : typeof value === 'string' && value.length > 0\n ? value.split(',').filter(Boolean)\n : []\n if (arr.length === 0) return <Em>—</Em>\n const shown = arr.slice(0, 2)\n return (\n <span className=\"inline-flex items-center gap-1\">\n {shown.map((v) => (\n <ChipItem\n key={v}\n field={field}\n operator={operator}\n value={v}\n {...(renderItem !== undefined ? { renderItem } : {})}\n />\n ))}\n {arr.length > 2 ? (\n <span className=\"font-mono text-[11px] text-ink-3\">+{arr.length - 2}</span>\n ) : null}\n </span>\n )\n }\n\n // arity 1\n if (value === '' || value == null) return <Em>—</Em>\n return (\n <ChipItem\n field={field}\n operator={operator}\n value={String(value)}\n {...(renderItem !== undefined ? { renderItem } : {})}\n />\n )\n}\n\nfunction ChipItem({\n field,\n operator,\n value,\n renderItem,\n}: {\n field: FilterField\n operator: ComparisonOperator\n value: string\n renderItem?: ChipValueItemRenderer\n}) {\n // Explicit prop wins; otherwise fall back to context (set by a\n // top-level RenderChipItemProvider); finally the lib default below.\n const contextRenderer = useRenderChipItem()\n const effectiveRenderer = renderItem ?? contextRenderer\n if (effectiveRenderer) {\n const custom = effectiveRenderer({ field, operator, value })\n if (custom !== undefined) return <>{custom}</>\n }\n // Lib default: enum → Badge with variant lookup; other → truncated mono text.\n if (field.type === 'enum') {\n const option = findEnumOption(field, value)\n return (\n <Badge\n variant={option?.variant}\n shape=\"rounded\"\n hasDot={false}\n {...(option?.color ? { color: option.color } : {})}\n {...(option?.icon ? { icon: option.icon } : {})}\n >\n {option?.label ?? value}\n </Badge>\n )\n }\n return (\n <span className={cn('font-mono text-[12px] text-ink max-w-[10rem] truncate')}>\n {formatValue(field, operator, value)}\n </span>\n )\n}\n\nfunction Em({ children }: { children: string }) {\n return <span className=\"font-mono text-[12px] text-ink-4\">{children}</span>\n}\n\n/** The declared option for an enum value, if the field carries one. Central so\n * the badge, the multi-value summary and the single-value summary agree on\n * what a stored value is called. */\nfunction findEnumOption(field: FilterField, value: string) {\n return field.options?.find((option) => option.value === value)\n}\n\nexport function formatValue(\n field: FilterField,\n operator: ComparisonOperator,\n value: FilterValue,\n): string {\n const arity = arityOf(operator)\n if (arity === 0) return ''\n if (arity === 'n') {\n const arr = Array.isArray(value)\n ? value\n : typeof value === 'string' && value.length > 0\n ? value.split(',')\n : []\n if (arr.length === 0) return '—'\n if (field.type === 'enum') {\n const labels = arr.map((v) => findEnumOption(field, v)?.label ?? v)\n return labels.length <= 2\n ? labels.join(', ')\n : `${labels[0]}, ${labels[1]} +${labels.length - 2}`\n }\n return arr.length <= 2 ? arr.join(', ') : `${arr[0]}, ${arr[1]} +${arr.length - 2}`\n }\n if (field.type === 'boolean') return value === true || value === 'true' ? 'true' : 'false'\n if (value === '' || value == null) return '—'\n // An enum stores a system value (\"technical_decider\") and displays its\n // declared label (\"Technical Decider\"). The multi-value branch above and the\n // badge below already do this; a single value read as the raw slug, so the\n // same filter said \"is technical_decider\" or \"is any of Technical Decider\"\n // depending only on the operator.\n if (field.type === 'enum') {\n return findEnumOption(field, String(value))?.label ?? String(value)\n }\n if (field.type === 'number' || field.type === 'integer') {\n const n = Number(value)\n return Number.isFinite(n) ? n.toLocaleString() : String(value)\n }\n return String(value)\n}\n","import type { Key, ReactNode } from 'react'\nimport {\n Radio as AriaRadio,\n RadioGroup as AriaRadioGroup,\n type RadioGroupProps as AriaRadioGroupProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n SegmentedControl — small horizontal exclusive-choice group with pill\n chrome. Wraps RAC RadioGroup so keyboard nav and focus management are\n correct (arrow keys move between segments). Used for compact toggles\n like AND/OR joiners and true/false booleans where a full RadioGroup\n feels heavy.\n ========================================================================= */\n\nexport const segmentedControlStyles = tv({\n slots: {\n // `w-fit` keeps the group content-width even as a flex/grid item under a\n // stretching parent (e.g. a `flex flex-col` card body, whose default\n // align-items:stretch would otherwise pull it to full width). Consumers\n // can still opt into full width by passing `w-full` via className.\n group: 'inline-flex w-fit rounded-sm border border-rule-strong bg-surface p-0.5 gap-0.5',\n segment: [\n 'inline-flex items-center justify-center cursor-pointer',\n 'font-mono tracking-[0.04em] rounded-[3px] outline-none select-none',\n 'transition-[background-color,color] duration-150',\n 'data-[hovered]:text-ink',\n 'data-[selected]:bg-ink data-[selected]:text-surface',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)]',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n ],\n },\n variants: {\n size: {\n sm: { segment: 'px-2 py-0.5 text-[10.5px] tracking-[0.08em]' },\n md: { segment: 'px-2.5 py-1 text-[12px]' },\n },\n tone: {\n // Default: ink fill on selected.\n default: { segment: 'text-ink-3' },\n },\n },\n defaultVariants: { size: 'sm', tone: 'default' },\n})\n\nexport type SegmentedControlVariants = VariantProps<typeof segmentedControlStyles>\n\nexport type SegmentedControlOption<T extends Key = Key> = {\n id: T\n label: ReactNode\n isDisabled?: boolean\n}\n\nexport type SegmentedControlProps<T extends Key = Key> = Omit<\n AriaRadioGroupProps,\n 'children' | 'value' | 'onChange'\n> & {\n options: ReadonlyArray<SegmentedControlOption<T>>\n value: T\n onChange: (value: T) => void\n size?: SegmentedControlVariants['size']\n /** Focus the selected segment on mount. RAC's RadioGroup doesn't surface\n * `autoFocus` itself — it's a per-Radio prop — so we apply it to the\n * Radio whose value matches `value`. */\n autoFocus?: boolean\n /** Visual override for the group wrapper. */\n className?: string\n}\n\nexport function SegmentedControl<T extends Key>({\n options,\n value,\n onChange,\n size,\n autoFocus = false,\n className,\n orientation = 'horizontal',\n ...props\n}: SegmentedControlProps<T>) {\n const styles = segmentedControlStyles({ size })\n return (\n <AriaRadioGroup\n {...props}\n orientation={orientation}\n value={String(value)}\n onChange={(next) => onChange(next as T)}\n className={cn(styles.group(), className)}\n >\n {options.map((option) => (\n <AriaRadio\n key={String(option.id)}\n value={String(option.id)}\n {...(option.isDisabled ? { isDisabled: true } : {})}\n {...(autoFocus && option.id === value ? { autoFocus: true } : {})}\n className={styles.segment()}\n >\n {option.label}\n </AriaRadio>\n ))}\n </AriaRadioGroup>\n )\n}\n","import { type KeyboardEvent, type ReactNode, useEffect, useId, useRef, useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldChipPadding,\n fieldControlStyles,\n fieldErrorStyles,\n fieldHintStyles,\n fieldLabelStyles,\n fieldMinHeight,\n type FieldSize,\n fieldTextStyles,\n} from '../field/field'\n\n/* =========================================================================\n TagInput — free-form list of strings rendered as removable chips.\n Used for filter `in`/`not_in` value entry on non-enum types where the\n set of valid values isn't known up front.\n\n Behaviour:\n - Type into the trailing input → Enter or `,` commits as a tag.\n - Backspace on empty input → removes the last tag.\n - Click × on a chip → removes it.\n\n Controlled API only — `value: string[]` + `onChange`.\n ========================================================================= */\n\nexport type TagInputProps = {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Placeholder shown in the trailing input when there are no tags. */\n placeholder?: string\n /** Underlying `<input>` type. Use `'number'` to constrain numeric tags. */\n inputType?: 'text' | 'number'\n value: string[]\n onChange: (next: string[]) => void\n isDisabled?: boolean\n isInvalid?: boolean\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Focus the trailing input on mount. Used by the filter-row chain so\n * picking an operator with arity 'n' (and a non-enum field) lands focus\n * directly on the tag-entry input. */\n autoFocus?: boolean\n /** Visual override for the field wrapper. */\n className?: string\n}\n\nexport function TagInput({\n label,\n description,\n errorMessage,\n placeholder = 'Type, Enter to add',\n inputType = 'text',\n value,\n onChange,\n isDisabled = false,\n isInvalid = false,\n size = 'md',\n appearance,\n autoFocus = false,\n className,\n}: TagInputProps) {\n const styles = fieldControlStyles({ size, invalid: isInvalid, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n const minHeight = appearance === 'cell' ? 'min-h-[29px]' : fieldMinHeight[size]\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus) inputRef.current?.focus()\n // mount-only — autoFocus is a one-shot signal, not sustained.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const inputId = useId()\n const [draft, setDraft] = useState('')\n\n const commit = () => {\n const v = draft.trim()\n if (!v) return\n if (value.includes(v)) {\n setDraft('')\n return\n }\n onChange([...value, v])\n setDraft('')\n }\n\n const remove = (idx: number) => {\n onChange(value.filter((_, i) => i !== idx))\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault()\n commit()\n return\n }\n if (e.key === 'Backspace' && !draft && value.length > 0) {\n e.preventDefault()\n onChange(value.slice(0, -1))\n }\n }\n\n return (\n <div className={cn('grid grid-cols-1 gap-1.5', className)}>\n {label ? (\n <label htmlFor={inputId} className={fieldLabelStyles}>\n {label}\n </label>\n ) : null}\n\n <div\n data-invalid={isInvalid || undefined}\n data-disabled={isDisabled || undefined}\n className={cn(\n styles.box(),\n 'flex flex-wrap items-center gap-1',\n minHeight,\n fieldChipPadding[size],\n focusWithin,\n )}\n >\n {value.map((tag, idx) => (\n // tags are kept unique on commit, so the value alone is a stable key\n <span\n key={tag}\n className={cn(\n 'inline-flex items-center gap-1',\n 'px-1.5 py-0.5 rounded-sm bg-surface-3',\n 'font-mono text-[12px] text-ink-2',\n )}\n >\n <span className=\"max-w-[10rem] truncate\">{tag}</span>\n <button\n type=\"button\"\n aria-label={`Remove ${tag}`}\n disabled={isDisabled}\n onClick={() => remove(idx)}\n className={cn(\n 'inline-flex items-center justify-center',\n 'size-3.5 rounded-full text-ink-3 hover:text-ink hover:bg-surface-2',\n 'cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n 'disabled:opacity-45 disabled:cursor-not-allowed',\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2\" fill=\"none\">\n <path\n d=\"M2 2l6 6M8 2l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </span>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n type={inputType}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n onBlur={commit}\n disabled={isDisabled}\n placeholder={value.length === 0 ? placeholder : ''}\n className={cn(\n 'flex-1 min-w-[6rem] bg-transparent outline-none',\n 'font-sans text-ink placeholder:text-ink-4',\n fieldTextStyles[size],\n // No vertical padding — wrapper's p-1.5 + min-h-[size] govern the\n // overall height so it matches Input/Select at the same size.\n 'px-1.5',\n 'disabled:cursor-not-allowed disabled:opacity-45',\n )}\n />\n </div>\n\n {description ? <p className={fieldHintStyles}>{description}</p> : null}\n {errorMessage && appearance !== 'cell' ? (\n <p className={fieldErrorStyles}>{errorMessage}</p>\n ) : null}\n </div>\n )\n}\n","import { type CalendarDate, parseDate } from '@internationalized/date'\nimport { createContext, type ReactNode, useContext } from 'react'\nimport { cn } from '../../lib/cn'\nimport { Badge } from '../badge/badge'\nimport {\n BadgeMultiSelect,\n type BadgeMultiSelectOption,\n} from '../badge-multi-select/badge-multi-select'\nimport { DatePicker } from '../date-picker/date-picker'\nimport { Input } from '../input/input'\nimport { SegmentedControl } from '../segmented-control/segmented-control'\nimport { Select, type SelectOption } from '../select/select'\nimport { TagInput } from '../tag-input/tag-input'\nimport { arityOf } from './operators'\nimport type { ComparisonOperator, FilterField, FilterValue } from './types'\n\n/* =========================================================================\n FilterValueInput — type-aware value editor for a single filter element.\n Routes to the right primitive based on `(field.type, operator.arity)`:\n\n arity 0 → null (no input — for empty / not_empty)\n arity 'n' (in / not_in)\n enum → BadgeMultiSelect\n other → TagInput (free-form list)\n arity 1\n enum → Select with Badge in renderItem\n boolean → SegmentedControl (true / false)\n datetime → DatePicker\n other → Input (text or number)\n ========================================================================= */\n\n/**\n * Render-prop signature for overriding the default value editor. Called\n * with everything `FilterValueInput` knows about the leaf. Return a\n * `ReactNode` to take over rendering, or `undefined` to fall through to\n * the built-in branches (the common pattern: override one specific\n * `field.type`, return `undefined` for the rest).\n *\n * Used to plug in product-specific editors the lib can't know about —\n * e.g. a related-record picker that hits the SDK for typeahead.\n */\nexport type FilterValueInputRenderer = (props: {\n field: FilterField\n operator: ComparisonOperator\n value: FilterValue\n onChange: (next: FilterValue) => void\n autoFocus?: boolean\n isDisabled?: boolean\n}) => ReactNode | undefined\n\n/* =========================================================================\n Context — the renderer is injected via React context rather than a\n prop drilled through five levels of intermediates. Top-level entry\n points (RecordFilterEditor, RecordFilterButton, RecordFilterChips,\n RecordFilterBuilderPanel) wrap their tree in `RenderValueInputProvider`;\n `FilterValueInput` reads from `useRenderValueInput()`. Adding future\n slots (operator picker, attribute picker) follows the same shape\n without growing the public prop surface of internal components.\n ========================================================================= */\n\nconst RenderValueInputContext = createContext<FilterValueInputRenderer | undefined>(undefined)\n\nexport function RenderValueInputProvider({\n renderer,\n children,\n}: {\n renderer: FilterValueInputRenderer | undefined\n children: ReactNode\n}) {\n // Skip wrapping when there's no renderer so intermediate components\n // (e.g. RecordFilterEditor when invoked inside RecordFilterBuilderPanel)\n // don't shadow the outer provider's value with `undefined`. The closest\n // provider wins in React's context model, so an undefined-wrapping\n // intermediate would silently break the chain from outer entry points.\n if (renderer === undefined) return <>{children}</>\n return (\n <RenderValueInputContext.Provider value={renderer}>{children}</RenderValueInputContext.Provider>\n )\n}\n\nexport function useRenderValueInput(): FilterValueInputRenderer | undefined {\n return useContext(RenderValueInputContext)\n}\n\nexport type FilterValueInputProps = {\n field: FilterField\n operator: ComparisonOperator\n value: FilterValue\n onChange: (next: FilterValue) => void\n isDisabled?: boolean\n /** When true, focus the routed leaf on mount. The wrapping `<div>` is\n * keyed on `${field.path}-${operator}`, so an operator change remounts\n * the leaf and re-fires its `autoFocus` reliably across all six leaf\n * branches. Committed values come from props so they survive remount;\n * mid-typed drafts (TagInput buffer, DatePicker partial segment,\n * Combobox search) are reset — acceptable since the user took the\n * deliberate operator-change action. */\n autoFocus?: boolean\n className?: string\n}\n\nexport function FilterValueInput({\n field,\n operator,\n value,\n onChange,\n isDisabled,\n autoFocus = false,\n className,\n}: FilterValueInputProps) {\n const renderValueInput = useRenderValueInput()\n const arity = arityOf(operator)\n if (arity === 0) return null\n\n // Context-provided override (e.g. relation picker). Called first so\n // it can claim any (field.type, operator) combination; returning\n // `undefined` falls through to the built-in branches below.\n if (renderValueInput) {\n const custom = renderValueInput({\n field,\n operator,\n value,\n onChange,\n autoFocus,\n ...(isDisabled !== undefined ? { isDisabled } : {}),\n })\n if (custom !== undefined) {\n return <div key={`${field.path}-${operator}`}>{custom}</div>\n }\n }\n\n const leaf = (() => {\n /* ---------- multi-value (in / not_in) ---------- */\n if (arity === 'n') {\n if (field.type === 'enum') {\n return (\n <EnumMultiValue\n field={field}\n value={asStringArray(value)}\n onChange={(next) => onChange(next)}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n return (\n <TagInput\n size=\"sm\"\n value={asStringArray(value)}\n onChange={(next) => onChange(next)}\n inputType={\n field.type === 'number' || field.type === 'integer' || field.type === 'currency'\n ? 'number'\n : 'text'\n }\n placeholder=\"Type, Enter to add\"\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n\n /* ---------- single value ---------- */\n if (field.type === 'enum') {\n return (\n <EnumSingleValue\n field={field}\n value={asString(value)}\n onChange={(next) => onChange(next)}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n\n if (field.type === 'boolean') {\n return (\n <SegmentedControl<'true' | 'false'>\n size=\"md\"\n aria-label=\"Boolean value\"\n options={[\n { id: 'true', label: 'true' },\n { id: 'false', label: 'false' },\n ]}\n value={asBoolean(value) ? 'true' : 'false'}\n onChange={(v) => onChange(v === 'true')}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(className !== undefined ? { className } : {})}\n />\n )\n }\n\n if (field.type === 'datetime') {\n const stringValue = asString(value)\n let parsed: CalendarDate | null = null\n try {\n parsed = stringValue ? parseDate(stringValue) : null\n } catch {\n parsed = null\n }\n return (\n <DatePicker\n size=\"sm\"\n aria-label={field.label}\n value={parsed}\n onChange={(next) => onChange(next ? next.toString() : '')}\n autoFocus={autoFocus}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n className={cn('w-full', className)}\n />\n )\n }\n\n // string / number / integer\n return (\n <Input\n size=\"sm\"\n aria-label={field.label}\n value={asString(value)}\n onChange={(next) => onChange(next)}\n placeholder={placeholderFor(field, operator)}\n inputProps={{\n type:\n field.type === 'number' || field.type === 'integer' || field.type === 'currency'\n ? 'number'\n : (field.inputType ?? 'text'),\n ...(autoFocus ? { autoFocus: true } : {}),\n }}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n className={cn('w-full', className)}\n />\n )\n })()\n\n // Key forces a fresh mount on every operator change so the leaf's\n // `autoFocus` re-fires reliably even when the leaf component type is\n // unchanged (e.g. `eq` → `not_eq`, both string-arity-1 → both `Input`).\n return <div key={`${field.path}-${operator}`}>{leaf}</div>\n}\n\n/* ----- enum single via lib `Select` with Badge in renderItem ----------- */\nfunction EnumSingleValue({\n field,\n value,\n onChange,\n isDisabled,\n autoFocus,\n className,\n}: {\n field: FilterField\n value: string\n onChange: (next: string) => void\n isDisabled?: boolean\n autoFocus?: boolean\n className?: string\n}) {\n const options: SelectOption<string>[] = (field.options ?? []).map((o) => ({\n id: o.value,\n label: o.label,\n }))\n return (\n <Select<string>\n size=\"sm\"\n aria-label={field.label}\n options={options}\n selectedKey={value === '' ? null : value}\n onSelectionChange={(next) => onChange(next == null ? '' : String(next))}\n renderItem={(o) => {\n const option = field.options?.find((x) => x.value === o.id)\n return (\n <Badge\n variant={option?.variant}\n {...(option?.color ? { color: option.color } : {})}\n {...(option?.icon ? { icon: option.icon } : {})}\n >\n {o.label}\n </Badge>\n )\n }}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(autoFocus ? { autoFocus: true } : {})}\n className={cn('w-full', className)}\n />\n )\n}\n\n/* ----- enum multi via lib `BadgeMultiSelect` --------------------------- */\nfunction EnumMultiValue({\n field,\n value,\n onChange,\n isDisabled,\n autoFocus,\n className,\n}: {\n field: FilterField\n value: string[]\n onChange: (next: string[]) => void\n isDisabled?: boolean\n autoFocus?: boolean\n className?: string\n}) {\n const options: BadgeMultiSelectOption<string>[] = (field.options ?? []).map((o) => ({\n id: o.value,\n label: o.label,\n ...(o.variant ? { variant: o.variant } : {}),\n ...(o.color ? { color: o.color } : {}),\n ...(o.icon ? { icon: o.icon } : {}),\n }))\n return (\n <BadgeMultiSelect<string>\n size=\"sm\"\n options={options}\n selectedKeys={value}\n onSelectionChange={(keys) => onChange(Array.from(keys))}\n placeholder=\"Select values…\"\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(autoFocus ? { autoFocus: true } : {})}\n className={cn('w-full', className)}\n />\n )\n}\n\n/* ----- value coercers --------------------------------------------------- */\n\nfunction asString(v: FilterValue): string {\n if (v == null) return ''\n if (typeof v === 'string') return v\n if (typeof v === 'boolean') return v ? 'true' : 'false'\n if (Array.isArray(v)) return v.join(',')\n return ''\n}\n\nfunction asStringArray(v: FilterValue): string[] {\n if (Array.isArray(v)) return v\n if (typeof v === 'string' && v.length > 0)\n return v\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n return []\n}\n\nfunction asBoolean(v: FilterValue): boolean {\n if (typeof v === 'boolean') return v\n if (typeof v === 'string') return v === 'true'\n return false\n}\n\nfunction placeholderFor(field: FilterField, operator: ComparisonOperator): string {\n if (field.type === 'datetime') return 'yyyy-mm-dd'\n if (field.type === 'number' || field.type === 'integer' || field.type === 'currency') return '0'\n if (operator === 'starts_with') return 'starts with…'\n if (operator === 'ends_with') return 'ends with…'\n if (operator === 'contains') return 'contains…'\n return 'value'\n}\n","import { cn } from '../../lib/cn'\nimport type { FieldSize } from '../field/field'\nimport { Select, type SelectOption } from '../select/select'\nimport { operatorsForType } from './operators'\nimport type { ComparisonOperator, FilterFieldType } from './types'\n\n/* =========================================================================\n OperatorPicker — small dropdown of operators valid for the given field\n type. Wraps lib `Select` and inherits its compact `sm` chrome so it lines\n up byte-for-byte with the AttributePicker beside it.\n ========================================================================= */\n\nexport type OperatorPickerProps = {\n fieldType: FilterFieldType\n value: ComparisonOperator\n onChange: (next: ComparisonOperator) => void\n isDisabled?: boolean\n /** Auto-focus the trigger on mount. Used by the chip mini-editor so focus\n * lands on the operator (the field is already chosen, the operator is the\n * natural next thing to tweak). */\n autoFocus?: boolean\n /** Field size. Defaults to `sm` to match the filter row. */\n size?: FieldSize\n /** Visual override for the trigger wrapper (sizing). */\n className?: string\n /** Per-field allowlist override (LUM-34). When provided, picks operators\n * from this list instead of `operatorsForType(fieldType)`. */\n operators?: ReadonlyArray<ComparisonOperator>\n}\n\nexport function OperatorPicker({\n fieldType,\n value,\n onChange,\n isDisabled,\n autoFocus,\n size = 'sm',\n className,\n operators,\n}: OperatorPickerProps) {\n const allForType = operatorsForType(fieldType)\n const ops = operators ? allForType.filter((op) => operators.includes(op.id)) : allForType\n const options: SelectOption<ComparisonOperator>[] = ops.map((op) => ({\n id: op.id,\n label: op.label,\n }))\n\n return (\n <Select<ComparisonOperator>\n aria-label=\"Operator\"\n options={options}\n selectedKey={value}\n onSelectionChange={(next) => onChange(next as ComparisonOperator)}\n size={size}\n {...(isDisabled !== undefined ? { isDisabled } : {})}\n {...(autoFocus ? { autoFocus: true } : {})}\n className={cn('w-full', className)}\n // `min-w-0` lets the trigger shrink so its <SelectValue> can truncate.\n triggerClassName=\"min-w-0\"\n />\n )\n}\n","import { useEffect } from 'react'\nimport { cn } from '../../lib/cn'\nimport { AttributePicker } from './attribute-picker'\nimport { FilterValueInput } from './filter-value-input'\nimport { OperatorPicker } from './operator-picker'\nimport { defaultValueFor, operatorById, operatorsForType } from './operators'\nimport type {\n ComparisonOperator,\n FilterElement,\n FilterField,\n FilterValue,\n LogicalOperator,\n} from './types'\n\n/* =========================================================================\n FilterRow — one element in the builder body. Layout:\n\n [ joiner gutter ] [ AttributePicker ] [ operator ] [ value-input ] … [ × ]\n\n The first cell is always an inline `AttributePicker` (Combobox). When\n the row's field is unset (empty path), only the picker renders — the\n operator/value/× cells appear as soon as a field is chosen. This is\n how \"+ Add filter\" produces a fresh row that auto-focuses the picker\n with its dropdown open.\n ========================================================================= */\n\nexport type FilterRowProps = {\n index: number\n joiner: LogicalOperator\n /** Resolved field metadata. `undefined` means the row's field is unset. */\n field?: FilterField\n element: FilterElement\n fields: ReadonlyArray<FilterField>\n /** Auto-focus the AttributePicker on mount (e.g. for newly added rows). */\n autoFocus?: boolean\n /** Auto-focus the OperatorPicker on mount. Used right after a pending\n * row's field is picked: the row remounts (its `key` changes), and we\n * want focus to advance from the AttributePicker to the operator. */\n autoFocusOperator?: boolean\n /** Fires once after a mount that consumed `autoFocusOperator`, so the\n * parent can clear its tracking index. */\n onAutoFocusOperatorConsumed?: () => void\n /** Auto-focus the value cell on mount. Forwarded into FilterValueInput,\n * whose key-based remount on operator change makes this re-fire reliably\n * across leaf types. */\n autoFocusValue?: boolean\n /** Fires once after a mount that consumed `autoFocusValue`. */\n onAutoFocusValueConsumed?: () => void\n /** Fires when the user submits the row from a plain text/number value\n * Input (Enter). Used by the builder panel to chain \"commit + add new\n * pending row\". The chip mini-editor passes its own form-submit handler\n * here if it wants the same behaviour. */\n onSubmit?: () => void\n onChangeField: (next: FilterField) => void\n onChangeOperator: (next: ComparisonOperator) => void\n onChangeValue: (next: FilterValue) => void\n onRemove: () => void\n /** Optional \"wrap in group\" affordance — when present, a hover-only icon\n * appears next to the remove button. Used by the recursive popover panel\n * when `isComplexEnabled` is on. */\n onWrap?: () => void\n}\n\nexport function FilterRow({\n index,\n joiner,\n field,\n element,\n fields,\n autoFocus = false,\n autoFocusOperator = false,\n onAutoFocusOperatorConsumed,\n autoFocusValue = false,\n onAutoFocusValueConsumed,\n onSubmit,\n onChangeField,\n onChangeOperator,\n onChangeValue,\n onRemove,\n onWrap,\n}: FilterRowProps) {\n // One-shot: tell the parent to clear its tracking index so a future remount\n // at the same index doesn't re-trigger.\n useEffect(() => {\n if (autoFocusOperator) onAutoFocusOperatorConsumed?.()\n if (autoFocusValue) onAutoFocusValueConsumed?.()\n // Mount-only — these are hand-off signals, not sustained props.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n return (\n <div\n className={cn(\n 'group flex items-center gap-2 px-1.5 py-1 rounded-sm',\n 'hover:bg-[color-mix(in_oklab,var(--color-surface-2)_50%,var(--color-surface))]',\n )}\n >\n {/* Joiner gutter — narrow fixed column to keep all rows aligned. The\n three editor cells below flex to fill the remaining width. */}\n <span className=\"w-12 shrink-0 inline-flex justify-end pr-1\">\n <span\n className={cn(\n 'font-mono text-[10.5px] tracking-[0.08em]',\n index === 0 ? 'text-ink-4' : 'text-accent-ink',\n )}\n >\n {index === 0 ? 'WHERE' : joiner.toUpperCase()}\n </span>\n </span>\n\n {/* Field picker — flex column. min-w guarantees the typeahead stays\n legible at typical popover widths; basis-0 lets flex distribute\n excess space proportionally. */}\n <div className=\"flex-1 basis-0 min-w-[140px]\">\n <AttributePicker\n fields={fields}\n value={element.field}\n onChange={onChangeField}\n autoFocus={autoFocus}\n className=\"w-full\"\n />\n </div>\n\n {/* Operator + value — only render once a field is picked. */}\n {field ? (\n <>\n <div className=\"flex-1 basis-0 min-w-[110px]\">\n <OperatorPicker\n fieldType={field.type}\n value={element.operator}\n onChange={onChangeOperator}\n autoFocus={autoFocusOperator}\n className=\"w-full\"\n {...(field.filterOperators !== undefined\n ? { operators: field.filterOperators }\n : {})}\n />\n </div>\n {/* Value gets ~2× the share of field/operator since values like\n chip lists or date pickers are widest. */}\n <div\n className=\"flex-[2] basis-0 min-w-0\"\n onKeyDown={(e) => {\n // Enter inside a plain text/number <input> commits the row\n // (state already lives in `filter`) and lets the parent add a\n // fresh pending row. RAC controls (Combobox, Select, TagInput,\n // BadgeMultiSelect) all `preventDefault` on Enter for their\n // own selection/commit semantics, so `defaultPrevented` filters\n // them out. DateSegment renders as a <div role=\"spinbutton\">,\n // not INPUT — so the tagName check excludes it too.\n if (e.key !== 'Enter' || e.defaultPrevented) return\n const t = e.target as HTMLElement\n if (t.tagName !== 'INPUT') return\n const inputType = (t as HTMLInputElement).type\n if (inputType !== 'text' && inputType !== 'number') return\n if (!onSubmit) return\n e.preventDefault()\n onSubmit()\n }}\n >\n <FilterValueInput\n field={field}\n operator={element.operator}\n value={element.value}\n onChange={onChangeValue}\n autoFocus={autoFocusValue}\n />\n </div>\n </>\n ) : (\n // Spacer reserves the operator + value flex share so the field\n // picker doesn't balloon across the whole row before a field is\n // chosen.\n <div className=\"flex-[3] basis-0 min-w-0\" />\n )}\n\n {onWrap && field ? (\n <button\n type=\"button\"\n onClick={onWrap}\n aria-label=\"Wrap in group\"\n title=\"Wrap in a group with the opposite operator\"\n className={cn(\n 'shrink-0 size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'opacity-0 group-hover:opacity-100 focus-visible:opacity-100',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3M9 3a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3\" />\n </svg>\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={field ? 'Remove filter' : 'Cancel'}\n className={cn(\n 'shrink-0 size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-4 hover:text-danger hover:bg-surface-2 cursor-pointer outline-none',\n field ? 'opacity-0 group-hover:opacity-100 focus-visible:opacity-100' : 'opacity-100',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 4h8M5 4V3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1M4.5 4l.5 7a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1l.5-7\" />\n </svg>\n </button>\n </div>\n )\n}\n\n/* =========================================================================\n When the user changes the field on a row, decide whether the existing\n operator is still valid. If yes, keep the value. If no, swap to the\n first operator for the new type and reset the value to its default.\n Exported so the builder + chip mini-editor can share the rule.\n ========================================================================= */\nexport function rebaseRowOnFieldChange(element: FilterElement, next: FilterField): FilterElement {\n const newOps = operatorsForType(next.type)\n const stillValid = newOps.find((o) => o.id === element.operator)\n const nextOp = stillValid ?? newOps[0]\n if (!nextOp) {\n return { ...element, field: next.path }\n }\n return {\n field: next.path,\n operator: nextOp.id,\n value: stillValid ? element.value : defaultValueFor(next.type, nextOp.arity),\n }\n}\n\nexport function rebaseRowOnOperatorChange(\n element: FilterElement,\n field: FilterField,\n nextOperator: ComparisonOperator,\n): FilterElement {\n const next = operatorById(nextOperator)\n const prev = operatorById(element.operator)\n const arityChanged = next?.arity !== prev?.arity\n return {\n ...element,\n operator: nextOperator,\n value: arityChanged ? defaultValueFor(field.type, next?.arity ?? 1) : element.value,\n }\n}\n","import { defaultValueFor, operatorsForType } from './operators'\nimport type { FilterElement, FilterField, FilterGroup, LogicalOperator } from './types'\n\n/* =========================================================================\n group-mutations — pure immutable helpers that produce a new `FilterGroup`\n from the previous one + an action. The recursive popover panel composes\n these instead of inlining `{ ...g, elements: g.elements.map(...) }`\n spaghetti.\n\n Invariants:\n - Inputs are never mutated.\n - Index parameters refer to position within the relevant sub-array\n (`elements` for leaves, `groups` for sub-groups). The two arrays are\n addressed independently — the renderer treats them as ordered children\n by concatenation (leaves first, then groups).\n ========================================================================= */\n\nexport function addLeaf(group: FilterGroup, field: FilterField): FilterGroup {\n const ops = operatorsForType(field.type)\n const op = ops[0]\n if (!op) return group\n const next: FilterElement = {\n field: field.path,\n operator: op.id,\n value: defaultValueFor(field.type, op.arity),\n }\n return { ...group, elements: [...(group.elements ?? []), next] }\n}\n\nexport function addPendingLeaf(group: FilterGroup): FilterGroup {\n const next: FilterElement = { field: '', operator: 'eq', value: '' }\n return { ...group, elements: [...(group.elements ?? []), next] }\n}\n\nexport function addSubgroup(\n group: FilterGroup,\n joiner: LogicalOperator = oppositeJoiner(group.logicalOperator),\n): FilterGroup {\n const sub: FilterGroup = { logicalOperator: joiner, elements: [], groups: [] }\n return { ...group, groups: [...(group.groups ?? []), sub] }\n}\n\nexport function removeLeaf(group: FilterGroup, index: number): FilterGroup {\n const elements = group.elements ?? []\n return { ...group, elements: elements.filter((_, i) => i !== index) }\n}\n\nexport function removeSubgroup(group: FilterGroup, index: number): FilterGroup {\n const groups = group.groups ?? []\n return { ...group, groups: groups.filter((_, i) => i !== index) }\n}\n\nexport function updateLeaf(\n group: FilterGroup,\n index: number,\n patch: Partial<FilterElement> | FilterElement,\n): FilterGroup {\n const elements = group.elements ?? []\n return {\n ...group,\n elements: elements.map((el, i) => (i === index ? { ...el, ...patch } : el)),\n }\n}\n\nexport function replaceLeaf(\n group: FilterGroup,\n index: number,\n next: FilterElement,\n): FilterGroup {\n const elements = group.elements ?? []\n return { ...group, elements: elements.map((el, i) => (i === index ? next : el)) }\n}\n\nexport function updateSubgroup(\n group: FilterGroup,\n index: number,\n next: FilterGroup,\n): FilterGroup {\n const groups = group.groups ?? []\n return { ...group, groups: groups.map((g, i) => (i === index ? next : g)) }\n}\n\n/* Wrap an existing leaf in a new sub-group with the opposite joiner.\n Leaves the rest of the group untouched. The leaf is moved into the new\n sub-group's `elements`. Used by the \"wrap in group\" hover action. */\nexport function wrapLeafInGroup(group: FilterGroup, index: number): FilterGroup {\n const elements = group.elements ?? []\n const leaf = elements[index]\n if (!leaf) return group\n const sub: FilterGroup = {\n logicalOperator: oppositeJoiner(group.logicalOperator),\n elements: [leaf],\n groups: [],\n }\n return {\n ...group,\n elements: elements.filter((_, i) => i !== index),\n groups: [...(group.groups ?? []), sub],\n }\n}\n\nexport function setJoiner(group: FilterGroup, joiner: LogicalOperator): FilterGroup {\n return { ...group, logicalOperator: joiner }\n}\n\n/* Recursively count leaf filters in a group. Used by the chip pill badge\n and for filter-button counts when nested groups are present. */\nexport function countLeaves(group: FilterGroup): number {\n const direct = (group.elements ?? []).length\n const nested = (group.groups ?? []).reduce((n, g) => n + countLeaves(g), 0)\n return direct + nested\n}\n\nfunction oppositeJoiner(j: LogicalOperator): LogicalOperator {\n return j === 'and' ? 'or' : 'and'\n}\n","import { cn } from '../../lib/cn'\n\n/* =========================================================================\n GroupAddControls — \"+ Add filter\" / \"+ Add group\" footer rendered at the\n bottom of any group body. The \"+ Add group\" affordance is gated behind\n `isComplexEnabled`; in flat mode (the back-compat default) only \"+ Add\n filter\" appears, exactly matching the pre-nesting builder panel.\n\n \"+ Add filter\" follows the existing pattern: it adds a *pending* row\n (field === '') whose AttributePicker auto-focuses on mount, rather than\n opening a separate popover. Keeps consistency with `RecordFilterChips`\n and avoids a second popover layer inside the builder.\n ========================================================================= */\n\nexport type GroupAddControlsProps = {\n onAddFilter: () => void\n onAddGroup?: () => void\n isComplexEnabled: boolean\n}\n\nexport function GroupAddControls({\n onAddFilter,\n onAddGroup,\n isComplexEnabled,\n}: GroupAddControlsProps) {\n return (\n <div className=\"flex items-center gap-1 pl-12 pt-1\">\n <button\n type=\"button\"\n onClick={onAddFilter}\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-sm',\n 'text-ink-2 hover:bg-surface-2 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n <span className=\"font-sans text-[12.5px]\">Add filter</span>\n </button>\n {isComplexEnabled && onAddGroup ? (\n <button\n type=\"button\"\n onClick={onAddGroup}\n title=\"Add a nested group with its own logical operator\"\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-sm',\n 'text-ink-2 hover:bg-surface-2 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3M9 3a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3\" />\n <path d=\"M7 5v4M5 7h4\" />\n </svg>\n <span className=\"font-sans text-[12.5px]\">Add group</span>\n </button>\n ) : null}\n </div>\n )\n}\n","import { cn } from '../../lib/cn'\nimport { SegmentedControl } from '../segmented-control/segmented-control'\nimport { GroupBody } from './group-body'\nimport type { FilterField, FilterGroup, LogicalOperator } from './types'\n\n/* =========================================================================\n NestedGroup — non-root group rendered as a bordered, indented panel.\n Layout:\n\n [WHERE/AND/OR ] [ ┌─ Group · AND/OR ───────────── × ┐ ]\n [ FilterRow ]\n [ FilterRow ]\n [ + Add filter + Add group ]\n [ └────────────────────────────────┘ ]\n\n The left gutter aligns with sibling FilterRows so the joiner (\"AND\" /\n \"OR\" or the leading \"WHERE\") sits in the same column. The bordered panel\n carries the group's own AND/OR header + remove button; its body recurses\n into another `GroupBody`.\n ========================================================================= */\n\nexport type NestedGroupProps = {\n /** Sibling index inside the parent group's combined children list (leaves\n * first, groups last). Drives the joiner label. */\n index: number\n /** Parent group's logical operator — that's what joins this sub-group to\n * its siblings. */\n joiner: LogicalOperator\n group: FilterGroup\n fields: ReadonlyArray<FilterField>\n fieldsByPath: Record<string, FilterField>\n onChange: (next: FilterGroup) => void\n onRemove: () => void\n showFieldIcons: boolean\n showJoinerToggle: boolean\n isComplexEnabled: boolean\n}\n\nexport function NestedGroup({\n index,\n joiner,\n group,\n fields,\n fieldsByPath,\n onChange,\n onRemove,\n showFieldIcons,\n showJoinerToggle,\n isComplexEnabled,\n}: NestedGroupProps) {\n const elementCount = (group.elements?.length ?? 0) + (group.groups?.length ?? 0)\n const showJoinerSegment = showJoinerToggle && elementCount >= 2\n\n return (\n <div className=\"flex items-stretch gap-2 px-1.5\">\n {/* Joiner gutter — same width as a FilterRow's gutter so siblings line\n up vertically. `px-1.5` matches FilterRow's horizontal padding so\n the gutter labels and the group-panel left edge align with sibling\n rows. `pt-2` aligns the label with the group header text. */}\n <span className=\"w-12 shrink-0 inline-flex justify-end pr-1 pt-2\">\n <span\n className={cn(\n 'font-mono text-[10.5px] tracking-[0.08em]',\n index === 0 ? 'text-ink-4' : 'text-accent-ink',\n )}\n >\n {index === 0 ? 'WHERE' : joiner.toUpperCase()}\n </span>\n </span>\n\n <div\n className={cn(\n 'flex-1 min-w-0 rounded-sm border border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n )}\n >\n {/* Group header — eyebrow + AND/OR + remove */}\n <div className=\"flex items-center justify-between px-2.5 py-1.5 border-b border-rule\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-[10px] uppercase tracking-[0.08em] text-ink-4\">\n Group\n </span>\n {showJoinerSegment ? (\n <SegmentedControl<LogicalOperator>\n aria-label=\"Group joiner\"\n options={[\n { id: 'and', label: 'AND' },\n { id: 'or', label: 'OR' },\n ]}\n value={group.logicalOperator}\n onChange={(next) => onChange({ ...group, logicalOperator: next })}\n />\n ) : (\n <span className=\"font-mono text-[10.5px] tracking-[0.08em] text-ink-3 uppercase\">\n {group.logicalOperator}\n </span>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label=\"Remove group\"\n className={cn(\n 'size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-4 hover:text-danger hover:bg-surface cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 4h8M5 4V3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v1M4.5 4l.5 7a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1l.5-7\" />\n </svg>\n </button>\n </div>\n\n <div className=\"px-1.5 py-1.5\">\n <GroupBody\n group={group}\n fields={fields}\n fieldsByPath={fieldsByPath}\n onChange={onChange}\n isRoot={false}\n isComplexEnabled={isComplexEnabled}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n />\n </div>\n </div>\n </div>\n )\n}\n","import { FilterRow, rebaseRowOnFieldChange, rebaseRowOnOperatorChange } from './filter-row'\nimport { GroupAddControls } from './group-add-controls'\nimport {\n addPendingLeaf,\n addSubgroup,\n removeLeaf,\n removeSubgroup,\n replaceLeaf,\n updateLeaf,\n updateSubgroup,\n wrapLeafInGroup,\n} from './group-mutations'\nimport { NestedGroup } from './nested-group'\nimport { arityOf } from './operators'\nimport type { FilterField, FilterGroup } from './types'\n\n/* =========================================================================\n GroupBody — body of a single FilterGroup, used at the root of the popover\n panel and recursively inside `NestedGroup`. Renders:\n\n 1. one `FilterRow` per leaf (`group.elements`)\n 2. one `NestedGroup` per sub-group (`group.groups`) — only when\n `isComplexEnabled`; otherwise sub-groups are silently skipped (the\n chip row still surfaces them as a read-only pill)\n 3. a `GroupAddControls` footer with \"+ Add filter\" (always) and\n \"+ Add group\" (only when `isComplexEnabled`)\n\n Auto-focus signals are only wired at the root — nested groups don't get\n the field→operator→value focus chain. This is a deliberate scope cut:\n adding to a nested group is a click action, and tracking root-vs-nested\n focus paths through arbitrary depth wasn't worth the v1 complexity.\n ========================================================================= */\n\nexport type GroupBodyProps = {\n group: FilterGroup\n fields: ReadonlyArray<FilterField>\n fieldsByPath: Record<string, FilterField>\n onChange: (next: FilterGroup) => void\n isRoot: boolean\n isComplexEnabled: boolean\n showFieldIcons: boolean\n showJoinerToggle: boolean\n /** Root-only auto-focus index for the AttributePicker. */\n autoFocusIndex?: number | null\n setAutoFocusIndex?: (next: number | null) => void\n /** Root-only auto-focus index for the OperatorPicker. */\n autoFocusOperatorIndex?: number | null\n setAutoFocusOperatorIndex?: (next: number | null) => void\n /** Root-only auto-focus index for the value cell. */\n autoFocusValueIndex?: number | null\n setAutoFocusValueIndex?: (next: number | null) => void\n /** Optional submit chain — Enter on a text/number value adds a new pending\n * row at the end of *this* group. Forwarded by the panel for the root. */\n onSubmitLeaf?: () => void\n /** Empty-state copy override. Defaults vary per `isRoot`. */\n emptyText?: string\n}\n\nexport function GroupBody({\n group,\n fields,\n fieldsByPath,\n onChange,\n isRoot,\n isComplexEnabled,\n showFieldIcons,\n showJoinerToggle,\n autoFocusIndex = null,\n setAutoFocusIndex,\n autoFocusOperatorIndex = null,\n setAutoFocusOperatorIndex,\n autoFocusValueIndex = null,\n setAutoFocusValueIndex,\n onSubmitLeaf,\n emptyText,\n}: GroupBodyProps) {\n const elements = group.elements ?? []\n const subgroups = group.groups ?? []\n\n const handleAddFilter = () => {\n const nextIndex = elements.length\n onChange(addPendingLeaf(group))\n setAutoFocusIndex?.(nextIndex)\n }\n const handleAddGroup = () => onChange(addSubgroup(group))\n\n const handleRemoveLeaf = (i: number) => {\n if (autoFocusIndex === i) setAutoFocusIndex?.(null)\n if (autoFocusOperatorIndex === i) setAutoFocusOperatorIndex?.(null)\n if (autoFocusValueIndex === i) setAutoFocusValueIndex?.(null)\n onChange(removeLeaf(group, i))\n }\n\n const isEmpty = elements.length === 0 && (!isComplexEnabled || subgroups.length === 0)\n\n return (\n <div className=\"flex flex-col gap-1\">\n {isEmpty ? (\n <div\n className={\n (isRoot ? 'px-3 py-6' : 'px-2 py-3') +\n ' text-center font-mono text-[11.5px] text-ink-4'\n }\n >\n {emptyText ?? (isRoot\n ? 'No filters. Add one to narrow the list.'\n : 'Empty group. Add a filter or another group.')}\n </div>\n ) : null}\n\n {elements.map((el, i) => {\n const field = fieldsByPath[el.field]\n return (\n <FilterRow\n // biome-ignore lint/suspicious/noArrayIndexKey: filter elements have no stable id; index disambiguates duplicate-field rows\n key={`${el.field}-${i}`}\n index={i}\n joiner={group.logicalOperator}\n {...(field ? { field } : {})}\n element={el}\n fields={fields}\n autoFocus={autoFocusIndex === i}\n autoFocusOperator={autoFocusOperatorIndex === i}\n onAutoFocusOperatorConsumed={() => setAutoFocusOperatorIndex?.(null)}\n autoFocusValue={autoFocusValueIndex === i}\n onAutoFocusValueConsumed={() => setAutoFocusValueIndex?.(null)}\n {...(onSubmitLeaf ? { onSubmit: onSubmitLeaf } : {})}\n onChangeField={(picked) => {\n if (autoFocusIndex === i) setAutoFocusIndex?.(null)\n setAutoFocusOperatorIndex?.(i)\n onChange(replaceLeaf(group, i, rebaseRowOnFieldChange(el, picked)))\n }}\n onChangeOperator={(opId) => {\n if (!field) return\n if (arityOf(opId) !== 0) setAutoFocusValueIndex?.(i)\n onChange(replaceLeaf(group, i, rebaseRowOnOperatorChange(el, field, opId)))\n }}\n onChangeValue={(v) => onChange(updateLeaf(group, i, { value: v }))}\n onRemove={() => handleRemoveLeaf(i)}\n {...(isComplexEnabled && field\n ? { onWrap: () => onChange(wrapLeafInGroup(group, i)) }\n : {})}\n />\n )\n })}\n\n {isComplexEnabled\n ? subgroups.map((sub, i) => (\n <NestedGroup\n // biome-ignore lint/suspicious/noArrayIndexKey: sub-groups have no stable id\n key={`group-${i}`}\n index={elements.length + i}\n joiner={group.logicalOperator}\n group={sub}\n fields={fields}\n fieldsByPath={fieldsByPath}\n onChange={(next) => onChange(updateSubgroup(group, i, next))}\n onRemove={() => onChange(removeSubgroup(group, i))}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n isComplexEnabled={isComplexEnabled}\n />\n ))\n : null}\n\n <GroupAddControls\n onAddFilter={handleAddFilter}\n onAddGroup={handleAddGroup}\n isComplexEnabled={isComplexEnabled}\n />\n </div>\n )\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport { type FilterValueInputRenderer, RenderValueInputProvider } from './filter-value-input'\nimport { GroupBody } from './group-body'\nimport { addPendingLeaf } from './group-mutations'\nimport type { FilterField, FilterGroup } from './types'\n\n/* =========================================================================\n RecordFilterEditor — the recursive AND/OR filter editor with no popover\n chrome. Owns the auto-focus state for the field → operator → value chain\n and seeds an initial pending row when mounted empty so the user can start\n typing immediately. Used inline (e.g. as the always-open editor in the\n Query Builder) and as the body of `RecordFilterBuilderPanel`.\n\n Pure presentation of one `FilterGroup`; persistence and toolbar chrome\n (joiner toggle, close, footer, save-as-view) are the caller's concern.\n ========================================================================= */\n\nexport type RecordFilterEditorProps = {\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n /** Show \"+ Add group\", \"Wrap in group\", and render nested sub-groups. */\n isComplexEnabled?: boolean\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** Drop in a pending row on mount when the filter is empty so the user\n * lands on an auto-focused AttributePicker. Defaults to `true`. */\n seedPendingRow?: boolean\n /**\n * Optional override for the value editor. Lets product code plug in\n * editors the lib can't know about (e.g. a record picker that hits the\n * SDK). Return `undefined` from the renderer to fall through to the\n * built-in branches per `(field.type, operator)` combination.\n */\n renderValueInput?: FilterValueInputRenderer\n}\n\nexport function RecordFilterEditor({\n fields,\n filter,\n onChange,\n isComplexEnabled = false,\n showFieldIcons = true,\n showJoinerToggle = true,\n seedPendingRow = true,\n renderValueInput,\n}: RecordFilterEditorProps) {\n const fieldsByPath = useMemo(() => Object.fromEntries(fields.map((f) => [f.path, f])), [fields])\n const elements = filter.elements ?? []\n const subgroups = filter.groups ?? []\n\n const [autoFocusIndex, setAutoFocusIndex] = useState<number | null>(null)\n const [autoFocusOperatorIndex, setAutoFocusOperatorIndex] = useState<number | null>(null)\n const [autoFocusValueIndex, setAutoFocusValueIndex] = useState<number | null>(null)\n\n const addPendingRow = () => {\n const nextIndex = (filter.elements ?? []).length\n onChange(addPendingLeaf(filter))\n setAutoFocusIndex(nextIndex)\n }\n\n // Mount-only seed. Re-running on `elements` changes would re-add a pending\n // row whenever the user clears all filters.\n // biome-ignore lint/correctness/useExhaustiveDependencies: mount-only by design\n useEffect(() => {\n if (!seedPendingRow) return\n if (elements.length === 0 && subgroups.length === 0) addPendingRow()\n }, [])\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <GroupBody\n group={filter}\n fields={fields}\n fieldsByPath={fieldsByPath}\n onChange={onChange}\n isRoot\n isComplexEnabled={isComplexEnabled}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n autoFocusIndex={autoFocusIndex}\n setAutoFocusIndex={setAutoFocusIndex}\n autoFocusOperatorIndex={autoFocusOperatorIndex}\n setAutoFocusOperatorIndex={setAutoFocusOperatorIndex}\n autoFocusValueIndex={autoFocusValueIndex}\n setAutoFocusValueIndex={setAutoFocusValueIndex}\n onSubmitLeaf={addPendingRow}\n />\n </RenderValueInputProvider>\n )\n}\n","import { cn } from '../../lib/cn'\nimport { SegmentedControl } from '../segmented-control/segmented-control'\nimport { type FilterValueInputRenderer, RenderValueInputProvider } from './filter-value-input'\nimport { RecordFilterEditor } from './record-filter-editor'\nimport type { FilterField, FilterGroup, LogicalOperator } from './types'\n\n/* =========================================================================\n RecordFilterBuilderPanel — the popover panel content for the Filter\n button. Composition:\n\n [Header joiner-segmented (≥2 rows) ··· Expand-inline · ×Close]\n [Body one FilterRow per element, plus optional pending row]\n [Add \"+ Add filter\" appends a new row in-place]\n [Footer Clear all · Save view · Done]\n\n \"+ Add filter\" appends a row with `field: ''`. That row's first cell\n is an auto-focused inline AttributePicker (Combobox) with the dropdown\n open — exactly one click to start picking. The other cells (operator,\n value, remove) only appear once a field is chosen.\n ========================================================================= */\n\nexport type RecordFilterBuilderPanelProps = {\n /** Display label shown in the header when fewer than 2 rows exist. */\n entityLabel?: string\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n onClose: () => void\n /** Optional \"Save as view\" affordance. Hidden when not provided. */\n onSaveView?: () => void\n /** Optional \"Expand inline\" affordance — surface chips outside the popover. */\n onExpand?: () => void\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** Opt-in to nested-group affordances: \"+ Add group\" button, \"Wrap in\n * group\" hover icon on leaves, and rendering of any sub-groups in the\n * filter tree. Defaults to `false` for back-compat. */\n isComplexEnabled?: boolean\n /** Optional override for the value editor. Forwarded to RecordFilterEditor. */\n renderValueInput?: FilterValueInputRenderer\n}\n\nexport function RecordFilterBuilderPanel({\n entityLabel,\n fields,\n filter,\n onChange,\n onClose,\n onSaveView,\n onExpand,\n showFieldIcons = true,\n showJoinerToggle = true,\n isComplexEnabled = false,\n renderValueInput,\n}: RecordFilterBuilderPanelProps) {\n const elements = filter.elements ?? []\n const subgroups = filter.groups ?? []\n\n const setJoiner = (next: LogicalOperator) => onChange({ ...filter, logicalOperator: next })\n\n const clearAll = () => {\n onChange({ ...filter, elements: [], groups: [] })\n }\n\n const totalChildren = elements.length + (isComplexEnabled ? subgroups.length : 0)\n const showJoinerSegment = showJoinerToggle && totalChildren >= 2\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <div\n className=\"w-[min(640px,92vw)] flex flex-col\"\n onKeyDown={(e) => {\n // Cmd/Ctrl+Enter anywhere in the panel = \"save & close\" (Done\n // equivalent). Plain Enter on a value Input is handled per-row in\n // FilterRow's value-cell wrapper. Escape is handled by RAC's Dialog.\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n onClose()\n }\n }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-rule\">\n <div className=\"flex items-center gap-2.5\">\n {showJoinerSegment ? (\n <SegmentedControl<LogicalOperator>\n aria-label=\"Joiner\"\n options={[\n { id: 'and', label: 'AND' },\n { id: 'or', label: 'OR' },\n ]}\n value={filter.logicalOperator}\n onChange={setJoiner}\n />\n ) : (\n <>\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-4\">\n Filters\n </span>\n {entityLabel ? (\n <>\n <span className=\"font-mono text-[11px] text-ink-3\">·</span>\n <span className=\"font-mono text-[11px] text-ink-3\">{entityLabel}</span>\n </>\n ) : null}\n </>\n )}\n </div>\n <div className=\"flex items-center gap-1.5\">\n {onExpand ? (\n <button\n type=\"button\"\n onClick={onExpand}\n title=\"Show filter chips inline above the table\"\n className={cn(\n 'inline-flex items-center gap-1 px-2 py-1 rounded-sm',\n 'font-mono text-[11.5px] text-ink-3 hover:text-ink hover:bg-surface-2',\n 'cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m3 3 3 3-3 3M7 3l3 3-3 3\" />\n </svg>\n Expand inline\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n className={cn(\n 'size-6 inline-flex items-center justify-center rounded-sm',\n 'text-ink-3 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n >\n <path d=\"M3 3l6 6M9 3l-6 6\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"px-2 py-2 max-h-[420px] overflow-auto\">\n <RecordFilterEditor\n fields={fields}\n filter={filter}\n onChange={onChange}\n isComplexEnabled={isComplexEnabled}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n />\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n 'flex items-center justify-between px-3.5 py-2.5 border-t border-rule rounded-b-md',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n )}\n >\n <button\n type=\"button\"\n onClick={clearAll}\n disabled={totalChildren === 0}\n className={cn(\n 'font-mono text-[11.5px] text-ink-3 hover:text-ink',\n 'disabled:opacity-40 disabled:pointer-events-none',\n 'outline-none cursor-pointer',\n )}\n >\n Clear all\n </button>\n <div className=\"flex items-center gap-1.5\">\n {onSaveView ? (\n <button\n type=\"button\"\n onClick={onSaveView}\n disabled={totalChildren === 0}\n className={cn(\n 'inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-sm',\n 'font-sans text-[13px] text-ink-2 hover:bg-surface-2 hover:text-ink',\n 'disabled:opacity-40 disabled:pointer-events-none',\n 'outline-none cursor-pointer',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 2h7l2 2v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z\" />\n <path d=\"M5 2v3h4V2\" />\n </svg>\n Save as view\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n className={cn(\n 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-sm',\n 'bg-ink text-surface font-mono text-[12px]',\n 'hover:bg-accent-ink outline-none cursor-pointer',\n )}\n >\n Done\n </button>\n </div>\n </div>\n </div>\n </RenderValueInputProvider>\n )\n}\n","import { useEffect, useState } from 'react'\n\n/* =========================================================================\n showDetails persistence — a tiny pub/sub on top of localStorage so the\n FilterButton (collapsed) and the FilterChips (expanded) stay in sync\n regardless of where they're mounted in the page. Keyed by a configurable\n storage key so multiple filter UIs can coexist.\n ========================================================================= */\n\ntype Listener = (next: boolean) => void\n\nconst stores = new Map<string, Set<Listener>>()\n\nfunction listeners(key: string): Set<Listener> {\n let set = stores.get(key)\n if (!set) {\n set = new Set()\n stores.set(key, set)\n }\n return set\n}\n\nfunction read(key: string): boolean {\n if (typeof window === 'undefined') return false\n try {\n // Default collapsed: only an explicit '1' expands. Unset / '0' → collapsed.\n return window.localStorage.getItem(key) === '1'\n } catch {\n return false\n }\n}\n\nfunction write(key: string, next: boolean) {\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.setItem(key, next ? '1' : '0')\n } catch {\n /* ignore quota / privacy-mode errors */\n }\n }\n for (const fn of listeners(key)) fn(next)\n}\n\nexport function useShowDetails(storageKey = 'rf.showDetails') {\n const [value, setValue] = useState<boolean>(() => read(storageKey))\n\n useEffect(() => {\n const fn: Listener = (next) => setValue(next)\n listeners(storageKey).add(fn)\n setValue(read(storageKey))\n return () => {\n listeners(storageKey).delete(fn)\n }\n }, [storageKey])\n\n const toggle = () => write(storageKey, !read(storageKey))\n const set = (next: boolean) => write(storageKey, next)\n\n return [value, toggle, set] as const\n}\n\n/** Test-only escape hatch — clears all listeners and storage values. */\nexport function __resetShowDetailsStores() {\n stores.clear()\n if (typeof window !== 'undefined') {\n try {\n window.localStorage.clear()\n } catch {\n /* ignore */\n }\n }\n}\n","import { useRef, useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport { PopoverContent } from '../popover/popover'\nimport { type FilterValueInputRenderer, RenderValueInputProvider } from './filter-value-input'\nimport { countLeaves } from './group-mutations'\nimport { RecordFilterBuilderPanel } from './record-filter-builder-panel'\nimport { useShowDetails } from './show-details-store'\nimport type { FilterField, FilterGroup } from './types'\n\n/* =========================================================================\n RecordFilterButton — the inline trigger that opens the builder popover.\n Sized to sit on the same row as other table actions (Columns / Sort /\n New customer). When the chips row is expanded AND has at least one\n active filter, this button hides itself — the chip row is the single\n source of UI in that mode.\n ========================================================================= */\n\nexport type RecordFilterButtonProps = {\n /** Display label shown in the builder header. */\n entityLabel?: string\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** Optional save-as-view affordance forwarded to the builder. */\n onSaveView?: () => void\n /** localStorage key shared with `RecordFilterChips`. */\n storageKey?: string\n /** Opt-in to nested-group affordances inside the builder popover. Defaults\n * to `false` for back-compat. Forwarded to `RecordFilterBuilderPanel`. */\n isComplexEnabled?: boolean\n /** Optional override for the value editor. Forwarded to the builder panel. */\n renderValueInput?: FilterValueInputRenderer\n}\n\nexport function RecordFilterButton({\n entityLabel,\n fields,\n filter,\n onChange,\n showFieldIcons = true,\n showJoinerToggle = true,\n onSaveView,\n storageKey,\n isComplexEnabled = false,\n renderValueInput,\n}: RecordFilterButtonProps) {\n const ref = useRef<HTMLSpanElement>(null)\n const [open, setOpen] = useState(false)\n const [showDetails, toggleDetails] = useShowDetails(storageKey)\n\n const filterCount = countLeaves(filter)\n const hasFilters = filterCount > 0\n\n // Expanded mode hides the Filter button entirely — the chip row is the\n // single source of UI in that mode (+ Add pill is the entry point).\n if (showDetails) return null\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <span ref={ref} className=\"inline-flex\">\n <button\n type=\"button\"\n data-filter-trigger=\"collapsed\"\n onClick={() => setOpen((v) => !v)}\n className={cn(\n 'inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md border',\n 'font-mono text-[12px] cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n hasFilters\n ? cn(\n 'border-[color-mix(in_oklab,var(--color-accent)_35%,var(--color-rule))]',\n 'bg-[color-mix(in_oklab,var(--color-accent)_8%,var(--color-surface))]',\n 'text-accent-ink',\n )\n : 'border-rule bg-surface text-ink-2 hover:border-ink-4 hover:text-ink',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 3h10M4 7h6M6 11h2\" />\n </svg>\n Filter\n {hasFilters ? (\n <span className=\"font-mono text-[10.5px] px-1.5 py-px rounded-pill bg-accent text-surface\">\n {filterCount}\n </span>\n ) : null}\n </button>\n </span>\n\n <PopoverContent\n triggerRef={ref}\n isOpen={open}\n onOpenChange={setOpen}\n placement=\"bottom start\"\n panelClassName=\"p-0 bg-bg\"\n >\n <RecordFilterBuilderPanel\n {...(entityLabel ? { entityLabel } : {})}\n fields={fields}\n filter={filter}\n onChange={onChange}\n onClose={() => setOpen(false)}\n {...(onSaveView ? { onSaveView } : {})}\n onExpand={() => {\n if (!showDetails) toggleDetails()\n setOpen(false)\n }}\n showFieldIcons={showFieldIcons}\n showJoinerToggle={showJoinerToggle}\n isComplexEnabled={isComplexEnabled}\n />\n </PopoverContent>\n </RenderValueInputProvider>\n )\n}\n","import { Fragment, type RefObject, useEffect, useMemo, useRef, useState } from 'react'\nimport { cn } from '../../lib/cn'\nimport { PopoverContent } from '../popover/popover'\nimport { AttributePicker } from './attribute-picker'\nimport { ChipValue, type ChipValueItemRenderer } from './chip-value'\nimport { rebaseRowOnFieldChange, rebaseRowOnOperatorChange } from './filter-row'\nimport {\n FilterValueInput,\n type FilterValueInputRenderer,\n RenderValueInputProvider,\n} from './filter-value-input'\nimport { countLeaves } from './group-mutations'\nimport { OperatorPicker } from './operator-picker'\nimport { operatorById, operatorsForType } from './operators'\nimport { useShowDetails } from './show-details-store'\nimport { AttributeTypeIcon } from '../attribute-type-icon'\nimport { FIELD_LABEL_SEPARATOR } from './field-label'\nimport type { ComparisonOperator, FilterField, FilterGroup, FilterValue } from './types'\n\n/* =========================================================================\n RecordFilterChips — chip row above the table. Renders one chip per\n active filter, with AND/OR joiner pills between them and an inline\n \"+ Add filter\" affordance at the end. A \"« Collapse\" text-button sits\n above the chips to fold the row back to the icon-only `RecordFilterButton`.\n\n \"+ Add filter\" appends a pending element with `field: ''` directly into\n the FilterGroup state and renders an inline auto-focused AttributePicker\n in its place. Once the user picks a field, the picker becomes a real\n chip. Same pattern is used inside `ChipMiniEditor` for editing the\n field of an existing chip.\n\n When collapsed (`!showDetails`), returns null — the `RecordFilterButton`\n takes over.\n ========================================================================= */\n\nexport type RecordFilterChipsProps = {\n fields: ReadonlyArray<FilterField>\n filter: FilterGroup\n onChange: (next: FilterGroup) => void\n showFieldIcons?: boolean\n showJoinerToggle?: boolean\n /** localStorage key used to share the collapsed/expanded state with the\n * RecordFilterButton. Pass the same value to both components. */\n storageKey?: string\n /** Optional override for the value editor inside the chip's mini-editor. */\n renderValueInput?: FilterValueInputRenderer\n /** Optional override for per-value-item rendering inside chip pills.\n * Called once per value (or once per item for arity 'n'); returning\n * `undefined` falls through to the lib default. LUM-34 wires this to\n * the page-layout control registry's Display. */\n renderChipItem?: ChipValueItemRenderer\n}\n\nexport function RecordFilterChips({\n fields,\n filter,\n onChange,\n showFieldIcons = true,\n showJoinerToggle = true,\n storageKey,\n renderValueInput,\n renderChipItem,\n}: RecordFilterChipsProps) {\n const fieldsByPath = useMemo(() => Object.fromEntries(fields.map((f) => [f.path, f])), [fields])\n const elements = filter.elements ?? []\n const subgroups = filter.groups ?? []\n const [showDetails, toggleDetails] = useShowDetails(storageKey)\n // Index of the chip whose AttributePicker should auto-focus this render.\n const [autoFocusIndex, setAutoFocusIndex] = useState<number | null>(null)\n // Index of the chip whose mini-editor should auto-open on mount — set when\n // a pending row's AttributePicker resolves, so the user lands directly on\n // the value editor (operator is already pre-selected by\n // rebaseRowOnFieldChange).\n const [autoOpenIndex, setAutoOpenIndex] = useState<number | null>(null)\n\n if (!showDetails) return null\n\n const addPending = () => {\n const nextIndex = elements.length\n onChange({\n ...filter,\n elements: [...elements, { field: '', operator: 'eq', value: '' }],\n })\n setAutoFocusIndex(nextIndex)\n }\n\n return (\n <RenderValueInputProvider renderer={renderValueInput}>\n <div className=\"flex flex-col items-start gap-1.5\">\n <CollapseToggle onClick={toggleDetails} />\n <div className=\"flex items-center gap-2 flex-wrap\">\n {elements.map((el, i) => {\n const field = fieldsByPath[el.field]\n return (\n <Fragment\n // biome-ignore lint/suspicious/noArrayIndexKey: filter elements have no stable id; index disambiguates duplicate-field rows\n key={`${el.field}-${i}`}\n >\n {i > 0 ? (\n showJoinerToggle ? (\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...filter,\n logicalOperator: filter.logicalOperator === 'and' ? 'or' : 'and',\n })\n }\n title=\"Toggle joiner\"\n className={cn(\n 'inline-flex items-center px-1.5 py-0.5 rounded-sm border border-dashed border-rule',\n 'font-mono text-[10.5px] tracking-[0.08em] text-ink-3',\n 'hover:text-ink hover:border-ink-4 cursor-pointer outline-none',\n )}\n >\n {filter.logicalOperator.toUpperCase()}\n </button>\n ) : (\n <span className=\"font-mono text-[10.5px] tracking-[0.08em] text-ink-4 px-1\">\n {filter.logicalOperator.toUpperCase()}\n </span>\n )\n ) : null}\n\n {field ? (\n <Chip\n index={i}\n field={field}\n element={el}\n fields={fields}\n showFieldIcons={showFieldIcons}\n autoOpen={autoOpenIndex === i}\n onAutoOpenConsumed={() => setAutoOpenIndex(null)}\n {...(renderChipItem !== undefined ? { renderChipItem } : {})}\n onChangeField={(picked) =>\n onChange({\n ...filter,\n elements: elements.map((e, idx) =>\n idx === i ? rebaseRowOnFieldChange(e, picked) : e,\n ),\n })\n }\n onChangeOperator={(opId) =>\n onChange({\n ...filter,\n elements: elements.map((e, idx) =>\n idx === i ? rebaseRowOnOperatorChange(e, field, opId) : e,\n ),\n })\n }\n onChangeValue={(v) =>\n onChange({\n ...filter,\n elements: elements.map((e, idx) => (idx === i ? { ...e, value: v } : e)),\n })\n }\n onRemove={() =>\n onChange({\n ...filter,\n elements: elements.filter((_, idx) => idx !== i),\n })\n }\n />\n ) : (\n // Pending chip — inline AttributePicker.\n <div className=\"inline-flex items-center gap-1\">\n <AttributePicker\n fields={fields}\n value=\"\"\n autoFocus={autoFocusIndex === i}\n onChange={(picked) => {\n if (autoFocusIndex === i) setAutoFocusIndex(null)\n // Hand off to the resolved Chip: open its mini-editor\n // immediately so the user can fill the value.\n setAutoOpenIndex(i)\n onChange({\n ...filter,\n elements: elements.map((e, idx) =>\n idx === i ? rebaseRowOnFieldChange(e, picked) : e,\n ),\n })\n }}\n />\n <button\n type=\"button\"\n aria-label=\"Cancel\"\n onClick={() => {\n if (autoFocusIndex === i) setAutoFocusIndex(null)\n onChange({\n ...filter,\n elements: elements.filter((_, idx) => idx !== i),\n })\n }}\n className={cn(\n 'size-5 inline-flex items-center justify-center rounded-[3px]',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 10 10\"\n className=\"size-2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l6 6M8 2l-6 6\" />\n </svg>\n </button>\n </div>\n )}\n </Fragment>\n )\n })}\n\n {subgroups.map((sub, i) => {\n const showLeadingJoiner = elements.length > 0 || i > 0\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: sub-groups have no stable id\n <Fragment key={`group-${i}`}>\n {showLeadingJoiner ? (\n <span className=\"font-mono text-[10.5px] tracking-[0.08em] text-ink-4 px-1\">\n {filter.logicalOperator.toUpperCase()}\n </span>\n ) : null}\n <GroupPill group={sub} />\n </Fragment>\n )\n })}\n\n <InlineAddFilter onClick={addPending} />\n </div>\n </div>\n </RenderValueInputProvider>\n )\n}\n\n/* ---------- GroupPill -----------------------------------------------------\n Read-only pill that surfaces a sub-group's existence in the chip row.\n By design, group editing only happens inside the builder popover — so\n this pill points users there with a `title` hint and no click handler.\n ------------------------------------------------------------------------- */\nfunction GroupPill({ group }: { group: FilterGroup }) {\n const count = countLeaves(group)\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-1 rounded-sm border border-dashed border-rule',\n 'bg-[color-mix(in_oklab,var(--color-surface-2)_60%,var(--color-surface))]',\n )}\n title=\"Nested group — open the filter popover to edit\"\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3 text-ink-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 3a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3M9 3a3 3 0 0 1 3 3v2a3 3 0 0 1-3 3\" />\n </svg>\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.08em] text-ink-3\">\n {group.logicalOperator} group\n </span>\n <span className=\"font-mono text-[11px] text-ink-4\">· {count}</span>\n </span>\n )\n}\n\n/* ---------- Collapse toggle ----------------------------------------------- */\nfunction CollapseToggle({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'inline-flex items-center gap-1',\n 'font-mono text-[11px] uppercase tracking-[0.08em]',\n 'text-ink-3 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 14 14\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m8 3-3 4 3 4M11 3l-3 4 3 4\" />\n </svg>\n Collapse\n </button>\n )\n}\n\n/* ---------- Chip ---------------------------------------------------------- */\nfunction Chip({\n index,\n field,\n element,\n fields,\n showFieldIcons,\n autoOpen = false,\n onAutoOpenConsumed,\n onChangeField,\n onChangeOperator,\n onChangeValue,\n onRemove,\n renderChipItem,\n}: {\n index: number\n field: FilterField\n element: { field: string; operator: ComparisonOperator; value: FilterValue }\n fields: ReadonlyArray<FilterField>\n showFieldIcons: boolean\n /** When true, the mini-editor opens immediately on mount. Used to chain\n * \"+ Add filter → pick attribute → land on value editor\" without an\n * intermediate click. */\n autoOpen?: boolean\n onAutoOpenConsumed?: () => void\n onChangeField: (next: FilterField) => void\n onChangeOperator: (next: ComparisonOperator) => void\n onChangeValue: (next: FilterValue) => void\n onRemove: () => void\n renderChipItem?: ChipValueItemRenderer\n}) {\n const ref = useRef<HTMLSpanElement>(null)\n const [editing, setEditing] = useState(autoOpen)\n // Tell the parent to clear its `autoOpenIndex` so a subsequent chip\n // mounting at the same index doesn't inherit the open flag.\n useEffect(() => {\n if (autoOpen) onAutoOpenConsumed?.()\n // We deliberately only run this on mount — autoOpen is a hand-off signal,\n // not a sustained prop.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n const op = operatorById(element.operator) ?? operatorsForType(field.type)[0]\n\n return (\n <>\n {/* biome-ignore lint/a11y/useSemanticElements: chip contains a nested remove <button>; HTML disallows nested <button>, so we use an aria-button span */}\n <span\n ref={ref}\n role=\"button\"\n tabIndex={0}\n aria-label={`Edit filter ${index + 1}: ${field.label}`}\n onClick={() => setEditing((v) => !v)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setEditing((v) => !v)\n }\n }}\n className={cn(\n 'group inline-flex items-center gap-1.5 pl-2 pr-1 py-1 rounded-sm border cursor-pointer',\n editing\n ? 'border-accent shadow-[var(--shadow-focus)] bg-surface'\n : 'border-rule bg-surface hover:border-ink-4',\n )}\n >\n {showFieldIcons ? (\n <span className=\"text-ink-3\">\n <AttributeTypeIcon type={field.type} />\n </span>\n ) : null}\n <span className=\"font-sans text-[12.5px] text-ink-2\">\n {field.parentLabel ? (\n <span className=\"text-ink-4\">\n {field.parentLabel}\n {FIELD_LABEL_SEPARATOR}\n </span>\n ) : null}\n <span className=\"text-ink\">{field.shortLabel}</span>\n </span>\n <span className=\"font-mono text-[11px] text-ink-3\">{op?.label}</span>\n <ChipValue\n field={field}\n operator={element.operator}\n value={element.value}\n {...(renderChipItem !== undefined ? { renderItem: renderChipItem } : {})}\n />\n <button\n type=\"button\"\n aria-label=\"Remove filter\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n if (editing) setEditing(false)\n }}\n className={cn(\n 'ml-0.5 size-4 inline-flex items-center justify-center rounded-[3px]',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 10 10\"\n className=\"size-2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2l6 6M8 2l-6 6\" />\n </svg>\n </button>\n </span>\n\n <PopoverContent\n triggerRef={ref as RefObject<Element | null>}\n isOpen={editing}\n onOpenChange={setEditing}\n >\n <ChipMiniEditor\n field={field}\n element={element}\n fields={fields}\n onChangeField={onChangeField}\n onChangeOperator={onChangeOperator}\n onChangeValue={onChangeValue}\n onClose={() => setEditing(false)}\n />\n </PopoverContent>\n </>\n )\n}\n\n/* ---------- ChipMiniEditor -----------------------------------------------\n Single horizontal row: AttributePicker · OperatorPicker · FilterValueInput\n · Save. No header — clicking outside or pressing Escape closes the popover\n too (RAC handles both). Uses the same flex shares as the builder panel's\n filter row so the cells stay coherent across surfaces.\n\n Enter to save: the row is wrapped in a `<form>`. A plain text Input\n bubbles Enter up as a native form submit — closing the popover. RAC's\n Combobox/Select/TagInput/DatePicker all `preventDefault` on Enter for\n their own selection/commit semantics, so the form only submits when no\n child claimed the keypress. The trailing Save button is `type=\"submit\"`\n and triggers the same path.\n ----------------------------------------------------------------------- */\nfunction ChipMiniEditor({\n field,\n element,\n fields,\n onChangeField,\n onChangeOperator,\n onChangeValue,\n onClose,\n}: {\n field: FilterField\n element: { field: string; operator: ComparisonOperator; value: FilterValue }\n fields: ReadonlyArray<FilterField>\n onChangeField: (next: FilterField) => void\n onChangeOperator: (next: ComparisonOperator) => void\n onChangeValue: (next: FilterValue) => void\n onClose: () => void\n}) {\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onClose()\n }}\n className=\"w-[min(560px,92vw)] p-2 flex items-center gap-1.5\"\n >\n <div className=\"flex-1 basis-0 min-w-[140px]\">\n <AttributePicker fields={fields} value={element.field} onChange={onChangeField} />\n </div>\n <div className=\"flex-1 basis-0 min-w-[110px]\">\n <OperatorPicker\n fieldType={field.type}\n value={element.operator}\n onChange={onChangeOperator}\n autoFocus\n />\n </div>\n <div className=\"flex-[2] basis-0 min-w-0\">\n <FilterValueInput\n field={field}\n operator={element.operator}\n value={element.value}\n onChange={onChangeValue}\n />\n </div>\n <button\n type=\"submit\"\n className={cn(\n 'shrink-0 inline-flex items-center px-2.5 py-1.5 rounded-md',\n 'bg-ink text-surface font-mono text-[12px]',\n 'hover:bg-accent-ink cursor-pointer outline-none',\n 'focus-visible:shadow-[var(--shadow-focus)]',\n )}\n >\n Save\n </button>\n </form>\n )\n}\n\n/* ---------- InlineAddFilter ---------------------------------------------- */\nfunction InlineAddFilter({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n data-filter-trigger=\"expanded\"\n onClick={onClick}\n className={cn(\n 'inline-flex items-center gap-1 px-2 py-1 rounded-sm',\n 'text-ink-3 hover:bg-surface-2 hover:text-ink cursor-pointer outline-none',\n )}\n >\n <svg\n aria-hidden\n viewBox=\"0 0 12 12\"\n className=\"size-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n <span className=\"font-sans text-[12.5px]\">Add filter</span>\n </button>\n )\n}\n","import {\n Separator as AriaSeparator,\n type SeparatorProps as AriaSeparatorProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Separator — hairline divider between sections.\n - Default: dashed horizontal rule (matches the Proteos card/modal convention).\n - `variant=\"solid\"` for a continuous hairline (section breaks inside dense\n tables, sidebars, etc. — see the spec's sub-label rows).\n - `orientation=\"vertical\"` for inline toolbars / nav separators.\n ========================================================================= */\n\nexport const separatorStyles = tv({\n base: 'm-0 border-0 border-rule',\n variants: {\n orientation: {\n horizontal: 'w-full border-t',\n vertical: 'h-full border-l',\n },\n variant: {\n dashed: 'border-dashed',\n solid: 'border-solid',\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n variant: 'dashed',\n },\n})\n\nexport type SeparatorVariants = VariantProps<typeof separatorStyles>\nexport type SeparatorProps = AriaSeparatorProps & { variant?: SeparatorVariants['variant'] }\n\nexport function Separator({\n className,\n orientation = 'horizontal',\n variant = 'dashed',\n ...props\n}: SeparatorProps) {\n return (\n <AriaSeparator\n {...props}\n orientation={orientation}\n className={cn(separatorStyles({ orientation, variant }), className)}\n />\n )\n}\n","import { CircleCheck } from 'lucide-react'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n SuccessAnimation — success confirmation: a large green checkmark in a\n circle (token `--color-success`), entering with the one-shot status-pop\n scale+fade (suppressed under prefers-reduced-motion). Decorative:\n rendered with `aria-hidden`, since the surrounding text region carries\n the announcement. Size via className (default 96×96).\n ========================================================================= */\n\nexport type SuccessAnimationProps = {\n className?: string\n}\n\nexport function SuccessAnimation({ className }: SuccessAnimationProps) {\n return (\n <div\n aria-hidden\n className={cn('size-24 text-success motion-safe:animate-status-pop', className)}\n >\n <CircleCheck className=\"size-full\" strokeWidth={1.5} />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Switch as AriaSwitch, type SwitchProps as AriaSwitchProps } from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\nexport type SwitchProps = Omit<AriaSwitchProps, 'children'> & {\n children?: ReactNode\n /** Render the label before the track instead of after it. */\n labelPlacement?: 'start' | 'end'\n}\n\nexport function Switch({ children, labelPlacement = 'end', className, ...props }: SwitchProps) {\n return (\n <AriaSwitch\n {...props}\n className={(renderProps) =>\n cn(\n // `relative`: RAC's visually-hidden <input> is absolutely positioned;\n // without a positioned label it escapes an overflow-auto ancestor and\n // its containing block becomes the page shell, so focusing it (any\n // press) scrolls the clipped shell and the whole tab goes blank.\n 'group relative inline-flex items-center gap-3 cursor-pointer select-none',\n 'font-sans text-[14px] text-ink-2',\n labelPlacement === 'start' && 'flex-row-reverse',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n <span\n aria-hidden\n className={cn(\n 'relative inline-block shrink-0',\n 'w-[38px] h-[22px] rounded-pill border',\n 'bg-surface-3 border-rule',\n 'transition-[background-color,border-color] duration-150',\n 'group-data-[selected]:bg-accent group-data-[selected]:border-accent',\n 'group-data-[focus-visible]:shadow-[var(--shadow-focus)]',\n )}\n >\n <span\n className={cn(\n 'absolute top-[1px] left-[1px]',\n 'block size-[18px] rounded-full bg-surface',\n 'transition-transform duration-200',\n 'group-data-[selected]:translate-x-[16px]',\n )}\n />\n </span>\n {children}\n </AriaSwitch>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n Tab as AriaTab,\n TabList as AriaTabList,\n TabPanel as AriaTabPanel,\n Tabs as AriaTabs,\n type TabListProps as AriaTabListProps,\n type TabPanelProps as AriaTabPanelProps,\n type TabProps as AriaTabProps,\n type TabsProps as AriaTabsProps,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Tabs — generic tab strip wrapping RAC `<Tabs>` / `<TabList>` / `<Tab>` /\n `<TabPanel>`. Chrome only — no product knowledge. Used in the page\n renderer's `TabsElement` and the page-designer inspector (`Style /\n Settings / Rules`).\n\n Sub-component form (`<Tabs.Root>` / `<Tabs.List>` / `<Tabs.Trigger>` /\n `<Tabs.Panel>`) so each tab's content participates separately in the\n designer drop-zone tree. The compound names follow the lib's existing\n slot-style components (Card, Modal).\n ========================================================================= */\n\nexport const tabsStyles = tv({\n slots: {\n root: 'flex flex-col gap-3 outline-none',\n list: 'flex gap-[18px] border-b border-rule pl-0.5',\n trigger: [\n 'cursor-pointer outline-none select-none',\n 'border-b-[1.5px] -mb-px transition-[color,border-color] duration-150',\n 'text-ink-3 border-transparent',\n 'data-[hovered]:text-ink',\n 'data-[selected]:text-ink data-[selected]:border-accent',\n 'data-[disabled]:opacity-45 data-[disabled]:cursor-not-allowed',\n 'data-[focus-visible]:shadow-[var(--shadow-focus)] data-[focus-visible]:rounded-sm',\n ],\n panel: 'outline-none',\n },\n variants: {\n size: {\n sm: {\n list: 'gap-3',\n trigger:\n 'py-1.5 font-mono text-[11px] uppercase tracking-[0.08em]',\n },\n md: {\n list: 'gap-[18px]',\n trigger: 'py-2 text-[13px]',\n },\n },\n },\n defaultVariants: { size: 'md' },\n})\n\nexport type TabsVariants = VariantProps<typeof tabsStyles>\n\nexport type TabsRootProps = Omit<AriaTabsProps, 'children'> &\n TabsVariants & {\n children?: ReactNode\n }\n\nfunction Root({ size, className, children, ...props }: TabsRootProps) {\n const styles = tabsStyles({ size })\n return (\n <AriaTabs\n {...props}\n className={(rp) =>\n cn(styles.root(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children}\n </AriaTabs>\n )\n}\n\nexport type TabsListProps = Omit<AriaTabListProps<object>, 'children'> &\n TabsVariants & {\n children?: ReactNode\n }\n\nfunction List({ size, className, children, ...props }: TabsListProps) {\n const styles = tabsStyles({ size })\n return (\n <AriaTabList\n {...(props as AriaTabListProps<object>)}\n className={(rp) =>\n cn(styles.list(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children as never}\n </AriaTabList>\n )\n}\n\nexport type TabsTriggerProps = Omit<AriaTabProps, 'children'> &\n TabsVariants & {\n children?: ReactNode\n }\n\nfunction Trigger({ size, className, children, ...props }: TabsTriggerProps) {\n const styles = tabsStyles({ size })\n return (\n <AriaTab\n {...props}\n className={(rp) =>\n cn(styles.trigger(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children}\n </AriaTab>\n )\n}\n\nexport type TabsPanelProps = Omit<AriaTabPanelProps, 'children'> & {\n children?: ReactNode\n}\n\nfunction Panel({ className, children, ...props }: TabsPanelProps) {\n const styles = tabsStyles({})\n return (\n <AriaTabPanel\n {...props}\n className={(rp) =>\n cn(styles.panel(), typeof className === 'function' ? className(rp) : className)\n }\n >\n {children}\n </AriaTabPanel>\n )\n}\n\nexport const Tabs = Object.assign(Root, {\n Root,\n List,\n Trigger,\n Panel,\n})\n","import type { ReactNode } from 'react'\nimport {\n TextArea as AriaTextArea,\n type TextAreaProps as AriaTextAreaProps,\n type TextFieldProps as AriaTextFieldProps,\n FieldError,\n Label,\n Text,\n TextField,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type TextareaProps = AriaTextFieldProps & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n placeholder?: string\n /** Visible rows. Height can still grow via vertical resize (consumer). */\n rows?: number\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n /** Extra props forwarded to the underlying <textarea>. */\n textareaProps?: Omit<AriaTextAreaProps, 'className'>\n /** Visual override for the textarea control only. */\n textareaClassName?: string\n}\n\nexport function Textarea({\n label,\n description,\n errorMessage,\n placeholder,\n rows = 4,\n size,\n appearance,\n textareaProps,\n textareaClassName,\n className,\n ...props\n}: TextareaProps) {\n const styles = fieldControlStyles({ size, appearance })\n return (\n <TextField\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n <AriaTextArea\n {...textareaProps}\n rows={rows}\n placeholder={placeholder ?? ''}\n className={cn(\n // Same hairline chrome as Input, but allow vertical resize and set a\n // sensible minimum height so short content doesn't collapse.\n styles.box(),\n styles.content(),\n 'min-h-[100px] resize-y',\n textareaClassName,\n )}\n />\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </TextField>\n )\n}\n","import type { ReactNode } from 'react'\nimport {\n TimeField as AriaTimeField,\n type TimeFieldProps as AriaTimeFieldProps,\n DateInput,\n DateSegment,\n FieldError,\n Label,\n Text,\n type TimeValue,\n} from 'react-aria-components'\nimport { cn } from '../../lib/cn'\nimport {\n type FieldAppearance,\n fieldControlStyles,\n fieldErrorStyles,\n type FieldSize,\n fieldHintStyles,\n fieldLabelStyles,\n} from '../field/field'\n\nexport type TimeFieldProps<T extends TimeValue> = AriaTimeFieldProps<T> & {\n label?: ReactNode\n description?: ReactNode\n errorMessage?: ReactNode\n /** Field size. Defaults to `md`. */\n size?: FieldSize\n /** Chrome variant. Defaults to `field`. `cell` flattens the box. */\n appearance?: FieldAppearance\n}\n\n/* Standalone time editor — backs the `time-picker` control (naive `HH:mm:ss`).\n Just the segmented input: no calendar, no popover. Box chrome + content\n padding both ride on the DateInput since there's no sibling trigger to share\n the border with. */\nexport function TimeField<T extends TimeValue = TimeValue>({\n label,\n description,\n errorMessage,\n size,\n appearance,\n className,\n ...props\n}: TimeFieldProps<T>) {\n const styles = fieldControlStyles({ size, appearance })\n const focusWithin =\n appearance === 'cell'\n ? 'focus-within:border-accent focus-within:shadow-none'\n : 'focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]'\n return (\n <AriaTimeField\n {...props}\n className={(renderProps) =>\n cn(\n 'grid grid-cols-1 gap-1.5',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n >\n {label ? <Label className={fieldLabelStyles}>{label}</Label> : null}\n\n <DateInput\n className={cn(\n styles.box(),\n styles.content(),\n 'flex items-center min-w-0 text-ink',\n // Tabular alignment for time segments — overrides content's\n // font-sans on purpose.\n 'font-mono',\n focusWithin,\n )}\n >\n {(segment) => (\n <DateSegment\n segment={segment}\n className={cn(\n 'px-px tabular-nums outline-none select-none',\n 'data-[placeholder]:text-ink-4',\n 'data-[type=literal]:text-ink-4',\n // segment focus treatment: indigo fill, paper text\n 'data-[focused]:bg-accent data-[focused]:text-[#f0efe8] data-[focused]:rounded-[3px]',\n 'data-[disabled]:cursor-not-allowed',\n )}\n />\n )}\n </DateInput>\n\n {description ? (\n <Text slot=\"description\" className={fieldHintStyles}>\n {description}\n </Text>\n ) : null}\n {errorMessage && appearance !== 'cell' ? (\n <FieldError className={fieldErrorStyles}>{errorMessage}</FieldError>\n ) : null}\n </AriaTimeField>\n )\n}\n","import { CircleAlert, CircleCheck, Info, X as XLucide } from 'lucide-react'\nimport {\n Button as AriaButton,\n Text as AriaText,\n UNSTABLE_Toast as AriaToast,\n UNSTABLE_ToastContent as AriaToastContent,\n type ToastOptions as AriaToastOptions,\n UNSTABLE_ToastQueue as AriaToastQueue,\n UNSTABLE_ToastRegion as AriaToastRegion,\n} from 'react-aria-components'\nimport { tv, type VariantProps } from 'tailwind-variants'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Toast — brief, transient notification stack (bottom-right). Wraps RAC's\n ToastRegion / Toast (queue, ARIA live region, focus management, timeouts).\n\n Usage: create ONE queue per app (`createToastQueue()`), mount ONE\n `<ToastRegion queue={queue} />` near the root, and push from anywhere\n with `queue.add({ title, description?, variant? }, { timeout })`.\n ========================================================================= */\n\nexport type ToastVariant = 'info' | 'success' | 'danger'\n\n/** The payload a caller enqueues. Pure data — the region renders it. */\nexport interface ToastContent {\n title: string\n description?: string\n variant?: ToastVariant\n}\n\nexport type ToastQueue = AriaToastQueue<ToastContent>\nexport type ToastOptions = AriaToastOptions\n\n/** Creates the app-wide queue. `maxVisibleToasts` bounds the on-screen stack. */\nexport function createToastQueue(options: { maxVisibleToasts?: number } = {}): ToastQueue {\n return new AriaToastQueue<ToastContent>({ maxVisibleToasts: options.maxVisibleToasts ?? 3 })\n}\n\nexport const toastStyles = tv({\n slots: {\n root: [\n 'flex items-start gap-3 w-[360px] max-w-[calc(100vw-32px)]',\n 'rounded-lg border border-rule bg-surface shadow-float',\n 'px-3.5 py-3 outline-none',\n 'focus-visible:shadow-focus',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-bottom-2 entering:duration-200',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-150',\n ],\n icon: 'size-4 shrink-0 mt-0.5',\n title: 'font-sans text-[13px] font-medium leading-[1.4] text-ink',\n description: 'font-sans text-[12.5px] leading-[1.5] text-ink-3 break-words',\n },\n variants: {\n variant: {\n info: { icon: 'text-ink-3' },\n success: { icon: 'text-success' },\n danger: { icon: 'text-danger' },\n },\n },\n defaultVariants: { variant: 'info' },\n})\n\nexport type ToastVariants = VariantProps<typeof toastStyles>\n\nconst VARIANT_ICON = {\n info: Info,\n success: CircleCheck,\n danger: CircleAlert,\n} as const\n\nexport interface ToastRegionProps {\n queue: ToastQueue\n className?: string\n}\n\n/** The single live region that renders queued toasts. */\nexport function ToastRegion({ queue, className }: ToastRegionProps) {\n return (\n <AriaToastRegion\n queue={queue}\n className={cn(\n 'fixed bottom-4 right-4 z-[1300] flex flex-col-reverse gap-2 outline-none',\n className,\n )}\n >\n {({ toast }) => {\n const variant = toast.content.variant ?? 'info'\n const Icon = VARIANT_ICON[variant]\n const { root, icon, title, description } = toastStyles({ variant })\n return (\n <AriaToast toast={toast} className={root()}>\n <Icon className={icon()} aria-hidden />\n <AriaToastContent className=\"flex flex-col gap-0.5 flex-1 min-w-0\">\n <AriaText slot=\"title\" className={title()}>\n {toast.content.title}\n </AriaText>\n {toast.content.description ? (\n <AriaText slot=\"description\" className={description()}>\n {toast.content.description}\n </AriaText>\n ) : null}\n </AriaToastContent>\n <AriaButton\n slot=\"close\"\n aria-label=\"Dismiss\"\n className={cn(\n 'shrink-0 inline-flex items-center justify-center size-6 rounded-md',\n 'text-ink-4 hover:text-ink hover:bg-surface-2 cursor-pointer outline-none',\n 'focus-visible:shadow-focus',\n )}\n >\n <XLucide className=\"size-3.5\" />\n </AriaButton>\n </AriaToast>\n )\n }}\n </AriaToastRegion>\n )\n}\n","import {\n Tooltip as AriaTooltip,\n type TooltipProps as AriaTooltipProps,\n TooltipTrigger as AriaTooltipTrigger,\n type TooltipTriggerComponentProps,\n} from 'react-aria-components'\n\nimport { cn } from '../../lib/cn'\n\n/* =========================================================================\n Tooltip — small mono label on hover/focus. Composition follows RAC:\n <TooltipTrigger>\n <Button>…</Button> // the hover/focus target\n <Tooltip>Copy</Tooltip> // the floating label\n </TooltipTrigger>\n Use for icon-button labels, truncated text hints, keyboard shortcuts.\n ========================================================================= */\n\n/** Stateful root. RAC handles hover delay + focus visibility.\n *\n * - `delay` — ms of hover before the tooltip opens. Keyboard focus opens\n * instantly regardless. Default **500** (RAC's own default is 1500 which\n * feels sluggish for a dense app). Set `0` for instant tooltips.\n * - `closeDelay` — ms after the pointer leaves before the tooltip hides.\n * Default **0** (close immediately). Raise it if adjacent targets share\n * tooltips and you want them to chain without re-waiting.\n */\nexport function TooltipTrigger({\n delay = 500,\n closeDelay = 0,\n ...props\n}: TooltipTriggerComponentProps) {\n return <AriaTooltipTrigger delay={delay} closeDelay={closeDelay} {...props} />\n}\n\nexport type TooltipProps = AriaTooltipProps\n\nexport function Tooltip({ className, offset = 6, ...props }: TooltipProps) {\n return (\n <AriaTooltip\n {...props}\n offset={offset}\n className={(renderProps) =>\n cn(\n 'z-50 max-w-xs',\n 'rounded-md border border-rule bg-surface shadow-[var(--shadow-raised)]',\n 'px-2.5 py-1.5',\n 'font-mono text-[11.5px] text-ink-2',\n 'entering:animate-in entering:fade-in-0 entering:slide-in-from-top-1 entering:duration-150',\n 'exiting:animate-out exiting:fade-out-0 exiting:duration-100',\n typeof className === 'function' ? className(renderProps) : className,\n )\n }\n />\n )\n}\n"]}