@astherix/ui 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +933 -0
- package/dist/chunk-IZEGCTZW.js +588 -0
- package/dist/chunk-IZEGCTZW.js.map +1 -0
- package/dist/cli.js +345 -0
- package/dist/controlStyles-Bco2sOHE.d.ts +4 -0
- package/dist/editor.d.ts +43 -0
- package/dist/editor.js +373 -0
- package/dist/editor.js.map +1 -0
- package/dist/index.d.ts +2470 -0
- package/dist/index.js +10582 -0
- package/dist/index.js.map +1 -0
- package/dist/theme.d.ts +78 -0
- package/dist/theme.js +287 -0
- package/dist/theme.js.map +1 -0
- package/package.json +69 -0
- package/theme.css +909 -0
- package/ui.theme.schema.json +462 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/modal/Modal.tsx","../src/components/input/Textarea.tsx","../src/components/select/Select.tsx","../src/components/tabs/Tabs.tsx","../src/components/pill/Pill.tsx","../src/components/activity/Activity.tsx","../src/components/typography/Typography.tsx","../src/components/avatar/Avatar.tsx","../src/components/card/Card.tsx","../src/components/menu/DropdownMenu.tsx","../src/components/table/DataTable.tsx","../src/components/choice/Choice.tsx","../src/components/timeline/Timeline.tsx","../src/components/upload/FileUpload.tsx","../src/components/upload/useFileUploads.ts","../src/components/toast/Toast.tsx","../src/components/theme/ThemeProvider.tsx","../src/theme/color.ts","../src/theme/index.ts","../src/components/sidebar/Sidebar.tsx","../src/components/input/Autocomplete.tsx","../src/components/slider/Slider.tsx","../src/components/pagination/Pagination.tsx","../src/components/widgets/Charts.tsx","../src/components/widgets/chart-utils.tsx","../src/components/widgets/Shapes.tsx","../src/components/widgets/Kpi.tsx","../src/components/accordion/Accordion.tsx","../src/components/carousel/Carousel.tsx","../src/components/button/IconButton.tsx","../src/components/animated/SpotlightText.tsx","../src/components/animated/Skeletons.tsx","../src/components/signature/SignaturePad.tsx","../src/components/alert/Alert.tsx","../src/components/layout/Layout.tsx","../src/components/hero/Hero.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"../button/Button\";\n\n/*\n * Modal is built on the native <dialog> element opened with showModal(). That gives us,\n * for free: the top layer (no z-index fights), an inert background, Escape handling,\n * and focus moving into the dialog. On top of that we add open/close animation,\n * scroll locking, backdrop clicks, focus return, and a React-friendly API.\n */\n\n/* ---------- context ---------- */\n\ntype ModalContextValue = {\n open: boolean;\n setOpen: (open: boolean) => void;\n titleId: string;\n descriptionId: string;\n hasDescription: boolean;\n setHasDescription: (value: boolean) => void;\n};\n\nconst ModalContext = React.createContext<ModalContextValue | null>(null);\n\nfunction useModalContext(component: string) {\n const ctx = React.useContext(ModalContext);\n if (!ctx) throw new Error(`<${component}> must be used inside <Modal>.`);\n return ctx;\n}\n\n/* ---------- Modal (root) ---------- */\n\nexport interface ModalProps {\n /** Controlled open state. Pair with `onOpenChange`. */\n open?: boolean;\n /** Initial open state when uncontrolled. */\n defaultOpen?: boolean;\n /** Called whenever the modal asks to open or close (trigger, close button, Escape, backdrop). */\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nexport function Modal({ open: openProp, defaultOpen = false, onOpenChange, children }: ModalProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const controlled = openProp !== undefined;\n const open = controlled ? openProp : uncontrolledOpen;\n const onOpenChangeRef = React.useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n\n const setOpen = React.useCallback(\n (next: boolean) => {\n if (!controlled) setUncontrolledOpen(next);\n onOpenChangeRef.current?.(next);\n },\n [controlled]\n );\n\n const id = React.useId();\n const [hasDescription, setHasDescription] = React.useState(false);\n const value = React.useMemo(\n () => ({\n open,\n setOpen,\n titleId: `${id}-title`,\n descriptionId: `${id}-description`,\n hasDescription,\n setHasDescription,\n }),\n [open, setOpen, id, hasDescription]\n );\n\n return <ModalContext.Provider value={value}>{children}</ModalContext.Provider>;\n}\n\n/* ---------- useModal: open and close from code ---------- */\n\n/**\n * Open and close a modal from anywhere in your component.\n *\n * const confirm = useModal();\n * <Modal {...confirm.modalProps}>…</Modal>\n * confirm.open();\n */\nexport function useModal(initialOpen = false) {\n const [isOpen, setIsOpen] = React.useState(initialOpen);\n const open = React.useCallback(() => setIsOpen(true), []);\n const close = React.useCallback(() => setIsOpen(false), []);\n const toggle = React.useCallback(() => setIsOpen((v) => !v), []);\n return {\n isOpen,\n open,\n close,\n toggle,\n /** Spread onto <Modal>. */\n modalProps: { open: isOpen, onOpenChange: setIsOpen },\n };\n}\n\n/* ---------- Trigger and Close ---------- */\n\ntype ButtonLikeProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n /** Merge behavior into your own element, e.g. <ModalTrigger asChild><Button>…</Button></ModalTrigger>. */\n asChild?: boolean;\n};\n\nexport const ModalTrigger = React.forwardRef<HTMLButtonElement, ButtonLikeProps>(\n ({ asChild, onClick, ...props }, ref) => {\n const { open, setOpen } = useModalContext(\"ModalTrigger\");\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n ref={ref}\n type={asChild ? undefined : \"button\"}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={(event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) setOpen(true);\n }}\n {...props}\n />\n );\n }\n);\nModalTrigger.displayName = \"ModalTrigger\";\n\nexport const ModalClose = React.forwardRef<HTMLButtonElement, ButtonLikeProps>(\n ({ asChild, onClick, ...props }, ref) => {\n const { setOpen } = useModalContext(\"ModalClose\");\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n ref={ref}\n type={asChild ? undefined : \"button\"}\n onClick={(event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) setOpen(false);\n }}\n {...props}\n />\n );\n }\n);\nModalClose.displayName = \"ModalClose\";\n\n/* ---------- scroll lock (shared by stacked modals) ---------- */\n\nlet lockCount = 0;\nlet saved: { overflow: string; paddingRight: string } | null = null;\n\nfunction lockScroll() {\n if (lockCount++ > 0) return;\n const root = document.documentElement;\n const scrollbar = window.innerWidth - root.clientWidth;\n saved = { overflow: root.style.overflow, paddingRight: document.body.style.paddingRight };\n root.style.overflow = \"hidden\";\n // Keep the page from shifting sideways when the scrollbar disappears.\n if (scrollbar > 0) document.body.style.paddingRight = `${scrollbar}px`;\n}\n\nfunction unlockScroll() {\n if (lockCount === 0 || --lockCount > 0 || !saved) return;\n document.documentElement.style.overflow = saved.overflow;\n document.body.style.paddingRight = saved.paddingRight;\n saved = null;\n}\n\n/* ---------- ModalContent ---------- */\n\n/*\n * Backdrop styles. Each reads a theme token, with a literal fallback for browsers\n * where ::backdrop doesn't inherit custom properties yet.\n */\nconst backdropClasses = {\n default: \"backdrop:bg-[var(--ui-backdrop,rgb(18_20_24/0.5))]\",\n dark: \"backdrop:bg-[var(--ui-backdrop-dark,rgb(8_10_13/0.82))]\",\n blur: \"backdrop:bg-[var(--ui-backdrop-blur,rgb(18_20_24/0.22))] backdrop:backdrop-blur-[var(--ui-backdrop-blur-radius,8px)]\",\n solid: \"backdrop:bg-[var(--ui-backdrop-solid,#f6f7f9)]\",\n} as const;\n\nexport type ModalBackdrop = keyof typeof backdropClasses;\n\n/** Must match the closing animation length below. */\nconst CLOSE_MS = 140;\n\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nexport const modalPanelVariants = cva(\n [\n \"relative my-auto w-full rounded-modal border border-border bg-surface text-fg outline-none\",\n \"shadow-[var(--ui-shadow-modal)]\",\n \"data-[state=open]:animate-[ui-modal-in_200ms_cubic-bezier(0.2,0.9,0.3,1)]\",\n \"data-[state=closing]:animate-[ui-modal-out_140ms_ease-in_forwards]\",\n \"motion-reduce:data-[state=open]:animate-[ui-fade-in_140ms_ease-out]\",\n \"motion-reduce:data-[state=closing]:animate-[ui-fade-out_140ms_ease-in_forwards]\",\n ],\n {\n variants: {\n size: {\n sm: \"max-w-sm\",\n md: \"max-w-lg\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n // Covers the whole screen, edge to edge.\n full: \"my-0 min-h-full max-w-none rounded-none border-0\",\n },\n },\n defaultVariants: { size: \"md\" },\n }\n);\n\nexport interface ModalContentProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof modalPanelVariants> {\n /**\n * Whether Escape, a backdrop click and the × button close the modal. Set false\n * while something is saving, or when the person must choose an action.\n */\n dismissible?: boolean;\n /**\n * How the page behind the modal is covered.\n * - \"default\": dimmed\n * - \"dark\": heavily darkened\n * - \"blur\": lightly dimmed and blurred\n * - \"solid\": fully covered with the page background color, so nothing behind shows\n */\n backdrop?: ModalBackdrop;\n /** Show the × button in the top-right corner. */\n showCloseButton?: boolean;\n /** Accessible label for the × button. */\n closeLabel?: string;\n}\n\nconst XIcon = () => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.7} strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M5.5 5.5l9 9M14.5 5.5l-9 9\" />\n </svg>\n);\n\nexport const ModalContent = React.forwardRef<HTMLDivElement, ModalContentProps>(\n (\n {\n className,\n size,\n backdrop = \"default\",\n dismissible = true,\n showCloseButton = true,\n closeLabel = \"Close\",\n children,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const { open, setOpen, titleId, descriptionId, hasDescription } = useModalContext(\"ModalContent\");\n const dialogRef = React.useRef<HTMLDialogElement>(null);\n const returnFocusRef = React.useRef<HTMLElement | null>(null);\n const pressedBackdrop = React.useRef(false);\n const [phase, setPhase] = React.useState<\"open\" | \"closed\">(\"closed\");\n\n const panelRef = React.useRef<HTMLDivElement | null>(null);\n const setPanelRef = (node: HTMLDivElement | null) => {\n panelRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n\n // Opening: showModal() first, then render the content into the open dialog, so\n // autoFocus works. Closing: play the exit animation, then close().\n useIsomorphicLayoutEffect(() => {\n const dialog = dialogRef.current;\n if (!dialog) return;\n if (open) {\n if (!dialog.open) {\n returnFocusRef.current = document.activeElement as HTMLElement | null;\n dialog.showModal();\n lockScroll();\n }\n setPhase(\"open\");\n return;\n }\n if (!dialog.open) {\n setPhase(\"closed\");\n return;\n }\n const timer = window.setTimeout(() => {\n dialog.close();\n unlockScroll();\n setPhase(\"closed\");\n const target = returnFocusRef.current;\n if (target && target.isConnected) target.focus();\n }, CLOSE_MS);\n return () => window.clearTimeout(timer);\n }, [open]);\n\n const state = open ? (phase === \"open\" ? \"open\" : \"opening\") : phase === \"open\" ? \"closing\" : \"closed\";\n\n // Once the content is in: if nothing inside took focus (no autoFocus), focus the\n // first focusable element, or the panel itself.\n React.useEffect(() => {\n if (state !== \"open\") return;\n const panel = panelRef.current;\n if (!panel || panel.contains(document.activeElement)) return;\n const first = panel.querySelector<HTMLElement>(FOCUSABLE);\n (first ?? panel).focus();\n }, [state]);\n\n // If the component unmounts while open, release the page.\n React.useEffect(\n () => () => {\n if (dialogRef.current?.open) {\n dialogRef.current.close();\n unlockScroll();\n }\n },\n []\n );\n\n return (\n <dialog\n ref={dialogRef}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabel ? undefined : titleId}\n aria-describedby={hasDescription ? descriptionId : undefined}\n data-state={state}\n className={cn(\n // The dialog fills the viewport so clicks outside the panel land on it (= backdrop).\n \"fixed inset-0 m-0 h-dvh max-h-none w-full max-w-none overflow-y-auto overscroll-contain\",\n \"bg-transparent p-4 text-fg sm:p-6 open:flex open:flex-col open:items-center\",\n size === \"full\" && \"p-0 sm:p-0\",\n backdropClasses[backdrop],\n \"data-[state=open]:backdrop:animate-[ui-fade-in_200ms_ease-out]\",\n \"data-[state=closing]:backdrop:animate-[ui-fade-out_140ms_ease-in_forwards]\"\n )}\n onCancel={(event) => {\n // Escape. We close it ourselves so the exit animation can play.\n event.preventDefault();\n if (dismissible) setOpen(false);\n }}\n onClose={() => {\n // Closed by the browser directly (e.g. a <form method=\"dialog\">).\n if (open) {\n unlockScroll();\n setPhase(\"closed\");\n setOpen(false);\n }\n }}\n onPointerDown={(event) => {\n pressedBackdrop.current = event.target === event.currentTarget;\n }}\n onClick={(event) => {\n // Only a press that starts and ends on the backdrop closes the modal,\n // so selecting text and releasing outside the panel doesn't.\n if (dismissible && pressedBackdrop.current && event.target === event.currentTarget) setOpen(false);\n pressedBackdrop.current = false;\n }}\n >\n {(state === \"open\" || state === \"closing\") && (\n <div\n ref={setPanelRef}\n tabIndex={-1}\n data-state={state}\n className={cn(modalPanelVariants({ size }), className)}\n {...props}\n >\n {children}\n {/* After the content in the DOM, so focus starts on the content, not on ×. */}\n {showCloseButton && dismissible && (\n <div className=\"absolute right-3 top-3\">\n <Button variant=\"ghost\" size=\"sm\" iconOnly aria-label={closeLabel} onClick={() => setOpen(false)}>\n <XIcon />\n </Button>\n </div>\n )}\n </div>\n )}\n </dialog>\n );\n }\n);\nModalContent.displayName = \"ModalContent\";\n\n/* ---------- layout pieces ---------- */\n\nexport const ModalHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"grid gap-1.5 px-6 pb-2 pr-14 pt-6\", className)} {...props} />\n )\n);\nModalHeader.displayName = \"ModalHeader\";\n\nexport const ModalTitle = React.forwardRef<HTMLHeadingElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => {\n const { titleId } = useModalContext(\"ModalTitle\");\n return (\n <h2\n ref={ref}\n id={titleId}\n className={cn(\"text-lg font-semibold leading-snug tracking-[-0.01em]\", className)}\n {...props}\n />\n );\n }\n);\nModalTitle.displayName = \"ModalTitle\";\n\nexport const ModalDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => {\n const { descriptionId, setHasDescription } = useModalContext(\"ModalDescription\");\n React.useEffect(() => {\n setHasDescription(true);\n return () => setHasDescription(false);\n }, [setHasDescription]);\n return (\n <p ref={ref} id={descriptionId} className={cn(\"text-sm leading-relaxed text-fg-muted\", className)} {...props} />\n );\n }\n);\nModalDescription.displayName = \"ModalDescription\";\n\nexport const ModalBody = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"px-6 py-3 text-[0.9375rem] leading-relaxed\", className)} {...props} />\n )\n);\nModalBody.displayName = \"ModalBody\";\n\nexport const ModalFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n // Phones: full-width buttons, main action on top. Wider: right-aligned row.\n \"flex flex-col-reverse gap-2 px-6 pb-6 pt-4 max-sm:*:w-full sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n);\nModalFooter.displayName = \"ModalFooter\";\n","import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\nimport { useFieldControlProps } from \"./Field\";\nimport { controlFrame, type ControlRounded, type ControlSize } from \"./controlStyles\";\n\nconst textareaSize = cva(\"\", {\n variants: {\n size: {\n sm: \"px-2.5 py-1.5 text-sm\",\n md: \"px-3 py-2 text-[0.9375rem]\",\n lg: \"px-3.5 py-2.5 text-base\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n size?: ControlSize;\n /** Corner radius. \"full\" isn't offered — it doesn't suit multi-line text. */\n rounded?: Exclude<ControlRounded, \"full\">;\n /** Marks the textarea as invalid. Inside a Field with an error this is set for you. */\n invalid?: boolean;\n /** Grow and shrink with the text, between minRows and maxRows. */\n autoResize?: boolean;\n /** Smallest height in rows (with autoResize, or as the default `rows`). Default 3. */\n minRows?: number;\n /** Largest height in rows with autoResize; it scrolls after that. */\n maxRows?: number;\n /** Show a character count. With maxLength it shows \"12 / 280\". */\n showCount?: boolean;\n /** Whether people can drag to resize. Ignored with autoResize. Default \"vertical\". */\n resize?: \"none\" | \"vertical\";\n /** Class for the outer frame. `className` goes on the <textarea> itself. */\n frameClassName?: string;\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size = \"md\",\n rounded = \"md\",\n invalid: invalidProp,\n autoResize = false,\n minRows = 3,\n maxRows,\n showCount = false,\n resize = \"vertical\",\n frameClassName,\n className,\n rows,\n id: idProp,\n required: requiredProp,\n disabled: disabledProp,\n readOnly,\n value,\n defaultValue,\n onChange,\n maxLength,\n \"aria-describedby\": describedByProp,\n ...props\n },\n ref\n ) => {\n const countId = React.useId();\n const { invalid, ...control } = useFieldControlProps({\n id: idProp,\n invalid: invalidProp,\n required: requiredProp,\n disabled: disabledProp,\n \"aria-describedby\": [describedByProp, showCount ? countId : undefined].filter(Boolean).join(\" \") || undefined,\n });\n\n const areaRef = React.useRef<HTMLTextAreaElement | null>(null);\n const setRefs = (node: HTMLTextAreaElement | null) => {\n areaRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n\n const [length, setLength] = React.useState(() => String(value ?? defaultValue ?? \"\").length);\n React.useEffect(() => {\n if (value !== undefined) setLength(String(value).length);\n }, [value]);\n\n // Auto-resize: measure the content and set the height, clamped to min/max rows.\n const fit = React.useCallback(() => {\n const el = areaRef.current;\n if (!el || !autoResize) return;\n const style = getComputedStyle(el);\n const line = parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.5;\n const chrome = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom);\n el.style.height = \"auto\";\n const min = minRows * line + chrome;\n const max = maxRows ? maxRows * line + chrome : Infinity;\n const next = Math.min(max, Math.max(min, el.scrollHeight));\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [autoResize, minRows, maxRows]);\n\n React.useLayoutEffect(() => {\n fit();\n }, [fit, value]);\n\n React.useEffect(() => {\n if (!autoResize) return;\n const el = areaRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n // Refit when the width changes (text rewraps).\n let width = el.clientWidth;\n const ro = new ResizeObserver(() => {\n if (el.clientWidth !== width) {\n width = el.clientWidth;\n fit();\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [autoResize, fit]);\n\n const over = maxLength !== undefined && length > maxLength;\n const near = maxLength !== undefined && length >= maxLength * 0.9;\n\n return (\n <div className=\"grid w-full gap-1\">\n <div\n data-invalid={invalid ? \"\" : undefined}\n data-disabled={control.disabled ? \"\" : undefined}\n data-readonly={readOnly ? \"\" : undefined}\n className={cn(controlFrame({ rounded }), frameClassName)}\n >\n <textarea\n ref={setRefs}\n rows={rows ?? minRows}\n readOnly={readOnly}\n value={value}\n defaultValue={defaultValue}\n maxLength={maxLength}\n onChange={(event) => {\n if (value === undefined) setLength(event.target.value.length);\n fit();\n onChange?.(event);\n }}\n className={cn(\n textareaSize({ size }),\n \"block min-h-0 w-full bg-transparent leading-relaxed text-fg outline-none placeholder:text-fg-muted/70\",\n \"disabled:cursor-not-allowed rounded-[inherit]\",\n autoResize || resize === \"none\" ? \"resize-none\" : \"resize-y\",\n className\n )}\n {...control}\n {...props}\n />\n </div>\n {showCount && (\n <p\n id={countId}\n className={cn(\n \"justify-self-end text-xs tabular-nums text-fg-muted\",\n near && \"text-fg\",\n over && \"text-danger\"\n )}\n >\n {maxLength !== undefined ? `${length} / ${maxLength}` : `${length} characters`}\n </p>\n )}\n </div>\n );\n }\n);\nTextarea.displayName = \"Textarea\";\n","import * as React from \"react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\nimport { useField, useFieldControlProps } from \"../input/Field\";\nimport { controlFrame, type ControlRounded, type ControlSize } from \"../input/controlStyles\";\n\n/*\n * Select — a searchable dropdown in the spirit of Select2: search, single or multiple\n * selection with removable chips, option groups, descriptions and icons, remote\n * (async) options, creating new options, and full keyboard support.\n *\n * Accessibility: the trigger is a combobox; the search box inside the dropdown drives\n * a listbox with aria-activedescendant, so screen readers follow the highlighted option.\n *\n * The dropdown is positioned with `position: fixed` but stays inside the component's\n * DOM (no portal), so it also works inside Modal, which lives in the browser's top layer.\n */\n\nexport interface SelectOption {\n value: string;\n label: string;\n /** Smaller second line. Also searched. */\n description?: string;\n /** Icon before the label: an element or an icon-font class string. */\n icon?: IconInput;\n /** Options with the same group are listed together under that heading. */\n group?: string;\n disabled?: boolean;\n /** Extra words to match when searching (e.g. country codes). */\n keywords?: string[];\n}\n\ntype BaseProps = {\n /** The options to choose from. Leave empty when using loadOptions. */\n options?: SelectOption[];\n placeholder?: string;\n /** Show a search box in the dropdown. Default true. */\n searchable?: boolean;\n /** Placeholder for the search box. */\n searchPlaceholder?: string;\n /** Show a × to clear the selection. */\n clearable?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n required?: boolean;\n size?: ControlSize;\n rounded?: ControlRounded;\n /** Adds hidden inputs with this name, so the value is sent with a normal form submit. */\n name?: string;\n id?: string;\n /** Fetch options from a server as the person types (debounced). */\n loadOptions?: (query: string) => Promise<SelectOption[]>;\n /** Wait for this many characters before searching (with loadOptions). Default 0. */\n minSearchLength?: number;\n /** Debounce for loadOptions, in ms. Default 250. */\n searchDelay?: number;\n /** Let people add an option that isn't in the list by typing it. */\n creatable?: boolean;\n /**\n * Called when a new option is created. Return the option to add (or a Promise of it),\n * e.g. after saving it on the server. By default the typed text becomes the option.\n */\n onCreateOption?: (input: string) => SelectOption | Promise<SelectOption>;\n /** Custom rendering for an option row. */\n renderOption?: (option: SelectOption, state: { selected: boolean; active: boolean }) => React.ReactNode;\n /** Text when nothing matches. */\n noOptionsMessage?: (query: string) => React.ReactNode;\n /** Close the dropdown after picking. Default: true for single, false for multiple. */\n closeOnSelect?: boolean;\n /** Called when the dropdown opens or closes. */\n onOpenChange?: (open: boolean) => void;\n className?: string;\n \"aria-label\"?: string;\n \"aria-describedby\"?: string;\n};\n\ntype SingleProps = BaseProps & {\n multiple?: false;\n value?: string | null;\n defaultValue?: string | null;\n onChange?: (value: string | null, option: SelectOption | null) => void;\n maxSelected?: never;\n};\n\ntype MultipleProps = BaseProps & {\n multiple: true;\n value?: string[];\n defaultValue?: string[];\n onChange?: (value: string[], options: SelectOption[]) => void;\n /** Most options that can be chosen. */\n maxSelected?: number;\n};\n\nexport type SelectProps = SingleProps | MultipleProps;\n\n/* ---------- helpers ---------- */\n\nconst normalize = (text: string) =>\n text\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase();\n\nfunction matches(option: SelectOption, query: string) {\n if (!query) return true;\n const q = normalize(query.trim());\n return [option.label, option.description ?? \"\", ...(option.keywords ?? [])].some((t) => normalize(t).includes(q));\n}\n\n/** Bold the part of the label that matches the search. */\nfunction Highlight({ text, query }: { text: string; query: string }) {\n const q = normalize(query.trim());\n if (!q) return <>{text}</>;\n const i = normalize(text).indexOf(q);\n if (i < 0) return <>{text}</>;\n return (\n <>\n {text.slice(0, i)}\n <mark className=\"rounded-[2px] bg-primary/15 font-semibold text-inherit\">{text.slice(i, i + q.length)}</mark>\n {text.slice(i + q.length)}\n </>\n );\n}\n\nconst Spinner = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" className=\"size-4 animate-spin motion-reduce:animate-none\">\n <circle cx=\"8\" cy=\"8\" r=\"6.25\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"1.5\" />\n <path d=\"M14.25 8A6.25 6.25 0 0 0 8 1.75\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n);\nconst Chevron = ({ open }: { open: boolean }) => (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.7}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={cn(\"size-[1.1em] shrink-0 text-fg-muted transition-transform duration-150\", open && \"rotate-180\")}\n >\n <path d=\"M5.5 8l4.5 4.5L14.5 8\" />\n </svg>\n);\nconst Check = () => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-4 shrink-0 text-primary\">\n <path d=\"M4.5 10.5l3.5 3.5 7.5-8\" />\n </svg>\n);\nconst X = ({ className }: { className?: string }) => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" aria-hidden=\"true\" className={className}>\n <path d=\"M6 6l8 8M14 6l-8 8\" />\n </svg>\n);\n\nconst triggerSize = cva(\"\", {\n variants: {\n size: { sm: \"min-h-8 text-sm\", md: \"min-h-10 text-[0.9375rem]\", lg: \"min-h-12 text-base\" },\n multiple: { true: \"py-1 pl-1.5 pr-2.5\", false: \"\" },\n },\n compoundVariants: [\n { multiple: false, size: \"sm\", class: \"px-2.5\" },\n { multiple: false, size: \"md\", class: \"px-3\" },\n { multiple: false, size: \"lg\", class: \"px-3.5\" },\n ],\n});\n\ntype Item =\n | { kind: \"group\"; label: string; key: string }\n | { kind: \"option\"; option: SelectOption; index: number; key: string }\n | { kind: \"create\"; input: string; index: number; key: string };\n\n/* ---------- component ---------- */\n\nexport const Select = React.forwardRef<HTMLDivElement, SelectProps>(function Select(props, ref) {\n const {\n options: optionsProp = [],\n placeholder = \"Choose…\",\n searchable = true,\n searchPlaceholder = \"Search…\",\n clearable = false,\n size = \"md\",\n rounded = \"md\",\n name,\n loadOptions,\n minSearchLength = 0,\n searchDelay = 250,\n creatable = false,\n onCreateOption,\n renderOption,\n noOptionsMessage = (q) => (q ? `No matches for “${q}”` : \"No options\"),\n onOpenChange,\n className,\n \"aria-label\": ariaLabel,\n } = props;\n const multiple = props.multiple === true;\n const maxSelected = multiple ? (props as MultipleProps).maxSelected : undefined;\n const closeOnSelect = props.closeOnSelect ?? !multiple;\n\n const field = useField();\n const { invalid, ...control } = useFieldControlProps({\n id: props.id,\n invalid: props.invalid,\n required: props.required,\n disabled: props.disabled,\n \"aria-describedby\": props[\"aria-describedby\"],\n });\n const disabled = !!control.disabled;\n\n const uid = React.useId();\n const listId = `${uid}-list`;\n const optionId = (i: number) => `${uid}-opt-${i}`;\n\n /* ----- value (controlled or not), always handled as an array internally ----- */\n const toArray = (v: string | string[] | null | undefined) => (v == null ? [] : Array.isArray(v) ? v : [v]);\n const controlled = props.value !== undefined;\n const [uncontrolled, setUncontrolled] = React.useState<string[]>(() => toArray(props.defaultValue));\n const selected = controlled ? toArray(props.value as string | string[] | null) : uncontrolled;\n\n /* ----- options we know about: given, created, and ones loaded from the server ----- */\n const [created, setCreated] = React.useState<SelectOption[]>([]);\n const known = React.useRef(new Map<string, SelectOption>());\n for (const o of optionsProp) known.current.set(o.value, o);\n for (const o of created) known.current.set(o.value, o);\n const optionFor = (value: string): SelectOption => known.current.get(value) ?? { value, label: value };\n\n const commit = (next: string[]) => {\n if (!controlled) setUncontrolled(next);\n const opts = next.map(optionFor);\n if (multiple) (props as MultipleProps).onChange?.(next, opts);\n else (props as SingleProps).onChange?.(next[0] ?? null, opts[0] ?? null);\n };\n\n /* ----- open state, search and remote loading ----- */\n const [open, setOpenState] = React.useState(false);\n const [query, setQuery] = React.useState(\"\");\n const [remote, setRemote] = React.useState<SelectOption[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [loadError, setLoadError] = React.useState(false);\n const [creating, setCreating] = React.useState(false);\n const requestId = React.useRef(0);\n\n const setOpen = (next: boolean) => {\n setOpenState(next);\n onOpenChange?.(next);\n if (!next) setQuery(\"\");\n };\n\n const tooShort = !!loadOptions && query.trim().length < minSearchLength;\n\n React.useEffect(() => {\n if (!open || !loadOptions) return;\n if (tooShort) {\n setRemote([]);\n setLoading(false);\n return;\n }\n const id = ++requestId.current;\n setLoading(true);\n setLoadError(false);\n const timer = window.setTimeout(\n () => {\n loadOptions(query.trim()).then(\n (result) => {\n if (id !== requestId.current) return; // a newer search replaced this one\n for (const o of result) known.current.set(o.value, o);\n setRemote(result);\n setLoading(false);\n },\n () => {\n if (id !== requestId.current) return;\n setLoadError(true);\n setLoading(false);\n }\n );\n },\n query ? searchDelay : 0\n );\n return () => window.clearTimeout(timer);\n }, [open, query, loadOptions, tooShort, searchDelay]);\n\n /* ----- the visible list ----- */\n const source = loadOptions ? remote : [...optionsProp, ...created];\n const filtered = loadOptions ? source : source.filter((o) => matches(o, query));\n const limitReached = multiple && maxSelected !== undefined && selected.length >= maxSelected;\n const isDisabled = (o: SelectOption) => !!o.disabled || (limitReached && !selected.includes(o.value));\n\n const trimmed = query.trim();\n const canCreate =\n creatable &&\n trimmed !== \"\" &&\n !limitReached &&\n ![...source, ...selected.map(optionFor)].some((o) => normalize(o.label) === normalize(trimmed));\n\n const { items, navigable } = React.useMemo(() => {\n const out: Item[] = [];\n const nav: Array<{ option?: SelectOption; create?: string }> = [];\n const order: string[] = [];\n const byGroup = new Map<string, SelectOption[]>();\n for (const o of filtered) {\n const g = o.group ?? \"\";\n if (!byGroup.has(g)) {\n byGroup.set(g, []);\n order.push(g);\n }\n byGroup.get(g)!.push(o);\n }\n for (const g of order) {\n if (g) out.push({ kind: \"group\", label: g, key: `g:${g}` });\n for (const o of byGroup.get(g)!) {\n out.push({ kind: \"option\", option: o, index: nav.length, key: `o:${o.value}` });\n nav.push({ option: o });\n }\n }\n if (canCreate) {\n out.push({ kind: \"create\", input: trimmed, index: nav.length, key: \"create\" });\n nav.push({ create: trimmed });\n }\n return { items: out, navigable: nav };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filtered.map((o) => o.value).join(\"\\u0000\"), canCreate, trimmed]);\n\n const [active, setActive] = React.useState(-1);\n const enabledAt = (i: number) => {\n const n = navigable[i];\n return !!n && (n.create !== undefined || (n.option && !isDisabled(n.option)));\n };\n const move = (from: number, step: 1 | -1) => {\n if (!navigable.length) return -1;\n let i = from;\n for (let tries = 0; tries < navigable.length; tries++) {\n i = (i + step + navigable.length) % navigable.length;\n if (enabledAt(i)) return i;\n }\n return -1;\n };\n\n // When the list changes, highlight the selected option or the first available one.\n React.useEffect(() => {\n if (!open) return;\n const sel = navigable.findIndex((n) => n.option && selected.includes(n.option.value) && enabledAt(navigable.indexOf(n)));\n setActive(query === \"\" && sel >= 0 ? sel : move(-1, 1));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, navigable]);\n\n /* ----- positioning ----- */\n const wrapperRef = React.useRef<HTMLDivElement | null>(null);\n const triggerRef = React.useRef<HTMLDivElement | null>(null);\n const searchRef = React.useRef<HTMLInputElement | null>(null);\n const listRef = React.useRef<HTMLDivElement | null>(null);\n const [pos, setPos] = React.useState<React.CSSProperties>({});\n\n const place = React.useCallback(() => {\n const t = triggerRef.current;\n if (!t) return;\n const r = t.getBoundingClientRect();\n const below = window.innerHeight - r.bottom - 8;\n const above = r.top - 8;\n const up = below < 260 && above > below;\n const room = Math.max(160, (up ? above : below) - 4);\n setPos({\n position: \"fixed\",\n left: r.left,\n width: r.width,\n ...(up ? { bottom: window.innerHeight - r.top + 4 } : { top: r.bottom + 4 }),\n maxHeight: Math.min(360, room),\n });\n }, []);\n\n React.useLayoutEffect(() => {\n if (!open) return;\n place();\n window.addEventListener(\"resize\", place);\n window.addEventListener(\"scroll\", place, true);\n return () => {\n window.removeEventListener(\"resize\", place);\n window.removeEventListener(\"scroll\", place, true);\n };\n }, [open, place]);\n\n // Focus the search box (or the list) when opening.\n React.useEffect(() => {\n if (!open) return;\n (searchable ? searchRef.current : listRef.current)?.focus({ preventScroll: true });\n }, [open, searchable]);\n\n // Close when clicking outside.\n React.useEffect(() => {\n if (!open) return;\n const onDown = (e: PointerEvent) => {\n if (!wrapperRef.current?.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onDown);\n return () => document.removeEventListener(\"pointerdown\", onDown);\n });\n\n // Keep the highlighted option in view.\n React.useEffect(() => {\n if (!open || active < 0) return;\n document.getElementById(optionId(active))?.scrollIntoView?.({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active, open]);\n\n /* ----- actions ----- */\n const focusTrigger = () => triggerRef.current?.focus();\n\n const choose = async (i: number) => {\n const n = navigable[i];\n if (!n || !enabledAt(i)) return;\n let value: string;\n if (n.create !== undefined) {\n setCreating(true);\n try {\n const made = (await onCreateOption?.(n.create)) ?? { value: n.create, label: n.create };\n known.current.set(made.value, made);\n if (!loadOptions) setCreated((c) => [...c, made]);\n value = made.value;\n } finally {\n setCreating(false);\n }\n } else {\n value = n.option!.value;\n }\n if (multiple) {\n commit(selected.includes(value) ? selected.filter((v) => v !== value) : [...selected, value]);\n setQuery(\"\");\n } else {\n commit([value]);\n }\n if (closeOnSelect) {\n setOpen(false);\n focusTrigger();\n }\n };\n\n const removeValue = (value: string) => commit(selected.filter((v) => v !== value));\n\n const onListKey = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setActive((a) => move(a, 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setActive((a) => move(a < 0 ? 0 : a, -1));\n break;\n case \"Home\":\n if (!searchable || !query) {\n e.preventDefault();\n setActive(move(-1, 1));\n }\n break;\n case \"End\":\n if (!searchable || !query) {\n e.preventDefault();\n setActive(move(0, -1));\n }\n break;\n case \"Enter\":\n e.preventDefault();\n if (active >= 0) void choose(active);\n break;\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation(); // don't also close a surrounding Modal\n setOpen(false);\n focusTrigger();\n break;\n case \"Tab\":\n setOpen(false);\n break;\n case \"Backspace\":\n if (multiple && query === \"\" && selected.length) removeValue(selected[selected.length - 1]);\n break;\n default:\n // Without a search box: jump to the next option starting with the typed letter.\n if (!searchable && e.key.length === 1 && !e.metaKey && !e.ctrlKey) {\n const k = normalize(e.key);\n const start = active < 0 ? 0 : active + 1;\n for (let t = 0; t < navigable.length; t++) {\n const i = (start + t) % navigable.length;\n const o = navigable[i].option;\n if (o && enabledAt(i) && normalize(o.label).startsWith(k)) {\n setActive(i);\n break;\n }\n }\n }\n }\n };\n\n const onTriggerKey = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(e.key)) {\n e.preventDefault();\n setOpen(true);\n } else if (e.key === \"Backspace\" && multiple && selected.length) {\n removeValue(selected[selected.length - 1]);\n } else if (searchable && e.key.length === 1 && !e.metaKey && !e.ctrlKey && !e.altKey) {\n // Start typing to open and search.\n e.preventDefault();\n setOpen(true);\n setQuery(e.key);\n }\n };\n\n /* ----- render ----- */\n const selectedOptions = selected.map(optionFor);\n const hasValue = selected.length > 0;\n const labelledBy = ariaLabel ? undefined : field?.labelId;\n const activeId = open && active >= 0 ? optionId(active) : undefined;\n\n const setWrapperRef = (node: HTMLDivElement | null) => {\n wrapperRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n\n return (\n <div ref={setWrapperRef} className={cn(\"relative w-full\", className)}>\n <div\n ref={triggerRef}\n id={control.id}\n role=\"combobox\"\n tabIndex={disabled ? -1 : 0}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listId}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n aria-describedby={control[\"aria-describedby\"]}\n aria-invalid={control[\"aria-invalid\"]}\n aria-required={control.required || undefined}\n aria-disabled={disabled || undefined}\n data-invalid={invalid ? \"\" : undefined}\n data-disabled={disabled ? \"\" : undefined}\n className={cn(\n controlFrame({ rounded }),\n triggerSize({ size, multiple }),\n \"cursor-pointer select-none items-center gap-2 text-left outline-none\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/25\",\n open && \"border-ring ring-3 ring-ring/25\",\n disabled && \"cursor-not-allowed\"\n )}\n onMouseDown={(e) => {\n if (disabled || (e.target as HTMLElement).closest(\"[data-chip-remove],[data-clear]\")) return;\n e.preventDefault();\n if (open) {\n setOpen(false);\n focusTrigger();\n } else {\n setOpen(true);\n }\n }}\n onKeyDown={onTriggerKey}\n >\n <div className={cn(\"flex min-w-0 flex-1 flex-wrap items-center\", multiple ? \"gap-1\" : \"gap-2\")}>\n {multiple ? (\n selectedOptions.length ? (\n selectedOptions.map((o) => (\n <span\n key={o.value}\n className=\"inline-flex max-w-full items-center gap-1 rounded-control-sm bg-secondary-hover py-0.5 pl-2 pr-0.5 text-[0.8125rem] leading-5 text-fg [&_i]:text-[1em] [&_svg]:size-[1em]\"\n >\n {renderIcon(o.icon)}\n <span className=\"truncate\">{o.label}</span>\n {!disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-chip-remove=\"\"\n aria-label={`Remove ${o.label}`}\n className=\"grid size-5 cursor-pointer place-items-center rounded-[3px] text-fg-muted hover:bg-border hover:text-fg\"\n onClick={(e) => {\n e.stopPropagation();\n removeValue(o.value);\n focusTrigger();\n }}\n >\n <X className=\"size-3\" />\n </button>\n )}\n </span>\n ))\n ) : (\n <span className=\"truncate px-1.5 text-fg-muted/80\">{placeholder}</span>\n )\n ) : selectedOptions[0] ? (\n <span className=\"flex min-w-0 items-center gap-2 [&_i]:text-[1.125em] [&_i]:text-fg-muted [&_svg]:size-[1.125em] [&_svg]:text-fg-muted\">\n {renderIcon(selectedOptions[0].icon)}\n <span className=\"truncate\">{selectedOptions[0].label}</span>\n </span>\n ) : (\n <span className=\"truncate text-fg-muted/80\">{placeholder}</span>\n )}\n </div>\n\n {clearable && hasValue && !disabled && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-clear=\"\"\n aria-label=\"Clear selection\"\n className=\"-mr-1 grid size-6 shrink-0 cursor-pointer place-items-center rounded-control-sm text-fg-muted hover:bg-secondary-hover hover:text-fg\"\n onClick={(e) => {\n e.stopPropagation();\n commit([]);\n focusTrigger();\n }}\n >\n <X className=\"size-[0.95em]\" />\n </button>\n )}\n <Chevron open={open} />\n </div>\n\n {name &&\n (multiple ? selected : selected.slice(0, 1)).map((v) => <input key={v} type=\"hidden\" name={name} value={v} />)}\n {name && !hasValue && !multiple && <input type=\"hidden\" name={name} value=\"\" />}\n\n {open && (\n <div\n style={pos}\n className={cn(\n \"z-[60] flex flex-col overflow-hidden rounded-control-lg border border-border bg-surface text-fg\",\n \"shadow-[var(--ui-shadow-lg)] animate-[ui-fade-in_120ms_ease-out]\"\n )}\n >\n {searchable && (\n <div className=\"border-b border-border p-1.5\">\n <div className=\"flex h-9 items-center gap-2 rounded-control bg-secondary-hover/70 px-2.5 text-[0.9375rem]\">\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-4 shrink-0 text-fg-muted\">\n <circle cx=\"9\" cy=\"9\" r=\"5.5\" />\n <path d=\"M13 13l3.5 3.5\" />\n </svg>\n <input\n ref={searchRef}\n type=\"text\"\n role=\"searchbox\"\n aria-label={searchPlaceholder.replace(/…$/, \"\")}\n aria-controls={listId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder={searchPlaceholder}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onListKey}\n className=\"h-full min-w-0 flex-1 bg-transparent text-fg outline-none placeholder:text-fg-muted/70\"\n />\n {(loading || creating) && <span className=\"text-fg-muted\"><Spinner /></span>}\n </div>\n </div>\n )}\n\n <div\n ref={listRef}\n id={listId}\n role=\"listbox\"\n tabIndex={searchable ? undefined : -1}\n aria-multiselectable={multiple || undefined}\n aria-activedescendant={searchable ? undefined : activeId}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n onKeyDown={searchable ? undefined : onListKey}\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain p-1 outline-none\"\n >\n {items.map((item) => {\n if (item.kind === \"group\") {\n return (\n <div key={item.key} role=\"presentation\" className=\"px-2.5 pb-1 pt-2.5 text-xs font-medium text-fg-muted first:pt-1\">\n {item.label}\n </div>\n );\n }\n const isActive = item.index === active;\n if (item.kind === \"create\") {\n return (\n <div\n key={item.key}\n id={optionId(item.index)}\n role=\"option\"\n aria-selected={false}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-control-sm px-2.5 py-2 text-[0.9375rem]\",\n isActive && \"bg-secondary-hover\"\n )}\n onMouseMove={() => setActive(item.index)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => void choose(item.index)}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.7} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-4 shrink-0 text-primary\">\n <path d=\"M10 4.5v11M4.5 10h11\" />\n </svg>\n <span>\n Add <span className=\"font-medium\">“{item.input}”</span>\n </span>\n </div>\n );\n }\n const o = item.option;\n const isSelected = selected.includes(o.value);\n const off = isDisabled(o);\n return (\n <div\n key={item.key}\n id={optionId(item.index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={off || undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-2.5 rounded-control-sm px-2.5 py-2 text-[0.9375rem]\",\n isActive && !off && \"bg-secondary-hover\",\n off && \"cursor-not-allowed opacity-45\",\n \"[&>i]:text-[1.125em] [&>i]:text-fg-muted [&>svg:first-child]:size-[1.125em] [&>svg:first-child]:text-fg-muted\"\n )}\n onMouseMove={() => !off && setActive(item.index)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => void choose(item.index)}\n >\n {renderOption ? (\n renderOption(o, { selected: isSelected, active: isActive })\n ) : (\n <>\n {renderIcon(o.icon)}\n <span className=\"min-w-0 flex-1\">\n <span className={cn(\"block truncate\", isSelected && \"font-medium\")}>\n <Highlight text={o.label} query={loadOptions ? \"\" : query} />\n </span>\n {o.description && (\n <span className=\"block truncate text-[0.8125rem] text-fg-muted\">\n <Highlight text={o.description} query={loadOptions ? \"\" : query} />\n </span>\n )}\n </span>\n </>\n )}\n {isSelected && <Check />}\n </div>\n );\n })}\n\n {!items.length && (\n <div role=\"presentation\" className=\"px-2.5 py-3 text-sm text-fg-muted\">\n {loadError\n ? \"Couldn't load options. Check your connection and try again.\"\n : tooShort\n ? `Type ${minSearchLength - trimmed.length} more character${minSearchLength - trimmed.length === 1 ? \"\" : \"s\"} to search`\n : loading\n ? \"Searching…\"\n : noOptionsMessage(trimmed)}\n </div>\n )}\n </div>\n\n {limitReached && (\n <p className=\"border-t border-border px-3 py-2 text-[0.8125rem] text-fg-muted\">\n You can choose up to {maxSelected}. Remove one to pick another.\n </p>\n )}\n </div>\n )}\n </div>\n );\n});\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Tabs — horizontal or vertical, with optional reordering (drag, or Alt + arrow keys),\n * renaming (double-click or F2), adding and closing tabs, and disabled tabs.\n * Follows the WAI-ARIA tabs pattern: one Tab stop for the list, arrow keys between tabs.\n */\n\ntype Orientation = \"horizontal\" | \"vertical\";\ntype Variant = \"line\" | \"enclosed\" | \"pills\";\n\ntype TabsContextValue = {\n value: string | null;\n select: (value: string | null) => void;\n orientation: Orientation;\n variant: Variant;\n size: \"sm\" | \"md\";\n activation: \"automatic\" | \"manual\";\n tabId: (value: string) => string;\n panelId: (value: string) => string;\n};\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\nfunction useTabs(component: string) {\n const ctx = React.useContext(TabsContext);\n if (!ctx) throw new Error(`<${component}> must be used inside <Tabs>.`);\n return ctx;\n}\n\nconst safeId = (value: string) => value.replace(/[^A-Za-z0-9_-]/g, (c) => `_${c.charCodeAt(0).toString(36)}`);\n\n/* ---------- Tabs (root) ---------- */\n\nexport interface TabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string | null) => void;\n orientation?: Orientation;\n /** \"line\": underline under the active tab. \"enclosed\": folder-style tabs. \"pills\": a segmented control. */\n variant?: Variant;\n size?: \"sm\" | \"md\";\n /** \"automatic\" selects a tab as soon as it gets focus; \"manual\" waits for Enter or Space. */\n activation?: \"automatic\" | \"manual\";\n}\n\nexport function Tabs({\n value: valueProp,\n defaultValue = null,\n onValueChange,\n orientation = \"horizontal\",\n variant = \"line\",\n size = \"md\",\n activation = \"automatic\",\n className,\n children,\n ...props\n}: TabsProps) {\n const [uncontrolled, setUncontrolled] = React.useState<string | null>(defaultValue);\n const controlled = valueProp !== undefined;\n const value = controlled ? valueProp : uncontrolled;\n const onChangeRef = React.useRef(onValueChange);\n onChangeRef.current = onValueChange;\n const base = React.useId();\n\n const select = React.useCallback(\n (next: string | null) => {\n if (!controlled) setUncontrolled(next);\n onChangeRef.current?.(next);\n },\n [controlled]\n );\n\n const ctx = React.useMemo<TabsContextValue>(\n () => ({\n value,\n select,\n orientation,\n variant,\n size,\n activation,\n tabId: (v) => `${base}-tab-${safeId(v)}`,\n panelId: (v) => `${base}-panel-${safeId(v)}`,\n }),\n [value, select, orientation, variant, size, activation, base]\n );\n\n return (\n <TabsContext.Provider value={ctx}>\n <div\n data-orientation={orientation}\n className={cn(\n orientation === \"vertical\"\n ? \"flex min-w-0 flex-col gap-4 sm:flex-row sm:items-start sm:gap-6\"\n : \"grid min-w-0 grid-cols-[minmax(0,1fr)] gap-4\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\n/* ---------- TabList ---------- */\n\ntype ListContextValue = {\n editing: string | null;\n startEditing: (value: string) => void;\n finishEditing: (value: string, label: string | null) => void;\n renamable: boolean;\n closable: boolean;\n reorderable: boolean;\n onTabKeyDown: (event: React.KeyboardEvent, value: string) => void;\n onTabPointerDown: (event: React.PointerEvent, value: string) => void;\n close: (value: string) => void;\n closeLabel: (label: string) => string;\n register: (value: string, wrapper: HTMLElement | null, button: HTMLElement | null) => void;\n dragging: string | null;\n};\nconst ListContext = React.createContext<ListContextValue | null>(null);\n\nexport interface TabListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Makes tabs draggable (and movable with Alt + arrow keys). Called with the new order of values. */\n onReorder?: (values: string[]) => void;\n /** Makes tabs renamable by double-click or F2. Called with the tab's value and new label. */\n onRename?: (value: string, label: string) => void;\n /**\n * Shows a + button. Return the new tab's value (or a Promise of it) to select and focus\n * it — and start renaming it with renameOnAdd.\n */\n onAdd?: () => string | void | Promise<string | void>;\n /** Label for the + button. */\n addLabel?: string;\n /** Start renaming a tab right after it's added. */\n renameOnAdd?: boolean;\n /** Shows a × on tabs. If the active tab closes, a neighbor is selected first. */\n onClose?: (value: string) => void;\n closeLabel?: (label: string) => string;\n}\n\ntype TabInfo = { value: string; label: string; disabled: boolean };\n\nfunction textOf(node: React.ReactNode): string {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(textOf).join(\"\");\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) return textOf(node.props.children);\n return \"\";\n}\n\nexport function TabList({\n onReorder,\n onRename,\n onAdd,\n addLabel = \"New tab\",\n renameOnAdd = false,\n onClose,\n closeLabel = (label) => `Close ${label}`,\n className,\n children,\n ...props\n}: TabListProps) {\n const tabs = useTabs(\"TabList\");\n const { orientation, variant, size, value: selected, select } = tabs;\n const vertical = orientation === \"vertical\";\n\n // The tabs, in order, read from the children.\n const infos: TabInfo[] = React.Children.toArray(children)\n .filter((c): c is React.ReactElement<TabProps> => React.isValidElement(c) && typeof (c.props as TabProps).value === \"string\")\n .map((c) => ({\n value: c.props.value,\n label: c.props.label ?? textOf(c.props.children),\n disabled: !!c.props.disabled,\n }));\n const order = infos.map((t) => t.value);\n const orderKey = order.join(\"\\u0000\");\n\n const wrappers = React.useRef(new Map<string, HTMLElement>());\n const buttons = React.useRef(new Map<string, HTMLElement>());\n const register = React.useCallback((value: string, wrapper: HTMLElement | null, button: HTMLElement | null) => {\n if (wrapper) wrappers.current.set(value, wrapper);\n else wrappers.current.delete(value);\n if (button) buttons.current.set(value, button);\n else buttons.current.delete(value);\n }, []);\n\n const [announcement, setAnnouncement] = React.useState(\"\");\n const [editing, setEditing] = React.useState<string | null>(null);\n const [pendingFocus, setPendingFocus] = React.useState<string | null>(null);\n const [dragging, setDragging] = React.useState<string | null>(null);\n\n const focusTab = (value: string) => buttons.current.get(value)?.focus();\n const labelOf = (value: string) => infos.find((t) => t.value === value)?.label ?? value;\n\n // Focus a tab that appears after an update (added, or after closing a neighbor).\n React.useEffect(() => {\n if (pendingFocus && buttons.current.has(pendingFocus)) {\n focusTab(pendingFocus);\n setPendingFocus(null);\n }\n });\n\n // If nothing is selected yet, select the first enabled tab.\n React.useEffect(() => {\n if (selected === null || !order.includes(selected)) {\n const first = infos.find((t) => !t.disabled);\n if (first && selected === null) select(first.value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [orderKey, selected]);\n\n const orderRef = React.useRef(order);\n orderRef.current = order;\n\n /* ----- moving ----- */\n const move = (value: string, to: number) => {\n if (!onReorder) return;\n // Read the latest order: during a drag this runs many times before React re-renders us.\n const current = orderRef.current;\n const from = current.indexOf(value);\n const target = Math.max(0, Math.min(current.length - 1, to));\n if (from < 0 || from === target) return;\n const next = current.filter((v) => v !== value);\n next.splice(target, 0, value);\n orderRef.current = next;\n onReorder(next);\n setAnnouncement(`Moved ${labelOf(value)} to position ${target + 1} of ${current.length}.`);\n };\n\n // Siblings glide into their new places (FLIP), except the tab being dragged.\n const lastPositions = React.useRef(new Map<string, number>());\n React.useLayoutEffect(() => {\n const reduce = typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n const next = new Map<string, number>();\n for (const [value, el] of wrappers.current) {\n const pos = vertical ? el.offsetTop : el.offsetLeft;\n next.set(value, pos);\n const prev = lastPositions.current.get(value);\n if (reduce || prev === undefined || prev === pos || value === dragging) continue;\n el.style.transition = \"none\";\n el.style.transform = vertical ? `translateY(${prev - pos}px)` : `translateX(${prev - pos}px)`;\n void el.offsetWidth;\n el.style.transition = \"transform 160ms cubic-bezier(0.2, 0.8, 0.2, 1)\";\n el.style.transform = \"\";\n }\n lastPositions.current = next;\n }, [orderKey, vertical, dragging]);\n\n /* ----- keyboard ----- */\n const enabled = infos.filter((t) => !t.disabled).map((t) => t.value);\n const neighbor = (value: string, step: number) => {\n const i = enabled.indexOf(value);\n if (!enabled.length) return value;\n return enabled[(i + step + enabled.length) % enabled.length];\n };\n\n const onTabKeyDown = (event: React.KeyboardEvent, value: string) => {\n const prevKey = vertical ? \"ArrowUp\" : \"ArrowLeft\";\n const nextKey = vertical ? \"ArrowDown\" : \"ArrowRight\";\n const go = (target: string) => {\n event.preventDefault();\n focusTab(target);\n if (tabs.activation === \"automatic\") select(target);\n };\n\n if ((event.key === prevKey || event.key === nextKey) && event.altKey && onReorder) {\n event.preventDefault();\n move(value, order.indexOf(value) + (event.key === nextKey ? 1 : -1));\n requestAnimationFrame(() => focusTab(value));\n return;\n }\n switch (event.key) {\n case nextKey:\n return go(neighbor(value, 1));\n case prevKey:\n return go(neighbor(value, -1));\n case \"Home\":\n return enabled[0] && go(enabled[0]);\n case \"End\":\n return enabled.length && go(enabled[enabled.length - 1]);\n case \"Enter\":\n case \" \":\n event.preventDefault();\n select(value);\n return;\n case \"F2\":\n if (onRename) {\n event.preventDefault();\n setEditing(value);\n }\n return;\n case \"Delete\":\n if (onClose) {\n event.preventDefault();\n close(value);\n }\n return;\n }\n };\n\n /* ----- dragging (mouse, pen, and touch after a short press) ----- */\n const onTabPointerDown = (event: React.PointerEvent, value: string) => {\n if (event.button !== 0 || editing) return;\n if ((event.target as HTMLElement).closest(\"[data-tab-close]\")) return;\n const info = infos.find((t) => t.value === value);\n if (!info || info.disabled) return;\n select(value);\n if (!onReorder) return;\n\n const wrapper = wrappers.current.get(value);\n if (!wrapper) return;\n const start = vertical ? event.clientY : event.clientX;\n const cross = vertical ? event.clientX : event.clientY;\n const origin = vertical ? wrapper.offsetTop : wrapper.offsetLeft;\n const touch = event.pointerType === \"touch\";\n let active = false;\n let pressed = !touch; // touch needs a short press before dragging, so scrolling still works\n const pressTimer = touch ? window.setTimeout(() => (pressed = true), 350) : 0;\n\n const begin = () => {\n active = true;\n setDragging(value);\n document.body.style.cursor = \"grabbing\";\n wrapper.style.transition = \"none\";\n wrapper.style.zIndex = \"10\";\n };\n const onMove = (e: PointerEvent) => {\n const pos = vertical ? e.clientY : e.clientX;\n if (!active) {\n const moved = Math.abs(pos - start) > 4 || Math.abs((vertical ? e.clientX : e.clientY) - cross) > 8;\n if (!moved) return;\n if (!pressed) return cleanup(); // a swipe on touch: let the list scroll instead\n begin();\n }\n e.preventDefault();\n // Where would the tab land? Count the other tabs whose middle is before the pointer.\n const currentOrder = orderRef.current;\n let index = 0;\n for (const v of currentOrder) {\n if (v === value) continue;\n const el = wrappers.current.get(v);\n if (!el) continue;\n const r = el.getBoundingClientRect();\n const mid = vertical ? r.top + r.height / 2 : r.left + r.width / 2;\n if (pos > mid) index++;\n }\n if (index !== currentOrder.indexOf(value)) move(value, index);\n const now = vertical ? wrapper.offsetTop : wrapper.offsetLeft;\n const offset = pos - start - (now - origin);\n wrapper.style.transform = vertical ? `translateY(${offset}px)` : `translateX(${offset}px)`;\n };\n const preventTouchScroll = (e: TouchEvent) => {\n if (active) e.preventDefault();\n };\n const cleanup = () => {\n window.clearTimeout(pressTimer);\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n window.removeEventListener(\"pointercancel\", onUp);\n window.removeEventListener(\"touchmove\", preventTouchScroll);\n };\n const onUp = () => {\n cleanup();\n if (!active) return;\n document.body.style.cursor = \"\";\n wrapper.style.transition = \"transform 160ms cubic-bezier(0.2, 0.8, 0.2, 1)\";\n wrapper.style.transform = \"\";\n wrapper.style.zIndex = \"\";\n setDragging(null);\n lastPositions.current.set(value, vertical ? wrapper.offsetTop : wrapper.offsetLeft);\n };\n window.addEventListener(\"pointermove\", onMove, { passive: false });\n window.addEventListener(\"pointerup\", onUp);\n window.addEventListener(\"pointercancel\", onUp);\n window.addEventListener(\"touchmove\", preventTouchScroll, { passive: false });\n };\n /* ----- close, rename, add ----- */\n const close = (value: string) => {\n if (!onClose) return;\n if (value === selected) {\n const i = enabled.indexOf(value);\n const next = enabled[i + 1] ?? enabled[i - 1] ?? null;\n select(next);\n if (next) setPendingFocus(next);\n }\n onClose(value);\n setAnnouncement(`Closed ${labelOf(value)}.`);\n };\n\n const finishEditing = (value: string, label: string | null) => {\n setEditing(null);\n const trimmed = label?.trim();\n if (trimmed && trimmed !== labelOf(value)) {\n onRename?.(value, trimmed);\n setAnnouncement(`Renamed to ${trimmed}.`);\n }\n setPendingFocus(value);\n };\n\n const add = async () => {\n if (!onAdd) return;\n const value = await onAdd();\n if (typeof value === \"string\") {\n select(value);\n if (renameOnAdd && onRename) setEditing(value);\n else setPendingFocus(value);\n }\n };\n\n /* ----- active indicator for the line style ----- */\n const listRef = React.useRef<HTMLDivElement>(null);\n const [indicator, setIndicator] = React.useState<{ start: number; size: number } | null>(null);\n const measured = React.useRef(false);\n React.useLayoutEffect(() => {\n if (variant !== \"line\") return;\n const measure = () => {\n const el = selected ? wrappers.current.get(selected) : undefined;\n setIndicator(el ? { start: vertical ? el.offsetTop : el.offsetLeft, size: vertical ? el.offsetHeight : el.offsetWidth } : null);\n };\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n if (ro && listRef.current) ro.observe(listRef.current);\n return () => ro?.disconnect();\n }, [selected, orderKey, variant, vertical, editing]);\n React.useEffect(() => {\n if (indicator) measured.current = true;\n }, [indicator]);\n\n // Keep the selected tab visible when the list scrolls.\n React.useEffect(() => {\n if (selected) wrappers.current.get(selected)?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n }, [selected]);\n\n const listCtx: ListContextValue = {\n editing,\n startEditing: (v) => onRename && setEditing(v),\n finishEditing,\n renamable: !!onRename,\n closable: !!onClose,\n reorderable: !!onReorder,\n onTabKeyDown,\n onTabPointerDown,\n close,\n closeLabel,\n register,\n dragging,\n };\n\n return (\n <ListContext.Provider value={listCtx}>\n <div\n className={cn(\n \"relative flex\",\n vertical ? \"w-full shrink-0 flex-col sm:w-52\" : \"items-end\",\n // The baseline is an inset shadow (not a border) so the active tab can cover it.\n variant !== \"pills\" && (vertical ? \"shadow-[inset_-1px_0_0_var(--color-border)]\" : \"shadow-[inset_0_-1px_0_var(--color-border)]\"),\n variant === \"pills\" && cn(\"gap-1 rounded-control-lg bg-secondary-hover p-1\", vertical ? \"\" : \"w-fit max-w-full items-center\"),\n className\n )}\n >\n <div\n ref={listRef}\n role=\"tablist\"\n aria-orientation={orientation}\n className={cn(\n \"relative flex min-w-0\",\n vertical ? \"flex-col\" : \"overflow-x-auto overscroll-x-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n variant === \"pills\" ? \"gap-1\" : variant === \"enclosed\" ? (vertical ? \"gap-0.5\" : \"gap-0.5 px-1 pt-1\") : vertical ? \"\" : \"gap-1\",\n !vertical && \"flex-1\"\n )}\n {...props}\n >\n {children}\n {variant === \"line\" && indicator && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute bg-primary\",\n vertical ? \"end-0 w-0.5\" : \"bottom-0 h-0.5\",\n measured.current && \"transition-[left,top,width,height] duration-200 ease-out motion-reduce:transition-none\"\n )}\n style={vertical ? { top: indicator.start, height: indicator.size } : { left: indicator.start, width: indicator.size }}\n />\n )}\n </div>\n\n {onAdd && (\n <button\n type=\"button\"\n aria-label={addLabel}\n title={addLabel}\n onClick={() => void add()}\n className={cn(\n \"flex shrink-0 cursor-pointer items-center gap-2 rounded-control-sm text-fg-muted hover:bg-secondary-hover hover:text-fg\",\n \"focus-visible:outline-2 focus-visible:outline-ring [&_svg]:size-4\",\n vertical ? cn(\"mt-1 px-3 text-sm\", size === \"sm\" ? \"h-8\" : \"h-9\") : cn(\"mx-1 mb-1 justify-center\", size === \"sm\" ? \"size-7\" : \"size-8\"),\n variant === \"pills\" && !vertical && \"mb-0\",\n variant === \"pills\" && \"hover:bg-surface\"\n )}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.7} strokeLinecap=\"round\" aria-hidden=\"true\">\n <path d=\"M10 4.5v11M4.5 10h11\" />\n </svg>\n {vertical && <span>{addLabel}</span>}\n </button>\n )}\n\n <span className=\"sr-only\" aria-live=\"polite\">\n {announcement}\n </span>\n </div>\n </ListContext.Provider>\n );\n}\n\n/* ---------- Tab ---------- */\n\nexport interface TabProps {\n value: string;\n /** Plain-text label (used for renaming and announcements). Defaults to the children's text. */\n label?: string;\n children?: React.ReactNode;\n disabled?: boolean;\n icon?: IconInput;\n /** Extra content after the label, e.g. a count badge. */\n badge?: React.ReactNode;\n /** Opt this tab out of renaming. */\n renamable?: boolean;\n /** Opt this tab out of closing. */\n closable?: boolean;\n className?: string;\n}\n\nexport function Tab({ value, label, children, disabled = false, icon, badge, renamable = true, closable = true, className }: TabProps) {\n const tabs = useTabs(\"Tab\");\n const list = React.useContext(ListContext);\n if (!list) throw new Error(\"<Tab> must be used inside <TabList>.\");\n const { variant, size, orientation } = tabs;\n const vertical = orientation === \"vertical\";\n const selected = tabs.value === value;\n const editing = list.editing === value;\n const text = label ?? textOf(children);\n\n const wrapperRef = React.useRef<HTMLDivElement>(null);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n React.useLayoutEffect(() => {\n list.register(value, wrapperRef.current, buttonRef.current);\n return () => list.register(value, null, null);\n });\n\n const canClose = list.closable && closable && !disabled;\n\n const tabClass = cn(\n \"relative flex min-w-0 cursor-pointer select-none items-center gap-2 whitespace-nowrap text-fg-muted outline-none\",\n \"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring\",\n \"[&_svg]:size-[1.05em] [&_svg]:shrink-0 [&_i]:text-[1.05em] [&_i]:leading-none\",\n size === \"sm\" ? \"h-8 px-2.5 text-[0.8125rem]\" : \"h-10 px-3 text-sm\",\n vertical && \"w-full\",\n variant === \"line\" && cn(\"rounded-control-sm hover:text-fg\", vertical ? \"hover:bg-secondary-hover\" : \"hover:bg-secondary-hover/60\", selected && \"font-medium text-fg\"),\n variant === \"enclosed\" && cn(\n vertical ? \"rounded-s-control\" : \"rounded-t-control\",\n \"border border-transparent hover:text-fg\",\n selected && cn(\"border-border bg-surface font-medium text-fg\", vertical ? \"border-e-surface\" : \"border-b-surface\")\n ),\n variant === \"pills\" && cn(\"rounded-control hover:text-fg\", selected && \"bg-surface font-medium text-fg shadow-[var(--ui-shadow-sm)]\"),\n disabled && \"cursor-not-allowed opacity-45 hover:bg-transparent hover:text-fg-muted\",\n canClose && \"pe-8\",\n className\n );\n\n return (\n <div\n ref={wrapperRef}\n role=\"presentation\"\n className={cn(\"relative flex shrink-0\", vertical && \"w-full\", list.dragging === value && \"cursor-grabbing drop-shadow-md\")}\n >\n {editing ? (\n <input\n autoFocus\n aria-label=\"Tab name\"\n defaultValue={text}\n onFocus={(e) => e.currentTarget.select()}\n onBlur={(e) => list.finishEditing(value, e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n list.finishEditing(value, e.currentTarget.value);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n list.finishEditing(value, null);\n }\n }}\n className={cn(\n \"rounded-control-sm border border-ring bg-surface text-fg outline-none ring-3 ring-ring/25\",\n size === \"sm\" ? \"h-8 px-2 text-[0.8125rem]\" : \"h-10 px-2.5 text-sm\",\n vertical ? \"w-full\" : \"w-40\"\n )}\n />\n ) : (\n <button\n ref={buttonRef}\n type=\"button\"\n role=\"tab\"\n id={tabs.tabId(value)}\n aria-selected={selected}\n aria-controls={tabs.panelId(value)}\n aria-disabled={disabled || undefined}\n tabIndex={selected ? 0 : -1}\n onPointerDown={(e) => list.onTabPointerDown(e, value)}\n onClick={() => !disabled && tabs.select(value)}\n onDoubleClick={() => !disabled && list.renamable && renamable && list.startEditing(value)}\n onKeyDown={(e) => {\n if (e.key === \"F2\" && !renamable) return;\n if (e.key === \"Delete\" && !canClose) return;\n list.onTabKeyDown(e, value);\n }}\n className={tabClass}\n title={list.renamable && renamable && !disabled ? `${text} — double-click to rename` : undefined}\n >\n {renderIcon(icon)}\n <span className=\"truncate\">{children ?? text}</span>\n {badge}\n </button>\n )}\n {canClose && !editing && (\n <button\n type=\"button\"\n tabIndex={-1}\n data-tab-close=\"\"\n aria-label={list.closeLabel(text)}\n onClick={() => list.close(value)}\n className={cn(\n \"absolute end-1.5 top-1/2 grid size-5 -translate-y-1/2 cursor-pointer place-items-center rounded-[4px] text-fg-muted\",\n \"hover:bg-border hover:text-fg\",\n )}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-3\">\n <path d=\"M6 6l8 8M14 6l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n\n/* ---------- TabPanel ---------- */\n\nexport interface TabPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string;\n /** Keep the panel in the page while hidden, so its state (scroll, form input) is kept. */\n keepMounted?: boolean;\n}\n\nexport function TabPanel({ value, keepMounted = false, className, children, ...props }: TabPanelProps) {\n const tabs = useTabs(\"TabPanel\");\n const selected = tabs.value === value;\n if (!selected && !keepMounted) return null;\n return (\n <div\n role=\"tabpanel\"\n id={tabs.panelId(value)}\n aria-labelledby={tabs.tabId(value)}\n tabIndex={0}\n hidden={!selected}\n className={cn(\"w-full min-w-0 flex-1 rounded-control outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\", className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Pill — small rounded labels for statuses, tags and counts (Pill), and selectable\n * pills for filters and quick choices (PillGroup + PillOption).\n * For pill-style navigation between views, use <Tabs variant=\"pills\">.\n */\n\nexport type PillTone = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type PillAppearance = \"soft\" | \"solid\" | \"outline\";\n\n// Each tone sets two variables; the appearance decides how they're used.\nconst toneVars: Record<PillTone, string> = {\n neutral: \"[--pill:var(--color-fg-muted)] [--pill-fg:var(--color-bg)]\",\n primary: \"[--pill:var(--color-primary)] [--pill-fg:var(--color-primary-fg)]\",\n success: \"[--pill:var(--color-success)] [--pill-fg:var(--color-success-fg)]\",\n warning: \"[--pill:var(--color-warning)] [--pill-fg:var(--color-warning-fg)]\",\n danger: \"[--pill:var(--color-danger)] [--pill-fg:var(--color-danger-fg)]\",\n info: \"[--pill:var(--color-info)] [--pill-fg:var(--color-info-fg)]\",\n};\n\nexport const pillVariants = cva(\n [\n \"inline-flex max-w-full shrink-0 items-center whitespace-nowrap rounded-full font-medium leading-none\",\n \"[&_svg]:size-[1.1em] [&_svg]:shrink-0 [&_i]:text-[1.1em] [&_i]:leading-none\",\n ],\n {\n variants: {\n appearance: {\n soft: \"bg-[color:color-mix(in_srgb,var(--pill)_14%,transparent)] text-[color:color-mix(in_srgb,var(--pill)_88%,var(--color-fg))]\",\n solid: \"bg-[color:var(--pill)] text-[color:var(--pill-fg)]\",\n outline: \"border border-[color:color-mix(in_srgb,var(--pill)_45%,transparent)] text-[color:color-mix(in_srgb,var(--pill)_88%,var(--color-fg))]\",\n },\n size: {\n sm: \"h-5 gap-1 px-2 text-[0.6875rem]\",\n md: \"h-6 gap-1.5 px-2.5 text-xs\",\n lg: \"h-7 gap-1.5 px-3 text-[0.8125rem]\",\n },\n tone: {\n neutral: \"\",\n primary: \"\",\n success: \"\",\n warning: \"\",\n danger: \"\",\n info: \"\",\n },\n },\n compoundVariants: [\n // Neutral reads better with the page's own text colors.\n { tone: \"neutral\", appearance: \"soft\", class: \"bg-secondary-hover text-fg\" },\n { tone: \"neutral\", appearance: \"outline\", class: \"border-border-strong text-fg\" },\n { tone: \"neutral\", appearance: \"solid\", class: \"bg-fg text-bg\" },\n ],\n defaultVariants: { appearance: \"soft\", size: \"md\", tone: \"neutral\" },\n }\n);\n\nexport interface PillProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\"> {\n children?: React.ReactNode;\n tone?: PillTone;\n appearance?: PillAppearance;\n size?: \"sm\" | \"md\" | \"lg\";\n icon?: IconInput;\n /** A small status dot before the label. \"pulse\" adds a gentle pulse, e.g. for \"Live\". */\n dot?: boolean | \"pulse\";\n /** A number after the label. */\n count?: number;\n /** Shows a × button that calls this. */\n onRemove?: () => void;\n /** Label for the × button. Defaults to \"Remove {label}\". */\n removeLabel?: string;\n /** Render your own element, e.g. a link: <Pill asChild><a href=\"…\">Design</a></Pill>. */\n asChild?: boolean;\n}\n\nfunction textOf(node: React.ReactNode): string {\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(textOf).join(\"\");\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) return textOf(node.props.children);\n return \"\";\n}\n\nfunction Dot({ pulse }: { pulse?: boolean }) {\n return (\n <span aria-hidden=\"true\" className=\"relative grid size-1.5 shrink-0 place-items-center\">\n {pulse && (\n <span className=\"absolute inset-0 animate-ping rounded-full bg-[color:var(--pill)] opacity-60 motion-reduce:hidden\" />\n )}\n <span className=\"relative size-1.5 rounded-full bg-[color:var(--pill)]\" />\n </span>\n );\n}\n\nexport const Pill = React.forwardRef<HTMLSpanElement, PillProps>(\n (\n { tone = \"neutral\", appearance = \"soft\", size = \"md\", icon, dot, count, onRemove, removeLabel, asChild, className, children, ...props },\n ref\n ) => {\n const Comp = asChild ? Slot : \"span\";\n const label = textOf(children);\n const interactive = asChild || !!props.onClick;\n return (\n <Comp\n ref={ref}\n className={cn(\n toneVars[tone],\n pillVariants({ tone, appearance, size }),\n interactive && \"cursor-pointer transition-[filter] hover:brightness-[0.96] dark:hover:brightness-110 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n onRemove && (size === \"sm\" ? \"pe-0.5\" : \"pe-1\"),\n className\n )}\n {...props}\n >\n {dot && <Dot pulse={dot === \"pulse\"} />}\n {renderIcon(icon)}\n {asChild ? <Slottable>{children}</Slottable> : <span className=\"truncate\">{children}</span>}\n {count !== undefined && (\n <span className=\"rounded-full bg-[color:color-mix(in_srgb,currentColor_14%,transparent)] px-1.5 py-px text-[0.9em] tabular-nums leading-tight\">\n {count}\n </span>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={removeLabel ?? `Remove ${label}`}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n onRemove();\n }}\n className={cn(\n \"grid shrink-0 cursor-pointer place-items-center rounded-full opacity-70 hover:bg-[color:color-mix(in_srgb,currentColor_16%,transparent)] hover:opacity-100\",\n \"focus-visible:outline-2 focus-visible:outline-ring\",\n size === \"sm\" ? \"size-4\" : size === \"lg\" ? \"size-5.5\" : \"size-4.5\"\n )}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-[0.85em]\">\n <path d=\"M6 6l8 8M14 6l-8 8\" />\n </svg>\n </button>\n )}\n </Comp>\n );\n }\n);\nPill.displayName = \"Pill\";\n\n/* ---------- selectable pills ---------- */\n\ntype GroupContextValue = {\n isSelected: (value: string) => boolean;\n toggle: (value: string) => void;\n size: \"sm\" | \"md\" | \"lg\";\n tone: PillTone;\n showCheck: boolean;\n disabled: boolean;\n};\nconst GroupContext = React.createContext<GroupContextValue | null>(null);\n\ntype GroupBase = Omit<React.HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> & {\n size?: \"sm\" | \"md\" | \"lg\";\n /** Color of selected pills. Default \"primary\". */\n tone?: PillTone;\n /** Show a check mark on selected pills. Default true for multiple. */\n showCheck?: boolean;\n disabled?: boolean;\n /** Required for screen readers when there's no visible label. */\n \"aria-label\"?: string;\n};\n\nexport type PillGroupProps =\n | (GroupBase & {\n type?: \"single\";\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string | null) => void;\n /** Let people unselect the current pill. Default false. */\n allowDeselect?: boolean;\n })\n | (GroupBase & {\n type: \"multiple\";\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n allowDeselect?: never;\n });\n\nexport function PillGroup(props: PillGroupProps) {\n const {\n type = \"single\",\n size = \"md\",\n tone = \"primary\",\n showCheck,\n disabled = false,\n allowDeselect = false,\n className,\n children,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...rest\n } = props as GroupBase & {\n type?: \"single\" | \"multiple\";\n value?: string | string[] | null;\n defaultValue?: string | string[] | null;\n onValueChange?: (v: never) => void;\n allowDeselect?: boolean;\n };\n const multiple = type === \"multiple\";\n const toArray = (v: string | string[] | null | undefined) => (v == null ? [] : Array.isArray(v) ? v : [v]);\n const [uncontrolled, setUncontrolled] = React.useState<string[]>(() => toArray(defaultValue));\n const controlled = valueProp !== undefined;\n const selected = controlled ? toArray(valueProp) : uncontrolled;\n\n const toggle = (v: string) => {\n let next: string[];\n if (multiple) next = selected.includes(v) ? selected.filter((x) => x !== v) : [...selected, v];\n else if (selected.includes(v)) {\n if (!allowDeselect) return;\n next = [];\n } else next = [v];\n if (!controlled) setUncontrolled(next);\n (onValueChange as ((v: unknown) => void) | undefined)?.(multiple ? next : (next[0] ?? null));\n };\n\n return (\n <GroupContext.Provider\n value={{ isSelected: (v) => selected.includes(v), toggle, size, tone, showCheck: showCheck ?? multiple, disabled }}\n >\n <div role=\"group\" className={cn(\"flex flex-wrap gap-2\", className)} {...rest}>\n {children}\n </div>\n </GroupContext.Provider>\n );\n}\n\nexport interface PillOptionProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"value\"> {\n value: string;\n icon?: IconInput;\n count?: number;\n}\n\nexport const PillOption = React.forwardRef<HTMLButtonElement, PillOptionProps>(\n ({ value, icon, count, disabled, className, children, ...props }, ref) => {\n const group = React.useContext(GroupContext);\n if (!group) throw new Error(\"<PillOption> must be used inside <PillGroup>.\");\n const selected = group.isSelected(value);\n const off = disabled || group.disabled;\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={selected}\n disabled={off}\n onClick={() => group.toggle(value)}\n className={cn(\n toneVars[group.tone],\n \"inline-flex shrink-0 cursor-pointer select-none items-center whitespace-nowrap rounded-full border font-medium\",\n \"transition-[background-color,border-color,color] duration-100\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-45\",\n \"[&_svg]:size-[1.1em] [&_svg]:shrink-0 [&_i]:text-[1.1em] [&_i]:leading-none\",\n group.size === \"sm\" ? \"h-7 gap-1.5 px-3 text-xs\" : group.size === \"lg\" ? \"h-10 gap-2 px-4.5 text-[0.9375rem]\" : \"h-8 gap-1.5 px-3.5 text-sm\",\n selected\n ? \"border-[color:color-mix(in_srgb,var(--pill)_55%,transparent)] bg-[color:color-mix(in_srgb,var(--pill)_13%,transparent)] text-[color:color-mix(in_srgb,var(--pill)_88%,var(--color-fg))]\"\n : \"border-border-strong bg-surface text-fg hover:border-fg-muted/60 hover:bg-secondary-hover\",\n className\n )}\n {...props}\n >\n {group.showCheck && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"grid shrink-0 place-items-center overflow-hidden transition-[width,margin] duration-150 motion-reduce:transition-none\",\n selected ? \"w-[1em]\" : \"-me-1.5 w-0\"\n )}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"size-[1em]\">\n <path d=\"M4.5 10.5l3.5 3.5 7.5-8\" />\n </svg>\n </span>\n )}\n {renderIcon(icon)}\n <span className=\"truncate\">{children}</span>\n {count !== undefined && (\n <span className={cn(\"tabular-nums\", selected ? \"opacity-80\" : \"text-fg-muted\")}>{count}</span>\n )}\n </button>\n );\n }\n);\nPillOption.displayName = \"PillOption\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/*\n * Activity indicators — ways to show that something is happening:\n * ActivityIndicator spinner, dots, bars, pulse or orbit, for \"working on it\"\n * ProgressBar linear progress, with a known value or indeterminate\n * ProgressRing circular progress with the value in the middle\n * Skeleton placeholder shapes while content loads\n * ActivitySteps a multi-step job (upload → process → publish) and where it's at\n * LoadingOverlay covers a region while it refreshes\n * All respect reduced motion and announce themselves to screen readers.\n */\n\nexport type ActivityTone = \"primary\" | \"neutral\" | \"current\" | \"success\" | \"warning\" | \"danger\" | \"info\";\n\nconst toneVar: Record<ActivityTone, string> = {\n primary: \"[--ai:var(--color-primary)]\",\n neutral: \"[--ai:var(--color-fg-muted)]\",\n current: \"[--ai:currentColor]\",\n success: \"[--ai:var(--color-success)]\",\n warning: \"[--ai:var(--color-warning)]\",\n danger: \"[--ai:var(--color-danger)]\",\n info: \"[--ai:var(--color-info)]\",\n};\n\nconst sizePx = { xs: 12, sm: 16, md: 24, lg: 40, xl: 56 } as const;\nexport type ActivitySize = keyof typeof sizePx;\n\n/* ---------- ActivityIndicator ---------- */\n\nexport interface ActivityIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * - \"spinner\": a spinning arc (general loading)\n * - \"dots\": three bouncing dots (someone is typing, a reply is coming)\n * - \"bars\": an equalizer (listening, processing audio or data)\n * - \"pulse\": a beacon (live, connected, recording)\n * - \"orbit\": a light with a fading tail circling a ring\n */\n variant?: \"spinner\" | \"dots\" | \"bars\" | \"pulse\" | \"orbit\";\n size?: ActivitySize;\n tone?: ActivityTone;\n /** What's happening, e.g. \"Loading invoices\". Read by screen readers; shown with showLabel. */\n label?: string;\n showLabel?: boolean;\n /** Put the label beside (\"inline\") or under (\"stacked\") the indicator. */\n labelPosition?: \"inline\" | \"stacked\";\n}\n\nexport function ActivityIndicator({\n variant = \"spinner\",\n size = \"md\",\n tone = \"primary\",\n label = \"Loading\",\n showLabel = false,\n labelPosition = \"inline\",\n className,\n ...props\n}: ActivityIndicatorProps) {\n const px = sizePx[size];\n return (\n <span\n role=\"status\"\n className={cn(\n toneVar[tone],\n \"inline-flex items-center\",\n labelPosition === \"stacked\" && showLabel ? \"flex-col gap-2.5\" : \"gap-2.5\",\n className\n )}\n {...props}\n >\n <span aria-hidden=\"true\" className=\"relative inline-grid shrink-0 place-items-center\" style={{ width: px, height: px }}>\n <Figure variant={variant} px={px} />\n </span>\n {showLabel ? (\n <span className={cn(\"text-sm text-fg-muted\", size === \"xs\" || size === \"sm\" ? \"text-[0.8125rem]\" : \"\")}>{label}</span>\n ) : (\n <span className=\"sr-only\">{label}</span>\n )}\n </span>\n );\n}\n\nfunction Figure({ variant, px }: { variant: NonNullable<ActivityIndicatorProps[\"variant\"]>; px: number }) {\n const stroke = Math.max(1.5, px / 10);\n switch (variant) {\n case \"spinner\": {\n const r = (px - stroke) / 2;\n const c = 2 * Math.PI * r;\n return (\n <svg width={px} height={px} viewBox={`0 0 ${px} ${px}`} fill=\"none\" className=\"animate-spin [animation-duration:0.8s] motion-reduce:[animation-duration:2.4s]\">\n <circle cx={px / 2} cy={px / 2} r={r} stroke=\"var(--ai)\" strokeOpacity={0.18} strokeWidth={stroke} />\n <circle cx={px / 2} cy={px / 2} r={r} stroke=\"var(--ai)\" strokeWidth={stroke} strokeLinecap=\"round\" strokeDasharray={`${c * 0.28} ${c}`} />\n </svg>\n );\n }\n case \"dots\": {\n const d = Math.max(3, px / 4.5);\n return (\n <span className=\"flex items-center\" style={{ gap: d * 0.55 }}>\n {[0, 1, 2].map((i) => (\n <span\n key={i}\n className=\"rounded-full bg-[color:var(--ai)] animate-[ui-dot_1.2s_ease-in-out_infinite] motion-reduce:animate-[ui-breathe_1.6s_ease-in-out_infinite]\"\n style={{ width: d, height: d, animationDelay: `${i * 0.16}s` }}\n />\n ))}\n </span>\n );\n }\n case \"bars\": {\n const w = Math.max(2, px / 7);\n return (\n <span className=\"flex items-center\" style={{ height: px * 0.8, gap: w * 0.7 }}>\n {[0.1, 0.35, 0, 0.25].map((delay, i) => (\n <span\n key={i}\n className=\"h-full origin-center rounded-full bg-[color:var(--ai)] animate-[ui-eq_0.9s_ease-in-out_infinite] motion-reduce:animate-[ui-breathe_1.6s_ease-in-out_infinite]\"\n style={{ width: w, animationDelay: `${-delay * 3}s` }}\n />\n ))}\n </span>\n );\n }\n case \"pulse\":\n return (\n <>\n {[0, 1].map((i) => (\n <span\n key={i}\n className=\"absolute inset-0 rounded-full bg-[color:var(--ai)] animate-[ui-beacon_1.8s_cubic-bezier(0,0,0.2,1)_infinite] motion-reduce:hidden\"\n style={{ animationDelay: `${i * 0.9}s` }}\n />\n ))}\n <span className=\"relative rounded-full bg-[color:var(--ai)]\" style={{ width: px * 0.36, height: px * 0.36 }} />\n </>\n );\n case \"orbit\":\n return (\n <>\n <span className=\"absolute inset-0 rounded-full border-[color:color-mix(in_srgb,var(--ai)_16%,transparent)]\" style={{ borderWidth: stroke }} />\n <span\n className=\"ui-orbit-ring absolute inset-0 animate-spin [animation-duration:1s] motion-reduce:[animation-duration:3s]\"\n style={{ [\"--ai-thickness\" as string]: `${stroke}px` }}\n />\n </>\n );\n }\n}\n\n/* ---------- ProgressBar ---------- */\n\nexport interface ProgressBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** 0–max. Leave out for an indeterminate bar. */\n value?: number;\n max?: number;\n /** Visible label above the bar (also its accessible name). */\n label?: React.ReactNode;\n /** Show the value at the right: true for a percentage, or pass your own text. */\n showValue?: boolean | ((value: number, max: number) => React.ReactNode);\n /** Accessible text for the value, e.g. \"3 of 5 files\". */\n valueText?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n tone?: Exclude<ActivityTone, \"current\">;\n /** Moving stripes on the fill, for work that's actively running. */\n striped?: boolean;\n}\n\nexport function ProgressBar({\n value,\n max = 100,\n label,\n showValue = false,\n valueText,\n size = \"md\",\n tone = \"primary\",\n striped = false,\n className,\n \"aria-label\": ariaLabel,\n ...props\n}: ProgressBarProps) {\n const labelId = React.useId();\n const determinate = typeof value === \"number\";\n const pct = determinate ? Math.min(100, Math.max(0, (value / max) * 100)) : 0;\n const valueNode =\n determinate && showValue ? (typeof showValue === \"function\" ? showValue(value, max) : `${Math.round(pct)}%`) : null;\n\n return (\n <div className={cn(toneVar[tone], \"grid w-full gap-1.5\", className)} {...props}>\n {(label || valueNode) && (\n <div className=\"flex items-baseline justify-between gap-3 text-sm\">\n {label && <span id={labelId} className=\"font-medium text-fg\">{label}</span>}\n {valueNode && <span className=\"tabular-nums text-fg-muted\">{valueNode}</span>}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-labelledby={label ? labelId : undefined}\n aria-label={label ? undefined : (ariaLabel ?? \"Progress\")}\n aria-valuemin={determinate ? 0 : undefined}\n aria-valuemax={determinate ? max : undefined}\n aria-valuenow={determinate ? value : undefined}\n aria-valuetext={valueText}\n className={cn(\n \"relative w-full overflow-hidden rounded-full bg-[color:color-mix(in_srgb,var(--ai)_14%,var(--color-secondary-hover))]\",\n size === \"sm\" ? \"h-1\" : size === \"lg\" ? \"h-3\" : \"h-2\"\n )}\n >\n {determinate ? (\n <div\n className={cn(\n \"h-full rounded-full bg-[color:var(--ai)] transition-[width] duration-300 ease-out motion-reduce:transition-none\",\n striped &&\n \"bg-[linear-gradient(135deg,rgb(255_255_255/0.22)_25%,transparent_25%,transparent_50%,rgb(255_255_255/0.22)_50%,rgb(255_255_255/0.22)_75%,transparent_75%)] bg-[length:14px_14px] animate-[ui-stripes_0.8s_linear_infinite] motion-reduce:animate-none\"\n )}\n style={{ width: `${pct}%` }}\n />\n ) : (\n <div className=\"absolute inset-y-0 w-2/5 rounded-full bg-[color:var(--ai)] animate-[ui-indeterminate_1.4s_cubic-bezier(0.4,0,0.2,1)_infinite] motion-reduce:w-full motion-reduce:animate-[ui-breathe_1.8s_ease-in-out_infinite]\" />\n )}\n </div>\n </div>\n );\n}\n\n/* ---------- ProgressRing ---------- */\n\nexport interface ProgressRingProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** 0–max. Leave out for an indeterminate (spinning) ring. */\n value?: number;\n max?: number;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n tone?: Exclude<ActivityTone, \"current\">;\n /** What's in the middle: true for a percentage, or your own content. Default true from \"md\" up. */\n children?: React.ReactNode;\n showValue?: boolean;\n /** Accessible name, e.g. \"Storage used\". */\n label?: string;\n valueText?: string;\n}\n\nconst ringPx = { sm: 32, md: 48, lg: 72, xl: 112 } as const;\n\nexport function ProgressRing({\n value,\n max = 100,\n size = \"md\",\n tone = \"primary\",\n showValue,\n label = \"Progress\",\n valueText,\n children,\n className,\n ...props\n}: ProgressRingProps) {\n const px = ringPx[size];\n const stroke = size === \"sm\" ? 3.5 : size === \"md\" ? 4.5 : size === \"lg\" ? 6 : 8;\n const r = (px - stroke) / 2;\n const c = 2 * Math.PI * r;\n const determinate = typeof value === \"number\";\n const pct = determinate ? Math.min(100, Math.max(0, (value / max) * 100)) : 25;\n const center = children ?? ((showValue ?? size !== \"sm\") && determinate ? `${Math.round(pct)}%` : null);\n\n return (\n <div\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={determinate ? 0 : undefined}\n aria-valuemax={determinate ? max : undefined}\n aria-valuenow={determinate ? value : undefined}\n aria-valuetext={valueText}\n className={cn(toneVar[tone], \"relative inline-grid shrink-0 place-items-center\", className)}\n style={{ width: px, height: px }}\n {...props}\n >\n <svg\n width={px}\n height={px}\n viewBox={`0 0 ${px} ${px}`}\n fill=\"none\"\n aria-hidden=\"true\"\n className={cn(\"-rotate-90\", !determinate && \"animate-spin [animation-duration:1s] motion-reduce:[animation-duration:3s]\")}\n >\n <circle cx={px / 2} cy={px / 2} r={r} stroke=\"color-mix(in srgb, var(--ai) 14%, var(--color-secondary-hover))\" strokeWidth={stroke} />\n <circle\n cx={px / 2}\n cy={px / 2}\n r={r}\n stroke=\"var(--ai)\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={c}\n strokeDashoffset={c * (1 - pct / 100)}\n className=\"transition-[stroke-dashoffset] duration-500 ease-out motion-reduce:transition-none\"\n />\n </svg>\n {center !== null && (\n <span\n className={cn(\n \"absolute inset-0 grid place-items-center font-semibold tabular-nums text-fg\",\n size === \"md\" ? \"text-xs\" : size === \"lg\" ? \"text-base\" : size === \"xl\" ? \"text-2xl\" : \"text-[0.625rem]\"\n )}\n >\n {center}\n </span>\n )}\n </div>\n );\n}\n\n/* ---------- Skeleton ---------- */\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \"rect\" (default), \"circle\", \"text\" lines, \"pill\" or \"line\" (a thin rounded bar). */\n shape?: \"rect\" | \"circle\" | \"text\" | \"pill\" | \"line\";\n /** Number of lines for shape=\"text\". The last line is shorter. */\n lines?: number;\n /** Width of the last text line. Default \"62%\". */\n lastLineWidth?: string;\n /** Size shortcuts — or use classes (className=\"h-24 w-full\"). */\n width?: number | string;\n height?: number | string;\n /** Rounded corners: a CSS radius, e.g. \"0.75rem\". */\n radius?: string;\n /** \"shimmer\" (default), \"pulse\" (a gentle fade) or \"none\". */\n animation?: \"shimmer\" | \"pulse\" | \"none\";\n /** Start the shimmer a little later, so a stack of rows ripples. In ms. */\n delay?: number;\n}\n\n/** Placeholder shapes while content loads. Size it with classes, e.g. className=\"h-24 w-full\". */\nexport function Skeleton({ shape = \"rect\", lines = 3, lastLineWidth = \"62%\", width, height, radius, animation = \"shimmer\", delay, className, style, ...props }: SkeletonProps) {\n const anim = cn(animation === \"shimmer\" && \"ui-skeleton\", animation === \"pulse\" && \"ui-skeleton-pulse\", animation === \"none\" && \"ui-skeleton-still\");\n const base = { ...(width !== undefined ? { width } : {}), ...(height !== undefined ? { height } : {}), ...(radius ? { borderRadius: radius } : {}), ...(delay ? { animationDelay: `${delay}ms` } : {}), ...style };\n if (shape === \"text\") {\n return (\n <div aria-hidden=\"true\" className={cn(\"grid w-full gap-2\", className)} style={{ ...(width !== undefined ? { width } : {}), ...style }} {...props}>\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={i}\n className={cn(anim, \"h-3 rounded-full\")}\n style={{ width: i === lines - 1 && lines > 1 ? lastLineWidth : \"100%\", ...(delay !== undefined ? { animationDelay: `${delay + i * 90}ms` } : { animationDelay: `${i * 90}ms` }) }}\n />\n ))}\n </div>\n );\n }\n return (\n <div\n aria-hidden=\"true\"\n className={cn(anim, shape === \"circle\" ? \"aspect-square rounded-full\" : shape === \"pill\" ? \"rounded-full\" : shape === \"line\" ? \"h-3 rounded-full\" : \"rounded-control\", className)}\n style={base}\n {...props}\n />\n );\n}\n\n/* ---------- ActivitySteps ---------- */\n\nexport type StepStatus = \"done\" | \"active\" | \"pending\" | \"error\" | \"skipped\";\n\nexport interface ActivityStep {\n label: React.ReactNode;\n description?: React.ReactNode;\n status: StepStatus;\n /** Extra detail at the right, e.g. a duration (\"12s\"). */\n meta?: React.ReactNode;\n}\n\nexport interface ActivityStepsProps extends React.HTMLAttributes<HTMLOListElement> {\n steps: ActivityStep[];\n orientation?: \"vertical\" | \"horizontal\";\n size?: \"sm\" | \"md\";\n}\n\nconst statusText: Record<StepStatus, string> = {\n done: \"Done\",\n active: \"In progress\",\n pending: \"Not started\",\n error: \"Failed\",\n skipped: \"Skipped\",\n};\n\nfunction StepMarker({ status, px }: { status: StepStatus; px: number }) {\n const base = \"relative z-10 grid shrink-0 place-items-center rounded-full\";\n const icon = \"size-[60%]\";\n if (status === \"done\")\n return (\n <span className={cn(base, \"bg-primary text-primary-fg\")} style={{ width: px, height: px }}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.4} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={icon}>\n <path d=\"M4.5 10.5l3.5 3.5 7.5-8\" />\n </svg>\n </span>\n );\n if (status === \"error\")\n return (\n <span className={cn(base, \"bg-danger text-danger-fg\")} style={{ width: px, height: px }}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.4} strokeLinecap=\"round\" className={icon}>\n <path d=\"M10 5.5v5.5M10 14.5v.01\" />\n </svg>\n </span>\n );\n if (status === \"active\")\n return (\n <span className={cn(base, \"bg-surface [--ai:var(--color-primary)]\")} style={{ width: px, height: px }}>\n <span className=\"absolute inset-0 rounded-full border-2 border-[color:color-mix(in_srgb,var(--color-primary)_20%,transparent)]\" />\n <span className=\"ui-orbit-ring absolute inset-0 animate-spin [--ai-thickness:2px] [animation-duration:1s] motion-reduce:[animation-duration:3s]\" />\n <span className=\"size-[30%] rounded-full bg-primary\" />\n </span>\n );\n return (\n <span\n className={cn(base, \"border-2 border-border-strong bg-surface\", status === \"skipped\" && \"border-dashed\")}\n style={{ width: px, height: px }}\n />\n );\n}\n\nexport function ActivitySteps({ steps, orientation = \"vertical\", size = \"md\", className, ...props }: ActivityStepsProps) {\n const px = size === \"sm\" ? 18 : 24;\n const vertical = orientation === \"vertical\";\n return (\n <ol className={cn(vertical ? \"grid\" : \"flex w-full items-start\", className)} {...props}>\n {steps.map((step, i) => {\n const last = i === steps.length - 1;\n const lineDone = step.status === \"done\" || step.status === \"skipped\";\n return (\n <li\n key={i}\n aria-current={step.status === \"active\" ? \"step\" : undefined}\n className={cn(\"relative\", vertical ? \"flex gap-3\" : \"flex flex-1 flex-col items-center text-center\", vertical && !last && \"pb-5\")}\n >\n {/* connector to the next step */}\n {!last && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute\",\n lineDone ? \"bg-primary\" : \"bg-border\",\n vertical ? \"w-0.5\" : \"h-0.5\"\n )}\n style={\n vertical\n ? { left: px / 2 - 1, top: px + 4, bottom: 4 }\n : { top: px / 2 - 1, left: `calc(50% + ${px / 2 + 6}px)`, right: `calc(-50% + ${px / 2 + 6}px)` }\n }\n />\n )}\n <StepMarker status={step.status} px={px} />\n <div className={cn(\"min-w-0\", vertical ? \"flex-1 pt-0.5\" : \"mt-2 px-2\")}>\n <div className={cn(\"flex items-baseline gap-3\", !vertical && \"justify-center\")}>\n <span\n className={cn(\n \"font-medium\",\n size === \"sm\" ? \"text-[0.8125rem]\" : \"text-sm\",\n step.status === \"pending\" || step.status === \"skipped\" ? \"text-fg-muted\" : \"text-fg\",\n step.status === \"error\" && \"text-danger\"\n )}\n >\n {step.label}\n <span className=\"sr-only\"> — {statusText[step.status]}</span>\n </span>\n {vertical && step.meta && <span className=\"ms-auto text-xs tabular-nums text-fg-muted\">{step.meta}</span>}\n </div>\n {step.description && (\n <p className={cn(\"mt-0.5 text-[0.8125rem] leading-relaxed\", step.status === \"error\" ? \"text-danger\" : \"text-fg-muted\")}>\n {step.description}\n </p>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n );\n}\n\n/* ---------- LoadingOverlay ---------- */\n\nexport interface LoadingOverlayProps extends React.HTMLAttributes<HTMLDivElement> {\n loading: boolean;\n /** Shown under the indicator and read by screen readers. */\n label?: string;\n variant?: ActivityIndicatorProps[\"variant\"];\n /** Wait this long (ms) before showing, so quick refreshes don't flash. Default 150. */\n delay?: number;\n}\n\n/** Covers its children while loading: dims them, blocks clicks, and shows an indicator. */\nexport function LoadingOverlay({ loading, label = \"Loading\", variant = \"spinner\", delay = 150, className, children, ...props }: LoadingOverlayProps) {\n const [visible, setVisible] = React.useState(loading && delay === 0);\n React.useEffect(() => {\n if (!loading) return setVisible(false);\n const t = window.setTimeout(() => setVisible(true), delay);\n return () => window.clearTimeout(t);\n }, [loading, delay]);\n\n // inert keeps keyboard focus and clicks out of the covered content (set directly for React 18 and 19).\n const contentRef = React.useRef<HTMLDivElement>(null);\n React.useEffect(() => {\n const el = contentRef.current;\n if (!el) return;\n if (visible) el.setAttribute(\"inert\", \"\");\n else el.removeAttribute(\"inert\");\n }, [visible]);\n\n return (\n <div className={cn(\"relative\", className)} aria-busy={loading || undefined} {...props}>\n <div\n ref={contentRef}\n className={cn(\"transition-opacity duration-200\", visible && \"opacity-40\")}\n >\n {children}\n </div>\n {visible && (\n <div className=\"absolute inset-0 z-10 grid place-items-center rounded-[inherit] animate-[ui-fade-in_150ms_ease-out]\">\n <div className=\"rounded-control-lg border border-border bg-surface/90 px-4 py-3 shadow-[var(--ui-shadow-md)] backdrop-blur-sm\">\n <ActivityIndicator variant={variant} size=\"sm\" label={label} showLabel />\n </div>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\n\n/*\n * Typography — a consistent type scale and the small pieces of text every app needs:\n * Heading, Text, Lead, Link, Code, Kbd, Mark, Blockquote, List, Prose and Stat.\n * Headings use --font-heading (the body font unless you set another).\n */\n\nexport type TextTone = \"default\" | \"muted\" | \"subtle\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"inherit\";\n\nconst toneClass: Record<TextTone, string> = {\n default: \"text-fg\",\n muted: \"text-fg-muted\",\n subtle: \"text-fg-muted/75\",\n primary: \"text-primary\",\n success: \"text-success\",\n warning: \"text-warning\",\n danger: \"text-danger\",\n info: \"text-info\",\n inherit: \"text-inherit\",\n};\n\nconst weightClass = { normal: \"font-normal\", medium: \"font-medium\", semibold: \"font-semibold\", bold: \"font-bold\" } as const;\ntype Weight = keyof typeof weightClass;\nconst alignClass = { start: \"text-start\", center: \"text-center\", end: \"text-end\" } as const;\n\n/** Shared props for truncating text. */\ntype Clamp = {\n /** Cut off with \"…\" after one line. */\n truncate?: boolean;\n /** Cut off with \"…\" after this many lines. */\n lineClamp?: number;\n};\nfunction clampProps(truncate?: boolean, lineClamp?: number) {\n if (truncate) return { className: \"truncate\", style: undefined };\n if (lineClamp)\n return {\n className: \"overflow-hidden [display:-webkit-box] [-webkit-box-orient:vertical]\",\n style: { WebkitLineClamp: lineClamp } as React.CSSProperties,\n };\n return { className: \"\", style: undefined };\n}\n\n/* ---------- Heading ---------- */\n\nexport const headingSizes = cva(\"font-heading text-balance\", {\n variants: {\n size: {\n display: \"text-[clamp(2.25rem,5vw+1rem,3.5rem)] font-semibold leading-[1.02] tracking-[-0.035em]\",\n h1: \"text-[clamp(1.875rem,2.5vw+1rem,2.375rem)] font-semibold leading-[1.1] tracking-[-0.025em]\",\n h2: \"text-[1.625rem] font-semibold leading-[1.2] tracking-[-0.02em]\",\n h3: \"text-[1.3125rem] font-semibold leading-[1.3] tracking-[-0.012em]\",\n h4: \"text-[1.0625rem] font-semibold leading-[1.4] tracking-[-0.005em]\",\n h5: \"text-[0.9375rem] font-semibold leading-[1.45]\",\n h6: \"text-[0.8125rem] font-semibold leading-[1.5]\",\n },\n },\n defaultVariants: { size: \"h2\" },\n});\n\nexport type HeadingSize = \"display\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\nexport interface HeadingProps extends React.HTMLAttributes<HTMLHeadingElement>, Clamp {\n /** The heading level (h1–h6). Pick it for the page outline, not for looks. */\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n /** The look. Defaults to match the level; \"display\" is for hero titles. */\n size?: HeadingSize;\n tone?: TextTone;\n weight?: Weight;\n align?: keyof typeof alignClass;\n asChild?: boolean;\n}\n\nexport const Heading = React.forwardRef<HTMLHeadingElement, HeadingProps>(\n ({ level = 2, size, tone = \"default\", weight, align, truncate, lineClamp, asChild, className, style, ...props }, ref) => {\n const Comp: React.ElementType = asChild ? Slot : (`h${level}` as const);\n const clamp = clampProps(truncate, lineClamp);\n return (\n <Comp\n ref={ref}\n className={cn(\n headingSizes({ size: size ?? (`h${level}` as HeadingSize) }),\n toneClass[tone],\n weight && weightClass[weight],\n align && alignClass[align],\n clamp.className,\n className\n )}\n style={{ ...clamp.style, ...style }}\n {...props}\n />\n );\n }\n);\nHeading.displayName = \"Heading\";\n\n/* ---------- Text ---------- */\n\nexport const textSizes = cva(\"\", {\n variants: {\n size: {\n xl: \"text-[1.1875rem] leading-[1.6]\",\n lg: \"text-[1.0625rem] leading-[1.65]\",\n md: \"text-[0.9375rem] leading-[1.65]\",\n sm: \"text-[0.8125rem] leading-[1.55]\",\n xs: \"text-xs leading-[1.5]\",\n },\n },\n defaultVariants: { size: \"md\" },\n});\n\nexport interface TextProps extends React.HTMLAttributes<HTMLElement>, Clamp {\n as?: \"p\" | \"span\" | \"div\" | \"label\" | \"small\" | \"strong\" | \"em\" | \"time\" | \"figcaption\";\n size?: \"xl\" | \"lg\" | \"md\" | \"sm\" | \"xs\";\n tone?: TextTone;\n weight?: Weight;\n align?: keyof typeof alignClass;\n /** Tabular (equal-width) numbers, for amounts and times that line up. */\n numeric?: boolean;\n asChild?: boolean;\n}\n\nexport const Text = React.forwardRef<HTMLElement, TextProps>(\n (\n { as = \"p\", size = \"md\", tone = \"default\", weight, align, numeric, truncate, lineClamp, asChild, className, style, ...props },\n ref\n ) => {\n const Comp: React.ElementType = asChild ? Slot : as;\n const clamp = clampProps(truncate, lineClamp);\n return (\n <Comp\n ref={ref}\n className={cn(\n textSizes({ size }),\n toneClass[tone],\n weight && weightClass[weight],\n align && alignClass[align],\n numeric && \"tabular-nums\",\n as === \"p\" && \"text-pretty\",\n clamp.className,\n className\n )}\n style={{ ...clamp.style, ...style }}\n {...props}\n />\n );\n }\n);\nText.displayName = \"Text\";\n\n/** The opening paragraph of a page or section: larger and softer than body text. */\nexport const Lead = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} className={cn(\"max-w-[60ch] text-pretty text-[1.125rem] leading-[1.6] text-fg-muted\", className)} {...props} />\n )\n);\nLead.displayName = \"Lead\";\n\n/* ---------- Link ---------- */\n\nexport interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /**\n * - \"inline\": underlined, in the primary color — for links inside sentences (default)\n * - \"subtle\": body color, underline on hover — for dense lists and footers\n * - \"standalone\": medium weight, no underline until hover — for links on their own line\n */\n variant?: \"inline\" | \"subtle\" | \"standalone\";\n /** Opens in a new tab with an ↗ icon and a note for screen readers. Default: true for other sites. */\n external?: boolean;\n /** Render your framework's link: <Link asChild><NextLink href=\"/x\">…</NextLink></Link> */\n asChild?: boolean;\n}\n\nfunction isExternal(href?: string) {\n if (!href || !/^https?:\\/\\//i.test(href)) return false;\n if (typeof window === \"undefined\") return true;\n try {\n return new URL(href).host !== window.location.host;\n } catch {\n return false;\n }\n}\n\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n ({ variant = \"inline\", external, asChild, className, children, href, target, rel, ...props }, ref) => {\n const ext = external ?? isExternal(href);\n const Comp: React.ElementType = asChild ? Slot : \"a\";\n return (\n <Comp\n ref={ref}\n href={href}\n target={ext ? (target ?? \"_blank\") : target}\n rel={ext ? (rel ?? \"noopener noreferrer\") : rel}\n className={cn(\n \"rounded-[2px] underline-offset-[0.2em] transition-colors duration-100\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n variant === \"inline\" && \"text-primary underline decoration-[color:color-mix(in_srgb,var(--color-primary)_40%,transparent)] decoration-1 hover:decoration-current\",\n variant === \"subtle\" && \"text-inherit no-underline hover:text-primary hover:underline\",\n variant === \"standalone\" && \"font-medium text-primary no-underline hover:underline\",\n className\n )}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {ext && (\n <>\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.4}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ms-[0.2em] inline-block size-[0.7em] align-[0.05em]\"\n >\n <path d=\"M4 2.5h5.5V8M9.5 2.5L3 9\" />\n </svg>\n <span className=\"sr-only\"> (opens in a new tab)</span>\n </>\n )}\n </>\n )}\n </Comp>\n );\n }\n);\nLink.displayName = \"Link\";\n\n/* ---------- inline pieces ---------- */\n\n/** Inline code: file names, commands, values. */\nexport const Code = React.forwardRef<HTMLElement, React.HTMLAttributes<HTMLElement>>(({ className, ...props }, ref) => (\n <code\n ref={ref}\n className={cn(\"rounded-[0.3em] bg-secondary-hover px-[0.35em] py-[0.1em] font-mono text-[0.875em] text-fg\", className)}\n {...props}\n />\n));\nCode.displayName = \"Code\";\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n /** A shortcut as separate keys, e.g. [\"⌘\", \"K\"] — shown as key caps joined together. */\n keys?: string[];\n}\n\n/** Keyboard keys, drawn as small raised key caps (the same physical feel as Button). */\nexport const Kbd = React.forwardRef<HTMLElement, KbdProps>(({ keys, className, children, ...props }, ref) => {\n const cap = cn(\n \"inline-grid min-w-[1.6em] place-items-center rounded-[0.3em] border border-border-strong bg-surface px-[0.4em]\",\n \"font-sans text-[0.8em] font-medium leading-[1.55] text-fg shadow-[inset_0_-1.5px_0_var(--color-border-strong)]\"\n );\n if (keys?.length) {\n return (\n <kbd ref={ref} className={cn(\"inline-flex items-center gap-[0.2em] align-[0.05em]\", className)} {...props}>\n {keys.map((k, i) => (\n <kbd key={i} className={cap}>\n {k}\n </kbd>\n ))}\n </kbd>\n );\n }\n return (\n <kbd ref={ref} className={cn(cap, \"align-[0.05em]\", className)} {...props}>\n {children}\n </kbd>\n );\n});\nKbd.displayName = \"Kbd\";\n\n/** Highlighted text, like a highlighter pen — e.g. search matches. */\nexport const Mark = React.forwardRef<HTMLElement, React.HTMLAttributes<HTMLElement>>(({ className, ...props }, ref) => (\n <mark\n ref={ref}\n className={cn(\"rounded-[2px] bg-[color:color-mix(in_srgb,var(--color-warning)_28%,transparent)] px-[0.1em] text-inherit\", className)}\n {...props}\n />\n));\nMark.displayName = \"Mark\";\n\n/* ---------- Blockquote ---------- */\n\nexport interface BlockquoteProps extends React.BlockquoteHTMLAttributes<HTMLQuoteElement> {\n /** Who said it, e.g. \"Maria Santos\". */\n author?: React.ReactNode;\n /** Their role or the source, e.g. \"Product designer, Northwind\". */\n source?: React.ReactNode;\n size?: \"md\" | \"lg\";\n}\n\nexport const Blockquote = React.forwardRef<HTMLQuoteElement, BlockquoteProps>(\n ({ author, source, size = \"md\", className, children, ...props }, ref) => {\n const quote = (\n <blockquote\n ref={ref}\n className={cn(\n \"border-s-[3px] border-primary ps-5 text-pretty text-fg\",\n size === \"lg\" ? \"font-heading text-[1.3125rem] leading-[1.5] tracking-[-0.01em]\" : \"text-[1.0625rem] leading-[1.65]\",\n className\n )}\n {...props}\n >\n {children}\n </blockquote>\n );\n if (!author && !source) return quote;\n return (\n <figure className=\"grid gap-3\">\n {quote}\n <figcaption className=\"ps-5 text-sm text-fg-muted\">\n {author && <span className=\"font-medium text-fg\">{author}</span>}\n {author && source && <span aria-hidden=\"true\">, </span>}\n {source}\n </figcaption>\n </figure>\n );\n }\n);\nBlockquote.displayName = \"Blockquote\";\n\n/* ---------- List ---------- */\n\ntype ListVariant = \"bullet\" | \"number\" | \"check\" | \"none\";\nconst ListContext = React.createContext<ListVariant>(\"bullet\");\n\nexport interface ListProps extends React.HTMLAttributes<HTMLUListElement | HTMLOListElement> {\n /** \"bullet\" (default), \"number\", \"check\" (a check mark per item) or \"none\". */\n variant?: ListVariant;\n /** Space between items. */\n spacing?: \"tight\" | \"normal\" | \"loose\";\n size?: \"md\" | \"sm\";\n}\n\nexport function List({ variant = \"bullet\", spacing = \"normal\", size = \"md\", className, ...props }: ListProps) {\n const Comp = variant === \"number\" ? \"ol\" : \"ul\";\n return (\n <ListContext.Provider value={variant}>\n <Comp\n className={cn(\n \"grid text-fg\",\n size === \"sm\" ? \"text-[0.8125rem] leading-[1.55]\" : \"text-[0.9375rem] leading-[1.6]\",\n spacing === \"tight\" ? \"gap-1\" : spacing === \"loose\" ? \"gap-3\" : \"gap-2\",\n variant === \"bullet\" && \"list-disc ps-5 marker:text-fg-muted\",\n variant === \"number\" && \"list-decimal ps-5 marker:text-fg-muted marker:tabular-nums\",\n (variant === \"check\" || variant === \"none\") && \"list-none\",\n className\n )}\n {...(props as React.HTMLAttributes<HTMLUListElement>)}\n />\n </ListContext.Provider>\n );\n}\n\nexport function ListItem({ className, children, ...props }: React.LiHTMLAttributes<HTMLLIElement>) {\n const variant = React.useContext(ListContext);\n if (variant === \"check\") {\n return (\n <li className={cn(\"flex gap-2.5\", className)} {...props}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"mt-[0.3em] size-[1em] shrink-0 text-success\">\n <path d=\"M4.5 10.5l3.5 3.5 7.5-8\" />\n </svg>\n <span className=\"min-w-0\">{children}</span>\n </li>\n );\n }\n return (\n <li className={cn(\"ps-0.5\", className)} {...props}>\n {children}\n </li>\n );\n}\n\n/* ---------- Prose ---------- */\n\nexport interface ProseProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Base size of the long-form text. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Render HTML you trust or have sanitized (e.g. from the Editor, a CMS or Markdown). */\n html?: string;\n}\n\n/** Styles long-form content — articles, docs, CMS or Markdown output — with the same scale as the rest. */\nexport const Prose = React.forwardRef<HTMLDivElement, ProseProps>(({ size = \"md\", html, className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"ui-prose max-w-[68ch]\", size === \"sm\" ? \"text-[0.875rem]\" : size === \"lg\" ? \"text-[1.0625rem]\" : \"\", className)}\n {...(html !== undefined ? { dangerouslySetInnerHTML: { __html: html } } : { children })}\n {...props}\n />\n));\nProse.displayName = \"Prose\";\n\n/* ---------- Stat ---------- */\n\nexport interface StatProps extends React.HTMLAttributes<HTMLElement> {\n label: React.ReactNode;\n value: React.ReactNode;\n /** The change, e.g. \"+12.5%\". */\n change?: React.ReactNode;\n /** Direction of the change. Colors it and adds an arrow. */\n trend?: \"up\" | \"down\" | \"flat\";\n /** When \"down\" is good (costs, errors, response time), swap the colors. */\n invertTrend?: boolean;\n /** Context for the number, e.g. \"vs last month\". */\n description?: React.ReactNode;\n size?: \"md\" | \"lg\";\n}\n\nconst StatGroupContext = React.createContext(false);\n\nexport interface StatGroupProps extends React.HTMLAttributes<HTMLDListElement> {\n /** Columns on wider screens. Stats stack on phones. */\n columns?: 2 | 3 | 4;\n /** Draw dividers between stats. */\n divided?: boolean;\n}\n\n/** Lays out several Stats as one description list. */\nexport function StatGroup({ columns = 3, divided = false, className, ...props }: StatGroupProps) {\n return (\n <StatGroupContext.Provider value={true}>\n <dl\n className={cn(\n \"grid gap-6\",\n columns === 2 ? \"sm:grid-cols-2\" : columns === 4 ? \"sm:grid-cols-2 lg:grid-cols-4\" : \"sm:grid-cols-3\",\n divided && \"gap-0 divide-y divide-border sm:divide-x sm:divide-y-0 [&>*]:py-4 sm:[&>*]:px-6 sm:[&>*:first-child]:ps-0\",\n className\n )}\n {...props}\n />\n </StatGroupContext.Provider>\n );\n}\n\n/** A key number with its label and change — for dashboards and summaries. */\nexport function Stat({ label, value, change, trend, invertTrend = false, description, size = \"md\", className, ...props }: StatProps) {\n // Inside a StatGroup this is a group within its <dl>; on its own it is its own <dl>.\n const inGroup = React.useContext(StatGroupContext);\n const Comp: React.ElementType = inGroup ? \"div\" : \"dl\";\n const good = trend === \"flat\" || trend === undefined ? null : (trend === \"up\") !== invertTrend;\n const trendWord = trend === \"up\" ? \"Up\" : trend === \"down\" ? \"Down\" : trend === \"flat\" ? \"No change\" : \"\";\n return (\n <Comp className={cn(\"grid content-start gap-1\", className)} {...props}>\n <dt className=\"text-[0.8125rem] font-medium text-fg-muted\">{label}</dt>\n <dd className=\"flex flex-wrap items-baseline gap-x-2.5 gap-y-1\">\n <span\n className={cn(\n \"font-heading font-semibold tabular-nums tracking-[-0.02em] text-fg\",\n size === \"lg\" ? \"text-[2.25rem] leading-[1.1]\" : \"text-[1.625rem] leading-[1.2]\"\n )}\n >\n {value}\n </span>\n {change !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center gap-0.5 text-[0.8125rem] font-medium tabular-nums\",\n good === null ? \"text-fg-muted\" : good ? \"text-success\" : \"text-danger\"\n )}\n >\n {trend && trend !== \"flat\" && (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className={cn(\"size-3\", trend === \"down\" && \"rotate-180\")}>\n <path d=\"M6 9.5V2.5M3 5.5l3-3 3 3\" />\n </svg>\n )}\n {trendWord && <span className=\"sr-only\">{trendWord} </span>}\n {change}\n </span>\n )}\n </dd>\n {description && <dd className=\"text-[0.8125rem] text-fg-muted\">{description}</dd>}\n </Comp>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Avatar — a person's (or team's) picture, with friendly fallbacks: initials in a color\n * picked from their name, or an icon. Plus AvatarGroup (overlapping stack with \"+3\"),\n * AvatarLabel (avatar with name and details) and AvatarUpload (choose and preview a photo).\n */\n\nconst sizes = { xs: 20, sm: 28, md: 36, lg: 48, xl: 64, \"2xl\": 96 } as const;\nexport type AvatarSize = keyof typeof sizes;\nexport type AvatarStatus = \"online\" | \"away\" | \"busy\" | \"offline\";\n\nconst statusColor: Record<AvatarStatus, string> = {\n online: \"bg-success\",\n away: \"bg-warning\",\n busy: \"bg-danger\",\n offline: \"bg-surface shadow-[inset_0_0_0_2px_var(--color-fg-muted)]\",\n};\nconst statusWord: Record<AvatarStatus, string> = { online: \"online\", away: \"away\", busy: \"busy\", offline: \"offline\" };\n\n/** \"Maria Santos\" → \"MS\", \"cher\" → \"C\". */\nexport function getInitials(name = \"\") {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n if (!words.length) return \"\";\n const first = Array.from(words[0])[0] ?? \"\";\n const last = words.length > 1 ? (Array.from(words[words.length - 1])[0] ?? \"\") : \"\";\n return (first + last).toUpperCase();\n}\n\n/** The same name always gets the same hue. */\nfunction hueFor(name: string) {\n let h = 0;\n for (const ch of name) h = (h * 31 + ch.codePointAt(0)!) >>> 0;\n const hues = [8, 28, 45, 145, 170, 195, 215, 250, 275, 330];\n return hues[h % hues.length];\n}\n\ntype GroupContextValue = { size: AvatarSize; shape: \"circle\" | \"square\" } | null;\nconst GroupContext = React.createContext<GroupContextValue>(null);\n\n/* ---------- Avatar ---------- */\n\nexport interface AvatarProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /** Image URL. If it's missing or fails to load, the fallback shows. */\n src?: string | null;\n /** The person's name: used for the alt text, initials and color. */\n name?: string;\n size?: AvatarSize;\n /** \"circle\" for people, \"square\" (rounded) for teams, companies and projects. */\n shape?: \"circle\" | \"square\";\n /** Presence dot in the corner. */\n status?: AvatarStatus;\n /** Shown when there's no image and no name (or instead of initials). */\n icon?: IconInput;\n /** Small content in the top corner, e.g. an unread count. */\n badge?: React.ReactNode;\n /** A ring around it, e.g. to mark the selected person. */\n ring?: boolean;\n /** Hide from screen readers when the name is already written next to it. */\n decorative?: boolean;\n /** Custom fallback content (overrides initials and icon). */\n fallback?: React.ReactNode;\n}\n\nconst PersonIcon = () => (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\" className=\"translate-y-[8%]\">\n <circle cx=\"12\" cy=\"8\" r=\"4.2\" />\n <path d=\"M3.5 21c.7-4.4 4.2-7 8.5-7s7.8 2.6 8.5 7z\" />\n </svg>\n);\n\nexport const Avatar = React.forwardRef<HTMLSpanElement, AvatarProps>(\n (\n { src, name = \"\", size: sizeProp, shape: shapeProp, status, icon, badge, ring, decorative, fallback, className, style, ...props },\n ref\n ) => {\n const group = React.useContext(GroupContext);\n const size = sizeProp ?? group?.size ?? \"md\";\n const shape = shapeProp ?? group?.shape ?? \"circle\";\n const px = sizes[size];\n\n const [loaded, setLoaded] = React.useState<\"loading\" | \"ok\" | \"error\">(src ? \"loading\" : \"error\");\n React.useEffect(() => setLoaded(src ? \"loading\" : \"error\"), [src]);\n\n const initials = getInitials(name);\n const showImage = !!src && loaded !== \"error\";\n const label = [name || \"Unknown user\", status && `(${statusWord[status]})`].filter(Boolean).join(\" \");\n const radius = shape === \"circle\" ? \"rounded-full\" : px >= 48 ? \"rounded-[22%]\" : \"rounded-[25%]\";\n\n return (\n <span\n ref={ref}\n role={decorative ? undefined : \"img\"}\n aria-label={decorative ? undefined : label}\n aria-hidden={decorative || undefined}\n className={cn(\"relative inline-flex shrink-0 align-middle\", className)}\n style={{ width: px, height: px, ...style }}\n {...props}\n >\n <span\n className={cn(\n \"grid size-full select-none place-items-center overflow-hidden font-semibold leading-none\",\n radius,\n !showImage || loaded !== \"ok\" ? (initials && !icon && !fallback ? \"ui-avatar-initials\" : \"bg-secondary-hover text-fg-muted\") : \"\",\n ring && \"ring-2 ring-primary ring-offset-2 ring-offset-[color:var(--av-ring,var(--color-surface))]\",\n // A hairline edge so light photos don't blend into the page.\n showImage && \"shadow-[inset_0_0_0_1px_rgb(0_0_0/0.06)]\"\n )}\n style={{ [\"--av-h\" as string]: hueFor(name || \"?\"), fontSize: Math.max(8, Math.round(px * (initials.length > 1 ? 0.38 : 0.44))) }}\n >\n {(!showImage || loaded !== \"ok\") && (\n <span aria-hidden=\"true\" className=\"col-start-1 row-start-1 grid size-full place-items-center [&>i]:text-[0.95em] [&>svg]:size-[58%]\">\n {fallback ?? (icon ? renderIcon(icon) : initials || <PersonIcon />)}\n </span>\n )}\n {showImage && (\n <img\n src={src!}\n alt=\"\"\n loading=\"lazy\"\n decoding=\"async\"\n draggable={false}\n onLoad={() => setLoaded(\"ok\")}\n onError={() => setLoaded(\"error\")}\n className={cn(\n \"col-start-1 row-start-1 size-full object-cover transition-opacity duration-200\",\n loaded === \"ok\" ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n )}\n </span>\n\n {status && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute bottom-0 end-0 rounded-full ring-2 ring-[color:var(--av-ring,var(--color-surface))]\",\n statusColor[status],\n shape === \"square\" && \"-bottom-[6%] -end-[6%]\"\n )}\n style={{ width: Math.max(7, px * 0.27), height: Math.max(7, px * 0.27) }}\n />\n )}\n {badge !== undefined && badge !== null && badge !== false && (\n <span\n className={cn(\n \"absolute -end-1 -top-1 grid min-w-[1.25rem] place-items-center rounded-full bg-danger px-1 text-[0.6875rem] font-semibold leading-5 text-danger-fg tabular-nums\",\n \"ring-2 ring-[color:var(--av-ring,var(--color-surface))]\"\n )}\n >\n {badge}\n </span>\n )}\n </span>\n );\n }\n);\nAvatar.displayName = \"Avatar\";\n\n/* ---------- AvatarGroup ---------- */\n\nexport interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: AvatarSize;\n shape?: \"circle\" | \"square\";\n /** Show at most this many; the rest become a \"+N\" avatar. */\n max?: number;\n /** How much they overlap. */\n spacing?: \"tight\" | \"normal\" | \"loose\";\n /** Called when the \"+N\" avatar is clicked, e.g. to open the full list. */\n onOverflowClick?: () => void;\n}\n\nexport function AvatarGroup({\n size = \"md\",\n shape = \"circle\",\n max,\n spacing = \"normal\",\n onOverflowClick,\n className,\n children,\n \"aria-label\": ariaLabel,\n ...props\n}: AvatarGroupProps) {\n const items = React.Children.toArray(children).filter(React.isValidElement) as React.ReactElement<AvatarProps>[];\n const visible = max !== undefined && items.length > max ? items.slice(0, Math.max(1, max - 1)) : items;\n const hidden = items.slice(visible.length);\n const px = sizes[size];\n const overlap = Math.round(px * (spacing === \"tight\" ? 0.38 : spacing === \"loose\" ? 0.12 : 0.26));\n const hiddenNames = hidden.map((a) => a.props.name).filter(Boolean).join(\", \");\n const radius = shape === \"circle\" ? \"rounded-full\" : \"rounded-[25%]\";\n\n const overflowClass = cn(\n \"relative grid shrink-0 place-items-center bg-secondary-hover font-semibold text-fg-muted tabular-nums\",\n \"ring-2 ring-[color:var(--av-ring,var(--color-surface))]\",\n radius\n );\n const overflowStyle = { width: px, height: px, marginInlineStart: -overlap, fontSize: Math.max(9, Math.round(px * 0.34)) };\n\n return (\n <GroupContext.Provider value={{ size, shape }}>\n <div\n role=\"group\"\n aria-label={ariaLabel ?? `${items.length} people`}\n className={cn(\"flex items-center\", className)}\n {...props}\n >\n {visible.map((child, i) => (\n <span\n key={child.key ?? i}\n className={cn(\"relative inline-flex ring-2 ring-[color:var(--av-ring,var(--color-surface))]\", radius)}\n style={{ marginInlineStart: i === 0 ? 0 : -overlap }}\n >\n {child}\n </span>\n ))}\n {hidden.length > 0 &&\n (onOverflowClick ? (\n <button\n type=\"button\"\n onClick={onOverflowClick}\n title={hiddenNames}\n aria-label={`${hidden.length} more: ${hiddenNames}`}\n className={cn(overflowClass, \"cursor-pointer hover:bg-border hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\")}\n style={overflowStyle}\n >\n +{hidden.length}\n </button>\n ) : (\n <span role=\"img\" title={hiddenNames} aria-label={`${hidden.length} more: ${hiddenNames}`} className={overflowClass} style={overflowStyle}>\n +{hidden.length}\n </span>\n ))}\n </div>\n </GroupContext.Provider>\n );\n}\n\n/* ---------- AvatarLabel ---------- */\n\nexport interface AvatarLabelProps extends Omit<AvatarProps, \"decorative\"> {\n /** A second line, e.g. a role or email. */\n description?: React.ReactNode;\n /** Something at the end, e.g. a Pill or a button. */\n end?: React.ReactNode;\n}\n\n/** An avatar with the name (and a detail) beside it — for lists, comments and menus. */\nexport function AvatarLabel({ name = \"\", description, end, size = \"md\", className, ...avatarProps }: AvatarLabelProps) {\n const small = size === \"xs\" || size === \"sm\";\n return (\n <div className={cn(\"flex min-w-0 items-center\", small ? \"gap-2\" : \"gap-3\", className)}>\n <Avatar name={name} size={size} decorative {...avatarProps} />\n <div className=\"min-w-0 flex-1\">\n <p className={cn(\"truncate font-medium text-fg\", small ? \"text-[0.8125rem]\" : size === \"xl\" || size === \"2xl\" ? \"text-base\" : \"text-sm\")}>\n {name}\n {avatarProps.status && <span className=\"sr-only\"> ({statusWord[avatarProps.status]})</span>}\n </p>\n {description && <p className={cn(\"truncate text-fg-muted\", small ? \"text-xs\" : \"text-[0.8125rem]\")}>{description}</p>}\n </div>\n {end}\n </div>\n );\n}\n\n/* ---------- AvatarUpload ---------- */\n\nexport interface AvatarUploadProps {\n /** Current picture URL (e.g. from the server). */\n value?: string | null;\n /** Called with the chosen file, or null when removed. */\n onChange?: (file: File | null) => void;\n /** The person's name, for the fallback initials. */\n name?: string;\n size?: \"lg\" | \"xl\" | \"2xl\";\n shape?: \"circle\" | \"square\";\n /** Largest file allowed, in MB. Default 5. */\n maxSizeMB?: number;\n accept?: string;\n /** Adds a file input with this name so the photo is sent with a normal form. */\n inputName?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/** Choose, preview and remove a profile photo — by clicking or dropping an image on it. */\nexport function AvatarUpload({\n value = null,\n onChange,\n name = \"\",\n size = \"xl\",\n shape = \"circle\",\n maxSizeMB = 5,\n accept = \"image/png, image/jpeg, image/webp, image/gif\",\n inputName,\n disabled = false,\n className,\n}: AvatarUploadProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [preview, setPreview] = React.useState<string | null>(value);\n const [error, setError] = React.useState<string>();\n const [dragging, setDragging] = React.useState(false);\n const errorId = React.useId();\n\n React.useEffect(() => setPreview(value), [value]);\n // Free the preview URL when it's replaced or the component goes away.\n React.useEffect(() => () => {\n if (preview?.startsWith(\"blob:\")) URL.revokeObjectURL(preview);\n }, [preview]);\n\n /** Check and use a file. Returns false (and shows why) if it isn't usable. */\n const take = (file: File | undefined | null): boolean => {\n if (!file) return false;\n if (!file.type.startsWith(\"image/\")) {\n setError(\"Choose an image file — PNG, JPG, WebP or GIF.\");\n return false;\n }\n if (file.size > maxSizeMB * 1024 * 1024) {\n setError(`Choose an image under ${maxSizeMB} MB. This one is ${(file.size / 1024 / 1024).toFixed(1)} MB.`);\n return false;\n }\n setError(undefined);\n setPreview(URL.createObjectURL(file));\n onChange?.(file);\n return true;\n };\n\n const remove = () => {\n setPreview(null);\n setError(undefined);\n if (inputRef.current) inputRef.current.value = \"\";\n onChange?.(null);\n };\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-4\", className)}>\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n onDragOver={(e) => {\n e.preventDefault();\n if (!disabled) setDragging(true);\n }}\n onDragLeave={() => setDragging(false)}\n onDrop={(e) => {\n e.preventDefault();\n setDragging(false);\n if (disabled) return;\n const files = e.dataTransfer.files;\n if (!take(files?.[0])) return;\n // Put the dropped file in the input too, so a normal form post includes it.\n try {\n if (inputRef.current) inputRef.current.files = files;\n } catch {\n /* older browsers */\n }\n }}\n aria-label={preview ? \"Change photo\" : \"Upload photo\"}\n aria-describedby={error ? errorId : undefined}\n className={cn(\n \"group relative shrink-0 cursor-pointer outline-none disabled:cursor-not-allowed disabled:opacity-60\",\n shape === \"circle\" ? \"rounded-full\" : \"rounded-[22%]\",\n \"focus-visible:ring-3 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-bg\",\n dragging && \"ring-3 ring-primary ring-offset-2 ring-offset-bg\"\n )}\n >\n <Avatar src={preview} name={name} size={size} shape={shape} decorative />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute inset-0 grid place-items-center bg-black/45 text-white opacity-0 transition-opacity duration-150\",\n shape === \"circle\" ? \"rounded-full\" : \"rounded-[22%]\",\n \"group-hover:opacity-100 group-focus-visible:opacity-100\",\n dragging && \"opacity-100\"\n )}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.7} strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"size-[34%]\">\n <path d=\"M4 8.5A2 2 0 0 1 6 6.5h1.8L9.3 4.5h5.4l1.5 2H18a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2z\" />\n <circle cx=\"12\" cy=\"12.5\" r=\"3.4\" />\n </svg>\n </span>\n </button>\n <div className=\"grid gap-1.5\">\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => inputRef.current?.click()}\n className=\"cursor-pointer text-sm font-medium text-primary hover:underline disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {preview ? \"Change photo\" : \"Upload photo\"}\n </button>\n {preview && !disabled && (\n <>\n <span aria-hidden=\"true\" className=\"text-fg-muted\">·</span>\n <button type=\"button\" onClick={remove} className=\"cursor-pointer text-sm font-medium text-fg-muted hover:text-danger hover:underline\">\n Remove\n </button>\n </>\n )}\n </div>\n <p className=\"text-xs text-fg-muted\">PNG, JPG, WebP or GIF, up to {maxSizeMB} MB. You can also drop an image on the picture.</p>\n {error && (\n <p id={errorId} role=\"alert\" className=\"text-[0.8125rem] text-danger\">\n {error}\n </p>\n )}\n </div>\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n name={inputName}\n disabled={disabled}\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"sr-only\"\n onChange={(e) => {\n if (!take(e.target.files?.[0])) e.target.value = \"\";\n }}\n />\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Card — a container that groups one topic: a summary, a setting, an item in a grid.\n * Build it from CardHeader / CardContent / CardFooter / CardMedia, make the whole card\n * clickable with CardLink (other buttons inside keep working), or use ChoiceCard for\n * picking between options (a plan, a delivery method) with real radio buttons or checkboxes.\n */\n\nexport const cardVariants = cva(\"relative flex min-w-0 overflow-hidden rounded-card text-fg\", {\n variants: {\n variant: {\n /** A border, no shadow — the default, calm on busy pages. */\n outline: \"border border-border bg-surface\",\n /** A soft shadow, for cards that sit on a tinted page or need to stand out. */\n elevated: \"border border-border/70 bg-surface shadow-[var(--ui-shadow-md)]\",\n /** A tinted fill, no border — for grouping inside another surface. */\n filled: \"bg-secondary-hover\",\n /** No box at all; keeps the spacing. */\n ghost: \"\",\n },\n tone: {\n default: \"\",\n /** For \"danger zone\" settings. */\n danger: \"border-[color:color-mix(in_srgb,var(--color-danger)_40%,transparent)]\",\n /** Draws attention, e.g. a recommended plan. */\n primary: \"border-primary\",\n },\n orientation: {\n vertical: \"flex-col\",\n horizontal: \"flex-col sm:flex-row\",\n },\n /** Hover and press feedback, for cards that act as a single link or button. */\n interactive: {\n true: [\n \"transition-[border-color,box-shadow,translate] duration-150 ease-out\",\n \"hover:border-border-strong hover:shadow-[var(--ui-shadow-md)] active:translate-y-px\",\n \"has-[[data-card-link]:focus-visible]:outline-2 has-[[data-card-link]:focus-visible]:outline-offset-2 has-[[data-card-link]:focus-visible]:outline-ring\",\n \"motion-reduce:transition-none motion-reduce:active:translate-y-0\",\n ],\n false: \"\",\n },\n },\n compoundVariants: [{ variant: \"elevated\", interactive: true, class: \"hover:shadow-[var(--ui-shadow-lg)]\" }],\n defaultVariants: { variant: \"outline\", tone: \"default\", orientation: \"vertical\", interactive: false },\n});\n\ntype Padding = \"none\" | \"sm\" | \"md\" | \"lg\";\nconst PaddingContext = React.createContext<Padding>(\"md\");\nconst padX: Record<Padding, string> = { none: \"px-0\", sm: \"px-4\", md: \"px-5\", lg: \"px-7\" };\nconst padTop: Record<Padding, string> = { none: \"pt-0\", sm: \"pt-4\", md: \"pt-5\", lg: \"pt-7\" };\nconst padBottom: Record<Padding, string> = { none: \"pb-0\", sm: \"pb-4\", md: \"pb-5\", lg: \"pb-7\" };\nconst padBottomIfLast: Record<Padding, string> = { none: \"\", sm: \"last:pb-4\", md: \"last:pb-5\", lg: \"last:pb-7\" };\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {\n /** Inner spacing for header, content and footer. */\n padding?: Padding;\n /** Render as another element, e.g. <Card asChild><article>…</article></Card>. */\n asChild?: boolean;\n}\n\nexport const Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ variant, tone, orientation, interactive, padding = \"md\", asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"div\";\n return (\n <PaddingContext.Provider value={padding}>\n <Comp\n ref={ref}\n data-orientation={orientation ?? \"vertical\"}\n className={cn(\"group/card\", cardVariants({ variant, tone, orientation, interactive }), className)}\n {...props}\n />\n </PaddingContext.Provider>\n );\n }\n);\nCard.displayName = \"Card\";\n\n/* ---------- parts ---------- */\n\nexport interface CardHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Shorthand for <CardTitle>. */\n title?: React.ReactNode;\n /** Shorthand for <CardDescription>. */\n description?: React.ReactNode;\n /** Something at the top right, e.g. a menu button or a Pill. */\n action?: React.ReactNode;\n icon?: IconInput;\n /** Heading level for the title shorthand. Default 3. */\n titleLevel?: 2 | 3 | 4;\n}\n\nexport const CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({ title, description, action, icon, titleLevel = 3, className, children, ...props }, ref) => {\n const pad = React.useContext(PaddingContext);\n return (\n <div ref={ref} data-card-header=\"\" className={cn(\"flex items-start gap-3\", padX[pad], padTop[pad], \"pb-0\", padBottomIfLast[pad], className)} {...props}>\n {icon && (\n <span className=\"grid size-9 shrink-0 place-items-center rounded-control bg-secondary-hover text-fg-muted [&_i]:text-lg [&_svg]:size-[1.15rem]\">\n {renderIcon(icon)}\n </span>\n )}\n <div className=\"grid min-w-0 flex-1 gap-1\">\n {title !== undefined && <CardTitle as={`h${titleLevel}` as \"h3\"}>{title}</CardTitle>}\n {description !== undefined && <CardDescription>{description}</CardDescription>}\n {children}\n </div>\n {action && <div className=\"relative z-10 -my-1 shrink-0\">{action}</div>}\n </div>\n );\n }\n);\nCardHeader.displayName = \"CardHeader\";\n\nexport const CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement> & { as?: \"h2\" | \"h3\" | \"h4\" | \"p\" }\n>(({ as: Comp = \"h3\", className, ...props }, ref) => (\n <Comp ref={ref} className={cn(\"font-heading text-[1.0625rem] font-semibold leading-snug tracking-[-0.01em] text-balance text-fg\", className)} {...props} />\n));\nCardTitle.displayName = \"CardTitle\";\n\nexport const CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => <p ref={ref} className={cn(\"text-sm leading-relaxed text-fg-muted text-pretty\", className)} {...props} />\n);\nCardDescription.displayName = \"CardDescription\";\n\nexport const CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => {\n const pad = React.useContext(PaddingContext);\n return <div ref={ref} className={cn(\"flex-1 text-[0.9375rem] leading-relaxed\", padX[pad], padTop[pad], padBottom[pad], className)} {...props} />;\n }\n);\nCardContent.displayName = \"CardContent\";\n\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** A line above the footer, with a tinted background — for settings cards with a Save button. */\n divided?: boolean;\n /** Where the content sits. Default \"end\" (buttons on the right). */\n justify?: \"start\" | \"between\" | \"end\";\n}\n\nexport const CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({ divided = false, justify = \"end\", className, ...props }, ref) => {\n const pad = React.useContext(PaddingContext);\n return (\n <div\n ref={ref}\n className={cn(\n \"relative z-10 flex flex-wrap items-center gap-2\",\n justify === \"start\" ? \"justify-start\" : justify === \"between\" ? \"justify-between\" : \"justify-end\",\n padX[pad],\n divided ? \"mt-auto border-t border-border bg-secondary-hover/50 py-3\" : cn(\"pt-0\", padBottom[pad]),\n // Directly under a header (no content in between), leave some room.\n !divided && \"[[data-card-header]+&]:pt-4\",\n divided && \"[[data-card-header]+&]:mt-5\",\n className\n )}\n {...props}\n />\n );\n }\n);\nCardFooter.displayName = \"CardFooter\";\n\nexport interface CardMediaProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Image URL, or pass your own content (e.g. <img>, <video>, a chart) as children. */\n src?: string;\n alt?: string;\n /** Shape of the media area, e.g. \"16/9\", \"4/3\", \"1/1\". Default \"16/9\". */\n ratio?: string;\n /** Inset from the card's edges with rounded corners, instead of edge to edge. */\n inset?: boolean;\n}\n\nexport const CardMedia = React.forwardRef<HTMLDivElement, CardMediaProps>(\n ({ src, alt = \"\", ratio = \"16/9\", inset = false, className, children, style, ...props }, ref) => {\n const pad = React.useContext(PaddingContext);\n return (\n <div\n ref={ref}\n data-card-media=\"\"\n className={cn(\n \"relative shrink-0 overflow-hidden bg-secondary-hover aspect-[var(--card-ratio)]\",\n inset && cn(\"mx-auto mt-2 w-[calc(100%-1rem)] rounded-[calc(var(--radius-card)-0.25rem)]\", pad === \"none\" && \"mt-0 w-full rounded-none\"),\n // Beside the content in a horizontal card: a column that fills the height.\n \"group-data-[orientation=horizontal]/card:sm:aspect-auto group-data-[orientation=horizontal]/card:sm:w-2/5\",\n inset && \"group-data-[orientation=horizontal]/card:sm:my-2 group-data-[orientation=horizontal]/card:sm:ms-2\",\n className\n )}\n style={{ [\"--card-ratio\" as string]: ratio.replace(\"/\", \" / \"), ...style }}\n {...props}\n >\n {src ? <img src={src} alt={alt} loading=\"lazy\" decoding=\"async\" className=\"size-full object-cover\" /> : children}\n </div>\n );\n }\n);\nCardMedia.displayName = \"CardMedia\";\n\n/**\n * Makes the whole card clickable while keeping it accessible: put it around the card's\n * title text. Its click area stretches over the card; buttons in the header action and\n * footer stay clickable on top. Works with framework links via asChild.\n */\nexport const CardLink = React.forwardRef<HTMLAnchorElement, React.AnchorHTMLAttributes<HTMLAnchorElement> & { asChild?: boolean }>(\n ({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : \"a\";\n return (\n <Comp\n ref={ref}\n data-card-link=\"\"\n className={cn(\"outline-none after:absolute after:inset-0 after:content-[''] hover:text-primary\", className)}\n {...props}\n />\n );\n }\n);\nCardLink.displayName = \"CardLink\";\n\n/* ---------- ChoiceCard ---------- */\n\ntype ChoiceContextValue = {\n type: \"single\" | \"multiple\";\n name: string;\n isChecked: (value: string) => boolean;\n toggle: (value: string, checked: boolean) => void;\n disabled: boolean;\n invalid: boolean;\n};\nconst ChoiceContext = React.createContext<ChoiceContextValue | null>(null);\n\ntype ChoiceGroupBase = Omit<React.HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> & {\n /** Form field name (a radio group needs one). Generated if you leave it out. */\n name?: string;\n /** Columns from the small breakpoint up; stacks on phones. */\n columns?: 1 | 2 | 3 | 4;\n disabled?: boolean;\n invalid?: boolean;\n required?: boolean;\n};\n\nexport type ChoiceCardGroupProps =\n | (ChoiceGroupBase & {\n type?: \"single\";\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n })\n | (ChoiceGroupBase & {\n type: \"multiple\";\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n });\n\n/** A set of ChoiceCards backed by real radio buttons (single) or checkboxes (multiple). */\nexport function ChoiceCardGroup(props: ChoiceCardGroupProps) {\n const {\n type = \"single\",\n name: nameProp,\n columns = 3,\n disabled = false,\n invalid = false,\n required,\n value: valueProp,\n defaultValue,\n onValueChange,\n className,\n ...rest\n } = props as ChoiceGroupBase & {\n type?: \"single\" | \"multiple\";\n value?: string | string[] | null;\n defaultValue?: string | string[] | null;\n onValueChange?: (v: never) => void;\n };\n const auto = React.useId();\n const name = nameProp ?? `choice-${auto}`;\n const toArray = (v: string | string[] | null | undefined) => (v == null ? [] : Array.isArray(v) ? v : [v]);\n const [uncontrolled, setUncontrolled] = React.useState<string[]>(() => toArray(defaultValue));\n const controlled = valueProp !== undefined;\n const selected = controlled ? toArray(valueProp) : uncontrolled;\n\n const toggle = (v: string, checked: boolean) => {\n const next = type === \"multiple\" ? (checked ? [...selected, v] : selected.filter((x) => x !== v)) : [v];\n if (!controlled) setUncontrolled(next);\n (onValueChange as ((x: unknown) => void) | undefined)?.(type === \"multiple\" ? next : v);\n };\n\n return (\n <ChoiceContext.Provider value={{ type, name, isChecked: (v) => selected.includes(v), toggle, disabled, invalid }}>\n <div\n role={type === \"single\" ? \"radiogroup\" : \"group\"}\n aria-required={type === \"single\" ? required : undefined}\n aria-invalid={invalid || undefined}\n className={cn(\n \"grid gap-3\",\n columns === 2 && \"sm:grid-cols-2\",\n columns === 3 && \"sm:grid-cols-3\",\n columns === 4 && \"sm:grid-cols-2 lg:grid-cols-4\",\n className\n )}\n {...rest}\n />\n </ChoiceContext.Provider>\n );\n}\n\nexport interface ChoiceCardProps extends Omit<React.LabelHTMLAttributes<HTMLLabelElement>, \"title\"> {\n value: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n icon?: IconInput;\n /** Extra detail, e.g. a price. */\n meta?: React.ReactNode;\n /** A small tag like \"Recommended\". */\n badge?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport function ChoiceCard({ value, title, description, icon, meta, badge, disabled, className, children, ...props }: ChoiceCardProps) {\n const ctx = React.useContext(ChoiceContext);\n if (!ctx) throw new Error(\"<ChoiceCard> must be used inside <ChoiceCardGroup>.\");\n const checked = ctx.isChecked(value);\n const off = disabled || ctx.disabled;\n const single = ctx.type === \"single\";\n const descId = React.useId();\n\n return (\n <label\n className={cn(\n \"relative flex cursor-pointer gap-3 rounded-card border bg-surface p-4 text-fg transition-[border-color,background-color,box-shadow] duration-100\",\n \"border-border hover:border-border-strong\",\n \"has-[input:focus-visible]:outline-2 has-[input:focus-visible]:outline-offset-2 has-[input:focus-visible]:outline-ring\",\n checked && \"border-primary bg-[color:color-mix(in_srgb,var(--color-primary)_5%,var(--color-surface))] shadow-[inset_0_0_0_1px_var(--color-primary)] hover:border-primary\",\n ctx.invalid && !checked && \"border-[color:color-mix(in_srgb,var(--color-danger)_55%,transparent)]\",\n off && \"cursor-not-allowed opacity-50 hover:border-border\",\n className\n )}\n {...props}\n >\n <input\n type={single ? \"radio\" : \"checkbox\"}\n name={ctx.name}\n value={value}\n checked={checked}\n disabled={off}\n aria-describedby={description ? descId : undefined}\n onChange={(e) => ctx.toggle(value, e.target.checked)}\n className=\"peer sr-only\"\n />\n {icon && (\n <span className={cn(\"grid size-9 shrink-0 place-items-center rounded-control [&_i]:text-lg [&_svg]:size-[1.15rem]\", checked ? \"bg-primary/12 text-primary\" : \"bg-secondary-hover text-fg-muted\")}>\n {renderIcon(icon)}\n </span>\n )}\n <span className=\"grid min-w-0 flex-1 content-start gap-1 pe-6\">\n <span className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-[0.9375rem] font-semibold leading-snug\">{title}</span>\n {badge}\n </span>\n {description && (\n <span id={descId} className=\"text-[0.8125rem] leading-relaxed text-fg-muted\">\n {description}\n </span>\n )}\n {meta && <span className=\"mt-1 text-sm font-medium tabular-nums text-fg\">{meta}</span>}\n {children}\n </span>\n {/* The visible radio / checkbox mark */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute end-4 top-4 grid size-[1.125rem] place-items-center border transition-colors duration-100\",\n single ? \"rounded-full\" : \"rounded-[5px]\",\n checked ? \"border-primary bg-primary text-primary-fg\" : \"border-border-strong bg-surface\"\n )}\n >\n {checked &&\n (single ? (\n <span className=\"size-[0.4rem] rounded-full bg-primary-fg\" />\n ) : (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.6} strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"size-3\">\n <path d=\"M4.5 10.5l3.5 3.5 7.5-8\" />\n </svg>\n ))}\n </span>\n </label>\n );\n}\n\n/** Groups header, content and footer — needed beside CardMedia in a horizontal card. */\nexport const CardBody = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"flex min-w-0 flex-1 flex-col\", className)} {...props} />\n));\nCardBody.displayName = \"CardBody\";\n","import * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cn } from \"../../lib/cn\";\nimport { Button, renderIcon, type ButtonProps, type IconInput } from \"../button/Button\";\n\n/*\n * DropdownMenu — a button that opens a list of actions (the WAI-ARIA \"menu button\"\n * pattern). Items can be plain actions, links, checkboxes or radio choices, grouped\n * with labels and separators. SplitButton pairs a main action with a menu of related ones.\n *\n * Keyboard: Enter / Space / ↓ opens (↑ opens at the last item); ↑ ↓ Home End move;\n * type a letter to jump; Enter or Space picks; Escape closes and returns focus.\n * The menu is positioned with `position: fixed` inside the component's DOM, so it\n * also works inside a Modal.\n */\n\ntype MenuContextValue = {\n open: boolean;\n setOpen: (open: boolean, focusTrigger?: boolean) => void;\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n contentId: string;\n triggerId: string;\n openFocus: React.MutableRefObject<\"first\" | \"last\" | \"content\">;\n};\nconst MenuContext = React.createContext<MenuContextValue | null>(null);\nfunction useMenu(component: string) {\n const ctx = React.useContext(MenuContext);\n if (!ctx) throw new Error(`<${component}> must be used inside <DropdownMenu>.`);\n return ctx;\n}\n\n/* ---------- root ---------- */\n\nexport interface DropdownMenuProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nexport function DropdownMenu({ open: openProp, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) {\n const [uncontrolled, setUncontrolled] = React.useState(defaultOpen);\n const controlled = openProp !== undefined;\n const open = controlled ? openProp : uncontrolled;\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const openFocus = React.useRef<\"first\" | \"last\" | \"content\">(\"content\");\n const id = React.useId();\n const cb = React.useRef(onOpenChange);\n cb.current = onOpenChange;\n\n const setOpen = React.useCallback(\n (next: boolean, focusTrigger = false) => {\n if (!controlled) setUncontrolled(next);\n cb.current?.(next);\n if (!next && focusTrigger) requestAnimationFrame(() => triggerRef.current?.focus());\n },\n [controlled]\n );\n\n return (\n <MenuContext.Provider value={{ open, setOpen, triggerRef, contentId: `${id}-menu`, triggerId: `${id}-trigger`, openFocus }}>\n <div className=\"relative inline-flex\">{children}</div>\n </MenuContext.Provider>\n );\n}\n\n/* ---------- trigger ---------- */\n\nexport interface DropdownMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Use your own button: <DropdownMenuTrigger asChild><Button>Options</Button></DropdownMenuTrigger> */\n asChild?: boolean;\n}\n\nexport const DropdownMenuTrigger = React.forwardRef<HTMLButtonElement, DropdownMenuTriggerProps>(\n ({ asChild, onClick, onKeyDown, ...props }, ref) => {\n const menu = useMenu(\"DropdownMenuTrigger\");\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n ref={(node: HTMLButtonElement | null) => {\n menu.triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n id={menu.triggerId}\n type={asChild ? undefined : \"button\"}\n aria-haspopup=\"menu\"\n aria-expanded={menu.open}\n aria-controls={menu.open ? menu.contentId : undefined}\n data-state={menu.open ? \"open\" : \"closed\"}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n // A click from the keyboard (Enter/Space) moves focus to the first item.\n menu.openFocus.current = e.detail === 0 ? \"first\" : \"content\";\n menu.setOpen(!menu.open);\n }}\n onKeyDown={(e: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(e);\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n menu.openFocus.current = e.key === \"ArrowDown\" ? \"first\" : \"last\";\n menu.setOpen(true);\n }\n }}\n {...props}\n />\n );\n }\n);\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\";\n\n/* ---------- content ---------- */\n\nexport interface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Line up the menu with the trigger's start (left) or end (right) edge. */\n align?: \"start\" | \"end\";\n /** Open below (default) or above; it flips automatically when there's no room. */\n side?: \"bottom\" | \"top\";\n /** Match the trigger's width at least. */\n matchTriggerWidth?: boolean;\n}\n\nconst ITEM_SELECTOR = '[role=\"menuitem\"],[role=\"menuitemcheckbox\"],[role=\"menuitemradio\"]';\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n ({ align = \"start\", side = \"bottom\", matchTriggerWidth = false, className, style, children, ...props }, ref) => {\n const menu = useMenu(\"DropdownMenuContent\");\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const [pos, setPos] = React.useState<React.CSSProperties>({ visibility: \"hidden\" });\n const [placedSide, setPlacedSide] = React.useState<\"bottom\" | \"top\">(side);\n const typeahead = React.useRef({ text: \"\", timer: 0 });\n\n const items = () =>\n Array.from(contentRef.current?.querySelectorAll<HTMLElement>(ITEM_SELECTOR) ?? []).filter(\n (el) => el.getAttribute(\"aria-disabled\") !== \"true\"\n );\n\n const place = React.useCallback(() => {\n const t = menu.triggerRef.current;\n const c = contentRef.current;\n if (!t || !c) return;\n const r = t.getBoundingClientRect();\n const h = c.offsetHeight;\n const w = Math.max(c.offsetWidth, matchTriggerWidth ? r.width : 0);\n const below = window.innerHeight - r.bottom - 8;\n const above = r.top - 8;\n const up = side === \"top\" ? above >= h || above > below : below < h && above > below;\n let left = align === \"end\" ? r.right - w : r.left;\n left = Math.max(8, Math.min(left, window.innerWidth - w - 8)); // stay on screen\n setPlacedSide(up ? \"top\" : \"bottom\");\n setPos({\n position: \"fixed\",\n left,\n ...(up ? { bottom: window.innerHeight - r.top + 6 } : { top: r.bottom + 6 }),\n minWidth: matchTriggerWidth ? r.width : undefined,\n maxHeight: Math.max(160, (up ? above : below) - 6),\n });\n }, [align, side, matchTriggerWidth, menu.triggerRef]);\n\n React.useLayoutEffect(() => {\n if (!menu.open) return;\n place();\n window.addEventListener(\"resize\", place);\n window.addEventListener(\"scroll\", place, true);\n return () => {\n window.removeEventListener(\"resize\", place);\n window.removeEventListener(\"scroll\", place, true);\n };\n }, [menu.open, place]);\n\n // Move focus into the menu when it opens.\n React.useEffect(() => {\n if (!menu.open) return;\n const list = items();\n const target = menu.openFocus.current;\n if (target === \"first\") list[0]?.focus();\n else if (target === \"last\") list[list.length - 1]?.focus();\n else contentRef.current?.focus({ preventScroll: true });\n menu.openFocus.current = \"content\";\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [menu.open]);\n\n // Close on a click outside (the trigger toggles itself).\n React.useEffect(() => {\n if (!menu.open) return;\n const onDown = (e: PointerEvent) => {\n const target = e.target as Node;\n if (contentRef.current?.contains(target) || menu.triggerRef.current?.contains(target)) return;\n menu.setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onDown);\n return () => document.removeEventListener(\"pointerdown\", onDown);\n }, [menu]);\n\n if (!menu.open) return null;\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n const list = items();\n const i = list.indexOf(document.activeElement as HTMLElement);\n const go = (n: number) => {\n e.preventDefault();\n list[(n + list.length) % list.length]?.focus();\n };\n switch (e.key) {\n case \"ArrowDown\":\n return go(i < 0 ? 0 : i + 1);\n case \"ArrowUp\":\n return go(i < 0 ? list.length - 1 : i - 1);\n case \"Home\":\n return go(0);\n case \"End\":\n return go(list.length - 1);\n case \"Escape\":\n e.preventDefault();\n e.stopPropagation(); // don't also close a surrounding Modal\n menu.setOpen(false, true);\n return;\n case \"Tab\":\n e.preventDefault();\n menu.setOpen(false, true);\n return;\n default:\n // Type-ahead: jump to the next item whose text starts with what's typed.\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n const t = typeahead.current;\n window.clearTimeout(t.timer);\n t.text += e.key.toLowerCase();\n t.timer = window.setTimeout(() => (t.text = \"\"), 600);\n const start = t.text.length === 1 ? i + 1 : Math.max(i, 0);\n for (let k = 0; k < list.length; k++) {\n const el = list[(start + k) % list.length];\n if ((el.dataset.textValue ?? el.textContent ?? \"\").trim().toLowerCase().startsWith(t.text)) {\n el.focus();\n break;\n }\n }\n }\n }\n };\n\n return (\n <div\n ref={(node) => {\n contentRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n id={menu.contentId}\n role=\"menu\"\n aria-labelledby={menu.triggerId}\n aria-orientation=\"vertical\"\n tabIndex={-1}\n data-side={placedSide}\n onKeyDown={onKeyDown}\n style={{ ...pos, ...style }}\n className={cn(\n \"z-[60] min-w-48 max-w-[min(20rem,calc(100vw-1rem))] overflow-y-auto overscroll-contain rounded-control-lg border border-border bg-surface p-1 text-fg outline-none\",\n \"shadow-[var(--ui-shadow-lg)]\",\n \"data-[side=bottom]:animate-[ui-menu-down_140ms_cubic-bezier(0.2,0.9,0.3,1)] data-[side=top]:animate-[ui-menu-up_140ms_cubic-bezier(0.2,0.9,0.3,1)]\",\n \"motion-reduce:animate-[ui-fade-in_120ms_ease-out]\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\nDropdownMenuContent.displayName = \"DropdownMenuContent\";\n\n/* ---------- items ---------- */\n\nconst itemClass = (destructive?: boolean, inset?: boolean) =>\n cn(\n \"relative flex w-full cursor-pointer select-none items-center gap-2.5 rounded-control-sm px-2.5 py-2 text-left text-sm text-fg outline-none\",\n \"focus:bg-secondary-hover data-[disabled]:cursor-not-allowed data-[disabled]:opacity-45 data-[disabled]:focus:bg-transparent\",\n \"[&>i]:text-[1.05em] [&>i]:text-fg-muted [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-fg-muted\",\n destructive && \"text-danger focus:bg-[color:color-mix(in_srgb,var(--color-danger)_10%,transparent)] [&>i]:text-danger [&>svg]:text-danger\",\n inset && \"ps-8\"\n );\n\ntype ItemBase = {\n /** Called when the item is picked. Call event.preventDefault() to keep the menu open. */\n onSelect?: (event: Event) => void;\n disabled?: boolean;\n icon?: IconInput;\n /** A keyboard shortcut shown at the right, e.g. \"⌘D\". Purely a hint; wire the keys yourself. */\n shortcut?: string;\n /** A second line of smaller text. */\n description?: React.ReactNode;\n /** Styles the item in red, for actions like Delete. */\n destructive?: boolean;\n /** Line the text up with items that have icons. */\n inset?: boolean;\n /** Text used for type-ahead when the label isn't plain text. */\n textValue?: string;\n};\n\nfunction useSelect(onSelect: ItemBase[\"onSelect\"], disabled?: boolean, keepOpen = false) {\n const menu = useMenu(\"DropdownMenuItem\");\n return (e: React.SyntheticEvent) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n const event = new Event(\"select\", { cancelable: true });\n onSelect?.(event);\n if (!event.defaultPrevented && !keepOpen) menu.setOpen(false, true);\n };\n}\n\nfunction ItemInner({ icon, children, description, shortcut, end }: Pick<ItemBase, \"icon\" | \"shortcut\" | \"description\"> & { children: React.ReactNode; end?: React.ReactNode }) {\n return (\n <>\n {renderIcon(icon)}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{children}</span>\n {description && <span className=\"block truncate text-xs text-fg-muted\">{description}</span>}\n </span>\n {shortcut && <span className=\"ms-4 shrink-0 text-xs tracking-wide text-fg-muted\">{shortcut}</span>}\n {end}\n </>\n );\n}\n\nexport interface DropdownMenuItemProps extends ItemBase, Omit<React.HTMLAttributes<HTMLElement>, \"onSelect\"> {\n /** Render your own element, e.g. a link: <DropdownMenuItem asChild><a href=\"/settings\">Settings</a></DropdownMenuItem> */\n asChild?: boolean;\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLElement, DropdownMenuItemProps>(\n ({ onSelect, disabled, icon, shortcut, description, destructive, inset, textValue, asChild, className, children, onClick, onKeyDown, ...props }, ref) => {\n const select = useSelect(onSelect, disabled);\n const Comp: React.ElementType = asChild ? Slot : \"div\";\n const inner = asChild ? children : <ItemInner icon={icon} shortcut={shortcut} description={description}>{children}</ItemInner>;\n return (\n <Comp\n ref={ref as React.Ref<HTMLDivElement>}\n role=\"menuitem\"\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n data-disabled={disabled ? \"\" : undefined}\n data-text-value={textValue}\n className={cn(itemClass(destructive, inset), className)}\n onPointerMove={(e: React.PointerEvent<HTMLElement>) => !disabled && e.currentTarget.focus({ preventScroll: true })}\n onClick={(e: React.MouseEvent<HTMLElement>) => {\n onClick?.(e);\n select(e);\n }}\n onKeyDown={(e: React.KeyboardEvent<HTMLElement>) => {\n onKeyDown?.(e);\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n if (asChild && !disabled) (e.currentTarget as HTMLElement).click(); // follow the link\n else select(e);\n }\n }}\n {...props}\n >\n {inner}\n </Comp>\n );\n }\n);\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\n\nconst CheckMark = () => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"absolute start-2.5 size-4 text-primary\">\n <path d=\"M4.5 10.5l3.5 3.5 7.5-8\" />\n </svg>\n);\n\nexport interface DropdownMenuCheckboxItemProps extends Omit<ItemBase, \"destructive\" | \"inset\" | \"icon\">, Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n checked: boolean;\n onCheckedChange?: (checked: boolean) => void;\n /** Close the menu after toggling. Default false, so several can be changed at once. */\n closeOnSelect?: boolean;\n}\n\nexport function DropdownMenuCheckboxItem({ checked, onCheckedChange, closeOnSelect = false, onSelect, disabled, shortcut, description, textValue, className, children, ...props }: DropdownMenuCheckboxItemProps) {\n const select = useSelect((e) => {\n onSelect?.(e);\n if (!e.defaultPrevented) onCheckedChange?.(!checked);\n }, disabled, !closeOnSelect);\n return (\n <div\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n data-disabled={disabled ? \"\" : undefined}\n data-text-value={textValue}\n className={cn(itemClass(false, true), className)}\n onPointerMove={(e) => !disabled && e.currentTarget.focus({ preventScroll: true })}\n onClick={select}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n select(e);\n }\n }}\n {...props}\n >\n {checked && <CheckMark />}\n <ItemInner shortcut={shortcut} description={description}>{children}</ItemInner>\n </div>\n );\n}\n\nconst RadioContext = React.createContext<{ value: string | null; onValueChange?: (v: string) => void; closeOnSelect: boolean } | null>(null);\n\nexport interface DropdownMenuRadioGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string | null;\n onValueChange?: (value: string) => void;\n /** Close the menu after choosing. Default true. */\n closeOnSelect?: boolean;\n}\n\nexport function DropdownMenuRadioGroup({ value, onValueChange, closeOnSelect = true, ...props }: DropdownMenuRadioGroupProps) {\n return (\n <RadioContext.Provider value={{ value, onValueChange, closeOnSelect }}>\n <div role=\"group\" {...props} />\n </RadioContext.Provider>\n );\n}\n\nexport interface DropdownMenuRadioItemProps extends Omit<ItemBase, \"destructive\" | \"inset\" | \"icon\">, Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\n value: string;\n}\n\nexport function DropdownMenuRadioItem({ value, onSelect, disabled, shortcut, description, textValue, className, children, ...props }: DropdownMenuRadioItemProps) {\n const group = React.useContext(RadioContext);\n if (!group) throw new Error(\"<DropdownMenuRadioItem> must be used inside <DropdownMenuRadioGroup>.\");\n const checked = group.value === value;\n const select = useSelect((e) => {\n onSelect?.(e);\n if (!e.defaultPrevented) group.onValueChange?.(value);\n }, disabled, !group.closeOnSelect);\n return (\n <div\n role=\"menuitemradio\"\n aria-checked={checked}\n tabIndex={-1}\n aria-disabled={disabled || undefined}\n data-disabled={disabled ? \"\" : undefined}\n data-text-value={textValue}\n className={cn(itemClass(false, true), className)}\n onPointerMove={(e) => !disabled && e.currentTarget.focus({ preventScroll: true })}\n onClick={select}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n select(e);\n }\n }}\n {...props}\n >\n {checked && <span aria-hidden=\"true\" className=\"absolute start-3.5 size-1.5 rounded-full bg-primary\" />}\n <ItemInner shortcut={shortcut} description={description}>{children}</ItemInner>\n </div>\n );\n}\n\n/** A small heading for a group of items. */\nexport function DropdownMenuLabel({ className, inset, ...props }: React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }) {\n return <div role=\"presentation\" className={cn(\"px-2.5 pb-1 pt-2 text-xs font-medium text-fg-muted\", inset && \"ps-8\", className)} {...props} />;\n}\n\nexport function DropdownMenuSeparator({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div role=\"separator\" aria-orientation=\"horizontal\" className={cn(\"-mx-1 my-1 h-px bg-border\", className)} {...props} />;\n}\n\n/** Groups related items (optionally under a DropdownMenuLabel). */\nexport function DropdownMenuGroup(props: React.HTMLAttributes<HTMLDivElement>) {\n return <div role=\"group\" {...props} />;\n}\n\n/* ---------- SplitButton ---------- */\n\nexport interface SplitButtonProps extends Omit<ButtonProps, \"iconOnly\" | \"asChild\"> {\n /** The menu items (DropdownMenuItem, separators…). */\n menu: React.ReactNode;\n /** Accessible label for the arrow button. Default \"More options\". */\n menuLabel?: string;\n align?: \"start\" | \"end\";\n}\n\n/** A main action with an attached arrow that opens related actions. */\nexport function SplitButton({ menu, menuLabel = \"More options\", align = \"end\", variant = \"primary\", size, rounded, raised, shadow, disabled, className, ...props }: SplitButtonProps) {\n const shared = { variant, size, rounded, raised, shadow, disabled };\n return (\n <div role=\"group\" className={cn(\"inline-flex\", className)}>\n <Button {...shared} {...props} className=\"rounded-e-none\" />\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n {...shared}\n iconOnly\n aria-label={menuLabel}\n className={cn(\n \"rounded-s-none\",\n // A thin divider between the two halves.\n variant === \"secondary\" ? \"-ms-px\" : \"border-s border-s-[color:color-mix(in_srgb,currentColor_28%,transparent)]\"\n )}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M5.5 8l4.5 4.5L14.5 8\" />\n </svg>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align}>{menu}</DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Input } from \"../input/Input\";\nimport { Button } from \"../button/Button\";\nimport { Select } from \"../select/Select\";\nimport { Skeleton, ActivityIndicator } from \"../activity/Activity\";\nimport { Checkbox } from \"../choice/Choice\";\n\n/*\n * DataTable — a light take on DataTables: sorting, search, pagination, row selection\n * with bulk actions, row actions, loading and empty states.\n *\n * Responsive: when its container is narrow (not just the screen), each row becomes a\n * card with \"Label value\" lines — or set mobile=\"scroll\" to keep a table that scrolls\n * sideways with the first column pinned. Table semantics are kept either way.\n *\n * Data can be sorted/filtered/paged here, or on your server (manual) — e.g. a Laravel\n * paginator — with onQueryChange telling you what to fetch.\n */\n\nexport interface DataTableColumn<T> {\n /** Unique key. Also reads row[key] when there's no accessor. */\n key: string;\n header: React.ReactNode;\n /** The raw value, used for sorting and searching. Defaults to row[key]. */\n accessor?: (row: T) => unknown;\n /** How the cell looks. Defaults to the value as text. */\n cell?: (row: T) => React.ReactNode;\n sortable?: boolean;\n /** Custom sort compare (a, b) → number. */\n sortFn?: (a: T, b: T) => number;\n align?: \"start\" | \"center\" | \"end\";\n /** Column width, e.g. \"8rem\" or \"20%\". */\n width?: string;\n /** The row's title in the card layout (shown larger, without a label). Use on one column. */\n primary?: boolean;\n /** Leave this column out of the card layout. */\n hideOnMobile?: boolean;\n /** Include in search. Default true. */\n searchable?: boolean;\n className?: string;\n}\n\nexport type SortState = { key: string; direction: \"asc\" | \"desc\" } | null;\nexport type DataTableStatusState = {\n loading: boolean;\n refreshing: boolean;\n lastUpdated: Date | null;\n error: React.ReactNode;\n total: number;\n};\n\nexport type DataTableQuery = { page: number; pageSize: number; sort: SortState; search: string };\n\nexport interface DataTableProps<T> {\n data: T[];\n columns: DataTableColumn<T>[];\n /** A stable id per row: a key of the row, or a function. */\n rowKey: keyof T | ((row: T) => string | number);\n /** Accessible name, e.g. \"Invoices\". Shown visually only if showCaption. */\n caption: string;\n showCaption?: boolean;\n\n /** Show a search box. */\n searchable?: boolean;\n searchPlaceholder?: string;\n /** Rows per page. Set 0 to show everything. Default 10. */\n pageSize?: number;\n pageSizeOptions?: number[];\n defaultSort?: SortState;\n\n /** Adds a checkbox column. */\n selectable?: boolean;\n selected?: Array<string | number>;\n onSelectedChange?: (keys: Array<string | number>) => void;\n /** Shown in a bar when rows are selected. Gets the selected rows and a way to clear them. */\n bulkActions?: (rows: T[], clear: () => void) => React.ReactNode;\n\n /** Content at the end of each row, e.g. a DropdownMenu. */\n rowActions?: (row: T) => React.ReactNode;\n onRowClick?: (row: T) => void;\n /** Extra buttons in the toolbar, e.g. \"New invoice\". */\n toolbar?: React.ReactNode;\n\n loading?: boolean;\n /**\n * How a refresh (loading while rows are already showing) is shown:\n * - \"border\": a light runs around the table's edge (default)\n * - \"bar\": a thin bar slides along the top\n * - \"shimmer\": a soft sweep of light passes over the rows\n * - \"none\": rows just dim\n */\n refreshIndicator?: \"border\" | \"bar\" | \"shimmer\" | \"none\";\n /** Adds a refresh button to the toolbar. Return a Promise; the indicator runs until it settles. */\n onRefresh?: () => Promise<unknown> | void;\n /**\n * A status line at the top of the table, like a live caption.\n * - true: automatic messages — \"Loading rows…\", \"Fetching the latest rows…\",\n * \"Updated 2 minutes ago\", or the error\n * - a message (text or content) to show your own, e.g. \"Showing cached data\"\n * - a function that gets the table's state and returns a message (or null to hide)\n */\n status?: boolean | React.ReactNode | ((state: DataTableStatusState) => React.ReactNode);\n /** Color of a custom status message. Automatic messages pick their own. */\n statusTone?: \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n /** An error to show in the status line (e.g. the last refresh failed). Offers Retry with onRefresh. */\n error?: React.ReactNode;\n /** When the data was last loaded, if you track it. Otherwise the table notes when a refresh finishes. */\n lastUpdated?: Date | null;\n /**\n * Cover the table with a message while it loads or refreshes:\n * true for \"Loading rows…\" / \"Refreshing rows…\", or pass your own message.\n * The rows behind are dimmed and can't be clicked until it's done.\n */\n loadingOverlay?: boolean | React.ReactNode;\n /** Where the overlay's message sits: near the top (default; stays in view on tall tables) or centered. */\n overlayPosition?: \"top\" | \"center\";\n /** The indicator in the overlay. Default \"orbit\". */\n overlayIndicator?: \"spinner\" | \"dots\" | \"bars\" | \"pulse\" | \"orbit\";\n /** Adds a Cancel button to the overlay. */\n onCancelLoading?: () => void;\n /** Shown when there are no rows (and when a search finds nothing). */\n emptyState?: React.ReactNode;\n\n density?: \"comfortable\" | \"compact\";\n striped?: boolean;\n /** Narrow containers: rows become cards (\"cards\", default) or the table scrolls sideways (\"scroll\"). */\n mobile?: \"cards\" | \"scroll\";\n /** Limit the height; the header stays visible while the body scrolls. */\n maxHeight?: string;\n\n /** Server mode: you sort, search and page; the table only shows `data`. */\n manual?: boolean;\n /** Server mode: total number of rows across all pages. */\n total?: number;\n /** Called when page, page size, sort or search change (search is debounced). */\n onQueryChange?: (query: DataTableQuery) => void;\n className?: string;\n}\n\n/* ---------- helpers ---------- */\n\nconst normalize = (s: string) => s.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").toLowerCase();\nconst valueOf = <T,>(col: DataTableColumn<T>, row: T) =>\n col.accessor ? col.accessor(row) : (row as Record<string, unknown>)[col.key];\n\nfunction compare(a: unknown, b: unknown) {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: \"base\" });\n}\n\nconst alignClass = { start: \"text-start\", center: \"text-center\", end: \"text-end\" } as const;\n\nfunction RowCheckbox({ checked, indeterminate, onChange, label }: { checked: boolean; indeterminate?: boolean; onChange: (v: boolean) => void; label: string }) {\n return (\n <Checkbox\n size=\"sm\"\n aria-label={label}\n checked={checked}\n indeterminate={indeterminate}\n onCheckedChange={onChange}\n onClick={(e) => e.stopPropagation()}\n className=\"align-middle\"\n />\n );\n}\n\nconst SortIcon = ({ dir }: { dir: \"asc\" | \"desc\" | null }) => (\n <svg viewBox=\"0 0 12 16\" aria-hidden=\"true\" className=\"h-3.5 w-2.5 shrink-0\">\n <path d=\"M6 2.5l3 3.5H3z\" fill=\"currentColor\" opacity={dir === \"asc\" ? 1 : 0.3} />\n <path d=\"M6 13.5L3 10h6z\" fill=\"currentColor\" opacity={dir === \"desc\" ? 1 : 0.3} />\n </svg>\n);\n\n/* ---------- refresh indicators ---------- */\n\n/**\n * A comet of light running around the table's rounded edge. It's an SVG rectangle drawn\n * on the border with three dashes of different lengths that share one head — a bright\n * point with a fading tail — moving at an even speed along the whole perimeter.\n */\nfunction RunningBorder({ radius }: { radius: number }) {\n const tails: Array<[number, number, number]> = [\n // [dash length, opacity, width]\n [26, 0.18, 2],\n [14, 0.45, 2],\n [5, 1, 2.5],\n ];\n return (\n <svg\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-30 size-full overflow-visible drop-shadow-[0_0_3px_var(--color-primary)] motion-reduce:hidden\"\n >\n {tails.map(([len, opacity, width]) => (\n <rect\n key={len}\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n rx={radius}\n pathLength={100}\n fill=\"none\"\n stroke=\"var(--color-primary)\"\n strokeOpacity={opacity}\n strokeWidth={width}\n strokeLinecap=\"round\"\n strokeDasharray={`${len} ${100 - len}`}\n className=\"animate-[ui-border-run_2.2s_linear_infinite]\"\n // Line up the heads: shorter dashes start further along.\n style={{ [\"--o\" as string]: `${len - 26}` }}\n />\n ))}\n </svg>\n );\n}\n\nfunction RefreshBar() {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-0 top-0 z-30 h-0.5 overflow-hidden rounded-t-card\">\n <div className=\"h-full w-2/5 rounded-full bg-primary animate-[ui-indeterminate_1.2s_cubic-bezier(0.4,0,0.2,1)_infinite] motion-reduce:w-full motion-reduce:animate-[ui-breathe_1.6s_ease-in-out_infinite]\" />\n </div>\n );\n}\n\nfunction RefreshShimmer() {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 z-20 overflow-hidden rounded-card motion-reduce:hidden\">\n <div className=\"h-full w-full bg-[linear-gradient(100deg,transparent_20%,color-mix(in_srgb,var(--color-primary)_9%,transparent)_45%,color-mix(in_srgb,var(--color-surface)_55%,transparent)_50%,color-mix(in_srgb,var(--color-primary)_9%,transparent)_55%,transparent_80%)] animate-[ui-sweep_1.4s_ease-in-out_infinite]\" />\n </div>\n );\n}\n\n/* ---------- status line ---------- */\n\nfunction timeAgo(date: Date) {\n const seconds = Math.round((Date.now() - date.getTime()) / 1000);\n if (seconds < 45) return \"just now\";\n const rtf = new Intl.RelativeTimeFormat(undefined, { numeric: \"auto\" });\n const minutes = Math.round(seconds / 60);\n if (minutes < 60) return rtf.format(-minutes, \"minute\");\n const hours = Math.round(minutes / 60);\n if (hours < 24) return rtf.format(-hours, \"hour\");\n return rtf.format(-Math.round(hours / 24), \"day\");\n}\n\nconst statusToneClass = {\n neutral: \"text-fg-muted\",\n info: \"text-info\",\n success: \"text-success\",\n warning: \"text-warning\",\n danger: \"text-danger\",\n} as const;\n\ntype ResolvedStatus = { message: React.ReactNode; tone: keyof typeof statusToneClass; icon: \"error\" | \"busy\" | \"done\" | null; spinner: boolean };\n\n/** Work out what the status line should say (or null to hide it). */\nfunction resolveStatus(\n status: DataTableProps<unknown>[\"status\"],\n tone: keyof typeof statusToneClass | undefined,\n state: DataTableStatusState,\n justRefreshed: boolean\n): ResolvedStatus | null {\n if (!status) return null;\n const hasError = state.error !== undefined && state.error !== null && state.error !== false && state.error !== \"\";\n const busy = state.loading || state.refreshing;\n\n let auto: React.ReactNode = null;\n let autoTone: keyof typeof statusToneClass = \"neutral\";\n if (hasError) {\n auto = state.error;\n autoTone = \"danger\";\n } else if (state.loading) auto = \"Loading rows…\";\n else if (state.refreshing) auto = \"Fetching the latest rows…\";\n else if (state.lastUpdated) {\n auto = `Updated ${timeAgo(state.lastUpdated)}`;\n autoTone = justRefreshed ? \"success\" : \"neutral\";\n }\n\n const custom = typeof status === \"function\" ? status(state) : status === true ? undefined : status;\n const message = custom !== undefined ? custom : auto;\n if (message === null || message === undefined || message === false || message === \"\") return null;\n return {\n message,\n tone: custom !== undefined ? (tone ?? (hasError ? \"danger\" : \"neutral\")) : autoTone,\n icon: hasError ? \"error\" : busy ? \"busy\" : state.lastUpdated && custom === undefined ? \"done\" : null,\n spinner: state.loading,\n };\n}\n\nfunction StatusLine({ resolved, onRetry, cards }: { resolved: ResolvedStatus; onRetry?: () => void; cards: boolean }) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"flex min-h-9 items-center gap-2 rounded-t-card border border-border bg-secondary-hover/45 px-4 py-1.5 text-[0.8125rem]\",\n cards && \"@max-[40rem]:mb-3 @max-[40rem]:rounded-card\",\n statusToneClass[resolved.tone]\n )}\n >\n {resolved.icon === \"error\" ? (\n <svg viewBox=\"0 0 16 16\" aria-hidden=\"true\" className=\"size-3.5 shrink-0\" fill=\"currentColor\">\n <path d=\"M8 1.5a6.5 6.5 0 1 1 0 13 6.5 6.5 0 0 1 0-13Zm0 3a.75.75 0 0 0-.75.75v3a.75.75 0 0 0 1.5 0v-3A.75.75 0 0 0 8 4.5Zm0 6.25a.85.85 0 1 0 0 1.7.85.85 0 0 0 0-1.7Z\" />\n </svg>\n ) : resolved.icon === \"busy\" ? (\n <ActivityIndicator variant={resolved.spinner ? \"spinner\" : \"dots\"} size=\"xs\" tone=\"current\" label=\"\" aria-hidden=\"true\" role={undefined} />\n ) : resolved.icon === \"done\" ? (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-3.5 shrink-0\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n ) : null}\n <span className=\"min-w-0 flex-1 truncate\">{resolved.message}</span>\n {resolved.icon === \"error\" && onRetry && (\n <button type=\"button\" onClick={onRetry} className=\"shrink-0 cursor-pointer font-medium underline underline-offset-2 hover:no-underline\">\n Retry\n </button>\n )}\n </div>\n );\n}\n\n/* ---------- component ---------- */\n\nexport function DataTable<T>({\n data,\n columns,\n rowKey,\n caption,\n showCaption = false,\n searchable = false,\n searchPlaceholder = \"Search…\",\n pageSize: initialPageSize = 10,\n pageSizeOptions = [10, 25, 50, 100],\n defaultSort = null,\n selectable = false,\n selected: selectedProp,\n onSelectedChange,\n bulkActions,\n rowActions,\n onRowClick,\n toolbar,\n loading = false,\n refreshIndicator = \"border\",\n onRefresh,\n status,\n statusTone,\n error,\n lastUpdated: lastUpdatedProp,\n loadingOverlay = false,\n overlayPosition = \"top\",\n overlayIndicator = \"orbit\",\n onCancelLoading,\n emptyState,\n density = \"comfortable\",\n striped = false,\n mobile = \"cards\",\n maxHeight,\n manual = false,\n total,\n onQueryChange,\n className,\n}: DataTableProps<T>) {\n const keyOf = React.useCallback(\n (row: T) => (typeof rowKey === \"function\" ? rowKey(row) : (row[rowKey] as unknown as string | number)),\n [rowKey]\n );\n\n const [refreshingByButton, setRefreshingByButton] = React.useState(false);\n const [search, setSearch] = React.useState(\"\");\n const [debounced, setDebounced] = React.useState(\"\");\n const [sort, setSort] = React.useState<SortState>(defaultSort);\n const [page, setPage] = React.useState(1);\n const [pageSize, setPageSize] = React.useState(initialPageSize);\n const [uncontrolledSel, setUncontrolledSel] = React.useState<Array<string | number>>([]);\n const selected = selectedProp ?? uncontrolledSel;\n const setSelected = (keys: Array<string | number>) => {\n if (selectedProp === undefined) setUncontrolledSel(keys);\n onSelectedChange?.(keys);\n };\n\n // Search (debounced in server mode). Any change of search, sort or page size goes back to page 1,\n // set in the same update so onQueryChange fires once.\n React.useEffect(() => {\n const t = window.setTimeout(() => {\n if (search !== debounced) {\n setDebounced(search);\n setPage(1);\n }\n }, manual ? 300 : 0);\n return () => window.clearTimeout(t);\n }, [search, manual, debounced]);\n\n const queryRef = React.useRef(onQueryChange);\n queryRef.current = onQueryChange;\n React.useEffect(() => {\n queryRef.current?.({ page, pageSize, sort, search: debounced });\n }, [page, pageSize, sort, debounced]);\n\n /* ----- client-side processing ----- */\n const processed = React.useMemo(() => {\n if (manual) return data;\n let rows = data;\n const q = normalize(debounced.trim());\n if (q) {\n const cols = columns.filter((c) => c.searchable !== false);\n rows = rows.filter((r) => cols.some((c) => normalize(String(valueOf(c, r) ?? \"\")).includes(q)));\n }\n if (sort) {\n const col = columns.find((c) => c.key === sort.key);\n if (col) {\n const dir = sort.direction === \"asc\" ? 1 : -1;\n rows = [...rows].sort((a, b) => dir * (col.sortFn ? col.sortFn(a, b) : compare(valueOf(col, a), valueOf(col, b))));\n }\n }\n return rows;\n }, [data, columns, debounced, sort, manual]);\n\n const totalRows = manual ? (total ?? data.length) : processed.length;\n const paged = pageSize > 0 && !manual ? processed.slice((page - 1) * pageSize, page * pageSize) : processed;\n const pageCount = pageSize > 0 ? Math.max(1, Math.ceil(totalRows / pageSize)) : 1;\n const from = totalRows === 0 ? 0 : pageSize > 0 ? (page - 1) * pageSize + 1 : 1;\n const to = pageSize > 0 ? Math.min(page * pageSize, totalRows) : totalRows;\n\n React.useEffect(() => {\n if (page > pageCount) setPage(pageCount);\n }, [page, pageCount]);\n\n const toggleSort = (key: string) => {\n setSort((s) => (!s || s.key !== key ? { key, direction: \"asc\" } : s.direction === \"asc\" ? { key, direction: \"desc\" } : null));\n setPage(1);\n };\n\n /* ----- selection ----- */\n const pageKeys = paged.map(keyOf);\n const selectedOnPage = pageKeys.filter((k) => selected.includes(k));\n const allOnPage = pageKeys.length > 0 && selectedOnPage.length === pageKeys.length;\n const selectedRows = data.filter((r) => selected.includes(keyOf(r)));\n\n // A refresh = loading while rows are already showing (or the refresh button's Promise is running).\n const refreshing = (loading && paged.length > 0) || refreshingByButton;\n const [justRefreshed, setJustRefreshed] = React.useState(false);\n const wasRefreshing = React.useRef(false);\n React.useEffect(() => {\n if (wasRefreshing.current && !refreshing) {\n setJustRefreshed(true);\n const t = window.setTimeout(() => setJustRefreshed(false), 750);\n wasRefreshing.current = false;\n return () => window.clearTimeout(t);\n }\n wasRefreshing.current = refreshing;\n }, [refreshing]);\n\n // When the rows were last (re)loaded — from the prop, or noted when a refresh or load ends.\n const [trackedUpdated, setTrackedUpdated] = React.useState<Date | null>(null);\n const wasBusy = React.useRef(loading);\n React.useEffect(() => {\n const busy = loading || refreshingByButton;\n if (wasBusy.current && !busy) setTrackedUpdated(new Date());\n wasBusy.current = busy;\n }, [loading, refreshingByButton]);\n const lastUpdated = lastUpdatedProp !== undefined ? lastUpdatedProp : trackedUpdated;\n\n // Re-render every 30s so \"Updated 2 minutes ago\" stays true.\n const [, setTick] = React.useState(0);\n React.useEffect(() => {\n if (!status || !lastUpdated) return;\n const t = window.setInterval(() => setTick((n) => n + 1), 30000);\n return () => window.clearInterval(t);\n }, [status, lastUpdated]);\n\n const frameRef = React.useRef<HTMLDivElement>(null);\n const [radius, setRadius] = React.useState(12);\n React.useLayoutEffect(() => {\n if (!refreshing || !frameRef.current) return;\n setRadius(parseFloat(getComputedStyle(frameRef.current).borderTopLeftRadius) || 12);\n }, [refreshing]);\n\n const runRefresh = async () => {\n if (!onRefresh || refreshingByButton) return;\n setRefreshingByButton(true);\n try {\n await onRefresh();\n } finally {\n setRefreshingByButton(false);\n }\n };\n\n // Loading overlay: shown after a short delay so quick loads don't flash.\n const busyForOverlay = !!loadingOverlay && (loading || refreshingByButton);\n const [overlayVisible, setOverlayVisible] = React.useState(false);\n React.useEffect(() => {\n if (!busyForOverlay) return setOverlayVisible(false);\n const t = window.setTimeout(() => setOverlayVisible(true), 150);\n return () => window.clearTimeout(t);\n }, [busyForOverlay]);\n React.useEffect(() => {\n const el = frameRef.current;\n if (!el) return;\n if (overlayVisible) el.setAttribute(\"inert\", \"\");\n else el.removeAttribute(\"inert\");\n }, [overlayVisible]);\n const overlayMessage =\n loadingOverlay === true ? (paged.length === 0 ? \"Loading rows…\" : \"Refreshing rows…\") : (loadingOverlay as React.ReactNode);\n\n const cards = mobile === \"cards\";\n const resolvedStatus = resolveStatus(\n status as DataTableProps<unknown>[\"status\"],\n statusTone,\n { loading: loading && paged.length === 0, refreshing, lastUpdated, error, total: totalRows },\n justRefreshed\n );\n const pad = density === \"compact\" ? \"px-3 py-2\" : \"px-4 py-3\";\n const primaryCol = columns.find((c) => c.primary) ?? columns[0];\n const colCount = columns.length + (selectable ? 1 : 0) + (rowActions ? 1 : 0);\n\n // Class helpers for the card layout (applied when the container is narrower than 40rem).\n const cardTable = cards && \"@max-[40rem]:block\";\n const cardHead = cards && \"@max-[40rem]:sr-only\";\n const cardBody = cards && \"@max-[40rem]:grid @max-[40rem]:gap-3 @max-[40rem]:p-3\";\n const cardRow =\n cards &&\n \"@max-[40rem]:relative @max-[40rem]:grid @max-[40rem]:gap-1.5 @max-[40rem]:rounded-card @max-[40rem]:border @max-[40rem]:border-border @max-[40rem]:bg-surface @max-[40rem]:p-4 @max-[40rem]:shadow-none\";\n const cardCell =\n cards &&\n \"@max-[40rem]:flex @max-[40rem]:items-baseline @max-[40rem]:justify-between @max-[40rem]:gap-4 @max-[40rem]:border-0 @max-[40rem]:p-0 @max-[40rem]:text-end @max-[40rem]:before:shrink-0 @max-[40rem]:before:text-start @max-[40rem]:before:text-[0.8125rem] @max-[40rem]:before:text-fg-muted @max-[40rem]:before:content-[attr(data-label)]\";\n\n const emptyContent = emptyState ?? (\n <div className=\"grid justify-items-center gap-1 py-10 text-center\">\n <p className=\"font-medium text-fg\">{debounced ? `No results for “${debounced}”` : \"Nothing here yet\"}</p>\n <p className=\"text-sm text-fg-muted\">{debounced ? \"Check the spelling or try fewer words.\" : \"Rows will appear here once they're added.\"}</p>\n </div>\n );\n\n const headerLabel = (c: DataTableColumn<T>) => (typeof c.header === \"string\" ? c.header : c.key);\n\n return (\n <div className={cn(\"@container grid w-full min-w-0 grid-cols-[minmax(0,1fr)] gap-3\", className)}>\n {(searchable || toolbar || onRefresh) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {searchable && (\n <Input\n type=\"search\"\n aria-label={`Search ${caption.toLowerCase()}`}\n placeholder={searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n clearable\n size=\"sm\"\n leadingIcon={\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" aria-hidden=\"true\">\n <circle cx=\"9\" cy=\"9\" r=\"5.5\" />\n <path d=\"M13 13l3.5 3.5\" />\n </svg>\n }\n frameClassName=\"w-full sm:w-72\"\n />\n )}\n {(toolbar || onRefresh) && (\n <div className=\"ms-auto flex flex-wrap items-center gap-2\">\n {onRefresh && (\n <Button\n size=\"sm\"\n variant=\"secondary\"\n iconOnly\n aria-label={refreshing ? `Refreshing ${caption.toLowerCase()}` : `Refresh ${caption.toLowerCase()}`}\n title=\"Refresh\"\n onClick={() => void runRefresh()}\n className={cn(refreshing && \"[&_svg]:animate-spin [&_svg]:[animation-duration:0.9s]\")}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.7} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M16 10a6 6 0 1 1-1.8-4.3\" />\n <path d=\"M16 3.5v3.3h-3.3\" />\n </svg>\n </Button>\n )}\n {toolbar}\n </div>\n )}\n </div>\n )}\n\n {selectable && selected.length > 0 && bulkActions && (\n <div className=\"flex flex-wrap items-center gap-2 rounded-control-lg border border-[color:color-mix(in_srgb,var(--color-primary)_35%,transparent)] bg-[color:color-mix(in_srgb,var(--color-primary)_6%,var(--color-surface))] px-3 py-2 text-sm animate-[ui-fade-in_120ms_ease-out]\">\n <span className=\"font-medium\">{selected.length} selected</span>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setSelected([])}>Clear</Button>\n <div className=\"ms-auto flex flex-wrap items-center gap-2\">{bulkActions(selectedRows, () => setSelected([]))}</div>\n </div>\n )}\n\n <div className=\"relative min-w-0\">\n {refreshing && !overlayVisible && refreshIndicator === \"border\" && <RunningBorder radius={radius} />}\n {refreshing && !overlayVisible && refreshIndicator === \"bar\" && <RefreshBar />}\n {refreshing && !overlayVisible && refreshIndicator === \"shimmer\" && <RefreshShimmer />}\n {overlayVisible && (\n <div\n className={cn(\n \"absolute inset-0 z-40 rounded-card bg-[color:color-mix(in_srgb,var(--color-surface)_62%,transparent)] backdrop-blur-[1.5px]\",\n \"animate-[ui-fade-in_160ms_ease-out]\",\n // In the card layout the frame has no box, so the overlay needs its own edge.\n cards && \"@max-[40rem]:border @max-[40rem]:border-border\"\n )}\n >\n <div className={overlayPosition === \"top\" ? \"sticky top-4 flex justify-center px-4 pt-12\" : \"grid h-full place-items-center px-4\"}>\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"flex max-w-sm items-center gap-3 rounded-control-lg border border-border bg-surface px-4 py-3 text-sm text-fg shadow-[var(--ui-shadow-lg)] animate-[ui-menu-down_180ms_cubic-bezier(0.2,0.9,0.3,1)]\"\n >\n <ActivityIndicator variant={overlayIndicator} size=\"sm\" label=\"\" aria-hidden=\"true\" role={undefined} />\n <div className=\"min-w-0 flex-1 font-medium\">{overlayMessage}</div>\n {onCancelLoading && (\n <Button size=\"sm\" variant=\"ghost\" onClick={onCancelLoading} className=\"-me-1.5\">\n Cancel\n </Button>\n )}\n </div>\n </div>\n </div>\n )}\n {!resolvedStatus && (\n <span className=\"sr-only\" aria-live=\"polite\">\n {refreshing ? `Refreshing ${caption.toLowerCase()}…` : justRefreshed ? `${caption} updated.` : \"\"}\n </span>\n )}\n {resolvedStatus && <StatusLine resolved={resolvedStatus} cards={cards} onRetry={onRefresh ? () => void runRefresh() : undefined} />}\n <div\n ref={frameRef}\n className={cn(\n \"relative overflow-auto rounded-card border border-border bg-surface\",\n resolvedStatus && \"rounded-t-none border-t-0\",\n cards && \"@max-[40rem]:overflow-visible @max-[40rem]:border-0 @max-[40rem]:bg-transparent\",\n justRefreshed && refreshIndicator !== \"none\" && \"animate-[ui-refresh-done_750ms_ease-out] motion-reduce:animate-none\"\n )}\n style={{ maxHeight }}\n aria-busy={loading || refreshing || undefined}\n >\n <table role=\"table\" className={cn(\"w-full border-separate border-spacing-0 text-sm\", cardTable)}>\n <caption className={showCaption ? \"px-4 pt-3 text-start font-medium text-fg\" : \"sr-only\"}>\n {caption}\n {sort && <span className=\"sr-only\">, sorted by {headerLabel(columns.find((c) => c.key === sort.key)!)} {sort.direction === \"asc\" ? \"ascending\" : \"descending\"}</span>}\n </caption>\n <thead role=\"rowgroup\" className={cn(cardHead)}>\n <tr role=\"row\">\n {selectable && (\n <th role=\"columnheader\" scope=\"col\" className={cn(\"sticky top-0 z-10 w-10 border-b border-border bg-surface\", pad, \"pe-0\")}>\n <RowCheckbox\n label={allOnPage ? \"Unselect all rows on this page\" : \"Select all rows on this page\"}\n checked={allOnPage}\n indeterminate={selectedOnPage.length > 0 && !allOnPage}\n onChange={(v) =>\n setSelected(v ? Array.from(new Set([...selected, ...pageKeys])) : selected.filter((k) => !pageKeys.includes(k)))\n }\n />\n </th>\n )}\n {columns.map((c, i) => {\n const dir = sort?.key === c.key ? sort.direction : null;\n return (\n <th\n key={c.key}\n role=\"columnheader\"\n scope=\"col\"\n aria-sort={c.sortable ? (dir === \"asc\" ? \"ascending\" : dir === \"desc\" ? \"descending\" : \"none\") : undefined}\n className={cn(\n \"sticky top-0 z-10 whitespace-nowrap border-b border-border bg-surface text-[0.8125rem] font-medium text-fg-muted\",\n pad,\n alignClass[c.align ?? \"start\"],\n !cards && i === 0 && \"start-0 z-20\",\n c.className\n )}\n style={{ width: c.width }}\n >\n {c.sortable ? (\n <button\n type=\"button\"\n onClick={() => toggleSort(c.key)}\n className={cn(\n \"-mx-1.5 inline-flex cursor-pointer items-center gap-1 rounded-control-sm px-1.5 py-0.5 hover:bg-secondary-hover hover:text-fg\",\n \"focus-visible:outline-2 focus-visible:outline-ring\",\n dir && \"text-fg\",\n c.align === \"end\" && \"flex-row-reverse\"\n )}\n >\n {c.header}\n <SortIcon dir={dir} />\n </button>\n ) : (\n c.header\n )}\n </th>\n );\n })}\n {rowActions && (\n <th role=\"columnheader\" scope=\"col\" className={cn(\"sticky top-0 z-10 w-12 border-b border-border bg-surface\", pad)}>\n <span className=\"sr-only\">Actions</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody role=\"rowgroup\" className={cn(cardBody)}>\n {loading && paged.length === 0\n ? Array.from({ length: Math.min(pageSize || 5, 5) }, (_, i) => (\n <tr role=\"row\" key={`sk-${i}`} className={cn(cardRow)}>\n {Array.from({ length: colCount }, (_, j) => (\n <td role=\"cell\" key={j} className={cn(\"border-b border-border\", pad, cards && \"@max-[40rem]:border-0 @max-[40rem]:p-0\")}>\n <Skeleton className=\"h-3.5 w-full max-w-32 rounded-full\" />\n </td>\n ))}\n </tr>\n ))\n : paged.map((row, ri) => {\n const k = keyOf(row);\n const isSel = selected.includes(k);\n return (\n <tr\n role=\"row\"\n key={k}\n aria-selected={selectable ? isSel : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(\n \"group/row transition-colors\",\n onRowClick && \"cursor-pointer\",\n \"hover:[&>td]:bg-secondary-hover/50\",\n striped && ri % 2 === 1 && \"[&>td]:bg-secondary-hover/35\",\n isSel && \"[&>td]:bg-[color:color-mix(in_srgb,var(--color-primary)_6%,var(--color-surface))]\",\n refreshing && \"opacity-70 transition-opacity duration-200\",\n cardRow,\n cards && isSel && \"@max-[40rem]:border-primary\"\n )}\n >\n {selectable && (\n <td role=\"cell\" className={cn(\"border-b border-border\", pad, \"pe-0\", cards && \"@max-[40rem]:absolute @max-[40rem]:start-4 @max-[40rem]:top-4 @max-[40rem]:border-0 @max-[40rem]:p-0\")}>\n <RowCheckbox\n label={`Select ${String(valueOf(primaryCol, row) ?? k)}`}\n checked={isSel}\n onChange={(v) => setSelected(v ? [...selected, k] : selected.filter((x) => x !== k))}\n />\n </td>\n )}\n {columns.map((c, i) => {\n const isPrimary = c === primaryCol;\n const content = c.cell ? c.cell(row) : String(valueOf(c, row) ?? \"\");\n return (\n <td\n key={c.key}\n role=\"cell\"\n data-label={typeof c.header === \"string\" ? c.header : \"\"}\n className={cn(\n \"border-b border-border align-middle text-fg\",\n ri === paged.length - 1 && \"border-b-0\",\n pad,\n alignClass[c.align ?? \"start\"],\n !cards && i === 0 && \"sticky start-0 z-[1] bg-surface\",\n cardCell,\n cards && isPrimary && \"@max-[40rem]:order-first @max-[40rem]:mb-1 @max-[40rem]:block @max-[40rem]:text-start @max-[40rem]:text-[0.9375rem] @max-[40rem]:font-semibold @max-[40rem]:before:hidden\",\n cards && isPrimary && selectable && \"@max-[40rem]:ps-7\",\n cards && isPrimary && rowActions && \"@max-[40rem]:pe-10\",\n cards && c.hideOnMobile && \"@max-[40rem]:hidden\",\n c.className\n )}\n >\n {content}\n </td>\n );\n })}\n {rowActions && (\n <td\n role=\"cell\"\n onClick={(e) => e.stopPropagation()}\n className={cn(\n \"border-b border-border text-end\",\n ri === paged.length - 1 && \"border-b-0\",\n density === \"compact\" ? \"px-2 py-1\" : \"px-2 py-1.5\",\n cards && \"@max-[40rem]:absolute @max-[40rem]:end-2.5 @max-[40rem]:top-2.5 @max-[40rem]:border-0 @max-[40rem]:p-0\"\n )}\n >\n {rowActions(row)}\n </td>\n )}\n </tr>\n );\n })}\n {!loading && paged.length === 0 && (\n <tr role=\"row\" className={cn(cards && \"@max-[40rem]:block @max-[40rem]:rounded-card @max-[40rem]:border @max-[40rem]:border-border @max-[40rem]:bg-surface\")}>\n <td role=\"cell\" colSpan={colCount} className={cn(\"px-4\", cards && \"@max-[40rem]:block\")}>\n {emptyContent}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n\n {/* Footer: count, page size, pages */}\n {(pageSize > 0 || totalRows > 0) && (\n <div className=\"flex flex-wrap items-center justify-between gap-x-4 gap-y-2 text-sm text-fg-muted\">\n <p aria-live=\"polite\" className=\"tabular-nums\">\n {totalRows === 0 ? \"No rows\" : pageSize > 0 ? `${from}–${to} of ${totalRows}` : `${totalRows} rows`}\n </p>\n {pageSize > 0 && (\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"hidden sm:inline\">Rows per page</span>\n <Select\n size=\"sm\"\n searchable={false}\n aria-label=\"Rows per page\"\n value={String(pageSize)}\n onChange={(v) => {\n if (!v) return;\n setPageSize(Number(v));\n setPage(1);\n }}\n options={pageSizeOptions.map((n) => ({ value: String(n), label: String(n) }))}\n className=\"w-20\"\n />\n </div>\n <nav aria-label={`${caption} pages`} className=\"flex items-center gap-1\">\n <Button size=\"sm\" variant=\"ghost\" iconOnly aria-label=\"Previous page\" disabled={page <= 1} onClick={() => setPage((p) => p - 1)}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 5l-5 5 5 5\" />\n </svg>\n </Button>\n <span className=\"min-w-16 text-center tabular-nums text-fg\" aria-current=\"page\">\n {page} / {pageCount}\n </span>\n <Button size=\"sm\" variant=\"ghost\" iconOnly aria-label=\"Next page\" disabled={page >= pageCount} onClick={() => setPage((p) => p + 1)}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M8 5l5 5-5 5\" />\n </svg>\n </Button>\n </nav>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useField, useFieldControlProps } from \"../input/Field\";\n\n/*\n * Checkbox, CheckboxGroup, RadioGroup + Radio, and Switch.\n * All are real <input>s underneath (styled with appearance: none), so keyboard use,\n * screen readers and form posts work exactly like native controls. Unchecked boxes sit\n * slightly sunken like the text fields; checked ones are filled like a primary button.\n */\n\ntype Size = \"sm\" | \"md\";\n\n/** Label + description beside a control. */\nfunction LabelText({ label, description, size, disabled }: { label?: React.ReactNode; description?: React.ReactNode; size: Size; disabled?: boolean }) {\n if (!label && !description) return null;\n return (\n <span className={cn(\"grid min-w-0 gap-0.5\", disabled && \"opacity-55\")}>\n {label && <span className={cn(\"font-medium leading-snug text-fg\", size === \"sm\" ? \"text-[0.8125rem]\" : \"text-sm\")}>{label}</span>}\n {description && <span className={cn(\"leading-relaxed text-fg-muted\", size === \"sm\" ? \"text-xs\" : \"text-[0.8125rem]\")}>{description}</span>}\n </span>\n );\n}\n\nconst boxBase = [\n \"peer absolute inset-0 m-0 size-full p-0 cursor-pointer appearance-none border bg-surface outline-none transition-[background-color,border-color,box-shadow] duration-100\",\n \"border-border-strong shadow-[inset_0_1px_2px_rgb(var(--ui-shadow-color)/0.08)]\",\n \"hover:border-fg-muted/70\",\n \"focus-visible:ring-3 focus-visible:ring-ring/35 focus-visible:ring-offset-1 focus-visible:ring-offset-bg\",\n \"disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:border-border-strong\",\n \"aria-invalid:border-danger\",\n].join(\" \");\n\nconst filled =\n \"checked:border-primary checked:bg-primary checked:shadow-[inset_0_-1.5px_0_var(--color-primary-edge)] checked:hover:border-primary\";\n\n/* ---------- Checkbox ---------- */\n\nexport interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"onChange\"> {\n label?: React.ReactNode;\n description?: React.ReactNode;\n /** A \"some are selected\" state, e.g. for a select-all box. */\n indeterminate?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n invalid?: boolean;\n size?: Size;\n}\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({ label, description, indeterminate = false, onCheckedChange, onChange, invalid, size = \"md\", className, id, disabled, required, \"aria-describedby\": describedBy, ...props }, ref) => {\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const autoId = React.useId();\n const field = useField();\n // Inside a Field with its own label, the checkbox is the Field's control.\n const control = useFieldControlProps({ id: id ?? (field && !label ? undefined : autoId), invalid, disabled, required, \"aria-describedby\": describedBy });\n React.useEffect(() => {\n if (inputRef.current) inputRef.current.indeterminate = indeterminate;\n }, [indeterminate]);\n const box = size === \"sm\" ? \"size-4\" : \"size-[1.125rem]\";\n\n return (\n <label className={cn(\"group/check inline-flex cursor-pointer items-start gap-2.5\", control.disabled && \"cursor-not-allowed\", className)}>\n <span className={cn(\"relative grid shrink-0 place-items-center\", box, size === \"sm\" ? \"mt-px\" : \"mt-[0.0625rem]\")}>\n <input\n ref={(node) => {\n inputRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n type=\"checkbox\"\n aria-checked={indeterminate ? \"mixed\" : undefined}\n className={cn(boxBase, filled, \"rounded-[0.3rem] indeterminate:border-primary indeterminate:bg-primary\")}\n onChange={(e) => {\n onChange?.(e);\n onCheckedChange?.(e.target.checked);\n }}\n {...control}\n {...props}\n />\n {/* check */}\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n // Whole-pixel size, and lifted by half the checked box's darker bottom edge so it\n // sits in the middle of the visible face rather than the whole box.\n width={size === \"sm\" ? 12 : 14}\n height={size === \"sm\" ? 12 : 14}\n className=\"pointer-events-none relative col-start-1 row-start-1 -translate-y-[0.75px] text-primary-fg opacity-0 peer-checked:opacity-100 peer-indeterminate:opacity-0 peer-checked:[&>path]:animate-[ui-check-draw_180ms_ease-out_both] motion-reduce:peer-checked:[&>path]:animate-none\"\n >\n <path d=\"M3.5 8.25l3 3 6-7\" stroke=\"currentColor\" strokeWidth={2.2} strokeLinecap=\"round\" strokeLinejoin=\"round\" pathLength={1} strokeDasharray=\"1\" />\n </svg>\n {/* dash for indeterminate */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none relative col-start-1 row-start-1 h-[2px] -translate-y-[0.75px] rounded-full bg-primary-fg opacity-0 peer-indeterminate:opacity-100\",\n size === \"sm\" ? \"w-2\" : \"w-2.5\"\n )}\n />\n </span>\n <LabelText label={label} description={description} size={size} disabled={!!control.disabled} />\n </label>\n );\n }\n);\nCheckbox.displayName = \"Checkbox\";\n\n/* ---------- CheckboxGroup ---------- */\n\nexport interface CheckboxGroupProps extends Omit<React.FieldsetHTMLAttributes<HTMLFieldSetElement>, \"onChange\" | \"defaultValue\"> {\n /** The group's label (a legend). Leave it out inside a Field. */\n label?: React.ReactNode;\n description?: React.ReactNode;\n options: Array<{ value: string; label: React.ReactNode; description?: React.ReactNode; disabled?: boolean }>;\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n /** Form field name; each checked option posts as name=value (use \"name[]\" for Laravel arrays). */\n name?: string;\n orientation?: \"vertical\" | \"horizontal\";\n size?: Size;\n disabled?: boolean;\n invalid?: boolean;\n}\n\nexport function CheckboxGroup({ label, description, options, value, defaultValue = [], onValueChange, name, orientation = \"vertical\", size = \"md\", disabled, invalid, className, ...props }: CheckboxGroupProps) {\n const [inner, setInner] = React.useState(defaultValue);\n const current = value ?? inner;\n const field = useField();\n const set = (v: string, on: boolean) => {\n const next = on ? [...current, v] : current.filter((x) => x !== v);\n if (value === undefined) setInner(next);\n onValueChange?.(next);\n };\n return (\n <fieldset\n aria-labelledby={!label ? field?.labelId : undefined}\n aria-describedby={field?.descriptionId || field?.errorId ? [field?.descriptionId, field?.errorId].filter(Boolean).join(\" \") : undefined}\n disabled={disabled ?? field?.disabled}\n className={cn(\"m-0 grid min-w-0 gap-3 border-0 p-0\", className)}\n {...props}\n >\n {label && <legend className=\"mb-1 p-0 text-sm font-medium text-fg\">{label}</legend>}\n {description && <p className=\"-mt-2 text-[0.8125rem] text-fg-muted\">{description}</p>}\n <div className={cn(orientation === \"horizontal\" ? \"flex flex-wrap gap-x-6 gap-y-3\" : \"grid gap-3\")}>\n {options.map((o) => (\n <Checkbox\n key={o.value}\n name={name}\n value={o.value}\n label={o.label}\n description={o.description}\n disabled={o.disabled}\n invalid={invalid ?? field?.invalid}\n size={size}\n checked={current.includes(o.value)}\n onCheckedChange={(on) => set(o.value, on)}\n id={undefined}\n aria-describedby={undefined}\n />\n ))}\n </div>\n </fieldset>\n );\n}\n\n/* ---------- RadioGroup + Radio ---------- */\n\ntype RadioCtx = { name: string; value: string | null; set: (v: string) => void; size: Size; invalid: boolean; disabled: boolean };\nconst RadioContext = React.createContext<RadioCtx | null>(null);\n\nexport interface RadioGroupProps extends Omit<React.FieldsetHTMLAttributes<HTMLFieldSetElement>, \"onChange\" | \"defaultValue\"> {\n label?: React.ReactNode;\n description?: React.ReactNode;\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n /** Form field name. Generated if you leave it out. */\n name?: string;\n orientation?: \"vertical\" | \"horizontal\";\n size?: Size;\n disabled?: boolean;\n invalid?: boolean;\n required?: boolean;\n}\n\nexport function RadioGroup({ label, description, value, defaultValue = null, onValueChange, name, orientation = \"vertical\", size = \"md\", disabled, invalid, required, className, children, ...props }: RadioGroupProps) {\n const [inner, setInner] = React.useState(defaultValue);\n const current = value !== undefined ? value : inner;\n const auto = React.useId();\n const field = useField();\n const set = (v: string) => {\n if (value === undefined) setInner(v);\n onValueChange?.(v);\n };\n return (\n <RadioContext.Provider value={{ name: name ?? `radio-${auto}`, value: current, set, size, invalid: !!(invalid ?? field?.invalid), disabled: !!(disabled ?? field?.disabled) }}>\n <fieldset\n role=\"radiogroup\"\n aria-labelledby={!label ? field?.labelId : undefined}\n aria-required={required || field?.required || undefined}\n aria-describedby={field?.descriptionId || field?.errorId ? [field?.descriptionId, field?.errorId].filter(Boolean).join(\" \") : undefined}\n disabled={disabled ?? field?.disabled}\n className={cn(\"m-0 grid min-w-0 gap-3 border-0 p-0\", className)}\n {...props}\n >\n {label && <legend className=\"mb-1 p-0 text-sm font-medium text-fg\">{label}</legend>}\n {description && <p className=\"-mt-2 text-[0.8125rem] text-fg-muted\">{description}</p>}\n <div className={cn(orientation === \"horizontal\" ? \"flex flex-wrap gap-x-6 gap-y-3\" : \"grid gap-3\")}>{children}</div>\n </fieldset>\n </RadioContext.Provider>\n );\n}\n\nexport interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"value\" | \"name\"> {\n value: string;\n label?: React.ReactNode;\n description?: React.ReactNode;\n}\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(({ value, label, description, disabled, className, ...props }, ref) => {\n const g = React.useContext(RadioContext);\n if (!g) throw new Error(\"<Radio> must be used inside <RadioGroup>.\");\n const off = disabled || g.disabled;\n const box = g.size === \"sm\" ? \"size-4\" : \"size-[1.125rem]\";\n return (\n <label className={cn(\"inline-flex cursor-pointer items-start gap-2.5\", off && \"cursor-not-allowed\", className)}>\n <span className={cn(\"relative grid shrink-0 place-items-center\", box, \"mt-px\")}>\n <input\n ref={ref}\n type=\"radio\"\n name={g.name}\n value={value}\n checked={g.value === value}\n disabled={off}\n aria-invalid={g.invalid || undefined}\n onChange={() => g.set(value)}\n className={cn(boxBase, filled, \"rounded-full\")}\n {...props}\n />\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none relative -translate-y-[0.75px] scale-0 rounded-full bg-primary-fg transition-transform duration-150 ease-out peer-checked:scale-100 motion-reduce:transition-none\",\n g.size === \"sm\" ? \"size-1.5\" : \"size-2\"\n )}\n />\n </span>\n <LabelText label={label} description={description} size={g.size} disabled={off} />\n </label>\n );\n});\nRadio.displayName = \"Radio\";\n\n/* ---------- Switch ---------- */\n\nexport type SwitchVariant = \"labelled\" | \"mark\" | \"liquid\";\n\n/** Theme colors for the \"on\" state, or any CSS color (e.g. \"#16a34a\", \"oklch(0.7 0.2 150)\"). */\nexport type SwitchColor = \"primary\" | \"secondary\" | \"tertiary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | (string & {});\n\n// Each theme color sets the fill and the text/mark color that sits on it.\nconst switchColors: Record<string, [string, string]> = {\n primary: [\"var(--color-primary)\", \"var(--color-primary-fg)\"],\n secondary: [\"var(--color-tone-secondary)\", \"var(--color-tone-secondary-fg)\"],\n tertiary: [\"var(--color-tone-tertiary)\", \"var(--color-tone-tertiary-fg)\"],\n success: [\"var(--color-success)\", \"var(--color-success-fg)\"],\n warning: [\"var(--color-warning)\", \"var(--color-warning-fg)\"],\n danger: [\"var(--color-danger)\", \"var(--color-danger-fg)\"],\n info: [\"var(--color-info)\", \"var(--color-info-fg)\"],\n};\n\nexport interface SwitchProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"onChange\"> {\n label?: React.ReactNode;\n description?: React.ReactNode;\n /**\n * - \"labelled\" (default): a pill with the word inside — \"On\" in white on blue, \"Off\" in gray\n * - \"mark\": the knob shows × when off and bends into a blue ✓ when on\n * - \"liquid\": an outlined pill that floods blue from the knob when turned on\n */\n variant?: SwitchVariant;\n /**\n * Color when on. \"primary\" (the default blue), \"secondary\" (green), \"tertiary\" (orange) —\n * theme tokens you can rebrand — or success, warning, danger, info, or any CSS color.\n */\n color?: SwitchColor;\n /** Text color on a custom `color` (for \"labelled\"). Default white. */\n colorForeground?: string;\n /**\n * Called when flipped. Return a Promise (e.g. saving the setting) and the knob shows a\n * spinner until it settles — and flips back if it fails.\n */\n onCheckedChange?: (checked: boolean) => void | Promise<unknown>;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n size?: Size;\n /** Put the label before the switch, spread across the row — common in settings lists. */\n labelPosition?: \"end\" | \"start\";\n /** Words for the \"labelled\" variant. Default \"On\" / \"Off\". */\n onLabel?: string;\n offLabel?: string;\n}\n\n// Track width, knob size and inset for each variant and size. Knob travel = width − knob − 2 × inset.\nconst switchGeometry: Record<SwitchVariant, Record<Size, { w: number; h: number; k: number; pad: number }>> = {\n labelled: { md: { w: 68, h: 32, k: 26, pad: 3 }, sm: { w: 54, h: 24, k: 18, pad: 3 } },\n mark: { md: { w: 52, h: 32, k: 26, pad: 3 }, sm: { w: 40, h: 24, k: 18, pad: 3 } },\n liquid: { md: { w: 56, h: 32, k: 24, pad: 4 }, sm: { w: 44, h: 24, k: 16, pad: 4 } },\n};\n\nconst knobShadow = \"shadow-[0_2px_4px_rgb(0_0_0/0.18),0_0_0_0.5px_rgb(0_0_0/0.06)]\";\nconst spring = \"ease-[cubic-bezier(0.3,1.35,0.5,1)]\";\n\n/** A switch for settings that take effect right away. Three looks: labelled, mark and liquid. */\nexport const Switch = React.forwardRef<HTMLInputElement, SwitchProps>(\n (\n {\n label,\n description,\n variant = \"labelled\",\n color = \"primary\",\n colorForeground,\n onCheckedChange,\n onChange,\n size = \"md\",\n labelPosition = \"end\",\n onLabel = \"On\",\n offLabel = \"Off\",\n checked: checkedProp,\n defaultChecked,\n disabled,\n className,\n id,\n \"aria-describedby\": describedBy,\n ...props\n },\n ref\n ) => {\n const autoId = React.useId();\n const field = useField();\n const control = useFieldControlProps({ id: id ?? (field && !label ? undefined : autoId), disabled, \"aria-describedby\": describedBy });\n const [inner, setInner] = React.useState(!!defaultChecked);\n const [pending, setPending] = React.useState<boolean | null>(null); // optimistic value while saving\n const controlled = checkedProp !== undefined;\n const checked = pending ?? (controlled ? !!checkedProp : inner);\n\n const handle = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (pending !== null) return; // still saving the last change\n onChange?.(e);\n const next = e.target.checked;\n const result = onCheckedChange?.(next);\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\n setPending(next);\n (result as Promise<unknown>).then(\n () => {\n if (!controlled) setInner(next);\n setPending(null);\n },\n () => setPending(null) // failed: go back to the previous value\n );\n } else if (!controlled) setInner(next);\n };\n\n const g = switchGeometry[variant][size];\n const liquid = variant === \"liquid\";\n const vars = {\n \"--sw-w\": `${g.w}px`,\n \"--sw-h\": `${g.h}px`,\n \"--sw-k\": `${g.k}px`,\n \"--sw-pad\": `${g.pad}px`,\n \"--sw-travel\": `${g.w - g.k - 2 * g.pad}px`,\n \"--sw-on\": (switchColors[color] ?? [color])[0],\n \"--sw-on-fg\": colorForeground ?? (switchColors[color] ?? [color, \"#ffffff\"])[1],\n } as React.CSSProperties;\n const textSize = size === \"sm\" ? \"text-[0.625rem]\" : \"text-[0.72rem]\";\n\n const spinner = (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className={cn(\"animate-spin text-[color:var(--sw-on)]\", size === \"sm\" ? \"size-2.5\" : \"size-3.5\")} aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"5.5\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"2.2\" />\n <path d=\"M13.5 8A5.5 5.5 0 0 0 8 2.5\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" />\n </svg>\n );\n\n return (\n <label\n className={cn(\n \"inline-flex cursor-pointer items-start gap-3\",\n labelPosition === \"start\" && \"w-full flex-row-reverse justify-between\",\n control.disabled && \"cursor-not-allowed\",\n className\n )}\n >\n <span\n className={cn(\"relative inline-block shrink-0 has-[:disabled]:opacity-50\", size === \"sm\" ? \"mt-0\" : \"-mt-1\")}\n style={{ ...vars, width: g.w, height: g.h }}\n >\n {/* The real checkbox is the track (styled with appearance: none). */}\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n checked={checked}\n aria-busy={pending !== null || undefined}\n onChange={handle}\n className={cn(\n \"peer absolute inset-0 m-0 size-full p-0 cursor-pointer appearance-none rounded-full outline-none transition-[background-color,box-shadow] duration-250 ease-out\",\n \"focus-visible:ring-3 focus-visible:ring-ring/40 focus-visible:ring-offset-2 focus-visible:ring-offset-bg\",\n \"disabled:cursor-not-allowed aria-busy:cursor-progress\",\n liquid\n ? \"bg-surface shadow-[inset_0_0_0_1.5px_var(--color-border-strong),inset_0_1px_2px_rgb(var(--ui-shadow-color)/0.12)] checked:shadow-[inset_0_0_0_1.5px_var(--sw-on)]\"\n : \"bg-border-strong shadow-[inset_0_1px_2px_rgb(var(--ui-shadow-color)/0.2)] checked:bg-[color:var(--sw-on)]\"\n )}\n {...control}\n {...props}\n />\n\n {/* liquid: blue floods out from the knob */}\n {liquid && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 rounded-full bg-[color:var(--sw-on)] transition-[clip-path] duration-[450ms] ease-[cubic-bezier(0.4,0,0.2,1)] motion-reduce:transition-none\",\n \"[clip-path:circle(0%_at_calc(var(--sw-pad)+var(--sw-k)/2)_50%)] peer-checked:[clip-path:circle(125%_at_calc(var(--sw-w)-var(--sw-pad)-var(--sw-k)/2)_50%)]\"\n )}\n />\n )}\n\n {/* labelled: the words live in the track */}\n {variant === \"labelled\" && (\n <>\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 start-0 grid place-items-center font-bold text-[color:var(--sw-on-fg)] opacity-0 transition-opacity duration-200 peer-checked:opacity-100\",\n textSize\n )}\n style={{ width: g.w - g.k - g.pad }}\n >\n {onLabel}\n </span>\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-y-0 end-0 grid place-items-center font-bold text-fg-muted transition-opacity duration-200 peer-checked:opacity-0\",\n textSize\n )}\n style={{ width: g.w - g.k - g.pad }}\n >\n {offLabel}\n </span>\n </>\n )}\n\n {/* the knob: stretches a little while pressed, springs into place */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute start-[var(--sw-pad)] top-[var(--sw-pad)] grid h-[var(--sw-k)] w-[var(--sw-k)] place-items-center rounded-full\",\n `transition-[translate,width,background-color] duration-300 ${spring} motion-reduce:transition-none`,\n \"peer-checked:translate-x-[var(--sw-travel)] rtl:peer-checked:-translate-x-[var(--sw-travel)]\",\n !liquid && \"peer-active:w-[calc(var(--sw-k)+4px)] peer-checked:peer-active:translate-x-[calc(var(--sw-travel)-4px)]\",\n liquid ? cn(\"bg-border-strong shadow-[0_1px_2px_rgb(0_0_0/0.15)] peer-checked:bg-white\") : cn(\"bg-white\", knobShadow)\n )}\n >\n {pending !== null\n ? spinner\n : variant === \"mark\" && (\n <>\n <svg\n viewBox=\"0 0 14 14\"\n aria-hidden=\"true\"\n className={cn(\n \"col-start-1 row-start-1 fill-none stroke-[#8a929e] [stroke-linecap:round] [stroke-width:2.4]\",\n size === \"sm\" ? \"size-2.5\" : \"size-3.5\",\n `transition-[opacity,scale,rotate] duration-300 ${spring} [.peer:checked~*_&]:scale-[0.4] [.peer:checked~*_&]:rotate-45 [.peer:checked~*_&]:opacity-0`\n )}\n >\n <path d=\"M4 4L10 10M10 4L4 10\" />\n </svg>\n <svg\n viewBox=\"0 0 14 14\"\n aria-hidden=\"true\"\n className={cn(\n \"col-start-1 row-start-1 scale-[0.4] -rotate-45 fill-none stroke-[color:var(--sw-on)] opacity-0 [stroke-linecap:round] [stroke-linejoin:round] [stroke-width:2.4]\",\n size === \"sm\" ? \"size-2.5\" : \"size-3.5\",\n `transition-[opacity,scale,rotate] duration-300 ${spring} [.peer:checked~*_&]:scale-100 [.peer:checked~*_&]:rotate-0 [.peer:checked~*_&]:opacity-100`\n )}\n >\n <path d=\"M2.5 7.5L5.5 10.5L11.5 3.5\" />\n </svg>\n </>\n )}\n </span>\n </span>\n <LabelText label={label} description={description} size={size} disabled={!!control.disabled} />\n </label>\n );\n }\n);\nSwitch.displayName = \"Switch\";\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Timeline — \"a thread with beads\".\n * Timeline / TimelineGroup / TimelineItem / TimelineCollapse — a vertical history or process\n * Roadmap — a horizontal, scrollable track of milestones\n *\n * The thread draws itself as it scrolls into view (scroll-driven animation where the browser\n * supports it; otherwise it's simply drawn). In a \"progress\" timeline the traveled part is\n * solid and the future dashed; the current step is a pulsing bead. On wide containers the\n * \"alternate\" layout puts items on both sides of a centered thread.\n */\n\nexport type TimelineTone = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type TimelineStatus = \"past\" | \"current\" | \"upcoming\";\n\ntype TimelineContextValue = { layout: \"left\" | \"alternate\"; variant: \"feed\" | \"progress\"; size: \"sm\" | \"md\"; animated: boolean };\nconst TimelineContext = React.createContext<TimelineContextValue>({ layout: \"left\", variant: \"feed\", size: \"md\", animated: true });\n\nconst toneBead: Record<TimelineTone, string> = {\n neutral: \"border-border-strong bg-surface text-fg-muted\",\n primary: \"border-transparent bg-primary text-primary-fg\",\n success: \"border-transparent bg-success text-success-fg\",\n warning: \"border-transparent bg-warning text-warning-fg\",\n danger: \"border-transparent bg-danger text-danger-fg\",\n info: \"border-transparent bg-info text-info-fg\",\n};\nconst toneDot: Record<TimelineTone, string> = {\n neutral: \"bg-fg-muted\",\n primary: \"bg-primary\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n danger: \"bg-danger\",\n info: \"bg-info\",\n};\n\n/* ---------- time formatting ---------- */\n\nfunction toDate(t: Date | string | number) {\n return t instanceof Date ? t : new Date(t);\n}\n\n/** \"2 hours ago\" for recent times, \"12 Sep\" / \"12 Sep 2025\" otherwise. */\nexport function formatTimelineTime(t: Date | string | number, now = new Date()) {\n const d = toDate(t);\n const diff = (d.getTime() - now.getTime()) / 1000;\n const abs = Math.abs(diff);\n const rtf = new Intl.RelativeTimeFormat(undefined, { numeric: \"auto\" });\n if (abs < 45) return \"just now\";\n if (abs < 3600) return rtf.format(Math.round(diff / 60), \"minute\");\n if (abs < 86400) return rtf.format(Math.round(diff / 3600), \"hour\");\n if (abs < 86400 * 6) return rtf.format(Math.round(diff / 86400), \"day\");\n return d.toLocaleDateString(undefined, {\n day: \"numeric\",\n month: \"short\",\n ...(d.getFullYear() !== now.getFullYear() ? { year: \"numeric\" } : {}),\n });\n}\n\n/** \"Today\", \"Yesterday\", \"Tomorrow\", or \"Friday, 12 September\". */\nexport function formatTimelineDay(t: Date | string | number, now = new Date()) {\n const d = toDate(t);\n const day = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const delta = Math.round((day(d) - day(now)) / 86400000);\n if (delta === 0) return \"Today\";\n if (delta === -1) return \"Yesterday\";\n if (delta === 1) return \"Tomorrow\";\n return d.toLocaleDateString(undefined, {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n ...(d.getFullYear() !== now.getFullYear() ? { year: \"numeric\" } : {}),\n });\n}\n\n/* ---------- Timeline ---------- */\n\nexport interface TimelineProps extends React.OlHTMLAttributes<HTMLOListElement> {\n /**\n * \"left\" (default): the thread on the left, items to the right.\n * \"alternate\": on wide containers, items alternate around a centered thread with times opposite.\n */\n layout?: \"left\" | \"alternate\";\n /**\n * \"feed\" (default): a neutral thread, for activity and history.\n * \"progress\": the traveled thread is solid, the future dashed — for processes and plans.\n */\n variant?: \"feed\" | \"progress\";\n size?: \"sm\" | \"md\";\n /** Draw the thread as it scrolls into view. Default true (skipped with reduced motion). */\n animated?: boolean;\n}\n\nexport function Timeline({ layout = \"left\", variant = \"feed\", size = \"md\", animated = true, className, children, ...props }: TimelineProps) {\n return (\n <TimelineContext.Provider value={{ layout, variant, size, animated }}>\n <div className=\"@container w-full\">\n <ol className={cn(\"relative grid\", className)} {...props}>\n {children}\n </ol>\n </div>\n </TimelineContext.Provider>\n );\n}\n\n/* ---------- TimelineGroup ---------- */\n\nexport interface TimelineGroupProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, \"title\"> {\n /** The heading, e.g. \"Today\". Or pass `date` to have it written for you. */\n label?: React.ReactNode;\n /** A date for the heading: \"Today\", \"Yesterday\", or \"Friday, 12 September\". */\n date?: Date | string | number;\n}\n\n/** A chapter of the timeline, e.g. a day. Its heading sticks while you scroll through it. */\nexport function TimelineGroup({ label, date, className, children, ...props }: TimelineGroupProps) {\n const { layout } = React.useContext(TimelineContext);\n const heading = label ?? (date !== undefined ? formatTimelineDay(date) : null);\n return (\n <li className={cn(\"grid\", className)} {...props}>\n {heading && (\n <div\n className={cn(\n \"sticky top-0 z-10 flex py-2\",\n layout === \"alternate\" ? \"justify-start @min-[48rem]:justify-center\" : \"justify-start\"\n )}\n >\n <span className=\"rounded-full border border-border bg-surface px-3 py-1 text-xs font-medium text-fg shadow-[var(--ui-shadow-sm)]\">\n {heading}\n </span>\n </div>\n )}\n <ol className=\"grid\">{children}</ol>\n </li>\n );\n}\n\n/* ---------- TimelineItem ---------- */\n\nexport interface TimelineItemProps extends Omit<React.LiHTMLAttributes<HTMLLIElement>, \"title\"> {\n title: React.ReactNode;\n /** When it happened. Shown as \"2 hours ago\" (exact time on hover), unless you pass timeLabel. */\n time?: Date | string | number;\n /** Your own time text, e.g. \"Q3 2026\" or \"Step 2\". */\n timeLabel?: React.ReactNode;\n /** The bead: an icon, or an avatar (e.g. <Avatar size=\"sm\" … />). Without either, a small dot. */\n icon?: IconInput;\n avatar?: React.ReactNode;\n tone?: TimelineTone;\n /** past (default), current (a pulsing bead), or upcoming (muted, dashed thread). */\n status?: TimelineStatus;\n /** Something at the right of the title, e.g. a Pill. */\n meta?: React.ReactNode;\n /** Render the body as a card, for longer content like comments. */\n card?: boolean;\n /** Hide the thread after this item (the last item does this automatically only in its group). */\n last?: boolean;\n}\n\nexport function TimelineItem({\n title,\n time,\n timeLabel,\n icon,\n avatar,\n tone,\n status = \"past\",\n meta,\n card = false,\n last = false,\n className,\n children,\n ...props\n}: TimelineItemProps) {\n const { layout, variant, size, animated } = React.useContext(TimelineContext);\n const alt = layout === \"alternate\";\n const bead = size === \"sm\" ? 24 : 30;\n const effectiveTone: TimelineTone = tone ?? (variant === \"progress\" ? (status === \"upcoming\" ? \"neutral\" : \"primary\") : \"neutral\");\n const date = time !== undefined ? toDate(time) : null;\n\n const timeNode =\n timeLabel ??\n (date && (\n <time dateTime={date.toISOString()} title={date.toLocaleString()} className=\"tabular-nums\">\n {formatTimelineTime(date)}\n </time>\n ));\n\n // The thread segment below this bead, down to the next one.\n const future = status !== \"past\";\n const solid = variant === \"progress\" ? !future : true;\n const threadColor =\n variant === \"progress\" && !future ? \"bg-primary\" : \"bg-border\";\n\n const beadNode = avatar ? (\n <span className=\"relative z-[1] grid place-items-center rounded-full ring-4 ring-[color:var(--av-ring,var(--color-bg))]\" style={{ width: bead, height: bead }}>\n {avatar}\n </span>\n ) : icon ? (\n <span\n className={cn(\n \"relative z-[1] grid place-items-center rounded-full border ring-4 ring-[color:var(--color-bg)] [&_i]:text-[0.95em] [&_svg]:size-[55%]\",\n toneBead[effectiveTone],\n status === \"upcoming\" && \"border-dashed bg-surface text-fg-muted\"\n )}\n style={{ width: bead, height: bead, fontSize: bead * 0.5 }}\n >\n {renderIcon(icon)}\n </span>\n ) : (\n <span className=\"relative z-[1] grid place-items-center\" style={{ width: bead, height: bead }}>\n <span\n className={cn(\n \"size-2.5 rounded-full ring-4 ring-[color:var(--color-bg)]\",\n status === \"upcoming\" ? \"border-2 border-dashed border-border-strong bg-bg\" : toneDot[effectiveTone]\n )}\n />\n </span>\n );\n\n const currentHalo =\n status === \"current\" ? (\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 grid place-items-center\">\n <span className=\"absolute size-full animate-[ui-beacon_2s_cubic-bezier(0,0,0.2,1)_infinite] rounded-full bg-primary/40 motion-reduce:hidden\" />\n </span>\n ) : null;\n\n const body = (\n <div className={cn(\"min-w-0\", card && \"rounded-card border border-border bg-surface px-4 py-3\")}>\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-0.5\">\n <div\n className={cn(\n \"min-w-0 flex-1 font-medium leading-snug text-pretty\",\n size === \"sm\" ? \"text-[0.8125rem]\" : \"text-sm\",\n status === \"upcoming\" ? \"text-fg-muted\" : \"text-fg\"\n )}\n >\n {title}\n {status === \"current\" && <span className=\"sr-only\"> (current)</span>}\n {status === \"upcoming\" && <span className=\"sr-only\"> (upcoming)</span>}\n </div>\n {meta}\n {timeNode && (\n <span className={cn(\"shrink-0 text-xs text-fg-muted\", alt && \"@min-[48rem]:hidden\")}>{timeNode}</span>\n )}\n </div>\n {children && (\n <div className={cn(\"mt-1 text-[0.8125rem] leading-relaxed text-fg-muted\", card && \"text-sm text-fg\")}>{children}</div>\n )}\n </div>\n );\n\n const thread = !last && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute bottom-0 w-0.5 -translate-x-1/2\",\n solid ? threadColor : \"bg-[repeating-linear-gradient(to_bottom,var(--color-border-strong)_0_5px,transparent_5px_10px)]\",\n animated && \"ui-thread-draw\"\n )}\n style={{ top: bead + 2, left: \"50%\" }}\n />\n );\n\n const rail = (\n <div className=\"relative flex justify-center\" style={{ width: bead }}>\n <div className=\"relative\" style={{ width: bead, height: bead }}>\n {currentHalo}\n {beadNode}\n </div>\n {thread}\n </div>\n );\n\n if (alt) {\n // Wide: [time | bead | card] on odd items, [card | bead | time] on even items. Narrow: like \"left\".\n return (\n <li\n aria-current={status === \"current\" ? \"step\" : undefined}\n className={cn(\n \"group/item relative grid grid-cols-[auto_1fr] gap-x-4 pb-6 last:pb-2\",\n \"@min-[48rem]:grid-cols-[1fr_auto_1fr] @min-[48rem]:gap-x-6\",\n className\n )}\n {...props}\n >\n <div className=\"hidden pt-[0.3rem] text-end text-xs text-fg-muted @min-[48rem]:block group-even/item:@min-[48rem]:order-3 group-even/item:@min-[48rem]:text-start\">\n {timeNode}\n </div>\n <div className=\"@min-[48rem]:order-2\">{rail}</div>\n <div className=\"min-w-0 @min-[48rem]:order-3 group-even/item:@min-[48rem]:order-1 group-even/item:@min-[48rem]:text-end [&_.flex-wrap]:group-even/item:@min-[48rem]:flex-row-reverse\" style={{ paddingTop: card ? 0 : (bead - 20) / 2 }}>\n {body}\n </div>\n </li>\n );\n }\n\n return (\n <li\n aria-current={status === \"current\" ? \"step\" : undefined}\n className={cn(\"relative grid grid-cols-[auto_1fr] gap-x-3.5 pb-6 last:pb-2\", className)}\n {...props}\n >\n {rail}\n <div className=\"min-w-0\" style={{ paddingTop: card ? 0 : (bead - 20) / 2 }}>\n {body}\n </div>\n </li>\n );\n}\n\n/* ---------- TimelineCollapse ---------- */\n\nexport interface TimelineCollapseProps {\n /** e.g. (n) => `Show ${n} more updates`. */\n label?: (count: number) => React.ReactNode;\n children: React.ReactNode;\n defaultOpen?: boolean;\n}\n\n/** Folds several quiet items into one \"Show 4 more\" line on the thread. */\nexport function TimelineCollapse({ label = (n) => `Show ${n} more update${n === 1 ? \"\" : \"s\"}`, children, defaultOpen = false }: TimelineCollapseProps) {\n const [open, setOpen] = React.useState(defaultOpen);\n const { layout, size } = React.useContext(TimelineContext);\n const count = React.Children.count(children);\n const bead = size === \"sm\" ? 24 : 30;\n if (open) return <>{children}</>;\n return (\n <li\n className={cn(\n \"relative grid grid-cols-[auto_1fr] items-center gap-x-3.5 pb-6\",\n layout === \"alternate\" && \"@min-[48rem]:grid-cols-[1fr_auto_1fr] @min-[48rem]:gap-x-6\"\n )}\n >\n {layout === \"alternate\" && <span className=\"hidden @min-[48rem]:block\" />}\n <div className=\"relative flex justify-center self-stretch\" style={{ width: bead }}>\n <span aria-hidden=\"true\" className=\"absolute inset-y-0 left-1/2 w-0.5 -translate-x-1/2 bg-[repeating-linear-gradient(to_bottom,var(--color-border)_0_2px,transparent_2px_6px)]\" />\n </div>\n <div>\n <button\n type=\"button\"\n onClick={() => setOpen(true)}\n className=\"cursor-pointer rounded-full border border-border bg-surface px-3 py-1 text-xs font-medium text-fg-muted hover:border-border-strong hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n {label(count)}\n </button>\n </div>\n </li>\n );\n}\n\n/* ---------- Roadmap (horizontal) ---------- */\n\nexport interface RoadmapItem {\n /** Short time label on the track, e.g. \"Q3 2026\" or \"Oct\". */\n label: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n status?: \"done\" | \"current\" | \"upcoming\";\n /** Extra content under the description, e.g. Pills. */\n footer?: React.ReactNode;\n}\n\nexport interface RoadmapProps extends React.HTMLAttributes<HTMLDivElement> {\n items: RoadmapItem[];\n /** Accessible name, e.g. \"Product roadmap\". */\n \"aria-label\": string;\n /** Width of each milestone column. Default \"16rem\". */\n itemWidth?: string;\n}\n\n/** A horizontal track of milestones that scrolls sideways, with snap points and edge fades. */\nexport function Roadmap({ items, itemWidth = \"16rem\", className, ...props }: RoadmapProps) {\n const scroller = React.useRef<HTMLOListElement>(null);\n const [edges, setEdges] = React.useState({ start: false, end: false });\n\n const update = React.useCallback(() => {\n const el = scroller.current;\n if (!el) return;\n setEdges({ start: el.scrollLeft > 4, end: el.scrollLeft + el.clientWidth < el.scrollWidth - 4 });\n }, []);\n\n React.useEffect(() => {\n update();\n const el = scroller.current;\n if (!el) return;\n // Start with the current milestone in view.\n const current = el.querySelector<HTMLElement>('[aria-current=\"step\"]');\n if (current) el.scrollLeft = Math.max(0, current.offsetLeft - el.clientWidth / 3);\n update();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(update) : null;\n ro?.observe(el);\n return () => ro?.disconnect();\n }, [update, items.length]);\n\n const scrollBy = (dir: 1 | -1) => scroller.current?.scrollBy({ left: dir * scroller.current.clientWidth * 0.8, behavior: \"smooth\" });\n\n const arrow = (dir: 1 | -1) => (\n <button\n type=\"button\"\n aria-label={dir === 1 ? \"Scroll to later milestones\" : \"Scroll to earlier milestones\"}\n onClick={() => scrollBy(dir)}\n disabled={dir === 1 ? !edges.end : !edges.start}\n className=\"grid size-8 cursor-pointer place-items-center rounded-full border border-border bg-surface text-fg-muted shadow-[var(--ui-shadow-sm)] hover:text-fg disabled:cursor-default disabled:opacity-0 focus-visible:outline-2 focus-visible:outline-ring\"\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-4\">\n <path d={dir === 1 ? \"M8 5l5 5-5 5\" : \"M12 5l-5 5 5 5\"} />\n </svg>\n </button>\n );\n\n return (\n <div className={cn(\"relative w-full min-w-0\", className)} {...props} role=\"region\">\n <div className=\"pointer-events-none absolute inset-x-0 top-[1.9rem] z-10 flex justify-between px-1 [&>*]:pointer-events-auto\">\n {arrow(-1)}\n {arrow(1)}\n </div>\n <ol\n ref={scroller}\n onScroll={update}\n className=\"flex snap-x snap-mandatory overflow-x-auto overscroll-x-contain scroll-smooth pb-2 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden motion-reduce:scroll-auto\"\n style={{\n // Fade the edges that have more content beyond them.\n maskImage: `linear-gradient(to right, ${edges.start ? \"transparent\" : \"#000\"} 0, #000 3rem, #000 calc(100% - 3rem), ${edges.end ? \"transparent\" : \"#000\"} 100%)`,\n WebkitMaskImage: `linear-gradient(to right, ${edges.start ? \"transparent\" : \"#000\"} 0, #000 3rem, #000 calc(100% - 3rem), ${edges.end ? \"transparent\" : \"#000\"} 100%)`,\n }}\n >\n {items.map((item, i) => {\n const status = item.status ?? \"upcoming\";\n const next = items[i + 1]?.status ?? \"upcoming\";\n const lineAfter = status === \"done\" && next !== \"upcoming\" ? \"solid\" : status === \"done\" || status === \"current\" ? \"half\" : \"dashed\";\n return (\n <li\n key={i}\n aria-current={status === \"current\" ? \"step\" : undefined}\n className=\"relative grid shrink-0 snap-start content-start gap-3 pe-4\"\n style={{ width: itemWidth }}\n >\n <span className={cn(\"text-xs font-medium tabular-nums\", status === \"upcoming\" ? \"text-fg-muted\" : \"text-primary\")}>{item.label}</span>\n {/* the track: bead + line to the next milestone */}\n <div className=\"relative flex h-4 items-center\">\n {i < items.length - 1 && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute start-4 -end-0 h-0.5\",\n lineAfter === \"solid\" && \"bg-primary\",\n lineAfter === \"half\" && \"bg-[linear-gradient(to_right,var(--color-primary)_0_50%,transparent_50%),repeating-linear-gradient(to_right,var(--color-border-strong)_0_6px,transparent_6px_11px)]\",\n lineAfter === \"dashed\" && \"bg-[repeating-linear-gradient(to_right,var(--color-border-strong)_0_6px,transparent_6px_11px)]\"\n )}\n />\n )}\n <span className=\"relative grid size-4 place-items-center\">\n {status === \"current\" && (\n <span aria-hidden=\"true\" className=\"absolute size-full animate-[ui-beacon_2s_cubic-bezier(0,0,0.2,1)_infinite] rounded-full bg-primary/40 motion-reduce:hidden\" />\n )}\n <span\n className={cn(\n \"relative grid size-4 place-items-center rounded-full\",\n status === \"done\" && \"bg-primary text-primary-fg\",\n status === \"current\" && \"border-[3px] border-primary bg-surface\",\n status === \"upcoming\" && \"border-2 border-dashed border-border-strong bg-surface\"\n )}\n >\n {status === \"done\" && (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={3} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-2.5\">\n <path d=\"M4.5 10.5l3.5 3.5 7.5-8\" />\n </svg>\n )}\n </span>\n </span>\n </div>\n <div\n className={cn(\n \"grid gap-1 rounded-card border p-3.5\",\n status === \"current\" ? \"border-primary bg-[color:color-mix(in_srgb,var(--color-primary)_5%,var(--color-surface))]\" : \"border-border bg-surface\",\n status === \"upcoming\" && \"border-dashed\"\n )}\n >\n <p className={cn(\"text-sm font-semibold leading-snug\", status === \"upcoming\" ? \"text-fg-muted\" : \"text-fg\")}>\n {item.title}\n <span className=\"sr-only\"> — {status === \"done\" ? \"done\" : status === \"current\" ? \"in progress\" : \"planned\"}</span>\n </p>\n {item.description && <p className=\"text-[0.8125rem] leading-relaxed text-fg-muted\">{item.description}</p>}\n {item.footer && <div className=\"mt-1.5 flex flex-wrap gap-1.5\">{item.footer}</div>}\n </div>\n </li>\n );\n })}\n </ol>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button, type ButtonProps } from \"../button/Button\";\nimport { useField, useFieldControlProps } from \"../input/Field\";\nimport { controlFrame, type ControlRounded } from \"../input/controlStyles\";\nimport {\n useFileUploads,\n formatBytes,\n describeAccept,\n type UploadFn,\n type UploadItem,\n type UseFileUploadsOptions,\n} from \"./useFileUploads\";\n\n/*\n * File upload, three ways:\n * FileDropzone drag and drop (or click, or paste) — with a list of files and their progress\n * FileInput a redesigned <input type=\"file\"> field for forms\n * FileUploadButton a button that picks a file, then shows its name, progress % and \"Upload complete\"\n * All share the same engine (useFileUploads) and upload with your function — xhrUpload(url) for most APIs.\n */\n\n/* ---------- icons ---------- */\n\nconst I = ({ d, className }: { d: string | string[]; className?: string }) => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className={className}>\n {(Array.isArray(d) ? d : [d]).map((p) => (\n <path key={p} d={p} />\n ))}\n </svg>\n);\nconst icons = {\n upload: [\"M10 13V3.5\", \"M6 7l4-4 4 4\", \"M3.5 12.5v2a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-2\"],\n file: [\"M11.5 2.5H6a1.5 1.5 0 0 0-1.5 1.5v12A1.5 1.5 0 0 0 6 17.5h8a1.5 1.5 0 0 0 1.5-1.5V6.5z\", \"M11.5 2.5v4h4\"],\n check: \"M4.5 10.5l3.5 3.5 7.5-8\",\n x: [\"M6 6l8 8\", \"M14 6l-8 8\"],\n retry: [\"M16 10a6 6 0 1 1-1.8-4.3\", \"M16 3.5v3.3h-3.3\"],\n alert: [\"M10 6.5v4.5\", \"M10 13.8v.01\", \"M10 2.5l7.5 13H2.5z\"],\n};\n\nfunction fileKind(file: File) {\n const n = file.name.toLowerCase();\n if (file.type.startsWith(\"image/\")) return \"IMG\";\n if (n.endsWith(\".pdf\")) return \"PDF\";\n if (/\\.(xlsx?|csv|numbers)$/.test(n)) return \"XLS\";\n if (/\\.(docx?|rtf|odt|pages)$/.test(n)) return \"DOC\";\n if (/\\.(zip|rar|7z|gz)$/.test(n)) return \"ZIP\";\n if (file.type.startsWith(\"video/\")) return \"VID\";\n if (file.type.startsWith(\"audio/\")) return \"AUD\";\n return (n.split(\".\").pop() ?? \"FILE\").slice(0, 4).toUpperCase();\n}\nconst kindColor: Record<string, string> = {\n PDF: \"text-danger\",\n XLS: \"text-success\",\n DOC: \"text-info\",\n ZIP: \"text-warning\",\n};\n\n/** \"a-very-long-file-name-2026.pdf\" → \"a-very-long-fi…2026.pdf\" — keeps the extension visible. */\nfunction middleTruncate(name: string, max = 34) {\n if (name.length <= max) return name;\n const dot = name.lastIndexOf(\".\");\n const tail = dot > 0 && name.length - dot <= 8 ? name.slice(dot - 4) : name.slice(-8);\n return `${name.slice(0, max - tail.length - 1)}…${tail}`;\n}\n\n/* ---------- FileList ---------- */\n\nexport interface FileListProps extends React.HTMLAttributes<HTMLUListElement> {\n items: UploadItem[];\n onCancel?: (id: string) => void;\n onRetry?: (id: string) => void;\n onRemove?: (id: string) => void;\n}\n\n/** The list of files with thumbnail, size, progress and actions. Used by FileDropzone; usable on its own. */\nexport function FileList({ items, onCancel, onRetry, onRemove, className, ...props }: FileListProps) {\n if (!items.length) return null;\n return (\n <ul className={cn(\"grid gap-2\", className)} {...props}>\n {items.map((it) => (\n <FileRow key={it.id} item={it} onCancel={onCancel} onRetry={onRetry} onRemove={onRemove} />\n ))}\n </ul>\n );\n}\n\nfunction Thumb({ item, size = 40 }: { item: UploadItem; size?: number }) {\n const kind = fileKind(item.file);\n return item.previewUrl ? (\n <img src={item.previewUrl} alt=\"\" className=\"shrink-0 rounded-control object-cover shadow-[inset_0_0_0_1px_rgb(0_0_0/0.06)]\" style={{ width: size, height: size }} />\n ) : (\n <span className=\"relative grid shrink-0 place-items-center rounded-control bg-secondary-hover text-fg-muted\" style={{ width: size, height: size }}>\n <I d={icons.file} className=\"size-[62%]\" />\n <span className={cn(\"absolute bottom-[18%] rounded-[3px] bg-surface px-0.5 text-[0.5rem] font-bold leading-tight tracking-wide\", kindColor[kind] ?? \"text-fg-muted\")}>\n {kind}\n </span>\n </span>\n );\n}\n\nfunction IconAction({ label, d, onClick, danger }: { label: string; d: string | string[]; onClick: () => void; danger?: boolean }) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n onClick={onClick}\n className={cn(\n \"grid size-7 shrink-0 cursor-pointer place-items-center rounded-control-sm text-fg-muted hover:bg-secondary-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-ring\",\n danger && \"hover:text-danger\"\n )}\n >\n <I d={d} className=\"size-4\" />\n </button>\n );\n}\n\nfunction FileRow({ item, onCancel, onRetry, onRemove }: { item: UploadItem } & Pick<FileListProps, \"onCancel\" | \"onRetry\" | \"onRemove\">) {\n const { file, status, progress, error } = item;\n const busy = status === \"uploading\" || status === \"queued\";\n return (\n <li\n className={cn(\n \"relative flex items-center gap-3 overflow-hidden rounded-control-lg border bg-surface p-2.5 pe-2 animate-[ui-menu-down_160ms_ease-out]\",\n status === \"error\" ? \"border-[color:color-mix(in_srgb,var(--color-danger)_45%,transparent)]\" : \"border-border\"\n )}\n >\n <Thumb item={item} />\n <div className=\"grid min-w-0 flex-1 gap-1\">\n <div className=\"flex items-baseline gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-fg\" title={file.name}>\n {middleTruncate(file.name)}\n </span>\n <span className={cn(\"shrink-0 text-xs tabular-nums\", status === \"done\" ? \"text-success\" : status === \"error\" ? \"text-danger\" : \"text-fg-muted\")}>\n {status === \"uploading\" && `${progress}%`}\n {status === \"queued\" && \"Waiting…\"}\n {status === \"done\" && (\n <span className=\"inline-flex items-center gap-1\">\n <I d={icons.check} className=\"size-3.5\" />\n Uploaded\n </span>\n )}\n {status === \"cancelled\" && \"Cancelled\"}\n {status === \"error\" && \"Failed\"}\n {status === \"selected\" && formatBytes(file.size)}\n </span>\n </div>\n {busy ? (\n <div\n role=\"progressbar\"\n aria-label={`Uploading ${file.name}`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n className=\"h-1.5 overflow-hidden rounded-full bg-secondary-hover\"\n >\n <div className=\"h-full rounded-full bg-primary transition-[width] duration-200 ease-out\" style={{ width: `${Math.max(status === \"queued\" ? 0 : 3, progress)}%` }} />\n </div>\n ) : (\n <span className={cn(\"truncate text-xs\", status === \"error\" ? \"text-danger\" : \"text-fg-muted\")}>\n {status === \"error\" ? error : status === \"selected\" ? file.type || \"File\" : formatBytes(file.size)}\n </span>\n )}\n </div>\n <div className=\"flex shrink-0 items-center\">\n {busy && onCancel && <IconAction label={`Cancel upload of ${file.name}`} d={icons.x} onClick={() => onCancel(item.id)} />}\n {(status === \"error\" || status === \"cancelled\") && onRetry && <IconAction label={`Retry ${file.name}`} d={icons.retry} onClick={() => onRetry(item.id)} />}\n {!busy && onRemove && <IconAction label={`Remove ${file.name}`} d={icons.x} onClick={() => onRemove(item.id)} danger />}\n </div>\n {/* A soft sweep on the row while it uploads */}\n {status === \"uploading\" && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 start-0 bg-[color:color-mix(in_srgb,var(--color-primary)_5%,transparent)] transition-[width] duration-200 ease-out\"\n style={{ width: `${progress}%` }}\n />\n )}\n </li>\n );\n}\n\n/* ---------- shared: announcements ---------- */\n\nfunction useAnnouncer(items: UploadItem[]) {\n const [message, setMessage] = React.useState(\"\");\n const prev = React.useRef(new Map<string, string>());\n React.useEffect(() => {\n for (const it of items) {\n const before = prev.current.get(it.id);\n if (before !== it.status) {\n if (it.status === \"done\") setMessage(`${it.file.name} uploaded.`);\n else if (it.status === \"error\") setMessage(`${it.file.name} failed to upload. ${it.error ?? \"\"}`);\n }\n prev.current.set(it.id, it.status);\n }\n }, [items]);\n return <span className=\"sr-only\" aria-live=\"polite\">{message}</span>;\n}\n\nfunction Rejections({ messages, onDismiss }: { messages: string[]; onDismiss: () => void }) {\n if (!messages.length) return null;\n return (\n <div role=\"alert\" className=\"flex items-start gap-2 rounded-control-lg border border-[color:color-mix(in_srgb,var(--color-danger)_40%,transparent)] bg-[color:color-mix(in_srgb,var(--color-danger)_6%,var(--color-surface))] px-3 py-2.5 text-[0.8125rem] text-danger\">\n <I d={icons.alert} className=\"mt-px size-4 shrink-0\" />\n <ul className=\"grid flex-1 gap-0.5\">\n {messages.map((m) => (\n <li key={m}>{m}</li>\n ))}\n </ul>\n <button type=\"button\" aria-label=\"Dismiss\" onClick={onDismiss} className=\"-m-1 grid size-6 cursor-pointer place-items-center rounded-control-sm hover:bg-[color:color-mix(in_srgb,var(--color-danger)_12%,transparent)]\">\n <I d={icons.x} className=\"size-3.5\" />\n </button>\n </div>\n );\n}\n\n/** Keep the hidden <input> holding the selected files, so a normal form post includes them. */\nfunction syncInput(input: HTMLInputElement | null, items: UploadItem[]) {\n if (!input || typeof DataTransfer === \"undefined\") return;\n try {\n const dt = new DataTransfer();\n items.forEach((i) => dt.items.add(i.file));\n input.files = dt.files;\n } catch {\n /* older browsers */\n }\n}\n\n/* ---------- FileDropzone ---------- */\n\nexport interface FileDropzoneProps extends Omit<UseFileUploadsOptions, \"onChange\"> {\n /** Called with the current list (files, statuses, server responses). */\n onChange?: (items: UploadItem[]) => void;\n /** Main line of text. */\n title?: React.ReactNode;\n /** Hint under it. Generated from accept and maxSize if you leave it out. */\n hint?: React.ReactNode;\n /** Adds a hidden file input with this name, for a normal form post (without upload). */\n name?: string;\n disabled?: boolean;\n /** Also accept files pasted with Ctrl/⌘+V while the dropzone is focused. Default true. */\n pasteable?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n id?: string;\n}\n\nexport function FileDropzone({\n title,\n hint,\n name,\n disabled = false,\n pasteable = true,\n size = \"md\",\n className,\n id,\n multiple = true,\n ...options\n}: FileDropzoneProps) {\n const field = useField();\n const control = useFieldControlProps({ id, disabled });\n const off = !!control.disabled;\n const { items, rejections, addFiles, cancel, retry, remove, dismissRejections } = useFileUploads({ ...options, multiple });\n const inputRef = React.useRef<HTMLInputElement>(null);\n const [dragging, setDragging] = React.useState(false);\n const depth = React.useRef(0);\n const hintId = React.useId();\n const announcer = useAnnouncer(items);\n\n React.useEffect(() => {\n if (name) syncInput(inputRef.current, items);\n }, [items, name]);\n\n const autoHint =\n hint ??\n [options.accept && describeAccept(options.accept), options.maxSize && `up to ${formatBytes(options.maxSize)}${multiple ? \" each\" : \"\"}`, options.maxFiles && multiple && `${options.maxFiles} files max`]\n .filter(Boolean)\n .join(\" · \");\n\n const open = () => !off && inputRef.current?.click();\n\n return (\n <div className={cn(\"grid gap-3\", className)}>\n <div\n id={control.id}\n role=\"button\"\n tabIndex={off ? -1 : 0}\n aria-disabled={off || undefined}\n aria-labelledby={field?.labelId}\n aria-describedby={[autoHint ? hintId : undefined, control[\"aria-describedby\"]].filter(Boolean).join(\" \") || undefined}\n onClick={open}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n open();\n }\n }}\n onPaste={(e) => {\n if (!pasteable || off || !e.clipboardData.files.length) return;\n e.preventDefault();\n addFiles(e.clipboardData.files);\n }}\n onDragEnter={(e) => {\n e.preventDefault();\n if (off) return;\n depth.current++;\n setDragging(true);\n }}\n onDragOver={(e) => e.preventDefault()}\n onDragLeave={() => {\n depth.current = Math.max(0, depth.current - 1);\n if (depth.current === 0) setDragging(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n depth.current = 0;\n setDragging(false);\n if (!off && e.dataTransfer.files.length) addFiles(e.dataTransfer.files);\n }}\n className={cn(\n \"group/drop relative grid cursor-pointer justify-items-center gap-2 rounded-card border-2 border-dashed text-center outline-none transition-[border-color,background-color] duration-150\",\n size === \"sm\" ? \"px-4 py-5\" : size === \"lg\" ? \"px-6 py-12\" : \"px-5 py-8\",\n \"border-border-strong bg-surface hover:border-fg-muted/60 hover:bg-secondary-hover/40\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/25\",\n dragging && \"border-primary bg-[color:color-mix(in_srgb,var(--color-primary)_6%,var(--color-surface))] hover:border-primary\",\n control[\"aria-invalid\"] && \"border-danger\",\n off && \"cursor-not-allowed opacity-55 hover:border-border-strong hover:bg-surface\"\n )}\n >\n <span\n className={cn(\n \"grid place-items-center rounded-full bg-secondary-hover text-fg-muted transition-transform duration-200\",\n size === \"sm\" ? \"size-9\" : \"size-11\",\n dragging && \"-translate-y-1 scale-110 bg-primary text-primary-fg motion-reduce:translate-y-0 motion-reduce:scale-100\"\n )}\n >\n <I d={icons.upload} className={size === \"sm\" ? \"size-4\" : \"size-5\"} />\n </span>\n <p className=\"text-sm text-fg\">\n {dragging ? (\n <span className=\"font-medium\">Drop to add {multiple ? \"files\" : \"the file\"}</span>\n ) : (\n title ?? (\n <>\n <span className=\"font-medium text-primary underline-offset-2 group-hover/drop:underline\">Choose {multiple ? \"files\" : \"a file\"}</span> or drag {multiple ? \"them\" : \"it\"} here\n </>\n )\n )}\n </p>\n {autoHint && (\n <p id={hintId} className=\"text-xs text-fg-muted\">\n {autoHint}\n {pasteable && <span className=\"hidden sm:inline\"> · or paste</span>}\n </p>\n )}\n <input\n ref={inputRef}\n type=\"file\"\n name={name}\n accept={options.accept}\n multiple={multiple}\n disabled={off}\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"sr-only\"\n onClick={(e) => e.stopPropagation()}\n onChange={(e) => {\n if (e.target.files?.length) addFiles(e.target.files);\n if (!name) e.target.value = \"\"; // allow picking the same file again\n }}\n />\n </div>\n <Rejections messages={rejections} onDismiss={dismissRejections} />\n <FileList items={items} onCancel={cancel} onRetry={retry} onRemove={remove} aria-label=\"Selected files\" />\n {announcer}\n </div>\n );\n}\n\n/* ---------- FileInput ---------- */\n\nexport interface FileInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"type\" | \"size\" | \"onChange\" | \"value\" | \"defaultValue\"> {\n /** Called with the chosen files (empty when cleared). */\n onFilesChange?: (files: File[]) => void;\n /** Text on the button part. */\n buttonLabel?: string;\n placeholder?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n rounded?: Exclude<ControlRounded, \"full\">;\n invalid?: boolean;\n /** Largest file in bytes; bigger files are refused with a message. */\n maxSize?: number;\n /** Show a × to clear the choice. Default true. */\n clearable?: boolean;\n}\n\n/** A redesigned <input type=\"file\">: a \"Choose file\" button joined to the file name, in the same frame as Input. */\nexport const FileInput = React.forwardRef<HTMLInputElement, FileInputProps>(\n (\n {\n onFilesChange,\n buttonLabel,\n placeholder,\n size = \"md\",\n rounded = \"md\",\n invalid: invalidProp,\n maxSize,\n clearable = true,\n multiple,\n accept,\n id,\n disabled,\n required,\n className,\n \"aria-describedby\": describedBy,\n ...props\n },\n ref\n ) => {\n const errId = React.useId();\n const [files, setFiles] = React.useState<File[]>([]);\n const [problem, setProblem] = React.useState<string>();\n const { invalid, ...control } = useFieldControlProps({\n id,\n invalid: invalidProp,\n disabled,\n required,\n \"aria-describedby\": [describedBy, problem ? errId : undefined].filter(Boolean).join(\" \") || undefined,\n });\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const setRefs = (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n\n const label = files.length === 0 ? (placeholder ?? (multiple ? \"No files chosen\" : \"No file chosen\")) : files.length === 1 ? files[0].name : `${files.length} files`;\n const h = size === \"sm\" ? \"h-8 text-sm\" : size === \"lg\" ? \"h-12 text-base\" : \"h-10 text-[0.9375rem]\";\n\n return (\n <div className={cn(\"grid gap-1\", className)}>\n <label\n data-invalid={invalid || problem ? \"\" : undefined}\n data-disabled={control.disabled ? \"\" : undefined}\n className={cn(controlFrame({ rounded }), h, \"cursor-pointer items-stretch overflow-hidden p-0\", control.disabled && \"cursor-not-allowed\")}\n >\n <span\n className={cn(\n \"flex shrink-0 items-center gap-1.5 border-e border-border-strong bg-secondary-hover font-medium text-fg transition-colors\",\n size === \"sm\" ? \"px-2.5 text-[0.8125rem]\" : \"px-3.5 text-sm\",\n \"[label:hover_&]:bg-border/70\"\n )}\n >\n <I d={icons.upload} className=\"size-4 text-fg-muted\" />\n {buttonLabel ?? (multiple ? \"Choose files\" : \"Choose file\")}\n </span>\n <span className={cn(\"flex min-w-0 flex-1 items-center gap-2 px-3\", files.length ? \"text-fg\" : \"text-fg-muted/80\")} title={files.map((f) => f.name).join(\"\\n\")}>\n <span className=\"truncate\">{files.length === 1 ? middleTruncate(label, 40) : label}</span>\n {files.length === 1 && <span className=\"shrink-0 text-xs tabular-nums text-fg-muted\">{formatBytes(files[0].size)}</span>}\n </span>\n <input\n ref={setRefs}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n className=\"sr-only\"\n {...control}\n onChange={(e) => {\n const picked = Array.from(e.target.files ?? []);\n const tooBig = maxSize ? picked.find((f) => f.size > maxSize) : undefined;\n if (tooBig) {\n setProblem(`${tooBig.name} is ${formatBytes(tooBig.size)}. Choose a file under ${formatBytes(maxSize!)}.`);\n e.target.value = \"\";\n setFiles([]);\n onFilesChange?.([]);\n return;\n }\n setProblem(undefined);\n setFiles(picked);\n onFilesChange?.(picked);\n }}\n {...props}\n />\n {clearable && files.length > 0 && !control.disabled && (\n <button\n type=\"button\"\n aria-label=\"Clear file\"\n onClick={(e) => {\n e.preventDefault();\n if (inputRef.current) inputRef.current.value = \"\";\n setFiles([]);\n setProblem(undefined);\n onFilesChange?.([]);\n inputRef.current?.focus();\n }}\n className=\"me-1.5 grid size-7 shrink-0 cursor-pointer place-items-center self-center rounded-control-sm text-fg-muted hover:bg-secondary-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-ring\"\n >\n <I d={icons.x} className=\"size-4\" />\n </button>\n )}\n </label>\n {problem && (\n <p id={errId} role=\"alert\" className=\"text-[0.8125rem] text-danger\">\n {problem}\n </p>\n )}\n </div>\n );\n }\n);\nFileInput.displayName = \"FileInput\";\n\n/* ---------- FileUploadButton ---------- */\n\nexport interface FileUploadButtonProps extends Omit<ButtonProps, \"onChange\" | \"onClick\" | \"children\"> {\n /** Uploads the chosen file. Use xhrUpload(url) for most endpoints. */\n upload: UploadFn;\n accept?: string;\n maxSize?: number;\n /** Button text. */\n children?: React.ReactNode;\n /** Called when the upload finishes, with the server's response. */\n onUploaded?: (item: UploadItem) => void;\n /** Called when the file is removed after uploading. */\n onRemove?: () => void;\n /** Text once done. Default \"Upload complete\". */\n completeLabel?: string;\n}\n\n/** A button that picks one file, then shows its name, progress %, and \"Upload complete\" when done. */\nexport function FileUploadButton({\n upload,\n accept,\n maxSize,\n children = \"Upload file\",\n onUploaded,\n onRemove,\n completeLabel = \"Upload complete\",\n variant = \"secondary\",\n leadingIcon,\n className,\n ...buttonProps\n}: FileUploadButtonProps) {\n const { items, rejections, addFiles, cancel, retry, remove, dismissRejections } = useFileUploads({ upload, accept, maxSize, multiple: false, onUploaded });\n const inputRef = React.useRef<HTMLInputElement>(null);\n const item = items[items.length - 1];\n const announcer = useAnnouncer(items);\n const pick = () => inputRef.current?.click();\n\n const input = (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n tabIndex={-1}\n aria-hidden=\"true\"\n className=\"sr-only\"\n onChange={(e) => {\n if (e.target.files?.length) addFiles(e.target.files);\n e.target.value = \"\";\n }}\n />\n );\n\n if (!item || item.status === \"cancelled\") {\n return (\n <div className={cn(\"grid justify-items-start gap-2\", className)}>\n <Button variant={variant} leadingIcon={leadingIcon ?? <I d={icons.upload} />} onClick={pick} {...buttonProps}>\n {children}\n </Button>\n {item?.status === \"cancelled\" && <p className=\"text-xs text-fg-muted\">Upload cancelled.</p>}\n <Rejections messages={rejections} onDismiss={dismissRejections} />\n {input}\n {announcer}\n </div>\n );\n }\n\n const { file, status, progress, error } = item;\n const busy = status === \"uploading\" || status === \"queued\";\n return (\n <div className={cn(\"grid w-full max-w-sm gap-2\", className)}>\n <div\n className={cn(\n \"relative flex items-center gap-3 overflow-hidden rounded-control-lg border bg-surface px-3 py-2.5\",\n status === \"done\" ? \"border-[color:color-mix(in_srgb,var(--color-success)_45%,transparent)]\" : status === \"error\" ? \"border-[color:color-mix(in_srgb,var(--color-danger)_45%,transparent)]\" : \"border-border\"\n )}\n >\n {busy && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 start-0 bg-[color:color-mix(in_srgb,var(--color-primary)_7%,transparent)] transition-[width] duration-200 ease-out\"\n style={{ width: `${progress}%` }}\n />\n )}\n <span\n className={cn(\n \"relative grid size-9 shrink-0 place-items-center rounded-full\",\n status === \"done\" ? \"bg-success text-success-fg\" : status === \"error\" ? \"bg-danger text-danger-fg\" : \"bg-secondary-hover text-fg-muted\"\n )}\n >\n {status === \"done\" ? (\n <I d={icons.check} className=\"size-4 [stroke-width:2.4]\" />\n ) : status === \"error\" ? (\n <I d={icons.alert} className=\"size-4\" />\n ) : (\n <svg viewBox=\"0 0 36 36\" className=\"absolute inset-0 size-full -rotate-90\" aria-hidden=\"true\">\n <circle cx=\"18\" cy=\"18\" r=\"16\" fill=\"none\" stroke=\"var(--color-border)\" strokeWidth=\"2.5\" />\n <circle cx=\"18\" cy=\"18\" r=\"16\" fill=\"none\" stroke=\"var(--color-primary)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" pathLength={100} strokeDasharray=\"100\" strokeDashoffset={100 - progress} className=\"transition-[stroke-dashoffset] duration-200\" />\n </svg>\n )}\n {busy && <span className=\"relative text-[0.625rem] font-semibold tabular-nums text-fg\">{progress}</span>}\n </span>\n <div className=\"relative grid min-w-0 flex-1\">\n <span className=\"truncate text-sm font-medium text-fg\" title={file.name}>\n {middleTruncate(file.name, 30)}\n </span>\n <span className={cn(\"truncate text-xs tabular-nums\", status === \"done\" ? \"text-success\" : status === \"error\" ? \"text-danger\" : \"text-fg-muted\")}>\n {busy && (\n <span role=\"progressbar\" aria-label={`Uploading ${file.name}`} aria-valuemin={0} aria-valuemax={100} aria-valuenow={progress}>\n Uploading… {progress}% of {formatBytes(file.size)}\n </span>\n )}\n {status === \"done\" && `${completeLabel} · ${formatBytes(file.size)}`}\n {status === \"error\" && error}\n </span>\n </div>\n <div className=\"relative flex shrink-0 items-center gap-0.5\">\n {busy && <IconAction label={`Cancel upload of ${file.name}`} d={icons.x} onClick={() => cancel(item.id)} />}\n {status === \"error\" && <IconAction label={`Retry ${file.name}`} d={icons.retry} onClick={() => retry(item.id)} />}\n {status === \"done\" && (\n <button type=\"button\" onClick={pick} className=\"cursor-pointer rounded-control-sm px-2 py-1 text-xs font-medium text-primary hover:bg-secondary-hover\">\n Replace\n </button>\n )}\n {!busy && (\n <IconAction\n label={`Remove ${file.name}`}\n d={icons.x}\n danger\n onClick={() => {\n remove(item.id);\n onRemove?.();\n }}\n />\n )}\n </div>\n </div>\n <Rejections messages={rejections} onDismiss={dismissRejections} />\n {input}\n {announcer}\n </div>\n );\n}\n","import * as React from \"react\";\n\n/*\n * The upload engine shared by FileDropzone and FileUploadButton (and exported for custom UIs):\n * checks files against accept / maxSize / maxFiles, keeps a list with status and progress,\n * uploads with your function (a few at a time), and supports cancel, retry and remove.\n */\n\nexport type UploadStatus = \"selected\" | \"queued\" | \"uploading\" | \"done\" | \"error\" | \"cancelled\";\n\nexport interface UploadItem {\n id: string;\n file: File;\n status: UploadStatus;\n /** 0–100 */\n progress: number;\n error?: string;\n /** Whatever your upload function resolved with (e.g. the server's JSON). */\n response?: unknown;\n /** An object URL for image previews. */\n previewUrl?: string;\n}\n\n/** Upload one file. Call onProgress(0–100) as it goes, and stop when signal aborts. */\nexport type UploadFn = (file: File, ctx: { onProgress: (percent: number) => void; signal: AbortSignal }) => Promise<unknown>;\n\nexport interface UseFileUploadsOptions {\n /** Your upload function (see xhrUpload). Without it, files are only selected. */\n upload?: UploadFn;\n /** Same format as <input accept>: \"image/*,.pdf\". */\n accept?: string;\n /** Largest file in bytes. */\n maxSize?: number;\n /** Most files in the list at once. */\n maxFiles?: number;\n multiple?: boolean;\n /** How many upload at the same time. Default 3. */\n concurrency?: number;\n /** Called whenever the list changes. */\n onChange?: (items: UploadItem[]) => void;\n /** Called when one file finishes uploading. */\n onUploaded?: (item: UploadItem) => void;\n}\n\n/* ---------- helpers ---------- */\n\nexport function formatBytes(bytes: number) {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(bytes < 10 * 1024 * 1024 ? 1 : 0)} MB`;\n}\n\n/** Turn an accept string into friendly words: \"image/*,.pdf\" → \"images or PDF\". */\nexport function describeAccept(accept?: string) {\n if (!accept) return \"\";\n const parts = accept\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean)\n .map((p) => {\n if (p === \"image/*\") return \"images\";\n if (p === \"video/*\") return \"videos\";\n if (p === \"audio/*\") return \"audio\";\n if (p.startsWith(\".\")) return p.slice(1).toUpperCase();\n const sub = p.split(\"/\")[1];\n return sub ? sub.toUpperCase().replace(\"JPEG\", \"JPG\").replace(\"SVG+XML\", \"SVG\") : p;\n });\n const unique = Array.from(new Set(parts));\n return unique.length > 1 ? `${unique.slice(0, -1).join(\", \")} or ${unique[unique.length - 1]}` : unique[0];\n}\n\nexport function fileMatchesAccept(file: File, accept?: string) {\n if (!accept) return true;\n const name = file.name.toLowerCase();\n const type = file.type.toLowerCase();\n return accept\n .split(\",\")\n .map((p) => p.trim().toLowerCase())\n .filter(Boolean)\n .some((rule) => {\n if (rule.startsWith(\".\")) return name.endsWith(rule);\n if (rule.endsWith(\"/*\")) return type.startsWith(rule.slice(0, -1));\n return type === rule;\n });\n}\n\nlet counter = 0;\nconst newId = () => `u${Date.now().toString(36)}${(counter++).toString(36)}`;\n\n/* ---------- xhrUpload ---------- */\n\nexport interface XhrUploadOptions {\n /** Form field name for the file. Default \"file\". */\n fieldName?: string;\n method?: \"POST\" | \"PUT\";\n headers?: Record<string, string>;\n /** Extra form fields sent with each file. */\n data?: Record<string, string>;\n /** Send cookies. Default true. */\n withCredentials?: boolean;\n /** Read this cookie and send it as X-XSRF-TOKEN (Laravel). Default \"XSRF-TOKEN\"; false to skip. */\n xsrfCookie?: string | false;\n}\n\n/**\n * An UploadFn for a plain HTTP endpoint, with real upload progress (fetch can't report it).\n * Laravel-friendly: sends the XSRF cookie as a header and turns validation errors into messages.\n */\nexport function xhrUpload(url: string, options: XhrUploadOptions = {}): UploadFn {\n const { fieldName = \"file\", method = \"POST\", headers = {}, data = {}, withCredentials = true, xsrfCookie = \"XSRF-TOKEN\" } = options;\n return (file, { onProgress, signal }) =>\n new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(method, url);\n xhr.withCredentials = withCredentials;\n xhr.setRequestHeader(\"Accept\", \"application/json\");\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n if (xsrfCookie && typeof document !== \"undefined\") {\n const m = document.cookie.match(new RegExp(`(?:^|; )${xsrfCookie}=([^;]*)`));\n if (m) xhr.setRequestHeader(\"X-XSRF-TOKEN\", decodeURIComponent(m[1]));\n }\n for (const [k, v] of Object.entries(headers)) xhr.setRequestHeader(k, v);\n xhr.upload.onprogress = (e) => e.lengthComputable && onProgress((e.loaded / e.total) * 100);\n xhr.onload = () => {\n let body: unknown = xhr.responseText;\n try {\n body = JSON.parse(xhr.responseText);\n } catch {\n /* not JSON */\n }\n if (xhr.status >= 200 && xhr.status < 300) return resolve(body);\n const b = body as { message?: string; errors?: Record<string, string[]> } | null;\n const first = b?.errors ? Object.values(b.errors)[0]?.[0] : undefined;\n reject(new Error(first ?? b?.message ?? `Upload failed (${xhr.status}).`));\n };\n xhr.onerror = () => reject(new Error(\"Couldn't reach the server. Check your connection and try again.\"));\n xhr.onabort = () => reject(new DOMException(\"Upload cancelled\", \"AbortError\"));\n signal.addEventListener(\"abort\", () => xhr.abort());\n const form = new FormData();\n for (const [k, v] of Object.entries(data)) form.append(k, v);\n form.append(fieldName, file);\n xhr.send(form);\n });\n}\n\n/* ---------- the hook ---------- */\n\nexport function useFileUploads({\n upload,\n accept,\n maxSize,\n maxFiles,\n multiple = true,\n concurrency = 3,\n onChange,\n onUploaded,\n}: UseFileUploadsOptions = {}) {\n const [items, setItemsState] = React.useState<UploadItem[]>([]);\n const [rejections, setRejections] = React.useState<string[]>([]);\n const itemsRef = React.useRef(items);\n const controllers = React.useRef(new Map<string, AbortController>());\n const cb = React.useRef({ onChange, onUploaded, upload });\n cb.current = { onChange, onUploaded, upload };\n\n const setItems = React.useCallback((update: (prev: UploadItem[]) => UploadItem[]) => {\n setItemsState((prev) => {\n const next = update(prev);\n itemsRef.current = next;\n cb.current.onChange?.(next);\n return next;\n });\n }, []);\n const patch = React.useCallback(\n (id: string, changes: Partial<UploadItem>) => setItems((prev) => prev.map((it) => (it.id === id ? { ...it, ...changes } : it))),\n [setItems]\n );\n\n const start = React.useCallback(\n (item: UploadItem) => {\n const fn = cb.current.upload;\n if (!fn || controllers.current.has(item.id)) return; // already running\n const controller = new AbortController();\n controllers.current.set(item.id, controller);\n patch(item.id, { status: \"uploading\", progress: 0, error: undefined });\n let last = 0;\n fn(item.file, {\n signal: controller.signal,\n onProgress: (p) => {\n const pct = Math.max(0, Math.min(99, Math.round(p)));\n if (pct !== last) {\n last = pct;\n patch(item.id, { progress: pct });\n }\n },\n }).then(\n (response) => {\n controllers.current.delete(item.id);\n patch(item.id, { status: \"done\", progress: 100, response });\n const done = itemsRef.current.find((i) => i.id === item.id);\n if (done) cb.current.onUploaded?.({ ...done, status: \"done\", progress: 100, response });\n },\n (err: unknown) => {\n controllers.current.delete(item.id);\n if (controller.signal.aborted || (err instanceof DOMException && err.name === \"AbortError\")) {\n patch(item.id, { status: \"cancelled\" });\n } else {\n patch(item.id, { status: \"error\", error: err instanceof Error ? err.message : \"Upload failed. Try again.\" });\n }\n }\n );\n },\n [patch]\n );\n\n // Start queued uploads as slots free up.\n React.useEffect(() => {\n if (!upload) return;\n const running = items.filter((i) => i.status === \"uploading\").length;\n const queued = items.filter((i) => i.status === \"queued\");\n queued.slice(0, Math.max(0, concurrency - running)).forEach(start);\n }, [items, upload, concurrency, start]);\n\n /** Add files (from a picker, a drop or a paste). Invalid ones are listed in `rejections`. */\n const addFiles = React.useCallback(\n (list: FileList | File[]) => {\n const files = Array.from(list);\n const problems: string[] = [];\n const accepted: UploadItem[] = [];\n const room = maxFiles !== undefined ? maxFiles - (multiple ? itemsRef.current.length : 0) : Infinity;\n for (const file of multiple ? files : files.slice(0, 1)) {\n if (!fileMatchesAccept(file, accept)) {\n problems.push(`${file.name} isn't an accepted file type. Use ${describeAccept(accept)}.`);\n } else if (maxSize !== undefined && file.size > maxSize) {\n problems.push(`${file.name} is ${formatBytes(file.size)}. The limit is ${formatBytes(maxSize)}.`);\n } else if (accepted.length >= room) {\n problems.push(`You can add up to ${maxFiles} file${maxFiles === 1 ? \"\" : \"s\"}. ${file.name} wasn't added.`);\n } else {\n accepted.push({\n id: newId(),\n file,\n status: upload ? \"queued\" : \"selected\",\n progress: 0,\n previewUrl: file.type.startsWith(\"image/\") ? URL.createObjectURL(file) : undefined,\n });\n }\n }\n setRejections(problems);\n if (accepted.length) setItems((prev) => (multiple ? [...prev, ...accepted] : accepted));\n return accepted;\n },\n [accept, maxSize, maxFiles, multiple, upload, setItems]\n );\n\n const cancel = React.useCallback((id: string) => controllers.current.get(id)?.abort(), []);\n const retry = React.useCallback((id: string) => patch(id, { status: \"queued\", progress: 0, error: undefined }), [patch]);\n const remove = React.useCallback(\n (id: string) => {\n controllers.current.get(id)?.abort();\n setItems((prev) => {\n const gone = prev.find((i) => i.id === id);\n if (gone?.previewUrl) URL.revokeObjectURL(gone.previewUrl);\n return prev.filter((i) => i.id !== id);\n });\n },\n [setItems]\n );\n const clear = React.useCallback(() => {\n controllers.current.forEach((c) => c.abort());\n setItems((prev) => {\n prev.forEach((i) => i.previewUrl && URL.revokeObjectURL(i.previewUrl));\n return [];\n });\n setRejections([]);\n }, [setItems]);\n\n // Clean up on unmount.\n React.useEffect(\n () => () => {\n controllers.current.forEach((c) => c.abort());\n itemsRef.current.forEach((i) => i.previewUrl && URL.revokeObjectURL(i.previewUrl));\n },\n []\n );\n\n return { items, rejections, addFiles, cancel, retry, remove, clear, dismissRejections: () => setRejections([]) };\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { ActivityIndicator } from \"../activity/Activity\";\n\n/*\n * Toasts — short messages about something that just happened.\n *\n * <Toaster /> once, near the root of the app\n * toast(\"Invoice saved\") from anywhere — components, event handlers, Inertia callbacks\n * toast.success / error / warning / info / loading\n * toast.promise(save(), { loading: \"Saving…\", success: \"Saved\", error: (e) => e.message })\n * toast(\"Invoice deleted\", { action: { label: \"Undo\", onClick: restore } })\n *\n * They stack neatly (and spread out on hover or focus), pause while you're reading them,\n * can be swiped away on touch screens, and are announced to screen readers.\n */\n\nexport type ToastType = \"default\" | \"success\" | \"error\" | \"warning\" | \"info\" | \"loading\";\n\nexport interface ToastOptions {\n /** Reuse an id to update a toast in place instead of adding another. */\n id?: string | number;\n description?: React.ReactNode;\n /** A button in the toast, e.g. Undo. The toast closes after it's clicked. */\n action?: { label: string; onClick: () => void };\n /** How long it stays, in ms. Default 5000 (errors 8000, loading until updated). Infinity to keep it. */\n duration?: number;\n /** Replace the icon. */\n icon?: React.ReactNode;\n /** Show the × button. Default true. */\n dismissible?: boolean;\n onDismiss?: () => void;\n}\n\nexport interface ToastData extends ToastOptions {\n id: string | number;\n type: ToastType;\n title: React.ReactNode;\n createdAt: number;\n dismissed?: boolean;\n}\n\n/* ---------- the store (works outside React) ---------- */\n\ntype Listener = (toasts: ToastData[]) => void;\nlet toasts: ToastData[] = [];\nconst listeners = new Set<Listener>();\nlet counter = 0;\nconst emit = () => listeners.forEach((l) => l(toasts));\n\nfunction upsert(type: ToastType, title: React.ReactNode, options: ToastOptions = {}) {\n const id = options.id ?? `t${++counter}`;\n const existing = toasts.find((t) => t.id === id);\n if (existing) {\n toasts = toasts.map((t) =>\n t.id === id ? { ...t, ...options, type, title, id, dismissed: false, createdAt: Date.now() } : t\n );\n } else {\n toasts = [{ ...options, id, type, title, createdAt: Date.now() }, ...toasts];\n }\n emit();\n return id;\n}\n\nfunction dismiss(id?: string | number) {\n toasts = toasts.map((t) => (id === undefined || t.id === id ? { ...t, dismissed: true } : t));\n emit();\n}\n\nfunction removeNow(id: string | number) {\n const t = toasts.find((x) => x.id === id);\n toasts = toasts.filter((x) => x.id !== id);\n emit();\n t?.onDismiss?.();\n}\n\ntype Message<T> = React.ReactNode | ((value: T) => React.ReactNode);\n\nexport const toast = Object.assign((title: React.ReactNode, options?: ToastOptions) => upsert(\"default\", title, options), {\n success: (title: React.ReactNode, options?: ToastOptions) => upsert(\"success\", title, options),\n error: (title: React.ReactNode, options?: ToastOptions) => upsert(\"error\", title, options),\n warning: (title: React.ReactNode, options?: ToastOptions) => upsert(\"warning\", title, options),\n info: (title: React.ReactNode, options?: ToastOptions) => upsert(\"info\", title, options),\n loading: (title: React.ReactNode, options?: ToastOptions) => upsert(\"loading\", title, options),\n /** Show \"loading\" while a Promise runs, then success or error. Returns the same Promise. */\n promise<T>(\n promise: Promise<T> | (() => Promise<T>),\n messages: { loading: React.ReactNode; success: Message<T>; error: Message<unknown>; description?: React.ReactNode },\n options?: ToastOptions\n ): Promise<T> {\n const p = typeof promise === \"function\" ? promise() : promise;\n const id = upsert(\"loading\", messages.loading, { ...options, description: messages.description });\n p.then(\n (value) => upsert(\"success\", typeof messages.success === \"function\" ? (messages.success as (v: T) => React.ReactNode)(value) : messages.success, { ...options, id, description: undefined }),\n (err) => upsert(\"error\", typeof messages.error === \"function\" ? (messages.error as (e: unknown) => React.ReactNode)(err) : messages.error, { ...options, id, description: undefined })\n );\n return p;\n },\n /** Close one toast, or all of them. */\n dismiss,\n});\n\nfunction useToasts() {\n const [list, setList] = React.useState(toasts);\n React.useEffect(() => {\n listeners.add(setList);\n setList(toasts);\n return () => {\n listeners.delete(setList);\n };\n }, []);\n return list;\n}\n\n/* ---------- Toaster ---------- */\n\nexport type ToasterPosition = \"top-left\" | \"top-center\" | \"top-right\" | \"bottom-left\" | \"bottom-center\" | \"bottom-right\";\n\nexport interface ToasterProps {\n /** Where toasts appear on wide screens. On phones they span the width at the top or bottom. */\n position?: ToasterPosition;\n /** Show every toast spread out, instead of a neat stack that opens on hover. */\n expand?: boolean;\n /** How many are visible at once (the rest wait). Default 3. */\n visibleToasts?: number;\n /** Colored backgrounds for success, error, warning and info. */\n richColors?: boolean;\n /** Show a thin line counting down the time left. Default true. */\n showTimer?: boolean;\n /** Keyboard shortcut to jump to the toasts. Default Alt+T. */\n hotkey?: string[];\n className?: string;\n}\n\nconst GAP = 10;\nconst icons: Record<Exclude<ToastType, \"default\" | \"loading\">, React.ReactNode> = {\n success: <path d=\"M5 10.5l3.2 3.2L15 7\" />,\n error: <><path d=\"M10 6.5v4.5\" /><path d=\"M10 13.8v.01\" /></>,\n warning: <><path d=\"M10 7v4\" /><path d=\"M10 13.8v.01\" /></>,\n info: <><path d=\"M10 9v5\" /><path d=\"M10 6.2v.01\" /></>,\n};\nconst toneBg: Record<Exclude<ToastType, \"default\" | \"loading\">, string> = {\n success: \"bg-success text-success-fg\",\n error: \"bg-danger text-danger-fg\",\n warning: \"bg-warning text-warning-fg\",\n info: \"bg-info text-info-fg\",\n};\nconst richBg: Record<Exclude<ToastType, \"default\" | \"loading\">, string> = {\n success: \"border-[color:color-mix(in_srgb,var(--color-success)_35%,transparent)] bg-[color:color-mix(in_srgb,var(--color-success)_10%,var(--color-surface))]\",\n error: \"border-[color:color-mix(in_srgb,var(--color-danger)_35%,transparent)] bg-[color:color-mix(in_srgb,var(--color-danger)_10%,var(--color-surface))]\",\n warning: \"border-[color:color-mix(in_srgb,var(--color-warning)_35%,transparent)] bg-[color:color-mix(in_srgb,var(--color-warning)_10%,var(--color-surface))]\",\n info: \"border-[color:color-mix(in_srgb,var(--color-info)_35%,transparent)] bg-[color:color-mix(in_srgb,var(--color-info)_10%,var(--color-surface))]\",\n};\n\nexport function Toaster({\n position = \"bottom-right\",\n expand = false,\n visibleToasts = 3,\n richColors = false,\n showTimer = true,\n hotkey = [\"altKey\", \"KeyT\"],\n className,\n}: ToasterProps) {\n const list = useToasts();\n const [hovered, setHovered] = React.useState(false);\n const [focused, setFocused] = React.useState(false);\n const [hidden, setHidden] = React.useState(false);\n const [heights, setHeights] = React.useState<Record<string, number>>({});\n const listRef = React.useRef<HTMLOListElement>(null);\n const top = position.startsWith(\"top\");\n const open = expand || hovered || focused;\n const paused = hovered || focused || hidden;\n\n React.useEffect(() => {\n const onVis = () => setHidden(document.visibilityState === \"hidden\");\n document.addEventListener(\"visibilitychange\", onVis);\n return () => document.removeEventListener(\"visibilitychange\", onVis);\n }, []);\n\n // Hotkey (Alt+T) to move focus to the newest toast.\n React.useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (hotkey.every((k) => (k.endsWith(\"Key\") ? (e as unknown as Record<string, boolean>)[k] : e.code === k))) {\n e.preventDefault();\n listRef.current?.querySelector<HTMLElement>(\"[data-toast]\")?.focus();\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [hotkey]);\n\n const shown = list.filter((t) => !t.dismissed).slice(0, visibleToasts);\n const leaving = list.filter((t) => t.dismissed);\n const visible = [...list.filter((t) => shown.includes(t) || t.dismissed)];\n React.useEffect(() => {\n if (!list.length) {\n setHovered(false);\n setFocused(false);\n }\n }, [list.length]);\n\n const setHeight = React.useCallback((id: string | number, h: number) => {\n setHeights((prev) => (prev[String(id)] === h ? prev : { ...prev, [String(id)]: h }));\n }, []);\n\n const frontHeight = shown[0] ? heights[String(shown[0].id)] ?? 64 : 64;\n\n const horizontal = position.endsWith(\"left\") ? \"sm:start-4 sm:items-start\" : position.endsWith(\"center\") ? \"sm:start-1/2 sm:-translate-x-1/2 sm:items-center\" : \"sm:end-4 sm:items-end\";\n\n return (\n <section\n aria-label=\"Notifications (Alt+T)\"\n tabIndex={-1}\n className={cn(\"pointer-events-none fixed inset-x-0 z-[100] flex flex-col px-3 sm:inset-x-auto sm:w-[22rem] sm:px-0\", top ? \"top-3 sm:top-4\" : \"bottom-3 sm:bottom-4\", horizontal, className)}\n style={top ? { paddingTop: \"env(safe-area-inset-top, 0px)\" } : { paddingBottom: \"env(safe-area-inset-bottom, 0px)\" }}\n >\n <ol\n ref={listRef}\n className=\"pointer-events-auto relative w-full\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocus={() => setFocused(true)}\n onBlur={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node)) setFocused(false);\n }}\n style={{ height: shown.length ? (open ? shown.reduce((s, t) => s + (heights[String(t.id)] ?? 64) + GAP, -GAP) : frontHeight + Math.min(shown.length - 1, 2) * 12) : 0 }}\n >\n {visible.map((t) => {\n const index = shown.indexOf(t);\n const before = shown.slice(0, Math.max(0, index)).reduce((s, x) => s + (heights[String(x.id)] ?? 64) + GAP, 0);\n return (\n <ToastItem\n key={t.id}\n toast={t}\n index={index}\n offset={open ? before : index * 12}\n collapsedScale={open ? 1 : 1 - Math.max(0, index) * 0.05}\n front={index === 0}\n top={top}\n frontHeight={frontHeight}\n open={open}\n paused={paused}\n richColors={richColors}\n showTimer={showTimer}\n onHeight={setHeight}\n leaving={!!t.dismissed || leaving.includes(t)}\n />\n );\n })}\n </ol>\n </section>\n );\n}\n\n/* ---------- one toast ---------- */\n\nfunction ToastItem({\n toast: t,\n index,\n offset,\n collapsedScale,\n front,\n top,\n frontHeight,\n open,\n paused,\n richColors,\n showTimer,\n onHeight,\n leaving,\n}: {\n toast: ToastData;\n index: number;\n offset: number;\n collapsedScale: number;\n front: boolean;\n top: boolean;\n frontHeight: number;\n open: boolean;\n paused: boolean;\n richColors: boolean;\n showTimer: boolean;\n onHeight: (id: string | number, h: number) => void;\n leaving: boolean;\n}) {\n const ref = React.useRef<HTMLLIElement>(null);\n const duration = t.duration ?? (t.type === \"loading\" ? Infinity : t.type === \"error\" ? 8000 : 5000);\n const remaining = React.useRef(duration);\n const startedAt = React.useRef(Date.now());\n const [swipe, setSwipe] = React.useState(0);\n const drag = React.useRef<{ x: number; id: number } | null>(null);\n\n // Report our height for stacking.\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n const measure = () => onHeight(t.id, el.offsetHeight);\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n ro?.observe(el);\n return () => ro?.disconnect();\n }, [t.id, onHeight]);\n\n // Restart the clock when the toast is updated (e.g. loading → success).\n React.useEffect(() => {\n remaining.current = duration;\n }, [t.createdAt, duration]);\n\n // Auto-dismiss, pausing while hovered, focused or the page is hidden. Only the visible ones count down.\n React.useEffect(() => {\n if (leaving || duration === Infinity || paused || index < 0) return;\n startedAt.current = Date.now();\n const timer = window.setTimeout(() => dismiss(t.id), remaining.current);\n return () => {\n window.clearTimeout(timer);\n remaining.current -= Date.now() - startedAt.current;\n };\n }, [paused, leaving, duration, t.id, t.createdAt, index]);\n\n // After the exit animation, remove it from the store.\n React.useEffect(() => {\n if (!leaving) return;\n const timer = window.setTimeout(() => removeNow(t.id), 200);\n return () => window.clearTimeout(timer);\n }, [leaving, t.id]);\n\n const type = t.type;\n const role = type === \"error\" ? \"alert\" : \"status\";\n const hiddenBehind = index >= 3 || index < 0;\n\n const style: React.CSSProperties = {\n // Stacked toasts sit behind the front one; spread out when open.\n transform: leaving\n ? `translateY(${(top ? offset : -offset) + (top ? -14 : 14)}px) scale(0.96)`\n : `translateY(${top ? offset : -offset}px) translateX(${swipe}px) scale(${collapsedScale})`,\n opacity: leaving ? 0 : hiddenBehind && !open ? 0 : Math.max(0, 1 - Math.abs(swipe) / 180),\n zIndex: 100 - Math.max(index, 0),\n ...(open || front ? {} : { height: frontHeight, overflow: \"hidden\" }),\n };\n\n return (\n <li\n ref={ref}\n data-toast=\"\"\n tabIndex={0}\n role={role}\n aria-live={type === \"error\" ? \"assertive\" : \"polite\"}\n aria-atomic=\"true\"\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n dismiss(t.id);\n }\n }}\n onPointerDown={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n drag.current = { x: e.clientX, id: e.pointerId };\n (e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId);\n }}\n onPointerMove={(e) => {\n if (drag.current && drag.current.id === e.pointerId) setSwipe(e.clientX - drag.current.x);\n }}\n onPointerUp={() => {\n if (!drag.current) return;\n drag.current = null;\n if (Math.abs(swipe) > 90) dismiss(t.id);\n else setSwipe(0);\n }}\n className={cn(\n \"absolute inset-x-0 flex touch-pan-y select-none items-start gap-3 rounded-control-lg border p-3.5 pe-3 text-sm outline-none\",\n \"shadow-[var(--ui-shadow-lg)] focus-visible:ring-3 focus-visible:ring-ring/35\",\n top ? \"top-0 origin-bottom\" : \"bottom-0 origin-top\",\n drag.current ? \"\" : \"transition-[transform,opacity,height] duration-300 ease-[cubic-bezier(0.2,0.9,0.3,1)] motion-reduce:transition-none\",\n top ? \"animate-[ui-toast-in-top_320ms_cubic-bezier(0.2,0.9,0.3,1)]\" : \"animate-[ui-toast-in-bottom_320ms_cubic-bezier(0.2,0.9,0.3,1)]\",\n \"motion-reduce:animate-[ui-fade-in_150ms_ease-out]\",\n richColors && type !== \"default\" && type !== \"loading\" ? richBg[type] : \"border-border bg-surface\",\n \"text-fg\"\n )}\n style={style}\n >\n {/* icon */}\n {t.icon ? (\n <span className=\"mt-px shrink-0\">{t.icon}</span>\n ) : type === \"loading\" ? (\n <span className=\"mt-px grid size-5 shrink-0 place-items-center\">\n <ActivityIndicator size=\"sm\" label=\"\" aria-hidden=\"true\" role={undefined} />\n </span>\n ) : type !== \"default\" ? (\n <span className={cn(\"mt-px grid size-5 shrink-0 place-items-center rounded-full\", toneBg[type])}>\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.4} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-3.5\">\n {icons[type]}\n </svg>\n </span>\n ) : null}\n\n <div className=\"grid min-w-0 flex-1 gap-0.5 pt-px\">\n <div className=\"font-medium leading-snug\">{t.title}</div>\n {t.description && <div className=\"text-[0.8125rem] leading-relaxed text-fg-muted\">{t.description}</div>}\n </div>\n\n {t.action && (\n <button\n type=\"button\"\n onClick={() => {\n t.action!.onClick();\n dismiss(t.id);\n }}\n className=\"-my-0.5 shrink-0 cursor-pointer rounded-control-sm bg-fg px-2.5 py-1 text-[0.8125rem] font-medium text-bg hover:opacity-90 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n >\n {t.action.label}\n </button>\n )}\n {t.dismissible !== false && (\n <button\n type=\"button\"\n aria-label=\"Close notification\"\n onClick={() => dismiss(t.id)}\n className=\"-me-1 -mt-0.5 grid size-6 shrink-0 cursor-pointer place-items-center rounded-control-sm text-fg-muted hover:bg-secondary-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-ring\"\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-3.5\">\n <path d=\"M6 6l8 8M14 6l-8 8\" />\n </svg>\n </button>\n )}\n\n {/* time left */}\n {showTimer && duration !== Infinity && front && !leaving && (\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-3 bottom-0 h-[2px] overflow-hidden rounded-full\">\n <span\n key={`${t.createdAt}`}\n className=\"block h-full origin-left bg-[color:color-mix(in_srgb,var(--color-fg-muted)_45%,transparent)] motion-reduce:hidden\"\n style={{ animation: `ui-toast-timer ${duration}ms linear forwards`, animationPlayState: paused ? \"paused\" : \"running\" }}\n />\n </span>\n )}\n </li>\n );\n}\n","import * as React from \"react\";\nimport { createThemeCss, getFontsHref, type ThemeConfig } from \"../../theme/index\";\n\nexport interface ThemeProviderProps {\n /** Your theme — e.g. `import theme from \"./ui.theme.json\"`, or one loaded from an API. */\n theme: ThemeConfig;\n /**\n * Where the theme applies. Default \":root\" (the whole page). Use a selector such as\n * \"[data-theme-scope=preview]\" to theme only part of the page.\n */\n selector?: string;\n /** Nonce for a strict Content-Security-Policy. */\n nonce?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Applies a theme config at runtime by writing its CSS variables into the page.\n * For a theme that never changes, prefer the build step (`jm-ui theme`) — it needs no JavaScript.\n */\nexport function ThemeProvider({ theme, selector, nonce, children }: ThemeProviderProps) {\n const css = React.useMemo(() => createThemeCss(theme, { selector }), [theme, selector]);\n const fonts = getFontsHref(theme);\n return (\n <>\n {fonts && <link rel=\"stylesheet\" href={fonts} />}\n <style data-jm-ui-theme=\"\" nonce={nonce} dangerouslySetInnerHTML={{ __html: css }} />\n {children}\n </>\n );\n}\n","/*\n * Small color helpers (no dependencies): parse hex, convert to OKLCH to lighten/darken\n * evenly across hues, back to hex (staying inside sRGB), and WCAG contrast.\n */\n\nexport type RGB = [number, number, number]; // 0–1\nexport type OKLCH = [number, number, number]; // L 0–1, C, H degrees\n\nexport function parseHex(hex: string): RGB | null {\n const m = hex.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!m) return null;\n let h = m[1];\n if (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n return [0, 2, 4].map((i) => parseInt(h.slice(i, i + 2), 16) / 255) as RGB;\n}\n\nexport function toHex([r, g, b]: RGB) {\n return \"#\" + [r, g, b].map((v) => Math.round(Math.min(1, Math.max(0, v)) * 255).toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nconst toLinear = (c: number) => (c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4);\nconst fromLinear = (c: number) => (c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055);\n\nexport function rgbToOklch(rgb: RGB): OKLCH {\n const [r, g, b] = rgb.map(toLinear);\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n const L = 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s;\n const A = 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s;\n const B = 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s;\n return [L, Math.hypot(A, B), ((Math.atan2(B, A) * 180) / Math.PI + 360) % 360];\n}\n\nfunction oklchToRgbUnclamped([L, C, H]: OKLCH): RGB {\n const a = C * Math.cos((H * Math.PI) / 180);\n const b = C * Math.sin((H * Math.PI) / 180);\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n fromLinear(4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n fromLinear(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n fromLinear(-0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s),\n ];\n}\n\n/** OKLCH → sRGB, reducing chroma until it fits (keeps lightness and hue). */\nexport function oklchToRgb([L, C, H]: OKLCH): RGB {\n let c = C;\n for (let i = 0; i < 24; i++) {\n const rgb = oklchToRgbUnclamped([L, c, H]);\n if (rgb.every((v) => v >= -0.0005 && v <= 1.0005)) return rgb;\n c *= 0.9;\n }\n return oklchToRgbUnclamped([L, 0, H]);\n}\n\nexport function luminance(rgb: RGB) {\n const [r, g, b] = rgb.map(toLinear);\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\nexport function contrast(a: RGB, b: RGB) {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p);\n return (x + 0.05) / (y + 0.05);\n}\n\n/** Shift lightness (in OKLCH, so every hue changes evenly) and optionally scale chroma. */\nexport function adjust(hex: string, dL: number, chroma = 1) {\n const rgb = parseHex(hex);\n if (!rgb) return hex;\n const [L, C, H] = rgbToOklch(rgb);\n return toHex(oklchToRgb([Math.min(0.98, Math.max(0.05, L + dL)), C * chroma, H]));\n}\n\nexport function lightness(hex: string) {\n const rgb = parseHex(hex);\n return rgb ? rgbToOklch(rgb)[0] : 0.5;\n}\n\n/** Pick readable text for a background: white, or a near-black tinted with the same hue. */\nexport function readableOn(hex: string) {\n const rgb = parseHex(hex);\n if (!rgb) return \"#ffffff\";\n const white: RGB = [1, 1, 1];\n const [, C, H] = rgbToOklch(rgb);\n const darkHex = toHex(oklchToRgb([0.2, Math.min(C, 0.06), H]));\n return contrast(rgb, white) >= 4.5 || contrast(rgb, white) >= contrast(rgb, parseHex(darkHex)!) ? \"#ffffff\" : darkHex;\n}\n","/*\n * @astherix/ui/theme — turn a theme config (ui.theme.json) into CSS variables.\n * Pure functions, no React: safe on the server, in build scripts and in the CLI.\n */\nimport { adjust, lightness, parseHex, readableOn } from \"./color\";\n\nexport type ColorInput =\n | string\n | {\n /** The color in light mode. */\n light: string;\n /** The color in dark mode. Worked out from light if left out. */\n dark?: string;\n /** Text/icons on the color in light mode. Worked out for contrast if left out. */\n foreground?: string;\n darkForeground?: string;\n };\n\nexport type SurfaceInput = string | { light: string; dark?: string };\n\nexport interface ThemeConfig {\n $schema?: string;\n colors?: {\n /** Buttons, links, focus rings, selected states. Hover, pressed edge and dark mode are derived. */\n primary?: ColorInput;\n /** Extra accents (e.g. Switch color=\"secondary\" / \"tertiary\"). */\n secondary?: ColorInput;\n tertiary?: ColorInput;\n success?: ColorInput;\n warning?: ColorInput;\n danger?: ColorInput;\n info?: ColorInput;\n /** Page background. */\n background?: SurfaceInput;\n /** Cards, fields, menus. */\n surface?: SurfaceInput;\n /** Main text. */\n foreground?: SurfaceInput;\n /** Secondary text. */\n muted?: SurfaceInput;\n /** Hairlines and field borders. */\n border?: SurfaceInput;\n };\n fonts?: {\n /** Body font stack, e.g. \"Inter, system-ui, sans-serif\". */\n sans?: string;\n /** Headings (defaults to sans). */\n heading?: string;\n mono?: string;\n /** Google Fonts to load, e.g. [\"Inter:wght@400..700\", \"Fraunces:wght@600\"]. */\n googleFonts?: string[];\n };\n /** Corner roundness: a preset, or exact values. */\n radius?:\n | \"none\"\n | \"sm\"\n | \"md\"\n | \"lg\"\n | { control?: string; controlSm?: string; controlLg?: string; card?: string; modal?: string };\n /** Spacing and control sizes: a preset, or a multiplier (1 = default, 0.9 = tighter, 1.1 = roomier). */\n density?: \"compact\" | \"comfortable\" | \"spacious\" | number;\n /** Shadow strength. */\n shadows?: \"none\" | \"subtle\" | \"default\" | \"strong\";\n /** Root font size, e.g. \"16px\" (default) or \"15px\". Scales everything sized in rem. */\n baseFontSize?: string;\n}\n\n/** Identity helper for typed theme configs in .ts files. */\nexport const defineTheme = (config: ThemeConfig) => config;\n\ntype Pair = { light: string; dark: string; fg: string; darkFg: string };\n\nfunction resolveColor(input: ColorInput | undefined): Pair | null {\n if (!input) return null;\n const c = typeof input === \"string\" ? { light: input } : input;\n if (!parseHex(c.light)) return null;\n // Dark mode needs a lighter, slightly calmer version to glow on dark backgrounds.\n const L = lightness(c.light);\n const dark = c.dark ?? adjust(c.light, Math.max(0, 0.72 - L), 0.95);\n return {\n light: c.light,\n dark,\n fg: c.foreground ?? readableOn(c.light),\n darkFg: c.darkForeground ?? readableOn(dark),\n };\n}\n\nfunction surface(input: SurfaceInput | undefined) {\n if (!input) return null;\n return typeof input === \"string\" ? { light: input, dark: undefined } : input;\n}\n\nconst radiusPresets = {\n none: { controlSm: \"0\", control: \"0\", controlLg: \"0\", card: \"0\", modal: \"0\" },\n sm: { controlSm: \"0.125rem\", control: \"0.25rem\", controlLg: \"0.375rem\", card: \"0.375rem\", modal: \"0.5rem\" },\n md: { controlSm: \"0.1875rem\", control: \"0.375rem\", controlLg: \"0.75rem\", card: \"0.75rem\", modal: \"0.875rem\" },\n lg: { controlSm: \"0.375rem\", control: \"0.625rem\", controlLg: \"1rem\", card: \"1rem\", modal: \"1.25rem\" },\n};\n\nconst densityUnits = { compact: 0.225, comfortable: 0.25, spacious: 0.28 };\n\nfunction shadows(strength: number, dark: boolean) {\n if (strength === 0) return { sm: \"none\", md: \"none\", lg: \"none\", xl: \"none\", modal: \"none\" };\n const c = dark ? \"0 0 0\" : \"var(--ui-shadow-color)\";\n const k = (a: number) => Math.min(1, +(a * strength * (dark ? 3 : 1)).toFixed(3));\n return {\n sm: `0 1px 2px rgb(${c} / ${k(0.14)})`,\n md: `0 1px 2px rgb(${c} / ${k(0.12)}), 0 3px 8px -1px rgb(${c} / ${k(0.14)})`,\n lg: `0 2px 4px rgb(${c} / ${k(0.1)}), 0 8px 18px -4px rgb(${c} / ${k(0.22)})`,\n xl: `0 3px 6px rgb(${c} / ${k(0.1)}), 0 16px 32px -8px rgb(${c} / ${k(0.32)})`,\n modal: `0 2px 6px rgb(${c} / ${k(0.08)}), 0 24px 56px -12px rgb(${c} / ${k(0.35)})`,\n };\n}\n\nconst COLOR_ALIASES = [\n \"bg\", \"surface\", \"fg\", \"fg-muted\", \"border\", \"border-strong\", \"ring\",\n \"primary\", \"primary-hover\", \"primary-edge\", \"primary-fg\",\n \"secondary\", \"secondary-hover\",\n \"danger\", \"danger-hover\", \"danger-edge\", \"danger-fg\",\n \"success\", \"success-fg\", \"warning\", \"warning-fg\", \"info\", \"info-fg\",\n \"tone-secondary\", \"tone-secondary-fg\", \"tone-tertiary\", \"tone-tertiary-fg\",\n];\n\n/** Google Fonts stylesheet URL for the config (or null). */\nexport function getFontsHref(config: ThemeConfig) {\n const fams = config.fonts?.googleFonts?.filter(Boolean);\n if (!fams?.length) return null;\n return `https://fonts.googleapis.com/css2?${fams.map((f) => `family=${f.trim().replace(/ /g, \"+\")}`).join(\"&\")}&display=swap`;\n}\n\nexport interface ThemeCssOptions {\n /** Where light values go. Default \":root\". Use e.g. \"[data-tenant=acme]\" to scope a theme. */\n selector?: string;\n /** Where dark values go. Default \".dark\" (the class the framework's dark mode uses). */\n darkSelector?: string;\n /** Add an @import for Google Fonts at the top (for CSS files). Default false. */\n includeFontImport?: boolean;\n}\n\n/** Turn a theme config into CSS custom properties that override the defaults in theme.css. */\nexport function createThemeCss(config: ThemeConfig, options: ThemeCssOptions = {}) {\n const { selector = \":root\", darkSelector = \".dark\", includeFontImport = false } = options;\n const light: string[] = [];\n const dark: string[] = [];\n const set = (arr: string[], name: string, value: string | undefined) => value && arr.push(` ${name}: ${value};`);\n\n const c = config.colors ?? {};\n const primary = resolveColor(c.primary);\n if (primary) {\n // Hover a little darker, the raised bottom edge much darker; in dark mode hover goes lighter.\n set(light, \"--ui-primary\", primary.light);\n set(light, \"--ui-primary-hover\", adjust(primary.light, -0.07));\n set(light, \"--ui-primary-edge\", adjust(primary.light, -0.26));\n set(light, \"--ui-primary-fg\", primary.fg);\n set(light, \"--ui-ring\", primary.light);\n set(dark, \"--ui-primary\", primary.dark);\n set(dark, \"--ui-primary-hover\", adjust(primary.dark, 0.07));\n set(dark, \"--ui-primary-edge\", adjust(primary.dark, -0.16));\n set(dark, \"--ui-primary-fg\", primary.darkFg);\n set(dark, \"--ui-ring\", adjust(primary.dark, 0.06));\n }\n const tones: Array<[keyof NonNullable<ThemeConfig[\"colors\"]>, string, boolean]> = [\n [\"secondary\", \"--ui-tone-secondary\", false],\n [\"tertiary\", \"--ui-tone-tertiary\", false],\n [\"success\", \"--ui-success\", false],\n [\"warning\", \"--ui-warning\", false],\n [\"danger\", \"--ui-danger\", true],\n [\"info\", \"--ui-info\", false],\n ];\n for (const [key, name, hasStates] of tones) {\n const p = resolveColor(c[key] as ColorInput | undefined);\n if (!p) continue;\n set(light, name, p.light);\n set(light, `${name}-fg`, p.fg);\n set(dark, name, p.dark);\n set(dark, `${name}-fg`, p.darkFg);\n if (hasStates) {\n set(light, `${name}-hover`, adjust(p.light, -0.07));\n set(light, `${name}-edge`, adjust(p.light, -0.26));\n set(dark, `${name}-hover`, adjust(p.dark, 0.07));\n set(dark, `${name}-edge`, adjust(p.dark, -0.16));\n }\n }\n const surfaces: Array<[keyof NonNullable<ThemeConfig[\"colors\"]>, string[]]> = [\n [\"background\", [\"--ui-bg\"]],\n [\"surface\", [\"--ui-surface\", \"--ui-secondary\"]],\n [\"foreground\", [\"--ui-fg\"]],\n [\"muted\", [\"--ui-fg-muted\"]],\n [\"border\", [\"--ui-border\"]],\n ];\n for (const [key, names] of surfaces) {\n const s = surface(c[key] as SurfaceInput | undefined);\n if (!s) continue;\n names.forEach((n) => {\n set(light, n, s.light);\n set(dark, n, s.dark);\n });\n if (key === \"border\") {\n set(light, \"--ui-border-strong\", parseHex(s.light) ? adjust(s.light, -0.08) : undefined);\n set(dark, \"--ui-border-strong\", s.dark && parseHex(s.dark) ? adjust(s.dark, 0.08) : undefined);\n }\n }\n\n const f = config.fonts ?? {};\n set(light, \"--font-sans\", f.sans);\n set(light, \"--font-heading\", f.heading ?? (f.sans ? \"var(--font-sans)\" : undefined));\n set(light, \"--font-mono\", f.mono);\n\n if (config.radius) {\n const r = typeof config.radius === \"string\" ? radiusPresets[config.radius] : config.radius;\n if (r) {\n set(light, \"--radius-control-sm\", r.controlSm);\n set(light, \"--radius-control\", r.control);\n set(light, \"--radius-control-lg\", r.controlLg);\n set(light, \"--radius-card\", r.card);\n set(light, \"--radius-modal\", r.modal);\n }\n }\n\n if (config.density !== undefined) {\n // Tailwind v4 sizes every spacing utility (padding, gaps, control heights) from --spacing.\n const unit = typeof config.density === \"number\" ? 0.25 * config.density : densityUnits[config.density];\n if (unit) set(light, \"--spacing\", `${+unit.toFixed(4)}rem`);\n }\n\n if (config.shadows) {\n const k = { none: 0, subtle: 0.6, default: 1, strong: 1.6 }[config.shadows];\n const l = shadows(k, false);\n const d = shadows(k, true);\n ([\"sm\", \"md\", \"lg\", \"xl\", \"modal\"] as const).forEach((s) => {\n set(light, `--ui-shadow-${s}`, l[s]);\n set(dark, `--ui-shadow-${s}`, d[s]);\n });\n }\n\n // When a theme is scoped to part of the page, the framework's --color-* aliases (declared on\n // :root) would still point at the page-level values. Re-declare them on the scope so they\n // resolve against this theme.\n if (selector !== \":root\" && (light.length || dark.length)) {\n for (const name of COLOR_ALIASES) light.push(` --color-${name}: var(--ui-${name});`);\n if (f.sans || f.heading) light.push(\" font-family: var(--font-sans);\");\n }\n\n const blocks: string[] = [];\n const href = getFontsHref(config);\n if (includeFontImport && href) blocks.push(`@import url(\"${href}\");`);\n blocks.push(\"/* Generated by @astherix/ui from your theme config. Import it after @astherix/ui/theme.css. */\");\n if (config.baseFontSize) blocks.push(`html {\\n font-size: ${config.baseFontSize};\\n}`);\n if (light.length) blocks.push(`${selector} {\\n${light.join(\"\\n\")}\\n}`);\n if (dark.length) {\n // Scope dark values to the same element when the theme is scoped (e.g. per tenant).\n const darkSel = selector === \":root\" ? darkSelector : `${darkSelector} ${selector}, ${selector}${darkSelector}`;\n blocks.push(`${darkSel} {\\n${dark.join(\"\\n\")}\\n}`);\n }\n return blocks.join(\"\\n\\n\") + \"\\n\";\n}\n\n/** Check a config and return friendly problems (empty when it's fine). */\nexport function validateTheme(config: unknown): string[] {\n const problems: string[] = [];\n if (!config || typeof config !== \"object\") return [\"The theme must be a JSON object.\"];\n const t = config as ThemeConfig;\n const known = [\"$schema\", \"colors\", \"fonts\", \"radius\", \"density\", \"shadows\", \"baseFontSize\"];\n Object.keys(t).forEach((k) => !known.includes(k) && problems.push(`Unknown setting \"${k}\". Known settings: ${known.slice(1).join(\", \")}.`));\n const checkColor = (name: string, v: unknown) => {\n if (v === undefined) return;\n const vals = typeof v === \"string\" ? [v] : v && typeof v === \"object\" ? Object.values(v as object) : [v];\n vals.forEach((x) => {\n if (typeof x !== \"string\" || (!parseHex(x) && !/^(rgb|hsl|oklch|oklab|color|var)\\(/.test(x)))\n problems.push(`colors.${name}: \"${String(x)}\" isn't a color. Use a hex value like \"#16a34a\".`);\n });\n };\n Object.entries(t.colors ?? {}).forEach(([k, v]) => checkColor(k, v));\n const derived = [\"primary\", \"secondary\", \"tertiary\", \"success\", \"warning\", \"danger\", \"info\"];\n derived.forEach((k) => {\n const v = (t.colors as Record<string, ColorInput> | undefined)?.[k];\n const light = typeof v === \"string\" ? v : v?.light;\n const alreadyReported = problems.some((p) => p.startsWith(`colors.${k}:`));\n if (light && !parseHex(light) && !alreadyReported) problems.push(`colors.${k}: use a hex color (like \"#16a34a\") so hover and dark shades can be worked out.`);\n });\n if (typeof t.radius === \"string\" && !(t.radius in radiusPresets)) problems.push(`radius: use \"none\", \"sm\", \"md\" or \"lg\", or an object with exact values.`);\n if (typeof t.density === \"string\" && !(t.density in densityUnits)) problems.push(`density: use \"compact\", \"comfortable\" or \"spacious\", or a number like 0.9.`);\n if (typeof t.density === \"number\" && (t.density < 0.6 || t.density > 1.6)) problems.push(`density: ${t.density} is extreme. Use a number between 0.6 and 1.6.`);\n if (t.shadows && ![\"none\", \"subtle\", \"default\", \"strong\"].includes(t.shadows)) problems.push(`shadows: use \"none\", \"subtle\", \"default\" or \"strong\".`);\n return problems;\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button, renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Sidebar — the dashboard navigation panel.\n *\n * <SidebarProvider side=\"left\">\n * <Sidebar>\n * <SidebarHeader>…logo…</SidebarHeader>\n * <SidebarContent>\n * <SidebarGroup label=\"Workspace\"><SidebarNav items={nav} activeHref={pathname} /></SidebarGroup>\n * </SidebarContent>\n * <SidebarFooter>…account…</SidebarFooter>\n * </Sidebar>\n * <SidebarInset>\n * <header><SidebarTrigger /></header>\n * …page…\n * </SidebarInset>\n * </SidebarProvider>\n *\n * Responsive by the layout's own width: wide → a full sidebar that collapses to an icon rail\n * (submenus open as a flyout); narrow → an off-canvas drawer. Menus nest to any depth.\n */\n\ntype Mode = \"drawer\" | \"desktop\";\n\ntype SidebarContextValue = {\n side: \"left\" | \"right\";\n mode: Mode;\n collapsed: boolean;\n setCollapsed: (v: boolean) => void;\n drawerOpen: boolean;\n setDrawerOpen: (v: boolean) => void;\n toggle: () => void;\n contained: boolean;\n sidebarId: string;\n triggerRef: React.MutableRefObject<HTMLElement | null>;\n linkComponent: React.ElementType;\n onNavigate?: (href: string) => void;\n};\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\nexport function useSidebar() {\n const ctx = React.useContext(SidebarContext);\n if (!ctx) throw new Error(\"useSidebar must be used inside <SidebarProvider>.\");\n return ctx;\n}\n\n/** True when the sidebar is showing as an icon rail. */\nconst useRail = () => {\n const ctx = React.useContext(SidebarContext);\n return !!ctx && ctx.mode === \"desktop\" && ctx.collapsed;\n};\n\n/* ---------- Provider / layout ---------- */\n\nexport interface SidebarProviderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Which side the sidebar is on. */\n side?: \"left\" | \"right\";\n /** Start collapsed to an icon rail (wide screens). */\n defaultCollapsed?: boolean;\n /** Controlled collapsed state. */\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n /** Below this layout width (px) the sidebar becomes a drawer. Default 768. */\n drawerBelow?: number;\n /** Between drawerBelow and this width, start as an icon rail unless the person chose otherwise. Default 1024. */\n railBelow?: number;\n /** Remember collapsed/expanded in this browser under this key. */\n persistKey?: string;\n /** Keyboard shortcut Ctrl/⌘ + this key toggles the sidebar. Default \"b\"; false to turn off. */\n shortcut?: string | false;\n /**\n * The link component for menu items — e.g. Next.js `Link` or Inertia's `Link`.\n * It receives href, className, children, onClick and aria-current.\n */\n linkComponent?: React.ElementType;\n /** Called when a menu link is followed (after the drawer closes on phones). */\n onNavigate?: (href: string) => void;\n /** Fit inside a box (e.g. a preview) instead of the whole window. */\n contained?: boolean;\n}\n\nexport function SidebarProvider({\n side = \"left\",\n defaultCollapsed = false,\n collapsed: collapsedProp,\n onCollapsedChange,\n drawerBelow = 768,\n railBelow = 1024,\n persistKey,\n shortcut = \"b\",\n linkComponent = \"a\",\n onNavigate,\n contained = false,\n className,\n children,\n ...props\n}: SidebarProviderProps) {\n const rootRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLElement | null>(null);\n const sidebarId = React.useId();\n const [mode, setMode] = React.useState<Mode>(\"desktop\");\n const [drawerOpen, setDrawerOpen] = React.useState(false);\n const chosen = React.useRef(false); // did the person toggle it themselves?\n\n const [inner, setInner] = React.useState(() => {\n if (persistKey && typeof window !== \"undefined\") {\n try {\n const saved = window.localStorage.getItem(persistKey);\n if (saved !== null) {\n chosen.current = true;\n return saved === \"collapsed\";\n }\n } catch {\n /* storage unavailable */\n }\n }\n return defaultCollapsed;\n });\n const collapsed = collapsedProp ?? inner;\n const setCollapsed = React.useCallback(\n (v: boolean) => {\n if (collapsedProp === undefined) setInner(v);\n onCollapsedChange?.(v);\n if (persistKey) {\n try {\n window.localStorage.setItem(persistKey, v ? \"collapsed\" : \"expanded\");\n } catch {\n /* ignore */\n }\n }\n },\n [collapsedProp, onCollapsedChange, persistKey]\n );\n\n // Pick the layout from the provider's own width.\n React.useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n const measure = () => {\n const w = el.getBoundingClientRect().width;\n const next: Mode = w < drawerBelow ? \"drawer\" : \"desktop\";\n setMode(next);\n if (next === \"desktop\") {\n setDrawerOpen(false);\n if (!chosen.current && collapsedProp === undefined) setInner(w < railBelow ? true : defaultCollapsed);\n }\n };\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n ro?.observe(el);\n return () => ro?.disconnect();\n }, [drawerBelow, railBelow, defaultCollapsed, collapsedProp]);\n\n const toggle = React.useCallback(() => {\n if (mode === \"drawer\") setDrawerOpen((o) => !o);\n else {\n chosen.current = true;\n setCollapsed(!collapsed);\n }\n }, [mode, collapsed, setCollapsed]);\n\n React.useEffect(() => {\n if (!shortcut) return;\n const onKey = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === shortcut) {\n const t = e.target as HTMLElement;\n if (t.closest(\"input, textarea, [contenteditable=true]\")) return;\n e.preventDefault();\n toggle();\n }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [shortcut, toggle]);\n\n const value = React.useMemo<SidebarContextValue>(\n () => ({ side, mode, collapsed, setCollapsed, drawerOpen, setDrawerOpen, toggle, contained, sidebarId, triggerRef, linkComponent, onNavigate }),\n [side, mode, collapsed, setCollapsed, drawerOpen, toggle, contained, sidebarId, linkComponent, onNavigate]\n );\n\n return (\n <SidebarContext.Provider value={value}>\n <div\n ref={rootRef}\n data-sidebar-mode={mode}\n data-sidebar-state={mode === \"drawer\" ? (drawerOpen ? \"open\" : \"closed\") : collapsed ? \"rail\" : \"expanded\"}\n className={cn(\n \"relative flex w-full bg-bg text-fg\",\n side === \"right\" && \"flex-row-reverse\",\n contained ? \"h-full overflow-hidden\" : \"min-h-dvh\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n );\n}\n\n/* ---------- Sidebar (the panel) ---------- */\n\nexport interface SidebarProps extends React.HTMLAttributes<HTMLElement> {\n /** Width when expanded. Default \"16rem\". */\n width?: string;\n /** Width of the icon rail. Default \"4.25rem\". */\n railWidth?: string;\n /** Accessible name for the panel. Default \"Sidebar\". */\n \"aria-label\"?: string;\n}\n\nexport function Sidebar({ width = \"16rem\", railWidth = \"4.25rem\", className, children, style, \"aria-label\": ariaLabel = \"Sidebar\", ...props }: SidebarProps) {\n const ctx = useSidebar();\n const { side, mode, collapsed, drawerOpen, setDrawerOpen, contained, sidebarId, triggerRef } = ctx;\n const panelRef = React.useRef<HTMLElement>(null);\n const drawer = mode === \"drawer\";\n const rail = !drawer && collapsed;\n\n // Drawer: keep it out of the tab order while closed; move focus in on open and back on close;\n // Escape closes; the page behind can't be scrolled or clicked.\n React.useEffect(() => {\n const el = panelRef.current;\n if (!el) return;\n if (drawer && !drawerOpen) el.setAttribute(\"inert\", \"\");\n else el.removeAttribute(\"inert\");\n }, [drawer, drawerOpen]);\n\n React.useEffect(() => {\n if (!drawer || !drawerOpen) return;\n const el = panelRef.current;\n // Start on the current page's item if there is one, otherwise the first item.\n const first = el?.querySelector<HTMLElement>('[aria-current=\"page\"]') ?? el?.querySelector<HTMLElement>(\"a[href], button:not([disabled])\");\n first?.focus({ preventScroll: true });\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setDrawerOpen(false);\n }\n // Keep Tab inside the drawer while it's open.\n if (e.key === \"Tab\" && el) {\n const items = [...el.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])')].filter((x) => x.offsetParent !== null);\n if (!items.length) return;\n const [a, z] = [items[0], items[items.length - 1]];\n if (e.shiftKey && document.activeElement === a) {\n e.preventDefault();\n z.focus();\n } else if (!e.shiftKey && document.activeElement === z) {\n e.preventDefault();\n a.focus();\n }\n }\n };\n document.addEventListener(\"keydown\", onKey);\n let restoreOverflow: string | undefined;\n if (!contained) {\n restoreOverflow = document.documentElement.style.overflow;\n document.documentElement.style.overflow = \"hidden\";\n }\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n if (restoreOverflow !== undefined) document.documentElement.style.overflow = restoreOverflow;\n triggerRef.current?.focus({ preventScroll: true });\n };\n }, [drawer, drawerOpen, setDrawerOpen, contained, triggerRef]);\n\n const fixed = contained ? \"absolute\" : \"fixed\";\n const edge = side === \"left\" ? \"start-0 border-e\" : \"end-0 border-s\";\n\n return (\n <>\n {drawer && (\n <div\n aria-hidden=\"true\"\n onClick={() => setDrawerOpen(false)}\n className={cn(\n fixed,\n \"inset-0 z-40 bg-[var(--ui-backdrop,rgb(18_20_24/0.5))] transition-opacity duration-200\",\n drawerOpen ? \"opacity-100\" : \"pointer-events-none opacity-0\"\n )}\n />\n )}\n <aside\n ref={panelRef}\n id={sidebarId}\n aria-label={ariaLabel}\n data-state={drawer ? (drawerOpen ? \"open\" : \"closed\") : rail ? \"rail\" : \"expanded\"}\n className={cn(\n \"flex flex-col border-border bg-surface text-fg\",\n edge,\n drawer\n ? cn(\n fixed,\n \"inset-y-0 z-50 w-[min(18rem,86%)] shadow-[var(--ui-shadow-xl)] transition-transform duration-250 ease-[cubic-bezier(0.2,0.9,0.3,1)] motion-reduce:transition-none\",\n drawerOpen ? \"translate-x-0\" : side === \"left\" ? \"-translate-x-full rtl:translate-x-full\" : \"translate-x-full rtl:-translate-x-full\"\n )\n : cn(\n \"sticky top-0 z-20 shrink-0 overflow-hidden transition-[width] duration-200 ease-out motion-reduce:transition-none\",\n contained ? \"h-full\" : \"h-dvh\"\n ),\n className\n )}\n style={drawer ? style : { width: rail ? railWidth : width, ...style }}\n {...props}\n >\n {children}\n </aside>\n </>\n );\n}\n\nexport function SidebarHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n const rail = useRail();\n return <div className={cn(\"flex h-14 shrink-0 items-center gap-2 px-3\", rail && \"justify-center px-2\", className)} {...props} />;\n}\n\nexport function SidebarContent({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n const rail = useRail();\n return (\n <div\n className={cn(\"grid min-h-0 flex-1 content-start gap-4 overflow-y-auto overscroll-contain px-3 py-2 [scrollbar-width:thin]\", rail && \"px-2\", className)}\n {...props}\n />\n );\n}\n\nexport function SidebarFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n const rail = useRail();\n return <div className={cn(\"shrink-0 border-t border-border p-3\", rail && \"grid justify-items-center p-2\", className)} {...props} />;\n}\n\nexport interface SidebarGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** A small heading above the group. Hidden in the icon rail (a divider shows instead). */\n label?: React.ReactNode;\n /** Something at the right of the heading, e.g. an \"add\" button. */\n action?: React.ReactNode;\n}\n\nexport function SidebarGroup({ label, action, className, children, ...props }: SidebarGroupProps) {\n const rail = useRail();\n const id = React.useId();\n return (\n <div role=\"group\" aria-labelledby={label ? id : undefined} className={cn(\"grid gap-1\", className)} {...props}>\n {label &&\n (rail ? (\n <>\n <span id={id} className=\"sr-only\">{label}</span>\n <span aria-hidden=\"true\" className=\"mx-auto my-1 h-px w-6 bg-border\" />\n </>\n ) : (\n <div className=\"flex h-7 items-center justify-between gap-2 px-3\">\n <span id={id} className=\"truncate text-xs font-medium text-fg-muted\">{label}</span>\n {action}\n </div>\n ))}\n {children}\n </div>\n );\n}\n\n/* ---------- Trigger ---------- */\n\nexport interface SidebarTriggerProps extends Omit<React.ComponentProps<typeof Button>, \"children\"> {\n /** Accessible label. Default \"Toggle sidebar\". */\n label?: string;\n}\n\nconst PanelIcon = ({ side }: { side: \"left\" | \"right\" }) => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"2.75\" y=\"3.75\" width=\"14.5\" height=\"12.5\" rx=\"2\" />\n <path d={side === \"left\" ? \"M7.75 3.75v12.5\" : \"M12.25 3.75v12.5\"} />\n </svg>\n);\n\n/** The button that opens/closes the drawer on phones and collapses/expands the sidebar on wide screens. */\nexport const SidebarTrigger = React.forwardRef<HTMLButtonElement, SidebarTriggerProps>(({ label = \"Toggle sidebar\", onClick, ...props }, ref) => {\n const { toggle, mode, collapsed, drawerOpen, sidebarId, side, triggerRef } = useSidebar();\n const expanded = mode === \"drawer\" ? drawerOpen : !collapsed;\n return (\n <Button\n ref={(node: HTMLButtonElement | null) => {\n triggerRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n }}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={label}\n aria-expanded={expanded}\n aria-controls={sidebarId}\n title={`${label} (Ctrl/⌘ B)`}\n onClick={(e) => {\n onClick?.(e);\n toggle();\n }}\n {...props}\n >\n <PanelIcon side={side} />\n </Button>\n );\n});\nSidebarTrigger.displayName = \"SidebarTrigger\";\n\n/** The main area beside the sidebar. */\nexport function SidebarInset({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n const { contained } = useSidebar();\n return <div className={cn(\"flex min-w-0 flex-1 flex-col\", contained && \"overflow-y-auto\", className)} {...props} />;\n}\n\n/* ---------- The menu ---------- */\n\nexport interface SidebarNavItem {\n label: string;\n /** Where it goes. Items with children don't need one (they open their submenu). */\n href?: string;\n icon?: IconInput;\n /** Something at the end, e.g. a count: <Pill size=\"sm\">12</Pill>. */\n badge?: React.ReactNode;\n /** A submenu. Nest as deep as you need. */\n children?: SidebarNavItem[];\n /** Open this submenu at first. Parents of the active page open automatically. */\n defaultOpen?: boolean;\n disabled?: boolean;\n /** For actions that aren't links (e.g. \"Invite people\"). */\n onSelect?: () => void;\n /** Open in a new tab. */\n external?: boolean;\n /** Stable key if labels repeat. */\n id?: string;\n}\n\nexport interface SidebarNavProps {\n items: SidebarNavItem[];\n /** The current page's path. Its item is highlighted and its parents open. */\n activeHref?: string;\n /** Also treat an item as active when the current path starts with its href (e.g. /invoices/1047). Default true. */\n matchNested?: boolean;\n \"aria-label\"?: string;\n className?: string;\n}\n\nconst Chevron = ({ open }: { open: boolean }) => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"\n className={cn(\"size-4 shrink-0 text-fg-muted transition-transform duration-200 motion-reduce:transition-none rtl:-scale-x-100\", open && \"rotate-90\")}>\n <path d=\"M8 5.5l4.5 4.5L8 14.5\" />\n </svg>\n);\n\nfunction isActive(item: SidebarNavItem, active: string | undefined, nested: boolean) {\n if (!active || !item.href) return false;\n if (item.href === active) return true;\n return nested && item.href !== \"/\" && active.startsWith(item.href.endsWith(\"/\") ? item.href : item.href + \"/\");\n}\nfunction containsActive(item: SidebarNavItem, active: string | undefined, nested: boolean): boolean {\n return !!item.children?.some((c) => isActive(c, active, nested) || containsActive(c, active, nested));\n}\nconst keyOf = (item: SidebarNavItem, i: number) => item.id ?? `${item.label}-${i}`;\n\n/** A menu from data, with submenus to any depth. */\nexport function SidebarNav({ items, activeHref, matchNested = true, \"aria-label\": ariaLabel, className }: SidebarNavProps) {\n const rail = useRail();\n // The most specific match wins, so \"/invoices\" isn't highlighted alongside \"/invoices/recurring\".\n const best = React.useMemo(() => {\n let found: string | undefined;\n const walk = (list: SidebarNavItem[]) =>\n list.forEach((it) => {\n if (isActive(it, activeHref, matchNested) && (!found || (it.href?.length ?? 0) > found.length)) found = it.href;\n if (it.children) walk(it.children);\n });\n walk(items);\n return found;\n }, [items, activeHref, matchNested]);\n\n return (\n <nav aria-label={ariaLabel} className={className}>\n <ul role=\"list\" className={cn(\"grid gap-0.5\", rail && \"justify-items-center\")}>\n {items.map((item, i) =>\n rail ? (\n <RailItem key={keyOf(item, i)} item={item} activeHref={best} />\n ) : (\n <NavItem key={keyOf(item, i)} item={item} depth={0} activeHref={best} />\n )\n )}\n </ul>\n </nav>\n );\n}\n\nfunction ItemLink({\n item,\n className,\n children,\n active,\n ...rest\n}: { item: SidebarNavItem; className: string; children: React.ReactNode; active: boolean } & Record<string, unknown>) {\n const { linkComponent: LinkC, setDrawerOpen, mode, onNavigate } = useSidebar();\n const close = () => mode === \"drawer\" && setDrawerOpen(false);\n if (item.href && !item.disabled) {\n const Comp = item.external ? \"a\" : LinkC;\n return (\n <Comp\n href={item.href}\n className={className}\n aria-current={active ? \"page\" : undefined}\n {...(item.external ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n onClick={() => {\n close();\n onNavigate?.(item.href!);\n }}\n {...rest}\n >\n {children}\n </Comp>\n );\n }\n return (\n <button\n type=\"button\"\n disabled={item.disabled}\n className={className}\n onClick={() => {\n item.onSelect?.();\n close();\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\nconst rowBase =\n \"group/row flex h-9 w-full min-w-0 cursor-pointer items-center gap-2.5 rounded-control px-3 text-start text-sm text-fg-muted outline-none transition-colors duration-100 hover:bg-secondary-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring disabled:cursor-not-allowed disabled:opacity-45 [&_svg:not(.size-4)]:size-[1.125rem] [&_svg]:shrink-0 [&_i]:text-[1.125rem] [&_i]:leading-none\";\nconst rowActive = \"bg-[color:color-mix(in_srgb,var(--color-primary)_10%,transparent)] font-medium text-primary hover:bg-[color:color-mix(in_srgb,var(--color-primary)_14%,transparent)] hover:text-primary\";\n\nfunction NavItem({ item, depth, activeHref }: { item: SidebarNavItem; depth: number; activeHref?: string }) {\n const hasChildren = !!item.children?.length;\n const active = !!activeHref && item.href === activeHref;\n // activeHref is already the single best match, so an exact search down the tree is enough.\n const holdsActive = hasChildren && containsActive(item, activeHref, false);\n const [open, setOpen] = React.useState(!!item.defaultOpen || holdsActive);\n React.useEffect(() => {\n if (holdsActive) setOpen(true);\n }, [holdsActive]);\n const subId = React.useId();\n const subRef = React.useRef<HTMLDivElement>(null);\n // A closed submenu stays out of the tab order (set directly: works on React 18 and 19).\n React.useEffect(() => {\n if (!subRef.current) return;\n if (open) subRef.current.removeAttribute(\"inert\");\n else subRef.current.setAttribute(\"inert\", \"\");\n }, [open]);\n\n const content = (\n <>\n {depth === 0 ? renderIcon(item.icon) : item.icon ? renderIcon(item.icon) : null}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.badge && <span className=\"shrink-0\">{item.badge}</span>}\n {item.external && (\n <svg viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.4} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-3 shrink-0 opacity-60\">\n <path d=\"M4 2.5h5.5V8M9.5 2.5L3 9\" />\n </svg>\n )}\n </>\n );\n\n return (\n <li className=\"grid min-w-0\">\n {hasChildren ? (\n <button\n type=\"button\"\n aria-expanded={open}\n aria-controls={subId}\n disabled={item.disabled}\n onClick={() => setOpen((o) => !o)}\n className={cn(rowBase, holdsActive && !open && \"text-fg\")}\n >\n {content}\n <Chevron open={open} />\n </button>\n ) : (\n <ItemLink item={item} active={active} className={cn(rowBase, active && rowActive)}>\n {content}\n </ItemLink>\n )}\n {hasChildren && (\n // Animated open/close: the row grows from 0fr to 1fr.\n <div\n ref={subRef}\n id={subId}\n className={cn(\n \"grid transition-[grid-template-rows,opacity] duration-200 ease-out motion-reduce:transition-none\",\n open ? \"grid-rows-[1fr] opacity-100\" : \"grid-rows-[0fr] opacity-0\"\n )}\n >\n <div className=\"min-h-0 overflow-hidden\">\n {/* A guide line down the left shows where the submenu belongs. */}\n <ul role=\"list\" className={cn(\"ms-[1.3rem] mt-0.5 grid gap-0.5 border-s border-border ps-2\", depth > 0 && \"ms-3\")}>\n {item.children!.map((child, i) => (\n <NavItem key={keyOf(child, i)} item={child} depth={depth + 1} activeHref={activeHref} />\n ))}\n </ul>\n </div>\n </div>\n )}\n </li>\n );\n}\n\n/* ---------- Icon rail + flyout ---------- */\n\nfunction RailItem({ item, activeHref }: { item: SidebarNavItem; activeHref?: string }) {\n const { side } = useSidebar();\n const hasChildren = !!item.children?.length;\n const active = !!activeHref && (item.href === activeHref || (hasChildren && containsActive(item, activeHref, false)));\n const [open, setOpen] = React.useState(false);\n const btnRef = React.useRef<HTMLButtonElement>(null);\n const flyRef = React.useRef<HTMLDivElement>(null);\n const [pos, setPos] = React.useState<React.CSSProperties>({});\n const flyId = React.useId();\n\n const icon = item.icon ? renderIcon(item.icon) : (\n <span aria-hidden=\"true\" className=\"grid size-6 place-items-center rounded-control-sm bg-secondary-hover text-xs font-semibold\">\n {item.label.slice(0, 1).toUpperCase()}\n </span>\n );\n const cls = cn(rowBase, \"size-10 justify-center px-0\", active && rowActive);\n\n React.useLayoutEffect(() => {\n if (!open || !btnRef.current) return;\n const r = btnRef.current.getBoundingClientRect();\n const top = Math.max(8, Math.min(r.top - 4, window.innerHeight - 320));\n setPos(side === \"left\" ? { position: \"fixed\", top, left: r.right + 10 } : { position: \"fixed\", top, right: window.innerWidth - r.left + 10 });\n }, [open, side]);\n\n React.useEffect(() => {\n if (!open) return;\n flyRef.current?.querySelector<HTMLElement>(\"a[href], button\")?.focus();\n const onDown = (e: PointerEvent) => {\n const t = e.target as Node;\n if (!flyRef.current?.contains(t) && !btnRef.current?.contains(t)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n btnRef.current?.focus();\n }\n };\n document.addEventListener(\"pointerdown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"pointerdown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n if (!hasChildren) {\n return (\n <li>\n <ItemLink item={item} active={!!activeHref && item.href === activeHref} className={cls} aria-label={item.label} title={item.label}>\n {icon}\n </ItemLink>\n </li>\n );\n }\n return (\n <li className=\"relative\">\n <button\n ref={btnRef}\n type=\"button\"\n aria-label={item.label}\n title={item.label}\n aria-haspopup=\"true\"\n aria-expanded={open}\n aria-controls={open ? flyId : undefined}\n onClick={() => setOpen((o) => !o)}\n className={cn(cls, open && \"bg-secondary-hover text-fg\")}\n >\n {icon}\n </button>\n {open && (\n <div\n ref={flyRef}\n id={flyId}\n style={pos}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"a[href]\")) setOpen(false);\n }}\n className=\"z-[60] w-60 rounded-control-lg border border-border bg-surface p-2 shadow-[var(--ui-shadow-lg)] animate-[ui-menu-down_140ms_cubic-bezier(0.2,0.9,0.3,1)]\"\n >\n <p className=\"px-3 pb-1.5 pt-1 text-xs font-medium text-fg-muted\">{item.label}</p>\n {/* The flyout shows the full submenu tree, expanded style. */}\n <RailFlyoutMenu items={item.children!} activeHref={activeHref} />\n </div>\n )}\n </li>\n );\n}\n\nfunction RailFlyoutMenu({ items, activeHref }: { items: SidebarNavItem[]; activeHref?: string }) {\n // Render expanded rows even though the sidebar is a rail.\n const ctx = useSidebar();\n const expandedCtx = React.useMemo(() => ({ ...ctx, collapsed: false }), [ctx]);\n return (\n <SidebarContext.Provider value={expandedCtx}>\n <ul role=\"list\" className=\"grid gap-0.5\">\n {items.map((it, i) => (\n <NavItem key={keyOf(it, i)} item={it} depth={0} activeHref={activeHref} />\n ))}\n </ul>\n </SidebarContext.Provider>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\nimport { Input, type InputProps } from \"./Input\";\n\n/*\n * Autocomplete — a text field that suggests as you type. The value is whatever the person\n * types; suggestions are shortcuts, not rules (use Select when the answer must come from a list).\n *\n * Extras: inline completion (the rest of the best match appears faintly — Tab or → accepts it),\n * recent searches remembered per browser, server suggestions with debouncing, and full\n * keyboard/screen-reader support (the ARIA combobox pattern with an editable field).\n */\n\nexport type AutocompleteItem =\n | string\n | {\n /** What goes into the field when picked. */\n value: string;\n /** Shown in the list (defaults to value). */\n label?: string;\n description?: React.ReactNode;\n icon?: IconInput;\n /** Show under this heading. */\n group?: string;\n };\n\ntype Item = { value: string; label: string; description?: React.ReactNode; icon?: IconInput; group?: string; recent?: boolean };\n\nexport interface AutocompleteProps\n extends Omit<InputProps, \"value\" | \"defaultValue\" | \"onChange\" | \"onSubmit\" | \"overlay\" | \"type\"> {\n value?: string;\n defaultValue?: string;\n /** Called with the text on every change (typing, picking, completing, clearing). */\n onChange?: (value: string) => void;\n /** A fixed list, or a function that returns suggestions for what's typed. */\n suggestions?: AutocompleteItem[] | ((query: string) => AutocompleteItem[]);\n /** Fetch suggestions from a server. Debounced; slow earlier replies never overwrite newer ones. */\n loadSuggestions?: (query: string, context: { signal: AbortSignal }) => Promise<AutocompleteItem[]>;\n /** Characters needed before suggesting. Default 1. */\n minLength?: number;\n /** Wait this long (ms) after typing before calling loadSuggestions. Default 200. */\n debounce?: number;\n /** Most suggestions shown. Default 8. */\n maxSuggestions?: number;\n /** Show the rest of the best match faintly in the field; Tab or → accepts it. Default true. */\n inlineComplete?: boolean;\n /** Called when a suggestion is picked (from the list or by completing it). */\n onSelectSuggestion?: (item: Item) => void;\n /** Called when Enter is pressed without a suggestion highlighted — e.g. to run a search. (With type=\"search\", Escape also clears the field.) */\n onSubmit?: (value: string) => void;\n /** Remember submitted and picked values in this browser under this key, and offer them when the field is empty. */\n recentKey?: string;\n /** How many recent values to keep. Default 5. */\n maxRecent?: number;\n /** Shown when nothing matches. Default: the list simply closes. */\n emptyMessage?: React.ReactNode;\n /** Custom matching for fixed suggestions. Default: every word appears (case and accents ignored). */\n filter?: (item: Item, query: string) => boolean;\n type?: \"text\" | \"search\" | \"email\" | \"url\" | \"tel\";\n}\n\n/* ---------- helpers ---------- */\n\nconst norm = (t: string) => t.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").toLowerCase();\nconst toItem = (x: AutocompleteItem): Item => (typeof x === \"string\" ? { value: x, label: x } : { ...x, label: x.label ?? x.value });\n\nfunction defaultFilter(item: Item, q: string) {\n const hay = norm(`${item.label} ${item.value}`);\n return norm(q).split(/\\s+/).filter(Boolean).every((w) => hay.includes(w));\n}\n\n/** Rank: starts with the query → a word starts with it → contains it. */\nfunction rank(item: Item, q: string) {\n const l = norm(item.label);\n const n = norm(q.trim());\n if (l.startsWith(n)) return 0;\n if (l.split(/[\\s\\-_.@/]+/).some((w) => w.startsWith(n))) return 1;\n return 2;\n}\n\nfunction Highlight({ text, query }: { text: string; query: string }) {\n const q = norm(query.trim());\n const i = q ? norm(text).indexOf(q) : -1;\n if (i < 0) return <>{text}</>;\n return (\n <>\n {text.slice(0, i)}\n <mark className=\"bg-transparent font-semibold text-inherit\">{text.slice(i, i + q.length)}</mark>\n {text.slice(i + q.length)}\n </>\n );\n}\n\nfunction readRecent(key?: string): string[] {\n if (!key || typeof window === \"undefined\") return [];\n try {\n const v = JSON.parse(window.localStorage.getItem(key) ?? \"[]\");\n return Array.isArray(v) ? v.filter((x) => typeof x === \"string\") : [];\n } catch {\n return [];\n }\n}\n\n/* ---------- component ---------- */\n\nexport const Autocomplete = React.forwardRef<HTMLInputElement, AutocompleteProps>(function Autocomplete(\n {\n value: valueProp,\n defaultValue = \"\",\n onChange,\n suggestions,\n loadSuggestions,\n minLength = 1,\n debounce = 200,\n maxSuggestions = 8,\n inlineComplete = true,\n onSelectSuggestion,\n onSubmit,\n recentKey,\n maxRecent = 5,\n emptyMessage,\n filter = defaultFilter,\n type = \"text\",\n onKeyDown,\n onFocus,\n onBlur,\n frameClassName,\n ...inputProps\n },\n ref\n) {\n const [inner, setInner] = React.useState(defaultValue);\n const value = valueProp ?? inner;\n const setValue = (v: string) => {\n if (valueProp === undefined) setInner(v);\n onChange?.(v);\n };\n\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const listId = React.useId();\n const optionId = (i: number) => `${listId}-o${i}`;\n const [open, setOpen] = React.useState(false);\n const [active, setActive] = React.useState(-1);\n const [focused, setFocused] = React.useState(false);\n const [caretAtEnd, setCaretAtEnd] = React.useState(true);\n const [recent, setRecent] = React.useState<string[]>(() => readRecent(recentKey));\n\n /* ----- suggestions: fixed, computed, or from a server ----- */\n const [remote, setRemote] = React.useState<Item[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState(false);\n const request = React.useRef(0);\n const query = value;\n const long = query.trim().length >= minLength;\n\n React.useEffect(() => {\n if (!loadSuggestions || !focused || !long) {\n setRemote([]);\n setLoading(false);\n return;\n }\n const id = ++request.current;\n const controller = new AbortController();\n setLoading(true);\n setError(false);\n const t = window.setTimeout(() => {\n loadSuggestions(query.trim(), { signal: controller.signal }).then(\n (res) => {\n if (id !== request.current) return; // a newer search replaced this one\n setRemote(res.map(toItem));\n setLoading(false);\n },\n () => {\n if (id !== request.current || controller.signal.aborted) return;\n setError(true);\n setLoading(false);\n }\n );\n }, debounce);\n return () => {\n window.clearTimeout(t);\n controller.abort();\n };\n }, [query, focused, long, loadSuggestions, debounce]);\n\n const items: Item[] = React.useMemo(() => {\n const q = query.trim();\n if (!q) {\n // Empty field: offer recent values.\n return recent.slice(0, maxRecent).map((r) => ({ value: r, label: r, recent: true, group: \"Recent\" }));\n }\n if (!long) return [];\n let list: Item[];\n if (loadSuggestions) list = remote;\n else if (typeof suggestions === \"function\") list = suggestions(q).map(toItem);\n else list = (suggestions ?? []).map(toItem).filter((it) => filter(it, q));\n if (!loadSuggestions && typeof suggestions !== \"function\") list = [...list].sort((a, b) => rank(a, q) - rank(b, q));\n // Don't suggest exactly what's already typed.\n return list.filter((it) => norm(it.value) !== norm(q)).slice(0, maxSuggestions);\n }, [query, long, suggestions, loadSuggestions, remote, filter, maxSuggestions, recent, maxRecent]);\n\n const showList = open && focused && (items.length > 0 || loading || (long && !!emptyMessage) || error);\n\n React.useEffect(() => setActive(-1), [query]);\n\n /* ----- inline completion: the rest of the top match, if it starts with what's typed ----- */\n const top = items.find((it) => !it.recent);\n const completion =\n inlineComplete && focused && caretAtEnd && query && top && norm(top.value).startsWith(norm(query)) && active < 0\n ? top.value.slice(query.length)\n : \"\";\n\n /* ----- positioning (fixed, so it works inside modals and scrolling areas) ----- */\n const [pos, setPos] = React.useState<React.CSSProperties>({});\n const place = React.useCallback(() => {\n const frame = inputRef.current?.closest<HTMLElement>(\"[data-control-frame]\") ?? inputRef.current;\n if (!frame) return;\n const r = frame.getBoundingClientRect();\n const below = window.innerHeight - r.bottom - 8;\n const up = below < 220 && r.top > below;\n setPos({\n position: \"fixed\",\n left: r.left,\n width: r.width,\n ...(up ? { bottom: window.innerHeight - r.top + 4 } : { top: r.bottom + 4 }),\n maxHeight: Math.min(320, (up ? r.top : below) - 8),\n });\n }, []);\n React.useLayoutEffect(() => {\n if (!showList) return;\n place();\n window.addEventListener(\"resize\", place);\n window.addEventListener(\"scroll\", place, true);\n return () => {\n window.removeEventListener(\"resize\", place);\n window.removeEventListener(\"scroll\", place, true);\n };\n }, [showList, place]);\n\n React.useEffect(() => {\n if (active >= 0) document.getElementById(optionId(active))?.scrollIntoView?.({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active]);\n\n /* ----- actions ----- */\n const remember = (v: string) => {\n if (!recentKey || !v.trim()) return;\n const next = [v, ...recent.filter((r) => norm(r) !== norm(v))].slice(0, maxRecent);\n setRecent(next);\n try {\n window.localStorage.setItem(recentKey, JSON.stringify(next));\n } catch {\n /* storage unavailable */\n }\n };\n const forget = (v: string) => {\n const next = recent.filter((r) => r !== v);\n setRecent(next);\n try {\n if (recentKey) window.localStorage.setItem(recentKey, JSON.stringify(next));\n } catch {\n /* ignore */\n }\n };\n\n const pick = (it: Item) => {\n setValue(it.value);\n onSelectSuggestion?.(it);\n remember(it.value);\n setOpen(false);\n setActive(-1);\n requestAnimationFrame(() => {\n const el = inputRef.current;\n try {\n if (el) el.setSelectionRange(el.value.length, el.value.length);\n } catch {\n /* email fields don't support selection ranges */\n }\n });\n };\n\n const acceptCompletion = () => {\n if (!completion || !top) return false;\n pick(top);\n return true;\n };\n\n // Email fields don't report the cursor position (selectionStart is null); treat that as \"at the end\".\n const atEnd = (el: HTMLInputElement) => el.selectionStart === null || (el.selectionStart === el.value.length && el.selectionEnd === el.value.length);\n const updateCaret = () => {\n const el = inputRef.current;\n if (el) setCaretAtEnd(atEnd(el));\n };\n\n const onKey = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(e);\n if (e.defaultPrevented) return;\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n if (!open) setOpen(true);\n setActive((a) => (items.length ? (a + 1) % items.length : -1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (!open) setOpen(true);\n setActive((a) => (items.length ? (a <= 0 ? items.length - 1 : a - 1) : -1));\n break;\n case \"ArrowRight\":\n case \"End\":\n if (completion && caretAtEnd) {\n e.preventDefault();\n acceptCompletion();\n }\n break;\n case \"Tab\":\n if (completion && !e.shiftKey) {\n e.preventDefault();\n acceptCompletion();\n } else setOpen(false);\n break;\n case \"Enter\":\n if (showList && active >= 0 && items[active]) {\n e.preventDefault();\n pick(items[active]);\n } else {\n if (onSubmit) {\n e.preventDefault();\n onSubmit(value);\n }\n remember(value);\n setOpen(false);\n }\n break;\n case \"Escape\":\n if (showList) {\n e.preventDefault();\n e.stopPropagation(); // don't also close a surrounding Modal\n setOpen(false);\n setActive(-1);\n } else if (value && type === \"search\") {\n // Like a native search box: Escape with no list open clears it.\n e.preventDefault();\n setValue(\"\");\n }\n break;\n case \"Delete\":\n // Shift+Delete removes a highlighted recent value.\n if (e.shiftKey && active >= 0 && items[active]?.recent) {\n e.preventDefault();\n forget(items[active].value);\n }\n break;\n }\n };\n\n const setRefs = (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) ref.current = node;\n };\n\n // Group headings (e.g. \"Recent\", or your own groups).\n let lastGroup: string | undefined;\n\n return (\n <div className=\"relative w-full\">\n <Input\n ref={setRefs}\n type={type}\n role=\"combobox\"\n aria-autocomplete={inlineComplete ? \"both\" : \"list\"}\n aria-expanded={!!showList}\n aria-controls={listId}\n aria-activedescendant={showList && active >= 0 ? optionId(active) : undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n value={value}\n onChange={(e) => {\n setValue(e.target.value);\n setOpen(true);\n setCaretAtEnd(atEnd(e.target));\n }}\n onKeyDown={onKey}\n onKeyUp={updateCaret}\n onClick={() => {\n updateCaret();\n setOpen(true);\n }}\n onSelect={updateCaret}\n onFocus={(e) => {\n setFocused(true);\n setOpen(true);\n onFocus?.(e);\n }}\n onBlur={(e) => {\n setFocused(false);\n setOpen(false);\n onBlur?.(e);\n }}\n frameClassName={frameClassName}\n overlay={\n inlineComplete ? (\n // Mirrors the typed text invisibly, then shows the completion faintly after it.\n <span aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 flex items-center overflow-hidden whitespace-pre\">\n <span className=\"invisible\">{value}</span>\n <span className=\"text-fg-muted/55\">{completion}</span>\n </span>\n ) : undefined\n }\n {...inputProps}\n />\n <span className=\"sr-only\" aria-live=\"polite\">\n {showList && !loading && long ? `${items.length} suggestion${items.length === 1 ? \"\" : \"s\"}` : \"\"}\n </span>\n\n {showList && (\n <div\n id={listId}\n role=\"listbox\"\n aria-label=\"Suggestions\"\n style={pos}\n onMouseDown={(e) => e.preventDefault() /* keep focus in the field */}\n className=\"z-[60] overflow-y-auto overscroll-contain rounded-control-lg border border-border bg-surface p-1 text-fg shadow-[var(--ui-shadow-lg)] animate-[ui-fade-in_100ms_ease-out]\"\n >\n {items.map((it, i) => {\n const heading = it.group && it.group !== lastGroup ? it.group : null;\n lastGroup = it.group;\n return (\n <React.Fragment key={`${it.group ?? \"\"}:${it.value}`}>\n {heading && (\n <div role=\"presentation\" className=\"flex items-center justify-between px-2.5 pb-1 pt-2 text-xs font-medium text-fg-muted first:pt-1\">\n {heading}\n {it.recent && (\n <button\n type=\"button\"\n tabIndex={-1}\n onClick={() => {\n setRecent([]);\n try {\n if (recentKey) window.localStorage.removeItem(recentKey);\n } catch {\n /* ignore */\n }\n }}\n className=\"cursor-pointer rounded-control-sm px-1 font-normal hover:text-fg\"\n >\n Clear\n </button>\n )}\n </div>\n )}\n <div\n id={optionId(i)}\n role=\"option\"\n aria-selected={i === active}\n onMouseMove={() => setActive(i)}\n onClick={() => pick(it)}\n className={cn(\n \"group/opt flex cursor-pointer items-center gap-2.5 rounded-control-sm px-2.5 py-2 text-[0.9375rem]\",\n i === active && \"bg-secondary-hover\",\n \"[&>i]:text-[1.05em] [&>i]:text-fg-muted [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-fg-muted\"\n )}\n >\n {it.recent ? (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"6.5\" />\n <path d=\"M10 6.5V10l2.5 1.5\" />\n </svg>\n ) : (\n renderIcon(it.icon)\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">\n <Highlight text={it.label} query={it.recent ? \"\" : query} />\n </span>\n {it.description && <span className=\"block truncate text-[0.8125rem] text-fg-muted\">{it.description}</span>}\n </span>\n {it.recent && (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label={`Remove ${it.value} from recent`}\n onClick={(e) => {\n e.stopPropagation();\n forget(it.value);\n }}\n className=\"grid size-6 shrink-0 cursor-pointer place-items-center rounded-control-sm text-fg-muted opacity-0 hover:bg-border hover:text-fg group-hover/opt:opacity-100 group-aria-selected/opt:opacity-100\"\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-3\">\n <path d=\"M6 6l8 8M14 6l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n </React.Fragment>\n );\n })}\n {items.length === 0 && (\n <div role=\"presentation\" className=\"px-2.5 py-2.5 text-sm text-fg-muted\">\n {error ? \"Couldn't load suggestions.\" : loading ? \"Looking…\" : emptyMessage}\n </div>\n )}\n {items.length > 0 && loading && (\n <div role=\"presentation\" className=\"px-2.5 pb-1 pt-0.5 text-xs text-fg-muted\">Updating…</div>\n )}\n </div>\n )}\n </div>\n );\n});\n\n","import * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../lib/cn\";\nimport { useField, useFieldControlProps } from \"../input/Field\";\n\n/*\n * Slider — pick a number (or a range) by dragging.\n *\n * At rest the thumb is a raised knob on a sunken track. Press it and it swells into a frosted\n * glass lens that blurs the colored track beneath, while a glass bubble rises above your finger\n * with the value — so the number is never hidden under your thumb on a phone.\n * Drag past either end and it stretches a little, then springs back. On phones that support it,\n * you feel a tiny tick as the value snaps between marks.\n *\n * Accessible: each thumb is role=\"slider\" with the full keyboard set, and values post with forms.\n */\n\ntype Value = number | [number, number];\n\nexport interface SliderMark {\n value: number;\n label?: React.ReactNode;\n}\n\nexport interface SliderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\" | \"color\"> {\n /** A number, or [low, high] for a range with two thumbs. */\n value?: Value;\n defaultValue?: Value;\n /** Called continuously while dragging. */\n onChange?: (value: Value) => void;\n /** Called once the person lets go (or finishes with the keyboard) — good for saving. */\n onValueCommit?: (value: Value) => void;\n min?: number;\n max?: number;\n step?: number;\n /** Tick marks: true for one per step, an array of values, or values with labels. */\n marks?: boolean | number[] | SliderMark[];\n /** Turn a value into text, e.g. (v) => `₱${v.toLocaleString()}`. Also read by screen readers. */\n formatValue?: (value: number) => string;\n /** When the value bubble shows: while pressed or focused (default), always, or never. */\n showValue?: \"active\" | \"always\" | \"never\";\n /** Fill color: the Switch palette (primary, secondary, tertiary, success, warning, danger, info) or any CSS color. */\n color?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n /** Smallest gap between the two thumbs of a range. Default one step. */\n minDistance?: number;\n /** A tiny vibration when snapping between marks (phones that support it). Default true. */\n haptics?: boolean;\n /** Adds hidden inputs with this name for normal form posts (name[] for a range in Laravel). */\n name?: string;\n /** Labels for the two thumbs of a range. Default [\"Minimum\", \"Maximum\"]. */\n thumbLabels?: [string, string];\n id?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n}\n\nconst palette: Record<string, string> = {\n primary: \"var(--color-primary)\",\n secondary: \"var(--color-tone-secondary)\",\n tertiary: \"var(--color-tone-tertiary)\",\n success: \"var(--color-success)\",\n warning: \"var(--color-warning)\",\n danger: \"var(--color-danger)\",\n info: \"var(--color-info)\",\n};\n\nconst sizes = {\n sm: { knob: 16, track: 4, lens: 1.55 },\n md: { knob: 20, track: 6, lens: 1.6 },\n lg: { knob: 26, track: 8, lens: 1.5 },\n} as const;\n\nconst clamp = (v: number, a: number, b: number) => Math.min(b, Math.max(a, v));\nconst decimals = (n: number) => (String(n).split(\".\")[1] ?? \"\").length;\n\n/**\n * The value bubble. It floats above the page (rendered at the end of <body> with a fixed position)\n * so accordions, cards and scroll areas that clip their content can't cut it off.\n */\nfunction ValueBubble({ anchor, visible, text, lift }: { anchor: HTMLElement | null; visible: boolean; text: string; lift: number }) {\n const [pos, setPos] = React.useState<{ left: number; top: number } | null>(null);\n const [mounted, setMounted] = React.useState(false);\n React.useEffect(() => setMounted(true), []);\n\n const place = React.useCallback(() => {\n if (!anchor) return;\n const r = anchor.getBoundingClientRect();\n const next = { left: r.left + r.width / 2, top: r.top + r.height / 2 - lift };\n setPos((p) => (p && Math.abs(p.left - next.left) < 0.5 && Math.abs(p.top - next.top) < 0.5 ? p : next));\n }, [anchor, lift]);\n\n // Follow the thumb while it moves, and when the page scrolls or resizes.\n React.useLayoutEffect(() => {\n if (visible) place();\n });\n React.useEffect(() => {\n if (!visible) return;\n window.addEventListener(\"scroll\", place, true);\n window.addEventListener(\"resize\", place);\n return () => {\n window.removeEventListener(\"scroll\", place, true);\n window.removeEventListener(\"resize\", place);\n };\n }, [visible, place]);\n\n if (!mounted || !pos) return null;\n return createPortal(\n <span\n aria-hidden=\"true\"\n className={cn(\n \"ui-glass pointer-events-none fixed z-[70] grid min-w-9 -translate-x-1/2 -translate-y-full place-items-center whitespace-nowrap rounded-full px-2.5 py-1 text-[0.8125rem] font-semibold tabular-nums text-fg\",\n \"transition-[opacity,scale] duration-200 ease-[cubic-bezier(0.3,1.4,0.5,1)] motion-reduce:transition-none\",\n visible ? \"scale-100 opacity-100\" : \"scale-75 opacity-0\"\n )}\n style={{ left: pos.left, top: pos.top }}\n >\n {text}\n </span>,\n document.body\n );\n}\n\nexport const Slider = React.forwardRef<HTMLDivElement, SliderProps>(function Slider(\n {\n value: valueProp,\n defaultValue,\n onChange,\n onValueCommit,\n min = 0,\n max = 100,\n step = 1,\n marks,\n formatValue = (v) => String(v),\n showValue = \"active\",\n color = \"primary\",\n size = \"md\",\n disabled: disabledProp,\n minDistance,\n haptics = true,\n name,\n thumbLabels = [\"Minimum\", \"Maximum\"],\n id,\n className,\n style,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": labelledBy,\n ...props\n },\n ref\n) {\n const field = useField();\n const control = useFieldControlProps({ id, disabled: disabledProp });\n const disabled = !!control.disabled;\n const isRange = Array.isArray(valueProp ?? defaultValue);\n const [inner, setInner] = React.useState<Value>(defaultValue ?? (isRange ? [min, max] : min));\n const value = valueProp ?? inner;\n const values: number[] = Array.isArray(value) ? value : [value];\n const gap = minDistance ?? step;\n const g = sizes[size];\n\n const trackRef = React.useRef<HTMLDivElement>(null);\n const thumbRefs = React.useRef<Array<HTMLDivElement | null>>([]);\n const [activeThumb, setActiveThumb] = React.useState<number | null>(null); // being dragged\n const [focusThumb, setFocusThumb] = React.useState<number | null>(null);\n const [stretch, setStretch] = React.useState(0); // px past the end (elastic)\n const latest = React.useRef(values);\n latest.current = values;\n\n const snap = (v: number) => {\n const s = Math.round((v - min) / step) * step + min;\n return +clamp(s, min, max).toFixed(decimals(step));\n };\n // Out-of-range values (e.g. old data) are drawn at the nearest end instead of off the track.\n const pct = (v: number) => clamp(((v - min) / (max - min)) * 100, 0, 100);\n\n const markList: SliderMark[] = React.useMemo(() => {\n if (!marks) return [];\n if (marks === true) {\n const n = Math.round((max - min) / step);\n return n > 60 ? [] : Array.from({ length: n + 1 }, (_, i) => ({ value: +(min + i * step).toFixed(decimals(step)) }));\n }\n return marks.map((m) => (typeof m === \"number\" ? { value: m } : m));\n }, [marks, min, max, step]);\n\n const emit = (next: number[]) => {\n const out: Value = isRange ? [next[0], next[1]] : next[0];\n if (valueProp === undefined) setInner(out);\n onChange?.(out);\n };\n\n const buzz = (from: number, to: number) => {\n if (!haptics || from === to || typeof navigator === \"undefined\" || !(\"vibrate\" in navigator)) return;\n // Tick when crossing a mark (or on every step when there are few steps).\n const few = (max - min) / step <= 20;\n if (few || markList.some((m) => (m.value > Math.min(from, to) && m.value <= Math.max(from, to)))) {\n try {\n navigator.vibrate(4);\n } catch {\n /* not allowed */\n }\n }\n };\n\n const setThumb = (index: number, raw: number) => {\n const cur = latest.current;\n let v = snap(raw);\n if (isRange) v = index === 0 ? Math.min(v, cur[1] - gap) : Math.max(v, cur[0] + gap);\n v = snap(clamp(v, min, max));\n if (v === cur[index]) return;\n buzz(cur[index], v);\n const next = [...cur];\n next[index] = v;\n latest.current = next;\n emit(next);\n };\n\n /* ----- pointer: tap anywhere on the track, then drag ----- */\n const valueAt = (clientX: number) => {\n const r = trackRef.current!.getBoundingClientRect();\n const rtl = getComputedStyle(trackRef.current!).direction === \"rtl\";\n const x = rtl ? r.right - clientX : clientX - r.left;\n const over = x < 0 ? x : x > r.width ? x - r.width : 0;\n return { v: min + clamp(x / r.width, 0, 1) * (max - min), over: rtl ? -over : over };\n };\n\n const onPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n if (disabled || e.button !== 0) return;\n const { v } = valueAt(e.clientX);\n // Pick the nearest thumb (for a range); if they overlap, pick by direction of travel.\n let index = 0;\n if (isRange) {\n const d0 = Math.abs(v - values[0]);\n const d1 = Math.abs(v - values[1]);\n index = d0 === d1 ? (v > values[0] ? 1 : 0) : d0 < d1 ? 0 : 1;\n }\n e.preventDefault();\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n setActiveThumb(index);\n thumbRefs.current[index]?.focus({ preventScroll: true });\n setThumb(index, v);\n\n const move = (ev: PointerEvent) => {\n const r = valueAt(ev.clientX);\n setThumb(index, r.v);\n // Elastic ends: resistance grows the further you pull, capped at 14px.\n setStretch(r.over === 0 ? 0 : Math.sign(r.over) * Math.min(14, Math.abs(r.over) ** 0.62));\n };\n const up = () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n setActiveThumb(null);\n setStretch(0);\n const cur = latest.current;\n onValueCommit?.(isRange ? [cur[0], cur[1]] : cur[0]);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n };\n\n /* ----- keyboard ----- */\n const onKeyDown = (index: number) => (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n const big = Math.max(step, ((max - min) / 10));\n const cur = latest.current[index];\n const rtl = getComputedStyle(e.currentTarget).direction === \"rtl\";\n const map: Record<string, number | undefined> = {\n ArrowRight: rtl ? -step : step,\n ArrowUp: step,\n ArrowLeft: rtl ? step : -step,\n ArrowDown: -step,\n PageUp: big,\n PageDown: -big,\n };\n let next: number | undefined;\n if (e.key in map) next = cur + (map[e.key] as number) * (e.shiftKey && !e.key.startsWith(\"Page\") ? 10 : 1);\n else if (e.key === \"Home\") next = min;\n else if (e.key === \"End\") next = max;\n if (next === undefined) return;\n e.preventDefault();\n setThumb(index, next);\n };\n const onKeyUp = () => {\n const cur = latest.current;\n onValueCommit?.(isRange ? [cur[0], cur[1]] : cur[0]);\n };\n\n const fill = isRange ? { start: pct(values[0]), end: pct(values[1]) } : { start: 0, end: pct(values[0]) };\n const hasLabels = markList.some((m) => m.label !== undefined);\n\n return (\n <div\n ref={ref}\n className={cn(\"w-full select-none\", disabled && \"opacity-50\", className)}\n style={{ [\"--sl\" as string]: palette[color] ?? color, ...style }}\n {...props}\n >\n <div\n className={cn(\"relative flex touch-pan-y items-center\", disabled ? \"cursor-not-allowed\" : \"cursor-pointer\", showValue === \"always\" && \"mt-9\")}\n style={{ height: Math.max(44, g.knob * g.lens + 8), paddingInline: g.knob / 2 }}\n onPointerDown={onPointerDown}\n >\n {/* The track: sunken, with the colored fill */}\n <div\n ref={trackRef}\n className=\"relative w-full rounded-full bg-border-strong/80 shadow-[inset_0_1px_2px_rgb(var(--ui-shadow-color)/0.25)]\"\n style={{ height: g.track }}\n >\n <div\n className={cn(\n \"absolute inset-y-0 rounded-full bg-[color:var(--sl)]\",\n activeThumb === null && \"transition-[inset-inline-start,width] duration-150 ease-out motion-reduce:transition-none\"\n )}\n style={{\n insetInlineStart: `${fill.start}%`,\n width: `calc(${fill.end - fill.start}% + ${Math.abs(stretch)}px)`,\n ...(stretch < 0 ? { transform: `translateX(${stretch}px)` } : {}),\n }}\n />\n {markList.map((m) => {\n const inFill = m.value >= (isRange ? values[0] : min) && m.value <= (isRange ? values[1] : values[0]);\n return (\n <span\n key={m.value}\n aria-hidden=\"true\"\n className={cn(\"absolute top-1/2 size-1 -translate-x-1/2 -translate-y-1/2 rounded-full rtl:translate-x-1/2\", inFill ? \"bg-white/70\" : \"bg-fg-muted/50\")}\n style={{ insetInlineStart: `${pct(m.value)}%` }}\n />\n );\n })}\n\n {values.map((v, i) => {\n const pressed = activeThumb === i;\n const lifted = pressed || (focusThumb === i && showValue !== \"never\");\n const bubble = showValue === \"always\" || (showValue === \"active\" && lifted);\n const text = formatValue(v);\n const thumbStretch = pressed && ((stretch > 0 && v === max) || (stretch < 0 && v === min)) ? stretch : 0;\n return (\n <div\n key={i}\n ref={(el) => {\n thumbRefs.current[i] = el;\n }}\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuemin={isRange && i === 1 ? values[0] + gap : min}\n aria-valuemax={isRange && i === 0 ? values[1] - gap : max}\n aria-valuenow={v}\n aria-valuetext={text}\n aria-disabled={disabled || undefined}\n aria-orientation=\"horizontal\"\n aria-label={isRange ? thumbLabels[i] : ariaLabel}\n aria-labelledby={isRange ? undefined : ariaLabel ? undefined : (labelledBy ?? field?.labelId)}\n aria-describedby={control[\"aria-describedby\"]}\n id={i === 0 ? control.id : undefined}\n onKeyDown={onKeyDown(i)}\n onKeyUp={onKeyUp}\n onFocus={() => setFocusThumb(i)}\n onBlur={() => setFocusThumb(null)}\n className={cn(\n \"group/thumb absolute top-1/2 z-[1] -translate-x-1/2 -translate-y-1/2 rounded-full outline-none rtl:translate-x-1/2\",\n activeThumb === null && \"transition-[inset-inline-start] duration-150 ease-out motion-reduce:transition-none\",\n pressed && \"z-[2]\"\n )}\n style={{ insetInlineStart: `${pct(v)}%`, width: g.knob, height: g.knob, marginInlineStart: thumbStretch }}\n >\n {/* The knob. Pressed: it grows into frosted glass. */}\n <span\n className={cn(\n \"absolute inset-0 rounded-full transition-[transform,background-color,box-shadow] duration-200 ease-[cubic-bezier(0.3,1.4,0.5,1)] motion-reduce:transition-none\",\n pressed\n ? \"ui-glass\"\n : \"bg-white shadow-[0_1px_3px_rgb(0_0_0/0.25),0_0_0_1px_rgb(0_0_0/0.06),inset_0_-2px_0_rgb(0_0_0/0.06)]\",\n // Focus ring for keyboard use only — not while a finger or mouse is pressing.\n !pressed && \"group-focus-visible/thumb:ring-3 group-focus-visible/thumb:ring-ring/40\"\n )}\n style={{ transform: pressed ? `scale(${g.lens})` : focusThumb === i ? \"scale(1.08)\" : \"scale(1)\" }}\n />\n {/* A dot of the fill color at the center, visible through the glass. */}\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute left-1/2 top-1/2 size-1.5 -translate-x-1/2 -translate-y-1/2 rounded-full bg-[color:var(--sl)] transition-opacity duration-150\",\n pressed ? \"opacity-0\" : \"opacity-100\"\n )}\n />\n {/* The value bubble: glass, floating above the finger (outside any clipping container). */}\n {showValue !== \"never\" && (\n <ValueBubble\n anchor={thumbRefs.current[i]}\n visible={bubble}\n text={text}\n lift={pressed ? (g.knob * g.lens) / 2 + 10 : g.knob / 2 + 8}\n />\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n {hasLabels && (\n <div className=\"relative h-5 text-xs text-fg-muted\" style={{ marginInline: g.knob / 2 }}>\n {markList\n .filter((m) => m.label !== undefined)\n .map((m) => (\n <span\n key={m.value}\n className=\"absolute top-0 -translate-x-1/2 whitespace-nowrap tabular-nums rtl:translate-x-1/2\"\n style={{ insetInlineStart: `${pct(m.value)}%` }}\n >\n {m.label}\n </span>\n ))}\n </div>\n )}\n\n {name && values.map((v, i) => <input key={i} type=\"hidden\" name={name} value={v} />)}\n </div>\n );\n});\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"../button/Button\";\nimport { Select } from \"../select/Select\";\nimport { ActivityIndicator } from \"../activity/Activity\";\n\n/*\n * Pagination — move between pages of results.\n *\n * <Pagination page={page} pageCount={12} onPageChange={setPage} />\n * <Pagination page={page} total={470} pageSize={25} getHref={(p) => `/invoices?page=${p}`} linkComponent={Link} />\n *\n * Numbers with gaps (1 … 4 5 6 … 12), where a gap jumps five pages; the highlight slides between\n * pages. It adapts to its own width: fewer numbers when narrow, and \"Page 3 of 12\" with arrows\n * when very narrow. Optional summary (\"21–30 of 470\"), page-size picker and \"Go to page\" box.\n * LoadMore is the alternative for feeds: a button with \"Showing 20 of 47\".\n */\n\ntype PageItem = number | \"start-gap\" | \"end-gap\";\n\n/** The list of page numbers and gaps to show. */\nexport function getPageItems(page: number, pageCount: number, siblings = 1, boundaries = 1): PageItem[] {\n if (pageCount <= 0) return [];\n const total = boundaries * 2 + siblings * 2 + 3; // numbers + 2 gaps + current\n if (pageCount <= total) return Array.from({ length: pageCount }, (_, i) => i + 1);\n const range = (a: number, b: number) => Array.from({ length: Math.max(0, b - a + 1) }, (_, i) => a + i);\n const start = range(1, boundaries);\n const end = range(pageCount - boundaries + 1, pageCount);\n const lo = Math.max(Math.min(page - siblings, pageCount - boundaries - siblings * 2 - 1), boundaries + 2);\n const hi = Math.min(Math.max(page + siblings, boundaries + siblings * 2 + 2), pageCount - boundaries - 1);\n return [\n ...start,\n ...(lo > boundaries + 2 ? ([\"start-gap\"] as const) : lo === boundaries + 2 ? [boundaries + 1] : []),\n ...range(lo, hi),\n ...(hi < pageCount - boundaries - 1 ? ([\"end-gap\"] as const) : hi === pageCount - boundaries - 1 ? [pageCount - boundaries] : []),\n ...end,\n ];\n}\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLElement>, \"onChange\"> {\n /** Current page (1-based). */\n page: number;\n /** Number of pages. Or give total + pageSize. */\n pageCount?: number;\n total?: number;\n pageSize?: number;\n onPageChange?: (page: number) => void;\n /**\n * Make pages real links (good for search engines and opening in new tabs).\n * Pair with linkComponent for Next.js/Inertia links.\n */\n getHref?: (page: number) => string;\n linkComponent?: React.ElementType;\n /** Pages shown on each side of the current one. Default 1 (fewer when narrow). */\n siblingCount?: number;\n /** Pages always shown at the start and end. Default 1. */\n boundaryCount?: number;\n /** First/last page buttons. Default false. */\n showFirstLast?: boolean;\n /** \"numbers\" (default) or \"simple\": ‹ Page 3 of 12 ›. With responsive, narrow widths switch to simple. */\n variant?: \"numbers\" | \"simple\";\n /** Adapt to the available width. Default true. */\n responsive?: boolean;\n /** Show \"21–30 of 470\" (needs total and pageSize). */\n showSummary?: boolean;\n /** Offer a page-size picker with these options. */\n pageSizeOptions?: number[];\n onPageSizeChange?: (size: number) => void;\n /** Show a \"Go to page\" box. */\n showJump?: boolean;\n size?: \"sm\" | \"md\";\n /** Words, for other languages. */\n labels?: Partial<{ previous: string; next: string; first: string; last: string; page: string; of: string; goTo: string; perPage: string; nav: string }>;\n}\n\nconst defaultLabels = {\n previous: \"Previous\",\n next: \"Next\",\n first: \"First page\",\n last: \"Last page\",\n page: \"Page\",\n of: \"of\",\n goTo: \"Go to page\",\n perPage: \"per page\",\n nav: \"Pagination\",\n};\n\nconst Arrow = ({ dir, double }: { dir: \"left\" | \"right\"; double?: boolean }) => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"rtl:-scale-x-100\">\n {dir === \"left\" ? <path d=\"M12 5l-5 5 5 5\" /> : <path d=\"M8 5l5 5-5 5\" />}\n {double && (dir === \"left\" ? <path d=\"M16 5l-5 5 5 5\" /> : <path d=\"M4 5l5 5-5 5\" />)}\n </svg>\n);\n\ntype ControlCtx = {\n getHref?: (page: number) => string;\n linkComponent: React.ElementType;\n onPageChange?: (page: number) => void;\n go: (page: number) => void;\n h: string;\n};\n\n/** A page control: a link when getHref is given, otherwise a button. (Outside Pagination so it keeps focus.) */\nfunction PageControl({\nctx,\n target,\n label,\n children,\n isCurrent,\n disabled,\n className: cls,\n title,\n}: {\n ctx: ControlCtx;\n target: number;\n label?: string;\n children: React.ReactNode;\n isCurrent?: boolean;\n disabled?: boolean;\n className?: string;\n title?: string;\n}) {\n const { getHref, linkComponent, onPageChange, go, h } = ctx;\n const common = cn(\n \"relative z-[1] inline-grid shrink-0 cursor-pointer select-none place-items-center rounded-control px-2 font-medium tabular-nums outline-none transition-colors duration-150\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n \"[&_svg]:size-4\",\n h,\n isCurrent ? \"text-primary-fg\" : \"text-fg hover:bg-secondary-hover\",\n disabled && \"pointer-events-none opacity-40\",\n cls\n );\n if (getHref && !disabled) {\n const LinkC = linkComponent;\n return (\n <LinkC\n href={getHref(target)}\n aria-label={label}\n aria-current={isCurrent ? \"page\" : undefined}\n title={title}\n className={common}\n onClick={(e: React.MouseEvent) => {\n if (onPageChange && !e.metaKey && !e.ctrlKey && !e.shiftKey && linkComponent === \"a\") {\n // Plain <a> with a handler: let the app handle navigation.\n e.preventDefault();\n go(target);\n } else onPageChange && go(target);\n }}\n >\n {children}\n </LinkC>\n );\n }\n return (\n <button\n type=\"button\"\n aria-label={label}\n aria-current={isCurrent ? \"page\" : undefined}\n aria-disabled={disabled || undefined}\n title={title}\n disabled={disabled}\n onClick={() => go(target)}\n className={common}\n >\n {children}\n </button>\n );\n}\n\nexport const Pagination = React.forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n page,\n pageCount: pageCountProp,\n total,\n pageSize = 10,\n onPageChange,\n getHref,\n linkComponent = \"a\",\n siblingCount = 1,\n boundaryCount = 1,\n showFirstLast = false,\n variant = \"numbers\",\n responsive = true,\n showSummary = false,\n pageSizeOptions,\n onPageSizeChange,\n showJump = false,\n size = \"md\",\n labels: labelsProp,\n className,\n ...props\n },\n ref\n) {\n const L = { ...defaultLabels, ...labelsProp };\n const pageCount = Math.max(1, pageCountProp ?? Math.ceil((total ?? 0) / pageSize));\n const current = Math.min(Math.max(1, page), pageCount);\n\n // Adapt to the available width.\n const navRef = React.useRef<HTMLElement | null>(null);\n const [width, setWidth] = React.useState(Infinity);\n React.useLayoutEffect(() => {\n if (!responsive || !navRef.current) return;\n const el = navRef.current;\n const measure = () => setWidth(el.getBoundingClientRect().width);\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n ro?.observe(el);\n return () => ro?.disconnect();\n }, [responsive]);\n // Shed in stages as the space runs out: first the Previous/Next words, then the number\n // neighbours, then First/Last, and finally the numbers themselves.\n const tiny = responsive && width < 300;\n const narrow = responsive && width < 560;\n const compact = responsive && width < 700;\n const roomForEnds = !responsive || width >= 480;\n const mode = variant === \"simple\" || tiny ? \"simple\" : \"numbers\";\n const siblings = narrow ? 0 : siblingCount;\n const items = getPageItems(current, pageCount, siblings, boundaryCount);\n\n const go = (p: number) => {\n const n = Math.min(Math.max(1, p), pageCount);\n if (n !== current) onPageChange?.(n);\n };\n\n // The sliding highlight behind the current page number.\n const listRef = React.useRef<HTMLOListElement>(null);\n const [pill, setPill] = React.useState<{ x: number; w: number } | null>(null);\n const seen = React.useRef(false);\n React.useLayoutEffect(() => {\n const el = listRef.current?.querySelector<HTMLElement>('[aria-current=\"page\"]');\n if (!el || !listRef.current) return setPill(null);\n setPill({ x: el.offsetLeft, w: el.offsetWidth });\n }, [current, items.join(\",\"), mode, width]);\n React.useEffect(() => {\n if (pill) seen.current = true;\n }, [pill]);\n\n const h = size === \"sm\" ? \"h-8 min-w-8 text-[0.8125rem]\" : \"h-9 min-w-9 text-sm\";\n const ctx: ControlCtx = { getHref, linkComponent, onPageChange, go, h };\n\n const from = total !== undefined ? Math.min(total, (current - 1) * pageSize + 1) : 0;\n const to = total !== undefined ? Math.min(total, current * pageSize) : 0;\n\n const [jump, setJump] = React.useState(\"\");\n\n return (\n <nav\n ref={(n) => {\n navRef.current = n;\n if (typeof ref === \"function\") ref(n);\n else if (ref) ref.current = n;\n }}\n aria-label={L.nav}\n // contain: inline-size — take the width from the container, not from the buttons, so the\n // measured width decides the layout (otherwise the wide layout props its container open).\n className={cn(\"flex w-full min-w-0 flex-wrap items-center gap-x-4 gap-y-3 [contain:inline-size]\", className)}\n {...props}\n >\n {showSummary && total !== undefined && (\n <p className=\"me-auto text-sm tabular-nums text-fg-muted\" aria-live=\"polite\">\n {total === 0 ? \"No results\" : `${from}–${to} ${L.of} ${total.toLocaleString()}`}\n </p>\n )}\n\n <div className={cn(\"flex min-w-0 items-center gap-1\", !showSummary && \"mx-auto\", showSummary && \"ms-auto\")}>\n {showFirstLast && roomForEnds && mode === \"numbers\" && (\n <PageControl ctx={ctx} target={1} label={L.first} title={L.first} disabled={current === 1}>\n <Arrow dir=\"left\" double />\n </PageControl>\n )}\n <PageControl ctx={ctx} target={current - 1} label={L.previous} title={L.previous} disabled={current === 1} className={cn(mode === \"numbers\" && !compact && \"gap-1 px-2.5\")}>\n <span className=\"inline-flex items-center gap-1\">\n <Arrow dir=\"left\" />\n {mode === \"numbers\" && !compact && <span className=\"pe-0.5\">{L.previous}</span>}\n </span>\n </PageControl>\n\n {mode === \"simple\" ? (\n <p className=\"px-2 text-sm tabular-nums text-fg\" aria-live=\"polite\">\n {L.page} <span className=\"font-semibold\">{current}</span> {L.of} {pageCount}\n </p>\n ) : (\n <ol ref={listRef} className=\"relative flex items-center gap-1\">\n {/* The highlight slides from page to page. */}\n {pill && (\n <li\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute top-0 rounded-control bg-primary shadow-[inset_0_-2px_0_var(--color-primary-edge)]\",\n seen.current && \"transition-[left,width] duration-250 ease-[cubic-bezier(0.3,1.2,0.5,1)] motion-reduce:transition-none\",\n size === \"sm\" ? \"h-8\" : \"h-9\"\n )}\n style={{ left: pill.x, width: pill.w }}\n />\n )}\n {items.map((it) =>\n typeof it === \"number\" ? (\n <li key={it}>\n <PageControl ctx={ctx} target={it} label={`${L.page} ${it}`} isCurrent={it === current}>\n {it}\n </PageControl>\n </li>\n ) : (\n <li key={it}>\n {/* A gap is a shortcut: it jumps five pages. */}\n <PageControl\n ctx={ctx}\n target={it === \"start-gap\" ? current - 5 : current + 5}\n label={it === \"start-gap\" ? \"Jump back 5 pages\" : \"Jump forward 5 pages\"}\n title={it === \"start-gap\" ? \"Back 5 pages\" : \"Forward 5 pages\"}\n className=\"group/gap text-fg-muted\"\n >\n <span className=\"group-hover/gap:hidden\" aria-hidden=\"true\">…</span>\n <span className=\"hidden group-hover/gap:inline\" aria-hidden=\"true\">\n <Arrow dir={it === \"start-gap\" ? \"left\" : \"right\"} double />\n </span>\n </PageControl>\n </li>\n )\n )}\n </ol>\n )}\n\n <PageControl ctx={ctx} target={current + 1} label={L.next} title={L.next} disabled={current === pageCount} className={cn(mode === \"numbers\" && !compact && \"px-2.5\")}>\n <span className=\"inline-flex items-center gap-1\">\n {mode === \"numbers\" && !compact && <span className=\"ps-0.5\">{L.next}</span>}\n <Arrow dir=\"right\" />\n </span>\n </PageControl>\n {showFirstLast && roomForEnds && mode === \"numbers\" && (\n <PageControl ctx={ctx} target={pageCount} label={L.last} title={L.last} disabled={current === pageCount}>\n <Arrow dir=\"right\" double />\n </PageControl>\n )}\n </div>\n\n {(pageSizeOptions || showJump) && (\n <div className=\"flex flex-wrap items-center gap-3 text-sm text-fg-muted\">\n {pageSizeOptions && (\n <label className=\"flex items-center gap-2\">\n <Select\n size=\"sm\"\n searchable={false}\n aria-label={`Items ${L.perPage}`}\n value={String(pageSize)}\n onChange={(v) => v && onPageSizeChange?.(Number(v))}\n options={pageSizeOptions.map((n) => ({ value: String(n), label: String(n) }))}\n className=\"w-20\"\n />\n <span>{L.perPage}</span>\n </label>\n )}\n {showJump && (\n <form\n className=\"flex items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n const n = parseInt(jump, 10);\n if (!Number.isNaN(n)) go(n);\n setJump(\"\");\n }}\n >\n <label htmlFor={`${L.goTo}-jump`}>{L.goTo}</label>\n <input\n id={`${L.goTo}-jump`}\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={jump}\n onChange={(e) => setJump(e.target.value.replace(/\\D/g, \"\"))}\n placeholder={String(current)}\n aria-describedby={undefined}\n className={cn(\n \"w-14 rounded-control border border-border-strong bg-surface px-2 text-center tabular-nums text-fg outline-none\",\n \"shadow-[inset_0_1px_2px_rgb(var(--ui-shadow-color)/0.07)] focus:border-ring focus:ring-3 focus:ring-ring/25\",\n size === \"sm\" ? \"h-8\" : \"h-9\"\n )}\n />\n </form>\n )}\n </div>\n )}\n </nav>\n );\n});\n\n/* ---------- LoadMore ---------- */\n\nexport interface LoadMoreProps {\n /** How many are showing now. */\n loaded: number;\n /** How many there are in total (if known). */\n total?: number;\n /** Load the next batch. Return a Promise and the button shows progress until it settles. */\n onLoadMore: () => unknown;\n /** Is there anything left? Default: loaded < total. */\n hasMore?: boolean;\n /** Load automatically when the button scrolls into view (infinite scroll). */\n auto?: boolean;\n /** Words. */\n label?: string;\n className?: string;\n}\n\n/** For feeds and lists: \"Showing 20 of 47\" with a Load more button — or automatic loading as you scroll. */\nexport function LoadMore({ loaded, total, onLoadMore, hasMore, auto = false, label = \"Load more\", className }: LoadMoreProps) {\n const more = hasMore ?? (total === undefined ? true : loaded < total);\n const [busy, setBusy] = React.useState(false);\n const ref = React.useRef<HTMLDivElement>(null);\n\n const run = React.useCallback(async () => {\n if (busy || !more) return;\n setBusy(true);\n try {\n await onLoadMore();\n } finally {\n setBusy(false);\n }\n }, [busy, more, onLoadMore]);\n\n React.useEffect(() => {\n if (!auto || !more || typeof IntersectionObserver === \"undefined\" || !ref.current) return;\n const io = new IntersectionObserver((entries) => entries.some((e) => e.isIntersecting) && void run(), { rootMargin: \"200px\" });\n io.observe(ref.current);\n return () => io.disconnect();\n }, [auto, more, run]);\n\n const pct = total ? Math.min(100, (loaded / total) * 100) : undefined;\n\n return (\n <div ref={ref} className={cn(\"grid justify-items-center gap-3 py-2\", className)}>\n {total !== undefined && (\n <div className=\"grid w-full max-w-56 gap-1.5 text-center\">\n <p className=\"text-sm tabular-nums text-fg-muted\" aria-live=\"polite\">\n {more ? `Showing ${loaded.toLocaleString()} of ${total.toLocaleString()}` : `All ${total.toLocaleString()} shown`}\n </p>\n <div aria-hidden=\"true\" className=\"h-1 overflow-hidden rounded-full bg-secondary-hover\">\n <div className=\"h-full rounded-full bg-primary transition-[width] duration-300 ease-out\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n )}\n {more &&\n (auto && busy ? (\n <ActivityIndicator variant=\"dots\" size=\"sm\" label=\"Loading more\" showLabel />\n ) : (\n <Button variant=\"secondary\" size=\"sm\" onClick={() => void run()} loading={busy} spinnerPlacement=\"start\" loadingLabel=\"Loading…\">\n {label}\n </Button>\n ))}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { DataTable, formatCompact, linearPath, monotonePath, niceTicks, seriesColor, useAnimate, useReducedMotion, useTweenedRows, useWidth } from \"./chart-utils\";\n\n/*\n * LineChart (and AreaChart) and BarChart — hand-built SVG, no chart library.\n * Crosshair tooltip on hover/touch, arrow keys to step through points, legend that toggles\n * series, optional target line, draw-in animation, and a hidden data table for screen readers.\n */\n\nexport type Datum = Record<string, string | number | null | undefined>;\n\nexport interface ChartSeries {\n /** Field in each data row. */\n key: string;\n label?: string;\n /** Any CSS color. Defaults to the chart palette (--ui-chart-1 … 6). */\n color?: string;\n}\n\nexport interface BaseChartProps {\n data: Datum[];\n /** The field used along the bottom, e.g. \"month\". */\n index: string;\n series: ChartSeries[];\n /** Height in px. Default 240. */\n height?: number;\n formatValue?: (value: number) => string;\n formatIndex?: (value: string | number) => string;\n /** Legend above the chart (click to show/hide a series). Default true for 2+ series. */\n showLegend?: boolean;\n showGrid?: boolean;\n /** A horizontal reference line, e.g. a target. */\n referenceLine?: { value: number; label?: string };\n /** Accessible summary, e.g. \"Revenue by month, January to December\". */\n \"aria-label\": string;\n /** Draw in on first load. Default true (inside a DashboardGrid, follows its animate setting). */\n animate?: boolean;\n /** Glide to new values when the data changes (live dashboards). Default true. */\n transition?: boolean;\n className?: string;\n}\n\ntype Hover = { i: number; x: number } | null;\n\nconst PAD = { top: 12, right: 12, bottom: 26, left: 44 };\n\nfunction useChartFrame(props: BaseChartProps, stackedMax?: (visible: ChartSeries[]) => number) {\n const { data, series, height = 240, referenceLine } = props;\n const [hidden, setHidden] = React.useState<string[]>([]);\n const visible = series.filter((s) => !hidden.includes(s.key));\n const values = data.flatMap((d) => visible.map((s) => Number(d[s.key] ?? 0)));\n let max = stackedMax ? stackedMax(visible) : Math.max(0, ...values);\n let min = Math.min(0, ...values);\n if (referenceLine) {\n max = Math.max(max, referenceLine.value);\n min = Math.min(min, referenceLine.value);\n }\n const ticks = niceTicks(min, max || 1, height < 180 ? 3 : 4);\n return { hidden, setHidden, visible, ticks, lo: ticks[0], hi: ticks[ticks.length - 1] };\n}\n\nfunction Legend({ series, hidden, onToggle }: { series: ChartSeries[]; hidden: string[]; onToggle: (k: string) => void }) {\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {series.map((s, i) => {\n const off = hidden.includes(s.key);\n return (\n <button\n key={s.key}\n type=\"button\"\n aria-pressed={!off}\n onClick={() => onToggle(s.key)}\n className={cn(\"inline-flex cursor-pointer items-center gap-1.5 rounded-control-sm text-xs text-fg-muted outline-none hover:text-fg focus-visible:outline-2 focus-visible:outline-ring\", off && \"opacity-45\")}\n >\n <span aria-hidden=\"true\" className=\"size-2.5 rounded-[3px]\" style={{ background: seriesColor(i, s.color) }} />\n {s.label ?? s.key}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction Tooltip({\n left,\n width,\n title,\n rows,\n}: {\n left: number;\n width: number;\n title: string;\n rows: Array<{ label: string; value: string; color: string }>;\n}) {\n // Keep the tooltip inside the chart: flip to the left side past the middle.\n const right = left > width / 2;\n return (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-1 z-10 min-w-32 rounded-control-lg border border-border bg-surface px-3 py-2 text-xs shadow-[var(--ui-shadow-lg)]\"\n style={right ? { right: width - left + 12 } : { left: left + 12 }}\n >\n <p className=\"mb-1 font-medium text-fg\">{title}</p>\n {rows.map((r) => (\n <p key={r.label} className=\"flex items-center gap-2 tabular-nums text-fg-muted\">\n <span className=\"size-2 rounded-full\" style={{ background: r.color }} />\n <span className=\"flex-1\">{r.label}</span>\n <span className=\"font-medium text-fg\">{r.value}</span>\n </p>\n ))}\n </div>\n );\n}\n\nfunction Axes({ w, h, ticks, y, labels, x, fmt, showGrid, referenceLine }: {\n w: number; h: number; ticks: number[]; y: (v: number) => number; labels: string[]; x: (i: number) => number; fmt: (v: number) => string; showGrid: boolean; referenceLine?: { value: number; label?: string };\n}) {\n // Thin out bottom labels so they never collide.\n const every = Math.max(1, Math.ceil(labels.length / Math.max(2, Math.floor((w - PAD.left - PAD.right) / 64))));\n return (\n <g aria-hidden=\"true\" className=\"text-[11px]\">\n {ticks.map((t) => (\n <g key={t}>\n {showGrid && <line x1={PAD.left} x2={w - PAD.right} y1={y(t)} y2={y(t)} stroke=\"var(--ui-chart-grid)\" strokeDasharray={t === 0 ? undefined : \"3 4\"} />}\n <text x={PAD.left - 8} y={y(t)} dy=\"0.32em\" textAnchor=\"end\" fill=\"var(--color-fg-muted)\" className=\"tabular-nums\">\n {fmt(t)}\n </text>\n </g>\n ))}\n {labels.map((l, i) =>\n i % every === 0 || i === labels.length - 1 ? (\n <text key={i} x={x(i)} y={h - 6} textAnchor={i === 0 ? \"start\" : i === labels.length - 1 ? \"end\" : \"middle\"} fill=\"var(--color-fg-muted)\">\n {i % every === 0 || labels.length - 1 - i >= every / 2 ? l : \"\"}\n </text>\n ) : null\n )}\n {referenceLine && (\n <g>\n <line x1={PAD.left} x2={w - PAD.right} y1={y(referenceLine.value)} y2={y(referenceLine.value)} stroke=\"var(--color-fg-muted)\" strokeDasharray=\"5 4\" strokeWidth={1.2} />\n {referenceLine.label && (\n <text x={w - PAD.right} y={y(referenceLine.value) - 5} textAnchor=\"end\" fill=\"var(--color-fg-muted)\" className=\"font-medium\">\n {referenceLine.label}\n </text>\n )}\n </g>\n )}\n </g>\n );\n}\n\n/* ---------- LineChart / AreaChart ---------- */\n\nexport interface LineChartProps extends BaseChartProps {\n /** Fill under the lines. */\n area?: boolean;\n /** \"smooth\" (default) or \"linear\". */\n curve?: \"smooth\" | \"linear\";\n /** Show a dot on every point. Default: only when there are few points. */\n dots?: boolean;\n}\n\nexport function LineChart(props: LineChartProps) {\n const { data, index, series, height = 240, formatValue = formatCompact, formatIndex = String, area = false, curve = \"smooth\", dots, showGrid = true, referenceLine, className } = props;\n const [ref, w] = useWidth<HTMLDivElement>();\n const wantsAnimation = useAnimate(props.animate);\n const prefersReduced = useReducedMotion();\n const reduced = !wantsAnimation || prefersReduced;\n // Geometry uses smoothly-moving values; tooltips and the data table use the real ones.\n const shown = useTweenedRows(data, series.map((s) => s.key), { enabled: props.transition ?? true });\n const { hidden, setHidden, visible, ticks, lo, hi } = useChartFrame({ ...props, data: shown });\n const [hover, setHover] = React.useState<Hover>(null);\n const gid = React.useId().replace(/:/g, \"\");\n const n = data.length;\n const x = (i: number) => PAD.left + (n <= 1 ? 0 : (i / (n - 1)) * (w - PAD.left - PAD.right));\n const y = (v: number) => PAD.top + (1 - (v - lo) / (hi - lo || 1)) * (height - PAD.top - PAD.bottom);\n const path = curve === \"smooth\" ? monotonePath : linearPath;\n const labels = data.map((d) => formatIndex(d[index] as string));\n const showDots = dots ?? n <= 14;\n\n const pick = (clientX: number) => {\n const r = ref.current!.getBoundingClientRect();\n const i = Math.round(((clientX - r.left - PAD.left) / (w - PAD.left - PAD.right)) * (n - 1));\n const c = Math.min(n - 1, Math.max(0, i));\n setHover({ i: c, x: x(c) });\n };\n\n return (\n <div className={cn(\"grid gap-3\", className)}>\n {(props.showLegend ?? series.length > 1) && <Legend series={series} hidden={hidden} onToggle={(k) => setHidden((h) => (h.includes(k) ? h.filter((x) => x !== k) : [...h, k]))} />}\n <div\n ref={ref}\n className=\"relative touch-pan-y outline-none focus-visible:rounded-control focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n style={{ height }}\n tabIndex={0}\n role=\"group\"\n aria-label={`${props[\"aria-label\"]}. Use the arrow keys to read values.`}\n onPointerMove={(e) => pick(e.clientX)}\n onPointerDown={(e) => pick(e.clientX)}\n onPointerLeave={() => setHover(null)}\n onBlur={() => setHover(null)}\n onKeyDown={(e) => {\n if (e.key !== \"ArrowRight\" && e.key !== \"ArrowLeft\" && e.key !== \"Home\" && e.key !== \"End\") return;\n e.preventDefault();\n const cur = hover?.i ?? -1;\n const next = e.key === \"Home\" ? 0 : e.key === \"End\" ? n - 1 : Math.min(n - 1, Math.max(0, cur + (e.key === \"ArrowRight\" ? 1 : -1)));\n setHover({ i: next, x: x(next) });\n }}\n >\n {w > 0 && (\n <svg width={w} height={height} className=\"block overflow-visible\">\n <defs>\n {visible.map((s) => {\n const i = series.indexOf(s);\n return (\n <linearGradient key={s.key} id={`${gid}-${i}`} x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={seriesColor(i, s.color)} stopOpacity={0.28} />\n <stop offset=\"100%\" stopColor={seriesColor(i, s.color)} stopOpacity={0} />\n </linearGradient>\n );\n })}\n </defs>\n <Axes w={w} h={height} ticks={ticks} y={y} labels={labels} x={x} fmt={formatValue} showGrid={showGrid} referenceLine={referenceLine} />\n {visible.map((s) => {\n const i = series.indexOf(s);\n const pts = shown.map((d, j) => [x(j), y(Number(d[s.key] ?? 0))] as [number, number]);\n const line = path(pts);\n const color = seriesColor(i, s.color);\n return (\n <g key={s.key}>\n {area && (\n <path\n d={`${line}L${x(n - 1)},${y(Math.max(lo, 0))}L${x(0)},${y(Math.max(lo, 0))}Z`}\n fill={`url(#${gid}-${i})`}\n style={reduced ? undefined : { animation: \"ui-chart-fade 700ms ease-out both\" }}\n />\n )}\n <path\n d={line}\n fill=\"none\"\n stroke={color}\n strokeWidth={2.25}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n pathLength={1}\n strokeDasharray={reduced ? undefined : \"1\"}\n style={reduced ? undefined : { animation: \"ui-chart-draw 900ms cubic-bezier(0.4,0,0.2,1) both\" }}\n />\n {showDots &&\n pts.map(([px, py], j) => (\n <circle key={j} cx={px} cy={py} r={3} fill=\"var(--color-surface)\" stroke={color} strokeWidth={2} style={reduced ? undefined : { animation: `ui-chart-fade 300ms ${600 + j * 20}ms both` }} />\n ))}\n </g>\n );\n })}\n {hover && (\n <g aria-hidden=\"true\">\n <line x1={hover.x} x2={hover.x} y1={PAD.top} y2={height - PAD.bottom} stroke=\"var(--color-fg-muted)\" strokeOpacity={0.35} />\n {visible.map((s) => {\n const i = series.indexOf(s);\n return <circle key={s.key} cx={hover.x} cy={y(Number(shown[hover.i]?.[s.key] ?? 0))} r={5} fill={seriesColor(i, s.color)} stroke=\"var(--color-surface)\" strokeWidth={2} />;\n })}\n </g>\n )}\n </svg>\n )}\n {hover && (\n <Tooltip\n left={hover.x}\n width={w}\n title={labels[hover.i]}\n rows={visible.map((s) => ({ label: s.label ?? s.key, value: formatValue(Number(data[hover.i][s.key] ?? 0)), color: seriesColor(series.indexOf(s), s.color) }))}\n />\n )}\n <span className=\"sr-only\" aria-live=\"polite\">\n {hover ? `${labels[hover.i]}: ${visible.map((s) => `${s.label ?? s.key} ${formatValue(Number(data[hover.i][s.key] ?? 0))}`).join(\", \")}` : \"\"}\n </span>\n </div>\n <DataTable caption={props[\"aria-label\"]} columns={[index, ...series.map((s) => s.label ?? s.key)]} rows={data.map((d, j) => [labels[j], ...series.map((s) => formatValue(Number(d[s.key] ?? 0)))])} />\n </div>\n );\n}\n\n/** A LineChart with the area filled. */\nexport const AreaChart = (props: Omit<LineChartProps, \"area\">) => <LineChart {...props} area />;\n\n/* ---------- BarChart ---------- */\n\nexport interface BarChartProps extends BaseChartProps {\n /** Stack series on top of each other instead of side by side. */\n stacked?: boolean;\n}\n\nexport function BarChart(props: BarChartProps) {\n const { data, index, series, height = 240, formatValue = formatCompact, formatIndex = String, stacked = false, showGrid = true, referenceLine, className } = props;\n const [ref, w] = useWidth<HTMLDivElement>();\n const wantsAnimation = useAnimate(props.animate);\n const prefersReduced = useReducedMotion();\n const reduced = !wantsAnimation || prefersReduced;\n const shown = useTweenedRows(data, series.map((s) => s.key), { enabled: props.transition ?? true });\n const { hidden, setHidden, visible, ticks, lo, hi } = useChartFrame({ ...props, data: shown }, stacked ? (vis) => Math.max(0, ...shown.map((d) => vis.reduce((s, x) => s + Number(d[x.key] ?? 0), 0))) : undefined);\n const [hover, setHover] = React.useState<Hover>(null);\n const n = data.length;\n const inner = w - PAD.left - PAD.right;\n const band = inner / Math.max(1, n);\n const x = (i: number) => PAD.left + band * i + band / 2;\n const y = (v: number) => PAD.top + (1 - (v - lo) / (hi - lo || 1)) * (height - PAD.top - PAD.bottom);\n const groupW = Math.min(band * 0.72, stacked ? 36 : 18 * visible.length + 4 * (visible.length - 1));\n const barW = stacked ? groupW : (groupW - 4 * (visible.length - 1)) / Math.max(1, visible.length);\n const labels = data.map((d) => formatIndex(d[index] as string));\n const base = y(Math.max(lo, 0));\n\n const pick = (clientX: number) => {\n const r = ref.current!.getBoundingClientRect();\n const i = Math.min(n - 1, Math.max(0, Math.floor((clientX - r.left - PAD.left) / band)));\n setHover({ i, x: x(i) });\n };\n\n return (\n <div className={cn(\"grid gap-3\", className)}>\n {(props.showLegend ?? series.length > 1) && <Legend series={series} hidden={hidden} onToggle={(k) => setHidden((h) => (h.includes(k) ? h.filter((x) => x !== k) : [...h, k]))} />}\n <div\n ref={ref}\n className=\"relative touch-pan-y outline-none focus-visible:rounded-control focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n style={{ height }}\n tabIndex={0}\n role=\"group\"\n aria-label={`${props[\"aria-label\"]}. Use the arrow keys to read values.`}\n onPointerMove={(e) => pick(e.clientX)}\n onPointerDown={(e) => pick(e.clientX)}\n onPointerLeave={() => setHover(null)}\n onBlur={() => setHover(null)}\n onKeyDown={(e) => {\n if (e.key !== \"ArrowRight\" && e.key !== \"ArrowLeft\" && e.key !== \"Home\" && e.key !== \"End\") return;\n e.preventDefault();\n const cur = hover?.i ?? -1;\n const next = e.key === \"Home\" ? 0 : e.key === \"End\" ? n - 1 : Math.min(n - 1, Math.max(0, cur + (e.key === \"ArrowRight\" ? 1 : -1)));\n setHover({ i: next, x: x(next) });\n }}\n >\n {w > 0 && (\n <svg width={w} height={height} className=\"block overflow-visible\">\n {hover && <rect x={x(hover.i) - band / 2 + 2} y={PAD.top} width={band - 4} height={height - PAD.top - PAD.bottom} rx={6} fill=\"var(--color-fg)\" fillOpacity={0.05} />}\n <Axes w={w} h={height} ticks={ticks} y={y} labels={labels} x={x} fmt={formatValue} showGrid={showGrid} referenceLine={undefined} />\n {shown.map((d, j) => {\n let acc = 0;\n return (\n <g key={j} style={reduced ? undefined : { transformOrigin: `0 ${base}px`, animation: `ui-chart-grow 600ms ${j * 30}ms cubic-bezier(0.3,1.1,0.5,1) both` }}>\n {visible.map((s, k) => {\n const i = series.indexOf(s);\n const v = Number(d[s.key] ?? 0);\n const x0 = stacked ? x(j) - barW / 2 : x(j) - groupW / 2 + k * (barW + 4);\n const top = stacked ? y(acc + v) : y(Math.max(v, 0));\n const bottom = stacked ? y(acc) : y(Math.min(v, 0));\n acc += v;\n const isTop = !stacked || k === visible.length - 1;\n const r = Math.min(4, barW / 2);\n const hgt = Math.max(0, bottom - top);\n // Round only the top corners of the topmost bar.\n const dPath = isTop && hgt > r\n ? `M${x0},${bottom}V${top + r}Q${x0},${top} ${x0 + r},${top}H${x0 + barW - r}Q${x0 + barW},${top} ${x0 + barW},${top + r}V${bottom}Z`\n : `M${x0},${bottom}V${top}H${x0 + barW}V${bottom}Z`;\n return <path key={s.key} d={dPath} fill={seriesColor(i, s.color)} fillOpacity={hover && hover.i !== j ? 0.55 : 1} className=\"transition-[fill-opacity] duration-150\" />;\n })}\n </g>\n );\n })}\n {referenceLine && <Axes w={w} h={height} ticks={[]} y={y} labels={[]} x={x} fmt={formatValue} showGrid={false} referenceLine={referenceLine} />}\n </svg>\n )}\n {hover && (\n <Tooltip\n left={hover.x}\n width={w}\n title={labels[hover.i]}\n rows={[\n ...visible.map((s) => ({ label: s.label ?? s.key, value: formatValue(Number(data[hover.i][s.key] ?? 0)), color: seriesColor(series.indexOf(s), s.color) })),\n ...(stacked && visible.length > 1\n ? [{ label: \"Total\", value: formatValue(visible.reduce((t, s) => t + Number(data[hover.i][s.key] ?? 0), 0)), color: \"transparent\" }]\n : []),\n ]}\n />\n )}\n <span className=\"sr-only\" aria-live=\"polite\">\n {hover ? `${labels[hover.i]}: ${visible.map((s) => `${s.label ?? s.key} ${formatValue(Number(data[hover.i][s.key] ?? 0))}`).join(\", \")}` : \"\"}\n </span>\n </div>\n <DataTable caption={props[\"aria-label\"]} columns={[index, ...series.map((s) => s.label ?? s.key)]} rows={data.map((d, j) => [labels[j], ...series.map((s) => formatValue(Number(d[s.key] ?? 0)))])} />\n </div>\n );\n}\n","import * as React from \"react\";\n\n/* Shared helpers for the dashboard widgets: sizing, scales, ticks, curves, formatting. */\n\nexport const seriesColor = (i: number, color?: string) => color ?? `var(--ui-chart-${(i % 6) + 1})`;\n\n/** Width of an element, kept up to date. */\nexport function useWidth<T extends HTMLElement>(): [React.RefObject<T | null>, number] {\n const ref = React.useRef<T | null>(null);\n const [w, setW] = React.useState(0);\n React.useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n const measure = () => setW(Math.floor(el.getBoundingClientRect().width));\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n ro?.observe(el);\n return () => ro?.disconnect();\n }, []);\n return [ref, w];\n}\n\n/** \"Nice\" round axis ticks covering [min, max]. */\nexport function niceTicks(min: number, max: number, count = 4): number[] {\n if (min === max) {\n max = min === 0 ? 1 : min * 1.2;\n if (min > 0) min = 0;\n }\n const span = max - min;\n const raw = span / count;\n const mag = 10 ** Math.floor(Math.log10(raw));\n const step = [1, 2, 2.5, 5, 10].map((m) => m * mag).find((s) => span / s <= count) ?? 10 * mag;\n const start = Math.floor(min / step) * step;\n const end = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n for (let v = start; v <= end + step / 2; v += step) ticks.push(+v.toFixed(10));\n return ticks;\n}\n\n/** 1200 → 1.2K, 3400000 → 3.4M. */\nexport function formatCompact(n: number) {\n return new Intl.NumberFormat(undefined, { notation: \"compact\", maximumFractionDigits: 1 }).format(n);\n}\n\n/** Smooth line through points without overshooting (monotone cubic). */\nexport function monotonePath(pts: Array<[number, number]>) {\n const n = pts.length;\n if (n === 0) return \"\";\n if (n === 1) return `M${pts[0][0]},${pts[0][1]}`;\n const dx: number[] = [];\n const m: number[] = [];\n for (let i = 0; i < n - 1; i++) {\n dx[i] = pts[i + 1][0] - pts[i][0];\n m[i] = (pts[i + 1][1] - pts[i][1]) / (dx[i] || 1);\n }\n const t: number[] = [m[0]];\n for (let i = 1; i < n - 1; i++) t[i] = m[i - 1] * m[i] <= 0 ? 0 : (3 * (dx[i - 1] + dx[i])) / ((2 * dx[i] + dx[i - 1]) / m[i - 1] + (dx[i] + 2 * dx[i - 1]) / m[i]);\n t[n - 1] = m[n - 2];\n let d = `M${pts[0][0]},${pts[0][1]}`;\n for (let i = 0; i < n - 1; i++) {\n const h = dx[i] / 3;\n d += `C${pts[i][0] + h},${pts[i][1] + t[i] * h} ${pts[i + 1][0] - h},${pts[i + 1][1] - t[i + 1] * h} ${pts[i + 1][0]},${pts[i + 1][1]}`;\n }\n return d;\n}\n\nexport const linearPath = (pts: Array<[number, number]>) => pts.map((p, i) => `${i ? \"L\" : \"M\"}${p[0]},${p[1]}`).join(\"\");\n\nexport function useReducedMotion() {\n const [r, setR] = React.useState(false);\n React.useEffect(() => {\n const q = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\");\n if (!q) return;\n setR(q.matches);\n const on = () => setR(q.matches);\n q.addEventListener?.(\"change\", on);\n return () => q.removeEventListener?.(\"change\", on);\n }, []);\n return r;\n}\n\n/** A hidden table of the chart's numbers, for screen readers. */\nexport function DataTable({ caption, columns, rows }: { caption: string; columns: string[]; rows: Array<Array<string | number>> }) {\n // Tables ignore the 1px width of \"sr-only\", so hide a wrapper instead (otherwise the page widens).\n return (\n <div className=\"sr-only\">\n <table>\n <caption>{caption}</caption>\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c} scope=\"col\">{c}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((r, i) => (\n <tr key={i}>\n {r.map((c, j) => (j === 0 ? <th key={j} scope=\"row\">{c}</th> : <td key={j}>{c}</td>))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n/* ---------- animation settings shared by a dashboard ---------- */\n\n/** Set by DashboardGrid: whether widgets should animate on first load. */\nexport const DashboardAnimationContext = React.createContext<boolean | undefined>(undefined);\n\n/** A widget's own `animate` prop wins; then the surrounding DashboardGrid; then the default. */\nexport function useAnimate(own: boolean | undefined, fallback = true) {\n const ctx = React.useContext(DashboardAnimationContext);\n return own ?? ctx ?? fallback;\n}\n\nconst easeOut = (t: number) => 1 - (1 - t) ** 3;\n\n/**\n * Smoothly move a list of numbers to new targets (for live updates). New entries start from the\n * previous last value (so an appended point grows out of the line), or from `from` on first mount.\n */\nexport function useTweenedNumbers(target: number[], { duration = 600, enabled = true, from }: { duration?: number; enabled?: boolean; from?: number } = {}) {\n const reduced = useReducedMotion();\n const [shown, setShown] = React.useState<number[]>(() => (enabled && from !== undefined ? target.map(() => from) : target));\n const shownRef = React.useRef(shown);\n shownRef.current = shown;\n const key = target.join(\",\");\n React.useEffect(() => {\n if (!enabled || reduced) {\n setShown(target);\n return;\n }\n const start = shownRef.current;\n const lastKnown = start.length ? start[start.length - 1] : (from ?? 0);\n const begin = target.map((_, i) => (i < start.length ? start[i] : lastKnown));\n if (begin.length === target.length && begin.every((v, i) => v === target[i])) return;\n let raf = 0;\n const t0 = performance.now();\n const step = (now: number) => {\n const t = Math.min(1, (now - t0) / duration);\n const e = easeOut(t);\n setShown(target.map((v, i) => begin[i] + (v - begin[i]) * e));\n if (t < 1) raf = requestAnimationFrame(step);\n };\n raf = requestAnimationFrame(step);\n return () => cancelAnimationFrame(raf);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, enabled, reduced, duration]);\n return shown;\n}\n\n/** Tween the chosen numeric fields of chart rows. */\nexport function useTweenedRows<T extends Record<string, unknown>>(rows: T[], keys: string[], opts: { enabled?: boolean; from?: number } = {}) {\n const flat = rows.flatMap((r) => keys.map((k) => Number(r[k] ?? 0)));\n const tw = useTweenedNumbers(flat, opts);\n return rows.map((r, i) => {\n const out: Record<string, unknown> = { ...r };\n keys.forEach((k, j) => (out[k] = tw[i * keys.length + j] ?? Number(r[k] ?? 0)));\n return out as T;\n });\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\nimport { DataTable, formatCompact, linearPath, monotonePath, seriesColor, useAnimate, useReducedMotion, useTweenedNumbers, useWidth } from \"./chart-utils\";\n\n/* DonutChart, Gauge, BarList, CalendarHeatmap and Sparkline. */\n\n/* ---------- DonutChart ---------- */\n\nexport interface DonutSlice {\n label: string;\n value: number;\n color?: string;\n}\n\nexport interface DonutChartProps {\n data: DonutSlice[];\n /** Diameter in px. Default 180. */\n size?: number;\n /** Ring thickness in px. Default 22. */\n thickness?: number;\n formatValue?: (value: number) => string;\n /** Text under the number in the middle. Default \"Total\". */\n centerLabel?: string;\n /** Legend beside (\"side\", default when there's room), \"bottom\", or none. */\n legend?: \"side\" | \"bottom\" | false;\n /** Sweep in on first load. Default true (inside a DashboardGrid, follows its animate setting). */\n animate?: boolean;\n \"aria-label\": string;\n className?: string;\n}\n\nexport function DonutChart({ data, size = 180, thickness = 22, formatValue = formatCompact, centerLabel = \"Total\", legend = \"side\", animate, className, ...rest }: DonutChartProps) {\n const anim = useAnimate(animate);\n const [active, setActive] = React.useState<number | null>(null);\n // Slices sweep in from nothing on first load and glide when values change.\n const tw = useTweenedNumbers(data.map((d) => Math.max(0, d.value)), { from: anim ? 0 : undefined, duration: 800 });\n const realTotal = data.reduce((s, d) => s + Math.max(0, d.value), 0);\n const total = Math.max(realTotal, tw.reduce((a, b) => a + b, 0));\n const r = (size - thickness) / 2;\n const c = 2 * Math.PI * r;\n const gap = data.length > 1 ? Math.min(4, c * 0.01) : 0; // small gaps between slices\n let offset = 0;\n const shown = active !== null ? data[active] : null;\n\n return (\n <div className={cn(\"flex flex-wrap items-center justify-center gap-x-8 gap-y-4\", legend === \"bottom\" && \"flex-col\", className)}>\n <div className=\"relative shrink-0\" style={{ width: size, height: size }}>\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} role=\"img\" aria-label={rest[\"aria-label\"]} className=\"-rotate-90\">\n <circle cx={size / 2} cy={size / 2} r={r} fill=\"none\" stroke=\"var(--color-secondary-hover)\" strokeWidth={thickness} />\n {data.map((d, i) => {\n const len = total ? ((tw[i] ?? 0) / total) * c : 0;\n const seg = (\n <circle\n key={d.label}\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke={seriesColor(i, d.color)}\n strokeWidth={active === i ? thickness + 6 : thickness}\n strokeDasharray={`${Math.max(0, len - gap)} ${c}`}\n strokeDashoffset={-offset}\n opacity={active !== null && active !== i ? 0.4 : 1}\n onPointerEnter={() => setActive(i)}\n onPointerLeave={() => setActive(null)}\n className=\"cursor-pointer transition-[stroke-width,opacity] duration-200\"\n />\n );\n offset += len;\n return seg;\n })}\n </svg>\n <div className=\"pointer-events-none absolute inset-0 grid place-content-center text-center\" aria-hidden=\"true\">\n {/* Sized to fit the hole, so smaller donuts still leave space around the number. */}\n <span className=\"font-semibold leading-tight tabular-nums tracking-[-0.02em] text-fg\" style={{ fontSize: Math.max(14, Math.min(24, (size - thickness * 2) * 0.17)) }}>\n {formatValue(shown ? shown.value : Math.round(tw.reduce((a, b) => a + b, 0)))}\n </span>\n <span className=\"text-xs text-fg-muted\">{shown ? `${shown.label} · ${realTotal ? Math.round((shown.value / realTotal) * 100) : 0}%` : centerLabel}</span>\n </div>\n </div>\n {legend && (\n <ul className={cn(\"grid min-w-40 gap-2 text-sm\", legend === \"bottom\" && \"w-full\")}>\n {data.map((d, i) => (\n <li\n key={d.label}\n tabIndex={0}\n onFocus={() => setActive(i)}\n onBlur={() => setActive(null)}\n onPointerEnter={() => setActive(i)}\n onPointerLeave={() => setActive(null)}\n className={cn(\"flex items-center gap-2.5 rounded-control-sm outline-none focus-visible:outline-2 focus-visible:outline-ring\", active !== null && active !== i && \"opacity-50\")}\n >\n <span aria-hidden=\"true\" className=\"size-2.5 shrink-0 rounded-[3px]\" style={{ background: seriesColor(i, d.color) }} />\n <span className=\"min-w-0 flex-1 truncate text-fg-muted\">{d.label}</span>\n <span className=\"tabular-nums font-medium text-fg\">{formatValue(d.value)}</span>\n <span className=\"w-10 text-end tabular-nums text-xs text-fg-muted\">{realTotal ? Math.round((d.value / realTotal) * 100) : 0}%</span>\n </li>\n ))}\n </ul>\n )}\n <DataTable caption={rest[\"aria-label\"]} columns={[\"Part\", \"Value\", \"Share\"]} rows={data.map((d) => [d.label, formatValue(d.value), `${realTotal ? Math.round((d.value / realTotal) * 100) : 0}%`])} />\n </div>\n );\n}\n\n/* ---------- Gauge ---------- */\n\nexport interface GaugeProps {\n value: number;\n max: number;\n min?: number;\n /** A marker on the arc, e.g. the target. */\n target?: number;\n label?: string;\n formatValue?: (value: number) => string;\n /** Color bands by how far along it is: e.g. [{ upTo: 0.5, color: \"var(--color-danger)\" }, …]. Default: primary. */\n bands?: Array<{ upTo: number; color: string }>;\n /** Width in px. Default 220. */\n size?: number;\n /** Sweep up from zero on first load. Default true (inside a DashboardGrid, follows its animate setting). */\n animate?: boolean;\n \"aria-label\"?: string;\n className?: string;\n}\n\n/** A half-circle meter for attainment against a goal. */\nexport function Gauge({ value, max, min = 0, target, label, formatValue = formatCompact, bands, size = 220, animate, className, ...rest }: GaugeProps) {\n const anim = useAnimate(animate);\n // Sweeps up on first load and glides when the value changes.\n const [tv] = useTweenedNumbers([value], { from: anim ? min : undefined, duration: 900 });\n const t = Math.min(1, Math.max(0, (tv - min) / (max - min || 1)));\n const stroke = Math.round(size * 0.1);\n const r = size / 2 - stroke / 2 - 2;\n const cx = size / 2;\n const cy = size / 2;\n const arc = (from: number, to: number) => {\n const a0 = Math.PI * (1 - from);\n const a1 = Math.PI * (1 - to);\n const p = (a: number) => [cx + r * Math.cos(a), cy - r * Math.sin(a)];\n const [x0, y0] = p(a0);\n const [x1, y1] = p(a1);\n // A half-circle never needs the \"large arc\" flag; setting it past 50% sent the arc the long way round.\n return `M${x0},${y0} A${r},${r} 0 0 1 ${x1},${y1}`;\n };\n const color = bands?.find((b) => t <= b.upTo)?.color ?? bands?.[bands.length - 1]?.color ?? \"var(--color-primary)\";\n const tt = target !== undefined ? Math.min(1, Math.max(0, (target - min) / (max - min || 1))) : null;\n const pct = Math.round(Math.min(1, Math.max(0, (value - min) / (max - min || 1))) * 100);\n\n return (\n <div className={cn(\"grid justify-items-center gap-1\", className)}>\n <div className=\"relative\">\n <svg\n width={size}\n height={size / 2 + stroke / 2 + 4}\n viewBox={`0 0 ${size} ${size / 2 + stroke / 2 + 4}`}\n role=\"meter\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-valuetext={`${formatValue(value)} of ${formatValue(max)} (${pct}%)`}\n aria-label={rest[\"aria-label\"] ?? label}\n >\n <path d={arc(0, 1)} fill=\"none\" stroke=\"var(--color-secondary-hover)\" strokeWidth={stroke} strokeLinecap=\"round\" />\n <path\n d={arc(0, Math.max(0.001, t))}\n fill=\"none\"\n stroke={color}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n />\n {tt !== null && (() => {\n const a = Math.PI * (1 - tt);\n const inner = r - stroke / 2 - 3;\n const outer = r + stroke / 2 + 3;\n return <line x1={cx + inner * Math.cos(a)} y1={cy - inner * Math.sin(a)} x2={cx + outer * Math.cos(a)} y2={cy - outer * Math.sin(a)} stroke=\"var(--color-fg)\" strokeWidth={2.5} strokeLinecap=\"round\" />;\n })()}\n </svg>\n {/* The number sits inside the arc; the caption goes underneath so it never touches the ends. */}\n <span className=\"absolute inset-x-0 bottom-1 text-center text-2xl font-semibold tabular-nums tracking-[-0.02em] text-fg\" aria-hidden=\"true\">\n {formatValue(Math.round(tv))}\n </span>\n </div>\n <div className=\"grid justify-items-center text-center\" aria-hidden=\"true\">\n <span className=\"text-xs text-fg-muted\">\n {label ? `${label} · ` : \"\"}\n {pct}% of {formatValue(max)}\n {target !== undefined && ` · target ${formatValue(target)}`}\n </span>\n </div>\n </div>\n );\n}\n\n/* ---------- BarList ---------- */\n\nexport interface BarListItem {\n label: string;\n value: number;\n icon?: IconInput;\n href?: string;\n /** Secondary text on the right, e.g. \"12 invoices\". */\n meta?: React.ReactNode;\n}\n\nexport interface BarListProps {\n items: BarListItem[];\n formatValue?: (value: number) => string;\n /** Sort from highest. Default true. */\n sort?: boolean;\n /** Show at most this many (a \"Show all\" button reveals the rest). */\n limit?: number;\n color?: string;\n /** Grow the bars in on first load. Default true (inside a DashboardGrid, follows its animate setting). */\n animate?: boolean;\n \"aria-label\"?: string;\n className?: string;\n}\n\n/** A ranked list with bars behind the labels — top clients, pages, products. Rows slide when the order changes. */\nexport function BarList({ items, formatValue = formatCompact, sort = true, limit, color = \"var(--ui-chart-1)\", animate, className, ...rest }: BarListProps) {\n const anim = useAnimate(animate);\n const prefersReduced = useReducedMotion();\n const [all, setAll] = React.useState(false);\n const [grown, setGrown] = React.useState(!anim);\n React.useEffect(() => {\n if (grown) return;\n const r = requestAnimationFrame(() => setGrown(true));\n return () => cancelAnimationFrame(r);\n }, [grown]);\n\n // FLIP: remember where each row was, and slide it from there to its new place.\n const listRef = React.useRef<HTMLOListElement>(null);\n const tops = React.useRef(new Map<string, number>());\n React.useLayoutEffect(() => {\n const list = listRef.current;\n if (!list) return;\n // Positions relative to the list (not the screen), so scrolling the page isn't mistaken for movement.\n const origin = list.getBoundingClientRect().top;\n const rows = [...list.querySelectorAll<HTMLElement>(\"[data-row]\")];\n rows.forEach((el) => {\n const key = el.dataset.row!;\n const now = el.getBoundingClientRect().top - origin;\n const before = tops.current.get(key);\n if (before !== undefined && before !== now && !prefersReduced) {\n el.animate([{ transform: `translateY(${before - now}px)` }, { transform: \"translateY(0)\" }], { duration: 450, easing: \"cubic-bezier(0.2,0.9,0.3,1)\" });\n }\n tops.current.set(key, now);\n });\n });\n const list = sort ? [...items].sort((a, b) => b.value - a.value) : items;\n const shown = limit && !all ? list.slice(0, limit) : list;\n const max = Math.max(1, ...list.map((i) => i.value));\n return (\n <div className={cn(\"grid gap-2\", className)}>\n <ol ref={listRef} className=\"grid gap-1.5\" aria-label={rest[\"aria-label\"]}>\n {shown.map((it) => {\n const Row = it.href ? \"a\" : \"div\";\n return (\n <li key={it.label} data-row={it.label}>\n <Row\n {...(it.href ? { href: it.href } : {})}\n className={cn(\"relative flex h-8 items-center gap-2 overflow-hidden rounded-control-sm px-2.5 text-sm\", it.href && \"outline-none hover:bg-secondary-hover focus-visible:outline-2 focus-visible:outline-ring\")}\n >\n <span\n aria-hidden=\"true\"\n className=\"absolute inset-y-0 start-0 rounded-control-sm transition-[width] duration-500 ease-out\"\n style={{ width: grown ? `${(it.value / max) * 100}%` : \"0%\", background: `color-mix(in srgb, ${color} 16%, transparent)` }}\n />\n {it.icon && <span className=\"relative text-fg-muted [&_svg]:size-4\">{renderIcon(it.icon)}</span>}\n <span className=\"relative min-w-0 flex-1 truncate text-fg\">{it.label}</span>\n {it.meta && <span className=\"relative shrink-0 text-xs text-fg-muted\">{it.meta}</span>}\n <span className=\"relative shrink-0 font-medium tabular-nums text-fg\">{formatValue(it.value)}</span>\n </Row>\n </li>\n );\n })}\n </ol>\n {limit && list.length > limit && (\n <button type=\"button\" onClick={() => setAll((a) => !a)} className=\"justify-self-start cursor-pointer rounded-control-sm px-2.5 py-1 text-xs font-medium text-primary hover:bg-secondary-hover\">\n {all ? \"Show fewer\" : `Show all ${list.length}`}\n </button>\n )}\n </div>\n );\n}\n\n/* ---------- CalendarHeatmap ---------- */\n\nexport interface CalendarHeatmapProps {\n /** One entry per day with activity: { date: \"2026-09-21\", value: 4 }. */\n data: Array<{ date: string; value: number }>;\n /** Last day shown. Default today. */\n end?: Date;\n /** How many weeks back. Default 26. */\n weeks?: number;\n color?: string;\n formatValue?: (value: number) => string;\n \"aria-label\": string;\n className?: string;\n}\n\nconst iso = (d: Date) => `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n\n/** Daily activity as a grid of squares — darker means more. */\nexport function CalendarHeatmap({ data, end = new Date(), weeks = 26, color = \"var(--ui-chart-1)\", formatValue = String, className, ...rest }: CalendarHeatmapProps) {\n const map = new Map(data.map((d) => [d.date, d.value]));\n const max = Math.max(1, ...data.map((d) => d.value));\n const last = new Date(end.getFullYear(), end.getMonth(), end.getDate());\n const start = new Date(last);\n start.setDate(last.getDate() - last.getDay() - (weeks - 1) * 7); // a Sunday\n const [hover, setHover] = React.useState<{ date: Date; value: number } | null>(null);\n const cols: Date[][] = [];\n for (let w = 0; w < weeks; w++) {\n const col: Date[] = [];\n for (let d = 0; d < 7; d++) {\n const day = new Date(start);\n day.setDate(start.getDate() + w * 7 + d);\n col.push(day);\n }\n cols.push(col);\n }\n const level = (v: number) => (v <= 0 ? 0 : Math.min(4, Math.ceil((v / max) * 4)));\n const mix = [0, 22, 45, 70, 100];\n\n return (\n <div className={cn(\"grid gap-2\", className)}>\n <div className=\"overflow-x-auto pb-1\">\n <div className=\"inline-grid gap-1\" role=\"img\" aria-label={rest[\"aria-label\"]}>\n <div className=\"flex gap-[3px] ps-7 text-[10px] text-fg-muted\" aria-hidden=\"true\">\n {cols.map((c, i) => (\n <span key={i} className=\"w-3 overflow-visible whitespace-nowrap\">\n {c[0].getDate() <= 7 ? c[0].toLocaleDateString(undefined, { month: \"short\" }) : \"\"}\n </span>\n ))}\n </div>\n <div className=\"flex gap-[3px]\">\n <div className=\"grid w-6 grid-rows-7 gap-[3px] text-[10px] leading-3 text-fg-muted\" aria-hidden=\"true\">\n {[\"\", \"Mon\", \"\", \"Wed\", \"\", \"Fri\", \"\"].map((d, i) => <span key={i}>{d}</span>)}\n </div>\n {cols.map((col, i) => (\n <div key={i} className=\"grid grid-rows-7 gap-[3px]\">\n {col.map((day) => {\n const v = map.get(iso(day)) ?? 0;\n const future = day > last;\n return (\n <span\n key={iso(day)}\n onPointerEnter={() => !future && setHover({ date: day, value: v })}\n onPointerLeave={() => setHover(null)}\n className={cn(\"size-3 rounded-[3px]\", future && \"opacity-0\")}\n style={{\n background: level(v) === 0 ? \"var(--color-secondary-hover)\" : `color-mix(in srgb, ${color} ${mix[level(v)]}%, var(--color-secondary-hover))`,\n outline: hover && iso(hover.date) === iso(day) ? \"1.5px solid var(--color-fg)\" : undefined,\n }}\n />\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center justify-between gap-2 text-xs text-fg-muted\">\n <span aria-live=\"polite\" className=\"tabular-nums\">\n {hover ? `${hover.date.toLocaleDateString(undefined, { weekday: \"short\", month: \"short\", day: \"numeric\" })}: ${formatValue(hover.value)}` : \"\\u00a0\"}\n </span>\n <span className=\"flex items-center gap-1\" aria-hidden=\"true\">\n Less\n {mix.map((m, i) => (\n <span key={i} className=\"size-3 rounded-[3px]\" style={{ background: i === 0 ? \"var(--color-secondary-hover)\" : `color-mix(in srgb, ${color} ${m}%, var(--color-secondary-hover))` }} />\n ))}\n More\n </span>\n </div>\n <DataTable caption={rest[\"aria-label\"]} columns={[\"Date\", \"Value\"]} rows={data.map((d) => [d.date, formatValue(d.value)])} />\n </div>\n );\n}\n\n/* ---------- Sparkline ---------- */\n\nexport interface SparklineProps {\n data: number[];\n /** \"line\" (default), \"area\" or \"bar\". */\n type?: \"line\" | \"area\" | \"bar\";\n color?: string;\n /** Height in px. Default 36. Width fills the container. */\n height?: number;\n /** Mark the last point. Default true for line/area. */\n showLast?: boolean;\n \"aria-label\"?: string;\n className?: string;\n}\n\n/** A tiny chart for trends inside cards and tables. */\nexport function Sparkline({ data: target, type = \"line\", color = \"var(--ui-chart-1)\", height = 36, showLast = true, className, ...rest }: SparklineProps) {\n const [ref, w] = useWidth<HTMLDivElement>();\n const data = useTweenedNumbers(target, { duration: 500 });\n const gid = React.useId().replace(/:/g, \"\");\n // Bars start from zero so their heights stay honest; lines use the data's own range.\n const min = type === \"bar\" ? Math.min(0, ...data) : Math.min(...data);\n const max = Math.max(...data);\n const pad = 3;\n const x = (i: number) => pad + (data.length <= 1 ? 0 : (i / (data.length - 1)) * (w - pad * 2));\n const y = (v: number) => pad + (1 - (v - min) / (max - min || 1)) * (height - pad * 2);\n const pts = data.map((v, i) => [x(i), y(v)] as [number, number]);\n return (\n <div ref={ref} className={cn(\"w-full\", className)} style={{ height }} role={rest[\"aria-label\"] ? \"img\" : undefined} aria-label={rest[\"aria-label\"]} aria-hidden={rest[\"aria-label\"] ? undefined : true}>\n {w > 0 && data.length > 0 && (\n <svg width={w} height={height} className=\"block overflow-visible\">\n {type === \"bar\" ? (\n data.map((v, i) => {\n const bw = Math.max(2, (w - pad * 2) / data.length - 2);\n const bx = pad + i * ((w - pad * 2) / data.length) + 1;\n const top = y(Math.max(v, min));\n return <rect key={i} x={bx} y={top} width={bw} height={Math.max(1.5, height - pad - top)} rx={1.5} fill={color} fillOpacity={i === data.length - 1 ? 1 : 0.45} />;\n })\n ) : (\n <>\n {type === \"area\" && (\n <>\n <defs>\n <linearGradient id={gid} x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.3} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n </linearGradient>\n </defs>\n <path d={`${monotonePath(pts)}L${x(data.length - 1)},${height}L${x(0)},${height}Z`} fill={`url(#${gid})`} />\n </>\n )}\n <path d={data.length > 2 ? monotonePath(pts) : linearPath(pts)} fill=\"none\" stroke={color} strokeWidth={1.75} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n {showLast && <circle cx={pts[pts.length - 1][0]} cy={pts[pts.length - 1][1]} r={2.75} fill={color} stroke=\"var(--color-surface)\" strokeWidth={1.5} />}\n </>\n )}\n </svg>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\nimport { Skeleton } from \"../activity/Activity\";\nimport { Sparkline } from \"./Shapes\";\nimport { DashboardAnimationContext, useAnimate, useReducedMotion, useTweenedNumbers } from \"./chart-utils\";\n\n/* KpiCard, WidgetCard and DashboardGrid. */\n\n/* ---------- KpiCard ---------- */\n\n/** While counting, show the same number of decimals as the real value (whole numbers stay whole). */\nfunction roundLike(n: number, like: number) {\n const places = (String(like).split(\".\")[1] ?? \"\").length;\n return +n.toFixed(places);\n}\n\nexport interface KpiCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n label: React.ReactNode;\n /**\n * The headline number. Pass a number (with formatValue) to have it count up on first load and\n * roll to new values on live updates — or pre-formatted text like \"18 days\".\n */\n value: React.ReactNode | number;\n /** Formats a numeric value, e.g. (v) => `₱${v.toLocaleString()}`. Default: whole number with separators. */\n formatValue?: (value: number) => string;\n /** Count up on first load. Default false (inside a DashboardGrid, follows its animate setting). */\n animate?: boolean;\n /** Change vs the previous period, as a percentage (8.2 or -4.1). */\n change?: number;\n /** Text after the change. Default \"vs last period\". */\n changeLabel?: string;\n /** For numbers where going down is good (costs, churn, overdue): flips the colors. */\n invertTrend?: boolean;\n icon?: IconInput;\n /** A small trend chart under the number. */\n sparkline?: number[];\n sparklineType?: \"line\" | \"area\" | \"bar\";\n /** Progress toward a goal: 0–1 plus a label like \"78% of ₱400K target\". */\n progress?: { value: number; label?: React.ReactNode };\n /** Makes the whole card a link. */\n href?: string;\n loading?: boolean;\n}\n\nexport function KpiCard({\n label,\n value,\n formatValue = (v) => Math.round(v).toLocaleString(),\n animate,\n change,\n changeLabel = \"vs last period\",\n invertTrend = false,\n icon,\n sparkline,\n sparklineType = \"area\",\n progress,\n href,\n loading = false,\n className,\n ...props\n}: KpiCardProps) {\n const up = change !== undefined && change > 0;\n const down = change !== undefined && change < 0;\n const good = invertTrend ? down : up;\n const bad = invertTrend ? up : down;\n const trendColor = good ? \"var(--color-success)\" : bad ? \"var(--color-danger)\" : \"var(--ui-chart-1)\";\n const Root = href ? \"a\" : \"div\";\n\n // Numbers count up on first load (if animating) and roll to new values on updates,\n // with a brief glow so a change on a live dashboard catches the eye.\n const numeric = typeof value === \"number\";\n const anim = useAnimate(animate, false);\n const [shownNum] = useTweenedNumbers([numeric ? (value as number) : 0], { enabled: numeric, from: anim ? 0 : undefined, duration: anim ? 1100 : 700 });\n const prefersReduced = useReducedMotion();\n // Remember the direction at the moment of change: green for good news, red for bad.\n const [flash, setFlash] = React.useState<{ n: number; good: boolean }>({ n: 0, good: true });\n const prev = React.useRef(value);\n React.useEffect(() => {\n if (prev.current !== value && numeric && typeof prev.current === \"number\" && !prefersReduced) {\n const rose = (value as number) > (prev.current as number);\n setFlash((f) => ({ n: f.n + 1, good: rose !== invertTrend }));\n }\n prev.current = value;\n }, [value, numeric, prefersReduced, invertTrend]);\n\n return (\n <Root\n {...(href ? { href } : {})}\n className={cn(\n \"group/kpi relative flex min-w-0 flex-col gap-3 rounded-card border border-border bg-surface p-4 shadow-[var(--ui-shadow-sm)]\",\n href && \"outline-none transition-[box-shadow,border-color] hover:border-border-strong hover:shadow-[var(--ui-shadow-md)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n className\n )}\n aria-busy={loading || undefined}\n {...(props as React.HTMLAttributes<HTMLElement>)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-sm text-fg-muted\">{label}</p>\n {icon && (\n <span className=\"grid size-8 shrink-0 place-items-center rounded-control bg-[color:color-mix(in_srgb,var(--color-primary)_10%,transparent)] text-primary [&_svg]:size-4\" aria-hidden=\"true\">\n {renderIcon(icon)}\n </span>\n )}\n </div>\n {loading ? (\n <div className=\"grid gap-2\">\n <Skeleton className=\"h-7 w-2/3\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n ) : (\n <>\n <div className=\"grid gap-1\">\n <p className=\"-mx-1 justify-self-start rounded-control-sm px-1 text-[1.75rem] font-semibold leading-none tracking-[-0.02em] tabular-nums text-fg\">\n <span\n key={flash.n}\n aria-hidden={numeric || undefined}\n className=\"-mx-1 -my-0.5 rounded-control-sm px-1 py-0.5\"\n style={flash.n ? { animation: \"ui-kpi-flash 1.2s ease-out both\", [\"--kpi-flash\" as string]: flash.good ? \"var(--color-success)\" : \"var(--color-danger)\" } : undefined}\n >\n {numeric ? formatValue(roundLike(shownNum, value as number)) : value}\n </span>\n {/* Screen readers get the final value, not every step of the count. */}\n {numeric && <span className=\"sr-only\">{formatValue(value as number)}</span>}\n </p>\n {change !== undefined && (\n <p className=\"flex flex-wrap items-center gap-x-1.5 text-xs text-fg-muted\">\n <span\n className={cn(\"inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 font-semibold tabular-nums\", good && \"bg-[color:color-mix(in_srgb,var(--color-success)_12%,transparent)] text-success\", bad && \"bg-[color:color-mix(in_srgb,var(--color-danger)_12%,transparent)] text-danger\", !good && !bad && \"bg-secondary-hover text-fg-muted\")}\n >\n <svg viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className={cn(\"size-3\", down && \"rotate-180\", !up && !down && \"hidden\")}>\n <path d=\"M6 9.5v-7M3 5l3-3 3 3\" />\n </svg>\n <span className=\"sr-only\">{up ? \"Up\" : down ? \"Down\" : \"No change\"} </span>\n {Math.abs(change).toLocaleString(undefined, { maximumFractionDigits: 1 })}%\n </span>\n {changeLabel}\n </p>\n )}\n </div>\n {sparkline && sparkline.length > 1 && <Sparkline data={sparkline} type={sparklineType} color={trendColor} height={40} />}\n {progress && (\n <div className=\"grid gap-1.5\">\n <div\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(Math.min(1, progress.value) * 100)}\n aria-label=\"Progress to target\"\n className=\"h-1.5 overflow-hidden rounded-full bg-secondary-hover\"\n >\n <div className=\"h-full rounded-full bg-primary transition-[width] duration-700 ease-out\" style={{ width: `${Math.min(1, Math.max(0, progress.value)) * 100}%` }} />\n </div>\n {progress.label && <p className=\"text-xs text-fg-muted\">{progress.label}</p>}\n </div>\n )}\n </>\n )}\n </Root>\n );\n}\n\n/* ---------- WidgetCard ---------- */\n\nexport interface WidgetCardProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Controls at the top right, e.g. a period picker. */\n action?: React.ReactNode;\n /** A big number under the title (e.g. the total the chart shows). */\n value?: React.ReactNode;\n loading?: boolean;\n /** Shown instead of the content when there's nothing to show. */\n empty?: React.ReactNode;\n /** Shown instead of the content when loading failed. */\n error?: React.ReactNode;\n onRetry?: () => void;\n footer?: React.ReactNode;\n /** Show a LiveIndicator in the header: true, or the time the data last changed. */\n live?: boolean | Date | number;\n}\n\n/** The frame for a dashboard widget: title, controls, and loading / empty / error states. */\nexport function WidgetCard({ title, description, action, value, loading, empty, error, onRetry, footer, live, className, children, ...props }: WidgetCardProps) {\n const id = React.useId();\n return (\n <section\n aria-labelledby={id}\n aria-busy={loading || undefined}\n className={cn(\"flex min-w-0 flex-col gap-4 rounded-card border border-border bg-surface p-4 shadow-[var(--ui-shadow-sm)] sm:p-5\", className)}\n {...props}\n >\n <header className=\"flex flex-wrap items-start justify-between gap-x-4 gap-y-2\">\n <div className=\"grid min-w-0 gap-0.5\">\n <h3 id={id} className=\"text-sm font-semibold text-fg\">{title}</h3>\n {description && <p className=\"text-xs text-fg-muted\">{description}</p>}\n {value !== undefined && !loading && <p className=\"mt-1 text-2xl font-semibold tracking-[-0.02em] tabular-nums text-fg\">{value}</p>}\n </div>\n {(action || live) && (\n <div className=\"flex shrink-0 items-center gap-3\">\n {live && <LiveIndicator updatedAt={live === true ? undefined : live} />}\n {action}\n </div>\n )}\n </header>\n <div className=\"relative min-w-0 flex-1\">\n {loading ? (\n <div className=\"grid h-full min-h-40 content-end gap-2\" aria-label=\"Loading\">\n <div className=\"flex h-32 items-end gap-2\">\n {[40, 65, 50, 80, 60, 90, 70].map((h, i) => (\n <Skeleton key={i} className=\"flex-1 rounded-b-none\" style={{ height: `${h}%` }} />\n ))}\n </div>\n </div>\n ) : error ? (\n <div role=\"alert\" className=\"grid min-h-40 place-content-center justify-items-center gap-2 text-center text-sm text-fg-muted\">\n <span className=\"grid size-9 place-items-center rounded-full bg-[color:color-mix(in_srgb,var(--color-danger)_12%,transparent)] text-danger\" aria-hidden=\"true\">!</span>\n <p>{error}</p>\n {onRetry && (\n <button type=\"button\" onClick={onRetry} className=\"cursor-pointer rounded-control-sm px-2 py-1 text-xs font-medium text-primary hover:bg-secondary-hover\">\n Try again\n </button>\n )}\n </div>\n ) : empty ? (\n <div className=\"grid min-h-40 place-content-center text-center text-sm text-fg-muted\">{empty}</div>\n ) : (\n children\n )}\n </div>\n {footer && <footer className=\"border-t border-border pt-3 text-xs text-fg-muted\">{footer}</footer>}\n </section>\n );\n}\n\n/* ---------- DashboardGrid ---------- */\n\nexport interface DashboardGridProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Columns on wide screens. Default 4. It steps down to 2 and then 1 as space shrinks. */\n columns?: 2 | 3 | 4 | 6 | 12;\n /**\n * Animate on first load: widgets rise in one after another, KPI numbers count up, charts draw in,\n * donuts and gauges sweep. Off by default; skipped for people who prefer reduced motion.\n */\n animate?: boolean;\n}\n\n/** A responsive grid for widgets. Give a child `data-span=\"2\"` (or use DashboardGrid.Item) to make it wider. */\nexport function DashboardGrid({ columns = 4, animate = false, className, style, ...props }: DashboardGridProps) {\n return (\n <DashboardAnimationContext.Provider value={animate}>\n <div className=\"@container w-full\">\n <div\n className={cn(\n animate && \"ui-dash-enter\",\n \"grid grid-cols-1 gap-4 @[36rem]:grid-cols-2 @[64rem]:grid-cols-[repeat(var(--dg-cols),minmax(0,1fr))]\",\n \"[&>[data-span='2']]:@[36rem]:col-span-2 [&>[data-span='3']]:@[36rem]:col-span-2 [&>[data-span='3']]:@[64rem]:col-span-3 [&>[data-span='4']]:@[36rem]:col-span-2 [&>[data-span='4']]:@[64rem]:col-span-4 [&>[data-span='full']]:col-span-full\",\n className\n )}\n style={{ [\"--dg-cols\" as string]: columns, ...style }}\n {...props}\n />\n </div>\n </DashboardAnimationContext.Provider>\n );\n}\n\n/* ---------- LiveIndicator ---------- */\n\nexport interface LiveIndicatorProps {\n /** When the data last changed. Shows \"updated 3s ago\", ticking. */\n updatedAt?: Date | number | null;\n /** Show \"Paused\" instead of \"Live\". */\n paused?: boolean;\n /** Connection trouble: shows \"Reconnecting…\" in amber. */\n reconnecting?: boolean;\n className?: string;\n}\n\nfunction ago(t: number) {\n const s = Math.max(0, Math.round((Date.now() - t) / 1000));\n if (s < 5) return \"just now\";\n if (s < 60) return `${s}s ago`;\n const m = Math.round(s / 60);\n return m < 60 ? `${m}m ago` : `${Math.round(m / 60)}h ago`;\n}\n\n/** A pulsing \"Live\" badge with how long ago the data changed. */\nexport function LiveIndicator({ updatedAt, paused = false, reconnecting = false, className }: LiveIndicatorProps) {\n const [, tick] = React.useState(0);\n React.useEffect(() => {\n if (!updatedAt) return;\n const t = window.setInterval(() => tick((n) => n + 1), 1000);\n return () => window.clearInterval(t);\n }, [updatedAt]);\n const tone = reconnecting ? \"var(--color-warning)\" : paused ? \"var(--color-fg-muted)\" : \"var(--color-success)\";\n const at = updatedAt ? new Date(updatedAt).getTime() : null;\n return (\n <span className={cn(\"inline-flex items-center gap-1.5 whitespace-nowrap text-xs text-fg-muted\", className)}>\n <span className=\"relative grid size-2 place-items-center\" aria-hidden=\"true\">\n {!paused && !reconnecting && <span className=\"absolute size-full animate-[ui-beacon_1.8s_cubic-bezier(0,0,0.2,1)_infinite] rounded-full motion-reduce:hidden\" style={{ background: tone, opacity: 0.5 }} />}\n <span className=\"relative size-2 rounded-full\" style={{ background: tone }} />\n </span>\n <span className=\"font-medium\" style={{ color: reconnecting ? tone : undefined }}>{reconnecting ? \"Reconnecting…\" : paused ? \"Paused\" : \"Live\"}</span>\n {at && !reconnecting && <span className=\"tabular-nums\">· updated {ago(at)}</span>}\n </span>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Accordion — sections that open and close.\n *\n * <Accordion type=\"single\" collapsible defaultValue=\"refunds\">\n * <AccordionItem value=\"refunds\" title=\"How do refunds work?\">…</AccordionItem>\n * </Accordion>\n *\n * Beyond the usual: the browser's find-in-page (Ctrl/⌘+F) searches closed sections and opens the\n * match (Chrome/Edge, via hidden=\"until-found\"); deep links (#refunds) open and scroll to a section;\n * headers can hold their own controls (e.g. a Switch); items can show a step status and a summary\n * while closed — enough to build a one-page checkout.\n */\n\ntype AccordionCtx = {\n open: string[];\n toggle: (value: string, force?: boolean) => void;\n variant: \"separated\" | \"outline\" | \"flush\";\n size: \"sm\" | \"md\";\n headingLevel: 2 | 3 | 4 | 5 | 6;\n register: (value: string) => void;\n unregister: (value: string) => void;\n values: React.MutableRefObject<string[]>;\n /** Makes element ids unique per accordion (empty when linking to the URL hash, so #value works). */\n idPrefix: string;\n};\nconst Ctx = React.createContext<AccordionCtx | null>(null);\n\nexport const useAccordion = () => {\n const c = React.useContext(Ctx);\n if (!c) throw new Error(\"useAccordion must be used inside <Accordion>.\");\n return {\n open: c.open,\n toggle: c.toggle,\n expandAll: () => c.values.current.forEach((v) => c.toggle(v, true)),\n collapseAll: () => c.values.current.forEach((v) => c.toggle(v, false)),\n };\n};\n\ntype SingleProps = {\n /** One section open at a time. */\n type?: \"single\";\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string | null) => void;\n /** Allow closing the open section (so none is open). Default true. */\n collapsible?: boolean;\n};\ntype MultipleProps = {\n /** Any number open at once. */\n type: \"multiple\";\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n collapsible?: never;\n};\n\nexport type AccordionProps = (SingleProps | MultipleProps) &\n Omit<React.HTMLAttributes<HTMLDivElement>, \"defaultValue\" | \"onChange\"> & {\n /** \"separated\" cards (default), \"outline\" one bordered group, or \"flush\" with dividers only. */\n variant?: \"separated\" | \"outline\" | \"flush\";\n size?: \"sm\" | \"md\";\n /** The heading level of item titles, for a correct document outline. Default 3. */\n headingLevel?: 2 | 3 | 4 | 5 | 6;\n /** Open the section whose value matches the URL hash (#value), and update it when one opens. */\n linkToHash?: boolean;\n };\n\nexport function Accordion(props: AccordionProps) {\n const {\n type = \"single\",\n value: valueProp,\n defaultValue,\n onValueChange,\n collapsible = true,\n variant = \"separated\",\n size = \"md\",\n headingLevel = 3,\n linkToHash = false,\n className,\n children,\n ...rest\n } = props as AccordionProps & { collapsible?: boolean };\n const multiple = type === \"multiple\";\n const toArr = (v: unknown): string[] => (Array.isArray(v) ? v : v ? [v as string] : []);\n const [inner, setInner] = React.useState<string[]>(toArr(defaultValue));\n const open = valueProp !== undefined ? toArr(valueProp) : inner;\n const values = React.useRef<string[]>([]);\n const uid = React.useId().replace(/:/g, \"\");\n const idPrefix = linkToHash ? \"\" : `${uid}-`;\n const openRef = React.useRef(open);\n openRef.current = open;\n\n const commit = React.useCallback(\n (next: string[]) => {\n if (valueProp === undefined) setInner(next);\n (onValueChange as ((v: unknown) => void) | undefined)?.(multiple ? next : next[0] ?? null);\n },\n [valueProp, onValueChange, multiple]\n );\n\n const toggle = React.useCallback(\n (v: string, force?: boolean) => {\n const cur = openRef.current;\n const isOpen = cur.includes(v);\n const want = force ?? !isOpen;\n if (want === isOpen) return;\n if (!want && !multiple && !collapsible) return;\n const next = multiple ? (want ? [...cur, v] : cur.filter((x) => x !== v)) : want ? [v] : [];\n openRef.current = next;\n commit(next);\n if (linkToHash && want && typeof window !== \"undefined\") history.replaceState(null, \"\", `#${v}`);\n },\n [multiple, collapsible, commit, linkToHash]\n );\n\n // Deep links: #value opens that section and scrolls it into view.\n React.useEffect(() => {\n if (!linkToHash) return;\n const openFromHash = () => {\n const h = decodeURIComponent(window.location.hash.slice(1));\n if (h && values.current.includes(h)) {\n toggle(h, true);\n requestAnimationFrame(() => document.getElementById(h)?.scrollIntoView({ behavior: \"smooth\", block: \"start\" }));\n }\n };\n openFromHash();\n window.addEventListener(\"hashchange\", openFromHash);\n return () => window.removeEventListener(\"hashchange\", openFromHash);\n }, [linkToHash, toggle]);\n\n const ctx = React.useMemo<AccordionCtx>(\n () => ({\n open,\n toggle,\n variant,\n size,\n headingLevel,\n values,\n idPrefix,\n register: (v) => {\n if (!values.current.includes(v)) values.current.push(v);\n },\n unregister: (v) => {\n values.current = values.current.filter((x) => x !== v);\n },\n }),\n [open, toggle, variant, size, headingLevel, idPrefix]\n );\n\n // Arrow keys move between headers (Home/End to the first/last).\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const t = e.target as HTMLElement;\n if (!t.matches(\"[data-accordion-trigger]\")) return;\n const triggers = [...e.currentTarget.querySelectorAll<HTMLElement>(\"[data-accordion-trigger]:not([disabled])\")].filter(\n (b) => b.closest(\"[data-accordion]\") === e.currentTarget\n );\n const i = triggers.indexOf(t);\n let n = -1;\n if (e.key === \"ArrowDown\") n = (i + 1) % triggers.length;\n else if (e.key === \"ArrowUp\") n = (i - 1 + triggers.length) % triggers.length;\n else if (e.key === \"Home\") n = 0;\n else if (e.key === \"End\") n = triggers.length - 1;\n if (n >= 0) {\n e.preventDefault();\n triggers[n].focus();\n }\n };\n\n return (\n <Ctx.Provider value={ctx}>\n <div\n data-accordion=\"\"\n onKeyDown={onKeyDown}\n className={cn(\n variant === \"separated\" && \"grid gap-2\",\n variant === \"outline\" && \"divide-y divide-border overflow-hidden rounded-card border border-border bg-surface\",\n variant === \"flush\" && \"divide-y divide-border border-y border-border\",\n className\n )}\n {...rest}\n >\n {children}\n </div>\n </Ctx.Provider>\n );\n}\n\n/* ---------- item ---------- */\n\nexport type AccordionStatus = \"complete\" | \"current\" | \"error\" | \"locked\";\n\nexport interface AccordionItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n value: string;\n title: React.ReactNode;\n /** Smaller text under the title (always visible). */\n description?: React.ReactNode;\n /** Shown under the title only while closed — e.g. what was entered in a finished step. */\n summary?: React.ReactNode;\n icon?: IconInput;\n /** Something on the right of the header (not part of the button): a count, a Pill, a Switch. */\n meta?: React.ReactNode;\n /** Controls in the header that shouldn't toggle the section, e.g. <Switch />. */\n action?: React.ReactNode;\n /** Step status icon: complete (✓), current, error (!), locked. Locked items can't open. */\n status?: AccordionStatus;\n disabled?: boolean;\n /** Keep the content in the page while closed (default true, so find-in-page and forms work). */\n keepMounted?: boolean;\n}\n\nconst statusBadge: Record<AccordionStatus, React.ReactNode> = {\n complete: (\n <span className=\"grid size-6 place-items-center rounded-full bg-success text-success-fg\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.4} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-3.5\">\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n </span>\n ),\n current: <span className=\"grid size-6 place-items-center rounded-full border-2 border-primary\"><span className=\"size-2 rounded-full bg-primary\" /></span>,\n error: <span className=\"grid size-6 place-items-center rounded-full bg-danger text-sm font-bold text-danger-fg\">!</span>,\n locked: (\n <span className=\"grid size-6 place-items-center rounded-full border-2 border-dashed border-border-strong text-fg-muted\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.6} aria-hidden=\"true\" className=\"size-3\">\n <rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6.5\" rx=\"1.5\" />\n <path d=\"M5.5 7V5a2.5 2.5 0 015 0v2\" />\n </svg>\n </span>\n ),\n};\nconst statusText: Record<AccordionStatus, string> = { complete: \"Done\", current: \"In progress\", error: \"Needs attention\", locked: \"Locked\" };\n\nexport function AccordionItem({\n value,\n title,\n description,\n summary,\n icon,\n meta,\n action,\n status,\n disabled: disabledProp,\n keepMounted = true,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n const ctx = React.useContext(Ctx);\n if (!ctx) throw new Error(\"<AccordionItem> must be used inside <Accordion>.\");\n const { open: openList, toggle, variant, size, headingLevel, register, unregister, idPrefix } = ctx;\n const open = openList.includes(value);\n const disabled = disabledProp || status === \"locked\";\n const headerId = `${idPrefix}${value}-header`;\n const panelId = `${idPrefix}${value}-panel`;\n const Heading = `h${headingLevel}` as const;\n const panelRef = React.useRef<HTMLDivElement>(null);\n const [everOpened, setEverOpened] = React.useState(open);\n // The panel clips its content only while animating or closed; once open, nothing is cut off.\n const [settled, setSettled] = React.useState(open);\n React.useEffect(() => {\n if (!open) return setSettled(false);\n const t = window.setTimeout(() => setSettled(true), 270);\n return () => window.clearTimeout(t);\n }, [open]);\n\n React.useEffect(() => {\n register(value);\n return () => unregister(value);\n }, [value, register, unregister]);\n React.useEffect(() => {\n if (open) setEverOpened(true);\n }, [open]);\n\n // Closed sections stay searchable: hidden=\"until-found\" lets Ctrl/⌘+F find text inside, and the\n // browser fires \"beforematch\" so we can open the section. Browsers without it treat it as hidden.\n React.useEffect(() => {\n const el = panelRef.current;\n if (!el) return;\n if (open) {\n el.removeAttribute(\"hidden\");\n return;\n }\n // Wait for the closing animation before hiding.\n const t = window.setTimeout(() => el.setAttribute(\"hidden\", \"until-found\"), 260);\n const onMatch = () => toggle(value, true);\n el.addEventListener(\"beforematch\", onMatch);\n return () => {\n window.clearTimeout(t);\n el.removeEventListener(\"beforematch\", onMatch);\n };\n }, [open, toggle, value]);\n\n const pad = size === \"sm\" ? \"px-3.5 py-2.5\" : \"px-4 py-3.5\";\n\n return (\n <div\n id={idPrefix ? undefined : value}\n data-state={open ? \"open\" : \"closed\"}\n className={cn(\n \"group/acc min-w-0 scroll-mt-20\",\n variant === \"separated\" &&\n cn(\n \"rounded-card border bg-surface transition-[border-color,box-shadow] duration-200\",\n open ? \"border-border-strong shadow-[var(--ui-shadow-md)]\" : \"border-border shadow-[var(--ui-shadow-sm)]\",\n status === \"error\" && \"border-[color:color-mix(in_srgb,var(--color-danger)_50%,transparent)]\"\n ),\n className\n )}\n {...props}\n >\n <Heading className=\"m-0 flex items-stretch\">\n <button\n type=\"button\"\n id={headerId}\n data-accordion-trigger=\"\"\n aria-expanded={open}\n aria-controls={panelId}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n onClick={() => toggle(value)}\n className={cn(\n \"group/trigger flex min-w-0 flex-1 cursor-pointer items-center gap-3 text-start outline-none\",\n \"focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring\",\n variant === \"separated\" ? \"rounded-card\" : \"\",\n variant === \"flush\" ? \"py-3.5\" : pad,\n disabled && \"cursor-not-allowed opacity-55\"\n )}\n >\n {status && <span className=\"shrink-0\" aria-hidden=\"true\">{statusBadge[status]}</span>}\n {icon && !status && (\n <span className=\"grid size-8 shrink-0 place-items-center rounded-control bg-secondary-hover text-fg-muted [&_svg]:size-4\" aria-hidden=\"true\">\n {renderIcon(icon)}\n </span>\n )}\n <span className=\"grid min-w-0 flex-1 gap-0.5\">\n <span className={cn(\"font-medium text-fg\", size === \"sm\" ? \"text-sm\" : \"text-[0.9375rem]\")}>\n {title}\n {status && <span className=\"sr-only\"> — {statusText[status]}</span>}\n </span>\n {description && <span className=\"text-[0.8125rem] text-fg-muted\">{description}</span>}\n {summary && !open && <span className=\"truncate text-[0.8125rem] text-fg-muted\">{summary}</span>}\n </span>\n {meta && <span className=\"shrink-0 text-sm text-fg-muted\">{meta}</span>}\n {!action && <Chevron />}\n </button>\n {action && (\n // Outside the button, so its controls work on their own.\n <span className={cn(\"flex shrink-0 items-center gap-2\", variant === \"flush\" ? \"ps-3\" : \"pe-4\")}>\n {action}\n <button\n type=\"button\"\n tabIndex={-1}\n aria-hidden=\"true\"\n onClick={() => !disabled && toggle(value)}\n className=\"grid cursor-pointer place-items-center rounded-control-sm p-1 hover:bg-secondary-hover\"\n >\n <Chevron open={open} />\n </button>\n </span>\n )}\n </Heading>\n\n {/* The panel: animates height by growing its grid row from 0fr to 1fr. */}\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-250 ease-[cubic-bezier(0.2,0.8,0.3,1)] motion-reduce:transition-none\",\n open ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\"\n )}\n >\n <div\n ref={panelRef}\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n className={cn(\"min-h-0\", settled ? \"overflow-visible\" : \"overflow-hidden\")}\n {...(!open && !keepMounted ? { hidden: true } : {})}\n >\n <div\n className={cn(\n \"text-sm leading-relaxed text-fg-muted transition-[opacity,translate] duration-250 motion-reduce:transition-none\",\n open ? \"translate-y-0 opacity-100\" : \"-translate-y-1 opacity-0\",\n variant === \"flush\" ? \"pb-4\" : size === \"sm\" ? \"px-3.5 pb-3.5\" : \"px-4 pb-4\",\n status || icon ? (variant === \"flush\" ? \"ps-9\" : size === \"sm\" ? \"ps-[3.25rem]\" : \"ps-[3.75rem]\") : \"\"\n )}\n >\n {keepMounted || open || everOpened ? children : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction Chevron({ open }: { open?: boolean }) {\n return (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={cn(\n \"size-4 shrink-0 text-fg-muted transition-transform duration-250 motion-reduce:transition-none\",\n open === undefined ? \"group-data-[state=open]/acc:rotate-180\" : open && \"rotate-180\"\n )}\n >\n <path d=\"M5 7.5l5 5 5-5\" />\n </svg>\n );\n}\n\n/* ---------- expand / collapse all ---------- */\n\n/** Buttons to open or close every section (for type=\"multiple\"). Place inside <Accordion> or pass a ref-less wrapper. */\nexport function AccordionToggleAll({ expandLabel = \"Expand all\", collapseLabel = \"Collapse all\", className }: { expandLabel?: string; collapseLabel?: string; className?: string }) {\n const { open, expandAll, collapseAll } = useAccordion();\n const any = open.length > 0;\n return (\n <button\n type=\"button\"\n onClick={any ? collapseAll : expandAll}\n className={cn(\"cursor-pointer justify-self-end rounded-control-sm px-2 py-1 text-xs font-medium text-primary hover:bg-secondary-hover\", className)}\n >\n {any ? collapseLabel : expandLabel}\n </button>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/*\n * Carousel — slides you swipe, drag or step through.\n *\n * Built on native scroll snapping, so swiping on phones has real momentum and snap, trackpads\n * and mouse wheels just work, and there's no scroll-jacking. Adds: slides per view that adapt to\n * the available width, peeking, a coverflow effect, autoplay with a pause control, and four kinds\n * of indicators — dots, a counter, story bars and thumbnails.\n */\n\nexport type PerView = number | { base?: number; sm?: number; md?: number; lg?: number };\n\nexport interface CarouselHandle {\n next: () => void;\n prev: () => void;\n goTo: (index: number) => void;\n index: number;\n}\n\nexport interface CarouselProps extends Omit<React.HTMLAttributes<HTMLElement>, \"onChange\"> {\n /** Name for the carousel, e.g. \"Product photos\". */\n \"aria-label\": string;\n /** Slides shown at once: a number, or by width { base: 1, sm: 2, md: 3 } (container ≥480 / 768 / 1024px). */\n slidesPerView?: PerView;\n /** Space between slides in px. Default 16. */\n gap?: number;\n /** Let the next slide peek in by this many px (or true for 48). */\n peek?: boolean | number;\n /** \"start\" (default) or \"center\" — the active slide sits in the middle. */\n align?: \"start\" | \"center\";\n /** \"coverflow\": slides shrink and fade as they move away from the center. */\n effect?: \"none\" | \"coverflow\";\n /** After the last slide, next goes back to the first (and prev from the first to the last). */\n loop?: boolean;\n /** Move on by itself every N ms. Pauses on hover, touch, focus and hidden tabs; off with reduced motion. */\n autoplay?: number | false;\n /** \"dots\" (default), \"counter\" (3 / 8), \"stories\" (bars at the top), \"thumbnails\", or \"none\". */\n indicators?: \"dots\" | \"counter\" | \"stories\" | \"thumbnails\" | \"none\";\n /** Previous/next buttons: over the slides (default), below them, or none. */\n controls?: \"overlay\" | \"below\" | \"none\";\n defaultIndex?: number;\n onSlideChange?: (index: number) => void;\n}\n\nexport interface CarouselSlideProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Small preview shown when indicators=\"thumbnails\". */\n thumbnail?: React.ReactNode;\n /** Accessible name for the slide (default \"3 of 8\"). */\n label?: string;\n}\n\n/** One slide. Put anything inside: an image, text, a card, a form. */\nexport const CarouselSlide = React.forwardRef<HTMLDivElement, CarouselSlideProps>(({ className, children, thumbnail: _t, label: _l, ...props }, ref) => (\n <div ref={ref} className={cn(\"h-full min-w-0\", className)} {...props}>\n {children}\n </div>\n));\nCarouselSlide.displayName = \"CarouselSlide\";\n\nconst resolvePerView = (p: PerView, width: number) => {\n if (typeof p === \"number\") return p;\n if (width >= 1024 && p.lg) return p.lg;\n if (width >= 768 && (p.md ?? p.sm)) return (p.md ?? p.sm)!;\n if (width >= 480 && p.sm) return p.sm;\n return p.base ?? 1;\n};\n\nconst Arrow = ({ dir }: { dir: \"prev\" | \"next\" }) => (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-4 rtl:-scale-x-100\">\n <path d={dir === \"prev\" ? \"M12 5l-5 5 5 5\" : \"M8 5l5 5-5 5\"} />\n </svg>\n);\n\nexport const Carousel = React.forwardRef<CarouselHandle, CarouselProps>(function Carousel(\n {\n slidesPerView = 1,\n gap = 16,\n peek = false,\n align = \"start\",\n effect = \"none\",\n loop = false,\n autoplay = false,\n indicators = \"dots\",\n controls = \"overlay\",\n defaultIndex = 0,\n onSlideChange,\n className,\n children,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n) {\n const slides = React.Children.toArray(children).filter(React.isValidElement) as React.ReactElement<CarouselSlideProps>[];\n const count = slides.length;\n const rootRef = React.useRef<HTMLElement>(null);\n const viewRef = React.useRef<HTMLDivElement>(null);\n const slideRefs = React.useRef<Array<HTMLDivElement | null>>([]);\n const [width, setWidth] = React.useState(0);\n const [index, setIndex] = React.useState(defaultIndex);\n const indexRef = React.useRef(index);\n indexRef.current = index;\n const centered = align === \"center\" || effect === \"coverflow\";\n const perView = Math.max(1, resolvePerView(slidesPerView, width));\n const peekPx = peek === true ? 48 : peek || 0;\n const lastStart = centered ? count - 1 : Math.max(0, count - Math.floor(perView));\n const [reduced, setReduced] = React.useState(false);\n\n React.useEffect(() => {\n const q = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\");\n if (!q) return;\n setReduced(q.matches);\n const on = () => setReduced(q.matches);\n q.addEventListener?.(\"change\", on);\n return () => q.removeEventListener?.(\"change\", on);\n }, []);\n\n React.useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n const measure = () => setWidth(el.getBoundingClientRect().width);\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n ro?.observe(el);\n return () => ro?.disconnect();\n }, []);\n\n /* ----- moving ----- */\n const scrollToIndex = React.useCallback(\n (i: number, smooth = true) => {\n const view = viewRef.current;\n const slide = slideRefs.current[i];\n if (!view || !slide) return;\n const rtl = getComputedStyle(view).direction === \"rtl\";\n let left = slide.offsetLeft - view.offsetLeft;\n if (centered) left -= (view.clientWidth - slide.offsetWidth) / 2;\n view.scrollTo({ left: rtl ? -(view.scrollWidth - view.clientWidth - left) : left, behavior: smooth && !reduced ? \"smooth\" : \"auto\" });\n },\n [centered, reduced]\n );\n\n const goTo = React.useCallback(\n (i: number) => {\n const n = loop ? (i + (lastStart + 1)) % (lastStart + 1) : Math.max(0, Math.min(lastStart, i));\n scrollToIndex(n);\n },\n [loop, lastStart, scrollToIndex]\n );\n const next = React.useCallback(() => goTo(indexRef.current + 1), [goTo]);\n const prev = React.useCallback(() => goTo(indexRef.current - 1), [goTo]);\n\n React.useImperativeHandle(ref, () => ({ next, prev, goTo, index }), [next, prev, goTo, index]);\n\n // Start at defaultIndex without animation.\n React.useLayoutEffect(() => {\n if (width && defaultIndex) scrollToIndex(defaultIndex, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [width > 0]);\n\n /* ----- which slide is active, and the coverflow effect ----- */\n const onScroll = React.useCallback(() => {\n const view = viewRef.current;\n if (!view) return;\n const vr = view.getBoundingClientRect();\n const anchor = centered ? vr.left + vr.width / 2 : vr.left + 1;\n let best = 0;\n let bestD = Infinity;\n slideRefs.current.forEach((s, i) => {\n if (!s) return;\n const r = s.getBoundingClientRect();\n const point = centered ? r.left + r.width / 2 : r.left;\n const d = Math.abs(point - anchor);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n if (effect === \"coverflow\") {\n // Shrink and fade with distance from the center (applied directly, no re-render).\n const t = Math.min(1, Math.abs(r.left + r.width / 2 - (vr.left + vr.width / 2)) / r.width);\n s.style.transform = reduced ? \"\" : `scale(${1 - t * 0.14})`;\n s.style.opacity = String(1 - t * 0.5);\n }\n });\n // At the very end of the track, the last \"page\" is active even if its first slide isn't at the edge.\n if (!centered && view.scrollLeft + view.clientWidth >= view.scrollWidth - 2) best = lastStart;\n if (best !== indexRef.current) {\n indexRef.current = best;\n setIndex(best);\n onSlideChange?.(best);\n }\n }, [centered, effect, reduced, lastStart, onSlideChange]);\n\n React.useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n let raf = 0;\n const handler = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(onScroll);\n };\n view.addEventListener(\"scroll\", handler, { passive: true });\n onScroll();\n return () => {\n view.removeEventListener(\"scroll\", handler);\n cancelAnimationFrame(raf);\n };\n }, [onScroll, width]);\n\n /* ----- autoplay ----- */\n const [hovered, setHovered] = React.useState(false);\n const [focused, setFocused] = React.useState(false);\n const [held, setHeld] = React.useState(false);\n const [userPaused, setUserPaused] = React.useState(false);\n const [hidden, setHidden] = React.useState(false);\n React.useEffect(() => {\n const on = () => setHidden(document.visibilityState === \"hidden\");\n document.addEventListener(\"visibilitychange\", on);\n return () => document.removeEventListener(\"visibilitychange\", on);\n }, []);\n // Don't advance while scrolled out of view — people should see it start from where it was.\n const [inView, setInView] = React.useState(true);\n React.useEffect(() => {\n const el = rootRef.current;\n if (!autoplay || !el || typeof IntersectionObserver === \"undefined\") return;\n const io = new IntersectionObserver(([e]) => setInView(e.isIntersecting), { threshold: 0.5 });\n io.observe(el);\n return () => io.disconnect();\n }, [autoplay]);\n const autoplayOn = !!autoplay && !reduced;\n const playing = autoplayOn && !userPaused && !hovered && !focused && !held && !hidden && inView;\n const [cycle, setCycle] = React.useState(0); // restarts the timer bar\n React.useEffect(() => setCycle((c) => c + 1), [index]);\n React.useEffect(() => {\n if (!playing || !autoplay) return;\n const t = window.setTimeout(() => {\n if (!loop && indexRef.current >= lastStart) goTo(0);\n else next();\n }, autoplay);\n return () => window.clearTimeout(t);\n }, [playing, autoplay, next, goTo, loop, lastStart, index, cycle]);\n\n /* ----- mouse dragging (touch already swipes natively) ----- */\n const drag = React.useRef<{ x: number; left: number; moved: boolean; t: number } | null>(null);\n const [dragging, setDragging] = React.useState(false);\n const onPointerDown = (e: React.PointerEvent) => {\n setHeld(true);\n if (e.pointerType !== \"mouse\" || e.button !== 0 || !viewRef.current) return;\n drag.current = { x: e.clientX, left: viewRef.current.scrollLeft, moved: false, t: performance.now() };\n };\n React.useEffect(() => {\n const move = (e: PointerEvent) => {\n const d = drag.current;\n const view = viewRef.current;\n if (!d || !view) return;\n const dx = e.clientX - d.x;\n if (!d.moved && Math.abs(dx) > 4) {\n d.moved = true;\n setDragging(true);\n }\n if (d.moved) view.scrollLeft = d.left - dx;\n };\n const up = (e: PointerEvent) => {\n setHeld(false);\n const d = drag.current;\n drag.current = null;\n if (!d?.moved) return;\n setDragging(false);\n // A quick flick moves one slide in its direction; a slow drag settles on the nearest.\n const dx = e.clientX - d.x;\n const fast = Math.abs(dx) / Math.max(1, performance.now() - d.t) > 0.4;\n requestAnimationFrame(() => {\n if (fast) goTo(indexRef.current + (dx < 0 ? 1 : -1) * (Math.abs(dx) > 30 ? 1 : 0));\n else scrollToIndex(indexRef.current);\n });\n // Don't let the drag also count as a click on a link or button inside the slide.\n const stop = (ev: Event) => {\n ev.stopPropagation();\n ev.preventDefault();\n };\n window.addEventListener(\"click\", stop, { capture: true, once: true });\n setTimeout(() => window.removeEventListener(\"click\", stop, { capture: true }), 0);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n return () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n };\n }, [goTo, scrollToIndex]);\n\n /* ----- layout ----- */\n const slideBasis = centered\n ? `calc((100% - ${peekPx * 2}px - ${gap * (Math.ceil(perView) - 1)}px) / ${perView})`\n : `calc((100% - ${peekPx}px - ${gap * (Math.ceil(perView) - 1)}px) / ${perView})`;\n const pages = lastStart + 1;\n const atStart = index <= 0;\n const atEnd = index >= lastStart;\n const stories = indicators === \"stories\";\n\n const navButton = (dir: \"prev\" | \"next\", overlay: boolean) => (\n <button\n type=\"button\"\n aria-label={dir === \"prev\" ? \"Previous slide\" : \"Next slide\"}\n aria-controls={`${rootId}-view`}\n onClick={dir === \"prev\" ? prev : next}\n disabled={!loop && (dir === \"prev\" ? atStart : atEnd)}\n className={cn(\n \"grid size-9 cursor-pointer place-items-center rounded-full border border-border bg-surface text-fg shadow-[var(--ui-shadow-md)] outline-none transition-[opacity,transform] duration-150\",\n \"hover:scale-105 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-0\",\n overlay && cn(\"absolute top-1/2 z-10 -translate-y-1/2\", dir === \"prev\" ? \"start-2\" : \"end-2\", \"opacity-0 group-hover/car:opacity-100 group-focus-within/car:opacity-100 [@media(hover:none)]:hidden\")\n )}\n >\n <Arrow dir={dir} />\n </button>\n );\n const rootId = React.useId().replace(/:/g, \"\");\n\n const pauseButton = autoplayOn && (\n <button\n type=\"button\"\n onClick={() => setUserPaused((p) => !p)}\n aria-label={userPaused ? \"Start automatic slide show\" : \"Stop automatic slide show\"}\n className=\"grid size-7 cursor-pointer place-items-center rounded-full text-fg-muted outline-none hover:bg-secondary-hover hover:text-fg focus-visible:outline-2 focus-visible:outline-ring\"\n >\n <svg viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\" className=\"size-3.5\">\n {userPaused ? <path d=\"M5 3.5v9l7-4.5z\" /> : <path d=\"M4.5 3.5h2.5v9H4.5zM9 3.5h2.5v9H9z\" />}\n </svg>\n </button>\n );\n\n return (\n <section\n ref={rootRef}\n aria-roledescription=\"carousel\"\n aria-label={ariaLabel}\n className={cn(\"group/car grid min-w-0 gap-3 [contain:inline-size]\", className)}\n onPointerEnter={(e) => e.pointerType === \"mouse\" && setHovered(true)}\n onPointerLeave={() => setHovered(false)}\n onFocus={(e) => e.target !== viewRef.current && setFocused(true)}\n onBlur={(e) => !e.currentTarget.contains(e.relatedTarget as Node) && setFocused(false)}\n {...props}\n >\n <div className=\"relative min-w-0\">\n {stories && (\n <div className=\"pointer-events-none absolute inset-x-3 top-3 z-10 flex gap-1\" aria-hidden=\"true\">\n {Array.from({ length: pages }, (_, i) => (\n <span key={i} className=\"h-[3px] flex-1 overflow-hidden rounded-full bg-white/40\">\n <span\n key={i === index ? cycle : undefined}\n className=\"block h-full origin-left rounded-full bg-white\"\n style={\n i < index\n ? { transform: \"scaleX(1)\" }\n : i === index && autoplayOn\n ? { animation: `ui-toast-timer ${autoplay}ms linear reverse both`, animationPlayState: playing ? \"running\" : \"paused\" }\n : { transform: `scaleX(${i === index ? 1 : 0})` }\n }\n />\n </span>\n ))}\n </div>\n )}\n <div\n ref={viewRef}\n id={`${rootId}-view`}\n tabIndex={0}\n aria-live={playing ? \"off\" : \"polite\"}\n onPointerDown={onPointerDown}\n onKeyDown={(e) => {\n if (e.target !== e.currentTarget) return;\n const rtl = getComputedStyle(e.currentTarget).direction === \"rtl\";\n if (e.key === (rtl ? \"ArrowLeft\" : \"ArrowRight\")) (e.preventDefault(), next());\n if (e.key === (rtl ? \"ArrowRight\" : \"ArrowLeft\")) (e.preventDefault(), prev());\n if (e.key === \"Home\") (e.preventDefault(), goTo(0));\n if (e.key === \"End\") (e.preventDefault(), goTo(lastStart));\n }}\n onClick={(e) => {\n // Stories: tap the left third to go back, anywhere else to go forward.\n if (!stories || (e.target as HTMLElement).closest(\"a,button,input,select,textarea,label\")) return;\n const r = e.currentTarget.getBoundingClientRect();\n if (e.clientX - r.left < r.width / 3) prev();\n else next();\n }}\n className={cn(\n \"flex min-w-0 overflow-x-auto overscroll-x-contain [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\",\n \"rounded-card outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n dragging ? \"cursor-grabbing select-none snap-none\" : \"snap-x snap-mandatory\",\n !stories && \"cursor-grab [@media(hover:none)]:cursor-auto\"\n )}\n style={{ gap, scrollPaddingInline: centered ? peekPx : 0, paddingInline: centered ? peekPx : 0 }}\n >\n {slides.map((s, i) => (\n <div\n key={s.key ?? i}\n ref={(el) => {\n slideRefs.current[i] = el;\n }}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={s.props.label ?? `${i + 1} of ${count}`}\n className={cn(\n \"shrink-0 transition-[transform,opacity] duration-100 ease-out\",\n centered ? \"snap-center\" : \"snap-start\",\n effect === \"coverflow\" && \"will-change-transform\"\n )}\n style={{ flexBasis: slideBasis, width: slideBasis }}\n onClick={() => {\n if (centered && i !== indexRef.current && !stories) goTo(i);\n }}\n >\n {s}\n </div>\n ))}\n </div>\n {controls === \"overlay\" && count > 1 && (\n <>\n {navButton(\"prev\", true)}\n {navButton(\"next\", true)}\n </>\n )}\n </div>\n\n {/* Indicators and controls under the slides */}\n {(indicators !== \"none\" && !stories) || controls === \"below\" || (autoplayOn && !stories) ? (\n <div className=\"flex min-w-0 items-center justify-center gap-3\">\n {controls === \"below\" && navButton(\"prev\", false)}\n {indicators === \"dots\" && pages > 1 && (\n <div className=\"flex items-center gap-1.5\" role=\"group\" aria-label=\"Choose slide\">\n {Array.from({ length: pages }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n aria-label={`Go to slide ${i + 1}`}\n aria-current={i === index ? \"true\" : undefined}\n onClick={() => goTo(i)}\n className={cn(\n \"relative h-2 cursor-pointer overflow-hidden rounded-full outline-none transition-[width,background-color] duration-300 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n i === index ? \"w-6 bg-border-strong\" : \"w-2 bg-border-strong/70 hover:bg-fg-muted\"\n )}\n >\n {i === index && (\n <span\n key={cycle}\n className=\"absolute inset-0 origin-left rounded-full bg-primary\"\n style={autoplayOn ? { animation: `ui-toast-timer ${autoplay}ms linear reverse both`, animationPlayState: playing ? \"running\" : \"paused\" } : undefined}\n />\n )}\n </button>\n ))}\n </div>\n )}\n {indicators === \"counter\" && (\n <p className=\"min-w-12 text-center text-sm tabular-nums text-fg-muted\" aria-live=\"polite\">\n <span className=\"font-semibold text-fg\">{index + 1}</span> / {pages}\n </p>\n )}\n {indicators === \"thumbnails\" && (\n <div className=\"flex min-w-0 gap-2 overflow-x-auto p-1 [scrollbar-width:none]\" role=\"group\" aria-label=\"Choose slide\">\n {slides.map((s, i) => (\n <button\n key={i}\n type=\"button\"\n aria-label={s.props.label ? `Show ${s.props.label}` : `Go to slide ${i + 1}`}\n aria-current={i === index ? \"true\" : undefined}\n onClick={() => goTo(i)}\n className={cn(\n \"size-14 shrink-0 cursor-pointer overflow-hidden rounded-control outline-none ring-offset-2 ring-offset-bg transition-[opacity,box-shadow] duration-200 focus-visible:ring-2 focus-visible:ring-ring\",\n i === index ? \"opacity-100 ring-2 ring-primary\" : \"opacity-55 hover:opacity-90\"\n )}\n >\n {s.props.thumbnail ?? <span className=\"grid size-full place-items-center bg-secondary-hover text-xs\">{i + 1}</span>}\n </button>\n ))}\n </div>\n )}\n {controls === \"below\" && navButton(\"next\", false)}\n {pauseButton}\n </div>\n ) : null}\n {stories && autoplayOn && <div className=\"flex justify-center\">{pauseButton}</div>}\n </section>\n );\n});\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"./Button\";\n\n/*\n * IconButton — the icon itself is the button (heart, bookmark, bell, trash…).\n *\n * Press feedback: the icon squishes while held and a ripple spreads out from it (keyboard presses\n * too). As a toggle it swaps to a filled icon, pops, and throws a small burst of particles when\n * turned on. Small sizes get a finger-sized invisible tap area on touch screens.\n */\n\nexport type IconButtonTone = \"neutral\" | \"primary\" | \"secondary\" | \"tertiary\" | \"success\" | \"warning\" | \"danger\" | \"info\" | (string & {});\n\nexport interface IconButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"color\"> {\n /** The icon: an element (<svg>) or an icon-font class like \"bi bi-heart\". */\n icon: IconInput;\n /** What it does, e.g. \"Like\" or \"Delete invoice\". Required: it's the only text a screen reader gets. Also shown as a tooltip. */\n label: string;\n /** \"plain\" (just the icon; a soft halo on hover — default), \"soft\" (tinted circle) or \"solid\". */\n variant?: \"plain\" | \"soft\" | \"solid\";\n tone?: IconButtonTone;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n shape?: \"circle\" | \"square\";\n /** Make it a toggle (like, bookmark, star): aria-pressed, and pressedIcon while on. */\n pressed?: boolean;\n defaultPressed?: boolean;\n onPressedChange?: (pressed: boolean) => void;\n /** Icon while pressed, e.g. the filled version: \"bi bi-heart-fill\". */\n pressedIcon?: IconInput;\n /** A burst of particles when turned on. Default true for toggles. */\n burst?: boolean;\n /** A count or dot in the corner: a number (99+ above 99) or true for a dot. */\n badge?: number | boolean;\n /** Show a spinner instead of the icon. Return a Promise from onClick to get this automatically. */\n loading?: boolean;\n /** Render as a link. */\n href?: string;\n /** Show the label as a tooltip on hover (the browser's own). Default true. */\n tooltip?: boolean;\n onClick?: (event: React.MouseEvent<HTMLElement>) => unknown;\n}\n\nconst tones: Record<string, [string, string]> = {\n neutral: [\"var(--color-fg)\", \"var(--color-bg)\"],\n primary: [\"var(--color-primary)\", \"var(--color-primary-fg)\"],\n secondary: [\"var(--color-tone-secondary)\", \"var(--color-tone-secondary-fg)\"],\n tertiary: [\"var(--color-tone-tertiary)\", \"var(--color-tone-tertiary-fg)\"],\n success: [\"var(--color-success)\", \"var(--color-success-fg)\"],\n warning: [\"var(--color-warning)\", \"var(--color-warning-fg)\"],\n danger: [\"var(--color-danger)\", \"var(--color-danger-fg)\"],\n info: [\"var(--color-info)\", \"var(--color-info-fg)\"],\n};\n\nconst sizes = {\n xs: { box: 28, icon: 14, badge: \"min-w-3.5 h-3.5 text-[0.5625rem]\" },\n sm: { box: 32, icon: 16, badge: \"min-w-4 h-4 text-[0.625rem]\" },\n md: { box: 40, icon: 20, badge: \"min-w-[1.125rem] h-[1.125rem] text-[0.625rem]\" },\n lg: { box: 48, icon: 24, badge: \"min-w-5 h-5 text-[0.6875rem]\" },\n xl: { box: 56, icon: 28, badge: \"min-w-5 h-5 text-xs\" },\n} as const;\n\nconst isPromise = (v: unknown): v is Promise<unknown> => !!v && typeof (v as Promise<unknown>).then === \"function\";\n\nexport const IconButton = React.forwardRef<HTMLElement, IconButtonProps>(function IconButton(\n {\n icon,\n label,\n variant = \"plain\",\n tone = \"neutral\",\n size = \"md\",\n shape = \"circle\",\n pressed: pressedProp,\n defaultPressed,\n onPressedChange,\n pressedIcon,\n burst,\n badge,\n loading: loadingProp = false,\n href,\n tooltip = true,\n disabled,\n onClick,\n onPointerDown,\n onKeyDown,\n className,\n style,\n type = \"button\",\n ...props\n },\n ref\n) {\n const isToggle = pressedProp !== undefined || defaultPressed !== undefined || onPressedChange !== undefined;\n const [innerPressed, setInnerPressed] = React.useState(!!defaultPressed);\n const pressed = pressedProp ?? innerPressed;\n const [busy, setBusy] = React.useState(false);\n const loading = loadingProp || busy;\n const [ripple, setRipple] = React.useState(0);\n const [pop, setPop] = React.useState(0);\n const [reduced, setReduced] = React.useState(false);\n React.useEffect(() => {\n const q = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\");\n if (q) setReduced(q.matches);\n }, []);\n\n const [color, onColor] = tones[tone] ?? [tone, \"#ffffff\"];\n const s = sizes[size];\n const showBurst = (burst ?? isToggle) && !reduced;\n const off = disabled || loading;\n\n const feedback = () => {\n if (!reduced) setRipple((r) => r + 1);\n };\n\n const handleClick = (e: React.MouseEvent<HTMLElement>) => {\n if (off) {\n e.preventDefault();\n return;\n }\n if (isToggle) {\n const next = !pressed;\n if (pressedProp === undefined) setInnerPressed(next);\n onPressedChange?.(next);\n if (next) setPop((p) => p + 1);\n }\n const r = onClick?.(e);\n if (isPromise(r)) {\n setBusy(true);\n r.finally(() => setBusy(false));\n }\n };\n\n const currentIcon = pressed && pressedIcon ? pressedIcon : icon;\n const active = isToggle && pressed;\n\n const classes = cn(\n \"group/ib relative inline-grid shrink-0 cursor-pointer select-none place-items-center outline-none\",\n \"transition-[background-color,color,box-shadow] duration-150\",\n \"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\",\n shape === \"circle\" ? \"rounded-full\" : \"rounded-control\",\n // Small buttons: an invisible finger-sized tap area on touch screens.\n s.box < 44 && \"[@media(pointer:coarse)]:before:absolute [@media(pointer:coarse)]:before:-inset-[calc((44px-100%)/2)] [@media(pointer:coarse)]:before:content-['']\",\n variant === \"plain\" && cn(\n active ? \"text-[color:var(--ib)]\" : tone === \"neutral\" ? \"text-fg-muted hover:text-fg\" : \"text-[color:var(--ib)]\",\n \"hover:bg-[color:color-mix(in_srgb,var(--ib)_10%,transparent)]\"\n ),\n variant === \"soft\" && cn(\n \"text-[color:var(--ib)] bg-[color:color-mix(in_srgb,var(--ib)_12%,transparent)] hover:bg-[color:color-mix(in_srgb,var(--ib)_18%,transparent)]\",\n active && \"bg-[color:color-mix(in_srgb,var(--ib)_22%,transparent)]\"\n ),\n variant === \"solid\" && cn(\n \"bg-[color:var(--ib)] text-[color:var(--ib-fg)] shadow-[inset_0_-2px_0_rgb(0_0_0/0.18)] hover:brightness-110\",\n \"active:shadow-[inset_0_-1px_0_rgb(0_0_0/0.18)]\"\n ),\n off && \"cursor-not-allowed opacity-50 hover:bg-transparent\",\n className\n );\n\n const inner = (\n <>\n {/* The ripple: a soft circle that spreads from the icon on each press. */}\n {ripple > 0 && (\n <span\n key={ripple}\n aria-hidden=\"true\"\n className={cn(\"pointer-events-none absolute inset-0\", shape === \"circle\" ? \"rounded-full\" : \"rounded-control\")}\n style={{ background: variant === \"solid\" ? \"rgb(255 255 255 / 0.5)\" : \"var(--ib)\", animation: \"ui-icon-ripple 450ms cubic-bezier(0.2,0.8,0.3,1) forwards\" }}\n />\n )}\n {/* The burst: little dots flying out when a toggle turns on. */}\n {showBurst && pop > 0 && (\n <span key={`b${pop}`} aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 grid place-items-center\">\n {Array.from({ length: 8 }, (_, i) => (\n <span\n key={i}\n className=\"absolute size-[3px] rounded-full\"\n style={{\n background: i % 2 ? \"var(--ib)\" : \"color-mix(in srgb, var(--ib) 55%, #ffffff)\",\n [\"--a\" as string]: `${i * 45 + 22}deg`,\n [\"--d\" as string]: `${s.box * 0.62}px`,\n animation: `ui-icon-burst 520ms cubic-bezier(0.2,0.8,0.3,1) ${i % 2 ? 40 : 0}ms forwards`,\n }}\n />\n ))}\n </span>\n )}\n {/* The icon: squishes while held, pops when a toggle turns on. */}\n <span\n key={`i${pop}`}\n aria-hidden=\"true\"\n className={cn(\n \"relative grid place-items-center transition-transform duration-150 ease-out [&_svg]:size-full [&_i]:leading-none\",\n !off && \"group-active/ib:scale-[0.82] group-active/ib:duration-75 motion-reduce:group-active/ib:scale-100\"\n )}\n style={{ width: s.icon, height: s.icon, fontSize: s.icon, ...(pop && !reduced ? { animation: \"ui-icon-pop 420ms cubic-bezier(0.3,1.2,0.5,1)\" } : {}) }}\n >\n {loading ? (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" className=\"animate-spin\" aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"2\" />\n <path d=\"M14 8a6 6 0 0 0-6-6\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n ) : (\n renderIcon(currentIcon)\n )}\n </span>\n {badge !== undefined && badge !== false && badge !== 0 && (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute -end-0.5 -top-0.5 grid place-items-center rounded-full bg-danger font-semibold tabular-nums leading-none text-danger-fg ring-2 ring-[color:var(--color-bg)]\",\n badge === true ? \"size-2.5\" : cn(\"px-1\", s.badge)\n )}\n >\n {badge === true ? null : badge > 99 ? \"99+\" : badge}\n </span>\n )}\n </>\n );\n\n const badgeText = typeof badge === \"number\" && badge > 0 ? `, ${badge > 99 ? \"more than 99\" : badge} new` : badge === true ? \", new\" : \"\";\n const common = {\n \"aria-label\": label + badgeText,\n title: tooltip ? label : undefined,\n className: classes,\n style: { width: s.box, height: s.box, [\"--ib\" as string]: color, [\"--ib-fg\" as string]: onColor, ...style },\n onPointerDown: (e: React.PointerEvent<HTMLElement>) => {\n (onPointerDown as React.PointerEventHandler<HTMLElement> | undefined)?.(e as React.PointerEvent<HTMLButtonElement>);\n if (!off) feedback();\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => {\n (onKeyDown as React.KeyboardEventHandler<HTMLElement> | undefined)?.(e as React.KeyboardEvent<HTMLButtonElement>);\n // Keyboard presses get the same ripple as a tap.\n if (!off && !e.repeat && (e.key === \"Enter\" || e.key === \" \")) feedback();\n },\n onClick: handleClick,\n };\n\n if (href) {\n return (\n <a ref={ref as React.Ref<HTMLAnchorElement>} href={off ? undefined : href} aria-disabled={off || undefined} {...common} {...(props as React.AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {inner}\n </a>\n );\n }\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type={type}\n disabled={disabled}\n aria-pressed={isToggle ? pressed : undefined}\n aria-busy={loading || undefined}\n {...common}\n {...props}\n >\n {inner}\n </button>\n );\n});\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/*\n * SpotlightText — text lit by a moving spotlight.\n *\n * The text is drawn twice: a dim base layer (the real, readable text) and a bright copy on top that\n * is masked to a soft circle — the spotlight. The circle's position is driven by a small animation\n * loop that eases toward its target: the pointer (\"follow\"), a passing beam (\"sweep\"), or the\n * pointer over nearly-invisible text (\"reveal\"). Pauses off-screen; reduced motion shows it fully lit.\n */\n\nexport interface SpotlightTextProps extends React.HTMLAttributes<HTMLElement> {\n /** \"follow\" (default): follows the pointer, drifts on its own when idle. \"sweep\": a beam passes every few seconds. \"reveal\": dark until lit. */\n mode?: \"follow\" | \"sweep\" | \"reveal\";\n /** The element to render. Default \"span\"; use \"h1\", \"h2\", \"p\"… for real headings and paragraphs. */\n as?: React.ElementType;\n /** Spotlight radius in px. Default: about the text's size (at least 60px). */\n radius?: number;\n /** Color of the lit text: any CSS color, or a gradient like \"linear-gradient(90deg, #0d6efd, #db2777)\". Default: the text's own color. */\n tint?: string;\n /** How visible the unlit text is, 0–1. Default 0.4 (0.08 for reveal). */\n dim?: number;\n /** A soft glow around the lit letters. Default true. */\n glow?: boolean;\n /**\n * How fast the light moves: \"slow\", \"normal\" (default) or \"fast\" — or ms for one pass.\n * \"fast\" makes a quick shimmer that suits status messages (\"Syncing…\").\n */\n speed?: \"slow\" | \"normal\" | \"fast\" | number;\n /** For sweep: ms for one pass (overrides speed). */\n duration?: number;\n /** For sweep: pause between passes in ms (overrides speed). */\n pause?: number;\n /** How closely it follows the pointer, 0–1 (1 = instantly). Default 0.14 — a smooth trail. */\n smoothing?: number;\n}\n\nexport function SpotlightText({\n mode = \"follow\",\n as: Tag = \"span\",\n radius,\n tint,\n dim,\n glow = true,\n speed = \"normal\",\n duration: durationProp,\n pause: pauseProp,\n smoothing = 0.14,\n className,\n style,\n children,\n ...props\n}: SpotlightTextProps) {\n // Speed presets: one pass and the rest between passes. \"fast\" is a quick status shimmer.\n const presets = { slow: [3400, 1800], normal: [2200, 1400], fast: [950, 250] } as const;\n const [presetPass, presetRest] = typeof speed === \"number\" ? [speed, Math.round(speed * 0.35)] : presets[speed];\n const duration = durationProp ?? presetPass;\n const pause = pauseProp ?? presetRest;\n const ref = React.useRef<HTMLElement>(null);\n const [reduced, setReduced] = React.useState(false);\n const target = React.useRef<{ x: number; y: number } | null>(null);\n const reveal = mode === \"reveal\";\n\n React.useEffect(() => {\n const q = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\");\n if (!q) return;\n setReduced(q.matches);\n const on = () => setReduced(q.matches);\n q.addEventListener?.(\"change\", on);\n return () => q.removeEventListener?.(\"change\", on);\n }, []);\n\n React.useEffect(() => {\n const el = ref.current;\n if (!el || reduced) return;\n let raf = 0;\n let visible = true;\n const cur = { x: -9999, y: 0, r: 0 };\n const start = performance.now();\n\n const io = typeof IntersectionObserver !== \"undefined\" ? new IntersectionObserver(([e]) => {\n visible = e.isIntersecting;\n if (visible && !raf) raf = requestAnimationFrame(tick);\n }) : null;\n io?.observe(el);\n\n function tick(now: number) {\n raf = 0;\n if (!el || !visible) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const fontSize = parseFloat(getComputedStyle(el).fontSize) || 16;\n const r = radius ?? Math.max(60, fontSize * 2.2);\n let tx: number;\n let ty: number;\n let tr = r;\n const p = target.current;\n if (p && mode !== \"sweep\") {\n tx = p.x;\n ty = p.y;\n } else if (mode === \"sweep\" || mode === \"follow\") {\n // A beam passing left to right (follow: a slower, gentler drift while idle).\n const pass = mode === \"sweep\" ? duration : duration * 2.2;\n const rest = mode === \"sweep\" ? pause : 300;\n const t = ((now - start) % (pass + rest)) / pass;\n tx = t <= 1 ? -r + t * (w + r * 2) : w + r * 2;\n ty = h / 2 + (mode === \"follow\" ? Math.sin((now - start) / 900) * h * 0.15 : 0);\n if (t > 1) tr = r; // resting off to the right\n } else {\n // reveal, idle: a small glimmer drifting slowly so there's a hint of what's hidden\n tx = w / 2 + Math.sin((now - start) / 1700) * w * 0.4;\n ty = h / 2 + Math.cos((now - start) / 1300) * h * 0.2;\n tr = r * 0.55;\n }\n // Jump straight to the first position; ease after that.\n const k = cur.x < -9000 ? 1 : mode === \"sweep\" && !p ? 1 : smoothing;\n cur.x += (tx - cur.x) * k;\n cur.y += (ty - cur.y) * k;\n cur.r += (tr - cur.r) * Math.min(1, k * 1.5);\n el.style.setProperty(\"--spot-x\", `${cur.x.toFixed(1)}px`);\n el.style.setProperty(\"--spot-y\", `${cur.y.toFixed(1)}px`);\n el.style.setProperty(\"--spot-r\", `${cur.r.toFixed(1)}px`);\n raf = requestAnimationFrame(tick);\n }\n raf = requestAnimationFrame(tick);\n return () => {\n cancelAnimationFrame(raf);\n io?.disconnect();\n };\n }, [mode, radius, duration, pause, smoothing, reduced]);\n\n const aim = (e: React.PointerEvent<HTMLElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n target.current = { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n // Default to the text's own color (currentColor), so it works on any background — even a dark\n // section inside a light page.\n const lit = tint ?? \"currentColor\";\n const isGradient = /gradient\\(/.test(lit);\n const dimLevel = dim ?? (reveal ? 0.08 : 0.4);\n const mask = \"radial-gradient(circle var(--spot-r, 0px) at var(--spot-x, -999px) var(--spot-y, 50%), #000 0%, #000 35%, transparent 100%)\";\n\n if (reduced) {\n // No motion: simply show the text fully lit.\n return (\n <Tag className={cn(className)} style={{ ...(isGradient ? { backgroundImage: lit, backgroundClip: \"text\", WebkitBackgroundClip: \"text\", color: \"transparent\" } : { color: lit }), ...style }} {...props}>\n {children}\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref}\n className={cn(\"relative inline-block\", className)}\n style={style}\n onPointerMove={mode !== \"sweep\" ? aim : undefined}\n onPointerDown={mode !== \"sweep\" ? aim : undefined}\n onPointerLeave={() => (target.current = null)}\n {...props}\n >\n {/* The real text, dim (in reveal mode it's visible only faintly). */}\n <span style={{ opacity: dimLevel }}>{children}</span>\n {/* The lit copy, masked to the spotlight. Decorative, so screen readers skip it. */}\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 select-none\"\n style={{\n WebkitMaskImage: mask,\n maskImage: mask,\n ...(isGradient\n ? { backgroundImage: lit, backgroundClip: \"text\", WebkitBackgroundClip: \"text\", color: \"transparent\", backgroundSize: \"100% 100%\" }\n : { color: lit }),\n filter: glow\n ? `drop-shadow(0 0 ${reveal ? 14 : 10}px color-mix(in srgb, ${isGradient ? \"var(--ui-primary)\" : lit} 55%, transparent))`\n : undefined,\n }}\n >\n {children}\n </span>\n </Tag>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Skeleton, type SkeletonProps } from \"../activity/Activity\";\n\n/*\n * Skeleton pieces and whole-block presets, plus SkeletonSwap — which shows the skeleton only when\n * loading actually takes a moment, and keeps it up long enough to be read, so nothing flashes.\n *\n * <SkeletonSwap loading={isLoading} skeleton={<SkeletonCard />}><Invoice … /></SkeletonSwap>\n */\n\ntype Anim = SkeletonProps[\"animation\"];\ntype Common = { animation?: Anim; className?: string };\n\n/* ---------- pieces ---------- */\n\nexport interface SkeletonTextProps extends Common {\n /** How many lines. Default 3. */\n lines?: number;\n /** Width of the last line. Default \"62%\". */\n lastLineWidth?: string;\n /** Line thickness, e.g. \"0.75rem\" for bigger text. */\n lineHeight?: string;\n width?: string | number;\n}\n\n/** Lines of text, with a shorter last line and a gentle ripple down the stack. */\nexport function SkeletonText({ lines = 3, lastLineWidth = \"62%\", lineHeight, width, animation, className }: SkeletonTextProps) {\n return (\n <div aria-hidden=\"true\" className={cn(\"grid w-full gap-2\", className)} style={width !== undefined ? { width } : undefined}>\n {Array.from({ length: lines }, (_, i) => (\n <Skeleton\n key={i}\n shape=\"line\"\n animation={animation}\n delay={i * 90}\n style={{ width: i === lines - 1 && lines > 1 ? lastLineWidth : \"100%\", ...(lineHeight ? { height: lineHeight } : {}) }}\n />\n ))}\n </div>\n );\n}\n\nexport interface SkeletonAvatarProps extends Common {\n /** Matches the Avatar sizes. */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\";\n shape?: \"circle\" | \"square\";\n}\nconst avatarPx = { xs: 24, sm: 32, md: 40, lg: 48, xl: 64, \"2xl\": 80 } as const;\n\n/** A round (or square) placeholder for a profile picture. */\nexport function SkeletonAvatar({ size = \"md\", shape = \"circle\", animation, className }: SkeletonAvatarProps) {\n const px = avatarPx[size];\n return <Skeleton shape={shape === \"circle\" ? \"circle\" : \"rect\"} animation={animation} width={px} height={px} className={className} />;\n}\n\nexport interface SkeletonButtonProps extends Common {\n size?: \"sm\" | \"md\" | \"lg\";\n width?: number | string;\n}\n/** A button-shaped placeholder. */\nexport function SkeletonButton({ size = \"md\", width = 104, animation, className }: SkeletonButtonProps) {\n const h = size === \"sm\" ? 32 : size === \"lg\" ? 48 : 40;\n return <Skeleton animation={animation} width={width} height={h} radius=\"var(--radius-control)\" className={className} />;\n}\n\nexport interface SkeletonImageProps extends Common {\n /** e.g. \"16/9\" (default), \"1/1\", \"4/3\". */\n ratio?: string;\n radius?: string;\n}\n/** A picture-shaped placeholder that keeps its aspect ratio. */\nexport function SkeletonImage({ ratio = \"16/9\", radius = \"var(--radius-card)\", animation, className }: SkeletonImageProps) {\n return <Skeleton animation={animation} radius={radius} className={cn(\"w-full\", className)} style={{ aspectRatio: ratio }} />;\n}\n\n/* ---------- block presets ---------- */\n\nexport interface SkeletonCardProps extends Common {\n /** Show a picture at the top. */\n media?: boolean;\n /** Show an avatar and two short lines in the header. */\n header?: boolean;\n lines?: number;\n /** Show buttons at the bottom. */\n footer?: boolean;\n}\n\n/** A card-shaped placeholder: optional picture, header, lines of text and buttons. */\nexport function SkeletonCard({ media = false, header = true, lines = 3, footer = false, animation, className }: SkeletonCardProps) {\n return (\n <div aria-hidden=\"true\" className={cn(\"grid gap-4 rounded-card border border-border bg-surface p-4\", className)}>\n {media && <SkeletonImage animation={animation} />}\n {header && (\n <div className=\"flex items-center gap-3\">\n <SkeletonAvatar size=\"md\" animation={animation} />\n <div className=\"grid flex-1 gap-2\">\n <Skeleton shape=\"line\" animation={animation} style={{ width: \"45%\" }} />\n <Skeleton shape=\"line\" animation={animation} delay={90} style={{ width: \"28%\", height: \"0.625rem\" }} />\n </div>\n </div>\n )}\n {lines > 0 && <SkeletonText lines={lines} animation={animation} />}\n {footer && (\n <div className=\"flex gap-2\">\n <SkeletonButton size=\"sm\" animation={animation} />\n <SkeletonButton size=\"sm\" width={84} animation={animation} />\n </div>\n )}\n </div>\n );\n}\n\nexport interface SkeletonListProps extends Common {\n /** How many rows. Default 5. */\n rows?: number;\n /** An avatar at the start of each row. Default true. */\n avatar?: boolean;\n /** A value at the end of each row (amount, date). Default true. */\n trailing?: boolean;\n /** Put a border and dividers around it. Default true. */\n bordered?: boolean;\n}\n\n/** Rows of a list: avatar, two lines, and a value on the right. */\nexport function SkeletonList({ rows = 5, avatar = true, trailing = true, bordered = true, animation, className }: SkeletonListProps) {\n return (\n <div aria-hidden=\"true\" className={cn(\"grid\", bordered && \"divide-y divide-border rounded-card border border-border bg-surface\", className)}>\n {Array.from({ length: rows }, (_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-4 py-3\">\n {avatar && <SkeletonAvatar size=\"sm\" animation={animation} />}\n <div className=\"grid flex-1 gap-2\">\n <Skeleton shape=\"line\" animation={animation} delay={i * 70} style={{ width: `${55 + ((i * 13) % 30)}%` }} />\n <Skeleton shape=\"line\" animation={animation} delay={i * 70 + 90} style={{ width: `${28 + ((i * 17) % 22)}%`, height: \"0.625rem\" }} />\n </div>\n {trailing && <Skeleton shape=\"line\" animation={animation} delay={i * 70} style={{ width: 64 }} />}\n </div>\n ))}\n </div>\n );\n}\n\nexport interface SkeletonTableProps extends Common {\n rows?: number;\n columns?: number;\n /** Show a header row. Default true. */\n header?: boolean;\n}\n\n/** A table-shaped placeholder that matches DataTable's rhythm. */\nexport function SkeletonTable({ rows = 5, columns = 4, header = true, animation, className }: SkeletonTableProps) {\n const cols = `repeat(${columns}, minmax(0, 1fr))`;\n return (\n <div aria-hidden=\"true\" className={cn(\"overflow-hidden rounded-card border border-border bg-surface\", className)}>\n {header && (\n <div className=\"grid gap-4 border-b border-border bg-secondary-hover/40 px-4 py-3\" style={{ gridTemplateColumns: cols }}>\n {Array.from({ length: columns }, (_, i) => (\n <Skeleton key={i} shape=\"line\" animation={animation} style={{ width: i === 0 ? \"60%\" : \"45%\", height: \"0.625rem\" }} />\n ))}\n </div>\n )}\n <div className=\"divide-y divide-border\">\n {Array.from({ length: rows }, (_, r) => (\n <div key={r} className=\"grid gap-4 px-4 py-3.5\" style={{ gridTemplateColumns: cols }}>\n {Array.from({ length: columns }, (_, c) => (\n <Skeleton key={c} shape=\"line\" animation={animation} delay={r * 70 + c * 30} style={{ width: c === 0 ? \"80%\" : `${45 + ((r * 11 + c * 7) % 35)}%` }} />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n}\n\nexport interface SkeletonChartProps extends Common {\n /** \"bars\" (default) or \"line\". */\n variant?: \"bars\" | \"line\";\n height?: number;\n bars?: number;\n}\n\n/** A chart-shaped placeholder for dashboard widgets. */\nexport function SkeletonChart({ variant = \"bars\", height = 180, bars = 8, animation, className }: SkeletonChartProps) {\n const heights = [52, 74, 61, 88, 70, 95, 66, 80, 58, 90, 72, 84];\n return (\n <div aria-hidden=\"true\" className={cn(\"grid gap-3\", className)} style={{ height }}>\n {variant === \"bars\" ? (\n <div className=\"flex items-end gap-2\">\n {Array.from({ length: bars }, (_, i) => (\n <Skeleton key={i} animation={animation} delay={i * 60} radius=\"0.375rem 0.375rem 0 0\" className=\"flex-1\" style={{ height: `${heights[i % heights.length]}%` }} />\n ))}\n </div>\n ) : (\n <div className=\"relative w-full overflow-hidden rounded-card\">\n <Skeleton animation={animation} className=\"size-full\" radius=\"var(--radius-card)\" />\n </div>\n )}\n <div className=\"flex justify-between\">\n {Array.from({ length: 4 }, (_, i) => (\n <Skeleton key={i} shape=\"line\" animation={animation} delay={i * 60} style={{ width: 36, height: \"0.5rem\" }} />\n ))}\n </div>\n </div>\n );\n}\n\n/* ---------- SkeletonSwap ---------- */\n\nexport interface UseDelayedLoadingOptions {\n /** Wait this long before showing the skeleton, so quick loads never flash one. Default 180ms. */\n delay?: number;\n /** Once shown, keep it at least this long, so it isn't a blink. Default 500ms. */\n minDuration?: number;\n}\n\n/**\n * Turns a raw loading flag into one that's pleasant to look at: nothing for quick loads,\n * and no half-frame flicker for slow ones.\n */\nexport function useDelayedLoading(loading: boolean, { delay = 180, minDuration = 500 }: UseDelayedLoadingOptions = {}) {\n const [show, setShow] = React.useState(false);\n const shownAt = React.useRef(0);\n React.useEffect(() => {\n let t: number;\n if (loading) {\n t = window.setTimeout(() => {\n shownAt.current = Date.now();\n setShow(true);\n }, delay);\n } else if (show) {\n const left = Math.max(0, minDuration - (Date.now() - shownAt.current));\n t = window.setTimeout(() => setShow(false), left);\n }\n return () => window.clearTimeout(t);\n }, [loading, delay, minDuration, show]);\n return show;\n}\n\nexport interface SkeletonSwapProps extends UseDelayedLoadingOptions, React.HTMLAttributes<HTMLDivElement> {\n loading: boolean;\n /** What to show while loading, e.g. <SkeletonCard />. */\n skeleton: React.ReactNode;\n /** What's being loaded, for screen readers: \"Loading invoices\". */\n label?: string;\n /** Cross-fade in ms. Default 250. */\n fade?: number;\n}\n\n/** Shows a skeleton while loading, then cross-fades to the real content. */\nexport function SkeletonSwap({ loading, skeleton, label = \"Loading\", fade = 250, delay, minDuration, className, children, ...props }: SkeletonSwapProps) {\n const show = useDelayedLoading(loading, { delay, minDuration });\n return (\n <div className={cn(\"relative min-w-0\", className)} aria-busy={show || undefined} {...props}>\n {show ? (\n <div role=\"status\" className=\"motion-safe:animate-[ui-fade-in_200ms_ease-out]\" style={{ transitionDuration: `${fade}ms` }}>\n {skeleton}\n <span className=\"sr-only\">{label}…</span>\n </div>\n ) : (\n <div className=\"motion-safe:animate-[ui-fade-in_var(--swap-fade)_ease-out]\" style={{ [\"--swap-fade\" as string]: `${fade}ms` }}>\n {children}\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button } from \"../button/Button\";\nimport { useField, useFieldControlProps } from \"../input/Field\";\n\n/*\n * SignaturePad — draw a signature with a finger, stylus or mouse.\n *\n * The ink thickens and thins with speed (and with stylus pressure where the device reports it),\n * and strokes are smoothed through their midpoints, so it looks like a pen rather than a polyline.\n * Strokes are kept as points, so the drawing is redrawn crisply on resize and on high-resolution\n * screens, undo works stroke by stroke, and it can be exported as PNG or as vector SVG for print.\n */\n\ntype Point = { x: number; y: number; t: number; p: number };\ntype Stroke = { points: Point[]; color: string; widths: number[] };\n\nexport interface SignaturePadHandle {\n /** Wipe it. */\n clear: () => void;\n /** Remove the last stroke. */\n undo: () => void;\n isEmpty: () => boolean;\n /**\n * PNG (or another type) as a data URL. trim crops the empty space around the signature;\n * ink forces a color (store dark ink even when someone signs in dark mode).\n */\n toDataURL: (options?: { type?: string; quality?: number; trim?: boolean; background?: string; scale?: number; ink?: string }) => string;\n /** Vector SVG — sharp at any size, ideal for PDFs and print. */\n toSVG: (options?: { trim?: boolean; background?: string; ink?: string }) => string;\n /** Load a saved PNG back in (for viewing; undo won't know its strokes). */\n fromDataURL: (dataUrl: string) => Promise<void>;\n canvas: HTMLCanvasElement | null;\n}\n\nexport interface SignaturePadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** Called whenever the drawing changes: a PNG data URL, or null when empty. */\n onChange?: (dataUrl: string | null) => void;\n onBegin?: () => void;\n onEnd?: () => void;\n /** Ink color. Default: the text color. */\n penColor?: string;\n /** Thinnest and thickest the ink gets, in px. Default [0.9, 2.6]. */\n penWidth?: [number, number];\n /** Height of the pad in px. Default 200. */\n height?: number;\n /** Background behind the ink. Default transparent (the card's own background shows through). */\n background?: string;\n /** The signing line and hint inside the pad. Default true. */\n guide?: boolean;\n /** Text next to the ✗ on the line. Default \"Sign here\". */\n guideLabel?: string;\n /** Clear and Undo buttons under the pad. Default true. */\n toolbar?: boolean;\n /** Extra buttons beside Clear and Undo. */\n actions?: React.ReactNode;\n /** Show a saved signature and don't allow drawing. */\n readOnly?: boolean;\n disabled?: boolean;\n /** A saved PNG to start from. */\n defaultValue?: string;\n /** Posts the signature (a PNG data URL) with the form. */\n name?: string;\n /**\n * Offer a \"Type\" tab that renders a typed name in a handwriting font — the accessible\n * alternative for people who can't draw with a mouse or finger.\n */\n allowTyped?: boolean;\n /** Font for typed signatures. */\n typedFont?: string;\n}\n\nconst dist = (a: Point, b: Point) => Math.hypot(b.x - a.x, b.y - a.y);\n\nexport const SignaturePad = React.forwardRef<SignaturePadHandle, SignaturePadProps>(function SignaturePad(\n {\n onChange,\n onBegin,\n onEnd,\n penColor,\n penWidth = [0.9, 2.6],\n height = 200,\n background,\n guide = true,\n guideLabel = \"Sign here\",\n toolbar = true,\n actions,\n readOnly = false,\n disabled: disabledProp,\n defaultValue,\n name,\n allowTyped = false,\n typedFont = '\"Segoe Script\", \"Bradley Hand\", \"Snell Roundhand\", \"Apple Chancery\", cursive',\n className,\n ...props\n },\n ref\n) {\n const field = useField();\n const control = useFieldControlProps({ disabled: disabledProp });\n const disabled = !!control.disabled || readOnly;\n const wrapRef = React.useRef<HTMLDivElement>(null);\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n const strokes = React.useRef<Stroke[]>([]);\n const current = React.useRef<Stroke | null>(null);\n const image = React.useRef<HTMLImageElement | null>(null); // a loaded PNG (from defaultValue / fromDataURL)\n const [empty, setEmpty] = React.useState(true);\n const [size, setSize] = React.useState({ w: 0, h: height });\n const [mode, setMode] = React.useState<\"draw\" | \"type\">(\"draw\");\n const [typed, setTyped] = React.useState(\"\");\n const [dataUrl, setDataUrl] = React.useState<string>(\"\");\n const inkColor = penColor ?? \"var(--color-fg)\";\n\n // The canvas needs a real color, not \"var(…)\": take its own computed text color, which the\n // browser has already resolved (and which follows dark mode and any theme).\n const resolvedInk = () => {\n const el = canvasRef.current;\n return el ? getComputedStyle(el).color || \"#111\" : \"#111\";\n };\n\n /* ----- drawing ----- */\n const ctx = () => canvasRef.current?.getContext(\"2d\") ?? null;\n\n const redraw = React.useCallback(() => {\n const c = canvasRef.current;\n const g = ctx();\n if (!c || !g) return;\n const dpr = window.devicePixelRatio || 1;\n g.setTransform(dpr, 0, 0, dpr, 0, 0);\n g.clearRect(0, 0, c.width / dpr, c.height / dpr);\n if (background) {\n g.fillStyle = background;\n g.fillRect(0, 0, c.width / dpr, c.height / dpr);\n }\n if (image.current) g.drawImage(image.current, 0, 0, c.width / dpr, c.height / dpr);\n g.lineCap = \"round\";\n g.lineJoin = \"round\";\n for (const s of strokes.current) drawStroke(g, s);\n }, [background]);\n\n function drawStroke(g: CanvasRenderingContext2D, s: Stroke) {\n const pts = s.points;\n g.strokeStyle = s.color;\n if (pts.length === 1) {\n g.beginPath();\n g.arc(pts[0].x, pts[0].y, s.widths[0] / 2, 0, Math.PI * 2);\n g.fillStyle = s.color;\n g.fill();\n return;\n }\n // Curve through the midpoints, with the width easing between samples.\n for (let i = 1; i < pts.length; i++) {\n const a = pts[i - 1];\n const b = pts[i];\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n const prevMid = i === 1 ? a : { x: (pts[i - 2].x + a.x) / 2, y: (pts[i - 2].y + a.y) / 2 };\n g.beginPath();\n g.lineWidth = (s.widths[i - 1] + s.widths[i]) / 2;\n g.moveTo(prevMid.x, prevMid.y);\n g.quadraticCurveTo(a.x, a.y, mid.x, mid.y);\n g.stroke();\n }\n }\n\n const widthFor = (prev: Point | undefined, p: Point, lastWidth: number) => {\n const [min, max] = penWidth;\n if (p.p > 0 && p.p !== 0.5) return min + (max - min) * Math.min(1, p.p * 1.4); // stylus pressure\n if (!prev) return (min + max) / 2;\n const dt = Math.max(1, p.t - prev.t);\n const v = dist(prev, p) / dt; // px per ms\n const target = Math.max(min, max - v * 1.6);\n return lastWidth + (target - lastWidth) * 0.45; // ease, so the line doesn't jitter\n };\n\n /* ----- sizing (keeps the drawing crisp) ----- */\n React.useLayoutEffect(() => {\n const el = wrapRef.current;\n if (!el) return;\n const measure = () => {\n const w = Math.round(el.getBoundingClientRect().width);\n setSize((s) => (s.w === w ? s : { w, h: height }));\n };\n measure();\n const ro = typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(measure) : null;\n ro?.observe(el);\n return () => ro?.disconnect();\n }, [height]);\n\n React.useEffect(() => {\n const c = canvasRef.current;\n if (!c || !size.w) return;\n const dpr = window.devicePixelRatio || 1;\n c.width = Math.round(size.w * dpr);\n c.height = Math.round(size.h * dpr);\n c.style.width = `${size.w}px`;\n c.style.height = `${size.h}px`;\n redraw();\n }, [size, redraw]);\n\n /* ----- value ----- */\n const emit = React.useCallback(() => {\n const c = canvasRef.current;\n const isEmpty = strokes.current.length === 0 && !image.current;\n setEmpty(isEmpty);\n const url = isEmpty || !c ? \"\" : c.toDataURL(\"image/png\");\n setDataUrl(url);\n onChange?.(url || null);\n }, [onChange]);\n\n const pointFrom = (e: React.PointerEvent<HTMLCanvasElement>): Point => {\n const r = e.currentTarget.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top, t: performance.now(), p: e.pressure ?? 0 };\n };\n\n const onPointerDown = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (disabled || e.button !== 0) return;\n e.currentTarget.setPointerCapture(e.pointerId);\n const p = pointFrom(e);\n const w = widthFor(undefined, p, (penWidth[0] + penWidth[1]) / 2);\n current.current = { points: [p], color: resolvedInk(), widths: [w] };\n strokes.current.push(current.current);\n onBegin?.();\n redraw();\n };\n\n const onPointerMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const s = current.current;\n if (!s || disabled) return;\n const p = pointFrom(e);\n const prev = s.points[s.points.length - 1];\n if (dist(prev, p) < 1.1) return; // ignore tiny jitters\n s.widths.push(widthFor(prev, p, s.widths[s.widths.length - 1]));\n s.points.push(p);\n const g = ctx();\n if (!g) return;\n // Draw just the new bit, so long signatures stay smooth.\n const i = s.points.length - 1;\n const a = s.points[i - 1];\n const b = s.points[i];\n const mid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n const prevMid = i === 1 ? a : { x: (s.points[i - 2].x + a.x) / 2, y: (s.points[i - 2].y + a.y) / 2 };\n g.strokeStyle = s.color;\n g.lineCap = \"round\";\n g.lineJoin = \"round\";\n g.lineWidth = (s.widths[i - 1] + s.widths[i]) / 2;\n g.beginPath();\n g.moveTo(prevMid.x, prevMid.y);\n g.quadraticCurveTo(a.x, a.y, mid.x, mid.y);\n g.stroke();\n };\n\n const endStroke = () => {\n if (!current.current) return;\n current.current = null;\n onEnd?.();\n emit();\n };\n\n /* ----- export ----- */\n const bounds = (pad: number) => {\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n strokes.current.forEach((s) =>\n s.points.forEach((p) => {\n x0 = Math.min(x0, p.x);\n y0 = Math.min(y0, p.y);\n x1 = Math.max(x1, p.x);\n y1 = Math.max(y1, p.y);\n })\n );\n if (!isFinite(x0)) return { x: 0, y: 0, w: size.w, h: size.h };\n return { x: Math.max(0, x0 - pad), y: Math.max(0, y0 - pad), w: Math.min(size.w, x1 - x0 + pad * 2), h: Math.min(size.h, y1 - y0 + pad * 2) };\n };\n\n const api: SignaturePadHandle = {\n clear: () => {\n strokes.current = [];\n image.current = null;\n setTyped(\"\");\n redraw();\n emit();\n },\n undo: () => {\n strokes.current.pop();\n redraw();\n emit();\n },\n isEmpty: () => strokes.current.length === 0 && !image.current,\n toDataURL: ({ type = \"image/png\", quality, trim = false, background: bg, scale = 1, ink } = {}) => {\n const c = canvasRef.current;\n if (!c) return \"\";\n if (!trim && !bg && scale === 1 && !ink) return c.toDataURL(type, quality);\n const b = trim ? bounds(penWidth[1] * 2) : { x: 0, y: 0, w: size.w, h: size.h };\n const out = document.createElement(\"canvas\");\n const dpr = (window.devicePixelRatio || 1) * scale;\n out.width = Math.max(1, Math.round(b.w * dpr));\n out.height = Math.max(1, Math.round(b.h * dpr));\n const g = out.getContext(\"2d\")!;\n if (bg) {\n g.fillStyle = bg;\n g.fillRect(0, 0, out.width, out.height);\n }\n g.scale(dpr, dpr);\n g.translate(-b.x, -b.y);\n g.lineCap = \"round\";\n g.lineJoin = \"round\";\n if (image.current) g.drawImage(image.current, 0, 0, size.w, size.h);\n strokes.current.forEach((s) => drawStroke(g, ink ? { ...s, color: ink } : s));\n return out.toDataURL(type, quality);\n },\n toSVG: ({ trim = false, background: bg, ink } = {}) => {\n const b = trim ? bounds(penWidth[1] * 2) : { x: 0, y: 0, w: size.w, h: size.h };\n const n = (v: number) => +v.toFixed(1);\n const parts: string[] = [];\n strokes.current.forEach((s) => {\n // Each curve carries on from the last, so runs of the same width join into one path\n // instead of one path per segment — a much smaller file.\n let d = \"\";\n let runWidth = 0;\n const color = ink ?? s.color;\n const flush = () => {\n if (d) parts.push(`<path d=\"${d}\" stroke=\"${color}\" stroke-width=\"${runWidth}\"/>`);\n d = \"\";\n };\n for (let i = 1; i < s.points.length; i++) {\n const a = s.points[i - 1];\n const p = s.points[i];\n const mid = { x: (a.x + p.x) / 2, y: (a.y + p.y) / 2 };\n const prevMid = i === 1 ? a : { x: (s.points[i - 2].x + a.x) / 2, y: (s.points[i - 2].y + a.y) / 2 };\n const w = Math.round((((s.widths[i - 1] + s.widths[i]) / 2) * 4)) / 4; // to the nearest 0.25px\n if (w !== runWidth) {\n flush();\n runWidth = w;\n d = `M${n(prevMid.x - b.x)} ${n(prevMid.y - b.y)}`;\n }\n d += `Q${n(a.x - b.x)} ${n(a.y - b.y)} ${n(mid.x - b.x)} ${n(mid.y - b.y)}`;\n }\n flush();\n });\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${Math.round(b.w)}\" height=\"${Math.round(b.h)}\" viewBox=\"0 0 ${Math.round(b.w)} ${Math.round(b.h)}\">${bg ? `<rect width=\"100%\" height=\"100%\" fill=\"${bg}\"/>` : \"\"}<g fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${parts.join(\"\")}</g></svg>`;\n },\n fromDataURL: (url: string) =>\n new Promise<void>((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n image.current = img;\n strokes.current = [];\n redraw();\n emit();\n resolve();\n };\n img.onerror = () => reject(new Error(\"Couldn't load that signature.\"));\n img.src = url;\n }),\n canvas: canvasRef.current,\n };\n React.useImperativeHandle(ref, () => api);\n\n React.useEffect(() => {\n if (defaultValue) void api.fromDataURL(defaultValue);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [defaultValue, size.w]);\n\n /* ----- typed signature ----- */\n React.useEffect(() => {\n if (mode !== \"type\" || !size.w) return;\n const c = canvasRef.current;\n const g = ctx();\n if (!c || !g) return;\n strokes.current = [];\n image.current = null;\n redraw();\n if (typed.trim()) {\n const dpr = window.devicePixelRatio || 1;\n g.setTransform(dpr, 0, 0, dpr, 0, 0);\n g.fillStyle = resolvedInk();\n let fontSize = Math.min(size.h * 0.42, 44);\n g.font = `${fontSize}px ${typedFont}`;\n while (g.measureText(typed).width > size.w - 40 && fontSize > 12) {\n fontSize -= 2;\n g.font = `${fontSize}px ${typedFont}`;\n }\n g.textBaseline = \"alphabetic\";\n g.fillText(typed, 24, size.h * 0.62);\n }\n const url = typed.trim() ? c.toDataURL(\"image/png\") : \"\";\n setDataUrl(url);\n setEmpty(!url);\n onChange?.(url || null);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [typed, mode, size, typedFont]);\n\n const canUndo = strokes.current.length > 0 && mode === \"draw\";\n\n return (\n <div className={cn(\"grid gap-2\", className)} {...props}>\n {allowTyped && !readOnly && (\n <div className=\"flex gap-1 justify-self-start rounded-control bg-secondary-hover p-0.5 text-sm\" role=\"tablist\" aria-label=\"How to sign\">\n {([\"draw\", \"type\"] as const).map((m) => (\n <button\n key={m}\n type=\"button\"\n role=\"tab\"\n aria-selected={mode === m}\n onClick={() => {\n api.clear();\n setMode(m);\n }}\n className={cn(\"cursor-pointer rounded-control-sm px-3 py-1 font-medium outline-none focus-visible:outline-2 focus-visible:outline-ring\", mode === m ? \"bg-surface text-fg shadow-[var(--ui-shadow-sm)]\" : \"text-fg-muted hover:text-fg\")}\n >\n {m === \"draw\" ? \"Draw\" : \"Type\"}\n </button>\n ))}\n </div>\n )}\n\n <div\n ref={wrapRef}\n className={cn(\n \"relative overflow-hidden rounded-card border bg-surface [--sig-ink:var(--color-fg)]\",\n control[\"aria-invalid\"] ? \"border-danger\" : \"border-border-strong\",\n disabled && \"opacity-80\",\n !disabled && mode === \"draw\" && \"cursor-crosshair\"\n )}\n style={{ height: size.h, ...(penColor ? { [\"--sig-ink\" as string]: penColor } : {}) }}\n >\n {/* The signing line and hint, under the ink. */}\n {guide && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-x-6 bottom-[22%] flex items-center gap-2 border-t border-dashed border-border-strong pt-1.5 text-xs text-fg-muted\">\n <span className=\"-mt-6 text-base\">✗</span>\n <span className=\"-mt-6\">{empty ? guideLabel : \"\"}</span>\n </div>\n )}\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={empty ? \"Signature area, empty\" : \"Your signature\"}\n style={{ color: inkColor }}\n className={cn(\"relative block touch-none select-none text-fg\", disabled && \"pointer-events-none\")}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endStroke}\n onPointerLeave={endStroke}\n onPointerCancel={endStroke}\n />\n {mode === \"type\" && (\n <div className=\"absolute inset-x-4 bottom-3\">\n <input\n value={typed}\n onChange={(e) => setTyped(e.target.value)}\n placeholder=\"Type your full name\"\n aria-label=\"Type your full name as your signature\"\n className=\"h-9 w-full rounded-control border border-border-strong bg-bg px-3 text-sm text-fg outline-none focus:border-ring focus:ring-3 focus:ring-ring/25\"\n />\n </div>\n )}\n </div>\n\n {toolbar && !readOnly && (\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button size=\"sm\" variant=\"secondary\" onClick={() => api.undo()} disabled={!canUndo} leadingIcon=\"bi bi-arrow-counterclockwise\">\n Undo\n </Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => api.clear()} disabled={empty} leadingIcon=\"bi bi-eraser\">\n Clear\n </Button>\n {actions}\n <span className=\"ms-auto text-xs text-fg-muted\" aria-live=\"polite\">\n {empty ? (mode === \"type\" ? \"Type your name\" : \"Draw your signature above\") : \"Signed\"}\n </span>\n </div>\n )}\n\n {name && <input type=\"hidden\" name={name} value={dataUrl} />}\n {field?.id && <span className=\"sr-only\">{empty ? \"No signature yet\" : \"Signature captured\"}</span>}\n </div>\n );\n});\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Alert — a message that stays on the page.\n *\n * <Alert tone=\"success\" title=\"Invoice sent\" />\n * <Alert tone=\"danger\" title=\"We couldn't save this\" items={Object.values(errors)} />\n * <Alert banner tone=\"warning\" dismissible title=\"Your trial ends in 3 days\" />\n *\n * Five tones, four looks, optional actions and a list of problems. Dismissal fades and collapses\n * the space so the page settles instead of snapping upwards. Errors and warnings announce\n * themselves straight away; calmer tones wait for a pause.\n *\n * For a message that appears and leaves on its own, use Toast instead.\n */\n\nexport type AlertTone = \"info\" | \"success\" | \"warning\" | \"danger\" | \"neutral\";\nexport type AlertVariant = \"soft\" | \"outline\" | \"accent\" | \"solid\";\n\nconst toneIcon: Record<AlertTone, React.ReactNode> = {\n info: (\n <>\n <circle cx=\"10\" cy=\"10\" r=\"7.25\" />\n <path d=\"M10 9.25v4.25M10 6.6v.01\" />\n </>\n ),\n success: (\n <>\n <circle cx=\"10\" cy=\"10\" r=\"7.25\" />\n <path d=\"M6.75 10.25l2.4 2.4 4.3-5\" />\n </>\n ),\n warning: (\n <>\n <path d=\"M10 2.9l7.4 12.8H2.6z\" />\n <path d=\"M10 8v3.2M10 13.6v.01\" />\n </>\n ),\n danger: (\n <>\n <circle cx=\"10\" cy=\"10\" r=\"7.25\" />\n <path d=\"M10 6.4v4.2M10 13.4v.01\" />\n </>\n ),\n neutral: (\n <>\n <circle cx=\"10\" cy=\"10\" r=\"7.25\" />\n <path d=\"M8.2 8.1a1.9 1.9 0 113 1.6c-.7.45-1.2.8-1.2 1.6M10 13.6v.01\" />\n </>\n ),\n};\n\nconst toneColor: Record<AlertTone, string> = {\n info: \"var(--color-info)\",\n success: \"var(--color-success)\",\n warning: \"var(--color-warning)\",\n danger: \"var(--color-danger)\",\n neutral: \"var(--color-fg-muted)\",\n};\n\nconst toneForeground: Record<AlertTone, string> = {\n info: \"var(--color-info-fg)\",\n success: \"var(--color-success-fg)\",\n warning: \"var(--color-warning-fg)\",\n danger: \"var(--color-danger-fg)\",\n neutral: \"var(--color-bg)\",\n};\n\nexport interface AlertProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Which kind of message this is. Sets the color and the default icon. */\n tone?: AlertTone;\n /** How it looks: a tinted panel, an outline, a colored edge, or filled. */\n variant?: AlertVariant;\n /** The headline, in bold. */\n title?: React.ReactNode;\n /** Your own icon (an icon-font class or an element), or `false` for none. */\n icon?: IconInput | false;\n /** A list of problems, rendered as bullets — e.g. `Object.values(errors)`. */\n items?: React.ReactNode[];\n /** Buttons or links shown under the message. */\n actions?: React.ReactNode;\n /** Adds the close button. */\n dismissible?: boolean;\n /** Called once the alert has finished collapsing. */\n onDismiss?: () => void;\n /** Close after this many milliseconds. Pauses while hovered or focused. */\n autoDismiss?: number;\n size?: \"sm\" | \"md\";\n /** Edge to edge with square corners, for the top of a page. */\n banner?: boolean;\n /**\n * How screen readers announce it. \"auto\" (the default) interrupts for danger and warning,\n * and waits for a pause otherwise. Use \"off\" for alerts already on the page at load.\n */\n live?: \"auto\" | \"polite\" | \"assertive\" | \"off\";\n}\n\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(function Alert(\n {\n tone = \"info\",\n variant = \"soft\",\n title,\n icon,\n items,\n actions,\n dismissible = false,\n onDismiss,\n autoDismiss,\n size = \"md\",\n banner = false,\n live = \"auto\",\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const [closing, setClosing] = React.useState(false);\n const [gone, setGone] = React.useState(false);\n const [paused, setPaused] = React.useState(false);\n\n const close = React.useCallback(() => {\n setClosing(true);\n window.setTimeout(() => {\n setGone(true);\n onDismiss?.();\n }, 200);\n }, [onDismiss]);\n\n React.useEffect(() => {\n if (!autoDismiss || paused || closing) return;\n const t = window.setTimeout(close, autoDismiss);\n return () => window.clearTimeout(t);\n }, [autoDismiss, paused, closing, close]);\n\n if (gone) return null;\n\n const solid = variant === \"solid\";\n const announce = live === \"auto\" ? (tone === \"danger\" || tone === \"warning\" ? \"assertive\" : \"polite\") : live;\n\n const body = (\n <div\n ref={ref}\n role={announce === \"assertive\" ? \"alert\" : \"status\"}\n aria-live={announce === \"off\" ? undefined : announce}\n onPointerEnter={() => autoDismiss && setPaused(true)}\n onPointerLeave={() => autoDismiss && setPaused(false)}\n onFocus={() => autoDismiss && setPaused(true)}\n onBlur={(e) => autoDismiss && !e.currentTarget.contains(e.relatedTarget as Node | null) && setPaused(false)}\n className={cn(\n \"flex min-w-0 gap-3 text-start\",\n size === \"sm\" ? \"p-3 text-[0.8125rem]\" : \"p-4 text-sm\",\n banner ? \"rounded-none border-x-0\" : \"rounded-card\",\n variant === \"soft\" &&\n \"border bg-[color:color-mix(in_srgb,var(--al)_8%,var(--color-surface))] border-[color:color-mix(in_srgb,var(--al)_28%,transparent)] text-fg\",\n variant === \"outline\" && \"border border-[color:color-mix(in_srgb,var(--al)_45%,transparent)] bg-surface text-fg\",\n variant === \"accent\" && \"border border-border bg-surface text-fg border-s-4 border-s-[color:var(--al)]\",\n solid && \"bg-[color:var(--al)] text-[color:var(--al-fg)]\",\n className,\n )}\n style={{ [\"--al\" as string]: toneColor[tone], [\"--al-fg\" as string]: toneForeground[tone], ...style }}\n {...rest}\n >\n {icon !== false && (\n <span\n className={cn(\n \"shrink-0\",\n solid ? \"text-[color:var(--al-fg)]\" : \"text-[color:var(--al)]\",\n size === \"sm\" ? \"mt-px\" : \"mt-0.5\",\n )}\n aria-hidden=\"true\"\n >\n {icon ? (\n <span className=\"grid size-5 place-items-center [&_i]:text-[1.05rem] [&_svg]:size-5\">{renderIcon(icon)}</span>\n ) : (\n <svg\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.6}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"size-5\"\n >\n {toneIcon[tone]}\n </svg>\n )}\n </span>\n )}\n\n <div className=\"grid min-w-0 flex-1 gap-1.5\">\n {title && (\n <p className={cn(\"font-semibold leading-snug\", size === \"sm\" ? \"text-[0.8125rem]\" : \"text-[0.9375rem]\")}>{title}</p>\n )}\n {children && (\n <div className={cn(\"leading-relaxed\", solid ? \"text-[color:var(--al-fg)]/90\" : \"text-fg-muted\")}>{children}</div>\n )}\n {items && items.length > 0 && (\n <ul\n className={cn(\n \"grid list-disc gap-1 ps-5 leading-relaxed\",\n solid ? \"text-[color:var(--al-fg)]/90\" : \"text-fg-muted\",\n )}\n >\n {items.map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n )}\n {actions && <div className=\"mt-1 flex flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n\n {dismissible && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={close}\n className={cn(\n \"-me-1 -mt-1 grid size-7 shrink-0 cursor-pointer place-items-center self-start rounded-control-sm outline-none focus-visible:outline-2 focus-visible:outline-offset-1\",\n solid\n ? \"text-[color:var(--al-fg)]/80 hover:bg-white/15 hover:text-[color:var(--al-fg)] focus-visible:outline-current\"\n : \"text-fg-muted hover:bg-secondary-hover hover:text-fg focus-visible:outline-ring\",\n )}\n >\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" aria-hidden=\"true\" className=\"size-3.5\">\n <path d=\"M6 6l8 8M14 6l-8 8\" />\n </svg>\n </button>\n )}\n </div>\n );\n\n return (\n <div\n className={cn(\n \"grid transition-[grid-template-rows,opacity,margin] duration-200 ease-out motion-reduce:transition-none\",\n closing ? \"grid-rows-[0fr] opacity-0\" : \"grid-rows-[1fr] opacity-100\",\n )}\n >\n <div className={cn(\"min-h-0\", closing && \"overflow-hidden\")}>{body}</div>\n </div>\n );\n});\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/*\n * Layout — small pieces for arranging things on the screen.\n *\n * <Stack direction={{ base: \"column\", md: \"row\" }} gap={3} justify=\"between\">…</Stack>\n * <Grid columns={{ base: 1, sm: 2, lg: 4 }} gap={4}>…</Grid>\n * <Grid minChildWidth=\"16rem\" gap={4}>…</Grid>\n * <Container size=\"xl\">…</Container>\n *\n * Every size prop can be a plain value or an object keyed by breakpoint. Those turn into CSS\n * custom properties that theme.css reads inside media queries, so nothing depends on class names\n * generated at runtime and everything survives a packaged build.\n *\n * gap and padding count in spacing steps (4 = 1rem by default), so they follow the theme's density.\n */\n\n/** A value that can change by screen size: `4` or `{ base: 2, md: 4 }`. */\nexport type Responsive<T> = T | { base?: T; sm?: T; md?: T; lg?: T };\n\nconst BREAKPOINTS = [\"sm\", \"md\", \"lg\"] as const;\n\n/** Spreads a responsive value into --name / --name-sm / --name-md / --name-lg. */\nfunction vars<T>(name: string, value: Responsive<T> | undefined, format: (v: T) => string | number = (v) => v as never) {\n if (value === undefined) return {};\n const out: Record<string, string | number> = {};\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n const o = value as { base?: T; sm?: T; md?: T; lg?: T };\n if (o.base !== undefined) out[`--${name}`] = format(o.base);\n BREAKPOINTS.forEach((bp) => {\n const v = o[bp];\n if (v !== undefined) out[`--${name}-${bp}`] = format(v);\n });\n } else {\n out[`--${name}`] = format(value as T);\n }\n return out;\n}\n\nconst alignMap = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n stretch: \"stretch\",\n baseline: \"baseline\",\n} as const;\n\nconst justifyMap = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n around: \"space-around\",\n evenly: \"space-evenly\",\n} as const;\n\nexport type StackAlign = keyof typeof alignMap;\nexport type StackJustify = keyof typeof justifyMap;\nexport type StackDirection = \"row\" | \"column\" | \"row-reverse\" | \"column-reverse\";\n\nexport interface StackProps extends React.HTMLAttributes<HTMLElement> {\n /** \"row\" or \"column\" (the default), per screen size if you like. */\n direction?: Responsive<StackDirection>;\n /** Space between children, in spacing steps. */\n gap?: Responsive<number>;\n align?: Responsive<StackAlign>;\n justify?: Responsive<StackJustify>;\n /** Let a row fold onto a second line instead of overflowing. */\n wrap?: boolean;\n /** Draw a line between children. */\n divider?: boolean;\n /** Render as another element — \"section\", \"ul\", \"nav\"… */\n as?: React.ElementType;\n}\n\n/** Children in a row or a column with even spacing. */\nexport const Stack = React.forwardRef<HTMLElement, StackProps>(function Stack(\n { direction = \"column\", gap = 4, align, justify, wrap = false, divider = false, as: Tag = \"div\", className, style, ...rest },\n ref,\n) {\n const isRow =\n typeof direction === \"string\"\n ? direction.startsWith(\"row\")\n : (direction.lg ?? direction.md ?? direction.sm ?? direction.base ?? \"column\").startsWith(\"row\");\n\n return (\n <Tag\n ref={ref}\n data-ui-stack=\"\"\n className={cn(\n \"min-w-0\",\n divider &&\n (isRow\n ? \"[&>*+*]:border-s [&>*+*]:border-border [&>*+*]:ps-[inherit]\"\n : \"[&>*+*]:border-t [&>*+*]:border-border\"),\n className,\n )}\n style={{\n ...vars(\"ui-dir\", direction),\n ...vars(\"ui-gap\", gap),\n ...vars(\"ui-align\", align, (v) => alignMap[v]),\n ...vars(\"ui-justify\", justify, (v) => justifyMap[v]),\n ...(wrap ? { [\"--ui-wrap\"]: \"wrap\" } : {}),\n ...style,\n }}\n {...rest}\n />\n );\n});\n\nexport interface GridProps extends React.HTMLAttributes<HTMLElement> {\n /** How many equal columns. */\n columns?: Responsive<number>;\n /**\n * Instead of a column count: fit as many columns as will hold this width and reflow.\n * Reacts to the grid's own width, so it works inside panels of unknown size.\n */\n minChildWidth?: string;\n gap?: Responsive<number>;\n align?: Responsive<StackAlign>;\n as?: React.ElementType;\n}\n\n/** A grid of equal columns. */\nexport const Grid = React.forwardRef<HTMLElement, GridProps>(function Grid(\n { columns = 1, minChildWidth, gap = 4, align, as: Tag = \"div\", className, style, ...rest },\n ref,\n) {\n const cols = minChildWidth\n ? { [\"--ui-cols\"]: `repeat(auto-fit, minmax(min(${minChildWidth}, 100%), 1fr))` }\n : vars(\"ui-cols\", columns, (n) => `repeat(${n}, minmax(0, 1fr))`);\n const widest = typeof columns === \"number\" ? columns : (columns.lg ?? columns.md ?? columns.sm ?? columns.base ?? 1);\n\n return (\n <Tag\n ref={ref}\n data-ui-grid=\"\"\n className={cn(\"min-w-0\", className)}\n style={{\n ...cols,\n [\"--ui-cols-count\"]: widest,\n ...vars(\"ui-gap\", gap),\n ...vars(\"ui-align\", align, (v) => alignMap[v]),\n ...style,\n }}\n {...rest}\n />\n );\n});\n\nexport interface GridItemProps extends React.HTMLAttributes<HTMLElement> {\n /** How many columns to take. Never exceeds the grid's column count, so nothing overflows. */\n span?: Responsive<number>;\n rowSpan?: number;\n as?: React.ElementType;\n}\n\n/** A grid child that spans several columns or rows. */\nexport const GridItem = React.forwardRef<HTMLElement, GridItemProps>(function GridItem(\n { span = 1, rowSpan, as: Tag = \"div\", className, style, ...rest },\n ref,\n) {\n return (\n <Tag\n ref={ref}\n data-ui-span=\"\"\n className={cn(\"min-w-0\", className)}\n style={{ ...vars(\"ui-span\", span), ...(rowSpan ? { [\"--ui-row-span\"]: rowSpan } : {}), ...style }}\n {...rest}\n />\n );\n});\n\nconst containerSizes: Record<string, string> = {\n sm: \"40rem\",\n md: \"48rem\",\n lg: \"64rem\",\n xl: \"80rem\",\n \"2xl\": \"96rem\",\n prose: \"65ch\",\n full: \"100%\",\n};\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLElement> {\n /** A preset width, or any CSS length. */\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"prose\" | \"full\" | (string & {});\n /** Side padding, in spacing steps. */\n padding?: Responsive<number>;\n align?: \"center\" | \"start\";\n as?: React.ElementType;\n}\n\n/** Keeps content from getting too wide, and centers it. */\nexport const Container = React.forwardRef<HTMLElement, ContainerProps>(function Container(\n { size = \"xl\", padding = 5, align = \"center\", as: Tag = \"div\", className, style, ...rest },\n ref,\n) {\n return (\n <Tag\n ref={ref}\n className={cn(\"w-full\", align === \"center\" && \"mx-auto\", className)}\n style={{\n maxWidth: containerSizes[size] ?? size,\n paddingInline: \"calc(var(--spacing) * var(--ui-pad, 5))\",\n ...vars(\"ui-pad\", padding),\n ...style,\n }}\n {...rest}\n />\n );\n});\n\nexport interface CenterProps extends React.HTMLAttributes<HTMLDivElement> {\n minHeight?: number | string;\n axis?: \"both\" | \"horizontal\" | \"vertical\";\n}\n\n/** Puts its children in the middle. */\nexport const Center = React.forwardRef<HTMLDivElement, CenterProps>(function Center(\n { minHeight, axis = \"both\", className, style, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n \"grid\",\n axis === \"both\" && \"place-items-center\",\n axis === \"horizontal\" && \"justify-items-center\",\n axis === \"vertical\" && \"content-center\",\n className,\n )}\n style={{ minHeight, ...style }}\n {...rest}\n />\n );\n});\n\n/** Eats the free space in a row, pushing what follows to the end. */\nexport function Spacer({ className, ...rest }: React.HTMLAttributes<HTMLDivElement>) {\n return <div aria-hidden=\"true\" className={cn(\"flex-1 self-stretch\", className)} {...rest} />;\n}\n\nexport interface AspectRatioProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \"16/9\", \"1/1\", \"4/3\"… */\n ratio?: string;\n}\n\n/** Keeps a box at a fixed shape; the child fills it and is cropped to fit. */\nexport const AspectRatio = React.forwardRef<HTMLDivElement, AspectRatioProps>(function AspectRatio(\n { ratio = \"16/9\", className, style, children, ...rest },\n ref,\n) {\n return (\n <div ref={ref} className={cn(\"relative w-full overflow-hidden\", className)} style={{ aspectRatio: ratio, ...style }} {...rest}>\n <div className=\"absolute inset-0 [&>*]:size-full [&>*]:object-cover\">{children}</div>\n </div>\n );\n});\n\nexport interface DividerProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n dashed?: boolean;\n /** Space above and below (or either side), in spacing steps. */\n spacing?: number;\n}\n\nconst dashH = \"bg-[repeating-linear-gradient(to_right,var(--color-border)_0_4px,transparent_4px_8px)]\";\nconst dashV = \"bg-[repeating-linear-gradient(to_bottom,var(--color-border)_0_4px,transparent_4px_8px)]\";\n\n/** A line between things, optionally with a word in the middle. */\nexport const Divider = React.forwardRef<HTMLDivElement, DividerProps>(function Divider(\n { orientation = \"horizontal\", dashed = false, spacing, className, style, children, ...rest },\n ref,\n) {\n const margin =\n spacing !== undefined\n ? { [orientation === \"horizontal\" ? \"marginBlock\" : \"marginInline\"]: `calc(var(--spacing) * ${spacing})` }\n : {};\n\n if (orientation === \"vertical\") {\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation=\"vertical\"\n className={cn(\"w-px self-stretch bg-border\", dashed && dashV, className)}\n style={{ ...margin, ...style }}\n {...rest}\n />\n );\n }\n\n if (children) {\n return (\n <div\n ref={ref}\n role=\"separator\"\n className={cn(\"flex items-center gap-3 text-xs text-fg-muted\", className)}\n style={{ ...margin, ...style }}\n {...rest}\n >\n <span className={cn(\"h-px flex-1 bg-border\", dashed && dashH)} />\n {children}\n <span className={cn(\"h-px flex-1 bg-border\", dashed && dashH)} />\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"separator\"\n className={cn(\"h-px w-full bg-border\", dashed && dashH, className)}\n style={{ ...margin, ...style }}\n {...rest}\n />\n );\n});\n","import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { renderIcon, type IconInput } from \"../button/Button\";\n\n/*\n * Hero — the top of a landing page.\n *\n * <Hero background=\"aurora\" size=\"lg\">\n * <HeroEyebrow href=\"/changelog\">New · Recurring invoices</HeroEyebrow>\n * <HeroTitle gradient>Get paid without chasing anyone</HeroTitle>\n * <HeroSubtitle>Send an invoice in thirty seconds…</HeroSubtitle>\n * <HeroActions><Button size=\"lg\">Start free</Button></HeroActions>\n * <HeroStats stats={[{ value: \"12k\", label: \"invoices sent\" }]} />\n * </Hero>\n *\n * The pieces are separate so a hero can be as plain or as loud as the page needs. `media` puts a\n * screenshot beside the words from medium screens up; without it everything is one centered column.\n * Every animated background respects prefers-reduced-motion.\n */\n\nexport type HeroBackground = \"none\" | \"aurora\" | \"grid\" | \"dots\" | \"gradient\" | \"image\";\n\nexport interface HeroProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n /** What sits behind the words. */\n background?: HeroBackground;\n /** The photo for `background=\"image\"`. */\n image?: string;\n /** How much the image is darkened, 0–1, so text stays readable. */\n overlay?: number;\n /** Force light text — set automatically for image backgrounds. */\n dark?: boolean;\n align?: \"center\" | \"start\";\n /** How tall it is. \"screen\" fills the first screenful. */\n size?: \"sm\" | \"md\" | \"lg\" | \"screen\";\n /** A screenshot or illustration, placed beside the words from medium screens up. */\n media?: React.ReactNode;\n /** The three colors the aurora and gradient backgrounds are mixed from. */\n colors?: [string, string, string];\n as?: React.ElementType;\n}\n\nconst padding: Record<NonNullable<HeroProps[\"size\"]>, string> = {\n sm: \"py-12 sm:py-16\",\n md: \"py-16 sm:py-24\",\n lg: \"py-20 sm:py-32\",\n screen: \"min-h-[100svh] grid place-content-center py-20\",\n};\n\nfunction Aurora({ colors }: { colors: [string, string, string] }) {\n const blobs = [\n { c: colors[0], s: \"h-[38rem] w-[38rem] -left-[12%] -top-[28%]\", d: \"22s\", delay: \"0s\" },\n { c: colors[1], s: \"h-[32rem] w-[32rem] right-[-10%] -top-[18%]\", d: \"28s\", delay: \"-6s\" },\n { c: colors[2], s: \"h-[30rem] w-[30rem] left-[28%] bottom-[-34%]\", d: \"25s\", delay: \"-13s\" },\n ];\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n {blobs.map((b, i) => (\n <span\n key={i}\n className={cn(\"absolute rounded-full opacity-45 blur-[90px] motion-reduce:animate-none dark:opacity-30\", b.s)}\n style={{\n background: b.c,\n animation: `ui-aurora ${b.d} ease-in-out ${b.delay} infinite`,\n }}\n />\n ))}\n {/* Fades the clouds into the page below. */}\n <span className=\"absolute inset-x-0 bottom-0 h-32 bg-[linear-gradient(to_top,var(--color-bg),transparent)]\" />\n </div>\n );\n}\n\n/** The band at the top of a landing page. */\nexport const Hero = React.forwardRef<HTMLElement, HeroProps>(function Hero(\n {\n background = \"none\",\n image,\n overlay = 0.55,\n dark,\n align = \"center\",\n size = \"md\",\n media,\n colors = [\"#0d6efd\", \"#7c3aed\", \"#db2777\"],\n as: Tag = \"section\",\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const light = dark ?? background === \"image\";\n const centered = align === \"center\" && !media;\n\n return (\n <Tag\n ref={ref}\n className={cn(\n \"relative isolate w-full overflow-hidden\",\n padding[size],\n light && \"text-white\",\n background === \"gradient\" && \"text-white\",\n className,\n )}\n style={{\n ...(background === \"gradient\"\n ? { backgroundImage: `linear-gradient(135deg, ${colors[0]}, ${colors[1]} 55%, ${colors[2]})` }\n : {}),\n ...style,\n }}\n {...rest}\n >\n {background === \"aurora\" && <Aurora colors={colors} />}\n\n {background === \"grid\" && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 [mask-image:radial-gradient(ellipse_at_center,black,transparent_72%)] bg-[linear-gradient(to_right,var(--color-border)_1px,transparent_1px),linear-gradient(to_bottom,var(--color-border)_1px,transparent_1px)] bg-[size:3rem_3rem]\"\n />\n )}\n\n {background === \"dots\" && (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 [mask-image:radial-gradient(ellipse_at_center,black,transparent_70%)] bg-[radial-gradient(var(--color-border-strong)_1px,transparent_1px)] bg-[size:1.25rem_1.25rem]\"\n />\n )}\n\n {background === \"image\" && image && (\n <>\n <img src={image} alt=\"\" aria-hidden=\"true\" className=\"absolute inset-0 -z-10 size-full object-cover\" />\n <div aria-hidden=\"true\" className=\"absolute inset-0 -z-10 bg-black\" style={{ opacity: overlay }} />\n </>\n )}\n\n <div className=\"relative mx-auto w-full max-w-6xl px-5 sm:px-8\">\n {media ? (\n <div className=\"grid items-center gap-10 md:grid-cols-2 md:gap-12\">\n <div className={cn(\"grid min-w-0 gap-5 justify-items-start text-start\")}>{children}</div>\n <div className=\"min-w-0\">{media}</div>\n </div>\n ) : (\n <div\n className={cn(\n \"grid min-w-0 gap-5\",\n centered ? \"justify-items-center text-center\" : \"justify-items-start text-start\",\n )}\n >\n {children}\n </div>\n )}\n </div>\n </Tag>\n );\n});\n\nexport interface HeroEyebrowProps extends React.HTMLAttributes<HTMLElement> {\n /** Makes it a link and adds a chevron. */\n href?: string;\n icon?: IconInput;\n}\n\n/** The small pill above the headline — an announcement, a version, a category. */\nexport function HeroEyebrow({ href, icon, className, children, ...rest }: HeroEyebrowProps) {\n const inner = (\n <>\n {icon && <span className=\"grid place-items-center [&_i]:text-[0.9rem] [&_svg]:size-4\">{renderIcon(icon)}</span>}\n <span className=\"min-w-0 truncate\">{children}</span>\n {href && (\n <svg viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" className=\"size-3.5 shrink-0 transition-transform duration-200 group-hover/eyebrow:translate-x-0.5\">\n <path d=\"M7.5 4.5L13 10l-5.5 5.5\" />\n </svg>\n )}\n </>\n );\n\n const classes = cn(\n \"group/eyebrow inline-flex max-w-full items-center gap-2 rounded-full border border-current/20 bg-current/[0.07] px-3 py-1 text-[0.8125rem] font-medium backdrop-blur-sm\",\n href && \"transition-colors hover:bg-current/[0.13] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-current\",\n className,\n );\n\n if (href) {\n return (\n <a href={href} className={classes} {...(rest as React.AnchorHTMLAttributes<HTMLAnchorElement>)}>\n {inner}\n </a>\n );\n }\n return (\n <span className={classes} {...(rest as React.HTMLAttributes<HTMLSpanElement>)}>\n {inner}\n </span>\n );\n}\n\nexport interface HeroTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n as?: \"h1\" | \"h2\";\n /** Fades the headline through the hero's colors. */\n gradient?: boolean;\n size?: \"md\" | \"lg\" | \"xl\";\n colors?: [string, string, string];\n}\n\nconst titleSize = {\n md: \"text-[2.25rem] sm:text-[2.75rem] lg:text-[3.25rem]\",\n lg: \"text-[2.5rem] sm:text-[3.5rem] lg:text-[4.25rem]\",\n xl: \"text-[2.75rem] sm:text-[4rem] lg:text-[5rem]\",\n};\n\n/** The headline. */\nexport function HeroTitle({\n as: Tag = \"h1\",\n gradient = false,\n size = \"lg\",\n colors = [\"#0d6efd\", \"#7c3aed\", \"#db2777\"],\n className,\n style,\n children,\n ...rest\n}: HeroTitleProps) {\n return (\n <Tag\n className={cn(\n \"max-w-[18ch] font-heading font-semibold leading-[1.03] tracking-[-0.03em] text-balance\",\n titleSize[size],\n gradient && \"bg-clip-text text-transparent\",\n className,\n )}\n style={{\n ...(gradient\n ? { backgroundImage: `linear-gradient(105deg, ${colors[0]}, ${colors[1]} 48%, ${colors[2]})` }\n : {}),\n ...style,\n }}\n {...rest}\n >\n {children}\n </Tag>\n );\n}\n\n/** The sentence under the headline. Keep it to a line or two. */\nexport function HeroSubtitle({ className, ...rest }: React.HTMLAttributes<HTMLParagraphElement>) {\n return <p className={cn(\"max-w-[52ch] text-[1.0625rem] leading-relaxed opacity-75 sm:text-[1.125rem]\", className)} {...rest} />;\n}\n\n/** The buttons. Full width and stacked on phones, side by side from small screens up. */\nexport function HeroActions({ className, ...rest }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n // Buttons go full width on phones; anything else (a sign-up field, say) keeps its own size.\n \"mt-1 grid w-full max-w-sm gap-3 sm:flex sm:w-auto sm:max-w-none sm:flex-wrap sm:items-center [&>a]:w-full [&>button]:w-full sm:[&>a]:w-auto sm:[&>button]:w-auto\",\n className,\n )}\n {...rest}\n />\n );\n}\n\nexport interface HeroStat {\n value: React.ReactNode;\n label: React.ReactNode;\n}\n\nexport interface HeroStatsProps extends React.HTMLAttributes<HTMLDListElement> {\n stats: HeroStat[];\n}\n\n/** A short row of proof points under the buttons. */\nexport function HeroStats({ stats, className, ...rest }: HeroStatsProps) {\n return (\n <dl className={cn(\"mt-4 flex flex-wrap gap-x-9 gap-y-4\", className)} {...rest}>\n {stats.map((s, i) => (\n <div key={i} className=\"flex flex-col\">\n {/* The number reads first, but the label comes first in the markup so <dt> stays before <dd>. */}\n <dt className=\"order-2 text-[0.8125rem] opacity-65\">{s.label}</dt>\n <dd className=\"text-[1.5rem] font-semibold leading-tight tracking-[-0.02em]\">{s.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n\nexport interface HeroLogosProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Names, or <img> elements for real logos. */\n logos: React.ReactNode[];\n label?: React.ReactNode;\n /** Scroll them endlessly instead of wrapping. Stops for prefers-reduced-motion. */\n marquee?: boolean;\n /** Seconds for one full pass. */\n speed?: number;\n}\n\n/** The \"trusted by\" strip. */\nexport function HeroLogos({ logos, label = \"Trusted by teams at\", marquee = false, speed = 28, className, ...rest }: HeroLogosProps) {\n const row = (\n <>\n {logos.map((l, i) => (\n <li key={i} className=\"flex shrink-0 items-center text-[0.9375rem] font-medium opacity-60 [&_img]:h-6 [&_img]:w-auto\">\n {l}\n </li>\n ))}\n </>\n );\n\n return (\n <div className={cn(\"mt-6 w-full min-w-0\", className)} {...rest}>\n {label && <p className=\"text-[0.75rem] font-medium uppercase tracking-[0.08em] opacity-55\">{label}</p>}\n {marquee ? (\n <div\n className=\"mt-3 overflow-hidden [mask-image:linear-gradient(to_right,transparent,black_8%,black_92%,transparent)]\"\n // Pausing on hover lets people actually read a name.\n style={{ [\"--ui-marquee-speed\" as string]: `${speed}s` }}\n >\n <ul\n className=\"flex w-max items-center gap-10 motion-reduce:animate-none hover:[animation-play-state:paused]\"\n style={{ animation: \"ui-marquee var(--ui-marquee-speed) linear infinite\" }}\n >\n {row}\n {/* A second copy, hidden from screen readers, makes the loop seamless. */}\n <span className=\"contents\" aria-hidden=\"true\">\n {row}\n </span>\n </ul>\n </div>\n ) : (\n <ul className=\"mt-3 flex flex-wrap items-center gap-x-8 gap-y-3\">{row}</ul>\n )}\n </div>\n );\n}\n\nexport interface HeroMediaProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Wraps the content in browser chrome. */\n frame?: boolean;\n /** The address shown in the frame's bar. */\n url?: string;\n /** Drifts up and down forever. */\n float?: boolean;\n /** Turns it slightly, as if sitting on a desk. Flat on phones. */\n tilt?: boolean;\n}\n\n/** The screenshot beside the words. */\nexport function HeroMedia({ frame = false, url, float = false, tilt = false, className, children, ...rest }: HeroMediaProps) {\n const inner = frame ? (\n <div className=\"overflow-hidden rounded-card border border-border bg-surface shadow-[0_24px_60px_-18px_rgb(0_0_0/0.35)]\">\n <div className=\"flex items-center gap-2 border-b border-border bg-bg px-3 py-2\">\n <span className=\"flex gap-1.5\" aria-hidden=\"true\">\n <span className=\"size-2.5 rounded-full bg-[#ff5f57]\" />\n <span className=\"size-2.5 rounded-full bg-[#febc2e]\" />\n <span className=\"size-2.5 rounded-full bg-[#28c840]\" />\n </span>\n {url && (\n <span className=\"mx-auto max-w-[60%] truncate rounded-full bg-surface px-3 py-0.5 text-[0.6875rem] text-fg-muted\">\n {url}\n </span>\n )}\n </div>\n <div className=\"min-w-0\">{children}</div>\n </div>\n ) : (\n children\n );\n\n return (\n <div\n className={cn(\n \"min-w-0\",\n tilt && \"md:[transform:perspective(1200px)_rotateY(-7deg)_rotateX(3deg)]\",\n float && \"motion-reduce:animate-none\",\n className,\n )}\n style={float ? { animation: \"ui-float 7s ease-in-out infinite\" } : undefined}\n {...rest}\n >\n {inner}\n </div>\n );\n}\n"],"mappings":"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","names":["React","cva","jsx","jsxs","cva","React","cva","jsx","jsxs","cva","Select","isActive","React","jsx","jsxs","React","Slot","cva","jsx","jsxs","cva","textOf","Slot","React","Fragment","jsx","jsxs","React","Slot","cva","Fragment","jsx","jsxs","cva","Slot","clamp","ListContext","React","Fragment","jsx","jsxs","GroupContext","React","Slot","cva","jsx","jsxs","cva","padding","Slot","React","Slot","Fragment","jsx","jsxs","Slot","React","React","Fragment","jsx","jsxs","RadioContext","vars","jsx","jsxs","normalize","alignClass","keyOf","_","React","Fragment","jsx","jsxs","React","React","Fragment","jsx","jsxs","React","Fragment","jsx","jsxs","counter","icons","React","tones","Fragment","jsx","jsxs","React","Fragment","jsx","jsxs","saved","Chevron","React","Fragment","jsx","jsxs","Highlight","Autocomplete","React","jsx","jsxs","sizes","Slider","emit","React","jsx","jsxs","Pagination","React","React","jsx","jsxs","DataTable","jsx","jsxs","x","DataTable","React","Fragment","jsx","jsxs","DataTable","list","React","Fragment","jsx","jsxs","React","jsx","jsxs","statusText","Heading","Chevron","React","Fragment","jsx","jsxs","Arrow","Carousel","React","Fragment","jsx","jsxs","sizes","IconButton","React","jsx","jsxs","React","jsx","jsxs","_","React","jsx","jsxs","SignaturePad","emit","React","Fragment","jsx","jsxs","Alert","React","jsx","jsxs","Stack","Grid","GridItem","Container","padding","Center","AspectRatio","Divider","React","Fragment","jsx","jsxs","Hero"]}
|