@ansh-ui/react 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/{chunk-YACOHFYJ.cjs → chunk-2U7BHYIQ.cjs} +121 -121
  2. package/dist/chunk-2U7BHYIQ.cjs.map +1 -0
  3. package/dist/{chunk-WNWGYXJY.js → chunk-7QGB2X7R.js} +34 -26
  4. package/dist/chunk-7QGB2X7R.js.map +1 -0
  5. package/dist/{chunk-OLTS6G5M.js → chunk-GNA33V2J.js} +11 -6
  6. package/dist/chunk-GNA33V2J.js.map +1 -0
  7. package/dist/{chunk-IZ6T7LO3.cjs → chunk-MPX7QT4R.cjs} +2 -2
  8. package/dist/chunk-MPX7QT4R.cjs.map +1 -0
  9. package/dist/{chunk-PVDQPVYF.js → chunk-NJUVVMJV.js} +2 -2
  10. package/dist/chunk-NJUVVMJV.js.map +1 -0
  11. package/dist/{chunk-CWYBOVCZ.js → chunk-RGGNLAAA.js} +121 -121
  12. package/dist/chunk-RGGNLAAA.js.map +1 -0
  13. package/dist/{chunk-OJN5JBNP.cjs → chunk-VJI6V27F.cjs} +99 -99
  14. package/dist/chunk-VJI6V27F.cjs.map +1 -0
  15. package/dist/{chunk-HPGCILO4.js → chunk-XRKZPLUT.js} +99 -99
  16. package/dist/chunk-XRKZPLUT.js.map +1 -0
  17. package/dist/{chunk-DATBU46V.cjs → chunk-XYT6OXKP.cjs} +10 -4
  18. package/dist/chunk-XYT6OXKP.cjs.map +1 -0
  19. package/dist/{chunk-3SWO2M33.cjs → chunk-YVJB7AAZ.cjs} +34 -26
  20. package/dist/chunk-YVJB7AAZ.cjs.map +1 -0
  21. package/dist/data.cjs +16 -16
  22. package/dist/data.d.cts +23 -22
  23. package/dist/data.d.ts +23 -22
  24. package/dist/data.js +1 -1
  25. package/dist/form.cjs +36 -36
  26. package/dist/form.d.cts +2 -0
  27. package/dist/form.d.ts +2 -0
  28. package/dist/form.js +1 -1
  29. package/dist/index.cjs +99 -99
  30. package/dist/index.cjs.map +1 -1
  31. package/dist/index.d.cts +1 -1
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.js +10 -9
  34. package/dist/index.js.map +1 -1
  35. package/dist/{motion-DsQPOsTT.d.cts → motion-C6WfBFES.d.cts} +20 -17
  36. package/dist/{motion-DoT_sTl1.d.ts → motion-ugXmf505.d.ts} +20 -17
  37. package/dist/motion.cjs +17 -17
  38. package/dist/motion.d.cts +1 -1
  39. package/dist/motion.d.ts +1 -1
  40. package/dist/motion.js +1 -1
  41. package/dist/navigation.cjs +8 -8
  42. package/dist/navigation.js +1 -1
  43. package/dist/overlay.cjs +15 -15
  44. package/dist/overlay.d.cts +14 -12
  45. package/dist/overlay.d.ts +14 -12
  46. package/dist/overlay.js +1 -1
  47. package/package.json +3 -3
  48. package/dist/chunk-3SWO2M33.cjs.map +0 -1
  49. package/dist/chunk-CWYBOVCZ.js.map +0 -1
  50. package/dist/chunk-DATBU46V.cjs.map +0 -1
  51. package/dist/chunk-HPGCILO4.js.map +0 -1
  52. package/dist/chunk-IZ6T7LO3.cjs.map +0 -1
  53. package/dist/chunk-OJN5JBNP.cjs.map +0 -1
  54. package/dist/chunk-OLTS6G5M.js.map +0 -1
  55. package/dist/chunk-PVDQPVYF.js.map +0 -1
  56. package/dist/chunk-WNWGYXJY.js.map +0 -1
  57. package/dist/chunk-YACOHFYJ.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/ui/command-palette.tsx","../src/components/overlay/popover.tsx","../src/components/overlay/tooltip.tsx","../src/components/overlay/dialog.tsx","../src/components/overlay/drawer.tsx","../src/components/overlay/menu.tsx"],"names":["useRef","useId","useMemo","jsx","jsxs","useState","useEffect","createContext","useContext","Fragment","useCallback","MenuSurface","state","index"],"mappings":"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","file":"chunk-CWYBOVCZ.js","sourcesContent":["import { type ReactNode, useCallback, useEffect, useId, useMemo, useRef, useState } from 'react'\n\n/**\n * A command palette.\n *\n * The interaction is easy; the accessibility is where these usually go wrong. This one implements\n * the combobox pattern properly:\n *\n * - Focus stays in the input the whole time. Arrow keys move a *virtual* selection, announced via\n * `aria-activedescendant`, rather than moving DOM focus — so the user can keep typing.\n * - The list is `role=\"listbox\"` with `role=\"option\"` children and correct `aria-selected`.\n * - Focus is restored to whatever was focused before opening, so keyboard users aren't dumped at\n * the top of the document on close.\n * - Focus is trapped while open, so Tab can't escape to the page behind the scrim.\n *\n * Filtering is a subsequence match rather than a substring one: typing `nds` should find\n * \"**N**ew **D**ata**s**ource\", which is what anyone who has used a palette expects.\n */\n\nexport interface CommandItem {\n id: string\n label: string\n /** Optional grouping heading. Items with the same group render together. */\n group?: string\n /** Leading icon. */\n icon?: ReactNode\n /** Shortcut hint shown on the right, e.g. `'⌘K'`. Display only. */\n shortcut?: string\n /** Extra text matched against the query but not displayed. */\n keywords?: string\n onSelect?: () => void\n}\n\nexport interface CommandPaletteProps {\n items: readonly CommandItem[]\n open: boolean\n onOpenChange: (open: boolean) => void\n placeholder?: string\n emptyMessage?: string\n}\n\n/**\n * Subsequence match with a crude relevance score.\n *\n * Returns `-1` for no match. Contiguous runs score higher, and a match at the start of the label\n * scores higher still, so \"set\" ranks \"**Set**tings\" above \"As**set** manager\".\n */\nfunction score(query: string, text: string): number {\n if (query.length === 0) return 0\n\n const q = query.toLowerCase()\n const t = text.toLowerCase()\n\n let queryIndex = 0\n let total = 0\n let run = 0\n\n for (let i = 0; i < t.length && queryIndex < q.length; i++) {\n if (t[i] === q[queryIndex]) {\n run++\n // Contiguity bonus, plus a bonus for matching near the start.\n total += run * 2 + (i === 0 ? 8 : 0)\n queryIndex++\n } else {\n run = 0\n }\n }\n\n return queryIndex === q.length ? total : -1\n}\n\nexport function CommandPalette({\n items,\n open,\n onOpenChange,\n placeholder = 'Type a command or search…',\n emptyMessage = 'No results found.',\n}: CommandPaletteProps) {\n const [query, setQuery] = useState('')\n const [active, setActive] = useState(0)\n\n const inputRef = useRef<HTMLInputElement | null>(null)\n const dialogRef = useRef<HTMLDivElement | null>(null)\n /** Whatever had focus before opening, so it can be restored on close. */\n const restoreFocusRef = useRef<HTMLElement | null>(null)\n\n const listId = useId()\n\n const results = useMemo(() => {\n if (query.trim() === '') return [...items]\n return items\n .map((item) => ({\n item,\n score: Math.max(score(query, item.label), score(query, item.keywords ?? '')),\n }))\n .filter((entry) => entry.score >= 0)\n .sort((a, b) => b.score - a.score)\n .map((entry) => entry.item)\n }, [items, query])\n\n // Reset the cursor whenever the result set changes, or the highlight can point past the end.\n useEffect(() => setActive(0), [query, items])\n\n const close = useCallback(() => {\n onOpenChange(false)\n setQuery('')\n }, [onOpenChange])\n\n const select = useCallback(\n (item: CommandItem | undefined) => {\n if (!item) return\n item.onSelect?.()\n close()\n },\n [close],\n )\n\n // --- Open/close lifecycle ------------------------------------------------\n useEffect(() => {\n if (!open) return\n\n restoreFocusRef.current = document.activeElement as HTMLElement | null\n // Focus after paint, or the input isn't in the document yet.\n const raf = requestAnimationFrame(() => inputRef.current?.focus())\n\n // A modal surface must not leave the page behind it scrollable.\n const previousOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n\n return () => {\n cancelAnimationFrame(raf)\n document.body.style.overflow = previousOverflow\n // Restoring focus is what stops a keyboard user being dumped at the top of the document.\n restoreFocusRef.current?.focus?.()\n }\n }, [open])\n\n // --- Keyboard ------------------------------------------------------------\n const onKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n // Wraps, because a palette with five items shouldn't dead-end at the bottom.\n setActive((i) => (results.length === 0 ? 0 : (i + 1) % results.length))\n break\n case 'ArrowUp':\n event.preventDefault()\n setActive((i) => (results.length === 0 ? 0 : (i - 1 + results.length) % results.length))\n break\n case 'Home':\n event.preventDefault()\n setActive(0)\n break\n case 'End':\n event.preventDefault()\n setActive(Math.max(0, results.length - 1))\n break\n case 'Enter':\n event.preventDefault()\n select(results[active])\n break\n case 'Escape':\n event.preventDefault()\n close()\n break\n case 'Tab': {\n // Trap focus. The palette has exactly one focusable element, so Tab simply stays put —\n // but it must be prevented, or focus escapes to the page behind the scrim.\n event.preventDefault()\n break\n }\n }\n }\n\n // Keep the highlighted row in view during keyboard navigation.\n useEffect(() => {\n if (!open) return\n const node = document.getElementById(`${listId}-option-${active}`)\n // Optional-called: `scrollIntoView` is absent in jsdom and in some embedded webviews. Keeping\n // the selection visible is a nicety; throwing because the host lacks the method would take the\n // whole palette down, which is not a trade worth making.\n node?.scrollIntoView?.({ block: 'nearest' })\n }, [active, listId, open])\n\n if (!open) return null\n\n // Group headings are emitted when the group changes, so ordering by relevance still produces\n // sensible headings rather than repeating them.\n let lastGroup: string | undefined\n\n return (\n <div\n className=\"ansh-cmdk__backdrop\"\n // Clicking the scrim dismisses, but only when the click started on the scrim itself —\n // otherwise a drag that ends outside the dialog closes it unexpectedly.\n onMouseDown={(event) => {\n if (event.target === event.currentTarget) close()\n }}\n >\n <div\n ref={dialogRef}\n className=\"ansh-cmdk\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n >\n <input\n ref={inputRef}\n className=\"ansh-cmdk__input\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n // The combobox contract: focus stays here while the selection moves virtually.\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={results.length > 0 ? `${listId}-option-${active}` : undefined}\n autoComplete=\"off\"\n spellCheck={false}\n />\n\n {results.length === 0 ? (\n <div className=\"ansh-cmdk__empty\">{emptyMessage}</div>\n ) : (\n <ul className=\"ansh-cmdk__list\" id={listId} role=\"listbox\" aria-label=\"Commands\">\n {results.map((item, index) => {\n const heading = item.group && item.group !== lastGroup ? item.group : null\n lastGroup = item.group\n\n return (\n <li key={item.id} role=\"presentation\">\n {heading ? (\n <div className=\"ansh-cmdk__group\" role=\"presentation\">\n {heading}\n </div>\n ) : null}\n <div\n id={`${listId}-option-${index}`}\n className=\"ansh-cmdk__item\"\n role=\"option\"\n aria-selected={index === active}\n // Pointer hover moves the selection so mouse and keyboard agree on what\n // Enter will do.\n onMouseEnter={() => setActive(index)}\n onClick={() => select(item)}\n >\n {item.icon}\n <span>{item.label}</span>\n {item.shortcut ? <kbd className=\"ansh-cmdk__kbd\">{item.shortcut}</kbd> : null}\n </div>\n </li>\n )\n })}\n </ul>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Bind a keyboard shortcut that toggles state — `⌘K` by default.\n *\n * ```tsx\n * const [open, setOpen] = useState(false)\n * useCommandShortcut(() => setOpen((v) => !v))\n * ```\n */\nexport function useCommandShortcut(toggle: () => void, key = 'k'): void {\n const toggleRef = useRef(toggle)\n toggleRef.current = toggle\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n // `metaKey` on macOS, `ctrlKey` elsewhere — checking both is simpler and correct on each.\n if (event.key.toLowerCase() === key && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n toggleRef.current()\n }\n }\n window.addEventListener('keydown', onKeyDown)\n return () => window.removeEventListener('keydown', onKeyDown)\n }, [key])\n}\n","import {\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { type Placement } from '../../primitives/position'\nimport { cx } from '../../primitives/compose'\nimport { Portal } from '../../primitives/portal'\nimport { Slot } from '../../primitives/slot'\nimport { useAnchoredPosition } from '../../primitives/use-anchored-position'\nimport { useControllableState } from '../../primitives/use-controllable-state'\nimport { useDismiss } from '../../primitives/use-dismiss'\nimport { useFocusTrap, useAutoFocus, useFocusRestore } from '../../primitives/focus'\nimport { usePresence } from '../../primitives/presence'\n\n/**\n * A popover.\n *\n * The compound API (`Popover` / `PopoverTrigger` / `PopoverContent`) rather than a single component\n * with a `content` prop, because the trigger needs attributes that only the popover can supply —\n * `aria-expanded`, `aria-controls` — and a `content` prop can't put them anywhere.\n *\n * Focus moves into the content on open and returns to the trigger on close, and Tab is trapped\n * inside. A popover containing a form that lets Tab wander onto the page behind it is a popover\n * keyboard users cannot fill in.\n */\n\ninterface PopoverContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.MutableRefObject<HTMLElement | null>\n contentId: string\n placement: Placement\n offset: number\n modal: boolean\n}\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null)\n\nfunction usePopover(component: string): PopoverContextValue {\n const context = useContext(PopoverContext)\n if (!context) {\n throw new Error(`<${component}> must be rendered inside <Popover>.`)\n }\n return context\n}\n\nexport interface PopoverProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n placement?: Placement\n /** Gap from the trigger, in px. Default `8`. */\n offset?: number\n /** Trap focus and block interaction behind. Default `false` — most popovers are non-modal. */\n modal?: boolean\n children: ReactNode\n}\n\nexport function Popover({\n open,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottom',\n offset = 8,\n modal = false,\n children,\n}: PopoverProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = useRef<HTMLElement | null>(null)\n const contentId = useId()\n\n const context = useMemo(\n () => ({ open: isOpen, setOpen, triggerRef, contentId, placement, offset, modal }),\n [isOpen, setOpen, contentId, placement, offset, modal],\n )\n\n return <PopoverContext.Provider value={context}>{children}</PopoverContext.Provider>\n}\n\nexport interface PopoverTriggerProps extends React.HTMLAttributes<HTMLElement> {\n /** Render into the child element rather than emitting a `<button>`. */\n asChild?: boolean\n children: ReactNode\n}\n\nexport function PopoverTrigger({ asChild = false, children, ...rest }: PopoverTriggerProps) {\n const { open, setOpen, triggerRef, contentId } = usePopover('PopoverTrigger')\n // Widened to `ElementType`: the union of `Slot` and `'button'` makes TypeScript intersect their\n // two ref signatures, which nothing can satisfy. The runtime behaviour is identical.\n const Component = (asChild ? Slot : 'button') as React.ElementType\n\n return (\n <Component\n ref={triggerRef as React.Ref<HTMLElement>}\n {...(asChild ? null : { type: 'button' as const })}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n {...rest}\n onClick={(event: React.MouseEvent<HTMLElement>) => {\n rest.onClick?.(event)\n if (event.defaultPrevented) return\n setOpen(!open)\n }}\n >\n {children}\n </Component>\n )\n}\n\nexport interface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Draw an arrow pointing at the trigger. Default `false`. */\n arrow?: boolean\n /** Match the trigger's width — for a popover acting as a dropdown panel. */\n matchWidth?: boolean\n /** Accessible name. Required unless the content contains its own heading. */\n label?: string\n children: ReactNode\n}\n\nexport function PopoverContent({\n arrow = false,\n matchWidth = false,\n label,\n className,\n style,\n children,\n ...rest\n}: PopoverContentProps) {\n const { open, setOpen, triggerRef, contentId, placement, offset, modal } =\n usePopover('PopoverContent')\n\n const contentRef = useRef<HTMLDivElement | null>(null)\n const { mounted, state } = usePresence(open, contentRef)\n\n const position = useAnchoredPosition(triggerRef, contentRef, mounted, {\n placement,\n offset,\n matchWidth,\n arrowSize: arrow ? 10 : 0,\n })\n\n useDismiss(contentRef, open, () => setOpen(false), { ignore: [triggerRef] })\n useFocusTrap(contentRef, open && modal)\n useAutoFocus(contentRef, open)\n useFocusRestore(open)\n\n if (!mounted) return null\n\n return (\n <Portal>\n <div\n ref={contentRef}\n id={contentId}\n role=\"dialog\"\n aria-modal={modal || undefined}\n {...(label ? { 'aria-label': label } : null)}\n tabIndex={-1}\n data-state={state}\n data-side={position.side}\n className={cx('ansh-popover', className)}\n style={{ ...position.style, ...style }}\n {...rest}\n >\n {children}\n {arrow && position.arrowStyle ? (\n <span className=\"ansh-popover__arrow\" style={position.arrowStyle} aria-hidden=\"true\" />\n ) : null}\n </div>\n </Portal>\n )\n}\n\n// --- HoverCard ------------------------------------------------------------\n\nexport interface HoverCardProps {\n /** The card's contents. */\n content: ReactNode\n /** Delay before opening, in ms. Default `500`. */\n openDelay?: number\n /** Delay before closing, in ms. Default `200`. */\n closeDelay?: number\n placement?: Placement\n className?: string\n children: ReactNode\n}\n\n/**\n * A rich preview shown on hover — a user card on an @mention, a link preview.\n *\n * Two delays, not one. The open delay stops cards firing as the pointer sweeps across a paragraph\n * of links. The close delay is what lets the pointer travel from the trigger to the card without it\n * vanishing en route, which is the failure that makes hover cards feel broken.\n *\n * Hover-only content is invisible to keyboard and touch users, so this also opens on focus. It is\n * strictly for *supplementary* information — anything essential belongs in a click-opened popover.\n */\nexport function HoverCard({\n content,\n openDelay = 500,\n closeDelay = 200,\n placement = 'bottom',\n className,\n children,\n}: HoverCardProps) {\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLSpanElement | null>(null)\n const cardRef = useRef<HTMLDivElement | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const id = useId()\n\n const { mounted, state } = usePresence(open, cardRef)\n const position = useAnchoredPosition(triggerRef, cardRef, mounted, { placement, offset: 8 })\n\n const schedule = (next: boolean) => {\n clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setOpen(next), next ? openDelay : closeDelay)\n }\n\n useEffect(() => () => clearTimeout(timerRef.current), [])\n\n return (\n <>\n <span\n ref={triggerRef}\n className=\"ansh-hovercard__trigger\"\n // `aria-describedby` rather than `aria-details`: support for details is still patchy, and\n // a description is the honest relationship for supplementary content.\n aria-describedby={open ? id : undefined}\n onMouseEnter={() => schedule(true)}\n onMouseLeave={() => schedule(false)}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n {children}\n </span>\n\n {mounted ? (\n <Portal>\n <div\n ref={cardRef}\n id={id}\n role=\"tooltip\"\n data-state={state}\n className={cx('ansh-hovercard', className)}\n style={position.style}\n // Keeping the card open while the pointer is over it is what makes its contents\n // clickable at all.\n onMouseEnter={() => schedule(true)}\n onMouseLeave={() => schedule(false)}\n >\n {content}\n </div>\n </Portal>\n ) : null}\n </>\n )\n}\n","import {\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { type Placement } from '../../primitives/position'\nimport { cx } from '../../primitives/compose'\nimport { Portal } from '../../primitives/portal'\nimport { Slot } from '../../primitives/slot'\nimport { useAnchoredPosition } from '../../primitives/use-anchored-position'\nimport { usePresence } from '../../primitives/presence'\n\n/**\n * Tooltips.\n *\n * The rules this follows, all from WCAG 1.4.13 (Content on Hover or Focus) and the ARIA practices:\n *\n * - **Focus shows it too.** A tooltip only on hover doesn't exist for keyboard users.\n * - **Escape dismisses it** without moving focus, for anyone whose magnifier it is covering.\n * - **It is a description, not a name.** Wired with `aria-describedby`, so the trigger keeps its\n * own label. Using it as the label means an icon button announces nothing until the tooltip\n * opens, which on touch is never.\n * - **It never contains interactive content.** There is no way to reach a button inside a tooltip\n * with a keyboard. That's what `HoverCard` and `Popover` are for.\n *\n * Never put essential information here: tooltips do not appear on touch devices at all.\n */\n\ninterface TooltipGroupValue {\n /** Whether some tooltip in the group is already open — the next skips its delay. */\n active: boolean\n setActive: (active: boolean) => void\n delay: number\n}\n\nconst TooltipGroupContext = createContext<TooltipGroupValue | null>(null)\n\nexport interface TooltipProviderProps {\n /** Delay before the first tooltip in a group opens, in ms. Default `600`. */\n delay?: number\n children: ReactNode\n}\n\n/**\n * Share a delay across a set of tooltips.\n *\n * Once one is open, moving to a neighbour shows its tooltip immediately. Without this, scanning a\n * toolbar means waiting out the delay on every single button — the behaviour every desktop OS gets\n * right and most web implementations miss.\n */\nexport function TooltipProvider({ delay = 600, children }: TooltipProviderProps) {\n const [active, setActive] = useState(false)\n const value = useMemo(() => ({ active, setActive, delay }), [active, delay])\n return <TooltipGroupContext.Provider value={value}>{children}</TooltipGroupContext.Provider>\n}\n\nexport interface TooltipProps {\n /** The tooltip text. Keep it short — it is read as one description. */\n content: ReactNode\n placement?: Placement\n /** Override the group delay, in ms. */\n delay?: number\n /** Draw an arrow. Default `true`. */\n arrow?: boolean\n disabled?: boolean\n className?: string\n children: ReactNode\n}\n\nexport function Tooltip({\n content,\n placement = 'top',\n delay,\n arrow = true,\n disabled = false,\n className,\n children,\n}: TooltipProps) {\n const group = useContext(TooltipGroupContext)\n const [open, setOpen] = useState(false)\n\n const triggerRef = useRef<HTMLElement | null>(null)\n const tipRef = useRef<HTMLDivElement | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const id = useId()\n\n const { mounted, state } = usePresence(open, tipRef)\n const position = useAnchoredPosition(triggerRef, tipRef, mounted, {\n placement,\n offset: 6,\n arrowSize: arrow ? 8 : 0,\n })\n\n const effectiveDelay = delay ?? group?.delay ?? 600\n\n const show = (immediate = false) => {\n if (disabled) return\n clearTimeout(timerRef.current)\n // Skip the delay when a sibling tooltip is already open, or on focus — a keyboard user has\n // already made a deliberate move and shouldn't be made to wait.\n if (immediate || group?.active) {\n setOpen(true)\n group?.setActive(true)\n return\n }\n timerRef.current = setTimeout(() => {\n setOpen(true)\n group?.setActive(true)\n }, effectiveDelay)\n }\n\n const hide = () => {\n clearTimeout(timerRef.current)\n setOpen(false)\n // Grace period before the group goes cold, so moving between adjacent triggers stays instant.\n timerRef.current = setTimeout(() => group?.setActive(false), 200)\n }\n\n useEffect(() => () => clearTimeout(timerRef.current), [])\n\n // WCAG 1.4.13: dismissable without moving the pointer or focus.\n useEffect(() => {\n if (!open) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setOpen(false)\n group?.setActive(false)\n }\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [open, group])\n\n return (\n <>\n <Slot\n ref={triggerRef as React.Ref<HTMLElement>}\n aria-describedby={open ? id : undefined}\n onMouseEnter={() => show()}\n onMouseLeave={hide}\n onFocus={() => show(true)}\n onBlur={hide}\n >\n {children}\n </Slot>\n\n {mounted && !disabled ? (\n <Portal>\n <div\n ref={tipRef}\n id={id}\n role=\"tooltip\"\n data-state={state}\n data-side={position.side}\n className={cx('ansh-tooltip', className)}\n style={position.style}\n >\n {content}\n {arrow && position.arrowStyle ? (\n <span\n className=\"ansh-tooltip__arrow\"\n style={position.arrowStyle}\n aria-hidden=\"true\"\n />\n ) : null}\n </div>\n </Portal>\n ) : null}\n </>\n )\n}\n","import { type ReactNode, useCallback, useId, useRef } from 'react'\nimport { cx } from '../../primitives/compose'\nimport { Portal } from '../../primitives/portal'\nimport { useAutoFocus, useFocusRestore, useFocusTrap } from '../../primitives/focus'\nimport { usePresence } from '../../primitives/presence'\nimport { useDismiss, useScrollLock } from '../../primitives/use-dismiss'\n\nexport type DialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full'\n\nexport interface DialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** The dialog's accessible name. Required — a dialog announced as just \"dialog\" is useless. */\n title: ReactNode\n /** Supporting text, wired to `aria-describedby`. */\n description?: ReactNode\n size?: DialogSize\n /** Actions row, pinned below the scrollable body. */\n footer?: ReactNode\n /** Show the ✕ button. Default `true`. */\n showClose?: boolean\n /** Allow closing via scrim click and Escape. Default `true`. */\n dismissable?: boolean\n /** Element to focus on open. Defaults to the first tabbable one. */\n initialFocus?: React.RefObject<HTMLElement | null>\n className?: string\n children?: ReactNode\n}\n\n/**\n * A modal dialog.\n *\n * Not `<dialog showModal>`: the native element's top-layer behaviour is genuinely better, but its\n * backdrop cannot be animated consistently, `::backdrop` inherits nothing, and closing behaviour\n * differs enough across browsers to need working around anyway. The pieces the native element gives\n * for free — focus trap, scroll lock, inert background, focus restore — are all here explicitly.\n *\n * `title` is a required prop rather than an optional slot. Every accessibility audit of a component\n * library turns up unnamed dialogs, and the reliable fix is to make the name impossible to omit.\n */\nexport function Dialog({\n open,\n onOpenChange,\n title,\n description,\n size = 'md',\n footer,\n showClose = true,\n dismissable = true,\n initialFocus,\n className,\n children,\n}: DialogProps) {\n const panelRef = useRef<HTMLDivElement | null>(null)\n const id = useId()\n const titleId = `${id}-title`\n const descriptionId = `${id}-description`\n\n const { mounted, state } = usePresence(open, panelRef)\n\n const close = useCallback(() => {\n if (dismissable) onOpenChange(false)\n }, [dismissable, onOpenChange])\n\n useDismiss(panelRef, open, close, { outsidePress: dismissable, escapeKey: dismissable })\n useFocusTrap(panelRef, open)\n useAutoFocus(panelRef, open, initialFocus)\n useFocusRestore(open)\n useScrollLock(open)\n\n if (!mounted) return null\n\n return (\n <Portal>\n <div className=\"ansh-dialog__layer\" data-state={state}>\n {/* The scrim is not a button and takes no focus — it's decorative. Dismissal is handled\n by `useDismiss` on a pointerdown outside the panel, which also covers the gap around\n the panel that isn't the scrim element itself. */}\n <div className=\"ansh-dialog__scrim\" data-state={state} aria-hidden=\"true\" />\n\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n {...(description ? { 'aria-describedby': descriptionId } : null)}\n tabIndex={-1}\n data-state={state}\n className={cx('ansh-dialog', `ansh-dialog--${size}`, className)}\n >\n <header className=\"ansh-dialog__header\">\n <div className=\"ansh-dialog__heading\">\n <h2 className=\"ansh-dialog__title\" id={titleId}>\n {title}\n </h2>\n {description ? (\n <p className=\"ansh-dialog__description\" id={descriptionId}>\n {description}\n </p>\n ) : null}\n </div>\n\n {showClose ? (\n <button\n type=\"button\"\n className=\"ansh-dialog__close ansh-focusable\"\n aria-label=\"Close dialog\"\n onClick={() => onOpenChange(false)}\n >\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n ) : null}\n </header>\n\n {children ? <div className=\"ansh-dialog__body\">{children}</div> : null}\n {footer ? <footer className=\"ansh-dialog__footer\">{footer}</footer> : null}\n </div>\n </div>\n </Portal>\n )\n}\n\nexport interface AlertDialogProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n title: ReactNode\n description: ReactNode\n /** Confirm button text. Default `'Confirm'`. */\n confirmLabel?: string\n cancelLabel?: string\n /** Style the confirm action as destructive. */\n destructive?: boolean\n onConfirm: () => void | Promise<void>\n onCancel?: () => void\n /** Disable the buttons while an async confirm runs. */\n busy?: boolean\n className?: string\n}\n\n/**\n * A confirmation dialog.\n *\n * `role=\"alertdialog\"` and `aria-describedby` on the message, which makes a screen reader read the\n * consequence immediately on open rather than waiting for the user to navigate to it. That is the\n * entire difference from a regular dialog, and it matters precisely because these appear before\n * irreversible actions.\n *\n * It is deliberately **not** dismissable by clicking the scrim: an accidental click outside should\n * not silently cancel a decision the user was asked to make. Escape still works, because trapping\n * someone in a dialog is worse.\n *\n * Focus starts on **Cancel**, not Confirm. A keyboard user who hits Enter reflexively should not\n * delete their account.\n */\nexport function AlertDialog({\n open,\n onOpenChange,\n title,\n description,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n destructive = false,\n onConfirm,\n onCancel,\n busy = false,\n className,\n}: AlertDialogProps) {\n const panelRef = useRef<HTMLDivElement | null>(null)\n const cancelRef = useRef<HTMLButtonElement | null>(null)\n const id = useId()\n\n const { mounted, state } = usePresence(open, panelRef)\n\n const cancel = useCallback(() => {\n onCancel?.()\n onOpenChange(false)\n }, [onCancel, onOpenChange])\n\n useDismiss(panelRef, open, cancel, { outsidePress: false, escapeKey: true })\n useFocusTrap(panelRef, open)\n useAutoFocus(panelRef, open, cancelRef)\n useFocusRestore(open)\n useScrollLock(open)\n\n if (!mounted) return null\n\n return (\n <Portal>\n <div className=\"ansh-dialog__layer\" data-state={state}>\n <div className=\"ansh-dialog__scrim\" data-state={state} aria-hidden=\"true\" />\n\n <div\n ref={panelRef}\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby={`${id}-title`}\n aria-describedby={`${id}-description`}\n tabIndex={-1}\n data-state={state}\n className={cx('ansh-dialog', 'ansh-dialog--sm', 'ansh-dialog--alert', className)}\n >\n <div className=\"ansh-dialog__body\">\n {destructive ? (\n <span\n className=\"ansh-dialog__alert-icon ansh-dialog__alert-icon--danger\"\n aria-hidden=\"true\"\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n >\n <path d=\"M12 8v5\" strokeLinecap=\"round\" />\n <circle cx=\"12\" cy=\"16.5\" r=\"1\" fill=\"currentColor\" stroke=\"none\" />\n <path\n d=\"M10.3 3.9L2.6 17.4A2 2 0 004.3 20.4h15.4a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n ) : null}\n\n <h2 className=\"ansh-dialog__title\" id={`${id}-title`}>\n {title}\n </h2>\n <p className=\"ansh-dialog__description\" id={`${id}-description`}>\n {description}\n </p>\n </div>\n\n <footer className=\"ansh-dialog__footer\">\n <button\n ref={cancelRef}\n type=\"button\"\n className=\"ansh-btn ansh-btn--ghost ansh-btn--sm ansh-focusable\"\n disabled={busy}\n onClick={cancel}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n className={cx(\n 'ansh-btn',\n 'ansh-btn--sm',\n destructive ? 'ansh-btn--danger' : 'ansh-btn--solid',\n 'ansh-focusable',\n )}\n disabled={busy}\n onClick={() => void onConfirm()}\n >\n {busy ? <span className=\"ansh-spinner ansh-spinner--sm\" aria-hidden=\"true\" /> : null}\n {confirmLabel}\n </button>\n </footer>\n </div>\n </div>\n </Portal>\n )\n}\n\n/** Layout helper for a dialog's action row. Right-aligned, reversed on narrow screens. */\nexport function DialogFooter({ children, className }: { children: ReactNode; className?: string }) {\n return <div className={cx('ansh-dialog__actions', className)}>{children}</div>\n}\n","import { type ReactNode, useCallback, useId, useRef } from 'react'\nimport { cx } from '../../primitives/compose'\nimport { Portal } from '../../primitives/portal'\nimport { useAutoFocus, useFocusRestore, useFocusTrap } from '../../primitives/focus'\nimport { usePresence } from '../../primitives/presence'\nimport { useDismiss, useScrollLock } from '../../primitives/use-dismiss'\n\nexport type DrawerSide = 'left' | 'right' | 'top' | 'bottom'\n\nexport interface DrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Which edge it slides from. Default `'right'`. */\n side?: DrawerSide\n title: ReactNode\n description?: ReactNode\n /** Width for left/right, height for top/bottom. Default `'22rem'`. */\n size?: string\n footer?: ReactNode\n showClose?: boolean\n /** Block interaction behind and lock scroll. Default `true`. */\n modal?: boolean\n dismissable?: boolean\n className?: string\n children?: ReactNode\n}\n\n/**\n * A panel that slides in from an edge.\n *\n * Same accessibility contract as `Dialog` — it is a dialog, just positioned differently. The reason\n * it exists separately is that the *content* pattern differs: drawers hold navigation, filters and\n * detail views that stay open while the user works, so they support a non-modal mode where the page\n * behind stays usable.\n *\n * On a phone a bottom drawer is the right shape for what would be a dialog on a desktop; that's a\n * layout decision for the consumer, which is why `side` is a plain prop rather than a breakpoint\n * rule baked in here.\n */\nexport function Drawer({\n open,\n onOpenChange,\n side = 'right',\n title,\n description,\n size = '22rem',\n footer,\n showClose = true,\n modal = true,\n dismissable = true,\n className,\n children,\n}: DrawerProps) {\n const panelRef = useRef<HTMLDivElement | null>(null)\n const id = useId()\n\n const { mounted, state } = usePresence(open, panelRef)\n\n const close = useCallback(() => {\n if (dismissable) onOpenChange(false)\n }, [dismissable, onOpenChange])\n\n useDismiss(panelRef, open, close, { outsidePress: dismissable && modal, escapeKey: dismissable })\n useFocusTrap(panelRef, open && modal)\n useAutoFocus(panelRef, open)\n useFocusRestore(open)\n useScrollLock(open && modal)\n\n if (!mounted) return null\n\n const horizontal = side === 'left' || side === 'right'\n\n return (\n <Portal>\n <div\n className={cx('ansh-drawer__layer', !modal && 'ansh-drawer__layer--inline')}\n data-state={state}\n >\n {modal ? (\n <div className=\"ansh-dialog__scrim\" data-state={state} aria-hidden=\"true\" />\n ) : null}\n\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal={modal || undefined}\n aria-labelledby={`${id}-title`}\n {...(description ? { 'aria-describedby': `${id}-description` } : null)}\n tabIndex={-1}\n data-state={state}\n data-side={side}\n className={cx('ansh-drawer', `ansh-drawer--${side}`, className)}\n // The size travels as a custom property so the closed-state transform can be written in\n // terms of it — `translateX(100%)` alone breaks when the panel has a max-width.\n style={{\n [horizontal ? 'width' : 'height']: size,\n ['--ansh-drawer-size' as string]: size,\n }}\n >\n <header className=\"ansh-drawer__header\">\n <div className=\"ansh-dialog__heading\">\n <h2 className=\"ansh-dialog__title\" id={`${id}-title`}>\n {title}\n </h2>\n {description ? (\n <p className=\"ansh-dialog__description\" id={`${id}-description`}>\n {description}\n </p>\n ) : null}\n </div>\n\n {showClose ? (\n <button\n type=\"button\"\n className=\"ansh-dialog__close ansh-focusable\"\n aria-label=\"Close panel\"\n onClick={() => onOpenChange(false)}\n >\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n </button>\n ) : null}\n </header>\n\n <div className=\"ansh-drawer__body\">{children}</div>\n {footer ? <footer className=\"ansh-drawer__footer\">{footer}</footer> : null}\n </div>\n </div>\n </Portal>\n )\n}\n","import { type ReactNode, useCallback, useEffect, useId, useRef, useState } from 'react'\nimport { type Placement } from '../../primitives/position'\nimport { cx } from '../../primitives/compose'\nimport { Portal } from '../../primitives/portal'\nimport { Slot } from '../../primitives/slot'\nimport { useAnchoredPosition } from '../../primitives/use-anchored-position'\nimport { useDismiss } from '../../primitives/use-dismiss'\nimport { usePresence } from '../../primitives/presence'\n\n/**\n * Menus — dropdown and context.\n *\n * Data-driven (`items={[…]}`) rather than compound. Menus are almost always built from a\n * configuration array anyway — permissions filter entries, a selection decides what's enabled — and\n * expressing that as JSX children means `{canDelete && <MenuItem …/>}` scattered through the tree,\n * which breaks keyboard navigation indices in ways that are painful to debug.\n *\n * Follows the ARIA menu pattern, where **DOM focus moves to the item** (unlike a listbox, which\n * keeps focus on the container). That's what makes Right/Left arrow submenu traversal work the way\n * it does in every desktop application.\n */\n\ninterface MenuItemBase {\n id?: string\n disabled?: boolean\n}\n\nexport interface MenuAction extends MenuItemBase {\n type?: 'item'\n label: ReactNode\n icon?: ReactNode\n /** Display-only shortcut hint, e.g. `'⌘S'`. */\n shortcut?: string\n /** Style as destructive, and mark it in the accessible name. */\n danger?: boolean\n onSelect?: () => void\n}\n\nexport interface MenuCheckbox extends MenuItemBase {\n type: 'checkbox'\n label: ReactNode\n checked: boolean\n onChange: (checked: boolean) => void\n shortcut?: string\n}\n\nexport interface MenuRadioGroup {\n type: 'radio'\n value: string\n onChange: (value: string) => void\n options: ReadonlyArray<{ value: string; label: ReactNode; disabled?: boolean }>\n}\n\nexport interface MenuSubmenu extends MenuItemBase {\n type: 'submenu'\n label: ReactNode\n icon?: ReactNode\n items: readonly MenuEntry[]\n}\n\nexport type MenuEntry =\n | MenuAction\n | MenuCheckbox\n | MenuRadioGroup\n | MenuSubmenu\n | { type: 'separator' }\n | { type: 'label'; label: ReactNode }\n\n/** Flatten to the rows that can actually receive focus, for keyboard navigation. */\ninterface Focusable {\n entry: MenuEntry\n /** For radio groups, which option this row is. */\n optionIndex?: number\n disabled: boolean\n}\n\nfunction flatten(items: readonly MenuEntry[]): Focusable[] {\n const rows: Focusable[] = []\n for (const entry of items) {\n if ('type' in entry && (entry.type === 'separator' || entry.type === 'label')) continue\n if ('type' in entry && entry.type === 'radio') {\n entry.options.forEach((option, optionIndex) => {\n rows.push({ entry, optionIndex, disabled: option.disabled ?? false })\n })\n continue\n }\n rows.push({ entry, disabled: (entry as MenuItemBase).disabled ?? false })\n }\n return rows\n}\n\nexport interface MenuProps {\n items: readonly MenuEntry[]\n placement?: Placement\n /** Accessible name for the menu itself. */\n label?: string\n className?: string\n /** The control that opens the menu. */\n children: ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\n/**\n * A dropdown menu.\n *\n * ```tsx\n * <DropdownMenu items={[\n * { label: 'Edit', shortcut: '⌘E', onSelect: edit },\n * { type: 'separator' },\n * { label: 'Delete', danger: true, onSelect: remove },\n * ]}>\n * <IconButton label=\"Actions\" />\n * </DropdownMenu>\n * ```\n */\nexport function DropdownMenu({\n items,\n placement = 'bottom-start',\n label = 'Menu',\n className,\n children,\n open: controlledOpen,\n onOpenChange,\n}: MenuProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false)\n const open = controlledOpen ?? uncontrolledOpen\n const setOpen = useCallback(\n (next: boolean) => {\n setUncontrolledOpen(next)\n onOpenChange?.(next)\n },\n [onOpenChange],\n )\n\n const triggerRef = useRef<HTMLElement | null>(null)\n const menuRef = useRef<HTMLDivElement | null>(null)\n const menuId = useId()\n\n const { mounted, state } = usePresence(open, menuRef)\n const position = useAnchoredPosition(triggerRef, menuRef, mounted, { placement, offset: 6 })\n useDismiss(menuRef, open, () => setOpen(false), { ignore: [triggerRef] })\n\n return (\n <>\n <Slot\n ref={triggerRef as React.Ref<HTMLElement>}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen(!open)}\n onKeyDown={(event: React.KeyboardEvent) => {\n // ArrowDown opens *and* lands on the first item, which is the single most-used path\n // into a menu for keyboard users.\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n setOpen(true)\n }\n }}\n >\n {children}\n </Slot>\n\n {mounted ? (\n <Portal>\n <MenuSurface\n ref={menuRef}\n id={menuId}\n items={items}\n label={label}\n state={state}\n style={position.style}\n className={className}\n onClose={() => {\n setOpen(false)\n triggerRef.current?.focus?.()\n }}\n />\n </Portal>\n ) : null}\n </>\n )\n}\n\nexport interface ContextMenuProps {\n items: readonly MenuEntry[]\n label?: string\n className?: string\n children: ReactNode\n}\n\n/**\n * A right-click menu.\n *\n * Also opens on the **context-menu key** and on Shift+F10, which is how keyboard users reach one —\n * a right-click-only implementation is inaccessible, and it is the most commonly missed keyboard\n * binding in the whole component set.\n *\n * Anchored to the pointer via a zero-size virtual rect, so the existing positioning code flips and\n * shifts it near the viewport edges without needing a separate path.\n */\nexport function ContextMenu({\n items,\n label = 'Context menu',\n className,\n children,\n}: ContextMenuProps) {\n const [point, setPoint] = useState<{ x: number; y: number } | null>(null)\n const menuRef = useRef<HTMLDivElement | null>(null)\n const anchorRef = useRef<HTMLSpanElement | null>(null)\n const menuId = useId()\n\n const open = point !== null\n const { mounted, state } = usePresence(open, menuRef)\n const position = useAnchoredPosition(anchorRef, menuRef, mounted, {\n placement: 'bottom-start',\n offset: 2,\n })\n\n useDismiss(menuRef, open, () => setPoint(null))\n\n return (\n <>\n <span\n className=\"ansh-contextmenu__area\"\n onContextMenu={(event) => {\n event.preventDefault()\n setPoint({ x: event.clientX, y: event.clientY })\n }}\n onKeyDown={(event) => {\n if (event.key === 'ContextMenu' || (event.shiftKey && event.key === 'F10')) {\n event.preventDefault()\n const rect = event.currentTarget.getBoundingClientRect()\n setPoint({ x: rect.left + 8, y: rect.top + 8 })\n }\n }}\n >\n {children}\n </span>\n\n {/* A zero-size anchor placed at the pointer. Cheaper than teaching the positioner about\n virtual elements, and it inherits flip/shift behaviour for free. */}\n {point ? (\n <span\n ref={anchorRef}\n aria-hidden=\"true\"\n style={{ position: 'fixed', left: point.x, top: point.y, width: 0, height: 0 }}\n />\n ) : null}\n\n {mounted ? (\n <Portal>\n <MenuSurface\n ref={menuRef}\n id={menuId}\n items={items}\n label={label}\n state={state}\n style={position.style}\n className={className}\n onClose={() => setPoint(null)}\n />\n </Portal>\n ) : null}\n </>\n )\n}\n\n// --- The menu surface itself ---------------------------------------------\n\ninterface MenuSurfaceProps {\n id: string\n items: readonly MenuEntry[]\n label: string\n state: 'open' | 'closed'\n style: React.CSSProperties\n className?: string | undefined\n onClose: () => void\n}\n\nconst MenuSurface = function MenuSurface({\n ref,\n id,\n items,\n label,\n state,\n style,\n className,\n onClose,\n}: MenuSurfaceProps & { ref: React.Ref<HTMLDivElement> }) {\n const rows = flatten(items)\n const itemRefs = useRef<Array<HTMLElement | null>>([])\n const [active, setActive] = useState(() => rows.findIndex((row) => !row.disabled))\n const [openSubmenu, setOpenSubmenu] = useState<number | null>(null)\n const typeaheadRef = useRef({\n buffer: '',\n timer: undefined as ReturnType<typeof setTimeout> | undefined,\n })\n\n // Focus the first enabled item on open. The ARIA menu pattern puts DOM focus on the item, which\n // is what allows Right-arrow to hand focus to a submenu and Left-arrow to take it back.\n useEffect(() => {\n itemRefs.current[active]?.focus()\n // Only on mount: afterwards focus follows the keyboard handler below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const move = (delta: number) => {\n if (rows.length === 0) return\n let next = active\n for (let attempts = 0; attempts < rows.length; attempts++) {\n next = (next + delta + rows.length) % rows.length\n if (!rows[next]?.disabled) break\n }\n setActive(next)\n itemRefs.current[next]?.focus()\n }\n\n const activate = (index: number) => {\n const row = rows[index]\n if (!row || row.disabled) return\n const { entry } = row\n\n if ('type' in entry && entry.type === 'submenu') {\n setOpenSubmenu(index)\n return\n }\n if ('type' in entry && entry.type === 'checkbox') {\n entry.onChange(!entry.checked)\n // Checkbox items keep the menu open: toggling three view options should not require\n // reopening the menu twice.\n return\n }\n if ('type' in entry && entry.type === 'radio') {\n entry.onChange(entry.options[row.optionIndex!]!.value)\n onClose()\n return\n }\n ;(entry as MenuAction).onSelect?.()\n onClose()\n }\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n move(1)\n break\n case 'ArrowUp':\n event.preventDefault()\n move(-1)\n break\n case 'Home':\n event.preventDefault()\n setActive(0)\n itemRefs.current[0]?.focus()\n break\n case 'End':\n event.preventDefault()\n setActive(rows.length - 1)\n itemRefs.current[rows.length - 1]?.focus()\n break\n case 'Enter':\n case ' ':\n event.preventDefault()\n activate(active)\n break\n case 'ArrowRight': {\n const row = rows[active]\n if (row && 'type' in row.entry && row.entry.type === 'submenu') {\n event.preventDefault()\n setOpenSubmenu(active)\n }\n break\n }\n case 'Escape':\n event.preventDefault()\n onClose()\n break\n case 'Tab':\n // A menu is a single stop in the tab order; Tab closes it rather than walking the items.\n event.preventDefault()\n onClose()\n break\n default: {\n if (event.key.length !== 1) return\n const state = typeaheadRef.current\n clearTimeout(state.timer)\n state.buffer += event.key.toLowerCase()\n state.timer = setTimeout(() => {\n state.buffer = ''\n }, 600)\n\n const match = rows.findIndex((row, index) => {\n if (row.disabled || index === active) return false\n const text =\n typeof (row.entry as MenuAction).label === 'string'\n ? ((row.entry as MenuAction).label as string)\n : ''\n return text.toLowerCase().startsWith(state.buffer)\n })\n if (match >= 0) {\n setActive(match)\n itemRefs.current[match]?.focus()\n }\n }\n }\n }\n\n let rowIndex = -1\n\n return (\n <div\n ref={ref}\n id={id}\n role=\"menu\"\n aria-label={label}\n data-state={state}\n className={cx('ansh-menu', className)}\n style={style}\n onKeyDown={onKeyDown}\n >\n {items.map((entry, entryIndex) => {\n if ('type' in entry && entry.type === 'separator') {\n return <div key={`sep-${entryIndex}`} role=\"separator\" className=\"ansh-menu__separator\" />\n }\n\n if ('type' in entry && entry.type === 'label') {\n return (\n <div key={`label-${entryIndex}`} role=\"presentation\" className=\"ansh-menu__label\">\n {entry.label}\n </div>\n )\n }\n\n if ('type' in entry && entry.type === 'radio') {\n return (\n <div key={`radio-${entryIndex}`} role=\"group\" className=\"ansh-menu__group\">\n {entry.options.map((option) => {\n rowIndex++\n const index = rowIndex\n return (\n <div\n key={option.value}\n ref={(node) => {\n itemRefs.current[index] = node\n }}\n role=\"menuitemradio\"\n aria-checked={entry.value === option.value}\n aria-disabled={option.disabled || undefined}\n tabIndex={index === active ? 0 : -1}\n className={cx(\n 'ansh-menu__item',\n option.disabled && 'ansh-menu__item--disabled',\n )}\n onClick={() => activate(index)}\n onMouseEnter={() => !option.disabled && setActive(index)}\n >\n <span\n className={cx(\n 'ansh-menu__indicator',\n entry.value === option.value && 'ansh-menu__indicator--on',\n )}\n aria-hidden=\"true\"\n />\n <span className=\"ansh-menu__text\">{option.label}</span>\n </div>\n )\n })}\n </div>\n )\n }\n\n rowIndex++\n const index = rowIndex\n\n if ('type' in entry && entry.type === 'checkbox') {\n return (\n <div\n key={entry.id ?? `check-${entryIndex}`}\n ref={(node) => {\n itemRefs.current[index] = node\n }}\n role=\"menuitemcheckbox\"\n aria-checked={entry.checked}\n aria-disabled={entry.disabled || undefined}\n tabIndex={index === active ? 0 : -1}\n className={cx('ansh-menu__item', entry.disabled && 'ansh-menu__item--disabled')}\n onClick={() => activate(index)}\n onMouseEnter={() => !entry.disabled && setActive(index)}\n >\n <span\n className={cx(\n 'ansh-menu__indicator',\n 'ansh-menu__indicator--check',\n entry.checked && 'ansh-menu__indicator--on',\n )}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 14 14\" width=\"10\" height=\"10\">\n <path\n d=\"M2.5 7.5l3 3 6-6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n </span>\n <span className=\"ansh-menu__text\">{entry.label}</span>\n {entry.shortcut ? <kbd className=\"ansh-menu__shortcut\">{entry.shortcut}</kbd> : null}\n </div>\n )\n }\n\n if ('type' in entry && entry.type === 'submenu') {\n return (\n <Submenu\n key={entry.id ?? `sub-${entryIndex}`}\n ref={(node) => {\n itemRefs.current[index] = node\n }}\n entry={entry}\n active={index === active}\n open={openSubmenu === index}\n onOpenChange={(next) => setOpenSubmenu(next ? index : null)}\n onHover={() => setActive(index)}\n onCloseAll={onClose}\n />\n )\n }\n\n const action = entry as MenuAction\n return (\n <div\n key={action.id ?? `item-${entryIndex}`}\n ref={(node) => {\n itemRefs.current[index] = node\n }}\n role=\"menuitem\"\n aria-disabled={action.disabled || undefined}\n tabIndex={index === active ? 0 : -1}\n className={cx(\n 'ansh-menu__item',\n action.danger && 'ansh-menu__item--danger',\n action.disabled && 'ansh-menu__item--disabled',\n )}\n onClick={() => activate(index)}\n onMouseEnter={() => !action.disabled && setActive(index)}\n >\n {action.icon ? <span className=\"ansh-menu__icon\">{action.icon}</span> : null}\n <span className=\"ansh-menu__text\">{action.label}</span>\n {action.shortcut ? <kbd className=\"ansh-menu__shortcut\">{action.shortcut}</kbd> : null}\n </div>\n )\n })}\n </div>\n )\n}\n\ninterface SubmenuProps {\n ref: React.Ref<HTMLDivElement>\n entry: MenuSubmenu\n active: boolean\n open: boolean\n onOpenChange: (open: boolean) => void\n onHover: () => void\n onCloseAll: () => void\n}\n\nfunction Submenu({ ref, entry, active, open, onOpenChange, onHover, onCloseAll }: SubmenuProps) {\n const triggerRef = useRef<HTMLDivElement | null>(null)\n const panelRef = useRef<HTMLDivElement | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const id = useId()\n\n const { mounted, state } = usePresence(open, panelRef)\n const position = useAnchoredPosition(triggerRef, panelRef, mounted, {\n placement: 'right-start',\n offset: 2,\n })\n\n useEffect(() => () => clearTimeout(timerRef.current), [])\n\n return (\n <>\n <div\n ref={(node) => {\n triggerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? id : undefined}\n aria-disabled={entry.disabled || undefined}\n tabIndex={active ? 0 : -1}\n className={cx(\n 'ansh-menu__item',\n 'ansh-menu__item--submenu',\n entry.disabled && 'ansh-menu__item--disabled',\n )}\n onMouseEnter={() => {\n onHover()\n // A short delay before opening on hover, so dragging the pointer diagonally across a\n // submenu trigger toward another item doesn't flash a panel open.\n clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => onOpenChange(true), 120)\n }}\n onMouseLeave={() => {\n clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => onOpenChange(false), 200)\n }}\n onClick={() => onOpenChange(!open)}\n >\n {entry.icon ? <span className=\"ansh-menu__icon\">{entry.icon}</span> : null}\n <span className=\"ansh-menu__text\">{entry.label}</span>\n <span className=\"ansh-menu__chevron\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\">\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </div>\n\n {mounted ? (\n <Portal>\n <div\n onMouseEnter={() => clearTimeout(timerRef.current)}\n onMouseLeave={() => {\n timerRef.current = setTimeout(() => onOpenChange(false), 200)\n }}\n onKeyDown={(event) => {\n // Left arrow closes the submenu and returns focus to its trigger — the inverse of\n // the Right arrow that opened it.\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n event.stopPropagation()\n onOpenChange(false)\n triggerRef.current?.focus()\n }\n }}\n >\n <MenuSurface\n ref={panelRef}\n id={id}\n items={entry.items}\n label={typeof entry.label === 'string' ? entry.label : 'Submenu'}\n state={state}\n style={position.style}\n onClose={onCloseAll}\n />\n </div>\n </Portal>\n ) : null}\n </>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/tabs.tsx","../src/components/navigation/breadcrumbs.tsx","../src/components/navigation/nav-menu.tsx","../src/components/disclosure.tsx"],"names":["useControllableState","useId","useRef","jsxs","cx","jsx","useState","Fragment","useEffect"],"mappings":"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","file":"chunk-DATBU46V.cjs","sourcesContent":["import { type ReactNode, useId, useRef } from 'react'\nimport { cx } from '../../primitives/compose'\nimport { useControllableState } from '../../primitives/use-controllable-state'\n\nexport interface TabItem {\n id: string\n label: ReactNode\n icon?: ReactNode\n /** Count or status shown after the label. */\n badge?: ReactNode\n disabled?: boolean\n content?: ReactNode\n}\n\nexport interface TabsProps {\n items: readonly TabItem[]\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n variant?: 'underline' | 'pill' | 'enclosed'\n orientation?: 'horizontal' | 'vertical'\n size?: 'sm' | 'md'\n /** Stretch tabs to fill the available width. */\n fitted?: boolean\n /**\n * Activate on arrow-key focus, rather than requiring Enter.\n *\n * Automatic is the ARIA-preferred default for cheap panels. Set `false` when switching a tab\n * triggers a fetch — arrowing past three tabs would fire three requests.\n */\n activateOnFocus?: boolean\n /** Accessible name for the tab list. */\n label: string\n className?: string\n children?: ReactNode\n}\n\n/**\n * Tabs.\n *\n * The full WAI-ARIA tab pattern: a single tab stop for the whole list (roving tabindex), arrow keys\n * to move between tabs, Home/End to jump to the ends, and `aria-controls`/`aria-labelledby` linking\n * each tab to its panel in both directions.\n *\n * Panels are unmounted when inactive rather than hidden. Hiding keeps the whole tree mounted, which\n * means timers keep running, media keeps buffering and forms keep their state — the last of which\n * sounds desirable until a hidden required field blocks submission with no visible error.\n */\nexport function Tabs({\n items,\n value,\n defaultValue,\n onChange,\n variant = 'underline',\n orientation = 'horizontal',\n size = 'md',\n fitted = false,\n activateOnFocus = true,\n label,\n className,\n children,\n}: TabsProps) {\n const [active, setActive] = useControllableState<string>({\n value,\n defaultValue: defaultValue ?? items.find((item) => !item.disabled)?.id ?? '',\n onChange,\n })\n\n const baseId = useId()\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([])\n\n const activeIndex = items.findIndex((item) => item.id === active)\n const activeItem = items[activeIndex]\n\n const move = (delta: number) => {\n if (items.length === 0) return\n let next = activeIndex < 0 ? 0 : activeIndex\n for (let attempts = 0; attempts < items.length; attempts++) {\n next = (next + delta + items.length) % items.length\n if (!items[next]?.disabled) break\n }\n tabRefs.current[next]?.focus()\n if (activateOnFocus) setActive(items[next]!.id)\n }\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const forward = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const backward = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n\n switch (event.key) {\n case forward:\n event.preventDefault()\n move(1)\n break\n case backward:\n event.preventDefault()\n move(-1)\n break\n case 'Home': {\n event.preventDefault()\n const first = items.findIndex((item) => !item.disabled)\n if (first >= 0) {\n tabRefs.current[first]?.focus()\n if (activateOnFocus) setActive(items[first]!.id)\n }\n break\n }\n case 'End': {\n event.preventDefault()\n for (let i = items.length - 1; i >= 0; i--) {\n if (!items[i]?.disabled) {\n tabRefs.current[i]?.focus()\n if (activateOnFocus) setActive(items[i]!.id)\n break\n }\n }\n break\n }\n }\n }\n\n return (\n <div\n className={cx(\n 'ansh-tabs',\n `ansh-tabs--${variant}`,\n `ansh-tabs--${orientation}`,\n `ansh-tabs--${size}`,\n className,\n )}\n >\n <div\n role=\"tablist\"\n aria-label={label}\n aria-orientation={orientation}\n className={cx('ansh-tabs__list', fitted && 'ansh-tabs__list--fitted')}\n onKeyDown={onKeyDown}\n >\n {items.map((item, index) => {\n const selected = item.id === active\n return (\n <button\n key={item.id}\n ref={(node) => {\n tabRefs.current[index] = node\n }}\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-tab-${item.id}`}\n aria-selected={selected}\n aria-controls={`${baseId}-panel-${item.id}`}\n // Exactly one tab is in the tab order. Without this, a bar of eight tabs costs a\n // keyboard user eight presses to pass.\n tabIndex={selected ? 0 : -1}\n disabled={item.disabled}\n className={cx(\n 'ansh-tabs__tab',\n selected && 'ansh-tabs__tab--active',\n 'ansh-focusable',\n )}\n onClick={() => setActive(item.id)}\n >\n {item.icon ? <span className=\"ansh-tabs__icon\">{item.icon}</span> : null}\n <span>{item.label}</span>\n {item.badge !== undefined ? (\n <span className=\"ansh-tabs__badge\">{item.badge}</span>\n ) : null}\n </button>\n )\n })}\n </div>\n\n {activeItem?.content !== undefined || children ? (\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel-${active}`}\n aria-labelledby={`${baseId}-tab-${active}`}\n // Focusable so a keyboard user can Tab from the tab into its panel and scroll it, which\n // is required when the panel has no focusable content of its own.\n tabIndex={0}\n className=\"ansh-tabs__panel ansh-focusable\"\n >\n {activeItem?.content ?? children}\n </div>\n ) : null}\n </div>\n )\n}\n","import { type ReactNode, useState } from 'react'\nimport { cx } from '../../primitives/compose'\n\nexport interface Crumb {\n label: ReactNode\n href?: string\n icon?: ReactNode\n onClick?: () => void\n}\n\nexport interface BreadcrumbsProps {\n items: readonly Crumb[]\n /** Collapse the middle when there are more than this many. Default `Infinity`. */\n maxItems?: number\n separator?: ReactNode\n className?: string\n}\n\n/**\n * A breadcrumb trail.\n *\n * `<nav aria-label=\"Breadcrumb\">` around an ordered list, with the last item marked\n * `aria-current=\"page\"` and rendered as text rather than a link. Making the current page a link to\n * itself is a small thing that wastes a keyboard user's time on every page.\n *\n * Separators are `aria-hidden`, so the trail reads as \"Home, Projects, Invoice 401\" rather than\n * \"Home slash Projects slash\".\n */\nexport function Breadcrumbs({\n items,\n maxItems = Number.POSITIVE_INFINITY,\n separator,\n className,\n}: BreadcrumbsProps) {\n const [expanded, setExpanded] = useState(false)\n\n const collapsed = !expanded && items.length > maxItems && maxItems >= 2\n // Keep the first and the last two — the root and where you are — which is the information\n // people actually navigate by.\n const shown = collapsed ? [items[0]!, ...items.slice(-2)] : items\n const gapAfter = collapsed ? 0 : -1\n\n const chevron = separator ?? (\n <svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\" aria-hidden=\"true\">\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n\n return (\n <nav aria-label=\"Breadcrumb\" className={cx('ansh-breadcrumbs', className)}>\n <ol className=\"ansh-breadcrumbs__list\">\n {shown.map((crumb, index) => {\n const isLast = index === shown.length - 1\n return (\n <li key={index} className=\"ansh-breadcrumbs__item\">\n {index > 0 ? (\n <span className=\"ansh-breadcrumbs__separator\" aria-hidden=\"true\">\n {chevron}\n </span>\n ) : null}\n\n {isLast ? (\n <span className=\"ansh-breadcrumbs__current\" aria-current=\"page\">\n {crumb.icon}\n {crumb.label}\n </span>\n ) : (\n <a\n href={crumb.href ?? '#'}\n className=\"ansh-breadcrumbs__link ansh-focusable\"\n onClick={\n crumb.onClick\n ? (event) => {\n event.preventDefault()\n crumb.onClick!()\n }\n : undefined\n }\n >\n {crumb.icon}\n {crumb.label}\n </a>\n )}\n\n {index === gapAfter ? (\n <>\n <span className=\"ansh-breadcrumbs__separator\" aria-hidden=\"true\">\n {chevron}\n </span>\n <button\n type=\"button\"\n className=\"ansh-breadcrumbs__more ansh-focusable\"\n aria-label={`Show ${items.length - 3} hidden breadcrumbs`}\n aria-expanded={false}\n onClick={() => setExpanded(true)}\n >\n …\n </button>\n </>\n ) : null}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n\nexport interface Step {\n id: string\n label: ReactNode\n description?: ReactNode\n /** Marks the step failed — validation errors on a wizard page. */\n error?: boolean\n /** Allow jumping to this step directly. */\n clickable?: boolean\n}\n\nexport interface StepperProps {\n steps: readonly Step[]\n /** Index of the current step. Steps before it are complete. */\n current: number\n onStepChange?: (index: number) => void\n orientation?: 'horizontal' | 'vertical'\n className?: string\n}\n\n/**\n * A progress stepper for multi-page flows — checkout, onboarding, approvals.\n *\n * The state of each step is announced in text, not just drawn: `aria-current=\"step\"` on the active\n * one and a visually hidden \"completed\"/\"current\"/\"not started\" on each. A stepper that\n * distinguishes its states with a tick glyph and a colour tells a screen-reader user nothing.\n */\nexport function Stepper({\n steps,\n current,\n onStepChange,\n orientation = 'horizontal',\n className,\n}: StepperProps) {\n return (\n <nav\n className={cx('ansh-stepper', `ansh-stepper--${orientation}`, className)}\n aria-label=\"Progress\"\n >\n <ol className=\"ansh-stepper__list\">\n {steps.map((step, index) => {\n const complete = index < current\n const active = index === current\n const state = step.error\n ? 'error'\n : complete\n ? 'complete'\n : active\n ? 'current'\n : 'upcoming'\n const interactive = step.clickable && onStepChange && index !== current\n\n const inner = (\n <>\n <span\n className={cx('ansh-stepper__marker', `ansh-stepper__marker--${state}`)}\n aria-hidden=\"true\"\n >\n {step.error ? (\n '!'\n ) : complete ? (\n <svg viewBox=\"0 0 14 14\" width=\"12\" height=\"12\">\n <path\n d=\"M2.5 7.5l3 3 6-6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n ) : (\n index + 1\n )}\n </span>\n <span className=\"ansh-stepper__text\">\n <span className=\"ansh-stepper__label\">{step.label}</span>\n {step.description ? (\n <span className=\"ansh-stepper__description\">{step.description}</span>\n ) : null}\n <span className=\"ansh-visually-hidden\">\n {step.error\n ? ' — has errors'\n : complete\n ? ' — completed'\n : active\n ? ' — current step'\n : ' — not started'}\n </span>\n </span>\n </>\n )\n\n return (\n <li\n key={step.id}\n className={cx('ansh-stepper__item', `ansh-stepper__item--${state}`)}\n aria-current={active ? 'step' : undefined}\n >\n {interactive ? (\n <button\n type=\"button\"\n className=\"ansh-stepper__button ansh-focusable\"\n onClick={() => onStepChange!(index)}\n >\n {inner}\n </button>\n ) : (\n <span className=\"ansh-stepper__button\">{inner}</span>\n )}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import { type ReactNode, useEffect, useId, useRef, useState } from 'react'\nimport { cx } from '../../primitives/compose'\n\nexport interface MegaMenuLink {\n id: string\n label: string\n description?: string\n href?: string\n icon?: ReactNode\n onClick?: () => void\n}\n\nexport interface MegaMenuColumn {\n id: string\n heading?: string\n links: readonly MegaMenuLink[]\n}\n\nexport interface NavMenuItem {\n id: string\n label: string\n href?: string\n /** Columns of links. Presence of this makes the item a dropdown rather than a link. */\n columns?: readonly MegaMenuColumn[]\n /** Promoted panel on the right of the dropdown — a featured post, a CTA. */\n feature?: ReactNode\n}\n\nexport interface NavigationMenuProps {\n items: readonly NavMenuItem[]\n label?: string\n className?: string\n}\n\n/**\n * A site navigation bar with mega-menu dropdowns.\n *\n * The pattern marketing sites need and the one most likely to be built with hover alone. This one:\n *\n * - opens on hover **and** on click/Enter, so it works with a keyboard and on touch;\n * - keeps the panel open while the pointer travels toward it, via a close delay;\n * - closes on Escape, returning focus to the trigger;\n * - marks each trigger `aria-expanded` and links it to its panel with `aria-controls`.\n *\n * The panel is a plain absolutely-positioned element rather than a portal. A mega menu is full-width\n * and anchored to the bar, not to a point, so the portal's viewport-relative positioning would fight\n * the layout rather than help it.\n */\nexport function NavigationMenu({\n items,\n label = 'Main navigation',\n className,\n}: NavigationMenuProps) {\n const [openId, setOpenId] = useState<string | null>(null)\n const timerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const rootRef = useRef<HTMLElement | null>(null)\n const baseId = useId()\n\n const schedule = (next: string | null, delay: number) => {\n clearTimeout(timerRef.current)\n timerRef.current = setTimeout(() => setOpenId(next), delay)\n }\n\n useEffect(() => () => clearTimeout(timerRef.current), [])\n\n // Close when focus leaves the whole bar. `focusout` with a `relatedTarget` containment check is\n // the reliable way to detect that — a blur handler on each trigger fires while focus is still\n // moving to a link inside the panel, closing it just before the click lands.\n useEffect(() => {\n if (!openId) return\n const root = rootRef.current\n if (!root) return\n\n const onFocusOut = (event: FocusEvent) => {\n const next = event.relatedTarget as Node | null\n if (next && root.contains(next)) return\n setOpenId(null)\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape') return\n setOpenId(null)\n root.querySelector<HTMLElement>(`[aria-expanded=\"true\"]`)?.focus()\n }\n\n root.addEventListener('focusout', onFocusOut)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n root.removeEventListener('focusout', onFocusOut)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [openId])\n\n return (\n <nav\n ref={rootRef as React.Ref<HTMLElement>}\n className={cx('ansh-navmenu', className)}\n aria-label={label}\n onMouseLeave={() => schedule(null, 200)}\n >\n <ul className=\"ansh-navmenu__list\">\n {items.map((item) => {\n const hasPanel = Boolean(item.columns?.length)\n const open = openId === item.id\n const panelId = `${baseId}-${item.id}`\n\n if (!hasPanel) {\n return (\n <li key={item.id} className=\"ansh-navmenu__item\">\n <a href={item.href ?? '#'} className=\"ansh-navmenu__link ansh-focusable\">\n {item.label}\n </a>\n </li>\n )\n }\n\n return (\n <li\n key={item.id}\n className={cx('ansh-navmenu__item', open && 'ansh-navmenu__item--open')}\n onMouseEnter={() => schedule(item.id, 80)}\n >\n <button\n type=\"button\"\n className=\"ansh-navmenu__link ansh-navmenu__link--trigger ansh-focusable\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => setOpenId(open ? null : item.id)}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n setOpenId(item.id)\n // Focus the first link in the panel on the next frame, once it exists.\n requestAnimationFrame(() => {\n document\n .getElementById(panelId)\n ?.querySelector<HTMLElement>('a, button')\n ?.focus()\n })\n }\n }}\n >\n {item.label}\n <span\n className={cx('ansh-navmenu__chevron', open && 'ansh-navmenu__chevron--open')}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\">\n <path\n d=\"M3 4.5L6 7.5l3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n\n <div\n id={panelId}\n className=\"ansh-navmenu__panel\"\n hidden={!open}\n onMouseEnter={() => clearTimeout(timerRef.current)}\n >\n <div className=\"ansh-navmenu__grid\">\n {item.columns!.map((column) => (\n <div className=\"ansh-navmenu__column\" key={column.id}>\n {column.heading ? (\n <p className=\"ansh-navmenu__heading\">{column.heading}</p>\n ) : null}\n <ul className=\"ansh-navmenu__links\">\n {column.links.map((link) => (\n <li key={link.id}>\n <a\n href={link.href ?? '#'}\n className=\"ansh-navmenu__entry ansh-focusable\"\n onClick={\n link.onClick\n ? (event) => {\n event.preventDefault()\n link.onClick!()\n setOpenId(null)\n }\n : () => setOpenId(null)\n }\n >\n {link.icon ? (\n <span className=\"ansh-navmenu__icon\" aria-hidden=\"true\">\n {link.icon}\n </span>\n ) : null}\n <span className=\"ansh-navmenu__entry-text\">\n <span className=\"ansh-navmenu__entry-label\">{link.label}</span>\n {link.description ? (\n <span className=\"ansh-navmenu__entry-description\">\n {link.description}\n </span>\n ) : null}\n </span>\n </a>\n </li>\n ))}\n </ul>\n </div>\n ))}\n\n {item.feature ? (\n <div className=\"ansh-navmenu__feature\">{item.feature}</div>\n ) : null}\n </div>\n </div>\n </li>\n )\n })}\n </ul>\n </nav>\n )\n}\n","import { type ReactNode, useId, useRef, useState } from 'react'\nimport { cx } from '../primitives/compose'\nimport { useControllableState } from '../primitives/use-controllable-state'\n\n/**\n * Disclosure widgets.\n *\n * The animation here is the interesting part. Height cannot be transitioned to `auto`, so the usual\n * workarounds are measuring the content with JavaScript (a forced layout on every toggle, and wrong\n * the moment the content reflows) or a `max-height` guess (which either clips tall content or makes\n * short content ease over an invisible gap, so the timing looks wrong).\n *\n * `grid-template-rows: 0fr → 1fr` transitions to the content's intrinsic height with no JavaScript\n * and no magic numbers. It needs the extra wrapper with `min-height: 0` — without that the grid\n * child refuses to shrink below its content size and nothing animates.\n */\n\nexport interface CollapsibleProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n trigger: ReactNode\n /** Render the trigger as-is rather than wrapping it in the styled button row. */\n bare?: boolean\n className?: string\n children: ReactNode\n}\n\n/** A single show/hide region. */\nexport function Collapsible({\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n bare = false,\n className,\n children,\n}: CollapsibleProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const id = useId()\n\n return (\n <div className={cx('ansh-collapsible', className)} data-state={isOpen ? 'open' : 'closed'}>\n <button\n type=\"button\"\n className={cx(\n bare ? 'ansh-collapsible__bare' : 'ansh-collapsible__trigger',\n 'ansh-focusable',\n )}\n aria-expanded={isOpen}\n aria-controls={id}\n onClick={() => setOpen(!isOpen)}\n >\n {trigger}\n <span\n className={cx('ansh-collapsible__chevron', isOpen && 'ansh-collapsible__chevron--open')}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\">\n <path\n d=\"M3 4.5L6 7.5l3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n\n <div\n className=\"ansh-collapsible__region\"\n id={id}\n role=\"region\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n {/* `inert` on the collapsed panel removes its contents from the tab order and the\n accessibility tree. Without it, a keyboard user tabs into links inside a section that\n is visually closed — invisible focus, and no way to tell where they are. */}\n <div className=\"ansh-collapsible__inner\" {...(isOpen ? null : { inert: true })}>\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nexport interface AccordionItem {\n id: string\n title: ReactNode\n /** Secondary line under the title. */\n subtitle?: ReactNode\n icon?: ReactNode\n disabled?: boolean\n content: ReactNode\n}\n\nexport interface AccordionProps {\n items: readonly AccordionItem[]\n /** Allow several panels open at once. Default `false`. */\n multiple?: boolean\n /** Open panel ids. */\n value?: readonly string[]\n defaultValue?: readonly string[]\n onChange?: (value: readonly string[]) => void\n variant?: 'bordered' | 'separated' | 'plain'\n className?: string\n}\n\n/**\n * A stack of collapsible sections.\n *\n * Headings are real `<h3>` elements wrapping the button, which is the ARIA-recommended structure: a\n * screen-reader user navigating by heading finds each section, and the button inside carries the\n * expanded state. A `<div>` with `role=\"button\"` looks identical and is invisible to heading\n * navigation.\n *\n * Arrow keys move between headers, and Home/End jump to the ends — the accordion is a composite\n * widget, so this is expected behaviour rather than a nicety.\n */\nexport function Accordion({\n items,\n multiple = false,\n value,\n defaultValue = [],\n onChange,\n variant = 'bordered',\n className,\n}: AccordionProps) {\n const [openIds, setOpenIds] = useControllableState<readonly string[]>({\n value,\n defaultValue,\n onChange,\n })\n const baseId = useId()\n const headerRefs = useRef<Array<HTMLButtonElement | null>>([])\n\n const toggle = (id: string) => {\n if (openIds.includes(id)) {\n setOpenIds(openIds.filter((entry) => entry !== id))\n } else {\n setOpenIds(multiple ? [...openIds, id] : [id])\n }\n }\n\n const onKeyDown = (index: number) => (event: React.KeyboardEvent) => {\n const enabled = items\n .map((item, i) => ({ item, i }))\n .filter(({ item }) => !item.disabled)\n .map(({ i }) => i)\n const position = enabled.indexOf(index)\n let next: number | undefined\n\n switch (event.key) {\n case 'ArrowDown':\n next = enabled[(position + 1) % enabled.length]\n break\n case 'ArrowUp':\n next = enabled[(position - 1 + enabled.length) % enabled.length]\n break\n case 'Home':\n next = enabled[0]\n break\n case 'End':\n next = enabled[enabled.length - 1]\n break\n default:\n return\n }\n\n event.preventDefault()\n if (next !== undefined) headerRefs.current[next]?.focus()\n }\n\n return (\n <div className={cx('ansh-accordion', `ansh-accordion--${variant}`, className)}>\n {items.map((item, index) => {\n const open = openIds.includes(item.id)\n const panelId = `${baseId}-panel-${item.id}`\n const headerId = `${baseId}-header-${item.id}`\n\n return (\n <div\n key={item.id}\n className={cx('ansh-accordion__item', open && 'ansh-accordion__item--open')}\n data-state={open ? 'open' : 'closed'}\n >\n <h3 className=\"ansh-accordion__heading\">\n <button\n ref={(node) => {\n headerRefs.current[index] = node\n }}\n type=\"button\"\n id={headerId}\n className=\"ansh-accordion__trigger ansh-focusable\"\n aria-expanded={open}\n aria-controls={panelId}\n disabled={item.disabled}\n onClick={() => toggle(item.id)}\n onKeyDown={onKeyDown(index)}\n >\n {item.icon ? <span className=\"ansh-accordion__icon\">{item.icon}</span> : null}\n <span className=\"ansh-accordion__text\">\n <span className=\"ansh-accordion__title\">{item.title}</span>\n {item.subtitle ? (\n <span className=\"ansh-accordion__subtitle\">{item.subtitle}</span>\n ) : null}\n </span>\n <span\n className={cx('ansh-accordion__chevron', open && 'ansh-accordion__chevron--open')}\n aria-hidden=\"true\"\n >\n <svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\">\n <path\n d=\"M3 4.5L6 7.5l3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n </h3>\n\n <div\n className=\"ansh-accordion__region\"\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n data-state={open ? 'open' : 'closed'}\n >\n <div className=\"ansh-accordion__panel\" {...(open ? null : { inert: true })}>\n {item.content}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport interface DisclosureListProps {\n /** Simple show-more list — the pattern for \"N more items\". */\n items: readonly ReactNode[]\n /** How many to show before collapsing. Default `3`. */\n initial?: number\n moreLabel?: (hidden: number) => string\n lessLabel?: string\n className?: string\n}\n\n/** Show a few items with a \"show N more\" toggle. */\nexport function DisclosureList({\n items,\n initial = 3,\n moreLabel = (hidden) => `Show ${hidden} more`,\n lessLabel = 'Show less',\n className,\n}: DisclosureListProps) {\n const [expanded, setExpanded] = useState(false)\n const id = useId()\n const hidden = items.length - initial\n\n if (hidden <= 0) {\n return (\n <ul className={cx('ansh-disclosure-list', className)}>\n {items.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n )\n }\n\n return (\n <div className={className}>\n <ul className=\"ansh-disclosure-list\" id={id}>\n {(expanded ? items : items.slice(0, initial)).map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n <button\n type=\"button\"\n className=\"ansh-disclosure-list__toggle ansh-focusable\"\n aria-expanded={expanded}\n aria-controls={id}\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? lessLabel : moreLabel(hidden)}\n </button>\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data/table.tsx","../src/components/data/display.tsx","../src/components/data/progress.tsx"],"names":["_","jsxs","jsx","useMemo"],"mappings":"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","file":"chunk-HPGCILO4.js","sourcesContent":["import { type ReactNode, useCallback, useMemo } from 'react'\nimport { cx } from '../../primitives/compose'\nimport { useControllableState } from '../../primitives/use-controllable-state'\n\n/**\n * Tables.\n *\n * A real `<table>` with `<th scope>`, not a grid of divs. The semantics are the entire point: a\n * screen reader announces \"Column 3 of 7, Status, row 12\" only if the markup says so. Every\n * div-based table reimplements navigation badly or not at all, and the CSS argument for divs\n * disappeared when `display: contents` and `position: sticky` landed.\n *\n * `DataTable` adds sorting, selection and pagination on top. It stays deliberately short of a full\n * data grid — no virtualisation, no column resizing, no pinned regions. Those need a different\n * architecture (windowing, measured columns), and half-implementing them produces a component that\n * breaks at exactly the scale it was added for.\n */\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport interface SortState {\n columnId: string\n direction: SortDirection\n}\n\nexport interface Column<T> {\n id: string\n header: ReactNode\n /** Render the cell. Receives the row and its index. */\n cell: (row: T, index: number) => ReactNode\n /** Allow sorting by this column. */\n sortable?: boolean\n /**\n * Value used for the default comparator. Without it a sortable column falls back to comparing\n * rendered output, which sorts \"10\" before \"9\".\n */\n sortValue?: (row: T) => string | number | Date | null | undefined\n align?: 'start' | 'center' | 'end'\n /** Any CSS width — `'12rem'`, `'25%'`, `'minmax(8rem, 1fr)'`. */\n width?: string\n /** Hide below this breakpoint. Uses the token breakpoints. */\n hideBelow?: 'sm' | 'md' | 'lg'\n /** Short label announced instead of a complex header. */\n ariaLabel?: string\n}\n\nexport interface DataTableProps<T> {\n data: readonly T[]\n columns: ReadonlyArray<Column<T>>\n /** Stable row identity. Required — array index breaks selection the moment rows reorder. */\n getRowId: (row: T) => string\n /** Describes the table for screen readers. Rendered as a visually hidden `<caption>`. */\n caption: string\n /** Row checkboxes plus a header select-all. */\n selectable?: boolean\n selected?: readonly string[]\n onSelectedChange?: (ids: readonly string[]) => void\n sort?: SortState | null\n defaultSort?: SortState | null\n onSortChange?: (sort: SortState | null) => void\n /** Rows per page. Omit to render everything. */\n pageSize?: number\n page?: number\n onPageChange?: (page: number) => void\n /** Show skeleton rows. */\n loading?: boolean\n /** Rendered in place of the body when there are no rows. */\n emptyState?: ReactNode\n onRowClick?: (row: T) => void\n /** Keep the header visible while the body scrolls. */\n stickyHeader?: boolean\n density?: 'comfortable' | 'compact'\n /** Zebra striping. Off by default — borders read as cleaner at density. */\n striped?: boolean\n className?: string\n /** Per-row extra class, for status highlighting. */\n rowClassName?: (row: T) => string | undefined\n}\n\n/** Default comparator: numbers and dates numerically, strings by locale. */\nfunction compare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0\n // Nulls sort last in both directions — an empty cell is not \"smallest\", it's absent, and\n // flipping the sort should not fill the top of the table with blanks.\n if (a == null) return 1\n if (b == null) return -1\n\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 // `localeCompare` with `numeric` so \"Item 2\" precedes \"Item 10\".\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' })\n}\n\nexport function DataTable<T>({\n data,\n columns,\n getRowId,\n caption,\n selectable = false,\n selected,\n onSelectedChange,\n sort,\n defaultSort = null,\n onSortChange,\n pageSize,\n page,\n onPageChange,\n loading = false,\n emptyState,\n onRowClick,\n stickyHeader = false,\n density = 'comfortable',\n striped = false,\n className,\n rowClassName,\n}: DataTableProps<T>) {\n const [sortState, setSortState] = useControllableState<SortState | null>({\n value: sort,\n defaultValue: defaultSort,\n onChange: onSortChange,\n })\n const [selection, setSelection] = useControllableState<readonly string[]>({\n value: selected,\n defaultValue: [],\n onChange: onSelectedChange,\n })\n const [currentPage, setCurrentPage] = useControllableState<number>({\n value: page,\n defaultValue: 0,\n onChange: onPageChange,\n })\n\n const sorted = useMemo(() => {\n if (!sortState) return data\n const column = columns.find((c) => c.id === sortState.columnId)\n if (!column?.sortValue) return data\n\n // Copied before sorting: mutating the caller's array in place is a bug that surfaces as\n // \"my list reorders when I open the table\".\n const rows = [...data]\n rows.sort((a, b) => {\n const result = compare(column.sortValue!(a), column.sortValue!(b))\n return sortState.direction === 'asc' ? result : -result\n })\n return rows\n }, [data, columns, sortState])\n\n const pageCount = pageSize ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1\n const safePage = Math.min(currentPage, pageCount - 1)\n const visible = pageSize\n ? sorted.slice(safePage * pageSize, safePage * pageSize + pageSize)\n : sorted\n\n const visibleIds = useMemo(() => visible.map(getRowId), [visible, getRowId])\n const selectedSet = useMemo(() => new Set(selection), [selection])\n\n const allVisibleSelected =\n visibleIds.length > 0 && visibleIds.every((rowId) => selectedSet.has(rowId))\n const someVisibleSelected = visibleIds.some((rowId) => selectedSet.has(rowId))\n\n const toggleAll = useCallback(() => {\n if (allVisibleSelected) {\n // Only clears the current page. Wiping selections on other pages would silently discard\n // work when someone selects across pages then unticks the header.\n setSelection(selection.filter((rowId) => !visibleIds.includes(rowId)))\n } else {\n setSelection([...new Set([...selection, ...visibleIds])])\n }\n }, [allVisibleSelected, selection, visibleIds, setSelection])\n\n const toggleRow = useCallback(\n (rowId: string) => {\n setSelection(\n selectedSet.has(rowId) ? selection.filter((v) => v !== rowId) : [...selection, rowId],\n )\n },\n [selection, selectedSet, setSelection],\n )\n\n const onSort = (column: Column<T>) => {\n if (!column.sortable) return\n // asc → desc → none. The third state matters: without it there is no way back to the data's\n // natural order, which is often \"most recent first\" from the server.\n if (sortState?.columnId !== column.id) {\n setSortState({ columnId: column.id, direction: 'asc' })\n } else if (sortState.direction === 'asc') {\n setSortState({ columnId: column.id, direction: 'desc' })\n } else {\n setSortState(null)\n }\n }\n\n const columnCount = columns.length + (selectable ? 1 : 0)\n\n return (\n <div className={cx('ansh-table-wrap', stickyHeader && 'ansh-table-wrap--sticky', className)}>\n <table\n className={cx('ansh-table', `ansh-table--${density}`, striped && 'ansh-table--striped')}\n >\n <caption className=\"ansh-visually-hidden\">\n {caption}\n {sortState\n ? `, sorted by ${columns.find((c) => c.id === sortState.columnId)?.id} ${sortState.direction === 'asc' ? 'ascending' : 'descending'}`\n : ''}\n </caption>\n\n <thead className=\"ansh-table__head\">\n <tr>\n {selectable ? (\n <th scope=\"col\" className=\"ansh-table__cell ansh-table__cell--check\">\n <input\n type=\"checkbox\"\n className=\"ansh-table__checkbox\"\n checked={allVisibleSelected}\n // Mixed state when only some rows are ticked — announced as \"partially\n // checked\" rather than lying about the state.\n ref={(node) => {\n if (node) node.indeterminate = !allVisibleSelected && someVisibleSelected\n }}\n aria-label={allVisibleSelected ? 'Deselect all rows' : 'Select all rows'}\n onChange={toggleAll}\n />\n </th>\n ) : null}\n\n {columns.map((column) => {\n const isSorted = sortState?.columnId === column.id\n return (\n <th\n key={column.id}\n scope=\"col\"\n className={cx(\n 'ansh-table__cell',\n 'ansh-table__cell--head',\n column.align && `ansh-table__cell--${column.align}`,\n column.hideBelow && `ansh-hide-below-${column.hideBelow}`,\n )}\n style={column.width ? { width: column.width } : undefined}\n // `aria-sort` on the header is what makes a screen reader announce the sort\n // state; the arrow glyph alone conveys nothing.\n aria-sort={\n isSorted\n ? sortState!.direction === 'asc'\n ? 'ascending'\n : 'descending'\n : undefined\n }\n >\n {column.sortable ? (\n <button\n type=\"button\"\n className=\"ansh-table__sort ansh-focusable\"\n onClick={() => onSort(column)}\n aria-label={\n column.ariaLabel\n ? `Sort by ${column.ariaLabel}`\n : typeof column.header === 'string'\n ? `Sort by ${column.header}`\n : 'Sort column'\n }\n >\n <span>{column.header}</span>\n <span\n className={cx('ansh-table__arrow', isSorted && 'ansh-table__arrow--on')}\n aria-hidden=\"true\"\n data-direction={isSorted ? sortState!.direction : 'none'}\n >\n <svg viewBox=\"0 0 10 12\" width=\"10\" height=\"12\">\n <path\n d=\"M5 1v10M2 4l3-3 3 3M2 8l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </span>\n </button>\n ) : (\n column.header\n )}\n </th>\n )\n })}\n </tr>\n </thead>\n\n <tbody>\n {loading ? (\n Array.from({ length: pageSize ?? 5 }, (_, rowIndex) => (\n <tr key={`skeleton-${rowIndex}`} className=\"ansh-table__row\">\n {Array.from({ length: columnCount }, (_, cellIndex) => (\n <td key={cellIndex} className=\"ansh-table__cell\">\n <span\n className=\"ansh-skeleton\"\n style={{ width: `${50 + ((cellIndex * 37) % 40)}%`, height: '1em' }}\n />\n </td>\n ))}\n </tr>\n ))\n ) : visible.length === 0 ? (\n <tr>\n <td colSpan={columnCount} className=\"ansh-table__empty\">\n {emptyState ?? 'No results'}\n </td>\n </tr>\n ) : (\n visible.map((row, index) => {\n const rowId = getRowId(row)\n const isSelected = selectedSet.has(rowId)\n\n return (\n <tr\n key={rowId}\n className={cx(\n 'ansh-table__row',\n isSelected && 'ansh-table__row--selected',\n onRowClick && 'ansh-table__row--clickable',\n rowClassName?.(row),\n )}\n aria-selected={selectable ? isSelected : undefined}\n {...(onRowClick\n ? {\n onClick: (event: React.MouseEvent) => {\n // A click that started on a control inside the row belongs to that\n // control — opening a detail view because someone ticked a checkbox is\n // the classic clickable-row bug.\n const target = event.target as HTMLElement\n if (target.closest('button, a, input, select, textarea')) return\n onRowClick(row)\n },\n }\n : null)}\n >\n {selectable ? (\n <td className=\"ansh-table__cell ansh-table__cell--check\">\n <input\n type=\"checkbox\"\n className=\"ansh-table__checkbox\"\n checked={isSelected}\n aria-label={`Select row ${index + 1}`}\n onChange={() => toggleRow(rowId)}\n />\n </td>\n ) : null}\n\n {columns.map((column) => (\n <td\n key={column.id}\n className={cx(\n 'ansh-table__cell',\n column.align && `ansh-table__cell--${column.align}`,\n column.hideBelow && `ansh-hide-below-${column.hideBelow}`,\n )}\n >\n {column.cell(row, index)}\n </td>\n ))}\n </tr>\n )\n })\n )}\n </tbody>\n </table>\n\n {/* Selection count and page changes announced without stealing focus. */}\n <span className=\"ansh-visually-hidden\" role=\"status\" aria-live=\"polite\">\n {selectable && selection.length > 0 ? `${selection.length} selected` : ''}\n </span>\n\n {pageSize && pageCount > 1 ? (\n <Pagination\n page={safePage}\n pageCount={pageCount}\n onPageChange={setCurrentPage}\n total={sorted.length}\n pageSize={pageSize}\n />\n ) : null}\n </div>\n )\n}\n\nexport interface PaginationProps {\n /** Zero-based. */\n page: number\n pageCount: number\n onPageChange: (page: number) => void\n /** Total row count, for the \"1–20 of 340\" summary. */\n total?: number\n pageSize?: number\n /** Page buttons either side of the current one. Default `1`. */\n siblings?: number\n className?: string\n}\n\n/**\n * Page navigation.\n *\n * `<nav>` with an ordered list, because that is what a pager is — a list of links to positions in a\n * sequence. The current page is marked `aria-current=\"page\"`, which is how a screen reader user\n * knows where they are without counting buttons.\n *\n * The ellipsis is `aria-hidden`; announcing \"ellipsis\" between page 3 and page 12 conveys nothing\n * that the numbers don't already.\n */\nexport function Pagination({\n page,\n pageCount,\n onPageChange,\n total,\n pageSize,\n siblings = 1,\n className,\n}: PaginationProps) {\n const pages = useMemo(() => {\n const result: Array<number | 'gap'> = []\n const first = 0\n const last = pageCount - 1\n\n for (let index = first; index <= last; index++) {\n const nearCurrent = Math.abs(index - page) <= siblings\n const isEdge = index === first || index === last\n if (nearCurrent || isEdge) {\n result.push(index)\n } else if (result[result.length - 1] !== 'gap') {\n result.push('gap')\n }\n }\n return result\n }, [page, pageCount, siblings])\n\n const from = pageSize ? page * pageSize + 1 : null\n const to = pageSize && total ? Math.min((page + 1) * pageSize, total) : null\n\n return (\n <nav className={cx('ansh-pagination', className)} aria-label=\"Pagination\">\n {from !== null && to !== null ? (\n <p className=\"ansh-pagination__summary\">\n {from}–{to} of {total}\n </p>\n ) : null}\n\n <ol className=\"ansh-pagination__list\">\n <li>\n <button\n type=\"button\"\n className=\"ansh-pagination__button ansh-focusable\"\n disabled={page === 0}\n aria-label=\"Previous page\"\n onClick={() => onPageChange(page - 1)}\n >\n <svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\" aria-hidden=\"true\">\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n\n {pages.map((entry, index) =>\n entry === 'gap' ? (\n <li key={`gap-${index}`} aria-hidden=\"true\" className=\"ansh-pagination__gap\">\n …\n </li>\n ) : (\n <li key={entry}>\n <button\n type=\"button\"\n className={cx(\n 'ansh-pagination__button',\n entry === page && 'ansh-pagination__button--current',\n 'ansh-focusable',\n )}\n aria-current={entry === page ? 'page' : undefined}\n aria-label={`Page ${entry + 1}`}\n onClick={() => onPageChange(entry)}\n >\n {entry + 1}\n </button>\n </li>\n ),\n )}\n\n <li>\n <button\n type=\"button\"\n className=\"ansh-pagination__button ansh-focusable\"\n disabled={page >= pageCount - 1}\n aria-label=\"Next page\"\n onClick={() => onPageChange(page + 1)}\n >\n <svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\" aria-hidden=\"true\">\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n </ol>\n </nav>\n )\n}\n\n/** A plain styled table, for content that isn't driven by data props. */\nexport function Table({\n caption,\n density = 'comfortable',\n striped = false,\n className,\n children,\n}: {\n caption?: string\n density?: 'comfortable' | 'compact'\n striped?: boolean\n className?: string\n children: ReactNode\n}) {\n return (\n <div className={cx('ansh-table-wrap', className)}>\n <table\n className={cx('ansh-table', `ansh-table--${density}`, striped && 'ansh-table--striped')}\n >\n {caption ? <caption className=\"ansh-visually-hidden\">{caption}</caption> : null}\n {children}\n </table>\n </div>\n )\n}\n","import { type HTMLAttributes, type ReactNode, useMemo, useState } from 'react'\nimport { parseColor, pickReadable, toHex } from '@ansh-ui/core'\nimport { cx } from '../../primitives/compose'\n\n/**\n * Small display components.\n *\n * Individually trivial, collectively most of what an application screen is made of. The care here\n * goes into the details that get skipped: a badge whose meaning isn't carried by colour alone, an\n * avatar whose fallback initials are readable against a generated background, an empty state that\n * says what to do next rather than just \"no data\".\n */\n\n// --- Badge ----------------------------------------------------------------\n\nexport type BadgeTone = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info'\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone\n variant?: 'soft' | 'solid' | 'outline'\n size?: 'sm' | 'md'\n /** Leading dot. Useful for statuses where the label is short. */\n dot?: boolean\n icon?: ReactNode\n children: ReactNode\n}\n\n/**\n * A status label.\n *\n * Every badge carries its meaning in **text**, not just colour. A red badge reading \"Failed\" works\n * for everyone; a red dot alone works for nobody using a screen reader and for the ~4% of the\n * population with a colour vision deficiency. The `dot` is decorative reinforcement.\n */\nexport function Badge({\n tone = 'neutral',\n variant = 'soft',\n size = 'md',\n dot = false,\n icon,\n className,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n className={cx(\n 'ansh-badge',\n `ansh-badge--${tone}`,\n `ansh-badge--${variant}`,\n `ansh-badge--${size}`,\n className,\n )}\n {...rest}\n >\n {dot ? <span className=\"ansh-badge__dot\" aria-hidden=\"true\" /> : null}\n {icon ? <span className=\"ansh-badge__icon\">{icon}</span> : null}\n {children}\n </span>\n )\n}\n\n// --- Avatar ---------------------------------------------------------------\n\nexport interface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {\n src?: string\n /** The person's name. Used for the alt text and to derive the fallback initials. */\n name: string\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n shape?: 'circle' | 'square'\n /** Presence indicator. */\n status?: 'online' | 'offline' | 'busy' | 'away'\n}\n\n/** First letters of the first and last words — \"Ada Lovelace\" → \"AL\". */\nfunction initials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean)\n if (words.length === 0) return '?'\n if (words.length === 1) return words[0]!.slice(0, 2).toUpperCase()\n return (words[0]![0]! + words[words.length - 1]![0]!).toUpperCase()\n}\n\n/** Stable hash so the same name always gets the same colour. */\nfunction hash(text: string): number {\n let value = 0\n for (let i = 0; i < text.length; i++) {\n value = (value * 31 + text.charCodeAt(i)) | 0\n }\n return Math.abs(value)\n}\n\nexport function Avatar({\n src,\n name,\n size = 'md',\n shape = 'circle',\n status,\n className,\n ...rest\n}: AvatarProps) {\n const [failed, setFailed] = useState(false)\n\n // The fallback colour is derived from the name, then the *text* colour is chosen for contrast\n // against it. Picking a random background and hardcoding white text is how you get illegible\n // initials on a pale hue — and it is the most common avatar bug there is.\n const { background, foreground } = useMemo(() => {\n // OKLCH rather than HSL for the generated hue: at fixed HSL lightness the yellows come out\n // far brighter than the blues, so a set of avatars looks uneven. Fixed OKLCH lightness is\n // perceptually even across the whole hue circle, which is the entire reason to use it here.\n const hue = hash(name) % 360\n const backgroundHex = toHex(parseColor(`oklch(72% 0.13 ${hue})`))\n return {\n background: backgroundHex,\n foreground: toHex(pickReadable(backgroundHex, '#ffffff', '#101828')),\n }\n }, [name])\n\n const showImage = src && !failed\n\n return (\n <span\n className={cx('ansh-avatar', `ansh-avatar--${size}`, `ansh-avatar--${shape}`, className)}\n {...rest}\n >\n {showImage ? (\n <img\n src={src}\n alt={name}\n className=\"ansh-avatar__image\"\n // Falling back on error rather than showing a broken-image icon, which is what a bare\n // `<img>` does when a CDN URL expires.\n onError={() => setFailed(true)}\n />\n ) : (\n <span\n className=\"ansh-avatar__fallback\"\n style={{ background, color: foreground }}\n aria-hidden=\"true\"\n >\n {initials(name)}\n </span>\n )}\n\n {/* The name is always available to assistive technology, even when the initials are shown\n as decorative. */}\n {!showImage ? <span className=\"ansh-visually-hidden\">{name}</span> : null}\n\n {status ? (\n <span className={cx('ansh-avatar__status', `ansh-avatar__status--${status}`)}>\n <span className=\"ansh-visually-hidden\">{status}</span>\n </span>\n ) : null}\n </span>\n )\n}\n\nexport interface AvatarGroupProps {\n /** Maximum shown before collapsing into a \"+N\" chip. Default `4`. */\n max?: number\n size?: AvatarProps['size']\n className?: string\n children: ReactNode\n}\n\n/** Overlapping avatars with an overflow count. */\nexport function AvatarGroup({ max = 4, size, className, children }: AvatarGroupProps) {\n const items = Array.isArray(children) ? children : [children]\n const shown = items.slice(0, max)\n const overflow = items.length - shown.length\n\n return (\n <span className={cx('ansh-avatar-group', size && `ansh-avatar-group--${size}`, className)}>\n {shown}\n {overflow > 0 ? (\n <span\n className={cx(\n 'ansh-avatar',\n size && `ansh-avatar--${size}`,\n 'ansh-avatar--circle',\n 'ansh-avatar--more',\n )}\n >\n <span className=\"ansh-avatar__fallback\" aria-hidden=\"true\">\n +{overflow}\n </span>\n <span className=\"ansh-visually-hidden\">and {overflow} more</span>\n </span>\n ) : null}\n </span>\n )\n}\n\n// --- Kbd ------------------------------------------------------------------\n\n/**\n * A keyboard key.\n *\n * Splits on `+` so `<Kbd>⌘+K</Kbd>` renders two keys with a separator, and the separator is\n * `aria-hidden` — a screen reader should say \"command K\", not \"command plus K\".\n */\nexport function Kbd({ children, className }: { children: string; className?: string }) {\n const keys = children.split('+').map((key) => key.trim())\n return (\n <span className={cx('ansh-kbd-group', className)}>\n {keys.map((key, index) => (\n <span key={`${key}-${index}`}>\n {index > 0 ? (\n <span className=\"ansh-kbd__plus\" aria-hidden=\"true\">\n +\n </span>\n ) : null}\n <kbd className=\"ansh-kbd\">{key}</kbd>\n </span>\n ))}\n </span>\n )\n}\n\n// --- Stat -----------------------------------------------------------------\n\nexport interface StatProps {\n label: ReactNode\n value: ReactNode\n /** Change since the previous period. Sign decides the direction and colour. */\n delta?: number\n /** How the delta reads — `'2.4%'` or `'+18 users'`. Defaults to the number with a sign. */\n deltaLabel?: string\n /** For metrics where down is good, like churn or latency. */\n invertDelta?: boolean\n hint?: ReactNode\n icon?: ReactNode\n className?: string\n}\n\n/**\n * A single metric — the building block of every dashboard.\n *\n * The delta's direction is shown by an arrow *and* a sign *and* a colour. Three redundant signals\n * because this is the number people scan fastest and misreading it has consequences.\n */\nexport function Stat({\n label,\n value,\n delta,\n deltaLabel,\n invertDelta = false,\n hint,\n icon,\n className,\n}: StatProps) {\n const positive = delta !== undefined && delta > 0\n const negative = delta !== undefined && delta < 0\n const good = invertDelta ? negative : positive\n\n return (\n <div className={cx('ansh-stat', className)}>\n <div className=\"ansh-stat__head\">\n <span className=\"ansh-stat__label\">{label}</span>\n {icon ? <span className=\"ansh-stat__icon\">{icon}</span> : null}\n </div>\n\n <div className=\"ansh-stat__value\">{value}</div>\n\n {delta !== undefined ? (\n <div\n className={cx(\n 'ansh-stat__delta',\n delta !== 0 && (good ? 'ansh-stat__delta--good' : 'ansh-stat__delta--bad'),\n )}\n >\n <span className=\"ansh-stat__arrow\" aria-hidden=\"true\">\n {positive ? '↑' : negative ? '↓' : '→'}\n </span>\n <span>{deltaLabel ?? `${delta > 0 ? '+' : ''}${delta}%`}</span>\n {hint ? <span className=\"ansh-stat__hint\">{hint}</span> : null}\n </div>\n ) : hint ? (\n <div className=\"ansh-stat__hint\">{hint}</div>\n ) : null}\n </div>\n )\n}\n\n// --- Empty state ----------------------------------------------------------\n\nexport interface EmptyStateProps {\n title: ReactNode\n description?: ReactNode\n icon?: ReactNode\n /** The action that resolves the emptiness — \"Create your first invoice\". */\n action?: ReactNode\n size?: 'sm' | 'md'\n className?: string\n}\n\n/**\n * The \"nothing here yet\" panel.\n *\n * Always offers the next step. An empty state that only says \"No results\" leaves the user to work\n * out whether the filter is wrong, the data hasn't loaded, or they need to create something — and\n * that ambiguity is where people abandon a screen.\n */\nexport function EmptyState({\n title,\n description,\n icon,\n action,\n size = 'md',\n className,\n}: EmptyStateProps) {\n return (\n <div className={cx('ansh-empty', `ansh-empty--${size}`, className)}>\n {icon ? (\n <span className=\"ansh-empty__icon\" aria-hidden=\"true\">\n {icon}\n </span>\n ) : null}\n <p className=\"ansh-empty__title\">{title}</p>\n {description ? <p className=\"ansh-empty__description\">{description}</p> : null}\n {action ? <div className=\"ansh-empty__action\">{action}</div> : null}\n </div>\n )\n}\n\n// --- Description list -----------------------------------------------------\n\nexport interface DescriptionListProps {\n items: ReadonlyArray<{ term: ReactNode; description: ReactNode }>\n /** Side-by-side rather than stacked. Default `'horizontal'` on wide screens. */\n orientation?: 'horizontal' | 'vertical'\n className?: string\n}\n\n/**\n * Key–value pairs — the detail panel of every record in a CRM.\n *\n * A real `<dl>`/`<dt>`/`<dd>`, which is what makes a screen reader pair each label with its value\n * instead of reading twenty unconnected strings.\n */\nexport function DescriptionList({\n items,\n orientation = 'horizontal',\n className,\n}: DescriptionListProps) {\n return (\n <dl className={cx('ansh-dl', `ansh-dl--${orientation}`, className)}>\n {items.map((item, index) => (\n <div className=\"ansh-dl__row\" key={index}>\n <dt className=\"ansh-dl__term\">{item.term}</dt>\n <dd className=\"ansh-dl__description\">{item.description}</dd>\n </div>\n ))}\n </dl>\n )\n}\n\n// --- Timeline -------------------------------------------------------------\n\nexport interface TimelineItem {\n id: string\n title: ReactNode\n description?: ReactNode\n /** Rendered as-is; pass an already-formatted string or a `<time>` element. */\n timestamp?: ReactNode\n icon?: ReactNode\n tone?: BadgeTone\n}\n\n/**\n * A chronological feed — audit logs, order history, activity streams.\n *\n * An ordered list, because the order carries meaning. The connecting line is drawn with a\n * pseudo-element on the list item rather than a real element, so it can't be selected, read, or\n * land in a copy-paste of the page.\n */\nexport function Timeline({\n items,\n className,\n}: {\n items: readonly TimelineItem[]\n className?: string\n}) {\n return (\n <ol className={cx('ansh-timeline', className)}>\n {items.map((item) => (\n <li\n key={item.id}\n className={cx('ansh-timeline__item', item.tone && `ansh-timeline__item--${item.tone}`)}\n >\n <span className=\"ansh-timeline__marker\" aria-hidden=\"true\">\n {item.icon}\n </span>\n <div className=\"ansh-timeline__body\">\n <div className=\"ansh-timeline__head\">\n <span className=\"ansh-timeline__title\">{item.title}</span>\n {item.timestamp ? (\n <span className=\"ansh-timeline__time\">{item.timestamp}</span>\n ) : null}\n </div>\n {item.description ? (\n <p className=\"ansh-timeline__description\">{item.description}</p>\n ) : null}\n </div>\n </li>\n ))}\n </ol>\n )\n}\n\n// --- Code block -----------------------------------------------------------\n\nexport interface CodeBlockProps {\n code: string\n language?: string\n /** Show a copy button. Default `true`. */\n copyable?: boolean\n /** Show line numbers. */\n lineNumbers?: boolean\n /** Filename or title shown in the header bar. */\n filename?: string\n className?: string\n}\n\n/**\n * A code block with a copy button.\n *\n * No syntax highlighter. Shipping one means a tokeniser and a theme in the bundle of every app that\n * displays a snippet — for a component library, that cost lands on consumers who may never render\n * code at all. Highlighting is better done at build time, or with a highlighter the app already has.\n */\nexport function CodeBlock({\n code,\n language = 'tsx',\n copyable = true,\n lineNumbers = false,\n filename,\n className,\n}: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n const lines = useMemo(() => code.split('\\n'), [code])\n\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n setTimeout(() => setCopied(false), 1600)\n } catch {\n // Clipboard access is refused on insecure origins and under some permission policies. The\n // code is selectable either way, so failing quietly beats an error dialog.\n }\n }\n\n return (\n <div className={cx('ansh-code', className)}>\n {filename || copyable ? (\n <div className=\"ansh-code__bar\">\n <span className=\"ansh-code__filename\">{filename ?? language}</span>\n {copyable ? (\n <button type=\"button\" className=\"ansh-code__copy ansh-focusable\" onClick={copy}>\n {copied ? 'Copied' : 'Copy'}\n <span className=\"ansh-visually-hidden\"> code to clipboard</span>\n </button>\n ) : null}\n </div>\n ) : null}\n\n <pre className={cx('ansh-code__pre', lineNumbers && 'ansh-code__pre--numbered')}>\n <code className={`language-${language}`}>\n {lineNumbers\n ? lines.map((line, index) => (\n <span className=\"ansh-code__line\" key={index}>\n <span className=\"ansh-code__lineno\" aria-hidden=\"true\">\n {index + 1}\n </span>\n {line}\n {'\\n'}\n </span>\n ))\n : code}\n </code>\n </pre>\n </div>\n )\n}\n","import { type ReactNode } from 'react'\nimport { cx } from '../../primitives/compose'\n\n/**\n * Progress indicators.\n *\n * The distinction that matters and is usually missed: **progress** is work advancing toward\n * completion (`role=\"progressbar\"`), a **meter** is a static measurement within a range\n * (`role=\"meter\"` — disk usage, a score, a quota). Announcing a disk-usage bar as progress tells a\n * screen-reader user that something is loading, which it isn't.\n */\n\nexport interface ProgressProps {\n /** `0`–`max`. Omit for an indeterminate bar. */\n value?: number\n max?: number\n size?: 'sm' | 'md' | 'lg'\n tone?: 'accent' | 'success' | 'warning' | 'danger'\n /** Accessible name — \"Upload progress\", not \"Progress\". */\n label: string\n /** Show the label and percentage above the bar. */\n showLabel?: boolean\n /** Override the announced/displayed text. */\n formatValue?: (value: number, max: number) => string\n className?: string\n}\n\nexport function Progress({\n value,\n max = 100,\n size = 'md',\n tone = 'accent',\n label,\n showLabel = false,\n formatValue,\n className,\n}: ProgressProps) {\n const indeterminate = value === undefined\n const clamped = indeterminate ? 0 : Math.min(Math.max(value, 0), max)\n const percent = (clamped / max) * 100\n const text = formatValue ? formatValue(clamped, max) : `${Math.round(percent)}%`\n\n return (\n <div\n className={cx('ansh-progress', `ansh-progress--${size}`, `ansh-progress--${tone}`, className)}\n >\n {showLabel ? (\n <div className=\"ansh-progress__labels\">\n <span className=\"ansh-progress__label\">{label}</span>\n {!indeterminate ? <span className=\"ansh-progress__value\">{text}</span> : null}\n </div>\n ) : null}\n\n <div\n className={cx(\n 'ansh-progress__track',\n indeterminate && 'ansh-progress__track--indeterminate',\n )}\n role=\"progressbar\"\n aria-label={label}\n // An indeterminate progressbar omits `aria-valuenow` entirely. Setting it to 0 would be\n // announced as \"0 percent\", implying stalled work rather than unknown duration.\n {...(indeterminate\n ? null\n : {\n 'aria-valuenow': clamped,\n 'aria-valuemin': 0,\n 'aria-valuemax': max,\n 'aria-valuetext': text,\n })}\n >\n <div\n className=\"ansh-progress__fill\"\n style={indeterminate ? undefined : { width: `${percent}%` }}\n />\n </div>\n </div>\n )\n}\n\nexport interface CircularProgressProps extends Omit<ProgressProps, 'size'> {\n /** Diameter in px. Default `48`. */\n size?: number\n /** Ring thickness in px. Default `4`. */\n thickness?: number\n /** Content in the middle — usually the percentage. */\n children?: ReactNode\n}\n\n/**\n * A ring progress indicator.\n *\n * Drawn with `stroke-dasharray` on an SVG circle rather than with conic gradients, so the ends can\n * be rounded and the ring animates smoothly at any size. The circle is rotated -90° so 0% starts at\n * the top, which is where everyone expects it.\n */\nexport function CircularProgress({\n value,\n max = 100,\n size = 48,\n thickness = 4,\n tone = 'accent',\n label,\n formatValue,\n className,\n children,\n}: CircularProgressProps) {\n const indeterminate = value === undefined\n const clamped = indeterminate ? 25 : Math.min(Math.max(value, 0), max)\n const fraction = clamped / max\n\n const radius = (size - thickness) / 2\n const circumference = 2 * Math.PI * radius\n const text = formatValue ? formatValue(clamped, max) : `${Math.round(fraction * 100)}%`\n\n return (\n <div\n className={cx(\n 'ansh-ring',\n `ansh-ring--${tone}`,\n indeterminate && 'ansh-ring--indeterminate',\n className,\n )}\n style={{ width: size, height: size }}\n role=\"progressbar\"\n aria-label={label}\n {...(indeterminate\n ? null\n : {\n 'aria-valuenow': clamped,\n 'aria-valuemin': 0,\n 'aria-valuemax': max,\n 'aria-valuetext': text,\n })}\n >\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} aria-hidden=\"true\">\n <circle\n className=\"ansh-ring__track\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={thickness}\n />\n <circle\n className=\"ansh-ring__fill\"\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={thickness}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - fraction)}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n />\n </svg>\n {children ? <span className=\"ansh-ring__content\">{children}</span> : null}\n </div>\n )\n}\n\nexport interface MeterProps {\n value: number\n min?: number\n max?: number\n /** Thresholds that colour the bar — below `low` is danger, above `high` is success. */\n low?: number\n high?: number\n /** Flip the colours, for metrics where high is bad (disk usage, error rate). */\n inverted?: boolean\n label: string\n showValue?: boolean\n formatValue?: (value: number) => string\n className?: string\n}\n\n/**\n * A measurement within a known range — quota, score, capacity.\n *\n * `role=\"meter\"`, not `progressbar`. Colour follows the thresholds, but the numeric value is always\n * rendered too, so the state is never conveyed by colour alone.\n */\nexport function Meter({\n value,\n min = 0,\n max = 100,\n low,\n high,\n inverted = false,\n label,\n showValue = true,\n formatValue,\n className,\n}: MeterProps) {\n const clamped = Math.min(Math.max(value, min), max)\n const percent = ((clamped - min) / (max - min)) * 100\n\n let tone: 'danger' | 'warning' | 'success' = 'success'\n if (low !== undefined && clamped < low) tone = inverted ? 'success' : 'danger'\n else if (high !== undefined && clamped > high) tone = inverted ? 'danger' : 'success'\n else if (low !== undefined || high !== undefined) tone = 'warning'\n\n const text = formatValue ? formatValue(clamped) : String(clamped)\n\n return (\n <div className={cx('ansh-meter', `ansh-meter--${tone}`, className)}>\n <div className=\"ansh-progress__labels\">\n <span className=\"ansh-progress__label\">{label}</span>\n {showValue ? <span className=\"ansh-progress__value\">{text}</span> : null}\n </div>\n <div\n className=\"ansh-progress__track\"\n role=\"meter\"\n aria-label={label}\n aria-valuenow={clamped}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuetext={text}\n >\n <div className=\"ansh-progress__fill\" style={{ width: `${percent}%` }} />\n </div>\n </div>\n )\n}\n"]}