@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.
- package/dist/{chunk-C5JG6TMM.cjs → chunk-2U7BHYIQ.cjs} +143 -143
- package/dist/chunk-2U7BHYIQ.cjs.map +1 -0
- package/dist/{chunk-HO2YSF5O.js → chunk-742E5FQS.js} +3 -3
- package/dist/chunk-742E5FQS.js.map +1 -0
- package/dist/{chunk-QO3E7TJS.js → chunk-7QGB2X7R.js} +36 -28
- package/dist/chunk-7QGB2X7R.js.map +1 -0
- package/dist/{chunk-EGG4CP7C.js → chunk-BQJ6H3HC.js} +3 -2
- package/dist/chunk-BQJ6H3HC.js.map +1 -0
- package/dist/{chunk-OLTS6G5M.js → chunk-GNA33V2J.js} +11 -6
- package/dist/chunk-GNA33V2J.js.map +1 -0
- package/dist/{chunk-C32LKF23.cjs → chunk-KTLTYHAT.cjs} +3 -3
- package/dist/chunk-KTLTYHAT.cjs.map +1 -0
- package/dist/{chunk-AVPEA5PB.cjs → chunk-MPX7QT4R.cjs} +4 -4
- package/dist/chunk-MPX7QT4R.cjs.map +1 -0
- package/dist/{chunk-T4AK2KLM.js → chunk-NJUVVMJV.js} +3 -3
- package/dist/chunk-NJUVVMJV.js.map +1 -0
- package/dist/{chunk-IBXLC5IE.js → chunk-P5MRISBP.js} +19 -3
- package/dist/chunk-P5MRISBP.js.map +1 -0
- package/dist/{chunk-WGYNCSTP.cjs → chunk-PUW6BTPQ.cjs} +3 -2
- package/dist/chunk-PUW6BTPQ.cjs.map +1 -0
- package/dist/{chunk-LDCZQP3R.js → chunk-RGGNLAAA.js} +122 -122
- package/dist/chunk-RGGNLAAA.js.map +1 -0
- package/dist/{chunk-6VRF7X5C.cjs → chunk-TEPQGFR4.cjs} +19 -2
- package/dist/chunk-TEPQGFR4.cjs.map +1 -0
- package/dist/{chunk-OJN5JBNP.cjs → chunk-VJI6V27F.cjs} +99 -99
- package/dist/chunk-VJI6V27F.cjs.map +1 -0
- package/dist/{chunk-HPGCILO4.js → chunk-XRKZPLUT.js} +99 -99
- package/dist/chunk-XRKZPLUT.js.map +1 -0
- package/dist/{chunk-DATBU46V.cjs → chunk-XYT6OXKP.cjs} +10 -4
- package/dist/chunk-XYT6OXKP.cjs.map +1 -0
- package/dist/{chunk-RHTLNSVW.cjs → chunk-YVJB7AAZ.cjs} +39 -31
- package/dist/chunk-YVJB7AAZ.cjs.map +1 -0
- package/dist/data.cjs +16 -16
- package/dist/data.d.cts +25 -23
- package/dist/data.d.ts +25 -23
- package/dist/data.js +1 -1
- package/dist/form.cjs +37 -37
- package/dist/form.d.cts +4 -1
- package/dist/form.d.ts +4 -1
- package/dist/form.js +2 -2
- package/dist/index.cjs +666 -135
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +220 -7
- package/dist/index.d.ts +220 -7
- package/dist/index.js +530 -14
- package/dist/index.js.map +1 -1
- package/dist/layout.cjs +13 -13
- package/dist/layout.d.cts +11 -2
- package/dist/layout.d.ts +11 -2
- package/dist/layout.js +1 -1
- package/dist/{motion-CQmCq6_k.d.ts → motion-C6WfBFES.d.cts} +23 -19
- package/dist/{motion-CSX4g2N8.d.cts → motion-ugXmf505.d.ts} +23 -19
- package/dist/motion.cjs +19 -19
- package/dist/motion.d.cts +2 -2
- package/dist/motion.d.ts +2 -2
- package/dist/motion.js +2 -2
- package/dist/navigation.cjs +8 -8
- package/dist/navigation.d.cts +3 -2
- package/dist/navigation.d.ts +3 -2
- package/dist/navigation.js +1 -1
- package/dist/overlay.cjs +16 -16
- package/dist/overlay.d.cts +17 -14
- package/dist/overlay.d.ts +17 -14
- package/dist/overlay.js +2 -2
- package/dist/{position-DVScKcaa.d.cts → position-CW6cGpSF.d.cts} +2 -1
- package/dist/{position-DVScKcaa.d.ts → position-CW6cGpSF.d.ts} +2 -1
- package/dist/primitives.cjs +25 -21
- package/dist/primitives.d.cts +5 -4
- package/dist/primitives.d.ts +5 -4
- package/dist/primitives.js +2 -2
- package/dist/{sidebar-D-PafAXw.d.cts → sidebar-Dyt67t2z.d.cts} +2 -1
- package/dist/{sidebar-D-PafAXw.d.ts → sidebar-Dyt67t2z.d.ts} +2 -1
- package/dist/styles.css +464 -0
- package/dist/{use-observers-B9qtimrk.d.cts → use-observers-DvA7hSz4.d.cts} +10 -1
- package/dist/{use-observers-B9qtimrk.d.ts → use-observers-DvA7hSz4.d.ts} +10 -1
- package/package.json +3 -3
- package/dist/chunk-6VRF7X5C.cjs.map +0 -1
- package/dist/chunk-AVPEA5PB.cjs.map +0 -1
- package/dist/chunk-C32LKF23.cjs.map +0 -1
- package/dist/chunk-C5JG6TMM.cjs.map +0 -1
- package/dist/chunk-DATBU46V.cjs.map +0 -1
- package/dist/chunk-EGG4CP7C.js.map +0 -1
- package/dist/chunk-HO2YSF5O.js.map +0 -1
- package/dist/chunk-HPGCILO4.js.map +0 -1
- package/dist/chunk-IBXLC5IE.js.map +0 -1
- package/dist/chunk-LDCZQP3R.js.map +0 -1
- package/dist/chunk-OJN5JBNP.cjs.map +0 -1
- package/dist/chunk-OLTS6G5M.js.map +0 -1
- package/dist/chunk-QO3E7TJS.js.map +0 -1
- package/dist/chunk-RHTLNSVW.cjs.map +0 -1
- package/dist/chunk-T4AK2KLM.js.map +0 -1
- package/dist/chunk-WGYNCSTP.cjs.map +0 -1
|
@@ -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/layout/index.tsx","../src/components/layout/resizable.tsx"],"names":["Stack","HStack","VStack","Grid","GridItem","Container","Divider","Center","AspectRatio","ScrollArea","jsxs","jsx"],"mappings":"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","file":"chunk-EGG4CP7C.js","sourcesContent":["import {\n type CSSProperties,\n type ElementType,\n type ForwardedRef,\n type HTMLAttributes,\n type ReactNode,\n forwardRef,\n} from 'react'\nimport { cx } from '../../primitives/compose'\n\n/**\n * Layout primitives.\n *\n * These exist because every application rebuilds them, badly. The rebuilt versions hardcode gaps in\n * pixels, so they don't respond to a density setting; they use margins, so they collapse\n * unpredictably; and they don't handle the RTL case.\n *\n * Everything here takes a **token key**, not a raw value: `gap={4}` means `--ansh-space-4`, so a\n * layout is guaranteed to sit on the spacing scale. Passing an arbitrary string is still possible\n * for the genuine one-off, but the type nudges toward the scale first.\n */\n\n/** A key into the spacing scale, or a raw CSS length for the rare exception. */\nexport type SpaceToken =\n 0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12 | 16 | 20 | 24 | (string & {})\n\nfunction space(value: SpaceToken | undefined): string | undefined {\n if (value === undefined) return undefined\n if (typeof value === 'string') return value\n return `var(--ansh-space-${value})`\n}\n\ninterface BaseProps extends HTMLAttributes<HTMLElement> {\n as?: ElementType\n children?: ReactNode\n}\n\n// --- Stack ----------------------------------------------------------------\n\nexport interface StackProps extends BaseProps {\n /** Default `'vertical'` — the direction that needs a helper more often. */\n direction?: 'horizontal' | 'vertical'\n gap?: SpaceToken\n align?: CSSProperties['alignItems']\n justify?: CSSProperties['justifyContent']\n wrap?: boolean\n /** Grow to fill the cross axis. */\n stretch?: boolean\n /** Insert a hairline divider between children. */\n divide?: boolean\n}\n\n/**\n * One-dimensional flex layout.\n *\n * ```tsx\n * <Stack direction=\"horizontal\" gap={3} align=\"center\">\n * <Avatar src={user.avatar} name={user.name} />\n * <Stack gap={0.5}>\n * <strong>{user.name}</strong>\n * <Text tone=\"secondary\">{user.email}</Text>\n * </Stack>\n * </Stack>\n * ```\n */\nexport const Stack = forwardRef(function Stack(\n {\n as: Component = 'div',\n direction = 'vertical',\n gap = 4,\n align,\n justify,\n wrap = false,\n stretch = false,\n divide = false,\n className,\n style,\n ...rest\n }: StackProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n return (\n <Component\n ref={ref}\n className={cx('ansh-stack', divide && 'ansh-stack--divide', className)}\n data-direction={direction}\n style={{\n display: 'flex',\n flexDirection: direction === 'horizontal' ? 'row' : 'column',\n gap: space(gap),\n alignItems: align ?? (stretch ? 'stretch' : undefined),\n justifyContent: justify,\n flexWrap: wrap ? 'wrap' : undefined,\n ...style,\n }}\n {...rest}\n />\n )\n})\n\n/** Horizontal `Stack`, for readability at call sites. */\nexport const HStack = forwardRef(function HStack(\n props: Omit<StackProps, 'direction'>,\n ref: ForwardedRef<HTMLElement>,\n) {\n return <Stack ref={ref} direction=\"horizontal\" {...props} />\n})\n\n/** Vertical `Stack`, for symmetry with `HStack`. */\nexport const VStack = forwardRef(function VStack(\n props: Omit<StackProps, 'direction'>,\n ref: ForwardedRef<HTMLElement>,\n) {\n return <Stack ref={ref} direction=\"vertical\" {...props} />\n})\n\n// --- Grid -----------------------------------------------------------------\n\nexport interface GridProps extends BaseProps {\n /** Fixed column count, or `'auto'` for a responsive `auto-fill` track. */\n columns?: number | 'auto'\n /** Minimum column width when `columns=\"auto\"`. Default `'16rem'`. */\n minColumnWidth?: string\n gap?: SpaceToken\n /** Row gap, when it should differ from the column gap. */\n rowGap?: SpaceToken\n align?: CSSProperties['alignItems']\n}\n\n/**\n * Two-dimensional layout.\n *\n * `columns=\"auto\"` uses `repeat(auto-fill, minmax(min(N, 100%), 1fr))`. The inner `min()` is what\n * stops the grid overflowing on a phone: without it, a 16rem minimum on a 15rem-wide viewport\n * produces a track wider than the screen and a horizontal scrollbar.\n */\nexport const Grid = forwardRef(function Grid(\n {\n as: Component = 'div',\n columns = 'auto',\n minColumnWidth = '16rem',\n gap = 4,\n rowGap,\n align,\n className,\n style,\n ...rest\n }: GridProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n return (\n <Component\n ref={ref}\n className={cx('ansh-grid', className)}\n style={{\n display: 'grid',\n gridTemplateColumns:\n columns === 'auto'\n ? `repeat(auto-fill, minmax(min(${minColumnWidth}, 100%), 1fr))`\n : `repeat(${columns}, minmax(0, 1fr))`,\n gap: space(gap),\n rowGap: space(rowGap),\n alignItems: align,\n ...style,\n }}\n {...rest}\n />\n )\n})\n\nexport interface GridItemProps extends BaseProps {\n /** Columns to span. `'full'` spans the whole row. */\n span?: number | 'full'\n rowSpan?: number\n}\n\nexport const GridItem = forwardRef(function GridItem(\n { as: Component = 'div', span, rowSpan, className, style, ...rest }: GridItemProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n return (\n <Component\n ref={ref}\n className={className}\n style={{\n gridColumn: span === 'full' ? '1 / -1' : span ? `span ${span} / span ${span}` : undefined,\n gridRow: rowSpan ? `span ${rowSpan} / span ${rowSpan}` : undefined,\n // `minWidth: 0` on every grid child. Without it a child containing a long unbroken string\n // or a table refuses to shrink below its content width and blows out the track.\n minWidth: 0,\n ...style,\n }}\n {...rest}\n />\n )\n})\n\n// --- Container ------------------------------------------------------------\n\nexport interface ContainerProps extends BaseProps {\n /** Max content width. Default `'lg'` (72rem). */\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'\n /** Horizontal padding. Default `6`. */\n padding?: SpaceToken\n}\n\nconst CONTAINER_WIDTH = {\n sm: '40rem',\n md: '56rem',\n lg: '72rem',\n xl: '90rem',\n full: '100%',\n} as const\n\n/** Centred, width-constrained page content. */\nexport const Container = forwardRef(function Container(\n { as: Component = 'div', size = 'lg', padding = 6, className, style, ...rest }: ContainerProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n return (\n <Component\n ref={ref}\n className={cx('ansh-container', className)}\n style={{\n width: '100%',\n maxWidth: CONTAINER_WIDTH[size],\n marginInline: 'auto',\n paddingInline: space(padding),\n ...style,\n }}\n {...rest}\n />\n )\n})\n\n// --- Divider --------------------------------------------------------------\n\nexport interface DividerProps extends Omit<BaseProps, 'children'> {\n orientation?: 'horizontal' | 'vertical'\n /** Optional label rendered in the middle of the rule. */\n label?: ReactNode\n}\n\n/**\n * A rule.\n *\n * With a label it becomes a labelled separator — the \"or continue with\" divider on a sign-in form.\n * `role=\"separator\"` is set only when there's no label; with one, it's a heading-like element and\n * announcing it as a separator loses the text.\n */\nexport const Divider = forwardRef(function Divider(\n { orientation = 'horizontal', label, className, ...rest }: DividerProps,\n ref: ForwardedRef<HTMLDivElement>,\n) {\n if (label) {\n return (\n <div\n ref={ref}\n className={cx('ansh-divider', 'ansh-divider--labelled', className)}\n {...(rest as HTMLAttributes<HTMLDivElement>)}\n >\n <span className=\"ansh-divider__line\" />\n <span className=\"ansh-divider__label\">{label}</span>\n <span className=\"ansh-divider__line\" />\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cx('ansh-divider', `ansh-divider--${orientation}`, className)}\n {...(rest as HTMLAttributes<HTMLDivElement>)}\n />\n )\n})\n\n// --- Spacer ---------------------------------------------------------------\n\nexport interface SpacerProps {\n size?: SpaceToken\n /** Grow to absorb free space in a flex container. */\n grow?: boolean\n}\n\n/** Explicit empty space. `grow` pushes siblings apart in a flex row. */\nexport function Spacer({ size, grow = false }: SpacerProps) {\n return (\n <span\n aria-hidden=\"true\"\n style={{\n display: 'block',\n flexGrow: grow ? 1 : 0,\n flexShrink: 0,\n ...(size !== undefined ? { width: space(size), height: space(size) } : null),\n }}\n />\n )\n}\n\n// --- Center ---------------------------------------------------------------\n\n/** Centre a child on both axes. */\nexport const Center = forwardRef(function Center(\n { as: Component = 'div', className, style, ...rest }: BaseProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n return (\n <Component\n ref={ref}\n className={className}\n style={{ display: 'grid', placeItems: 'center', ...style }}\n {...rest}\n />\n )\n})\n\n// --- AspectRatio ----------------------------------------------------------\n\nexport interface AspectRatioProps extends BaseProps {\n /** Width ÷ height. `16 / 9` reads better than `1.777`. Default `16 / 9`. */\n ratio?: number\n}\n\n/**\n * Reserve space at a fixed aspect ratio.\n *\n * Uses the `aspect-ratio` property rather than the padding-top hack. The reserved space is what\n * matters: an image that loads without it shifts everything below, which is a Cumulative Layout\n * Shift penalty and the most common cause of a failing Core Web Vitals score.\n */\nexport const AspectRatio = forwardRef(function AspectRatio(\n { as: Component = 'div', ratio = 16 / 9, className, style, ...rest }: AspectRatioProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n return (\n <Component\n ref={ref}\n className={cx('ansh-aspect', className)}\n style={{ aspectRatio: String(ratio), ...style }}\n {...rest}\n />\n )\n})\n\n// --- ScrollArea -----------------------------------------------------------\n\nexport interface ScrollAreaProps extends BaseProps {\n /** Max height before scrolling starts. */\n maxHeight?: string\n axis?: 'y' | 'x' | 'both'\n /** Fade the content at the scrollable edges. Default `true`. */\n fade?: boolean\n}\n\n/**\n * A scroll container with styled scrollbars and edge fades.\n *\n * The native scrollbar is kept — a JavaScript-rendered one breaks keyboard scrolling, mobile\n * momentum, and the OS \"scroll bar is always visible\" accessibility setting. It is only *styled*,\n * via `scrollbar-width`/`scrollbar-color` with a `::-webkit-scrollbar` fallback.\n *\n * The edge fade is a mask that appears only when there is more content in that direction. It is\n * driven by `animation-timeline: scroll()` where supported, so it costs nothing on the main thread\n * and degrades to no fade where it isn't.\n */\nexport const ScrollArea = forwardRef(function ScrollArea(\n {\n as: Component = 'div',\n maxHeight,\n axis = 'y',\n fade = true,\n className,\n style,\n ...rest\n }: ScrollAreaProps,\n ref: ForwardedRef<HTMLElement>,\n) {\n return (\n <Component\n ref={ref}\n className={cx('ansh-scroll', fade && 'ansh-scroll--fade', className)}\n data-axis={axis}\n style={{\n maxHeight,\n overflowY: axis === 'x' ? 'hidden' : 'auto',\n overflowX: axis === 'y' ? 'hidden' : 'auto',\n ...style,\n }}\n {...rest}\n />\n )\n})\n","import { type ReactNode, useCallback, useEffect, useRef, useState } from 'react'\nimport { cx } from '../../primitives/compose'\nimport { useControllableState } from '../../primitives/use-controllable-state'\n\nexport interface ResizableProps {\n /** Exactly two children: the two panes. */\n children: [ReactNode, ReactNode]\n direction?: 'horizontal' | 'vertical'\n /** First pane's size as a percentage, `0`–`100`. Default `50`. */\n defaultSize?: number\n size?: number\n onSizeChange?: (size: number) => void\n /** Clamp, as percentages. Defaults `10` and `90`. */\n minSize?: number\n maxSize?: number\n /** Snap points in percent, e.g. `[25, 50, 75]`. Within 3% the handle snaps. */\n snapPoints?: readonly number[]\n className?: string\n /** Accessible name for the handle — \"Resize sidebar\", not \"Resize\". */\n label?: string\n}\n\n/**\n * A two-pane split with a draggable divider.\n *\n * The layout every IDE, mail client and admin console needs, and the one most often shipped as\n * mouse-only. The handle here is a real `role=\"separator\"` with `aria-valuenow`, and arrow keys\n * move it in 2% steps — WAI-ARIA calls this a window splitter and it is a documented pattern, not\n * an invention.\n *\n * Sizes are percentages rather than pixels so the split survives a window resize proportionally.\n * Dragging writes to a CSS custom property directly, bypassing React: a re-render per pointer move\n * makes the drag feel heavy on a complex page, and the value is only committed to state on release.\n */\nexport function Resizable({\n children,\n direction = 'horizontal',\n defaultSize = 50,\n size,\n onSizeChange,\n minSize = 10,\n maxSize = 90,\n snapPoints,\n className,\n label = 'Resize panes',\n}: ResizableProps) {\n const [value, setValue] = useControllableState<number>({\n value: size,\n defaultValue: defaultSize,\n onChange: onSizeChange,\n })\n\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [dragging, setDragging] = useState(false)\n\n const clamp = useCallback(\n (next: number) => {\n let result = Math.min(Math.max(next, minSize), maxSize)\n if (snapPoints) {\n for (const point of snapPoints) {\n if (Math.abs(result - point) < 3) {\n result = point\n break\n }\n }\n }\n return result\n },\n [minSize, maxSize, snapPoints],\n )\n\n const onPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n const container = containerRef.current\n if (!container) return\n\n // Pointer capture keeps events coming to the handle even when the pointer outruns it, which\n // it will — a fast drag easily leaves the 8px handle behind and the drag would otherwise stop\n // dead mid-gesture.\n event.currentTarget.setPointerCapture(event.pointerId)\n setDragging(true)\n\n let latest = value\n\n const onMove = (moveEvent: PointerEvent) => {\n const rect = container.getBoundingClientRect()\n const fraction =\n direction === 'horizontal'\n ? (moveEvent.clientX - rect.left) / rect.width\n : (moveEvent.clientY - rect.top) / rect.height\n\n latest = clamp(fraction * 100)\n // Written straight to the DOM. React state is updated once, on release.\n container.style.setProperty('--ansh-split', `${latest}%`)\n }\n\n const onUp = () => {\n setDragging(false)\n setValue(latest)\n window.removeEventListener('pointermove', onMove)\n window.removeEventListener('pointerup', onUp)\n window.removeEventListener('pointercancel', onUp)\n }\n\n window.addEventListener('pointermove', onMove)\n window.addEventListener('pointerup', onUp)\n window.addEventListener('pointercancel', onUp)\n }\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n const step = event.shiftKey ? 10 : 2\n const forward = direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const backward = direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n\n let next: number | null = null\n if (event.key === forward) next = value + step\n else if (event.key === backward) next = value - step\n else if (event.key === 'Home') next = minSize\n else if (event.key === 'End') next = maxSize\n // Enter toggles between collapsed and the midpoint — the shortcut people expect from a\n // collapsible sidebar, and the only way to fully collapse without a mouse.\n else if (event.key === 'Enter') next = value <= minSize + 1 ? 50 : minSize\n\n if (next === null) return\n event.preventDefault()\n setValue(clamp(next))\n }\n\n // Keep the custom property in sync when the value changes from outside a drag (controlled\n // updates, keyboard steps). During a drag the pointer handler owns it.\n useEffect(() => {\n if (dragging) return\n containerRef.current?.style.setProperty('--ansh-split', `${value}%`)\n }, [value, dragging])\n\n return (\n <div\n ref={containerRef}\n className={cx(\n 'ansh-split',\n `ansh-split--${direction}`,\n dragging && 'ansh-split--dragging',\n className,\n )}\n style={{ ['--ansh-split' as string]: `${value}%` }}\n >\n <div className=\"ansh-split__pane\">{children[0]}</div>\n\n <div\n role=\"separator\"\n tabIndex={0}\n aria-label={label}\n aria-orientation={direction === 'horizontal' ? 'vertical' : 'horizontal'}\n aria-valuenow={Math.round(value)}\n aria-valuemin={minSize}\n aria-valuemax={maxSize}\n className=\"ansh-split__handle ansh-focusable\"\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n // Double-click resets to centre. Undocumented in the UI but universally expected, and\n // harmless to discover by accident.\n onDoubleClick={() => setValue(50)}\n >\n <span className=\"ansh-split__grip\" aria-hidden=\"true\" />\n </div>\n\n <div className=\"ansh-split__pane\">{children[1]}</div>\n </div>\n )\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/slot.tsx","../src/primitives/focus.ts","../src/primitives/presence.tsx"],"names":["Slot","useRef","useEffect"],"mappings":";;;;;AA+BO,IAAM,IAAA,GAAO,WAAmC,SAASA,KAAAA,CAC9D,EAAE,QAAA,EAAU,GAAG,SAAA,EAAU,EACzB,YAAA,EACA;AACA,EAAA,IAAI,CAAC,cAAA,CAAe,QAAQ,CAAA,EAAG;AAG7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,QAAA;AAId,EAAA,MAAM,QAAA,GAAY,KAAA,CAAM,KAAA,CAA2C,GAAA,IAAO,KAAA,CAAM,GAAA;AAEhF,EAAA,OAAO,aAAa,KAAA,EAAO;AAAA,IACzB,GAAG,UAAA,CAAW,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA;AAAA,IACpC,GAAA,EAAK,SAAA,CAAU,YAAA,EAAc,QAAQ;AAAA,GACX,CAAA;AAC9B,CAAC;AAQM,SAAS,OAAA,CACd,SACA,QAAA,EACmB;AACnB,EAAA,OAAO,UAAW,IAAA,GAAwC,QAAA;AAC5D;AAGO,SAAS,cAAc,QAAA,EAA6B;AACzD,EAAA,OAAO,SAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,cAAc,CAAA,CAAE,MAAA;AAC3D;ACtDA,IAAM,kBAAA,GAAqB;AAAA,EACzB,SAAA;AAAA,EACA,wBAAA;AAAA,EACA,4CAAA;AAAA,EACA,wBAAA;AAAA,EACA,0BAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kDAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAGV,SAAS,UAAU,OAAA,EAA+B;AAIhD,EAAA,IAAI,OAAA,CAAQ,YAAA,CAAa,OAAO,CAAA,EAAG,OAAO,KAAA;AAC1C,EAAA,IAAI,OAAA,CAAQ,YAAA,KAAiB,IAAA,EAAM,OAAO,IAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,QAAQ,qBAAA,EAAsB;AAC3C,EAAA,OAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA;AACzC;AAGO,SAAS,YAAY,SAAA,EAA8C;AACxE,EAAA,IAAI,CAAC,SAAA,EAAW,OAAO,EAAC;AACxB,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,gBAAA,CAA8B,kBAAkB,CAAC,CAAA;AACpF,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5B,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,KAAM,QAAQ,OAAO,KAAA;AACxD,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG,OAAO,KAAA;AACpC,IAAA,OAAO,UAAU,IAAI,CAAA;AAAA,EACvB,CAAC,CAAA;AACH;AASO,SAAS,YAAA,CAAa,KAAoC,MAAA,EAAuB;AACtF,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,YAAY,GAAA,CAAI,OAAA;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AAEzB,MAAA,MAAM,QAAA,GAAW,YAAY,SAAS,CAAA;AACtC,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAEzB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACzC,MAAA,MAAM,gBAAgB,QAAA,CAAS,aAAA;AAI/B,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,aAAA,KAAkB,KAAA,IAAS,kBAAkB,SAAA,CAAA,EAAY;AAC9E,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb,CAAA,MAAA,IAAW,CAAC,KAAA,CAAM,QAAA,IAAY,kBAAkB,IAAA,EAAM;AACpD,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd;AAAA,IACF,CAAA;AAEA,IAAA,SAAA,CAAU,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC/C,IAAA,OAAO,MAAM,SAAA,CAAU,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EACjE,CAAA,EAAG,CAAC,GAAA,EAAK,MAAM,CAAC,CAAA;AAClB;AAQO,SAAS,gBAAgB,MAAA,EAAuB;AACrD,EAAA,MAAM,WAAA,GAAc,OAA2B,IAAI,CAAA;AAEnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,WAAA,CAAY,UAAU,QAAA,CAAS,aAAA;AAE/B,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,WAAW,WAAA,CAAY,OAAA;AAG7B,MAAA,IAAI,QAAA,IAAY,SAAS,WAAA,EAAa,QAAA,CAAS,QAAQ,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IAChF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACb;AASO,SAAS,YAAA,CACd,GAAA,EACA,MAAA,EACA,YAAA,EACM;AACN,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,YAAY,GAAA,CAAI,OAAA;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AAIhB,IAAA,MAAM,KAAA,GAAQ,sBAAsB,MAAM;AACxC,MAAA,MAAM,WAAW,YAAA,EAAc,OAAA;AAC/B,MAAA,IAAI,UAAU,WAAA,EAAa;AACzB,QAAA,QAAA,CAAS,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AACtC,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,SAAS,CAAA,CAAE,CAAC,CAAA,IAAK,SAAA;AAC5C,MAAA,MAAA,CAAO,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,OAAO,MAAM,qBAAqB,KAAK,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,GAAA,EAAK,MAAA,EAAQ,YAAY,CAAC,CAAA;AAChC;AASO,SAAS,eAAe,OAAA,EAQU;AACvC,EAAA,MAAM,EAAE,UAAU,MAAA,EAAQ,cAAA,EAAgB,cAAc,YAAA,EAAc,IAAA,GAAO,MAAK,GAAI,OAAA;AAEtF,EAAA,OAAO,CAAC,KAAA,KAA+B;AACrC,IAAA,MAAM,KAAA,GAAA,CAAS,SAAS,OAAA,IAAW,IAAI,MAAA,CAAO,CAAC,IAAA,KAA8B,IAAA,KAAS,IAAI,CAAA;AAC1F,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,IAAA,MAAM,UAAA,GAAa,WAAA,KAAgB,YAAA,IAAgB,WAAA,KAAgB,MAAA;AACnE,IAAA,MAAM,QAAA,GAAW,WAAA,KAAgB,UAAA,IAAc,WAAA,KAAgB,MAAA;AAE/D,IAAA,IAAI,IAAA,GAAO,MAAA;AACX,IAAA,QAAQ,MAAM,GAAA;AAAK,MACjB,KAAK,YAAA;AACH,QAAA,IAAI,CAAC,UAAA,EAAY;AACjB,QAAA,IAAA,GAAO,MAAA,GAAS,CAAA;AAChB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAI,CAAC,UAAA,EAAY;AACjB,QAAA,IAAA,GAAO,MAAA,GAAS,CAAA;AAChB,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,IAAI,CAAC,QAAA,EAAU;AACf,QAAA,IAAA,GAAO,MAAA,GAAS,CAAA;AAChB,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,IAAI,CAAC,QAAA,EAAU;AACf,QAAA,IAAA,GAAO,MAAA,GAAS,CAAA;AAChB,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,CAAA;AACP,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA;AACtB,QAAA;AAAA,MACF;AACE,QAAA;AAAA;AAGJ,IAAA,KAAA,CAAM,cAAA,EAAe;AAErB,IAAA,IAAI,OAAO,CAAA,EAAG,IAAA,GAAO,IAAA,GAAO,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA;AAC/C,IAAA,IAAI,QAAQ,KAAA,CAAM,MAAA,SAAe,IAAA,GAAO,CAAA,GAAI,MAAM,MAAA,GAAS,CAAA;AAE3D,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,KAAA,CAAM,IAAI,GAAG,KAAA,EAAM;AAAA,EACrB,CAAA;AACF;AChMO,SAAS,WAAA,CACd,MACA,GAAA,EACgD;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,QAAA,CAA4B,IAAA,GAAO,SAAS,QAAQ,CAAA;AAE9E,EAAA,MAAM,UAAA,GAAaC,OAAkD,MAAS,CAAA;AAE9E,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,IAAI,CAAA;AAIf,MAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,MAAM,QAAA,CAAS,MAAM,CAAC,CAAA;AAC1D,MAAA,OAAO,MAAM,qBAAqB,KAAK,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,QAAA,CAAS,QAAQ,CAAA;AAEjB,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,IAAQ,oBAAA,EAAqB,EAAG;AACnC,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAA4C;AACzD,MAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AAC3B,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,gBAAgB,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,KAAK,CAAA;AAI5C,IAAA,UAAA,CAAW,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAK,GAAG,GAAG,CAAA;AAE5D,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,gBAAgB,KAAK,CAAA;AAC9C,MAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiB,KAAK,CAAA;AAC/C,MAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAA,EAAS,GAAG,CAAC,CAAA;AAEvB,EAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAC1B;AAgBO,SAAS,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAS,EAAkB;AAC1D,EAAA,MAAM,GAAA,GAAMD,OAA2B,IAAI,CAAA;AAC3C,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AAChD,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,uCAAU,QAAA,EAAA,QAAA,CAAS,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA,EAAE,CAAA;AACrC","file":"chunk-HO2YSF5O.js","sourcesContent":["import {\n Children,\n type ReactElement,\n type ReactNode,\n cloneElement,\n forwardRef,\n isValidElement,\n} from 'react'\nimport { mergeProps, mergeRefs } from './compose'\n\nexport interface SlotProps {\n children?: ReactNode\n [key: string]: unknown\n}\n\n/**\n * Render into the child element instead of rendering a wrapper.\n *\n * This is what powers `asChild`. Without it, a `<Tooltip.Trigger>` wrapping a `<Button>` emits a\n * `<span>` around the button — which breaks flex layouts, adds a node that inherits nothing, and\n * puts the trigger's ARIA attributes on the wrong element for assistive technology.\n *\n * ```tsx\n * <Tooltip.Trigger asChild>\n * <Button>Save</Button>\n * </Tooltip.Trigger>\n * ```\n *\n * The button *is* the trigger: it carries `aria-describedby` and the handlers, and no extra DOM\n * node exists.\n */\nexport const Slot = forwardRef<HTMLElement, SlotProps>(function Slot(\n { children, ...slotProps },\n forwardedRef,\n) {\n if (!isValidElement(children)) {\n // A `Slot` with no element child renders nothing rather than throwing. Throwing here would\n // turn a conditional child (`{loading ? null : <Button/>}`) into a crash.\n return null\n }\n\n const child = children as ReactElement<Record<string, unknown>> & { ref?: React.Ref<HTMLElement> }\n\n // React 19 exposes `ref` as a normal prop; React 18 keeps it on the element. Reading both keeps\n // this working across the supported peer range without a version check.\n const childRef = (child.props as { ref?: React.Ref<HTMLElement> }).ref ?? child.ref\n\n return cloneElement(child, {\n ...mergeProps(slotProps, child.props),\n ref: mergeRefs(forwardedRef, childRef),\n } as Record<string, unknown>)\n})\n\n/**\n * Pick between a host element and its child based on `asChild`.\n *\n * Every component in this library that accepts `asChild` uses this, so the behaviour is identical\n * across all of them rather than reimplemented with small differences.\n */\nexport function slotted(\n asChild: boolean | undefined,\n fallback: React.ElementType,\n): React.ElementType {\n return asChild ? (Slot as unknown as React.ElementType) : fallback\n}\n\n/** Count element children, ignoring `null`/`false` from conditional rendering. */\nexport function countElements(children: ReactNode): number {\n return Children.toArray(children).filter(isValidElement).length\n}\n","import { type RefObject, useEffect, useRef } from 'react'\n\n/**\n * Focus management for overlay surfaces.\n *\n * Three separate concerns that are usually conflated:\n *\n * 1. **Finding what can be focused.** Harder than it looks — `disabled`, `hidden`, `inert`,\n * zero-size elements and negative tabindex all disqualify a node, and CSS-hidden ancestors\n * disqualify their whole subtree.\n * 2. **Trapping.** Tab must cycle within the surface. Required by WCAG 2.4.3 for modals.\n * 3. **Restoring.** Focus must return to the trigger on close, or a keyboard user is dumped at the\n * top of the document and has to navigate all the way back.\n */\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\n/** Is this element rendered and interactive right now? */\nfunction isVisible(element: HTMLElement): boolean {\n // `offsetParent === null` catches `display: none` on the element or any ancestor, cheaply.\n // `position: fixed` elements legitimately have a null offsetParent, so they are checked against\n // their box instead.\n if (element.hasAttribute('inert')) return false\n if (element.offsetParent !== null) return true\n const rect = element.getBoundingClientRect()\n return rect.width > 0 || rect.height > 0\n}\n\n/** Every tabbable descendant, in tab order. */\nexport function getTabbable(container: HTMLElement | null): HTMLElement[] {\n if (!container) return []\n const nodes = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))\n return nodes.filter((node) => {\n if (node.getAttribute('aria-hidden') === 'true') return false\n if (node.closest('[inert]')) return false\n return isVisible(node)\n })\n}\n\n/**\n * Trap Tab within a container while `active`.\n *\n * Implemented on `keydown` at the container rather than with sentinel elements at either end. The\n * sentinel approach adds two focusable nodes to the accessibility tree that screen readers can\n * land on and announce as blank; intercepting the key does not.\n */\nexport function useFocusTrap(ref: RefObject<HTMLElement | null>, active: boolean): void {\n useEffect(() => {\n if (!active) return\n const container = ref.current\n if (!container) return\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return\n\n const tabbable = getTabbable(container)\n if (tabbable.length === 0) {\n // Nothing to move to — keep focus on the surface rather than letting it escape.\n event.preventDefault()\n return\n }\n\n const first = tabbable[0]!\n const last = tabbable[tabbable.length - 1]!\n const activeElement = document.activeElement as HTMLElement | null\n\n // Focus may sit on the container itself (given `tabIndex={-1}` for the initial focus), in\n // which case neither branch below matches and the default Tab lands on `first` naturally.\n if (event.shiftKey && (activeElement === first || activeElement === container)) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && activeElement === last) {\n event.preventDefault()\n first.focus()\n }\n }\n\n container.addEventListener('keydown', onKeyDown)\n return () => container.removeEventListener('keydown', onKeyDown)\n }, [ref, active])\n}\n\n/**\n * Restore focus to whatever was focused before `active` became true.\n *\n * The element is captured on activation, not on mount, because a component can be mounted long\n * before it opens.\n */\nexport function useFocusRestore(active: boolean): void {\n const previousRef = useRef<HTMLElement | null>(null)\n\n useEffect(() => {\n if (!active) return\n previousRef.current = document.activeElement as HTMLElement | null\n\n return () => {\n const previous = previousRef.current\n // Guard against restoring to a node that has since been removed from the document —\n // focusing a detached element silently moves focus to `<body>`, losing the user's place.\n if (previous && previous.isConnected) previous.focus?.({ preventScroll: true })\n }\n }, [active])\n}\n\n/**\n * Move focus into a surface when it opens.\n *\n * Prefers an explicitly marked element, then the first tabbable one, then the container itself.\n * The container fallback matters for a dialog whose only content is text: focus must land inside\n * it so a screen reader announces the dialog rather than continuing from the page behind.\n */\nexport function useAutoFocus(\n ref: RefObject<HTMLElement | null>,\n active: boolean,\n initialFocus?: RefObject<HTMLElement | null>,\n): void {\n useEffect(() => {\n if (!active) return\n const container = ref.current\n if (!container) return\n\n // After paint: the surface may still be animating in, and focusing a node with\n // `visibility: hidden` is a no-op that silently leaves focus on the body.\n const frame = requestAnimationFrame(() => {\n const explicit = initialFocus?.current\n if (explicit?.isConnected) {\n explicit.focus({ preventScroll: true })\n return\n }\n const target = getTabbable(container)[0] ?? container\n target.focus({ preventScroll: true })\n })\n\n return () => cancelAnimationFrame(frame)\n }, [ref, active, initialFocus])\n}\n\n/**\n * Roving tabindex for a composite widget (toolbar, tab list, menu).\n *\n * The ARIA authoring practice: a composite has exactly **one** tab stop, and arrow keys move\n * within it. Ten tabs that are each a tab stop means a keyboard user presses Tab ten times to get\n * past the tab bar — technically operable, practically hostile.\n */\nexport function useRovingFocus(options: {\n /** Items in DOM order. */\n itemsRef: RefObject<Array<HTMLElement | null>>\n /** Index that currently owns the tab stop. */\n active: number\n onActiveChange: (index: number) => void\n orientation?: 'horizontal' | 'vertical' | 'both'\n loop?: boolean\n}): (event: React.KeyboardEvent) => void {\n const { itemsRef, active, onActiveChange, orientation = 'horizontal', loop = true } = options\n\n return (event: React.KeyboardEvent) => {\n const items = (itemsRef.current ?? []).filter((item): item is HTMLElement => item !== null)\n if (items.length === 0) return\n\n const horizontal = orientation === 'horizontal' || orientation === 'both'\n const vertical = orientation === 'vertical' || orientation === 'both'\n\n let next = active\n switch (event.key) {\n case 'ArrowRight':\n if (!horizontal) return\n next = active + 1\n break\n case 'ArrowLeft':\n if (!horizontal) return\n next = active - 1\n break\n case 'ArrowDown':\n if (!vertical) return\n next = active + 1\n break\n case 'ArrowUp':\n if (!vertical) return\n next = active - 1\n break\n case 'Home':\n next = 0\n break\n case 'End':\n next = items.length - 1\n break\n default:\n return\n }\n\n event.preventDefault()\n\n if (next < 0) next = loop ? items.length - 1 : 0\n if (next >= items.length) next = loop ? 0 : items.length - 1\n\n onActiveChange(next)\n items[next]?.focus()\n }\n}\n","import { type ReactNode, type RefObject, useEffect, useRef, useState } from 'react'\nimport { prefersReducedMotion } from '@ansh-ui/core'\n\n/**\n * Keep an element mounted while it animates out.\n *\n * The problem: `{open && <Dialog />}` cannot animate on close, because React removes the node the\n * instant `open` flips. The fix is to keep rendering it and unmount when the exit animation\n * actually finishes.\n *\n * Finishing is detected from `animationend`/`transitionend` rather than a duration prop. A duration\n * prop has to be kept in sync with the CSS by hand, and it drifts the moment someone retimes the\n * animation in the stylesheet — leaving either a flash (unmount too early) or a surface that lingers\n * invisibly and swallows clicks (too late). The timeout below is only a safety net for the case\n * where no animation is declared at all and no event ever fires.\n */\nexport function usePresence(\n open: boolean,\n ref: RefObject<HTMLElement | null>,\n): { mounted: boolean; state: 'open' | 'closed' } {\n const [mounted, setMounted] = useState(open)\n const [state, setState] = useState<'open' | 'closed'>(open ? 'open' : 'closed')\n\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n\n useEffect(() => {\n if (open) {\n clearTimeout(timeoutRef.current)\n setMounted(true)\n // Next frame, so the element mounts in its closed state and *then* transitions. Setting\n // both in the same commit means the browser never sees the start state and no transition\n // runs — the classic \"enter animation doesn't play\" bug.\n const frame = requestAnimationFrame(() => setState('open'))\n return () => cancelAnimationFrame(frame)\n }\n\n if (!mounted) return\n\n setState('closed')\n\n const node = ref.current\n if (!node || prefersReducedMotion()) {\n setMounted(false)\n return\n }\n\n // Only the element's *own* animations count. A child's animation ending would unmount the\n // surface while it is still fading.\n const onEnd = (event: AnimationEvent | TransitionEvent) => {\n if (event.target !== node) return\n setMounted(false)\n }\n\n node.addEventListener('animationend', onEnd)\n node.addEventListener('transitionend', onEnd)\n\n // Safety net: if no animation is declared, neither event ever fires and the surface would\n // stay mounted forever, invisible and intercepting pointer events.\n timeoutRef.current = setTimeout(() => setMounted(false), 400)\n\n return () => {\n node.removeEventListener('animationend', onEnd)\n node.removeEventListener('transitionend', onEnd)\n clearTimeout(timeoutRef.current)\n }\n }, [open, mounted, ref])\n\n return { mounted, state }\n}\n\nexport interface PresenceProps {\n open: boolean\n children: (props: { ref: RefObject<HTMLElement | null>; state: 'open' | 'closed' }) => ReactNode\n}\n\n/**\n * Render-prop form of `usePresence`, for callers that would otherwise need to hoist a ref.\n *\n * ```tsx\n * <Presence open={open}>\n * {({ ref, state }) => <div ref={ref} data-state={state} className=\"fade\" />}\n * </Presence>\n * ```\n */\nexport function Presence({ open, children }: PresenceProps) {\n const ref = useRef<HTMLElement | null>(null)\n const { mounted, state } = usePresence(open, ref)\n if (!mounted) return null\n return <>{children({ ref, state })}</>\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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-observers.ts"],"names":[],"mappings":"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","file":"chunk-IBXLC5IE.js","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/** 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"]}
|