@ansh-ui/react 0.2.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 (92) hide show
  1. package/dist/{chunk-C5JG6TMM.cjs → chunk-2U7BHYIQ.cjs} +143 -143
  2. package/dist/chunk-2U7BHYIQ.cjs.map +1 -0
  3. package/dist/{chunk-HO2YSF5O.js → chunk-742E5FQS.js} +3 -3
  4. package/dist/chunk-742E5FQS.js.map +1 -0
  5. package/dist/{chunk-QO3E7TJS.js → chunk-7QGB2X7R.js} +36 -28
  6. package/dist/chunk-7QGB2X7R.js.map +1 -0
  7. package/dist/{chunk-EGG4CP7C.js → chunk-BQJ6H3HC.js} +3 -2
  8. package/dist/chunk-BQJ6H3HC.js.map +1 -0
  9. package/dist/{chunk-OLTS6G5M.js → chunk-GNA33V2J.js} +11 -6
  10. package/dist/chunk-GNA33V2J.js.map +1 -0
  11. package/dist/{chunk-C32LKF23.cjs → chunk-KTLTYHAT.cjs} +3 -3
  12. package/dist/chunk-KTLTYHAT.cjs.map +1 -0
  13. package/dist/{chunk-AVPEA5PB.cjs → chunk-MPX7QT4R.cjs} +4 -4
  14. package/dist/chunk-MPX7QT4R.cjs.map +1 -0
  15. package/dist/{chunk-T4AK2KLM.js → chunk-NJUVVMJV.js} +3 -3
  16. package/dist/chunk-NJUVVMJV.js.map +1 -0
  17. package/dist/{chunk-IBXLC5IE.js → chunk-P5MRISBP.js} +19 -3
  18. package/dist/chunk-P5MRISBP.js.map +1 -0
  19. package/dist/{chunk-WGYNCSTP.cjs → chunk-PUW6BTPQ.cjs} +3 -2
  20. package/dist/chunk-PUW6BTPQ.cjs.map +1 -0
  21. package/dist/{chunk-LDCZQP3R.js → chunk-RGGNLAAA.js} +122 -122
  22. package/dist/chunk-RGGNLAAA.js.map +1 -0
  23. package/dist/{chunk-6VRF7X5C.cjs → chunk-TEPQGFR4.cjs} +19 -2
  24. package/dist/chunk-TEPQGFR4.cjs.map +1 -0
  25. package/dist/{chunk-OJN5JBNP.cjs → chunk-VJI6V27F.cjs} +99 -99
  26. package/dist/chunk-VJI6V27F.cjs.map +1 -0
  27. package/dist/{chunk-HPGCILO4.js → chunk-XRKZPLUT.js} +99 -99
  28. package/dist/chunk-XRKZPLUT.js.map +1 -0
  29. package/dist/{chunk-DATBU46V.cjs → chunk-XYT6OXKP.cjs} +10 -4
  30. package/dist/chunk-XYT6OXKP.cjs.map +1 -0
  31. package/dist/{chunk-RHTLNSVW.cjs → chunk-YVJB7AAZ.cjs} +39 -31
  32. package/dist/chunk-YVJB7AAZ.cjs.map +1 -0
  33. package/dist/data.cjs +16 -16
  34. package/dist/data.d.cts +25 -23
  35. package/dist/data.d.ts +25 -23
  36. package/dist/data.js +1 -1
  37. package/dist/form.cjs +37 -37
  38. package/dist/form.d.cts +4 -1
  39. package/dist/form.d.ts +4 -1
  40. package/dist/form.js +2 -2
  41. package/dist/index.cjs +666 -135
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +220 -7
  44. package/dist/index.d.ts +220 -7
  45. package/dist/index.js +530 -14
  46. package/dist/index.js.map +1 -1
  47. package/dist/layout.cjs +13 -13
  48. package/dist/layout.d.cts +11 -2
  49. package/dist/layout.d.ts +11 -2
  50. package/dist/layout.js +1 -1
  51. package/dist/{motion-CQmCq6_k.d.ts → motion-C6WfBFES.d.cts} +23 -19
  52. package/dist/{motion-CSX4g2N8.d.cts → motion-ugXmf505.d.ts} +23 -19
  53. package/dist/motion.cjs +19 -19
  54. package/dist/motion.d.cts +2 -2
  55. package/dist/motion.d.ts +2 -2
  56. package/dist/motion.js +2 -2
  57. package/dist/navigation.cjs +8 -8
  58. package/dist/navigation.d.cts +3 -2
  59. package/dist/navigation.d.ts +3 -2
  60. package/dist/navigation.js +1 -1
  61. package/dist/overlay.cjs +16 -16
  62. package/dist/overlay.d.cts +17 -14
  63. package/dist/overlay.d.ts +17 -14
  64. package/dist/overlay.js +2 -2
  65. package/dist/{position-DVScKcaa.d.cts → position-CW6cGpSF.d.cts} +2 -1
  66. package/dist/{position-DVScKcaa.d.ts → position-CW6cGpSF.d.ts} +2 -1
  67. package/dist/primitives.cjs +25 -21
  68. package/dist/primitives.d.cts +5 -4
  69. package/dist/primitives.d.ts +5 -4
  70. package/dist/primitives.js +2 -2
  71. package/dist/{sidebar-D-PafAXw.d.cts → sidebar-Dyt67t2z.d.cts} +2 -1
  72. package/dist/{sidebar-D-PafAXw.d.ts → sidebar-Dyt67t2z.d.ts} +2 -1
  73. package/dist/styles.css +464 -0
  74. package/dist/{use-observers-B9qtimrk.d.cts → use-observers-DvA7hSz4.d.cts} +10 -1
  75. package/dist/{use-observers-B9qtimrk.d.ts → use-observers-DvA7hSz4.d.ts} +10 -1
  76. package/package.json +3 -3
  77. package/dist/chunk-6VRF7X5C.cjs.map +0 -1
  78. package/dist/chunk-AVPEA5PB.cjs.map +0 -1
  79. package/dist/chunk-C32LKF23.cjs.map +0 -1
  80. package/dist/chunk-C5JG6TMM.cjs.map +0 -1
  81. package/dist/chunk-DATBU46V.cjs.map +0 -1
  82. package/dist/chunk-EGG4CP7C.js.map +0 -1
  83. package/dist/chunk-HO2YSF5O.js.map +0 -1
  84. package/dist/chunk-HPGCILO4.js.map +0 -1
  85. package/dist/chunk-IBXLC5IE.js.map +0 -1
  86. package/dist/chunk-LDCZQP3R.js.map +0 -1
  87. package/dist/chunk-OJN5JBNP.cjs.map +0 -1
  88. package/dist/chunk-OLTS6G5M.js.map +0 -1
  89. package/dist/chunk-QO3E7TJS.js.map +0 -1
  90. package/dist/chunk-RHTLNSVW.cjs.map +0 -1
  91. package/dist/chunk-T4AK2KLM.js.map +0 -1
  92. package/dist/chunk-WGYNCSTP.cjs.map +0 -1
@@ -0,0 +1 @@
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/types.ts","../src/components/overlay/menu/surface.tsx","../src/components/overlay/menu/dropdown.tsx","../src/components/overlay/menu/context.tsx"],"names":["useRef","useId","useMemo","jsx","jsxs","useState","useEffect","createContext","useContext","Fragment","useCallback","MenuSurface","state","index"],"mappings":"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","file":"chunk-RGGNLAAA.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 } from 'react'\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\nexport function 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","import { useEffect, useId, useRef, useState } from 'react'\nimport { cx } from '../../../primitives/compose'\nimport { Portal } from '../../../primitives/portal'\nimport { useAnchoredPosition } from '../../../primitives/use-anchored-position'\nimport { usePresence } from '../../../primitives/presence'\nimport { type MenuAction, type MenuEntry, type MenuSubmenu, flatten } from './types'\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\nexport const 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","import { type ReactNode, useCallback, useId, useRef, useState } from 'react'\nimport { type Placement } from '../../../primitives/position'\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'\nimport { MenuSurface } from './surface'\nimport { type MenuEntry } from './types'\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\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","import { type ReactNode, useId, useRef, useState } from 'react'\nimport { Portal } from '../../../primitives/portal'\nimport { useAnchoredPosition } from '../../../primitives/use-anchored-position'\nimport { useDismiss } from '../../../primitives/use-dismiss'\nimport { usePresence } from '../../../primitives/presence'\nimport { MenuSurface } from './surface'\nimport { type MenuEntry } from './types'\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"]}
@@ -141,6 +141,22 @@ function useFrameBudget(enabled = true) {
141
141
  }, [enabled]);
142
142
  return report;
143
143
  }
144
+ function useTickerSubscriberCount(enabled = true) {
145
+ const [count, setCount] = react.useState(0);
146
+ react.useEffect(() => {
147
+ if (!enabled) return;
148
+ const ticker = core.getTicker();
149
+ setCount(ticker.subscriberCount);
150
+ let last = 0;
151
+ return ticker.onBudget(() => {
152
+ const now = performance.now();
153
+ if (now - last < 250) return;
154
+ last = now;
155
+ setCount(ticker.subscriberCount);
156
+ });
157
+ }, [enabled]);
158
+ return count;
159
+ }
144
160
  function useMergedRef(...refs) {
145
161
  return react.useCallback((node) => {
146
162
  for (const ref of refs) {
@@ -159,6 +175,7 @@ exports.usePointer = usePointer;
159
175
  exports.useReducedMotion = useReducedMotion;
160
176
  exports.useScrollProgress = useScrollProgress;
161
177
  exports.useTicker = useTicker;
178
+ exports.useTickerSubscriberCount = useTickerSubscriberCount;
162
179
  exports.useWindowScroll = useWindowScroll;
163
- //# sourceMappingURL=chunk-6VRF7X5C.cjs.map
164
- //# sourceMappingURL=chunk-6VRF7X5C.cjs.map
180
+ //# sourceMappingURL=chunk-TEPQGFR4.cjs.map
181
+ //# sourceMappingURL=chunk-TEPQGFR4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-observers.ts"],"names":["useRef","useEffect","getTicker","useState","observeIntersection","observeResize","trackScroll","trackContainerScroll","trackPointer","onReducedMotionChange","useCallback"],"mappings":"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","file":"chunk-TEPQGFR4.cjs","sourcesContent":["import { type RefObject, useCallback, useEffect, useRef, useState } from 'react'\nimport {\n type BudgetReport,\n type FrameState,\n type PointerState,\n type ScrollProgress,\n type ScrollTrackOptions,\n getTicker,\n observeIntersection,\n observeResize,\n onReducedMotionChange,\n trackContainerScroll,\n trackPointer,\n trackScroll,\n} from '@ansh-ui/core'\n\n/**\n * Subscribe to the shared ticker.\n *\n * The callback is held in a ref and never re-subscribes, so a component that closes over changing\n * props doesn't tear down and rebuild its subscription on every render. That matters: resubscribing\n * changes execution order within the phase, which can visibly reorder dependent animations.\n */\nexport function useTicker(\n callback: (state: FrameState) => void,\n options: {\n phase?: 'read' | 'compute' | 'write' | 'post'\n priority?: number\n enabled?: boolean\n } = {},\n): void {\n const callbackRef = useRef(callback)\n callbackRef.current = callback\n\n const { phase = 'write', priority = 0, enabled = true } = options\n\n useEffect(() => {\n if (!enabled) return\n const ticker = getTicker()\n return ticker.add((state) => callbackRef.current(state), { phase, priority, name: 'useTicker' })\n }, [phase, priority, enabled])\n}\n\nexport interface InViewOptions {\n /** Fraction visible before triggering, in `[0, 1]`. Default `0`. */\n threshold?: number\n /** Extra margin around the root. Default `'0px'`. */\n rootMargin?: string\n /** Stop observing after the first intersection. Default `false`. */\n once?: boolean\n root?: Element | null\n}\n\n/**\n * Is the element in the viewport?\n *\n * Uses the pooled observer, so a page with 200 scroll-revealed elements creates one\n * `IntersectionObserver` rather than 200.\n */\nexport function useInView<El extends Element = HTMLDivElement>(\n options: InViewOptions = {},\n): [RefObject<El | null>, boolean] {\n const ref = useRef<El | null>(null)\n const [inView, setInView] = useState(false)\n\n const { threshold = 0, rootMargin = '0px', once = false, root = null } = options\n\n useEffect(() => {\n const element = ref.current\n if (!element) return\n\n let released = false\n const stop = observeIntersection(\n element,\n (entry) => {\n setInView(entry.isIntersecting)\n if (entry.isIntersecting && once && !released) {\n released = true\n // Release inside a microtask: unsubscribing from within the observer callback would\n // mutate the pool's callback set while it is being iterated.\n queueMicrotask(() => stop())\n }\n },\n { threshold, rootMargin, root },\n )\n\n return () => {\n released = true\n stop()\n }\n }, [threshold, rootMargin, once, root])\n\n return [ref, inView]\n}\n\n/**\n * Track an element's size.\n *\n * Returns state rather than a MotionValue because size changes at interaction rate, not frame\n * rate, so a re-render per change is appropriate and far more ergonomic.\n */\nexport function useElementSize<El extends Element = HTMLDivElement>(): [\n RefObject<El | null>,\n { width: number; height: number },\n] {\n const ref = useRef<El | null>(null)\n const [size, setSize] = useState({ width: 0, height: 0 })\n\n useEffect(() => {\n const element = ref.current\n if (!element) return\n return observeResize(element, ({ width, height }) => {\n // Guard against redundant renders: ResizeObserver fires on sub-pixel changes during\n // animation, and setting identical state still costs a render pass in React 18.\n setSize((previous) =>\n previous.width === width && previous.height === height ? previous : { width, height },\n )\n })\n }, [])\n\n return [ref, size]\n}\n\n/**\n * Track an element's scroll progress through the viewport.\n *\n * The returned progress is a **ref**, not state, deliberately — scroll progress changes every\n * frame, and rendering on each change would make scrolling janky. Read `progress.current` inside a\n * `useTicker` callback, or pass the `onChange` callback and write to the DOM directly.\n */\nexport function useScrollProgress<El extends HTMLElement = HTMLDivElement>(\n options: ScrollTrackOptions & { onChange?: (progress: ScrollProgress) => void } = {},\n): [RefObject<El | null>, RefObject<ScrollProgress>] {\n const ref = useRef<El | null>(null)\n const progressRef = useRef<ScrollProgress>({\n progress: 0,\n velocity: 0,\n scroll: 0,\n direction: 0,\n inView: false,\n })\n\n const onChangeRef = useRef(options.onChange)\n onChangeRef.current = options.onChange\n\n const { axis = 'y', container = null } = options\n const offsetKey = JSON.stringify(options.offset ?? null)\n\n useEffect(() => {\n const element = ref.current\n if (!element) return\n\n return trackScroll(\n element,\n (progress) => {\n progressRef.current = progress\n onChangeRef.current?.(progress)\n },\n {\n axis,\n container,\n ...(options.offset ? { offset: options.offset } : {}),\n },\n )\n // `offsetKey` stands in for the offset object, which is usually an inline literal and would\n // otherwise change identity on every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [axis, container, offsetKey])\n\n return [ref, progressRef]\n}\n\n/** Track the window's (or a container's) overall scroll progress. */\nexport function useWindowScroll(\n onChange?: (info: { progress: number; scroll: number; velocity: number; max: number }) => void,\n options: { axis?: 'y' | 'x'; container?: HTMLElement | null } = {},\n): RefObject<{ progress: number; scroll: number; velocity: number; max: number }> {\n const stateRef = useRef({ progress: 0, scroll: 0, velocity: 0, max: 1 })\n const onChangeRef = useRef(onChange)\n onChangeRef.current = onChange\n\n const { axis = 'y', container = null } = options\n\n useEffect(\n () =>\n trackContainerScroll(\n (info) => {\n stateRef.current = info\n onChangeRef.current?.(info)\n },\n { axis, container },\n ),\n [axis, container],\n )\n\n return stateRef\n}\n\n/**\n * Track pointer position over an element.\n *\n * Returns a ref to the live state object, which is mutated in place by the tracker. Reading it\n * inside a `useTicker` callback is the intended use; it deliberately does not trigger renders.\n */\nexport function usePointer<El extends HTMLElement = HTMLDivElement>(\n options: { smoothing?: number; trackOutside?: boolean; enabled?: boolean } = {},\n): [RefObject<El | null>, RefObject<Readonly<PointerState> | null>] {\n const ref = useRef<El | null>(null)\n const stateRef = useRef<Readonly<PointerState> | null>(null)\n\n const { smoothing, trackOutside = false, enabled = true } = options\n\n useEffect(() => {\n const element = ref.current\n if (!element || !enabled) return\n\n const tracker = trackPointer(element, {\n ...(smoothing !== undefined ? { smoothing } : {}),\n trackOutside,\n })\n stateRef.current = tracker.state\n\n return () => {\n tracker.destroy()\n stateRef.current = null\n }\n }, [smoothing, trackOutside, enabled])\n\n return [ref, stateRef]\n}\n\n/**\n * Does the user prefer reduced motion?\n *\n * Returns `false` during SSR and on the first client render, then updates. That ordering is\n * deliberate: returning the real value during SSR is impossible (the server cannot know), and\n * returning it on the first client render would be a hydration mismatch.\n */\nexport function useReducedMotion(): boolean {\n const [reduced, setReduced] = useState(false)\n useEffect(() => onReducedMotionChange(setReduced), [])\n return reduced\n}\n\n/**\n * Live frame-budget telemetry — FPS, frame cost percentiles, and the adaptive quality scalar.\n *\n * Intended for a development overlay. Subscribing causes a re-render every frame, so this must not\n * ship in production render paths; the `enabled` flag exists so it can be gated on `NODE_ENV`.\n */\nexport function useFrameBudget(enabled = true): BudgetReport | null {\n const [report, setReport] = useState<BudgetReport | null>(null)\n\n useEffect(() => {\n if (!enabled) return\n const ticker = getTicker()\n // Sample at ~4 Hz rather than per frame. A number that changes 60 times a second is\n // unreadable, and rendering it 60 times a second distorts the very measurement being shown.\n let last = 0\n return ticker.onBudget((next) => {\n const now = performance.now()\n if (now - last < 250) return\n last = now\n setReport(next)\n })\n }, [enabled])\n\n return report\n}\n\n/**\n * Live count of components currently subscribed to the shared ticker.\n *\n * Intended for a devtools-style overlay, alongside `useFrameBudget` — the ticker only exposes\n * `subscriberCount` as a getter with no change event, so this piggybacks on `onBudget`'s existing\n * ~4 Hz sample instead of opening a second interval or rAF loop just to poll one number.\n */\nexport function useTickerSubscriberCount(enabled = true): number {\n const [count, setCount] = useState(0)\n\n useEffect(() => {\n if (!enabled) return\n const ticker = getTicker()\n setCount(ticker.subscriberCount)\n let last = 0\n return ticker.onBudget(() => {\n const now = performance.now()\n if (now - last < 250) return\n last = now\n setCount(ticker.subscriberCount)\n })\n }, [enabled])\n\n return count\n}\n\n/** Merge several refs into one callback ref, for components that both forward and use a ref. */\nexport function useMergedRef<T>(\n ...refs: Array<React.Ref<T> | undefined | null>\n): (node: T | null) => void {\n return useCallback((node: T | null) => {\n for (const ref of refs) {\n if (!ref) continue\n if (typeof ref === 'function') ref(node)\n else (ref as React.MutableRefObject<T | null>).current = node\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs)\n}\n"]}
@@ -6,6 +6,103 @@ var react = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var core = require('@ansh-ui/core');
8
8
 
9
+ function Pagination({
10
+ page,
11
+ pageCount,
12
+ onPageChange,
13
+ total,
14
+ pageSize,
15
+ siblings = 1,
16
+ className
17
+ }) {
18
+ const pages = react.useMemo(() => {
19
+ const result = [];
20
+ const first = 0;
21
+ const last = pageCount - 1;
22
+ for (let index = first; index <= last; index++) {
23
+ const nearCurrent = Math.abs(index - page) <= siblings;
24
+ const isEdge = index === first || index === last;
25
+ if (nearCurrent || isEdge) {
26
+ result.push(index);
27
+ } else if (result[result.length - 1] !== "gap") {
28
+ result.push("gap");
29
+ }
30
+ }
31
+ return result;
32
+ }, [page, pageCount, siblings]);
33
+ const from = pageSize ? page * pageSize + 1 : null;
34
+ const to = pageSize && total ? Math.min((page + 1) * pageSize, total) : null;
35
+ return /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: chunkSFU5EPSN_cjs.cx("ansh-pagination", className), "aria-label": "Pagination", children: [
36
+ from !== null && to !== null ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "ansh-pagination__summary", children: [
37
+ from,
38
+ "\u2013",
39
+ to,
40
+ " of ",
41
+ total
42
+ ] }) : null,
43
+ /* @__PURE__ */ jsxRuntime.jsxs("ol", { className: "ansh-pagination__list", children: [
44
+ /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
45
+ "button",
46
+ {
47
+ type: "button",
48
+ className: "ansh-pagination__button ansh-focusable",
49
+ disabled: page === 0,
50
+ "aria-label": "Previous page",
51
+ onClick: () => onPageChange(page - 1),
52
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 12 12", width: "12", height: "12", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
53
+ "path",
54
+ {
55
+ d: "M7.5 2.5L4 6l3.5 3.5",
56
+ stroke: "currentColor",
57
+ strokeWidth: "1.5",
58
+ fill: "none",
59
+ strokeLinecap: "round",
60
+ strokeLinejoin: "round"
61
+ }
62
+ ) })
63
+ }
64
+ ) }),
65
+ pages.map(
66
+ (entry, index) => entry === "gap" ? /* @__PURE__ */ jsxRuntime.jsx("li", { "aria-hidden": "true", className: "ansh-pagination__gap", children: "\u2026" }, `gap-${index}`) : /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
67
+ "button",
68
+ {
69
+ type: "button",
70
+ className: chunkSFU5EPSN_cjs.cx(
71
+ "ansh-pagination__button",
72
+ entry === page && "ansh-pagination__button--current",
73
+ "ansh-focusable"
74
+ ),
75
+ "aria-current": entry === page ? "page" : void 0,
76
+ "aria-label": `Page ${entry + 1}`,
77
+ onClick: () => onPageChange(entry),
78
+ children: entry + 1
79
+ }
80
+ ) }, entry)
81
+ ),
82
+ /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
83
+ "button",
84
+ {
85
+ type: "button",
86
+ className: "ansh-pagination__button ansh-focusable",
87
+ disabled: page >= pageCount - 1,
88
+ "aria-label": "Next page",
89
+ onClick: () => onPageChange(page + 1),
90
+ children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 12 12", width: "12", height: "12", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
91
+ "path",
92
+ {
93
+ d: "M4.5 2.5L8 6l-3.5 3.5",
94
+ stroke: "currentColor",
95
+ strokeWidth: "1.5",
96
+ fill: "none",
97
+ strokeLinecap: "round",
98
+ strokeLinejoin: "round"
99
+ }
100
+ ) })
101
+ }
102
+ ) })
103
+ ] })
104
+ ] });
105
+ }
9
106
  function compare(a, b) {
10
107
  if (a == null && b == null) return 0;
11
108
  if (a == null) return 1;
@@ -240,103 +337,6 @@ function DataTable({
240
337
  ) : null
241
338
  ] });
242
339
  }
243
- function Pagination({
244
- page,
245
- pageCount,
246
- onPageChange,
247
- total,
248
- pageSize,
249
- siblings = 1,
250
- className
251
- }) {
252
- const pages = react.useMemo(() => {
253
- const result = [];
254
- const first = 0;
255
- const last = pageCount - 1;
256
- for (let index = first; index <= last; index++) {
257
- const nearCurrent = Math.abs(index - page) <= siblings;
258
- const isEdge = index === first || index === last;
259
- if (nearCurrent || isEdge) {
260
- result.push(index);
261
- } else if (result[result.length - 1] !== "gap") {
262
- result.push("gap");
263
- }
264
- }
265
- return result;
266
- }, [page, pageCount, siblings]);
267
- const from = pageSize ? page * pageSize + 1 : null;
268
- const to = pageSize && total ? Math.min((page + 1) * pageSize, total) : null;
269
- return /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: chunkSFU5EPSN_cjs.cx("ansh-pagination", className), "aria-label": "Pagination", children: [
270
- from !== null && to !== null ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "ansh-pagination__summary", children: [
271
- from,
272
- "\u2013",
273
- to,
274
- " of ",
275
- total
276
- ] }) : null,
277
- /* @__PURE__ */ jsxRuntime.jsxs("ol", { className: "ansh-pagination__list", children: [
278
- /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
279
- "button",
280
- {
281
- type: "button",
282
- className: "ansh-pagination__button ansh-focusable",
283
- disabled: page === 0,
284
- "aria-label": "Previous page",
285
- onClick: () => onPageChange(page - 1),
286
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 12 12", width: "12", height: "12", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
287
- "path",
288
- {
289
- d: "M7.5 2.5L4 6l3.5 3.5",
290
- stroke: "currentColor",
291
- strokeWidth: "1.5",
292
- fill: "none",
293
- strokeLinecap: "round",
294
- strokeLinejoin: "round"
295
- }
296
- ) })
297
- }
298
- ) }),
299
- pages.map(
300
- (entry, index) => entry === "gap" ? /* @__PURE__ */ jsxRuntime.jsx("li", { "aria-hidden": "true", className: "ansh-pagination__gap", children: "\u2026" }, `gap-${index}`) : /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
301
- "button",
302
- {
303
- type: "button",
304
- className: chunkSFU5EPSN_cjs.cx(
305
- "ansh-pagination__button",
306
- entry === page && "ansh-pagination__button--current",
307
- "ansh-focusable"
308
- ),
309
- "aria-current": entry === page ? "page" : void 0,
310
- "aria-label": `Page ${entry + 1}`,
311
- onClick: () => onPageChange(entry),
312
- children: entry + 1
313
- }
314
- ) }, entry)
315
- ),
316
- /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
317
- "button",
318
- {
319
- type: "button",
320
- className: "ansh-pagination__button ansh-focusable",
321
- disabled: page >= pageCount - 1,
322
- "aria-label": "Next page",
323
- onClick: () => onPageChange(page + 1),
324
- children: /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 12 12", width: "12", height: "12", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx(
325
- "path",
326
- {
327
- d: "M4.5 2.5L8 6l-3.5 3.5",
328
- stroke: "currentColor",
329
- strokeWidth: "1.5",
330
- fill: "none",
331
- strokeLinecap: "round",
332
- strokeLinejoin: "round"
333
- }
334
- ) })
335
- }
336
- ) })
337
- ] })
338
- ] });
339
- }
340
340
  function Table({
341
341
  caption,
342
342
  density = "comfortable",
@@ -772,5 +772,5 @@ exports.Progress = Progress;
772
772
  exports.Stat = Stat;
773
773
  exports.Table = Table;
774
774
  exports.Timeline = Timeline;
775
- //# sourceMappingURL=chunk-OJN5JBNP.cjs.map
776
- //# sourceMappingURL=chunk-OJN5JBNP.cjs.map
775
+ //# sourceMappingURL=chunk-VJI6V27F.cjs.map
776
+ //# sourceMappingURL=chunk-VJI6V27F.cjs.map