@pollinations/ui 0.0.2 → 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +10 -6
  2. package/dist/{Button-CWUBCiIc.d.cts → Button-BvLF_Km2.d.cts} +3 -3
  3. package/dist/{Button-Bn8pGg6N.d.ts → Button-DQAZzvyQ.d.ts} +3 -3
  4. package/dist/auth/index.cjs +77 -62
  5. package/dist/auth/index.cjs.map +1 -1
  6. package/dist/auth/index.js +77 -62
  7. package/dist/auth/index.js.map +1 -1
  8. package/dist/auth/sdk.cjs +7 -6
  9. package/dist/auth/sdk.cjs.map +1 -1
  10. package/dist/auth/sdk.d.cts +1 -1
  11. package/dist/auth/sdk.d.ts +1 -1
  12. package/dist/auth/sdk.js +7 -6
  13. package/dist/auth/sdk.js.map +1 -1
  14. package/dist/compositions/app-user.cjs +497 -0
  15. package/dist/compositions/app-user.cjs.map +1 -0
  16. package/dist/compositions/app-user.d.cts +18 -0
  17. package/dist/compositions/app-user.d.ts +18 -0
  18. package/dist/compositions/app-user.js +469 -0
  19. package/dist/compositions/app-user.js.map +1 -0
  20. package/dist/index.cjs +932 -270
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +101 -6
  23. package/dist/index.d.ts +101 -6
  24. package/dist/index.js +891 -247
  25. package/dist/index.js.map +1 -1
  26. package/dist/modality/index.cjs +21 -18
  27. package/dist/modality/index.cjs.map +1 -1
  28. package/dist/modality/index.d.cts +6 -5
  29. package/dist/modality/index.d.ts +6 -5
  30. package/dist/modality/index.js +21 -18
  31. package/dist/modality/index.js.map +1 -1
  32. package/dist/models/index.cjs +508 -0
  33. package/dist/models/index.cjs.map +1 -0
  34. package/dist/models/index.d.cts +22 -0
  35. package/dist/models/index.d.ts +22 -0
  36. package/dist/models/index.js +486 -0
  37. package/dist/models/index.js.map +1 -0
  38. package/dist/styles.css +1 -1
  39. package/dist/wallet/index.cjs +13 -4
  40. package/dist/wallet/index.cjs.map +1 -1
  41. package/dist/wallet/index.js +13 -4
  42. package/dist/wallet/index.js.map +1 -1
  43. package/dist/wallet/sdk.cjs +2 -2
  44. package/dist/wallet/sdk.cjs.map +1 -1
  45. package/dist/wallet/sdk.js +2 -2
  46. package/dist/wallet/sdk.js.map +1 -1
  47. package/package.json +17 -5
  48. package/dist/wallet.css +0 -73
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/cn-app.ts","../src/lib/period.ts","../src/lib/use-scroll-lock.ts","../src/lib/cn.ts","../src/primitives/Alert.tsx","../src/primitives/Button.tsx","../src/primitives/ButtonGroup.tsx","../src/primitives/ChevronIcon.tsx","../src/primitives/Chip.tsx","../src/primitives/Collapsible.tsx","../src/primitives/CopyButton.tsx","../src/primitives/Tooltip.tsx","../src/primitives/Dialog.tsx","../src/primitives/Dropdown.tsx","../src/primitives/icons/index.tsx","../src/primitives/ExternalLinkButton.tsx","../src/primitives/Field.tsx","../src/primitives/IconButton.tsx","../src/primitives/InfoTip.tsx","../src/primitives/Input.tsx","../src/primitives/ScrollArea.tsx","../src/primitives/MultiSelect.tsx","../src/primitives/PeriodPicker.tsx","../src/primitives/TabButton.tsx","../src/primitives/Surface.tsx","../src/primitives/Section.tsx","../src/primitives/Slider.tsx","../src/primitives/StatCard.tsx","../src/primitives/Switch.tsx","../src/primitives/Table.tsx","../src/theme.ts"],"sourcesContent":["export { cn } from \"./lib/cn-app.ts\";\nexport {\n currentPeriod,\n getPeriodBucketKeys,\n type PeriodGranularity,\n type PeriodSelection,\n periodBucketKeyToDate,\n} from \"./lib/period.ts\";\nexport { useScrollLock } from \"./lib/use-scroll-lock.ts\";\nexport { Alert, type AlertProps } from \"./primitives/Alert.tsx\";\nexport { Button, type ButtonProps } 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 Collapsible,\n type CollapsibleProps,\n} from \"./primitives/Collapsible.tsx\";\nexport { CopyButton, type CopyButtonProps } from \"./primitives/CopyButton.tsx\";\nexport {\n Dialog,\n type DialogProps,\n DialogTitle,\n} from \"./primitives/Dialog.tsx\";\nexport { Dropdown, type DropdownProps } from \"./primitives/Dropdown.tsx\";\nexport {\n ExternalLinkButton,\n type ExternalLinkButtonProps,\n} from \"./primitives/ExternalLinkButton.tsx\";\nexport { Field } from \"./primitives/Field.tsx\";\nexport { IconButton } from \"./primitives/IconButton.tsx\";\nexport { InfoTip } from \"./primitives/InfoTip.tsx\";\nexport { Input, type InputProps } from \"./primitives/Input.tsx\";\nexport * from \"./primitives/icons/index.tsx\";\nexport {\n MultiSelect,\n type MultiSelectProps,\n} from \"./primitives/MultiSelect.tsx\";\nexport {\n PeriodPicker,\n type PeriodPickerProps,\n} from \"./primitives/PeriodPicker.tsx\";\nexport { ScrollArea, type ScrollAreaProps } from \"./primitives/ScrollArea.tsx\";\nexport { Section, type SectionProps } from \"./primitives/Section.tsx\";\nexport { Slider, type SliderProps } from \"./primitives/Slider.tsx\";\nexport { StatCard, type StatCardProps } from \"./primitives/StatCard.tsx\";\nexport { Surface } from \"./primitives/Surface.tsx\";\nexport {\n Switch,\n type SwitchProps,\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 { Tooltip } from \"./primitives/Tooltip.tsx\";\nexport { type ThemeName, themes } from \"./theme.ts\";\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","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 formatPeriodLabel(selection: PeriodSelection): string {\n const { start, end } = periodToWindow(selection);\n\n if (selection.granularity === \"day\") {\n const today = startOfUtcDay();\n const yesterday = addUtcDays(today, -1);\n if (start.getTime() === today.getTime()) return \"Today\";\n if (start.getTime() === yesterday.getTime()) return \"Yesterday\";\n return start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n }\n\n if (selection.granularity === \"week\") {\n const weekEnd = addUtcDays(end, -1);\n return `${start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n })} - ${weekEnd.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n })}`;\n }\n\n return start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"long\",\n year: \"numeric\",\n });\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 { 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 { 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 { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype AlertIntent = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst intentClasses: Record<AlertIntent, string> = {\n info: \"polli:border-theme-border polli:bg-theme-bg-pale polli:text-theme-text-strong\",\n success:\n \"polli:border-intent-success-border polli:bg-intent-success-bg-light polli:text-intent-success-text\",\n warning:\n \"polli:border-intent-warning-border polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type AlertProps = ComponentPropsWithoutRef<\"div\"> & {\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:border polli:px-3 polli:py-2 polli:text-sm\",\n intentClasses[intent],\n className,\n )}\n >\n {title && (\n <div className=\"polli:mb-1 polli:text-xs polli:font-bold polli:uppercase polli:tracking-wide\">\n {title}\n </div>\n )}\n <div>{children}</div>\n </div>\n);\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\n/** Button only supports `danger`. Label/status color recipes live on Chip. */\ntype ButtonIntent = \"danger\";\n\nconst sizes = {\n small: \"polli:px-2 polli:pt-0.5 polli:pb-1\",\n medium: \"polli:px-4 polli:pt-1.5 polli:pb-2\",\n large: \"polli:px-6 polli:py-3\",\n} as const;\n\n// Cascade-driven base — reads [data-theme] vars.\nconst themeClasses =\n \"polli:bg-theme-bg-active polli:text-theme-text-base \" +\n \"polli:hover:bg-theme-bg-hover polli:transition-colors\";\n\n// Single intent: danger. Soft recipe — light tile + deep text, slightly\n// deeper bg on hover. No filled CTAs anywhere.\nconst intentClasses: Record<ButtonIntent, string> = {\n danger:\n \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text \" +\n \"polli:hover:bg-[oklch(0.88_0.075_25)] polli:transition-colors\",\n};\n\ntype BaseButtonProps = {\n /** Override the cascade theme for this button's subtree. Ignored when `intent` is set. */\n theme?: ThemeName;\n /** Only `\"danger\"` for now. */\n intent?: ButtonIntent;\n size?: keyof typeof sizes;\n className?: string;\n disabled?: boolean;\n};\n\nconst buttonClasses = ({\n theme: _theme,\n intent,\n size,\n className,\n disabled,\n}: BaseButtonProps & { disabled?: boolean }) => {\n const colorClasses = intent ? intentClasses[intent] : themeClasses;\n return cn(\n \"polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:self-center polli:placeholder-green-950 polli:font-medium polli:leading-normal polli:box-border\",\n disabled\n ? \"polli:opacity-50 polli:cursor-not-allowed\"\n : \"polli:hover:filter polli:hover:brightness-105 polli:cursor-pointer\",\n colorClasses,\n sizes[size || \"medium\"],\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 theme,\n intent,\n size,\n className,\n disabled,\n ...buttonProps\n}: ButtonProps<T>) {\n const Component: React.ElementType = as || \"button\";\n\n return (\n <Component\n // Cascade override only applies when `intent` is unset.\n data-theme={intent ? undefined : theme}\n className={buttonClasses({\n theme,\n intent,\n size,\n className,\n disabled,\n })}\n disabled={disabled}\n {...buttonProps}\n >\n {children}\n </Component>\n );\n}\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type ButtonGroupProps = ComponentPropsWithoutRef<\"div\"> & {\n wrap?: boolean;\n};\n\nexport const ButtonGroup: FC<ButtonGroupProps> = ({\n wrap = true,\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:items-center polli:gap-1.5\",\n wrap ? \"polli:flex-wrap\" : \"polli:flex-nowrap\",\n className,\n )}\n >\n {children}\n </div>\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 type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\n/** Semantic chip labels for status and metadata badges. */\ntype ChipIntent =\n | \"news\"\n | \"alpha\"\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"danger\";\n\nconst chipSizes = {\n sm: \"polli:px-2 polli:py-0.5 polli:text-xs\",\n md: \"polli:px-2.5 polli:py-0.5 polli:text-sm\",\n lg: \"polli:px-3 polli:py-1 polli:text-sm\",\n} as const;\n\nconst intentClasses: Record<ChipIntent, string> = {\n news: \"polli:bg-[oklch(0.935_0.06_158)] polli:text-[oklch(0.46_0.13_158)]\",\n alpha: \"polli:bg-[oklch(0.93_0.06_300)] polli:text-[oklch(0.42_0.18_300)]\",\n neutral:\n \"polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900\",\n success:\n \"polli:border polli:border-intent-success-border polli:bg-intent-success-bg-light polli:text-intent-success-text\",\n warning:\n \"polli:border polli:border-intent-warning-border polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"polli:border polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type ChipProps = ComponentPropsWithoutRef<\"span\"> & {\n /** Override the cascade theme for this chip's subtree. */\n theme?: ThemeName;\n /** Semantic intent. Wins over `theme` when set. */\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 theme,\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 data-theme={theme}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-normal\",\n chipSizes[size],\n intentClass,\n className,\n )}\n >\n {children}\n </span>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"./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 — base bg, border, etc. */\n wrapperClassName?: 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 primitive. 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 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: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 !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 {\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 { Tooltip } from \"./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 copiedTooltip?: ReactNode;\n tooltipClassName?: string;\n className?: string | ((copied: boolean) => string);\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 copiedTooltip = \"Copied!\",\n tooltipClassName,\n className,\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 button = (\n <button\n {...buttonProps}\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n typeof className === \"function\" ? className(copied) : className,\n )}\n >\n {typeof children === \"function\" ? children(copied) : children}\n </button>\n );\n\n return (\n <Tooltip\n triggerAs=\"span\"\n content={copied ? copiedTooltip : tooltip}\n className={tooltipClassName}\n >\n {button}\n </Tooltip>\n );\n}\n","import {\n type CSSProperties,\n type FC,\n type MouseEvent,\n type ReactNode,\n useRef,\n useState,\n} from \"react\";\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 ariaLabel?: string;\n className?: string;\n onClick?: () => void;\n style?: CSSProperties;\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 ariaLabel,\n className,\n onClick,\n style,\n triggerAs = \"button\",\n displayContents = false,\n}) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState({\n top: 0,\n left: 0,\n maxWidth: TOOLTIP_MAX_WIDTH,\n });\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const updateTooltipPosition = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const maxWidth = Math.min(\n TOOLTIP_MAX_WIDTH,\n window.innerWidth - TOOLTIP_VIEWPORT_MARGIN * 2,\n );\n const left = Math.min(\n Math.max(rect.left, TOOLTIP_VIEWPORT_MARGIN),\n Math.max(\n TOOLTIP_VIEWPORT_MARGIN,\n window.innerWidth - maxWidth - TOOLTIP_VIEWPORT_MARGIN,\n ),\n );\n setTooltipPosition({\n top: rect.bottom + 4,\n left,\n maxWidth,\n });\n }\n };\n\n // Universal cursor for every tooltip trigger across the app.\n // `cursor-help` = standard \"?\" pointer that means \"more info on hover\".\n const triggerClassName = cn(\n \"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-help\";\n\n // Thin theme-cascade popup. bg + border + text all follow the active\n // page theme so the tooltip reads as \"part of the page\", not system\n // chrome. Uses the pale theme bg (one step lighter than chip-bg) so\n // it doesn't dominate. Same recipe on desktop and mobile —\n // viewport-clamped via `tooltipPosition`.\n const popupClasses =\n \"polli:fixed polli:w-max polli:px-2 polli:py-1 polli:bg-theme-bg-pale polli:text-theme-text-strong polli:border polli:border-theme-border polli:text-xs polli:rounded-md polli:shadow-sm polli:z-50 polli:pointer-events-none polli:transition-opacity polli:whitespace-pre-line polli:break-words\";\n\n const contentNode = (\n <>\n <span className={cursorClass}>{children}</span>\n <span\n style={{\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n maxWidth: tooltipPosition.maxWidth,\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 </>\n );\n\n const sharedProps = {\n \"aria-label\": ariaLabel,\n className: triggerClassName,\n onMouseEnter: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onMouseLeave: () => setShowTooltip(false),\n onClick: (e: MouseEvent) => {\n e.stopPropagation();\n if (onClick) {\n onClick();\n }\n if (triggerAs === \"span\") {\n return;\n }\n updateTooltipPosition();\n setShowTooltip((prev) => !prev);\n },\n style,\n };\n\n if (triggerAs === \"span\") {\n return (\n <span\n ref={(node) => {\n triggerRef.current = node;\n }}\n {...sharedProps}\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 className={triggerClassName}\n onMouseEnter={sharedProps.onMouseEnter}\n onMouseLeave={sharedProps.onMouseLeave}\n onClick={sharedProps.onClick}\n style={style}\n >\n {contentNode}\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 { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nconst sizeClasses = {\n sm: \"polli:max-w-md\",\n md: \"polli:max-w-xl\",\n lg: \"polli:max-w-2xl\",\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 titleClassName?: string;\n ariaLabel?: string;\n labelledBy?: string;\n theme?: ThemeName;\n size?: keyof typeof sizeClasses;\n showBackdrop?: boolean;\n backdropClassName?: string;\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 titleClassName,\n ariaLabel,\n labelledBy,\n theme = \"blue\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n positionerClassName,\n contentClassName,\n children,\n}) => (\n <ArkDialog.Root\n open={open}\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 className={cn(\n \"polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50\",\n backdropClassName,\n )}\n />\n )}\n <ArkDialog.Positioner\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[110] polli:flex polli:h-dvh polli:items-start polli:justify-center polli:overflow-hidden polli:p-4\",\n positionerClassName,\n )}\n >\n <ArkDialog.Content\n data-theme={theme}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n className={cn(\n \"polli:my-auto polli:w-full polli:overflow-hidden polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-white polli:shadow-lg\",\n sizeClasses[size],\n contentClassName,\n )}\n >\n {title && (\n <DialogTitle\n className={cn(\n \"polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong\",\n titleClassName,\n )}\n >\n {title}\n </DialogTitle>\n )}\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n);\n\nexport const DialogTitle = ArkDialog.Title;\n","import { Popover } from \"@ark-ui/react/popover\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { FC, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nconst DEFAULT_PANEL =\n \"polli:rounded-lg polli:border polli:border-theme-border polli:bg-surface-white polli:shadow-lg\";\n\nexport type DropdownProps = {\n theme: ThemeName;\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 /** Controlled open state. Omit to let the Dropdown manage its own. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Replaces the default themed surface (e.g. a differently-coloured menu). */\n panelClassName?: string;\n /** Appended after the surface (widths, padding, max-height…). */\n className?: string;\n};\n\nexport const Dropdown: FC<DropdownProps> = ({\n theme,\n trigger,\n children,\n align = \"start\",\n open: openProp,\n onOpenChange,\n panelClassName,\n className,\n}) => {\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 open={open}\n onOpenChange={(details) => setOpen(details.open)}\n positioning={{\n placement: align === \"end\" ? \"bottom-end\" : \"bottom-start\",\n }}\n >\n <Popover.Trigger asChild>{trigger(open)}</Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content\n data-theme={theme}\n className={cn(\n \"polli:z-50 polli:overflow-hidden polli:focus:outline-none\",\n panelClassName ?? 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 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 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 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 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 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 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 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 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=\"7\" width=\"8\" height=\"10\" rx=\"1.5\" />\n <rect x=\"14\" y=\"7\" width=\"8\" height=\"10\" 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 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 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 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 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\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 type { IconProps } from \"./types.ts\";\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { Button } from \"./Button.tsx\";\nimport { ExternalLinkIcon } from \"./icons/index.tsx\";\n\nexport type ExternalLinkButtonProps = {\n theme: ThemeName;\n href: string;\n size?: \"small\" | \"medium\" | \"large\";\n className?: string;\n children: ReactNode;\n};\n\nexport const ExternalLinkButton: FC<ExternalLinkButtonProps> = ({\n theme,\n href,\n size = \"medium\",\n className,\n children,\n}) => (\n <Button\n as=\"a\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n theme={theme}\n size={size}\n className={cn(\"polli:gap-2\", className)}\n >\n <span>{children}</span>\n <ExternalLinkIcon\n className=\"polli:h-4 polli:w-4 polli:shrink-0 polli:opacity-60\"\n aria-hidden=\"true\"\n />\n </Button>\n);\n","export { Field } from \"@ark-ui/react/field\";\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\n/** IconButton only supports `danger` (delete icons). */\ntype IconButtonIntent = \"danger\";\n\nconst intentClasses: Record<IconButtonIntent, string> = {\n danger:\n \"polli:bg-intent-danger-bg-light polli:hover:bg-[oklch(0.88_0.075_25)] \" +\n \"polli:text-intent-danger-text\",\n};\n\n// Default (no intent): cascade-driven theme tile, deeper on hover.\nconst defaultClasses =\n \"polli:bg-theme-bg-active polli:hover:bg-theme-bg-hover \" +\n \"polli:text-theme-text-soft polli:hover:text-theme-text-strong\";\n\ntype IconButtonProps = {\n intent?: IconButtonIntent;\n title?: string;\n onClick: () => void;\n children: ReactNode;\n className?: string;\n};\n\nexport const IconButton: FC<IconButtonProps> = ({\n intent,\n title,\n onClick,\n children,\n className,\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n aria-label={title}\n className={cn(\n \"polli:inline-flex polli:h-6 polli:w-6 polli:cursor-pointer polli:items-center polli:justify-center polli:rounded polli:transition-colors\",\n intent ? intentClasses[intent] : defaultClasses,\n className,\n )}\n >\n {children}\n </button>\n);\n","import type { FC, ReactNode } from \"react\";\nimport { Tooltip } from \"./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 * Both the badge and the popup follow the page theme: badge reads\n * `bg-theme-bg-active`; popup uses the universal recipe via `<Tooltip>`\n * (`bg-theme-bg-pale` + `border-theme-border` + `text-theme-text-strong`,\n * viewport-clamped). Cursor on the badge is `cursor-help`.\n */\nexport const InfoTip: FC<InfoTipProps> = ({\n text,\n content,\n label = \"More info\",\n}) => (\n <Tooltip content={content ?? text} ariaLabel={label} className=\"polli:ml-1\">\n <span className=\"polli:inline-flex polli:h-3.5 polli:w-3.5 polli:items-center polli:justify-center polli:rounded-full polli:border polli:border-theme-border polli:bg-theme-bg-active polli:font-bold polli:text-micro polli:text-theme-text-strong polli:transition-colors\">\n i\n </span>\n </Tooltip>\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 className={cn(\n \"polli:px-3 polli:py-2 polli:border polli:rounded-lg\",\n \"polli:disabled:opacity-50 polli:disabled:cursor-not-allowed\",\n error ? \"polli:border-red-400\" : \"polli:border-gray-300\",\n hideNumberSteppers && \"polli-input-number-clean\",\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\";\nimport type { ThemeName } from \"../theme.ts\";\n\ntype ScrollAxis = \"y\" | \"x\";\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};\n\ntype ScrollAreaOwnProps = {\n /** Override the ambient cascade theme for this scroller's thumb. */\n theme?: ThemeName;\n /** Scroll direction. Default `y`. */\n axis?: ScrollAxis;\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/**\n * Themed auto-hide scroll container. Thumb color follows the nearest\n * `[data-theme=\"...\"]` ancestor; pass `theme` to override locally.\n */\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ theme, axis = \"y\", className, children, ...rest }, externalRef) => {\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 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 }, []);\n\n return (\n <div\n {...rest}\n ref={setRef}\n data-theme={theme}\n className={cn(\n \"polli-scrollbar-subtle 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 { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { ChevronIcon } from \"./ChevronIcon.tsx\";\nimport { Dropdown } from \"./Dropdown.tsx\";\nimport { ScrollArea } from \"./ScrollArea.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 align?: \"start\" | \"end\";\n label?: string;\n theme: ThemeName;\n};\n\nconst TRIGGER_BASE =\n \"polli:inline-flex polli:min-h-8 polli:min-w-[140px] polli:items-center polli:gap-2 polli:rounded-full polli:border 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: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 align = \"start\",\n label,\n theme,\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 ? \"All\"\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 data-theme={theme}\n className=\"polli:group polli:relative polli:flex polli:items-center polli:gap-2\"\n >\n {labelNode}\n <button\n type=\"button\"\n disabled\n className={cn(\n TRIGGER_BASE,\n \"polli:cursor-not-allowed polli:border-theme-border polli:bg-theme-bg-subtle polli:opacity-60\",\n )}\n >\n <span className=\"polli:flex-1 polli:truncate polli:text-left polli:text-theme-text-soft/60\">\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 <span className=\"polli:pointer-events-none polli:absolute polli:-top-8 polli:left-1/2 polli:z-[100] polli:-translate-x-1/2 polli:whitespace-nowrap polli:rounded-md polli:border polli:border-theme-border polli:bg-theme-bg-pale polli:px-2 polli:py-1 polli:text-xs polli:text-theme-text-strong polli:opacity-0 polli:shadow-sm polli:transition-opacity polli:group-hover:opacity-100\">\n No items available\n </span>\n </div>\n );\n }\n\n return (\n <div\n data-theme={theme}\n className=\"polli:flex polli:items-center polli:gap-2\"\n >\n {labelNode}\n <Dropdown\n theme={theme}\n align={align}\n className=\"polli:min-w-[320px]\"\n trigger={(open) => (\n <button\n type=\"button\"\n className={cn(\n TRIGGER_BASE,\n open\n ? \"polli:border-theme-border polli:bg-theme-bg-active\"\n : \"polli:border-theme-border polli:bg-theme-bg-subtle polli:hover:bg-theme-bg-pale\",\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 theme={theme} className=\"polli:max-h-64\">\n <button\n type=\"button\"\n onClick={selectAll}\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 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 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 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:whitespace-nowrap\">\n {opt.label}\n </span>\n </button>\n );\n })}\n </ScrollArea>\n </Dropdown>\n </div>\n );\n};\n","import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport {\n addUtcDays,\n formatPeriodLabel,\n isPeriodSelectable,\n type PeriodGranularity,\n type PeriodSelection,\n periodFromDate,\n periodToWindow,\n startOfUtcDay,\n} from \"../lib/period.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { ChevronIcon } from \"./ChevronIcon.tsx\";\nimport { Dropdown } from \"./Dropdown.tsx\";\nimport { TabButton } from \"./TabButton.tsx\";\n\nexport type PeriodPickerProps = {\n value: PeriodSelection;\n onChange: (value: PeriodSelection) => void;\n theme: ThemeName;\n minDate?: Date;\n maxDate?: Date;\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: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 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 theme,\n minDate = new Date(0),\n maxDate,\n}) => {\n const [open, setOpen] = useState(false);\n const [viewDate, setViewDate] = useState<Date>(() => periodDate(value));\n const { granularity, period } = value;\n\n useEffect(() => {\n setViewDate(periodDate({ granularity, period }));\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\n const setGranularity = (granularity: PeriodGranularity) => {\n onChange(periodFromDate(granularity, periodDate(value)));\n };\n\n const selectDate = (date: Date) => {\n onChange(periodFromDate(value.granularity, date));\n setOpen(false);\n };\n\n const viewLabel =\n value.granularity === \"month\"\n ? String(viewDate.getUTCFullYear())\n : viewDate.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"long\",\n year: \"numeric\",\n });\n\n return (\n <div\n data-theme={theme}\n className=\"polli:flex polli:flex-wrap polli:items-center polli:gap-2\"\n >\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 <Dropdown\n theme={theme}\n open={open}\n onOpenChange={setOpen}\n className=\"polli:w-[304px] polli:rounded-xl polli:p-3\"\n trigger={(isOpen) => (\n <button\n type=\"button\"\n aria-label={`Select period, current ${formatPeriodLabel(value)}`}\n className={cn(\n \"polli:inline-flex polli:min-w-[150px] polli:items-center polli:justify-between polli:gap-2 polli:rounded-full polli:border polli:px-4 polli:pt-1.5 polli:pb-2 polli:text-left polli:text-base polli:font-medium polli:leading-normal\",\n \"polli:border-theme-border polli:bg-theme-bg-subtle polli:text-theme-text-base\",\n \"polli:transition-all polli:duration-200 polli:ease-out polli:hover:bg-theme-bg-pale\",\n isOpen &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:shadow-sm\",\n )}\n >\n <span>{formatPeriodLabel(value)}</span>\n <ChevronIcon expanded={isOpen} />\n </button>\n )}\n >\n <div className=\"polli:mb-3 polli:flex polli:items-center polli:justify-between\">\n <button\n type=\"button\"\n aria-label={\n value.granularity === \"month\"\n ? \"Previous year\"\n : \"Previous month\"\n }\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-sm polli:font-bold polli:text-theme-text-base\">\n {viewLabel}\n </div>\n <button\n type=\"button\"\n aria-label={\n value.granularity === \"month\"\n ? \"Next year\"\n : \"Next month\"\n }\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 disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli:rounded-lg polli:px-3 polli:py-2 polli:text-xs 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-gray-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-gray-300 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-micro polli:font-bold polli:uppercase polli:text-gray-400\">\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 week ${formatPeriodLabel(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 disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli:aspect-square polli:rounded-lg polli:text-xs polli:font-medium polli:transition-colors polli:duration-150\",\n !inCurrentMonth &&\n \"polli:text-gray-300\",\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-gray-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-gray-300 polli:hover:bg-transparent\",\n )}\n >\n {date.getUTCDate()}\n </button>\n );\n })}\n </div>\n </>\n )}\n </Dropdown>\n </div>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nexport type TabButtonProps = {\n active: boolean;\n onClick: () => void;\n children: ReactNode;\n /** Optional cascade override; defaults to inherited [data-theme]. */\n theme?: ThemeName;\n size?: \"medium\" | \"small\";\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n};\n\nconst sizeClasses = {\n medium: \"polli:px-4 polli:py-1.5 polli:text-base\",\n small: \"polli:px-3 polli:py-1.5 polli:text-sm\",\n} as const;\n\nexport const TabButton: FC<TabButtonProps> = ({\n theme,\n active,\n onClick,\n children,\n size = \"medium\",\n ariaLabel,\n disabled = false,\n className,\n}) => {\n return (\n <button\n type=\"button\"\n data-theme={theme}\n onClick={onClick}\n aria-label={ariaLabel}\n aria-pressed={active}\n disabled={disabled}\n className={cn(\n \"polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:border polli:font-medium polli:leading-normal polli:transition-all polli:duration-200\",\n active\n ? \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:border-theme-border\"\n : \"polli:bg-theme-bg-subtle polli:text-theme-text-base polli:border-theme-border polli:hover:bg-theme-bg-active\",\n disabled && \"polli:cursor-not-allowed polli:opacity-50\",\n sizeClasses[size],\n className,\n )}\n >\n {children}\n </button>\n );\n};\n","import type { ComponentPropsWithoutRef, FC, PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\ntype SurfaceVariant = \"panel\" | \"card\" | \"card-themed\";\n\nconst variantClasses: Record<SurfaceVariant, string> = {\n panel: \"polli:rounded-2xl polli:border polli:border-theme-border polli:bg-theme-bg-subtle polli:p-6\",\n card: \"polli:rounded-xl polli:bg-surface-white polli:p-4\",\n \"card-themed\": \"polli:rounded-xl polli:bg-theme-bg-pale polli:p-4\",\n};\n\ntype SurfaceOwnProps = {\n /** Override the cascade theme for this surface's subtree. */\n theme?: ThemeName;\n /**\n * Visual role.\n * - `panel` — outer container: bordered, semi-transparent theme bg\n * - `card` — borderless white inner (default)\n * - `card-themed` — borderless theme-tinted inner (deeper than panel)\n */\n variant?: SurfaceVariant;\n className?: string;\n};\n\ntype SurfaceProps = PropsWithChildren<\n SurfaceOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof SurfaceOwnProps | \"color\">\n>;\n\nexport const Surface: FC<SurfaceProps> = ({\n theme,\n variant = \"card\",\n className,\n children,\n ...rest\n}) => (\n <div\n {...rest}\n data-theme={theme}\n className={cn(\"polli:min-w-0\", variantClasses[variant], className)}\n >\n {children}\n </div>\n);\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { Surface } from \"./Surface.tsx\";\n\nexport type SectionProps = {\n title: string;\n theme: ThemeName;\n id?: string;\n framed?: boolean;\n action?: ReactNode;\n actionClassName?: string;\n children: ReactNode;\n className?: string;\n};\n\nexport const Section: FC<SectionProps> = ({\n title,\n theme,\n id,\n framed = false,\n action,\n actionClassName,\n children,\n className,\n}) => (\n <section id={id} className={cn(\"scroll-mt-10 space-y-2\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-3 px-1\">\n <h2\n data-theme={theme}\n className=\"text-left text-lg font-semibold sm:text-xl text-theme-text-strong\"\n >\n {title}\n </h2>\n {action && (\n <div className={cn(\"shrink-0\", actionClassName)}>{action}</div>\n )}\n </div>\n {framed ? (\n <Surface variant=\"panel\" theme={theme}>\n {children}\n </Surface>\n ) : (\n children\n )}\n </section>\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 { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nexport type StatCardProps = {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n theme?: ThemeName;\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 theme,\n className,\n labelClassName,\n valueClassName,\n detailClassName,\n}) => (\n <div data-theme={theme} className={cn(\"polli:text-sm\", className)}>\n <div\n className={cn(\n \"polli:text-micro polli:font-bold polli:uppercase polli:tracking-wide polli:text-theme-text-strong\",\n labelClassName,\n )}\n >\n {label}\n </div>\n <div\n className={cn(\n \"polli:mt-1 polli:min-h-8 polli:break-words polli:text-2xl polli:font-bold polli:leading-tight polli:tabular-nums polli:text-theme-text-strong\",\n valueClassName,\n )}\n >\n {value}\n </div>\n {detail && (\n <div\n className={cn(\n \"polli:mt-2 polli:text-xs polli:text-theme-text-soft\",\n detailClassName,\n )}\n >\n {detail}\n </div>\n )}\n </div>\n);\n","import type { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type SwitchStatus = \"off\" | \"on\" | \"invalid\";\n\nexport type SwitchProps = {\n checked: boolean;\n onChange: (next: boolean) => void;\n /** Visual status. Drives track colour only. Defaults to `checked ? \"on\" : \"off\"`. */\n status?: SwitchStatus;\n /** Accessible label (aria-label). Not rendered visibly. */\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n};\n\n// Switch is theme-independent. Universal switch palette:\n// off — pale neutral grey (so the white thumb stays visible)\n// on — soft green (universal \"enabled\" affordance)\n// invalid — soft red (incomplete / error / setup needed)\nconst trackClasses: Record<SwitchStatus, string> = {\n off: \"polli:bg-gray-200\",\n on: \"polli:bg-[oklch(0.88_0.12_158)]\",\n invalid: \"polli:bg-[oklch(0.88_0.12_25)]\",\n};\n\n/**\n * Binary toggle primitive. Universal palette — does NOT follow the page\n * theme. Three states: off (white), on (soft green), invalid (soft red,\n * for \"enabled but needs attention\").\n *\n * `checked` drives thumb position; `status` drives track colour. So\n * `checked={true} status=\"invalid\"` renders thumb-right with a red track.\n */\nexport const Switch: FC<SwitchProps> = ({\n checked,\n onChange,\n status,\n ariaLabel,\n disabled = false,\n className,\n}) => {\n const effectiveStatus: SwitchStatus = status ?? (checked ? \"on\" : \"off\");\n const resolvedAriaLabel =\n ariaLabel ?? (checked ? \"Turn off toggle\" : \"Turn on toggle\");\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={resolvedAriaLabel}\n onClick={() => onChange(!checked)}\n disabled={disabled}\n className={cn(\n \"polli:relative polli:inline-flex polli:h-7 polli:w-12 polli:shrink-0 polli:items-center polli:rounded-full polli:transition polli:disabled:cursor-not-allowed polli:disabled:opacity-60\",\n trackClasses[effectiveStatus],\n className,\n )}\n >\n <span\n className={cn(\n \"polli:inline-block polli:h-5 polli:w-5 polli:rounded-full polli:bg-white polli:shadow-sm polli:transition-transform\",\n checked ? \"polli:translate-x-6\" : \"polli:translate-x-1\",\n )}\n />\n </button>\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\" | \"success\" | \"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 success: \"polli:bg-intent-success-bg-light/55\",\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-theme-bg-active polli:text-micro polli:text-theme-text-muted\",\n className,\n )}\n />\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\">;\n\nexport const TableBody: FC<TableBodyProps> = ({ className, ...rest }) => (\n <tbody\n {...rest}\n className={cn(\"polli:divide-y polli:divide-theme-border/65\", className)}\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 {active && sortDirection && (\n <span aria-hidden=\"true\">\n {sortDirection === \"asc\" ? \"^\" : \"v\"}\n </span>\n )}\n </>\n );\n\n const classes = cn(\n \"polli:px-3 polli:py-2 polli:font-bold polli:uppercase 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 {...rest} className={classes}>\n <button\n type=\"button\"\n onClick={onSort}\n className={cn(\n \"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","/**\n * The six chrome themes exposed by the CSS-var cascade. Apply via\n * `data-theme=\"<name>\"` on any ancestor — primitives and `--polli-*`\n * tokens in that subtree restyle accordingly.\n */\nexport const themes = [\n \"amber\",\n \"blue\",\n \"pink\",\n \"teal\",\n \"violet\",\n \"green\",\n] as const;\n\nexport type ThemeName = (typeof themes)[number];\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;;;ACAA,kBAAqB;AACrB,4BAAwB;AAGjB,SAAS,MAAM,QAA+C;AACjE,aAAO,mCAAQ,kBAAK,GAAG,MAAM,CAAC;AAClC;;;ACNA,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,UAAMA,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,kBAAkB,WAAoC;AAClE,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,SAAS;AAE/C,MAAI,UAAU,gBAAgB,OAAO;AACjC,UAAM,QAAQ,cAAc;AAC5B,UAAM,YAAY,WAAW,OAAO,EAAE;AACtC,QAAI,MAAM,QAAQ,MAAM,MAAM,QAAQ,EAAG,QAAO;AAChD,QAAI,MAAM,QAAQ,MAAM,UAAU,QAAQ,EAAG,QAAO;AACpD,WAAO,MAAM,mBAAmB,SAAS;AAAA,MACrC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACV,CAAC;AAAA,EACL;AAEA,MAAI,UAAU,gBAAgB,QAAQ;AAClC,UAAM,UAAU,WAAW,KAAK,EAAE;AAClC,WAAO,GAAG,MAAM,mBAAmB,SAAS;AAAA,MACxC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,IACT,CAAC,CAAC,MAAM,QAAQ,mBAAmB,SAAS;AAAA,MACxC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACV,CAAC,CAAC;AAAA,EACN;AAEA,SAAO,MAAM,mBAAmB,SAAS;AAAA,IACrC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACV,CAAC;AACL;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;;;ACnLA,mBAA0B;AAMnB,SAAS,cAAc,UAAU,MAAY;AAChD,8BAAU,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;;;ACpBA,IAAAE,eAAqB;AACrB,IAAAC,yBAAoC;AAEpC,IAAMC,eAAU,4CAAoB,EAAE,QAAQ,QAAQ,CAAC;AAGhD,SAASC,OAAM,QAA+C;AACjE,SAAOD,aAAQ,mBAAK,GAAG,MAAM,CAAC;AAClC;;;ACkBI;AArBJ,IAAM,gBAA6C;AAAA,EAC/C,MAAM;AAAA,EACN,SACI;AAAA,EACJ,SACI;AAAA,EACJ,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,WAAWE;AAAA,MACP;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,IACJ;AAAA,IAEC;AAAA,eACG,4CAAC,SAAI,WAAU,gFACV,iBACL;AAAA,MAEJ,4CAAC,SAAK,UAAS;AAAA;AAAA;AACnB;;;ACgCI,IAAAC,sBAAA;AAlER,IAAM,QAAQ;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACX;AAGA,IAAM,eACF;AAKJ,IAAMC,iBAA8C;AAAA,EAChD,QACI;AAER;AAYA,IAAM,gBAAgB,CAAC;AAAA,EACnB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAgD;AAC5C,QAAM,eAAe,SAASA,eAAc,MAAM,IAAI;AACtD,SAAOC;AAAA,IACH;AAAA,IACA,WACM,8CACA;AAAA,IACN;AAAA,IACA,MAAM,QAAQ,QAAQ;AAAA,IACtB;AAAA,EACJ;AACJ;AAOO,SAAS,OAA+C;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAmB;AACf,QAAM,YAA+B,MAAM;AAE3C,SACI;AAAA,IAAC;AAAA;AAAA,MAEG,cAAY,SAAS,SAAY;AAAA,MACjC,WAAW,cAAc;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;;;AC3EI,IAAAC,sBAAA;AAPG,IAAM,cAAoC,CAAC;AAAA,EAC9C,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ;AAAA,IACA,WAAWC;AAAA,MACP;AAAA,MACA,OAAO,oBAAoB;AAAA,MAC3B;AAAA,IACJ;AAAA,IAEC;AAAA;AACL;;;ACCI,IAAAC,sBAAA;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,WAAWC;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;;;ACqBI,IAAAC,sBAAA;AAzCR,IAAM,YAAY;AAAA,EACd,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAMC,iBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SACI;AAAA,EACJ,SACI;AAAA,EACJ,SACI;AAAA,EACJ,QAAQ;AACZ;AAaO,IAAM,OAAsB,CAAC;AAAA,EAChC;AAAA,EACA;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,cAAY;AAAA,MACZ,WAAWC;AAAA,QACP;AAAA,QACA,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACjBQ,IAAAC,sBAAA;AAnBD,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,iBAAiB;AAAA,EACjB;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,WAAWC;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,WAAWA;AAAA,YACP;AAAA,YACA,WAAW,uBAAuB;AAAA,YAClC,CAAC,YAAY;AAAA,YACb;AAAA,YACA,WAAW,6BAA6B;AAAA,UAC5C;AAAA,UAEA;AAAA,yDAAC,SAAI,WAAU,8BAA8B,iBAAM;AAAA,YACnD;AAAA,cAAC;AAAA;AAAA,gBACG;AAAA,gBACA,WAAU;AAAA;AAAA,YACd;AAAA;AAAA;AAAA,MACJ;AAAA,MACC,YAAY,6CAAC,SAAI,WAAW,gBAAiB,UAAS;AAAA;AAAA;AAC3D;;;ACvEJ,IAAAC,gBAOO;;;ACPP,IAAAC,gBAOO;AAkFC,IAAAC,sBAAA;AA/ER,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAkBzB,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,kBAAkB;AACtB,MAAM;AACF,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS;AAAA,IACnD,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EACd,CAAC;AACD,QAAM,iBAAa,sBAA2B,IAAI;AAElD,QAAM,wBAAwB,MAAM;AAChC,QAAI,WAAW,SAAS;AACpB,YAAM,OAAO,WAAW,QAAQ,sBAAsB;AACtD,YAAM,WAAW,KAAK;AAAA,QAClB;AAAA,QACA,OAAO,aAAa,0BAA0B;AAAA,MAClD;AACA,YAAM,OAAO,KAAK;AAAA,QACd,KAAK,IAAI,KAAK,MAAM,uBAAuB;AAAA,QAC3C,KAAK;AAAA,UACD;AAAA,UACA,OAAO,aAAa,WAAW;AAAA,QACnC;AAAA,MACJ;AACA,yBAAmB;AAAA,QACf,KAAK,KAAK,SAAS;AAAA,QACnB;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAIA,QAAM,mBAAmBC;AAAA,IACrB;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,cAAc,kBACd,mBACA;AAON,QAAM,eACF;AAEJ,QAAM,cACF,8EACI;AAAA,iDAAC,UAAK,WAAW,aAAc,UAAS;AAAA,IACxC;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,UACH,KAAK,gBAAgB;AAAA,UACrB,MAAM,gBAAgB;AAAA,UACtB,UAAU,gBAAgB;AAAA,QAC9B;AAAA,QACA,WAAW,GACP,cACM,oCACA,iCACV,IAAI,YAAY;AAAA,QAEf;AAAA;AAAA,IACL;AAAA,KACJ;AAGJ,QAAM,cAAc;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,cAAc,MAAM;AAChB,4BAAsB;AACtB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,cAAc,MAAM,eAAe,KAAK;AAAA,IACxC,SAAS,CAAC,MAAkB;AACxB,QAAE,gBAAgB;AAClB,UAAI,SAAS;AACT,gBAAQ;AAAA,MACZ;AACA,UAAI,cAAc,QAAQ;AACtB;AAAA,MACJ;AACA,4BAAsB;AACtB,qBAAe,CAAC,SAAS,CAAC,IAAI;AAAA,IAClC;AAAA,IACA;AAAA,EACJ;AAEA,MAAI,cAAc,QAAQ;AACtB,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,WAAW;AAAA,MACX,cAAc,YAAY;AAAA,MAC1B,cAAc,YAAY;AAAA,MAC1B,SAAS,YAAY;AAAA,MACrB;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AD3FQ,IAAAC,sBAAA;AAxCD,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB;AAAA,EACA;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,SACF;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAWC;AAAA,QACP,OAAO,cAAc,aAAa,UAAU,MAAM,IAAI;AAAA,MAC1D;AAAA,MAEC,iBAAO,aAAa,aAAa,SAAS,MAAM,IAAI;AAAA;AAAA,EACzD;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAS,SAAS,gBAAgB;AAAA,MAClC,WAAW;AAAA,MAEV;AAAA;AAAA,EACL;AAER;;;AEzFA,oBAAoC;AACpC,oBAAuB;AAqDX,IAAAC,sBAAA;AAhDZ,IAAM,cAAc;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAqBO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI;AAAA,EAAC,cAAAC,OAAU;AAAA,EAAV;AAAA,IACG;AAAA,IACA,cAAc,CAAC,YAAY,eAAe,QAAQ,IAAI;AAAA,IAErD;AAAA,iBACG;AAAA,QAAC,cAAAA,OAAU;AAAA,QAAV;AAAA,UACG,SAAS;AAAA,UACT,WAAW;AAAA,UAEV;AAAA;AAAA,MACL;AAAA,MAEJ,8CAAC,wBACI;AAAA,wBACG;AAAA,UAAC,cAAAA,OAAU;AAAA,UAAV;AAAA,YACG,WAAWC;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA;AAAA,QACJ;AAAA,QAEJ;AAAA,UAAC,cAAAD,OAAU;AAAA,UAAV;AAAA,YACG,WAAWC;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEA;AAAA,cAAC,cAAAD,OAAU;AAAA,cAAV;AAAA,gBACG,cAAY;AAAA,gBACZ,cAAY;AAAA,gBACZ,mBAAiB;AAAA,gBACjB,WAAWC;AAAA,kBACP;AAAA,kBACA,YAAY,IAAI;AAAA,kBAChB;AAAA,gBACJ;AAAA,gBAEC;AAAA,2BACG;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAWA;AAAA,wBACP;AAAA,wBACA;AAAA,sBACJ;AAAA,sBAEC;AAAA;AAAA,kBACL;AAAA,kBAEH;AAAA;AAAA;AAAA,YACL;AAAA;AAAA,QACJ;AAAA,SACJ;AAAA;AAAA;AACJ;AAGG,IAAM,cAAc,cAAAD,OAAU;;;ACvGrC,qBAAwB;AACxB,IAAAE,iBAAuB;AAEvB,IAAAC,gBAAyB;AA4CjB,IAAAC,uBAAA;AAxCR,IAAM,gBACF;AAmBG,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,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;AAAA,MACA,cAAc,CAAC,YAAY,QAAQ,QAAQ,IAAI;AAAA,MAC/C,aAAa;AAAA,QACT,WAAW,UAAU,QAAQ,eAAe;AAAA,MAChD;AAAA,MAEA;AAAA,sDAAC,uBAAQ,SAAR,EAAgB,SAAO,MAAE,kBAAQ,IAAI,GAAE;AAAA,QACxC,8CAAC,yBACG,wDAAC,uBAAQ,YAAR,EACG;AAAA,UAAC,uBAAQ;AAAA,UAAR;AAAA,YACG,cAAY;AAAA,YACZ,WAAWC;AAAA,cACP;AAAA,cACA,kBAAkB;AAAA,cAClB;AAAA,YACJ;AAAA,YAEC,iBAAO,aAAa,aACf,SAAS,MAAM,QAAQ,KAAK,CAAC,IAC7B;AAAA;AAAA,QACV,GACJ,GACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AC7DQ,IAAAC,uBAAA;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,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,UAAS;AAAA,IACjB,8CAAC,UAAK,GAAE,kEAAiE;AAAA,IACzE,8CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,4CAA2C;AAAA,IACnD,8CAAC,UAAK,GAAE,8CAA6C;AAAA,KACzD;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,wDAAC,cAAS,QAAO,kBAAiB;AAAA;AAAA,EACtC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,UAAK,GAAE,2DAA0D;AAAA,KACtE;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,8CAAC,UAAK,GAAE,eAAc;AAAA,KAC1B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,SAAQ,aAAY,eAAY,QAAQ,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,8CAAC,cAAS,QAAO,oBAAmB;AAAA,IACpC,8CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI;AAAA,KACzC;AAER;AAEO,SAAS,iBAAiB,OAAkB;AAC/C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,sBAAqB,GACjC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,mCAAkC;AAAA,IAC1C,8CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,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,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,8CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,IACxD,8CAAC,UAAK,GAAE,4BAA2B;AAAA,KACvC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,UAAK,GAAE,gBAAe;AAAA,KAC3B;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IACjD,8CAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IAClD,8CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,2BAA0B,GACtC;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,cAAS,QAAO,iBAAgB;AAAA,IACjC,8CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,KAC1C;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,wCAAuC,GACnD;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,cAAS,QAAO,wBAAuB;AAAA,IACxC,8CAAC,cAAS,QAAO,mBAAkB;AAAA,KACvC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,4DAA2D;AAAA,IACnE,8CAAC,UAAK,GAAE,4EAA2E;AAAA,IACnF,8CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,MAAK,gBAAe;AAAA,KACzD;AAER;AAEO,SAAS,MAAM,OAAkB;AACpC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,wBAAuB,GACnC;AAER;;;AC1LI,IAAAC,uBAAA;AAPG,IAAM,qBAAkD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,IAAG;AAAA,IACH;AAAA,IACA,QAAO;AAAA,IACP,KAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAWC,IAAG,eAAe,SAAS;AAAA,IAEtC;AAAA,oDAAC,UAAM,UAAS;AAAA,MAChB;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,eAAY;AAAA;AAAA,MAChB;AAAA;AAAA;AACJ;;;ACnCJ,mBAAsB;;;ACgClB,IAAAC,uBAAA;AA1BJ,IAAMC,iBAAkD;AAAA,EACpD,QACI;AAER;AAGA,IAAM,iBACF;AAWG,IAAM,aAAkC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,MAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,WAAWC;AAAA,MACP;AAAA,MACA,SAASD,eAAc,MAAM,IAAI;AAAA,MACjC;AAAA,IACJ;AAAA,IAEC;AAAA;AACL;;;ACrBI,IAAAE,uBAAA;AAND,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,QAAQ;AACZ,MACI,8CAAC,WAAQ,SAAS,WAAW,MAAM,WAAW,OAAO,WAAU,cAC3D,wDAAC,UAAK,WAAU,8PAA6P,eAE7Q,GACJ;;;AC1BJ,IAAAC,gBAA2B;AAUnB,IAAAC,uBAAA;AAFD,IAAM,YAAQ;AAAA,EACjB,CAAC,EAAE,WAAW,OAAO,oBAAoB,GAAG,MAAM,GAAG,QACjD;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,QACA,QAAQ,yBAAyB;AAAA,QACjC,sBAAsB;AAAA,QACtB;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;ACtBA,IAAAC,gBASO;AA2GK,IAAAC,uBAAA;AArGZ,IAAM,cAA0C;AAAA,EAC5C,GAAG;AAAA,EACH,GAAG;AACP;AAeA,SAAS,UAAa,KAAyB,OAAiB;AAC5D,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,CAAC,IAAmC,UAAU;AAChE;AAMO,IAAM,iBAAa;AAAA,EACtB,CAAC,EAAE,OAAO,OAAO,KAAK,WAAW,UAAU,GAAG,KAAK,GAAG,gBAAgB;AAClE,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,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,CAAC;AAEL,WACI;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ,KAAK;AAAA,QACL,cAAY;AAAA,QACZ,WAAWC;AAAA,UACP;AAAA,UACA,YAAY,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,QAEC;AAAA;AAAA,IACL;AAAA,EAER;AACJ;AAEA,WAAW,cAAc;;;ACrEjB,IAAAC,uBAAA;AAvCR,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,QAAQ;AAAA,EACR;AAAA,EACA;AACJ,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,QACA,GAAG,SAAS,MAAM;AAE1B,QAAM,YAAY,QACd,8CAAC,UAAK,WAAU,8DACX,iBACL,IACA;AAEJ,MAAI,UAAU;AACV,WACI;AAAA,MAAC;AAAA;AAAA,QACG,cAAY;AAAA,QACZ,WAAU;AAAA,QAET;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,WAAWC;AAAA,gBACP;AAAA,gBACA;AAAA,cACJ;AAAA,cAEA;AAAA,8DAAC,UAAK,WAAU,6EACX,uBACL;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACG,UAAU;AAAA,oBACV,WAAU;AAAA;AAAA,gBACd;AAAA;AAAA;AAAA,UACJ;AAAA,UACA,8CAAC,UAAK,WAAU,4WAA2W,gCAE3X;AAAA;AAAA;AAAA,IACJ;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAY;AAAA,MACZ,WAAU;AAAA,MAET;AAAA;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,WAAU;AAAA,YACV,SAAS,CAAC,SACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAWA;AAAA,kBACP;AAAA,kBACA,OACM,uDACA;AAAA,gBACV;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAWA;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA,sBAEC;AAAA;AAAA,kBACL;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU;AAAA,sBACV,WAAWA;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA;AAAA,kBACJ;AAAA;AAAA;AAAA,YACJ;AAAA,YAGJ,yDAAC,cAAW,OAAc,WAAU,kBAChC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAWA;AAAA,oBACP;AAAA,oBACA,gBACM,4EACA;AAAA,kBACV;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACG,WAAWA;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,WAAWA;AAAA,sBACP;AAAA,sBACA,YACM,0DACA;AAAA,oBACV;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACG,WAAWA;AAAA,4BACP;AAAA,4BACA,aACI;AAAA,0BACR;AAAA,0BAEC,uBAAa;AAAA;AAAA,sBAClB;AAAA,sBACA,8CAAC,UAAK,WAAU,2BACX,cAAI,OACT;AAAA;AAAA;AAAA,kBApBK,IAAI;AAAA,gBAqBb;AAAA,cAER,CAAC;AAAA,eACL;AAAA;AAAA,QACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;AClMA,IAAAC,gBAA6C;;;AC+BrC,IAAAC,uBAAA;AAhBR,IAAMC,eAAc;AAAA,EAChB,QAAQ;AAAA,EACR,OAAO;AACX;AAEO,IAAM,YAAgC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,WAAW;AAAA,EACX;AACJ,MAAM;AACF,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY;AAAA,MACZ;AAAA,MACA,cAAY;AAAA,MACZ,gBAAc;AAAA,MACd;AAAA,MACA,WAAWC;AAAA,QACP;AAAA,QACA,SACM,oFACA;AAAA,QACN,YAAY;AAAA,QACZD,aAAY,IAAI;AAAA,QAChB;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ADwFwB,IAAAE,uBAAA;AAlHxB,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,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;AAAA,EACA,UAAU,oBAAI,KAAK,CAAC;AAAA,EACpB;AACJ,MAAM;AACF,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAe,MAAM,WAAW,KAAK,CAAC;AACtE,QAAM,EAAE,aAAa,OAAO,IAAI;AAEhC,+BAAU,MAAM;AACZ,gBAAY,WAAW,EAAE,aAAa,OAAO,CAAC,CAAC;AAAA,EACnD,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,YAAQ,uBAAQ,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;AAExC,QAAM,iBAAiB,CAACE,iBAAmC;AACvD,aAAS,eAAeA,cAAa,WAAW,KAAK,CAAC,CAAC;AAAA,EAC3D;AAEA,QAAM,aAAa,CAAC,SAAe;AAC/B,aAAS,eAAe,MAAM,aAAa,IAAI,CAAC;AAChD,YAAQ,KAAK;AAAA,EACjB;AAEA,QAAM,YACF,MAAM,gBAAgB,UAChB,OAAO,SAAS,eAAe,CAAC,IAChC,SAAS,mBAAmB,SAAS;AAAA,IACjC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACV,CAAC;AAEX,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAY;AAAA,MACZ,WAAU;AAAA,MAEV;AAAA,sDAAC,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,QACA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,WAAU;AAAA,YACV,SAAS,CAAC,WACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY,0BAA0B,kBAAkB,KAAK,CAAC;AAAA,gBAC9D,WAAWC;AAAA,kBACP;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UACI;AAAA,gBACR;AAAA,gBAEA;AAAA,gEAAC,UAAM,4BAAkB,KAAK,GAAE;AAAA,kBAChC,8CAAC,eAAY,UAAU,QAAQ;AAAA;AAAA;AAAA,YACnC;AAAA,YAGJ;AAAA,6DAAC,SAAI,WAAU,kEACX;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cACI,MAAM,gBAAgB,UAChB,kBACA;AAAA,oBAEV,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,gBAAgB;AAAA,oBAC3C,WAAWA;AAAA,sBACP;AAAA,sBACA,oBACI;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,gBACL;AAAA,gBACA,8CAAC,SAAI,WAAU,4DACV,qBACL;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cACI,MAAM,gBAAgB,UAChB,cACA;AAAA,oBAEV,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,YAAY;AAAA,oBACvC,WAAWA;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,UAAU,CAAC;AAAA,oBACX,SAAS,MAAM,WAAW,IAAI;AAAA,oBAC9B,WAAWA;AAAA,sBACP;AAAA,sBACA,WACM,0DACA;AAAA,sBACN,CAAC,cACG;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,kBAbI;AAAA,gBAcT;AAAA,cAER,CAAC,GACL,IAEA,gFACI;AAAA,8DAAC,SAAI,WAAU,8IACV,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,eAAe,kBAAkB,eAAe,QAAQ,IAAI,CAAC,CAAC,KAC9D,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,UAAU,CAAC;AAAA,sBACX,SAAS,MAAM,WAAW,IAAI;AAAA,sBAC9B,WAAWA;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,oBAjBZ,KAAK,YAAY;AAAA,kBAkB1B;AAAA,gBAER,CAAC,GACL;AAAA,iBACJ;AAAA;AAAA;AAAA,QAER;AAAA;AAAA;AAAA,EACJ;AAER;;;AE/RI,IAAAC,uBAAA;AA/BJ,IAAM,iBAAiD;AAAA,EACnD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eAAe;AACnB;AAoBO,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,cAAY;AAAA,IACZ,WAAWC,IAAG,iBAAiB,eAAe,OAAO,GAAG,SAAS;AAAA,IAEhE;AAAA;AACL;;;AChBI,IAAAC,uBAAA;AAXD,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI,+CAAC,aAAQ,IAAQ,WAAWC,IAAG,0BAA0B,SAAS,GAC9D;AAAA,iDAAC,SAAI,WAAU,0DACX;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,cAAY;AAAA,QACZ,WAAU;AAAA,QAET;AAAA;AAAA,IACL;AAAA,IACC,UACG,8CAAC,SAAI,WAAWA,IAAG,YAAY,eAAe,GAAI,kBAAO;AAAA,KAEjE;AAAA,EACC,SACG,8CAAC,WAAQ,SAAQ,SAAQ,OACpB,UACL,IAEA;AAAA,GAER;;;AC7CJ,IAAAC,gBAA+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,WAAWC,IAAG,gBAAgB,SAAS;AAAA,QACtC,GAAG;AAAA;AAAA,IACR;AAAA,EAER;AACJ;;;AC1DI,IAAAC,uBAAA;AAVG,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI,+CAAC,SAAI,cAAY,OAAO,WAAWC,IAAG,iBAAiB,SAAS,GAC5D;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAWA;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,WAAWA;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACC,UACG;AAAA,IAAC;AAAA;AAAA,MACG,WAAWA;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,GAER;;;ACQQ,IAAAC,uBAAA;AAxCZ,IAAM,eAA6C;AAAA,EAC/C,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AACb;AAUO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACJ,MAAM;AACF,QAAM,kBAAgC,WAAW,UAAU,OAAO;AAClE,QAAM,oBACF,cAAc,UAAU,oBAAoB;AAEhD,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY;AAAA,MACZ,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC;AAAA,MACA,WAAWC;AAAA,QACP;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B;AAAA,MACJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACG,WAAWA;AAAA,YACP;AAAA,YACA,UAAU,wBAAwB;AAAA,UACtC;AAAA;AAAA,MACJ;AAAA;AAAA,EACJ;AAER;;;AC7CI,IAAAC,uBAAA;AAhBJ,IAAM,eAAsC;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACX;AAEA,IAAM,mBAA8C;AAAA,EAChD,SAAS;AAAA,EACT,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,WAAWC;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,WAAWA;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,WAAWA,IAAG,+CAA+C,SAAS;AAAA;AAC1E;AAOG,IAAM,WAA8B,CAAC;AAAA,EACxC,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAWA;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,UAAU,iBACP,8CAAC,UAAK,eAAY,QACb,4BAAkB,QAAQ,MAAM,KACrC;AAAA,KAER;AAGJ,QAAM,UAAUA;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,8CAAC,QAAI,GAAG,MAAM,WAAW,SACrB;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAWA;AAAA,QACP;AAAA,QACA,UAAU,WAAW;AAAA,QACrB,UAAU,YAAY;AAAA,MAC1B;AAAA,MAEC;AAAA;AAAA,EACL,GACJ;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,WAAWA;AAAA,MACP;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,IACJ;AAAA;AACJ;;;AC1JG,IAAM,SAAS;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;","names":["start","yearText","import_clsx","import_tailwind_merge","twMerge","cn","cn","import_jsx_runtime","intentClasses","cn","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","intentClasses","cn","import_jsx_runtime","cn","import_react","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","ArkDialog","cn","import_portal","import_react","import_jsx_runtime","cn","import_jsx_runtime","import_jsx_runtime","cn","import_jsx_runtime","intentClasses","cn","import_jsx_runtime","import_react","import_jsx_runtime","cn","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_react","import_jsx_runtime","sizeClasses","cn","import_jsx_runtime","addUtcMonths","start","granularity","cn","import_jsx_runtime","cn","import_jsx_runtime","cn","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","cn"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/cn-app.ts","../src/lib/period.ts","../src/lib/use-scroll-lock.ts","../src/lib/cn.ts","../src/primitives/Alert.tsx","../src/primitives/Button.tsx","../src/primitives/ButtonGroup.tsx","../src/primitives/ChevronIcon.tsx","../src/primitives/Chip.tsx","../src/primitives/Collapsible.tsx","../src/primitives/CopyButton.tsx","../src/primitives/Tooltip.tsx","../src/primitives/Dialog.tsx","../src/primitives/Dropdown.tsx","../src/primitives/DropdownItem.tsx","../src/primitives/icons/index.tsx","../src/primitives/ExternalLinkButton.tsx","../src/primitives/Field.tsx","../src/primitives/FileUpload.tsx","../src/lib/partition-files.ts","../src/primitives/IconButton.tsx","../src/primitives/InfoTip.tsx","../src/primitives/InlineLink.tsx","../src/primitives/Input.tsx","../src/primitives/Surface.tsx","../src/primitives/LinkCard.tsx","../src/primitives/Markdown.tsx","../src/primitives/ScrollArea.tsx","../src/primitives/MultiSelect.tsx","../src/primitives/NavItem.tsx","../src/primitives/PeriodPicker.tsx","../src/primitives/TabButton.tsx","../src/primitives/Prose.tsx","../src/primitives/Section.tsx","../src/primitives/Slider.tsx","../src/primitives/StatCard.tsx","../src/primitives/Switch.tsx","../src/primitives/Table.tsx","../src/primitives/Textarea.tsx","../src/theme.ts"],"sourcesContent":["export { cn } from \"./lib/cn-app.ts\";\nexport type { RejectedFile, RejectReason } from \"./lib/partition-files.ts\";\nexport {\n currentPeriod,\n getPeriodBucketKeys,\n type PeriodGranularity,\n type PeriodSelection,\n periodBucketKeyToDate,\n} from \"./lib/period.ts\";\nexport { useScrollLock } from \"./lib/use-scroll-lock.ts\";\nexport { Alert, type AlertProps } from \"./primitives/Alert.tsx\";\nexport { Button, type ButtonProps } 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 Collapsible,\n type CollapsibleProps,\n} from \"./primitives/Collapsible.tsx\";\nexport { CopyButton, type CopyButtonProps } from \"./primitives/CopyButton.tsx\";\nexport {\n Dialog,\n type DialogProps,\n DialogTitle,\n} from \"./primitives/Dialog.tsx\";\nexport { Dropdown, type DropdownProps } from \"./primitives/Dropdown.tsx\";\nexport {\n DropdownItem,\n type DropdownItemProps,\n} from \"./primitives/DropdownItem.tsx\";\nexport {\n ExternalLinkButton,\n type ExternalLinkButtonProps,\n} from \"./primitives/ExternalLinkButton.tsx\";\nexport { Field } from \"./primitives/Field.tsx\";\nexport { FileUpload, type FileUploadProps } from \"./primitives/FileUpload.tsx\";\nexport { IconButton } from \"./primitives/IconButton.tsx\";\nexport { InfoTip } from \"./primitives/InfoTip.tsx\";\nexport { InlineLink, type InlineLinkProps } from \"./primitives/InlineLink.tsx\";\nexport { Input, type InputProps } from \"./primitives/Input.tsx\";\nexport * from \"./primitives/icons/index.tsx\";\nexport { LinkCard, type LinkCardProps } from \"./primitives/LinkCard.tsx\";\nexport { Markdown, type MarkdownProps } from \"./primitives/Markdown.tsx\";\nexport {\n MultiSelect,\n type MultiSelectProps,\n} from \"./primitives/MultiSelect.tsx\";\nexport { NavItem, type NavItemProps } from \"./primitives/NavItem.tsx\";\nexport {\n PeriodPicker,\n type PeriodPickerProps,\n} from \"./primitives/PeriodPicker.tsx\";\nexport { Prose, type ProseProps } from \"./primitives/Prose.tsx\";\nexport { ScrollArea, type ScrollAreaProps } from \"./primitives/ScrollArea.tsx\";\nexport { Section, type SectionProps } from \"./primitives/Section.tsx\";\nexport { Slider, type SliderProps } from \"./primitives/Slider.tsx\";\nexport { StatCard, type StatCardProps } from \"./primitives/StatCard.tsx\";\nexport { Surface } from \"./primitives/Surface.tsx\";\nexport {\n Switch,\n type SwitchProps,\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 { Textarea, type TextareaProps } from \"./primitives/Textarea.tsx\";\nexport { Tooltip } from \"./primitives/Tooltip.tsx\";\nexport { type ThemeName, themes } from \"./theme.ts\";\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","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 formatPeriodLabel(selection: PeriodSelection): string {\n const { start, end } = periodToWindow(selection);\n\n if (selection.granularity === \"day\") {\n const today = startOfUtcDay();\n const yesterday = addUtcDays(today, -1);\n if (start.getTime() === today.getTime()) return \"Today\";\n if (start.getTime() === yesterday.getTime()) return \"Yesterday\";\n return start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n }\n\n if (selection.granularity === \"week\") {\n const weekEnd = addUtcDays(end, -1);\n return `${start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n })} - ${weekEnd.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n })}`;\n }\n\n return start.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"long\",\n year: \"numeric\",\n });\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 { 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 { 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 { ComponentPropsWithoutRef, FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype AlertIntent = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nconst intentClasses: Record<AlertIntent, string> = {\n info: \"polli:border-theme-border polli:bg-theme-bg-pale polli:text-theme-text-strong\",\n success:\n \"polli:border-intent-success-border polli:bg-intent-success-bg-light polli:text-intent-success-text\",\n warning:\n \"polli:border-intent-warning-border polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type AlertProps = ComponentPropsWithoutRef<\"div\"> & {\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:border polli:px-3 polli:py-2 polli:text-sm\",\n intentClasses[intent],\n className,\n )}\n >\n {title && (\n <div className=\"polli:mb-1 polli:text-xs polli:font-bold polli:uppercase polli:tracking-wide\">\n {title}\n </div>\n )}\n <div>{children}</div>\n </div>\n);\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\n/** Button only supports `danger`. Label/status color recipes live on Chip. */\ntype ButtonIntent = \"danger\";\n\nconst sizes = {\n sm: \"polli:px-2 polli:pt-0.5 polli:pb-1\",\n md: \"polli:px-4 polli:pt-1.5 polli:pb-2\",\n lg: \"polli:px-6 polli:py-3\",\n} as const;\n\n// Cascade-driven base — reads [data-theme] vars.\nconst themeClasses =\n \"polli:bg-theme-bg-active polli:text-theme-text-base \" +\n \"polli:hover:bg-theme-bg-hover polli:transition-colors\";\n\n// Single intent: danger. Soft recipe — light tile + deep text, slightly\n// deeper bg on hover. No filled CTAs anywhere.\nconst intentClasses: Record<ButtonIntent, string> = {\n danger:\n \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text \" +\n \"polli:hover:bg-intent-danger-bg-hover polli:transition-colors\",\n};\n\ntype BaseButtonProps = {\n /** Override the cascade theme for this button's subtree. Ignored when `intent` is set. */\n theme?: ThemeName;\n /** Only `\"danger\"` for now. */\n intent?: ButtonIntent;\n size?: keyof typeof sizes;\n className?: string;\n disabled?: boolean;\n};\n\nconst buttonClasses = ({\n theme: _theme,\n intent,\n size,\n className,\n disabled,\n}: BaseButtonProps & { disabled?: boolean }) => {\n const colorClasses = intent ? intentClasses[intent] : themeClasses;\n return cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:self-center polli:font-medium polli:leading-normal polli:box-border\",\n disabled\n ? \"polli:opacity-50 polli:cursor-not-allowed\"\n : \"polli:hover:filter polli:hover:brightness-105 polli:cursor-pointer\",\n colorClasses,\n sizes[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 theme,\n intent,\n size,\n className,\n disabled,\n ...buttonProps\n}: ButtonProps<T>) {\n const Component: React.ElementType = as || \"button\";\n\n return (\n <Component\n // Cascade override only applies when `intent` is unset.\n data-theme={intent ? undefined : theme}\n data-intent={intent}\n className={buttonClasses({\n theme,\n intent,\n size,\n className,\n disabled,\n })}\n disabled={disabled}\n {...buttonProps}\n >\n {children}\n </Component>\n );\n}\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type ButtonGroupProps = ComponentPropsWithoutRef<\"div\"> & {\n wrap?: boolean;\n};\n\nexport const ButtonGroup: FC<ButtonGroupProps> = ({\n wrap = true,\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:items-center polli:gap-1.5\",\n wrap ? \"polli:flex-wrap\" : \"polli:flex-nowrap\",\n className,\n )}\n >\n {children}\n </div>\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 type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\n/** Semantic chip labels for status and metadata badges. */\ntype ChipIntent =\n | \"news\"\n | \"alpha\"\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"danger\";\n\nconst chipSizes = {\n sm: \"polli:px-2 polli:py-0.5 polli:text-xs\",\n md: \"polli:px-2.5 polli:py-0.5 polli:text-sm\",\n lg: \"polli:px-3 polli:py-1 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 alpha: \"polli:bg-intent-alpha-bg-light polli:text-intent-alpha-text\",\n neutral:\n \"polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900\",\n success:\n \"polli:border polli:border-intent-success-border polli:bg-intent-success-bg-light polli:text-intent-success-text\",\n warning:\n \"polli:border polli:border-intent-warning-border polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"polli:border polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type ChipProps = ComponentPropsWithoutRef<\"span\"> & {\n /** Override the cascade theme for this chip's subtree. */\n theme?: ThemeName;\n /** Semantic intent. Wins over `theme` when set. */\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 theme,\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 data-theme={theme}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-normal\",\n chipSizes[size],\n intentClass,\n className,\n )}\n >\n {children}\n </span>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { ChevronIcon } from \"./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 — base bg, border, etc. */\n wrapperClassName?: 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 primitive. 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 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 !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 {\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 { Tooltip } from \"./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 copiedTooltip?: ReactNode;\n tooltipClassName?: string;\n className?: string | ((copied: boolean) => string);\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 copiedTooltip = \"Copied!\",\n tooltipClassName,\n className,\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 button = (\n <button\n {...buttonProps}\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n \"polli-control\",\n typeof className === \"function\" ? className(copied) : className,\n )}\n >\n {typeof children === \"function\" ? children(copied) : children}\n </button>\n );\n\n return (\n <Tooltip\n triggerAs=\"span\"\n content={copied ? copiedTooltip : tooltip}\n className={tooltipClassName}\n >\n {button}\n </Tooltip>\n );\n}\n","import {\n type CSSProperties,\n type FC,\n type MouseEvent,\n type ReactNode,\n useRef,\n useState,\n} from \"react\";\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 ariaLabel?: string;\n className?: string;\n onClick?: () => void;\n style?: CSSProperties;\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 ariaLabel,\n className,\n onClick,\n style,\n triggerAs = \"button\",\n displayContents = false,\n}) => {\n const [showTooltip, setShowTooltip] = useState(false);\n const [tooltipPosition, setTooltipPosition] = useState({\n top: 0,\n left: 0,\n maxWidth: TOOLTIP_MAX_WIDTH,\n });\n const triggerRef = useRef<HTMLElement | null>(null);\n\n const updateTooltipPosition = () => {\n if (triggerRef.current) {\n const rect = triggerRef.current.getBoundingClientRect();\n const maxWidth = Math.min(\n TOOLTIP_MAX_WIDTH,\n window.innerWidth - TOOLTIP_VIEWPORT_MARGIN * 2,\n );\n const left = Math.min(\n Math.max(rect.left, TOOLTIP_VIEWPORT_MARGIN),\n Math.max(\n TOOLTIP_VIEWPORT_MARGIN,\n window.innerWidth - maxWidth - TOOLTIP_VIEWPORT_MARGIN,\n ),\n );\n setTooltipPosition({\n top: rect.bottom + 4,\n left,\n maxWidth,\n });\n }\n };\n\n // Universal cursor for every tooltip trigger across the app.\n // `cursor-help` = standard \"?\" pointer that means \"more info on hover\".\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-help\";\n\n // Thin theme-cascade popup. bg + border + text all follow the active\n // page theme so the tooltip reads as \"part of the page\", not system\n // chrome. Uses the pale theme bg (one step lighter than chip-bg) so\n // it doesn't dominate. Same recipe on desktop and mobile —\n // viewport-clamped via `tooltipPosition`.\n const popupClasses =\n \"polli:fixed polli:w-max polli:px-2 polli:py-1 polli:bg-theme-bg-pale polli:text-theme-text-strong polli:border polli:border-theme-border polli:text-xs polli:rounded-md polli:shadow-sm polli:z-50 polli:pointer-events-none polli:transition-opacity polli:whitespace-pre-line polli:break-words\";\n\n const contentNode = (\n <>\n <span className={cursorClass}>{children}</span>\n <span\n style={{\n top: tooltipPosition.top,\n left: tooltipPosition.left,\n maxWidth: tooltipPosition.maxWidth,\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 </>\n );\n\n const sharedProps = {\n \"aria-label\": ariaLabel,\n className: triggerClassName,\n onMouseEnter: () => {\n updateTooltipPosition();\n setShowTooltip(true);\n },\n onMouseLeave: () => setShowTooltip(false),\n onClick: (e: MouseEvent) => {\n e.stopPropagation();\n if (onClick) {\n onClick();\n }\n if (triggerAs === \"span\") {\n return;\n }\n updateTooltipPosition();\n setShowTooltip((prev) => !prev);\n },\n style,\n };\n\n if (triggerAs === \"span\") {\n return (\n <span\n ref={(node) => {\n triggerRef.current = node;\n }}\n {...sharedProps}\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 className={triggerClassName}\n onMouseEnter={sharedProps.onMouseEnter}\n onMouseLeave={sharedProps.onMouseLeave}\n onClick={sharedProps.onClick}\n style={style}\n >\n {contentNode}\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\";\nimport type { ThemeName } from \"../theme.ts\";\n\nconst sizeClasses = {\n sm: \"polli:max-w-md\",\n md: \"polli:max-w-xl\",\n lg: \"polli:max-w-2xl\",\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 titleClassName?: string;\n ariaLabel?: string;\n labelledBy?: string;\n theme?: ThemeName;\n size?: keyof typeof sizeClasses;\n showBackdrop?: boolean;\n backdropClassName?: string;\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 titleClassName,\n ariaLabel,\n labelledBy,\n theme = \"blue\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\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 className={cn(\n \"polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50\",\n backdropClassName,\n )}\n />\n )}\n <ArkDialog.Positioner\n data-theme={theme}\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[110] polli:flex polli:h-dvh polli:items-start polli:justify-center polli:overflow-hidden polli:p-4\",\n positionerClassName,\n )}\n >\n <ArkDialog.Content\n ref={contentRef}\n data-theme={theme}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n className={cn(\n \"polli:my-auto polli:w-full polli:overflow-hidden polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-white polli:shadow-lg polli:outline-none polli:focus:outline-none polli:focus-visible:outline-none\",\n sizeClasses[size],\n contentClassName,\n )}\n >\n {title && (\n <DialogTitle\n className={cn(\n \"polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong\",\n titleClassName,\n )}\n >\n {title}\n </DialogTitle>\n )}\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n );\n};\n\nexport const DialogTitle = ArkDialog.Title;\n","import { Popover } from \"@ark-ui/react/popover\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { FC, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nconst DEFAULT_PANEL =\n \"polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale polli:shadow-lg\";\n\nexport type DropdownProps = {\n theme: ThemeName;\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 /** Controlled open state. Omit to let the Dropdown manage its own. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Appended after the surface (widths, padding, max-height…). */\n className?: string;\n};\n\nexport const Dropdown: FC<DropdownProps> = ({\n theme,\n trigger,\n children,\n align = \"start\",\n open: openProp,\n onOpenChange,\n className,\n}) => {\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 open={open}\n onOpenChange={(details) => setOpen(details.open)}\n positioning={{\n placement: align === \"end\" ? \"bottom-end\" : \"bottom-start\",\n }}\n >\n <Popover.Trigger asChild>{trigger(open)}</Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content\n data-theme={theme}\n className={cn(\n \"polli:z-50 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 { 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:focus-visible:bg-theme-bg-hover\",\n className,\n )}\n >\n {children}\n </Component>\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 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 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 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 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 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 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 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 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=\"7\" width=\"8\" height=\"10\" rx=\"1.5\" />\n <rect x=\"14\" y=\"7\" width=\"8\" height=\"10\" 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 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 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 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 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\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 type { IconProps } from \"./types.ts\";\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { Button } from \"./Button.tsx\";\nimport { ExternalLinkIcon } from \"./icons/index.tsx\";\n\nexport type ExternalLinkButtonProps = {\n theme: ThemeName;\n href: string;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n children: ReactNode;\n};\n\nexport const ExternalLinkButton: FC<ExternalLinkButtonProps> = ({\n theme,\n href,\n size = \"md\",\n className,\n children,\n}) => (\n <Button\n as=\"a\"\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n theme={theme}\n size={size}\n className={cn(\"polli:gap-2\", className)}\n >\n <span>{children}</span>\n <ExternalLinkIcon\n className=\"polli:h-4 polli:w-4 polli:shrink-0 polli:opacity-60\"\n aria-hidden=\"true\"\n />\n </Button>\n);\n","export { Field } from \"@ark-ui/react/field\";\n","import { useEffect, useRef, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport { partitionFiles, type RejectedFile } from \"../lib/partition-files.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { IconButton } from \"./IconButton.tsx\";\nimport { ImageIcon, XIcon } from \"./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;\n\nfunction isPreviewableImage(file: File): boolean {\n return PREVIEWABLE_IMAGE_TYPES.has(file.type);\n}\n\nfunction PreviewPlaceholder() {\n return (\n <div className=\"polli:flex polli:h-16 polli:w-16 polli:items-center polli:justify-center polli:rounded-lg polli:bg-theme-bg-active polli:text-theme-text-soft\">\n <ImageIcon className=\"polli:h-5 polli:w-5\" />\n </div>\n );\n}\n\nfunction FilePreview({ file }: { file: File }) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [canPreview, setCanPreview] = useState(() =>\n isPreviewableImage(file),\n );\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 = PREVIEW_SIZE;\n canvas.height = PREVIEW_SIZE;\n\n const scale = Math.max(\n PREVIEW_SIZE / bitmap.width,\n PREVIEW_SIZE / bitmap.height,\n );\n const width = bitmap.width * scale;\n const height = bitmap.height * scale;\n const x = (PREVIEW_SIZE - width) / 2;\n const y = (PREVIEW_SIZE - height) / 2;\n\n context.clearRect(0, 0, PREVIEW_SIZE, PREVIEW_SIZE);\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]);\n\n if (!canPreview) return <PreviewPlaceholder />;\n\n return (\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={file.name}\n className=\"polli:h-16 polli:w-16 polli:rounded-lg\"\n width={PREVIEW_SIZE}\n height={PREVIEW_SIZE}\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 /** Fully locks the field: no add, no remove, drops ignored. */\n disabled?: boolean;\n /** Optional cascade override; defaults to the inherited `[data-theme]`. */\n theme?: ThemeName;\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 disabled = false,\n theme,\n className,\n}: FileUploadProps) {\n // A file dropped anywhere outside the zone otherwise triggers the browser's\n // default action — navigating the tab to that file (a blank/file page).\n // Suppress that document-wide so a near-miss drop is a no-op, not a page\n // takeover. (Same intent as react-dropzone's `preventDropOnDocument`.)\n useEffect(() => {\n const prevent = (event: DragEvent) => event.preventDefault();\n document.addEventListener(\"dragover\", prevent);\n document.addEventListener(\"drop\", prevent);\n return () => {\n document.removeEventListener(\"dragover\", prevent);\n document.removeEventListener(\"drop\", prevent);\n };\n }, []);\n\n // Only `disabled` blocks interaction. At the file limit the input stays\n // enabled so over-limit selections still flow through partitionFiles and\n // are reported as `{ reason: \"count\" }` via onReject (deterministic reject).\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 return (\n <div\n data-theme={theme}\n className={cn(\"polli:flex polli:flex-col polli:gap-3\", className)}\n >\n <label\n className={cn(\n \"polli-control polli:flex polli:flex-col polli:items-center polli:justify-center polli:gap-2\",\n \"polli:rounded-xl polli:border polli:border-dashed polli:border-theme-border\",\n \"polli:bg-theme-bg-pale polli:px-4 polli:py-6 polli:text-center polli:text-sm\",\n \"polli:text-theme-text-soft polli:transition-colors\",\n disabled\n ? \"polli:cursor-not-allowed polli:opacity-50\"\n : \"polli:cursor-pointer 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 <ImageIcon className=\"polli:h-6 polli:w-6\" />\n <span>\n Drag images here or{\" \"}\n <span className=\"polli:underline\">browse</span>\n </span>\n <input\n type=\"file\"\n accept={accept}\n multiple={maxFiles > 1}\n disabled={disabled}\n className=\"polli:sr-only\"\n onChange={(e) => {\n addFiles(Array.from(e.target.files ?? []));\n e.target.value = \"\";\n }}\n />\n </label>\n\n {value.length > 0 && (\n <ul className=\"polli:m-0 polli:flex polli:flex-wrap polli:gap-3 polli:p-0\">\n {value.map((file, index) => (\n <li\n key={`${file.name}-${index}`}\n className=\"polli:relative polli:flex polli:list-none polli:flex-col polli:gap-1\"\n >\n <FilePreview file={file} />\n <span className=\"polli:max-w-16 polli:truncate polli:text-xs polli:text-theme-text-muted\">\n {file.name}\n </span>\n {!disabled && (\n <div className=\"polli:absolute polli:-top-2 polli:-right-2\">\n <IconButton\n intent=\"danger\"\n title={`Remove ${file.name}`}\n onClick={() =>\n onChange(\n value.filter(\n (_, i) => i !== index,\n ),\n )\n }\n >\n <XIcon className=\"polli:h-3 polli:w-3\" />\n </IconButton>\n </div>\n )}\n </li>\n ))}\n </ul>\n )}\n </div>\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 { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\n/** IconButton only supports `danger` (delete icons). */\ntype IconButtonIntent = \"danger\";\n\nconst intentClasses: Record<IconButtonIntent, string> = {\n danger:\n \"polli:bg-intent-danger-bg-light polli:hover:bg-intent-danger-bg-hover \" +\n \"polli:text-intent-danger-text\",\n};\n\n// Default (no intent): cascade-driven theme tile, deeper on hover.\nconst defaultClasses =\n \"polli:bg-theme-bg-active polli:hover:bg-theme-bg-hover \" +\n \"polli:text-theme-text-soft polli:hover:text-theme-text-strong\";\n\ntype IconButtonProps = {\n intent?: IconButtonIntent;\n title?: string;\n onClick: () => void;\n children: ReactNode;\n className?: string;\n};\n\nexport const IconButton: FC<IconButtonProps> = ({\n intent,\n title,\n onClick,\n children,\n className,\n}) => (\n <button\n type=\"button\"\n onClick={onClick}\n title={title}\n aria-label={title}\n data-intent={intent}\n className={cn(\n \"polli-control polli:inline-flex polli:h-6 polli:w-6 polli:cursor-pointer polli:items-center polli:justify-center polli:rounded polli:transition-colors\",\n intent ? intentClasses[intent] : defaultClasses,\n className,\n )}\n >\n {children}\n </button>\n);\n","import type { FC, ReactNode } from \"react\";\nimport { Tooltip } from \"./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 * Both the badge and the popup follow the page theme: badge reads\n * `bg-theme-bg-active`; popup uses the universal recipe via `<Tooltip>`\n * (`bg-theme-bg-pale` + `border-theme-border` + `text-theme-text-strong`,\n * viewport-clamped). Cursor on the badge is `cursor-help`.\n */\nexport const InfoTip: FC<InfoTipProps> = ({\n text,\n content,\n label = \"More info\",\n}) => (\n <Tooltip content={content ?? text} ariaLabel={label} className=\"polli:ml-1\">\n <span className=\"polli:inline-flex polli:h-3.5 polli:w-3.5 polli:items-center polli:justify-center polli:rounded-full polli:border polli:border-theme-border polli:bg-theme-bg-active polli:font-bold polli:text-micro polli:text-theme-text-strong polli:transition-colors\">\n i\n </span>\n </Tooltip>\n);\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { ExternalLinkIcon } from \"./icons/index.tsx\";\n\ntype BaseInlineLinkProps = {\n /** Override the cascade theme for this link's subtree. */\n theme?: ThemeName;\n /** Set explicitly for non-http external links, or false for custom routing components. */\n external?: boolean;\n showIcon?: boolean;\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\nfunction isExternalHref(href: unknown): boolean {\n return typeof href === \"string\" && /^https?:\\/\\//.test(href);\n}\n\nexport function InlineLink<T extends React.ElementType = \"a\">({\n as,\n theme,\n external,\n showIcon = true,\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 data-theme={theme}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n className={cn(\n \"polli-control polli:inline-flex polli:items-center polli:gap-1 polli:rounded-sm polli:font-semibold polli:text-theme-text-strong\",\n \"polli:underline polli:decoration-theme-border polli:decoration-2 polli:underline-offset-3\",\n \"polli:transition-colors polli:hover:text-theme-text-soft polli:hover:decoration-theme-text-soft\",\n className,\n )}\n {...linkProps}\n >\n {children}\n {showIcon && isExternal && (\n <ExternalLinkIcon\n aria-hidden=\"true\"\n className=\"polli:h-3.5 polli:w-3.5 polli:shrink-0 polli:opacity-65\"\n />\n )}\n </Component>\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:text-gray-950\",\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","import type { ComponentPropsWithoutRef, FC, PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\ntype SurfaceVariant = \"panel\" | \"card\" | \"card-themed\";\n\nconst variantClasses: Record<SurfaceVariant, string> = {\n panel: \"polli:rounded-2xl polli:border polli:border-theme-border polli:bg-theme-bg-subtle polli:p-6\",\n card: \"polli:rounded-xl polli:bg-surface-white polli:p-4\",\n \"card-themed\": \"polli:rounded-xl polli:bg-theme-bg-pale polli:p-4\",\n};\n\ntype SurfaceOwnProps = {\n /** Override the cascade theme for this surface's subtree. */\n theme?: ThemeName;\n /**\n * Visual role.\n * - `panel` — outer container: bordered, semi-transparent theme bg\n * - `card` — borderless white inner (default)\n * - `card-themed` — borderless theme-tinted inner (deeper than panel)\n */\n variant?: SurfaceVariant;\n className?: string;\n};\n\ntype SurfaceProps = PropsWithChildren<\n SurfaceOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof SurfaceOwnProps | \"color\">\n>;\n\nexport const Surface: FC<SurfaceProps> = ({\n theme,\n variant = \"card\",\n className,\n children,\n ...rest\n}) => (\n <div\n {...rest}\n data-theme={theme}\n className={cn(\"polli:min-w-0\", variantClasses[variant], className)}\n >\n {children}\n </div>\n);\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { ExternalLinkIcon } from \"./icons/index.tsx\";\nimport { Surface } from \"./Surface.tsx\";\n\ntype BaseLinkCardProps = {\n /** Override the cascade theme for this card's subtree. */\n theme?: ThemeName;\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\nfunction isExternalHref(href: unknown): boolean {\n return typeof href === \"string\" && /^https?:\\/\\//.test(href);\n}\n\nexport function LinkCard<T extends React.ElementType = \"a\">({\n as,\n theme,\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 <Component\n data-theme={theme}\n target={isExternal ? \"_blank\" : undefined}\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n className={cn(\n \"polli:group polli:block polli:h-full polli:rounded-xl polli:outline-none\",\n className,\n )}\n {...linkProps}\n >\n <Surface\n theme={theme}\n variant=\"card\"\n className={cn(\n \"polli:relative polli:flex polli:h-full polli:flex-col polli:gap-2 polli:bg-white/80 polli:p-5\",\n showIcon && isExternal && \"polli:pr-10\",\n \"polli:transition polli:group-hover:-translate-y-0.5 polli:group-hover:bg-white/95\",\n \"polli:group-focus-visible:ring-2 polli:group-focus-visible:ring-theme-border\",\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 </Component>\n );\n}\n","import ReactMarkdown, { type Components } from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type MarkdownProps = {\n children: string;\n className?: string;\n};\n\nconst components: Components = {\n ul: ({ node, ...props }) => (\n <ul\n className=\"polli:flex polli:min-w-0 polli:list-disc polli:flex-col polli:gap-1 polli:pl-5 polli:marker:text-theme-text-muted\"\n {...props}\n />\n ),\n ol: ({ node, ...props }) => (\n <ol\n className=\"polli:flex polli:min-w-0 polli:list-decimal polli:flex-col polli:gap-1 polli:pl-5 polli:marker:text-theme-text-muted\"\n {...props}\n />\n ),\n p: ({ node, ...props }) => (\n <p className=\"polli:mb-2 polli:last:mb-0\" {...props} />\n ),\n strong: ({ node, ...props }) => (\n <strong\n className=\"polli:font-semibold polli:text-theme-text-strong\"\n {...props}\n />\n ),\n code: ({ node, ...props }) => (\n <code\n className=\"polli:break-words polli:rounded polli:bg-theme-bg-subtle polli:px-1 polli:py-0.5 polli:font-mono polli:text-xs\"\n {...props}\n />\n ),\n a: ({ node, ...props }) => (\n <a\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"polli-control polli:rounded-sm polli:font-semibold polli:text-theme-text-strong polli:underline polli:underline-offset-2\"\n {...props}\n />\n ),\n};\n\n/** Compact markdown for cards and snippets. Use Prose for document-style content. */\nexport function Markdown({ children, className }: MarkdownProps) {\n return (\n <div\n className={cn(\n \"polli:min-w-0 polli:font-body polli:leading-relaxed\",\n className,\n )}\n >\n <ReactMarkdown remarkPlugins={[remarkGfm]} components={components}>\n {children}\n </ReactMarkdown>\n </div>\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\";\nimport type { ThemeName } from \"../theme.ts\";\n\ntype ScrollAxis = \"y\" | \"x\";\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};\n\ntype ScrollAreaOwnProps = {\n /** Override the ambient cascade theme for this scroller's thumb. */\n theme?: ThemeName;\n /** Scroll direction. Default `y`. */\n axis?: ScrollAxis;\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/**\n * Themed auto-hide scroll container. Thumb color follows the nearest\n * `[data-theme=\"...\"]` ancestor; pass `theme` to override locally.\n */\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ theme, axis = \"y\", className, children, ...rest }, externalRef) => {\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 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 }, []);\n\n return (\n <div\n {...rest}\n ref={setRef}\n data-theme={theme}\n className={cn(\n \"polli-scrollbar-subtle 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 { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { ChevronIcon } from \"./ChevronIcon.tsx\";\nimport { Dropdown } from \"./Dropdown.tsx\";\nimport { ScrollArea } from \"./ScrollArea.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 align?: \"start\" | \"end\";\n label?: string;\n theme: ThemeName;\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:border 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 align = \"start\",\n label,\n theme,\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 ? \"All\"\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 data-theme={theme}\n className=\"polli:group polli:relative polli:flex polli:items-center polli:gap-2\"\n >\n {labelNode}\n <button\n type=\"button\"\n disabled\n className={cn(\n TRIGGER_BASE,\n \"polli:cursor-not-allowed polli:border-theme-border polli:bg-theme-bg-subtle polli:opacity-60\",\n )}\n >\n <span className=\"polli:flex-1 polli:truncate polli:text-left polli:text-theme-text-soft/60\">\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 <span className=\"polli:pointer-events-none polli:absolute polli:-top-8 polli:left-1/2 polli:z-[100] polli:-translate-x-1/2 polli:whitespace-nowrap polli:rounded-md polli:border polli:border-theme-border polli:bg-theme-bg-pale polli:px-2 polli:py-1 polli:text-xs polli:text-theme-text-strong polli:opacity-0 polli:shadow-sm polli:transition-opacity polli:group-hover:opacity-100\">\n No items available\n </span>\n </div>\n );\n }\n\n return (\n <div\n data-theme={theme}\n className=\"polli:flex polli:items-center polli:gap-2\"\n >\n {labelNode}\n <Dropdown\n theme={theme}\n align={align}\n className=\"polli:min-w-[320px]\"\n trigger={(open) => (\n <button\n type=\"button\"\n className={cn(\n TRIGGER_BASE,\n open\n ? \"polli:border-theme-border polli:bg-theme-bg-active\"\n : \"polli:border-theme-border polli:bg-theme-bg-subtle polli:hover:bg-theme-bg-pale\",\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 theme={theme} className=\"polli:max-h-64\">\n <button\n type=\"button\"\n onClick={selectAll}\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 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 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 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:whitespace-nowrap\">\n {opt.label}\n </span>\n </button>\n );\n })}\n </ScrollArea>\n </Dropdown>\n </div>\n );\n};\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\ntype BaseNavItemProps = {\n /** Section color via the `[data-theme]` cascade — tints the dot + active fill. */\n theme?: ThemeName;\n /** Current/selected item — fills with the section color + sets `aria-current`. */\n active?: boolean;\n className?: string;\n};\n\n// Same recipe as the enter dashboard sidebar item: neutral/quiet when inactive,\n// section-colored dot always, filled with the section color when active.\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-gray-800 polli:hover:bg-white/60 polli:hover:text-gray-950\";\nconst dotClasses =\n \"polli:h-2.5 polli:w-2.5 polli:shrink-0 polli:rounded-full polli:bg-theme-bg-hover polli:shadow-[inset_0_0_0_1px_rgba(0,0,0,0.08)]\";\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 themed pill with a persistent section-color dot, neutral\n * when inactive and filled with the section color when active. Polymorphic:\n * `<NavItem>` (button) for in-page nav, `<NavItem as={Link} active={…}>` for\n * routed nav. Mirrors enter's sidebar item so both apps share one design.\n */\nexport function NavItem<T extends React.ElementType = \"button\">({\n as,\n theme,\n active = false,\n className,\n children,\n ...rest\n}: NavItemProps<T>) {\n const Component: React.ElementType = as || \"button\";\n return (\n <Component\n data-theme={theme}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n base,\n active ? activeClasses : inactiveClasses,\n className,\n )}\n {...rest}\n >\n <span aria-hidden=\"true\" className={dotClasses} />\n {children}\n </Component>\n );\n}\n","import type { FC } from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport {\n addUtcDays,\n formatPeriodLabel,\n isPeriodSelectable,\n type PeriodGranularity,\n type PeriodSelection,\n periodFromDate,\n periodToWindow,\n startOfUtcDay,\n} from \"../lib/period.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { ChevronIcon } from \"./ChevronIcon.tsx\";\nimport { Dropdown } from \"./Dropdown.tsx\";\nimport { TabButton } from \"./TabButton.tsx\";\n\nexport type PeriodPickerProps = {\n value: PeriodSelection;\n onChange: (value: PeriodSelection) => void;\n theme: ThemeName;\n minDate?: Date;\n maxDate?: Date;\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 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 theme,\n minDate = new Date(0),\n maxDate,\n}) => {\n const [open, setOpen] = useState(false);\n const [viewDate, setViewDate] = useState<Date>(() => periodDate(value));\n const { granularity, period } = value;\n\n useEffect(() => {\n setViewDate(periodDate({ granularity, period }));\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\n const setGranularity = (granularity: PeriodGranularity) => {\n onChange(periodFromDate(granularity, periodDate(value)));\n };\n\n const selectDate = (date: Date) => {\n onChange(periodFromDate(value.granularity, date));\n setOpen(false);\n };\n\n const viewLabel =\n value.granularity === \"month\"\n ? String(viewDate.getUTCFullYear())\n : viewDate.toLocaleDateString(\"en-US\", {\n timeZone: \"UTC\",\n month: \"long\",\n year: \"numeric\",\n });\n\n return (\n <div\n data-theme={theme}\n className=\"polli:flex polli:flex-wrap polli:items-center polli:gap-2\"\n >\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 <Dropdown\n theme={theme}\n open={open}\n onOpenChange={setOpen}\n className=\"polli:w-[304px] polli:rounded-xl polli:p-3\"\n trigger={(isOpen) => (\n <button\n type=\"button\"\n aria-label={`Select period, current ${formatPeriodLabel(value)}`}\n className={cn(\n \"polli-control polli:inline-flex polli:min-w-[150px] polli:items-center polli:justify-between polli:gap-2 polli:rounded-full polli:border polli:px-4 polli:pt-1.5 polli:pb-2 polli:text-left polli:text-base polli:font-medium polli:leading-normal\",\n \"polli:border-theme-border polli:bg-theme-bg-subtle polli:text-theme-text-base\",\n \"polli:transition-all polli:duration-200 polli:ease-out polli:hover:bg-theme-bg-pale\",\n isOpen &&\n \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:shadow-sm\",\n )}\n >\n <span>{formatPeriodLabel(value)}</span>\n <ChevronIcon expanded={isOpen} />\n </button>\n )}\n >\n <div className=\"polli:mb-3 polli:flex polli:items-center polli:justify-between\">\n <button\n type=\"button\"\n aria-label={\n value.granularity === \"month\"\n ? \"Previous year\"\n : \"Previous month\"\n }\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-sm polli:font-bold polli:text-theme-text-base\">\n {viewLabel}\n </div>\n <button\n type=\"button\"\n aria-label={\n value.granularity === \"month\"\n ? \"Next year\"\n : \"Next month\"\n }\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 disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli-control polli:rounded-lg polli:px-3 polli:py-2 polli:text-xs 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-gray-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-gray-300 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-micro polli:font-bold polli:uppercase polli:text-gray-400\">\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 week ${formatPeriodLabel(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 disabled={!selectable}\n onClick={() => selectDate(date)}\n className={cn(\n \"polli-control polli:aspect-square polli:rounded-lg polli:text-xs polli:font-medium polli:transition-colors polli:duration-150\",\n !inCurrentMonth &&\n \"polli:text-gray-300\",\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-gray-700 polli:hover:bg-theme-bg-subtle\",\n !selectable &&\n \"polli:cursor-not-allowed polli:text-gray-300 polli:hover:bg-transparent\",\n )}\n >\n {date.getUTCDate()}\n </button>\n );\n })}\n </div>\n </>\n )}\n </Dropdown>\n </div>\n );\n};\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nexport type TabButtonProps = {\n active: boolean;\n onClick: () => void;\n children: ReactNode;\n /** Optional cascade override; defaults to inherited [data-theme]. */\n theme?: ThemeName;\n size?: \"md\" | \"sm\";\n variant?: \"default\" | \"ghost\";\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n};\n\nconst sizeClasses = {\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 default: {\n base: \"polli:border\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:border-theme-border\",\n inactive:\n \"polli:bg-theme-bg-subtle polli:text-theme-text-base polli:border-theme-border polli:hover:bg-theme-bg-active\",\n },\n ghost: {\n base: \"polli:border polli:border-transparent\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n inactive:\n \"polli:bg-transparent polli:text-theme-text-base polli:hover:bg-theme-bg-subtle polli:hover:text-theme-text-strong\",\n },\n} as const;\n\nexport const TabButton: FC<TabButtonProps> = ({\n theme,\n active,\n onClick,\n children,\n size = \"md\",\n variant = \"default\",\n ariaLabel,\n disabled = false,\n className,\n}) => {\n const classes = variantClasses[variant];\n return (\n <button\n type=\"button\"\n data-theme={theme}\n onClick={onClick}\n aria-label={ariaLabel}\n aria-pressed={active}\n disabled={disabled}\n className={cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:font-medium polli:leading-normal polli:transition-all polli:duration-200\",\n classes.base,\n active ? classes.active : classes.inactive,\n disabled && \"polli:cursor-not-allowed polli:opacity-50\",\n sizeClasses[size],\n className,\n )}\n >\n {children}\n </button>\n );\n};\n","import Markdown, { type Components } from \"react-markdown\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkGfm from \"remark-gfm\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type ProseProps = {\n children: string;\n className?: string;\n};\n\nconst components: Components = {\n h1: ({ node, ...props }) => (\n <h1\n className=\"polli:mt-0 polli:mb-5 polli:break-words polli:font-heading polli:text-4xl polli:leading-none polli:text-theme-text-strong\"\n {...props}\n />\n ),\n h2: ({ node, ...props }) => (\n <h2\n className=\"polli:mt-8 polli:mb-3 polli:break-words polli:font-subheading polli:text-2xl polli:leading-tight polli:text-theme-text-strong\"\n {...props}\n />\n ),\n h3: ({ node, ...props }) => (\n <h3\n className=\"polli:mt-6 polli:mb-2 polli:break-words polli:font-subheading polli:text-xl polli:leading-tight polli:text-theme-text-strong\"\n {...props}\n />\n ),\n p: ({ node, ...props }) => (\n <p className=\"polli:my-4 polli:leading-relaxed\" {...props} />\n ),\n a: ({ node, ...props }) => (\n <a\n className=\"polli-control polli:rounded-sm polli:font-semibold polli:text-theme-text-strong polli:underline polli:decoration-theme-border polli:decoration-2 polli:underline-offset-3 polli:hover:decoration-theme-text-soft\"\n {...props}\n />\n ),\n ul: ({ node, ...props }) => (\n <ul\n className=\"polli:my-4 polli:list-disc polli:pl-6 polli:leading-relaxed\"\n {...props}\n />\n ),\n ol: ({ node, ...props }) => (\n <ol\n className=\"polli:my-4 polli:list-decimal polli:pl-6 polli:leading-relaxed\"\n {...props}\n />\n ),\n blockquote: ({ node, ...props }) => (\n <blockquote\n className=\"polli:my-4 polli:border-l-4 polli:border-theme-border polli:pl-4 polli:text-theme-text-soft\"\n {...props}\n />\n ),\n code: ({ node, ...props }) => (\n <code\n className=\"polli:rounded polli:bg-theme-bg-active polli:px-1 polli:py-0.5 polli:font-pixel polli:text-sm\"\n {...props}\n />\n ),\n pre: ({ node, ...props }) => (\n <pre\n className=\"polli:my-4 polli:overflow-x-auto polli:rounded-lg polli:bg-theme-bg-active polli:p-4\"\n {...props}\n />\n ),\n table: ({ node, ...props }) => (\n <table\n className=\"polli:my-4 polli:w-full polli:border-collapse polli:text-sm\"\n {...props}\n />\n ),\n th: ({ node, ...props }) => (\n <th\n className=\"polli:border polli:border-theme-border polli:px-3 polli:py-2 polli:text-left polli:font-semibold\"\n {...props}\n />\n ),\n td: ({ node, ...props }) => (\n <td\n className=\"polli:border polli:border-theme-border polli:px-3 polli:py-2\"\n {...props}\n />\n ),\n hr: ({ node, ...props }) => (\n <hr className=\"polli:my-6 polli:border-theme-border\" {...props} />\n ),\n};\n\nexport function Prose({ children, className }: ProseProps) {\n return (\n <div\n className={cn(\n \"polli:font-body polli:text-theme-text-base polli:leading-relaxed\",\n className,\n )}\n >\n <Markdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeSlug]}\n components={components}\n >\n {children}\n </Markdown>\n </div>\n );\n}\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\nimport { Surface } from \"./Surface.tsx\";\n\nexport type SectionProps = {\n title: string;\n theme: ThemeName;\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 theme,\n id,\n framed = false,\n intro,\n action,\n actionClassName,\n panelClassName,\n titleClassName,\n children,\n className,\n}) => (\n <section\n id={id}\n className={cn(\n \"polli:flex polli:scroll-mt-10 polli:flex-col polli:gap-4\",\n className,\n )}\n >\n <div className=\"polli:flex polli:flex-wrap polli:items-center polli:justify-between polli:gap-3 polli:px-1\">\n <h2\n data-theme={theme}\n className={cn(\n \"polli:text-left polli:font-subheading polli:text-2xl polli:leading-tight polli:text-theme-text-strong\",\n titleClassName,\n )}\n >\n {title}\n </h2>\n {action && (\n <div className={cn(\"polli:shrink-0\", actionClassName)}>\n {action}\n </div>\n )}\n </div>\n {framed ? (\n <Surface\n variant=\"panel\"\n theme={theme}\n className={cn(\n \"polli:flex polli:flex-col polli:gap-5\",\n panelClassName,\n )}\n >\n {intro && (\n <div className=\"polli:max-w-2xl polli:text-theme-text-base\">\n {intro}\n </div>\n )}\n {children}\n </Surface>\n ) : (\n <>\n {intro && (\n <div\n data-theme={theme}\n className=\"polli:max-w-2xl polli:text-theme-text-base\"\n >\n {intro}\n </div>\n )}\n {children}\n </>\n )}\n </section>\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 { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nexport type StatCardProps = {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n theme?: ThemeName;\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 theme,\n className,\n labelClassName,\n valueClassName,\n detailClassName,\n}) => (\n <div data-theme={theme} className={cn(\"polli:text-sm\", className)}>\n <div\n className={cn(\n \"polli:text-micro polli:font-bold polli:uppercase polli:tracking-wide polli:text-theme-text-strong\",\n labelClassName,\n )}\n >\n {label}\n </div>\n <div\n className={cn(\n \"polli:mt-1 polli:min-h-8 polli:break-words polli:text-2xl polli:font-bold polli:leading-tight polli:tabular-nums polli:text-theme-text-strong\",\n valueClassName,\n )}\n >\n {value}\n </div>\n {detail && (\n <div\n className={cn(\n \"polli:mt-2 polli:text-xs polli:text-theme-text-soft\",\n detailClassName,\n )}\n >\n {detail}\n </div>\n )}\n </div>\n);\n","import type { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\nexport type SwitchStatus = \"off\" | \"on\" | \"invalid\";\n\nexport type SwitchProps = {\n checked: boolean;\n onChange: (next: boolean) => void;\n /** Visual status. Drives track colour only. Defaults to `checked ? \"on\" : \"off\"`. */\n status?: SwitchStatus;\n /** Accessible label (aria-label). Not rendered visibly. */\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n};\n\n// Switch is theme-independent. Universal switch palette:\n// off — pale neutral grey (so the white thumb stays visible)\n// on — soft green (universal \"enabled\" affordance)\n// invalid — soft red (incomplete / error / setup needed)\nconst trackClasses: Record<SwitchStatus, string> = {\n off: \"polli:bg-gray-200\",\n on: \"polli:bg-intent-success-bg-light\",\n invalid: \"polli:bg-intent-danger-bg-light\",\n};\n\n/**\n * Binary toggle primitive. Universal palette — does NOT follow the page\n * theme. Three states: off (white), on (soft green), invalid (soft red,\n * for \"enabled but needs attention\").\n *\n * `checked` drives thumb position; `status` drives track colour. So\n * `checked={true} status=\"invalid\"` renders thumb-right with a red track.\n */\nexport const Switch: FC<SwitchProps> = ({\n checked,\n onChange,\n status,\n ariaLabel,\n disabled = false,\n className,\n}) => {\n const effectiveStatus: SwitchStatus = status ?? (checked ? \"on\" : \"off\");\n const resolvedAriaLabel =\n ariaLabel ?? (checked ? \"Turn off toggle\" : \"Turn on toggle\");\n\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={resolvedAriaLabel}\n onClick={() => onChange(!checked)}\n disabled={disabled}\n className={cn(\n \"polli-control polli:relative polli:inline-flex polli:h-7 polli:w-12 polli:shrink-0 polli:items-center polli:rounded-full polli:transition polli:disabled:cursor-not-allowed polli:disabled:opacity-60\",\n trackClasses[effectiveStatus],\n className,\n )}\n >\n <span\n className={cn(\n \"polli:inline-block polli:h-5 polli:w-5 polli:rounded-full polli:bg-white polli:shadow-sm polli:transition-transform\",\n checked ? \"polli:translate-x-6\" : \"polli:translate-x-1\",\n )}\n />\n </button>\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\" | \"success\" | \"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 success: \"polli:bg-intent-success-bg-light/55\",\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-theme-bg-active polli:text-micro polli:text-theme-text-muted\",\n className,\n )}\n />\n);\n\nexport type TableBodyProps = ComponentPropsWithoutRef<\"tbody\">;\n\nexport const TableBody: FC<TableBodyProps> = ({ className, ...rest }) => (\n <tbody\n {...rest}\n className={cn(\"polli:divide-y polli:divide-theme-border/65\", className)}\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 {active && sortDirection && (\n <span aria-hidden=\"true\">\n {sortDirection === \"asc\" ? \"^\" : \"v\"}\n </span>\n )}\n </>\n );\n\n const classes = cn(\n \"polli:px-3 polli:py-2 polli:font-bold polli:uppercase 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 {...rest} className={classes}>\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 { 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-gray-950\",\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","/**\n * The six chrome themes exposed by the CSS-var cascade. Apply via\n * `data-theme=\"<name>\"` on any ancestor — primitives and `--polli-*`\n * tokens in that subtree restyle accordingly.\n */\nexport const themes = [\n \"amber\",\n \"blue\",\n \"pink\",\n \"teal\",\n \"violet\",\n \"green\",\n] as const;\n\nexport type ThemeName = (typeof themes)[number];\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;;;ACAA,kBAAqB;AACrB,4BAAwB;AAGjB,SAAS,MAAM,QAA+C;AACjE,aAAO,mCAAQ,kBAAK,GAAG,MAAM,CAAC;AAClC;;;ACNA,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,UAAMA,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,kBAAkB,WAAoC;AAClE,QAAM,EAAE,OAAO,IAAI,IAAI,eAAe,SAAS;AAE/C,MAAI,UAAU,gBAAgB,OAAO;AACjC,UAAM,QAAQ,cAAc;AAC5B,UAAM,YAAY,WAAW,OAAO,EAAE;AACtC,QAAI,MAAM,QAAQ,MAAM,MAAM,QAAQ,EAAG,QAAO;AAChD,QAAI,MAAM,QAAQ,MAAM,UAAU,QAAQ,EAAG,QAAO;AACpD,WAAO,MAAM,mBAAmB,SAAS;AAAA,MACrC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACV,CAAC;AAAA,EACL;AAEA,MAAI,UAAU,gBAAgB,QAAQ;AAClC,UAAM,UAAU,WAAW,KAAK,EAAE;AAClC,WAAO,GAAG,MAAM,mBAAmB,SAAS;AAAA,MACxC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,IACT,CAAC,CAAC,MAAM,QAAQ,mBAAmB,SAAS;AAAA,MACxC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACV,CAAC,CAAC;AAAA,EACN;AAEA,SAAO,MAAM,mBAAmB,SAAS;AAAA,IACrC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACV,CAAC;AACL;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;;;ACnLA,mBAA0B;AAMnB,SAAS,cAAc,UAAU,MAAY;AAChD,8BAAU,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;;;ACpBA,IAAAE,eAAqB;AACrB,IAAAC,yBAAoC;AAEpC,IAAMC,eAAU,4CAAoB,EAAE,QAAQ,QAAQ,CAAC;AAGhD,SAASC,OAAM,QAA+C;AACjE,SAAOD,aAAQ,mBAAK,GAAG,MAAM,CAAC;AAClC;;;ACkBI;AArBJ,IAAM,gBAA6C;AAAA,EAC/C,MAAM;AAAA,EACN,SACI;AAAA,EACJ,SACI;AAAA,EACJ,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,WAAWE;AAAA,MACP;AAAA,MACA,cAAc,MAAM;AAAA,MACpB;AAAA,IACJ;AAAA,IAEC;AAAA,eACG,4CAAC,SAAI,WAAU,gFACV,iBACL;AAAA,MAEJ,4CAAC,SAAK,UAAS;AAAA;AAAA;AACnB;;;ACgCI,IAAAC,sBAAA;AAlER,IAAM,QAAQ;AAAA,EACV,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAGA,IAAM,eACF;AAKJ,IAAMC,iBAA8C;AAAA,EAChD,QACI;AAER;AAYA,IAAM,gBAAgB,CAAC;AAAA,EACnB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAgD;AAC5C,QAAM,eAAe,SAASA,eAAc,MAAM,IAAI;AACtD,SAAOC;AAAA,IACH;AAAA,IACA,WACM,8CACA;AAAA,IACN;AAAA,IACA,MAAM,QAAQ,IAAI;AAAA,IAClB;AAAA,EACJ;AACJ;AAOO,SAAS,OAA+C;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAmB;AACf,QAAM,YAA+B,MAAM;AAE3C,SACI;AAAA,IAAC;AAAA;AAAA,MAEG,cAAY,SAAS,SAAY;AAAA,MACjC,eAAa;AAAA,MACb,WAAW,cAAc;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACL;AAER;;;AC5EI,IAAAC,sBAAA;AAPG,IAAM,cAAoC,CAAC;AAAA,EAC9C,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ;AAAA,IACA,WAAWC;AAAA,MACP;AAAA,MACA,OAAO,oBAAoB;AAAA,MAC3B;AAAA,IACJ;AAAA,IAEC;AAAA;AACL;;;ACCI,IAAAC,sBAAA;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,WAAWC;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;;;ACqBI,IAAAC,sBAAA;AAzCR,IAAM,YAAY;AAAA,EACd,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAMC,iBAA4C;AAAA,EAC9C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SACI;AAAA,EACJ,SACI;AAAA,EACJ,SACI;AAAA,EACJ,QAAQ;AACZ;AAaO,IAAM,OAAsB,CAAC;AAAA,EAChC;AAAA,EACA;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,cAAY;AAAA,MACZ,WAAWC;AAAA,QACP;AAAA,QACA,UAAU,IAAI;AAAA,QACd;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACjBQ,IAAAC,sBAAA;AAnBD,IAAM,cAAoC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,iBAAiB;AAAA,EACjB;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,WAAWC;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,WAAWA;AAAA,YACP;AAAA,YACA,WAAW,uBAAuB;AAAA,YAClC,CAAC,YAAY;AAAA,YACb;AAAA,YACA,WAAW,6BAA6B;AAAA,UAC5C;AAAA,UAEA;AAAA,yDAAC,SAAI,WAAU,8BAA8B,iBAAM;AAAA,YACnD;AAAA,cAAC;AAAA;AAAA,gBACG;AAAA,gBACA,WAAU;AAAA;AAAA,YACd;AAAA;AAAA;AAAA,MACJ;AAAA,MACC,YAAY,6CAAC,SAAI,WAAW,gBAAiB,UAAS;AAAA;AAAA;AAC3D;;;ACvEJ,IAAAC,gBAOO;;;ACPP,IAAAC,gBAOO;AAkFC,IAAAC,sBAAA;AA/ER,IAAM,oBAAoB;AAC1B,IAAM,0BAA0B;AAkBzB,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,kBAAkB;AACtB,MAAM;AACF,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAS;AAAA,IACnD,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,EACd,CAAC;AACD,QAAM,iBAAa,sBAA2B,IAAI;AAElD,QAAM,wBAAwB,MAAM;AAChC,QAAI,WAAW,SAAS;AACpB,YAAM,OAAO,WAAW,QAAQ,sBAAsB;AACtD,YAAM,WAAW,KAAK;AAAA,QAClB;AAAA,QACA,OAAO,aAAa,0BAA0B;AAAA,MAClD;AACA,YAAM,OAAO,KAAK;AAAA,QACd,KAAK,IAAI,KAAK,MAAM,uBAAuB;AAAA,QAC3C,KAAK;AAAA,UACD;AAAA,UACA,OAAO,aAAa,WAAW;AAAA,QACnC;AAAA,MACJ;AACA,yBAAmB;AAAA,QACf,KAAK,KAAK,SAAS;AAAA,QACnB;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAIA,QAAM,mBAAmBC;AAAA,IACrB;AAAA,IACA;AAAA,EACJ;AAEA,QAAM,cAAc,kBACd,mBACA;AAON,QAAM,eACF;AAEJ,QAAM,cACF,8EACI;AAAA,iDAAC,UAAK,WAAW,aAAc,UAAS;AAAA,IACxC;AAAA,MAAC;AAAA;AAAA,QACG,OAAO;AAAA,UACH,KAAK,gBAAgB;AAAA,UACrB,MAAM,gBAAgB;AAAA,UACtB,UAAU,gBAAgB;AAAA,QAC9B;AAAA,QACA,WAAW,GACP,cACM,oCACA,iCACV,IAAI,YAAY;AAAA,QAEf;AAAA;AAAA,IACL;AAAA,KACJ;AAGJ,QAAM,cAAc;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,cAAc,MAAM;AAChB,4BAAsB;AACtB,qBAAe,IAAI;AAAA,IACvB;AAAA,IACA,cAAc,MAAM,eAAe,KAAK;AAAA,IACxC,SAAS,CAAC,MAAkB;AACxB,QAAE,gBAAgB;AAClB,UAAI,SAAS;AACT,gBAAQ;AAAA,MACZ;AACA,UAAI,cAAc,QAAQ;AACtB;AAAA,MACJ;AACA,4BAAsB;AACtB,qBAAe,CAAC,SAAS,CAAC,IAAI;AAAA,IAClC;AAAA,IACA;AAAA,EACJ;AAEA,MAAI,cAAc,QAAQ;AACtB,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,WAAW;AAAA,MACX,cAAc,YAAY;AAAA,MAC1B,cAAc,YAAY;AAAA,MAC1B,SAAS,YAAY;AAAA,MACrB;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;AD3FQ,IAAAC,sBAAA;AAxCD,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB;AAAA,EACA;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,SACF;AAAA,IAAC;AAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAWC;AAAA,QACP;AAAA,QACA,OAAO,cAAc,aAAa,UAAU,MAAM,IAAI;AAAA,MAC1D;AAAA,MAEC,iBAAO,aAAa,aAAa,SAAS,MAAM,IAAI;AAAA;AAAA,EACzD;AAGJ,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAS,SAAS,gBAAgB;AAAA,MAClC,WAAW;AAAA,MAEV;AAAA;AAAA,EACL;AAER;;;AE1FA,oBAAoC;AACpC,oBAAuB;AAEvB,IAAAC,gBAAuB;AAwDP,IAAAC,sBAAA;AApDhB,IAAM,cAAc;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAqBO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,iBAAa,sBAAuB,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,8CAAC,wBACI;AAAA,0BACG;AAAA,YAAC,cAAAA,OAAU;AAAA,YAAV;AAAA,cACG,WAAWC;AAAA,gBACP;AAAA,gBACA;AAAA,cACJ;AAAA;AAAA,UACJ;AAAA,UAEJ;AAAA,YAAC,cAAAD,OAAU;AAAA,YAAV;AAAA,cACG,cAAY;AAAA,cACZ,WAAWC;AAAA,gBACP;AAAA,gBACA;AAAA,cACJ;AAAA,cAEA;AAAA,gBAAC,cAAAD,OAAU;AAAA,gBAAV;AAAA,kBACG,KAAK;AAAA,kBACL,cAAY;AAAA,kBACZ,cAAY;AAAA,kBACZ,mBAAiB;AAAA,kBACjB,WAAWC;AAAA,oBACP;AAAA,oBACA,YAAY,IAAI;AAAA,oBAChB;AAAA,kBACJ;AAAA,kBAEC;AAAA,6BACG;AAAA,sBAAC;AAAA;AAAA,wBACG,WAAWA;AAAA,0BACP;AAAA,0BACA;AAAA,wBACJ;AAAA,wBAEC;AAAA;AAAA,oBACL;AAAA,oBAEH;AAAA;AAAA;AAAA,cACL;AAAA;AAAA,UACJ;AAAA,WACJ;AAAA;AAAA;AAAA,EACJ;AAER;AAEO,IAAM,cAAc,cAAAD,OAAU;;;AC/GrC,qBAAwB;AACxB,IAAAE,iBAAuB;AAEvB,IAAAC,gBAAyB;AAyCjB,IAAAC,uBAAA;AArCR,IAAM,gBACF;AAiBG,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA;AACJ,MAAM;AACF,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,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;AAAA,MACA,cAAc,CAAC,YAAY,QAAQ,QAAQ,IAAI;AAAA,MAC/C,aAAa;AAAA,QACT,WAAW,UAAU,QAAQ,eAAe;AAAA,MAChD;AAAA,MAEA;AAAA,sDAAC,uBAAQ,SAAR,EAAgB,SAAO,MAAE,kBAAQ,IAAI,GAAE;AAAA,QACxC,8CAAC,yBACG,wDAAC,uBAAQ,YAAR,EACG;AAAA,UAAC,uBAAQ;AAAA,UAAR;AAAA,YACG,cAAY;AAAA,YACZ,WAAWC;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;;;AC/CQ,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,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ACtBQ,IAAAC,uBAAA;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,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,UAAS;AAAA,IACjB,8CAAC,UAAK,GAAE,kEAAiE;AAAA,IACzE,8CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,4CAA2C;AAAA,IACnD,8CAAC,UAAK,GAAE,8CAA6C;AAAA,KACzD;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,wDAAC,cAAS,QAAO,kBAAiB;AAAA;AAAA,EACtC;AAER;AAEO,SAAS,cAAc,OAAkB;AAC5C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,UAAK,GAAE,2DAA0D;AAAA,KACtE;AAER;AAEO,SAAS,UAAU,OAAkB;AACxC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,8CAAC,UAAK,GAAE,eAAc;AAAA,KAC1B;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,8CAAC,SAAI,SAAQ,aAAY,eAAY,QAAQ,GAAG,OAC5C;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,GAAE;AAAA;AAAA,EACN,GACJ;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,6CAA4C;AAAA,IACpD,8CAAC,cAAS,QAAO,oBAAmB;AAAA,IACpC,8CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI;AAAA,KACzC;AAER;AAEO,SAAS,iBAAiB,OAAkB;AAC/C,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,sBAAqB,GACjC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,mCAAkC;AAAA,IAC1C,8CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,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,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5B,8CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC9B;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,IACxD,8CAAC,UAAK,GAAE,4BAA2B;AAAA,KACvC;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,8CAAC,UAAK,GAAE,gBAAe;AAAA,KAC3B;AAER;AAEO,SAAS,QAAQ,OAAkB;AACtC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IACjD,8CAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,MAAK,IAAG,OAAM;AAAA,IAClD,8CAAC,UAAK,GAAE,YAAW;AAAA,KACvB;AAER;AAEO,SAAS,SAAS,OAAkB;AACvC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,2BAA0B,GACtC;AAER;AAEO,SAAS,aAAa,OAAkB;AAC3C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,cAAS,QAAO,iBAAgB;AAAA,IACjC,8CAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,KAC1C;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,wCAAuC,GACnD;AAER;AAEO,SAAS,YAAY,OAAkB;AAC1C,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,cAAS,QAAO,wBAAuB;AAAA,IACxC,8CAAC,cAAS,QAAO,mBAAkB;AAAA,KACvC;AAER;AAEO,SAAS,WAAW,OAAkB;AACzC,SACI,+CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D;AAAA,kDAAC,UAAK,GAAE,4DAA2D;AAAA,IACnE,8CAAC,UAAK,GAAE,4EAA2E;AAAA,IACnF,8CAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,MAAK,gBAAe;AAAA,KACzD;AAER;AAEO,SAAS,MAAM,OAAkB;AACpC,SACI,8CAAC,SAAI,eAAY,QAAO,SAAQ,aAAa,GAAG,aAAc,GAAG,OAC7D,wDAAC,UAAK,GAAE,wBAAuB,GACnC;AAER;;;AC1LI,IAAAC,uBAAA;AAPG,IAAM,qBAAkD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,IAAG;AAAA,IACH;AAAA,IACA,QAAO;AAAA,IACP,KAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,WAAWC,IAAG,eAAe,SAAS;AAAA,IAEtC;AAAA,oDAAC,UAAM,UAAS;AAAA,MAChB;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,eAAY;AAAA;AAAA,MAChB;AAAA;AAAA;AACJ;;;ACnCJ,mBAAsB;;;ACAtB,IAAAC,gBAA4C;;;ACgB5C,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,UACA,SACA,EAAE,UAAU,cAAc,OAAO,GAClB;AACf,QAAM,WAAmB,CAAC;AAC1B,QAAM,WAA2B,CAAC;AAClC,MAAI,QAAQ,KAAK,IAAI,GAAG,WAAW,QAAQ,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/BI,IAAAC,uBAAA;AA1BJ,IAAMC,iBAAkD;AAAA,EACpD,QACI;AAER;AAGA,IAAM,iBACF;AAWG,IAAM,aAAkC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG,MAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAY;AAAA,IACZ,eAAa;AAAA,IACb,WAAWC;AAAA,MACP;AAAA,MACA,SAASD,eAAc,MAAM,IAAI;AAAA,MACjC;AAAA,IACJ;AAAA,IAEC;AAAA;AACL;;;AFvBQ,IAAAE,uBAAA;AAfZ,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACD,IAAM,eAAe;AAErB,SAAS,mBAAmB,MAAqB;AAC7C,SAAO,wBAAwB,IAAI,KAAK,IAAI;AAChD;AAEA,SAAS,qBAAqB;AAC1B,SACI,8CAAC,SAAI,WAAU,iJACX,wDAAC,aAAU,WAAU,uBAAsB,GAC/C;AAER;AAEA,SAAS,YAAY,EAAE,KAAK,GAAmB;AAC3C,QAAM,gBAAY,sBAA0B,IAAI;AAChD,QAAM,CAAC,YAAY,aAAa,QAAI;AAAA,IAAS,MACzC,mBAAmB,IAAI;AAAA,EAC3B;AAEA,+BAAU,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,eAAe,OAAO;AAAA,UACtB,eAAe,OAAO;AAAA,QAC1B;AACA,cAAM,QAAQ,OAAO,QAAQ;AAC7B,cAAM,SAAS,OAAO,SAAS;AAC/B,cAAM,KAAK,eAAe,SAAS;AACnC,cAAM,KAAK,eAAe,UAAU;AAEpC,gBAAQ,UAAU,GAAG,GAAG,cAAc,YAAY;AAClD,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,IAAI,CAAC;AAET,MAAI,CAAC,WAAY,QAAO,8CAAC,sBAAmB;AAE5C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,KAAK;AAAA,MACL,MAAK;AAAA,MACL,cAAY,KAAK;AAAA,MACjB,WAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA;AAAA,EACZ;AAER;AAgBO,SAAS,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,eAAe,KAAK,OAAO;AAAA,EAC3B,SAAS;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACA;AACJ,GAAoB;AAKhB,+BAAU,MAAM;AACZ,UAAM,UAAU,CAAC,UAAqB,MAAM,eAAe;AAC3D,aAAS,iBAAiB,YAAY,OAAO;AAC7C,aAAS,iBAAiB,QAAQ,OAAO;AACzC,WAAO,MAAM;AACT,eAAS,oBAAoB,YAAY,OAAO;AAChD,eAAS,oBAAoB,QAAQ,OAAO;AAAA,IAChD;AAAA,EACJ,GAAG,CAAC,CAAC;AAKL,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,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAY;AAAA,MACZ,WAAWC,IAAG,yCAAyC,SAAS;AAAA,MAEhE;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAWA;AAAA,cACP;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WACM,8CACA;AAAA,YACV;AAAA,YAGA,YAAY,CAAC,MAAM,EAAE,eAAe;AAAA,YACpC,QAAQ,CAAC,MAAM;AACX,gBAAE,eAAe;AACjB,kBAAI,SAAU;AACd,uBAAS,MAAM,KAAK,EAAE,aAAa,KAAK,CAAC;AAAA,YAC7C;AAAA,YAEA;AAAA,4DAAC,aAAU,WAAU,uBAAsB;AAAA,cAC3C,+CAAC,UAAK;AAAA;AAAA,gBACkB;AAAA,gBACpB,8CAAC,UAAK,WAAU,mBAAkB,oBAAM;AAAA,iBAC5C;AAAA,cACA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL;AAAA,kBACA,UAAU,WAAW;AAAA,kBACrB;AAAA,kBACA,WAAU;AAAA,kBACV,UAAU,CAAC,MAAM;AACb,6BAAS,MAAM,KAAK,EAAE,OAAO,SAAS,CAAC,CAAC,CAAC;AACzC,sBAAE,OAAO,QAAQ;AAAA,kBACrB;AAAA;AAAA,cACJ;AAAA;AAAA;AAAA,QACJ;AAAA,QAEC,MAAM,SAAS,KACZ,8CAAC,QAAG,WAAU,8DACT,gBAAM,IAAI,CAAC,MAAM,UACd;AAAA,UAAC;AAAA;AAAA,YAEG,WAAU;AAAA,YAEV;AAAA,4DAAC,eAAY,MAAY;AAAA,cACzB,8CAAC,UAAK,WAAU,2EACX,eAAK,MACV;AAAA,cACC,CAAC,YACE,8CAAC,SAAI,WAAU,8CACX;AAAA,gBAAC;AAAA;AAAA,kBACG,QAAO;AAAA,kBACP,OAAO,UAAU,KAAK,IAAI;AAAA,kBAC1B,SAAS,MACL;AAAA,oBACI,MAAM;AAAA,sBACF,CAAC,GAAG,MAAM,MAAM;AAAA,oBACpB;AAAA,kBACJ;AAAA,kBAGJ,wDAAC,SAAM,WAAU,uBAAsB;AAAA;AAAA,cAC3C,GACJ;AAAA;AAAA;AAAA,UAtBC,GAAG,KAAK,IAAI,IAAI,KAAK;AAAA,QAwB9B,CACH,GACL;AAAA;AAAA;AAAA,EAER;AAER;;;AG7MQ,IAAAC,uBAAA;AAND,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA,QAAQ;AACZ,MACI,8CAAC,WAAQ,SAAS,WAAW,MAAM,WAAW,OAAO,WAAU,cAC3D,wDAAC,UAAK,WAAU,8PAA6P,eAE7Q,GACJ;;;ACcI,IAAAC,uBAAA;AAlBR,SAAS,eAAe,MAAwB;AAC5C,SAAO,OAAO,SAAS,YAAY,eAAe,KAAK,IAAI;AAC/D;AAEO,SAAS,WAA8C;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;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,cAAY;AAAA,MACZ,QAAQ,aAAa,WAAW;AAAA,MAChC,KAAK,aAAa,wBAAwB;AAAA,MAC1C,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACC,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;;;AC7DA,IAAAC,gBAA2B;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,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,sBAAsB;AAAA,QACtB;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;;;ACaI,IAAAC,uBAAA;AA/BJ,IAAM,iBAAiD;AAAA,EACnD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,eAAe;AACnB;AAoBO,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,cAAY;AAAA,IACZ,WAAWC,IAAG,iBAAiB,eAAe,OAAO,GAAG,SAAS;AAAA,IAEhE;AAAA;AACL;;;ACMQ,IAAAC,uBAAA;AA7BZ,SAASC,gBAAe,MAAwB;AAC5C,SAAO,OAAO,SAAS,YAAY,eAAe,KAAK,IAAI;AAC/D;AAEO,SAAS,SAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAqB;AACjB,QAAM,YAA+B,MAAM;AAC3C,QAAM,aACF,YAAYA,gBAAgB,UAAiC,IAAI;AAErE,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAY;AAAA,MACZ,QAAQ,aAAa,WAAW;AAAA,MAChC,KAAK,aAAa,wBAAwB;AAAA,MAC1C,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,SAAQ;AAAA,UACR,WAAWA;AAAA,YACP;AAAA,YACA,YAAY,cAAc;AAAA,YAC1B;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,UAEC;AAAA,wBAAY,cACT;AAAA,cAAC;AAAA;AAAA,gBACG,eAAY;AAAA,gBACZ,WAAU;AAAA;AAAA,YACd;AAAA,YAEH;AAAA;AAAA;AAAA,MACL;AAAA;AAAA,EACJ;AAER;;;ACtEA,4BAA+C;AAC/C,wBAAsB;AAUd,IAAAC,uBAAA;AAFR,IAAM,aAAyB;AAAA,EAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,MACjB,8CAAC,OAAE,WAAU,8BAA8B,GAAG,OAAO;AAAA,EAEzD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,MACtB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,MACpB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,MACjB;AAAA,IAAC;AAAA;AAAA,MACG,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAER;AAGO,SAAS,SAAS,EAAE,UAAU,UAAU,GAAkB;AAC7D,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA,wDAAC,sBAAAC,SAAA,EAAc,eAAe,CAAC,kBAAAC,OAAS,GAAG,YACtC,UACL;AAAA;AAAA,EACJ;AAER;;;AC7DA,IAAAC,gBASO;AA2GK,IAAAC,uBAAA;AArGZ,IAAM,cAA0C;AAAA,EAC5C,GAAG;AAAA,EACH,GAAG;AACP;AAeA,SAAS,UAAa,KAAyB,OAAiB;AAC5D,MAAI,OAAO,QAAQ,WAAY,KAAI,KAAK;AAAA,WAC/B,IAAK,CAAC,IAAmC,UAAU;AAChE;AAMO,IAAM,iBAAa;AAAA,EACtB,CAAC,EAAE,OAAO,OAAO,KAAK,WAAW,UAAU,GAAG,KAAK,GAAG,gBAAgB;AAClE,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,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,CAAC;AAEL,WACI;AAAA,MAAC;AAAA;AAAA,QACI,GAAG;AAAA,QACJ,KAAK;AAAA,QACL,cAAY;AAAA,QACZ,WAAWC;AAAA,UACP;AAAA,UACA,YAAY,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,QAEC;AAAA;AAAA,IACL;AAAA,EAER;AACJ;AAEA,WAAW,cAAc;;;ACrEjB,IAAAC,uBAAA;AAvCR,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,QAAQ;AAAA,EACR;AAAA,EACA;AACJ,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,QACA,GAAG,SAAS,MAAM;AAE1B,QAAM,YAAY,QACd,8CAAC,UAAK,WAAU,8DACX,iBACL,IACA;AAEJ,MAAI,UAAU;AACV,WACI;AAAA,MAAC;AAAA;AAAA,QACG,cAAY;AAAA,QACZ,WAAU;AAAA,QAET;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cACG,MAAK;AAAA,cACL,UAAQ;AAAA,cACR,WAAWC;AAAA,gBACP;AAAA,gBACA;AAAA,cACJ;AAAA,cAEA;AAAA,8DAAC,UAAK,WAAU,6EACX,uBACL;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACG,UAAU;AAAA,oBACV,WAAU;AAAA;AAAA,gBACd;AAAA;AAAA;AAAA,UACJ;AAAA,UACA,8CAAC,UAAK,WAAU,4WAA2W,gCAE3X;AAAA;AAAA;AAAA,IACJ;AAAA,EAER;AAEA,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAY;AAAA,MACZ,WAAU;AAAA,MAET;AAAA;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,WAAU;AAAA,YACV,SAAS,CAAC,SACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,WAAWA;AAAA,kBACP;AAAA,kBACA,OACM,uDACA;AAAA,gBACV;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACG,WAAWA;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA,sBAEC;AAAA;AAAA,kBACL;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACG,UAAU;AAAA,sBACV,WAAWA;AAAA,wBACP;AAAA,wBACA,OACM,iCACA;AAAA,sBACV;AAAA;AAAA,kBACJ;AAAA;AAAA;AAAA,YACJ;AAAA,YAGJ,yDAAC,cAAW,OAAc,WAAU,kBAChC;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAWA;AAAA,oBACP;AAAA,oBACA,gBACM,4EACA;AAAA,kBACV;AAAA,kBAEA;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACG,WAAWA;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,WAAWA;AAAA,sBACP;AAAA,sBACA,YACM,0DACA;AAAA,oBACV;AAAA,oBAEA;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACG,WAAWA;AAAA,4BACP;AAAA,4BACA,aACI;AAAA,0BACR;AAAA,0BAEC,uBAAa;AAAA;AAAA,sBAClB;AAAA,sBACA,8CAAC,UAAK,WAAU,2BACX,cAAI,OACT;AAAA;AAAA;AAAA,kBApBK,IAAI;AAAA,gBAqBb;AAAA,cAER,CAAC;AAAA,eACL;AAAA;AAAA,QACJ;AAAA;AAAA;AAAA,EACJ;AAER;;;ACxJQ,IAAAC,uBAAA;AA7BR,IAAM,OACF;AACJ,IAAM,gBAAgB;AACtB,IAAM,kBACF;AACJ,IAAM,aACF;AAaG,SAAS,QAAgD;AAAA,EAC5D;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA,GAAG;AACP,GAAoB;AAChB,QAAM,YAA+B,MAAM;AAC3C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAY;AAAA,MACZ,gBAAc,SAAS,SAAS;AAAA,MAChC,WAAWC;AAAA,QACP;AAAA,QACA,SAAS,gBAAgB;AAAA,QACzB;AAAA,MACJ;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,sDAAC,UAAK,eAAY,QAAO,WAAW,YAAY;AAAA,QAC/C;AAAA;AAAA;AAAA,EACL;AAER;;;ACxDA,IAAAC,gBAA6C;;;ACiDrC,IAAAC,uBAAA;AAjCR,IAAMC,eAAc;AAAA,EAChB,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAMC,kBAAiB;AAAA,EACnB,SAAS;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UACI;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UACI;AAAA,EACR;AACJ;AAEO,IAAM,YAAgC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV;AAAA,EACA,WAAW;AAAA,EACX;AACJ,MAAM;AACF,QAAM,UAAUA,gBAAe,OAAO;AACtC,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,cAAY;AAAA,MACZ;AAAA,MACA,cAAY;AAAA,MACZ,gBAAc;AAAA,MACd;AAAA,MACA,WAAWC;AAAA,QACP;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,QAAQ,SAAS,QAAQ;AAAA,QAClC,YAAY;AAAA,QACZF,aAAY,IAAI;AAAA,QAChB;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAER;;;ADuEwB,IAAAG,uBAAA;AAlHxB,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,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;AAAA,EACA,UAAU,oBAAI,KAAK,CAAC;AAAA,EACpB;AACJ,MAAM;AACF,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAS,KAAK;AACtC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAe,MAAM,WAAW,KAAK,CAAC;AACtE,QAAM,EAAE,aAAa,OAAO,IAAI;AAEhC,+BAAU,MAAM;AACZ,gBAAY,WAAW,EAAE,aAAa,OAAO,CAAC,CAAC;AAAA,EACnD,GAAG,CAAC,aAAa,MAAM,CAAC;AAExB,QAAM,YAAQ,uBAAQ,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;AAExC,QAAM,iBAAiB,CAACE,iBAAmC;AACvD,aAAS,eAAeA,cAAa,WAAW,KAAK,CAAC,CAAC;AAAA,EAC3D;AAEA,QAAM,aAAa,CAAC,SAAe;AAC/B,aAAS,eAAe,MAAM,aAAa,IAAI,CAAC;AAChD,YAAQ,KAAK;AAAA,EACjB;AAEA,QAAM,YACF,MAAM,gBAAgB,UAChB,OAAO,SAAS,eAAe,CAAC,IAChC,SAAS,mBAAmB,SAAS;AAAA,IACjC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,MAAM;AAAA,EACV,CAAC;AAEX,SACI;AAAA,IAAC;AAAA;AAAA,MACG,cAAY;AAAA,MACZ,WAAU;AAAA,MAEV;AAAA,sDAAC,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,QACA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,cAAc;AAAA,YACd,WAAU;AAAA,YACV,SAAS,CAAC,WACN;AAAA,cAAC;AAAA;AAAA,gBACG,MAAK;AAAA,gBACL,cAAY,0BAA0B,kBAAkB,KAAK,CAAC;AAAA,gBAC9D,WAAWC;AAAA,kBACP;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UACI;AAAA,gBACR;AAAA,gBAEA;AAAA,gEAAC,UAAM,4BAAkB,KAAK,GAAE;AAAA,kBAChC,8CAAC,eAAY,UAAU,QAAQ;AAAA;AAAA;AAAA,YACnC;AAAA,YAGJ;AAAA,6DAAC,SAAI,WAAU,kEACX;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cACI,MAAM,gBAAgB,UAChB,kBACA;AAAA,oBAEV,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,gBAAgB;AAAA,oBAC3C,WAAWA;AAAA,sBACP;AAAA,sBACA,oBACI;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,gBACL;AAAA,gBACA,8CAAC,SAAI,WAAU,4DACV,qBACL;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACG,MAAK;AAAA,oBACL,cACI,MAAM,gBAAgB,UAChB,cACA;AAAA,oBAEV,UAAU;AAAA,oBACV,SAAS,MAAM,YAAY,YAAY;AAAA,oBACvC,WAAWA;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,UAAU,CAAC;AAAA,oBACX,SAAS,MAAM,WAAW,IAAI;AAAA,oBAC9B,WAAWA;AAAA,sBACP;AAAA,sBACA,WACM,0DACA;AAAA,sBACN,CAAC,cACG;AAAA,oBACR;AAAA,oBAEC;AAAA;AAAA,kBAbI;AAAA,gBAcT;AAAA,cAER,CAAC,GACL,IAEA,gFACI;AAAA,8DAAC,SAAI,WAAU,8IACV,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,eAAe,kBAAkB,eAAe,QAAQ,IAAI,CAAC,CAAC,KAC9D,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,UAAU,CAAC;AAAA,sBACX,SAAS,MAAM,WAAW,IAAI;AAAA,sBAC9B,WAAWA;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,oBAjBZ,KAAK,YAAY;AAAA,kBAkB1B;AAAA,gBAER,CAAC,GACL;AAAA,iBACJ;AAAA;AAAA;AAAA,QAER;AAAA;AAAA;AAAA,EACJ;AAER;;;AEpUA,IAAAC,yBAA0C;AAC1C,yBAAuB;AACvB,IAAAC,qBAAsB;AAUd,IAAAC,uBAAA;AAFR,IAAMC,cAAyB;AAAA,EAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,MACjB,8CAAC,OAAE,WAAU,oCAAoC,GAAG,OAAO;AAAA,EAE/D,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,MACjB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,MAC1B;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,MACpB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,MACnB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,MACrB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACR;AAAA,EAEJ,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,MAClB,8CAAC,QAAG,WAAU,wCAAwC,GAAG,OAAO;AAExE;AAEO,SAAS,MAAM,EAAE,UAAU,UAAU,GAAe;AACvD,SACI;AAAA,IAAC;AAAA;AAAA,MACG,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEA;AAAA,QAAC,uBAAAC;AAAA,QAAA;AAAA,UACG,eAAe,CAAC,mBAAAC,OAAS;AAAA,UACzB,eAAe,CAAC,mBAAAC,OAAU;AAAA,UAC1B,YAAYJ;AAAA,UAEX;AAAA;AAAA,MACL;AAAA;AAAA,EACJ;AAER;;;ACrEQ,IAAAK,uBAAA;AApBD,IAAM,UAA4B,CAAC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,WAAWC;AAAA,MACP;AAAA,MACA;AAAA,IACJ;AAAA,IAEA;AAAA,qDAAC,SAAI,WAAU,8FACX;AAAA;AAAA,UAAC;AAAA;AAAA,YACG,cAAY;AAAA,YACZ,WAAWA;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YAEC;AAAA;AAAA,QACL;AAAA,QACC,UACG,8CAAC,SAAI,WAAWA,IAAG,kBAAkB,eAAe,GAC/C,kBACL;AAAA,SAER;AAAA,MACC,SACG;AAAA,QAAC;AAAA;AAAA,UACG,SAAQ;AAAA,UACR;AAAA,UACA,WAAWA;AAAA,YACP;AAAA,YACA;AAAA,UACJ;AAAA,UAEC;AAAA,qBACG,8CAAC,SAAI,WAAU,8CACV,iBACL;AAAA,YAEH;AAAA;AAAA;AAAA,MACL,IAEA,gFACK;AAAA,iBACG;AAAA,UAAC;AAAA;AAAA,YACG,cAAY;AAAA,YACZ,WAAU;AAAA,YAET;AAAA;AAAA,QACL;AAAA,QAEH;AAAA,SACL;AAAA;AAAA;AAER;;;ACpFJ,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,WAAWC,IAAG,gBAAgB,SAAS;AAAA,QACtC,GAAG;AAAA;AAAA,IACR;AAAA,EAER;AACJ;;;AC1DI,IAAAC,uBAAA;AAVG,IAAM,WAA8B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MACI,+CAAC,SAAI,cAAY,OAAO,WAAWC,IAAG,iBAAiB,SAAS,GAC5D;AAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAWA;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACG,WAAWA;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,EACC,UACG;AAAA,IAAC;AAAA;AAAA,MACG,WAAWA;AAAA,QACP;AAAA,QACA;AAAA,MACJ;AAAA,MAEC;AAAA;AAAA,EACL;AAAA,GAER;;;ACQQ,IAAAC,uBAAA;AAxCZ,IAAM,eAA6C;AAAA,EAC/C,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AACb;AAUO,IAAM,SAA0B,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AACJ,MAAM;AACF,QAAM,kBAAgC,WAAW,UAAU,OAAO;AAClE,QAAM,oBACF,cAAc,UAAU,oBAAoB;AAEhD,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,cAAY;AAAA,MACZ,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,MAChC;AAAA,MACA,WAAWC;AAAA,QACP;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B;AAAA,MACJ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACG,WAAWA;AAAA,YACP;AAAA,YACA,UAAU,wBAAwB;AAAA,UACtC;AAAA;AAAA,MACJ;AAAA;AAAA,EACJ;AAER;;;AC7CI,IAAAC,uBAAA;AAhBJ,IAAM,eAAsC;AAAA,EACxC,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACX;AAEA,IAAM,mBAA8C;AAAA,EAChD,SAAS;AAAA,EACT,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,WAAWC;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,WAAWA;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,WAAWA,IAAG,+CAA+C,SAAS;AAAA;AAC1E;AAOG,IAAM,WAA8B,CAAC;AAAA,EACxC,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACP,MACI;AAAA,EAAC;AAAA;AAAA,IACI,GAAG;AAAA,IACJ,WAAWA;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,UAAU,iBACP,8CAAC,UAAK,eAAY,QACb,4BAAkB,QAAQ,MAAM,KACrC;AAAA,KAER;AAGJ,QAAM,UAAUA;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,8CAAC,QAAI,GAAG,MAAM,WAAW,SACrB;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAWA;AAAA,QACP;AAAA,QACA,UAAU,WAAW;AAAA,QACrB,UAAU,YAAY;AAAA,MAC1B;AAAA,MAEC;AAAA;AAAA,EACL,GACJ;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,WAAWA;AAAA,MACP;AAAA,MACA,aAAa,KAAK;AAAA,MAClB,WAAW;AAAA,MACX,SAAS;AAAA,MACT;AAAA,IACJ;AAAA;AACJ;;;AC/JJ,IAAAC,iBAA2B;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,WAAWC;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,EACR;AAER;AAEA,SAAS,cAAc;;;ACrBhB,IAAM,SAAS;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;","names":["start","yearText","import_clsx","import_tailwind_merge","twMerge","cn","cn","import_jsx_runtime","intentClasses","cn","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","intentClasses","cn","import_jsx_runtime","cn","import_react","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_react","import_jsx_runtime","ArkDialog","cn","import_portal","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","import_jsx_runtime","cn","import_react","import_jsx_runtime","intentClasses","cn","import_jsx_runtime","cn","import_jsx_runtime","import_jsx_runtime","cn","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","isExternalHref","cn","import_jsx_runtime","cn","ReactMarkdown","remarkGfm","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","cn","import_react","import_jsx_runtime","sizeClasses","variantClasses","cn","import_jsx_runtime","addUtcMonths","start","granularity","cn","import_react_markdown","import_remark_gfm","import_jsx_runtime","components","cn","Markdown","remarkGfm","rehypeSlug","import_jsx_runtime","cn","import_react","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","cn","import_jsx_runtime","cn","import_react","import_jsx_runtime","cn"]}