@pollinations/ui 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -10
- package/dist/{Button-DMJ2K6Gr.d.ts → Button-Bn8pGg6N.d.ts} +1 -1
- package/dist/{Button-CNzpisJf.d.cts → Button-CWUBCiIc.d.cts} +1 -1
- package/dist/{Chip-BS8ronOu.d.ts → Chip-C5impfYd.d.ts} +2 -2
- package/dist/{Chip-DyqWrq0r.d.cts → Chip-SM52sUbZ.d.cts} +2 -2
- package/dist/app.css +1 -1
- package/dist/auth/index.cjs +1 -9
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +1 -2
- package/dist/auth/index.d.ts +1 -2
- package/dist/auth/index.js +1 -9
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/sdk.d.cts +2 -2
- package/dist/auth/sdk.d.ts +2 -2
- package/dist/index.cjs +354 -177
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -9
- package/dist/index.d.ts +47 -9
- package/dist/index.js +346 -176
- package/dist/index.js.map +1 -1
- package/dist/modality/index.cjs +6 -38
- package/dist/modality/index.cjs.map +1 -1
- package/dist/modality/index.d.cts +7 -27
- package/dist/modality/index.d.ts +7 -27
- package/dist/modality/index.js +6 -37
- package/dist/modality/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/theme-VMRlhqST.d.cts +9 -0
- package/dist/theme-VMRlhqST.d.ts +9 -0
- package/dist/wallet/index.cjs +4 -1
- package/dist/wallet/index.cjs.map +1 -1
- package/dist/wallet/index.d.cts +2 -2
- package/dist/wallet/index.d.ts +2 -2
- package/dist/wallet/index.js +4 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/sdk.cjs +4 -1
- package/dist/wallet/sdk.cjs.map +1 -1
- package/dist/wallet/sdk.js +4 -1
- package/dist/wallet/sdk.js.map +1 -1
- package/package.json +3 -8
- package/dist/showcase/index.cjs +0 -2851
- package/dist/showcase/index.cjs.map +0 -1
- package/dist/showcase/index.d.cts +0 -19
- package/dist/showcase/index.d.ts +0 -19
- package/dist/showcase/index.js +0 -2839
- package/dist/showcase/index.js.map +0 -1
- package/dist/theme-DfHMjWB7.d.cts +0 -16
- package/dist/theme-DfHMjWB7.d.ts +0 -16
package/dist/index.cjs.map
CHANGED
|
@@ -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/Button.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/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 { Button, type ButtonProps } from \"./primitives/Button.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 { Tooltip } from \"./primitives/Tooltip.tsx\";\nexport { type ThemeName, themeColors, 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 { 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 { 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 = \"news\" | \"alpha\" | \"neutral\";\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};\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\" | \"both\";\n\nconst axisClasses: Record<ScrollAxis, string> = {\n y: \"polli:overflow-y-auto polli:overflow-x-hidden\",\n x: \"polli:overflow-x-auto polli:overflow-y-hidden\",\n both: \"polli:overflow-auto\",\n};\n\ntype ScrollAreaOwnProps = {\n /** Override the ambient cascade theme for this scroller's thumb. */\n theme?: ThemeName;\n /** Scroll direction. Default `y`. */\n axis?: ScrollAxis;\n /** Idle time before the thumb fades out, in ms. Default `2000`. */\n hideDelayMs?: number;\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 (\n { theme, axis = \"y\", hideDelayMs = 2000, className, children, ...rest },\n externalRef,\n ) => {\n const innerRef = useRef<HTMLDivElement | null>(null);\n\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n innerRef.current = node;\n assignRef(externalRef, node);\n },\n [externalRef],\n );\n\n useEffect(() => {\n 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, hideDelayMs);\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 }, [hideDelayMs]);\n\n return (\n <div\n {...rest}\n ref={setRef}\n data-theme={theme}\n className={cn(\n \"polli-scrollbar-subtle\",\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","/**\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\n/**\n * Representative brand color per theme — the pale `--polli-color-bg-pale`\n * token expressed as hex — for non-CSS consumers (build tools that tint the\n * logo, `theme-color` meta, manifests). Only verified values are listed;\n * extend as more themes are adopted by apps.\n */\nexport const themeColors: Partial<Record<ThemeName, string>> = {\n amber: \"#FEF3C7\",\n blue: \"#DBEAFE\",\n};\n"],"mappings":"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","names":["start","yearText","import_clsx","import_tailwind_merge","twMerge","cn","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"]}
|
|
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":"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","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"]}
|