@pollinations/ui 0.1.0-alpha.6 → 0.1.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-user-menu/sdk.cjs +8 -29
- package/dist/app-user-menu/sdk.cjs.map +1 -1
- package/dist/app-user-menu/sdk.d.cts +0 -4
- package/dist/app-user-menu/sdk.d.ts +0 -4
- package/dist/app-user-menu/sdk.js +8 -29
- package/dist/app-user-menu/sdk.js.map +1 -1
- package/dist/brand/badge-made-with.svg +1 -0
- package/dist/index.browser.min.js +1 -1
- package/dist/index.browser.min.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/compositions/AccountIdentity.tsx","../src/lib/cn.ts","../src/primitives/ChevronIcon.tsx","../src/primitives/Dropdown.tsx","../src/primitives/icons/index.tsx","../src/primitives/Typography.tsx","../src/compositions/Alert.tsx","../src/primitives/BrandMark.tsx","../src/compositions/AppBrand.tsx","../src/compositions/AppHeader.tsx","../src/primitives/Surface.tsx","../src/compositions/Callout.tsx","../src/compositions/ChatConversation.tsx","../src/primitives/ScrollArea.tsx","../src/compositions/ChatMessage.tsx","../src/compositions/ChatPromptInput.tsx","../src/primitives/Textarea.tsx","../src/compositions/CopyButton.tsx","../src/primitives/Button.tsx","../src/primitives/Tooltip.tsx","../src/compositions/CodeBlock.tsx","../src/compositions/Collapsible.tsx","../src/primitives/Dialog.tsx","../src/compositions/ConfirmationDialog.tsx","../src/primitives/Eyebrow.tsx","../src/compositions/ContentHeader.tsx","../src/compositions/CopyField.tsx","../src/compositions/EditableCombobox.tsx","../src/primitives/Input.tsx","../src/lib/link.ts","../src/compositions/ExternalLinkButton.tsx","../src/primitives/Field.tsx","../src/compositions/FieldStack.tsx","../src/compositions/FileUpload.tsx","../src/lib/document-file-drop-guard.ts","../src/lib/partition-files.ts","../src/primitives/IconButton.tsx","../src/compositions/InfoTip.tsx","../src/primitives/Chip.tsx","../src/compositions/KeyChip.tsx","../src/compositions/LinkCard.tsx","../src/compositions/MediaPlaceholder.tsx","../src/compositions/MultiSelect.tsx","../src/compositions/NavItem.tsx","../src/compositions/PeriodPicker.tsx","../src/lib/period.ts","../src/primitives/TabButton.tsx","../src/compositions/Section.tsx","../src/compositions/StatCard.tsx","../src/compositions/ToolCallDetails.tsx","../src/primitives/InlineLink.tsx","../src/lib/cn-app.ts","../src/lib/use-scroll-lock.ts","../src/primitives/ButtonGroup.tsx","../src/primitives/ColorModeToggle.tsx","../src/primitives/Switch.tsx","../src/primitives/Drawer.tsx","../src/primitives/DropdownItem.tsx","../src/primitives/LoadingStatus.tsx","../src/primitives/Slider.tsx","../src/primitives/Table.tsx","../src/primitives/TableDisclosureButton.tsx"],"sourcesContent":["export {\n AccountIdentity,\n AccountIdentityLink,\n type AccountIdentityLinkProps,\n type AccountIdentityProps,\n} from \"./compositions/AccountIdentity.tsx\";\nexport {\n AccountMenu,\n type AccountMenuProps,\n} from \"./compositions/AccountMenu.tsx\";\nexport { Alert, type AlertProps } from \"./compositions/Alert.tsx\";\nexport { AppBrand, type AppBrandProps } from \"./compositions/AppBrand.tsx\";\nexport { AppHeader, type AppHeaderProps } from \"./compositions/AppHeader.tsx\";\nexport { Callout, type CalloutProps } from \"./compositions/Callout.tsx\";\nexport {\n ChatConversation,\n ChatConversationContent,\n type ChatConversationContentProps,\n type ChatConversationProps,\n} from \"./compositions/ChatConversation.tsx\";\nexport {\n ChatMessage,\n ChatMessageActions,\n type ChatMessageActionsProps,\n ChatMessageContent,\n type ChatMessageContentProps,\n ChatMessageHeader,\n type ChatMessageHeaderProps,\n type ChatMessageProps,\n type ChatMessageRole,\n} from \"./compositions/ChatMessage.tsx\";\nexport {\n ChatPromptInput,\n ChatPromptInputFooter,\n type ChatPromptInputFooterProps,\n type ChatPromptInputProps,\n ChatPromptTextarea,\n} from \"./compositions/ChatPromptInput.tsx\";\nexport { CodeBlock, type CodeBlockProps } from \"./compositions/CodeBlock.tsx\";\nexport {\n Collapsible,\n type CollapsibleProps,\n} from \"./compositions/Collapsible.tsx\";\nexport {\n ConfirmationDialog,\n type ConfirmationDialogProps,\n} from \"./compositions/ConfirmationDialog.tsx\";\nexport {\n ContentHeader,\n type ContentHeaderProps,\n} from \"./compositions/ContentHeader.tsx\";\nexport {\n CopyButton,\n type CopyButtonProps,\n} from \"./compositions/CopyButton.tsx\";\nexport { CopyField, type CopyFieldProps } from \"./compositions/CopyField.tsx\";\nexport {\n EditableCombobox,\n type EditableComboboxProps,\n EditableComboboxToken,\n type EditableComboboxTokenProps,\n} from \"./compositions/EditableCombobox.tsx\";\nexport {\n ExternalLinkButton,\n type ExternalLinkButtonProps,\n} from \"./compositions/ExternalLinkButton.tsx\";\nexport {\n FieldStack,\n type FieldStackProps,\n} from \"./compositions/FieldStack.tsx\";\nexport {\n FileUpload,\n type FileUploadProps,\n} from \"./compositions/FileUpload.tsx\";\nexport { InfoTip } from \"./compositions/InfoTip.tsx\";\nexport { KeyChip, type KeyChipProps } from \"./compositions/KeyChip.tsx\";\nexport { LinkCard, type LinkCardProps } from \"./compositions/LinkCard.tsx\";\n// Markdown and Prose live at @pollinations/ui/markdown — see src/markdown.ts.\nexport {\n MediaPlaceholder,\n type MediaPlaceholderProps,\n} from \"./compositions/MediaPlaceholder.tsx\";\nexport {\n MultiSelect,\n type MultiSelectProps,\n} from \"./compositions/MultiSelect.tsx\";\nexport { NavItem, type NavItemProps } from \"./compositions/NavItem.tsx\";\nexport {\n PeriodPicker,\n type PeriodPickerProps,\n} from \"./compositions/PeriodPicker.tsx\";\nexport { Section, type SectionProps } from \"./compositions/Section.tsx\";\nexport { StatCard, type StatCardProps } from \"./compositions/StatCard.tsx\";\nexport {\n ToolCallDetails,\n type ToolCallDetailsProps,\n type ToolCallStatus,\n} from \"./compositions/ToolCallDetails.tsx\";\nexport { cn } from \"./lib/cn-app.ts\";\nexport {\n currentPeriod,\n getPeriodBucketKeys,\n isPeriodSelectable,\n type PeriodGranularity,\n type PeriodSelection,\n periodBucketKeyToDate,\n periodFromDate,\n periodToWindow,\n} from \"./lib/period.ts\";\nexport { useScrollLock } from \"./lib/use-scroll-lock.ts\";\nexport { BrandMark, type BrandMarkProps } from \"./primitives/BrandMark.tsx\";\nexport {\n Button,\n type ButtonAppearance,\n type ButtonProps,\n} from \"./primitives/Button.tsx\";\nexport {\n ButtonGroup,\n type ButtonGroupProps,\n} from \"./primitives/ButtonGroup.tsx\";\nexport { ChevronIcon } from \"./primitives/ChevronIcon.tsx\";\nexport { Chip } from \"./primitives/Chip.tsx\";\nexport {\n ColorModeToggle,\n setColorMode,\n useColorMode,\n} from \"./primitives/ColorModeToggle.tsx\";\nexport {\n Dialog,\n DialogBody,\n type DialogBodyProps,\n DialogDescription,\n DialogFooter,\n type DialogFooterProps,\n DialogHeader,\n type DialogHeaderProps,\n type DialogProps,\n DialogTitle,\n} from \"./primitives/Dialog.tsx\";\nexport { Drawer, type DrawerProps } from \"./primitives/Drawer.tsx\";\nexport { Dropdown, type DropdownProps } from \"./primitives/Dropdown.tsx\";\nexport {\n DropdownItem,\n type DropdownItemProps,\n} from \"./primitives/DropdownItem.tsx\";\nexport { Eyebrow, type EyebrowProps } from \"./primitives/Eyebrow.tsx\";\nexport { Field } from \"./primitives/Field.tsx\";\nexport {\n IconButton,\n type IconButtonIntent,\n type IconButtonProps,\n type IconButtonVariant,\n} from \"./primitives/IconButton.tsx\";\nexport { InlineLink, type InlineLinkProps } from \"./primitives/InlineLink.tsx\";\nexport { Input, type InputProps } from \"./primitives/Input.tsx\";\nexport * from \"./primitives/icons/index.tsx\";\nexport { LoadingStatus } from \"./primitives/LoadingStatus.tsx\";\nexport { ScrollArea, type ScrollAreaProps } from \"./primitives/ScrollArea.tsx\";\nexport { Slider, type SliderProps } from \"./primitives/Slider.tsx\";\nexport { Surface, type SurfaceProps } from \"./primitives/Surface.tsx\";\nexport {\n Switch,\n type SwitchProps,\n type SwitchSize,\n type SwitchStatus,\n} from \"./primitives/Switch.tsx\";\nexport {\n TabButton,\n type TabButtonProps,\n} from \"./primitives/TabButton.tsx\";\nexport {\n Table,\n TableBody,\n type TableBodyProps,\n TableCell,\n type TableCellProps,\n TableHead,\n TableHeaderCell,\n type TableHeaderCellProps,\n type TableHeadProps,\n type TableProps,\n TableRow,\n type TableRowProps,\n} from \"./primitives/Table.tsx\";\nexport {\n TableDisclosureButton,\n type TableDisclosureButtonProps,\n} from \"./primitives/TableDisclosureButton.tsx\";\nexport { Textarea, type TextareaProps } from \"./primitives/Textarea.tsx\";\nexport { Tooltip } from \"./primitives/Tooltip.tsx\";\nexport {\n Heading,\n type HeadingProps,\n Text,\n type TextProps,\n} from \"./primitives/Typography.tsx\";\n","import type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Dropdown, type DropdownProps } from \"../primitives/Dropdown.tsx\";\nimport { ExternalLinkIcon } from \"../primitives/icons/index.tsx\";\n\nfunction initials(name: string) {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0] ?? \"\"}${parts.at(-1)?.[0] ?? \"\"}`.toUpperCase();\n}\n\nfunction AccountAvatar({\n name,\n avatarUrl,\n secondaryContent,\n dashboardHref,\n inline = false,\n}: {\n name: string;\n avatarUrl?: string | null;\n secondaryContent?: ReactNode;\n dashboardHref?: string;\n /** Small avatar inside a pill link; hovering the pill zooms it. */\n inline?: boolean;\n}) {\n const size = inline\n ? \"polli:h-6 polli:w-6\"\n : secondaryContent != null\n ? \"polli:h-11 polli:w-11\"\n : \"polli:h-8 polli:w-8\";\n const className = cn(\n size,\n inline &&\n \"polli:transition-transform polli:group-hover:scale-110 polli:group-hover:brightness-110 polli:motion-reduce:transition-none polli:motion-reduce:group-hover:scale-100\",\n );\n const avatar = avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className={cn(\n className,\n \"polli:shrink-0 polli:rounded-full polli:object-cover\",\n )}\n />\n ) : (\n <span\n role=\"img\"\n aria-label={`${name} avatar`}\n className={cn(\n className,\n \"polli:flex polli:shrink-0 polli:items-center polli:justify-center polli:rounded-full polli:bg-theme-bg-pale polli:text-xs polli:font-semibold polli:text-theme-text-strong\",\n )}\n >\n {initials(name)}\n </span>\n );\n return dashboardHref ? (\n <a\n href={dashboardHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Open dashboard\"\n title=\"Open dashboard\"\n className=\"polli:shrink-0 polli:rounded-full polli:cursor-pointer polli:transition-transform polli:hover:scale-105 polli:hover:brightness-110 polli:focus-visible:outline-2 polli:focus-visible:outline-offset-2 polli:focus-visible:outline-current polli:motion-reduce:transition-none polli:motion-reduce:hover:scale-100\"\n >\n {avatar}\n </a>\n ) : (\n avatar\n );\n}\n\nexport type AccountIdentityProps = {\n name: string;\n avatarUrl?: string | null;\n secondaryContent?: ReactNode;\n /** Optional dashboard destination, owned by the caller. Opens in a new tab. */\n dashboardHref?: string;\n className?: string;\n};\n\nexport type AccountIdentityLinkProps = Pick<\n AccountIdentityProps,\n \"name\" | \"avatarUrl\" | \"className\"\n> & {\n /** External profile the whole pill opens in a new tab. */\n href: string;\n};\n\nexport function AccountIdentity({\n name,\n avatarUrl,\n secondaryContent,\n dashboardHref,\n className,\n}: AccountIdentityProps) {\n return (\n <span\n className={cn(\n \"polli:flex polli:min-w-0 polli:items-center polli:gap-2 polli:rounded-full polli:bg-surface-opaque polli:p-1 polli:pr-3\",\n className,\n )}\n >\n <AccountAvatar\n name={name}\n avatarUrl={avatarUrl}\n dashboardHref={dashboardHref}\n secondaryContent={secondaryContent}\n />\n <AccountDetails name={name} secondaryContent={secondaryContent} />\n </span>\n );\n}\n\n/** Someone else's identity as a one-line pill link, e.g. an app's developer. */\nexport function AccountIdentityLink({\n name,\n avatarUrl,\n href,\n className,\n}: AccountIdentityLinkProps) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n // Sits in running text on cards, so it is compact and tinted.\n \"polli:group polli:inline-flex polli:max-w-full polli:min-w-0 polli:items-center polli:gap-1.5 polli:rounded-full polli:bg-theme-bg-subtle polli:p-0.5 polli:pr-2.5 polli:align-middle polli:focus-visible:outline-2 polli:focus-visible:outline-offset-2 polli:focus-visible:outline-current\",\n className,\n )}\n >\n <AccountAvatar name={name} avatarUrl={avatarUrl} inline />\n <AccountDetails name={name} />\n {/* InlineLink's external arrow at the name's size: this pill leaves the app. */}\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli:-ml-0.5 polli:h-3 polli:w-3 polli:shrink-0 polli:text-theme-text-strong polli:opacity-65\"\n />\n </a>\n );\n}\n\nfunction AccountDetails({\n name,\n secondaryContent,\n secondaryId,\n}: {\n name: string;\n secondaryContent?: ReactNode;\n secondaryId?: string;\n}) {\n return (\n <span className=\"polli:flex polli:min-w-0 polli:flex-col polli:items-start polli:text-left\">\n <span\n title={name}\n className=\"polli:max-w-full polli:truncate polli:text-sm polli:font-medium polli:leading-5 polli:text-theme-text-strong\"\n >\n {name}\n </span>\n {secondaryContent != null && (\n <span\n id={secondaryId}\n className=\"polli:inline-flex polli:min-h-5 polli:items-center polli:whitespace-nowrap polli:text-xs polli:leading-4 polli:text-theme-text-base\"\n >\n {secondaryContent}\n </span>\n )}\n </span>\n );\n}\n\nexport type AccountMenuProps = AccountIdentityProps & {\n /** The caller owns navigation, permissions and sign-out behavior. */\n children: DropdownProps[\"children\"];\n menuClassName?: string;\n side?: \"top\" | \"bottom\";\n menuLabel?: string;\n};\n\n/**\n * With `dashboardHref` the avatar is a link and the name/chevron open the\n * menu; without one the whole pill is the trigger.\n */\nexport function AccountMenu({\n name,\n avatarUrl,\n dashboardHref,\n secondaryContent,\n children,\n className,\n menuClassName,\n side = \"bottom\",\n menuLabel = `Account menu for ${name}`,\n}: AccountMenuProps) {\n const statusId = useId();\n const avatar = (\n <AccountAvatar\n name={name}\n avatarUrl={avatarUrl}\n dashboardHref={dashboardHref}\n secondaryContent={secondaryContent}\n />\n );\n\n return (\n <div\n data-theme=\"accent\"\n className={cn(\n \"polli:flex polli:min-w-0 polli:items-center polli:gap-2 polli:rounded-full polli:bg-theme-bg-active polli:p-1 polli:pr-3 polli:text-theme-text-strong polli:transition-colors polli:hover:bg-theme-bg-hover\",\n className,\n )}\n >\n {dashboardHref && avatar}\n <Dropdown\n align=\"end\"\n side={side}\n className={cn(\n \"polli:w-max polli:min-w-[var(--reference-width)] polli:p-1\",\n menuClassName,\n )}\n trigger={(open) => (\n <button\n type=\"button\"\n aria-label={menuLabel}\n aria-describedby={\n secondaryContent != null ? statusId : undefined\n }\n className=\"polli-control polli:flex polli:min-w-0 polli:flex-1 polli:items-center polli:gap-2 polli:self-stretch polli:rounded-full polli:text-theme-text-strong\"\n >\n {!dashboardHref && avatar}\n <AccountDetails\n name={name}\n secondaryContent={secondaryContent}\n secondaryId={statusId}\n />\n <ChevronIcon\n expanded={open}\n className=\"polli:ml-auto polli:h-4 polli:w-4 polli:text-theme-text-strong\"\n />\n </button>\n )}\n >\n {children}\n </Dropdown>\n </div>\n );\n}\n","import { clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({ prefix: \"polli\" });\n\n/** Internal class merge for polli:-prefixed package primitive classes. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import type { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype ChevronIconProps = {\n /** Rotate 180° when expanded/open. */\n expanded?: boolean;\n className?: string;\n};\n\n/**\n * Canonical chevron used for collapsibles, dropdown triggers, and select pills\n * across the app. One icon everywhere.\n */\nexport const ChevronIcon: FC<ChevronIconProps> = ({ expanded, className }) => (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n className={cn(\n \"polli:shrink-0 polli:transition-transform polli:duration-200 polli:ease-out\",\n expanded && \"polli:rotate-180\",\n className,\n )}\n >\n <path\n d=\"M3 4.5 6 7.5l3-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n","import { Popover } from \"@ark-ui/react/popover\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { CSSProperties, FC, ReactNode } from \"react\";\nimport { useId, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst DEFAULT_PANEL = \"polli:rounded-lg polli:bg-surface-menu polli:shadow-lg\";\n\nexport type DropdownProps = {\n /** Trigger element; receives the current open state (e.g. to rotate a chevron). */\n trigger: (open: boolean) => ReactNode;\n /** Panel content. As a function, receives `close` to dismiss after a selection. */\n children: ReactNode | ((close: () => void) => ReactNode);\n /** Panel placement relative to the trigger. */\n align?: \"start\" | \"end\";\n side?: \"top\" | \"bottom\";\n /** Controlled open state. Omit to let the Dropdown manage its own. */\n open?: boolean;\n /** Render inside the parent dialog so its focus and accessibility scope includes the menu. */\n portalled?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Appended after the surface (widths, padding, max-height…). */\n className?: string;\n /** Theme variables for portaled content that cannot inherit from its trigger. */\n panelStyle?: CSSProperties;\n};\n\nexport const Dropdown: FC<DropdownProps> = ({\n trigger,\n children,\n align = \"start\",\n side = \"bottom\",\n open: openProp,\n portalled = true,\n onOpenChange,\n className,\n panelStyle,\n}) => {\n const triggerId = useId();\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n return (\n <Popover.Root\n ids={{ trigger: triggerId }}\n open={open}\n portalled={portalled}\n onOpenChange={(details) => setOpen(details.open)}\n positioning={{\n placement: `${side}-${align}`,\n strategy: portalled ? \"absolute\" : \"fixed\",\n }}\n >\n <Popover.Trigger asChild>{trigger(open)}</Popover.Trigger>\n <Portal disabled={!portalled}>\n <Popover.Positioner>\n <Popover.Content\n aria-labelledby={triggerId}\n style={panelStyle}\n className={cn(\n \"polli:z-[120] polli:overflow-hidden polli:focus:outline-none\",\n DEFAULT_PANEL,\n className,\n )}\n >\n {typeof children === \"function\"\n ? children(() => setOpen(false))\n : children}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import type { IconProps } from \"./types.ts\";\n\nconst strokeProps = {\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n} as const;\n\nexport function AppIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M2 20h20\" />\n </svg>\n );\n}\n\nexport function AccountIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 21a8 8 0 0 1 16 0\" />\n </svg>\n );\n}\n\nexport function ArrowRightIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M5 12h14M13 6l6 6-6 6\" />\n </svg>\n );\n}\n\nexport function BeakerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 3h6\" />\n <path d=\"M10 3v6.5L4.5 18a2 2 0 0 0 1.7 3h11.6a2 2 0 0 0 1.7-3L14 9.5V3\" />\n <path d=\"M7 14h10\" />\n </svg>\n );\n}\n\nexport function BotIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 8V4H8\" />\n <rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\" />\n <path d=\"M2 14h2M20 14h2\" />\n <path d=\"M9 13v2M15 13v2\" />\n </svg>\n );\n}\n\nexport function BookIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 4h5a3 3 0 0 1 3 3v13a2 2 0 0 0-2-2H4z\" />\n <path d=\"M20 4h-5a3 3 0 0 0-3 3v13a2 2 0 0 1 2-2h6z\" />\n </svg>\n );\n}\n\nexport function BugIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m8 2 1.9 1.9M14.1 3.9 16 2\" />\n <path d=\"M9 7V6a3 3 0 0 1 6 0v1\" />\n <path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a6 6 0 0 1 12 0v3c0 3.3-2.7 6-6 6Z\" />\n <path d=\"M12 20v-9M6.5 9C4.6 8.8 3 7.1 3 5M6 13H2M3 21c0-2.1 1.7-3.9 3.8-4M17.5 9C19.4 8.8 21 7.1 21 5M18 13h4M21 21c0-2.1-1.7-3.9-3.8-4\" />\n </svg>\n );\n}\n\nexport function CheckIcon(props: IconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...strokeProps}\n strokeWidth={2.5}\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nexport function ClipboardIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nexport function ClockIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3 2\" />\n </svg>\n );\n}\n\nexport function DiscordIcon(props: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20.32 4.37A19.8 19.8 0 0 0 15.36 2.83a.07.07 0 0 0-.08.04c-.21.38-.45.88-.62 1.27a18.27 18.27 0 0 0-5.52 0 12.84 12.84 0 0 0-.63-1.27.08.08 0 0 0-.08-.04A19.74 19.74 0 0 0 3.47 4.37a.07.07 0 0 0-.03.03C.31 9.07-.55 13.61-.13 18.1a.08.08 0 0 0 .03.06 19.9 19.9 0 0 0 6.08 3.07.08.08 0 0 0 .09-.03c.47-.64.88-1.31 1.24-2.02a.08.08 0 0 0-.04-.1 13.08 13.08 0 0 1-1.9-.91.08.08 0 0 1-.01-.13c.13-.1.25-.2.37-.29a.07.07 0 0 1 .08-.01 14.24 14.24 0 0 0 12.38 0 .07.07 0 0 1 .08.01c.12.1.25.2.38.3a.08.08 0 0 1-.01.12 12.22 12.22 0 0 1-1.9.9.08.08 0 0 0-.04.11c.36.7.77 1.38 1.23 2.02a.08.08 0 0 0 .1.03 19.84 19.84 0 0 0 6.08-3.07.08.08 0 0 0 .03-.05c.5-5.2-.84-9.7-3.77-13.71a.06.06 0 0 0-.03-.03ZM8.02 15.37c-1.18 0-2.16-1.08-2.16-2.4 0-1.32.96-2.4 2.16-2.4 1.2 0 2.18 1.09 2.16 2.4 0 1.32-.96 2.4-2.16 2.4Zm7.96 0c-1.18 0-2.16-1.08-2.16-2.4 0-1.32.96-2.4 2.16-2.4 1.2 0 2.18 1.09 2.16 2.4 0 1.32-.95 2.4-2.16 2.4Z\"\n />\n </svg>\n );\n}\n\nexport function InstagramIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <circle\n cx=\"17.5\"\n cy=\"6.5\"\n r=\"1\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n );\n}\n\nexport function XSocialIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M18.24 2.25h3.31l-7.23 8.26 8.51 11.24h-6.66l-5.21-6.82-5.97 6.82H1.68l7.73-8.84L1.25 2.25h6.83l4.71 6.23 5.45-6.23Zm-1.16 17.52h1.83L7.08 4.13H5.12l11.96 15.64Z\"\n />\n </svg>\n );\n}\n\nexport function LinkedInIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20.45 20.45h-3.56v-5.57c0-1.33-.03-3.04-1.85-3.04-1.86 0-2.14 1.45-2.14 2.94v5.67H9.34V9h3.42v1.56h.05c.47-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28ZM5.32 7.43a2.07 2.07 0 1 1 0-4.13 2.07 2.07 0 0 1 0 4.13ZM7.1 20.45H3.54V9H7.1v11.45Z\"\n />\n </svg>\n );\n}\n\nexport function DownloadIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n );\n}\n\nexport function ExpandIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M8 3H3v5M16 3h5v5M21 16v5h-5M3 16v5h5\" />\n </svg>\n );\n}\n\nexport function PlayIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M7 4.5v15l12-7.5z\" />\n </svg>\n );\n}\n\nexport function PauseIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M6 4h4v16H6zM14 4h4v16h-4z\" />\n </svg>\n );\n}\n\nexport function CloudUploadIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M17.5 19H19a4 4 0 0 0 .4-8A7.5 7.5 0 0 0 5 9.5 5 5 0 0 0 6 19h1.5\" />\n <path d=\"m8.5 15.5 3.5-3.5 3.5 3.5M12 12v9\" />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M7 17 17 7M9 7h8v8\" />\n </svg>\n );\n}\n\nexport function GenApiIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m8 3 4 1.5L16 3v18l-4-1.5L8 21z\" />\n <path d=\"M8 3v18M16 3v18\" />\n </svg>\n );\n}\n\nexport function GitBranchIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\" />\n <circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <path d=\"M18 9a9 9 0 0 1-9 9\" />\n </svg>\n );\n}\n\nexport function GitPullRequestIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"6\" cy=\"6\" r=\"3\" />\n <circle cx=\"18\" cy=\"18\" r=\"3\" />\n <path d=\"M6 9v12M13 6h3a2 2 0 0 1 2 2v7\" />\n </svg>\n );\n}\n\nexport function GraduationCapIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21.42 10.92a1 1 0 0 0-.02-1.84L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.83l8.57 3.91a2 2 0 0 0 1.66 0z\" />\n <path d=\"M22 10v6\" />\n <path d=\"M6 12.5V16a6 3 0 0 0 12 0v-3.5\" />\n </svg>\n );\n}\n\nexport function SparklesIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 3l1.9 5.8a2 2 0 0 0 1.3 1.3L21 12l-5.8 1.9a2 2 0 0 0-1.3 1.3L12 21l-1.9-5.8a2 2 0 0 0-1.3-1.3L3 12l5.8-1.9a2 2 0 0 0 1.3-1.3z\" />\n </svg>\n );\n}\n\nexport function GitHubIcon(props: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M12 .5A11.5 11.5 0 0 0 8.36 22.9c.58.11.79-.25.79-.56v-2.16c-3.21.7-3.89-1.38-3.89-1.38-.53-1.34-1.29-1.7-1.29-1.7-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.04 1.76 2.71 1.25 3.37.96.11-.75.4-1.25.74-1.54-2.56-.29-5.26-1.28-5.26-5.7 0-1.26.45-2.29 1.19-3.1-.12-.29-.52-1.46.11-3.06 0 0 .97-.31 3.16 1.18a10.88 10.88 0 0 1 5.76 0c2.19-1.49 3.15-1.18 3.15-1.18.63 1.6.23 2.77.11 3.06.74.81 1.19 1.84 1.19 3.1 0 4.43-2.7 5.4-5.27 5.69.41.36.78 1.06.78 2.14v3.19c0 .31.21.68.8.56A11.5 11.5 0 0 0 12 .5Z\"\n />\n </svg>\n );\n}\n\nexport function ImageIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-5-5L5 21\" />\n </svg>\n );\n}\n\nexport function CubeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m21 16-9 5-9-5V8l9-5 9 5z\" />\n <path d=\"m3 8 9 5 9-5\" />\n <path d=\"M12 13v8\" />\n </svg>\n );\n}\n\nexport function AudioIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 18V5l12-2v13\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n );\n}\n\nexport function LockIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function LogInIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M10 17l5-5-5-5\" />\n <path d=\"M15 12H3\" />\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n </svg>\n );\n}\n\nexport function LogOutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"m16 17 5-5-5-5\" />\n <path d=\"M21 12H9\" />\n </svg>\n );\n}\n\nexport function MailIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <path d=\"m3 7 9 7 9-7\" />\n </svg>\n );\n}\n\nexport function McpIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"4\" width=\"8\" height=\"16\" rx=\"1.5\" />\n <rect x=\"14\" y=\"4\" width=\"8\" height=\"16\" rx=\"1.5\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\nexport function MenuIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 7h16M4 12h16M4 17h16\" />\n </svg>\n );\n}\n\nexport function NewspaperIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M5 4h12a1 1 0 0 1 1 1v14a1 1 0 0 0 1 1H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h1z\" />\n <path d=\"M18 8h2a1 1 0 0 1 1 1v9a2 2 0 0 1-2 2\" />\n <path d=\"M7 8h7M7 12h7M7 16h4\" />\n </svg>\n );\n}\n\nexport function PlusIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nexport function TerminalIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <polyline points=\"4 8 8 12 4 16\" />\n <line x1=\"12\" y1=\"20\" x2=\"20\" y2=\"20\" />\n </svg>\n );\n}\n\nexport function ToolIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l2.1 2.1a1 1 0 0 0 1.4 0l4-4a6 6 0 0 1-8 8l-8 8a2.8 2.8 0 0 1-4-4l8-8a6 6 0 0 1 8-8l-4 4Z\" />\n </svg>\n );\n}\n\nexport function TargetIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function TokensIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 9h16M4 15h16M10 3 8 21M16 3l-2 18\" />\n </svg>\n );\n}\n\nexport function UsageIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 18a8 8 0 1 1 16 0\" />\n <path d=\"M12 18l3.5-5\" />\n <path d=\"M7 18h10\" />\n <path d=\"M7.5 12.5 6 11\" />\n <path d=\"M16.5 12.5 18 11\" />\n </svg>\n );\n}\n\nexport function WarningIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M10.3 3.1 1.8 17a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.1a2 2 0 0 0-3.4 0Z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n );\n}\n\nexport function TrendUpIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <polyline points=\"3 17 9 11 13 15 21 7\" />\n <polyline points=\"15 7 21 7 21 13\" />\n </svg>\n );\n}\n\nexport function EarningsIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <ellipse cx=\"10\" cy=\"6\" rx=\"6\" ry=\"3\" />\n <path d=\"M4 6v8c0 1.7 2.7 3 6 3 1.2 0 2.4-.2 3.3-.5\" />\n <path d=\"M16 6v4\" />\n <path d=\"M4 10c0 1.7 2.7 3 6 3 1.1 0 2.1-.1 3-.4\" />\n <path d=\"M18 14v6\" />\n <path d=\"M15 17h6\" />\n </svg>\n );\n}\n\nexport function WalletIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M3 7a2 2 0 0 1 2-2h13a2 2 0 0 1 2 2v2H5a2 2 0 0 0-2 2V7Z\" />\n <path d=\"M3 11a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6Z\" />\n <circle cx=\"17\" cy=\"14\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/** A paper receipt: what a price includes. */\nexport function ReceiptIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M6 3h12v18l-2-1.5-2 1.5-2-1.5-2 1.5-2-1.5L6 21Z\" />\n <path d=\"M9 8h6M9 12h6M9 16h3\" />\n </svg>\n );\n}\n\nexport function MoonIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z\" />\n </svg>\n );\n}\n\nexport function SunIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n );\n}\n\nexport function XIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function TrashIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4h8v2\" />\n <path d=\"m19 6-1 15H6L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n </svg>\n );\n}\n\n// --- Model modality / capability / price glyphs (single-ink, replace emoji) ---\n\nexport function ChatIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\nexport function RobotIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"6\" width=\"18\" height=\"15\" rx=\"3\" />\n <path d=\"M12 2v4M3 11H1v5h2M21 11h2v5h-2M8 17h8\" />\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\nexport function EyeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function EyeOffIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M3 3l18 18\" />\n </svg>\n );\n}\n\nexport function VideoIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m22 8-6 4 6 4V8z\" />\n <rect x=\"2\" y=\"6\" width=\"14\" height=\"12\" rx=\"2\" />\n </svg>\n );\n}\n\nexport function MicIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <path d=\"M12 19v3\" />\n </svg>\n );\n}\n\nexport function SpeakerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M11 5 6 9H2v6h4l5 4z\" />\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\" />\n </svg>\n );\n}\n\nexport function MegaphoneIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m3 11 18-5v12L3 14v-3z\" />\n <path d=\"m7 15 1.5 6H14l-2-7\" />\n </svg>\n );\n}\n\nexport function ReasoningIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 18h6M10 22h4M15.1 14c.2-1 .6-1.7 1.4-2.5A4.6 4.6 0 0 0 18 8 6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.8.8 1.2 1.5 1.4 2.5\" />\n </svg>\n );\n}\n\nexport function RocketIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n\nexport function SearchIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n );\n}\n\nexport function SignOutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"m16 17 5-5-5-5\" />\n <path d=\"M21 12H9\" />\n </svg>\n );\n}\n\nexport function PowerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 2v10\" />\n <path d=\"M18.4 6.6a9 9 0 1 1-12.77.04\" />\n </svg>\n );\n}\n\nexport function SparkleIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9.94 15.5A2 2 0 0 0 8.5 14.06l-6.14-1.58a.5.5 0 0 1 0-.96L8.5 9.94A2 2 0 0 0 9.94 8.5l1.58-6.14a.5.5 0 0 1 .96 0L14.06 8.5A2 2 0 0 0 15.5 9.94l6.14 1.58a.5.5 0 0 1 0 .96L15.5 14.06a2 2 0 0 0-1.44 1.44l-1.58 6.14a.5.5 0 0 1-.96 0z\" />\n <path d=\"M20 3v4\" />\n <path d=\"M22 5h-4\" />\n <path d=\"M4 17v2\" />\n <path d=\"M5 18H3\" />\n </svg>\n );\n}\n\nexport function StarIcon({\n filled = false,\n ...props\n}: IconProps & { filled?: boolean }) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...strokeProps}\n fill={filled ? \"currentColor\" : \"none\"}\n {...props}\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n );\n}\n\nexport function CodeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" />\n </svg>\n );\n}\n\nexport function DatabaseIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M3 5v14a9 3 0 0 0 18 0V5\" />\n <path d=\"M3 12a9 3 0 0 0 18 0\" />\n </svg>\n );\n}\n\nexport function CardIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M2 10h20\" />\n </svg>\n );\n}\n\nexport function SproutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M7 20h10\" />\n <path d=\"M10 20c5.5-2.5.8-6.4 3-10\" />\n <path d=\"M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z\" />\n <path d=\"M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z\" />\n </svg>\n );\n}\n\nexport function PencilIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n );\n}\n\nexport function KeyIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" />\n <path d=\"m21 2-9.6 9.6\" />\n <path d=\"m15.5 7.5 3 3L22 7l-3-3\" />\n </svg>\n );\n}\n\nexport function GlobeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </svg>\n );\n}\n\nexport function ArrowLeftIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M19 12H5\" />\n <path d=\"m12 19-7-7 7-7\" />\n </svg>\n );\n}\n\nexport function RefreshIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 12a9 9 0 1 1-2.64-6.36\" />\n <path d=\"M21 3v6h-6\" />\n </svg>\n );\n}\n\nexport type { IconProps } from \"./types.ts\";\n","import type {\n ComponentPropsWithoutRef,\n ElementType,\n PropsWithChildren,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype HeadingSize = \"display\" | \"title\" | \"section\" | \"subsection\" | \"card\";\n\ntype TextSize = \"body\" | \"sm\" | \"xs\" | \"micro\";\ntype TextTone = \"base\" | \"strong\" | \"soft\" | \"muted\";\ntype TextWeight = \"normal\" | \"medium\" | \"semibold\" | \"bold\";\n\nconst headingSizeClasses: Record<HeadingSize, string> = {\n display: \"polli:font-heading polli:text-5xl polli:leading-none\",\n title: \"polli:font-heading polli:text-4xl polli:leading-none\",\n section: \"polli:font-subheading polli:text-2xl polli:leading-tight\",\n subsection: \"polli:font-subheading polli:text-xl polli:leading-tight\",\n card: \"polli:font-subheading polli:text-lg polli:leading-tight\",\n};\n\nconst textSizeClasses: Record<TextSize, string> = {\n body: \"polli:text-base polli:leading-relaxed\",\n sm: \"polli:text-sm polli:leading-6\",\n xs: \"polli:text-xs polli:leading-normal\",\n micro: \"polli:text-micro polli:leading-normal\",\n};\n\nconst textToneClasses: Record<TextTone, string> = {\n base: \"polli:text-theme-text-base\",\n strong: \"polli:text-theme-text-strong\",\n soft: \"polli:text-theme-text-soft\",\n muted: \"polli:text-theme-text-muted\",\n};\n\nconst textWeightClasses: Record<TextWeight, string> = {\n normal: \"polli:font-normal\",\n medium: \"polli:font-medium\",\n semibold: \"polli:font-semibold\",\n bold: \"polli:font-bold\",\n};\n\nexport function headingClassName(size: HeadingSize, className?: string) {\n return cn(\n \"polli:break-words polli:text-theme-text-strong\",\n headingSizeClasses[size],\n className,\n );\n}\n\nfunction textClassName({\n size,\n tone,\n weight,\n className,\n}: {\n size: TextSize;\n tone: TextTone;\n weight: TextWeight;\n className?: string;\n}) {\n return cn(\n \"polli:break-words polli:font-body\",\n textSizeClasses[size],\n textToneClasses[tone],\n textWeightClasses[weight],\n className,\n );\n}\n\ntype HeadingOwnProps<T extends ElementType> = PropsWithChildren<{\n as?: T;\n size?: HeadingSize;\n className?: string;\n}>;\n\nexport type HeadingProps<T extends ElementType = \"h2\"> = HeadingOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof HeadingOwnProps<T>>;\n\nexport function Heading<T extends ElementType = \"h2\">({\n as,\n size = \"section\",\n className,\n children,\n ...rest\n}: HeadingProps<T>) {\n const Component = as || \"h2\";\n return (\n <Component {...rest} className={headingClassName(size, className)}>\n {children}\n </Component>\n );\n}\n\ntype TextOwnProps<T extends ElementType> = PropsWithChildren<{\n as?: T;\n size?: TextSize;\n tone?: TextTone;\n weight?: TextWeight;\n className?: string;\n}>;\n\nexport type TextProps<T extends ElementType = \"p\"> = TextOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof TextOwnProps<T>>;\n\nexport function Text<T extends ElementType = \"p\">({\n as,\n size = \"body\",\n tone = \"base\",\n weight = \"normal\",\n className,\n children,\n ...rest\n}: TextProps<T>) {\n const Component = as || \"p\";\n return (\n <Component\n {...rest}\n className={textClassName({ size, tone, weight, className })}\n >\n {children}\n </Component>\n );\n}\n","import type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { WarningIcon } from \"../primitives/icons/index.tsx\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\ntype AlertIntent = \"info\" | \"advisory\" | \"warning\" | \"danger\";\n\nconst intentClasses: Record<AlertIntent, string> = {\n info: \"polli:bg-theme-bg-pale polli:text-theme-text-strong\",\n advisory: \"polli:bg-intent-warning-bg-light/45 polli:text-theme-text-base\",\n warning: \"polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type AlertProps = Omit<ComponentPropsWithoutRef<\"div\">, \"title\"> & {\n intent?: AlertIntent;\n title?: ReactNode;\n};\n\nexport const Alert: FC<AlertProps> = ({\n intent = \"info\",\n title,\n className,\n children,\n ...rest\n}) => (\n <div\n {...rest}\n role={intent === \"danger\" ? \"alert\" : \"status\"}\n className={cn(\n \"polli:rounded-xl polli:px-3 polli:py-2 polli:text-sm\",\n intent === \"advisory\" && \"polli:flex polli:items-start polli:gap-2\",\n intentClasses[intent],\n className,\n )}\n >\n {intent === \"advisory\" && (\n <WarningIcon className=\"polli:mt-0.5 polli:h-4 polli:w-4 polli:shrink-0 polli:text-intent-warning-text\" />\n )}\n <div className=\"polli:min-w-0\">\n {title &&\n (intent === \"advisory\" ? (\n <>\n <strong className=\"polli:font-semibold polli:text-theme-text-strong\">\n {title}\n </strong>{\" \"}\n —{\" \"}\n </>\n ) : (\n <Text\n as=\"div\"\n size=\"xs\"\n tone=\"strong\"\n weight=\"bold\"\n className=\"polli:mb-1 polli:uppercase polli:tracking-wide\"\n >\n {title}\n </Text>\n ))}\n {children}\n </div>\n </div>\n);\n","import type { CSSProperties } from \"react\";\nimport lockupUrl from \"../brand/lockup-horizontal.svg\";\nimport markUrl from \"../brand/mark.svg\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type BrandMarkProps = {\n variant?: \"mark\" | \"lockup\";\n className?: string;\n};\n\nconst mask = (url: string): CSSProperties => ({\n WebkitMask: `url('${url}') center / contain no-repeat`,\n mask: `url('${url}') center / contain no-repeat`,\n});\n\nconst MASKS = { mark: mask(markUrl), lockup: mask(lockupUrl) };\n\n/** The lotus (or lotus + wordmark) painted in currentColor; size it with className. */\nexport function BrandMark({ variant = \"mark\", className }: BrandMarkProps) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"polli:block polli:shrink-0 polli:bg-current\",\n className,\n )}\n style={MASKS[variant]}\n />\n );\n}\n","import { cn } from \"../lib/cn.ts\";\nimport { BrandMark } from \"../primitives/BrandMark.tsx\";\n\nexport type AppBrandProps = {\n appName: string;\n href?: string;\n size?: \"md\" | \"sm\";\n className?: string;\n};\n\n/** Lotus mark + app name: the one brand every internal app shows. */\nexport function AppBrand({\n appName,\n href = \"/\",\n size = \"md\",\n className,\n}: AppBrandProps) {\n return (\n <a\n href={href}\n className={cn(\n \"polli:inline-flex polli:min-w-0 polli:shrink-0 polli:items-center polli:text-theme-text-strong\",\n size === \"md\" ? \"polli:gap-3\" : \"polli:gap-2.5\",\n className,\n )}\n >\n <BrandMark\n className={\n size === \"md\"\n ? \"polli:h-8 polli:w-8\"\n : \"polli:h-7 polli:w-7\"\n }\n />\n <span\n className={cn(\n \"polli:min-w-0 polli:truncate polli:font-subheading polli:font-medium polli:leading-none\",\n size === \"md\" ? \"polli:text-2xl\" : \"polli:text-xl\",\n )}\n >\n {appName}\n </span>\n </a>\n );\n}\n","import type { ReactNode, RefObject } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { BrandMark } from \"../primitives/BrandMark.tsx\";\nimport { AppBrand } from \"./AppBrand.tsx\";\n\ntype ScrollTargetRef = RefObject<HTMLElement | null>;\n\nexport type AppHeaderProps = {\n children?: ReactNode;\n navLabel: string;\n /** Shows the lotus + this name instead of the pollinations.ai wordmark. */\n appName?: string;\n autoHide?: boolean;\n scrollTargetRef?: ScrollTargetRef;\n brandHref?: string;\n brandLabel?: string;\n className?: string;\n innerClassName?: string;\n navClassName?: string;\n};\n\nfunction scrollTopFor(target: HTMLElement | Window) {\n return target === window\n ? window.scrollY\n : (target as HTMLElement).scrollTop;\n}\n\nexport function AppHeader({\n children,\n navLabel,\n appName,\n autoHide = false,\n scrollTargetRef,\n brandHref,\n brandLabel = \"Pollinations\",\n className,\n innerClassName,\n navClassName,\n}: AppHeaderProps) {\n const [hidden, setHidden] = useState(false);\n\n useEffect(() => {\n if (!autoHide || typeof window === \"undefined\") {\n setHidden(false);\n return;\n }\n\n const target = scrollTargetRef?.current ?? window;\n let lastScrollTop = scrollTopFor(target);\n let frameId = 0;\n\n const handleScroll = () => {\n if (frameId) return;\n\n frameId = window.requestAnimationFrame(() => {\n frameId = 0;\n const nextScrollTop = scrollTopFor(target);\n const delta = nextScrollTop - lastScrollTop;\n\n if (nextScrollTop < 16) {\n setHidden(false);\n } else if (delta > 8) {\n setHidden(true);\n } else if (delta < -8) {\n setHidden(false);\n }\n\n lastScrollTop = nextScrollTop;\n });\n };\n\n target.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n if (frameId) window.cancelAnimationFrame(frameId);\n target.removeEventListener(\"scroll\", handleScroll);\n };\n }, [autoHide, scrollTargetRef]);\n\n return (\n <header\n className={cn(\n \"polli:sticky polli:top-0 polli:z-30 polli:bg-app-bg polli:py-4\",\n \"polli:transition-transform polli:duration-200 polli:ease-out\",\n autoHide && \"polli:will-change-transform\",\n hidden ? \"polli:-translate-y-full\" : \"polli:translate-y-0\",\n className,\n )}\n onFocusCapture={() => setHidden(false)}\n >\n <div\n className={cn(\n \"polli:mx-auto polli:flex polli:w-full polli:max-w-5xl polli:flex-col polli:gap-4 polli:px-4 polli:sm:flex-row polli:sm:items-center polli:sm:justify-between polli:sm:px-6\",\n innerClassName,\n )}\n >\n {appName ? (\n <AppBrand appName={appName} href={brandHref} />\n ) : (\n <a\n href={brandHref ?? \"https://pollinations.ai\"}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"polli:inline-flex polli:shrink-0 polli:items-center polli:text-theme-text-strong\"\n >\n <span className=\"polli:sr-only\">{brandLabel}</span>\n <BrandMark\n variant=\"lockup\"\n className=\"polli:h-7 polli:w-[220px] polli:max-w-full\"\n />\n </a>\n )}\n {children ? (\n <nav\n aria-label={navLabel}\n className={cn(\n \"polli:flex polli:min-w-0 polli:flex-wrap polli:items-center polli:gap-2\",\n navClassName,\n )}\n >\n {children}\n </nav>\n ) : null}\n </div>\n </header>\n );\n}\n","import type { ComponentPropsWithoutRef, ElementType } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype SurfaceVariant = \"panel\" | \"card\" | \"card-themed\";\n\nconst variantClasses: Record<SurfaceVariant, string> = {\n // Phones get tighter padding (and a matching radius) so nested cards keep\n // their width; from `sm` up the page has room for the full spacing.\n panel: \"polli:rounded-3xl polli:bg-surface-block polli:p-4 polli:sm:rounded-block polli:sm:p-7\",\n card: \"polli-surface-card polli:rounded-card polli:bg-surface-opaque polli:p-3.5 polli:sm:p-4\",\n \"card-themed\":\n \"polli:rounded-card polli:bg-theme-bg-pale polli:p-3.5 polli:sm:p-4\",\n};\n\ntype SurfaceOwnProps = {\n /**\n * Depth role — flat: each level is one tint step, never a shadow or border.\n * - `panel` — Level 1 block: sections and page groups\n * - `card` — Level 2 card inside a block (default)\n * - `card-themed` — Level 2 card carrying the accent tint\n */\n variant?: SurfaceVariant;\n className?: string;\n};\n\n/**\n * Polymorphic like Button, TabButton and LinkCard, so a card that is itself a\n * link renders one element instead of an anchor wrapping a div. Defaults to\n * <div>, so existing call sites are unchanged.\n */\nexport type SurfaceProps<T extends ElementType = \"div\"> = SurfaceOwnProps & {\n as?: T;\n} & Omit<ComponentPropsWithoutRef<T>, keyof SurfaceOwnProps | \"as\" | \"color\">;\n\nexport function Surface<T extends ElementType = \"div\">({\n as,\n variant = \"card\",\n className,\n children,\n ...rest\n}: SurfaceProps<T>) {\n const Component: ElementType = as || \"div\";\n\n return (\n <Component\n {...rest}\n className={cn(\"polli:min-w-0\", variantClasses[variant], className)}\n >\n {children}\n </Component>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Surface } from \"../primitives/Surface.tsx\";\nimport { Heading, Text } from \"../primitives/Typography.tsx\";\n\nexport type CalloutProps = {\n title: ReactNode;\n body: ReactNode;\n children: ReactNode;\n tone?: \"theme\" | \"dark\";\n className?: string;\n};\n\n/** Prominent closing panel with a title, supporting copy, and actions. */\nexport function Callout({\n title,\n body,\n children,\n tone = \"theme\",\n className,\n}: CalloutProps) {\n return (\n <Surface\n as=\"section\"\n variant=\"panel\"\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-center polli:justify-between polli:gap-8 polli:rounded-3xl polli:px-6 polli:py-9 polli:sm:gap-10 polli:sm:px-10 polli:sm:py-12\",\n tone === \"dark\" ? \"dark polli:bg-brand-dark\" : undefined,\n className,\n )}\n >\n <div className=\"polli:flex polli:max-w-lg polli:flex-col polli:gap-2.5\">\n <Heading\n size=\"section\"\n className=\"polli:text-3xl polli:sm:text-4xl\"\n >\n {title}\n </Heading>\n <Text className=\"polli:text-theme-text-strong/75\">{body}</Text>\n </div>\n <div className=\"polli:flex polli:flex-wrap polli:items-center polli:gap-3\">\n {children}\n </div>\n </Surface>\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ArrowRightIcon } from \"../primitives/icons/index.tsx\";\nimport { ScrollArea, type ScrollAreaProps } from \"../primitives/ScrollArea.tsx\";\n\nexport type ChatConversationProps = Omit<\n ScrollAreaProps,\n \"children\" | \"className\"\n> & {\n children: ReactNode;\n className?: string;\n viewportClassName?: string;\n showScrollButton?: boolean;\n onScrollToBottom?: () => void;\n scrollButtonLabel?: string;\n};\n\n/**\n * Scrollable chat transcript with an optional jump-to-latest control.\n * Message data and streaming remain the consumer's responsibility.\n */\nexport const ChatConversation = forwardRef<\n HTMLDivElement,\n ChatConversationProps\n>(\n (\n {\n children,\n className,\n viewportClassName,\n showScrollButton = false,\n onScrollToBottom,\n scrollButtonLabel = \"Scroll to latest message\",\n ...viewportProps\n },\n ref,\n ) => (\n <div className={cn(\"polli:relative polli:min-h-0\", className)}>\n <ScrollArea\n {...viewportProps}\n ref={ref}\n className={cn(\"polli:h-full polli:min-h-0\", viewportClassName)}\n >\n {children}\n </ScrollArea>\n {showScrollButton && onScrollToBottom && (\n <button\n type=\"button\"\n aria-label={scrollButtonLabel}\n title={scrollButtonLabel}\n onClick={onScrollToBottom}\n className=\"polli-control polli:absolute polli:bottom-3 polli:left-1/2 polli:flex polli:size-9 polli:-translate-x-1/2 polli:cursor-pointer polli:items-center polli:justify-center polli:rounded-full polli:border polli:border-theme-border/60 polli:bg-surface-opaque polli:text-theme-text-strong polli:transition-transform polli:hover:translate-y-0.5\"\n >\n <ArrowRightIcon className=\"polli:size-4 polli:rotate-90\" />\n </button>\n )}\n </div>\n ),\n);\n\nChatConversation.displayName = \"ChatConversation\";\n\nexport type ChatConversationContentProps = ComponentPropsWithoutRef<\"div\">;\n\nexport function ChatConversationContent({\n className,\n ...props\n}: ChatConversationContentProps) {\n return (\n <div\n className={cn(\n \"polli:flex polli:min-w-0 polli:flex-col polli:gap-5\",\n className,\n )}\n {...props}\n />\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MutableRefObject,\n type PropsWithChildren,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype ScrollAxis = \"y\" | \"x\" | \"both\";\n\nconst axisClasses: Record<ScrollAxis, string> = {\n y: \"polli:overflow-y-auto polli:overflow-x-hidden\",\n x: \"polli:overflow-x-auto polli:overflow-y-hidden\",\n both: \"polli:overflow-auto\",\n};\n\ntype ScrollAreaOwnProps = {\n /** Scroll direction. Default `y`. */\n axis?: ScrollAxis;\n /** Use the system scrollbar instead of the custom auto-hiding track. */\n scrollbar?: \"subtle\" | \"native\";\n className?: string;\n};\n\nexport type ScrollAreaProps = PropsWithChildren<\n ScrollAreaOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof ScrollAreaOwnProps>\n>;\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) (ref as MutableRefObject<T | null>).current = value;\n}\n\n/** Scroll container with an optional themed, auto-hiding scrollbar. */\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n (\n { axis = \"y\", scrollbar = \"subtle\", className, children, ...rest },\n externalRef,\n ) => {\n const innerRef = useRef<HTMLDivElement | null>(null);\n\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n innerRef.current = node;\n assignRef(externalRef, node);\n },\n [externalRef],\n );\n\n useEffect(() => {\n if (scrollbar === \"native\") return;\n const element = innerRef.current;\n if (!element) return;\n\n let hideTimer: number | null = null;\n\n const clearHideTimer = () => {\n if (hideTimer !== null) {\n window.clearTimeout(hideTimer);\n hideTimer = null;\n }\n };\n\n const show = () => {\n element.dataset.scrollbarActive = \"true\";\n clearHideTimer();\n };\n\n const hide = () => {\n element.dataset.scrollbarActive = \"false\";\n clearHideTimer();\n };\n\n const scheduleHide = () => {\n clearHideTimer();\n hideTimer = window.setTimeout(hide, 2000);\n };\n\n const handleInteraction = () => {\n show();\n scheduleHide();\n };\n\n hide();\n\n element.addEventListener(\"scroll\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"wheel\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"touchstart\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"pointerdown\", handleInteraction);\n element.addEventListener(\"keydown\", handleInteraction);\n element.addEventListener(\"focusin\", handleInteraction);\n element.addEventListener(\"focusout\", scheduleHide);\n\n return () => {\n clearHideTimer();\n element.removeEventListener(\"scroll\", handleInteraction);\n element.removeEventListener(\"wheel\", handleInteraction);\n element.removeEventListener(\"touchstart\", handleInteraction);\n element.removeEventListener(\"pointerdown\", handleInteraction);\n element.removeEventListener(\"keydown\", handleInteraction);\n element.removeEventListener(\"focusin\", handleInteraction);\n element.removeEventListener(\"focusout\", scheduleHide);\n };\n }, [scrollbar]);\n\n return (\n <div\n {...rest}\n ref={setRef}\n className={cn(\n scrollbar === \"subtle\" && \"polli-scrollbar-subtle\",\n \"polli:min-w-0 polli:max-w-full\",\n axisClasses[axis],\n className,\n )}\n >\n {children}\n </div>\n );\n },\n);\n\nScrollArea.displayName = \"ScrollArea\";\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { RobotIcon } from \"../primitives/icons/index.tsx\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\nexport type ChatMessageRole = \"user\" | \"assistant\" | \"system\";\n\nexport type ChatMessageProps = ComponentPropsWithoutRef<\"article\"> & {\n from: ChatMessageRole;\n};\n\n/** Protocol-neutral message surface inspired by AI Elements' Message suite. */\nexport function ChatMessage({\n from,\n className,\n children,\n ...props\n}: ChatMessageProps) {\n return (\n <article\n data-role={from}\n className={cn(\n \"polli:group/message polli:flex polli:w-fit polli:max-w-full polli:min-w-0 polli:flex-col polli:gap-3 polli:[overflow-wrap:anywhere] polli:rounded-xl polli:px-4 polli:py-3\",\n from === \"user\"\n ? \"polli:ml-auto polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:mr-auto polli:bg-surface-opaque polli:text-theme-text-base\",\n className,\n )}\n {...props}\n >\n {children}\n </article>\n );\n}\n\nexport type ChatMessageHeaderProps = ComponentPropsWithoutRef<\"header\"> & {\n from: ChatMessageRole;\n label?: ReactNode;\n icon?: ReactNode;\n};\n\nexport function ChatMessageHeader({\n from,\n label,\n icon,\n className,\n ...props\n}: ChatMessageHeaderProps) {\n const content =\n label ??\n (from === \"user\" ? \"You\" : from === \"assistant\" ? \"Agent\" : \"System\");\n return (\n <header\n className={cn(\n \"polli:flex polli:items-center polli:gap-2\",\n className,\n )}\n {...props}\n >\n {from === \"assistant\" &&\n (icon ?? (\n <span className=\"polli:flex polli:size-6 polli:items-center polli:justify-center polli:rounded-full polli:bg-theme-bg-active polli:text-theme-text-strong\">\n <RobotIcon className=\"polli:size-3.5\" />\n </span>\n ))}\n <Text\n as=\"span\"\n size=\"xs\"\n tone=\"muted\"\n weight=\"bold\"\n className=\"polli:uppercase polli:tracking-wide\"\n >\n {content}\n </Text>\n </header>\n );\n}\n\nexport type ChatMessageContentProps = ComponentPropsWithoutRef<\"div\">;\n\nexport function ChatMessageContent({\n className,\n ...props\n}: ChatMessageContentProps) {\n return (\n <div\n className={cn(\n \"polli:min-w-0 polli:[&_pre]:max-w-full polli:[&_pre]:overflow-x-auto polli:[&_table]:max-w-full polli:[&_table]:overflow-x-auto\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type ChatMessageActionsProps = ComponentPropsWithoutRef<\"footer\">;\n\nexport function ChatMessageActions({\n className,\n ...props\n}: ChatMessageActionsProps) {\n return (\n <footer\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-center polli:gap-1 polli:pt-2\",\n className,\n )}\n {...props}\n />\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Textarea, type TextareaProps } from \"../primitives/Textarea.tsx\";\n\nexport type ChatPromptInputProps = ComponentPropsWithoutRef<\"fieldset\">;\n\n/**\n * Composable prompt shell. Put attachments or controls before the textarea and\n * actions in ChatPromptInputFooter; submission stays owned by the parent form.\n */\nexport function ChatPromptInput({ className, ...props }: ChatPromptInputProps) {\n return (\n <fieldset\n className={cn(\"polli:m-0 polli:min-w-0 polli:p-0\", className)}\n {...props}\n />\n );\n}\n\nexport const ChatPromptTextarea = forwardRef<\n HTMLTextAreaElement,\n TextareaProps\n>(({ className, ...props }, ref) => (\n <Textarea\n {...props}\n ref={ref}\n className={cn(\"polli:resize-none\", className)}\n />\n));\n\nChatPromptTextarea.displayName = \"ChatPromptTextarea\";\n\nexport type ChatPromptInputFooterProps = ComponentPropsWithoutRef<\"div\"> & {\n start?: ReactNode;\n end?: ReactNode;\n};\n\nexport function ChatPromptInputFooter({\n start,\n end,\n children,\n className,\n ...props\n}: ChatPromptInputFooterProps) {\n return (\n <div\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-end polli:gap-2\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n <div className=\"polli:flex polli:flex-wrap polli:items-center polli:gap-2\">\n {start}\n </div>\n <div className=\"polli:ml-auto polli:flex polli:items-center polli:gap-2\">\n {end}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { forwardRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type TextareaProps = React.ComponentPropsWithoutRef<\"textarea\"> & {\n error?: boolean;\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, error, rows = 4, ...props }, ref) => (\n <textarea\n ref={ref}\n rows={rows}\n data-error={error ? \"true\" : undefined}\n className={cn(\n \"polli-textarea polli:w-full polli:rounded-lg polli:border polli:px-3 polli:py-2\",\n \"polli:min-h-20 polli:resize-y polli:font-body polli:text-base\",\n \"polli:text-theme-text-strong\",\n \"polli:transition-colors\",\n \"polli:disabled:opacity-50 polli:disabled:cursor-not-allowed\",\n className,\n )}\n {...props}\n />\n ),\n);\n\nTextarea.displayName = \"Textarea\";\n","import {\n type ButtonHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Button, type ButtonProps } from \"../primitives/Button.tsx\";\nimport { Tooltip } from \"../primitives/Tooltip.tsx\";\n\ntype CopyValue = string | (() => string | Promise<string>);\n\nexport type CopyButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"className\" | \"onClick\" | \"type\" | \"value\"\n> & {\n value: CopyValue;\n children: ReactNode | ((copied: boolean) => ReactNode);\n copiedTimeoutMs?: number;\n tooltip?: ReactNode;\n tooltipAlign?: \"start\" | \"center\";\n tooltipClampToViewport?: boolean;\n tooltipMaxWidth?: number;\n copiedTooltip?: ReactNode;\n tooltipClassName?: string;\n className?: string | ((copied: boolean) => string);\n variant?: \"plain\" | \"button\";\n /** Button intent, used with `variant=\"button\"`. */\n intent?: ButtonProps<\"button\">[\"intent\"];\n onCopied?: () => void;\n onCopyError?: (error: unknown) => void;\n};\n\nexport function CopyButton({\n value,\n children,\n copiedTimeoutMs = 2000,\n tooltip = \"📋 Click to copy\",\n tooltipAlign,\n tooltipClampToViewport,\n tooltipMaxWidth,\n copiedTooltip = \"✅ Copied!\",\n tooltipClassName,\n className,\n variant = \"plain\",\n intent,\n onCopied,\n onCopyError,\n ...buttonProps\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n },\n [],\n );\n\n async function handleCopy(event: MouseEvent<HTMLButtonElement>) {\n event.stopPropagation();\n try {\n const text = typeof value === \"function\" ? await value() : value;\n await navigator.clipboard.writeText(text);\n setCopied(true);\n onCopied?.();\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(\n () => setCopied(false),\n copiedTimeoutMs,\n );\n } catch (error) {\n onCopyError?.(error);\n }\n }\n\n const Control = variant === \"button\" ? Button : \"button\";\n const button = (\n <Control\n {...buttonProps}\n {...(variant === \"button\" && intent ? { intent } : {})}\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n \"polli-control\",\n buttonProps.disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\",\n typeof className === \"function\" ? className(copied) : className,\n )}\n >\n {typeof children === \"function\" ? children(copied) : children}\n </Control>\n );\n\n // A copy button with its own visible label doesn't need a hover tooltip —\n // pass tooltip={null} to opt out of the wrapper entirely.\n if (tooltip === null) {\n return button;\n }\n\n return (\n <Tooltip\n triggerAs=\"span\"\n content={copied ? copiedTooltip : tooltip}\n align={tooltipAlign}\n clampToViewport={tooltipClampToViewport}\n maxWidth={tooltipMaxWidth}\n displayContents\n tapEnabled={false}\n className={cn(\n buttonProps.disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\",\n tooltipClassName,\n )}\n >\n {button}\n </Tooltip>\n );\n}\n","import type {\n PropsWithChildren,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\n/** Semantic action roles. Label recipes live on Chip. */\ntype ButtonIntent = \"danger\" | \"info\" | \"neutral\" | \"brand\" | \"commit\";\nexport type ButtonAppearance = \"pill\" | \"raised\";\n\nconst pillSizes = {\n icon: \"polli:h-12 polli:w-12 polli:p-0\",\n xs: \"polli:h-5 polli:px-1.5 polli:py-0 polli:text-[11px] polli:leading-none\",\n sm: \"polli:min-h-7 polli:px-2 polli:pt-0.5 polli:pb-1\",\n md: \"polli:min-h-9 polli:px-4 polli:pt-1.5 polli:pb-2\",\n lg: \"polli:min-h-12 polli:px-6 polli:py-3 polli:text-base\",\n} as const;\n\nconst raisedSizes = {\n icon: \"polli:h-12 polli:w-12 polli:p-0\",\n xs: \"polli:px-2 polli:py-1 polli:text-xs\",\n sm: \"polli:px-4 polli:py-2 polli:text-sm\",\n md: \"polli:px-7 polli:py-3.5 polli:text-base\",\n lg: \"polli:px-8 polli:py-4 polli:text-lg\",\n} as const;\n\nconst appearanceClasses: Record<ButtonAppearance, string> = {\n pill: \"polli:rounded-full\",\n raised:\n \"polli:rounded-xl polli:border-r-[3px] polli:border-b-[3px] polli:border-solid \" +\n \"polli:border-theme-text-strong/20 polli:hover:border-theme-text-strong/45\",\n};\n\n// Cascade-driven base — reads [data-theme] vars.\nconst themeClasses =\n \"polli:bg-theme-bg-active polli:text-theme-text-strong \" +\n \"polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover polli:transition-colors\";\n\n// Primary actions have a soft accent fill in light mode and an outline in dark.\n// `brand` keeps a calm hover; `commit` strengthens the fill on hover and focus.\nconst outlined =\n \"polli:border polli:border-theme-text-soft polli:bg-theme-bg-active/30 polli:text-theme-text-strong \" +\n \"polli:transition-colors polli:[.dark_&]:bg-transparent\";\nconst intentClasses: Record<ButtonIntent, string> = {\n brand: `${outlined} polli:hover:bg-theme-bg-active/50 polli:[.dark_&]:hover:bg-theme-text-soft/10`,\n commit:\n `${outlined} polli:hover:border-theme-bg-active polli:hover:bg-theme-bg-active ` +\n \"polli:focus-visible:border-theme-bg-active polli:focus-visible:bg-theme-bg-active \" +\n \"polli:[.dark_&]:hover:bg-theme-bg-active polli:[.dark_&]:focus-visible:bg-theme-bg-active\",\n danger:\n \"polli:border polli:border-intent-danger-text polli:bg-intent-danger-bg-light polli:text-intent-danger-text \" +\n \"polli:hover:bg-intent-danger-bg-hover polli:focus-visible:bg-intent-danger-bg-hover polli:transition-colors \" +\n \"polli:[.dark_&]:bg-transparent polli:[.dark_&]:hover:bg-intent-danger-bg-hover polli:[.dark_&]:focus-visible:bg-intent-danger-bg-hover\",\n info:\n \"polli:bg-intent-info-bg-light polli:text-intent-info-text \" +\n \"polli:hover:bg-intent-info-bg-hover polli:transition-colors\",\n // Secondary actions never take the accent: one step stronger grey on hover.\n neutral:\n \"polli:bg-theme-bg-subtle polli:text-theme-text-base \" +\n \"polli:hover:bg-theme-text-muted/25 polli:hover:text-theme-text-strong polli:transition-colors\",\n};\n\ntype BaseButtonProps = {\n icon?: ReactNode;\n /** Optional semantic recipe; omit for the ambient theme button. */\n intent?: ButtonIntent;\n /** `raised` is the stronger website CTA treatment. */\n appearance?: ButtonAppearance;\n size?: keyof typeof pillSizes;\n className?: string;\n disabled?: boolean;\n};\n\nconst buttonClasses = ({\n intent,\n appearance = \"pill\",\n size,\n className,\n disabled,\n busy,\n}: BaseButtonProps & { disabled?: boolean; busy?: boolean }) => {\n const colorClasses = intent ? intentClasses[intent] : themeClasses;\n const sizeClasses = appearance === \"raised\" ? raisedSizes : pillSizes;\n return cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:self-center polli:font-body polli:text-sm polli:font-medium polli:leading-normal polli:box-border polli:border polli:border-transparent\",\n // A busy button is working, not unavailable: it keeps its strength.\n busy\n ? \"polli:cursor-progress\"\n : disabled\n ? \"polli:opacity-50 polli:cursor-not-allowed\"\n : \"polli:hover:filter polli:hover:brightness-105 polli:cursor-pointer\",\n colorClasses,\n appearanceClasses[appearance],\n sizeClasses[size || \"md\"],\n className,\n );\n};\n\nexport type ButtonProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseButtonProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseButtonProps | \"as\">;\n\nexport function Button<T extends React.ElementType = \"button\">({\n as,\n children,\n icon,\n intent,\n appearance,\n size,\n className,\n disabled,\n ...buttonProps\n}: ButtonProps<T>) {\n const Component: React.ElementType = as || \"button\";\n const isButton = Component === \"button\";\n const isAnchor = Component === \"a\";\n const buttonType = (\n buttonProps as {\n type?: \"button\" | \"submit\" | \"reset\";\n }\n ).type;\n const onClick = (\n buttonProps as {\n onClick?: (event: ReactMouseEvent) => void;\n }\n ).onClick;\n const ariaBusy = (\n buttonProps as { \"aria-busy\"?: boolean | \"true\" | \"false\" }\n )[\"aria-busy\"];\n const busy = ariaBusy === true || ariaBusy === \"true\";\n const handleClick = disabled\n ? (event: ReactMouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }\n : onClick;\n\n return (\n <Component\n {...buttonProps}\n data-intent={intent}\n {...(isButton ? { type: buttonType ?? \"button\", disabled } : {})}\n {...(!isButton && disabled\n ? { \"aria-disabled\": true, tabIndex: -1 }\n : {})}\n {...(isAnchor && disabled ? { href: undefined } : {})}\n onClick={handleClick}\n className={buttonClasses({\n intent,\n appearance,\n size,\n className,\n disabled,\n busy,\n })}\n >\n {icon && (\n <span\n aria-hidden=\"true\"\n className=\"polli:mr-2 polli:flex polli:size-4 polli:shrink-0 polli:[&>svg]:size-full\"\n >\n {busy ? (\n <span className=\"polli:block polli:size-full polli:animate-spin polli:rounded-full polli:border-2 polli:border-current polli:border-r-transparent polli:motion-reduce:animate-none\" />\n ) : (\n icon\n )}\n </span>\n )}\n {children}\n </Component>\n );\n}\n","import {\n type CSSProperties,\n type FC,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst TOOLTIP_MAX_WIDTH = 288;\nconst TOOLTIP_VIEWPORT_MARGIN = 12;\n\ntype TooltipProps = {\n children: ReactNode;\n content: ReactNode;\n align?: \"start\" | \"center\";\n ariaLabel?: string;\n clampToViewport?: boolean;\n className?: string;\n maxWidth?: number;\n onClick?: () => void;\n stopClickPropagation?: boolean;\n style?: CSSProperties;\n tapEnabled?: boolean;\n triggerAs?: \"button\" | \"span\";\n /**\n * When true, the inner cursor wrapper uses display:contents so the\n * trigger's flex/grid layout applies directly to the caller's children\n * without an inline wrapper in the way.\n */\n displayContents?: boolean;\n};\n\nexport const Tooltip: FC<TooltipProps> = ({\n children,\n content,\n align = \"start\",\n ariaLabel,\n clampToViewport = true,\n className,\n maxWidth = TOOLTIP_MAX_WIDTH,\n onClick,\n stopClickPropagation = true,\n style,\n tapEnabled = false,\n triggerAs = \"button\",\n displayContents = false,\n}) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState<{\n top: number;\n left: number;\n maxWidth: number;\n transform?: CSSProperties[\"transform\"];\n }>({\n top: 0,\n left: 0,\n maxWidth,\n });\n const triggerRef = useRef<HTMLElement | null>(null);\n const tapPinnedRef = useRef(false);\n const tooltipId = useId();\n\n const closeTooltip = () => {\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n\n useEffect(() => {\n if (!showTooltip) return;\n\n const dismissOnOutsideTap = (event: PointerEvent) => {\n if (triggerRef.current?.contains(event.target as Node)) return;\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n const dismissOnEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n const dismissOnViewportChange = () => {\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n\n document.addEventListener(\"pointerdown\", dismissOnOutsideTap);\n document.addEventListener(\"keydown\", dismissOnEscape);\n window.addEventListener(\"scroll\", dismissOnViewportChange, {\n capture: true,\n passive: true,\n });\n window.addEventListener(\"resize\", dismissOnViewportChange);\n return () => {\n document.removeEventListener(\"pointerdown\", dismissOnOutsideTap);\n document.removeEventListener(\"keydown\", dismissOnEscape);\n window.removeEventListener(\"scroll\", dismissOnViewportChange, true);\n window.removeEventListener(\"resize\", dismissOnViewportChange);\n };\n }, [showTooltip]);\n\n const updateTooltipPosition = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const availableMaxWidth = Math.min(\n maxWidth,\n window.innerWidth - TOOLTIP_VIEWPORT_MARGIN * 2,\n );\n let left =\n align === \"center\" ? rect.left + rect.width / 2 : rect.left;\n let transform: CSSProperties[\"transform\"] =\n align === \"center\" ? \"translateX(-50%)\" : undefined;\n if (clampToViewport) {\n left = Math.min(\n Math.max(rect.left, TOOLTIP_VIEWPORT_MARGIN),\n Math.max(\n TOOLTIP_VIEWPORT_MARGIN,\n window.innerWidth -\n availableMaxWidth -\n TOOLTIP_VIEWPORT_MARGIN,\n ),\n );\n transform = undefined;\n }\n setTooltipPosition({\n top: rect.bottom + 4,\n left,\n maxWidth: availableMaxWidth,\n transform,\n });\n }\n };\n\n // Informational triggers use help; action wrappers can override the cursor.\n const triggerClassName = cn(\n \"polli-control polli:relative polli:cursor-help polli:text-left polli:inline-flex polli:items-center\",\n className,\n );\n\n const cursorClass = displayContents\n ? \"polli:contents\"\n : \"polli:cursor-inherit\";\n\n // Portal past the trigger's layout; stay inside modal dialogs so the popup\n // shares their stacking and accessible subtree.\n const popupClasses =\n \"polli:fixed polli:w-max polli:px-2 polli:py-1 polli:bg-surface-menu polli:text-theme-text-base polli:font-normal polli:leading-snug polli:tracking-normal polli:normal-case polli:not-italic polli:text-xs polli:rounded-md polli:shadow-md polli:z-[130] polli:pointer-events-none polli:transition-opacity polli:whitespace-pre-line polli:break-words\";\n\n const popupNode = content ? (\n <span\n id={tooltipId}\n role=\"tooltip\"\n aria-hidden={!showTooltip}\n style={{\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n maxWidth: tooltipPosition.maxWidth,\n transform: tooltipPosition.transform,\n }}\n className={`${\n showTooltip\n ? \"polli:visible polli:opacity-100\"\n : \"polli:invisible polli:opacity-0\"\n } ${popupClasses}`}\n >\n {content}\n </span>\n ) : null;\n const tooltipPopup =\n popupNode && typeof document !== \"undefined\"\n ? createPortal(\n popupNode,\n triggerRef.current?.closest('[role=\"dialog\"]') ??\n document.body,\n )\n : popupNode;\n const contentNode = (\n <>\n <span className={cursorClass}>{children}</span>\n {tooltipPopup}\n </>\n );\n\n const sharedProps = {\n \"aria-label\": ariaLabel,\n \"aria-describedby\": content && showTooltip ? tooltipId : undefined,\n className: triggerClassName,\n onMouseEnter: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onMouseLeave: () => {\n if (!tapPinnedRef.current) setShowTooltip(false);\n },\n onClick: (e: MouseEvent) => {\n if (stopClickPropagation) e.stopPropagation();\n if (onClick) {\n onClick();\n }\n if (!tapEnabled || !content) return;\n updateTooltipPosition();\n if (tapPinnedRef.current) {\n closeTooltip();\n return;\n }\n tapPinnedRef.current = true;\n setShowTooltip(true);\n },\n onFocus: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onBlur: closeTooltip,\n style,\n };\n\n if (triggerAs === \"span\") {\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (!tapEnabled || !content) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n updateTooltipPosition();\n if (tapPinnedRef.current) {\n closeTooltip();\n return;\n }\n tapPinnedRef.current = true;\n setShowTooltip(true);\n };\n const spanInteractionProps = {\n ...sharedProps,\n role: tapEnabled && content ? \"button\" : undefined,\n tabIndex: tapEnabled && content ? 0 : undefined,\n onKeyDown: tapEnabled && content ? handleKeyDown : undefined,\n };\n\n return (\n <span\n ref={(node) => {\n triggerRef.current = node;\n }}\n {...spanInteractionProps}\n >\n {contentNode}\n </span>\n );\n }\n\n return (\n <button\n ref={(node) => {\n triggerRef.current = node;\n }}\n type=\"button\"\n aria-label={ariaLabel}\n aria-describedby={content && showTooltip ? tooltipId : undefined}\n className={triggerClassName}\n onMouseEnter={sharedProps.onMouseEnter}\n onMouseLeave={sharedProps.onMouseLeave}\n onClick={sharedProps.onClick}\n onFocus={sharedProps.onFocus}\n onBlur={sharedProps.onBlur}\n style={style}\n >\n {contentNode}\n </button>\n );\n};\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { CheckIcon, ClipboardIcon } from \"../primitives/icons/index.tsx\";\nimport { CopyButton } from \"./CopyButton.tsx\";\n\ntype CodeBlockOwnProps = {\n code: string;\n codeClassName?: string;\n language?: string;\n};\n\nexport type CodeBlockProps = CodeBlockOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof CodeBlockOwnProps | \"children\">;\n\nexport const CodeBlock: FC<CodeBlockProps> = ({\n code,\n codeClassName,\n language,\n className,\n ...rest\n}) => {\n const label = language || \"Code\";\n\n return (\n <div\n {...rest}\n className={cn(\n \"polli:min-w-0 polli:max-w-full polli:overflow-hidden polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale\",\n className,\n )}\n >\n <div className=\"polli:flex polli:min-h-9 polli:items-center polli:justify-between polli:gap-3 polli:bg-theme-bg-subtle polli:px-3 polli:py-1.5\">\n <span className=\"polli:truncate polli:font-mono polli:text-[11px] polli:font-medium polli:uppercase polli:tracking-wide polli:text-theme-text-muted\">\n {label}\n </span>\n <CopyButton\n value={code}\n tooltip={null}\n aria-label=\"Copy code\"\n className=\"polli:flex polli:items-center polli:gap-1.5 polli:rounded-md polli:px-2 polli:py-1 polli:text-xs polli:font-medium polli:text-theme-text-base polli:transition-colors polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\"\n >\n {(copied) => (\n <>\n {copied ? (\n <CheckIcon className=\"polli:size-3.5\" />\n ) : (\n <ClipboardIcon className=\"polli:size-3.5\" />\n )}\n <span>{copied ? \"Copied\" : \"Copy\"}</span>\n </>\n )}\n </CopyButton>\n </div>\n <pre\n className={cn(\n \"polli:m-0 polli:min-w-0 polli:whitespace-pre-wrap polli:break-words polli:[overflow-wrap:anywhere] polli:[tab-size:4] polli:p-3 polli:font-mono polli:text-xs polli:leading-6 polli:text-theme-text-strong\",\n codeClassName,\n )}\n >\n <code>{code}</code>\n </pre>\n </div>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\n\nexport type CollapsibleProps = {\n /** Header content (label, hint, etc). */\n label: ReactNode;\n expanded: boolean;\n onToggle: () => void;\n children: ReactNode;\n disabled?: boolean;\n /** Outer wrapper classes — border, rounding, etc. Keep it bg-free if the\n * expanded panel should stay transparent; put any fill on the trigger. */\n wrapperClassName?: string;\n /** Trigger/header base classes (e.g. a selected background). */\n triggerClassName?: string;\n /** Trigger hover classes. Defaults to `polli:hover:bg-theme-bg-active`. */\n hoverClassName?: string;\n /** Trigger focus classes. */\n focusClassName?: string;\n /** Expanded panel classes. Defaults to a top border separator. */\n panelClassName?: string;\n /** Accessible label for the toggle button when label is non-text. */\n ariaLabel?: string;\n};\n\n/**\n * Collapsible row composition. One chevron, one hover/rounded behaviour for\n * every collapsible in the UI. Use this for any \"click to reveal nested\n * content\" UI — nested settings, grouped controls, optional details.\n *\n * For dropdown/popover triggers (date pickers, menus) use a button with\n * <ChevronIcon /> directly — that's a different interaction.\n */\nexport const Collapsible: FC<CollapsibleProps> = ({\n label,\n expanded,\n onToggle,\n children,\n disabled = false,\n wrapperClassName,\n triggerClassName,\n hoverClassName = \"polli:hover:bg-theme-bg-active\",\n focusClassName,\n panelClassName = \"polli:border-t polli:border-theme-border polli:px-3 polli:pt-3 polli:pb-3\",\n ariaLabel,\n}) => (\n <div\n className={cn(\n \"polli:rounded-lg polli:border polli:transition-all\",\n wrapperClassName,\n disabled && \"polli:opacity-50\",\n )}\n >\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-label={ariaLabel}\n disabled={disabled}\n onClick={onToggle}\n className={cn(\n \"polli-control polli:w-full polli:flex polli:items-center polli:gap-3 polli:px-3 polli:py-2 polli:text-left polli:transition-colors\",\n expanded ? \"polli:rounded-t-lg\" : \"polli:rounded-lg\",\n triggerClassName,\n !disabled && hoverClassName,\n focusClassName,\n disabled ? \"polli:cursor-not-allowed\" : \"polli:cursor-pointer\",\n )}\n >\n <div className=\"polli:flex-1 polli:min-w-0\">{label}</div>\n <ChevronIcon\n expanded={expanded}\n className=\"polli:text-theme-text-soft\"\n />\n </button>\n {expanded && <div className={panelClassName}>{children}</div>}\n </div>\n);\n","import { Dialog as ArkDialog } from \"@ark-ui/react/dialog\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ScrollArea, type ScrollAreaProps } from \"./ScrollArea.tsx\";\nimport { headingClassName } from \"./Typography.tsx\";\n\nconst sizeClasses = {\n sm: \"polli:max-w-md\",\n md: \"polli:max-w-xl\",\n lg: \"polli:max-w-[800px]\",\n xl: \"polli:max-w-6xl\",\n} as const;\n\nexport type DialogProps = {\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: ReactNode;\n triggerAsChild?: boolean;\n triggerClassName?: string;\n title?: ReactNode;\n ariaLabel?: string;\n labelledBy?: string;\n size?: keyof typeof sizeClasses;\n showBackdrop?: boolean;\n backdropBlur?: boolean;\n positionerClassName?: string;\n contentClassName?: string;\n children: ReactNode;\n};\n\nexport const Dialog: FC<DialogProps> = ({\n open,\n onOpenChange,\n trigger,\n triggerAsChild = false,\n triggerClassName,\n title,\n ariaLabel,\n labelledBy,\n size = \"md\",\n showBackdrop = true,\n backdropBlur = true,\n positionerClassName,\n contentClassName,\n children,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <ArkDialog.Root\n open={open}\n initialFocusEl={() => contentRef.current}\n onOpenChange={(details) => onOpenChange?.(details.open)}\n >\n {trigger && (\n <ArkDialog.Trigger\n asChild={triggerAsChild}\n className={triggerClassName}\n >\n {trigger}\n </ArkDialog.Trigger>\n )}\n <Portal>\n {showBackdrop && (\n <ArkDialog.Backdrop\n // Scrim must DARKEN in both modes — ink-950 inverts\n // (near-white in dark) and would brighten the page.\n // Fixed black + a soft blur dims and de-focuses.\n // Ark numbers nested dialogs (--layer-index), so a\n // dialog opened from another dims and covers it.\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[calc(100_+_var(--layer-index,0)_*_20)] polli:bg-[#000]/50\",\n backdropBlur && \"polli:backdrop-blur-sm\",\n )}\n />\n )}\n <ArkDialog.Positioner\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[calc(110_+_var(--layer-index,0)_*_20)] polli:flex polli:max-h-dvh polli:items-start polli:justify-center polli:overflow-hidden polli:p-4\",\n \"polli-dialog-mobile-positioner\",\n positionerClassName,\n )}\n >\n <ArkDialog.Content\n ref={contentRef}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n className={cn(\n \"polli:my-auto polli:flex polli:h-auto polli:max-h-full polli:w-full polli:flex-col polli:overflow-y-auto polli:rounded-block polli:bg-surface-block polli:outline-none polli:focus:outline-none polli:focus-visible:outline-none\",\n \"polli-dialog-mobile-page\",\n sizeClasses[size],\n contentClassName,\n )}\n >\n {title && <DialogHeader title={title} />}\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n );\n};\n\nexport const DialogTitle = ArkDialog.Title;\nexport const DialogDescription = ArkDialog.Description;\n\nexport type DialogHeaderProps = Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"title\"\n> & {\n title?: ReactNode;\n description?: ReactNode;\n inBody?: boolean;\n titleClassName?: string;\n descriptionClassName?: string;\n};\n\nexport const DialogHeader: FC<DialogHeaderProps> = ({\n title,\n description,\n children,\n inBody = false,\n className,\n titleClassName,\n descriptionClassName,\n ...props\n}) => {\n return (\n <div\n className={cn(\n inBody\n ? \"polli:shrink-0 polli:pt-2 polli:pb-4\"\n : \"polli:shrink-0 polli:px-(--polli-dialog-gutter) polli:pt-6 polli:pb-4\",\n className,\n )}\n {...props}\n >\n {title && (\n <DialogTitle\n className={cn(headingClassName(\"section\"), titleClassName)}\n >\n {title}\n </DialogTitle>\n )}\n {description && (\n <DialogDescription\n className={cn(\n \"polli:mt-1 polli:font-body polli:text-sm polli:font-normal polli:leading-5 polli:text-theme-text-base\",\n descriptionClassName,\n )}\n >\n {description}\n </DialogDescription>\n )}\n {children}\n </div>\n );\n};\n\nexport type DialogFooterProps = ComponentPropsWithoutRef<\"div\">;\n\nexport type DialogBodyProps = ScrollAreaProps & {\n actions?: ReactNode;\n footnote?: ReactNode;\n bodyClassName?: string;\n};\n\n/**\n * Scroll area whose actions follow the content and stay pinned to the bottom\n * once the content scrolls, so a short screen never opens a gap above them.\n */\nexport function DialogBody({\n children,\n actions,\n footnote,\n bodyClassName,\n className,\n ...props\n}: DialogBodyProps) {\n return (\n <ScrollArea\n {...props}\n className={cn(\n \"polli:flex polli:min-h-0 polli:flex-1 polli:flex-col polli:overscroll-contain\",\n className,\n )}\n >\n <div\n className={cn(\n \"polli:space-y-3 polli:px-(--polli-dialog-gutter) polli:py-4\",\n bodyClassName,\n )}\n >\n {children}\n </div>\n {(actions || footnote) && (\n // The size container lets the footer follow the dialog's width.\n // It sits on the footer alone so pickers and tooltips in the\n // body keep their positioning.\n <div className=\"polli-dialog-floating-controls polli:@container polli:pointer-events-none polli:sticky polli:bottom-0 polli:z-10\">\n {actions && (\n <DialogFooter className=\"polli:pointer-events-auto\">\n {actions}\n </DialogFooter>\n )}\n {footnote && (\n <div className=\"polli:pointer-events-auto\">\n {footnote}\n </div>\n )}\n </div>\n )}\n </ScrollArea>\n );\n}\n\nexport const DialogFooter: FC<DialogFooterProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div\n className={cn(\n \"polli:flex polli:shrink-0 polli:flex-wrap polli:items-center polli:justify-end polli:gap-3 polli:bg-transparent polli:px-(--polli-dialog-gutter) polli:pt-4 polli:pb-6\",\n // Actions are the screen's main controls: touch-sized, sharing\n // the row in a narrow dialog (below 36rem, phones included), and\n // spanning it when there is only one.\n \"polli:[&>.polli-control]:min-h-12 polli:[&>.polli-control]:text-base polli:@max-xl:[&>.polli-control]:flex-auto polli:[&>.polli-control:only-child]:flex-auto\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import type { ReactNode } from \"react\";\nimport { Button } from \"../primitives/Button.tsx\";\nimport {\n Dialog,\n DialogBody,\n DialogHeader,\n type DialogProps,\n} from \"../primitives/Dialog.tsx\";\nimport { CheckIcon, TrashIcon, XIcon } from \"../primitives/icons/index.tsx\";\n\ntype ConfirmIntent = \"danger\" | \"info\" | \"neutral\" | \"commit\";\n\nconst defaultIcons: Record<ConfirmIntent, ReactNode> = {\n danger: <TrashIcon />,\n commit: <CheckIcon />,\n info: <CheckIcon />,\n neutral: <CheckIcon />,\n};\n\nexport type ConfirmationDialogProps = {\n open: boolean;\n title: ReactNode;\n /** Short explanation rendered as body text. */\n description?: ReactNode;\n /** Extra body content below the description (alerts, inputs). */\n children?: ReactNode;\n confirmLabel: ReactNode;\n /** Confirm button recipe; also picks the default confirm icon. */\n intent?: ConfirmIntent;\n /** Override the confirm icon when the action is not a plain delete/confirm. */\n confirmIcon?: ReactNode;\n confirmDisabled?: boolean;\n cancelDisabled?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n size?: DialogProps[\"size\"];\n};\n\n/** One floating Cancel + confirm action for every yes/no dialog. */\nexport function ConfirmationDialog({\n open,\n title,\n description,\n children,\n confirmLabel,\n intent = \"danger\",\n confirmIcon,\n confirmDisabled = false,\n cancelDisabled = false,\n onConfirm,\n onCancel,\n size = \"md\",\n}: ConfirmationDialogProps) {\n const actions = (\n <>\n <Button\n type=\"button\"\n intent=\"neutral\"\n icon={<XIcon />}\n onClick={onCancel}\n disabled={cancelDisabled}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n intent={intent}\n icon={confirmIcon ?? defaultIcons[intent]}\n onClick={onConfirm}\n disabled={confirmDisabled}\n >\n {confirmLabel}\n </Button>\n </>\n );\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => !next && onCancel()}\n size={size}\n contentClassName=\"polli:overflow-hidden\"\n >\n <DialogBody actions={actions}>\n <DialogHeader inBody title={title} />\n {description && (\n <p className=\"polli:text-sm polli:leading-relaxed\">\n {description}\n </p>\n )}\n {children}\n </DialogBody>\n </Dialog>\n );\n}\n","import type { ComponentPropsWithoutRef, ElementType, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst sizeClasses = {\n page: \"polli:text-sm polli:tracking-widest polli:text-theme-text-soft\",\n card: \"polli:text-xs polli:tracking-wider polli:text-theme-text-soft\",\n chrome: \"polli:text-micro polli:tracking-widest polli:text-theme-text-muted\",\n} as const;\n\ntype EyebrowOwnProps<T extends ElementType> = {\n as?: T;\n size?: keyof typeof sizeClasses;\n className?: string;\n children: ReactNode;\n};\n\nexport type EyebrowProps<T extends ElementType = \"span\"> = EyebrowOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof EyebrowOwnProps<T>>;\n\n/** Uppercase pixel label for page, card, and chrome metadata. */\nexport function Eyebrow<T extends ElementType = \"span\">({\n as,\n size = \"card\",\n className,\n children,\n ...rest\n}: EyebrowProps<T>) {\n const Component: ElementType = as || \"span\";\n\n return (\n <Component\n {...rest}\n className={cn(\n \"polli:font-pixel polli:uppercase\",\n sizeClasses[size],\n className,\n )}\n >\n {children}\n </Component>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Eyebrow } from \"../primitives/Eyebrow.tsx\";\n\nexport type ContentHeaderProps = {\n eyebrow: ReactNode;\n title: ReactNode;\n subtitle?: ReactNode;\n action?: ReactNode;\n variant?: \"page\" | \"section\";\n className?: string;\n};\n\nconst titleClasses = {\n page: \"polli:font-heading polli:text-4xl polli:leading-[1.08] polli:text-theme-text-strong polli:sm:text-5xl polli:lg:text-7xl\",\n section:\n \"polli:font-subheading polli:text-3xl polli:leading-tight polli:text-theme-text-strong polli:sm:text-4xl\",\n} as const;\n\nconst subtitleClasses = {\n page: \"polli:max-w-lg polli:text-base polli:leading-relaxed polli:text-theme-text-base polli:sm:text-lg\",\n section: \"polli:max-w-xl polli:leading-relaxed polli:text-theme-text-base\",\n} as const;\n\n/** Shared page/section heading rhythm with an optional trailing action. */\nexport function ContentHeader({\n eyebrow,\n title,\n subtitle,\n action,\n variant = \"section\",\n className,\n}: ContentHeaderProps) {\n const Title = variant === \"page\" ? \"h1\" : \"h2\";\n\n return (\n <header\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-end polli:justify-between polli:gap-6\",\n className,\n )}\n >\n <div className=\"polli:flex polli:max-w-2xl polli:flex-col polli:gap-3\">\n {eyebrow ? <Eyebrow size=\"page\">{eyebrow}</Eyebrow> : null}\n <Title className={titleClasses[variant]}>{title}</Title>\n {subtitle && (\n <p\n className={cn(\n subtitleClasses[variant],\n \"polli:[&_strong]:text-theme-text-strong\",\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n {action}\n </header>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { CheckIcon, ClipboardIcon } from \"../primitives/icons/index.tsx\";\nimport { CopyButton, type CopyButtonProps } from \"./CopyButton.tsx\";\n\nexport type CopyFieldProps = Pick<\n CopyButtonProps,\n \"value\" | \"onCopied\" | \"onCopyError\" | \"copiedTimeoutMs\"\n> & {\n /** Accessible name, e.g. \"Copy secret key\". */\n label: string;\n /** What to show; defaults to the value itself (lists pass a truncated form). */\n display?: ReactNode;\n className?: string;\n};\n\n/**\n * A value the user copies but never edits: looks like a field, behaves like a\n * button. The whole surface copies on click; the end icon confirms.\n */\nexport function CopyField({\n value,\n label,\n display,\n className,\n ...copy\n}: CopyFieldProps) {\n return (\n <CopyButton\n {...copy}\n value={value}\n tooltip={null}\n aria-label={label}\n className={(copied) =>\n cn(\n \"polli-input-shell polli:flex polli:min-h-10 polli:w-full polli:cursor-pointer polli:items-center polli:gap-3 polli:rounded-lg polli:border polli:px-3 polli:py-2 polli:text-left polli:font-mono polli:text-xs polli:transition-colors\",\n copied\n ? \"polli:text-intent-success-text\"\n : \"polli:text-theme-text-base polli:hover:text-theme-text-strong\",\n className,\n )\n }\n >\n {(copied) => (\n <>\n <span className=\"polli:min-w-0 polli:flex-1 polli:select-all polli:break-all\">\n {copied ? \"Copied\" : (display ?? String(value))}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"polli:flex polli:size-4 polli:shrink-0 polli:[&>svg]:size-full\"\n >\n {copied ? <CheckIcon /> : <ClipboardIcon />}\n </span>\n </>\n )}\n </CopyButton>\n );\n}\n","import { createListCollection } from \"@ark-ui/react/collection\";\nimport { Combobox } from \"@ark-ui/react/combobox\";\nimport {\n type ComponentPropsWithoutRef,\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Input, type InputProps } from \"../primitives/Input.tsx\";\nimport { ScrollArea } from \"../primitives/ScrollArea.tsx\";\n\nexport type EditableComboboxProps = Omit<InputProps, \"onChange\" | \"value\"> & {\n value: string;\n options: string[];\n onChange: (value: string) => void;\n emptyMessage?: string;\n align?: \"start\" | \"end\";\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Controlled filter inputs can keep incomplete selections open. */\n closeOnSelect?: boolean;\n /**\n * Content rendered inside the input shell before the text field. Enables\n * the wrapped shell layout and replaces the standalone chevron trigger.\n */\n startContent?: ReactNode;\n /** Optional class for the suggestions panel. */\n contentClassName?: string;\n};\n\nexport type EditableComboboxTokenProps = Omit<\n ComponentPropsWithoutRef<\"button\">,\n \"children\" | \"type\"\n> & {\n label: string;\n value: string;\n highlighted?: boolean;\n};\n\n/** Interactive filter token intended for an EditableCombobox startContent slot. */\nexport function EditableComboboxToken({\n label,\n value,\n highlighted = false,\n className,\n ...buttonProps\n}: EditableComboboxTokenProps) {\n return (\n <button\n type=\"button\"\n data-highlighted={highlighted ? \"\" : undefined}\n className={cn(\n \"polli-control polli:flex polli:h-7 polli:max-w-full polli:shrink-0 polli:items-center polli:gap-1 polli:rounded polli:px-1.5 polli:text-xs polli:transition-colors polli:hover:bg-theme-bg-hover polli:data-[highlighted]:bg-theme-bg-active\",\n className,\n )}\n {...buttonProps}\n >\n <span className=\"polli:text-theme-text-muted\">{label}:</span>\n <span className=\"polli:truncate polli:text-theme-text-base\">\n {value}\n </span>\n <ChevronIcon className=\"polli:h-3 polli:w-3 polli:text-theme-text-muted\" />\n </button>\n );\n}\n\nexport function EditableCombobox({\n value,\n options,\n onChange,\n emptyMessage = \"No options match.\",\n align = \"start\",\n open,\n onOpenChange,\n closeOnSelect,\n startContent,\n contentClassName,\n className,\n disabled,\n name,\n placeholder,\n required,\n ...inputProps\n}: EditableComboboxProps) {\n const visibleOptions = useMemo(() => {\n const query = value.trim().toLowerCase();\n return query === \"\"\n ? options\n : options.filter((option) => option.toLowerCase().includes(query));\n }, [options, value]);\n const collection = useMemo(\n () =>\n createListCollection({\n items: visibleOptions,\n itemToString: (item) => item,\n itemToValue: (item) => item,\n }),\n [visibleOptions],\n );\n const hasOptions = options.length > 0;\n const hasStartContent = Boolean(startContent);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Zag renders the field with defaultValue. Keep its DOM value aligned when\n // a controlled value projects an input event back to the same string.\n useEffect(() => {\n if (inputRef.current && inputRef.current.value !== value) {\n inputRef.current.value = value;\n }\n });\n\n return (\n <Combobox.Root\n collection={collection}\n inputValue={value}\n value={[]}\n allowCustomValue\n openOnClick={hasOptions}\n openOnChange={() => hasOptions}\n open={open}\n closeOnSelect={closeOnSelect}\n disabled={disabled}\n name={name}\n required={required}\n positioning={{\n placement: align === \"end\" ? \"bottom-end\" : \"bottom-start\",\n sameWidth: true,\n strategy: \"fixed\",\n }}\n onInputValueChange={(details) => onChange(details.inputValue)}\n onOpenChange={(details) => onOpenChange?.(details.open)}\n >\n <Combobox.Control\n className={cn(\n \"polli:relative polli:w-full\",\n hasStartContent &&\n \"polli-input-shell polli:flex polli:min-h-10 polli:flex-wrap polli:items-center polli:gap-2 polli:border polli:rounded-lg polli:px-2 polli:py-1\",\n )}\n >\n {startContent}\n <Combobox.Input asChild>\n <Input\n ref={inputRef}\n {...inputProps}\n name={name}\n placeholder={placeholder}\n className={cn(\n hasStartContent\n ? \"polli:min-w-28 polli:flex-1 polli:px-1 polli:py-1\"\n : \"polli:w-full polli:pr-10\",\n className,\n )}\n />\n </Combobox.Input>\n {hasOptions && !hasStartContent && (\n <Combobox.Trigger\n aria-label=\"Show options\"\n className=\"polli-control polli:absolute polli:right-0 polli:top-0 polli:flex polli:h-full polli:w-10 polli:cursor-pointer polli:items-center polli:justify-center polli:rounded-r-lg polli:text-theme-text-muted polli:hover:text-theme-text-strong\"\n >\n <Combobox.Context>\n {(context) => (\n <ChevronIcon\n expanded={context.open}\n className=\"polli:h-4 polli:w-4 polli:transition-transform\"\n />\n )}\n </Combobox.Context>\n </Combobox.Trigger>\n )}\n </Combobox.Control>\n <Combobox.Positioner>\n <Combobox.Content\n className={cn(\n \"polli:z-[120] polli:overflow-hidden polli:rounded-lg polli:bg-surface-menu polli:p-1 polli:shadow-lg polli:focus:outline-none\",\n contentClassName,\n )}\n >\n <ScrollArea className=\"polli:max-h-64\">\n <Combobox.List className=\"polli:flex polli:flex-col\">\n {visibleOptions.map((option) => (\n <Combobox.Item\n key={option}\n item={option}\n className={cn(\n \"polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:rounded-lg polli:bg-transparent polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:text-theme-text-base polli:transition-colors polli:hover:bg-theme-bg-hover polli:data-[highlighted]:bg-theme-bg-hover\",\n value === option &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n )}\n >\n <Combobox.ItemText className=\"polli:truncate polli:font-mono\">\n {option}\n </Combobox.ItemText>\n </Combobox.Item>\n ))}\n {visibleOptions.length === 0 && (\n <Combobox.Empty className=\"polli:m-0 polli:px-2 polli:py-2 polli:text-sm polli:text-theme-text-soft\">\n {emptyMessage}\n </Combobox.Empty>\n )}\n </Combobox.List>\n </ScrollArea>\n </Combobox.Content>\n </Combobox.Positioner>\n </Combobox.Root>\n );\n}\n","import { forwardRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type InputProps = React.ComponentPropsWithoutRef<\"input\"> & {\n error?: boolean;\n hideNumberSteppers?: boolean;\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, error, hideNumberSteppers, ...props }, ref) => (\n <input\n ref={ref}\n data-error={error ? \"true\" : undefined}\n className={cn(\n \"polli-input polli:px-3 polli:py-2 polli:border polli:rounded-lg\",\n \"polli:font-body polli:text-base polli:font-normal polli:leading-6 polli:text-theme-text-strong\",\n \"polli:transition-colors\",\n \"polli:disabled:opacity-50 polli:disabled:cursor-not-allowed\",\n hideNumberSteppers && \"polli-input-number-clean\",\n className,\n )}\n {...props}\n />\n ),\n);\n","/** Relative URLs and same-origin absolute URLs stay in the current app. */\nexport function isExternalHref(\n href: unknown,\n origin = globalThis.location?.origin,\n): boolean {\n if (typeof href !== \"string\" || !/^(https?:)?\\/\\//i.test(href))\n return false;\n if (!origin) return true;\n try {\n return new URL(href, origin).origin !== origin;\n } catch {\n return false;\n }\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { isExternalHref } from \"../lib/link.ts\";\nimport {\n Button,\n type ButtonAppearance,\n type ButtonProps,\n} from \"../primitives/Button.tsx\";\nimport { ExternalLinkIcon } from \"../primitives/icons/index.tsx\";\n\ntype ExternalLinkButtonBaseProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n appearance?: ButtonAppearance;\n intent?: ButtonProps[\"intent\"];\n /** Set false for another Pollinations property that should behave as product navigation. */\n external?: boolean;\n showIcon?: boolean;\n /** Leading icon, rendered before the label. */\n icon?: ReactNode;\n className?: string;\n children: ReactNode;\n};\n\ntype ExternalLinkButtonAnchorProps = ExternalLinkButtonBaseProps & {\n href: string;\n} & Omit<ComponentPropsWithoutRef<\"a\">, \"children\" | \"className\" | \"href\">;\n\ntype ExternalLinkButtonNativeButtonProps = ExternalLinkButtonBaseProps &\n Omit<ComponentPropsWithoutRef<\"button\">, \"children\" | \"className\">;\n\nexport type ExternalLinkButtonProps =\n | ExternalLinkButtonAnchorProps\n | ExternalLinkButtonNativeButtonProps;\n\n/** Primary flow actions such as checkout or authorization. Use InlineLink for navigation. */\nexport function ExternalLinkButton(props: ExternalLinkButtonProps) {\n const {\n size = \"md\",\n appearance,\n external = \"href\" in props ? isExternalHref(props.href) : true,\n showIcon = true,\n icon,\n className,\n children,\n } = props;\n const content = (\n <>\n {icon}\n <span>{children}</span>\n {external && showIcon ? (\n <ExternalLinkIcon\n className=\"polli:h-4 polli:w-4 polli:shrink-0 polli:opacity-60\"\n aria-hidden=\"true\"\n />\n ) : null}\n </>\n );\n\n if (\"href\" in props) {\n const {\n href,\n target = external ? \"_blank\" : undefined,\n rel = target === \"_blank\" ? \"noopener noreferrer\" : undefined,\n size: _size,\n appearance: _appearance,\n external: _external,\n showIcon: _showIcon,\n icon: _icon,\n className: _className,\n children: _children,\n ...anchorProps\n } = props;\n\n return (\n <Button\n as=\"a\"\n href={href}\n target={target}\n rel={rel}\n size={size}\n appearance={appearance}\n className={cn(\"polli:gap-2\", className)}\n {...anchorProps}\n >\n {content}\n </Button>\n );\n }\n\n const {\n type = \"button\",\n size: _size,\n appearance: _appearance,\n external: _external,\n showIcon: _showIcon,\n icon: _icon,\n className: _className,\n children: _children,\n ...buttonProps\n } = props;\n\n return (\n <Button\n as=\"button\"\n type={type}\n size={size}\n appearance={appearance}\n className={cn(\"polli:gap-2\", className)}\n {...buttonProps}\n >\n {content}\n </Button>\n );\n}\n","export { Field } from \"@ark-ui/react/field\";\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Field } from \"../primitives/Field.tsx\";\n\nexport type FieldStackProps = {\n /** Omit for a self-describing control; label the input itself. */\n label?: ReactNode;\n children: ReactNode;\n helper?: ReactNode;\n action?: ReactNode;\n error?: ReactNode;\n alignLabelRow?: boolean;\n className?: string;\n labelClassName?: string;\n helperClassName?: string;\n errorClassName?: string;\n};\n\nexport function FieldStack({\n label,\n children,\n helper,\n action,\n error,\n alignLabelRow = false,\n className,\n labelClassName,\n helperClassName,\n errorClassName,\n}: FieldStackProps) {\n return (\n <Field.Root\n className={cn(\n \"polli:flex polli:flex-col polli:gap-2 polli:font-body\",\n className,\n )}\n invalid={Boolean(error)}\n >\n {(label || action) && (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:justify-between polli:gap-2\",\n alignLabelRow && \"polli:min-h-8\",\n )}\n >\n {label && (\n <Field.Label\n className={cn(\n \"polli:text-sm polli:font-semibold polli:leading-5 polli:text-theme-text-strong\",\n labelClassName,\n )}\n >\n {label}\n </Field.Label>\n )}\n {action}\n </div>\n )}\n {children}\n {error ? (\n <Field.ErrorText\n className={cn(\n \"polli:text-xs polli:font-medium polli:leading-5 polli:text-intent-danger-text\",\n errorClassName,\n )}\n >\n {error}\n </Field.ErrorText>\n ) : helper ? (\n <Field.HelperText\n className={cn(\n \"polli:text-xs polli:font-normal polli:leading-normal polli:text-theme-text-muted\",\n helperClassName,\n )}\n >\n {helper}\n </Field.HelperText>\n ) : null}\n </Field.Root>\n );\n}\n","import {\n type ChangeEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { acquireDocumentFileDropGuard } from \"../lib/document-file-drop-guard.ts\";\nimport { partitionFiles, type RejectedFile } from \"../lib/partition-files.ts\";\nimport { IconButton } from \"../primitives/IconButton.tsx\";\nimport { ImageIcon, PlusIcon, XIcon } from \"../primitives/icons/index.tsx\";\n\nconst PREVIEWABLE_IMAGE_TYPES = new Set([\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n]);\nconst PREVIEW_SIZE = 64;\nconst LARGE_PREVIEW_SIZE = 112;\n\nconst previewSizeClasses = {\n sm: \"polli:h-16 polli:w-16\",\n lg: \"polli:h-28 polli:w-28\",\n} as const;\n\nfunction isPreviewableImage(file: File): boolean {\n return PREVIEWABLE_IMAGE_TYPES.has(file.type);\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction attachmentSummary(files: File[]): string {\n const kinds = new Set(\n files.map((file) => file.type.split(\"/\")[0]).filter(Boolean),\n );\n if (kinds.size !== 1) return `${files.length} files attached`;\n const [kind] = kinds;\n return `${files.length} ${kind}${files.length === 1 ? \"\" : \"s\"} attached`;\n}\n\nfunction PreviewPlaceholder({\n icon,\n size,\n}: {\n icon: ReactNode;\n size: \"sm\" | \"lg\";\n}) {\n return (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:justify-center polli:rounded-xl polli:bg-theme-bg-active polli:text-theme-text-soft\",\n previewSizeClasses[size],\n )}\n >\n {icon}\n </div>\n );\n}\n\nfunction FilePreview({\n file,\n placeholderIcon,\n size = \"sm\",\n}: {\n file: File;\n placeholderIcon: ReactNode;\n size?: \"sm\" | \"lg\";\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [canPreview, setCanPreview] = useState(() =>\n isPreviewableImage(file),\n );\n const previewSize = size === \"lg\" ? LARGE_PREVIEW_SIZE : PREVIEW_SIZE;\n\n useEffect(() => {\n if (!isPreviewableImage(file)) {\n setCanPreview(false);\n return;\n }\n\n let cancelled = false;\n setCanPreview(true);\n\n async function drawPreview() {\n try {\n const bitmap = await createImageBitmap(file);\n if (cancelled) {\n bitmap.close();\n return;\n }\n\n const canvas = canvasRef.current;\n const context = canvas?.getContext(\"2d\");\n if (!canvas || !context) {\n bitmap.close();\n setCanPreview(false);\n return;\n }\n\n canvas.width = previewSize;\n canvas.height = previewSize;\n\n const scale = Math.max(\n previewSize / bitmap.width,\n previewSize / bitmap.height,\n );\n const width = bitmap.width * scale;\n const height = bitmap.height * scale;\n const x = (previewSize - width) / 2;\n const y = (previewSize - height) / 2;\n\n context.clearRect(0, 0, previewSize, previewSize);\n context.drawImage(bitmap, x, y, width, height);\n bitmap.close();\n } catch {\n if (!cancelled) setCanPreview(false);\n }\n }\n\n void drawPreview();\n\n return () => {\n cancelled = true;\n };\n }, [file, previewSize]);\n\n if (!canPreview) {\n return <PreviewPlaceholder icon={placeholderIcon} size={size} />;\n }\n\n return (\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={file.name}\n className={cn(\"polli:rounded-xl\", previewSizeClasses[size])}\n width={previewSize}\n height={previewSize}\n />\n );\n}\n\nexport type FileUploadProps = {\n value: File[];\n onChange: (files: File[]) => void;\n onReject?: (rejected: RejectedFile[]) => void;\n maxFiles?: number;\n maxSizeBytes?: number;\n accept?: string;\n icon?: ReactNode;\n label?: ReactNode;\n previewIcon?: ReactNode;\n /** Compact drop zone, or preview-only strip for a parent drop target. */\n variant?: \"default\" | \"compact\" | \"inline\";\n /** Fully locks the field: no add, no remove, drops ignored. */\n disabled?: boolean;\n className?: string;\n};\n\nexport function FileUpload({\n value,\n onChange,\n onReject,\n maxFiles = 4,\n maxSizeBytes = 10 * 1024 * 1024,\n accept = \"image/*\",\n icon = <ImageIcon className=\"polli:h-6 polli:w-6\" />,\n label = (\n <>\n Drag images here or <span className=\"polli:underline\">browse</span>\n </>\n ),\n previewIcon = <ImageIcon className=\"polli:h-5 polli:w-5\" />,\n variant = \"default\",\n disabled = false,\n className,\n}: FileUploadProps) {\n // A near-miss file drop should not navigate the browser away from the app.\n // Mounted upload controls share one document-level guard.\n useEffect(() => acquireDocumentFileDropGuard(document), []);\n\n // Only `disabled` blocks drop handling. At the file limit the browse/add\n // controls disappear, but over-limit drops still flow through partitionFiles\n // and are reported as `{ reason: \"count\" }` via onReject.\n function addFiles(incoming: File[]) {\n if (disabled || incoming.length === 0) return;\n const { accepted, rejected } = partitionFiles(incoming, value, {\n maxFiles,\n maxSizeBytes,\n accept,\n });\n if (accepted.length > 0) onChange([...value, ...accepted]);\n if (rejected.length > 0) onReject?.(rejected);\n }\n\n const hasFiles = value.length > 0;\n const canAdd = !disabled && value.length < maxFiles;\n const isSingleFile = maxFiles === 1;\n const compact = variant !== \"default\";\n const inline = variant === \"inline\";\n const previewSize = compact ? \"sm\" : isSingleFile ? \"lg\" : \"sm\";\n const inputId = useId();\n const addInputId = `${inputId}-add`;\n\n function handleInputChange(event: ChangeEvent<HTMLInputElement>) {\n addFiles(Array.from(event.target.files ?? []));\n event.target.value = \"\";\n }\n\n if (inline && !hasFiles) return null;\n\n return (\n <div className={cn(\"polli:flex polli:flex-col polli:gap-2\", className)}>\n <fieldset\n disabled={disabled}\n className={cn(\n \"polli:m-0\",\n !inline &&\n \"polli:rounded-xl polli:border polli:border-dashed polli:border-theme-border polli:bg-theme-bg-pale\",\n \"polli:text-sm\",\n inline\n ? \"polli:border-0 polli:bg-transparent polli:p-0 polli:text-left\"\n : compact\n ? \"polli:min-h-16 polli:px-3 polli:py-2 polli:text-left\"\n : \"polli:px-4 polli:py-4 polli:text-center\",\n \"polli:text-theme-text-soft polli:transition-colors\",\n disabled\n ? \"polli:opacity-50\"\n : \"polli:hover:bg-theme-bg-hover\",\n )}\n // Always prevent the browser's default file-drop navigation,\n // even when disabled; only the file handling is gated.\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n if (disabled) return;\n addFiles(Array.from(e.dataTransfer.files));\n }}\n >\n {!hasFiles ? (\n <label\n htmlFor={inputId}\n className={cn(\n \"polli-control polli:flex polli:items-center polli:gap-2 polli:rounded-lg\",\n compact\n ? \"polli:min-h-12 polli:flex-row polli:justify-start\"\n : \"polli:min-h-32 polli:flex-col polli:justify-center\",\n canAdd\n ? \"polli:cursor-pointer\"\n : \"polli:cursor-not-allowed\",\n )}\n >\n {icon}\n <span>{label}</span>\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={maxFiles > 1}\n disabled={disabled || !canAdd}\n className=\"polli:sr-only\"\n onChange={handleInputChange}\n />\n </label>\n ) : (\n <div\n className={cn(\n \"polli:flex polli:gap-3\",\n compact ? \"polli:items-center\" : \"polli:flex-col\",\n )}\n >\n {compact && !inline && (\n <span className=\"polli:text-xs polli:font-medium polli:text-theme-text-muted\">\n {attachmentSummary(value)}\n </span>\n )}\n <ul\n className={cn(\n \"polli:m-0 polli:gap-3 polli:p-0\",\n compact\n ? cn(\n \"polli:flex polli:min-w-0 polli:flex-1 polli:flex-wrap\",\n inline\n ? \"polli:justify-start\"\n : \"polli:ml-auto polli:justify-end\",\n )\n : \"polli:grid polli:grid-cols-[repeat(auto-fill,minmax(5rem,1fr))]\",\n isSingleFile &&\n !compact &&\n \"polli:flex polli:justify-center\",\n )}\n >\n {value.map((file, index) => (\n <li\n key={`${file.name}-${index}`}\n className={cn(\n \"polli:relative polli:flex polli:min-w-0 polli:list-none polli:flex-col polli:items-center polli:gap-1\",\n isSingleFile && \"polli:max-w-full\",\n )}\n >\n <FilePreview\n file={file}\n placeholderIcon={previewIcon}\n size={previewSize}\n />\n {!compact && (\n <>\n <span\n className={cn(\n \"polli:max-w-full polli:truncate polli:text-xs polli:font-medium polli:text-theme-text-base\",\n isSingleFile\n ? \"polli:w-36\"\n : \"polli:w-16\",\n )}\n >\n {file.name}\n </span>\n <span className=\"polli:text-micro polli:text-theme-text-muted\">\n {formatFileSize(file.size)}\n </span>\n </>\n )}\n {!disabled && (\n <div className=\"polli:absolute polli:-top-2 polli:right-1\">\n <IconButton\n intent=\"danger\"\n title={`Remove ${file.name}`}\n onClick={() =>\n onChange(\n value.filter(\n (_, i) =>\n i !== index,\n ),\n )\n }\n >\n <XIcon className=\"polli:h-3 polli:w-3\" />\n </IconButton>\n </div>\n )}\n </li>\n ))}\n\n {!inline && !isSingleFile && canAdd && (\n <li className=\"polli:flex polli:list-none\">\n <label\n htmlFor={addInputId}\n className={cn(\n \"polli-control polli:flex polli:cursor-pointer polli:flex-col polli:items-center polli:justify-center polli:gap-1 polli:rounded-lg polli:bg-theme-bg-active polli:text-theme-text-soft polli:transition-colors polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-strong\",\n compact\n ? \"polli:h-16 polli:w-16 polli:px-2 polli:py-1\"\n : \"polli:min-h-20 polli:w-full polli:px-3 polli:py-2\",\n )}\n >\n <PlusIcon className=\"polli:h-5 polli:w-5\" />\n {!compact && (\n <span className=\"polli:text-xs polli:font-medium\">\n Add\n </span>\n )}\n <input\n id={addInputId}\n type=\"file\"\n aria-label=\"Add files\"\n accept={accept}\n multiple\n disabled={disabled || !canAdd}\n className=\"polli:sr-only\"\n onChange={handleInputChange}\n />\n </label>\n </li>\n )}\n </ul>\n\n {Number.isFinite(maxFiles) &&\n maxFiles > 1 &&\n !compact && (\n <span className=\"polli:text-xs polli:text-theme-text-muted\">\n {value.length} / {maxFiles} files\n </span>\n )}\n </div>\n )}\n </fieldset>\n </div>\n );\n}\n","type GuardState = {\n consumers: number;\n preventFileNavigation: EventListener;\n};\n\nconst guards = new WeakMap<Document, GuardState>();\n\n/**\n * Prevents the browser from navigating to a dropped file while at least one\n * upload control is mounted. One listener pair is shared per document.\n */\nexport function acquireDocumentFileDropGuard(document: Document): () => void {\n let guard = guards.get(document);\n\n if (!guard) {\n const preventFileNavigation: EventListener = (event) => {\n const types = (event as DragEvent).dataTransfer?.types;\n if (types?.includes(\"Files\")) event.preventDefault();\n };\n\n guard = { consumers: 0, preventFileNavigation };\n guards.set(document, guard);\n document.addEventListener(\"dragover\", preventFileNavigation);\n document.addEventListener(\"drop\", preventFileNavigation);\n }\n\n guard.consumers += 1;\n let released = false;\n\n return () => {\n if (released) return;\n released = true;\n guard.consumers -= 1;\n\n if (guard.consumers > 0) return;\n document.removeEventListener(\"dragover\", guard.preventFileNavigation);\n document.removeEventListener(\"drop\", guard.preventFileNavigation);\n guards.delete(document);\n };\n}\n","export type RejectReason = \"type\" | \"size\" | \"count\";\n\nexport type RejectedFile = { file: File; reason: RejectReason };\n\nexport type PartitionOptions = {\n maxFiles: number;\n maxSizeBytes: number;\n /** Comma-separated list: mime (\"image/png\"), wildcard (\"image/*\"), or extension (\".webp\"). */\n accept?: string;\n};\n\nexport type PartitionResult = {\n accepted: File[];\n rejected: RejectedFile[];\n};\n\nfunction matchesAccept(file: File, accept: string | undefined): boolean {\n if (!accept) return true;\n const tokens = accept\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n if (tokens.length === 0) return true;\n return tokens.some((token) => {\n if (token.startsWith(\".\")) {\n return file.name.toLowerCase().endsWith(token.toLowerCase());\n }\n if (token.endsWith(\"/*\")) {\n const prefix = token.slice(0, token.length - 1); // \"image/\"\n return file.type.startsWith(prefix);\n }\n return file.type === token;\n });\n}\n\n/**\n * Partition `incoming` files against the already-selected `current` files.\n * Deterministic: order preserved; every rejection carries a reason.\n * The count limit counts `current.length` against `maxFiles`.\n */\nexport function partitionFiles(\n incoming: File[],\n current: File[],\n { maxFiles, maxSizeBytes, accept }: PartitionOptions,\n): PartitionResult {\n const accepted: File[] = [];\n const rejected: RejectedFile[] = [];\n let slots = Math.max(0, maxFiles - current.length);\n\n for (const file of incoming) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: \"type\" });\n } else if (file.size > maxSizeBytes) {\n rejected.push({ file, reason: \"size\" });\n } else if (slots <= 0) {\n rejected.push({ file, reason: \"count\" });\n } else {\n accepted.push(file);\n slots -= 1;\n }\n }\n\n return { accepted, rejected };\n}\n","import { type ButtonHTMLAttributes, forwardRef, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Tooltip } from \"./Tooltip.tsx\";\n\n/** `danger` (delete, red) and `info` (edit/links, blue). */\nexport type IconButtonIntent = \"danger\" | \"info\";\nexport type IconButtonVariant = \"tile\" | \"ghost\";\n\nconst intentClasses: Record<IconButtonIntent, string> = {\n danger: \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n info: \"polli:bg-intent-info-bg-light polli:text-intent-info-text\",\n};\n\nconst intentHoverClasses: Record<IconButtonIntent, string> = {\n danger: \"polli:hover:bg-intent-danger-bg-hover\",\n info: \"polli:hover:bg-intent-info-bg-hover\",\n};\n\nconst variantClasses: Record<IconButtonVariant, string> = {\n tile: \"polli:bg-theme-bg-active polli:text-theme-text-soft\",\n ghost: \"polli:bg-transparent polli:text-theme-text-muted\",\n};\n\nconst variantHoverClasses: Record<IconButtonVariant, string> = {\n tile: \"polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n ghost: \"polli:hover:bg-transparent polli:hover:text-theme-text-soft\",\n};\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"className\" | \"title\"\n> & {\n intent?: IconButtonIntent;\n variant?: IconButtonVariant;\n pressed?: boolean;\n title?: string;\n tooltip?: ReactNode;\n tooltipAlign?: \"start\" | \"center\";\n tooltipClampToViewport?: boolean;\n children: ReactNode;\n className?: string;\n size?: \"sm\" | \"md\";\n};\n\nconst sizeClasses = {\n sm: \"polli:h-6 polli:w-6 polli:rounded\",\n md: \"polli:h-9 polli:w-9 polli:rounded-full\",\n} as const;\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n intent,\n variant = \"tile\",\n pressed,\n title,\n tooltip,\n tooltipAlign,\n tooltipClampToViewport,\n children,\n className,\n size = \"sm\",\n disabled = false,\n ...buttonProps\n },\n ref,\n ) => {\n const button = (\n <button\n {...buttonProps}\n ref={ref}\n type=\"button\"\n disabled={disabled}\n aria-label={buttonProps[\"aria-label\"] ?? title}\n aria-pressed={pressed}\n data-intent={intent}\n className={cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:transition-colors\",\n disabled\n ? \"polli:cursor-not-allowed polli:opacity-50\"\n : \"polli:cursor-pointer\",\n sizeClasses[size],\n intent ? intentClasses[intent] : variantClasses[variant],\n !disabled &&\n (intent\n ? intentHoverClasses[intent]\n : variantHoverClasses[variant]),\n className,\n )}\n >\n {children}\n </button>\n );\n\n const tooltipContent = tooltip ?? title;\n if (!tooltipContent) return button;\n\n return (\n <Tooltip\n triggerAs=\"span\"\n content={tooltipContent}\n align={tooltipAlign}\n clampToViewport={tooltipClampToViewport}\n tapEnabled={false}\n className={\n disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\"\n }\n >\n {button}\n </Tooltip>\n );\n },\n);\n\nIconButton.displayName = \"IconButton\";\n","import type { FC, ReactNode } from \"react\";\nimport { Tooltip } from \"../primitives/Tooltip.tsx\";\n\ntype InfoTipProps = {\n text?: ReactNode;\n content?: ReactNode;\n label?: string;\n};\n\n/**\n * Small \"i\" badge that opens a tooltip on hover, click, or focus.\n *\n * Quiet neutral badge and shared, viewport-clamped tooltip popup.\n * The help cursor indicates that more information is available.\n */\nexport const InfoTip: FC<InfoTipProps> = ({\n text,\n content,\n label = \"More info\",\n}) => (\n // displayContents drops the inline wrapper so the badge centres on its row\n // instead of sitting on the text baseline.\n <Tooltip\n content={content ?? text}\n ariaLabel={label}\n className=\"polli:ml-1\"\n displayContents\n >\n <span className=\"polli:inline-flex polli:h-4 polli:w-4 polli:items-center polli:justify-center polli:rounded-full polli:bg-surface-menu polli:font-bold polli:text-[10px] polli:leading-none polli:text-theme-text-muted polli:transition-colors polli:hover:text-theme-text-strong\">\n i\n </span>\n </Tooltip>\n);\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\n/** Semantic chip labels for status and metadata badges. */\ntype ChipIntent =\n | \"news\"\n | \"new\"\n | \"free\"\n | \"alpha\"\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"danger\";\n\nconst chipSizes = {\n icon: \"polli:h-5 polli:w-5 polli:p-0 polli:text-xs\",\n sm: \"polli:h-5 polli:px-2 polli:text-xs\",\n md: \"polli:h-6 polli:px-2.5 polli:text-sm\",\n lg: \"polli:h-7 polli:px-3 polli:text-sm\",\n} as const;\n\nconst intentClasses: Record<ChipIntent, string> = {\n news: \"polli:bg-intent-news-bg-light polli:text-intent-news-text\",\n new: \"polli:bg-intent-new-bg-light polli:text-intent-new-text\",\n free: \"polli:bg-intent-free-bg-light polli:text-intent-free-text\",\n alpha: \"polli:bg-intent-alpha-bg-light polli:text-intent-alpha-text\",\n neutral: \"polli:bg-ink-100/80 polli:text-ink-900\",\n success:\n \"polli:bg-intent-success-bg-bright/15 polli:text-intent-success-text\",\n warning: \"polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n info: \"polli:bg-intent-info-bg-light polli:text-intent-info-text\",\n danger: \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type ChipProps = ComponentPropsWithoutRef<\"span\"> & {\n /** Semantic intent. */\n intent?: ChipIntent;\n size?: keyof typeof chipSizes;\n};\n\n// Static, rectangular colored container. Round shapes are reserved for buttons.\n// Reads `bg-theme-bg-active` / `text-theme-text-strong` from the cascade unless\n// `intent` is set (semantic, theme-independent).\nexport const Chip: FC<ChipProps> = ({\n intent,\n size = \"md\",\n className,\n children,\n ...rest\n}) => {\n const intentClass = intent\n ? intentClasses[intent]\n : \"polli:bg-theme-bg-active polli:text-theme-text-strong\";\n return (\n <span\n {...rest}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:justify-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-none\",\n chipSizes[size],\n intentClass,\n className,\n )}\n >\n {children}\n </span>\n );\n};\n","import { cn } from \"../lib/cn.ts\";\nimport { Chip } from \"../primitives/Chip.tsx\";\nimport { CheckIcon, ClipboardIcon } from \"../primitives/icons/index.tsx\";\nimport { CopyButton } from \"./CopyButton.tsx\";\n\nexport type KeyChipProps = {\n /** The visible start of the key, e.g. \"sk_0ysBCkH\". */\n prefix: string;\n /** The full key, when known: the chip then copies it on click. */\n value?: string | null;\n /** Accessible name for the copy action. */\n label?: string;\n className?: string;\n};\n\nconst chipClassName =\n \"polli:gap-1.5 polli:font-mono polli:font-normal polli:[&>svg]:size-3.5 polli:[&>svg]:shrink-0\";\n\n/**\n * One badge for every key: prefix and ellipsis, nothing else. A secret key\n * only ever shows its prefix; a key whose value is known copies on click and\n * carries the clipboard icon.\n */\nexport function KeyChip({\n prefix,\n value,\n label = \"Copy key\",\n className,\n}: KeyChipProps) {\n const text = `${prefix}…`;\n if (!value) {\n return (\n <Chip intent=\"neutral\" className={cn(chipClassName, className)}>\n {text}\n </Chip>\n );\n }\n return (\n <CopyButton\n value={value}\n tooltip={null}\n aria-label={label}\n className=\"polli:inline-flex polli:cursor-pointer polli:rounded-lg\"\n >\n {(copied) => (\n <Chip\n intent={copied ? \"success\" : \"neutral\"}\n className={cn(\n chipClassName,\n \"polli:transition-colors\",\n className,\n )}\n >\n {copied ? (\n <CheckIcon aria-hidden=\"true\" />\n ) : (\n <ClipboardIcon aria-hidden=\"true\" />\n )}\n {copied ? \"Copied\" : text}\n </Chip>\n )}\n </CopyButton>\n );\n}\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { isExternalHref } from \"../lib/link.ts\";\nimport { ExternalLinkIcon } from \"../primitives/icons/index.tsx\";\nimport { Surface } from \"../primitives/Surface.tsx\";\n\ntype BaseLinkCardProps = {\n external?: boolean;\n showIcon?: boolean;\n className?: string;\n surfaceClassName?: string;\n};\n\nexport type LinkCardProps<T extends React.ElementType = \"a\"> =\n PropsWithChildren<BaseLinkCardProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseLinkCardProps | \"as\">;\n\nexport function LinkCard<T extends React.ElementType = \"a\">({\n as,\n external,\n showIcon = true,\n className,\n surfaceClassName,\n children,\n ...linkProps\n}: LinkCardProps<T>) {\n const Component: React.ElementType = as || \"a\";\n const isExternal =\n external ?? isExternalHref((linkProps as { href?: unknown }).href);\n\n return (\n <Surface\n as={Component}\n variant=\"card\"\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n {...linkProps}\n className={cn(\n \"polli:relative polli:flex polli:h-full polli:flex-col polli:gap-2 polli:bg-surface-opaque/80 polli:p-5 polli:outline-none\",\n showIcon && isExternal && \"polli:pr-10\",\n \"polli:transition-colors polli:hover:bg-surface-opaque/95\",\n \"polli:focus-visible:ring-2 polli:focus-visible:ring-theme-border\",\n className,\n surfaceClassName,\n )}\n >\n {showIcon && isExternal && (\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli:absolute polli:top-4 polli:right-4 polli:h-3.5 polli:w-3.5 polli:text-theme-text-soft\"\n />\n )}\n {children}\n </Surface>\n );\n}\n","import type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\nexport type MediaPlaceholderProps = ComponentPropsWithoutRef<\"div\"> & {\n icon?: ReactNode;\n label?: ReactNode;\n detail?: ReactNode;\n};\n\nexport const MediaPlaceholder: FC<MediaPlaceholderProps> = ({\n icon,\n label,\n detail,\n children,\n className,\n ...rest\n}) => (\n <div\n {...rest}\n className={cn(\n \"polli:flex polli:aspect-video polli:min-h-40 polli:flex-col polli:items-center polli:justify-center polli:gap-3 polli:rounded-lg polli:border polli:border-dashed polli:border-theme-border polli:bg-theme-bg-pale polli:p-6 polli:text-center\",\n className,\n )}\n >\n {icon && (\n <div className=\"polli:flex polli:h-10 polli:w-10 polli:items-center polli:justify-center polli:rounded-full polli:bg-theme-bg-active polli:text-theme-text-base\">\n {icon}\n </div>\n )}\n {(label || detail) && (\n <div className=\"polli:max-w-sm\">\n {label && (\n <Text as=\"p\" size=\"sm\" tone=\"strong\" weight=\"semibold\">\n {label}\n </Text>\n )}\n {detail && (\n <Text as=\"p\" size=\"sm\" tone=\"soft\" className=\"polli:mt-1\">\n {detail}\n </Text>\n )}\n </div>\n )}\n {children}\n </div>\n);\n","import type { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Dropdown } from \"../primitives/Dropdown.tsx\";\nimport { ScrollArea } from \"../primitives/ScrollArea.tsx\";\nimport { Tooltip } from \"../primitives/Tooltip.tsx\";\n\nexport type MultiSelectOption = {\n value: string;\n label: string;\n};\n\nexport type MultiSelectProps = {\n options: MultiSelectOption[];\n selected: string[];\n onChange: (selected: string[]) => void;\n placeholder: string;\n disabled?: boolean;\n disabledText?: string;\n disabledTooltip?: string;\n align?: \"start\" | \"end\";\n label?: string;\n /** Accessible name when the visible label is supplied by the caller. */\n ariaLabel?: string;\n /** Fill the available width, allowing the trigger label to truncate. */\n fullWidth?: boolean;\n};\n\nconst TRIGGER_BASE =\n \"polli-control polli:inline-flex polli:min-h-8 polli:min-w-[140px] polli:items-center polli:gap-2 polli:rounded-full polli:px-3 polli:py-1.5 polli:text-xs polli:font-medium polli:transition-all polli:duration-200\";\n\nconst ROW_BASE =\n \"polli-control polli:flex polli:w-full polli:items-center polli:gap-3 polli:px-3 polli:py-2 polli:text-left polli:text-xs polli:transition-colors\";\n\nconst CHECK_BASE =\n \"polli:flex polli:h-4 polli:w-4 polli:flex-shrink-0 polli:items-center polli:justify-center polli:rounded polli:border polli:border-theme-border polli:text-xs\";\n\nexport const MultiSelect: FC<MultiSelectProps> = ({\n options,\n selected,\n onChange,\n placeholder,\n disabled,\n disabledText,\n disabledTooltip,\n align = \"start\",\n label,\n ariaLabel,\n fullWidth = false,\n}) => {\n const isAllSelected = selected.length === 0;\n\n const toggleItem = (itemId: string) => {\n if (selected.includes(itemId)) {\n onChange(selected.filter((m) => m !== itemId));\n } else {\n onChange([...selected, itemId]);\n }\n };\n\n const selectAll = () => onChange([]);\n\n const displayText = disabled\n ? disabledText\n : isAllSelected\n ? placeholder\n : selected.length === 1\n ? (options.find((option) => option.value === selected[0])?.label ??\n \"1 selected\")\n : `${selected.length} selected`;\n\n const labelNode = label ? (\n <span className=\"polli:text-xs polli:font-medium polli:text-theme-text-soft\">\n {label}\n </span>\n ) : null;\n\n if (disabled) {\n return (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:gap-2\",\n fullWidth && \"polli:w-full polli:min-w-0\",\n )}\n >\n {labelNode}\n <Tooltip\n triggerAs=\"span\"\n content={disabledTooltip || \"No items available\"}\n align=\"center\"\n className={cn(\n \"polli:inline-flex polli:cursor-not-allowed\",\n fullWidth && \"polli:min-w-0 polli:flex-1\",\n )}\n >\n <button\n type=\"button\"\n disabled\n aria-label={ariaLabel || label || placeholder}\n className={cn(\n TRIGGER_BASE,\n fullWidth && \"polli:w-full polli:min-w-0\",\n \"polli:cursor-not-allowed polli:bg-theme-bg-active polli:opacity-50\",\n )}\n >\n <span className=\"polli:flex-1 polli:truncate polli:text-left polli:text-theme-text-strong\">\n {displayText}\n </span>\n <ChevronIcon\n expanded={false}\n className=\"polli:h-3 polli:w-3 polli:text-theme-text-soft\"\n />\n </button>\n </Tooltip>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:gap-2\",\n fullWidth && \"polli:w-full polli:min-w-0\",\n )}\n >\n {labelNode}\n <Dropdown\n align={align}\n className=\"polli:w-[min(20rem,calc(100vw-2rem))]\"\n trigger={(open) => (\n <button\n type=\"button\"\n aria-label={ariaLabel || label || placeholder}\n className={cn(\n TRIGGER_BASE,\n fullWidth && \"polli:w-full polli:min-w-0\",\n open\n ? \"polli:bg-theme-bg-hover\"\n : \"polli:bg-theme-bg-active polli:hover:bg-theme-bg-hover\",\n )}\n >\n <span\n className={cn(\n \"polli:flex-1 polli:truncate polli:text-left\",\n open\n ? \"polli:text-theme-text-strong\"\n : \"polli:text-theme-text-base\",\n )}\n >\n {displayText}\n </span>\n <ChevronIcon\n expanded={open}\n className={cn(\n \"polli:h-3 polli:w-3 polli:transition-transform\",\n open\n ? \"polli:text-theme-text-strong\"\n : \"polli:text-theme-text-soft\",\n )}\n />\n </button>\n )}\n >\n <ScrollArea className=\"polli:max-h-64\">\n <button\n type=\"button\"\n onClick={selectAll}\n aria-pressed={isAllSelected}\n className={cn(\n ROW_BASE,\n isAllSelected\n ? \"polli:bg-theme-bg-active polli:font-medium polli:text-theme-text-strong\"\n : \"polli:text-theme-text-base polli:hover:bg-theme-bg-subtle\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n CHECK_BASE,\n isAllSelected &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n )}\n >\n {isAllSelected && \"✓\"}\n </span>\n {placeholder}\n </button>\n {options.map((opt) => {\n const isChecked = selected.includes(opt.value);\n return (\n <button\n type=\"button\"\n key={opt.value}\n onClick={() => toggleItem(opt.value)}\n aria-pressed={isChecked}\n className={cn(\n ROW_BASE,\n isChecked\n ? \"polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:text-theme-text-base polli:hover:bg-theme-bg-subtle\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n CHECK_BASE,\n isChecked &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n )}\n >\n {isChecked && \"✓\"}\n </span>\n <span className=\"polli:min-w-0 polli:[overflow-wrap:anywhere]\">\n {opt.label}\n </span>\n </button>\n );\n })}\n </ScrollArea>\n </Dropdown>\n </div>\n );\n};\n","import type { ComponentType, PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype BaseNavItemProps = {\n /** Current/selected item — fills with the accent + sets `aria-current`. */\n active?: boolean;\n /** Optional leading icon. */\n icon?: ComponentType<{ className?: string }>;\n className?: string;\n};\n\n// Neutral/quiet when inactive; filled with the accent when active. The leading\n// icon is the section marker.\nconst base =\n \"polli-control polli:flex polli:items-center polli:gap-2 polli:rounded-full polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:whitespace-nowrap polli:transition-colors\";\nconst activeClasses = \"polli:bg-theme-bg-active polli:text-theme-text-strong\";\nconst inactiveClasses =\n \"polli:text-ink-800 polli:hover:bg-surface-opaque/60 polli:hover:text-ink-950\";\n\nexport type NavItemProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseNavItemProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseNavItemProps | \"as\">;\n\n/**\n * Minimal nav item — a pill that's neutral when inactive and filled with the\n * accent when active, with an optional leading icon. Polymorphic: `<NavItem>`\n * (button) for in-page nav, `<NavItem as={Link} active={…}>` for routed nav.\n * Shared by the enter dashboard rail and apps so both use one design.\n */\nexport function NavItem<T extends React.ElementType = \"button\">({\n as,\n active = false,\n icon: Icon,\n className,\n children,\n ...rest\n}: NavItemProps<T>) {\n const Component: React.ElementType = as || \"button\";\n return (\n <Component\n aria-current={active ? \"page\" : undefined}\n className={cn(\n base,\n active ? activeClasses : inactiveClasses,\n className,\n )}\n {...rest}\n >\n {Icon ? (\n <Icon className=\"polli:h-4 polli:w-4 polli:shrink-0\" />\n ) : null}\n {children}\n </Component>\n );\n}\n","import type { FC, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport {\n addUtcDays,\n isPeriodSelectable,\n type PeriodGranularity,\n type PeriodSelection,\n periodFromDate,\n periodToWindow,\n startOfUtcDay,\n} from \"../lib/period.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Dropdown } from \"../primitives/Dropdown.tsx\";\nimport { TabButton } from \"../primitives/TabButton.tsx\";\n\nexport type PeriodPickerProps = {\n value: PeriodSelection;\n onChange: (value: PeriodSelection) => void;\n minDate?: Date;\n maxDate?: Date;\n /** Custom trigger for a calendar with a fixed granularity. */\n trigger?: (open: boolean) => ReactNode;\n /** Optional controls above the calendar grid. */\n header?: ReactNode;\n};\n\nconst WEEKDAY_LABELS = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst MONTH_LABELS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nconst NAV_BUTTON =\n \"polli-control polli:rounded-full polli:px-2 polli:py-1 polli:text-xs polli:font-semibold polli:text-theme-text-base polli:transition-colors polli:hover:bg-theme-bg-subtle\";\n\nfunction addUtcMonths(date: Date, months: number): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1),\n );\n}\n\nfunction monthGridDates(viewMonth: Date): Date[] {\n const firstDay = new Date(\n Date.UTC(viewMonth.getUTCFullYear(), viewMonth.getUTCMonth(), 1),\n );\n const firstWeekday = firstDay.getUTCDay() || 7;\n const cursor = addUtcDays(firstDay, 1 - firstWeekday);\n return Array.from({ length: 42 }, (_, index) => addUtcDays(cursor, index));\n}\n\nfunction sameUtcDay(left: Date, right: Date): boolean {\n return left.getTime() === right.getTime();\n}\n\nfunction periodDate(value: PeriodSelection): Date {\n return periodToWindow(value).start;\n}\n\nfunction selectionKey(value: PeriodSelection): string {\n return `${value.granularity}:${value.period}`;\n}\n\nfunction formatMonthYear(date: Date, month: \"short\" | \"long\" = \"short\") {\n return date.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month,\n year: \"numeric\",\n });\n}\n\nfunction formatFullDate(date: Date) {\n return date.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatWeekSummary(start: Date, end: Date) {\n const weekEnd = addUtcDays(end, -1);\n const sameMonth =\n start.getUTCFullYear() === weekEnd.getUTCFullYear() &&\n start.getUTCMonth() === weekEnd.getUTCMonth();\n\n if (sameMonth) {\n const month = start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n });\n return `${month} ${start.getUTCDate()}-${weekEnd.getUTCDate()}, ${weekEnd.getUTCFullYear()}`;\n }\n\n return `${formatFullDate(start)} - ${formatFullDate(weekEnd)}`;\n}\n\nfunction formatPeriodSummary(value: PeriodSelection): string {\n const { start, end } = periodToWindow(value);\n if (value.granularity === \"day\") return formatFullDate(start);\n if (value.granularity === \"week\") return formatWeekSummary(start, end);\n return formatMonthYear(start, \"long\");\n}\n\nfunction viewBounds(\n viewDate: Date,\n granularity: PeriodGranularity,\n): { start: Date; end: Date } {\n if (granularity === \"month\") {\n const start = new Date(Date.UTC(viewDate.getUTCFullYear(), 0, 1));\n return { start, end: addUtcMonths(start, 12) };\n }\n\n const start = new Date(\n Date.UTC(viewDate.getUTCFullYear(), viewDate.getUTCMonth(), 1),\n );\n return { start, end: addUtcMonths(start, 1) };\n}\n\nexport const PeriodPicker: FC<PeriodPickerProps> = ({\n value,\n onChange,\n minDate = new Date(0),\n maxDate,\n trigger,\n header,\n}) => {\n const [open, setOpen] = useState(false);\n const [viewDate, setViewDate] = useState<Date>(() => periodDate(value));\n const [anchorDate, setAnchorDate] = useState<Date>(() => periodDate(value));\n const emittedSelectionRef = useRef<string | null>(null);\n const { granularity, period } = value;\n\n useEffect(() => {\n const currentSelectionKey = selectionKey({ granularity, period });\n if (emittedSelectionRef.current === currentSelectionKey) {\n emittedSelectionRef.current = null;\n return;\n }\n const nextAnchorDate = periodDate({ granularity, period });\n setAnchorDate(nextAnchorDate);\n setViewDate(nextAnchorDate);\n }, [granularity, period]);\n\n const dates = useMemo(() => monthGridDates(viewDate), [viewDate]);\n const selectedWindow = periodToWindow(value);\n const today = startOfUtcDay(maxDate);\n const previousViewDate =\n value.granularity === \"month\"\n ? addUtcMonths(viewDate, -12)\n : addUtcMonths(viewDate, -1);\n const nextViewDate =\n value.granularity === \"month\"\n ? addUtcMonths(viewDate, 12)\n : addUtcMonths(viewDate, 1);\n const previousBounds = viewBounds(previousViewDate, value.granularity);\n const nextBounds = viewBounds(nextViewDate, value.granularity);\n const previousDisabled = previousBounds.end <= minDate;\n const nextDisabled = nextBounds.start > today;\n const summaryLabel = formatPeriodSummary(value);\n\n const commitSelection = (selection: PeriodSelection, anchor: Date) => {\n emittedSelectionRef.current = selectionKey(selection);\n setAnchorDate(anchor);\n setViewDate(anchor);\n onChange(selection);\n };\n\n const setGranularity = (granularity: PeriodGranularity) => {\n commitSelection(periodFromDate(granularity, anchorDate), anchorDate);\n };\n\n const selectDate = (date: Date) => {\n commitSelection(periodFromDate(value.granularity, date), date);\n setOpen(false);\n };\n\n const viewLabel =\n value.granularity === \"month\"\n ? String(viewDate.getUTCFullYear())\n : formatMonthYear(viewDate, \"long\");\n\n return (\n <div\n className={\n trigger\n ? \"polli:contents\"\n : \"polli:flex polli:w-full polli:flex-wrap polli:items-center polli:gap-2\"\n }\n >\n {!trigger && (\n <div className=\"polli:flex polli:flex-wrap polli:gap-1.5\">\n {([\"day\", \"week\", \"month\"] as PeriodGranularity[]).map(\n (granularity) => (\n <TabButton\n key={granularity}\n active={value.granularity === granularity}\n onClick={() => setGranularity(granularity)}\n >\n {granularity[0].toUpperCase() +\n granularity.slice(1)}\n </TabButton>\n ),\n )}\n </div>\n )}\n <Dropdown\n open={open}\n onOpenChange={setOpen}\n className=\"polli:w-[320px] polli:max-w-[calc(100vw-2rem)] polli:rounded-xl polli:border polli:border-divider polli:bg-surface-opaque polli:p-3.5 polli:shadow-lg\"\n trigger={\n trigger ??\n ((isOpen) => (\n <button\n type=\"button\"\n aria-label={`Select period, current ${summaryLabel}`}\n className={cn(\n \"polli-control polli:inline-flex polli:w-[320px] polli:max-w-full polli:items-center polli:justify-between polli:gap-2 polli:rounded-full polli:px-4 polli:py-1.5 polli:text-left polli:text-base polli:font-medium polli:leading-normal\",\n \"polli:bg-theme-bg-active polli:text-theme-text-base\",\n \"polli:transition-all polli:duration-200 polli:ease-out polli:hover:bg-theme-bg-hover\",\n isOpen &&\n \"polli:bg-theme-bg-hover polli:text-theme-text-strong\",\n )}\n >\n <span className=\"polli:truncate\">\n {summaryLabel}\n </span>\n <ChevronIcon expanded={isOpen} />\n </button>\n ))\n }\n >\n {header}\n <div className=\"polli:mb-3 polli:flex polli:items-center polli:justify-between\">\n <button\n type=\"button\"\n aria-label=\"Previous\"\n disabled={previousDisabled}\n onClick={() => setViewDate(previousViewDate)}\n className={cn(\n NAV_BUTTON,\n previousDisabled &&\n \"polli:cursor-not-allowed polli:opacity-30 polli:hover:bg-transparent\",\n )}\n >\n {\"<\"}\n </button>\n <div className=\"polli:text-base polli:font-bold polli:text-theme-text-base\">\n {viewLabel}\n </div>\n <button\n type=\"button\"\n aria-label=\"Next\"\n disabled={nextDisabled}\n onClick={() => setViewDate(nextViewDate)}\n className={cn(\n NAV_BUTTON,\n nextDisabled &&\n \"polli:cursor-not-allowed polli:opacity-30 polli:hover:bg-transparent\",\n )}\n >\n {\">\"}\n </button>\n </div>\n\n {value.granularity === \"month\" ? (\n <div className=\"polli:grid polli:grid-cols-3 polli:gap-1.5\">\n {MONTH_LABELS.map((label, monthIndex) => {\n const date = new Date(\n Date.UTC(\n viewDate.getUTCFullYear(),\n monthIndex,\n 1,\n ),\n );\n const selectable = isPeriodSelectable(\n periodFromDate(\"month\", date),\n minDate,\n today,\n );\n const ariaLabel = date.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"long\",\n year: \"numeric\",\n });\n const selected =\n date.getUTCFullYear() ===\n selectedWindow.start.getUTCFullYear() &&\n date.getUTCMonth() ===\n selectedWindow.start.getUTCMonth();\n return (\n <button\n type=\"button\"\n key={label}\n aria-label={ariaLabel}\n aria-pressed={selected}\n disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli-control polli:rounded-lg polli:px-3 polli:py-2 polli:text-sm polli:font-medium polli:transition-colors polli:duration-150\",\n selected\n ? \"polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:text-ink-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-theme-text-muted polli:hover:bg-transparent\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n ) : (\n <>\n <div className=\"polli:mb-1 polli:grid polli:grid-cols-7 polli:gap-1 polli:text-center polli:text-xs polli:font-bold polli:uppercase polli:text-theme-text-muted\">\n {WEEKDAY_LABELS.map((label) => (\n <div key={label}>{label}</div>\n ))}\n </div>\n <div className=\"polli:grid polli:grid-cols-7 polli:gap-1\">\n {dates.map((date) => {\n const inCurrentMonth =\n date.getUTCMonth() ===\n viewDate.getUTCMonth();\n const selectable = isPeriodSelectable(\n periodFromDate(value.granularity, date),\n minDate,\n today,\n );\n const ariaLabel =\n value.granularity === \"week\"\n ? `Select ${formatPeriodSummary(periodFromDate(\"week\", date))}`\n : `Select ${date.toLocaleDateString(\n \"en-US\",\n {\n timeZone: \"UTC\",\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n },\n )}`;\n const selected =\n value.granularity === \"day\"\n ? sameUtcDay(date, selectedWindow.start)\n : date >= selectedWindow.start &&\n date < selectedWindow.end;\n return (\n <button\n type=\"button\"\n key={date.toISOString()}\n aria-label={ariaLabel}\n aria-pressed={selected}\n disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli-control polli:aspect-square polli:rounded-lg polli:text-sm polli:font-medium polli:transition-colors polli:duration-150\",\n !inCurrentMonth &&\n \"polli:text-theme-text-muted\",\n sameUtcDay(date, today) &&\n \"polli:ring-1 polli:ring-theme-border\",\n selected\n ? \"polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:text-ink-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-theme-text-muted polli:hover:bg-transparent\",\n )}\n >\n {date.getUTCDate()}\n </button>\n );\n })}\n </div>\n </>\n )}\n </Dropdown>\n </div>\n );\n};\n","const MS_PER_DAY = 86400000;\n\nexport type PeriodGranularity = \"day\" | \"week\" | \"month\";\n\nexport type PeriodSelection = {\n granularity: PeriodGranularity;\n period: string;\n};\n\nexport type PeriodWindow = {\n start: Date;\n end: Date;\n};\n\nexport function startOfUtcDay(date = new Date()): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()),\n );\n}\n\nexport function addUtcDays(date: Date, days: number): Date {\n const next = new Date(date);\n next.setUTCDate(next.getUTCDate() + days);\n return next;\n}\n\nfunction startOfUtcMonth(date: Date): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));\n}\n\nfunction addUtcMonths(date: Date, months: number): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1),\n );\n}\n\nfunction startOfUtcIsoWeek(date: Date): Date {\n const day = date.getUTCDay() || 7;\n return addUtcDays(startOfUtcDay(date), 1 - day);\n}\n\nfunction getUtcIsoWeekPeriod(date: Date): string {\n const day = date.getUTCDay() || 7;\n const thursday = addUtcDays(startOfUtcDay(date), 4 - day);\n const isoYear = thursday.getUTCFullYear();\n const yearStart = new Date(Date.UTC(isoYear, 0, 1));\n const isoWeek = Math.ceil(\n ((thursday.getTime() - yearStart.getTime()) / MS_PER_DAY + 1) / 7,\n );\n return `${isoYear}-W${String(isoWeek).padStart(2, \"0\")}`;\n}\n\nfunction formatUtcDatePeriod(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nfunction formatUtcHourPeriod(date: Date): string {\n return date.toISOString().slice(0, 13).replace(\"T\", \" \");\n}\n\nfunction formatUtcMonthPeriod(date: Date): string {\n return date.toISOString().slice(0, 7);\n}\n\nexport function periodFromDate(\n granularity: PeriodGranularity,\n date = new Date(),\n): PeriodSelection {\n if (granularity === \"day\") {\n return {\n granularity,\n period: formatUtcDatePeriod(startOfUtcDay(date)),\n };\n }\n if (granularity === \"week\") {\n return { granularity, period: getUtcIsoWeekPeriod(date) };\n }\n return { granularity, period: formatUtcMonthPeriod(startOfUtcMonth(date)) };\n}\n\nexport function currentPeriod(): PeriodSelection {\n return periodFromDate(\"day\");\n}\n\nexport function periodToWindow(selection: PeriodSelection): PeriodWindow {\n if (selection.granularity === \"day\") {\n const start = new Date(`${selection.period}T00:00:00.000Z`);\n return { start, end: addUtcDays(start, 1) };\n }\n\n if (selection.granularity === \"week\") {\n const [yearText, weekText] = selection.period.split(\"-W\");\n const isoYear = Number(yearText);\n const isoWeek = Number(weekText);\n const jan4 = new Date(Date.UTC(isoYear, 0, 4));\n const start = addUtcDays(startOfUtcIsoWeek(jan4), (isoWeek - 1) * 7);\n return { start, end: addUtcDays(start, 7) };\n }\n\n const [yearText, monthText] = selection.period.split(\"-\");\n const start = new Date(\n Date.UTC(Number(yearText), Number(monthText) - 1, 1),\n );\n return { start, end: addUtcMonths(start, 1) };\n}\n\nexport function getPeriodBucketKeys(selection: PeriodSelection): string[] {\n const { start, end } = periodToWindow(selection);\n const bucketKeys: string[] = [];\n const cursor = new Date(start);\n if (selection.granularity === \"day\") {\n while (cursor < end) {\n bucketKeys.push(`${formatUtcHourPeriod(cursor)}:00:00`);\n cursor.setUTCHours(cursor.getUTCHours() + 1);\n }\n return bucketKeys;\n }\n\n while (cursor < end) {\n bucketKeys.push(formatUtcDatePeriod(cursor));\n cursor.setUTCDate(cursor.getUTCDate() + 1);\n }\n return bucketKeys;\n}\n\nexport function periodBucketKeyToDate(\n bucketKey: string,\n granularity: PeriodGranularity,\n): Date {\n if (granularity === \"day\") {\n return new Date(`${bucketKey.replace(\" \", \"T\")}.000Z`);\n }\n return new Date(`${bucketKey}T00:00:00.000Z`);\n}\n\nexport function isPeriodSelectable(\n selection: PeriodSelection,\n minDate = new Date(0),\n maxDate = startOfUtcDay(),\n): boolean {\n const { start, end } = periodToWindow(selection);\n return end > minDate && start <= maxDate;\n}\n","import type {\n ComponentPropsWithoutRef,\n ElementType,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype TabButtonOwnProps = {\n /** `mixed`: a group toggle where only some of its items are selected. */\n active: boolean | \"mixed\";\n /** Omit when rendering as a link (`as`) and navigation carries the change. */\n onClick?: () => void;\n children: ReactNode;\n size?: \"lg\" | \"md\" | \"sm\" | \"xs\";\n variant?: \"soft\" | \"ghost\";\n /**\n * `amber` and `green` fill the selected pill with the wallet's pale paid\n * and Quest Pollen chip colours, which read at the same strength together.\n */\n intent?: \"neutral\" | \"amber\" | \"green\";\n /** Muted secondary text after the label, e.g. a model's creator. */\n detail?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n};\n\n/**\n * Polymorphic like Button, so a tab that navigates can render a real anchor\n * instead of a click handler — middle-click, right-click and crawlers all\n * depend on that. Defaults to <button>, so existing call sites are unchanged.\n */\nexport type TabButtonProps<T extends ElementType = \"button\"> =\n TabButtonOwnProps & { as?: T } & Omit<\n ComponentPropsWithoutRef<T>,\n keyof TabButtonOwnProps | \"as\"\n >;\n\n/**\n * Shared pill shape (no colors) — used by every TabButton variant.\n *\n * `transition-colors`, not `transition-all`: only background and text colour\n * change between the variants, and `all` additionally animates any layout\n * property that happens to differ — which is the usual cause of a control\n * jittering under the pointer on hover.\n */\nconst tabButtonBaseClass =\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:font-medium polli:leading-normal polli:transition-colors polli:duration-200\";\n\nconst tabButtonSizeClass = {\n xs: \"polli:px-2.5 polli:py-1 polli:text-xs\",\n lg: \"polli:px-5 polli:py-2 polli:text-lg\",\n md: \"polli:px-4 polli:py-1.5 polli:text-base\",\n sm: \"polli:px-3 polli:py-1.5 polli:text-sm\",\n} as const;\n\nconst variantClasses = {\n // The default tab look: borderless and monochrome. Selected uses `bg-active`\n // — the same light resting fill as the site's normal buttons. Both states\n // deepen to `bg-hover` and use the theme's hover label color. Non-selected\n // uses the quiet `bg-subtle` token until then.\n soft: {\n base: \"\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n mixed: \"polli:bg-theme-bg-active/45 polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n inactive:\n \"polli:bg-theme-bg-subtle polli:text-theme-text-base polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n },\n // Transparent until hovered or selected — for multi-select toggles and\n // inline rows where a filled idle pill would read as a hard selection.\n ghost: {\n base: \"polli:border polli:border-transparent\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n mixed: \"polli:bg-theme-bg-active/45 polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n inactive:\n \"polli:bg-transparent polli:text-theme-text-base polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n },\n} as const;\n\n// Wallet chip pairs: selected fills with the pale tint and deep label; hover\n// previews that fill. Unselected green keeps its green label so it stays\n// recognisable next to amber; unselected amber keeps the neutral label.\nconst intentClasses = {\n amber: {\n active: \"polli:bg-paid-pale polli:text-paid-deep\",\n inactive:\n \"polli:bg-transparent polli:text-theme-text-base polli:hover:bg-paid-pale/60\",\n },\n green: {\n active: \"polli:bg-tier-pale polli:text-tier-deep\",\n inactive:\n \"polli:bg-transparent polli:text-tier-deep polli:hover:bg-tier-pale/60\",\n },\n} as const;\n\nexport function TabButton<T extends ElementType = \"button\">({\n as,\n active,\n onClick,\n children,\n size = \"md\",\n variant = \"soft\",\n intent,\n detail,\n ariaLabel,\n disabled = false,\n className,\n ...rest\n}: TabButtonProps<T>) {\n const Component: ElementType = as || \"button\";\n const isButton = Component === \"button\";\n const colors =\n intent === \"neutral\"\n ? variantClasses.soft\n : intent\n ? {\n ...intentClasses[intent],\n mixed: intentClasses[intent].active,\n }\n : variantClasses[variant];\n const handleClick = disabled\n ? (event: ReactMouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }\n : onClick;\n\n return (\n <Component\n {...rest}\n {...(isButton ? { type: \"button\", disabled } : {})}\n {...(!isButton && disabled\n ? { \"aria-disabled\": true, tabIndex: -1 }\n : {})}\n {...(Component === \"a\" && disabled ? { href: undefined } : {})}\n onClick={handleClick}\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n // aria-pressed is for toggles; a link that navigates announces its\n // selected state with aria-current instead.\n {...(isButton\n ? { \"aria-pressed\": active }\n : { \"aria-current\": active === true ? \"page\" : undefined })}\n className={cn(\n tabButtonBaseClass,\n variantClasses[variant].base,\n active === \"mixed\"\n ? colors.mixed\n : active\n ? colors.active\n : colors.inactive,\n disabled &&\n \"polli:pointer-events-none polli:cursor-not-allowed polli:opacity-50\",\n tabButtonSizeClass[size],\n className,\n )}\n >\n {children}\n {detail != null && (\n <span className=\"polli:ml-1 polli:font-normal polli:opacity-70\">\n {detail}\n </span>\n )}\n </Component>\n );\n}\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Surface } from \"../primitives/Surface.tsx\";\nimport { Heading, Text } from \"../primitives/Typography.tsx\";\n\nexport type SectionProps = {\n title: string;\n id?: string;\n framed?: boolean;\n intro?: ReactNode;\n action?: ReactNode;\n actionClassName?: string;\n panelClassName?: string;\n titleClassName?: string;\n children: ReactNode;\n className?: string;\n};\n\nexport const Section: FC<SectionProps> = ({\n title,\n id,\n framed = true,\n intro,\n action,\n actionClassName,\n panelClassName,\n titleClassName,\n children,\n className,\n}) => {\n const body = (\n <>\n {intro && (\n <Text as=\"div\" className=\"polli:max-w-2xl\">\n {intro}\n </Text>\n )}\n {children}\n </>\n );\n\n const content = (\n <>\n <header className=\"polli:flex polli:flex-wrap polli:items-center polli:justify-between polli:gap-3\">\n <Heading\n as=\"h2\"\n size=\"section\"\n className={cn(\"polli:text-left\", titleClassName)}\n >\n {title}\n </Heading>\n {action && (\n <div className={cn(\"polli:shrink-0\", actionClassName)}>\n {action}\n </div>\n )}\n </header>\n {body}\n </>\n );\n\n return (\n <section id={id} className={cn(\"polli:scroll-mt-10\", className)}>\n {framed ? (\n <Surface\n variant=\"panel\"\n className={cn(\n \"polli:flex polli:flex-col polli:gap-5\",\n panelClassName,\n )}\n >\n {content}\n </Surface>\n ) : (\n <div className=\"polli:flex polli:flex-col polli:gap-4\">\n {content}\n </div>\n )}\n </section>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\n/**\n * - `stat` — large numeric value (default)\n * - `fact` — small wrapping prose value (labeled fact tile)\n */\ntype StatCardVariant = \"stat\" | \"fact\";\n\nconst valueVariantClasses: Record<StatCardVariant, string> = {\n stat: \"polli:min-h-8 polli:text-2xl polli:font-bold polli:leading-tight polli:tabular-nums polli:text-theme-text-base\",\n fact: \"polli:text-sm polli:leading-6 polli:text-theme-text-soft\",\n};\n\nexport type StatCardProps = {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n variant?: StatCardVariant;\n className?: string;\n labelClassName?: string;\n valueClassName?: string;\n detailClassName?: string;\n};\n\nexport const StatCard: FC<StatCardProps> = ({\n label,\n value,\n detail,\n variant = \"stat\",\n className,\n labelClassName,\n valueClassName,\n detailClassName,\n}) => (\n <div className={cn(\"polli:text-sm\", className)}>\n <Text\n as=\"div\"\n size=\"micro\"\n tone=\"soft\"\n weight=\"bold\"\n className={cn(\n \"polli:uppercase polli:tracking-wide\",\n labelClassName,\n )}\n >\n {label}\n </Text>\n <div\n className={cn(\n \"polli:mt-1 polli:break-words\",\n valueVariantClasses[variant],\n valueClassName,\n )}\n >\n {value}\n </div>\n {detail && (\n <Text\n as=\"div\"\n size=\"xs\"\n tone=\"soft\"\n className={cn(\"polli:mt-2\", detailClassName)}\n >\n {detail}\n </Text>\n )}\n </div>\n);\n","import { Fragment, type ReactNode, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { InlineLink } from \"../primitives/InlineLink.tsx\";\nimport {\n CheckIcon,\n ClockIcon,\n ToolIcon,\n XIcon,\n} from \"../primitives/icons/index.tsx\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\nexport type ToolCallStatus =\n | \"pending\"\n | \"running\"\n | \"approval-requested\"\n | \"approval-responded\"\n | \"complete\"\n | \"error\"\n | \"denied\";\n\nexport interface ToolCallDetailsProps {\n name: string;\n input?: unknown;\n output?: unknown;\n error?: unknown;\n status?: ToolCallStatus;\n defaultOpen?: boolean;\n className?: string;\n}\n\nfunction formattedValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction linkedValue(value: unknown): ReactNode[] {\n const formatted = formattedValue(value);\n const segments = formatted.split(/(https:\\/\\/[^\\s\"\\\\]+)/g);\n let offset = 0;\n return segments.map((segment, index) => {\n const key = `${offset}:${segment}`;\n offset += segment.length;\n if (!segment.startsWith(\"https://\")) return segment;\n\n let href = segment;\n const quotedUrl =\n segments[index - 1]?.endsWith('\"') &&\n segments[index + 1]?.startsWith('\"');\n let extraClosingParens =\n (href.match(/\\)/g)?.length ?? 0) - (href.match(/\\(/g)?.length ?? 0);\n // Keep balanced URL parentheses, but leave prose delimiters outside the link.\n while (\n !quotedUrl &&\n (/[.,!?;:]$/.test(href) ||\n (href.endsWith(\")\") && extraClosingParens > 0))\n ) {\n if (href.endsWith(\")\")) extraClosingParens--;\n href = href.slice(0, -1);\n }\n return (\n <Fragment key={key}>\n <InlineLink href={href}>{href}</InlineLink>\n {segment.slice(href.length)}\n </Fragment>\n );\n });\n}\n\nfunction ToolValue({\n value,\n error = false,\n}: {\n value: unknown;\n error?: boolean;\n}) {\n return (\n <pre\n className={cn(\n \"polli:max-h-72 polli:overflow-auto polli:whitespace-pre-wrap polli:break-words polli:rounded-lg polli:border polli:p-3 polli:text-xs polli:leading-relaxed\",\n error\n ? \"polli:border-intent-danger-border/30 polli:bg-intent-danger-bg-light polli:text-intent-danger-text\"\n : \"polli:border-theme-border/20 polli:bg-theme-bg-pale polli:text-theme-text-base\",\n )}\n >\n {linkedValue(value)}\n </pre>\n );\n}\n\nconst STATUS_LABELS: Record<ToolCallStatus, string> = {\n pending: \"Pending\",\n running: \"Running\",\n \"approval-requested\": \"Awaiting approval\",\n \"approval-responded\": \"Responded\",\n complete: \"Completed\",\n error: \"Error\",\n denied: \"Denied\",\n};\n\nfunction ToolStatus({ status }: { status: ToolCallStatus }) {\n const icon =\n status === \"complete\" || status === \"approval-responded\" ? (\n <CheckIcon className=\"polli:size-3\" />\n ) : status === \"error\" || status === \"denied\" ? (\n <XIcon className=\"polli:size-3\" />\n ) : (\n <ClockIcon\n className={cn(\n \"polli:size-3\",\n status === \"running\" && \"polli:animate-pulse\",\n )}\n />\n );\n return (\n <span\n data-status={status}\n className={cn(\n \"polli:ml-auto polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-full polli:px-2 polli:py-1 polli:text-[11px] polli:font-semibold\",\n status === \"complete\" || status === \"approval-responded\"\n ? \"polli:bg-theme-bg-active polli:text-intent-success-text\"\n : status === \"error\" || status === \"denied\"\n ? \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\"\n : \"polli:bg-intent-info-bg-light polli:text-intent-info-text\",\n )}\n >\n {icon}\n {STATUS_LABELS[status]}\n </span>\n );\n}\n\n/** Framework-neutral disclosure for server- or client-executed tool calls. */\nexport function ToolCallDetails({\n name,\n input,\n output,\n error,\n status = error === undefined ? \"complete\" : \"error\",\n defaultOpen = false,\n className,\n}: ToolCallDetailsProps) {\n const result = error === undefined ? output : error;\n const [open, setOpen] = useState(defaultOpen);\n return (\n <div\n data-tool-status={status}\n className={cn(\n \"polli:overflow-hidden polli:rounded-xl polli:border polli:border-theme-border/35 polli:bg-surface-opaque\",\n className,\n )}\n >\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n className=\"polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:gap-2 polli:px-3 polli:py-2.5 polli:text-left polli:hover:bg-theme-bg-hover/50\"\n >\n <span className=\"polli:flex polli:size-7 polli:shrink-0 polli:items-center polli:justify-center polli:rounded-lg polli:bg-theme-bg-active polli:text-theme-text-strong\">\n <ToolIcon className=\"polli:size-3.5\" />\n </span>\n <code className=\"polli:min-w-0 polli:truncate polli:text-xs polli:font-semibold polli:text-theme-text-strong\">\n {name}\n </code>\n <ToolStatus status={status} />\n <ChevronIcon\n expanded={open}\n className=\"polli:size-4 polli:shrink-0 polli:text-theme-text-soft\"\n />\n </button>\n {open && (\n <div className=\"polli:flex polli:flex-col polli:gap-4 polli:border-theme-border/30 polli:border-t polli:bg-theme-bg-pale/35 polli:px-3 polli:py-3\">\n {input !== undefined && (\n <div className=\"polli:flex polli:flex-col polli:gap-1\">\n <Text size=\"xs\" tone=\"muted\" weight=\"bold\">\n Parameters\n </Text>\n <ToolValue value={input} />\n </div>\n )}\n {result !== undefined && (\n <div className=\"polli:flex polli:flex-col polli:gap-1\">\n <Text size=\"xs\" tone=\"muted\" weight=\"bold\">\n {error === undefined ? \"Result\" : \"Error\"}\n </Text>\n <ToolValue\n value={result}\n error={error !== undefined}\n />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { PropsWithChildren } from \"react\";\nimport { isExternalHref } from \"../lib/link.ts\";\nimport { ExternalLinkIcon } from \"./icons/index.tsx\";\n\ntype BaseInlineLinkProps = {\n /** Set explicitly for non-http external links, or false for custom routing components. */\n external?: boolean;\n showIcon?: boolean;\n /** Inline text inherits its size; footers use 13px and standalone links 14px. */\n size?: \"inherit\" | \"footer\" | \"sm\";\n /** Accent for prominent links; quiet for secondary navigation. */\n tone?: \"accent\" | \"quiet\";\n className?: string;\n};\n\nexport type InlineLinkProps<T extends React.ElementType = \"a\"> =\n PropsWithChildren<BaseInlineLinkProps> & {\n as?: T;\n } & Omit<\n React.ComponentPropsWithoutRef<T>,\n keyof BaseInlineLinkProps | \"as\"\n >;\n\n/** Shared text-link rule: surrounding font, selectable ink, persistent underline,\n * visible keyboard focus, and an external arrow only when leaving the app.\n * Navigation and button-shaped actions use their own primitives.\n */\nexport function InlineLink<T extends React.ElementType = \"a\">({\n as,\n external,\n showIcon = true,\n size = \"inherit\",\n tone = \"accent\",\n className,\n children,\n ...linkProps\n}: InlineLinkProps<T>) {\n const Component: React.ElementType = as || \"a\";\n const isExternal =\n external ?? isExternalHref((linkProps as { href?: unknown }).href);\n\n return (\n <Component\n target={isExternal && as !== \"button\" ? \"_blank\" : undefined}\n rel={\n isExternal && as !== \"button\"\n ? \"noopener noreferrer\"\n : undefined\n }\n className={[\"polli-link\", className].filter(Boolean).join(\" \")}\n data-size={size}\n data-tone={tone}\n {...linkProps}\n >\n {children}\n {showIcon && isExternal && (\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli-link-external-icon\"\n />\n )}\n </Component>\n );\n}\n","import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/** Class merge for apps consuming the unprefixed Tailwind bridge in app.css. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import { useEffect } from \"react\";\n\n/**\n * Locks page scroll while enabled and restores the original overflow values on\n * cleanup.\n */\nexport function useScrollLock(enabled = true): void {\n useEffect(() => {\n if (!enabled) return;\n\n const originalBody = document.body.style.overflow;\n const originalHtml = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = originalBody;\n document.documentElement.style.overflow = originalHtml;\n };\n }, [enabled]);\n}\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type ButtonGroupProps = ComponentPropsWithoutRef<\"div\">;\n\nexport const ButtonGroup: FC<ButtonGroupProps> = ({\n className,\n children,\n role = \"group\",\n ...rest\n}) => (\n <div\n {...rest}\n role={role}\n className={cn(\n \"polli:flex polli:min-w-0 polli:flex-wrap polli:items-center polli:gap-1.5\",\n className,\n )}\n >\n {children}\n </div>\n);\n","import { type FC, useSyncExternalStore } from \"react\";\nimport { MoonIcon, SunIcon } from \"./icons/index.tsx\";\nimport { Switch } from \"./Switch.tsx\";\n\n/**\n * Light/dark colour mode. The chosen mode is reflected as `class=\"dark\"` on\n * <html>, which flips the design-system tokens (see styles/tokens.css: `.dark`\n * + `.dark [data-theme]`). One shared module-level store backs every\n * `useColorMode()` consumer, so duplicate toggles never desync and changes\n * propagate across tabs.\n *\n * The chosen mode is persisted to localStorage (per-origin), which also powers\n * the cross-tab `storage` sync below. Read priority: localStorage → system\n * preference. Choosing the mode the system already uses clears the stored\n * choice, so later visits follow the system again.\n *\n * Host apps should set the initial class pre-paint (a tiny inline script in the\n * document head, reading the same key) to avoid a flash of light before React\n * mounts; this store is the source of truth after hydration.\n *\n * Side-effect-free on import: the <html> sync and the cross-tab listener are\n * attached lazily on first subscribe, so importing this module (e.g. via the\n * package barrel) never mutates the DOM on its own.\n */\ntype ColorMode = \"light\" | \"dark\";\n\nconst STORAGE_KEY = \"polli-color-mode\";\n\nfunction readStored(): ColorMode | null {\n try {\n const value = localStorage.getItem(STORAGE_KEY);\n return value === \"light\" || value === \"dark\" ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction systemMode(): ColorMode {\n return typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches === true\n ? \"dark\"\n : \"light\";\n}\n\nlet current: ColorMode = readStored() ?? systemMode();\nconst listeners = new Set<() => void>();\n\nfunction apply(): void {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"dark\", current === \"dark\");\n syncThemeColor();\n}\n\n// Match the browser chrome (theme-color) to the resolved desk color by reading\n// the computed --polli-color-app-bg token — never a hardcoded value. Runs on\n// mount / mode change, after styles load, so the token resolves per mode.\nfunction syncThemeColor(): void {\n if (typeof document === \"undefined\") return;\n const appBg = getComputedStyle(document.documentElement)\n .getPropertyValue(\"--polli-color-app-bg\")\n .trim();\n if (!appBg) return;\n let meta = document.querySelector('meta[name=\"theme-color\"]');\n if (!meta) {\n meta = document.createElement(\"meta\");\n meta.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(meta);\n }\n meta.setAttribute(\"content\", appBg);\n}\n\nfunction emit(): void {\n for (const listener of listeners) listener();\n}\n\nfunction handleStorage(event: StorageEvent): void {\n if (event.key !== STORAGE_KEY) return;\n const next = readStored() ?? systemMode();\n if (next === current) return;\n current = next;\n apply();\n emit();\n}\n\nfunction subscribe(listener: () => void): () => void {\n if (listeners.size === 0 && typeof window !== \"undefined\") {\n apply(); // safety-net sync once a consumer mounts\n window.addEventListener(\"storage\", handleStorage);\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0 && typeof window !== \"undefined\") {\n window.removeEventListener(\"storage\", handleStorage);\n }\n };\n}\n\nfunction getSnapshot(): ColorMode {\n return current;\n}\n\nfunction getServerSnapshot(): ColorMode {\n return \"light\";\n}\n\n/**\n * Set the color mode programmatically. Updates the shared store (so every\n * `useColorMode()` consumer re-renders), flips the `.dark` class, and persists\n * to localStorage, or clears it when the mode matches the system.\n */\nexport function setColorMode(mode: ColorMode): void {\n if (mode === current) return;\n current = mode;\n apply();\n try {\n if (mode === systemMode()) localStorage.removeItem(STORAGE_KEY);\n else localStorage.setItem(STORAGE_KEY, mode);\n } catch {\n // ignore write failures (private mode / storage disabled)\n }\n emit();\n}\n\nexport function useColorMode(): {\n mode: ColorMode;\n isDark: boolean;\n toggle: () => void;\n} {\n const mode = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot,\n );\n return {\n mode,\n isDark: mode === \"dark\",\n toggle: () => setColorMode(mode === \"dark\" ? \"light\" : \"dark\"),\n };\n}\n\n/**\n * Sliding sun/moon switch: `Switch` as a two-way choice, so the track stays\n * neutral and the thumb carries the active mode's icon. Self-contained —\n * wires itself to `useColorMode`.\n */\nexport const ColorModeToggle: FC = () => {\n const { isDark, toggle } = useColorMode();\n return (\n <Switch\n checked={isDark}\n onChange={toggle}\n ariaLabel=\"Toggle dark mode\"\n size=\"sm\"\n icons={{ off: <SunIcon />, on: <MoonIcon /> }}\n />\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type SwitchStatus = \"off\" | \"on\" | \"invalid\";\nexport type SwitchSize = \"sm\" | \"md\" | \"lg\";\n\nexport type SwitchProps = {\n checked: boolean;\n onChange: (next: boolean) => void;\n /** Track colour. Defaults to `checked ? \"on\" : \"off\"`. */\n status?: SwitchStatus;\n /** Accessible label (aria-label). Not rendered visibly. */\n ariaLabel?: string;\n disabled?: boolean;\n /** Same heights as `Button` sm / md / lg, so a switch lines up with one. */\n size?: SwitchSize;\n /**\n * A two-way choice (light/dark) rather than on/off: the thumb carries the\n * current side's icon, the other sits faint on the empty side, and the\n * track looks the same in both positions.\n */\n icons?: { off: ReactNode; on: ReactNode };\n className?: string;\n};\n\n// Heights match Button (min-h-7 / 9 / 12). The thumb sits 3px inside a 1px\n// border on every side, so its travel is the inner width minus both insets\n// and itself.\nconst sizes: Record<\n SwitchSize,\n {\n track: string;\n thumb: string;\n travel: string;\n icon: string;\n ghostOff: string;\n ghostOn: string;\n }\n> = {\n sm: {\n track: \"polli:h-7 polli:w-[52px]\",\n thumb: \"polli:h-5 polli:w-5\",\n travel: \"polli:translate-x-6\",\n icon: \"polli:h-3.5 polli:w-3.5\",\n ghostOff: \"polli:right-2\",\n ghostOn: \"polli:left-2\",\n },\n md: {\n track: \"polli:h-9 polli:w-16\",\n thumb: \"polli:h-7 polli:w-7\",\n travel: \"polli:translate-x-7\",\n icon: \"polli:h-4 polli:w-4\",\n ghostOff: \"polli:right-[9px]\",\n ghostOn: \"polli:left-[9px]\",\n },\n lg: {\n track: \"polli:h-12 polli:w-[88px]\",\n thumb: \"polli:h-10 polli:w-10\",\n travel: \"polli:translate-x-10\",\n icon: \"polli:h-5 polli:w-5\",\n ghostOff: \"polli:right-[13px]\",\n ghostOn: \"polli:left-[13px]\",\n },\n};\n\n// On/off reads at a glance: grey when off, the palette's own green (the Quest\n// card's) when on, red when on but needing attention. A two-way choice\n// (icons, the light/dark toggle) keeps its neutral look: a page-coloured\n// thumb carrying the accent icon on a plain track.\ntype SwitchLook = SwitchStatus | \"choice\";\nconst trackClasses: Record<SwitchLook, string> = {\n off: \"polli:border-theme-text-strong/15 polli:bg-theme-bg-subtle polli:hover:border-theme-text-strong/30\",\n on: \"polli:border-tier-soft polli:bg-tier-soft\",\n invalid: \"polli:border-intent-danger-text polli:bg-intent-danger-bg-light\",\n choice: \"polli:border-theme-text-strong/10 polli:bg-surface-opaque\",\n};\nconst thumbClasses: Record<SwitchLook, string> = {\n off: \"polli:bg-theme-text-muted/60 polli:text-app-bg\",\n on: \"polli:bg-intent-success-text-on-bright\",\n invalid: \"polli:bg-intent-danger-text polli:text-app-bg\",\n choice: \"polli:bg-app-bg polli:text-theme-text-soft\",\n};\n\n/**\n * Binary toggle, in `Button`'s sizes: grey off, green on. `checked` moves the thumb;\n * `status` colours it, so `checked status=\"invalid\"` is thumb-right in red.\n * With `icons` it is a two-way choice with a solid thumb on both sides.\n */\nexport const Switch: FC<SwitchProps> = ({\n checked,\n onChange,\n status,\n ariaLabel,\n disabled = false,\n size = \"md\",\n icons,\n className,\n}) => {\n const geometry = sizes[size];\n const look: SwitchLook = icons\n ? \"choice\"\n : (status ?? (checked ? \"on\" : \"off\"));\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={\n ariaLabel ?? (checked ? \"Turn off toggle\" : \"Turn on toggle\")\n }\n onClick={() => onChange(!checked)}\n disabled={disabled}\n className={cn(\n \"polli-control polli:relative polli:inline-block polli:shrink-0 polli:cursor-pointer polli:rounded-full polli:border polli:transition-colors polli:disabled:cursor-not-allowed polli:disabled:opacity-60\",\n geometry.track,\n trackClasses[look],\n className,\n )}\n >\n {icons && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"polli:absolute polli:top-1/2 polli:flex polli:-translate-y-1/2 polli:text-theme-text-strong/40 polli:[&>svg]:h-full polli:[&>svg]:w-full\",\n geometry.icon,\n checked ? geometry.ghostOn : geometry.ghostOff,\n )}\n >\n {checked ? icons.off : icons.on}\n </span>\n )}\n <span\n className={cn(\n \"polli:absolute polli:top-1/2 polli:left-[3px] polli:flex polli:-translate-y-1/2 polli:items-center polli:justify-center polli:rounded-full polli:transition-[transform,background-color]\",\n geometry.thumb,\n thumbClasses[look],\n checked ? geometry.travel : \"polli:translate-x-0\",\n )}\n >\n {icons && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"polli:flex polli:[&>svg]:h-full polli:[&>svg]:w-full\",\n geometry.icon,\n )}\n >\n {checked ? icons.on : icons.off}\n </span>\n )}\n </span>\n </button>\n );\n};\n","import { Dialog as ArkDialog } from \"@ark-ui/react/dialog\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { FC, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type DrawerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n ariaLabel: string;\n children: ReactNode;\n side?: \"left\" | \"right\";\n contentClassName?: string;\n};\n\n/** Accessible side drawer for mobile navigation and compact tools. */\nexport const Drawer: FC<DrawerProps> = ({\n open,\n onOpenChange,\n ariaLabel,\n children,\n side = \"left\",\n contentClassName,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <ArkDialog.Root\n open={open}\n initialFocusEl={() => contentRef.current}\n onOpenChange={(details) => onOpenChange(details.open)}\n >\n <Portal>\n <ArkDialog.Backdrop className=\"polli:fixed polli:inset-0 polli:z-[100] polli:bg-[#000]/40 polli:backdrop-blur-sm\" />\n <ArkDialog.Positioner className=\"polli:pointer-events-none polli:fixed polli:inset-0 polli:z-[110] polli:h-dvh polli:overflow-hidden\">\n <ArkDialog.Content\n ref={contentRef}\n aria-label={ariaLabel}\n className={cn(\n \"polli:pointer-events-auto polli:flex polli:h-dvh polli:w-[min(20rem,86vw)] polli:flex-col polli:overflow-hidden polli:border-theme-text-strong/10 polli:bg-app-bg polli:outline-none\",\n side === \"right\"\n ? \"polli:ml-auto polli:border-l\"\n : \"polli:border-r\",\n contentClassName,\n )}\n >\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n );\n};\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype BaseDropdownItemProps = {\n className?: string;\n};\n\nexport type DropdownItemProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseDropdownItemProps> & {\n as?: T;\n } & Omit<\n React.ComponentPropsWithoutRef<T>,\n keyof BaseDropdownItemProps | \"as\"\n >;\n\nexport function DropdownItem<T extends React.ElementType = \"button\">({\n as,\n className,\n children,\n ...rest\n}: DropdownItemProps<T>) {\n const Component: React.ElementType = as || \"button\";\n return (\n <Component\n {...(Component === \"button\" ? { type: \"button\" } : undefined)}\n {...rest}\n className={cn(\n \"polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:gap-2 polli:rounded-lg polli:bg-transparent polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:text-theme-text-base polli:no-underline polli:transition-colors polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover polli:focus-visible:bg-theme-bg-hover\",\n className,\n )}\n >\n {children}\n </Component>\n );\n}\n","import type { ReactNode } from \"react\";\n\n/** Compact status for both initial loading and background updates. */\nexport function LoadingStatus({ children }: { children: ReactNode }) {\n return (\n <output className=\"polli:flex polli:items-center polli:gap-2 polli:font-body polli:text-sm polli:text-theme-text-muted\">\n <span\n aria-hidden=\"true\"\n className=\"polli:h-4 polli:w-4 polli:shrink-0 polli:animate-spin polli:motion-reduce:animate-none polli:rounded-full polli:border-2 polli:border-current polli:border-r-transparent\"\n />\n {children}\n </output>\n );\n}\n","import { type CSSProperties, forwardRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst toNumber = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n const numericValue = Number(value);\n return Number.isFinite(numericValue) ? numericValue : undefined;\n};\n\nconst clampPercent = (value: number): number =>\n Math.min(100, Math.max(0, value));\n\nconst getProgressPercent = ({\n progress,\n value,\n defaultValue,\n min,\n max,\n}: {\n progress?: number;\n value: React.ComponentPropsWithoutRef<\"input\">[\"value\"];\n defaultValue: React.ComponentPropsWithoutRef<\"input\">[\"defaultValue\"];\n min: React.ComponentPropsWithoutRef<\"input\">[\"min\"];\n max: React.ComponentPropsWithoutRef<\"input\">[\"max\"];\n}): number | undefined => {\n if (typeof progress === \"number\" && Number.isFinite(progress)) {\n return clampPercent(progress);\n }\n\n const numericValue = toNumber(value ?? defaultValue);\n if (numericValue === undefined) return undefined;\n\n const numericMin = toNumber(min) ?? 0;\n const numericMax = toNumber(max) ?? 100;\n if (numericMax <= numericMin) return 100;\n\n return clampPercent(\n ((numericValue - numericMin) / (numericMax - numericMin)) * 100,\n );\n};\n\nexport type SliderProps = Omit<\n React.ComponentPropsWithoutRef<\"input\">,\n \"type\"\n> & {\n /** Fill percentage from 0-100. Falls back to value/min/max when omitted. */\n progress?: number;\n};\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\n (\n { className, defaultValue, max, min, progress, style, value, ...props },\n ref,\n ) => {\n const progressPercent = getProgressPercent({\n progress,\n value,\n defaultValue,\n min,\n max,\n });\n const sliderStyle = {\n ...style,\n ...(progressPercent === undefined\n ? null\n : { \"--polli-slider-progress\": `${progressPercent}%` }),\n } as CSSProperties;\n\n return (\n <input\n ref={ref}\n type=\"range\"\n min={min}\n max={max}\n value={value}\n defaultValue={defaultValue}\n style={sliderStyle}\n className={cn(\"polli-slider\", className)}\n {...props}\n />\n );\n },\n);\n","import type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype Align = \"left\" | \"center\" | \"right\";\ntype RowIntent = \"default\" | \"warning\" | \"danger\";\ntype SortDirection = \"asc\" | \"desc\";\n\nconst alignClasses: Record<Align, string> = {\n left: \"polli:text-left\",\n center: \"polli:text-center\",\n right: \"polli:text-right\",\n};\n\nconst rowIntentClasses: Record<RowIntent, string> = {\n default: \"\",\n warning: \"polli:bg-intent-warning-bg-light/65\",\n danger: \"polli:bg-intent-danger-bg-light/65\",\n};\n\nexport type TableProps = ComponentPropsWithoutRef<\"table\">;\n\nexport const Table: FC<TableProps> = ({ className, ...rest }) => (\n <table\n {...rest}\n className={cn(\n \"polli:w-full polli:border-collapse polli:text-sm\",\n className,\n )}\n />\n);\n\nexport type TableHeadProps = ComponentPropsWithoutRef<\"thead\">;\n\nexport const TableHead: FC<TableHeadProps> = ({ className, ...rest }) => (\n <thead\n {...rest}\n className={cn(\n \"polli:bg-transparent polli:text-micro polli:text-theme-text-muted\",\n className,\n )}\n />\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\"> & {\n divider?: \"themed\" | \"neutral\";\n};\n\nexport const TableBody: FC<TableBodyProps> = ({\n className,\n divider = \"themed\",\n ...rest\n}) => (\n <tbody\n {...rest}\n className={cn(\n \"polli:divide-y\",\n divider === \"neutral\"\n ? \"polli:divide-divider\"\n : \"polli:divide-theme-border/65\",\n className,\n )}\n />\n);\n\nexport type TableRowProps = ComponentPropsWithoutRef<\"tr\"> & {\n intent?: RowIntent;\n};\n\nexport const TableRow: FC<TableRowProps> = ({\n intent = \"default\",\n className,\n ...rest\n}) => (\n <tr\n {...rest}\n className={cn(\n \"polli:transition-colors polli:hover:bg-theme-bg-subtle\",\n rowIntentClasses[intent],\n className,\n )}\n />\n);\n\nexport type TableHeaderCellProps = Omit<\n ComponentPropsWithoutRef<\"th\">,\n \"children\"\n> & {\n align?: Align;\n active?: boolean;\n sortDirection?: SortDirection;\n onSort?: () => void;\n children: ReactNode;\n};\n\nexport const TableHeaderCell: FC<TableHeaderCellProps> = ({\n align = \"left\",\n active = false,\n sortDirection,\n onSort,\n className,\n children,\n ...rest\n}) => {\n const content = (\n <>\n <span>{children}</span>\n {onSort && (\n <span\n aria-hidden=\"true\"\n className=\"polli:inline-flex polli:w-3 polli:justify-center\"\n >\n {active && sortDirection\n ? sortDirection === \"asc\"\n ? \"↑\"\n : \"↓\"\n : \"\"}\n </span>\n )}\n </>\n );\n\n const classes = cn(\n \"polli:px-3 polli:py-2 polli:font-bold polli:normal-case polli:tracking-wide\",\n alignClasses[align],\n active && \"polli:text-theme-text-strong\",\n onSort &&\n \"polli:cursor-pointer polli:select-none polli:hover:text-theme-text-strong\",\n className,\n );\n\n if (!onSort) {\n return (\n <th {...rest} className={classes}>\n {content}\n </th>\n );\n }\n\n return (\n <th\n {...rest}\n aria-sort={\n active && sortDirection\n ? sortDirection === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n }\n className={classes}\n >\n <button\n type=\"button\"\n onClick={onSort}\n className={cn(\n \"polli-control polli:inline-flex polli:w-full polli:items-center polli:gap-1 polli:bg-transparent polli:p-0 polli:font-bold polli:text-inherit\",\n align === \"right\" && \"polli:justify-end\",\n align === \"center\" && \"polli:justify-center\",\n )}\n >\n {content}\n </button>\n </th>\n );\n};\n\nexport type TableCellProps = ComponentPropsWithoutRef<\"td\"> & {\n align?: Align;\n numeric?: boolean;\n muted?: boolean;\n};\n\nexport const TableCell: FC<TableCellProps> = ({\n align = \"left\",\n numeric = false,\n muted = false,\n className,\n ...rest\n}) => (\n <td\n {...rest}\n className={cn(\n \"polli:px-3 polli:py-2 polli:align-middle\",\n alignClasses[align],\n numeric && \"polli:tabular-nums\",\n muted && \"polli:text-theme-text-muted\",\n className,\n )}\n />\n);\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"./ChevronIcon.tsx\";\n\nexport type TableDisclosureButtonProps = {\n children: ReactNode;\n disabled?: boolean;\n expanded: boolean;\n onClick: () => void;\n className?: string;\n};\n\n/** Compact disclosure trigger for expandable table rows. */\nexport const TableDisclosureButton: FC<TableDisclosureButtonProps> = ({\n children,\n disabled = false,\n expanded,\n onClick,\n className,\n}) => (\n <button\n type=\"button\"\n aria-expanded={expanded}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"polli-control polli:inline-flex polli:items-center polli:gap-1.5 polli:rounded-sm polli:text-left polli:text-theme-text-strong polli:transition-colors\",\n disabled\n ? \"polli:cursor-default polli:opacity-60\"\n : \"polli:cursor-pointer polli:hover:text-theme-text-soft\",\n className,\n )}\n >\n <ChevronIcon\n expanded={expanded}\n className=\"polli:text-theme-text-soft\"\n />\n {children}\n </button>\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,IAAAC,gBAAsB;;;ACDtB,kBAAqB;AACrB,4BAAoC;AAEpC,IAAM,cAAU,2CAAoB,EAAE,QAAQ,QAAQ,CAAC;AAGhD,SAAS,MAAM,QAA+C;AACjE,SAAO,YAAQ,kBAAK,GAAG,MAAM,CAAC;AAClC;;;ACiBQ;AAZD,IAAM,cAAoC,CAAC,EAAE,UAAU,UAAU,MACpE;AAAA,EAAC;AAAA;AAAA,IACG,eAAY;AAAA,IACZ,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IACJ;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,MAAK;AAAA,QACL,QAAO;AAAA,QACP,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,aAAY;AAAA;AAAA,IAChB;AAAA;AACJ;;;ACjCJ,qBAAwB;AACxB,oBAAuB;AAEvB,mBAAgC;AA8CxB,IAAAC,sBAAA;AA3CR,IAAM,gBAAgB;AAqBf,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,gBAAY,oBAAM;AACxB,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AACtD,QAAM,eAAe,aAAa;AAClC,QAAM,OAAO,eAAe,WAAW;AAEvC,QAAM,UAAU,CAAC,SAAkB;AAC/B,QAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,mBAAe,IAAI;AAAA,EACvB;AAEA,SACI;AAAA,IAAC,uBAAQ;AAAA,IAAR;AAAA,MACG,KAAK,EAAE,SAAS,UAAU;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,cAAc,CAAC,YAAY,QAAQ,QAAQ,IAAI;AAAA,MAC/C,aAAa;AAAA,QACT,WAAW,GAAG,IAAI,IAAI,KAAK;AAAA,QAC3B,UAAU,YAAY,aAAa;AAAA,MACvC;AAAA,MAEA;AAAA,qDAAC,uBAAQ,SAAR,EAAgB,SAAO,MAAE,kBAAQ,IAAI,GAAE;AAAA,QACxC,6CAAC,wBAAO,UAAU,CAAC,WACf,uDAAC,uBAAQ,YAAR,EACG;AAAA,UAAC,uBAAQ;AAAA,UAAR;AAAA,YACG,mBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,WAAW;AAAA,cACP;AAAA,cACA;AAAA,cACA;AAAA,YACJ;AAAA,YAEC,iBAAO,aAAa,aACf,SAAS,MAAM,QAAQ,KAAK,CAAC,IAC7B;AAAA;AAAA,QACV,GACJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;ACnEQ,IAAAC,sBAAA;AAVR,IAAM,cAAc;AAAA,EAChB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AACpB;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI;AAAA,IAC7B,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,eAAe,OAAkB;AAC7C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,yBAAwB,GACpC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,UAAS;AAAA,IACjB,6CAAC,UAAK,GAAE,kEAAiE;AAAA,IACzE,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,aAAY;AAAA,IACpB,6CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,mBAAkB;AAAA,IAC1B,6CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,4CAA2C;AAAA,IACnD,6CAAC,UAAK,GAAE,8CAA6C;AAAA,KACzD;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,8BAA6B;AAAA,IACrC,6CAAC,UAAK,GAAE,0BAAyB;AAAA,IACjC,6CAAC,UAAK,GAAE,gEAA+D;AAAA,IACvE,6CAAC,UAAK,GAAE,mIAAkI;AAAA,KAC9I;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAY;AAAA,MACZ,SAAQ;AAAA,MACP,GAAG;AAAA,MACJ,aAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,uDAAC,cAAS,QAAO,kBAAiB;AAAA;AAAA,EACtC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,2DAA0D;AAAA,KACtE;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,eAAc;AAAA,KAC1B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,6CAAC,SAAI,SAAQ,aAAY,eAAY,QAAQ,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B;AAAA,MAAC;AAAA;AAAA,QACG,IAAG;AAAA,QACH,IAAG;AAAA,QACH,GAAE;AAAA,QACF,MAAK;AAAA,QACL,QAAO;AAAA;AAAA,IACX;AAAA,KACJ;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,6CAAC,cAAS,QAAO,oBAAmB;AAAA,IACpC,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI;AAAA,KACzC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,yCAAwC,GACpD;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C,uDAAC,UAAK,MAAK,gBAAe,GAAE,qBAAoB,GACpD;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C,uDAAC,UAAK,MAAK,gBAAe,GAAE,8BAA6B,GAC7D;AAER;AAEO,SAAS,gBAAgB,OAAkB;AAC9C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,qEAAoE;AAAA,IAC5E,6CAAC,UAAK,GAAE,qCAAoC;AAAA,KAChD;AAER;AAEO,SAAS,iBAAiB,OAAkB;AAC/C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,sBAAqB,GACjC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,mCAAkC;AAAA,IAC1C,6CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,IACnC,6CAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI;AAAA,IAC7B,6CAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI;AAAA,IAC7B,6CAAC,UAAK,GAAE,uBAAsB;AAAA,KAClC;AAER;AAEO,SAAS,mBAAmB,OAAkB;AACjD,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,kCAAiC;AAAA,KAC7C;AAER;AAEO,SAAS,kBAAkB,OAAkB;AAChD,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,qHAAoH;AAAA,IAC5H,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,kCAAiC;AAAA,KAC7C;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,qIAAoI,GAChJ;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,6CAAC,SAAI,SAAQ,aAAY,eAAY,QAAQ,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,6CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6BAA4B;AAAA,IACpC,6CAAC,UAAK,GAAE,gBAAe;AAAA,IACvB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,mBAAkB;AAAA,IAC1B,6CAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI;AAAA,IAC7B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,KAClC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,IACxD,6CAAC,UAAK,GAAE,4BAA2B;AAAA,KACvC;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,6CAA4C;AAAA,KACxD;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,2CAA0C;AAAA,IAClD,6CAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,gBAAe;AAAA,KAC3B;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IACjD,6CAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IAClD,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,2BAA0B,GACtC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6EAA4E;AAAA,IACpF,6CAAC,UAAK,GAAE,yCAAwC;AAAA,IAChD,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,oBAAmB,GAC/B;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,cAAS,QAAO,iBAAgB;AAAA,IACjC,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,KAC1C;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,sHAAqH,GACjI;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM,MAAK,gBAAe,QAAO,QAAO;AAAA,KACtE;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,wCAAuC,GACnD;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,wBAAuB;AAAA,IAC/B,6CAAC,UAAK,GAAE,gBAAe;AAAA,IACvB,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,oBAAmB;AAAA,KAC/B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,iFAAgF;AAAA,IACxF,6CAAC,UAAK,GAAE,qBAAoB;AAAA,KAChC;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,cAAS,QAAO,wBAAuB;AAAA,IACxC,6CAAC,cAAS,QAAO,mBAAkB;AAAA,KACvC;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,aAAQ,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,IACtC,6CAAC,UAAK,GAAE,8CAA6C;AAAA,IACrD,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,2CAA0C;AAAA,IAClD,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,4DAA2D;AAAA,IACnE,6CAAC,UAAK,GAAE,4EAA2E;AAAA,IACnF,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,MAAK,gBAAe;AAAA,KACzD;AAER;AAGO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,mDAAkD;AAAA,IAC1D,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,gDAA+C,GAC3D;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,sGAAqG;AAAA,KACjH;AAER;AAEO,SAAS,MAAM,OAAkB;AACpC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,wBAAuB,GACnC;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,cAAa;AAAA,IACrB,6CAAC,UAAK,GAAE,oBAAmB;AAAA,IAC3B,6CAAC,UAAK,GAAE,oBAAmB;AAAA,KAC/B;AAER;AAIO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,iEAAgE,GAC5E;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,0CAAyC;AAAA,IACjD,6CAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI;AAAA,IAC7B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,KAClC;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,gDAA+C;AAAA,IACvD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,KAClC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,gDAA+C;AAAA,IACvD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,cAAa;AAAA,KACzB;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,oBAAmB;AAAA,IAC3B,6CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,KACpD;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,wDAAuD;AAAA,IAC/D,6CAAC,UAAK,GAAE,8BAA6B;AAAA,IACrC,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,wBAAuB;AAAA,IAC/B,6CAAC,UAAK,GAAE,gCAA+B;AAAA,IACvC,6CAAC,UAAK,GAAE,mCAAkC;AAAA,KAC9C;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,0BAAyB;AAAA,IACjC,6CAAC,UAAK,GAAE,uBAAsB;AAAA,KAClC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,uHAAsH,GAClI;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6FAA4F;AAAA,IACpG,6CAAC,UAAK,GAAE,mGAAkG;AAAA,IAC1G,6CAAC,UAAK,GAAE,0CAAyC;AAAA,IACjD,6CAAC,UAAK,GAAE,2CAA0C;AAAA,KACtD;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,kBAAiB;AAAA,KAC7B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,2CAA0C;AAAA,IAClD,6CAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,gCAA+B;AAAA,KAC3C;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,0OAAyO;AAAA,IACjP,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,WAAU;AAAA,KACtB;AAER;AAEO,SAAS,SAAS;AAAA,EACrB,SAAS;AAAA,EACT,GAAG;AACP,GAAqC;AACjC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAY;AAAA,MACZ,SAAQ;AAAA,MACP,GAAG;AAAA,MACJ,MAAM,SAAS,iBAAiB;AAAA,MAC/B,GAAG;AAAA,MAEJ,uDAAC,aAAQ,QAAO,kGAAiG;AAAA;AAAA,EACrH;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,+BAA8B,GAC1C;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,aAAQ,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,IACtC,6CAAC,UAAK,GAAE,4BAA2B;AAAA,IACnC,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,6BAA4B;AAAA,IACpC,6CAAC,UAAK,GAAE,6FAA4F;AAAA,IACpG,6CAAC,UAAK,GAAE,sFAAqF;AAAA,KACjG;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,gDAA+C;AAAA,KAC3D;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,OAAM;AAAA,IACnC,6CAAC,UAAK,GAAE,iBAAgB;AAAA,IACxB,6CAAC,UAAK,GAAE,2BAA0B;AAAA,KACtC;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,6CAAC,UAAK,GAAE,mDAAkD;AAAA,IAC1D,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,kBAAiB;AAAA,KAC7B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,8BAA6B;AAAA,IACrC,6CAAC,UAAK,GAAE,cAAa;AAAA,KACzB;AAER;;;AJhsBQ,IAAAC,sBAAA;AAhCR,SAAS,SAAS,MAAc;AAC5B,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY;AAChE,SAAO,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,YAAY;AACxE;AAEA,SAAS,cAAc;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACb,GAOG;AACC,QAAM,OAAO,SACP,wBACA,oBAAoB,OAClB,0BACA;AACR,QAAM,YAAY;AAAA,IACd;AAAA,IACA,UACI;AAAA,EACR;AACA,QAAM,SAAS,YACX;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,KAAI;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA;AAAA,EACJ,IAEA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY,GAAG,IAAI;AAAA,MACnB,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC,mBAAS,IAAI;AAAA;AAAA,EAClB;AAEJ,SAAO,gBACH;AAAA,IAAC;AAAA;AAAA,MACG,MAAM;AAAA,MACN,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,cAAW;AAAA,MACX,OAAM;AAAA,MACN,WAAU;AAAA,MAET;AAAA;AAAA,EACL,IAEA;AAER;AAmBO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAyB;AACrB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACJ;AAAA,QACA,6CAAC,kBAAe,MAAY,kBAAoC;AAAA;AAAA;AAAA,EACpE;AAER;AAGO,SAAS,oBAAoB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAA6B;AACzB,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAW;AAAA;AAAA,QAEP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA,qDAAC,iBAAc,MAAY,WAAsB,QAAM,MAAC;AAAA,QACxD,6CAAC,kBAAe,MAAY;AAAA,QAE5B;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACd;AAAA;AAAA;AAAA,EACJ;AAER;AAEA,SAAS,eAAe;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACJ,GAIG;AACC,SACI,8CAAC,UAAK,WAAU,6EACZ;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,QACP,WAAU;AAAA,QAET;AAAA;AAAA,IACL;AAAA,IACC,oBAAoB,QACjB;AAAA,MAAC;AAAA;AAAA,QACG,IAAI;AAAA,QACJ,WAAU;AAAA,QAET;AAAA;AAAA,IACL;AAAA,KAER;AAER;AAcO,SAAS,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY,oBAAoB,IAAI;AACxC,GAAqB;AACjB,QAAM,eAAW,qBAAM;AACvB,QAAM,SACF;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACJ;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAW;AAAA,MACX,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA,yBAAiB;AAAA,QAClB;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN;AAAA,YACA,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YACA,SAAS,CAAC,SACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY;AAAA,gBACZ,oBACI,oBAAoB,OAAO,WAAW;AAAA,gBAE1C,WAAU;AAAA,gBAET;AAAA,mBAAC,iBAAiB;AAAA,kBACnB;AAAA,oBAAC;AAAA;AAAA,sBACG;AAAA,sBACA;AAAA,sBACA,aAAa;AAAA;AAAA,kBACjB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU;AAAA,sBACV,WAAU;AAAA;AAAA,kBACd;AAAA;AAAA;AAAA,YACJ;AAAA,YAGH;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACJ;AAER;;;AKlKQ,IAAAC,sBAAA;AA3ER,IAAM,qBAAkD;AAAA,EACpD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,MAAM;AACV;AAEA,IAAM,kBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACX;AAEA,IAAM,kBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACX;AAEA,IAAM,oBAAgD;AAAA,EAClD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AACV;AAEO,SAAS,iBAAiB,MAAmB,WAAoB;AACpE,SAAO;AAAA,IACH;AAAA,IACA,mBAAmB,IAAI;AAAA,IACvB;AAAA,EACJ;AACJ;AAEA,SAAS,cAAc;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKG;AACC,SAAO;AAAA,IACH;AAAA,IACA,gBAAgB,IAAI;AAAA,IACpB,gBAAgB,IAAI;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB;AAAA,EACJ;AACJ;AAWO,SAAS,QAAsC;AAAA,EAClD;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAAY,MAAM;AACxB,SACI,6CAAC,aAAW,GAAG,MAAM,WAAW,iBAAiB,MAAM,SAAS,GAC3D,UACL;AAER;AAaO,SAAS,KAAkC;AAAA,EAC9C;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAiB;AACb,QAAM,YAAY,MAAM;AACxB,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW,cAAc,EAAE,MAAM,MAAM,QAAQ,UAAU,CAAC;AAAA,MAEzD;AAAA;AAAA,EACL;AAER;;;ACtFY,IAAAC,sBAAA;AA9BZ,IAAM,gBAA6C;AAAA,EAC/C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACZ;AAOO,IAAM,QAAwB,CAAC;AAAA,EAClC,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,MAAM,WAAW,WAAW,UAAU;AAAA,IACtC,WAAW;AAAA,MACP;AAAA,MACA,WAAW,cAAc;AAAA,MACzB,cAAc,MAAM;AAAA,MACpB;AAAA,IACJ;AAAA,IAEC;AAAA,iBAAW,cACR,6CAAC,eAAY,WAAU,kFAAiF;AAAA,MAE5G,8CAAC,SAAI,WAAU,iBACV;AAAA,kBACI,WAAW,aACR,8EACI;AAAA,uDAAC,YAAO,WAAU,oDACb,iBACL;AAAA,UAAU;AAAA,UAAI;AAAA,UACZ;AAAA,WACN,IAEA;AAAA,UAAC;AAAA;AAAA,YACG,IAAG;AAAA,YACH,MAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAU;AAAA,YAET;AAAA;AAAA,QACL;AAAA,QAEP;AAAA,SACL;AAAA;AAAA;AACJ;A;;;;;;;;ACzCI,IAAAC,sBAAA;AAVR,IAAM,OAAO,CAAC,SAAgC;AAAA,EAC1C,YAAY,QAAQ,GAAG;AAAA,EACvB,MAAM,QAAQ,GAAG;AACrB;AAEA,IAAM,QAAQ,EAAE,MAAM,KAAK,YAAO,GAAG,QAAQ,KAAK,yBAAS,EAAE;AAGtD,SAAS,UAAU,EAAE,UAAU,QAAQ,UAAU,GAAmB;AACvE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAY;AAAA,MACZ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACA,OAAO,MAAM,OAAO;AAAA;AAAA,EACxB;AAER;;;ACXQ,IAAAC,sBAAA;AAPD,SAAS,SAAS;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AACJ,GAAkB;AACd,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,SAAS,OAAO,gBAAgB;AAAA,QAChC;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,WACI,SAAS,OACH,wBACA;AAAA;AAAA,QAEd;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,SAAS,OAAO,mBAAmB;AAAA,YACvC;AAAA,YAEC;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACJ;AAER;;;AC1CA,IAAAC,gBAAoC;AAiGhB,IAAAC,sBAAA;AA5EpB,SAAS,aAAa,QAA8B;AAChD,SAAO,WAAW,SACZ,OAAO,UACN,OAAuB;AAClC;AAEO,SAAS,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACJ,GAAmB;AACf,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAE1C,+BAAU,MAAM;AACZ,QAAI,CAAC,YAAY,OAAO,WAAW,aAAa;AAC5C,gBAAU,KAAK;AACf;AAAA,IACJ;AAEA,UAAM,SAAS,iBAAiB,WAAW;AAC3C,QAAI,gBAAgB,aAAa,MAAM;AACvC,QAAI,UAAU;AAEd,UAAM,eAAe,MAAM;AACvB,UAAI,QAAS;AAEb,gBAAU,OAAO,sBAAsB,MAAM;AACzC,kBAAU;AACV,cAAM,gBAAgB,aAAa,MAAM;AACzC,cAAM,QAAQ,gBAAgB;AAE9B,YAAI,gBAAgB,IAAI;AACpB,oBAAU,KAAK;AAAA,QACnB,WAAW,QAAQ,GAAG;AAClB,oBAAU,IAAI;AAAA,QAClB,WAAW,QAAQ,IAAI;AACnB,oBAAU,KAAK;AAAA,QACnB;AAEA,wBAAgB;AAAA,MACpB,CAAC;AAAA,IACL;AAEA,WAAO,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;AAEjE,WAAO,MAAM;AACT,UAAI,QAAS,QAAO,qBAAqB,OAAO;AAChD,aAAO,oBAAoB,UAAU,YAAY;AAAA,IACrD;AAAA,EACJ,GAAG,CAAC,UAAU,eAAe,CAAC;AAE9B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,SAAS,4BAA4B;AAAA,QACrC;AAAA,MACJ;AAAA,MACA,gBAAgB,MAAM,UAAU,KAAK;AAAA,MAErC;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA;AAAA,UACJ;AAAA,UAEC;AAAA,sBACG,6CAAC,YAAS,SAAkB,MAAM,WAAW,IAE7C;AAAA,cAAC;AAAA;AAAA,gBACG,MAAM,aAAa;AAAA,gBACnB,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBAEV;AAAA,+DAAC,UAAK,WAAU,iBAAiB,sBAAW;AAAA,kBAC5C;AAAA,oBAAC;AAAA;AAAA,sBACG,SAAQ;AAAA,sBACR,WAAU;AAAA;AAAA,kBACd;AAAA;AAAA;AAAA,YACJ;AAAA,YAEH,WACG;AAAA,cAAC;AAAA;AAAA,gBACG,cAAY;AAAA,gBACZ,WAAW;AAAA,kBACP;AAAA,kBACA;AAAA,gBACJ;AAAA,gBAEC;AAAA;AAAA,YACL,IACA;AAAA;AAAA;AAAA,MACR;AAAA;AAAA,EACJ;AAER;;;ACnFQ,IAAAC,uBAAA;AAvCR,IAAM,iBAAiD;AAAA;AAAA;AAAA,EAGnD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eACI;AACR;AAsBO,SAAS,QAAuC;AAAA,EACnD;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAAyB,MAAM;AAErC,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW,GAAG,iBAAiB,eAAe,OAAO,GAAG,SAAS;AAAA,MAEhE;AAAA;AAAA,EACL;AAER;;;ACpBY,IAAAC,uBAAA;AAjBL,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACJ,GAAiB;AACb,SACI;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH,SAAQ;AAAA,MACR,WAAW;AAAA,QACP;AAAA,QACA,SAAS,SAAS,6BAA6B;AAAA,QAC/C;AAAA,MACJ;AAAA,MAEA;AAAA,uDAAC,SAAI,WAAU,0DACX;AAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAU;AAAA,cAET;AAAA;AAAA,UACL;AAAA,UACA,8CAAC,QAAK,WAAU,mCAAmC,gBAAK;AAAA,WAC5D;AAAA,QACA,8CAAC,SAAI,WAAU,6DACV,UACL;AAAA;AAAA;AAAA,EACJ;AAER;;;AC7CA,IAAAC,gBAIO;;;ACJP,IAAAC,gBASO;AA4GK,IAAAC,uBAAA;AAvGZ,IAAM,cAA0C;AAAA,EAC5C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,MAAM;AACV;AAeA,SAAS,UAAa,KAAyB,OAAiB;AAC5D,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,CAAC,IAAmC,UAAU;AAChE;AAGO,IAAM,iBAAa;AAAA,EACtB,CACI,EAAE,OAAO,KAAK,YAAY,UAAU,WAAW,UAAU,GAAG,KAAK,GACjE,gBACC;AACD,UAAM,eAAW,sBAA8B,IAAI;AAEnD,UAAM,aAAS;AAAA,MACX,CAAC,SAAgC;AAC7B,iBAAS,UAAU;AACnB,kBAAU,aAAa,IAAI;AAAA,MAC/B;AAAA,MACA,CAAC,WAAW;AAAA,IAChB;AAEA,iCAAU,MAAM;AACZ,UAAI,cAAc,SAAU;AAC5B,YAAM,UAAU,SAAS;AACzB,UAAI,CAAC,QAAS;AAEd,UAAI,YAA2B;AAE/B,YAAM,iBAAiB,MAAM;AACzB,YAAI,cAAc,MAAM;AACpB,iBAAO,aAAa,SAAS;AAC7B,sBAAY;AAAA,QAChB;AAAA,MACJ;AAEA,YAAM,OAAO,MAAM;AACf,gBAAQ,QAAQ,kBAAkB;AAClC,uBAAe;AAAA,MACnB;AAEA,YAAM,OAAO,MAAM;AACf,gBAAQ,QAAQ,kBAAkB;AAClC,uBAAe;AAAA,MACnB;AAEA,YAAM,eAAe,MAAM;AACvB,uBAAe;AACf,oBAAY,OAAO,WAAW,MAAM,GAAI;AAAA,MAC5C;AAEA,YAAM,oBAAoB,MAAM;AAC5B,aAAK;AACL,qBAAa;AAAA,MACjB;AAEA,WAAK;AAEL,cAAQ,iBAAiB,UAAU,mBAAmB;AAAA,QAClD,SAAS;AAAA,MACb,CAAC;AACD,cAAQ,iBAAiB,SAAS,mBAAmB;AAAA,QACjD,SAAS;AAAA,MACb,CAAC;AACD,cAAQ,iBAAiB,cAAc,mBAAmB;AAAA,QACtD,SAAS;AAAA,MACb,CAAC;AACD,cAAQ,iBAAiB,eAAe,iBAAiB;AACzD,cAAQ,iBAAiB,WAAW,iBAAiB;AACrD,cAAQ,iBAAiB,WAAW,iBAAiB;AACrD,cAAQ,iBAAiB,YAAY,YAAY;AAEjD,aAAO,MAAM;AACT,uBAAe;AACf,gBAAQ,oBAAoB,UAAU,iBAAiB;AACvD,gBAAQ,oBAAoB,SAAS,iBAAiB;AACtD,gBAAQ,oBAAoB,cAAc,iBAAiB;AAC3D,gBAAQ,oBAAoB,eAAe,iBAAiB;AAC5D,gBAAQ,oBAAoB,WAAW,iBAAiB;AACxD,gBAAQ,oBAAoB,WAAW,iBAAiB;AACxD,gBAAQ,oBAAoB,YAAY,YAAY;AAAA,MACxD;AAAA,IACJ,GAAG,CAAC,SAAS,CAAC;AAEd,WACI;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ,KAAK;AAAA,QACL,WAAW;AAAA,UACP,cAAc,YAAY;AAAA,UAC1B;AAAA,UACA,YAAY,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,QAEC;AAAA;AAAA,IACL;AAAA,EAER;AACJ;AAEA,WAAW,cAAc;;;AD5FjB,IAAAC,uBAAA;AAhBD,IAAM,uBAAmB;AAAA,EAI5B,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA,oBAAoB;AAAA,IACpB,GAAG;AAAA,EACP,GACA,QAEA,+CAAC,SAAI,WAAW,GAAG,gCAAgC,SAAS,GACxD;AAAA;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ;AAAA,QACA,WAAW,GAAG,8BAA8B,iBAAiB;AAAA,QAE5D;AAAA;AAAA,IACL;AAAA,IACC,oBAAoB,oBACjB;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAU;AAAA,QAEV,wDAAC,kBAAe,WAAU,gCAA+B;AAAA;AAAA,IAC7D;AAAA,KAER;AAER;AAEA,iBAAiB,cAAc;AAIxB,SAAS,wBAAwB;AAAA,EACpC;AAAA,EACA,GAAG;AACP,GAAiC;AAC7B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;AE9DQ,IAAAC,uBAAA;AAPD,SAAS,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAqB;AACjB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,aAAW;AAAA,MACX,WAAW;AAAA,QACP;AAAA,QACA,SAAS,SACH,wEACA;AAAA,QACN;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;AAQO,SAAS,kBAAkB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAA2B;AACvB,QAAM,UACF,UACC,SAAS,SAAS,QAAQ,SAAS,cAAc,UAAU;AAChE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,iBAAS,gBACL,QACG,8CAAC,UAAK,WAAU,4IACZ,wDAAC,aAAU,WAAU,kBAAiB,GAC1C;AAAA,QAER;AAAA,UAAC;AAAA;AAAA,YACG,IAAG;AAAA,YACH,MAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAU;AAAA,YAET;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACJ;AAER;AAIO,SAAS,mBAAmB;AAAA,EAC/B;AAAA,EACA,GAAG;AACP,GAA4B;AACxB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;AAIO,SAAS,mBAAmB;AAAA,EAC/B;AAAA,EACA,GAAG;AACP,GAA4B;AACxB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;AC9GA,IAAAC,gBAIO;;;ACJP,IAAAC,gBAA2B;AASnB,IAAAC,uBAAA;AAFD,IAAM,eAAW;AAAA,EACpB,CAAC,EAAE,WAAW,OAAO,OAAO,GAAG,GAAG,MAAM,GAAG,QACvC;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,cAAY,QAAQ,SAAS;AAAA,MAC7B,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;AAEA,SAAS,cAAc;;;ADVf,IAAAC,uBAAA;AAFD,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAAyB;AAC3E,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,qCAAqC,SAAS;AAAA,MAC3D,GAAG;AAAA;AAAA,EACR;AAER;AAEO,IAAM,yBAAqB,0BAGhC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ;AAAA,IACA,WAAW,GAAG,qBAAqB,SAAS;AAAA;AAChD,CACH;AAED,mBAAmB,cAAc;AAO1B,SAAS,sBAAsB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAA+B;AAC3B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH,sBACG,gFACI;AAAA,sDAAC,SAAI,WAAU,6DACV,iBACL;AAAA,QACA,8CAAC,SAAI,WAAU,2DACV,eACL;AAAA,SACJ;AAAA;AAAA,EAER;AAER;;;AEpEA,IAAAC,gBAOO;;;ACqIC,IAAAC,uBAAA;AAjIR,IAAM,YAAY;AAAA,EACd,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAM,cAAc;AAAA,EAChB,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAM,oBAAsD;AAAA,EACxD,MAAM;AAAA,EACN,QACI;AAER;AAGA,IAAM,eACF;AAKJ,IAAM,WACF;AAEJ,IAAMC,iBAA8C;AAAA,EAChD,OAAO,GAAG,QAAQ;AAAA,EAClB,QACI,GAAG,QAAQ;AAAA,EAGf,QACI;AAAA,EAGJ,MACI;AAAA;AAAA,EAGJ,SACI;AAER;AAaA,IAAM,gBAAgB,CAAC;AAAA,EACnB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAgE;AAC5D,QAAM,eAAe,SAASA,eAAc,MAAM,IAAI;AACtD,QAAMC,eAAc,eAAe,WAAW,cAAc;AAC5D,SAAO;AAAA,IACH;AAAA;AAAA,IAEA,OACM,0BACA,WACE,8CACA;AAAA,IACR;AAAA,IACA,kBAAkB,UAAU;AAAA,IAC5BA,aAAY,QAAQ,IAAI;AAAA,IACxB;AAAA,EACJ;AACJ;AAOO,SAAS,OAA+C;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAmB;AACf,QAAM,YAA+B,MAAM;AAC3C,QAAM,WAAW,cAAc;AAC/B,QAAM,WAAW,cAAc;AAC/B,QAAM,aACF,YAGF;AACF,QAAM,UACF,YAGF;AACF,QAAM,WACF,YACF,WAAW;AACb,QAAM,OAAO,aAAa,QAAQ,aAAa;AAC/C,QAAM,cAAc,WACd,CAAC,UAA2B;AACxB,UAAM,eAAe;AACrB,UAAM,gBAAgB;AAAA,EAC1B,IACA;AAEN,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,eAAa;AAAA,MACZ,GAAI,WAAW,EAAE,MAAM,cAAc,UAAU,SAAS,IAAI,CAAC;AAAA,MAC7D,GAAI,CAAC,YAAY,WACZ,EAAE,iBAAiB,MAAM,UAAU,GAAG,IACtC,CAAC;AAAA,MACN,GAAI,YAAY,WAAW,EAAE,MAAM,OAAU,IAAI,CAAC;AAAA,MACnD,SAAS;AAAA,MACT,WAAW,cAAc;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,MAEA;AAAA,gBACG;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA,YAET,iBACG,8CAAC,UAAK,WAAU,qKAAoK,IAEpL;AAAA;AAAA,QAER;AAAA,QAEH;AAAA;AAAA;AAAA,EACL;AAER;;;AC7KA,IAAAC,gBAUO;AACP,uBAA6B;AA+IrB,IAAAC,uBAAA;AA5IR,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAuBzB,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,kBAAkB;AACtB,MAAM;AACF,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAK3C;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACJ,CAAC;AACD,QAAM,iBAAa,sBAA2B,IAAI;AAClD,QAAM,mBAAe,sBAAO,KAAK;AACjC,QAAM,gBAAY,qBAAM;AAExB,QAAM,eAAe,MAAM;AACvB,iBAAa,UAAU;AACvB,mBAAe,KAAK;AAAA,EACxB;AAEA,+BAAU,MAAM;AACZ,QAAI,CAAC,YAAa;AAElB,UAAM,sBAAsB,CAAC,UAAwB;AACjD,UAAI,WAAW,SAAS,SAAS,MAAM,MAAc,EAAG;AACxD,mBAAa,UAAU;AACvB,qBAAe,KAAK;AAAA,IACxB;AACA,UAAM,kBAAkB,CAAC,UAAoC;AACzD,UAAI,MAAM,QAAQ,SAAU;AAC5B,mBAAa,UAAU;AACvB,qBAAe,KAAK;AAAA,IACxB;AACA,UAAM,0BAA0B,MAAM;AAClC,mBAAa,UAAU;AACvB,qBAAe,KAAK;AAAA,IACxB;AAEA,aAAS,iBAAiB,eAAe,mBAAmB;AAC5D,aAAS,iBAAiB,WAAW,eAAe;AACpD,WAAO,iBAAiB,UAAU,yBAAyB;AAAA,MACvD,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AACD,WAAO,iBAAiB,UAAU,uBAAuB;AACzD,WAAO,MAAM;AACT,eAAS,oBAAoB,eAAe,mBAAmB;AAC/D,eAAS,oBAAoB,WAAW,eAAe;AACvD,aAAO,oBAAoB,UAAU,yBAAyB,IAAI;AAClE,aAAO,oBAAoB,UAAU,uBAAuB;AAAA,IAChE;AAAA,EACJ,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,wBAAwB,MAAM;AAChC,QAAI,WAAW,SAAS;AACpB,YAAM,OAAO,WAAW,QAAQ,sBAAsB;AACtD,YAAM,oBAAoB,KAAK;AAAA,QAC3B;AAAA,QACA,OAAO,aAAa,0BAA0B;AAAA,MAClD;AACA,UAAI,OACA,UAAU,WAAW,KAAK,OAAO,KAAK,QAAQ,IAAI,KAAK;AAC3D,UAAI,YACA,UAAU,WAAW,qBAAqB;AAC9C,UAAI,iBAAiB;AACjB,eAAO,KAAK;AAAA,UACR,KAAK,IAAI,KAAK,MAAM,uBAAuB;AAAA,UAC3C,KAAK;AAAA,YACD;AAAA,YACA,OAAO,aACH,oBACA;AAAA,UACR;AAAA,QACJ;AACA,oBAAY;AAAA,MAChB;AACA,yBAAmB;AAAA,QACf,KAAK,KAAK,SAAS;AAAA,QACnB;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAGA,QAAM,mBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,cAAc,kBACd,mBACA;AAIN,QAAM,eACF;AAEJ,QAAM,YAAY,UACd;AAAA,IAAC;AAAA;AAAA,MACG,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,eAAa,CAAC;AAAA,MACd,OAAO;AAAA,QACH,KAAK,gBAAgB;AAAA,QACrB,MAAM,gBAAgB;AAAA,QACtB,UAAU,gBAAgB;AAAA,QAC1B,WAAW,gBAAgB;AAAA,MAC/B;AAAA,MACA,WAAW,GACP,cACM,oCACA,iCACV,IAAI,YAAY;AAAA,MAEf;AAAA;AAAA,EACL,IACA;AACJ,QAAM,eACF,aAAa,OAAO,aAAa,kBAC3B;AAAA,IACI;AAAA,IACA,WAAW,SAAS,QAAQ,iBAAiB,KACzC,SAAS;AAAA,EACjB,IACA;AACV,QAAM,cACF,gFACI;AAAA,kDAAC,UAAK,WAAW,aAAc,UAAS;AAAA,IACvC;AAAA,KACL;AAGJ,QAAM,cAAc;AAAA,IAChB,cAAc;AAAA,IACd,oBAAoB,WAAW,cAAc,YAAY;AAAA,IACzD,WAAW;AAAA,IACX,cAAc,MAAM;AAChB,4BAAsB;AACtB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,cAAc,MAAM;AAChB,UAAI,CAAC,aAAa,QAAS,gBAAe,KAAK;AAAA,IACnD;AAAA,IACA,SAAS,CAAC,MAAkB;AACxB,UAAI,qBAAsB,GAAE,gBAAgB;AAC5C,UAAI,SAAS;AACT,gBAAQ;AAAA,MACZ;AACA,UAAI,CAAC,cAAc,CAAC,QAAS;AAC7B,4BAAsB;AACtB,UAAI,aAAa,SAAS;AACtB,qBAAa;AACb;AAAA,MACJ;AACA,mBAAa,UAAU;AACvB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,SAAS,MAAM;AACX,4BAAsB;AACtB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACJ;AAEA,MAAI,cAAc,QAAQ;AACtB,UAAM,gBAAgB,CAAC,UAA0C;AAC7D,UAAI,CAAC,cAAc,CAAC,QAAS;AAC7B,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,IAAK;AAChD,YAAM,eAAe;AACrB,4BAAsB;AACtB,UAAI,aAAa,SAAS;AACtB,qBAAa;AACb;AAAA,MACJ;AACA,mBAAa,UAAU;AACvB,qBAAe,IAAI;AAAA,IACvB;AACA,UAAM,uBAAuB;AAAA,MACzB,GAAG;AAAA,MACH,MAAM,cAAc,UAAU,WAAW;AAAA,MACzC,UAAU,cAAc,UAAU,IAAI;AAAA,MACtC,WAAW,cAAc,UAAU,gBAAgB;AAAA,IACvD;AAEA,WACI;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,CAAC,SAAS;AACX,qBAAW,UAAU;AAAA,QACzB;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACL;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK,CAAC,SAAS;AACX,mBAAW,UAAU;AAAA,MACzB;AAAA,MACA,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,oBAAkB,WAAW,cAAc,YAAY;AAAA,MACvD,WAAW;AAAA,MACX,cAAc,YAAY;AAAA,MAC1B,cAAc,YAAY;AAAA,MAC1B,SAAS,YAAY;AAAA,MACrB,SAAS,YAAY;AAAA,MACrB,QAAQ,YAAY;AAAA,MACpB;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AF/LQ,IAAAC,uBAAA;AA9CD,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,iBAAa,sBAA6C,IAAI;AAEpE;AAAA,IACI,MAAM,MAAM;AACR,UAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AAAA,IAC3D;AAAA,IACA,CAAC;AAAA,EACL;AAEA,iBAAe,WAAW,OAAsC;AAC5D,UAAM,gBAAgB;AACtB,QAAI;AACA,YAAM,OAAO,OAAO,UAAU,aAAa,MAAM,MAAM,IAAI;AAC3D,YAAM,UAAU,UAAU,UAAU,IAAI;AACxC,gBAAU,IAAI;AACd,iBAAW;AACX,UAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,iBAAW,UAAU;AAAA,QACjB,MAAM,UAAU,KAAK;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,oBAAc,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,UAAU,YAAY,WAAW,SAAS;AAChD,QAAM,SACF;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACH,GAAI,YAAY,YAAY,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MACpD,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,QACP;AAAA,QACA,YAAY,WACN,6BACA;AAAA,QACN,OAAO,cAAc,aAAa,UAAU,MAAM,IAAI;AAAA,MAC1D;AAAA,MAEC,iBAAO,aAAa,aAAa,SAAS,MAAM,IAAI;AAAA;AAAA,EACzD;AAKJ,MAAI,YAAY,MAAM;AAClB,WAAO;AAAA,EACX;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAS,SAAS,gBAAgB;AAAA,MAClC,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,iBAAe;AAAA,MACf,YAAY;AAAA,MACZ,WAAW;AAAA,QACP,YAAY,WACN,6BACA;AAAA,QACN;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AG3FgB,IAAAC,uBAAA;AAlBT,IAAM,YAAgC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,QAAM,QAAQ,YAAY;AAE1B,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA,uDAAC,SAAI,WAAU,kIACX;AAAA,wDAAC,UAAK,WAAU,sIACX,iBACL;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,cACP,SAAS;AAAA,cACT,cAAW;AAAA,cACX,WAAU;AAAA,cAET,WAAC,WACE,gFACK;AAAA,yBACG,8CAAC,aAAU,WAAU,kBAAiB,IAEtC,8CAAC,iBAAc,WAAU,kBAAiB;AAAA,gBAE9C,8CAAC,UAAM,mBAAS,WAAW,QAAO;AAAA,iBACtC;AAAA;AAAA,UAER;AAAA,WACJ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEA,wDAAC,UAAM,gBAAK;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACJ;AAER;;;ACTQ,IAAAC,uBAAA;AApBD,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,iBAAiB;AAAA,EACjB;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,WAAW;AAAA,MACP;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IAChB;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,cAAY;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,UACT,WAAW;AAAA,YACP;AAAA,YACA,WAAW,uBAAuB;AAAA,YAClC;AAAA,YACA,CAAC,YAAY;AAAA,YACb;AAAA,YACA,WAAW,6BAA6B;AAAA,UAC5C;AAAA,UAEA;AAAA,0DAAC,SAAI,WAAU,8BAA8B,iBAAM;AAAA,YACnD;AAAA,cAAC;AAAA;AAAA,gBACG;AAAA,gBACA,WAAU;AAAA;AAAA,YACd;AAAA;AAAA;AAAA,MACJ;AAAA,MACC,YAAY,8CAAC,SAAI,WAAW,gBAAiB,UAAS;AAAA;AAAA;AAC3D;;;AC5EJ,oBAAoC;AACpC,IAAAC,iBAAuB;AAEvB,IAAAC,iBAAuB;AAsDP,IAAAC,uBAAA;AAjDhB,IAAM,cAAc;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAmBO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,eAAe;AAAA,EACf,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,iBAAa,uBAAuB,IAAI;AAE9C,SACI;AAAA,IAAC,cAAAC,OAAU;AAAA,IAAV;AAAA,MACG;AAAA,MACA,gBAAgB,MAAM,WAAW;AAAA,MACjC,cAAc,CAAC,YAAY,eAAe,QAAQ,IAAI;AAAA,MAErD;AAAA,mBACG;AAAA,UAAC,cAAAA,OAAU;AAAA,UAAV;AAAA,YACG,SAAS;AAAA,YACT,WAAW;AAAA,YAEV;AAAA;AAAA,QACL;AAAA,QAEJ,+CAAC,yBACI;AAAA,0BACG;AAAA,YAAC,cAAAA,OAAU;AAAA,YAAV;AAAA,cAMG,WAAW;AAAA,gBACP;AAAA,gBACA,gBAAgB;AAAA,cACpB;AAAA;AAAA,UACJ;AAAA,UAEJ;AAAA,YAAC,cAAAA,OAAU;AAAA,YAAV;AAAA,cACG,WAAW;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA;AAAA,cACJ;AAAA,cAEA;AAAA,gBAAC,cAAAA,OAAU;AAAA,gBAAV;AAAA,kBACG,KAAK;AAAA,kBACL,cAAY;AAAA,kBACZ,mBAAiB;AAAA,kBACjB,WAAW;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA,YAAY,IAAI;AAAA,oBAChB;AAAA,kBACJ;AAAA,kBAEC;AAAA,6BAAS,8CAAC,gBAAa,OAAc;AAAA,oBACrC;AAAA;AAAA;AAAA,cACL;AAAA;AAAA,UACJ;AAAA,WACJ;AAAA;AAAA;AAAA,EACJ;AAER;AAEO,IAAM,cAAc,cAAAA,OAAU;AAC9B,IAAM,oBAAoB,cAAAA,OAAU;AAapC,IAAM,eAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP,SACM,yCACA;AAAA,QACN;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,iBACG;AAAA,UAAC;AAAA;AAAA,YACG,WAAW,GAAG,iBAAiB,SAAS,GAAG,cAAc;AAAA,YAExD;AAAA;AAAA,QACL;AAAA,QAEH,eACG;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL;AAAA,QAEH;AAAA;AAAA;AAAA,EACL;AAER;AAcO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL;AAAA,SACE,WAAW;AAAA;AAAA;AAAA,QAIT,+CAAC,SAAI,WAAU,oHACV;AAAA,qBACG,8CAAC,gBAAa,WAAU,6BACnB,mBACL;AAAA,UAEH,YACG,8CAAC,SAAI,WAAU,6BACV,oBACL;AAAA,WAER;AAAA;AAAA;AAAA,EAER;AAER;AAEO,IAAM,eAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA;AAAA;AAAA;AAAA,QAIA;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;;;ACjOY,IAAAC,uBAAA;AADZ,IAAM,eAAiD;AAAA,EACnD,QAAQ,8CAAC,aAAU;AAAA,EACnB,QAAQ,8CAAC,aAAU;AAAA,EACnB,MAAM,8CAAC,aAAU;AAAA,EACjB,SAAS,8CAAC,aAAU;AACxB;AAsBO,SAAS,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,OAAO;AACX,GAA4B;AACxB,QAAM,UACF,gFACI;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,QAAO;AAAA,QACP,MAAM,8CAAC,SAAM;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,QACb;AAAA;AAAA,IAED;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL;AAAA,QACA,MAAM,eAAe,aAAa,MAAM;AAAA,QACxC,SAAS;AAAA,QACT,UAAU;AAAA,QAET;AAAA;AAAA,IACL;AAAA,KACJ;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,cAAc,CAAC,SAAS,CAAC,QAAQ,SAAS;AAAA,MAC1C;AAAA,MACA,kBAAiB;AAAA,MAEjB,yDAAC,cAAW,SACR;AAAA,sDAAC,gBAAa,QAAM,MAAC,OAAc;AAAA,QAClC,eACG,8CAAC,OAAE,WAAU,uCACR,uBACL;AAAA,QAEH;AAAA,SACL;AAAA;AAAA,EACJ;AAER;;;AChEQ,IAAAC,uBAAA;AA3BR,IAAMC,eAAc;AAAA,EAChB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACZ;AAaO,SAAS,QAAwC;AAAA,EACpD;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAAyB,MAAM;AAErC,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACAA,aAAY,IAAI;AAAA,QAChB;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACCY,IAAAC,uBAAA;AA7BZ,IAAM,eAAe;AAAA,EACjB,MAAM;AAAA,EACN,SACI;AACR;AAEA,IAAM,kBAAkB;AAAA,EACpB,MAAM;AAAA,EACN,SAAS;AACb;AAGO,SAAS,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACJ,GAAuB;AACnB,QAAM,QAAQ,YAAY,SAAS,OAAO;AAE1C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA,uDAAC,SAAI,WAAU,yDACV;AAAA,oBAAU,8CAAC,WAAQ,MAAK,QAAQ,mBAAQ,IAAa;AAAA,UACtD,8CAAC,SAAM,WAAW,aAAa,OAAO,GAAI,iBAAM;AAAA,UAC/C,YACG;AAAA,YAAC;AAAA;AAAA,cACG,WAAW;AAAA,gBACP,gBAAgB,OAAO;AAAA,gBACvB;AAAA,cACJ;AAAA,cAEC;AAAA;AAAA,UACL;AAAA,WAER;AAAA,QACC;AAAA;AAAA;AAAA,EACL;AAER;;;ACfgB,IAAAC,uBAAA;AAxBT,SAAS,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAmB;AACf,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,cAAY;AAAA,MACZ,WAAW,CAAC,WACR;AAAA,QACI;AAAA,QACA,SACM,mCACA;AAAA,QACN;AAAA,MACJ;AAAA,MAGH,WAAC,WACE,gFACI;AAAA,sDAAC,UAAK,WAAU,+DACX,mBAAS,WAAY,WAAW,OAAO,KAAK,GACjD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA,YAET,mBAAS,8CAAC,aAAU,IAAK,8CAAC,iBAAc;AAAA;AAAA,QAC7C;AAAA,SACJ;AAAA;AAAA,EAER;AAER;;;AC1DA,wBAAqC;AACrC,sBAAyB;AACzB,IAAAC,iBAMO;;;ACRP,IAAAC,iBAA2B;AAUnB,IAAAC,uBAAA;AAFD,IAAM,YAAQ;AAAA,EACjB,CAAC,EAAE,WAAW,OAAO,oBAAoB,GAAG,MAAM,GAAG,QACjD;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,cAAY,QAAQ,SAAS;AAAA,MAC7B,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,QACtB;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;ADoCY,IAAAC,uBAAA;AAjBL,SAAS,sBAAsB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACP,GAA+B;AAC3B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,oBAAkB,cAAc,KAAK;AAAA,MACrC,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,uDAAC,UAAK,WAAU,+BAA+B;AAAA;AAAA,UAAM;AAAA,WAAC;AAAA,QACtD,8CAAC,UAAK,WAAU,6CACX,iBACL;AAAA,QACA,8CAAC,eAAY,WAAU,mDAAkD;AAAA;AAAA;AAAA,EAC7E;AAER;AAEO,SAAS,iBAAiB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAA0B;AACtB,QAAM,qBAAiB,wBAAQ,MAAM;AACjC,UAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,WAAO,UAAU,KACX,UACA,QAAQ,OAAO,CAAC,WAAW,OAAO,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,EACzE,GAAG,CAAC,SAAS,KAAK,CAAC;AACnB,QAAM,iBAAa;AAAA,IACf,UACI,wCAAqB;AAAA,MACjB,OAAO;AAAA,MACP,cAAc,CAAC,SAAS;AAAA,MACxB,aAAa,CAAC,SAAS;AAAA,IAC3B,CAAC;AAAA,IACL,CAAC,cAAc;AAAA,EACnB;AACA,QAAM,aAAa,QAAQ,SAAS;AACpC,QAAM,kBAAkB,QAAQ,YAAY;AAC5C,QAAM,eAAW,uBAAyB,IAAI;AAI9C,gCAAU,MAAM;AACZ,QAAI,SAAS,WAAW,SAAS,QAAQ,UAAU,OAAO;AACtD,eAAS,QAAQ,QAAQ;AAAA,IAC7B;AAAA,EACJ,CAAC;AAED,SACI;AAAA,IAAC,yBAAS;AAAA,IAAT;AAAA,MACG;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,CAAC;AAAA,MACR,kBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACT,WAAW,UAAU,QAAQ,eAAe;AAAA,QAC5C,WAAW;AAAA,QACX,UAAU;AAAA,MACd;AAAA,MACA,oBAAoB,CAAC,YAAY,SAAS,QAAQ,UAAU;AAAA,MAC5D,cAAc,CAAC,YAAY,eAAe,QAAQ,IAAI;AAAA,MAEtD;AAAA;AAAA,UAAC,yBAAS;AAAA,UAAT;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,mBACI;AAAA,YACR;AAAA,YAEC;AAAA;AAAA,cACD,8CAAC,yBAAS,OAAT,EAAe,SAAO,MACnB;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK;AAAA,kBACJ,GAAG;AAAA,kBACJ;AAAA,kBACA;AAAA,kBACA,WAAW;AAAA,oBACP,kBACM,sDACA;AAAA,oBACN;AAAA,kBACJ;AAAA;AAAA,cACJ,GACJ;AAAA,cACC,cAAc,CAAC,mBACZ;AAAA,gBAAC,yBAAS;AAAA,gBAAT;AAAA,kBACG,cAAW;AAAA,kBACX,WAAU;AAAA,kBAEV,wDAAC,yBAAS,SAAT,EACI,WAAC,YACE;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU,QAAQ;AAAA,sBAClB,WAAU;AAAA;AAAA,kBACd,GAER;AAAA;AAAA,cACJ;AAAA;AAAA;AAAA,QAER;AAAA,QACA,8CAAC,yBAAS,YAAT,EACG;AAAA,UAAC,yBAAS;AAAA,UAAT;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEA,wDAAC,cAAW,WAAU,kBAClB,yDAAC,yBAAS,MAAT,EAAc,WAAU,6BACpB;AAAA,6BAAe,IAAI,CAAC,WACjB;AAAA,gBAAC,yBAAS;AAAA,gBAAT;AAAA,kBAEG,MAAM;AAAA,kBACN,WAAW;AAAA,oBACP;AAAA,oBACA,UAAU,UACN;AAAA,kBACR;AAAA,kBAEA,wDAAC,yBAAS,UAAT,EAAkB,WAAU,kCACxB,kBACL;AAAA;AAAA,gBAVK;AAAA,cAWT,CACH;AAAA,cACA,eAAe,WAAW,KACvB,8CAAC,yBAAS,OAAT,EAAe,WAAU,4EACrB,wBACL;AAAA,eAER,GACJ;AAAA;AAAA,QACJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AE/MO,SAAS,eACZ,MACA,SAAS,WAAW,UAAU,QACvB;AACP,MAAI,OAAO,SAAS,YAAY,CAAC,mBAAmB,KAAK,IAAI;AACzD,WAAO;AACX,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI;AACA,WAAO,IAAI,IAAI,MAAM,MAAM,EAAE,WAAW;AAAA,EAC5C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ACiCQ,IAAAC,uBAAA;AAXD,SAAS,mBAAmB,OAAgC;AAC/D,QAAM;AAAA,IACF,OAAO;AAAA,IACP;AAAA,IACA,WAAW,UAAU,QAAQ,eAAe,MAAM,IAAI,IAAI;AAAA,IAC1D,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AACJ,QAAM,UACF,gFACK;AAAA;AAAA,IACD,8CAAC,UAAM,UAAS;AAAA,IACf,YAAY,WACT;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,IAChB,IACA;AAAA,KACR;AAGJ,MAAI,UAAU,OAAO;AACjB,UAAM;AAAA,MACF;AAAA,MACA,SAAS,WAAW,WAAW;AAAA,MAC/B,MAAM,WAAW,WAAW,wBAAwB;AAAA,MACpD,MAAMC;AAAA,MACN,YAAYC;AAAA,MACZ,UAAUC;AAAA,MACV,UAAUC;AAAA,MACV,MAAMC;AAAA,MACN,WAAWC;AAAA,MACX,UAAUC;AAAA,MACV,GAAG;AAAA,IACP,IAAI;AAEJ,WACI;AAAA,MAAC;AAAA;AAAA,QACG,IAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,GAAG,eAAe,SAAS;AAAA,QACrC,GAAG;AAAA,QAEH;AAAA;AAAA,IACL;AAAA,EAER;AAEA,QAAM;AAAA,IACF,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAG;AAAA,EACP,IAAI;AAEJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,GAAG,eAAe,SAAS;AAAA,MACrC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;;;ACjHA,mBAAsB;;;ACuCN,IAAAC,uBAAA;AArBT,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAoB;AAChB,SACI;AAAA,IAAC,mBAAM;AAAA,IAAN;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACA,SAAS,QAAQ,KAAK;AAAA,MAEpB;AAAA,kBAAS,WACP;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,iBAAiB;AAAA,YACrB;AAAA,YAEC;AAAA,uBACG;AAAA,gBAAC,mBAAM;AAAA,gBAAN;AAAA,kBACG,WAAW;AAAA,oBACP;AAAA,oBACA;AAAA,kBACJ;AAAA,kBAEC;AAAA;AAAA,cACL;AAAA,cAEH;AAAA;AAAA;AAAA,QACL;AAAA,QAEH;AAAA,QACA,QACG;AAAA,UAAC,mBAAM;AAAA,UAAN;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL,IACA,SACA;AAAA,UAAC,mBAAM;AAAA,UAAN;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL,IACA;AAAA;AAAA;AAAA,EACR;AAER;;;AChFA,IAAAC,iBAOO;;;ACFP,IAAM,SAAS,oBAAI,QAA8B;AAM1C,SAAS,6BAA6BC,WAAgC;AACzE,MAAI,QAAQ,OAAO,IAAIA,SAAQ;AAE/B,MAAI,CAAC,OAAO;AACR,UAAM,wBAAuC,CAAC,UAAU;AACpD,YAAM,QAAS,MAAoB,cAAc;AACjD,UAAI,OAAO,SAAS,OAAO,EAAG,OAAM,eAAe;AAAA,IACvD;AAEA,YAAQ,EAAE,WAAW,GAAG,sBAAsB;AAC9C,WAAO,IAAIA,WAAU,KAAK;AAC1B,IAAAA,UAAS,iBAAiB,YAAY,qBAAqB;AAC3D,IAAAA,UAAS,iBAAiB,QAAQ,qBAAqB;AAAA,EAC3D;AAEA,QAAM,aAAa;AACnB,MAAI,WAAW;AAEf,SAAO,MAAM;AACT,QAAI,SAAU;AACd,eAAW;AACX,UAAM,aAAa;AAEnB,QAAI,MAAM,YAAY,EAAG;AACzB,IAAAA,UAAS,oBAAoB,YAAY,MAAM,qBAAqB;AACpE,IAAAA,UAAS,oBAAoB,QAAQ,MAAM,qBAAqB;AAChE,WAAO,OAAOA,SAAQ;AAAA,EAC1B;AACJ;;;ACvBA,SAAS,cAAc,MAAY,QAAqC;AACpE,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,OACV,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,OAAO,KAAK,CAAC,UAAU;AAC1B,QAAI,MAAM,WAAW,GAAG,GAAG;AACvB,aAAO,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,IAC/D;AACA,QAAI,MAAM,SAAS,IAAI,GAAG;AACtB,YAAM,SAAS,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AAC9C,aAAO,KAAK,KAAK,WAAW,MAAM;AAAA,IACtC;AACA,WAAO,KAAK,SAAS;AAAA,EACzB,CAAC;AACL;AAOO,SAAS,eACZ,UACAC,UACA,EAAE,UAAU,cAAc,OAAO,GAClB;AACf,QAAM,WAAmB,CAAC;AAC1B,QAAM,WAA2B,CAAC;AAClC,MAAI,QAAQ,KAAK,IAAI,GAAG,WAAWA,SAAQ,MAAM;AAEjD,aAAW,QAAQ,UAAU;AACzB,QAAI,CAAC,cAAc,MAAM,MAAM,GAAG;AAC9B,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,IAC1C,WAAW,KAAK,OAAO,cAAc;AACjC,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,IAC1C,WAAW,SAAS,GAAG;AACnB,eAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC3C,OAAO;AACH,eAAS,KAAK,IAAI;AAClB,eAAS;AAAA,IACb;AAAA,EACJ;AAEA,SAAO,EAAE,UAAU,SAAS;AAChC;;;AC/DA,IAAAC,iBAAsE;AAoE1D,IAAAC,uBAAA;AA5DZ,IAAMC,iBAAkD;AAAA,EACpD,QAAQ;AAAA,EACR,MAAM;AACV;AAEA,IAAM,qBAAuD;AAAA,EACzD,QAAQ;AAAA,EACR,MAAM;AACV;AAEA,IAAMC,kBAAoD;AAAA,EACtD,MAAM;AAAA,EACN,OAAO;AACX;AAEA,IAAM,sBAAyD;AAAA,EAC3D,MAAM;AAAA,EACN,OAAO;AACX;AAkBA,IAAMC,eAAc;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACR;AAEO,IAAM,iBAAa;AAAA,EACtB,CACI;AAAA,IACI;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,IACX,GAAG;AAAA,EACP,GACA,QACC;AACD,UAAM,SACF;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA,cAAY,YAAY,YAAY,KAAK;AAAA,QACzC,gBAAc;AAAA,QACd,eAAa;AAAA,QACb,WAAW;AAAA,UACP;AAAA,UACA,WACM,8CACA;AAAA,UACNA,aAAY,IAAI;AAAA,UAChB,SAASF,eAAc,MAAM,IAAIC,gBAAe,OAAO;AAAA,UACvD,CAAC,aACI,SACK,mBAAmB,MAAM,IACzB,oBAAoB,OAAO;AAAA,UACrC;AAAA,QACJ;AAAA,QAEC;AAAA;AAAA,IACL;AAGJ,UAAM,iBAAiB,WAAW;AAClC,QAAI,CAAC,eAAgB,QAAO;AAE5B,WACI;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA,QACP,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,WACI,WACM,6BACA;AAAA,QAGT;AAAA;AAAA,IACL;AAAA,EAER;AACJ;AAEA,WAAW,cAAc;;;AH7DjB,IAAAE,uBAAA;AAzCR,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACD,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAE3B,IAAM,qBAAqB;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,SAAS,mBAAmB,MAAqB;AAC7C,SAAO,wBAAwB,IAAI,KAAK,IAAI;AAChD;AAEA,SAAS,eAAe,OAAuB;AAC3C,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC;AAC3D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAChD;AAEA,SAAS,kBAAkB,OAAuB;AAC9C,QAAM,QAAQ,IAAI;AAAA,IACd,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,OAAO;AAAA,EAC/D;AACA,MAAI,MAAM,SAAS,EAAG,QAAO,GAAG,MAAM,MAAM;AAC5C,QAAM,CAAC,IAAI,IAAI;AACf,SAAO,GAAG,MAAM,MAAM,IAAI,IAAI,GAAG,MAAM,WAAW,IAAI,KAAK,GAAG;AAClE;AAEA,SAAS,mBAAmB;AAAA,EACxB;AAAA,EACA;AACJ,GAGG;AACC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,mBAAmB,IAAI;AAAA,MAC3B;AAAA,MAEC;AAAA;AAAA,EACL;AAER;AAEA,SAAS,YAAY;AAAA,EACjB;AAAA,EACA;AAAA,EACA,OAAO;AACX,GAIG;AACC,QAAM,gBAAY,uBAA0B,IAAI;AAChD,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAAS,MACzC,mBAAmB,IAAI;AAAA,EAC3B;AACA,QAAM,cAAc,SAAS,OAAO,qBAAqB;AAEzD,gCAAU,MAAM;AACZ,QAAI,CAAC,mBAAmB,IAAI,GAAG;AAC3B,oBAAc,KAAK;AACnB;AAAA,IACJ;AAEA,QAAI,YAAY;AAChB,kBAAc,IAAI;AAElB,mBAAe,cAAc;AACzB,UAAI;AACA,cAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,YAAI,WAAW;AACX,iBAAO,MAAM;AACb;AAAA,QACJ;AAEA,cAAM,SAAS,UAAU;AACzB,cAAM,UAAU,QAAQ,WAAW,IAAI;AACvC,YAAI,CAAC,UAAU,CAAC,SAAS;AACrB,iBAAO,MAAM;AACb,wBAAc,KAAK;AACnB;AAAA,QACJ;AAEA,eAAO,QAAQ;AACf,eAAO,SAAS;AAEhB,cAAM,QAAQ,KAAK;AAAA,UACf,cAAc,OAAO;AAAA,UACrB,cAAc,OAAO;AAAA,QACzB;AACA,cAAM,QAAQ,OAAO,QAAQ;AAC7B,cAAM,SAAS,OAAO,SAAS;AAC/B,cAAM,KAAK,cAAc,SAAS;AAClC,cAAM,KAAK,cAAc,UAAU;AAEnC,gBAAQ,UAAU,GAAG,GAAG,aAAa,WAAW;AAChD,gBAAQ,UAAU,QAAQ,GAAG,GAAG,OAAO,MAAM;AAC7C,eAAO,MAAM;AAAA,MACjB,QAAQ;AACJ,YAAI,CAAC,UAAW,eAAc,KAAK;AAAA,MACvC;AAAA,IACJ;AAEA,SAAK,YAAY;AAEjB,WAAO,MAAM;AACT,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,MAAI,CAAC,YAAY;AACb,WAAO,8CAAC,sBAAmB,MAAM,iBAAiB,MAAY;AAAA,EAClE;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAY,KAAK;AAAA,MACjB,WAAW,GAAG,oBAAoB,mBAAmB,IAAI,CAAC;AAAA,MAC1D,OAAO;AAAA,MACP,QAAQ;AAAA;AAAA,EACZ;AAER;AAmBO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,eAAe,KAAK,OAAO;AAAA,EAC3B,SAAS;AAAA,EACT,OAAO,8CAAC,aAAU,WAAU,uBAAsB;AAAA,EAClD,QACI,gFAAE;AAAA;AAAA,IACsB,8CAAC,UAAK,WAAU,mBAAkB,oBAAM;AAAA,KAChE;AAAA,EAEJ,cAAc,8CAAC,aAAU,WAAU,uBAAsB;AAAA,EACzD,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AACJ,GAAoB;AAGhB,gCAAU,MAAM,6BAA6B,QAAQ,GAAG,CAAC,CAAC;AAK1D,WAAS,SAAS,UAAkB;AAChC,QAAI,YAAY,SAAS,WAAW,EAAG;AACvC,UAAM,EAAE,UAAU,SAAS,IAAI,eAAe,UAAU,OAAO;AAAA,MAC3D;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AACD,QAAI,SAAS,SAAS,EAAG,UAAS,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC;AACzD,QAAI,SAAS,SAAS,EAAG,YAAW,QAAQ;AAAA,EAChD;AAEA,QAAM,WAAW,MAAM,SAAS;AAChC,QAAM,SAAS,CAAC,YAAY,MAAM,SAAS;AAC3C,QAAM,eAAe,aAAa;AAClC,QAAM,UAAU,YAAY;AAC5B,QAAM,SAAS,YAAY;AAC3B,QAAM,cAAc,UAAU,OAAO,eAAe,OAAO;AAC3D,QAAM,cAAU,sBAAM;AACtB,QAAM,aAAa,GAAG,OAAO;AAE7B,WAAS,kBAAkB,OAAsC;AAC7D,aAAS,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC,CAAC;AAC7C,UAAM,OAAO,QAAQ;AAAA,EACzB;AAEA,MAAI,UAAU,CAAC,SAAU,QAAO;AAEhC,SACI,8CAAC,SAAI,WAAW,GAAG,yCAAyC,SAAS,GACjE;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,CAAC,UACG;AAAA,QACJ;AAAA,QACA,SACM,kEACA,UACE,yDACA;AAAA,QACR;AAAA,QACA,WACM,qBACA;AAAA,MACV;AAAA,MAGA,YAAY,CAAC,MAAM,EAAE,eAAe;AAAA,MACpC,QAAQ,CAAC,MAAM;AACX,UAAE,eAAe;AACjB,YAAI,SAAU;AACd,iBAAS,MAAM,KAAK,EAAE,aAAa,KAAK,CAAC;AAAA,MAC7C;AAAA,MAEC,WAAC,WACE;AAAA,QAAC;AAAA;AAAA,UACG,SAAS;AAAA,UACT,WAAW;AAAA,YACP;AAAA,YACA,UACM,sDACA;AAAA,YACN,SACM,yBACA;AAAA,UACV;AAAA,UAEC;AAAA;AAAA,YACD,8CAAC,UAAM,iBAAM;AAAA,YACb;AAAA,cAAC;AAAA;AAAA,gBACG,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL;AAAA,gBACA,UAAU,WAAW;AAAA,gBACrB,UAAU,YAAY,CAAC;AAAA,gBACvB,WAAU;AAAA,gBACV,UAAU;AAAA;AAAA,YACd;AAAA;AAAA;AAAA,MACJ,IAEA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA,UAAU,uBAAuB;AAAA,UACrC;AAAA,UAEC;AAAA,uBAAW,CAAC,UACT,8CAAC,UAAK,WAAU,+DACX,4BAAkB,KAAK,GAC5B;AAAA,YAEJ;AAAA,cAAC;AAAA;AAAA,gBACG,WAAW;AAAA,kBACP;AAAA,kBACA,UACM;AAAA,oBACI;AAAA,oBACA,SACM,wBACA;AAAA,kBACV,IACA;AAAA,kBACN,gBACI,CAAC,WACD;AAAA,gBACR;AAAA,gBAEC;AAAA,wBAAM,IAAI,CAAC,MAAM,UACd;AAAA,oBAAC;AAAA;AAAA,sBAEG,WAAW;AAAA,wBACP;AAAA,wBACA,gBAAgB;AAAA,sBACpB;AAAA,sBAEA;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACG;AAAA,4BACA,iBAAiB;AAAA,4BACjB,MAAM;AAAA;AAAA,wBACV;AAAA,wBACC,CAAC,WACE,gFACI;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACG,WAAW;AAAA,gCACP;AAAA,gCACA,eACM,eACA;AAAA,8BACV;AAAA,8BAEC,eAAK;AAAA;AAAA,0BACV;AAAA,0BACA,8CAAC,UAAK,WAAU,gDACX,yBAAe,KAAK,IAAI,GAC7B;AAAA,2BACJ;AAAA,wBAEH,CAAC,YACE,8CAAC,SAAI,WAAU,6CACX;AAAA,0BAAC;AAAA;AAAA,4BACG,QAAO;AAAA,4BACP,OAAO,UAAU,KAAK,IAAI;AAAA,4BAC1B,SAAS,MACL;AAAA,8BACI,MAAM;AAAA,gCACF,CAAC,GAAG,MACA,MAAM;AAAA,8BACd;AAAA,4BACJ;AAAA,4BAGJ,wDAAC,SAAM,WAAU,uBAAsB;AAAA;AAAA,wBAC3C,GACJ;AAAA;AAAA;AAAA,oBA5CC,GAAG,KAAK,IAAI,IAAI,KAAK;AAAA,kBA8C9B,CACH;AAAA,kBAEA,CAAC,UAAU,CAAC,gBAAgB,UACzB,8CAAC,QAAG,WAAU,8BACV;AAAA,oBAAC;AAAA;AAAA,sBACG,SAAS;AAAA,sBACT,WAAW;AAAA,wBACP;AAAA,wBACA,UACM,gDACA;AAAA,sBACV;AAAA,sBAEA;AAAA,sEAAC,YAAS,WAAU,uBAAsB;AAAA,wBACzC,CAAC,WACE,8CAAC,UAAK,WAAU,mCAAkC,iBAElD;AAAA,wBAEJ;AAAA,0BAAC;AAAA;AAAA,4BACG,IAAI;AAAA,4BACJ,MAAK;AAAA,4BACL,cAAW;AAAA,4BACX;AAAA,4BACA,UAAQ;AAAA,4BACR,UAAU,YAAY,CAAC;AAAA,4BACvB,WAAU;AAAA,4BACV,UAAU;AAAA;AAAA,wBACd;AAAA;AAAA;AAAA,kBACJ,GACJ;AAAA;AAAA;AAAA,YAER;AAAA,YAEC,OAAO,SAAS,QAAQ,KACrB,WAAW,KACX,CAAC,WACG,+CAAC,UAAK,WAAU,6CACX;AAAA,oBAAM;AAAA,cAAO;AAAA,cAAI;AAAA,cAAS;AAAA,eAC/B;AAAA;AAAA;AAAA,MAEZ;AAAA;AAAA,EAER,GACJ;AAER;;;AI9WQ,IAAAC,uBAAA;AAbD,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,QAAQ;AACZ;AAAA;AAAA;AAAA,EAGI;AAAA,IAAC;AAAA;AAAA,MACG,SAAS,WAAW;AAAA,MACpB,WAAW;AAAA,MACX,WAAU;AAAA,MACV,iBAAe;AAAA,MAEf,wDAAC,UAAK,WAAU,sQAAqQ,eAErR;AAAA;AAAA,EACJ;AAAA;;;ACwBI,IAAAC,uBAAA;AAxCR,IAAM,YAAY;AAAA,EACd,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAMC,iBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SACI;AAAA,EACJ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AACZ;AAWO,IAAM,OAAsB,CAAC;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,QAAM,cAAc,SACdA,eAAc,MAAM,IACpB;AACN,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACnCY,IAAAC,uBAAA;AAjBZ,IAAM,gBACF;AAOG,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AACJ,GAAiB;AACb,QAAM,OAAO,GAAG,MAAM;AACtB,MAAI,CAAC,OAAO;AACR,WACI,8CAAC,QAAK,QAAO,WAAU,WAAW,GAAG,eAAe,SAAS,GACxD,gBACL;AAAA,EAER;AACA,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,SAAS;AAAA,MACT,cAAY;AAAA,MACZ,WAAU;AAAA,MAET,WAAC,WACE;AAAA,QAAC;AAAA;AAAA,UACG,QAAQ,SAAS,YAAY;AAAA,UAC7B,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,UAEC;AAAA,qBACG,8CAAC,aAAU,eAAY,QAAO,IAE9B,8CAAC,iBAAc,eAAY,QAAO;AAAA,YAErC,SAAS,WAAW;AAAA;AAAA;AAAA,MACzB;AAAA;AAAA,EAER;AAER;;;AC/BQ,IAAAC,uBAAA;AAdD,SAAS,SAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAqB;AACjB,QAAM,YAA+B,MAAM;AAC3C,QAAM,aACF,YAAY,eAAgB,UAAiC,IAAI;AAErE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,IAAI;AAAA,MACJ,SAAQ;AAAA,MACR,QAAQ,aAAa,WAAW;AAAA,MAChC,KAAK,aAAa,wBAAwB;AAAA,MACzC,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA,YAAY,cAAc;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA,oBAAY,cACT;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACd;AAAA,QAEH;AAAA;AAAA;AAAA,EACL;AAER;;;AC9BY,IAAAC,uBAAA;AAhBL,IAAM,mBAA8C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA,IAEC;AAAA,cACG,8CAAC,SAAI,WAAU,mJACV,gBACL;AAAA,OAEF,SAAS,WACP,+CAAC,SAAI,WAAU,kBACV;AAAA,iBACG,8CAAC,QAAK,IAAG,KAAI,MAAK,MAAK,MAAK,UAAS,QAAO,YACvC,iBACL;AAAA,QAEH,UACG,8CAAC,QAAK,IAAG,KAAI,MAAK,MAAK,MAAK,QAAO,WAAU,cACxC,kBACL;AAAA,SAER;AAAA,MAEH;AAAA;AAAA;AACL;;;AC2BI,IAAAC,uBAAA;AA5CR,IAAM,eACF;AAEJ,IAAM,WACF;AAEJ,IAAM,aACF;AAEG,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,YAAY;AAChB,MAAM;AACF,QAAM,gBAAgB,SAAS,WAAW;AAE1C,QAAM,aAAa,CAAC,WAAmB;AACnC,QAAI,SAAS,SAAS,MAAM,GAAG;AAC3B,eAAS,SAAS,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC;AAAA,IACjD,OAAO;AACH,eAAS,CAAC,GAAG,UAAU,MAAM,CAAC;AAAA,IAClC;AAAA,EACJ;AAEA,QAAM,YAAY,MAAM,SAAS,CAAC,CAAC;AAEnC,QAAM,cAAc,WACd,eACA,gBACE,cACA,SAAS,WAAW,IACjB,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,SAAS,CAAC,CAAC,GAAG,SACzD,eACA,GAAG,SAAS,MAAM;AAE5B,QAAM,YAAY,QACd,8CAAC,UAAK,WAAU,8DACX,iBACL,IACA;AAEJ,MAAI,UAAU;AACV,WACI;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,UACP;AAAA,UACA,aAAa;AAAA,QACjB;AAAA,QAEC;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,SAAS,mBAAmB;AAAA,cAC5B,OAAM;AAAA,cACN,WAAW;AAAA,gBACP;AAAA,gBACA,aAAa;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,UAAQ;AAAA,kBACR,cAAY,aAAa,SAAS;AAAA,kBAClC,WAAW;AAAA,oBACP;AAAA,oBACA,aAAa;AAAA,oBACb;AAAA,kBACJ;AAAA,kBAEA;AAAA,kEAAC,UAAK,WAAU,4EACX,uBACL;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACG,UAAU;AAAA,wBACV,WAAU;AAAA;AAAA,oBACd;AAAA;AAAA;AAAA,cACJ;AAAA;AAAA,UACJ;AAAA;AAAA;AAAA,IACJ;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,aAAa;AAAA,MACjB;AAAA,MAEC;AAAA;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,WAAU;AAAA,YACV,SAAS,CAAC,SACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY,aAAa,SAAS;AAAA,gBAClC,WAAW;AAAA,kBACP;AAAA,kBACA,aAAa;AAAA,kBACb,OACM,4BACA;AAAA,gBACV;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAW;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA,sBAEC;AAAA;AAAA,kBACL;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU;AAAA,sBACV,WAAW;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA;AAAA,kBACJ;AAAA;AAAA;AAAA,YACJ;AAAA,YAGJ,yDAAC,cAAW,WAAU,kBAClB;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAc;AAAA,kBACd,WAAW;AAAA,oBACP;AAAA,oBACA,gBACM,4EACA;AAAA,kBACV;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACG,eAAY;AAAA,wBACZ,WAAW;AAAA,0BACP;AAAA,0BACA,iBACI;AAAA,wBACR;AAAA,wBAEC,2BAAiB;AAAA;AAAA,oBACtB;AAAA,oBACC;AAAA;AAAA;AAAA,cACL;AAAA,cACC,QAAQ,IAAI,CAAC,QAAQ;AAClB,sBAAM,YAAY,SAAS,SAAS,IAAI,KAAK;AAC7C,uBACI;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBAEL,SAAS,MAAM,WAAW,IAAI,KAAK;AAAA,oBACnC,gBAAc;AAAA,oBACd,WAAW;AAAA,sBACP;AAAA,sBACA,YACM,0DACA;AAAA,oBACV;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACG,eAAY;AAAA,0BACZ,WAAW;AAAA,4BACP;AAAA,4BACA,aACI;AAAA,0BACR;AAAA,0BAEC,uBAAa;AAAA;AAAA,sBAClB;AAAA,sBACA,8CAAC,UAAK,WAAU,gDACX,cAAI,OACT;AAAA;AAAA;AAAA,kBAtBK,IAAI;AAAA,gBAuBb;AAAA,cAER,CAAC;AAAA,eACL;AAAA;AAAA,QACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;ACtLQ,IAAAC,uBAAA;AA3BR,IAAM,OACF;AACJ,IAAM,gBAAgB;AACtB,IAAM,kBACF;AAaG,SAAS,QAAgD;AAAA,EAC5D;AAAA,EACA,SAAS;AAAA,EACT,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAA+B,MAAM;AAC3C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,gBAAc,SAAS,SAAS;AAAA,MAChC,WAAW;AAAA,QACP;AAAA,QACA,SAAS,gBAAgB;AAAA,QACzB;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,eACG,8CAAC,QAAK,WAAU,sCAAqC,IACrD;AAAA,QACH;AAAA;AAAA;AAAA,EACL;AAER;;;ACtDA,IAAAC,iBAAqD;;;ACDrD,IAAM,aAAa;AAcZ,SAAS,cAAc,OAAO,oBAAI,KAAK,GAAS;AACnD,SAAO,IAAI;AAAA,IACP,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW,CAAC;AAAA,EACzE;AACJ;AAEO,SAAS,WAAW,MAAY,MAAoB;AACvD,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,OAAK,WAAW,KAAK,WAAW,IAAI,IAAI;AACxC,SAAO;AACX;AAEA,SAAS,gBAAgB,MAAkB;AACvC,SAAO,IAAI,KAAK,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC;AAC1E;AAEA,SAAS,aAAa,MAAY,QAAsB;AACpD,SAAO,IAAI;AAAA,IACP,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,IAAI,QAAQ,CAAC;AAAA,EAClE;AACJ;AAEA,SAAS,kBAAkB,MAAkB;AACzC,QAAM,MAAM,KAAK,UAAU,KAAK;AAChC,SAAO,WAAW,cAAc,IAAI,GAAG,IAAI,GAAG;AAClD;AAEA,SAAS,oBAAoB,MAAoB;AAC7C,QAAM,MAAM,KAAK,UAAU,KAAK;AAChC,QAAM,WAAW,WAAW,cAAc,IAAI,GAAG,IAAI,GAAG;AACxD,QAAM,UAAU,SAAS,eAAe;AACxC,QAAM,YAAY,IAAI,KAAK,KAAK,IAAI,SAAS,GAAG,CAAC,CAAC;AAClD,QAAM,UAAU,KAAK;AAAA,MACf,SAAS,QAAQ,IAAI,UAAU,QAAQ,KAAK,aAAa,KAAK;AAAA,EACpE;AACA,SAAO,GAAG,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;AAC1D;AAEA,SAAS,oBAAoB,MAAoB;AAC7C,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AACzC;AAEA,SAAS,oBAAoB,MAAoB;AAC7C,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAC3D;AAEA,SAAS,qBAAqB,MAAoB;AAC9C,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,CAAC;AACxC;AAEO,SAAS,eACZ,aACA,OAAO,oBAAI,KAAK,GACD;AACf,MAAI,gBAAgB,OAAO;AACvB,WAAO;AAAA,MACH;AAAA,MACA,QAAQ,oBAAoB,cAAc,IAAI,CAAC;AAAA,IACnD;AAAA,EACJ;AACA,MAAI,gBAAgB,QAAQ;AACxB,WAAO,EAAE,aAAa,QAAQ,oBAAoB,IAAI,EAAE;AAAA,EAC5D;AACA,SAAO,EAAE,aAAa,QAAQ,qBAAqB,gBAAgB,IAAI,CAAC,EAAE;AAC9E;AAEO,SAAS,gBAAiC;AAC7C,SAAO,eAAe,KAAK;AAC/B;AAEO,SAAS,eAAe,WAA0C;AACrE,MAAI,UAAU,gBAAgB,OAAO;AACjC,UAAMC,SAAQ,oBAAI,KAAK,GAAG,UAAU,MAAM,gBAAgB;AAC1D,WAAO,EAAE,OAAAA,QAAO,KAAK,WAAWA,QAAO,CAAC,EAAE;AAAA,EAC9C;AAEA,MAAI,UAAU,gBAAgB,QAAQ;AAClC,UAAM,CAACC,WAAU,QAAQ,IAAI,UAAU,OAAO,MAAM,IAAI;AACxD,UAAM,UAAU,OAAOA,SAAQ;AAC/B,UAAM,UAAU,OAAO,QAAQ;AAC/B,UAAM,OAAO,IAAI,KAAK,KAAK,IAAI,SAAS,GAAG,CAAC,CAAC;AAC7C,UAAMD,SAAQ,WAAW,kBAAkB,IAAI,IAAI,UAAU,KAAK,CAAC;AACnE,WAAO,EAAE,OAAAA,QAAO,KAAK,WAAWA,QAAO,CAAC,EAAE;AAAA,EAC9C;AAEA,QAAM,CAAC,UAAU,SAAS,IAAI,UAAU,OAAO,MAAM,GAAG;AACxD,QAAM,QAAQ,IAAI;AAAA,IACd,KAAK,IAAI,OAAO,QAAQ,GAAG,OAAO,SAAS,IAAI,GAAG,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO,KAAK,aAAa,OAAO,CAAC,EAAE;AAChD;AAEO,SAAS,oBAAoB,WAAsC;AACtE,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,SAAS;AAC/C,QAAM,aAAuB,CAAC;AAC9B,QAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,MAAI,UAAU,gBAAgB,OAAO;AACjC,WAAO,SAAS,KAAK;AACjB,iBAAW,KAAK,GAAG,oBAAoB,MAAM,CAAC,QAAQ;AACtD,aAAO,YAAY,OAAO,YAAY,IAAI,CAAC;AAAA,IAC/C;AACA,WAAO;AAAA,EACX;AAEA,SAAO,SAAS,KAAK;AACjB,eAAW,KAAK,oBAAoB,MAAM,CAAC;AAC3C,WAAO,WAAW,OAAO,WAAW,IAAI,CAAC;AAAA,EAC7C;AACA,SAAO;AACX;AAEO,SAAS,sBACZ,WACA,aACI;AACJ,MAAI,gBAAgB,OAAO;AACvB,WAAO,oBAAI,KAAK,GAAG,UAAU,QAAQ,KAAK,GAAG,CAAC,OAAO;AAAA,EACzD;AACA,SAAO,oBAAI,KAAK,GAAG,SAAS,gBAAgB;AAChD;AAEO,SAAS,mBACZ,WACA,UAAU,oBAAI,KAAK,CAAC,GACpB,UAAU,cAAc,GACjB;AACP,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,SAAS;AAC/C,SAAO,MAAM,WAAW,SAAS;AACrC;;;ACbQ,IAAAE,uBAAA;AAlFR,IAAM,qBACF;AAEJ,IAAM,qBAAqB;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAMC,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnB,MAAM;AAAA,IACF,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UACI;AAAA,EACR;AAAA;AAAA;AAAA,EAGA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UACI;AAAA,EACR;AACJ;AAKA,IAAMC,iBAAgB;AAAA,EAClB,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,UACI;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,UACI;AAAA,EACR;AACJ;AAEO,SAAS,UAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACP,GAAsB;AAClB,QAAM,YAAyB,MAAM;AACrC,QAAM,WAAW,cAAc;AAC/B,QAAM,SACF,WAAW,YACLD,gBAAe,OACf,SACE;AAAA,IACI,GAAGC,eAAc,MAAM;AAAA,IACvB,OAAOA,eAAc,MAAM,EAAE;AAAA,EACjC,IACAD,gBAAe,OAAO;AAClC,QAAM,cAAc,WACd,CAAC,UAA2B;AACxB,UAAM,eAAe;AACrB,UAAM,gBAAgB;AAAA,EAC1B,IACA;AAEN,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACH,GAAI,WAAW,EAAE,MAAM,UAAU,SAAS,IAAI,CAAC;AAAA,MAC/C,GAAI,CAAC,YAAY,WACZ,EAAE,iBAAiB,MAAM,UAAU,GAAG,IACtC,CAAC;AAAA,MACN,GAAI,cAAc,OAAO,WAAW,EAAE,MAAM,OAAU,IAAI,CAAC;AAAA,MAC5D,SAAS;AAAA,MACR,GAAI,cAAc,SAAY,EAAE,cAAc,UAAU,IAAI,CAAC;AAAA,MAG7D,GAAI,WACC,EAAE,gBAAgB,OAAO,IACzB,EAAE,gBAAgB,WAAW,OAAO,SAAS,OAAU;AAAA,MAC7D,WAAW;AAAA,QACP;AAAA,QACAA,gBAAe,OAAO,EAAE;AAAA,QACxB,WAAW,UACL,OAAO,QACP,SACE,OAAO,SACP,OAAO;AAAA,QACf,YACI;AAAA,QACJ,mBAAmB,IAAI;AAAA,QACvB;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,QACA,UAAU,QACP,8CAAC,UAAK,WAAU,iDACX,kBACL;AAAA;AAAA;AAAA,EAER;AAER;;;AFuC4B,IAAAE,uBAAA;AAjL5B,IAAM,iBAAiB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACvE,IAAM,eAAe;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEA,IAAM,aACF;AAEJ,SAASC,cAAa,MAAY,QAAsB;AACpD,SAAO,IAAI;AAAA,IACP,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,IAAI,QAAQ,CAAC;AAAA,EAClE;AACJ;AAEA,SAAS,eAAe,WAAyB;AAC7C,QAAM,WAAW,IAAI;AAAA,IACjB,KAAK,IAAI,UAAU,eAAe,GAAG,UAAU,YAAY,GAAG,CAAC;AAAA,EACnE;AACA,QAAM,eAAe,SAAS,UAAU,KAAK;AAC7C,QAAM,SAAS,WAAW,UAAU,IAAI,YAAY;AACpD,SAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,UAAU,WAAW,QAAQ,KAAK,CAAC;AAC7E;AAEA,SAAS,WAAW,MAAY,OAAsB;AAClD,SAAO,KAAK,QAAQ,MAAM,MAAM,QAAQ;AAC5C;AAEA,SAAS,WAAW,OAA8B;AAC9C,SAAO,eAAe,KAAK,EAAE;AACjC;AAEA,SAAS,aAAa,OAAgC;AAClD,SAAO,GAAG,MAAM,WAAW,IAAI,MAAM,MAAM;AAC/C;AAEA,SAAS,gBAAgB,MAAY,QAA0B,SAAS;AACpE,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACpC,UAAU;AAAA,IACV;AAAA,IACA,MAAM;AAAA,EACV,CAAC;AACL;AAEA,SAAS,eAAe,MAAY;AAChC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACpC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACV,CAAC;AACL;AAEA,SAAS,kBAAkB,OAAa,KAAW;AAC/C,QAAM,UAAU,WAAW,KAAK,EAAE;AAClC,QAAM,YACF,MAAM,eAAe,MAAM,QAAQ,eAAe,KAClD,MAAM,YAAY,MAAM,QAAQ,YAAY;AAEhD,MAAI,WAAW;AACX,UAAM,QAAQ,MAAM,mBAAmB,SAAS;AAAA,MAC5C,UAAU;AAAA,MACV,OAAO;AAAA,IACX,CAAC;AACD,WAAO,GAAG,KAAK,IAAI,MAAM,WAAW,CAAC,IAAI,QAAQ,WAAW,CAAC,KAAK,QAAQ,eAAe,CAAC;AAAA,EAC9F;AAEA,SAAO,GAAG,eAAe,KAAK,CAAC,MAAM,eAAe,OAAO,CAAC;AAChE;AAEA,SAAS,oBAAoB,OAAgC;AACzD,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,KAAK;AAC3C,MAAI,MAAM,gBAAgB,MAAO,QAAO,eAAe,KAAK;AAC5D,MAAI,MAAM,gBAAgB,OAAQ,QAAO,kBAAkB,OAAO,GAAG;AACrE,SAAO,gBAAgB,OAAO,MAAM;AACxC;AAEA,SAAS,WACL,UACA,aAC0B;AAC1B,MAAI,gBAAgB,SAAS;AACzB,UAAMC,SAAQ,IAAI,KAAK,KAAK,IAAI,SAAS,eAAe,GAAG,GAAG,CAAC,CAAC;AAChE,WAAO,EAAE,OAAAA,QAAO,KAAKD,cAAaC,QAAO,EAAE,EAAE;AAAA,EACjD;AAEA,QAAM,QAAQ,IAAI;AAAA,IACd,KAAK,IAAI,SAAS,eAAe,GAAG,SAAS,YAAY,GAAG,CAAC;AAAA,EACjE;AACA,SAAO,EAAE,OAAO,KAAKD,cAAa,OAAO,CAAC,EAAE;AAChD;AAEO,IAAM,eAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA,UAAU,oBAAI,KAAK,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAe,MAAM,WAAW,KAAK,CAAC;AACtE,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAe,MAAM,WAAW,KAAK,CAAC;AAC1E,QAAM,0BAAsB,uBAAsB,IAAI;AACtD,QAAM,EAAE,aAAa,OAAO,IAAI;AAEhC,gCAAU,MAAM;AACZ,UAAM,sBAAsB,aAAa,EAAE,aAAa,OAAO,CAAC;AAChE,QAAI,oBAAoB,YAAY,qBAAqB;AACrD,0BAAoB,UAAU;AAC9B;AAAA,IACJ;AACA,UAAM,iBAAiB,WAAW,EAAE,aAAa,OAAO,CAAC;AACzD,kBAAc,cAAc;AAC5B,gBAAY,cAAc;AAAA,EAC9B,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,YAAQ,wBAAQ,MAAM,eAAe,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAChE,QAAM,iBAAiB,eAAe,KAAK;AAC3C,QAAM,QAAQ,cAAc,OAAO;AACnC,QAAM,mBACF,MAAM,gBAAgB,UAChBA,cAAa,UAAU,GAAG,IAC1BA,cAAa,UAAU,EAAE;AACnC,QAAM,eACF,MAAM,gBAAgB,UAChBA,cAAa,UAAU,EAAE,IACzBA,cAAa,UAAU,CAAC;AAClC,QAAM,iBAAiB,WAAW,kBAAkB,MAAM,WAAW;AACrE,QAAM,aAAa,WAAW,cAAc,MAAM,WAAW;AAC7D,QAAM,mBAAmB,eAAe,OAAO;AAC/C,QAAM,eAAe,WAAW,QAAQ;AACxC,QAAM,eAAe,oBAAoB,KAAK;AAE9C,QAAM,kBAAkB,CAAC,WAA4B,WAAiB;AAClE,wBAAoB,UAAU,aAAa,SAAS;AACpD,kBAAc,MAAM;AACpB,gBAAY,MAAM;AAClB,aAAS,SAAS;AAAA,EACtB;AAEA,QAAM,iBAAiB,CAACE,iBAAmC;AACvD,oBAAgB,eAAeA,cAAa,UAAU,GAAG,UAAU;AAAA,EACvE;AAEA,QAAM,aAAa,CAAC,SAAe;AAC/B,oBAAgB,eAAe,MAAM,aAAa,IAAI,GAAG,IAAI;AAC7D,YAAQ,KAAK;AAAA,EACjB;AAEA,QAAM,YACF,MAAM,gBAAgB,UAChB,OAAO,SAAS,eAAe,CAAC,IAChC,gBAAgB,UAAU,MAAM;AAE1C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WACI,UACM,mBACA;AAAA,MAGT;AAAA,SAAC,WACE,8CAAC,SAAI,WAAU,4CACT,WAAC,OAAO,QAAQ,OAAO,EAA0B;AAAA,UAC/C,CAACA,iBACG;AAAA,YAAC;AAAA;AAAA,cAEG,QAAQ,MAAM,gBAAgBA;AAAA,cAC9B,SAAS,MAAM,eAAeA,YAAW;AAAA,cAExC,UAAAA,aAAY,CAAC,EAAE,YAAY,IACxBA,aAAY,MAAM,CAAC;AAAA;AAAA,YALlBA;AAAA,UAMT;AAAA,QAER,GACJ;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,cAAc;AAAA,YACd,WAAU;AAAA,YACV,SACI,YACC,CAAC,WACE;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY,0BAA0B,YAAY;AAAA,gBAClD,WAAW;AAAA,kBACP;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UACI;AAAA,gBACR;AAAA,gBAEA;AAAA,gEAAC,UAAK,WAAU,kBACX,wBACL;AAAA,kBACA,8CAAC,eAAY,UAAU,QAAQ;AAAA;AAAA;AAAA,YACnC;AAAA,YAIP;AAAA;AAAA,cACD,+CAAC,SAAI,WAAU,kEACX;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,gBAAgB;AAAA,oBAC3C,WAAW;AAAA,sBACP;AAAA,sBACA,oBACI;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,gBACL;AAAA,gBACA,8CAAC,SAAI,WAAU,8DACV,qBACL;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,YAAY;AAAA,oBACvC,WAAW;AAAA,sBACP;AAAA,sBACA,gBACI;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,gBACL;AAAA,iBACJ;AAAA,cAEC,MAAM,gBAAgB,UACnB,8CAAC,SAAI,WAAU,8CACV,uBAAa,IAAI,CAAC,OAAO,eAAe;AACrC,sBAAM,OAAO,IAAI;AAAA,kBACb,KAAK;AAAA,oBACD,SAAS,eAAe;AAAA,oBACxB;AAAA,oBACA;AAAA,kBACJ;AAAA,gBACJ;AACA,sBAAM,aAAa;AAAA,kBACf,eAAe,SAAS,IAAI;AAAA,kBAC5B;AAAA,kBACA;AAAA,gBACJ;AACA,sBAAM,YAAY,KAAK,mBAAmB,SAAS;AAAA,kBAC/C,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,MAAM;AAAA,gBACV,CAAC;AACD,sBAAM,WACF,KAAK,eAAe,MAChB,eAAe,MAAM,eAAe,KACxC,KAAK,YAAY,MACb,eAAe,MAAM,YAAY;AACzC,uBACI;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBAEL,cAAY;AAAA,oBACZ,gBAAc;AAAA,oBACd,UAAU,CAAC;AAAA,oBACX,SAAS,MAAM,WAAW,IAAI;AAAA,oBAC9B,WAAW;AAAA,sBACP;AAAA,sBACA,WACM,0DACA;AAAA,sBACN,CAAC,cACG;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,kBAdI;AAAA,gBAeT;AAAA,cAER,CAAC,GACL,IAEA,gFACI;AAAA,8DAAC,SAAI,WAAU,mJACV,yBAAe,IAAI,CAAC,UACjB,8CAAC,SAAiB,mBAAR,KAAc,CAC3B,GACL;AAAA,gBACA,8CAAC,SAAI,WAAU,4CACV,gBAAM,IAAI,CAAC,SAAS;AACjB,wBAAM,iBACF,KAAK,YAAY,MACjB,SAAS,YAAY;AACzB,wBAAM,aAAa;AAAA,oBACf,eAAe,MAAM,aAAa,IAAI;AAAA,oBACtC;AAAA,oBACA;AAAA,kBACJ;AACA,wBAAM,YACF,MAAM,gBAAgB,SAChB,UAAU,oBAAoB,eAAe,QAAQ,IAAI,CAAC,CAAC,KAC3D,UAAU,KAAK;AAAA,oBACX;AAAA,oBACA;AAAA,sBACI,UAAU;AAAA,sBACV,SAAS;AAAA,sBACT,OAAO;AAAA,sBACP,KAAK;AAAA,sBACL,MAAM;AAAA,oBACV;AAAA,kBACJ,CAAC;AACX,wBAAM,WACF,MAAM,gBAAgB,QAChB,WAAW,MAAM,eAAe,KAAK,IACrC,QAAQ,eAAe,SACvB,OAAO,eAAe;AAChC,yBACI;AAAA,oBAAC;AAAA;AAAA,sBACG,MAAK;AAAA,sBAEL,cAAY;AAAA,sBACZ,gBAAc;AAAA,sBACd,UAAU,CAAC;AAAA,sBACX,SAAS,MAAM,WAAW,IAAI;AAAA,sBAC9B,WAAW;AAAA,wBACP;AAAA,wBACA,CAAC,kBACG;AAAA,wBACJ,WAAW,MAAM,KAAK,KAClB;AAAA,wBACJ,WACM,0DACA;AAAA,wBACN,CAAC,cACG;AAAA,sBACR;AAAA,sBAEC,eAAK,WAAW;AAAA;AAAA,oBAlBZ,KAAK,YAAY;AAAA,kBAmB1B;AAAA,gBAER,CAAC,GACL;AAAA,iBACJ;AAAA;AAAA;AAAA,QAER;AAAA;AAAA;AAAA,EACJ;AAER;;;AGrWQ,IAAAC,uBAAA;AAbD,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,OACF,gFACK;AAAA,aACG,8CAAC,QAAK,IAAG,OAAM,WAAU,mBACpB,iBACL;AAAA,IAEH;AAAA,KACL;AAGJ,QAAM,UACF,gFACI;AAAA,mDAAC,YAAO,WAAU,mFACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACG,IAAG;AAAA,UACH,MAAK;AAAA,UACL,WAAW,GAAG,mBAAmB,cAAc;AAAA,UAE9C;AAAA;AAAA,MACL;AAAA,MACC,UACG,8CAAC,SAAI,WAAW,GAAG,kBAAkB,eAAe,GAC/C,kBACL;AAAA,OAER;AAAA,IACC;AAAA,KACL;AAGJ,SACI,8CAAC,aAAQ,IAAQ,WAAW,GAAG,sBAAsB,SAAS,GACzD,mBACG;AAAA,IAAC;AAAA;AAAA,MACG,SAAQ;AAAA,MACR,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL,IAEA,8CAAC,SAAI,WAAU,yCACV,mBACL,GAER;AAER;;;AC5CI,IAAAC,uBAAA;AA1BJ,IAAM,sBAAuD;AAAA,EACzD,MAAM;AAAA,EACN,MAAM;AACV;AAaO,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI,+CAAC,SAAI,WAAW,GAAG,iBAAiB,SAAS,GACzC;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH,MAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAO;AAAA,MACP,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,oBAAoB,OAAO;AAAA,QAC3B;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACC,UACG;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAW,GAAG,cAAc,eAAe;AAAA,MAE1C;AAAA;AAAA,EACL;AAAA,GAER;;;ACpEJ,IAAAC,iBAAmD;;;AC0C3C,IAAAC,uBAAA;AAfD,SAAS,WAA8C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAuB;AACnB,QAAM,YAA+B,MAAM;AAC3C,QAAM,aACF,YAAY,eAAgB,UAAiC,IAAI;AAErE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,QAAQ,cAAc,OAAO,WAAW,WAAW;AAAA,MACnD,KACI,cAAc,OAAO,WACf,wBACA;AAAA,MAEV,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7D,aAAW;AAAA,MACX,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,YAAY,cACT;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACd;AAAA;AAAA;AAAA,EAER;AAER;;;ADEY,IAAAC,uBAAA;AAlCZ,SAAS,eAAe,OAAwB;AAC5C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACA,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,EACzD,QAAQ;AACJ,WAAO,OAAO,KAAK;AAAA,EACvB;AACJ;AAEA,SAAS,YAAY,OAA6B;AAC9C,QAAM,YAAY,eAAe,KAAK;AACtC,QAAM,WAAW,UAAU,MAAM,wBAAwB;AACzD,MAAI,SAAS;AACb,SAAO,SAAS,IAAI,CAAC,SAAS,UAAU;AACpC,UAAM,MAAM,GAAG,MAAM,IAAI,OAAO;AAChC,cAAU,QAAQ;AAClB,QAAI,CAAC,QAAQ,WAAW,UAAU,EAAG,QAAO;AAE5C,QAAI,OAAO;AACX,UAAM,YACF,SAAS,QAAQ,CAAC,GAAG,SAAS,GAAG,KACjC,SAAS,QAAQ,CAAC,GAAG,WAAW,GAAG;AACvC,QAAI,sBACC,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,KAAK,MAAM,KAAK,GAAG,UAAU;AAErE,WACI,CAAC,cACA,YAAY,KAAK,IAAI,KACjB,KAAK,SAAS,GAAG,KAAK,qBAAqB,IAClD;AACE,UAAI,KAAK,SAAS,GAAG,EAAG;AACxB,aAAO,KAAK,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,WACI,+CAAC,2BACG;AAAA,oDAAC,cAAW,MAAa,gBAAK;AAAA,MAC7B,QAAQ,MAAM,KAAK,MAAM;AAAA,SAFf,GAGf;AAAA,EAER,CAAC;AACL;AAEA,SAAS,UAAU;AAAA,EACf;AAAA,EACA,QAAQ;AACZ,GAGG;AACC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,QACM,uGACA;AAAA,MACV;AAAA,MAEC,sBAAY,KAAK;AAAA;AAAA,EACtB;AAER;AAEA,IAAM,gBAAgD;AAAA,EAClD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AACZ;AAEA,SAAS,WAAW,EAAE,OAAO,GAA+B;AACxD,QAAM,OACF,WAAW,cAAc,WAAW,uBAChC,8CAAC,aAAU,WAAU,gBAAe,IACpC,WAAW,WAAW,WAAW,WACjC,8CAAC,SAAM,WAAU,gBAAe,IAEhC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,WAAW,aAAa;AAAA,MAC5B;AAAA;AAAA,EACJ;AAER,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAa;AAAA,MACb,WAAW;AAAA,QACP;AAAA,QACA,WAAW,cAAc,WAAW,uBAC9B,4DACA,WAAW,WAAW,WAAW,WAC/B,kEACA;AAAA,MACZ;AAAA,MAEC;AAAA;AAAA,QACA,cAAc,MAAM;AAAA;AAAA;AAAA,EACzB;AAER;AAGO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,UAAU,SAAY,aAAa;AAAA,EAC5C,cAAc;AAAA,EACd;AACJ,GAAyB;AACrB,QAAM,SAAS,UAAU,SAAY,SAAS;AAC9C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,WAAW;AAC5C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,oBAAkB;AAAA,MAClB,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,SAAS,MAAM,QAAQ,CAACC,aAAY,CAACA,QAAO;AAAA,YAC5C,WAAU;AAAA,YAEV;AAAA,4DAAC,UAAK,WAAU,yJACZ,wDAAC,YAAS,WAAU,kBAAiB,GACzC;AAAA,cACA,8CAAC,UAAK,WAAU,+FACX,gBACL;AAAA,cACA,8CAAC,cAAW,QAAgB;AAAA,cAC5B;AAAA,gBAAC;AAAA;AAAA,kBACG,UAAU;AAAA,kBACV,WAAU;AAAA;AAAA,cACd;AAAA;AAAA;AAAA,QACJ;AAAA,QACC,QACG,+CAAC,SAAI,WAAU,qIACV;AAAA,oBAAU,UACP,+CAAC,SAAI,WAAU,yCACX;AAAA,0DAAC,QAAK,MAAK,MAAK,MAAK,SAAQ,QAAO,QAAO,wBAE3C;AAAA,YACA,8CAAC,aAAU,OAAO,OAAO;AAAA,aAC7B;AAAA,UAEH,WAAW,UACR,+CAAC,SAAI,WAAU,yCACX;AAAA,0DAAC,QAAK,MAAK,MAAK,MAAK,SAAQ,QAAO,QAC/B,oBAAU,SAAY,WAAW,SACtC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACG,OAAO;AAAA,gBACP,OAAO,UAAU;AAAA;AAAA,YACrB;AAAA,aACJ;AAAA,WAER;AAAA;AAAA;AAAA,EAER;AAER;;;AEvMA,IAAAC,eAAqB;AACrB,IAAAC,yBAAwB;AAGjB,SAASC,OAAM,QAA+C;AACjE,aAAO,oCAAQ,mBAAK,GAAG,MAAM,CAAC;AAClC;;;ACNA,IAAAC,iBAA0B;AAMnB,SAAS,cAAc,UAAU,MAAY;AAChD,gCAAU,MAAM;AACZ,QAAI,CAAC,QAAS;AAEd,UAAM,eAAe,SAAS,KAAK,MAAM;AACzC,UAAM,eAAe,SAAS,gBAAgB,MAAM;AACpD,aAAS,KAAK,MAAM,WAAW;AAC/B,aAAS,gBAAgB,MAAM,WAAW;AAE1C,WAAO,MAAM;AACT,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,gBAAgB,MAAM,WAAW;AAAA,IAC9C;AAAA,EACJ,GAAG,CAAC,OAAO,CAAC;AAChB;;;ACTI,IAAAC,uBAAA;AANG,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA,IAEC;AAAA;AACL;;;ACpBJ,IAAAC,iBAA8C;;;ACwGtC,IAAAC,uBAAA;AA5ER,IAAM,QAUF;AAAA,EACA,IAAI;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACb;AACJ;AAOA,IAAM,eAA2C;AAAA,EAC7C,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AACZ;AACA,IAAM,eAA2C;AAAA,EAC7C,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AACZ;AAOO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AACJ,MAAM;AACF,QAAM,WAAW,MAAM,IAAI;AAC3B,QAAM,OAAmB,QACnB,WACC,WAAW,UAAU,OAAO;AAEnC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cACI,cAAc,UAAU,oBAAoB;AAAA,MAEhD,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,aAAa,IAAI;AAAA,QACjB;AAAA,MACJ;AAAA,MAEC;AAAA,iBACG;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAW;AAAA,cACP;AAAA,cACA,SAAS;AAAA,cACT,UAAU,SAAS,UAAU,SAAS;AAAA,YAC1C;AAAA,YAEC,oBAAU,MAAM,MAAM,MAAM;AAAA;AAAA,QACjC;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,SAAS;AAAA,cACT,aAAa,IAAI;AAAA,cACjB,UAAU,SAAS,SAAS;AAAA,YAChC;AAAA,YAEC,mBACG;AAAA,cAAC;AAAA;AAAA,gBACG,eAAY;AAAA,gBACZ,WAAW;AAAA,kBACP;AAAA,kBACA,SAAS;AAAA,gBACb;AAAA,gBAEC,oBAAU,MAAM,KAAK,MAAM;AAAA;AAAA,YAChC;AAAA;AAAA,QAER;AAAA;AAAA;AAAA,EACJ;AAER;;;ADA0B,IAAAC,uBAAA;AAhI1B,IAAM,cAAc;AAEpB,SAAS,aAA+B;AACpC,MAAI;AACA,UAAM,QAAQ,aAAa,QAAQ,WAAW;AAC9C,WAAO,UAAU,WAAW,UAAU,SAAS,QAAQ;AAAA,EAC3D,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEA,SAAS,aAAwB;AAC7B,SAAO,OAAO,WAAW,eACrB,OAAO,aAAa,8BAA8B,EAAE,YAAY,OAC9D,SACA;AACV;AAEA,IAAI,UAAqB,WAAW,KAAK,WAAW;AACpD,IAAM,YAAY,oBAAI,IAAgB;AAEtC,SAAS,QAAc;AACnB,MAAI,OAAO,aAAa,YAAa;AACrC,WAAS,gBAAgB,UAAU,OAAO,QAAQ,YAAY,MAAM;AACpE,iBAAe;AACnB;AAKA,SAAS,iBAAuB;AAC5B,MAAI,OAAO,aAAa,YAAa;AACrC,QAAM,QAAQ,iBAAiB,SAAS,eAAe,EAClD,iBAAiB,sBAAsB,EACvC,KAAK;AACV,MAAI,CAAC,MAAO;AACZ,MAAI,OAAO,SAAS,cAAc,0BAA0B;AAC5D,MAAI,CAAC,MAAM;AACP,WAAO,SAAS,cAAc,MAAM;AACpC,SAAK,aAAa,QAAQ,aAAa;AACvC,aAAS,KAAK,YAAY,IAAI;AAAA,EAClC;AACA,OAAK,aAAa,WAAW,KAAK;AACtC;AAEA,SAAS,OAAa;AAClB,aAAW,YAAY,UAAW,UAAS;AAC/C;AAEA,SAAS,cAAc,OAA2B;AAC9C,MAAI,MAAM,QAAQ,YAAa;AAC/B,QAAM,OAAO,WAAW,KAAK,WAAW;AACxC,MAAI,SAAS,QAAS;AACtB,YAAU;AACV,QAAM;AACN,OAAK;AACT;AAEA,SAAS,UAAU,UAAkC;AACjD,MAAI,UAAU,SAAS,KAAK,OAAO,WAAW,aAAa;AACvD,UAAM;AACN,WAAO,iBAAiB,WAAW,aAAa;AAAA,EACpD;AACA,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AACT,cAAU,OAAO,QAAQ;AACzB,QAAI,UAAU,SAAS,KAAK,OAAO,WAAW,aAAa;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACvD;AAAA,EACJ;AACJ;AAEA,SAAS,cAAyB;AAC9B,SAAO;AACX;AAEA,SAAS,oBAA+B;AACpC,SAAO;AACX;AAOO,SAAS,aAAa,MAAuB;AAChD,MAAI,SAAS,QAAS;AACtB,YAAU;AACV,QAAM;AACN,MAAI;AACA,QAAI,SAAS,WAAW,EAAG,cAAa,WAAW,WAAW;AAAA,QACzD,cAAa,QAAQ,aAAa,IAAI;AAAA,EAC/C,QAAQ;AAAA,EAER;AACA,OAAK;AACT;AAEO,SAAS,eAId;AACE,QAAM,WAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,SAAO;AAAA,IACH;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,QAAQ,MAAM,aAAa,SAAS,SAAS,UAAU,MAAM;AAAA,EACjE;AACJ;AAOO,IAAM,kBAAsB,MAAM;AACrC,QAAM,EAAE,QAAQ,OAAO,IAAI,aAAa;AACxC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAU;AAAA,MACV,MAAK;AAAA,MACL,OAAO,EAAE,KAAK,8CAAC,WAAQ,GAAI,IAAI,8CAAC,YAAS,EAAG;AAAA;AAAA,EAChD;AAER;;;AE7JA,IAAAC,iBAAoC;AACpC,IAAAC,iBAAuB;AAEvB,IAAAC,iBAAuB;AA6BX,IAAAC,uBAAA;AAhBL,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACJ,MAAM;AACF,QAAM,iBAAa,uBAAuB,IAAI;AAE9C,SACI;AAAA,IAAC,eAAAC,OAAU;AAAA,IAAV;AAAA,MACG;AAAA,MACA,gBAAgB,MAAM,WAAW;AAAA,MACjC,cAAc,CAAC,YAAY,aAAa,QAAQ,IAAI;AAAA,MAEpD,yDAAC,yBACG;AAAA,sDAAC,eAAAA,OAAU,UAAV,EAAmB,WAAU,qFAAoF;AAAA,QAClH,8CAAC,eAAAA,OAAU,YAAV,EAAqB,WAAU,uGAC5B;AAAA,UAAC,eAAAA,OAAU;AAAA,UAAV;AAAA,YACG,KAAK;AAAA,YACL,cAAY;AAAA,YACZ,WAAW;AAAA,cACP;AAAA,cACA,SAAS,UACH,iCACA;AAAA,cACN;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL,GACJ;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;AC7BQ,IAAAC,uBAAA;AARD,SAAS,aAAqD;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAyB;AACrB,QAAM,YAA+B,MAAM;AAC3C,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAI,cAAc,WAAW,EAAE,MAAM,SAAS,IAAI;AAAA,MAClD,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AC7BQ,IAAAC,uBAAA;AAFD,SAAS,cAAc,EAAE,SAAS,GAA4B;AACjE,SACI,+CAAC,YAAO,WAAU,uGACd;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,eAAY;AAAA,QACZ,WAAU;AAAA;AAAA,IACd;AAAA,IACC;AAAA,KACL;AAER;;;ACbA,IAAAC,iBAA+C;AAsEnC,IAAAC,uBAAA;AAnEZ,IAAM,WAAW,CAAC,UAAuC;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,GAAI,QAAO;AAC7D,QAAM,eAAe,OAAO,KAAK;AACjC,SAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AAC1D;AAEA,IAAM,eAAe,CAAC,UAClB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AAEpC,IAAM,qBAAqB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAM0B;AACtB,MAAI,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,GAAG;AAC3D,WAAO,aAAa,QAAQ;AAAA,EAChC;AAEA,QAAM,eAAe,SAAS,SAAS,YAAY;AACnD,MAAI,iBAAiB,OAAW,QAAO;AAEvC,QAAM,aAAa,SAAS,GAAG,KAAK;AACpC,QAAM,aAAa,SAAS,GAAG,KAAK;AACpC,MAAI,cAAc,WAAY,QAAO;AAErC,SAAO;AAAA,KACD,eAAe,eAAe,aAAa,cAAe;AAAA,EAChE;AACJ;AAUO,IAAM,aAAS;AAAA,EAClB,CACI,EAAE,WAAW,cAAc,KAAK,KAAK,UAAU,OAAO,OAAO,GAAG,MAAM,GACtE,QACC;AACD,UAAM,kBAAkB,mBAAmB;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AACD,UAAM,cAAc;AAAA,MAChB,GAAG;AAAA,MACH,GAAI,oBAAoB,SAClB,OACA,EAAE,2BAA2B,GAAG,eAAe,IAAI;AAAA,IAC7D;AAEA,WACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,WAAW,GAAG,gBAAgB,SAAS;AAAA,QACtC,GAAG;AAAA;AAAA,IACR;AAAA,EAER;AACJ;;;AC7DI,IAAAC,uBAAA;AAfJ,IAAM,eAAsC;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACX;AAEA,IAAM,mBAA8C;AAAA,EAChD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACZ;AAIO,IAAM,QAAwB,CAAC,EAAE,WAAW,GAAG,KAAK,MACvD;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA;AACJ;AAKG,IAAM,YAAgC,CAAC,EAAE,WAAW,GAAG,KAAK,MAC/D;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA;AACJ;AAOG,IAAM,YAAgC,CAAC;AAAA,EAC1C;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA,YAAY,YACN,yBACA;AAAA,MACN;AAAA,IACJ;AAAA;AACJ;AAOG,IAAM,WAA8B,CAAC;AAAA,EACxC,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA,iBAAiB,MAAM;AAAA,MACvB;AAAA,IACJ;AAAA;AACJ;AAcG,IAAM,kBAA4C,CAAC;AAAA,EACtD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,QAAM,UACF,gFACI;AAAA,kDAAC,UAAM,UAAS;AAAA,IACf,UACG;AAAA,MAAC;AAAA;AAAA,QACG,eAAY;AAAA,QACZ,WAAU;AAAA,QAET,oBAAU,gBACL,kBAAkB,QACd,WACA,WACJ;AAAA;AAAA,IACV;AAAA,KAER;AAGJ,QAAM,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,KAAK;AAAA,IAClB,UAAU;AAAA,IACV,UACI;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,CAAC,QAAQ;AACT,WACI,8CAAC,QAAI,GAAG,MAAM,WAAW,SACpB,mBACL;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,aACI,UAAU,gBACJ,kBAAkB,QACd,cACA,eACJ;AAAA,MAEV,WAAW;AAAA,MAEX;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,YACP;AAAA,YACA,UAAU,WAAW;AAAA,YACrB,UAAU,YAAY;AAAA,UAC1B;AAAA,UAEC;AAAA;AAAA,MACL;AAAA;AAAA,EACJ;AAER;AAQO,IAAM,YAAgC,CAAC;AAAA,EAC1C,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,IACJ;AAAA;AACJ;;;ACvKA,IAAAC,uBAAA;AAPG,IAAM,wBAAwD,CAAC;AAAA,EAClE;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,MAAK;AAAA,IACL,iBAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACP;AAAA,MACA,WACM,0CACA;AAAA,MACN;AAAA,IACJ;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,WAAU;AAAA;AAAA,MACd;AAAA,MACC;AAAA;AAAA;AACL;","names":["cn","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","intentClasses","sizeClasses","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_portal","import_react","import_jsx_runtime","ArkDialog","import_jsx_runtime","import_jsx_runtime","sizeClasses","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_size","_appearance","_external","_showIcon","_icon","_className","_children","import_jsx_runtime","import_react","document","current","import_react","import_jsx_runtime","intentClasses","variantClasses","sizeClasses","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","intentClasses","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","start","yearText","import_jsx_runtime","variantClasses","intentClasses","import_jsx_runtime","addUtcMonths","start","granularity","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","current","import_clsx","import_tailwind_merge","cn","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_dialog","import_portal","import_react","import_jsx_runtime","ArkDialog","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/compositions/AccountIdentity.tsx","../src/lib/cn.ts","../src/primitives/ChevronIcon.tsx","../src/primitives/Dropdown.tsx","../src/primitives/icons/index.tsx","../src/primitives/Typography.tsx","../src/compositions/Alert.tsx","../src/primitives/BrandMark.tsx","../src/compositions/AppBrand.tsx","../src/compositions/AppHeader.tsx","../src/primitives/Surface.tsx","../src/compositions/Callout.tsx","../src/compositions/ChatConversation.tsx","../src/primitives/ScrollArea.tsx","../src/compositions/ChatMessage.tsx","../src/compositions/ChatPromptInput.tsx","../src/primitives/Textarea.tsx","../src/compositions/CopyButton.tsx","../src/primitives/Button.tsx","../src/primitives/Tooltip.tsx","../src/compositions/CodeBlock.tsx","../src/compositions/Collapsible.tsx","../src/primitives/Dialog.tsx","../src/compositions/ConfirmationDialog.tsx","../src/primitives/Eyebrow.tsx","../src/compositions/ContentHeader.tsx","../src/compositions/CopyField.tsx","../src/compositions/EditableCombobox.tsx","../src/primitives/Input.tsx","../src/lib/link.ts","../src/compositions/ExternalLinkButton.tsx","../src/primitives/Field.tsx","../src/compositions/FieldStack.tsx","../src/compositions/FileUpload.tsx","../src/lib/document-file-drop-guard.ts","../src/lib/partition-files.ts","../src/primitives/IconButton.tsx","../src/compositions/InfoTip.tsx","../src/primitives/Chip.tsx","../src/compositions/KeyChip.tsx","../src/compositions/LinkCard.tsx","../src/compositions/MediaPlaceholder.tsx","../src/compositions/MultiSelect.tsx","../src/compositions/NavItem.tsx","../src/compositions/PeriodPicker.tsx","../src/lib/period.ts","../src/primitives/TabButton.tsx","../src/compositions/Section.tsx","../src/compositions/StatCard.tsx","../src/compositions/ToolCallDetails.tsx","../src/primitives/InlineLink.tsx","../src/lib/cn-app.ts","../src/lib/use-scroll-lock.ts","../src/primitives/ButtonGroup.tsx","../src/primitives/ColorModeToggle.tsx","../src/primitives/Switch.tsx","../src/primitives/Drawer.tsx","../src/primitives/DropdownItem.tsx","../src/primitives/LoadingStatus.tsx","../src/primitives/Slider.tsx","../src/primitives/Table.tsx","../src/primitives/TableDisclosureButton.tsx"],"sourcesContent":["export {\n AccountIdentity,\n AccountIdentityLink,\n type AccountIdentityLinkProps,\n type AccountIdentityProps,\n} from \"./compositions/AccountIdentity.tsx\";\nexport {\n AccountMenu,\n type AccountMenuProps,\n} from \"./compositions/AccountMenu.tsx\";\nexport { Alert, type AlertProps } from \"./compositions/Alert.tsx\";\nexport { AppBrand, type AppBrandProps } from \"./compositions/AppBrand.tsx\";\nexport { AppHeader, type AppHeaderProps } from \"./compositions/AppHeader.tsx\";\nexport { Callout, type CalloutProps } from \"./compositions/Callout.tsx\";\nexport {\n ChatConversation,\n ChatConversationContent,\n type ChatConversationContentProps,\n type ChatConversationProps,\n} from \"./compositions/ChatConversation.tsx\";\nexport {\n ChatMessage,\n ChatMessageActions,\n type ChatMessageActionsProps,\n ChatMessageContent,\n type ChatMessageContentProps,\n ChatMessageHeader,\n type ChatMessageHeaderProps,\n type ChatMessageProps,\n type ChatMessageRole,\n} from \"./compositions/ChatMessage.tsx\";\nexport {\n ChatPromptInput,\n ChatPromptInputFooter,\n type ChatPromptInputFooterProps,\n type ChatPromptInputProps,\n ChatPromptTextarea,\n} from \"./compositions/ChatPromptInput.tsx\";\nexport { CodeBlock, type CodeBlockProps } from \"./compositions/CodeBlock.tsx\";\nexport {\n Collapsible,\n type CollapsibleProps,\n} from \"./compositions/Collapsible.tsx\";\nexport {\n ConfirmationDialog,\n type ConfirmationDialogProps,\n} from \"./compositions/ConfirmationDialog.tsx\";\nexport {\n ContentHeader,\n type ContentHeaderProps,\n} from \"./compositions/ContentHeader.tsx\";\nexport {\n CopyButton,\n type CopyButtonProps,\n} from \"./compositions/CopyButton.tsx\";\nexport { CopyField, type CopyFieldProps } from \"./compositions/CopyField.tsx\";\nexport {\n EditableCombobox,\n type EditableComboboxProps,\n EditableComboboxToken,\n type EditableComboboxTokenProps,\n} from \"./compositions/EditableCombobox.tsx\";\nexport {\n ExternalLinkButton,\n type ExternalLinkButtonProps,\n} from \"./compositions/ExternalLinkButton.tsx\";\nexport {\n FieldStack,\n type FieldStackProps,\n} from \"./compositions/FieldStack.tsx\";\nexport {\n FileUpload,\n type FileUploadProps,\n} from \"./compositions/FileUpload.tsx\";\nexport { InfoTip } from \"./compositions/InfoTip.tsx\";\nexport { KeyChip, type KeyChipProps } from \"./compositions/KeyChip.tsx\";\nexport { LinkCard, type LinkCardProps } from \"./compositions/LinkCard.tsx\";\n// Markdown and Prose live at @pollinations/ui/markdown — see src/markdown.ts.\nexport {\n MediaPlaceholder,\n type MediaPlaceholderProps,\n} from \"./compositions/MediaPlaceholder.tsx\";\nexport {\n MultiSelect,\n type MultiSelectProps,\n} from \"./compositions/MultiSelect.tsx\";\nexport { NavItem, type NavItemProps } from \"./compositions/NavItem.tsx\";\nexport {\n PeriodPicker,\n type PeriodPickerProps,\n} from \"./compositions/PeriodPicker.tsx\";\nexport { Section, type SectionProps } from \"./compositions/Section.tsx\";\nexport { StatCard, type StatCardProps } from \"./compositions/StatCard.tsx\";\nexport {\n ToolCallDetails,\n type ToolCallDetailsProps,\n type ToolCallStatus,\n} from \"./compositions/ToolCallDetails.tsx\";\nexport { cn } from \"./lib/cn-app.ts\";\nexport {\n currentPeriod,\n getPeriodBucketKeys,\n isPeriodSelectable,\n type PeriodGranularity,\n type PeriodSelection,\n periodBucketKeyToDate,\n periodFromDate,\n periodToWindow,\n} from \"./lib/period.ts\";\nexport { useScrollLock } from \"./lib/use-scroll-lock.ts\";\nexport { BrandMark, type BrandMarkProps } from \"./primitives/BrandMark.tsx\";\nexport {\n Button,\n type ButtonAppearance,\n type ButtonProps,\n} from \"./primitives/Button.tsx\";\nexport {\n ButtonGroup,\n type ButtonGroupProps,\n} from \"./primitives/ButtonGroup.tsx\";\nexport { ChevronIcon } from \"./primitives/ChevronIcon.tsx\";\nexport { Chip } from \"./primitives/Chip.tsx\";\nexport {\n ColorModeToggle,\n setColorMode,\n useColorMode,\n} from \"./primitives/ColorModeToggle.tsx\";\nexport {\n Dialog,\n DialogBody,\n type DialogBodyProps,\n DialogDescription,\n DialogFooter,\n type DialogFooterProps,\n DialogHeader,\n type DialogHeaderProps,\n type DialogProps,\n DialogTitle,\n} from \"./primitives/Dialog.tsx\";\nexport { Drawer, type DrawerProps } from \"./primitives/Drawer.tsx\";\nexport { Dropdown, type DropdownProps } from \"./primitives/Dropdown.tsx\";\nexport {\n DropdownItem,\n type DropdownItemProps,\n} from \"./primitives/DropdownItem.tsx\";\nexport { Eyebrow, type EyebrowProps } from \"./primitives/Eyebrow.tsx\";\nexport { Field } from \"./primitives/Field.tsx\";\nexport {\n IconButton,\n type IconButtonIntent,\n type IconButtonProps,\n type IconButtonVariant,\n} from \"./primitives/IconButton.tsx\";\nexport { InlineLink, type InlineLinkProps } from \"./primitives/InlineLink.tsx\";\nexport { Input, type InputProps } from \"./primitives/Input.tsx\";\nexport * from \"./primitives/icons/index.tsx\";\nexport { LoadingStatus } from \"./primitives/LoadingStatus.tsx\";\nexport { ScrollArea, type ScrollAreaProps } from \"./primitives/ScrollArea.tsx\";\nexport { Slider, type SliderProps } from \"./primitives/Slider.tsx\";\nexport { Surface, type SurfaceProps } from \"./primitives/Surface.tsx\";\nexport {\n Switch,\n type SwitchProps,\n type SwitchSize,\n type SwitchStatus,\n} from \"./primitives/Switch.tsx\";\nexport {\n TabButton,\n type TabButtonProps,\n} from \"./primitives/TabButton.tsx\";\nexport {\n Table,\n TableBody,\n type TableBodyProps,\n TableCell,\n type TableCellProps,\n TableHead,\n TableHeaderCell,\n type TableHeaderCellProps,\n type TableHeadProps,\n type TableProps,\n TableRow,\n type TableRowProps,\n} from \"./primitives/Table.tsx\";\nexport {\n TableDisclosureButton,\n type TableDisclosureButtonProps,\n} from \"./primitives/TableDisclosureButton.tsx\";\nexport { Textarea, type TextareaProps } from \"./primitives/Textarea.tsx\";\nexport { Tooltip } from \"./primitives/Tooltip.tsx\";\nexport {\n Heading,\n type HeadingProps,\n Text,\n type TextProps,\n} from \"./primitives/Typography.tsx\";\n","import type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Dropdown, type DropdownProps } from \"../primitives/Dropdown.tsx\";\nimport { ExternalLinkIcon } from \"../primitives/icons/index.tsx\";\n\nfunction initials(name: string) {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0] ?? \"\"}${parts.at(-1)?.[0] ?? \"\"}`.toUpperCase();\n}\n\nfunction AccountAvatar({\n name,\n avatarUrl,\n secondaryContent,\n dashboardHref,\n inline = false,\n}: {\n name: string;\n avatarUrl?: string | null;\n secondaryContent?: ReactNode;\n dashboardHref?: string;\n /** Small avatar inside a pill link; hovering the pill zooms it. */\n inline?: boolean;\n}) {\n const size = inline\n ? \"polli:h-6 polli:w-6\"\n : secondaryContent != null\n ? \"polli:h-11 polli:w-11\"\n : \"polli:h-8 polli:w-8\";\n const className = cn(\n size,\n inline &&\n \"polli:transition-transform polli:group-hover:scale-110 polli:group-hover:brightness-110 polli:motion-reduce:transition-none polli:motion-reduce:group-hover:scale-100\",\n );\n const avatar = avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"\"\n className={cn(\n className,\n \"polli:shrink-0 polli:rounded-full polli:object-cover\",\n )}\n />\n ) : (\n <span\n role=\"img\"\n aria-label={`${name} avatar`}\n className={cn(\n className,\n \"polli:flex polli:shrink-0 polli:items-center polli:justify-center polli:rounded-full polli:bg-theme-bg-pale polli:text-xs polli:font-semibold polli:text-theme-text-strong\",\n )}\n >\n {initials(name)}\n </span>\n );\n return dashboardHref ? (\n <a\n href={dashboardHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label=\"Open dashboard\"\n title=\"Open dashboard\"\n className=\"polli:shrink-0 polli:rounded-full polli:cursor-pointer polli:transition-transform polli:hover:scale-105 polli:hover:brightness-110 polli:focus-visible:outline-2 polli:focus-visible:outline-offset-2 polli:focus-visible:outline-current polli:motion-reduce:transition-none polli:motion-reduce:hover:scale-100\"\n >\n {avatar}\n </a>\n ) : (\n avatar\n );\n}\n\nexport type AccountIdentityProps = {\n name: string;\n avatarUrl?: string | null;\n secondaryContent?: ReactNode;\n /** Optional dashboard destination, owned by the caller. Opens in a new tab. */\n dashboardHref?: string;\n className?: string;\n};\n\nexport type AccountIdentityLinkProps = Pick<\n AccountIdentityProps,\n \"name\" | \"avatarUrl\" | \"className\"\n> & {\n /** External profile the whole pill opens in a new tab. */\n href: string;\n};\n\nexport function AccountIdentity({\n name,\n avatarUrl,\n secondaryContent,\n dashboardHref,\n className,\n}: AccountIdentityProps) {\n return (\n <span\n className={cn(\n \"polli:flex polli:min-w-0 polli:items-center polli:gap-2 polli:rounded-full polli:bg-surface-opaque polli:p-1 polli:pr-3\",\n className,\n )}\n >\n <AccountAvatar\n name={name}\n avatarUrl={avatarUrl}\n dashboardHref={dashboardHref}\n secondaryContent={secondaryContent}\n />\n <AccountDetails name={name} secondaryContent={secondaryContent} />\n </span>\n );\n}\n\n/** Someone else's identity as a one-line pill link, e.g. an app's developer. */\nexport function AccountIdentityLink({\n name,\n avatarUrl,\n href,\n className,\n}: AccountIdentityLinkProps) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\n // Sits in running text on cards, so it is compact and tinted.\n \"polli:group polli:inline-flex polli:max-w-full polli:min-w-0 polli:items-center polli:gap-1.5 polli:rounded-full polli:bg-theme-bg-subtle polli:p-0.5 polli:pr-2.5 polli:align-middle polli:focus-visible:outline-2 polli:focus-visible:outline-offset-2 polli:focus-visible:outline-current\",\n className,\n )}\n >\n <AccountAvatar name={name} avatarUrl={avatarUrl} inline />\n <AccountDetails name={name} />\n {/* InlineLink's external arrow at the name's size: this pill leaves the app. */}\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli:-ml-0.5 polli:h-3 polli:w-3 polli:shrink-0 polli:text-theme-text-strong polli:opacity-65\"\n />\n </a>\n );\n}\n\nfunction AccountDetails({\n name,\n secondaryContent,\n secondaryId,\n}: {\n name: string;\n secondaryContent?: ReactNode;\n secondaryId?: string;\n}) {\n return (\n <span className=\"polli:flex polli:min-w-0 polli:flex-col polli:items-start polli:text-left\">\n <span\n title={name}\n className=\"polli:max-w-full polli:truncate polli:text-sm polli:font-medium polli:leading-5 polli:text-theme-text-strong\"\n >\n {name}\n </span>\n {secondaryContent != null && (\n <span\n id={secondaryId}\n className=\"polli:inline-flex polli:min-h-5 polli:items-center polli:whitespace-nowrap polli:text-xs polli:leading-4 polli:text-theme-text-base\"\n >\n {secondaryContent}\n </span>\n )}\n </span>\n );\n}\n\nexport type AccountMenuProps = AccountIdentityProps & {\n /** The caller owns navigation, permissions and sign-out behavior. */\n children: DropdownProps[\"children\"];\n menuClassName?: string;\n side?: \"top\" | \"bottom\";\n menuLabel?: string;\n};\n\n/**\n * With `dashboardHref` the avatar is a link and the name/chevron open the\n * menu; without one the whole pill is the trigger.\n */\nexport function AccountMenu({\n name,\n avatarUrl,\n dashboardHref,\n secondaryContent,\n children,\n className,\n menuClassName,\n side = \"bottom\",\n menuLabel = `Account menu for ${name}`,\n}: AccountMenuProps) {\n const statusId = useId();\n const avatar = (\n <AccountAvatar\n name={name}\n avatarUrl={avatarUrl}\n dashboardHref={dashboardHref}\n secondaryContent={secondaryContent}\n />\n );\n\n return (\n <div\n data-theme=\"accent\"\n className={cn(\n \"polli:flex polli:min-w-0 polli:items-center polli:gap-2 polli:rounded-full polli:bg-theme-bg-active polli:p-1 polli:pr-3 polli:text-theme-text-strong polli:transition-colors polli:hover:bg-theme-bg-hover\",\n className,\n )}\n >\n {dashboardHref && avatar}\n <Dropdown\n align=\"end\"\n side={side}\n className={cn(\n \"polli:w-max polli:min-w-[var(--reference-width)] polli:p-1\",\n menuClassName,\n )}\n trigger={(open) => (\n <button\n type=\"button\"\n aria-label={menuLabel}\n aria-describedby={\n secondaryContent != null ? statusId : undefined\n }\n className=\"polli-control polli:flex polli:min-w-0 polli:flex-1 polli:items-center polli:gap-2 polli:self-stretch polli:rounded-full polli:text-theme-text-strong\"\n >\n {!dashboardHref && avatar}\n <AccountDetails\n name={name}\n secondaryContent={secondaryContent}\n secondaryId={statusId}\n />\n <ChevronIcon\n expanded={open}\n className=\"polli:ml-auto polli:h-4 polli:w-4 polli:text-theme-text-strong\"\n />\n </button>\n )}\n >\n {children}\n </Dropdown>\n </div>\n );\n}\n","import { clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({ prefix: \"polli\" });\n\n/** Internal class merge for polli:-prefixed package primitive classes. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import type { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype ChevronIconProps = {\n /** Rotate 180° when expanded/open. */\n expanded?: boolean;\n className?: string;\n};\n\n/**\n * Canonical chevron used for collapsibles, dropdown triggers, and select pills\n * across the app. One icon everywhere.\n */\nexport const ChevronIcon: FC<ChevronIconProps> = ({ expanded, className }) => (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n className={cn(\n \"polli:shrink-0 polli:transition-transform polli:duration-200 polli:ease-out\",\n expanded && \"polli:rotate-180\",\n className,\n )}\n >\n <path\n d=\"M3 4.5 6 7.5l3-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n","import { Popover } from \"@ark-ui/react/popover\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { CSSProperties, FC, ReactNode } from \"react\";\nimport { useId, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst DEFAULT_PANEL = \"polli:rounded-lg polli:bg-surface-menu polli:shadow-lg\";\n\nexport type DropdownProps = {\n /** Trigger element; receives the current open state (e.g. to rotate a chevron). */\n trigger: (open: boolean) => ReactNode;\n /** Panel content. As a function, receives `close` to dismiss after a selection. */\n children: ReactNode | ((close: () => void) => ReactNode);\n /** Panel placement relative to the trigger. */\n align?: \"start\" | \"end\";\n side?: \"top\" | \"bottom\";\n /** Controlled open state. Omit to let the Dropdown manage its own. */\n open?: boolean;\n /** Render inside the parent dialog so its focus and accessibility scope includes the menu. */\n portalled?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Appended after the surface (widths, padding, max-height…). */\n className?: string;\n /** Theme variables for portaled content that cannot inherit from its trigger. */\n panelStyle?: CSSProperties;\n};\n\nexport const Dropdown: FC<DropdownProps> = ({\n trigger,\n children,\n align = \"start\",\n side = \"bottom\",\n open: openProp,\n portalled = true,\n onOpenChange,\n className,\n panelStyle,\n}) => {\n const triggerId = useId();\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n return (\n <Popover.Root\n ids={{ trigger: triggerId }}\n open={open}\n portalled={portalled}\n onOpenChange={(details) => setOpen(details.open)}\n positioning={{\n placement: `${side}-${align}`,\n strategy: portalled ? \"absolute\" : \"fixed\",\n }}\n >\n <Popover.Trigger asChild>{trigger(open)}</Popover.Trigger>\n <Portal disabled={!portalled}>\n <Popover.Positioner>\n <Popover.Content\n aria-labelledby={triggerId}\n style={panelStyle}\n className={cn(\n \"polli:z-[120] polli:overflow-hidden polli:focus:outline-none\",\n DEFAULT_PANEL,\n className,\n )}\n >\n {typeof children === \"function\"\n ? children(() => setOpen(false))\n : children}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import type { IconProps } from \"./types.ts\";\n\nconst strokeProps = {\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n} as const;\n\nexport function AppIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M2 20h20\" />\n </svg>\n );\n}\n\nexport function AccountIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M4 21a8 8 0 0 1 16 0\" />\n </svg>\n );\n}\n\nexport function ArrowRightIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M5 12h14M13 6l6 6-6 6\" />\n </svg>\n );\n}\n\nexport function BeakerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 3h6\" />\n <path d=\"M10 3v6.5L4.5 18a2 2 0 0 0 1.7 3h11.6a2 2 0 0 0 1.7-3L14 9.5V3\" />\n <path d=\"M7 14h10\" />\n </svg>\n );\n}\n\nexport function BotIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 8V4H8\" />\n <rect x=\"4\" y=\"8\" width=\"16\" height=\"12\" rx=\"2\" />\n <path d=\"M2 14h2M20 14h2\" />\n <path d=\"M9 13v2M15 13v2\" />\n </svg>\n );\n}\n\nexport function BookIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 4h5a3 3 0 0 1 3 3v13a2 2 0 0 0-2-2H4z\" />\n <path d=\"M20 4h-5a3 3 0 0 0-3 3v13a2 2 0 0 1 2-2h6z\" />\n </svg>\n );\n}\n\nexport function BugIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m8 2 1.9 1.9M14.1 3.9 16 2\" />\n <path d=\"M9 7V6a3 3 0 0 1 6 0v1\" />\n <path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a6 6 0 0 1 12 0v3c0 3.3-2.7 6-6 6Z\" />\n <path d=\"M12 20v-9M6.5 9C4.6 8.8 3 7.1 3 5M6 13H2M3 21c0-2.1 1.7-3.9 3.8-4M17.5 9C19.4 8.8 21 7.1 21 5M18 13h4M21 21c0-2.1-1.7-3.9-3.8-4\" />\n </svg>\n );\n}\n\nexport function CheckIcon(props: IconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...strokeProps}\n strokeWidth={2.5}\n {...props}\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n\nexport function ClipboardIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n );\n}\n\nexport function ClockIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 7v5l3 2\" />\n </svg>\n );\n}\n\nexport function DiscordIcon(props: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20.32 4.37A19.8 19.8 0 0 0 15.36 2.83a.07.07 0 0 0-.08.04c-.21.38-.45.88-.62 1.27a18.27 18.27 0 0 0-5.52 0 12.84 12.84 0 0 0-.63-1.27.08.08 0 0 0-.08-.04A19.74 19.74 0 0 0 3.47 4.37a.07.07 0 0 0-.03.03C.31 9.07-.55 13.61-.13 18.1a.08.08 0 0 0 .03.06 19.9 19.9 0 0 0 6.08 3.07.08.08 0 0 0 .09-.03c.47-.64.88-1.31 1.24-2.02a.08.08 0 0 0-.04-.1 13.08 13.08 0 0 1-1.9-.91.08.08 0 0 1-.01-.13c.13-.1.25-.2.37-.29a.07.07 0 0 1 .08-.01 14.24 14.24 0 0 0 12.38 0 .07.07 0 0 1 .08.01c.12.1.25.2.38.3a.08.08 0 0 1-.01.12 12.22 12.22 0 0 1-1.9.9.08.08 0 0 0-.04.11c.36.7.77 1.38 1.23 2.02a.08.08 0 0 0 .1.03 19.84 19.84 0 0 0 6.08-3.07.08.08 0 0 0 .03-.05c.5-5.2-.84-9.7-3.77-13.71a.06.06 0 0 0-.03-.03ZM8.02 15.37c-1.18 0-2.16-1.08-2.16-2.4 0-1.32.96-2.4 2.16-2.4 1.2 0 2.18 1.09 2.16 2.4 0 1.32-.96 2.4-2.16 2.4Zm7.96 0c-1.18 0-2.16-1.08-2.16-2.4 0-1.32.96-2.4 2.16-2.4 1.2 0 2.18 1.09 2.16 2.4 0 1.32-.95 2.4-2.16 2.4Z\"\n />\n </svg>\n );\n}\n\nexport function InstagramIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <circle\n cx=\"17.5\"\n cy=\"6.5\"\n r=\"1\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n );\n}\n\nexport function XSocialIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M18.24 2.25h3.31l-7.23 8.26 8.51 11.24h-6.66l-5.21-6.82-5.97 6.82H1.68l7.73-8.84L1.25 2.25h6.83l4.71 6.23 5.45-6.23Zm-1.16 17.52h1.83L7.08 4.13H5.12l11.96 15.64Z\"\n />\n </svg>\n );\n}\n\nexport function LinkedInIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M20.45 20.45h-3.56v-5.57c0-1.33-.03-3.04-1.85-3.04-1.86 0-2.14 1.45-2.14 2.94v5.67H9.34V9h3.42v1.56h.05c.47-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28ZM5.32 7.43a2.07 2.07 0 1 1 0-4.13 2.07 2.07 0 0 1 0 4.13ZM7.1 20.45H3.54V9H7.1v11.45Z\"\n />\n </svg>\n );\n}\n\nexport function DownloadIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n );\n}\n\nexport function ExpandIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M8 3H3v5M16 3h5v5M21 16v5h-5M3 16v5h5\" />\n </svg>\n );\n}\n\nexport function PlayIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M7 4.5v15l12-7.5z\" />\n </svg>\n );\n}\n\nexport function PauseIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M6 4h4v16H6zM14 4h4v16h-4z\" />\n </svg>\n );\n}\n\nexport function CloudUploadIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M17.5 19H19a4 4 0 0 0 .4-8A7.5 7.5 0 0 0 5 9.5 5 5 0 0 0 6 19h1.5\" />\n <path d=\"m8.5 15.5 3.5-3.5 3.5 3.5M12 12v9\" />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M7 17 17 7M9 7h8v8\" />\n </svg>\n );\n}\n\nexport function GenApiIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m8 3 4 1.5L16 3v18l-4-1.5L8 21z\" />\n <path d=\"M8 3v18M16 3v18\" />\n </svg>\n );\n}\n\nexport function GitBranchIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\" />\n <circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <path d=\"M18 9a9 9 0 0 1-9 9\" />\n </svg>\n );\n}\n\nexport function GitPullRequestIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"6\" cy=\"6\" r=\"3\" />\n <circle cx=\"18\" cy=\"18\" r=\"3\" />\n <path d=\"M6 9v12M13 6h3a2 2 0 0 1 2 2v7\" />\n </svg>\n );\n}\n\nexport function GraduationCapIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21.42 10.92a1 1 0 0 0-.02-1.84L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.83l8.57 3.91a2 2 0 0 0 1.66 0z\" />\n <path d=\"M22 10v6\" />\n <path d=\"M6 12.5V16a6 3 0 0 0 12 0v-3.5\" />\n </svg>\n );\n}\n\nexport function SparklesIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 3l1.9 5.8a2 2 0 0 0 1.3 1.3L21 12l-5.8 1.9a2 2 0 0 0-1.3 1.3L12 21l-1.9-5.8a2 2 0 0 0-1.3-1.3L3 12l5.8-1.9a2 2 0 0 0 1.3-1.3z\" />\n </svg>\n );\n}\n\nexport function GitHubIcon(props: IconProps) {\n return (\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M12 .5A11.5 11.5 0 0 0 8.36 22.9c.58.11.79-.25.79-.56v-2.16c-3.21.7-3.89-1.38-3.89-1.38-.53-1.34-1.29-1.7-1.29-1.7-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.04 1.76 2.71 1.25 3.37.96.11-.75.4-1.25.74-1.54-2.56-.29-5.26-1.28-5.26-5.7 0-1.26.45-2.29 1.19-3.1-.12-.29-.52-1.46.11-3.06 0 0 .97-.31 3.16 1.18a10.88 10.88 0 0 1 5.76 0c2.19-1.49 3.15-1.18 3.15-1.18.63 1.6.23 2.77.11 3.06.74.81 1.19 1.84 1.19 3.1 0 4.43-2.7 5.4-5.27 5.69.41.36.78 1.06.78 2.14v3.19c0 .31.21.68.8.56A11.5 11.5 0 0 0 12 .5Z\"\n />\n </svg>\n );\n}\n\nexport function ImageIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-5-5L5 21\" />\n </svg>\n );\n}\n\nexport function CubeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m21 16-9 5-9-5V8l9-5 9 5z\" />\n <path d=\"m3 8 9 5 9-5\" />\n <path d=\"M12 13v8\" />\n </svg>\n );\n}\n\nexport function AudioIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 18V5l12-2v13\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <circle cx=\"18\" cy=\"16\" r=\"3\" />\n </svg>\n );\n}\n\nexport function LockIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function LogInIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M10 17l5-5-5-5\" />\n <path d=\"M15 12H3\" />\n <path d=\"M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4\" />\n </svg>\n );\n}\n\nexport function LogOutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"m16 17 5-5-5-5\" />\n <path d=\"M21 12H9\" />\n </svg>\n );\n}\n\nexport function MailIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\" />\n <path d=\"m3 7 9 7 9-7\" />\n </svg>\n );\n}\n\nexport function McpIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"4\" width=\"8\" height=\"16\" rx=\"1.5\" />\n <rect x=\"14\" y=\"4\" width=\"8\" height=\"16\" rx=\"1.5\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\nexport function MenuIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 7h16M4 12h16M4 17h16\" />\n </svg>\n );\n}\n\nexport function NewspaperIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M5 4h12a1 1 0 0 1 1 1v14a1 1 0 0 0 1 1H4a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h1z\" />\n <path d=\"M18 8h2a1 1 0 0 1 1 1v9a2 2 0 0 1-2 2\" />\n <path d=\"M7 8h7M7 12h7M7 16h4\" />\n </svg>\n );\n}\n\nexport function PlusIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 5v14M5 12h14\" />\n </svg>\n );\n}\n\nexport function TerminalIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <polyline points=\"4 8 8 12 4 16\" />\n <line x1=\"12\" y1=\"20\" x2=\"20\" y2=\"20\" />\n </svg>\n );\n}\n\nexport function ToolIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l2.1 2.1a1 1 0 0 0 1.4 0l4-4a6 6 0 0 1-8 8l-8 8a2.8 2.8 0 0 1-4-4l8-8a6 6 0 0 1 8-8l-4 4Z\" />\n </svg>\n );\n}\n\nexport function TargetIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n}\n\nexport function TokensIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 9h16M4 15h16M10 3 8 21M16 3l-2 18\" />\n </svg>\n );\n}\n\nexport function UsageIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4 18a8 8 0 1 1 16 0\" />\n <path d=\"M12 18l3.5-5\" />\n <path d=\"M7 18h10\" />\n <path d=\"M7.5 12.5 6 11\" />\n <path d=\"M16.5 12.5 18 11\" />\n </svg>\n );\n}\n\nexport function WarningIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M10.3 3.1 1.8 17a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.1a2 2 0 0 0-3.4 0Z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n );\n}\n\nexport function TrendUpIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <polyline points=\"3 17 9 11 13 15 21 7\" />\n <polyline points=\"15 7 21 7 21 13\" />\n </svg>\n );\n}\n\nexport function EarningsIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <ellipse cx=\"10\" cy=\"6\" rx=\"6\" ry=\"3\" />\n <path d=\"M4 6v8c0 1.7 2.7 3 6 3 1.2 0 2.4-.2 3.3-.5\" />\n <path d=\"M16 6v4\" />\n <path d=\"M4 10c0 1.7 2.7 3 6 3 1.1 0 2.1-.1 3-.4\" />\n <path d=\"M18 14v6\" />\n <path d=\"M15 17h6\" />\n </svg>\n );\n}\n\nexport function WalletIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M3 7a2 2 0 0 1 2-2h13a2 2 0 0 1 2 2v2H5a2 2 0 0 0-2 2V7Z\" />\n <path d=\"M3 11a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6Z\" />\n <circle cx=\"17\" cy=\"14\" r=\"1.25\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/** A paper receipt: what a price includes. */\nexport function ReceiptIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M6 3h12v18l-2-1.5-2 1.5-2-1.5-2 1.5-2-1.5L6 21Z\" />\n <path d=\"M9 8h6M9 12h6M9 16h3\" />\n </svg>\n );\n}\n\nexport function MoonIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8Z\" />\n </svg>\n );\n}\n\nexport function SunIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4\" />\n </svg>\n );\n}\n\nexport function XIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function TrashIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M3 6h18\" />\n <path d=\"M8 6V4h8v2\" />\n <path d=\"m19 6-1 15H6L5 6\" />\n <path d=\"M10 11v6M14 11v6\" />\n </svg>\n );\n}\n\n// --- Model modality / capability / price glyphs (single-ink, replace emoji) ---\n\nexport function ChatIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n );\n}\n\nexport function RobotIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"3\" y=\"6\" width=\"18\" height=\"15\" rx=\"3\" />\n <path d=\"M12 2v4M3 11H1v5h2M21 11h2v5h-2M8 17h8\" />\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\nexport function EyeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function EyeOffIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M3 3l18 18\" />\n </svg>\n );\n}\n\nexport function VideoIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m22 8-6 4 6 4V8z\" />\n <rect x=\"2\" y=\"6\" width=\"14\" height=\"12\" rx=\"2\" />\n </svg>\n );\n}\n\nexport function MicIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <path d=\"M12 19v3\" />\n </svg>\n );\n}\n\nexport function SpeakerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M11 5 6 9H2v6h4l5 4z\" />\n <path d=\"M15.54 8.46a5 5 0 0 1 0 7.07\" />\n <path d=\"M19.07 4.93a10 10 0 0 1 0 14.14\" />\n </svg>\n );\n}\n\nexport function MegaphoneIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m3 11 18-5v12L3 14v-3z\" />\n <path d=\"m7 15 1.5 6H14l-2-7\" />\n </svg>\n );\n}\n\nexport function ReasoningIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 18h6M10 22h4M15.1 14c.2-1 .6-1.7 1.4-2.5A4.6 4.6 0 0 0 18 8 6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.8.8 1.2 1.5 1.4 2.5\" />\n </svg>\n );\n}\n\nexport function RocketIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n\nexport function SearchIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n );\n}\n\nexport function SignOutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <path d=\"m16 17 5-5-5-5\" />\n <path d=\"M21 12H9\" />\n </svg>\n );\n}\n\nexport function PowerIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 2v10\" />\n <path d=\"M18.4 6.6a9 9 0 1 1-12.77.04\" />\n </svg>\n );\n}\n\nexport function SparkleIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M9.94 15.5A2 2 0 0 0 8.5 14.06l-6.14-1.58a.5.5 0 0 1 0-.96L8.5 9.94A2 2 0 0 0 9.94 8.5l1.58-6.14a.5.5 0 0 1 .96 0L14.06 8.5A2 2 0 0 0 15.5 9.94l6.14 1.58a.5.5 0 0 1 0 .96L15.5 14.06a2 2 0 0 0-1.44 1.44l-1.58 6.14a.5.5 0 0 1-.96 0z\" />\n <path d=\"M20 3v4\" />\n <path d=\"M22 5h-4\" />\n <path d=\"M4 17v2\" />\n <path d=\"M5 18H3\" />\n </svg>\n );\n}\n\nexport function StarIcon({\n filled = false,\n ...props\n}: IconProps & { filled?: boolean }) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n {...strokeProps}\n fill={filled ? \"currentColor\" : \"none\"}\n {...props}\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n );\n}\n\nexport function CodeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"m16 18 6-6-6-6M8 6l-6 6 6 6\" />\n </svg>\n );\n}\n\nexport function DatabaseIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M3 5v14a9 3 0 0 0 18 0V5\" />\n <path d=\"M3 12a9 3 0 0 0 18 0\" />\n </svg>\n );\n}\n\nexport function CardIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M2 10h20\" />\n </svg>\n );\n}\n\nexport function SproutIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M7 20h10\" />\n <path d=\"M10 20c5.5-2.5.8-6.4 3-10\" />\n <path d=\"M9.5 9.4c1.1.8 1.8 2.2 2.3 3.7-2 .4-3.5.4-4.8-.3-1.2-.6-2.3-1.9-3-4.2 2.8-.5 4.4 0 5.5.8z\" />\n <path d=\"M14.1 6a7 7 0 0 0-1.1 4c1.9-.1 3.3-.6 4.3-1.4 1-1 1.6-2.3 1.7-4.6-2.7.1-4 1-4.9 2z\" />\n </svg>\n );\n}\n\nexport function PencilIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\" />\n </svg>\n );\n}\n\nexport function KeyIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\" />\n <path d=\"m21 2-9.6 9.6\" />\n <path d=\"m15.5 7.5 3 3L22 7l-3-3\" />\n </svg>\n );\n}\n\nexport function GlobeIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </svg>\n );\n}\n\nexport function ArrowLeftIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M19 12H5\" />\n <path d=\"m12 19-7-7 7-7\" />\n </svg>\n );\n}\n\nexport function RefreshIcon(props: IconProps) {\n return (\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" {...strokeProps} {...props}>\n <path d=\"M21 12a9 9 0 1 1-2.64-6.36\" />\n <path d=\"M21 3v6h-6\" />\n </svg>\n );\n}\n\nexport type { IconProps } from \"./types.ts\";\n","import type {\n ComponentPropsWithoutRef,\n ElementType,\n PropsWithChildren,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype HeadingSize = \"display\" | \"title\" | \"section\" | \"subsection\" | \"card\";\n\ntype TextSize = \"body\" | \"sm\" | \"xs\" | \"micro\";\ntype TextTone = \"base\" | \"strong\" | \"soft\" | \"muted\";\ntype TextWeight = \"normal\" | \"medium\" | \"semibold\" | \"bold\";\n\nconst headingSizeClasses: Record<HeadingSize, string> = {\n display: \"polli:font-heading polli:text-5xl polli:leading-none\",\n title: \"polli:font-heading polli:text-4xl polli:leading-none\",\n section: \"polli:font-subheading polli:text-2xl polli:leading-tight\",\n subsection: \"polli:font-subheading polli:text-xl polli:leading-tight\",\n card: \"polli:font-subheading polli:text-lg polli:leading-tight\",\n};\n\nconst textSizeClasses: Record<TextSize, string> = {\n body: \"polli:text-base polli:leading-relaxed\",\n sm: \"polli:text-sm polli:leading-6\",\n xs: \"polli:text-xs polli:leading-normal\",\n micro: \"polli:text-micro polli:leading-normal\",\n};\n\nconst textToneClasses: Record<TextTone, string> = {\n base: \"polli:text-theme-text-base\",\n strong: \"polli:text-theme-text-strong\",\n soft: \"polli:text-theme-text-soft\",\n muted: \"polli:text-theme-text-muted\",\n};\n\nconst textWeightClasses: Record<TextWeight, string> = {\n normal: \"polli:font-normal\",\n medium: \"polli:font-medium\",\n semibold: \"polli:font-semibold\",\n bold: \"polli:font-bold\",\n};\n\nexport function headingClassName(size: HeadingSize, className?: string) {\n return cn(\n \"polli:break-words polli:text-theme-text-strong\",\n headingSizeClasses[size],\n className,\n );\n}\n\nfunction textClassName({\n size,\n tone,\n weight,\n className,\n}: {\n size: TextSize;\n tone: TextTone;\n weight: TextWeight;\n className?: string;\n}) {\n return cn(\n \"polli:break-words polli:font-body\",\n textSizeClasses[size],\n textToneClasses[tone],\n textWeightClasses[weight],\n className,\n );\n}\n\ntype HeadingOwnProps<T extends ElementType> = PropsWithChildren<{\n as?: T;\n size?: HeadingSize;\n className?: string;\n}>;\n\nexport type HeadingProps<T extends ElementType = \"h2\"> = HeadingOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof HeadingOwnProps<T>>;\n\nexport function Heading<T extends ElementType = \"h2\">({\n as,\n size = \"section\",\n className,\n children,\n ...rest\n}: HeadingProps<T>) {\n const Component = as || \"h2\";\n return (\n <Component {...rest} className={headingClassName(size, className)}>\n {children}\n </Component>\n );\n}\n\ntype TextOwnProps<T extends ElementType> = PropsWithChildren<{\n as?: T;\n size?: TextSize;\n tone?: TextTone;\n weight?: TextWeight;\n className?: string;\n}>;\n\nexport type TextProps<T extends ElementType = \"p\"> = TextOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof TextOwnProps<T>>;\n\nexport function Text<T extends ElementType = \"p\">({\n as,\n size = \"body\",\n tone = \"base\",\n weight = \"normal\",\n className,\n children,\n ...rest\n}: TextProps<T>) {\n const Component = as || \"p\";\n return (\n <Component\n {...rest}\n className={textClassName({ size, tone, weight, className })}\n >\n {children}\n </Component>\n );\n}\n","import type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { WarningIcon } from \"../primitives/icons/index.tsx\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\ntype AlertIntent = \"info\" | \"advisory\" | \"warning\" | \"danger\";\n\nconst intentClasses: Record<AlertIntent, string> = {\n info: \"polli:bg-theme-bg-pale polli:text-theme-text-strong\",\n advisory: \"polli:bg-intent-warning-bg-light/45 polli:text-theme-text-base\",\n warning: \"polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type AlertProps = Omit<ComponentPropsWithoutRef<\"div\">, \"title\"> & {\n intent?: AlertIntent;\n title?: ReactNode;\n};\n\nexport const Alert: FC<AlertProps> = ({\n intent = \"info\",\n title,\n className,\n children,\n ...rest\n}) => (\n <div\n {...rest}\n role={intent === \"danger\" ? \"alert\" : \"status\"}\n className={cn(\n \"polli:rounded-xl polli:px-3 polli:py-2 polli:text-sm\",\n intent === \"advisory\" && \"polli:flex polli:items-start polli:gap-2\",\n intentClasses[intent],\n className,\n )}\n >\n {intent === \"advisory\" && (\n <WarningIcon className=\"polli:mt-0.5 polli:h-4 polli:w-4 polli:shrink-0 polli:text-intent-warning-text\" />\n )}\n <div className=\"polli:min-w-0\">\n {title &&\n (intent === \"advisory\" ? (\n <>\n <strong className=\"polli:font-semibold polli:text-theme-text-strong\">\n {title}\n </strong>{\" \"}\n —{\" \"}\n </>\n ) : (\n <Text\n as=\"div\"\n size=\"xs\"\n tone=\"strong\"\n weight=\"bold\"\n className=\"polli:mb-1 polli:uppercase polli:tracking-wide\"\n >\n {title}\n </Text>\n ))}\n {children}\n </div>\n </div>\n);\n","import type { CSSProperties } from \"react\";\nimport lockupUrl from \"../brand/lockup-horizontal.svg\";\nimport markUrl from \"../brand/mark.svg\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type BrandMarkProps = {\n variant?: \"mark\" | \"lockup\";\n className?: string;\n};\n\nconst mask = (url: string): CSSProperties => ({\n WebkitMask: `url('${url}') center / contain no-repeat`,\n mask: `url('${url}') center / contain no-repeat`,\n});\n\nconst MASKS = { mark: mask(markUrl), lockup: mask(lockupUrl) };\n\n/** The lotus (or lotus + wordmark) painted in currentColor; size it with className. */\nexport function BrandMark({ variant = \"mark\", className }: BrandMarkProps) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"polli:block polli:shrink-0 polli:bg-current\",\n className,\n )}\n style={MASKS[variant]}\n />\n );\n}\n","import { cn } from \"../lib/cn.ts\";\nimport { BrandMark } from \"../primitives/BrandMark.tsx\";\n\nexport type AppBrandProps = {\n appName: string;\n href?: string;\n size?: \"md\" | \"sm\";\n className?: string;\n};\n\n/** Lotus mark + app name: the one brand every internal app shows. */\nexport function AppBrand({\n appName,\n href = \"/\",\n size = \"md\",\n className,\n}: AppBrandProps) {\n return (\n <a\n href={href}\n className={cn(\n \"polli:inline-flex polli:min-w-0 polli:shrink-0 polli:items-center polli:text-theme-text-strong\",\n size === \"md\" ? \"polli:gap-3\" : \"polli:gap-2.5\",\n className,\n )}\n >\n <BrandMark\n className={\n size === \"md\"\n ? \"polli:h-8 polli:w-8\"\n : \"polli:h-7 polli:w-7\"\n }\n />\n <span\n className={cn(\n \"polli:min-w-0 polli:truncate polli:font-subheading polli:font-medium polli:leading-none\",\n size === \"md\" ? \"polli:text-2xl\" : \"polli:text-xl\",\n )}\n >\n {appName}\n </span>\n </a>\n );\n}\n","import type { ReactNode, RefObject } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { BrandMark } from \"../primitives/BrandMark.tsx\";\nimport { AppBrand } from \"./AppBrand.tsx\";\n\ntype ScrollTargetRef = RefObject<HTMLElement | null>;\n\nexport type AppHeaderProps = {\n children?: ReactNode;\n navLabel: string;\n /** Shows the lotus + this name instead of the pollinations.ai wordmark. */\n appName?: string;\n autoHide?: boolean;\n scrollTargetRef?: ScrollTargetRef;\n brandHref?: string;\n brandLabel?: string;\n className?: string;\n innerClassName?: string;\n navClassName?: string;\n};\n\nfunction scrollTopFor(target: HTMLElement | Window) {\n return target === window\n ? window.scrollY\n : (target as HTMLElement).scrollTop;\n}\n\nexport function AppHeader({\n children,\n navLabel,\n appName,\n autoHide = false,\n scrollTargetRef,\n brandHref,\n brandLabel = \"Pollinations\",\n className,\n innerClassName,\n navClassName,\n}: AppHeaderProps) {\n const [hidden, setHidden] = useState(false);\n\n useEffect(() => {\n if (!autoHide || typeof window === \"undefined\") {\n setHidden(false);\n return;\n }\n\n const target = scrollTargetRef?.current ?? window;\n let lastScrollTop = scrollTopFor(target);\n let frameId = 0;\n\n const handleScroll = () => {\n if (frameId) return;\n\n frameId = window.requestAnimationFrame(() => {\n frameId = 0;\n const nextScrollTop = scrollTopFor(target);\n const delta = nextScrollTop - lastScrollTop;\n\n if (nextScrollTop < 16) {\n setHidden(false);\n } else if (delta > 8) {\n setHidden(true);\n } else if (delta < -8) {\n setHidden(false);\n }\n\n lastScrollTop = nextScrollTop;\n });\n };\n\n target.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n return () => {\n if (frameId) window.cancelAnimationFrame(frameId);\n target.removeEventListener(\"scroll\", handleScroll);\n };\n }, [autoHide, scrollTargetRef]);\n\n return (\n <header\n className={cn(\n \"polli:sticky polli:top-0 polli:z-30 polli:bg-app-bg polli:py-4\",\n \"polli:transition-transform polli:duration-200 polli:ease-out\",\n autoHide && \"polli:will-change-transform\",\n hidden ? \"polli:-translate-y-full\" : \"polli:translate-y-0\",\n className,\n )}\n onFocusCapture={() => setHidden(false)}\n >\n <div\n className={cn(\n \"polli:mx-auto polli:flex polli:w-full polli:max-w-5xl polli:flex-col polli:gap-4 polli:px-4 polli:sm:flex-row polli:sm:items-center polli:sm:justify-between polli:sm:px-6\",\n innerClassName,\n )}\n >\n {appName ? (\n <AppBrand appName={appName} href={brandHref} />\n ) : (\n <a\n href={brandHref ?? \"https://pollinations.ai\"}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"polli:inline-flex polli:shrink-0 polli:items-center polli:text-theme-text-strong\"\n >\n <span className=\"polli:sr-only\">{brandLabel}</span>\n <BrandMark\n variant=\"lockup\"\n className=\"polli:h-7 polli:w-[220px] polli:max-w-full\"\n />\n </a>\n )}\n {children ? (\n <nav\n aria-label={navLabel}\n className={cn(\n \"polli:flex polli:min-w-0 polli:flex-wrap polli:items-center polli:gap-2\",\n navClassName,\n )}\n >\n {children}\n </nav>\n ) : null}\n </div>\n </header>\n );\n}\n","import type { ComponentPropsWithoutRef, ElementType } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype SurfaceVariant = \"panel\" | \"card\" | \"card-themed\";\n\nconst variantClasses: Record<SurfaceVariant, string> = {\n // Phones get tighter padding (and a matching radius) so nested cards keep\n // their width; from `sm` up the page has room for the full spacing.\n panel: \"polli:rounded-3xl polli:bg-surface-block polli:p-4 polli:sm:rounded-block polli:sm:p-7\",\n card: \"polli-surface-card polli:rounded-card polli:bg-surface-opaque polli:p-3.5 polli:sm:p-4\",\n \"card-themed\":\n \"polli:rounded-card polli:bg-theme-bg-pale polli:p-3.5 polli:sm:p-4\",\n};\n\ntype SurfaceOwnProps = {\n /**\n * Depth role — flat: each level is one tint step, never a shadow or border.\n * - `panel` — Level 1 block: sections and page groups\n * - `card` — Level 2 card inside a block (default)\n * - `card-themed` — Level 2 card carrying the accent tint\n */\n variant?: SurfaceVariant;\n className?: string;\n};\n\n/**\n * Polymorphic like Button, TabButton and LinkCard, so a card that is itself a\n * link renders one element instead of an anchor wrapping a div. Defaults to\n * <div>, so existing call sites are unchanged.\n */\nexport type SurfaceProps<T extends ElementType = \"div\"> = SurfaceOwnProps & {\n as?: T;\n} & Omit<ComponentPropsWithoutRef<T>, keyof SurfaceOwnProps | \"as\" | \"color\">;\n\nexport function Surface<T extends ElementType = \"div\">({\n as,\n variant = \"card\",\n className,\n children,\n ...rest\n}: SurfaceProps<T>) {\n const Component: ElementType = as || \"div\";\n\n return (\n <Component\n {...rest}\n className={cn(\"polli:min-w-0\", variantClasses[variant], className)}\n >\n {children}\n </Component>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Surface } from \"../primitives/Surface.tsx\";\nimport { Heading, Text } from \"../primitives/Typography.tsx\";\n\nexport type CalloutProps = {\n title: ReactNode;\n body: ReactNode;\n children: ReactNode;\n tone?: \"theme\" | \"dark\";\n className?: string;\n};\n\n/** Prominent closing panel with a title, supporting copy, and actions. */\nexport function Callout({\n title,\n body,\n children,\n tone = \"theme\",\n className,\n}: CalloutProps) {\n return (\n <Surface\n as=\"section\"\n variant=\"panel\"\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-center polli:justify-between polli:gap-8 polli:rounded-3xl polli:px-6 polli:py-9 polli:sm:gap-10 polli:sm:px-10 polli:sm:py-12\",\n tone === \"dark\" ? \"dark polli:bg-brand-dark\" : undefined,\n className,\n )}\n >\n <div className=\"polli:flex polli:max-w-lg polli:flex-col polli:gap-2.5\">\n <Heading\n size=\"section\"\n className=\"polli:text-3xl polli:sm:text-4xl\"\n >\n {title}\n </Heading>\n <Text className=\"polli:text-theme-text-strong/75\">{body}</Text>\n </div>\n <div className=\"polli:flex polli:flex-wrap polli:items-center polli:gap-3\">\n {children}\n </div>\n </Surface>\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ArrowRightIcon } from \"../primitives/icons/index.tsx\";\nimport { ScrollArea, type ScrollAreaProps } from \"../primitives/ScrollArea.tsx\";\n\nexport type ChatConversationProps = Omit<\n ScrollAreaProps,\n \"children\" | \"className\"\n> & {\n children: ReactNode;\n className?: string;\n viewportClassName?: string;\n showScrollButton?: boolean;\n onScrollToBottom?: () => void;\n scrollButtonLabel?: string;\n};\n\n/**\n * Scrollable chat transcript with an optional jump-to-latest control.\n * Message data and streaming remain the consumer's responsibility.\n */\nexport const ChatConversation = forwardRef<\n HTMLDivElement,\n ChatConversationProps\n>(\n (\n {\n children,\n className,\n viewportClassName,\n showScrollButton = false,\n onScrollToBottom,\n scrollButtonLabel = \"Scroll to latest message\",\n ...viewportProps\n },\n ref,\n ) => (\n <div className={cn(\"polli:relative polli:min-h-0\", className)}>\n <ScrollArea\n {...viewportProps}\n ref={ref}\n className={cn(\"polli:h-full polli:min-h-0\", viewportClassName)}\n >\n {children}\n </ScrollArea>\n {showScrollButton && onScrollToBottom && (\n <button\n type=\"button\"\n aria-label={scrollButtonLabel}\n title={scrollButtonLabel}\n onClick={onScrollToBottom}\n className=\"polli-control polli:absolute polli:bottom-3 polli:left-1/2 polli:flex polli:size-9 polli:-translate-x-1/2 polli:cursor-pointer polli:items-center polli:justify-center polli:rounded-full polli:border polli:border-theme-border/60 polli:bg-surface-opaque polli:text-theme-text-strong polli:transition-transform polli:hover:translate-y-0.5\"\n >\n <ArrowRightIcon className=\"polli:size-4 polli:rotate-90\" />\n </button>\n )}\n </div>\n ),\n);\n\nChatConversation.displayName = \"ChatConversation\";\n\nexport type ChatConversationContentProps = ComponentPropsWithoutRef<\"div\">;\n\nexport function ChatConversationContent({\n className,\n ...props\n}: ChatConversationContentProps) {\n return (\n <div\n className={cn(\n \"polli:flex polli:min-w-0 polli:flex-col polli:gap-5\",\n className,\n )}\n {...props}\n />\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MutableRefObject,\n type PropsWithChildren,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype ScrollAxis = \"y\" | \"x\" | \"both\";\n\nconst axisClasses: Record<ScrollAxis, string> = {\n y: \"polli:overflow-y-auto polli:overflow-x-hidden\",\n x: \"polli:overflow-x-auto polli:overflow-y-hidden\",\n both: \"polli:overflow-auto\",\n};\n\ntype ScrollAreaOwnProps = {\n /** Scroll direction. Default `y`. */\n axis?: ScrollAxis;\n /** Use the system scrollbar instead of the custom auto-hiding track. */\n scrollbar?: \"subtle\" | \"native\";\n className?: string;\n};\n\nexport type ScrollAreaProps = PropsWithChildren<\n ScrollAreaOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof ScrollAreaOwnProps>\n>;\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) (ref as MutableRefObject<T | null>).current = value;\n}\n\n/** Scroll container with an optional themed, auto-hiding scrollbar. */\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n (\n { axis = \"y\", scrollbar = \"subtle\", className, children, ...rest },\n externalRef,\n ) => {\n const innerRef = useRef<HTMLDivElement | null>(null);\n\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n innerRef.current = node;\n assignRef(externalRef, node);\n },\n [externalRef],\n );\n\n useEffect(() => {\n if (scrollbar === \"native\") return;\n const element = innerRef.current;\n if (!element) return;\n\n let hideTimer: number | null = null;\n\n const clearHideTimer = () => {\n if (hideTimer !== null) {\n window.clearTimeout(hideTimer);\n hideTimer = null;\n }\n };\n\n const show = () => {\n element.dataset.scrollbarActive = \"true\";\n clearHideTimer();\n };\n\n const hide = () => {\n element.dataset.scrollbarActive = \"false\";\n clearHideTimer();\n };\n\n const scheduleHide = () => {\n clearHideTimer();\n hideTimer = window.setTimeout(hide, 2000);\n };\n\n const handleInteraction = () => {\n show();\n scheduleHide();\n };\n\n hide();\n\n element.addEventListener(\"scroll\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"wheel\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"touchstart\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"pointerdown\", handleInteraction);\n element.addEventListener(\"keydown\", handleInteraction);\n element.addEventListener(\"focusin\", handleInteraction);\n element.addEventListener(\"focusout\", scheduleHide);\n\n return () => {\n clearHideTimer();\n element.removeEventListener(\"scroll\", handleInteraction);\n element.removeEventListener(\"wheel\", handleInteraction);\n element.removeEventListener(\"touchstart\", handleInteraction);\n element.removeEventListener(\"pointerdown\", handleInteraction);\n element.removeEventListener(\"keydown\", handleInteraction);\n element.removeEventListener(\"focusin\", handleInteraction);\n element.removeEventListener(\"focusout\", scheduleHide);\n };\n }, [scrollbar]);\n\n return (\n <div\n {...rest}\n ref={setRef}\n className={cn(\n scrollbar === \"subtle\" && \"polli-scrollbar-subtle\",\n \"polli:min-w-0 polli:max-w-full\",\n axisClasses[axis],\n className,\n )}\n >\n {children}\n </div>\n );\n },\n);\n\nScrollArea.displayName = \"ScrollArea\";\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { RobotIcon } from \"../primitives/icons/index.tsx\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\nexport type ChatMessageRole = \"user\" | \"assistant\" | \"system\";\n\nexport type ChatMessageProps = ComponentPropsWithoutRef<\"article\"> & {\n from: ChatMessageRole;\n};\n\n/** Protocol-neutral message surface inspired by AI Elements' Message suite. */\nexport function ChatMessage({\n from,\n className,\n children,\n ...props\n}: ChatMessageProps) {\n return (\n <article\n data-role={from}\n className={cn(\n \"polli:group/message polli:flex polli:w-fit polli:max-w-full polli:min-w-0 polli:flex-col polli:gap-3 polli:[overflow-wrap:anywhere] polli:rounded-xl polli:px-4 polli:py-3\",\n from === \"user\"\n ? \"polli:ml-auto polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:mr-auto polli:bg-surface-opaque polli:text-theme-text-base\",\n className,\n )}\n {...props}\n >\n {children}\n </article>\n );\n}\n\nexport type ChatMessageHeaderProps = ComponentPropsWithoutRef<\"header\"> & {\n from: ChatMessageRole;\n label?: ReactNode;\n icon?: ReactNode;\n};\n\nexport function ChatMessageHeader({\n from,\n label,\n icon,\n className,\n ...props\n}: ChatMessageHeaderProps) {\n const content =\n label ??\n (from === \"user\" ? \"You\" : from === \"assistant\" ? \"Agent\" : \"System\");\n return (\n <header\n className={cn(\n \"polli:flex polli:items-center polli:gap-2\",\n className,\n )}\n {...props}\n >\n {from === \"assistant\" &&\n (icon ?? (\n <span className=\"polli:flex polli:size-6 polli:items-center polli:justify-center polli:rounded-full polli:bg-theme-bg-active polli:text-theme-text-strong\">\n <RobotIcon className=\"polli:size-3.5\" />\n </span>\n ))}\n <Text\n as=\"span\"\n size=\"xs\"\n tone=\"muted\"\n weight=\"bold\"\n className=\"polli:uppercase polli:tracking-wide\"\n >\n {content}\n </Text>\n </header>\n );\n}\n\nexport type ChatMessageContentProps = ComponentPropsWithoutRef<\"div\">;\n\nexport function ChatMessageContent({\n className,\n ...props\n}: ChatMessageContentProps) {\n return (\n <div\n className={cn(\n \"polli:min-w-0 polli:[&_pre]:max-w-full polli:[&_pre]:overflow-x-auto polli:[&_table]:max-w-full polli:[&_table]:overflow-x-auto\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport type ChatMessageActionsProps = ComponentPropsWithoutRef<\"footer\">;\n\nexport function ChatMessageActions({\n className,\n ...props\n}: ChatMessageActionsProps) {\n return (\n <footer\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-center polli:gap-1 polli:pt-2\",\n className,\n )}\n {...props}\n />\n );\n}\n","import {\n type ComponentPropsWithoutRef,\n forwardRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Textarea, type TextareaProps } from \"../primitives/Textarea.tsx\";\n\nexport type ChatPromptInputProps = ComponentPropsWithoutRef<\"fieldset\">;\n\n/**\n * Composable prompt shell. Put attachments or controls before the textarea and\n * actions in ChatPromptInputFooter; submission stays owned by the parent form.\n */\nexport function ChatPromptInput({ className, ...props }: ChatPromptInputProps) {\n return (\n <fieldset\n className={cn(\"polli:m-0 polli:min-w-0 polli:p-0\", className)}\n {...props}\n />\n );\n}\n\nexport const ChatPromptTextarea = forwardRef<\n HTMLTextAreaElement,\n TextareaProps\n>(({ className, ...props }, ref) => (\n <Textarea\n {...props}\n ref={ref}\n className={cn(\"polli:resize-none\", className)}\n />\n));\n\nChatPromptTextarea.displayName = \"ChatPromptTextarea\";\n\nexport type ChatPromptInputFooterProps = ComponentPropsWithoutRef<\"div\"> & {\n start?: ReactNode;\n end?: ReactNode;\n};\n\nexport function ChatPromptInputFooter({\n start,\n end,\n children,\n className,\n ...props\n}: ChatPromptInputFooterProps) {\n return (\n <div\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-end polli:gap-2\",\n className,\n )}\n {...props}\n >\n {children ?? (\n <>\n <div className=\"polli:flex polli:flex-wrap polli:items-center polli:gap-2\">\n {start}\n </div>\n <div className=\"polli:ml-auto polli:flex polli:items-center polli:gap-2\">\n {end}\n </div>\n </>\n )}\n </div>\n );\n}\n","import { forwardRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type TextareaProps = React.ComponentPropsWithoutRef<\"textarea\"> & {\n error?: boolean;\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, error, rows = 4, ...props }, ref) => (\n <textarea\n ref={ref}\n rows={rows}\n data-error={error ? \"true\" : undefined}\n className={cn(\n \"polli-textarea polli:w-full polli:rounded-lg polli:border polli:px-3 polli:py-2\",\n \"polli:min-h-20 polli:resize-y polli:font-body polli:text-base\",\n \"polli:text-theme-text-strong\",\n \"polli:transition-colors\",\n \"polli:disabled:opacity-50 polli:disabled:cursor-not-allowed\",\n className,\n )}\n {...props}\n />\n ),\n);\n\nTextarea.displayName = \"Textarea\";\n","import {\n type ButtonHTMLAttributes,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Button, type ButtonProps } from \"../primitives/Button.tsx\";\nimport { Tooltip } from \"../primitives/Tooltip.tsx\";\n\ntype CopyValue = string | (() => string | Promise<string>);\n\nexport type CopyButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"className\" | \"onClick\" | \"type\" | \"value\"\n> & {\n value: CopyValue;\n children: ReactNode | ((copied: boolean) => ReactNode);\n copiedTimeoutMs?: number;\n tooltip?: ReactNode;\n tooltipAlign?: \"start\" | \"center\";\n tooltipClampToViewport?: boolean;\n tooltipMaxWidth?: number;\n copiedTooltip?: ReactNode;\n tooltipClassName?: string;\n className?: string | ((copied: boolean) => string);\n variant?: \"plain\" | \"button\";\n /** Button intent, used with `variant=\"button\"`. */\n intent?: ButtonProps<\"button\">[\"intent\"];\n onCopied?: () => void;\n onCopyError?: (error: unknown) => void;\n};\n\nexport function CopyButton({\n value,\n children,\n copiedTimeoutMs = 2000,\n tooltip = \"📋 Click to copy\",\n tooltipAlign,\n tooltipClampToViewport,\n tooltipMaxWidth,\n copiedTooltip = \"✅ Copied!\",\n tooltipClassName,\n className,\n variant = \"plain\",\n intent,\n onCopied,\n onCopyError,\n ...buttonProps\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n },\n [],\n );\n\n async function handleCopy(event: MouseEvent<HTMLButtonElement>) {\n event.stopPropagation();\n try {\n const text = typeof value === \"function\" ? await value() : value;\n await navigator.clipboard.writeText(text);\n setCopied(true);\n onCopied?.();\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(\n () => setCopied(false),\n copiedTimeoutMs,\n );\n } catch (error) {\n onCopyError?.(error);\n }\n }\n\n const Control = variant === \"button\" ? Button : \"button\";\n const button = (\n <Control\n {...buttonProps}\n {...(variant === \"button\" && intent ? { intent } : {})}\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n \"polli-control\",\n buttonProps.disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\",\n typeof className === \"function\" ? className(copied) : className,\n )}\n >\n {typeof children === \"function\" ? children(copied) : children}\n </Control>\n );\n\n // A copy button with its own visible label doesn't need a hover tooltip —\n // pass tooltip={null} to opt out of the wrapper entirely.\n if (tooltip === null) {\n return button;\n }\n\n return (\n <Tooltip\n triggerAs=\"span\"\n content={copied ? copiedTooltip : tooltip}\n align={tooltipAlign}\n clampToViewport={tooltipClampToViewport}\n maxWidth={tooltipMaxWidth}\n displayContents\n tapEnabled={false}\n className={cn(\n buttonProps.disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\",\n tooltipClassName,\n )}\n >\n {button}\n </Tooltip>\n );\n}\n","import type {\n PropsWithChildren,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\n/** Semantic action roles. Label recipes live on Chip. */\ntype ButtonIntent = \"danger\" | \"info\" | \"neutral\" | \"brand\" | \"commit\";\nexport type ButtonAppearance = \"pill\" | \"raised\";\n\nconst pillSizes = {\n icon: \"polli:h-12 polli:w-12 polli:p-0\",\n xs: \"polli:h-5 polli:px-1.5 polli:py-0 polli:text-[11px] polli:leading-none\",\n sm: \"polli:min-h-7 polli:px-2 polli:pt-0.5 polli:pb-1\",\n md: \"polli:min-h-9 polli:px-4 polli:pt-1.5 polli:pb-2\",\n lg: \"polli:min-h-12 polli:px-6 polli:py-3 polli:text-base\",\n} as const;\n\nconst raisedSizes = {\n icon: \"polli:h-12 polli:w-12 polli:p-0\",\n xs: \"polli:px-2 polli:py-1 polli:text-xs\",\n sm: \"polli:px-4 polli:py-2 polli:text-sm\",\n md: \"polli:px-7 polli:py-3.5 polli:text-base\",\n lg: \"polli:px-8 polli:py-4 polli:text-lg\",\n} as const;\n\nconst appearanceClasses: Record<ButtonAppearance, string> = {\n pill: \"polli:rounded-full\",\n raised:\n \"polli:rounded-xl polli:border-r-[3px] polli:border-b-[3px] polli:border-solid \" +\n \"polli:border-theme-text-strong/20 polli:hover:border-theme-text-strong/45\",\n};\n\n// Cascade-driven base — reads [data-theme] vars.\nconst themeClasses =\n \"polli:bg-theme-bg-active polli:text-theme-text-strong \" +\n \"polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover polli:transition-colors\";\n\n// Primary actions have a soft accent fill in light mode and an outline in dark.\n// `brand` keeps a calm hover; `commit` strengthens the fill on hover and focus.\nconst outlined =\n \"polli:border polli:border-theme-text-soft polli:bg-theme-bg-active/30 polli:text-theme-text-strong \" +\n \"polli:transition-colors polli:[.dark_&]:bg-transparent\";\nconst intentClasses: Record<ButtonIntent, string> = {\n brand: `${outlined} polli:hover:bg-theme-bg-active/50 polli:[.dark_&]:hover:bg-theme-text-soft/10`,\n commit:\n `${outlined} polli:hover:border-theme-bg-active polli:hover:bg-theme-bg-active ` +\n \"polli:focus-visible:border-theme-bg-active polli:focus-visible:bg-theme-bg-active \" +\n \"polli:[.dark_&]:hover:bg-theme-bg-active polli:[.dark_&]:focus-visible:bg-theme-bg-active\",\n danger:\n \"polli:border polli:border-intent-danger-text polli:bg-intent-danger-bg-light polli:text-intent-danger-text \" +\n \"polli:hover:bg-intent-danger-bg-hover polli:focus-visible:bg-intent-danger-bg-hover polli:transition-colors \" +\n \"polli:[.dark_&]:bg-transparent polli:[.dark_&]:hover:bg-intent-danger-bg-hover polli:[.dark_&]:focus-visible:bg-intent-danger-bg-hover\",\n info:\n \"polli:bg-intent-info-bg-light polli:text-intent-info-text \" +\n \"polli:hover:bg-intent-info-bg-hover polli:transition-colors\",\n // Secondary actions never take the accent: one step stronger grey on hover.\n neutral:\n \"polli:bg-theme-bg-subtle polli:text-theme-text-base \" +\n \"polli:hover:bg-theme-text-muted/25 polli:hover:text-theme-text-strong polli:transition-colors\",\n};\n\ntype BaseButtonProps = {\n icon?: ReactNode;\n /** Optional semantic recipe; omit for the ambient theme button. */\n intent?: ButtonIntent;\n /** `raised` is the stronger website CTA treatment. */\n appearance?: ButtonAppearance;\n size?: keyof typeof pillSizes;\n className?: string;\n disabled?: boolean;\n};\n\nconst buttonClasses = ({\n intent,\n appearance = \"pill\",\n size,\n className,\n disabled,\n busy,\n}: BaseButtonProps & { disabled?: boolean; busy?: boolean }) => {\n const colorClasses = intent ? intentClasses[intent] : themeClasses;\n const sizeClasses = appearance === \"raised\" ? raisedSizes : pillSizes;\n return cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:self-center polli:font-body polli:text-sm polli:font-medium polli:leading-normal polli:box-border polli:border polli:border-transparent\",\n // A busy button is working, not unavailable: it keeps its strength.\n busy\n ? \"polli:cursor-progress\"\n : disabled\n ? \"polli:opacity-50 polli:cursor-not-allowed\"\n : \"polli:hover:filter polli:hover:brightness-105 polli:cursor-pointer\",\n colorClasses,\n appearanceClasses[appearance],\n sizeClasses[size || \"md\"],\n className,\n );\n};\n\nexport type ButtonProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseButtonProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseButtonProps | \"as\">;\n\nexport function Button<T extends React.ElementType = \"button\">({\n as,\n children,\n icon,\n intent,\n appearance,\n size,\n className,\n disabled,\n ...buttonProps\n}: ButtonProps<T>) {\n const Component: React.ElementType = as || \"button\";\n const isButton = Component === \"button\";\n const isAnchor = Component === \"a\";\n const buttonType = (\n buttonProps as {\n type?: \"button\" | \"submit\" | \"reset\";\n }\n ).type;\n const onClick = (\n buttonProps as {\n onClick?: (event: ReactMouseEvent) => void;\n }\n ).onClick;\n const ariaBusy = (\n buttonProps as { \"aria-busy\"?: boolean | \"true\" | \"false\" }\n )[\"aria-busy\"];\n const busy = ariaBusy === true || ariaBusy === \"true\";\n const handleClick = disabled\n ? (event: ReactMouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }\n : onClick;\n\n return (\n <Component\n {...buttonProps}\n data-intent={intent}\n {...(isButton ? { type: buttonType ?? \"button\", disabled } : {})}\n {...(!isButton && disabled\n ? { \"aria-disabled\": true, tabIndex: -1 }\n : {})}\n {...(isAnchor && disabled ? { href: undefined } : {})}\n onClick={handleClick}\n className={buttonClasses({\n intent,\n appearance,\n size,\n className,\n disabled,\n busy,\n })}\n >\n {icon && (\n <span\n aria-hidden=\"true\"\n className=\"polli:mr-2 polli:flex polli:size-4 polli:shrink-0 polli:[&>svg]:size-full\"\n >\n {busy ? (\n <span className=\"polli:block polli:size-full polli:animate-spin polli:rounded-full polli:border-2 polli:border-current polli:border-r-transparent polli:motion-reduce:animate-none\" />\n ) : (\n icon\n )}\n </span>\n )}\n {children}\n </Component>\n );\n}\n","import {\n type CSSProperties,\n type FC,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst TOOLTIP_MAX_WIDTH = 288;\nconst TOOLTIP_VIEWPORT_MARGIN = 12;\n\ntype TooltipProps = {\n children: ReactNode;\n content: ReactNode;\n align?: \"start\" | \"center\";\n ariaLabel?: string;\n clampToViewport?: boolean;\n className?: string;\n maxWidth?: number;\n onClick?: () => void;\n stopClickPropagation?: boolean;\n style?: CSSProperties;\n tapEnabled?: boolean;\n triggerAs?: \"button\" | \"span\";\n /**\n * When true, the inner cursor wrapper uses display:contents so the\n * trigger's flex/grid layout applies directly to the caller's children\n * without an inline wrapper in the way.\n */\n displayContents?: boolean;\n};\n\nexport const Tooltip: FC<TooltipProps> = ({\n children,\n content,\n align = \"start\",\n ariaLabel,\n clampToViewport = true,\n className,\n maxWidth = TOOLTIP_MAX_WIDTH,\n onClick,\n stopClickPropagation = true,\n style,\n tapEnabled = false,\n triggerAs = \"button\",\n displayContents = false,\n}) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState<{\n top: number;\n left: number;\n maxWidth: number;\n transform?: CSSProperties[\"transform\"];\n }>({\n top: 0,\n left: 0,\n maxWidth,\n });\n const triggerRef = useRef<HTMLElement | null>(null);\n const tapPinnedRef = useRef(false);\n const tooltipId = useId();\n\n const closeTooltip = () => {\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n\n useEffect(() => {\n if (!showTooltip) return;\n\n const dismissOnOutsideTap = (event: PointerEvent) => {\n if (triggerRef.current?.contains(event.target as Node)) return;\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n const dismissOnEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n const dismissOnViewportChange = () => {\n tapPinnedRef.current = false;\n setShowTooltip(false);\n };\n\n document.addEventListener(\"pointerdown\", dismissOnOutsideTap);\n document.addEventListener(\"keydown\", dismissOnEscape);\n window.addEventListener(\"scroll\", dismissOnViewportChange, {\n capture: true,\n passive: true,\n });\n window.addEventListener(\"resize\", dismissOnViewportChange);\n return () => {\n document.removeEventListener(\"pointerdown\", dismissOnOutsideTap);\n document.removeEventListener(\"keydown\", dismissOnEscape);\n window.removeEventListener(\"scroll\", dismissOnViewportChange, true);\n window.removeEventListener(\"resize\", dismissOnViewportChange);\n };\n }, [showTooltip]);\n\n const updateTooltipPosition = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const availableMaxWidth = Math.min(\n maxWidth,\n window.innerWidth - TOOLTIP_VIEWPORT_MARGIN * 2,\n );\n let left =\n align === \"center\" ? rect.left + rect.width / 2 : rect.left;\n let transform: CSSProperties[\"transform\"] =\n align === \"center\" ? \"translateX(-50%)\" : undefined;\n if (clampToViewport) {\n left = Math.min(\n Math.max(rect.left, TOOLTIP_VIEWPORT_MARGIN),\n Math.max(\n TOOLTIP_VIEWPORT_MARGIN,\n window.innerWidth -\n availableMaxWidth -\n TOOLTIP_VIEWPORT_MARGIN,\n ),\n );\n transform = undefined;\n }\n setTooltipPosition({\n top: rect.bottom + 4,\n left,\n maxWidth: availableMaxWidth,\n transform,\n });\n }\n };\n\n // Informational triggers use help; action wrappers can override the cursor.\n const triggerClassName = cn(\n \"polli-control polli:relative polli:cursor-help polli:text-left polli:inline-flex polli:items-center\",\n className,\n );\n\n const cursorClass = displayContents\n ? \"polli:contents\"\n : \"polli:cursor-inherit\";\n\n // Portal past the trigger's layout; stay inside modal dialogs so the popup\n // shares their stacking and accessible subtree.\n const popupClasses =\n \"polli:fixed polli:w-max polli:px-2 polli:py-1 polli:bg-surface-menu polli:text-theme-text-base polli:font-normal polli:leading-snug polli:tracking-normal polli:normal-case polli:not-italic polli:text-xs polli:rounded-md polli:shadow-md polli:z-[130] polli:pointer-events-none polli:transition-opacity polli:whitespace-pre-line polli:break-words\";\n\n const popupNode = content ? (\n <span\n id={tooltipId}\n role=\"tooltip\"\n aria-hidden={!showTooltip}\n style={{\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n maxWidth: tooltipPosition.maxWidth,\n transform: tooltipPosition.transform,\n }}\n className={`${\n showTooltip\n ? \"polli:visible polli:opacity-100\"\n : \"polli:invisible polli:opacity-0\"\n } ${popupClasses}`}\n >\n {content}\n </span>\n ) : null;\n const tooltipPopup =\n popupNode && typeof document !== \"undefined\"\n ? createPortal(\n popupNode,\n triggerRef.current?.closest('[role=\"dialog\"]') ??\n document.body,\n )\n : popupNode;\n const contentNode = (\n <>\n <span className={cursorClass}>{children}</span>\n {tooltipPopup}\n </>\n );\n\n const sharedProps = {\n \"aria-label\": ariaLabel,\n \"aria-describedby\": content && showTooltip ? tooltipId : undefined,\n className: triggerClassName,\n onMouseEnter: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onMouseLeave: () => {\n if (!tapPinnedRef.current) setShowTooltip(false);\n },\n onClick: (e: MouseEvent) => {\n if (stopClickPropagation) e.stopPropagation();\n if (onClick) {\n onClick();\n }\n if (!tapEnabled || !content) return;\n updateTooltipPosition();\n if (tapPinnedRef.current) {\n closeTooltip();\n return;\n }\n tapPinnedRef.current = true;\n setShowTooltip(true);\n },\n onFocus: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onBlur: closeTooltip,\n style,\n };\n\n if (triggerAs === \"span\") {\n const handleKeyDown = (event: KeyboardEvent<HTMLSpanElement>) => {\n if (!tapEnabled || !content) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n updateTooltipPosition();\n if (tapPinnedRef.current) {\n closeTooltip();\n return;\n }\n tapPinnedRef.current = true;\n setShowTooltip(true);\n };\n const spanInteractionProps = {\n ...sharedProps,\n role: tapEnabled && content ? \"button\" : undefined,\n tabIndex: tapEnabled && content ? 0 : undefined,\n onKeyDown: tapEnabled && content ? handleKeyDown : undefined,\n };\n\n return (\n <span\n ref={(node) => {\n triggerRef.current = node;\n }}\n {...spanInteractionProps}\n >\n {contentNode}\n </span>\n );\n }\n\n return (\n <button\n ref={(node) => {\n triggerRef.current = node;\n }}\n type=\"button\"\n aria-label={ariaLabel}\n aria-describedby={content && showTooltip ? tooltipId : undefined}\n className={triggerClassName}\n onMouseEnter={sharedProps.onMouseEnter}\n onMouseLeave={sharedProps.onMouseLeave}\n onClick={sharedProps.onClick}\n onFocus={sharedProps.onFocus}\n onBlur={sharedProps.onBlur}\n style={style}\n >\n {contentNode}\n </button>\n );\n};\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { CheckIcon, ClipboardIcon } from \"../primitives/icons/index.tsx\";\nimport { CopyButton } from \"./CopyButton.tsx\";\n\ntype CodeBlockOwnProps = {\n code: string;\n codeClassName?: string;\n language?: string;\n};\n\nexport type CodeBlockProps = CodeBlockOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof CodeBlockOwnProps | \"children\">;\n\nexport const CodeBlock: FC<CodeBlockProps> = ({\n code,\n codeClassName,\n language,\n className,\n ...rest\n}) => {\n const label = language || \"Code\";\n\n return (\n <div\n {...rest}\n className={cn(\n \"polli:min-w-0 polli:max-w-full polli:overflow-hidden polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale\",\n className,\n )}\n >\n <div className=\"polli:flex polli:min-h-9 polli:items-center polli:justify-between polli:gap-3 polli:bg-theme-bg-subtle polli:px-3 polli:py-1.5\">\n <span className=\"polli:truncate polli:font-mono polli:text-[11px] polli:font-medium polli:uppercase polli:tracking-wide polli:text-theme-text-muted\">\n {label}\n </span>\n <CopyButton\n value={code}\n tooltip={null}\n aria-label=\"Copy code\"\n className=\"polli:flex polli:items-center polli:gap-1.5 polli:rounded-md polli:px-2 polli:py-1 polli:text-xs polli:font-medium polli:text-theme-text-base polli:transition-colors polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\"\n >\n {(copied) => (\n <>\n {copied ? (\n <CheckIcon className=\"polli:size-3.5\" />\n ) : (\n <ClipboardIcon className=\"polli:size-3.5\" />\n )}\n <span>{copied ? \"Copied\" : \"Copy\"}</span>\n </>\n )}\n </CopyButton>\n </div>\n <pre\n className={cn(\n \"polli:m-0 polli:min-w-0 polli:whitespace-pre-wrap polli:break-words polli:[overflow-wrap:anywhere] polli:[tab-size:4] polli:p-3 polli:font-mono polli:text-xs polli:leading-6 polli:text-theme-text-strong\",\n codeClassName,\n )}\n >\n <code>{code}</code>\n </pre>\n </div>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\n\nexport type CollapsibleProps = {\n /** Header content (label, hint, etc). */\n label: ReactNode;\n expanded: boolean;\n onToggle: () => void;\n children: ReactNode;\n disabled?: boolean;\n /** Outer wrapper classes — border, rounding, etc. Keep it bg-free if the\n * expanded panel should stay transparent; put any fill on the trigger. */\n wrapperClassName?: string;\n /** Trigger/header base classes (e.g. a selected background). */\n triggerClassName?: string;\n /** Trigger hover classes. Defaults to `polli:hover:bg-theme-bg-active`. */\n hoverClassName?: string;\n /** Trigger focus classes. */\n focusClassName?: string;\n /** Expanded panel classes. Defaults to a top border separator. */\n panelClassName?: string;\n /** Accessible label for the toggle button when label is non-text. */\n ariaLabel?: string;\n};\n\n/**\n * Collapsible row composition. One chevron, one hover/rounded behaviour for\n * every collapsible in the UI. Use this for any \"click to reveal nested\n * content\" UI — nested settings, grouped controls, optional details.\n *\n * For dropdown/popover triggers (date pickers, menus) use a button with\n * <ChevronIcon /> directly — that's a different interaction.\n */\nexport const Collapsible: FC<CollapsibleProps> = ({\n label,\n expanded,\n onToggle,\n children,\n disabled = false,\n wrapperClassName,\n triggerClassName,\n hoverClassName = \"polli:hover:bg-theme-bg-active\",\n focusClassName,\n panelClassName = \"polli:border-t polli:border-theme-border polli:px-3 polli:pt-3 polli:pb-3\",\n ariaLabel,\n}) => (\n <div\n className={cn(\n \"polli:rounded-lg polli:border polli:transition-all\",\n wrapperClassName,\n disabled && \"polli:opacity-50\",\n )}\n >\n <button\n type=\"button\"\n aria-expanded={expanded}\n aria-label={ariaLabel}\n disabled={disabled}\n onClick={onToggle}\n className={cn(\n \"polli-control polli:w-full polli:flex polli:items-center polli:gap-3 polli:px-3 polli:py-2 polli:text-left polli:transition-colors\",\n expanded ? \"polli:rounded-t-lg\" : \"polli:rounded-lg\",\n triggerClassName,\n !disabled && hoverClassName,\n focusClassName,\n disabled ? \"polli:cursor-not-allowed\" : \"polli:cursor-pointer\",\n )}\n >\n <div className=\"polli:flex-1 polli:min-w-0\">{label}</div>\n <ChevronIcon\n expanded={expanded}\n className=\"polli:text-theme-text-soft\"\n />\n </button>\n {expanded && <div className={panelClassName}>{children}</div>}\n </div>\n);\n","import { Dialog as ArkDialog } from \"@ark-ui/react/dialog\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ScrollArea, type ScrollAreaProps } from \"./ScrollArea.tsx\";\nimport { headingClassName } from \"./Typography.tsx\";\n\nconst sizeClasses = {\n sm: \"polli:max-w-md\",\n md: \"polli:max-w-xl\",\n lg: \"polli:max-w-[800px]\",\n xl: \"polli:max-w-6xl\",\n} as const;\n\nexport type DialogProps = {\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: ReactNode;\n triggerAsChild?: boolean;\n triggerClassName?: string;\n title?: ReactNode;\n ariaLabel?: string;\n labelledBy?: string;\n size?: keyof typeof sizeClasses;\n showBackdrop?: boolean;\n backdropBlur?: boolean;\n positionerClassName?: string;\n contentClassName?: string;\n children: ReactNode;\n};\n\nexport const Dialog: FC<DialogProps> = ({\n open,\n onOpenChange,\n trigger,\n triggerAsChild = false,\n triggerClassName,\n title,\n ariaLabel,\n labelledBy,\n size = \"md\",\n showBackdrop = true,\n backdropBlur = true,\n positionerClassName,\n contentClassName,\n children,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <ArkDialog.Root\n open={open}\n initialFocusEl={() => contentRef.current}\n onOpenChange={(details) => onOpenChange?.(details.open)}\n >\n {trigger && (\n <ArkDialog.Trigger\n asChild={triggerAsChild}\n className={triggerClassName}\n >\n {trigger}\n </ArkDialog.Trigger>\n )}\n <Portal>\n {showBackdrop && (\n <ArkDialog.Backdrop\n // Scrim must DARKEN in both modes — ink-950 inverts\n // (near-white in dark) and would brighten the page.\n // Fixed black + a soft blur dims and de-focuses.\n // Ark numbers nested dialogs (--layer-index), so a\n // dialog opened from another dims and covers it.\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[calc(100_+_var(--layer-index,0)_*_20)] polli:bg-[#000]/50\",\n backdropBlur && \"polli:backdrop-blur-sm\",\n )}\n />\n )}\n <ArkDialog.Positioner\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[calc(110_+_var(--layer-index,0)_*_20)] polli:flex polli:max-h-dvh polli:items-start polli:justify-center polli:overflow-hidden polli:p-4\",\n \"polli-dialog-mobile-positioner\",\n positionerClassName,\n )}\n >\n <ArkDialog.Content\n ref={contentRef}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n className={cn(\n \"polli:my-auto polli:flex polli:h-auto polli:max-h-full polli:w-full polli:flex-col polli:overflow-y-auto polli:rounded-block polli:bg-surface-block polli:outline-none polli:focus:outline-none polli:focus-visible:outline-none\",\n \"polli-dialog-mobile-page\",\n sizeClasses[size],\n contentClassName,\n )}\n >\n {title && <DialogHeader title={title} />}\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n );\n};\n\nexport const DialogTitle = ArkDialog.Title;\nexport const DialogDescription = ArkDialog.Description;\n\nexport type DialogHeaderProps = Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"title\"\n> & {\n title?: ReactNode;\n description?: ReactNode;\n inBody?: boolean;\n titleClassName?: string;\n descriptionClassName?: string;\n};\n\nexport const DialogHeader: FC<DialogHeaderProps> = ({\n title,\n description,\n children,\n inBody = false,\n className,\n titleClassName,\n descriptionClassName,\n ...props\n}) => {\n return (\n <div\n className={cn(\n inBody\n ? \"polli:shrink-0 polli:pt-2 polli:pb-4\"\n : \"polli:shrink-0 polli:px-(--polli-dialog-gutter) polli:pt-6 polli:pb-4\",\n className,\n )}\n {...props}\n >\n {title && (\n <DialogTitle\n className={cn(headingClassName(\"section\"), titleClassName)}\n >\n {title}\n </DialogTitle>\n )}\n {description && (\n <DialogDescription\n className={cn(\n \"polli:mt-1 polli:font-body polli:text-sm polli:font-normal polli:leading-5 polli:text-theme-text-base\",\n descriptionClassName,\n )}\n >\n {description}\n </DialogDescription>\n )}\n {children}\n </div>\n );\n};\n\nexport type DialogFooterProps = ComponentPropsWithoutRef<\"div\">;\n\nexport type DialogBodyProps = ScrollAreaProps & {\n actions?: ReactNode;\n footnote?: ReactNode;\n bodyClassName?: string;\n};\n\n/**\n * Scroll area whose actions follow the content and stay pinned to the bottom\n * once the content scrolls, so a short screen never opens a gap above them.\n */\nexport function DialogBody({\n children,\n actions,\n footnote,\n bodyClassName,\n className,\n ...props\n}: DialogBodyProps) {\n return (\n <ScrollArea\n {...props}\n className={cn(\n \"polli:flex polli:min-h-0 polli:flex-1 polli:flex-col polli:overscroll-contain\",\n className,\n )}\n >\n <div\n className={cn(\n \"polli:space-y-3 polli:px-(--polli-dialog-gutter) polli:py-4\",\n bodyClassName,\n )}\n >\n {children}\n </div>\n {(actions || footnote) && (\n // The size container lets the footer follow the dialog's width.\n // It sits on the footer alone so pickers and tooltips in the\n // body keep their positioning.\n <div className=\"polli-dialog-floating-controls polli:@container polli:pointer-events-none polli:sticky polli:bottom-0 polli:z-10\">\n {actions && (\n <DialogFooter className=\"polli:pointer-events-auto\">\n {actions}\n </DialogFooter>\n )}\n {footnote && (\n <div className=\"polli:pointer-events-auto\">\n {footnote}\n </div>\n )}\n </div>\n )}\n </ScrollArea>\n );\n}\n\nexport const DialogFooter: FC<DialogFooterProps> = ({\n children,\n className,\n ...props\n}) => {\n return (\n <div\n className={cn(\n \"polli:flex polli:shrink-0 polli:flex-wrap polli:items-center polli:justify-end polli:gap-3 polli:bg-transparent polli:px-(--polli-dialog-gutter) polli:pt-4 polli:pb-6\",\n // Actions are the screen's main controls: touch-sized, sharing\n // the row in a narrow dialog (below 36rem, phones included), and\n // spanning it when there is only one.\n \"polli:[&>.polli-control]:min-h-12 polli:[&>.polli-control]:text-base polli:@max-xl:[&>.polli-control]:flex-auto polli:[&>.polli-control:only-child]:flex-auto\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n};\n","import type { ReactNode } from \"react\";\nimport { Button } from \"../primitives/Button.tsx\";\nimport {\n Dialog,\n DialogBody,\n DialogHeader,\n type DialogProps,\n} from \"../primitives/Dialog.tsx\";\nimport { CheckIcon, TrashIcon, XIcon } from \"../primitives/icons/index.tsx\";\n\ntype ConfirmIntent = \"danger\" | \"info\" | \"neutral\" | \"commit\";\n\nconst defaultIcons: Record<ConfirmIntent, ReactNode> = {\n danger: <TrashIcon />,\n commit: <CheckIcon />,\n info: <CheckIcon />,\n neutral: <CheckIcon />,\n};\n\nexport type ConfirmationDialogProps = {\n open: boolean;\n title: ReactNode;\n /** Short explanation rendered as body text. */\n description?: ReactNode;\n /** Extra body content below the description (alerts, inputs). */\n children?: ReactNode;\n confirmLabel: ReactNode;\n /** Confirm button recipe; also picks the default confirm icon. */\n intent?: ConfirmIntent;\n /** Override the confirm icon when the action is not a plain delete/confirm. */\n confirmIcon?: ReactNode;\n confirmDisabled?: boolean;\n cancelDisabled?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n size?: DialogProps[\"size\"];\n};\n\n/** One floating Cancel + confirm action for every yes/no dialog. */\nexport function ConfirmationDialog({\n open,\n title,\n description,\n children,\n confirmLabel,\n intent = \"danger\",\n confirmIcon,\n confirmDisabled = false,\n cancelDisabled = false,\n onConfirm,\n onCancel,\n size = \"md\",\n}: ConfirmationDialogProps) {\n const actions = (\n <>\n <Button\n type=\"button\"\n intent=\"neutral\"\n icon={<XIcon />}\n onClick={onCancel}\n disabled={cancelDisabled}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n intent={intent}\n icon={confirmIcon ?? defaultIcons[intent]}\n onClick={onConfirm}\n disabled={confirmDisabled}\n >\n {confirmLabel}\n </Button>\n </>\n );\n\n return (\n <Dialog\n open={open}\n onOpenChange={(next) => !next && onCancel()}\n size={size}\n contentClassName=\"polli:overflow-hidden\"\n >\n <DialogBody actions={actions}>\n <DialogHeader inBody title={title} />\n {description && (\n <p className=\"polli:text-sm polli:leading-relaxed\">\n {description}\n </p>\n )}\n {children}\n </DialogBody>\n </Dialog>\n );\n}\n","import type { ComponentPropsWithoutRef, ElementType, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst sizeClasses = {\n page: \"polli:text-sm polli:tracking-widest polli:text-theme-text-soft\",\n card: \"polli:text-xs polli:tracking-wider polli:text-theme-text-soft\",\n chrome: \"polli:text-micro polli:tracking-widest polli:text-theme-text-muted\",\n} as const;\n\ntype EyebrowOwnProps<T extends ElementType> = {\n as?: T;\n size?: keyof typeof sizeClasses;\n className?: string;\n children: ReactNode;\n};\n\nexport type EyebrowProps<T extends ElementType = \"span\"> = EyebrowOwnProps<T> &\n Omit<ComponentPropsWithoutRef<T>, keyof EyebrowOwnProps<T>>;\n\n/** Uppercase pixel label for page, card, and chrome metadata. */\nexport function Eyebrow<T extends ElementType = \"span\">({\n as,\n size = \"card\",\n className,\n children,\n ...rest\n}: EyebrowProps<T>) {\n const Component: ElementType = as || \"span\";\n\n return (\n <Component\n {...rest}\n className={cn(\n \"polli:font-pixel polli:uppercase\",\n sizeClasses[size],\n className,\n )}\n >\n {children}\n </Component>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Eyebrow } from \"../primitives/Eyebrow.tsx\";\n\nexport type ContentHeaderProps = {\n eyebrow: ReactNode;\n title: ReactNode;\n subtitle?: ReactNode;\n action?: ReactNode;\n variant?: \"page\" | \"section\";\n className?: string;\n};\n\nconst titleClasses = {\n page: \"polli:font-heading polli:text-4xl polli:leading-[1.08] polli:text-theme-text-strong polli:sm:text-5xl polli:lg:text-7xl\",\n section:\n \"polli:font-subheading polli:text-3xl polli:leading-tight polli:text-theme-text-strong polli:sm:text-4xl\",\n} as const;\n\nconst subtitleClasses = {\n page: \"polli:max-w-lg polli:text-base polli:leading-relaxed polli:text-theme-text-base polli:sm:text-lg\",\n section: \"polli:max-w-xl polli:leading-relaxed polli:text-theme-text-base\",\n} as const;\n\n/** Shared page/section heading rhythm with an optional trailing action. */\nexport function ContentHeader({\n eyebrow,\n title,\n subtitle,\n action,\n variant = \"section\",\n className,\n}: ContentHeaderProps) {\n const Title = variant === \"page\" ? \"h1\" : \"h2\";\n\n return (\n <header\n className={cn(\n \"polli:flex polli:flex-wrap polli:items-end polli:justify-between polli:gap-6\",\n className,\n )}\n >\n <div className=\"polli:flex polli:max-w-2xl polli:flex-col polli:gap-3\">\n {eyebrow ? <Eyebrow size=\"page\">{eyebrow}</Eyebrow> : null}\n <Title className={titleClasses[variant]}>{title}</Title>\n {subtitle && (\n <p\n className={cn(\n subtitleClasses[variant],\n \"polli:[&_strong]:text-theme-text-strong\",\n )}\n >\n {subtitle}\n </p>\n )}\n </div>\n {action}\n </header>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { CheckIcon, ClipboardIcon } from \"../primitives/icons/index.tsx\";\nimport { CopyButton, type CopyButtonProps } from \"./CopyButton.tsx\";\n\nexport type CopyFieldProps = Pick<\n CopyButtonProps,\n \"value\" | \"onCopied\" | \"onCopyError\" | \"copiedTimeoutMs\"\n> & {\n /** Accessible name, e.g. \"Copy secret key\". */\n label: string;\n /** What to show; defaults to a string value or the label for lazy values. */\n display?: ReactNode;\n className?: string;\n};\n\n/**\n * A value the user copies but never edits: looks like a field, behaves like a\n * button. The whole surface copies on click; the end icon confirms.\n */\nexport function CopyField({\n value,\n label,\n display,\n className,\n ...copy\n}: CopyFieldProps) {\n return (\n <CopyButton\n {...copy}\n value={value}\n tooltip={null}\n aria-label={label}\n className={(copied) =>\n cn(\n \"polli-input-shell polli:flex polli:min-h-10 polli:w-full polli:cursor-pointer polli:items-center polli:gap-3 polli:rounded-lg polli:border polli:px-3 polli:py-2 polli:text-left polli:font-mono polli:text-xs polli:transition-colors\",\n copied\n ? \"polli:text-intent-success-text\"\n : \"polli:text-theme-text-base polli:hover:text-theme-text-strong\",\n className,\n )\n }\n >\n {(copied) => (\n <>\n <span className=\"polli:min-w-0 polli:flex-1 polli:select-all polli:break-all\">\n {copied\n ? \"Copied\"\n : (display ??\n (typeof value === \"string\" ? value : label))}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"polli:flex polli:size-4 polli:shrink-0 polli:[&>svg]:size-full\"\n >\n {copied ? <CheckIcon /> : <ClipboardIcon />}\n </span>\n </>\n )}\n </CopyButton>\n );\n}\n","import { createListCollection } from \"@ark-ui/react/collection\";\nimport { Combobox } from \"@ark-ui/react/combobox\";\nimport {\n type ComponentPropsWithoutRef,\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Input, type InputProps } from \"../primitives/Input.tsx\";\nimport { ScrollArea } from \"../primitives/ScrollArea.tsx\";\n\nexport type EditableComboboxProps = Omit<InputProps, \"onChange\" | \"value\"> & {\n value: string;\n options: string[];\n onChange: (value: string) => void;\n emptyMessage?: string;\n align?: \"start\" | \"end\";\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Controlled filter inputs can keep incomplete selections open. */\n closeOnSelect?: boolean;\n /**\n * Content rendered inside the input shell before the text field. Enables\n * the wrapped shell layout and replaces the standalone chevron trigger.\n */\n startContent?: ReactNode;\n /** Optional class for the suggestions panel. */\n contentClassName?: string;\n};\n\nexport type EditableComboboxTokenProps = Omit<\n ComponentPropsWithoutRef<\"button\">,\n \"children\" | \"type\"\n> & {\n label: string;\n value: string;\n highlighted?: boolean;\n};\n\n/** Interactive filter token intended for an EditableCombobox startContent slot. */\nexport function EditableComboboxToken({\n label,\n value,\n highlighted = false,\n className,\n ...buttonProps\n}: EditableComboboxTokenProps) {\n return (\n <button\n type=\"button\"\n data-highlighted={highlighted ? \"\" : undefined}\n className={cn(\n \"polli-control polli:flex polli:h-7 polli:max-w-full polli:shrink-0 polli:items-center polli:gap-1 polli:rounded polli:px-1.5 polli:text-xs polli:transition-colors polli:hover:bg-theme-bg-hover polli:data-[highlighted]:bg-theme-bg-active\",\n className,\n )}\n {...buttonProps}\n >\n <span className=\"polli:text-theme-text-muted\">{label}:</span>\n <span className=\"polli:truncate polli:text-theme-text-base\">\n {value}\n </span>\n <ChevronIcon className=\"polli:h-3 polli:w-3 polli:text-theme-text-muted\" />\n </button>\n );\n}\n\nexport function EditableCombobox({\n value,\n options,\n onChange,\n emptyMessage = \"No options match.\",\n align = \"start\",\n open,\n onOpenChange,\n closeOnSelect,\n startContent,\n contentClassName,\n className,\n disabled,\n name,\n placeholder,\n required,\n ...inputProps\n}: EditableComboboxProps) {\n const visibleOptions = useMemo(() => {\n const query = value.trim().toLowerCase();\n return query === \"\"\n ? options\n : options.filter((option) => option.toLowerCase().includes(query));\n }, [options, value]);\n const collection = useMemo(\n () =>\n createListCollection({\n items: visibleOptions,\n itemToString: (item) => item,\n itemToValue: (item) => item,\n }),\n [visibleOptions],\n );\n const hasOptions = options.length > 0;\n const hasStartContent = Boolean(startContent);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Zag renders the field with defaultValue. Keep its DOM value aligned when\n // a controlled value projects an input event back to the same string.\n useEffect(() => {\n if (inputRef.current && inputRef.current.value !== value) {\n inputRef.current.value = value;\n }\n });\n\n return (\n <Combobox.Root\n collection={collection}\n inputValue={value}\n value={[]}\n allowCustomValue\n openOnClick={hasOptions}\n openOnChange={() => hasOptions}\n open={open}\n closeOnSelect={closeOnSelect}\n disabled={disabled}\n name={name}\n required={required}\n positioning={{\n placement: align === \"end\" ? \"bottom-end\" : \"bottom-start\",\n sameWidth: true,\n strategy: \"fixed\",\n }}\n onInputValueChange={(details) => onChange(details.inputValue)}\n onOpenChange={(details) => onOpenChange?.(details.open)}\n >\n <Combobox.Control\n className={cn(\n \"polli:relative polli:w-full\",\n hasStartContent &&\n \"polli-input-shell polli:flex polli:min-h-10 polli:flex-wrap polli:items-center polli:gap-2 polli:border polli:rounded-lg polli:px-2 polli:py-1\",\n )}\n >\n {startContent}\n <Combobox.Input asChild>\n <Input\n ref={inputRef}\n {...inputProps}\n name={name}\n placeholder={placeholder}\n className={cn(\n hasStartContent\n ? \"polli:min-w-28 polli:flex-1 polli:px-1 polli:py-1\"\n : \"polli:w-full polli:pr-10\",\n className,\n )}\n />\n </Combobox.Input>\n {hasOptions && !hasStartContent && (\n <Combobox.Trigger\n aria-label=\"Show options\"\n className=\"polli-control polli:absolute polli:right-0 polli:top-0 polli:flex polli:h-full polli:w-10 polli:cursor-pointer polli:items-center polli:justify-center polli:rounded-r-lg polli:text-theme-text-muted polli:hover:text-theme-text-strong\"\n >\n <Combobox.Context>\n {(context) => (\n <ChevronIcon\n expanded={context.open}\n className=\"polli:h-4 polli:w-4 polli:transition-transform\"\n />\n )}\n </Combobox.Context>\n </Combobox.Trigger>\n )}\n </Combobox.Control>\n <Combobox.Positioner>\n <Combobox.Content\n className={cn(\n \"polli:z-[120] polli:overflow-hidden polli:rounded-lg polli:bg-surface-menu polli:p-1 polli:shadow-lg polli:focus:outline-none\",\n contentClassName,\n )}\n >\n <ScrollArea className=\"polli:max-h-64\">\n <Combobox.List className=\"polli:flex polli:flex-col\">\n {visibleOptions.map((option) => (\n <Combobox.Item\n key={option}\n item={option}\n className={cn(\n \"polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:rounded-lg polli:bg-transparent polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:text-theme-text-base polli:transition-colors polli:hover:bg-theme-bg-hover polli:data-[highlighted]:bg-theme-bg-hover\",\n value === option &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n )}\n >\n <Combobox.ItemText className=\"polli:truncate polli:font-mono\">\n {option}\n </Combobox.ItemText>\n </Combobox.Item>\n ))}\n {visibleOptions.length === 0 && (\n <Combobox.Empty className=\"polli:m-0 polli:px-2 polli:py-2 polli:text-sm polli:text-theme-text-soft\">\n {emptyMessage}\n </Combobox.Empty>\n )}\n </Combobox.List>\n </ScrollArea>\n </Combobox.Content>\n </Combobox.Positioner>\n </Combobox.Root>\n );\n}\n","import { forwardRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type InputProps = React.ComponentPropsWithoutRef<\"input\"> & {\n error?: boolean;\n hideNumberSteppers?: boolean;\n};\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, error, hideNumberSteppers, ...props }, ref) => (\n <input\n ref={ref}\n data-error={error ? \"true\" : undefined}\n className={cn(\n \"polli-input polli:px-3 polli:py-2 polli:border polli:rounded-lg\",\n \"polli:font-body polli:text-base polli:font-normal polli:leading-6 polli:text-theme-text-strong\",\n \"polli:transition-colors\",\n \"polli:disabled:opacity-50 polli:disabled:cursor-not-allowed\",\n hideNumberSteppers && \"polli-input-number-clean\",\n className,\n )}\n {...props}\n />\n ),\n);\n","/** Relative URLs and same-origin absolute URLs stay in the current app. */\nexport function isExternalHref(\n href: unknown,\n origin = globalThis.location?.origin,\n): boolean {\n if (typeof href !== \"string\" || !/^(https?:)?\\/\\//i.test(href))\n return false;\n if (!origin) return true;\n try {\n return new URL(href, origin).origin !== origin;\n } catch {\n return false;\n }\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { isExternalHref } from \"../lib/link.ts\";\nimport {\n Button,\n type ButtonAppearance,\n type ButtonProps,\n} from \"../primitives/Button.tsx\";\nimport { ExternalLinkIcon } from \"../primitives/icons/index.tsx\";\n\ntype ExternalLinkButtonBaseProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n appearance?: ButtonAppearance;\n intent?: ButtonProps[\"intent\"];\n /** Set false for another Pollinations property that should behave as product navigation. */\n external?: boolean;\n showIcon?: boolean;\n /** Leading icon, rendered before the label. */\n icon?: ReactNode;\n className?: string;\n children: ReactNode;\n};\n\ntype ExternalLinkButtonAnchorProps = ExternalLinkButtonBaseProps & {\n href: string;\n} & Omit<ComponentPropsWithoutRef<\"a\">, \"children\" | \"className\" | \"href\">;\n\ntype ExternalLinkButtonNativeButtonProps = ExternalLinkButtonBaseProps &\n Omit<ComponentPropsWithoutRef<\"button\">, \"children\" | \"className\">;\n\nexport type ExternalLinkButtonProps =\n | ExternalLinkButtonAnchorProps\n | ExternalLinkButtonNativeButtonProps;\n\n/** Primary flow actions such as checkout or authorization. Use InlineLink for navigation. */\nexport function ExternalLinkButton(props: ExternalLinkButtonProps) {\n const {\n size = \"md\",\n appearance,\n external = \"href\" in props ? isExternalHref(props.href) : true,\n showIcon = true,\n icon,\n className,\n children,\n } = props;\n const content = (\n <>\n {icon}\n <span>{children}</span>\n {external && showIcon ? (\n <ExternalLinkIcon\n className=\"polli:h-4 polli:w-4 polli:shrink-0 polli:opacity-60\"\n aria-hidden=\"true\"\n />\n ) : null}\n </>\n );\n\n if (\"href\" in props) {\n const {\n href,\n target = external ? \"_blank\" : undefined,\n rel = target === \"_blank\" ? \"noopener noreferrer\" : undefined,\n size: _size,\n appearance: _appearance,\n external: _external,\n showIcon: _showIcon,\n icon: _icon,\n className: _className,\n children: _children,\n ...anchorProps\n } = props;\n\n return (\n <Button\n as=\"a\"\n href={href}\n target={target}\n rel={rel}\n size={size}\n appearance={appearance}\n className={cn(\"polli:gap-2\", className)}\n {...anchorProps}\n >\n {content}\n </Button>\n );\n }\n\n const {\n type = \"button\",\n size: _size,\n appearance: _appearance,\n external: _external,\n showIcon: _showIcon,\n icon: _icon,\n className: _className,\n children: _children,\n ...buttonProps\n } = props;\n\n return (\n <Button\n as=\"button\"\n type={type}\n size={size}\n appearance={appearance}\n className={cn(\"polli:gap-2\", className)}\n {...buttonProps}\n >\n {content}\n </Button>\n );\n}\n","export { Field } from \"@ark-ui/react/field\";\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Field } from \"../primitives/Field.tsx\";\n\nexport type FieldStackProps = {\n /** Omit for a self-describing control; label the input itself. */\n label?: ReactNode;\n children: ReactNode;\n helper?: ReactNode;\n action?: ReactNode;\n error?: ReactNode;\n alignLabelRow?: boolean;\n className?: string;\n labelClassName?: string;\n helperClassName?: string;\n errorClassName?: string;\n};\n\nexport function FieldStack({\n label,\n children,\n helper,\n action,\n error,\n alignLabelRow = false,\n className,\n labelClassName,\n helperClassName,\n errorClassName,\n}: FieldStackProps) {\n return (\n <Field.Root\n className={cn(\n \"polli:flex polli:flex-col polli:gap-2 polli:font-body\",\n className,\n )}\n invalid={Boolean(error)}\n >\n {(label || action) && (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:justify-between polli:gap-2\",\n alignLabelRow && \"polli:min-h-8\",\n )}\n >\n {label && (\n <Field.Label\n className={cn(\n \"polli:text-sm polli:font-semibold polli:leading-5 polli:text-theme-text-strong\",\n labelClassName,\n )}\n >\n {label}\n </Field.Label>\n )}\n {action}\n </div>\n )}\n {children}\n {error ? (\n <Field.ErrorText\n className={cn(\n \"polli:text-xs polli:font-medium polli:leading-5 polli:text-intent-danger-text\",\n errorClassName,\n )}\n >\n {error}\n </Field.ErrorText>\n ) : helper ? (\n <Field.HelperText\n className={cn(\n \"polli:text-xs polli:font-normal polli:leading-normal polli:text-theme-text-muted\",\n helperClassName,\n )}\n >\n {helper}\n </Field.HelperText>\n ) : null}\n </Field.Root>\n );\n}\n","import {\n type ChangeEvent,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { acquireDocumentFileDropGuard } from \"../lib/document-file-drop-guard.ts\";\nimport { partitionFiles, type RejectedFile } from \"../lib/partition-files.ts\";\nimport { IconButton } from \"../primitives/IconButton.tsx\";\nimport { ImageIcon, PlusIcon, XIcon } from \"../primitives/icons/index.tsx\";\n\nconst PREVIEWABLE_IMAGE_TYPES = new Set([\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n]);\nconst PREVIEW_SIZE = 64;\nconst LARGE_PREVIEW_SIZE = 112;\n\nconst previewSizeClasses = {\n sm: \"polli:h-16 polli:w-16\",\n lg: \"polli:h-28 polli:w-28\",\n} as const;\n\nfunction isPreviewableImage(file: File): boolean {\n return PREVIEWABLE_IMAGE_TYPES.has(file.type);\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction attachmentSummary(files: File[]): string {\n const kinds = new Set(\n files.map((file) => file.type.split(\"/\")[0]).filter(Boolean),\n );\n if (kinds.size !== 1) return `${files.length} files attached`;\n const [kind] = kinds;\n return `${files.length} ${kind}${files.length === 1 ? \"\" : \"s\"} attached`;\n}\n\nfunction PreviewPlaceholder({\n icon,\n size,\n}: {\n icon: ReactNode;\n size: \"sm\" | \"lg\";\n}) {\n return (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:justify-center polli:rounded-xl polli:bg-theme-bg-active polli:text-theme-text-soft\",\n previewSizeClasses[size],\n )}\n >\n {icon}\n </div>\n );\n}\n\nfunction FilePreview({\n file,\n placeholderIcon,\n size = \"sm\",\n}: {\n file: File;\n placeholderIcon: ReactNode;\n size?: \"sm\" | \"lg\";\n}) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [canPreview, setCanPreview] = useState(() =>\n isPreviewableImage(file),\n );\n const previewSize = size === \"lg\" ? LARGE_PREVIEW_SIZE : PREVIEW_SIZE;\n\n useEffect(() => {\n if (!isPreviewableImage(file)) {\n setCanPreview(false);\n return;\n }\n\n let cancelled = false;\n setCanPreview(true);\n\n async function drawPreview() {\n try {\n const bitmap = await createImageBitmap(file);\n if (cancelled) {\n bitmap.close();\n return;\n }\n\n const canvas = canvasRef.current;\n const context = canvas?.getContext(\"2d\");\n if (!canvas || !context) {\n bitmap.close();\n setCanPreview(false);\n return;\n }\n\n canvas.width = previewSize;\n canvas.height = previewSize;\n\n const scale = Math.max(\n previewSize / bitmap.width,\n previewSize / bitmap.height,\n );\n const width = bitmap.width * scale;\n const height = bitmap.height * scale;\n const x = (previewSize - width) / 2;\n const y = (previewSize - height) / 2;\n\n context.clearRect(0, 0, previewSize, previewSize);\n context.drawImage(bitmap, x, y, width, height);\n bitmap.close();\n } catch {\n if (!cancelled) setCanPreview(false);\n }\n }\n\n void drawPreview();\n\n return () => {\n cancelled = true;\n };\n }, [file, previewSize]);\n\n if (!canPreview) {\n return <PreviewPlaceholder icon={placeholderIcon} size={size} />;\n }\n\n return (\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={file.name}\n className={cn(\"polli:rounded-xl\", previewSizeClasses[size])}\n width={previewSize}\n height={previewSize}\n />\n );\n}\n\nexport type FileUploadProps = {\n value: File[];\n onChange: (files: File[]) => void;\n onReject?: (rejected: RejectedFile[]) => void;\n maxFiles?: number;\n maxSizeBytes?: number;\n accept?: string;\n icon?: ReactNode;\n label?: ReactNode;\n previewIcon?: ReactNode;\n /** Compact drop zone, or preview-only strip for a parent drop target. */\n variant?: \"default\" | \"compact\" | \"inline\";\n /** Fully locks the field: no add, no remove, drops ignored. */\n disabled?: boolean;\n className?: string;\n};\n\nexport function FileUpload({\n value,\n onChange,\n onReject,\n maxFiles = 4,\n maxSizeBytes = 10 * 1024 * 1024,\n accept = \"image/*\",\n icon = <ImageIcon className=\"polli:h-6 polli:w-6\" />,\n label = (\n <>\n Drag images here or <span className=\"polli:underline\">browse</span>\n </>\n ),\n previewIcon = <ImageIcon className=\"polli:h-5 polli:w-5\" />,\n variant = \"default\",\n disabled = false,\n className,\n}: FileUploadProps) {\n // A near-miss file drop should not navigate the browser away from the app.\n // Mounted upload controls share one document-level guard.\n useEffect(() => acquireDocumentFileDropGuard(document), []);\n\n // Only `disabled` blocks drop handling. At the file limit the browse/add\n // controls disappear, but over-limit drops still flow through partitionFiles\n // and are reported as `{ reason: \"count\" }` via onReject.\n function addFiles(incoming: File[]) {\n if (disabled || incoming.length === 0) return;\n const { accepted, rejected } = partitionFiles(incoming, value, {\n maxFiles,\n maxSizeBytes,\n accept,\n });\n if (accepted.length > 0) onChange([...value, ...accepted]);\n if (rejected.length > 0) onReject?.(rejected);\n }\n\n const hasFiles = value.length > 0;\n const canAdd = !disabled && value.length < maxFiles;\n const isSingleFile = maxFiles === 1;\n const compact = variant !== \"default\";\n const inline = variant === \"inline\";\n const previewSize = compact ? \"sm\" : isSingleFile ? \"lg\" : \"sm\";\n const inputId = useId();\n const addInputId = `${inputId}-add`;\n\n function handleInputChange(event: ChangeEvent<HTMLInputElement>) {\n addFiles(Array.from(event.target.files ?? []));\n event.target.value = \"\";\n }\n\n if (inline && !hasFiles) return null;\n\n return (\n <div className={cn(\"polli:flex polli:flex-col polli:gap-2\", className)}>\n <fieldset\n disabled={disabled}\n className={cn(\n \"polli:m-0\",\n !inline &&\n \"polli:rounded-xl polli:border polli:border-dashed polli:border-theme-border polli:bg-theme-bg-pale\",\n \"polli:text-sm\",\n inline\n ? \"polli:border-0 polli:bg-transparent polli:p-0 polli:text-left\"\n : compact\n ? \"polli:min-h-16 polli:px-3 polli:py-2 polli:text-left\"\n : \"polli:px-4 polli:py-4 polli:text-center\",\n \"polli:text-theme-text-soft polli:transition-colors\",\n disabled\n ? \"polli:opacity-50\"\n : \"polli:hover:bg-theme-bg-hover\",\n )}\n // Always prevent the browser's default file-drop navigation,\n // even when disabled; only the file handling is gated.\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault();\n if (disabled) return;\n addFiles(Array.from(e.dataTransfer.files));\n }}\n >\n {!hasFiles ? (\n <label\n htmlFor={inputId}\n className={cn(\n \"polli-control polli:flex polli:items-center polli:gap-2 polli:rounded-lg\",\n compact\n ? \"polli:min-h-12 polli:flex-row polli:justify-start\"\n : \"polli:min-h-32 polli:flex-col polli:justify-center\",\n canAdd\n ? \"polli:cursor-pointer\"\n : \"polli:cursor-not-allowed\",\n )}\n >\n {icon}\n <span>{label}</span>\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={maxFiles > 1}\n disabled={disabled || !canAdd}\n className=\"polli:sr-only\"\n onChange={handleInputChange}\n />\n </label>\n ) : (\n <div\n className={cn(\n \"polli:flex polli:gap-3\",\n compact ? \"polli:items-center\" : \"polli:flex-col\",\n )}\n >\n {compact && !inline && (\n <span className=\"polli:text-xs polli:font-medium polli:text-theme-text-muted\">\n {attachmentSummary(value)}\n </span>\n )}\n <ul\n className={cn(\n \"polli:m-0 polli:gap-3 polli:p-0\",\n compact\n ? cn(\n \"polli:flex polli:min-w-0 polli:flex-1 polli:flex-wrap\",\n inline\n ? \"polli:justify-start\"\n : \"polli:ml-auto polli:justify-end\",\n )\n : \"polli:grid polli:grid-cols-[repeat(auto-fill,minmax(5rem,1fr))]\",\n isSingleFile &&\n !compact &&\n \"polli:flex polli:justify-center\",\n )}\n >\n {value.map((file, index) => (\n <li\n key={`${file.name}-${index}`}\n className={cn(\n \"polli:relative polli:flex polli:min-w-0 polli:list-none polli:flex-col polli:items-center polli:gap-1\",\n isSingleFile && \"polli:max-w-full\",\n )}\n >\n <FilePreview\n file={file}\n placeholderIcon={previewIcon}\n size={previewSize}\n />\n {!compact && (\n <>\n <span\n className={cn(\n \"polli:max-w-full polli:truncate polli:text-xs polli:font-medium polli:text-theme-text-base\",\n isSingleFile\n ? \"polli:w-36\"\n : \"polli:w-16\",\n )}\n >\n {file.name}\n </span>\n <span className=\"polli:text-micro polli:text-theme-text-muted\">\n {formatFileSize(file.size)}\n </span>\n </>\n )}\n {!disabled && (\n <div className=\"polli:absolute polli:-top-2 polli:right-1\">\n <IconButton\n intent=\"danger\"\n title={`Remove ${file.name}`}\n onClick={() =>\n onChange(\n value.filter(\n (_, i) =>\n i !== index,\n ),\n )\n }\n >\n <XIcon className=\"polli:h-3 polli:w-3\" />\n </IconButton>\n </div>\n )}\n </li>\n ))}\n\n {!inline && !isSingleFile && canAdd && (\n <li className=\"polli:flex polli:list-none\">\n <label\n htmlFor={addInputId}\n className={cn(\n \"polli-control polli:flex polli:cursor-pointer polli:flex-col polli:items-center polli:justify-center polli:gap-1 polli:rounded-lg polli:bg-theme-bg-active polli:text-theme-text-soft polli:transition-colors polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-strong\",\n compact\n ? \"polli:h-16 polli:w-16 polli:px-2 polli:py-1\"\n : \"polli:min-h-20 polli:w-full polli:px-3 polli:py-2\",\n )}\n >\n <PlusIcon className=\"polli:h-5 polli:w-5\" />\n {!compact && (\n <span className=\"polli:text-xs polli:font-medium\">\n Add\n </span>\n )}\n <input\n id={addInputId}\n type=\"file\"\n aria-label=\"Add files\"\n accept={accept}\n multiple\n disabled={disabled || !canAdd}\n className=\"polli:sr-only\"\n onChange={handleInputChange}\n />\n </label>\n </li>\n )}\n </ul>\n\n {Number.isFinite(maxFiles) &&\n maxFiles > 1 &&\n !compact && (\n <span className=\"polli:text-xs polli:text-theme-text-muted\">\n {value.length} / {maxFiles} files\n </span>\n )}\n </div>\n )}\n </fieldset>\n </div>\n );\n}\n","type GuardState = {\n consumers: number;\n preventFileNavigation: EventListener;\n};\n\nconst guards = new WeakMap<Document, GuardState>();\n\n/**\n * Prevents the browser from navigating to a dropped file while at least one\n * upload control is mounted. One listener pair is shared per document.\n */\nexport function acquireDocumentFileDropGuard(document: Document): () => void {\n let guard = guards.get(document);\n\n if (!guard) {\n const preventFileNavigation: EventListener = (event) => {\n const types = (event as DragEvent).dataTransfer?.types;\n if (types?.includes(\"Files\")) event.preventDefault();\n };\n\n guard = { consumers: 0, preventFileNavigation };\n guards.set(document, guard);\n document.addEventListener(\"dragover\", preventFileNavigation);\n document.addEventListener(\"drop\", preventFileNavigation);\n }\n\n guard.consumers += 1;\n let released = false;\n\n return () => {\n if (released) return;\n released = true;\n guard.consumers -= 1;\n\n if (guard.consumers > 0) return;\n document.removeEventListener(\"dragover\", guard.preventFileNavigation);\n document.removeEventListener(\"drop\", guard.preventFileNavigation);\n guards.delete(document);\n };\n}\n","export type RejectReason = \"type\" | \"size\" | \"count\";\n\nexport type RejectedFile = { file: File; reason: RejectReason };\n\nexport type PartitionOptions = {\n maxFiles: number;\n maxSizeBytes: number;\n /** Comma-separated list: mime (\"image/png\"), wildcard (\"image/*\"), or extension (\".webp\"). */\n accept?: string;\n};\n\nexport type PartitionResult = {\n accepted: File[];\n rejected: RejectedFile[];\n};\n\nfunction matchesAccept(file: File, accept: string | undefined): boolean {\n if (!accept) return true;\n const tokens = accept\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n if (tokens.length === 0) return true;\n return tokens.some((token) => {\n if (token.startsWith(\".\")) {\n return file.name.toLowerCase().endsWith(token.toLowerCase());\n }\n if (token.endsWith(\"/*\")) {\n const prefix = token.slice(0, token.length - 1); // \"image/\"\n return file.type.startsWith(prefix);\n }\n return file.type === token;\n });\n}\n\n/**\n * Partition `incoming` files against the already-selected `current` files.\n * Deterministic: order preserved; every rejection carries a reason.\n * The count limit counts `current.length` against `maxFiles`.\n */\nexport function partitionFiles(\n incoming: File[],\n current: File[],\n { maxFiles, maxSizeBytes, accept }: PartitionOptions,\n): PartitionResult {\n const accepted: File[] = [];\n const rejected: RejectedFile[] = [];\n let slots = Math.max(0, maxFiles - current.length);\n\n for (const file of incoming) {\n if (!matchesAccept(file, accept)) {\n rejected.push({ file, reason: \"type\" });\n } else if (file.size > maxSizeBytes) {\n rejected.push({ file, reason: \"size\" });\n } else if (slots <= 0) {\n rejected.push({ file, reason: \"count\" });\n } else {\n accepted.push(file);\n slots -= 1;\n }\n }\n\n return { accepted, rejected };\n}\n","import { type ButtonHTMLAttributes, forwardRef, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Tooltip } from \"./Tooltip.tsx\";\n\n/** `danger` (delete, red) and `info` (edit/links, blue). */\nexport type IconButtonIntent = \"danger\" | \"info\";\nexport type IconButtonVariant = \"tile\" | \"ghost\";\n\nconst intentClasses: Record<IconButtonIntent, string> = {\n danger: \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n info: \"polli:bg-intent-info-bg-light polli:text-intent-info-text\",\n};\n\nconst intentHoverClasses: Record<IconButtonIntent, string> = {\n danger: \"polli:hover:bg-intent-danger-bg-hover\",\n info: \"polli:hover:bg-intent-info-bg-hover\",\n};\n\nconst variantClasses: Record<IconButtonVariant, string> = {\n tile: \"polli:bg-theme-bg-active polli:text-theme-text-soft\",\n ghost: \"polli:bg-transparent polli:text-theme-text-muted\",\n};\n\nconst variantHoverClasses: Record<IconButtonVariant, string> = {\n tile: \"polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n ghost: \"polli:hover:bg-transparent polli:hover:text-theme-text-soft\",\n};\n\nexport type IconButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"className\" | \"title\"\n> & {\n intent?: IconButtonIntent;\n variant?: IconButtonVariant;\n pressed?: boolean;\n title?: string;\n tooltip?: ReactNode;\n tooltipAlign?: \"start\" | \"center\";\n tooltipClampToViewport?: boolean;\n children: ReactNode;\n className?: string;\n size?: \"sm\" | \"md\";\n};\n\nconst sizeClasses = {\n sm: \"polli:h-6 polli:w-6 polli:rounded\",\n md: \"polli:h-9 polli:w-9 polli:rounded-full\",\n} as const;\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n {\n intent,\n variant = \"tile\",\n pressed,\n title,\n tooltip,\n tooltipAlign,\n tooltipClampToViewport,\n children,\n className,\n size = \"sm\",\n disabled = false,\n ...buttonProps\n },\n ref,\n ) => {\n const button = (\n <button\n {...buttonProps}\n ref={ref}\n type=\"button\"\n disabled={disabled}\n aria-label={buttonProps[\"aria-label\"] ?? title}\n aria-pressed={pressed}\n data-intent={intent}\n className={cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:transition-colors\",\n disabled\n ? \"polli:cursor-not-allowed polli:opacity-50\"\n : \"polli:cursor-pointer\",\n sizeClasses[size],\n intent ? intentClasses[intent] : variantClasses[variant],\n !disabled &&\n (intent\n ? intentHoverClasses[intent]\n : variantHoverClasses[variant]),\n className,\n )}\n >\n {children}\n </button>\n );\n\n const tooltipContent = tooltip ?? title;\n if (!tooltipContent) return button;\n\n return (\n <Tooltip\n triggerAs=\"span\"\n content={tooltipContent}\n align={tooltipAlign}\n clampToViewport={tooltipClampToViewport}\n tapEnabled={false}\n className={\n disabled\n ? \"polli:cursor-not-allowed\"\n : \"polli:cursor-pointer\"\n }\n >\n {button}\n </Tooltip>\n );\n },\n);\n\nIconButton.displayName = \"IconButton\";\n","import type { FC, ReactNode } from \"react\";\nimport { Tooltip } from \"../primitives/Tooltip.tsx\";\n\ntype InfoTipProps = {\n text?: ReactNode;\n content?: ReactNode;\n label?: string;\n};\n\n/**\n * Small \"i\" badge that opens a tooltip on hover, click, or focus.\n *\n * Quiet neutral badge and shared, viewport-clamped tooltip popup.\n * The help cursor indicates that more information is available.\n */\nexport const InfoTip: FC<InfoTipProps> = ({\n text,\n content,\n label = \"More info\",\n}) => (\n // displayContents drops the inline wrapper so the badge centres on its row\n // instead of sitting on the text baseline.\n <Tooltip\n content={content ?? text}\n ariaLabel={label}\n className=\"polli:ml-1\"\n displayContents\n >\n <span className=\"polli:inline-flex polli:h-4 polli:w-4 polli:items-center polli:justify-center polli:rounded-full polli:bg-surface-menu polli:font-bold polli:text-[10px] polli:leading-none polli:text-theme-text-muted polli:transition-colors polli:hover:text-theme-text-strong\">\n i\n </span>\n </Tooltip>\n);\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\n/** Semantic chip labels for status and metadata badges. */\ntype ChipIntent =\n | \"news\"\n | \"new\"\n | \"free\"\n | \"alpha\"\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"info\"\n | \"danger\";\n\nconst chipSizes = {\n icon: \"polli:h-5 polli:w-5 polli:p-0 polli:text-xs\",\n sm: \"polli:h-5 polli:px-2 polli:text-xs\",\n md: \"polli:h-6 polli:px-2.5 polli:text-sm\",\n lg: \"polli:h-7 polli:px-3 polli:text-sm\",\n} as const;\n\nconst intentClasses: Record<ChipIntent, string> = {\n news: \"polli:bg-intent-news-bg-light polli:text-intent-news-text\",\n new: \"polli:bg-intent-new-bg-light polli:text-intent-new-text\",\n free: \"polli:bg-intent-free-bg-light polli:text-intent-free-text\",\n alpha: \"polli:bg-intent-alpha-bg-light polli:text-intent-alpha-text\",\n neutral: \"polli:bg-ink-100/80 polli:text-ink-900\",\n success:\n \"polli:bg-intent-success-bg-bright/15 polli:text-intent-success-text\",\n warning: \"polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n info: \"polli:bg-intent-info-bg-light polli:text-intent-info-text\",\n danger: \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type ChipProps = ComponentPropsWithoutRef<\"span\"> & {\n /** Semantic intent. */\n intent?: ChipIntent;\n size?: keyof typeof chipSizes;\n};\n\n// Static, rectangular colored container. Round shapes are reserved for buttons.\n// Reads `bg-theme-bg-active` / `text-theme-text-strong` from the cascade unless\n// `intent` is set (semantic, theme-independent).\nexport const Chip: FC<ChipProps> = ({\n intent,\n size = \"md\",\n className,\n children,\n ...rest\n}) => {\n const intentClass = intent\n ? intentClasses[intent]\n : \"polli:bg-theme-bg-active polli:text-theme-text-strong\";\n return (\n <span\n {...rest}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:justify-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-none\",\n chipSizes[size],\n intentClass,\n className,\n )}\n >\n {children}\n </span>\n );\n};\n","import { cn } from \"../lib/cn.ts\";\nimport { Chip } from \"../primitives/Chip.tsx\";\nimport { CheckIcon, ClipboardIcon } from \"../primitives/icons/index.tsx\";\nimport { CopyButton } from \"./CopyButton.tsx\";\n\nexport type KeyChipProps = {\n /** The visible start of the key, e.g. \"sk_0ysBCkH\". */\n prefix: string;\n /** The full key, when known: the chip then copies it on click. */\n value?: string | null;\n /** Accessible name for the copy action. */\n label?: string;\n className?: string;\n};\n\nconst chipClassName =\n \"polli:gap-1.5 polli:font-mono polli:font-normal polli:[&>svg]:size-3.5 polli:[&>svg]:shrink-0\";\n\n/**\n * One badge for every key: prefix and ellipsis, nothing else. A secret key\n * only ever shows its prefix; a key whose value is known copies on click and\n * carries the clipboard icon.\n */\nexport function KeyChip({\n prefix,\n value,\n label = \"Copy key\",\n className,\n}: KeyChipProps) {\n const text = `${prefix}…`;\n if (!value) {\n return (\n <Chip intent=\"neutral\" className={cn(chipClassName, className)}>\n {text}\n </Chip>\n );\n }\n return (\n <CopyButton\n value={value}\n tooltip={null}\n aria-label={label}\n className=\"polli:inline-flex polli:cursor-pointer polli:rounded-lg\"\n >\n {(copied) => (\n <Chip\n intent={copied ? \"success\" : \"neutral\"}\n className={cn(\n chipClassName,\n \"polli:transition-colors\",\n className,\n )}\n >\n {copied ? (\n <CheckIcon aria-hidden=\"true\" />\n ) : (\n <ClipboardIcon aria-hidden=\"true\" />\n )}\n {copied ? \"Copied\" : text}\n </Chip>\n )}\n </CopyButton>\n );\n}\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { isExternalHref } from \"../lib/link.ts\";\nimport { ExternalLinkIcon } from \"../primitives/icons/index.tsx\";\nimport { Surface } from \"../primitives/Surface.tsx\";\n\ntype BaseLinkCardProps = {\n external?: boolean;\n showIcon?: boolean;\n className?: string;\n surfaceClassName?: string;\n};\n\nexport type LinkCardProps<T extends React.ElementType = \"a\"> =\n PropsWithChildren<BaseLinkCardProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseLinkCardProps | \"as\">;\n\nexport function LinkCard<T extends React.ElementType = \"a\">({\n as,\n external,\n showIcon = true,\n className,\n surfaceClassName,\n children,\n ...linkProps\n}: LinkCardProps<T>) {\n const Component: React.ElementType = as || \"a\";\n const isExternal =\n external ?? isExternalHref((linkProps as { href?: unknown }).href);\n\n return (\n <Surface\n as={Component}\n variant=\"card\"\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n {...linkProps}\n className={cn(\n \"polli:relative polli:flex polli:h-full polli:flex-col polli:gap-2 polli:bg-surface-opaque/80 polli:p-5 polli:outline-none\",\n showIcon && isExternal && \"polli:pr-10\",\n \"polli:transition-colors polli:hover:bg-surface-opaque/95\",\n \"polli:focus-visible:ring-2 polli:focus-visible:ring-theme-border\",\n className,\n surfaceClassName,\n )}\n >\n {showIcon && isExternal && (\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli:absolute polli:top-4 polli:right-4 polli:h-3.5 polli:w-3.5 polli:text-theme-text-soft\"\n />\n )}\n {children}\n </Surface>\n );\n}\n","import type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\nexport type MediaPlaceholderProps = ComponentPropsWithoutRef<\"div\"> & {\n icon?: ReactNode;\n label?: ReactNode;\n detail?: ReactNode;\n};\n\nexport const MediaPlaceholder: FC<MediaPlaceholderProps> = ({\n icon,\n label,\n detail,\n children,\n className,\n ...rest\n}) => (\n <div\n {...rest}\n className={cn(\n \"polli:flex polli:aspect-video polli:min-h-40 polli:flex-col polli:items-center polli:justify-center polli:gap-3 polli:rounded-lg polli:border polli:border-dashed polli:border-theme-border polli:bg-theme-bg-pale polli:p-6 polli:text-center\",\n className,\n )}\n >\n {icon && (\n <div className=\"polli:flex polli:h-10 polli:w-10 polli:items-center polli:justify-center polli:rounded-full polli:bg-theme-bg-active polli:text-theme-text-base\">\n {icon}\n </div>\n )}\n {(label || detail) && (\n <div className=\"polli:max-w-sm\">\n {label && (\n <Text as=\"p\" size=\"sm\" tone=\"strong\" weight=\"semibold\">\n {label}\n </Text>\n )}\n {detail && (\n <Text as=\"p\" size=\"sm\" tone=\"soft\" className=\"polli:mt-1\">\n {detail}\n </Text>\n )}\n </div>\n )}\n {children}\n </div>\n);\n","import type { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Dropdown } from \"../primitives/Dropdown.tsx\";\nimport { ScrollArea } from \"../primitives/ScrollArea.tsx\";\nimport { Tooltip } from \"../primitives/Tooltip.tsx\";\n\nexport type MultiSelectOption = {\n value: string;\n label: string;\n};\n\nexport type MultiSelectProps = {\n options: MultiSelectOption[];\n selected: string[];\n onChange: (selected: string[]) => void;\n placeholder: string;\n disabled?: boolean;\n disabledText?: string;\n disabledTooltip?: string;\n align?: \"start\" | \"end\";\n label?: string;\n /** Accessible name when the visible label is supplied by the caller. */\n ariaLabel?: string;\n /** Fill the available width, allowing the trigger label to truncate. */\n fullWidth?: boolean;\n};\n\nconst TRIGGER_BASE =\n \"polli-control polli:inline-flex polli:min-h-8 polli:min-w-[140px] polli:items-center polli:gap-2 polli:rounded-full polli:px-3 polli:py-1.5 polli:text-xs polli:font-medium polli:transition-all polli:duration-200\";\n\nconst ROW_BASE =\n \"polli-control polli:flex polli:w-full polli:items-center polli:gap-3 polli:px-3 polli:py-2 polli:text-left polli:text-xs polli:transition-colors\";\n\nconst CHECK_BASE =\n \"polli:flex polli:h-4 polli:w-4 polli:flex-shrink-0 polli:items-center polli:justify-center polli:rounded polli:border polli:border-theme-border polli:text-xs\";\n\nexport const MultiSelect: FC<MultiSelectProps> = ({\n options,\n selected,\n onChange,\n placeholder,\n disabled,\n disabledText,\n disabledTooltip,\n align = \"start\",\n label,\n ariaLabel,\n fullWidth = false,\n}) => {\n const isAllSelected = selected.length === 0;\n\n const toggleItem = (itemId: string) => {\n if (selected.includes(itemId)) {\n onChange(selected.filter((m) => m !== itemId));\n } else {\n onChange([...selected, itemId]);\n }\n };\n\n const selectAll = () => onChange([]);\n\n const displayText = disabled\n ? disabledText\n : isAllSelected\n ? placeholder\n : selected.length === 1\n ? (options.find((option) => option.value === selected[0])?.label ??\n \"1 selected\")\n : `${selected.length} selected`;\n\n const labelNode = label ? (\n <span className=\"polli:text-xs polli:font-medium polli:text-theme-text-soft\">\n {label}\n </span>\n ) : null;\n\n if (disabled) {\n return (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:gap-2\",\n fullWidth && \"polli:w-full polli:min-w-0\",\n )}\n >\n {labelNode}\n <Tooltip\n triggerAs=\"span\"\n content={disabledTooltip || \"No items available\"}\n align=\"center\"\n className={cn(\n \"polli:inline-flex polli:cursor-not-allowed\",\n fullWidth && \"polli:min-w-0 polli:flex-1\",\n )}\n >\n <button\n type=\"button\"\n disabled\n aria-label={ariaLabel || label || placeholder}\n className={cn(\n TRIGGER_BASE,\n fullWidth && \"polli:w-full polli:min-w-0\",\n \"polli:cursor-not-allowed polli:bg-theme-bg-active polli:opacity-50\",\n )}\n >\n <span className=\"polli:flex-1 polli:truncate polli:text-left polli:text-theme-text-strong\">\n {displayText}\n </span>\n <ChevronIcon\n expanded={false}\n className=\"polli:h-3 polli:w-3 polli:text-theme-text-soft\"\n />\n </button>\n </Tooltip>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"polli:flex polli:items-center polli:gap-2\",\n fullWidth && \"polli:w-full polli:min-w-0\",\n )}\n >\n {labelNode}\n <Dropdown\n align={align}\n className=\"polli:w-[min(20rem,calc(100vw-2rem))]\"\n trigger={(open) => (\n <button\n type=\"button\"\n aria-label={ariaLabel || label || placeholder}\n className={cn(\n TRIGGER_BASE,\n fullWidth && \"polli:w-full polli:min-w-0\",\n open\n ? \"polli:bg-theme-bg-hover\"\n : \"polli:bg-theme-bg-active polli:hover:bg-theme-bg-hover\",\n )}\n >\n <span\n className={cn(\n \"polli:flex-1 polli:truncate polli:text-left\",\n open\n ? \"polli:text-theme-text-strong\"\n : \"polli:text-theme-text-base\",\n )}\n >\n {displayText}\n </span>\n <ChevronIcon\n expanded={open}\n className={cn(\n \"polli:h-3 polli:w-3 polli:transition-transform\",\n open\n ? \"polli:text-theme-text-strong\"\n : \"polli:text-theme-text-soft\",\n )}\n />\n </button>\n )}\n >\n <ScrollArea className=\"polli:max-h-64\">\n <button\n type=\"button\"\n onClick={selectAll}\n aria-pressed={isAllSelected}\n className={cn(\n ROW_BASE,\n isAllSelected\n ? \"polli:bg-theme-bg-active polli:font-medium polli:text-theme-text-strong\"\n : \"polli:text-theme-text-base polli:hover:bg-theme-bg-subtle\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n CHECK_BASE,\n isAllSelected &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n )}\n >\n {isAllSelected && \"✓\"}\n </span>\n {placeholder}\n </button>\n {options.map((opt) => {\n const isChecked = selected.includes(opt.value);\n return (\n <button\n type=\"button\"\n key={opt.value}\n onClick={() => toggleItem(opt.value)}\n aria-pressed={isChecked}\n className={cn(\n ROW_BASE,\n isChecked\n ? \"polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:text-theme-text-base polli:hover:bg-theme-bg-subtle\",\n )}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n CHECK_BASE,\n isChecked &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n )}\n >\n {isChecked && \"✓\"}\n </span>\n <span className=\"polli:min-w-0 polli:[overflow-wrap:anywhere]\">\n {opt.label}\n </span>\n </button>\n );\n })}\n </ScrollArea>\n </Dropdown>\n </div>\n );\n};\n","import type { ComponentType, PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype BaseNavItemProps = {\n /** Current/selected item — fills with the accent + sets `aria-current`. */\n active?: boolean;\n /** Optional leading icon. */\n icon?: ComponentType<{ className?: string }>;\n className?: string;\n};\n\n// Neutral/quiet when inactive; filled with the accent when active. The leading\n// icon is the section marker.\nconst base =\n \"polli-control polli:flex polli:items-center polli:gap-2 polli:rounded-full polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:whitespace-nowrap polli:transition-colors\";\nconst activeClasses = \"polli:bg-theme-bg-active polli:text-theme-text-strong\";\nconst inactiveClasses =\n \"polli:text-ink-800 polli:hover:bg-surface-opaque/60 polli:hover:text-ink-950\";\n\nexport type NavItemProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseNavItemProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseNavItemProps | \"as\">;\n\n/**\n * Minimal nav item — a pill that's neutral when inactive and filled with the\n * accent when active, with an optional leading icon. Polymorphic: `<NavItem>`\n * (button) for in-page nav, `<NavItem as={Link} active={…}>` for routed nav.\n * Shared by the enter dashboard rail and apps so both use one design.\n */\nexport function NavItem<T extends React.ElementType = \"button\">({\n as,\n active = false,\n icon: Icon,\n className,\n children,\n ...rest\n}: NavItemProps<T>) {\n const Component: React.ElementType = as || \"button\";\n return (\n <Component\n aria-current={active ? \"page\" : undefined}\n className={cn(\n base,\n active ? activeClasses : inactiveClasses,\n className,\n )}\n {...rest}\n >\n {Icon ? (\n <Icon className=\"polli:h-4 polli:w-4 polli:shrink-0\" />\n ) : null}\n {children}\n </Component>\n );\n}\n","import type { FC, ReactNode } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport {\n addUtcDays,\n isPeriodSelectable,\n type PeriodGranularity,\n type PeriodSelection,\n periodFromDate,\n periodToWindow,\n startOfUtcDay,\n} from \"../lib/period.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { Dropdown } from \"../primitives/Dropdown.tsx\";\nimport { TabButton } from \"../primitives/TabButton.tsx\";\n\nexport type PeriodPickerProps = {\n value: PeriodSelection;\n onChange: (value: PeriodSelection) => void;\n minDate?: Date;\n maxDate?: Date;\n /** Custom trigger for a calendar with a fixed granularity. */\n trigger?: (open: boolean) => ReactNode;\n /** Optional controls above the calendar grid. */\n header?: ReactNode;\n};\n\nconst WEEKDAY_LABELS = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\nconst MONTH_LABELS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nconst NAV_BUTTON =\n \"polli-control polli:rounded-full polli:px-2 polli:py-1 polli:text-xs polli:font-semibold polli:text-theme-text-base polli:transition-colors polli:hover:bg-theme-bg-subtle\";\n\nfunction addUtcMonths(date: Date, months: number): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1),\n );\n}\n\nfunction monthGridDates(viewMonth: Date): Date[] {\n const firstDay = new Date(\n Date.UTC(viewMonth.getUTCFullYear(), viewMonth.getUTCMonth(), 1),\n );\n const firstWeekday = firstDay.getUTCDay() || 7;\n const cursor = addUtcDays(firstDay, 1 - firstWeekday);\n return Array.from({ length: 42 }, (_, index) => addUtcDays(cursor, index));\n}\n\nfunction sameUtcDay(left: Date, right: Date): boolean {\n return left.getTime() === right.getTime();\n}\n\nfunction periodDate(value: PeriodSelection): Date {\n return periodToWindow(value).start;\n}\n\nfunction selectionKey(value: PeriodSelection): string {\n return `${value.granularity}:${value.period}`;\n}\n\nfunction formatMonthYear(date: Date, month: \"short\" | \"long\" = \"short\") {\n return date.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month,\n year: \"numeric\",\n });\n}\n\nfunction formatFullDate(date: Date) {\n return date.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nfunction formatWeekSummary(start: Date, end: Date) {\n const weekEnd = addUtcDays(end, -1);\n const sameMonth =\n start.getUTCFullYear() === weekEnd.getUTCFullYear() &&\n start.getUTCMonth() === weekEnd.getUTCMonth();\n\n if (sameMonth) {\n const month = start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n });\n return `${month} ${start.getUTCDate()}-${weekEnd.getUTCDate()}, ${weekEnd.getUTCFullYear()}`;\n }\n\n return `${formatFullDate(start)} - ${formatFullDate(weekEnd)}`;\n}\n\nfunction formatPeriodSummary(value: PeriodSelection): string {\n const { start, end } = periodToWindow(value);\n if (value.granularity === \"day\") return formatFullDate(start);\n if (value.granularity === \"week\") return formatWeekSummary(start, end);\n return formatMonthYear(start, \"long\");\n}\n\nfunction viewBounds(\n viewDate: Date,\n granularity: PeriodGranularity,\n): { start: Date; end: Date } {\n if (granularity === \"month\") {\n const start = new Date(Date.UTC(viewDate.getUTCFullYear(), 0, 1));\n return { start, end: addUtcMonths(start, 12) };\n }\n\n const start = new Date(\n Date.UTC(viewDate.getUTCFullYear(), viewDate.getUTCMonth(), 1),\n );\n return { start, end: addUtcMonths(start, 1) };\n}\n\nexport const PeriodPicker: FC<PeriodPickerProps> = ({\n value,\n onChange,\n minDate = new Date(0),\n maxDate,\n trigger,\n header,\n}) => {\n const [open, setOpen] = useState(false);\n const [viewDate, setViewDate] = useState<Date>(() => periodDate(value));\n const [anchorDate, setAnchorDate] = useState<Date>(() => periodDate(value));\n const emittedSelectionRef = useRef<string | null>(null);\n const { granularity, period } = value;\n\n useEffect(() => {\n const currentSelectionKey = selectionKey({ granularity, period });\n if (emittedSelectionRef.current === currentSelectionKey) {\n emittedSelectionRef.current = null;\n return;\n }\n const nextAnchorDate = periodDate({ granularity, period });\n setAnchorDate(nextAnchorDate);\n setViewDate(nextAnchorDate);\n }, [granularity, period]);\n\n const dates = useMemo(() => monthGridDates(viewDate), [viewDate]);\n const selectedWindow = periodToWindow(value);\n const today = startOfUtcDay(maxDate);\n const previousViewDate =\n value.granularity === \"month\"\n ? addUtcMonths(viewDate, -12)\n : addUtcMonths(viewDate, -1);\n const nextViewDate =\n value.granularity === \"month\"\n ? addUtcMonths(viewDate, 12)\n : addUtcMonths(viewDate, 1);\n const previousBounds = viewBounds(previousViewDate, value.granularity);\n const nextBounds = viewBounds(nextViewDate, value.granularity);\n const previousDisabled = previousBounds.end <= minDate;\n const nextDisabled = nextBounds.start > today;\n const summaryLabel = formatPeriodSummary(value);\n\n const commitSelection = (selection: PeriodSelection, anchor: Date) => {\n emittedSelectionRef.current = selectionKey(selection);\n setAnchorDate(anchor);\n setViewDate(anchor);\n onChange(selection);\n };\n\n const setGranularity = (granularity: PeriodGranularity) => {\n commitSelection(periodFromDate(granularity, anchorDate), anchorDate);\n };\n\n const selectDate = (date: Date) => {\n commitSelection(periodFromDate(value.granularity, date), date);\n setOpen(false);\n };\n\n const viewLabel =\n value.granularity === \"month\"\n ? String(viewDate.getUTCFullYear())\n : formatMonthYear(viewDate, \"long\");\n\n return (\n <div\n className={\n trigger\n ? \"polli:contents\"\n : \"polli:flex polli:w-full polli:flex-wrap polli:items-center polli:gap-2\"\n }\n >\n {!trigger && (\n <div className=\"polli:flex polli:flex-wrap polli:gap-1.5\">\n {([\"day\", \"week\", \"month\"] as PeriodGranularity[]).map(\n (granularity) => (\n <TabButton\n key={granularity}\n active={value.granularity === granularity}\n onClick={() => setGranularity(granularity)}\n >\n {granularity[0].toUpperCase() +\n granularity.slice(1)}\n </TabButton>\n ),\n )}\n </div>\n )}\n <Dropdown\n open={open}\n onOpenChange={setOpen}\n className=\"polli:w-[320px] polli:max-w-[calc(100vw-2rem)] polli:rounded-xl polli:border polli:border-divider polli:bg-surface-opaque polli:p-3.5 polli:shadow-lg\"\n trigger={\n trigger ??\n ((isOpen) => (\n <button\n type=\"button\"\n aria-label={`Select period, current ${summaryLabel}`}\n className={cn(\n \"polli-control polli:inline-flex polli:w-[320px] polli:max-w-full polli:items-center polli:justify-between polli:gap-2 polli:rounded-full polli:px-4 polli:py-1.5 polli:text-left polli:text-base polli:font-medium polli:leading-normal\",\n \"polli:bg-theme-bg-active polli:text-theme-text-base\",\n \"polli:transition-all polli:duration-200 polli:ease-out polli:hover:bg-theme-bg-hover\",\n isOpen &&\n \"polli:bg-theme-bg-hover polli:text-theme-text-strong\",\n )}\n >\n <span className=\"polli:truncate\">\n {summaryLabel}\n </span>\n <ChevronIcon expanded={isOpen} />\n </button>\n ))\n }\n >\n {header}\n <div className=\"polli:mb-3 polli:flex polli:items-center polli:justify-between\">\n <button\n type=\"button\"\n aria-label=\"Previous\"\n disabled={previousDisabled}\n onClick={() => setViewDate(previousViewDate)}\n className={cn(\n NAV_BUTTON,\n previousDisabled &&\n \"polli:cursor-not-allowed polli:opacity-30 polli:hover:bg-transparent\",\n )}\n >\n {\"<\"}\n </button>\n <div className=\"polli:text-base polli:font-bold polli:text-theme-text-base\">\n {viewLabel}\n </div>\n <button\n type=\"button\"\n aria-label=\"Next\"\n disabled={nextDisabled}\n onClick={() => setViewDate(nextViewDate)}\n className={cn(\n NAV_BUTTON,\n nextDisabled &&\n \"polli:cursor-not-allowed polli:opacity-30 polli:hover:bg-transparent\",\n )}\n >\n {\">\"}\n </button>\n </div>\n\n {value.granularity === \"month\" ? (\n <div className=\"polli:grid polli:grid-cols-3 polli:gap-1.5\">\n {MONTH_LABELS.map((label, monthIndex) => {\n const date = new Date(\n Date.UTC(\n viewDate.getUTCFullYear(),\n monthIndex,\n 1,\n ),\n );\n const selectable = isPeriodSelectable(\n periodFromDate(\"month\", date),\n minDate,\n today,\n );\n const ariaLabel = date.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"long\",\n year: \"numeric\",\n });\n const selected =\n date.getUTCFullYear() ===\n selectedWindow.start.getUTCFullYear() &&\n date.getUTCMonth() ===\n selectedWindow.start.getUTCMonth();\n return (\n <button\n type=\"button\"\n key={label}\n aria-label={ariaLabel}\n aria-pressed={selected}\n disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli-control polli:rounded-lg polli:px-3 polli:py-2 polli:text-sm polli:font-medium polli:transition-colors polli:duration-150\",\n selected\n ? \"polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:text-ink-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-theme-text-muted polli:hover:bg-transparent\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n ) : (\n <>\n <div className=\"polli:mb-1 polli:grid polli:grid-cols-7 polli:gap-1 polli:text-center polli:text-xs polli:font-bold polli:uppercase polli:text-theme-text-muted\">\n {WEEKDAY_LABELS.map((label) => (\n <div key={label}>{label}</div>\n ))}\n </div>\n <div className=\"polli:grid polli:grid-cols-7 polli:gap-1\">\n {dates.map((date) => {\n const inCurrentMonth =\n date.getUTCMonth() ===\n viewDate.getUTCMonth();\n const selectable = isPeriodSelectable(\n periodFromDate(value.granularity, date),\n minDate,\n today,\n );\n const ariaLabel =\n value.granularity === \"week\"\n ? `Select ${formatPeriodSummary(periodFromDate(\"week\", date))}`\n : `Select ${date.toLocaleDateString(\n \"en-US\",\n {\n timeZone: \"UTC\",\n weekday: \"long\",\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n },\n )}`;\n const selected =\n value.granularity === \"day\"\n ? sameUtcDay(date, selectedWindow.start)\n : date >= selectedWindow.start &&\n date < selectedWindow.end;\n return (\n <button\n type=\"button\"\n key={date.toISOString()}\n aria-label={ariaLabel}\n aria-pressed={selected}\n disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli-control polli:aspect-square polli:rounded-lg polli:text-sm polli:font-medium polli:transition-colors polli:duration-150\",\n !inCurrentMonth &&\n \"polli:text-theme-text-muted\",\n sameUtcDay(date, today) &&\n \"polli:ring-1 polli:ring-theme-border\",\n selected\n ? \"polli:bg-theme-bg-active polli:text-theme-text-strong\"\n : \"polli:text-ink-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-theme-text-muted polli:hover:bg-transparent\",\n )}\n >\n {date.getUTCDate()}\n </button>\n );\n })}\n </div>\n </>\n )}\n </Dropdown>\n </div>\n );\n};\n","const MS_PER_DAY = 86400000;\n\nexport type PeriodGranularity = \"day\" | \"week\" | \"month\";\n\nexport type PeriodSelection = {\n granularity: PeriodGranularity;\n period: string;\n};\n\nexport type PeriodWindow = {\n start: Date;\n end: Date;\n};\n\nexport function startOfUtcDay(date = new Date()): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()),\n );\n}\n\nexport function addUtcDays(date: Date, days: number): Date {\n const next = new Date(date);\n next.setUTCDate(next.getUTCDate() + days);\n return next;\n}\n\nfunction startOfUtcMonth(date: Date): Date {\n return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1));\n}\n\nfunction addUtcMonths(date: Date, months: number): Date {\n return new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + months, 1),\n );\n}\n\nfunction startOfUtcIsoWeek(date: Date): Date {\n const day = date.getUTCDay() || 7;\n return addUtcDays(startOfUtcDay(date), 1 - day);\n}\n\nfunction getUtcIsoWeekPeriod(date: Date): string {\n const day = date.getUTCDay() || 7;\n const thursday = addUtcDays(startOfUtcDay(date), 4 - day);\n const isoYear = thursday.getUTCFullYear();\n const yearStart = new Date(Date.UTC(isoYear, 0, 1));\n const isoWeek = Math.ceil(\n ((thursday.getTime() - yearStart.getTime()) / MS_PER_DAY + 1) / 7,\n );\n return `${isoYear}-W${String(isoWeek).padStart(2, \"0\")}`;\n}\n\nfunction formatUtcDatePeriod(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nfunction formatUtcHourPeriod(date: Date): string {\n return date.toISOString().slice(0, 13).replace(\"T\", \" \");\n}\n\nfunction formatUtcMonthPeriod(date: Date): string {\n return date.toISOString().slice(0, 7);\n}\n\nexport function periodFromDate(\n granularity: PeriodGranularity,\n date = new Date(),\n): PeriodSelection {\n if (granularity === \"day\") {\n return {\n granularity,\n period: formatUtcDatePeriod(startOfUtcDay(date)),\n };\n }\n if (granularity === \"week\") {\n return { granularity, period: getUtcIsoWeekPeriod(date) };\n }\n return { granularity, period: formatUtcMonthPeriod(startOfUtcMonth(date)) };\n}\n\nexport function currentPeriod(): PeriodSelection {\n return periodFromDate(\"day\");\n}\n\nexport function periodToWindow(selection: PeriodSelection): PeriodWindow {\n if (selection.granularity === \"day\") {\n const start = new Date(`${selection.period}T00:00:00.000Z`);\n return { start, end: addUtcDays(start, 1) };\n }\n\n if (selection.granularity === \"week\") {\n const [yearText, weekText] = selection.period.split(\"-W\");\n const isoYear = Number(yearText);\n const isoWeek = Number(weekText);\n const jan4 = new Date(Date.UTC(isoYear, 0, 4));\n const start = addUtcDays(startOfUtcIsoWeek(jan4), (isoWeek - 1) * 7);\n return { start, end: addUtcDays(start, 7) };\n }\n\n const [yearText, monthText] = selection.period.split(\"-\");\n const start = new Date(\n Date.UTC(Number(yearText), Number(monthText) - 1, 1),\n );\n return { start, end: addUtcMonths(start, 1) };\n}\n\nexport function getPeriodBucketKeys(selection: PeriodSelection): string[] {\n const { start, end } = periodToWindow(selection);\n const bucketKeys: string[] = [];\n const cursor = new Date(start);\n if (selection.granularity === \"day\") {\n while (cursor < end) {\n bucketKeys.push(`${formatUtcHourPeriod(cursor)}:00:00`);\n cursor.setUTCHours(cursor.getUTCHours() + 1);\n }\n return bucketKeys;\n }\n\n while (cursor < end) {\n bucketKeys.push(formatUtcDatePeriod(cursor));\n cursor.setUTCDate(cursor.getUTCDate() + 1);\n }\n return bucketKeys;\n}\n\nexport function periodBucketKeyToDate(\n bucketKey: string,\n granularity: PeriodGranularity,\n): Date {\n if (granularity === \"day\") {\n return new Date(`${bucketKey.replace(\" \", \"T\")}.000Z`);\n }\n return new Date(`${bucketKey}T00:00:00.000Z`);\n}\n\nexport function isPeriodSelectable(\n selection: PeriodSelection,\n minDate = new Date(0),\n maxDate = startOfUtcDay(),\n): boolean {\n const { start, end } = periodToWindow(selection);\n return end > minDate && start <= maxDate;\n}\n","import type {\n ComponentPropsWithoutRef,\n ElementType,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype TabButtonOwnProps = {\n /** `mixed`: a group toggle where only some of its items are selected. */\n active: boolean | \"mixed\";\n /** Omit when rendering as a link (`as`) and navigation carries the change. */\n onClick?: () => void;\n children: ReactNode;\n size?: \"lg\" | \"md\" | \"sm\" | \"xs\";\n variant?: \"soft\" | \"ghost\";\n /**\n * `amber` and `green` fill the selected pill with the wallet's pale paid\n * and Quest Pollen chip colours, which read at the same strength together.\n */\n intent?: \"neutral\" | \"amber\" | \"green\";\n /** Muted secondary text after the label, e.g. a model's creator. */\n detail?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n};\n\n/**\n * Polymorphic like Button, so a tab that navigates can render a real anchor\n * instead of a click handler — middle-click, right-click and crawlers all\n * depend on that. Defaults to <button>, so existing call sites are unchanged.\n */\nexport type TabButtonProps<T extends ElementType = \"button\"> =\n TabButtonOwnProps & { as?: T } & Omit<\n ComponentPropsWithoutRef<T>,\n keyof TabButtonOwnProps | \"as\"\n >;\n\n/**\n * Shared pill shape (no colors) — used by every TabButton variant.\n *\n * `transition-colors`, not `transition-all`: only background and text colour\n * change between the variants, and `all` additionally animates any layout\n * property that happens to differ — which is the usual cause of a control\n * jittering under the pointer on hover.\n */\nconst tabButtonBaseClass =\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:font-medium polli:leading-normal polli:transition-colors polli:duration-200\";\n\nconst tabButtonSizeClass = {\n xs: \"polli:px-2.5 polli:py-1 polli:text-xs\",\n lg: \"polli:px-5 polli:py-2 polli:text-lg\",\n md: \"polli:px-4 polli:py-1.5 polli:text-base\",\n sm: \"polli:px-3 polli:py-1.5 polli:text-sm\",\n} as const;\n\nconst variantClasses = {\n // The default tab look: borderless and monochrome. Selected uses `bg-active`\n // — the same light resting fill as the site's normal buttons. Both states\n // deepen to `bg-hover` and use the theme's hover label color. Non-selected\n // uses the quiet `bg-subtle` token until then.\n soft: {\n base: \"\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n mixed: \"polli:bg-theme-bg-active/45 polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n inactive:\n \"polli:bg-theme-bg-subtle polli:text-theme-text-base polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n },\n // Transparent until hovered or selected — for multi-select toggles and\n // inline rows where a filled idle pill would read as a hard selection.\n ghost: {\n base: \"polli:border polli:border-transparent\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n mixed: \"polli:bg-theme-bg-active/45 polli:text-theme-text-strong polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n inactive:\n \"polli:bg-transparent polli:text-theme-text-base polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover\",\n },\n} as const;\n\n// Wallet chip pairs: selected fills with the pale tint and deep label; hover\n// previews that fill. Unselected green keeps its green label so it stays\n// recognisable next to amber; unselected amber keeps the neutral label.\nconst intentClasses = {\n amber: {\n active: \"polli:bg-paid-pale polli:text-paid-deep\",\n inactive:\n \"polli:bg-transparent polli:text-theme-text-base polli:hover:bg-paid-pale/60\",\n },\n green: {\n active: \"polli:bg-tier-pale polli:text-tier-deep\",\n inactive:\n \"polli:bg-transparent polli:text-tier-deep polli:hover:bg-tier-pale/60\",\n },\n} as const;\n\nexport function TabButton<T extends ElementType = \"button\">({\n as,\n active,\n onClick,\n children,\n size = \"md\",\n variant = \"soft\",\n intent,\n detail,\n ariaLabel,\n disabled = false,\n className,\n ...rest\n}: TabButtonProps<T>) {\n const Component: ElementType = as || \"button\";\n const isButton = Component === \"button\";\n const colors =\n intent === \"neutral\"\n ? variantClasses.soft\n : intent\n ? {\n ...intentClasses[intent],\n mixed: intentClasses[intent].active,\n }\n : variantClasses[variant];\n const handleClick = disabled\n ? (event: ReactMouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n }\n : onClick;\n\n return (\n <Component\n {...rest}\n {...(isButton ? { type: \"button\", disabled } : {})}\n {...(!isButton && disabled\n ? { \"aria-disabled\": true, tabIndex: -1 }\n : {})}\n {...(Component === \"a\" && disabled ? { href: undefined } : {})}\n onClick={handleClick}\n {...(ariaLabel !== undefined ? { \"aria-label\": ariaLabel } : {})}\n // aria-pressed is for toggles; a link that navigates announces its\n // selected state with aria-current instead.\n {...(isButton\n ? { \"aria-pressed\": active }\n : { \"aria-current\": active === true ? \"page\" : undefined })}\n className={cn(\n tabButtonBaseClass,\n variantClasses[variant].base,\n active === \"mixed\"\n ? colors.mixed\n : active\n ? colors.active\n : colors.inactive,\n disabled &&\n \"polli:pointer-events-none polli:cursor-not-allowed polli:opacity-50\",\n tabButtonSizeClass[size],\n className,\n )}\n >\n {children}\n {detail != null && (\n <span className=\"polli:ml-1 polli:font-normal polli:opacity-70\">\n {detail}\n </span>\n )}\n </Component>\n );\n}\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Surface } from \"../primitives/Surface.tsx\";\nimport { Heading, Text } from \"../primitives/Typography.tsx\";\n\nexport type SectionProps = {\n title: string;\n id?: string;\n framed?: boolean;\n intro?: ReactNode;\n action?: ReactNode;\n actionClassName?: string;\n panelClassName?: string;\n titleClassName?: string;\n children: ReactNode;\n className?: string;\n};\n\nexport const Section: FC<SectionProps> = ({\n title,\n id,\n framed = true,\n intro,\n action,\n actionClassName,\n panelClassName,\n titleClassName,\n children,\n className,\n}) => {\n const body = (\n <>\n {intro && (\n <Text as=\"div\" className=\"polli:max-w-2xl\">\n {intro}\n </Text>\n )}\n {children}\n </>\n );\n\n const content = (\n <>\n <header className=\"polli:flex polli:flex-wrap polli:items-center polli:justify-between polli:gap-3\">\n <Heading\n as=\"h2\"\n size=\"section\"\n className={cn(\"polli:text-left\", titleClassName)}\n >\n {title}\n </Heading>\n {action && (\n <div className={cn(\"polli:shrink-0\", actionClassName)}>\n {action}\n </div>\n )}\n </header>\n {body}\n </>\n );\n\n return (\n <section id={id} className={cn(\"polli:scroll-mt-10\", className)}>\n {framed ? (\n <Surface\n variant=\"panel\"\n className={cn(\n \"polli:flex polli:flex-col polli:gap-5\",\n panelClassName,\n )}\n >\n {content}\n </Surface>\n ) : (\n <div className=\"polli:flex polli:flex-col polli:gap-4\">\n {content}\n </div>\n )}\n </section>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\n/**\n * - `stat` — large numeric value (default)\n * - `fact` — small wrapping prose value (labeled fact tile)\n */\ntype StatCardVariant = \"stat\" | \"fact\";\n\nconst valueVariantClasses: Record<StatCardVariant, string> = {\n stat: \"polli:min-h-8 polli:text-2xl polli:font-bold polli:leading-tight polli:tabular-nums polli:text-theme-text-base\",\n fact: \"polli:text-sm polli:leading-6 polli:text-theme-text-soft\",\n};\n\nexport type StatCardProps = {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n variant?: StatCardVariant;\n className?: string;\n labelClassName?: string;\n valueClassName?: string;\n detailClassName?: string;\n};\n\nexport const StatCard: FC<StatCardProps> = ({\n label,\n value,\n detail,\n variant = \"stat\",\n className,\n labelClassName,\n valueClassName,\n detailClassName,\n}) => (\n <div className={cn(\"polli:text-sm\", className)}>\n <Text\n as=\"div\"\n size=\"micro\"\n tone=\"soft\"\n weight=\"bold\"\n className={cn(\n \"polli:uppercase polli:tracking-wide\",\n labelClassName,\n )}\n >\n {label}\n </Text>\n <div\n className={cn(\n \"polli:mt-1 polli:break-words\",\n valueVariantClasses[variant],\n valueClassName,\n )}\n >\n {value}\n </div>\n {detail && (\n <Text\n as=\"div\"\n size=\"xs\"\n tone=\"soft\"\n className={cn(\"polli:mt-2\", detailClassName)}\n >\n {detail}\n </Text>\n )}\n </div>\n);\n","import { Fragment, type ReactNode, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"../primitives/ChevronIcon.tsx\";\nimport { InlineLink } from \"../primitives/InlineLink.tsx\";\nimport {\n CheckIcon,\n ClockIcon,\n ToolIcon,\n XIcon,\n} from \"../primitives/icons/index.tsx\";\nimport { Text } from \"../primitives/Typography.tsx\";\n\nexport type ToolCallStatus =\n | \"pending\"\n | \"running\"\n | \"approval-requested\"\n | \"approval-responded\"\n | \"complete\"\n | \"error\"\n | \"denied\";\n\nexport interface ToolCallDetailsProps {\n name: string;\n input?: unknown;\n output?: unknown;\n error?: unknown;\n status?: ToolCallStatus;\n defaultOpen?: boolean;\n className?: string;\n}\n\nfunction formattedValue(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction linkedValue(value: unknown): ReactNode[] {\n const formatted = formattedValue(value);\n const segments = formatted.split(/(https:\\/\\/[^\\s\"\\\\]+)/g);\n let offset = 0;\n return segments.map((segment, index) => {\n const key = `${offset}:${segment}`;\n offset += segment.length;\n if (!segment.startsWith(\"https://\")) return segment;\n\n let href = segment;\n const quotedUrl =\n segments[index - 1]?.endsWith('\"') &&\n segments[index + 1]?.startsWith('\"');\n let extraClosingParens =\n (href.match(/\\)/g)?.length ?? 0) - (href.match(/\\(/g)?.length ?? 0);\n // Keep balanced URL parentheses, but leave prose delimiters outside the link.\n while (\n !quotedUrl &&\n (/[.,!?;:]$/.test(href) ||\n (href.endsWith(\")\") && extraClosingParens > 0))\n ) {\n if (href.endsWith(\")\")) extraClosingParens--;\n href = href.slice(0, -1);\n }\n return (\n <Fragment key={key}>\n <InlineLink href={href}>{href}</InlineLink>\n {segment.slice(href.length)}\n </Fragment>\n );\n });\n}\n\nfunction ToolValue({\n value,\n error = false,\n}: {\n value: unknown;\n error?: boolean;\n}) {\n return (\n <pre\n className={cn(\n \"polli:max-h-72 polli:overflow-auto polli:whitespace-pre-wrap polli:break-words polli:rounded-lg polli:border polli:p-3 polli:text-xs polli:leading-relaxed\",\n error\n ? \"polli:border-intent-danger-border/30 polli:bg-intent-danger-bg-light polli:text-intent-danger-text\"\n : \"polli:border-theme-border/20 polli:bg-theme-bg-pale polli:text-theme-text-base\",\n )}\n >\n {linkedValue(value)}\n </pre>\n );\n}\n\nconst STATUS_LABELS: Record<ToolCallStatus, string> = {\n pending: \"Pending\",\n running: \"Running\",\n \"approval-requested\": \"Awaiting approval\",\n \"approval-responded\": \"Responded\",\n complete: \"Completed\",\n error: \"Error\",\n denied: \"Denied\",\n};\n\nfunction ToolStatus({ status }: { status: ToolCallStatus }) {\n const icon =\n status === \"complete\" || status === \"approval-responded\" ? (\n <CheckIcon className=\"polli:size-3\" />\n ) : status === \"error\" || status === \"denied\" ? (\n <XIcon className=\"polli:size-3\" />\n ) : (\n <ClockIcon\n className={cn(\n \"polli:size-3\",\n status === \"running\" && \"polli:animate-pulse\",\n )}\n />\n );\n return (\n <span\n data-status={status}\n className={cn(\n \"polli:ml-auto polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-full polli:px-2 polli:py-1 polli:text-[11px] polli:font-semibold\",\n status === \"complete\" || status === \"approval-responded\"\n ? \"polli:bg-theme-bg-active polli:text-intent-success-text\"\n : status === \"error\" || status === \"denied\"\n ? \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text\"\n : \"polli:bg-intent-info-bg-light polli:text-intent-info-text\",\n )}\n >\n {icon}\n {STATUS_LABELS[status]}\n </span>\n );\n}\n\n/** Framework-neutral disclosure for server- or client-executed tool calls. */\nexport function ToolCallDetails({\n name,\n input,\n output,\n error,\n status = error === undefined ? \"complete\" : \"error\",\n defaultOpen = false,\n className,\n}: ToolCallDetailsProps) {\n const result = error === undefined ? output : error;\n const [open, setOpen] = useState(defaultOpen);\n return (\n <div\n data-tool-status={status}\n className={cn(\n \"polli:overflow-hidden polli:rounded-xl polli:border polli:border-theme-border/35 polli:bg-surface-opaque\",\n className,\n )}\n >\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => setOpen((current) => !current)}\n className=\"polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:gap-2 polli:px-3 polli:py-2.5 polli:text-left polli:hover:bg-theme-bg-hover/50\"\n >\n <span className=\"polli:flex polli:size-7 polli:shrink-0 polli:items-center polli:justify-center polli:rounded-lg polli:bg-theme-bg-active polli:text-theme-text-strong\">\n <ToolIcon className=\"polli:size-3.5\" />\n </span>\n <code className=\"polli:min-w-0 polli:truncate polli:text-xs polli:font-semibold polli:text-theme-text-strong\">\n {name}\n </code>\n <ToolStatus status={status} />\n <ChevronIcon\n expanded={open}\n className=\"polli:size-4 polli:shrink-0 polli:text-theme-text-soft\"\n />\n </button>\n {open && (\n <div className=\"polli:flex polli:flex-col polli:gap-4 polli:border-theme-border/30 polli:border-t polli:bg-theme-bg-pale/35 polli:px-3 polli:py-3\">\n {input !== undefined && (\n <div className=\"polli:flex polli:flex-col polli:gap-1\">\n <Text size=\"xs\" tone=\"muted\" weight=\"bold\">\n Parameters\n </Text>\n <ToolValue value={input} />\n </div>\n )}\n {result !== undefined && (\n <div className=\"polli:flex polli:flex-col polli:gap-1\">\n <Text size=\"xs\" tone=\"muted\" weight=\"bold\">\n {error === undefined ? \"Result\" : \"Error\"}\n </Text>\n <ToolValue\n value={result}\n error={error !== undefined}\n />\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { PropsWithChildren } from \"react\";\nimport { isExternalHref } from \"../lib/link.ts\";\nimport { ExternalLinkIcon } from \"./icons/index.tsx\";\n\ntype BaseInlineLinkProps = {\n /** Set explicitly for non-http external links, or false for custom routing components. */\n external?: boolean;\n showIcon?: boolean;\n /** Inline text inherits its size; footers use 13px and standalone links 14px. */\n size?: \"inherit\" | \"footer\" | \"sm\";\n /** Accent for prominent links; quiet for secondary navigation. */\n tone?: \"accent\" | \"quiet\";\n className?: string;\n};\n\nexport type InlineLinkProps<T extends React.ElementType = \"a\"> =\n PropsWithChildren<BaseInlineLinkProps> & {\n as?: T;\n } & Omit<\n React.ComponentPropsWithoutRef<T>,\n keyof BaseInlineLinkProps | \"as\"\n >;\n\n/** Shared text-link rule: surrounding font, selectable ink, persistent underline,\n * visible keyboard focus, and an external arrow only when leaving the app.\n * Navigation and button-shaped actions use their own primitives.\n */\nexport function InlineLink<T extends React.ElementType = \"a\">({\n as,\n external,\n showIcon = true,\n size = \"inherit\",\n tone = \"accent\",\n className,\n children,\n ...linkProps\n}: InlineLinkProps<T>) {\n const Component: React.ElementType = as || \"a\";\n const isExternal =\n external ?? isExternalHref((linkProps as { href?: unknown }).href);\n\n return (\n <Component\n target={isExternal && as !== \"button\" ? \"_blank\" : undefined}\n rel={\n isExternal && as !== \"button\"\n ? \"noopener noreferrer\"\n : undefined\n }\n className={[\"polli-link\", className].filter(Boolean).join(\" \")}\n data-size={size}\n data-tone={tone}\n {...linkProps}\n >\n {children}\n {showIcon && isExternal && (\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli-link-external-icon\"\n />\n )}\n </Component>\n );\n}\n","import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/** Class merge for apps consuming the unprefixed Tailwind bridge in app.css. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import { useEffect } from \"react\";\n\n/**\n * Locks page scroll while enabled and restores the original overflow values on\n * cleanup.\n */\nexport function useScrollLock(enabled = true): void {\n useEffect(() => {\n if (!enabled) return;\n\n const originalBody = document.body.style.overflow;\n const originalHtml = document.documentElement.style.overflow;\n document.body.style.overflow = \"hidden\";\n document.documentElement.style.overflow = \"hidden\";\n\n return () => {\n document.body.style.overflow = originalBody;\n document.documentElement.style.overflow = originalHtml;\n };\n }, [enabled]);\n}\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type ButtonGroupProps = ComponentPropsWithoutRef<\"div\">;\n\nexport const ButtonGroup: FC<ButtonGroupProps> = ({\n className,\n children,\n role = \"group\",\n ...rest\n}) => (\n <div\n {...rest}\n role={role}\n className={cn(\n \"polli:flex polli:min-w-0 polli:flex-wrap polli:items-center polli:gap-1.5\",\n className,\n )}\n >\n {children}\n </div>\n);\n","import { type FC, useSyncExternalStore } from \"react\";\nimport { MoonIcon, SunIcon } from \"./icons/index.tsx\";\nimport { Switch } from \"./Switch.tsx\";\n\n/**\n * Light/dark colour mode. The chosen mode is reflected as `class=\"dark\"` on\n * <html>, which flips the design-system tokens (see styles/tokens.css: `.dark`\n * + `.dark [data-theme]`). One shared module-level store backs every\n * `useColorMode()` consumer, so duplicate toggles never desync and changes\n * propagate across tabs.\n *\n * The chosen mode is persisted to localStorage (per-origin), which also powers\n * the cross-tab `storage` sync below. Read priority: localStorage → system\n * preference. Choosing the mode the system already uses clears the stored\n * choice, so later visits follow the system again.\n *\n * Host apps should set the initial class pre-paint (a tiny inline script in the\n * document head, reading the same key) to avoid a flash of light before React\n * mounts; this store is the source of truth after hydration.\n *\n * Side-effect-free on import: the <html> sync and the cross-tab listener are\n * attached lazily on first subscribe, so importing this module (e.g. via the\n * package barrel) never mutates the DOM on its own.\n */\ntype ColorMode = \"light\" | \"dark\";\n\nconst STORAGE_KEY = \"polli-color-mode\";\n\nfunction readStored(): ColorMode | null {\n try {\n const value = localStorage.getItem(STORAGE_KEY);\n return value === \"light\" || value === \"dark\" ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction systemMode(): ColorMode {\n return typeof window !== \"undefined\" &&\n window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches === true\n ? \"dark\"\n : \"light\";\n}\n\nlet current: ColorMode = readStored() ?? systemMode();\nconst listeners = new Set<() => void>();\n\nfunction apply(): void {\n if (typeof document === \"undefined\") return;\n document.documentElement.classList.toggle(\"dark\", current === \"dark\");\n syncThemeColor();\n}\n\n// Match the browser chrome (theme-color) to the resolved desk color by reading\n// the computed --polli-color-app-bg token — never a hardcoded value. Runs on\n// mount / mode change, after styles load, so the token resolves per mode.\nfunction syncThemeColor(): void {\n if (typeof document === \"undefined\") return;\n const appBg = getComputedStyle(document.documentElement)\n .getPropertyValue(\"--polli-color-app-bg\")\n .trim();\n if (!appBg) return;\n let meta = document.querySelector('meta[name=\"theme-color\"]');\n if (!meta) {\n meta = document.createElement(\"meta\");\n meta.setAttribute(\"name\", \"theme-color\");\n document.head.appendChild(meta);\n }\n meta.setAttribute(\"content\", appBg);\n}\n\nfunction emit(): void {\n for (const listener of listeners) listener();\n}\n\nfunction handleStorage(event: StorageEvent): void {\n if (event.key !== STORAGE_KEY) return;\n const next = readStored() ?? systemMode();\n if (next === current) return;\n current = next;\n apply();\n emit();\n}\n\nfunction subscribe(listener: () => void): () => void {\n if (listeners.size === 0 && typeof window !== \"undefined\") {\n apply(); // safety-net sync once a consumer mounts\n window.addEventListener(\"storage\", handleStorage);\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0 && typeof window !== \"undefined\") {\n window.removeEventListener(\"storage\", handleStorage);\n }\n };\n}\n\nfunction getSnapshot(): ColorMode {\n return current;\n}\n\nfunction getServerSnapshot(): ColorMode {\n return \"light\";\n}\n\n/**\n * Set the color mode programmatically. Updates the shared store (so every\n * `useColorMode()` consumer re-renders), flips the `.dark` class, and persists\n * to localStorage, or clears it when the mode matches the system.\n */\nexport function setColorMode(mode: ColorMode): void {\n if (mode === current) return;\n current = mode;\n apply();\n try {\n if (mode === systemMode()) localStorage.removeItem(STORAGE_KEY);\n else localStorage.setItem(STORAGE_KEY, mode);\n } catch {\n // ignore write failures (private mode / storage disabled)\n }\n emit();\n}\n\nexport function useColorMode(): {\n mode: ColorMode;\n isDark: boolean;\n toggle: () => void;\n} {\n const mode = useSyncExternalStore(\n subscribe,\n getSnapshot,\n getServerSnapshot,\n );\n return {\n mode,\n isDark: mode === \"dark\",\n toggle: () => setColorMode(mode === \"dark\" ? \"light\" : \"dark\"),\n };\n}\n\n/**\n * Sliding sun/moon switch: `Switch` as a two-way choice, so the track stays\n * neutral and the thumb carries the active mode's icon. Self-contained —\n * wires itself to `useColorMode`.\n */\nexport const ColorModeToggle: FC = () => {\n const { isDark, toggle } = useColorMode();\n return (\n <Switch\n checked={isDark}\n onChange={toggle}\n ariaLabel=\"Toggle dark mode\"\n size=\"sm\"\n icons={{ off: <SunIcon />, on: <MoonIcon /> }}\n />\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type SwitchStatus = \"off\" | \"on\" | \"invalid\";\nexport type SwitchSize = \"sm\" | \"md\" | \"lg\";\n\nexport type SwitchProps = {\n checked: boolean;\n onChange: (next: boolean) => void;\n /** Track colour. Defaults to `checked ? \"on\" : \"off\"`. */\n status?: SwitchStatus;\n /** Accessible label (aria-label). Not rendered visibly. */\n ariaLabel?: string;\n disabled?: boolean;\n /** Same heights as `Button` sm / md / lg, so a switch lines up with one. */\n size?: SwitchSize;\n /**\n * A two-way choice (light/dark) rather than on/off: the thumb carries the\n * current side's icon, the other sits faint on the empty side, and the\n * track looks the same in both positions.\n */\n icons?: { off: ReactNode; on: ReactNode };\n className?: string;\n};\n\n// Heights match Button (min-h-7 / 9 / 12). The thumb sits 3px inside a 1px\n// border on every side, so its travel is the inner width minus both insets\n// and itself.\nconst sizes: Record<\n SwitchSize,\n {\n track: string;\n thumb: string;\n travel: string;\n icon: string;\n ghostOff: string;\n ghostOn: string;\n }\n> = {\n sm: {\n track: \"polli:h-7 polli:w-[52px]\",\n thumb: \"polli:h-5 polli:w-5\",\n travel: \"polli:translate-x-6\",\n icon: \"polli:h-3.5 polli:w-3.5\",\n ghostOff: \"polli:right-2\",\n ghostOn: \"polli:left-2\",\n },\n md: {\n track: \"polli:h-9 polli:w-16\",\n thumb: \"polli:h-7 polli:w-7\",\n travel: \"polli:translate-x-7\",\n icon: \"polli:h-4 polli:w-4\",\n ghostOff: \"polli:right-[9px]\",\n ghostOn: \"polli:left-[9px]\",\n },\n lg: {\n track: \"polli:h-12 polli:w-[88px]\",\n thumb: \"polli:h-10 polli:w-10\",\n travel: \"polli:translate-x-10\",\n icon: \"polli:h-5 polli:w-5\",\n ghostOff: \"polli:right-[13px]\",\n ghostOn: \"polli:left-[13px]\",\n },\n};\n\n// On/off reads at a glance: grey when off, the palette's own green (the Quest\n// card's) when on, red when on but needing attention. A two-way choice\n// (icons, the light/dark toggle) keeps its neutral look: a page-coloured\n// thumb carrying the accent icon on a plain track.\ntype SwitchLook = SwitchStatus | \"choice\";\nconst trackClasses: Record<SwitchLook, string> = {\n off: \"polli:border-theme-text-strong/15 polli:bg-theme-bg-subtle polli:hover:border-theme-text-strong/30\",\n on: \"polli:border-tier-soft polli:bg-tier-soft\",\n invalid: \"polli:border-intent-danger-text polli:bg-intent-danger-bg-light\",\n choice: \"polli:border-theme-text-strong/10 polli:bg-surface-opaque\",\n};\nconst thumbClasses: Record<SwitchLook, string> = {\n off: \"polli:bg-theme-text-muted/60 polli:text-app-bg\",\n on: \"polli:bg-intent-success-text-on-bright\",\n invalid: \"polli:bg-intent-danger-text polli:text-app-bg\",\n choice: \"polli:bg-app-bg polli:text-theme-text-soft\",\n};\n\n/**\n * Binary toggle, in `Button`'s sizes: grey off, green on. `checked` moves the thumb;\n * `status` colours it, so `checked status=\"invalid\"` is thumb-right in red.\n * With `icons` it is a two-way choice with a solid thumb on both sides.\n */\nexport const Switch: FC<SwitchProps> = ({\n checked,\n onChange,\n status,\n ariaLabel,\n disabled = false,\n size = \"md\",\n icons,\n className,\n}) => {\n const geometry = sizes[size];\n const look: SwitchLook = icons\n ? \"choice\"\n : (status ?? (checked ? \"on\" : \"off\"));\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={\n ariaLabel ?? (checked ? \"Turn off toggle\" : \"Turn on toggle\")\n }\n onClick={() => onChange(!checked)}\n disabled={disabled}\n className={cn(\n \"polli-control polli:relative polli:inline-block polli:shrink-0 polli:cursor-pointer polli:rounded-full polli:border polli:transition-colors polli:disabled:cursor-not-allowed polli:disabled:opacity-60\",\n geometry.track,\n trackClasses[look],\n className,\n )}\n >\n {icons && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"polli:absolute polli:top-1/2 polli:flex polli:-translate-y-1/2 polli:text-theme-text-strong/40 polli:[&>svg]:h-full polli:[&>svg]:w-full\",\n geometry.icon,\n checked ? geometry.ghostOn : geometry.ghostOff,\n )}\n >\n {checked ? icons.off : icons.on}\n </span>\n )}\n <span\n className={cn(\n \"polli:absolute polli:top-1/2 polli:left-[3px] polli:flex polli:-translate-y-1/2 polli:items-center polli:justify-center polli:rounded-full polli:transition-[transform,background-color]\",\n geometry.thumb,\n thumbClasses[look],\n checked ? geometry.travel : \"polli:translate-x-0\",\n )}\n >\n {icons && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"polli:flex polli:[&>svg]:h-full polli:[&>svg]:w-full\",\n geometry.icon,\n )}\n >\n {checked ? icons.on : icons.off}\n </span>\n )}\n </span>\n </button>\n );\n};\n","import { Dialog as ArkDialog } from \"@ark-ui/react/dialog\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { FC, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type DrawerProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n ariaLabel: string;\n children: ReactNode;\n side?: \"left\" | \"right\";\n contentClassName?: string;\n};\n\n/** Accessible side drawer for mobile navigation and compact tools. */\nexport const Drawer: FC<DrawerProps> = ({\n open,\n onOpenChange,\n ariaLabel,\n children,\n side = \"left\",\n contentClassName,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <ArkDialog.Root\n open={open}\n initialFocusEl={() => contentRef.current}\n onOpenChange={(details) => onOpenChange(details.open)}\n >\n <Portal>\n <ArkDialog.Backdrop className=\"polli:fixed polli:inset-0 polli:z-[100] polli:bg-[#000]/40 polli:backdrop-blur-sm\" />\n <ArkDialog.Positioner className=\"polli:pointer-events-none polli:fixed polli:inset-0 polli:z-[110] polli:h-dvh polli:overflow-hidden\">\n <ArkDialog.Content\n ref={contentRef}\n aria-label={ariaLabel}\n className={cn(\n \"polli:pointer-events-auto polli:flex polli:h-dvh polli:w-[min(20rem,86vw)] polli:flex-col polli:overflow-hidden polli:border-theme-text-strong/10 polli:bg-app-bg polli:outline-none\",\n side === \"right\"\n ? \"polli:ml-auto polli:border-l\"\n : \"polli:border-r\",\n contentClassName,\n )}\n >\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n );\n};\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype BaseDropdownItemProps = {\n className?: string;\n};\n\nexport type DropdownItemProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseDropdownItemProps> & {\n as?: T;\n } & Omit<\n React.ComponentPropsWithoutRef<T>,\n keyof BaseDropdownItemProps | \"as\"\n >;\n\nexport function DropdownItem<T extends React.ElementType = \"button\">({\n as,\n className,\n children,\n ...rest\n}: DropdownItemProps<T>) {\n const Component: React.ElementType = as || \"button\";\n return (\n <Component\n {...(Component === \"button\" ? { type: \"button\" } : undefined)}\n {...rest}\n className={cn(\n \"polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:gap-2 polli:rounded-lg polli:bg-transparent polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:text-theme-text-base polli:no-underline polli:transition-colors polli:hover:bg-theme-bg-hover polli:hover:text-theme-text-hover polli:focus-visible:bg-theme-bg-hover\",\n className,\n )}\n >\n {children}\n </Component>\n );\n}\n","import type { ReactNode } from \"react\";\n\n/** Compact status for both initial loading and background updates. */\nexport function LoadingStatus({ children }: { children: ReactNode }) {\n return (\n <output className=\"polli:flex polli:items-center polli:gap-2 polli:font-body polli:text-sm polli:text-theme-text-muted\">\n <span\n aria-hidden=\"true\"\n className=\"polli:h-4 polli:w-4 polli:shrink-0 polli:animate-spin polli:motion-reduce:animate-none polli:rounded-full polli:border-2 polli:border-current polli:border-r-transparent\"\n />\n {children}\n </output>\n );\n}\n","import { type CSSProperties, forwardRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nconst toNumber = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return value;\n if (typeof value !== \"string\" || value.trim() === \"\") return undefined;\n const numericValue = Number(value);\n return Number.isFinite(numericValue) ? numericValue : undefined;\n};\n\nconst clampPercent = (value: number): number =>\n Math.min(100, Math.max(0, value));\n\nconst getProgressPercent = ({\n progress,\n value,\n defaultValue,\n min,\n max,\n}: {\n progress?: number;\n value: React.ComponentPropsWithoutRef<\"input\">[\"value\"];\n defaultValue: React.ComponentPropsWithoutRef<\"input\">[\"defaultValue\"];\n min: React.ComponentPropsWithoutRef<\"input\">[\"min\"];\n max: React.ComponentPropsWithoutRef<\"input\">[\"max\"];\n}): number | undefined => {\n if (typeof progress === \"number\" && Number.isFinite(progress)) {\n return clampPercent(progress);\n }\n\n const numericValue = toNumber(value ?? defaultValue);\n if (numericValue === undefined) return undefined;\n\n const numericMin = toNumber(min) ?? 0;\n const numericMax = toNumber(max) ?? 100;\n if (numericMax <= numericMin) return 100;\n\n return clampPercent(\n ((numericValue - numericMin) / (numericMax - numericMin)) * 100,\n );\n};\n\nexport type SliderProps = Omit<\n React.ComponentPropsWithoutRef<\"input\">,\n \"type\"\n> & {\n /** Fill percentage from 0-100. Falls back to value/min/max when omitted. */\n progress?: number;\n};\n\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\n (\n { className, defaultValue, max, min, progress, style, value, ...props },\n ref,\n ) => {\n const progressPercent = getProgressPercent({\n progress,\n value,\n defaultValue,\n min,\n max,\n });\n const sliderStyle = {\n ...style,\n ...(progressPercent === undefined\n ? null\n : { \"--polli-slider-progress\": `${progressPercent}%` }),\n } as CSSProperties;\n\n return (\n <input\n ref={ref}\n type=\"range\"\n min={min}\n max={max}\n value={value}\n defaultValue={defaultValue}\n style={sliderStyle}\n className={cn(\"polli-slider\", className)}\n {...props}\n />\n );\n },\n);\n","import type { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype Align = \"left\" | \"center\" | \"right\";\ntype RowIntent = \"default\" | \"warning\" | \"danger\";\ntype SortDirection = \"asc\" | \"desc\";\n\nconst alignClasses: Record<Align, string> = {\n left: \"polli:text-left\",\n center: \"polli:text-center\",\n right: \"polli:text-right\",\n};\n\nconst rowIntentClasses: Record<RowIntent, string> = {\n default: \"\",\n warning: \"polli:bg-intent-warning-bg-light/65\",\n danger: \"polli:bg-intent-danger-bg-light/65\",\n};\n\nexport type TableProps = ComponentPropsWithoutRef<\"table\">;\n\nexport const Table: FC<TableProps> = ({ className, ...rest }) => (\n <table\n {...rest}\n className={cn(\n \"polli:w-full polli:border-collapse polli:text-sm\",\n className,\n )}\n />\n);\n\nexport type TableHeadProps = ComponentPropsWithoutRef<\"thead\">;\n\nexport const TableHead: FC<TableHeadProps> = ({ className, ...rest }) => (\n <thead\n {...rest}\n className={cn(\n \"polli:bg-transparent polli:text-micro polli:text-theme-text-muted\",\n className,\n )}\n />\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\"> & {\n divider?: \"themed\" | \"neutral\";\n};\n\nexport const TableBody: FC<TableBodyProps> = ({\n className,\n divider = \"themed\",\n ...rest\n}) => (\n <tbody\n {...rest}\n className={cn(\n \"polli:divide-y\",\n divider === \"neutral\"\n ? \"polli:divide-divider\"\n : \"polli:divide-theme-border/65\",\n className,\n )}\n />\n);\n\nexport type TableRowProps = ComponentPropsWithoutRef<\"tr\"> & {\n intent?: RowIntent;\n};\n\nexport const TableRow: FC<TableRowProps> = ({\n intent = \"default\",\n className,\n ...rest\n}) => (\n <tr\n {...rest}\n className={cn(\n \"polli:transition-colors polli:hover:bg-theme-bg-subtle\",\n rowIntentClasses[intent],\n className,\n )}\n />\n);\n\nexport type TableHeaderCellProps = Omit<\n ComponentPropsWithoutRef<\"th\">,\n \"children\"\n> & {\n align?: Align;\n active?: boolean;\n sortDirection?: SortDirection;\n onSort?: () => void;\n children: ReactNode;\n};\n\nexport const TableHeaderCell: FC<TableHeaderCellProps> = ({\n align = \"left\",\n active = false,\n sortDirection,\n onSort,\n className,\n children,\n ...rest\n}) => {\n const content = (\n <>\n <span>{children}</span>\n {onSort && (\n <span\n aria-hidden=\"true\"\n className=\"polli:inline-flex polli:w-3 polli:justify-center\"\n >\n {active && sortDirection\n ? sortDirection === \"asc\"\n ? \"↑\"\n : \"↓\"\n : \"\"}\n </span>\n )}\n </>\n );\n\n const classes = cn(\n \"polli:px-3 polli:py-2 polli:font-bold polli:normal-case polli:tracking-wide\",\n alignClasses[align],\n active && \"polli:text-theme-text-strong\",\n onSort &&\n \"polli:cursor-pointer polli:select-none polli:hover:text-theme-text-strong\",\n className,\n );\n\n if (!onSort) {\n return (\n <th {...rest} className={classes}>\n {content}\n </th>\n );\n }\n\n return (\n <th\n {...rest}\n aria-sort={\n active && sortDirection\n ? sortDirection === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n }\n className={classes}\n >\n <button\n type=\"button\"\n onClick={onSort}\n className={cn(\n \"polli-control polli:inline-flex polli:w-full polli:items-center polli:gap-1 polli:bg-transparent polli:p-0 polli:font-bold polli:text-inherit\",\n align === \"right\" && \"polli:justify-end\",\n align === \"center\" && \"polli:justify-center\",\n )}\n >\n {content}\n </button>\n </th>\n );\n};\n\nexport type TableCellProps = ComponentPropsWithoutRef<\"td\"> & {\n align?: Align;\n numeric?: boolean;\n muted?: boolean;\n};\n\nexport const TableCell: FC<TableCellProps> = ({\n align = \"left\",\n numeric = false,\n muted = false,\n className,\n ...rest\n}) => (\n <td\n {...rest}\n className={cn(\n \"polli:px-3 polli:py-2 polli:align-middle\",\n alignClasses[align],\n numeric && \"polli:tabular-nums\",\n muted && \"polli:text-theme-text-muted\",\n className,\n )}\n />\n);\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"./ChevronIcon.tsx\";\n\nexport type TableDisclosureButtonProps = {\n children: ReactNode;\n disabled?: boolean;\n expanded: boolean;\n onClick: () => void;\n className?: string;\n};\n\n/** Compact disclosure trigger for expandable table rows. */\nexport const TableDisclosureButton: FC<TableDisclosureButtonProps> = ({\n children,\n disabled = false,\n expanded,\n onClick,\n className,\n}) => (\n <button\n type=\"button\"\n aria-expanded={expanded}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n \"polli-control polli:inline-flex polli:items-center polli:gap-1.5 polli:rounded-sm polli:text-left polli:text-theme-text-strong polli:transition-colors\",\n disabled\n ? \"polli:cursor-default polli:opacity-60\"\n : \"polli:cursor-pointer polli:hover:text-theme-text-soft\",\n className,\n )}\n >\n <ChevronIcon\n expanded={expanded}\n className=\"polli:text-theme-text-soft\"\n />\n {children}\n </button>\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,IAAAC,gBAAsB;;;ACDtB,kBAAqB;AACrB,4BAAoC;AAEpC,IAAM,cAAU,2CAAoB,EAAE,QAAQ,QAAQ,CAAC;AAGhD,SAAS,MAAM,QAA+C;AACjE,SAAO,YAAQ,kBAAK,GAAG,MAAM,CAAC;AAClC;;;ACiBQ;AAZD,IAAM,cAAoC,CAAC,EAAE,UAAU,UAAU,MACpE;AAAA,EAAC;AAAA;AAAA,IACG,eAAY;AAAA,IACZ,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,WAAW;AAAA,MACP;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,IACJ;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACG,GAAE;AAAA,QACF,MAAK;AAAA,QACL,QAAO;AAAA,QACP,eAAc;AAAA,QACd,gBAAe;AAAA,QACf,aAAY;AAAA;AAAA,IAChB;AAAA;AACJ;;;ACjCJ,qBAAwB;AACxB,oBAAuB;AAEvB,mBAAgC;AA8CxB,IAAAC,sBAAA;AA3CR,IAAM,gBAAgB;AAqBf,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,gBAAY,oBAAM;AACxB,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAS,KAAK;AACtD,QAAM,eAAe,aAAa;AAClC,QAAM,OAAO,eAAe,WAAW;AAEvC,QAAM,UAAU,CAAC,SAAkB;AAC/B,QAAI,CAAC,aAAc,iBAAgB,IAAI;AACvC,mBAAe,IAAI;AAAA,EACvB;AAEA,SACI;AAAA,IAAC,uBAAQ;AAAA,IAAR;AAAA,MACG,KAAK,EAAE,SAAS,UAAU;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,cAAc,CAAC,YAAY,QAAQ,QAAQ,IAAI;AAAA,MAC/C,aAAa;AAAA,QACT,WAAW,GAAG,IAAI,IAAI,KAAK;AAAA,QAC3B,UAAU,YAAY,aAAa;AAAA,MACvC;AAAA,MAEA;AAAA,qDAAC,uBAAQ,SAAR,EAAgB,SAAO,MAAE,kBAAQ,IAAI,GAAE;AAAA,QACxC,6CAAC,wBAAO,UAAU,CAAC,WACf,uDAAC,uBAAQ,YAAR,EACG;AAAA,UAAC,uBAAQ;AAAA,UAAR;AAAA,YACG,mBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,WAAW;AAAA,cACP;AAAA,cACA;AAAA,cACA;AAAA,YACJ;AAAA,YAEC,iBAAO,aAAa,aACf,SAAS,MAAM,QAAQ,KAAK,CAAC,IAC7B;AAAA;AAAA,QACV,GACJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;ACnEQ,IAAAC,sBAAA;AAVR,IAAM,cAAc;AAAA,EAChB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AACpB;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI;AAAA,IAC7B,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,eAAe,OAAkB;AAC7C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,yBAAwB,GACpC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,UAAS;AAAA,IACjB,6CAAC,UAAK,GAAE,kEAAiE;AAAA,IACzE,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,aAAY;AAAA,IACpB,6CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,mBAAkB;AAAA,IAC1B,6CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,4CAA2C;AAAA,IACnD,6CAAC,UAAK,GAAE,8CAA6C;AAAA,KACzD;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,8BAA6B;AAAA,IACrC,6CAAC,UAAK,GAAE,0BAAyB;AAAA,IACjC,6CAAC,UAAK,GAAE,gEAA+D;AAAA,IACvE,6CAAC,UAAK,GAAE,mIAAkI;AAAA,KAC9I;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAY;AAAA,MACZ,SAAQ;AAAA,MACP,GAAG;AAAA,MACJ,aAAa;AAAA,MACZ,GAAG;AAAA,MAEJ,uDAAC,cAAS,QAAO,kBAAiB;AAAA;AAAA,EACtC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,2DAA0D;AAAA,KACtE;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,eAAc;AAAA,KAC1B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,6CAAC,SAAI,SAAQ,aAAY,eAAY,QAAQ,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B;AAAA,MAAC;AAAA;AAAA,QACG,IAAG;AAAA,QACH,IAAG;AAAA,QACH,GAAE;AAAA,QACF,MAAK;AAAA,QACL,QAAO;AAAA;AAAA,IACX;AAAA,KACJ;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,6CAAC,cAAS,QAAO,oBAAmB;AAAA,IACpC,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI;AAAA,KACzC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,yCAAwC,GACpD;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C,uDAAC,UAAK,MAAK,gBAAe,GAAE,qBAAoB,GACpD;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,OAC5C,uDAAC,UAAK,MAAK,gBAAe,GAAE,8BAA6B,GAC7D;AAER;AAEO,SAAS,gBAAgB,OAAkB;AAC9C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,qEAAoE;AAAA,IAC5E,6CAAC,UAAK,GAAE,qCAAoC;AAAA,KAChD;AAER;AAEO,SAAS,iBAAiB,OAAkB;AAC/C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,sBAAqB,GACjC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,mCAAkC;AAAA,IAC1C,6CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,IACnC,6CAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI;AAAA,IAC7B,6CAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI;AAAA,IAC7B,6CAAC,UAAK,GAAE,uBAAsB;AAAA,KAClC;AAER;AAEO,SAAS,mBAAmB,OAAkB;AACjD,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,kCAAiC;AAAA,KAC7C;AAER;AAEO,SAAS,kBAAkB,OAAkB;AAChD,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,qHAAoH;AAAA,IAC5H,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,kCAAiC;AAAA,KAC7C;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,qIAAoI,GAChJ;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,6CAAC,SAAI,SAAQ,aAAY,eAAY,QAAQ,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,6CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6BAA4B;AAAA,IACpC,6CAAC,UAAK,GAAE,gBAAe;AAAA,IACvB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,mBAAkB;AAAA,IAC1B,6CAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI;AAAA,IAC7B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,KAClC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,IACxD,6CAAC,UAAK,GAAE,4BAA2B;AAAA,KACvC;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,6CAA4C;AAAA,KACxD;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,2CAA0C;AAAA,IAClD,6CAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,gBAAe;AAAA,KAC3B;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IACjD,6CAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IAClD,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,2BAA0B,GACtC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6EAA4E;AAAA,IACpF,6CAAC,UAAK,GAAE,yCAAwC;AAAA,IAChD,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,oBAAmB,GAC/B;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,cAAS,QAAO,iBAAgB;AAAA,IACjC,6CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,KAC1C;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,sHAAqH,GACjI;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM,MAAK,gBAAe,QAAO,QAAO;AAAA,KACtE;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,wCAAuC,GACnD;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,wBAAuB;AAAA,IAC/B,6CAAC,UAAK,GAAE,gBAAe;AAAA,IACvB,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,oBAAmB;AAAA,KAC/B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,iFAAgF;AAAA,IACxF,6CAAC,UAAK,GAAE,qBAAoB;AAAA,KAChC;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,cAAS,QAAO,wBAAuB;AAAA,IACxC,6CAAC,cAAS,QAAO,mBAAkB;AAAA,KACvC;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,aAAQ,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,IACtC,6CAAC,UAAK,GAAE,8CAA6C;AAAA,IACrD,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,2CAA0C;AAAA,IAClD,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,4DAA2D;AAAA,IACnE,6CAAC,UAAK,GAAE,4EAA2E;AAAA,IACnF,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,MAAK,gBAAe;AAAA,KACzD;AAER;AAGO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,mDAAkD;AAAA,IAC1D,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,gDAA+C,GAC3D;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,sGAAqG;AAAA,KACjH;AAER;AAEO,SAAS,MAAM,OAAkB;AACpC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,wBAAuB,GACnC;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,cAAa;AAAA,IACrB,6CAAC,UAAK,GAAE,oBAAmB;AAAA,IAC3B,6CAAC,UAAK,GAAE,oBAAmB;AAAA,KAC/B;AAER;AAIO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,iEAAgE,GAC5E;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,0CAAyC;AAAA,IACjD,6CAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAI;AAAA,IAC7B,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,KAClC;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,gDAA+C;AAAA,IACvD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,KAClC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,gDAA+C;AAAA,IACvD,6CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,cAAa;AAAA,KACzB;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,oBAAmB;AAAA,IAC3B,6CAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,KACpD;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,wDAAuD;AAAA,IAC/D,6CAAC,UAAK,GAAE,8BAA6B;AAAA,IACrC,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,wBAAuB;AAAA,IAC/B,6CAAC,UAAK,GAAE,gCAA+B;AAAA,IACvC,6CAAC,UAAK,GAAE,mCAAkC;AAAA,KAC9C;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,0BAAyB;AAAA,IACjC,6CAAC,UAAK,GAAE,uBAAsB;AAAA,KAClC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,uHAAsH,GAClI;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,6FAA4F;AAAA,IACpG,6CAAC,UAAK,GAAE,mGAAkG;AAAA,IAC1G,6CAAC,UAAK,GAAE,0CAAyC;AAAA,IACjD,6CAAC,UAAK,GAAE,2CAA0C;AAAA,KACtD;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,6CAAC,UAAK,GAAE,kBAAiB;AAAA,KAC7B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,2CAA0C;AAAA,IAClD,6CAAC,UAAK,GAAE,kBAAiB;AAAA,IACzB,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,gCAA+B;AAAA,KAC3C;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,0OAAyO;AAAA,IACjP,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,WAAU;AAAA,IAClB,6CAAC,UAAK,GAAE,WAAU;AAAA,KACtB;AAER;AAEO,SAAS,SAAS;AAAA,EACrB,SAAS;AAAA,EACT,GAAG;AACP,GAAqC;AACjC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAY;AAAA,MACZ,SAAQ;AAAA,MACP,GAAG;AAAA,MACJ,MAAM,SAAS,iBAAiB;AAAA,MAC/B,GAAG;AAAA,MAEJ,uDAAC,aAAQ,QAAO,kGAAiG;AAAA;AAAA,EACrH;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,6CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,uDAAC,UAAK,GAAE,+BAA8B,GAC1C;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,aAAQ,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,IACtC,6CAAC,UAAK,GAAE,4BAA2B;AAAA,IACnC,6CAAC,UAAK,GAAE,wBAAuB;AAAA,KACnC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,6BAA4B;AAAA,IACpC,6CAAC,UAAK,GAAE,6FAA4F;AAAA,IACpG,6CAAC,UAAK,GAAE,sFAAqF;AAAA,KACjG;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,gDAA+C;AAAA,KAC3D;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,OAAM,IAAG,QAAO,GAAE,OAAM;AAAA,IACnC,6CAAC,UAAK,GAAE,iBAAgB;AAAA,IACxB,6CAAC,UAAK,GAAE,2BAA0B;AAAA,KACtC;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/B,6CAAC,UAAK,GAAE,mDAAkD;AAAA,IAC1D,6CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,YAAW;AAAA,IACnB,6CAAC,UAAK,GAAE,kBAAiB;AAAA,KAC7B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,iDAAC,UAAK,GAAE,8BAA6B;AAAA,IACrC,6CAAC,UAAK,GAAE,cAAa;AAAA,KACzB;AAER;;;AJhsBQ,IAAAC,sBAAA;AAhCR,SAAS,SAAS,MAAc;AAC5B,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,YAAY;AAChE,SAAO,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,MAAM,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,YAAY;AACxE;AAEA,SAAS,cAAc;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACb,GAOG;AACC,QAAM,OAAO,SACP,wBACA,oBAAoB,OAClB,0BACA;AACR,QAAM,YAAY;AAAA,IACd;AAAA,IACA,UACI;AAAA,EACR;AACA,QAAM,SAAS,YACX;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,KAAI;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA;AAAA,EACJ,IAEA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY,GAAG,IAAI;AAAA,MACnB,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC,mBAAS,IAAI;AAAA;AAAA,EAClB;AAEJ,SAAO,gBACH;AAAA,IAAC;AAAA;AAAA,MACG,MAAM;AAAA,MACN,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,cAAW;AAAA,MACX,OAAM;AAAA,MACN,WAAU;AAAA,MAET;AAAA;AAAA,EACL,IAEA;AAER;AAmBO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAyB;AACrB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACJ;AAAA,QACA,6CAAC,kBAAe,MAAY,kBAAoC;AAAA;AAAA;AAAA,EACpE;AAER;AAGO,SAAS,oBAAoB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAA6B;AACzB,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAW;AAAA;AAAA,QAEP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA,qDAAC,iBAAc,MAAY,WAAsB,QAAM,MAAC;AAAA,QACxD,6CAAC,kBAAe,MAAY;AAAA,QAE5B;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACd;AAAA;AAAA;AAAA,EACJ;AAER;AAEA,SAAS,eAAe;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACJ,GAIG;AACC,SACI,8CAAC,UAAK,WAAU,6EACZ;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,QACP,WAAU;AAAA,QAET;AAAA;AAAA,IACL;AAAA,IACC,oBAAoB,QACjB;AAAA,MAAC;AAAA;AAAA,QACG,IAAI;AAAA,QACJ,WAAU;AAAA,QAET;AAAA;AAAA,IACL;AAAA,KAER;AAER;AAcO,SAAS,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY,oBAAoB,IAAI;AACxC,GAAqB;AACjB,QAAM,eAAW,qBAAM;AACvB,QAAM,SACF;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACJ;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAW;AAAA,MACX,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA,yBAAiB;AAAA,QAClB;AAAA,UAAC;AAAA;AAAA,YACG,OAAM;AAAA,YACN;AAAA,YACA,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YACA,SAAS,CAAC,SACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY;AAAA,gBACZ,oBACI,oBAAoB,OAAO,WAAW;AAAA,gBAE1C,WAAU;AAAA,gBAET;AAAA,mBAAC,iBAAiB;AAAA,kBACnB;AAAA,oBAAC;AAAA;AAAA,sBACG;AAAA,sBACA;AAAA,sBACA,aAAa;AAAA;AAAA,kBACjB;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU;AAAA,sBACV,WAAU;AAAA;AAAA,kBACd;AAAA;AAAA;AAAA,YACJ;AAAA,YAGH;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACJ;AAER;;;AKlKQ,IAAAC,sBAAA;AA3ER,IAAM,qBAAkD;AAAA,EACpD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,MAAM;AACV;AAEA,IAAM,kBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACX;AAEA,IAAM,kBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACX;AAEA,IAAM,oBAAgD;AAAA,EAClD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AACV;AAEO,SAAS,iBAAiB,MAAmB,WAAoB;AACpE,SAAO;AAAA,IACH;AAAA,IACA,mBAAmB,IAAI;AAAA,IACvB;AAAA,EACJ;AACJ;AAEA,SAAS,cAAc;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAKG;AACC,SAAO;AAAA,IACH;AAAA,IACA,gBAAgB,IAAI;AAAA,IACpB,gBAAgB,IAAI;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB;AAAA,EACJ;AACJ;AAWO,SAAS,QAAsC;AAAA,EAClD;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAAY,MAAM;AACxB,SACI,6CAAC,aAAW,GAAG,MAAM,WAAW,iBAAiB,MAAM,SAAS,GAC3D,UACL;AAER;AAaO,SAAS,KAAkC;AAAA,EAC9C;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAiB;AACb,QAAM,YAAY,MAAM;AACxB,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW,cAAc,EAAE,MAAM,MAAM,QAAQ,UAAU,CAAC;AAAA,MAEzD;AAAA;AAAA,EACL;AAER;;;ACtFY,IAAAC,sBAAA;AA9BZ,IAAM,gBAA6C;AAAA,EAC/C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACZ;AAOO,IAAM,QAAwB,CAAC;AAAA,EAClC,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,MAAM,WAAW,WAAW,UAAU;AAAA,IACtC,WAAW;AAAA,MACP;AAAA,MACA,WAAW,cAAc;AAAA,MACzB,cAAc,MAAM;AAAA,MACpB;AAAA,IACJ;AAAA,IAEC;AAAA,iBAAW,cACR,6CAAC,eAAY,WAAU,kFAAiF;AAAA,MAE5G,8CAAC,SAAI,WAAU,iBACV;AAAA,kBACI,WAAW,aACR,8EACI;AAAA,uDAAC,YAAO,WAAU,oDACb,iBACL;AAAA,UAAU;AAAA,UAAI;AAAA,UACZ;AAAA,WACN,IAEA;AAAA,UAAC;AAAA;AAAA,YACG,IAAG;AAAA,YACH,MAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAU;AAAA,YAET;AAAA;AAAA,QACL;AAAA,QAEP;AAAA,SACL;AAAA;AAAA;AACJ;A;;;;;;;;ACzCI,IAAAC,sBAAA;AAVR,IAAM,OAAO,CAAC,SAAgC;AAAA,EAC1C,YAAY,QAAQ,GAAG;AAAA,EACvB,MAAM,QAAQ,GAAG;AACrB;AAEA,IAAM,QAAQ,EAAE,MAAM,KAAK,YAAO,GAAG,QAAQ,KAAK,yBAAS,EAAE;AAGtD,SAAS,UAAU,EAAE,UAAU,QAAQ,UAAU,GAAmB;AACvE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAY;AAAA,MACZ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACA,OAAO,MAAM,OAAO;AAAA;AAAA,EACxB;AAER;;;ACXQ,IAAAC,sBAAA;AAPD,SAAS,SAAS;AAAA,EACrB;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AACJ,GAAkB;AACd,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,SAAS,OAAO,gBAAgB;AAAA,QAChC;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,WACI,SAAS,OACH,wBACA;AAAA;AAAA,QAEd;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,SAAS,OAAO,mBAAmB;AAAA,YACvC;AAAA,YAEC;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACJ;AAER;;;AC1CA,IAAAC,gBAAoC;AAiGhB,IAAAC,sBAAA;AA5EpB,SAAS,aAAa,QAA8B;AAChD,SAAO,WAAW,SACZ,OAAO,UACN,OAAuB;AAClC;AAEO,SAAS,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACJ,GAAmB;AACf,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAE1C,+BAAU,MAAM;AACZ,QAAI,CAAC,YAAY,OAAO,WAAW,aAAa;AAC5C,gBAAU,KAAK;AACf;AAAA,IACJ;AAEA,UAAM,SAAS,iBAAiB,WAAW;AAC3C,QAAI,gBAAgB,aAAa,MAAM;AACvC,QAAI,UAAU;AAEd,UAAM,eAAe,MAAM;AACvB,UAAI,QAAS;AAEb,gBAAU,OAAO,sBAAsB,MAAM;AACzC,kBAAU;AACV,cAAM,gBAAgB,aAAa,MAAM;AACzC,cAAM,QAAQ,gBAAgB;AAE9B,YAAI,gBAAgB,IAAI;AACpB,oBAAU,KAAK;AAAA,QACnB,WAAW,QAAQ,GAAG;AAClB,oBAAU,IAAI;AAAA,QAClB,WAAW,QAAQ,IAAI;AACnB,oBAAU,KAAK;AAAA,QACnB;AAEA,wBAAgB;AAAA,MACpB,CAAC;AAAA,IACL;AAEA,WAAO,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;AAEjE,WAAO,MAAM;AACT,UAAI,QAAS,QAAO,qBAAqB,OAAO;AAChD,aAAO,oBAAoB,UAAU,YAAY;AAAA,IACrD;AAAA,EACJ,GAAG,CAAC,UAAU,eAAe,CAAC;AAE9B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,SAAS,4BAA4B;AAAA,QACrC;AAAA,MACJ;AAAA,MACA,gBAAgB,MAAM,UAAU,KAAK;AAAA,MAErC;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA;AAAA,UACJ;AAAA,UAEC;AAAA,sBACG,6CAAC,YAAS,SAAkB,MAAM,WAAW,IAE7C;AAAA,cAAC;AAAA;AAAA,gBACG,MAAM,aAAa;AAAA,gBACnB,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBAEV;AAAA,+DAAC,UAAK,WAAU,iBAAiB,sBAAW;AAAA,kBAC5C;AAAA,oBAAC;AAAA;AAAA,sBACG,SAAQ;AAAA,sBACR,WAAU;AAAA;AAAA,kBACd;AAAA;AAAA;AAAA,YACJ;AAAA,YAEH,WACG;AAAA,cAAC;AAAA;AAAA,gBACG,cAAY;AAAA,gBACZ,WAAW;AAAA,kBACP;AAAA,kBACA;AAAA,gBACJ;AAAA,gBAEC;AAAA;AAAA,YACL,IACA;AAAA;AAAA;AAAA,MACR;AAAA;AAAA,EACJ;AAER;;;ACnFQ,IAAAC,uBAAA;AAvCR,IAAM,iBAAiD;AAAA;AAAA;AAAA,EAGnD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eACI;AACR;AAsBO,SAAS,QAAuC;AAAA,EACnD;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAAyB,MAAM;AAErC,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW,GAAG,iBAAiB,eAAe,OAAO,GAAG,SAAS;AAAA,MAEhE;AAAA;AAAA,EACL;AAER;;;ACpBY,IAAAC,uBAAA;AAjBL,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACJ,GAAiB;AACb,SACI;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH,SAAQ;AAAA,MACR,WAAW;AAAA,QACP;AAAA,QACA,SAAS,SAAS,6BAA6B;AAAA,QAC/C;AAAA,MACJ;AAAA,MAEA;AAAA,uDAAC,SAAI,WAAU,0DACX;AAAA;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,WAAU;AAAA,cAET;AAAA;AAAA,UACL;AAAA,UACA,8CAAC,QAAK,WAAU,mCAAmC,gBAAK;AAAA,WAC5D;AAAA,QACA,8CAAC,SAAI,WAAU,6DACV,UACL;AAAA;AAAA;AAAA,EACJ;AAER;;;AC7CA,IAAAC,gBAIO;;;ACJP,IAAAC,gBASO;AA4GK,IAAAC,uBAAA;AAvGZ,IAAM,cAA0C;AAAA,EAC5C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,MAAM;AACV;AAeA,SAAS,UAAa,KAAyB,OAAiB;AAC5D,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,CAAC,IAAmC,UAAU;AAChE;AAGO,IAAM,iBAAa;AAAA,EACtB,CACI,EAAE,OAAO,KAAK,YAAY,UAAU,WAAW,UAAU,GAAG,KAAK,GACjE,gBACC;AACD,UAAM,eAAW,sBAA8B,IAAI;AAEnD,UAAM,aAAS;AAAA,MACX,CAAC,SAAgC;AAC7B,iBAAS,UAAU;AACnB,kBAAU,aAAa,IAAI;AAAA,MAC/B;AAAA,MACA,CAAC,WAAW;AAAA,IAChB;AAEA,iCAAU,MAAM;AACZ,UAAI,cAAc,SAAU;AAC5B,YAAM,UAAU,SAAS;AACzB,UAAI,CAAC,QAAS;AAEd,UAAI,YAA2B;AAE/B,YAAM,iBAAiB,MAAM;AACzB,YAAI,cAAc,MAAM;AACpB,iBAAO,aAAa,SAAS;AAC7B,sBAAY;AAAA,QAChB;AAAA,MACJ;AAEA,YAAM,OAAO,MAAM;AACf,gBAAQ,QAAQ,kBAAkB;AAClC,uBAAe;AAAA,MACnB;AAEA,YAAM,OAAO,MAAM;AACf,gBAAQ,QAAQ,kBAAkB;AAClC,uBAAe;AAAA,MACnB;AAEA,YAAM,eAAe,MAAM;AACvB,uBAAe;AACf,oBAAY,OAAO,WAAW,MAAM,GAAI;AAAA,MAC5C;AAEA,YAAM,oBAAoB,MAAM;AAC5B,aAAK;AACL,qBAAa;AAAA,MACjB;AAEA,WAAK;AAEL,cAAQ,iBAAiB,UAAU,mBAAmB;AAAA,QAClD,SAAS;AAAA,MACb,CAAC;AACD,cAAQ,iBAAiB,SAAS,mBAAmB;AAAA,QACjD,SAAS;AAAA,MACb,CAAC;AACD,cAAQ,iBAAiB,cAAc,mBAAmB;AAAA,QACtD,SAAS;AAAA,MACb,CAAC;AACD,cAAQ,iBAAiB,eAAe,iBAAiB;AACzD,cAAQ,iBAAiB,WAAW,iBAAiB;AACrD,cAAQ,iBAAiB,WAAW,iBAAiB;AACrD,cAAQ,iBAAiB,YAAY,YAAY;AAEjD,aAAO,MAAM;AACT,uBAAe;AACf,gBAAQ,oBAAoB,UAAU,iBAAiB;AACvD,gBAAQ,oBAAoB,SAAS,iBAAiB;AACtD,gBAAQ,oBAAoB,cAAc,iBAAiB;AAC3D,gBAAQ,oBAAoB,eAAe,iBAAiB;AAC5D,gBAAQ,oBAAoB,WAAW,iBAAiB;AACxD,gBAAQ,oBAAoB,WAAW,iBAAiB;AACxD,gBAAQ,oBAAoB,YAAY,YAAY;AAAA,MACxD;AAAA,IACJ,GAAG,CAAC,SAAS,CAAC;AAEd,WACI;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ,KAAK;AAAA,QACL,WAAW;AAAA,UACP,cAAc,YAAY;AAAA,UAC1B;AAAA,UACA,YAAY,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,QAEC;AAAA;AAAA,IACL;AAAA,EAER;AACJ;AAEA,WAAW,cAAc;;;AD5FjB,IAAAC,uBAAA;AAhBD,IAAM,uBAAmB;AAAA,EAI5B,CACI;AAAA,IACI;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,IACnB;AAAA,IACA,oBAAoB;AAAA,IACpB,GAAG;AAAA,EACP,GACA,QAEA,+CAAC,SAAI,WAAW,GAAG,gCAAgC,SAAS,GACxD;AAAA;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ;AAAA,QACA,WAAW,GAAG,8BAA8B,iBAAiB;AAAA,QAE5D;AAAA;AAAA,IACL;AAAA,IACC,oBAAoB,oBACjB;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAU;AAAA,QAEV,wDAAC,kBAAe,WAAU,gCAA+B;AAAA;AAAA,IAC7D;AAAA,KAER;AAER;AAEA,iBAAiB,cAAc;AAIxB,SAAS,wBAAwB;AAAA,EACpC;AAAA,EACA,GAAG;AACP,GAAiC;AAC7B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;AE9DQ,IAAAC,uBAAA;AAPD,SAAS,YAAY;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAqB;AACjB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,aAAW;AAAA,MACX,WAAW;AAAA,QACP;AAAA,QACA,SAAS,SACH,wEACA;AAAA,QACN;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;AAQO,SAAS,kBAAkB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAA2B;AACvB,QAAM,UACF,UACC,SAAS,SAAS,QAAQ,SAAS,cAAc,UAAU;AAChE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,iBAAS,gBACL,QACG,8CAAC,UAAK,WAAU,4IACZ,wDAAC,aAAU,WAAU,kBAAiB,GAC1C;AAAA,QAER;AAAA,UAAC;AAAA;AAAA,YACG,IAAG;AAAA,YACH,MAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAO;AAAA,YACP,WAAU;AAAA,YAET;AAAA;AAAA,QACL;AAAA;AAAA;AAAA,EACJ;AAER;AAIO,SAAS,mBAAmB;AAAA,EAC/B;AAAA,EACA,GAAG;AACP,GAA4B;AACxB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;AAIO,SAAS,mBAAmB;AAAA,EAC/B;AAAA,EACA,GAAG;AACP,GAA4B;AACxB,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;AC9GA,IAAAC,gBAIO;;;ACJP,IAAAC,gBAA2B;AASnB,IAAAC,uBAAA;AAFD,IAAM,eAAW;AAAA,EACpB,CAAC,EAAE,WAAW,OAAO,OAAO,GAAG,GAAG,MAAM,GAAG,QACvC;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,cAAY,QAAQ,SAAS;AAAA,MAC7B,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;AAEA,SAAS,cAAc;;;ADVf,IAAAC,uBAAA;AAFD,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAAyB;AAC3E,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW,GAAG,qCAAqC,SAAS;AAAA,MAC3D,GAAG;AAAA;AAAA,EACR;AAER;AAEO,IAAM,yBAAqB,0BAGhC,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,QACxB;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ;AAAA,IACA,WAAW,GAAG,qBAAqB,SAAS;AAAA;AAChD,CACH;AAED,mBAAmB,cAAc;AAO1B,SAAS,sBAAsB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAA+B;AAC3B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH,sBACG,gFACI;AAAA,sDAAC,SAAI,WAAU,6DACV,iBACL;AAAA,QACA,8CAAC,SAAI,WAAU,2DACV,eACL;AAAA,SACJ;AAAA;AAAA,EAER;AAER;;;AEpEA,IAAAC,gBAOO;;;ACqIC,IAAAC,uBAAA;AAjIR,IAAM,YAAY;AAAA,EACd,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAM,cAAc;AAAA,EAChB,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAM,oBAAsD;AAAA,EACxD,MAAM;AAAA,EACN,QACI;AAER;AAGA,IAAM,eACF;AAKJ,IAAM,WACF;AAEJ,IAAMC,iBAA8C;AAAA,EAChD,OAAO,GAAG,QAAQ;AAAA,EAClB,QACI,GAAG,QAAQ;AAAA,EAGf,QACI;AAAA,EAGJ,MACI;AAAA;AAAA,EAGJ,SACI;AAER;AAaA,IAAM,gBAAgB,CAAC;AAAA,EACnB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAgE;AAC5D,QAAM,eAAe,SAASA,eAAc,MAAM,IAAI;AACtD,QAAMC,eAAc,eAAe,WAAW,cAAc;AAC5D,SAAO;AAAA,IACH;AAAA;AAAA,IAEA,OACM,0BACA,WACE,8CACA;AAAA,IACR;AAAA,IACA,kBAAkB,UAAU;AAAA,IAC5BA,aAAY,QAAQ,IAAI;AAAA,IACxB;AAAA,EACJ;AACJ;AAOO,SAAS,OAA+C;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAmB;AACf,QAAM,YAA+B,MAAM;AAC3C,QAAM,WAAW,cAAc;AAC/B,QAAM,WAAW,cAAc;AAC/B,QAAM,aACF,YAGF;AACF,QAAM,UACF,YAGF;AACF,QAAM,WACF,YACF,WAAW;AACb,QAAM,OAAO,aAAa,QAAQ,aAAa;AAC/C,QAAM,cAAc,WACd,CAAC,UAA2B;AACxB,UAAM,eAAe;AACrB,UAAM,gBAAgB;AAAA,EAC1B,IACA;AAEN,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,eAAa;AAAA,MACZ,GAAI,WAAW,EAAE,MAAM,cAAc,UAAU,SAAS,IAAI,CAAC;AAAA,MAC7D,GAAI,CAAC,YAAY,WACZ,EAAE,iBAAiB,MAAM,UAAU,GAAG,IACtC,CAAC;AAAA,MACN,GAAI,YAAY,WAAW,EAAE,MAAM,OAAU,IAAI,CAAC;AAAA,MACnD,SAAS;AAAA,MACT,WAAW,cAAc;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,MAEA;AAAA,gBACG;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA,YAET,iBACG,8CAAC,UAAK,WAAU,qKAAoK,IAEpL;AAAA;AAAA,QAER;AAAA,QAEH;AAAA;AAAA;AAAA,EACL;AAER;;;AC7KA,IAAAC,gBAUO;AACP,uBAA6B;AA+IrB,IAAAC,uBAAA;AA5IR,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAuBzB,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,uBAAuB;AAAA,EACvB;AAAA,EACA,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,kBAAkB;AACtB,MAAM;AACF,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAK3C;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACJ,CAAC;AACD,QAAM,iBAAa,sBAA2B,IAAI;AAClD,QAAM,mBAAe,sBAAO,KAAK;AACjC,QAAM,gBAAY,qBAAM;AAExB,QAAM,eAAe,MAAM;AACvB,iBAAa,UAAU;AACvB,mBAAe,KAAK;AAAA,EACxB;AAEA,+BAAU,MAAM;AACZ,QAAI,CAAC,YAAa;AAElB,UAAM,sBAAsB,CAAC,UAAwB;AACjD,UAAI,WAAW,SAAS,SAAS,MAAM,MAAc,EAAG;AACxD,mBAAa,UAAU;AACvB,qBAAe,KAAK;AAAA,IACxB;AACA,UAAM,kBAAkB,CAAC,UAAoC;AACzD,UAAI,MAAM,QAAQ,SAAU;AAC5B,mBAAa,UAAU;AACvB,qBAAe,KAAK;AAAA,IACxB;AACA,UAAM,0BAA0B,MAAM;AAClC,mBAAa,UAAU;AACvB,qBAAe,KAAK;AAAA,IACxB;AAEA,aAAS,iBAAiB,eAAe,mBAAmB;AAC5D,aAAS,iBAAiB,WAAW,eAAe;AACpD,WAAO,iBAAiB,UAAU,yBAAyB;AAAA,MACvD,SAAS;AAAA,MACT,SAAS;AAAA,IACb,CAAC;AACD,WAAO,iBAAiB,UAAU,uBAAuB;AACzD,WAAO,MAAM;AACT,eAAS,oBAAoB,eAAe,mBAAmB;AAC/D,eAAS,oBAAoB,WAAW,eAAe;AACvD,aAAO,oBAAoB,UAAU,yBAAyB,IAAI;AAClE,aAAO,oBAAoB,UAAU,uBAAuB;AAAA,IAChE;AAAA,EACJ,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,wBAAwB,MAAM;AAChC,QAAI,WAAW,SAAS;AACpB,YAAM,OAAO,WAAW,QAAQ,sBAAsB;AACtD,YAAM,oBAAoB,KAAK;AAAA,QAC3B;AAAA,QACA,OAAO,aAAa,0BAA0B;AAAA,MAClD;AACA,UAAI,OACA,UAAU,WAAW,KAAK,OAAO,KAAK,QAAQ,IAAI,KAAK;AAC3D,UAAI,YACA,UAAU,WAAW,qBAAqB;AAC9C,UAAI,iBAAiB;AACjB,eAAO,KAAK;AAAA,UACR,KAAK,IAAI,KAAK,MAAM,uBAAuB;AAAA,UAC3C,KAAK;AAAA,YACD;AAAA,YACA,OAAO,aACH,oBACA;AAAA,UACR;AAAA,QACJ;AACA,oBAAY;AAAA,MAChB;AACA,yBAAmB;AAAA,QACf,KAAK,KAAK,SAAS;AAAA,QACnB;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAGA,QAAM,mBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,cAAc,kBACd,mBACA;AAIN,QAAM,eACF;AAEJ,QAAM,YAAY,UACd;AAAA,IAAC;AAAA;AAAA,MACG,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,eAAa,CAAC;AAAA,MACd,OAAO;AAAA,QACH,KAAK,gBAAgB;AAAA,QACrB,MAAM,gBAAgB;AAAA,QACtB,UAAU,gBAAgB;AAAA,QAC1B,WAAW,gBAAgB;AAAA,MAC/B;AAAA,MACA,WAAW,GACP,cACM,oCACA,iCACV,IAAI,YAAY;AAAA,MAEf;AAAA;AAAA,EACL,IACA;AACJ,QAAM,eACF,aAAa,OAAO,aAAa,kBAC3B;AAAA,IACI;AAAA,IACA,WAAW,SAAS,QAAQ,iBAAiB,KACzC,SAAS;AAAA,EACjB,IACA;AACV,QAAM,cACF,gFACI;AAAA,kDAAC,UAAK,WAAW,aAAc,UAAS;AAAA,IACvC;AAAA,KACL;AAGJ,QAAM,cAAc;AAAA,IAChB,cAAc;AAAA,IACd,oBAAoB,WAAW,cAAc,YAAY;AAAA,IACzD,WAAW;AAAA,IACX,cAAc,MAAM;AAChB,4BAAsB;AACtB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,cAAc,MAAM;AAChB,UAAI,CAAC,aAAa,QAAS,gBAAe,KAAK;AAAA,IACnD;AAAA,IACA,SAAS,CAAC,MAAkB;AACxB,UAAI,qBAAsB,GAAE,gBAAgB;AAC5C,UAAI,SAAS;AACT,gBAAQ;AAAA,MACZ;AACA,UAAI,CAAC,cAAc,CAAC,QAAS;AAC7B,4BAAsB;AACtB,UAAI,aAAa,SAAS;AACtB,qBAAa;AACb;AAAA,MACJ;AACA,mBAAa,UAAU;AACvB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,SAAS,MAAM;AACX,4BAAsB;AACtB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACJ;AAEA,MAAI,cAAc,QAAQ;AACtB,UAAM,gBAAgB,CAAC,UAA0C;AAC7D,UAAI,CAAC,cAAc,CAAC,QAAS;AAC7B,UAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,IAAK;AAChD,YAAM,eAAe;AACrB,4BAAsB;AACtB,UAAI,aAAa,SAAS;AACtB,qBAAa;AACb;AAAA,MACJ;AACA,mBAAa,UAAU;AACvB,qBAAe,IAAI;AAAA,IACvB;AACA,UAAM,uBAAuB;AAAA,MACzB,GAAG;AAAA,MACH,MAAM,cAAc,UAAU,WAAW;AAAA,MACzC,UAAU,cAAc,UAAU,IAAI;AAAA,MACtC,WAAW,cAAc,UAAU,gBAAgB;AAAA,IACvD;AAEA,WACI;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,CAAC,SAAS;AACX,qBAAW,UAAU;AAAA,QACzB;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,IACL;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK,CAAC,SAAS;AACX,mBAAW,UAAU;AAAA,MACzB;AAAA,MACA,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,oBAAkB,WAAW,cAAc,YAAY;AAAA,MACvD,WAAW;AAAA,MACX,cAAc,YAAY;AAAA,MAC1B,cAAc,YAAY;AAAA,MAC1B,SAAS,YAAY;AAAA,MACrB,SAAS,YAAY;AAAA,MACrB,QAAQ,YAAY;AAAA,MACpB;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AF/LQ,IAAAC,uBAAA;AA9CD,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,iBAAa,sBAA6C,IAAI;AAEpE;AAAA,IACI,MAAM,MAAM;AACR,UAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AAAA,IAC3D;AAAA,IACA,CAAC;AAAA,EACL;AAEA,iBAAe,WAAW,OAAsC;AAC5D,UAAM,gBAAgB;AACtB,QAAI;AACA,YAAM,OAAO,OAAO,UAAU,aAAa,MAAM,MAAM,IAAI;AAC3D,YAAM,UAAU,UAAU,UAAU,IAAI;AACxC,gBAAU,IAAI;AACd,iBAAW;AACX,UAAI,WAAW,QAAS,cAAa,WAAW,OAAO;AACvD,iBAAW,UAAU;AAAA,QACjB,MAAM,UAAU,KAAK;AAAA,QACrB;AAAA,MACJ;AAAA,IACJ,SAAS,OAAO;AACZ,oBAAc,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,UAAU,YAAY,WAAW,SAAS;AAChD,QAAM,SACF;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACH,GAAI,YAAY,YAAY,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MACpD,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,QACP;AAAA,QACA,YAAY,WACN,6BACA;AAAA,QACN,OAAO,cAAc,aAAa,UAAU,MAAM,IAAI;AAAA,MAC1D;AAAA,MAEC,iBAAO,aAAa,aAAa,SAAS,MAAM,IAAI;AAAA;AAAA,EACzD;AAKJ,MAAI,YAAY,MAAM;AAClB,WAAO;AAAA,EACX;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAS,SAAS,gBAAgB;AAAA,MAClC,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,iBAAe;AAAA,MACf,YAAY;AAAA,MACZ,WAAW;AAAA,QACP,YAAY,WACN,6BACA;AAAA,QACN;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AG3FgB,IAAAC,uBAAA;AAlBT,IAAM,YAAgC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,QAAM,QAAQ,YAAY;AAE1B,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA,uDAAC,SAAI,WAAU,kIACX;AAAA,wDAAC,UAAK,WAAU,sIACX,iBACL;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,cACP,SAAS;AAAA,cACT,cAAW;AAAA,cACX,WAAU;AAAA,cAET,WAAC,WACE,gFACK;AAAA,yBACG,8CAAC,aAAU,WAAU,kBAAiB,IAEtC,8CAAC,iBAAc,WAAU,kBAAiB;AAAA,gBAE9C,8CAAC,UAAM,mBAAS,WAAW,QAAO;AAAA,iBACtC;AAAA;AAAA,UAER;AAAA,WACJ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEA,wDAAC,UAAM,gBAAK;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACJ;AAER;;;ACTQ,IAAAC,uBAAA;AApBD,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,iBAAiB;AAAA,EACjB;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,WAAW;AAAA,MACP;AAAA,MACA;AAAA,MACA,YAAY;AAAA,IAChB;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,cAAY;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,UACT,WAAW;AAAA,YACP;AAAA,YACA,WAAW,uBAAuB;AAAA,YAClC;AAAA,YACA,CAAC,YAAY;AAAA,YACb;AAAA,YACA,WAAW,6BAA6B;AAAA,UAC5C;AAAA,UAEA;AAAA,0DAAC,SAAI,WAAU,8BAA8B,iBAAM;AAAA,YACnD;AAAA,cAAC;AAAA;AAAA,gBACG;AAAA,gBACA,WAAU;AAAA;AAAA,YACd;AAAA;AAAA;AAAA,MACJ;AAAA,MACC,YAAY,8CAAC,SAAI,WAAW,gBAAiB,UAAS;AAAA;AAAA;AAC3D;;;AC5EJ,oBAAoC;AACpC,IAAAC,iBAAuB;AAEvB,IAAAC,iBAAuB;AAsDP,IAAAC,uBAAA;AAjDhB,IAAM,cAAc;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAmBO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,eAAe;AAAA,EACf,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,iBAAa,uBAAuB,IAAI;AAE9C,SACI;AAAA,IAAC,cAAAC,OAAU;AAAA,IAAV;AAAA,MACG;AAAA,MACA,gBAAgB,MAAM,WAAW;AAAA,MACjC,cAAc,CAAC,YAAY,eAAe,QAAQ,IAAI;AAAA,MAErD;AAAA,mBACG;AAAA,UAAC,cAAAA,OAAU;AAAA,UAAV;AAAA,YACG,SAAS;AAAA,YACT,WAAW;AAAA,YAEV;AAAA;AAAA,QACL;AAAA,QAEJ,+CAAC,yBACI;AAAA,0BACG;AAAA,YAAC,cAAAA,OAAU;AAAA,YAAV;AAAA,cAMG,WAAW;AAAA,gBACP;AAAA,gBACA,gBAAgB;AAAA,cACpB;AAAA;AAAA,UACJ;AAAA,UAEJ;AAAA,YAAC,cAAAA,OAAU;AAAA,YAAV;AAAA,cACG,WAAW;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA;AAAA,cACJ;AAAA,cAEA;AAAA,gBAAC,cAAAA,OAAU;AAAA,gBAAV;AAAA,kBACG,KAAK;AAAA,kBACL,cAAY;AAAA,kBACZ,mBAAiB;AAAA,kBACjB,WAAW;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA,YAAY,IAAI;AAAA,oBAChB;AAAA,kBACJ;AAAA,kBAEC;AAAA,6BAAS,8CAAC,gBAAa,OAAc;AAAA,oBACrC;AAAA;AAAA;AAAA,cACL;AAAA;AAAA,UACJ;AAAA,WACJ;AAAA;AAAA;AAAA,EACJ;AAER;AAEO,IAAM,cAAc,cAAAA,OAAU;AAC9B,IAAM,oBAAoB,cAAAA,OAAU;AAapC,IAAM,eAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP,SACM,yCACA;AAAA,QACN;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,iBACG;AAAA,UAAC;AAAA;AAAA,YACG,WAAW,GAAG,iBAAiB,SAAS,GAAG,cAAc;AAAA,YAExD;AAAA;AAAA,QACL;AAAA,QAEH,eACG;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL;AAAA,QAEH;AAAA;AAAA;AAAA,EACL;AAER;AAcO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL;AAAA,SACE,WAAW;AAAA;AAAA;AAAA,QAIT,+CAAC,SAAI,WAAU,oHACV;AAAA,qBACG,8CAAC,gBAAa,WAAU,6BACnB,mBACL;AAAA,UAEH,YACG,8CAAC,SAAI,WAAU,6BACV,oBACL;AAAA,WAER;AAAA;AAAA;AAAA,EAER;AAER;AAEO,IAAM,eAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA;AAAA;AAAA;AAAA,QAIA;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;;;ACjOY,IAAAC,uBAAA;AADZ,IAAM,eAAiD;AAAA,EACnD,QAAQ,8CAAC,aAAU;AAAA,EACnB,QAAQ,8CAAC,aAAU;AAAA,EACnB,MAAM,8CAAC,aAAU;AAAA,EACjB,SAAS,8CAAC,aAAU;AACxB;AAsBO,SAAS,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,OAAO;AACX,GAA4B;AACxB,QAAM,UACF,gFACI;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,QAAO;AAAA,QACP,MAAM,8CAAC,SAAM;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,QACb;AAAA;AAAA,IAED;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL;AAAA,QACA,MAAM,eAAe,aAAa,MAAM;AAAA,QACxC,SAAS;AAAA,QACT,UAAU;AAAA,QAET;AAAA;AAAA,IACL;AAAA,KACJ;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,cAAc,CAAC,SAAS,CAAC,QAAQ,SAAS;AAAA,MAC1C;AAAA,MACA,kBAAiB;AAAA,MAEjB,yDAAC,cAAW,SACR;AAAA,sDAAC,gBAAa,QAAM,MAAC,OAAc;AAAA,QAClC,eACG,8CAAC,OAAE,WAAU,uCACR,uBACL;AAAA,QAEH;AAAA,SACL;AAAA;AAAA,EACJ;AAER;;;AChEQ,IAAAC,uBAAA;AA3BR,IAAMC,eAAc;AAAA,EAChB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACZ;AAaO,SAAS,QAAwC;AAAA,EACpD;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAAyB,MAAM;AAErC,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACAA,aAAY,IAAI;AAAA,QAChB;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACCY,IAAAC,uBAAA;AA7BZ,IAAM,eAAe;AAAA,EACjB,MAAM;AAAA,EACN,SACI;AACR;AAEA,IAAM,kBAAkB;AAAA,EACpB,MAAM;AAAA,EACN,SAAS;AACb;AAGO,SAAS,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACJ,GAAuB;AACnB,QAAM,QAAQ,YAAY,SAAS,OAAO;AAE1C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA,uDAAC,SAAI,WAAU,yDACV;AAAA,oBAAU,8CAAC,WAAQ,MAAK,QAAQ,mBAAQ,IAAa;AAAA,UACtD,8CAAC,SAAM,WAAW,aAAa,OAAO,GAAI,iBAAM;AAAA,UAC/C,YACG;AAAA,YAAC;AAAA;AAAA,cACG,WAAW;AAAA,gBACP,gBAAgB,OAAO;AAAA,gBACvB;AAAA,cACJ;AAAA,cAEC;AAAA;AAAA,UACL;AAAA,WAER;AAAA,QACC;AAAA;AAAA;AAAA,EACL;AAER;;;ACfgB,IAAAC,uBAAA;AAxBT,SAAS,UAAU;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAmB;AACf,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT,cAAY;AAAA,MACZ,WAAW,CAAC,WACR;AAAA,QACI;AAAA,QACA,SACM,mCACA;AAAA,QACN;AAAA,MACJ;AAAA,MAGH,WAAC,WACE,gFACI;AAAA,sDAAC,UAAK,WAAU,+DACX,mBACK,WACC,YACA,OAAO,UAAU,WAAW,QAAQ,QAC/C;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA,YAET,mBAAS,8CAAC,aAAU,IAAK,8CAAC,iBAAc;AAAA;AAAA,QAC7C;AAAA,SACJ;AAAA;AAAA,EAER;AAER;;;AC7DA,wBAAqC;AACrC,sBAAyB;AACzB,IAAAC,iBAMO;;;ACRP,IAAAC,iBAA2B;AAUnB,IAAAC,uBAAA;AAFD,IAAM,YAAQ;AAAA,EACjB,CAAC,EAAE,WAAW,OAAO,oBAAoB,GAAG,MAAM,GAAG,QACjD;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,cAAY,QAAQ,SAAS;AAAA,MAC7B,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,QACtB;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;ADoCY,IAAAC,uBAAA;AAjBL,SAAS,sBAAsB;AAAA,EAClC;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,GAAG;AACP,GAA+B;AAC3B,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,oBAAkB,cAAc,KAAK;AAAA,MACrC,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,uDAAC,UAAK,WAAU,+BAA+B;AAAA;AAAA,UAAM;AAAA,WAAC;AAAA,QACtD,8CAAC,UAAK,WAAU,6CACX,iBACL;AAAA,QACA,8CAAC,eAAY,WAAU,mDAAkD;AAAA;AAAA;AAAA,EAC7E;AAER;AAEO,SAAS,iBAAiB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAA0B;AACtB,QAAM,qBAAiB,wBAAQ,MAAM;AACjC,UAAM,QAAQ,MAAM,KAAK,EAAE,YAAY;AACvC,WAAO,UAAU,KACX,UACA,QAAQ,OAAO,CAAC,WAAW,OAAO,YAAY,EAAE,SAAS,KAAK,CAAC;AAAA,EACzE,GAAG,CAAC,SAAS,KAAK,CAAC;AACnB,QAAM,iBAAa;AAAA,IACf,UACI,wCAAqB;AAAA,MACjB,OAAO;AAAA,MACP,cAAc,CAAC,SAAS;AAAA,MACxB,aAAa,CAAC,SAAS;AAAA,IAC3B,CAAC;AAAA,IACL,CAAC,cAAc;AAAA,EACnB;AACA,QAAM,aAAa,QAAQ,SAAS;AACpC,QAAM,kBAAkB,QAAQ,YAAY;AAC5C,QAAM,eAAW,uBAAyB,IAAI;AAI9C,gCAAU,MAAM;AACZ,QAAI,SAAS,WAAW,SAAS,QAAQ,UAAU,OAAO;AACtD,eAAS,QAAQ,QAAQ;AAAA,IAC7B;AAAA,EACJ,CAAC;AAED,SACI;AAAA,IAAC,yBAAS;AAAA,IAAT;AAAA,MACG;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,CAAC;AAAA,MACR,kBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,cAAc,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACT,WAAW,UAAU,QAAQ,eAAe;AAAA,QAC5C,WAAW;AAAA,QACX,UAAU;AAAA,MACd;AAAA,MACA,oBAAoB,CAAC,YAAY,SAAS,QAAQ,UAAU;AAAA,MAC5D,cAAc,CAAC,YAAY,eAAe,QAAQ,IAAI;AAAA,MAEtD;AAAA;AAAA,UAAC,yBAAS;AAAA,UAAT;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,mBACI;AAAA,YACR;AAAA,YAEC;AAAA;AAAA,cACD,8CAAC,yBAAS,OAAT,EAAe,SAAO,MACnB;AAAA,gBAAC;AAAA;AAAA,kBACG,KAAK;AAAA,kBACJ,GAAG;AAAA,kBACJ;AAAA,kBACA;AAAA,kBACA,WAAW;AAAA,oBACP,kBACM,sDACA;AAAA,oBACN;AAAA,kBACJ;AAAA;AAAA,cACJ,GACJ;AAAA,cACC,cAAc,CAAC,mBACZ;AAAA,gBAAC,yBAAS;AAAA,gBAAT;AAAA,kBACG,cAAW;AAAA,kBACX,WAAU;AAAA,kBAEV,wDAAC,yBAAS,SAAT,EACI,WAAC,YACE;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU,QAAQ;AAAA,sBAClB,WAAU;AAAA;AAAA,kBACd,GAER;AAAA;AAAA,cACJ;AAAA;AAAA;AAAA,QAER;AAAA,QACA,8CAAC,yBAAS,YAAT,EACG;AAAA,UAAC,yBAAS;AAAA,UAAT;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEA,wDAAC,cAAW,WAAU,kBAClB,yDAAC,yBAAS,MAAT,EAAc,WAAU,6BACpB;AAAA,6BAAe,IAAI,CAAC,WACjB;AAAA,gBAAC,yBAAS;AAAA,gBAAT;AAAA,kBAEG,MAAM;AAAA,kBACN,WAAW;AAAA,oBACP;AAAA,oBACA,UAAU,UACN;AAAA,kBACR;AAAA,kBAEA,wDAAC,yBAAS,UAAT,EAAkB,WAAU,kCACxB,kBACL;AAAA;AAAA,gBAVK;AAAA,cAWT,CACH;AAAA,cACA,eAAe,WAAW,KACvB,8CAAC,yBAAS,OAAT,EAAe,WAAU,4EACrB,wBACL;AAAA,eAER,GACJ;AAAA;AAAA,QACJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AE/MO,SAAS,eACZ,MACA,SAAS,WAAW,UAAU,QACvB;AACP,MAAI,OAAO,SAAS,YAAY,CAAC,mBAAmB,KAAK,IAAI;AACzD,WAAO;AACX,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI;AACA,WAAO,IAAI,IAAI,MAAM,MAAM,EAAE,WAAW;AAAA,EAC5C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;ACiCQ,IAAAC,uBAAA;AAXD,SAAS,mBAAmB,OAAgC;AAC/D,QAAM;AAAA,IACF,OAAO;AAAA,IACP;AAAA,IACA,WAAW,UAAU,QAAQ,eAAe,MAAM,IAAI,IAAI;AAAA,IAC1D,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACJ,IAAI;AACJ,QAAM,UACF,gFACK;AAAA;AAAA,IACD,8CAAC,UAAM,UAAS;AAAA,IACf,YAAY,WACT;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,eAAY;AAAA;AAAA,IAChB,IACA;AAAA,KACR;AAGJ,MAAI,UAAU,OAAO;AACjB,UAAM;AAAA,MACF;AAAA,MACA,SAAS,WAAW,WAAW;AAAA,MAC/B,MAAM,WAAW,WAAW,wBAAwB;AAAA,MACpD,MAAMC;AAAA,MACN,YAAYC;AAAA,MACZ,UAAUC;AAAA,MACV,UAAUC;AAAA,MACV,MAAMC;AAAA,MACN,WAAWC;AAAA,MACX,UAAUC;AAAA,MACV,GAAG;AAAA,IACP,IAAI;AAEJ,WACI;AAAA,MAAC;AAAA;AAAA,QACG,IAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,GAAG,eAAe,SAAS;AAAA,QACrC,GAAG;AAAA,QAEH;AAAA;AAAA,IACL;AAAA,EAER;AAEA,QAAM;AAAA,IACF,OAAO;AAAA,IACP,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,UAAU;AAAA,IACV,GAAG;AAAA,EACP,IAAI;AAEJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,GAAG,eAAe,SAAS;AAAA,MACrC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;;;ACjHA,mBAAsB;;;ACuCN,IAAAC,uBAAA;AArBT,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,GAAoB;AAChB,SACI;AAAA,IAAC,mBAAM;AAAA,IAAN;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACA,SAAS,QAAQ,KAAK;AAAA,MAEpB;AAAA,kBAAS,WACP;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,iBAAiB;AAAA,YACrB;AAAA,YAEC;AAAA,uBACG;AAAA,gBAAC,mBAAM;AAAA,gBAAN;AAAA,kBACG,WAAW;AAAA,oBACP;AAAA,oBACA;AAAA,kBACJ;AAAA,kBAEC;AAAA;AAAA,cACL;AAAA,cAEH;AAAA;AAAA;AAAA,QACL;AAAA,QAEH;AAAA,QACA,QACG;AAAA,UAAC,mBAAM;AAAA,UAAN;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL,IACA,SACA;AAAA,UAAC,mBAAM;AAAA,UAAN;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL,IACA;AAAA;AAAA;AAAA,EACR;AAER;;;AChFA,IAAAC,iBAOO;;;ACFP,IAAM,SAAS,oBAAI,QAA8B;AAM1C,SAAS,6BAA6BC,WAAgC;AACzE,MAAI,QAAQ,OAAO,IAAIA,SAAQ;AAE/B,MAAI,CAAC,OAAO;AACR,UAAM,wBAAuC,CAAC,UAAU;AACpD,YAAM,QAAS,MAAoB,cAAc;AACjD,UAAI,OAAO,SAAS,OAAO,EAAG,OAAM,eAAe;AAAA,IACvD;AAEA,YAAQ,EAAE,WAAW,GAAG,sBAAsB;AAC9C,WAAO,IAAIA,WAAU,KAAK;AAC1B,IAAAA,UAAS,iBAAiB,YAAY,qBAAqB;AAC3D,IAAAA,UAAS,iBAAiB,QAAQ,qBAAqB;AAAA,EAC3D;AAEA,QAAM,aAAa;AACnB,MAAI,WAAW;AAEf,SAAO,MAAM;AACT,QAAI,SAAU;AACd,eAAW;AACX,UAAM,aAAa;AAEnB,QAAI,MAAM,YAAY,EAAG;AACzB,IAAAA,UAAS,oBAAoB,YAAY,MAAM,qBAAqB;AACpE,IAAAA,UAAS,oBAAoB,QAAQ,MAAM,qBAAqB;AAChE,WAAO,OAAOA,SAAQ;AAAA,EAC1B;AACJ;;;ACvBA,SAAS,cAAc,MAAY,QAAqC;AACpE,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAS,OACV,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,OAAO,KAAK,CAAC,UAAU;AAC1B,QAAI,MAAM,WAAW,GAAG,GAAG;AACvB,aAAO,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC;AAAA,IAC/D;AACA,QAAI,MAAM,SAAS,IAAI,GAAG;AACtB,YAAM,SAAS,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AAC9C,aAAO,KAAK,KAAK,WAAW,MAAM;AAAA,IACtC;AACA,WAAO,KAAK,SAAS;AAAA,EACzB,CAAC;AACL;AAOO,SAAS,eACZ,UACAC,UACA,EAAE,UAAU,cAAc,OAAO,GAClB;AACf,QAAM,WAAmB,CAAC;AAC1B,QAAM,WAA2B,CAAC;AAClC,MAAI,QAAQ,KAAK,IAAI,GAAG,WAAWA,SAAQ,MAAM;AAEjD,aAAW,QAAQ,UAAU;AACzB,QAAI,CAAC,cAAc,MAAM,MAAM,GAAG;AAC9B,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,IAC1C,WAAW,KAAK,OAAO,cAAc;AACjC,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,IAC1C,WAAW,SAAS,GAAG;AACnB,eAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,IAC3C,OAAO;AACH,eAAS,KAAK,IAAI;AAClB,eAAS;AAAA,IACb;AAAA,EACJ;AAEA,SAAO,EAAE,UAAU,SAAS;AAChC;;;AC/DA,IAAAC,iBAAsE;AAoE1D,IAAAC,uBAAA;AA5DZ,IAAMC,iBAAkD;AAAA,EACpD,QAAQ;AAAA,EACR,MAAM;AACV;AAEA,IAAM,qBAAuD;AAAA,EACzD,QAAQ;AAAA,EACR,MAAM;AACV;AAEA,IAAMC,kBAAoD;AAAA,EACtD,MAAM;AAAA,EACN,OAAO;AACX;AAEA,IAAM,sBAAyD;AAAA,EAC3D,MAAM;AAAA,EACN,OAAO;AACX;AAkBA,IAAMC,eAAc;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACR;AAEO,IAAM,iBAAa;AAAA,EACtB,CACI;AAAA,IACI;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,IACX,GAAG;AAAA,EACP,GACA,QACC;AACD,UAAM,SACF;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA,cAAY,YAAY,YAAY,KAAK;AAAA,QACzC,gBAAc;AAAA,QACd,eAAa;AAAA,QACb,WAAW;AAAA,UACP;AAAA,UACA,WACM,8CACA;AAAA,UACNA,aAAY,IAAI;AAAA,UAChB,SAASF,eAAc,MAAM,IAAIC,gBAAe,OAAO;AAAA,UACvD,CAAC,aACI,SACK,mBAAmB,MAAM,IACzB,oBAAoB,OAAO;AAAA,UACrC;AAAA,QACJ;AAAA,QAEC;AAAA;AAAA,IACL;AAGJ,UAAM,iBAAiB,WAAW;AAClC,QAAI,CAAC,eAAgB,QAAO;AAE5B,WACI;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA,QACP,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,WACI,WACM,6BACA;AAAA,QAGT;AAAA;AAAA,IACL;AAAA,EAER;AACJ;AAEA,WAAW,cAAc;;;AH7DjB,IAAAE,uBAAA;AAzCR,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACD,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAE3B,IAAM,qBAAqB;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,SAAS,mBAAmB,MAAqB;AAC7C,SAAO,wBAAwB,IAAI,KAAK,IAAI;AAChD;AAEA,SAAS,eAAe,OAAuB;AAC3C,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC;AAC3D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAChD;AAEA,SAAS,kBAAkB,OAAuB;AAC9C,QAAM,QAAQ,IAAI;AAAA,IACd,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,OAAO;AAAA,EAC/D;AACA,MAAI,MAAM,SAAS,EAAG,QAAO,GAAG,MAAM,MAAM;AAC5C,QAAM,CAAC,IAAI,IAAI;AACf,SAAO,GAAG,MAAM,MAAM,IAAI,IAAI,GAAG,MAAM,WAAW,IAAI,KAAK,GAAG;AAClE;AAEA,SAAS,mBAAmB;AAAA,EACxB;AAAA,EACA;AACJ,GAGG;AACC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,mBAAmB,IAAI;AAAA,MAC3B;AAAA,MAEC;AAAA;AAAA,EACL;AAER;AAEA,SAAS,YAAY;AAAA,EACjB;AAAA,EACA;AAAA,EACA,OAAO;AACX,GAIG;AACC,QAAM,gBAAY,uBAA0B,IAAI;AAChD,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAAS,MACzC,mBAAmB,IAAI;AAAA,EAC3B;AACA,QAAM,cAAc,SAAS,OAAO,qBAAqB;AAEzD,gCAAU,MAAM;AACZ,QAAI,CAAC,mBAAmB,IAAI,GAAG;AAC3B,oBAAc,KAAK;AACnB;AAAA,IACJ;AAEA,QAAI,YAAY;AAChB,kBAAc,IAAI;AAElB,mBAAe,cAAc;AACzB,UAAI;AACA,cAAM,SAAS,MAAM,kBAAkB,IAAI;AAC3C,YAAI,WAAW;AACX,iBAAO,MAAM;AACb;AAAA,QACJ;AAEA,cAAM,SAAS,UAAU;AACzB,cAAM,UAAU,QAAQ,WAAW,IAAI;AACvC,YAAI,CAAC,UAAU,CAAC,SAAS;AACrB,iBAAO,MAAM;AACb,wBAAc,KAAK;AACnB;AAAA,QACJ;AAEA,eAAO,QAAQ;AACf,eAAO,SAAS;AAEhB,cAAM,QAAQ,KAAK;AAAA,UACf,cAAc,OAAO;AAAA,UACrB,cAAc,OAAO;AAAA,QACzB;AACA,cAAM,QAAQ,OAAO,QAAQ;AAC7B,cAAM,SAAS,OAAO,SAAS;AAC/B,cAAM,KAAK,cAAc,SAAS;AAClC,cAAM,KAAK,cAAc,UAAU;AAEnC,gBAAQ,UAAU,GAAG,GAAG,aAAa,WAAW;AAChD,gBAAQ,UAAU,QAAQ,GAAG,GAAG,OAAO,MAAM;AAC7C,eAAO,MAAM;AAAA,MACjB,QAAQ;AACJ,YAAI,CAAC,UAAW,eAAc,KAAK;AAAA,MACvC;AAAA,IACJ;AAEA,SAAK,YAAY;AAEjB,WAAO,MAAM;AACT,kBAAY;AAAA,IAChB;AAAA,EACJ,GAAG,CAAC,MAAM,WAAW,CAAC;AAEtB,MAAI,CAAC,YAAY;AACb,WAAO,8CAAC,sBAAmB,MAAM,iBAAiB,MAAY;AAAA,EAClE;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAY,KAAK;AAAA,MACjB,WAAW,GAAG,oBAAoB,mBAAmB,IAAI,CAAC;AAAA,MAC1D,OAAO;AAAA,MACP,QAAQ;AAAA;AAAA,EACZ;AAER;AAmBO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,eAAe,KAAK,OAAO;AAAA,EAC3B,SAAS;AAAA,EACT,OAAO,8CAAC,aAAU,WAAU,uBAAsB;AAAA,EAClD,QACI,gFAAE;AAAA;AAAA,IACsB,8CAAC,UAAK,WAAU,mBAAkB,oBAAM;AAAA,KAChE;AAAA,EAEJ,cAAc,8CAAC,aAAU,WAAU,uBAAsB;AAAA,EACzD,UAAU;AAAA,EACV,WAAW;AAAA,EACX;AACJ,GAAoB;AAGhB,gCAAU,MAAM,6BAA6B,QAAQ,GAAG,CAAC,CAAC;AAK1D,WAAS,SAAS,UAAkB;AAChC,QAAI,YAAY,SAAS,WAAW,EAAG;AACvC,UAAM,EAAE,UAAU,SAAS,IAAI,eAAe,UAAU,OAAO;AAAA,MAC3D;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AACD,QAAI,SAAS,SAAS,EAAG,UAAS,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC;AACzD,QAAI,SAAS,SAAS,EAAG,YAAW,QAAQ;AAAA,EAChD;AAEA,QAAM,WAAW,MAAM,SAAS;AAChC,QAAM,SAAS,CAAC,YAAY,MAAM,SAAS;AAC3C,QAAM,eAAe,aAAa;AAClC,QAAM,UAAU,YAAY;AAC5B,QAAM,SAAS,YAAY;AAC3B,QAAM,cAAc,UAAU,OAAO,eAAe,OAAO;AAC3D,QAAM,cAAU,sBAAM;AACtB,QAAM,aAAa,GAAG,OAAO;AAE7B,WAAS,kBAAkB,OAAsC;AAC7D,aAAS,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC,CAAC;AAC7C,UAAM,OAAO,QAAQ;AAAA,EACzB;AAEA,MAAI,UAAU,CAAC,SAAU,QAAO;AAEhC,SACI,8CAAC,SAAI,WAAW,GAAG,yCAAyC,SAAS,GACjE;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,CAAC,UACG;AAAA,QACJ;AAAA,QACA,SACM,kEACA,UACE,yDACA;AAAA,QACR;AAAA,QACA,WACM,qBACA;AAAA,MACV;AAAA,MAGA,YAAY,CAAC,MAAM,EAAE,eAAe;AAAA,MACpC,QAAQ,CAAC,MAAM;AACX,UAAE,eAAe;AACjB,YAAI,SAAU;AACd,iBAAS,MAAM,KAAK,EAAE,aAAa,KAAK,CAAC;AAAA,MAC7C;AAAA,MAEC,WAAC,WACE;AAAA,QAAC;AAAA;AAAA,UACG,SAAS;AAAA,UACT,WAAW;AAAA,YACP;AAAA,YACA,UACM,sDACA;AAAA,YACN,SACM,yBACA;AAAA,UACV;AAAA,UAEC;AAAA;AAAA,YACD,8CAAC,UAAM,iBAAM;AAAA,YACb;AAAA,cAAC;AAAA;AAAA,gBACG,IAAI;AAAA,gBACJ,MAAK;AAAA,gBACL;AAAA,gBACA,UAAU,WAAW;AAAA,gBACrB,UAAU,YAAY,CAAC;AAAA,gBACvB,WAAU;AAAA,gBACV,UAAU;AAAA;AAAA,YACd;AAAA;AAAA;AAAA,MACJ,IAEA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA,UAAU,uBAAuB;AAAA,UACrC;AAAA,UAEC;AAAA,uBAAW,CAAC,UACT,8CAAC,UAAK,WAAU,+DACX,4BAAkB,KAAK,GAC5B;AAAA,YAEJ;AAAA,cAAC;AAAA;AAAA,gBACG,WAAW;AAAA,kBACP;AAAA,kBACA,UACM;AAAA,oBACI;AAAA,oBACA,SACM,wBACA;AAAA,kBACV,IACA;AAAA,kBACN,gBACI,CAAC,WACD;AAAA,gBACR;AAAA,gBAEC;AAAA,wBAAM,IAAI,CAAC,MAAM,UACd;AAAA,oBAAC;AAAA;AAAA,sBAEG,WAAW;AAAA,wBACP;AAAA,wBACA,gBAAgB;AAAA,sBACpB;AAAA,sBAEA;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACG;AAAA,4BACA,iBAAiB;AAAA,4BACjB,MAAM;AAAA;AAAA,wBACV;AAAA,wBACC,CAAC,WACE,gFACI;AAAA;AAAA,4BAAC;AAAA;AAAA,8BACG,WAAW;AAAA,gCACP;AAAA,gCACA,eACM,eACA;AAAA,8BACV;AAAA,8BAEC,eAAK;AAAA;AAAA,0BACV;AAAA,0BACA,8CAAC,UAAK,WAAU,gDACX,yBAAe,KAAK,IAAI,GAC7B;AAAA,2BACJ;AAAA,wBAEH,CAAC,YACE,8CAAC,SAAI,WAAU,6CACX;AAAA,0BAAC;AAAA;AAAA,4BACG,QAAO;AAAA,4BACP,OAAO,UAAU,KAAK,IAAI;AAAA,4BAC1B,SAAS,MACL;AAAA,8BACI,MAAM;AAAA,gCACF,CAAC,GAAG,MACA,MAAM;AAAA,8BACd;AAAA,4BACJ;AAAA,4BAGJ,wDAAC,SAAM,WAAU,uBAAsB;AAAA;AAAA,wBAC3C,GACJ;AAAA;AAAA;AAAA,oBA5CC,GAAG,KAAK,IAAI,IAAI,KAAK;AAAA,kBA8C9B,CACH;AAAA,kBAEA,CAAC,UAAU,CAAC,gBAAgB,UACzB,8CAAC,QAAG,WAAU,8BACV;AAAA,oBAAC;AAAA;AAAA,sBACG,SAAS;AAAA,sBACT,WAAW;AAAA,wBACP;AAAA,wBACA,UACM,gDACA;AAAA,sBACV;AAAA,sBAEA;AAAA,sEAAC,YAAS,WAAU,uBAAsB;AAAA,wBACzC,CAAC,WACE,8CAAC,UAAK,WAAU,mCAAkC,iBAElD;AAAA,wBAEJ;AAAA,0BAAC;AAAA;AAAA,4BACG,IAAI;AAAA,4BACJ,MAAK;AAAA,4BACL,cAAW;AAAA,4BACX;AAAA,4BACA,UAAQ;AAAA,4BACR,UAAU,YAAY,CAAC;AAAA,4BACvB,WAAU;AAAA,4BACV,UAAU;AAAA;AAAA,wBACd;AAAA;AAAA;AAAA,kBACJ,GACJ;AAAA;AAAA;AAAA,YAER;AAAA,YAEC,OAAO,SAAS,QAAQ,KACrB,WAAW,KACX,CAAC,WACG,+CAAC,UAAK,WAAU,6CACX;AAAA,oBAAM;AAAA,cAAO;AAAA,cAAI;AAAA,cAAS;AAAA,eAC/B;AAAA;AAAA;AAAA,MAEZ;AAAA;AAAA,EAER,GACJ;AAER;;;AI9WQ,IAAAC,uBAAA;AAbD,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,QAAQ;AACZ;AAAA;AAAA;AAAA,EAGI;AAAA,IAAC;AAAA;AAAA,MACG,SAAS,WAAW;AAAA,MACpB,WAAW;AAAA,MACX,WAAU;AAAA,MACV,iBAAe;AAAA,MAEf,wDAAC,UAAK,WAAU,sQAAqQ,eAErR;AAAA;AAAA,EACJ;AAAA;;;ACwBI,IAAAC,uBAAA;AAxCR,IAAM,YAAY;AAAA,EACd,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAMC,iBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SACI;AAAA,EACJ,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AACZ;AAWO,IAAM,OAAsB,CAAC;AAAA,EAChC;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,QAAM,cAAc,SACdA,eAAc,MAAM,IACpB;AACN,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACnCY,IAAAC,uBAAA;AAjBZ,IAAM,gBACF;AAOG,SAAS,QAAQ;AAAA,EACpB;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AACJ,GAAiB;AACb,QAAM,OAAO,GAAG,MAAM;AACtB,MAAI,CAAC,OAAO;AACR,WACI,8CAAC,QAAK,QAAO,WAAU,WAAW,GAAG,eAAe,SAAS,GACxD,gBACL;AAAA,EAER;AACA,SACI;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,SAAS;AAAA,MACT,cAAY;AAAA,MACZ,WAAU;AAAA,MAET,WAAC,WACE;AAAA,QAAC;AAAA;AAAA,UACG,QAAQ,SAAS,YAAY;AAAA,UAC7B,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,UAEC;AAAA,qBACG,8CAAC,aAAU,eAAY,QAAO,IAE9B,8CAAC,iBAAc,eAAY,QAAO;AAAA,YAErC,SAAS,WAAW;AAAA;AAAA;AAAA,MACzB;AAAA;AAAA,EAER;AAER;;;AC/BQ,IAAAC,uBAAA;AAdD,SAAS,SAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAqB;AACjB,QAAM,YAA+B,MAAM;AAC3C,QAAM,aACF,YAAY,eAAgB,UAAiC,IAAI;AAErE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,IAAI;AAAA,MACJ,SAAQ;AAAA,MACR,QAAQ,aAAa,WAAW;AAAA,MAChC,KAAK,aAAa,wBAAwB;AAAA,MACzC,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA,YAAY,cAAc;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA,oBAAY,cACT;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACd;AAAA,QAEH;AAAA;AAAA;AAAA,EACL;AAER;;;AC9BY,IAAAC,uBAAA;AAhBL,IAAM,mBAA8C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA,IAEC;AAAA,cACG,8CAAC,SAAI,WAAU,mJACV,gBACL;AAAA,OAEF,SAAS,WACP,+CAAC,SAAI,WAAU,kBACV;AAAA,iBACG,8CAAC,QAAK,IAAG,KAAI,MAAK,MAAK,MAAK,UAAS,QAAO,YACvC,iBACL;AAAA,QAEH,UACG,8CAAC,QAAK,IAAG,KAAI,MAAK,MAAK,MAAK,QAAO,WAAU,cACxC,kBACL;AAAA,SAER;AAAA,MAEH;AAAA;AAAA;AACL;;;AC2BI,IAAAC,uBAAA;AA5CR,IAAM,eACF;AAEJ,IAAM,WACF;AAEJ,IAAM,aACF;AAEG,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,YAAY;AAChB,MAAM;AACF,QAAM,gBAAgB,SAAS,WAAW;AAE1C,QAAM,aAAa,CAAC,WAAmB;AACnC,QAAI,SAAS,SAAS,MAAM,GAAG;AAC3B,eAAS,SAAS,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC;AAAA,IACjD,OAAO;AACH,eAAS,CAAC,GAAG,UAAU,MAAM,CAAC;AAAA,IAClC;AAAA,EACJ;AAEA,QAAM,YAAY,MAAM,SAAS,CAAC,CAAC;AAEnC,QAAM,cAAc,WACd,eACA,gBACE,cACA,SAAS,WAAW,IACjB,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,SAAS,CAAC,CAAC,GAAG,SACzD,eACA,GAAG,SAAS,MAAM;AAE5B,QAAM,YAAY,QACd,8CAAC,UAAK,WAAU,8DACX,iBACL,IACA;AAEJ,MAAI,UAAU;AACV,WACI;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,UACP;AAAA,UACA,aAAa;AAAA,QACjB;AAAA,QAEC;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA,cACV,SAAS,mBAAmB;AAAA,cAC5B,OAAM;AAAA,cACN,WAAW;AAAA,gBACP;AAAA,gBACA,aAAa;AAAA,cACjB;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,UAAQ;AAAA,kBACR,cAAY,aAAa,SAAS;AAAA,kBAClC,WAAW;AAAA,oBACP;AAAA,oBACA,aAAa;AAAA,oBACb;AAAA,kBACJ;AAAA,kBAEA;AAAA,kEAAC,UAAK,WAAU,4EACX,uBACL;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACG,UAAU;AAAA,wBACV,WAAU;AAAA;AAAA,oBACd;AAAA;AAAA;AAAA,cACJ;AAAA;AAAA,UACJ;AAAA;AAAA;AAAA,IACJ;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,aAAa;AAAA,MACjB;AAAA,MAEC;AAAA;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,WAAU;AAAA,YACV,SAAS,CAAC,SACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY,aAAa,SAAS;AAAA,gBAClC,WAAW;AAAA,kBACP;AAAA,kBACA,aAAa;AAAA,kBACb,OACM,4BACA;AAAA,gBACV;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAW;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA,sBAEC;AAAA;AAAA,kBACL;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU;AAAA,sBACV,WAAW;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA;AAAA,kBACJ;AAAA;AAAA;AAAA,YACJ;AAAA,YAGJ,yDAAC,cAAW,WAAU,kBAClB;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAc;AAAA,kBACd,WAAW;AAAA,oBACP;AAAA,oBACA,gBACM,4EACA;AAAA,kBACV;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACG,eAAY;AAAA,wBACZ,WAAW;AAAA,0BACP;AAAA,0BACA,iBACI;AAAA,wBACR;AAAA,wBAEC,2BAAiB;AAAA;AAAA,oBACtB;AAAA,oBACC;AAAA;AAAA;AAAA,cACL;AAAA,cACC,QAAQ,IAAI,CAAC,QAAQ;AAClB,sBAAM,YAAY,SAAS,SAAS,IAAI,KAAK;AAC7C,uBACI;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBAEL,SAAS,MAAM,WAAW,IAAI,KAAK;AAAA,oBACnC,gBAAc;AAAA,oBACd,WAAW;AAAA,sBACP;AAAA,sBACA,YACM,0DACA;AAAA,oBACV;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACG,eAAY;AAAA,0BACZ,WAAW;AAAA,4BACP;AAAA,4BACA,aACI;AAAA,0BACR;AAAA,0BAEC,uBAAa;AAAA;AAAA,sBAClB;AAAA,sBACA,8CAAC,UAAK,WAAU,gDACX,cAAI,OACT;AAAA;AAAA;AAAA,kBAtBK,IAAI;AAAA,gBAuBb;AAAA,cAER,CAAC;AAAA,eACL;AAAA;AAAA,QACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;ACtLQ,IAAAC,uBAAA;AA3BR,IAAM,OACF;AACJ,IAAM,gBAAgB;AACtB,IAAM,kBACF;AAaG,SAAS,QAAgD;AAAA,EAC5D;AAAA,EACA,SAAS;AAAA,EACT,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAA+B,MAAM;AAC3C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,gBAAc,SAAS,SAAS;AAAA,MAChC,WAAW;AAAA,QACP;AAAA,QACA,SAAS,gBAAgB;AAAA,QACzB;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,eACG,8CAAC,QAAK,WAAU,sCAAqC,IACrD;AAAA,QACH;AAAA;AAAA;AAAA,EACL;AAER;;;ACtDA,IAAAC,iBAAqD;;;ACDrD,IAAM,aAAa;AAcZ,SAAS,cAAc,OAAO,oBAAI,KAAK,GAAS;AACnD,SAAO,IAAI;AAAA,IACP,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW,CAAC;AAAA,EACzE;AACJ;AAEO,SAAS,WAAW,MAAY,MAAoB;AACvD,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,OAAK,WAAW,KAAK,WAAW,IAAI,IAAI;AACxC,SAAO;AACX;AAEA,SAAS,gBAAgB,MAAkB;AACvC,SAAO,IAAI,KAAK,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC;AAC1E;AAEA,SAAS,aAAa,MAAY,QAAsB;AACpD,SAAO,IAAI;AAAA,IACP,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,IAAI,QAAQ,CAAC;AAAA,EAClE;AACJ;AAEA,SAAS,kBAAkB,MAAkB;AACzC,QAAM,MAAM,KAAK,UAAU,KAAK;AAChC,SAAO,WAAW,cAAc,IAAI,GAAG,IAAI,GAAG;AAClD;AAEA,SAAS,oBAAoB,MAAoB;AAC7C,QAAM,MAAM,KAAK,UAAU,KAAK;AAChC,QAAM,WAAW,WAAW,cAAc,IAAI,GAAG,IAAI,GAAG;AACxD,QAAM,UAAU,SAAS,eAAe;AACxC,QAAM,YAAY,IAAI,KAAK,KAAK,IAAI,SAAS,GAAG,CAAC,CAAC;AAClD,QAAM,UAAU,KAAK;AAAA,MACf,SAAS,QAAQ,IAAI,UAAU,QAAQ,KAAK,aAAa,KAAK;AAAA,EACpE;AACA,SAAO,GAAG,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;AAC1D;AAEA,SAAS,oBAAoB,MAAoB;AAC7C,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AACzC;AAEA,SAAS,oBAAoB,MAAoB;AAC7C,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAC3D;AAEA,SAAS,qBAAqB,MAAoB;AAC9C,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,CAAC;AACxC;AAEO,SAAS,eACZ,aACA,OAAO,oBAAI,KAAK,GACD;AACf,MAAI,gBAAgB,OAAO;AACvB,WAAO;AAAA,MACH;AAAA,MACA,QAAQ,oBAAoB,cAAc,IAAI,CAAC;AAAA,IACnD;AAAA,EACJ;AACA,MAAI,gBAAgB,QAAQ;AACxB,WAAO,EAAE,aAAa,QAAQ,oBAAoB,IAAI,EAAE;AAAA,EAC5D;AACA,SAAO,EAAE,aAAa,QAAQ,qBAAqB,gBAAgB,IAAI,CAAC,EAAE;AAC9E;AAEO,SAAS,gBAAiC;AAC7C,SAAO,eAAe,KAAK;AAC/B;AAEO,SAAS,eAAe,WAA0C;AACrE,MAAI,UAAU,gBAAgB,OAAO;AACjC,UAAMC,SAAQ,oBAAI,KAAK,GAAG,UAAU,MAAM,gBAAgB;AAC1D,WAAO,EAAE,OAAAA,QAAO,KAAK,WAAWA,QAAO,CAAC,EAAE;AAAA,EAC9C;AAEA,MAAI,UAAU,gBAAgB,QAAQ;AAClC,UAAM,CAACC,WAAU,QAAQ,IAAI,UAAU,OAAO,MAAM,IAAI;AACxD,UAAM,UAAU,OAAOA,SAAQ;AAC/B,UAAM,UAAU,OAAO,QAAQ;AAC/B,UAAM,OAAO,IAAI,KAAK,KAAK,IAAI,SAAS,GAAG,CAAC,CAAC;AAC7C,UAAMD,SAAQ,WAAW,kBAAkB,IAAI,IAAI,UAAU,KAAK,CAAC;AACnE,WAAO,EAAE,OAAAA,QAAO,KAAK,WAAWA,QAAO,CAAC,EAAE;AAAA,EAC9C;AAEA,QAAM,CAAC,UAAU,SAAS,IAAI,UAAU,OAAO,MAAM,GAAG;AACxD,QAAM,QAAQ,IAAI;AAAA,IACd,KAAK,IAAI,OAAO,QAAQ,GAAG,OAAO,SAAS,IAAI,GAAG,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO,KAAK,aAAa,OAAO,CAAC,EAAE;AAChD;AAEO,SAAS,oBAAoB,WAAsC;AACtE,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,SAAS;AAC/C,QAAM,aAAuB,CAAC;AAC9B,QAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,MAAI,UAAU,gBAAgB,OAAO;AACjC,WAAO,SAAS,KAAK;AACjB,iBAAW,KAAK,GAAG,oBAAoB,MAAM,CAAC,QAAQ;AACtD,aAAO,YAAY,OAAO,YAAY,IAAI,CAAC;AAAA,IAC/C;AACA,WAAO;AAAA,EACX;AAEA,SAAO,SAAS,KAAK;AACjB,eAAW,KAAK,oBAAoB,MAAM,CAAC;AAC3C,WAAO,WAAW,OAAO,WAAW,IAAI,CAAC;AAAA,EAC7C;AACA,SAAO;AACX;AAEO,SAAS,sBACZ,WACA,aACI;AACJ,MAAI,gBAAgB,OAAO;AACvB,WAAO,oBAAI,KAAK,GAAG,UAAU,QAAQ,KAAK,GAAG,CAAC,OAAO;AAAA,EACzD;AACA,SAAO,oBAAI,KAAK,GAAG,SAAS,gBAAgB;AAChD;AAEO,SAAS,mBACZ,WACA,UAAU,oBAAI,KAAK,CAAC,GACpB,UAAU,cAAc,GACjB;AACP,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,SAAS;AAC/C,SAAO,MAAM,WAAW,SAAS;AACrC;;;ACbQ,IAAAE,uBAAA;AAlFR,IAAM,qBACF;AAEJ,IAAM,qBAAqB;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAMC,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnB,MAAM;AAAA,IACF,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UACI;AAAA,EACR;AAAA;AAAA;AAAA,EAGA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UACI;AAAA,EACR;AACJ;AAKA,IAAMC,iBAAgB;AAAA,EAClB,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,UACI;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,UACI;AAAA,EACR;AACJ;AAEO,SAAS,UAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACP,GAAsB;AAClB,QAAM,YAAyB,MAAM;AACrC,QAAM,WAAW,cAAc;AAC/B,QAAM,SACF,WAAW,YACLD,gBAAe,OACf,SACE;AAAA,IACI,GAAGC,eAAc,MAAM;AAAA,IACvB,OAAOA,eAAc,MAAM,EAAE;AAAA,EACjC,IACAD,gBAAe,OAAO;AAClC,QAAM,cAAc,WACd,CAAC,UAA2B;AACxB,UAAM,eAAe;AACrB,UAAM,gBAAgB;AAAA,EAC1B,IACA;AAEN,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACH,GAAI,WAAW,EAAE,MAAM,UAAU,SAAS,IAAI,CAAC;AAAA,MAC/C,GAAI,CAAC,YAAY,WACZ,EAAE,iBAAiB,MAAM,UAAU,GAAG,IACtC,CAAC;AAAA,MACN,GAAI,cAAc,OAAO,WAAW,EAAE,MAAM,OAAU,IAAI,CAAC;AAAA,MAC5D,SAAS;AAAA,MACR,GAAI,cAAc,SAAY,EAAE,cAAc,UAAU,IAAI,CAAC;AAAA,MAG7D,GAAI,WACC,EAAE,gBAAgB,OAAO,IACzB,EAAE,gBAAgB,WAAW,OAAO,SAAS,OAAU;AAAA,MAC7D,WAAW;AAAA,QACP;AAAA,QACAA,gBAAe,OAAO,EAAE;AAAA,QACxB,WAAW,UACL,OAAO,QACP,SACE,OAAO,SACP,OAAO;AAAA,QACf,YACI;AAAA,QACJ,mBAAmB,IAAI;AAAA,QACvB;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,QACA,UAAU,QACP,8CAAC,UAAK,WAAU,iDACX,kBACL;AAAA;AAAA;AAAA,EAER;AAER;;;AFuC4B,IAAAE,uBAAA;AAjL5B,IAAM,iBAAiB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK;AACvE,IAAM,eAAe;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEA,IAAM,aACF;AAEJ,SAASC,cAAa,MAAY,QAAsB;AACpD,SAAO,IAAI;AAAA,IACP,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,IAAI,QAAQ,CAAC;AAAA,EAClE;AACJ;AAEA,SAAS,eAAe,WAAyB;AAC7C,QAAM,WAAW,IAAI;AAAA,IACjB,KAAK,IAAI,UAAU,eAAe,GAAG,UAAU,YAAY,GAAG,CAAC;AAAA,EACnE;AACA,QAAM,eAAe,SAAS,UAAU,KAAK;AAC7C,QAAM,SAAS,WAAW,UAAU,IAAI,YAAY;AACpD,SAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,UAAU,WAAW,QAAQ,KAAK,CAAC;AAC7E;AAEA,SAAS,WAAW,MAAY,OAAsB;AAClD,SAAO,KAAK,QAAQ,MAAM,MAAM,QAAQ;AAC5C;AAEA,SAAS,WAAW,OAA8B;AAC9C,SAAO,eAAe,KAAK,EAAE;AACjC;AAEA,SAAS,aAAa,OAAgC;AAClD,SAAO,GAAG,MAAM,WAAW,IAAI,MAAM,MAAM;AAC/C;AAEA,SAAS,gBAAgB,MAAY,QAA0B,SAAS;AACpE,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACpC,UAAU;AAAA,IACV;AAAA,IACA,MAAM;AAAA,EACV,CAAC;AACL;AAEA,SAAS,eAAe,MAAY;AAChC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACpC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACV,CAAC;AACL;AAEA,SAAS,kBAAkB,OAAa,KAAW;AAC/C,QAAM,UAAU,WAAW,KAAK,EAAE;AAClC,QAAM,YACF,MAAM,eAAe,MAAM,QAAQ,eAAe,KAClD,MAAM,YAAY,MAAM,QAAQ,YAAY;AAEhD,MAAI,WAAW;AACX,UAAM,QAAQ,MAAM,mBAAmB,SAAS;AAAA,MAC5C,UAAU;AAAA,MACV,OAAO;AAAA,IACX,CAAC;AACD,WAAO,GAAG,KAAK,IAAI,MAAM,WAAW,CAAC,IAAI,QAAQ,WAAW,CAAC,KAAK,QAAQ,eAAe,CAAC;AAAA,EAC9F;AAEA,SAAO,GAAG,eAAe,KAAK,CAAC,MAAM,eAAe,OAAO,CAAC;AAChE;AAEA,SAAS,oBAAoB,OAAgC;AACzD,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,KAAK;AAC3C,MAAI,MAAM,gBAAgB,MAAO,QAAO,eAAe,KAAK;AAC5D,MAAI,MAAM,gBAAgB,OAAQ,QAAO,kBAAkB,OAAO,GAAG;AACrE,SAAO,gBAAgB,OAAO,MAAM;AACxC;AAEA,SAAS,WACL,UACA,aAC0B;AAC1B,MAAI,gBAAgB,SAAS;AACzB,UAAMC,SAAQ,IAAI,KAAK,KAAK,IAAI,SAAS,eAAe,GAAG,GAAG,CAAC,CAAC;AAChE,WAAO,EAAE,OAAAA,QAAO,KAAKD,cAAaC,QAAO,EAAE,EAAE;AAAA,EACjD;AAEA,QAAM,QAAQ,IAAI;AAAA,IACd,KAAK,IAAI,SAAS,eAAe,GAAG,SAAS,YAAY,GAAG,CAAC;AAAA,EACjE;AACA,SAAO,EAAE,OAAO,KAAKD,cAAa,OAAO,CAAC,EAAE;AAChD;AAEO,IAAM,eAAsC,CAAC;AAAA,EAChD;AAAA,EACA;AAAA,EACA,UAAU,oBAAI,KAAK,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAe,MAAM,WAAW,KAAK,CAAC;AACtE,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAe,MAAM,WAAW,KAAK,CAAC;AAC1E,QAAM,0BAAsB,uBAAsB,IAAI;AACtD,QAAM,EAAE,aAAa,OAAO,IAAI;AAEhC,gCAAU,MAAM;AACZ,UAAM,sBAAsB,aAAa,EAAE,aAAa,OAAO,CAAC;AAChE,QAAI,oBAAoB,YAAY,qBAAqB;AACrD,0BAAoB,UAAU;AAC9B;AAAA,IACJ;AACA,UAAM,iBAAiB,WAAW,EAAE,aAAa,OAAO,CAAC;AACzD,kBAAc,cAAc;AAC5B,gBAAY,cAAc;AAAA,EAC9B,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,YAAQ,wBAAQ,MAAM,eAAe,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAChE,QAAM,iBAAiB,eAAe,KAAK;AAC3C,QAAM,QAAQ,cAAc,OAAO;AACnC,QAAM,mBACF,MAAM,gBAAgB,UAChBA,cAAa,UAAU,GAAG,IAC1BA,cAAa,UAAU,EAAE;AACnC,QAAM,eACF,MAAM,gBAAgB,UAChBA,cAAa,UAAU,EAAE,IACzBA,cAAa,UAAU,CAAC;AAClC,QAAM,iBAAiB,WAAW,kBAAkB,MAAM,WAAW;AACrE,QAAM,aAAa,WAAW,cAAc,MAAM,WAAW;AAC7D,QAAM,mBAAmB,eAAe,OAAO;AAC/C,QAAM,eAAe,WAAW,QAAQ;AACxC,QAAM,eAAe,oBAAoB,KAAK;AAE9C,QAAM,kBAAkB,CAAC,WAA4B,WAAiB;AAClE,wBAAoB,UAAU,aAAa,SAAS;AACpD,kBAAc,MAAM;AACpB,gBAAY,MAAM;AAClB,aAAS,SAAS;AAAA,EACtB;AAEA,QAAM,iBAAiB,CAACE,iBAAmC;AACvD,oBAAgB,eAAeA,cAAa,UAAU,GAAG,UAAU;AAAA,EACvE;AAEA,QAAM,aAAa,CAAC,SAAe;AAC/B,oBAAgB,eAAe,MAAM,aAAa,IAAI,GAAG,IAAI;AAC7D,YAAQ,KAAK;AAAA,EACjB;AAEA,QAAM,YACF,MAAM,gBAAgB,UAChB,OAAO,SAAS,eAAe,CAAC,IAChC,gBAAgB,UAAU,MAAM;AAE1C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WACI,UACM,mBACA;AAAA,MAGT;AAAA,SAAC,WACE,8CAAC,SAAI,WAAU,4CACT,WAAC,OAAO,QAAQ,OAAO,EAA0B;AAAA,UAC/C,CAACA,iBACG;AAAA,YAAC;AAAA;AAAA,cAEG,QAAQ,MAAM,gBAAgBA;AAAA,cAC9B,SAAS,MAAM,eAAeA,YAAW;AAAA,cAExC,UAAAA,aAAY,CAAC,EAAE,YAAY,IACxBA,aAAY,MAAM,CAAC;AAAA;AAAA,YALlBA;AAAA,UAMT;AAAA,QAER,GACJ;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,cAAc;AAAA,YACd,WAAU;AAAA,YACV,SACI,YACC,CAAC,WACE;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY,0BAA0B,YAAY;AAAA,gBAClD,WAAW;AAAA,kBACP;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UACI;AAAA,gBACR;AAAA,gBAEA;AAAA,gEAAC,UAAK,WAAU,kBACX,wBACL;AAAA,kBACA,8CAAC,eAAY,UAAU,QAAQ;AAAA;AAAA;AAAA,YACnC;AAAA,YAIP;AAAA;AAAA,cACD,+CAAC,SAAI,WAAU,kEACX;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,gBAAgB;AAAA,oBAC3C,WAAW;AAAA,sBACP;AAAA,sBACA,oBACI;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,gBACL;AAAA,gBACA,8CAAC,SAAI,WAAU,8DACV,qBACL;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,YAAY;AAAA,oBACvC,WAAW;AAAA,sBACP;AAAA,sBACA,gBACI;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,gBACL;AAAA,iBACJ;AAAA,cAEC,MAAM,gBAAgB,UACnB,8CAAC,SAAI,WAAU,8CACV,uBAAa,IAAI,CAAC,OAAO,eAAe;AACrC,sBAAM,OAAO,IAAI;AAAA,kBACb,KAAK;AAAA,oBACD,SAAS,eAAe;AAAA,oBACxB;AAAA,oBACA;AAAA,kBACJ;AAAA,gBACJ;AACA,sBAAM,aAAa;AAAA,kBACf,eAAe,SAAS,IAAI;AAAA,kBAC5B;AAAA,kBACA;AAAA,gBACJ;AACA,sBAAM,YAAY,KAAK,mBAAmB,SAAS;AAAA,kBAC/C,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,MAAM;AAAA,gBACV,CAAC;AACD,sBAAM,WACF,KAAK,eAAe,MAChB,eAAe,MAAM,eAAe,KACxC,KAAK,YAAY,MACb,eAAe,MAAM,YAAY;AACzC,uBACI;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBAEL,cAAY;AAAA,oBACZ,gBAAc;AAAA,oBACd,UAAU,CAAC;AAAA,oBACX,SAAS,MAAM,WAAW,IAAI;AAAA,oBAC9B,WAAW;AAAA,sBACP;AAAA,sBACA,WACM,0DACA;AAAA,sBACN,CAAC,cACG;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,kBAdI;AAAA,gBAeT;AAAA,cAER,CAAC,GACL,IAEA,gFACI;AAAA,8DAAC,SAAI,WAAU,mJACV,yBAAe,IAAI,CAAC,UACjB,8CAAC,SAAiB,mBAAR,KAAc,CAC3B,GACL;AAAA,gBACA,8CAAC,SAAI,WAAU,4CACV,gBAAM,IAAI,CAAC,SAAS;AACjB,wBAAM,iBACF,KAAK,YAAY,MACjB,SAAS,YAAY;AACzB,wBAAM,aAAa;AAAA,oBACf,eAAe,MAAM,aAAa,IAAI;AAAA,oBACtC;AAAA,oBACA;AAAA,kBACJ;AACA,wBAAM,YACF,MAAM,gBAAgB,SAChB,UAAU,oBAAoB,eAAe,QAAQ,IAAI,CAAC,CAAC,KAC3D,UAAU,KAAK;AAAA,oBACX;AAAA,oBACA;AAAA,sBACI,UAAU;AAAA,sBACV,SAAS;AAAA,sBACT,OAAO;AAAA,sBACP,KAAK;AAAA,sBACL,MAAM;AAAA,oBACV;AAAA,kBACJ,CAAC;AACX,wBAAM,WACF,MAAM,gBAAgB,QAChB,WAAW,MAAM,eAAe,KAAK,IACrC,QAAQ,eAAe,SACvB,OAAO,eAAe;AAChC,yBACI;AAAA,oBAAC;AAAA;AAAA,sBACG,MAAK;AAAA,sBAEL,cAAY;AAAA,sBACZ,gBAAc;AAAA,sBACd,UAAU,CAAC;AAAA,sBACX,SAAS,MAAM,WAAW,IAAI;AAAA,sBAC9B,WAAW;AAAA,wBACP;AAAA,wBACA,CAAC,kBACG;AAAA,wBACJ,WAAW,MAAM,KAAK,KAClB;AAAA,wBACJ,WACM,0DACA;AAAA,wBACN,CAAC,cACG;AAAA,sBACR;AAAA,sBAEC,eAAK,WAAW;AAAA;AAAA,oBAlBZ,KAAK,YAAY;AAAA,kBAmB1B;AAAA,gBAER,CAAC,GACL;AAAA,iBACJ;AAAA;AAAA;AAAA,QAER;AAAA;AAAA;AAAA,EACJ;AAER;;;AGrWQ,IAAAC,uBAAA;AAbD,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,OACF,gFACK;AAAA,aACG,8CAAC,QAAK,IAAG,OAAM,WAAU,mBACpB,iBACL;AAAA,IAEH;AAAA,KACL;AAGJ,QAAM,UACF,gFACI;AAAA,mDAAC,YAAO,WAAU,mFACd;AAAA;AAAA,QAAC;AAAA;AAAA,UACG,IAAG;AAAA,UACH,MAAK;AAAA,UACL,WAAW,GAAG,mBAAmB,cAAc;AAAA,UAE9C;AAAA;AAAA,MACL;AAAA,MACC,UACG,8CAAC,SAAI,WAAW,GAAG,kBAAkB,eAAe,GAC/C,kBACL;AAAA,OAER;AAAA,IACC;AAAA,KACL;AAGJ,SACI,8CAAC,aAAQ,IAAQ,WAAW,GAAG,sBAAsB,SAAS,GACzD,mBACG;AAAA,IAAC;AAAA;AAAA,MACG,SAAQ;AAAA,MACR,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL,IAEA,8CAAC,SAAI,WAAU,yCACV,mBACL,GAER;AAER;;;AC5CI,IAAAC,uBAAA;AA1BJ,IAAM,sBAAuD;AAAA,EACzD,MAAM;AAAA,EACN,MAAM;AACV;AAaO,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI,+CAAC,SAAI,WAAW,GAAG,iBAAiB,SAAS,GACzC;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH,MAAK;AAAA,MACL,MAAK;AAAA,MACL,QAAO;AAAA,MACP,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,oBAAoB,OAAO;AAAA,QAC3B;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACC,UACG;AAAA,IAAC;AAAA;AAAA,MACG,IAAG;AAAA,MACH,MAAK;AAAA,MACL,MAAK;AAAA,MACL,WAAW,GAAG,cAAc,eAAe;AAAA,MAE1C;AAAA;AAAA,EACL;AAAA,GAER;;;ACpEJ,IAAAC,iBAAmD;;;AC0C3C,IAAAC,uBAAA;AAfD,SAAS,WAA8C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAuB;AACnB,QAAM,YAA+B,MAAM;AAC3C,QAAM,aACF,YAAY,eAAgB,UAAiC,IAAI;AAErE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,QAAQ,cAAc,OAAO,WAAW,WAAW;AAAA,MACnD,KACI,cAAc,OAAO,WACf,wBACA;AAAA,MAEV,WAAW,CAAC,cAAc,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC7D,aAAW;AAAA,MACX,aAAW;AAAA,MACV,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,YAAY,cACT;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAU;AAAA;AAAA,QACd;AAAA;AAAA;AAAA,EAER;AAER;;;ADEY,IAAAC,uBAAA;AAlCZ,SAAS,eAAe,OAAwB;AAC5C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACA,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,KAAK;AAAA,EACzD,QAAQ;AACJ,WAAO,OAAO,KAAK;AAAA,EACvB;AACJ;AAEA,SAAS,YAAY,OAA6B;AAC9C,QAAM,YAAY,eAAe,KAAK;AACtC,QAAM,WAAW,UAAU,MAAM,wBAAwB;AACzD,MAAI,SAAS;AACb,SAAO,SAAS,IAAI,CAAC,SAAS,UAAU;AACpC,UAAM,MAAM,GAAG,MAAM,IAAI,OAAO;AAChC,cAAU,QAAQ;AAClB,QAAI,CAAC,QAAQ,WAAW,UAAU,EAAG,QAAO;AAE5C,QAAI,OAAO;AACX,UAAM,YACF,SAAS,QAAQ,CAAC,GAAG,SAAS,GAAG,KACjC,SAAS,QAAQ,CAAC,GAAG,WAAW,GAAG;AACvC,QAAI,sBACC,KAAK,MAAM,KAAK,GAAG,UAAU,MAAM,KAAK,MAAM,KAAK,GAAG,UAAU;AAErE,WACI,CAAC,cACA,YAAY,KAAK,IAAI,KACjB,KAAK,SAAS,GAAG,KAAK,qBAAqB,IAClD;AACE,UAAI,KAAK,SAAS,GAAG,EAAG;AACxB,aAAO,KAAK,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,WACI,+CAAC,2BACG;AAAA,oDAAC,cAAW,MAAa,gBAAK;AAAA,MAC7B,QAAQ,MAAM,KAAK,MAAM;AAAA,SAFf,GAGf;AAAA,EAER,CAAC;AACL;AAEA,SAAS,UAAU;AAAA,EACf;AAAA,EACA,QAAQ;AACZ,GAGG;AACC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,QACM,uGACA;AAAA,MACV;AAAA,MAEC,sBAAY,KAAK;AAAA;AAAA,EACtB;AAER;AAEA,IAAM,gBAAgD;AAAA,EAClD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AACZ;AAEA,SAAS,WAAW,EAAE,OAAO,GAA+B;AACxD,QAAM,OACF,WAAW,cAAc,WAAW,uBAChC,8CAAC,aAAU,WAAU,gBAAe,IACpC,WAAW,WAAW,WAAW,WACjC,8CAAC,SAAM,WAAU,gBAAe,IAEhC;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,WAAW,aAAa;AAAA,MAC5B;AAAA;AAAA,EACJ;AAER,SACI;AAAA,IAAC;AAAA;AAAA,MACG,eAAa;AAAA,MACb,WAAW;AAAA,QACP;AAAA,QACA,WAAW,cAAc,WAAW,uBAC9B,4DACA,WAAW,WAAW,WAAW,WAC/B,kEACA;AAAA,MACZ;AAAA,MAEC;AAAA;AAAA,QACA,cAAc,MAAM;AAAA;AAAA;AAAA,EACzB;AAER;AAGO,SAAS,gBAAgB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,UAAU,SAAY,aAAa;AAAA,EAC5C,cAAc;AAAA,EACd;AACJ,GAAyB;AACrB,QAAM,SAAS,UAAU,SAAY,SAAS;AAC9C,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,WAAW;AAC5C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,oBAAkB;AAAA,MAClB,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,SAAS,MAAM,QAAQ,CAACC,aAAY,CAACA,QAAO;AAAA,YAC5C,WAAU;AAAA,YAEV;AAAA,4DAAC,UAAK,WAAU,yJACZ,wDAAC,YAAS,WAAU,kBAAiB,GACzC;AAAA,cACA,8CAAC,UAAK,WAAU,+FACX,gBACL;AAAA,cACA,8CAAC,cAAW,QAAgB;AAAA,cAC5B;AAAA,gBAAC;AAAA;AAAA,kBACG,UAAU;AAAA,kBACV,WAAU;AAAA;AAAA,cACd;AAAA;AAAA;AAAA,QACJ;AAAA,QACC,QACG,+CAAC,SAAI,WAAU,qIACV;AAAA,oBAAU,UACP,+CAAC,SAAI,WAAU,yCACX;AAAA,0DAAC,QAAK,MAAK,MAAK,MAAK,SAAQ,QAAO,QAAO,wBAE3C;AAAA,YACA,8CAAC,aAAU,OAAO,OAAO;AAAA,aAC7B;AAAA,UAEH,WAAW,UACR,+CAAC,SAAI,WAAU,yCACX;AAAA,0DAAC,QAAK,MAAK,MAAK,MAAK,SAAQ,QAAO,QAC/B,oBAAU,SAAY,WAAW,SACtC;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACG,OAAO;AAAA,gBACP,OAAO,UAAU;AAAA;AAAA,YACrB;AAAA,aACJ;AAAA,WAER;AAAA;AAAA;AAAA,EAER;AAER;;;AEvMA,IAAAC,eAAqB;AACrB,IAAAC,yBAAwB;AAGjB,SAASC,OAAM,QAA+C;AACjE,aAAO,oCAAQ,mBAAK,GAAG,MAAM,CAAC;AAClC;;;ACNA,IAAAC,iBAA0B;AAMnB,SAAS,cAAc,UAAU,MAAY;AAChD,gCAAU,MAAM;AACZ,QAAI,CAAC,QAAS;AAEd,UAAM,eAAe,SAAS,KAAK,MAAM;AACzC,UAAM,eAAe,SAAS,gBAAgB,MAAM;AACpD,aAAS,KAAK,MAAM,WAAW;AAC/B,aAAS,gBAAgB,MAAM,WAAW;AAE1C,WAAO,MAAM;AACT,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,gBAAgB,MAAM,WAAW;AAAA,IAC9C;AAAA,EACJ,GAAG,CAAC,OAAO,CAAC;AAChB;;;ACTI,IAAAC,uBAAA;AANG,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ;AAAA,IACA,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA,IAEC;AAAA;AACL;;;ACpBJ,IAAAC,iBAA8C;;;ACwGtC,IAAAC,uBAAA;AA5ER,IAAM,QAUF;AAAA,EACA,IAAI;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACb;AAAA,EACA,IAAI;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,EACb;AACJ;AAOA,IAAM,eAA2C;AAAA,EAC7C,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AACZ;AACA,IAAM,eAA2C;AAAA,EAC7C,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AACZ;AAOO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP;AAAA,EACA;AACJ,MAAM;AACF,QAAM,WAAW,MAAM,IAAI;AAC3B,QAAM,OAAmB,QACnB,WACC,WAAW,UAAU,OAAO;AAEnC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cACI,cAAc,UAAU,oBAAoB;AAAA,MAEhD,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,aAAa,IAAI;AAAA,QACjB;AAAA,MACJ;AAAA,MAEC;AAAA,iBACG;AAAA,UAAC;AAAA;AAAA,YACG,eAAY;AAAA,YACZ,WAAW;AAAA,cACP;AAAA,cACA,SAAS;AAAA,cACT,UAAU,SAAS,UAAU,SAAS;AAAA,YAC1C;AAAA,YAEC,oBAAU,MAAM,MAAM,MAAM;AAAA;AAAA,QACjC;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,SAAS;AAAA,cACT,aAAa,IAAI;AAAA,cACjB,UAAU,SAAS,SAAS;AAAA,YAChC;AAAA,YAEC,mBACG;AAAA,cAAC;AAAA;AAAA,gBACG,eAAY;AAAA,gBACZ,WAAW;AAAA,kBACP;AAAA,kBACA,SAAS;AAAA,gBACb;AAAA,gBAEC,oBAAU,MAAM,KAAK,MAAM;AAAA;AAAA,YAChC;AAAA;AAAA,QAER;AAAA;AAAA;AAAA,EACJ;AAER;;;ADA0B,IAAAC,uBAAA;AAhI1B,IAAM,cAAc;AAEpB,SAAS,aAA+B;AACpC,MAAI;AACA,UAAM,QAAQ,aAAa,QAAQ,WAAW;AAC9C,WAAO,UAAU,WAAW,UAAU,SAAS,QAAQ;AAAA,EAC3D,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEA,SAAS,aAAwB;AAC7B,SAAO,OAAO,WAAW,eACrB,OAAO,aAAa,8BAA8B,EAAE,YAAY,OAC9D,SACA;AACV;AAEA,IAAI,UAAqB,WAAW,KAAK,WAAW;AACpD,IAAM,YAAY,oBAAI,IAAgB;AAEtC,SAAS,QAAc;AACnB,MAAI,OAAO,aAAa,YAAa;AACrC,WAAS,gBAAgB,UAAU,OAAO,QAAQ,YAAY,MAAM;AACpE,iBAAe;AACnB;AAKA,SAAS,iBAAuB;AAC5B,MAAI,OAAO,aAAa,YAAa;AACrC,QAAM,QAAQ,iBAAiB,SAAS,eAAe,EAClD,iBAAiB,sBAAsB,EACvC,KAAK;AACV,MAAI,CAAC,MAAO;AACZ,MAAI,OAAO,SAAS,cAAc,0BAA0B;AAC5D,MAAI,CAAC,MAAM;AACP,WAAO,SAAS,cAAc,MAAM;AACpC,SAAK,aAAa,QAAQ,aAAa;AACvC,aAAS,KAAK,YAAY,IAAI;AAAA,EAClC;AACA,OAAK,aAAa,WAAW,KAAK;AACtC;AAEA,SAAS,OAAa;AAClB,aAAW,YAAY,UAAW,UAAS;AAC/C;AAEA,SAAS,cAAc,OAA2B;AAC9C,MAAI,MAAM,QAAQ,YAAa;AAC/B,QAAM,OAAO,WAAW,KAAK,WAAW;AACxC,MAAI,SAAS,QAAS;AACtB,YAAU;AACV,QAAM;AACN,OAAK;AACT;AAEA,SAAS,UAAU,UAAkC;AACjD,MAAI,UAAU,SAAS,KAAK,OAAO,WAAW,aAAa;AACvD,UAAM;AACN,WAAO,iBAAiB,WAAW,aAAa;AAAA,EACpD;AACA,YAAU,IAAI,QAAQ;AACtB,SAAO,MAAM;AACT,cAAU,OAAO,QAAQ;AACzB,QAAI,UAAU,SAAS,KAAK,OAAO,WAAW,aAAa;AACvD,aAAO,oBAAoB,WAAW,aAAa;AAAA,IACvD;AAAA,EACJ;AACJ;AAEA,SAAS,cAAyB;AAC9B,SAAO;AACX;AAEA,SAAS,oBAA+B;AACpC,SAAO;AACX;AAOO,SAAS,aAAa,MAAuB;AAChD,MAAI,SAAS,QAAS;AACtB,YAAU;AACV,QAAM;AACN,MAAI;AACA,QAAI,SAAS,WAAW,EAAG,cAAa,WAAW,WAAW;AAAA,QACzD,cAAa,QAAQ,aAAa,IAAI;AAAA,EAC/C,QAAQ;AAAA,EAER;AACA,OAAK;AACT;AAEO,SAAS,eAId;AACE,QAAM,WAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,SAAO;AAAA,IACH;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,QAAQ,MAAM,aAAa,SAAS,SAAS,UAAU,MAAM;AAAA,EACjE;AACJ;AAOO,IAAM,kBAAsB,MAAM;AACrC,QAAM,EAAE,QAAQ,OAAO,IAAI,aAAa;AACxC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAU;AAAA,MACV,MAAK;AAAA,MACL,OAAO,EAAE,KAAK,8CAAC,WAAQ,GAAI,IAAI,8CAAC,YAAS,EAAG;AAAA;AAAA,EAChD;AAER;;;AE7JA,IAAAC,iBAAoC;AACpC,IAAAC,iBAAuB;AAEvB,IAAAC,iBAAuB;AA6BX,IAAAC,uBAAA;AAhBL,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AACJ,MAAM;AACF,QAAM,iBAAa,uBAAuB,IAAI;AAE9C,SACI;AAAA,IAAC,eAAAC,OAAU;AAAA,IAAV;AAAA,MACG;AAAA,MACA,gBAAgB,MAAM,WAAW;AAAA,MACjC,cAAc,CAAC,YAAY,aAAa,QAAQ,IAAI;AAAA,MAEpD,yDAAC,yBACG;AAAA,sDAAC,eAAAA,OAAU,UAAV,EAAmB,WAAU,qFAAoF;AAAA,QAClH,8CAAC,eAAAA,OAAU,YAAV,EAAqB,WAAU,uGAC5B;AAAA,UAAC,eAAAA,OAAU;AAAA,UAAV;AAAA,YACG,KAAK;AAAA,YACL,cAAY;AAAA,YACZ,WAAW;AAAA,cACP;AAAA,cACA,SAAS,UACH,iCACA;AAAA,cACN;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL,GACJ;AAAA,SACJ;AAAA;AAAA,EACJ;AAER;;;AC7BQ,IAAAC,uBAAA;AARD,SAAS,aAAqD;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAyB;AACrB,QAAM,YAA+B,MAAM;AAC3C,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAI,cAAc,WAAW,EAAE,MAAM,SAAS,IAAI;AAAA,MAClD,GAAG;AAAA,MACJ,WAAW;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AC7BQ,IAAAC,uBAAA;AAFD,SAAS,cAAc,EAAE,SAAS,GAA4B;AACjE,SACI,+CAAC,YAAO,WAAU,uGACd;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,eAAY;AAAA,QACZ,WAAU;AAAA;AAAA,IACd;AAAA,IACC;AAAA,KACL;AAER;;;ACbA,IAAAC,iBAA+C;AAsEnC,IAAAC,uBAAA;AAnEZ,IAAM,WAAW,CAAC,UAAuC;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,GAAI,QAAO;AAC7D,QAAM,eAAe,OAAO,KAAK;AACjC,SAAO,OAAO,SAAS,YAAY,IAAI,eAAe;AAC1D;AAEA,IAAM,eAAe,CAAC,UAClB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,CAAC;AAEpC,IAAM,qBAAqB,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAM0B;AACtB,MAAI,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,GAAG;AAC3D,WAAO,aAAa,QAAQ;AAAA,EAChC;AAEA,QAAM,eAAe,SAAS,SAAS,YAAY;AACnD,MAAI,iBAAiB,OAAW,QAAO;AAEvC,QAAM,aAAa,SAAS,GAAG,KAAK;AACpC,QAAM,aAAa,SAAS,GAAG,KAAK;AACpC,MAAI,cAAc,WAAY,QAAO;AAErC,SAAO;AAAA,KACD,eAAe,eAAe,aAAa,cAAe;AAAA,EAChE;AACJ;AAUO,IAAM,aAAS;AAAA,EAClB,CACI,EAAE,WAAW,cAAc,KAAK,KAAK,UAAU,OAAO,OAAO,GAAG,MAAM,GACtE,QACC;AACD,UAAM,kBAAkB,mBAAmB;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AACD,UAAM,cAAc;AAAA,MAChB,GAAG;AAAA,MACH,GAAI,oBAAoB,SAClB,OACA,EAAE,2BAA2B,GAAG,eAAe,IAAI;AAAA,IAC7D;AAEA,WACI;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,WAAW,GAAG,gBAAgB,SAAS;AAAA,QACtC,GAAG;AAAA;AAAA,IACR;AAAA,EAER;AACJ;;;AC7DI,IAAAC,uBAAA;AAfJ,IAAM,eAAsC;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACX;AAEA,IAAM,mBAA8C;AAAA,EAChD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACZ;AAIO,IAAM,QAAwB,CAAC,EAAE,WAAW,GAAG,KAAK,MACvD;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA;AACJ;AAKG,IAAM,YAAgC,CAAC,EAAE,WAAW,GAAG,KAAK,MAC/D;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA;AACJ;AAOG,IAAM,YAAgC,CAAC;AAAA,EAC1C;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA,YAAY,YACN,yBACA;AAAA,MACN;AAAA,IACJ;AAAA;AACJ;AAOG,IAAM,WAA8B,CAAC;AAAA,EACxC,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA,iBAAiB,MAAM;AAAA,MACvB;AAAA,IACJ;AAAA;AACJ;AAcG,IAAM,kBAA4C,CAAC;AAAA,EACtD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACF,QAAM,UACF,gFACI;AAAA,kDAAC,UAAM,UAAS;AAAA,IACf,UACG;AAAA,MAAC;AAAA;AAAA,QACG,eAAY;AAAA,QACZ,WAAU;AAAA,QAET,oBAAU,gBACL,kBAAkB,QACd,WACA,WACJ;AAAA;AAAA,IACV;AAAA,KAER;AAGJ,QAAM,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,KAAK;AAAA,IAClB,UAAU;AAAA,IACV,UACI;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,CAAC,QAAQ;AACT,WACI,8CAAC,QAAI,GAAG,MAAM,WAAW,SACpB,mBACL;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,aACI,UAAU,gBACJ,kBAAkB,QACd,cACA,eACJ;AAAA,MAEV,WAAW;AAAA,MAEX;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,YACP;AAAA,YACA,UAAU,WAAW;AAAA,YACrB,UAAU,YAAY;AAAA,UAC1B;AAAA,UAEC;AAAA;AAAA,MACL;AAAA;AAAA,EACJ;AAER;AAQO,IAAM,YAAgC,CAAC;AAAA,EAC1C,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAW;AAAA,MACP;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,IACJ;AAAA;AACJ;;;ACvKA,IAAAC,uBAAA;AAPG,IAAM,wBAAwD,CAAC;AAAA,EAClE;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,MAAK;AAAA,IACL,iBAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACP;AAAA,MACA,WACM,0CACA;AAAA,MACN;AAAA,IACJ;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,WAAU;AAAA;AAAA,MACd;AAAA,MACC;AAAA;AAAA;AACL;","names":["cn","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","intentClasses","sizeClasses","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_portal","import_react","import_jsx_runtime","ArkDialog","import_jsx_runtime","import_jsx_runtime","sizeClasses","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","_size","_appearance","_external","_showIcon","_icon","_className","_children","import_jsx_runtime","import_react","document","current","import_react","import_jsx_runtime","intentClasses","variantClasses","sizeClasses","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","intentClasses","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","start","yearText","import_jsx_runtime","variantClasses","intentClasses","import_jsx_runtime","addUtcMonths","start","granularity","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","current","import_clsx","import_tailwind_merge","cn","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_dialog","import_portal","import_react","import_jsx_runtime","ArkDialog","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|