@ansh-ui/react 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/chunk-5CFQFMP5.js +178 -0
- package/dist/chunk-5CFQFMP5.js.map +1 -0
- package/dist/chunk-6VRF7X5C.cjs +164 -0
- package/dist/chunk-6VRF7X5C.cjs.map +1 -0
- package/dist/chunk-AVPEA5PB.cjs +718 -0
- package/dist/chunk-AVPEA5PB.cjs.map +1 -0
- package/dist/chunk-C32LKF23.cjs +198 -0
- package/dist/chunk-C32LKF23.cjs.map +1 -0
- package/dist/chunk-C5JG6TMM.cjs +1200 -0
- package/dist/chunk-C5JG6TMM.cjs.map +1 -0
- package/dist/chunk-DATBU46V.cjs +614 -0
- package/dist/chunk-DATBU46V.cjs.map +1 -0
- package/dist/chunk-EGG4CP7C.js +320 -0
- package/dist/chunk-EGG4CP7C.js.map +1 -0
- package/dist/chunk-H34OXXJU.js +55 -0
- package/dist/chunk-H34OXXJU.js.map +1 -0
- package/dist/chunk-HO2YSF5O.js +187 -0
- package/dist/chunk-HO2YSF5O.js.map +1 -0
- package/dist/chunk-HPGCILO4.js +760 -0
- package/dist/chunk-HPGCILO4.js.map +1 -0
- package/dist/chunk-IBXLC5IE.js +154 -0
- package/dist/chunk-IBXLC5IE.js.map +1 -0
- package/dist/chunk-LDCZQP3R.js +1185 -0
- package/dist/chunk-LDCZQP3R.js.map +1 -0
- package/dist/chunk-LXCIXR5T.js +27 -0
- package/dist/chunk-LXCIXR5T.js.map +1 -0
- package/dist/chunk-O2PX54KX.js +94 -0
- package/dist/chunk-O2PX54KX.js.map +1 -0
- package/dist/chunk-OHBWBXLO.cjs +101 -0
- package/dist/chunk-OHBWBXLO.cjs.map +1 -0
- package/dist/chunk-OJN5JBNP.cjs +776 -0
- package/dist/chunk-OJN5JBNP.cjs.map +1 -0
- package/dist/chunk-OLTS6G5M.js +606 -0
- package/dist/chunk-OLTS6G5M.js.map +1 -0
- package/dist/chunk-PO5DU3FU.cjs +29 -0
- package/dist/chunk-PO5DU3FU.cjs.map +1 -0
- package/dist/chunk-QO3E7TJS.js +2940 -0
- package/dist/chunk-QO3E7TJS.js.map +1 -0
- package/dist/chunk-RHTLNSVW.cjs +2976 -0
- package/dist/chunk-RHTLNSVW.cjs.map +1 -0
- package/dist/chunk-SFU5EPSN.cjs +61 -0
- package/dist/chunk-SFU5EPSN.cjs.map +1 -0
- package/dist/chunk-T4AK2KLM.js +699 -0
- package/dist/chunk-T4AK2KLM.js.map +1 -0
- package/dist/chunk-WGYNCSTP.cjs +333 -0
- package/dist/chunk-WGYNCSTP.cjs.map +1 -0
- package/dist/chunk-XEP6P7E6.js +279 -0
- package/dist/chunk-XEP6P7E6.js.map +1 -0
- package/dist/chunk-XMXECSQO.cjs +286 -0
- package/dist/chunk-XMXECSQO.cjs.map +1 -0
- package/dist/chunk-ZWAFLHC2.cjs +181 -0
- package/dist/chunk-ZWAFLHC2.cjs.map +1 -0
- package/dist/data.cjs +71 -0
- package/dist/data.cjs.map +1 -0
- package/dist/data.d.cts +316 -0
- package/dist/data.d.ts +316 -0
- package/dist/data.js +6 -0
- package/dist/data.js.map +1 -0
- package/dist/form.cjs +153 -0
- package/dist/form.cjs.map +1 -0
- package/dist/form.d.cts +660 -0
- package/dist/form.d.ts +660 -0
- package/dist/form.js +8 -0
- package/dist/form.js.map +1 -0
- package/dist/index.cjs +1641 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +552 -0
- package/dist/index.d.ts +552 -0
- package/dist/index.js +956 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.cjs +68 -0
- package/dist/layout.cjs.map +1 -0
- package/dist/layout.d.cts +169 -0
- package/dist/layout.d.ts +169 -0
- package/dist/layout.js +7 -0
- package/dist/layout.js.map +1 -0
- package/dist/motion-CQmCq6_k.d.ts +395 -0
- package/dist/motion-CSX4g2N8.d.cts +395 -0
- package/dist/motion.cjs +79 -0
- package/dist/motion.cjs.map +1 -0
- package/dist/motion.d.cts +4 -0
- package/dist/motion.d.ts +4 -0
- package/dist/motion.js +6 -0
- package/dist/motion.js.map +1 -0
- package/dist/navigation.cjs +48 -0
- package/dist/navigation.cjs.map +1 -0
- package/dist/navigation.d.cts +210 -0
- package/dist/navigation.d.ts +210 -0
- package/dist/navigation.js +7 -0
- package/dist/navigation.js.map +1 -0
- package/dist/overlay.cjs +69 -0
- package/dist/overlay.cjs.map +1 -0
- package/dist/overlay.d.cts +330 -0
- package/dist/overlay.d.ts +330 -0
- package/dist/overlay.js +8 -0
- package/dist/overlay.js.map +1 -0
- package/dist/position-DVScKcaa.d.cts +66 -0
- package/dist/position-DVScKcaa.d.ts +66 -0
- package/dist/primitives.cjs +162 -0
- package/dist/primitives.cjs.map +1 -0
- package/dist/primitives.d.cts +294 -0
- package/dist/primitives.d.ts +294 -0
- package/dist/primitives.js +9 -0
- package/dist/primitives.js.map +1 -0
- package/dist/sidebar-D-PafAXw.d.cts +71 -0
- package/dist/sidebar-D-PafAXw.d.ts +71 -0
- package/dist/styles.css +5575 -0
- package/dist/use-observers-B9qtimrk.d.cts +99 -0
- package/dist/use-observers-B9qtimrk.d.ts +99 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { useControllableState } from './chunk-LXCIXR5T.js';
|
|
2
|
+
import { cx } from './chunk-H34OXXJU.js';
|
|
3
|
+
import { forwardRef, useRef, useState, useCallback, useEffect } from 'react';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function space(value) {
|
|
7
|
+
if (value === void 0) return void 0;
|
|
8
|
+
if (typeof value === "string") return value;
|
|
9
|
+
return `var(--ansh-space-${value})`;
|
|
10
|
+
}
|
|
11
|
+
var Stack = forwardRef(function Stack2({
|
|
12
|
+
as: Component = "div",
|
|
13
|
+
direction = "vertical",
|
|
14
|
+
gap = 4,
|
|
15
|
+
align,
|
|
16
|
+
justify,
|
|
17
|
+
wrap = false,
|
|
18
|
+
stretch = false,
|
|
19
|
+
divide = false,
|
|
20
|
+
className,
|
|
21
|
+
style,
|
|
22
|
+
...rest
|
|
23
|
+
}, ref) {
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
Component,
|
|
26
|
+
{
|
|
27
|
+
ref,
|
|
28
|
+
className: cx("ansh-stack", divide && "ansh-stack--divide", className),
|
|
29
|
+
"data-direction": direction,
|
|
30
|
+
style: {
|
|
31
|
+
display: "flex",
|
|
32
|
+
flexDirection: direction === "horizontal" ? "row" : "column",
|
|
33
|
+
gap: space(gap),
|
|
34
|
+
alignItems: align ?? (stretch ? "stretch" : void 0),
|
|
35
|
+
justifyContent: justify,
|
|
36
|
+
flexWrap: wrap ? "wrap" : void 0,
|
|
37
|
+
...style
|
|
38
|
+
},
|
|
39
|
+
...rest
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
var HStack = forwardRef(function HStack2(props, ref) {
|
|
44
|
+
return /* @__PURE__ */ jsx(Stack, { ref, direction: "horizontal", ...props });
|
|
45
|
+
});
|
|
46
|
+
var VStack = forwardRef(function VStack2(props, ref) {
|
|
47
|
+
return /* @__PURE__ */ jsx(Stack, { ref, direction: "vertical", ...props });
|
|
48
|
+
});
|
|
49
|
+
var Grid = forwardRef(function Grid2({
|
|
50
|
+
as: Component = "div",
|
|
51
|
+
columns = "auto",
|
|
52
|
+
minColumnWidth = "16rem",
|
|
53
|
+
gap = 4,
|
|
54
|
+
rowGap,
|
|
55
|
+
align,
|
|
56
|
+
className,
|
|
57
|
+
style,
|
|
58
|
+
...rest
|
|
59
|
+
}, ref) {
|
|
60
|
+
return /* @__PURE__ */ jsx(
|
|
61
|
+
Component,
|
|
62
|
+
{
|
|
63
|
+
ref,
|
|
64
|
+
className: cx("ansh-grid", className),
|
|
65
|
+
style: {
|
|
66
|
+
display: "grid",
|
|
67
|
+
gridTemplateColumns: columns === "auto" ? `repeat(auto-fill, minmax(min(${minColumnWidth}, 100%), 1fr))` : `repeat(${columns}, minmax(0, 1fr))`,
|
|
68
|
+
gap: space(gap),
|
|
69
|
+
rowGap: space(rowGap),
|
|
70
|
+
alignItems: align,
|
|
71
|
+
...style
|
|
72
|
+
},
|
|
73
|
+
...rest
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
});
|
|
77
|
+
var GridItem = forwardRef(function GridItem2({ as: Component = "div", span, rowSpan, className, style, ...rest }, ref) {
|
|
78
|
+
return /* @__PURE__ */ jsx(
|
|
79
|
+
Component,
|
|
80
|
+
{
|
|
81
|
+
ref,
|
|
82
|
+
className,
|
|
83
|
+
style: {
|
|
84
|
+
gridColumn: span === "full" ? "1 / -1" : span ? `span ${span} / span ${span}` : void 0,
|
|
85
|
+
gridRow: rowSpan ? `span ${rowSpan} / span ${rowSpan}` : void 0,
|
|
86
|
+
// `minWidth: 0` on every grid child. Without it a child containing a long unbroken string
|
|
87
|
+
// or a table refuses to shrink below its content width and blows out the track.
|
|
88
|
+
minWidth: 0,
|
|
89
|
+
...style
|
|
90
|
+
},
|
|
91
|
+
...rest
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
var CONTAINER_WIDTH = {
|
|
96
|
+
sm: "40rem",
|
|
97
|
+
md: "56rem",
|
|
98
|
+
lg: "72rem",
|
|
99
|
+
xl: "90rem",
|
|
100
|
+
full: "100%"
|
|
101
|
+
};
|
|
102
|
+
var Container = forwardRef(function Container2({ as: Component = "div", size = "lg", padding = 6, className, style, ...rest }, ref) {
|
|
103
|
+
return /* @__PURE__ */ jsx(
|
|
104
|
+
Component,
|
|
105
|
+
{
|
|
106
|
+
ref,
|
|
107
|
+
className: cx("ansh-container", className),
|
|
108
|
+
style: {
|
|
109
|
+
width: "100%",
|
|
110
|
+
maxWidth: CONTAINER_WIDTH[size],
|
|
111
|
+
marginInline: "auto",
|
|
112
|
+
paddingInline: space(padding),
|
|
113
|
+
...style
|
|
114
|
+
},
|
|
115
|
+
...rest
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
});
|
|
119
|
+
var Divider = forwardRef(function Divider2({ orientation = "horizontal", label, className, ...rest }, ref) {
|
|
120
|
+
if (label) {
|
|
121
|
+
return /* @__PURE__ */ jsxs(
|
|
122
|
+
"div",
|
|
123
|
+
{
|
|
124
|
+
ref,
|
|
125
|
+
className: cx("ansh-divider", "ansh-divider--labelled", className),
|
|
126
|
+
...rest,
|
|
127
|
+
children: [
|
|
128
|
+
/* @__PURE__ */ jsx("span", { className: "ansh-divider__line" }),
|
|
129
|
+
/* @__PURE__ */ jsx("span", { className: "ansh-divider__label", children: label }),
|
|
130
|
+
/* @__PURE__ */ jsx("span", { className: "ansh-divider__line" })
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
return /* @__PURE__ */ jsx(
|
|
136
|
+
"div",
|
|
137
|
+
{
|
|
138
|
+
ref,
|
|
139
|
+
role: "separator",
|
|
140
|
+
"aria-orientation": orientation,
|
|
141
|
+
className: cx("ansh-divider", `ansh-divider--${orientation}`, className),
|
|
142
|
+
...rest
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
function Spacer({ size, grow = false }) {
|
|
147
|
+
return /* @__PURE__ */ jsx(
|
|
148
|
+
"span",
|
|
149
|
+
{
|
|
150
|
+
"aria-hidden": "true",
|
|
151
|
+
style: {
|
|
152
|
+
display: "block",
|
|
153
|
+
flexGrow: grow ? 1 : 0,
|
|
154
|
+
flexShrink: 0,
|
|
155
|
+
...size !== void 0 ? { width: space(size), height: space(size) } : null
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
var Center = forwardRef(function Center2({ as: Component = "div", className, style, ...rest }, ref) {
|
|
161
|
+
return /* @__PURE__ */ jsx(
|
|
162
|
+
Component,
|
|
163
|
+
{
|
|
164
|
+
ref,
|
|
165
|
+
className,
|
|
166
|
+
style: { display: "grid", placeItems: "center", ...style },
|
|
167
|
+
...rest
|
|
168
|
+
}
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
var AspectRatio = forwardRef(function AspectRatio2({ as: Component = "div", ratio = 16 / 9, className, style, ...rest }, ref) {
|
|
172
|
+
return /* @__PURE__ */ jsx(
|
|
173
|
+
Component,
|
|
174
|
+
{
|
|
175
|
+
ref,
|
|
176
|
+
className: cx("ansh-aspect", className),
|
|
177
|
+
style: { aspectRatio: String(ratio), ...style },
|
|
178
|
+
...rest
|
|
179
|
+
}
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
var ScrollArea = forwardRef(function ScrollArea2({
|
|
183
|
+
as: Component = "div",
|
|
184
|
+
maxHeight,
|
|
185
|
+
axis = "y",
|
|
186
|
+
fade = true,
|
|
187
|
+
className,
|
|
188
|
+
style,
|
|
189
|
+
...rest
|
|
190
|
+
}, ref) {
|
|
191
|
+
return /* @__PURE__ */ jsx(
|
|
192
|
+
Component,
|
|
193
|
+
{
|
|
194
|
+
ref,
|
|
195
|
+
className: cx("ansh-scroll", fade && "ansh-scroll--fade", className),
|
|
196
|
+
"data-axis": axis,
|
|
197
|
+
style: {
|
|
198
|
+
maxHeight,
|
|
199
|
+
overflowY: axis === "x" ? "hidden" : "auto",
|
|
200
|
+
overflowX: axis === "y" ? "hidden" : "auto",
|
|
201
|
+
...style
|
|
202
|
+
},
|
|
203
|
+
...rest
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
function Resizable({
|
|
208
|
+
children,
|
|
209
|
+
direction = "horizontal",
|
|
210
|
+
defaultSize = 50,
|
|
211
|
+
size,
|
|
212
|
+
onSizeChange,
|
|
213
|
+
minSize = 10,
|
|
214
|
+
maxSize = 90,
|
|
215
|
+
snapPoints,
|
|
216
|
+
className,
|
|
217
|
+
label = "Resize panes"
|
|
218
|
+
}) {
|
|
219
|
+
const [value, setValue] = useControllableState({
|
|
220
|
+
value: size,
|
|
221
|
+
defaultValue: defaultSize,
|
|
222
|
+
onChange: onSizeChange
|
|
223
|
+
});
|
|
224
|
+
const containerRef = useRef(null);
|
|
225
|
+
const [dragging, setDragging] = useState(false);
|
|
226
|
+
const clamp = useCallback(
|
|
227
|
+
(next) => {
|
|
228
|
+
let result = Math.min(Math.max(next, minSize), maxSize);
|
|
229
|
+
if (snapPoints) {
|
|
230
|
+
for (const point of snapPoints) {
|
|
231
|
+
if (Math.abs(result - point) < 3) {
|
|
232
|
+
result = point;
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return result;
|
|
238
|
+
},
|
|
239
|
+
[minSize, maxSize, snapPoints]
|
|
240
|
+
);
|
|
241
|
+
const onPointerDown = (event) => {
|
|
242
|
+
const container = containerRef.current;
|
|
243
|
+
if (!container) return;
|
|
244
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
245
|
+
setDragging(true);
|
|
246
|
+
let latest = value;
|
|
247
|
+
const onMove = (moveEvent) => {
|
|
248
|
+
const rect = container.getBoundingClientRect();
|
|
249
|
+
const fraction = direction === "horizontal" ? (moveEvent.clientX - rect.left) / rect.width : (moveEvent.clientY - rect.top) / rect.height;
|
|
250
|
+
latest = clamp(fraction * 100);
|
|
251
|
+
container.style.setProperty("--ansh-split", `${latest}%`);
|
|
252
|
+
};
|
|
253
|
+
const onUp = () => {
|
|
254
|
+
setDragging(false);
|
|
255
|
+
setValue(latest);
|
|
256
|
+
window.removeEventListener("pointermove", onMove);
|
|
257
|
+
window.removeEventListener("pointerup", onUp);
|
|
258
|
+
window.removeEventListener("pointercancel", onUp);
|
|
259
|
+
};
|
|
260
|
+
window.addEventListener("pointermove", onMove);
|
|
261
|
+
window.addEventListener("pointerup", onUp);
|
|
262
|
+
window.addEventListener("pointercancel", onUp);
|
|
263
|
+
};
|
|
264
|
+
const onKeyDown = (event) => {
|
|
265
|
+
const step = event.shiftKey ? 10 : 2;
|
|
266
|
+
const forward = direction === "horizontal" ? "ArrowRight" : "ArrowDown";
|
|
267
|
+
const backward = direction === "horizontal" ? "ArrowLeft" : "ArrowUp";
|
|
268
|
+
let next = null;
|
|
269
|
+
if (event.key === forward) next = value + step;
|
|
270
|
+
else if (event.key === backward) next = value - step;
|
|
271
|
+
else if (event.key === "Home") next = minSize;
|
|
272
|
+
else if (event.key === "End") next = maxSize;
|
|
273
|
+
else if (event.key === "Enter") next = value <= minSize + 1 ? 50 : minSize;
|
|
274
|
+
if (next === null) return;
|
|
275
|
+
event.preventDefault();
|
|
276
|
+
setValue(clamp(next));
|
|
277
|
+
};
|
|
278
|
+
useEffect(() => {
|
|
279
|
+
if (dragging) return;
|
|
280
|
+
containerRef.current?.style.setProperty("--ansh-split", `${value}%`);
|
|
281
|
+
}, [value, dragging]);
|
|
282
|
+
return /* @__PURE__ */ jsxs(
|
|
283
|
+
"div",
|
|
284
|
+
{
|
|
285
|
+
ref: containerRef,
|
|
286
|
+
className: cx(
|
|
287
|
+
"ansh-split",
|
|
288
|
+
`ansh-split--${direction}`,
|
|
289
|
+
dragging && "ansh-split--dragging",
|
|
290
|
+
className
|
|
291
|
+
),
|
|
292
|
+
style: { ["--ansh-split"]: `${value}%` },
|
|
293
|
+
children: [
|
|
294
|
+
/* @__PURE__ */ jsx("div", { className: "ansh-split__pane", children: children[0] }),
|
|
295
|
+
/* @__PURE__ */ jsx(
|
|
296
|
+
"div",
|
|
297
|
+
{
|
|
298
|
+
role: "separator",
|
|
299
|
+
tabIndex: 0,
|
|
300
|
+
"aria-label": label,
|
|
301
|
+
"aria-orientation": direction === "horizontal" ? "vertical" : "horizontal",
|
|
302
|
+
"aria-valuenow": Math.round(value),
|
|
303
|
+
"aria-valuemin": minSize,
|
|
304
|
+
"aria-valuemax": maxSize,
|
|
305
|
+
className: "ansh-split__handle ansh-focusable",
|
|
306
|
+
onPointerDown,
|
|
307
|
+
onKeyDown,
|
|
308
|
+
onDoubleClick: () => setValue(50),
|
|
309
|
+
children: /* @__PURE__ */ jsx("span", { className: "ansh-split__grip", "aria-hidden": "true" })
|
|
310
|
+
}
|
|
311
|
+
),
|
|
312
|
+
/* @__PURE__ */ jsx("div", { className: "ansh-split__pane", children: children[1] })
|
|
313
|
+
]
|
|
314
|
+
}
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export { AspectRatio, Center, Container, Divider, Grid, GridItem, HStack, Resizable, ScrollArea, Spacer, Stack, VStack };
|
|
319
|
+
//# sourceMappingURL=chunk-EGG4CP7C.js.map
|
|
320
|
+
//# sourceMappingURL=chunk-EGG4CP7C.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import 'react';
|
|
2
|
+
|
|
3
|
+
// src/primitives/compose.ts
|
|
4
|
+
function composeEventHandlers(theirs, ours, options = {}) {
|
|
5
|
+
const { checkForDefaultPrevented = true } = options;
|
|
6
|
+
return (event) => {
|
|
7
|
+
theirs?.(event);
|
|
8
|
+
if (checkForDefaultPrevented && event.defaultPrevented) return;
|
|
9
|
+
ours(event);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function assignRef(ref, node) {
|
|
13
|
+
if (!ref) return;
|
|
14
|
+
if (typeof ref === "function") ref(node);
|
|
15
|
+
else ref.current = node;
|
|
16
|
+
}
|
|
17
|
+
function mergeRefs(...refs) {
|
|
18
|
+
return (node) => {
|
|
19
|
+
for (const ref of refs) assignRef(ref, node);
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function mergeProps(slotProps, childProps) {
|
|
23
|
+
const merged = { ...slotProps, ...childProps };
|
|
24
|
+
for (const key of Object.keys(slotProps)) {
|
|
25
|
+
const slotValue = slotProps[key];
|
|
26
|
+
const childValue = childProps[key];
|
|
27
|
+
if (/^on[A-Z]/.test(key) && typeof slotValue === "function") {
|
|
28
|
+
if (typeof childValue === "function") {
|
|
29
|
+
merged[key] = (...args) => {
|
|
30
|
+
childValue(...args);
|
|
31
|
+
slotValue(...args);
|
|
32
|
+
};
|
|
33
|
+
} else {
|
|
34
|
+
merged[key] = slotValue;
|
|
35
|
+
}
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (key === "style") {
|
|
39
|
+
merged[key] = { ...slotValue, ...childValue };
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (key === "className") {
|
|
43
|
+
merged[key] = [slotValue, childValue].filter(Boolean).join(" ");
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return merged;
|
|
48
|
+
}
|
|
49
|
+
function cx(...parts) {
|
|
50
|
+
return parts.filter(Boolean).join(" ");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { assignRef, composeEventHandlers, cx, mergeProps, mergeRefs };
|
|
54
|
+
//# sourceMappingURL=chunk-H34OXXJU.js.map
|
|
55
|
+
//# sourceMappingURL=chunk-H34OXXJU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/compose.ts"],"names":[],"mappings":";;;AASO,SAAS,oBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,GAAkD,EAAC,EAC/B;AACpB,EAAA,MAAM,EAAE,wBAAA,GAA2B,IAAA,EAAK,GAAI,OAAA;AAC5C,EAAA,OAAO,CAAC,KAAA,KAAa;AACnB,IAAA,MAAA,GAAS,KAAK,CAAA;AACd,IAAA,IAAI,wBAAA,IAA4B,MAAM,gBAAA,EAAkB;AACxD,IAAA,IAAA,CAAK,KAAK,CAAA;AAAA,EACZ,CAAA;AACF;AAGO,SAAS,SAAA,CAAa,KAAgC,IAAA,EAAsB;AACjF,EAAA,IAAI,CAAC,GAAA,EAAK;AACV,EAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAY,GAAA,CAAI,IAAI,CAAA;AAAA,OACjC,IAAyC,OAAA,GAAU,IAAA;AAC3D;AAQO,SAAS,aAAgB,IAAA,EAAkE;AAChG,EAAA,OAAO,CAAC,IAAA,KAAmB;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,SAAA,CAAU,GAAA,EAAK,IAAI,CAAA;AAAA,EAC7C,CAAA;AACF;AAUO,SAAS,UAAA,CACd,WACA,UAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,SAAA,EAAW,GAAG,UAAA,EAAW;AAEtE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,SAAA,GAAY,UAAU,GAAG,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,WAAW,GAAG,CAAA;AAGjC,IAAA,IAAI,WAAW,IAAA,CAAK,GAAG,CAAA,IAAK,OAAO,cAAc,UAAA,EAAY;AAC3D,MAAA,IAAI,OAAO,eAAe,UAAA,EAAY;AACpC,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,GAAI,IAAA,KAAoB;AACnC,UAAC,UAAA,CAAyC,GAAG,IAAI,CAAA;AACjD,UAAC,SAAA,CAAwC,GAAG,IAAI,CAAA;AAAA,QACnD,CAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,MAChB;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAE,GAAI,SAAA,EAAsB,GAAI,UAAA,EAAsB;AACpE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,SAAA,EAAW,UAAU,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9D,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,MAAM,KAAA,EAAyD;AAC7E,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACvC","file":"chunk-H34OXXJU.js","sourcesContent":["import { type Ref, type SyntheticEvent } from 'react'\n\n/**\n * Run a component's own handler after the consumer's, unless the consumer prevented default.\n *\n * The order matters and so does the check. A consumer's `onClick` on a `<Dialog.Close>` should be\n * able to call `event.preventDefault()` to stop the dialog closing — that is the escape hatch that\n * keeps composed components usable. Calling the internal handler first would make it impossible.\n */\nexport function composeEventHandlers<E extends SyntheticEvent | Event>(\n theirs: ((event: E) => void) | undefined,\n ours: (event: E) => void,\n options: { checkForDefaultPrevented?: boolean } = {},\n): (event: E) => void {\n const { checkForDefaultPrevented = true } = options\n return (event: E) => {\n theirs?.(event)\n if (checkForDefaultPrevented && event.defaultPrevented) return\n ours(event)\n }\n}\n\n/** Assign a node to any ref shape — callback, object, or nothing. */\nexport function assignRef<T>(ref: Ref<T> | undefined | null, node: T | null): void {\n if (!ref) return\n if (typeof ref === 'function') ref(node)\n else (ref as React.MutableRefObject<T | null>).current = node\n}\n\n/**\n * Merge refs without a hook.\n *\n * `useMergedRef` is the hook form and should be preferred inside components. This exists for the\n * places a ref must be merged outside of a render — cloning an element in a `Slot`, for instance.\n */\nexport function mergeRefs<T>(...refs: Array<Ref<T> | undefined | null>): (node: T | null) => void {\n return (node: T | null) => {\n for (const ref of refs) assignRef(ref, node)\n }\n}\n\n/**\n * Merge two sets of props, with the child's winning for everything except handlers, `className`\n * and `style`, which compose.\n *\n * This is the merge strategy `asChild` needs. A naive spread would let a child's `onClick`\n * silently delete a `Popover.Trigger`'s open handler, producing a trigger that renders perfectly\n * and does nothing.\n */\nexport function mergeProps(\n slotProps: Record<string, unknown>,\n childProps: Record<string, unknown>,\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...slotProps, ...childProps }\n\n for (const key of Object.keys(slotProps)) {\n const slotValue = slotProps[key]\n const childValue = childProps[key]\n\n // `onClick`, `onKeyDown`, … — chain them, child first.\n if (/^on[A-Z]/.test(key) && typeof slotValue === 'function') {\n if (typeof childValue === 'function') {\n merged[key] = (...args: unknown[]) => {\n ;(childValue as (...a: unknown[]) => void)(...args)\n ;(slotValue as (...a: unknown[]) => void)(...args)\n }\n } else {\n merged[key] = slotValue\n }\n continue\n }\n\n if (key === 'style') {\n merged[key] = { ...(slotValue as object), ...(childValue as object) }\n continue\n }\n\n if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ')\n continue\n }\n }\n\n return merged\n}\n\n/** Join class names, dropping falsy entries. The whole of `clsx` that this library actually uses. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ')\n}\n"]}
|