@ansh-ui/vue 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.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-2VSROZ2N.js +1281 -0
  3. package/dist/chunk-2VSROZ2N.js.map +1 -0
  4. package/dist/chunk-5BQEZYG6.cjs +1294 -0
  5. package/dist/chunk-5BQEZYG6.cjs.map +1 -0
  6. package/dist/chunk-6732H4BQ.cjs +28 -0
  7. package/dist/chunk-6732H4BQ.cjs.map +1 -0
  8. package/dist/chunk-6ABPGOJP.js +722 -0
  9. package/dist/chunk-6ABPGOJP.js.map +1 -0
  10. package/dist/chunk-6XJOB6LE.js +62 -0
  11. package/dist/chunk-6XJOB6LE.js.map +1 -0
  12. package/dist/chunk-774WBLDR.cjs +24 -0
  13. package/dist/chunk-774WBLDR.cjs.map +1 -0
  14. package/dist/chunk-B6OXKW5Q.js +567 -0
  15. package/dist/chunk-B6OXKW5Q.js.map +1 -0
  16. package/dist/chunk-DMPNT3MY.cjs +64 -0
  17. package/dist/chunk-DMPNT3MY.cjs.map +1 -0
  18. package/dist/chunk-EISHOEB6.cjs +158 -0
  19. package/dist/chunk-EISHOEB6.cjs.map +1 -0
  20. package/dist/chunk-EVO23GUS.js +223 -0
  21. package/dist/chunk-EVO23GUS.js.map +1 -0
  22. package/dist/chunk-FVKLCGA4.js +1035 -0
  23. package/dist/chunk-FVKLCGA4.js.map +1 -0
  24. package/dist/chunk-IOXGBPOV.cjs +3681 -0
  25. package/dist/chunk-IOXGBPOV.cjs.map +1 -0
  26. package/dist/chunk-J2LA4GRP.cjs +1051 -0
  27. package/dist/chunk-J2LA4GRP.cjs.map +1 -0
  28. package/dist/chunk-JQ4YLXXM.cjs +580 -0
  29. package/dist/chunk-JQ4YLXXM.cjs.map +1 -0
  30. package/dist/chunk-KCA7RNJ4.cjs +781 -0
  31. package/dist/chunk-KCA7RNJ4.cjs.map +1 -0
  32. package/dist/chunk-NJDDNO4C.js +23 -0
  33. package/dist/chunk-NJDDNO4C.js.map +1 -0
  34. package/dist/chunk-OAQ7MDYX.js +22 -0
  35. package/dist/chunk-OAQ7MDYX.js.map +1 -0
  36. package/dist/chunk-PP6OYURM.cjs +238 -0
  37. package/dist/chunk-PP6OYURM.cjs.map +1 -0
  38. package/dist/chunk-SHX2JGID.cjs +269 -0
  39. package/dist/chunk-SHX2JGID.cjs.map +1 -0
  40. package/dist/chunk-SOYRICHU.js +3645 -0
  41. package/dist/chunk-SOYRICHU.js.map +1 -0
  42. package/dist/chunk-T425FIC7.js +773 -0
  43. package/dist/chunk-T425FIC7.js.map +1 -0
  44. package/dist/chunk-TMG3M6TK.js +152 -0
  45. package/dist/chunk-TMG3M6TK.js.map +1 -0
  46. package/dist/chunk-XLLSS464.cjs +286 -0
  47. package/dist/chunk-XLLSS464.cjs.map +1 -0
  48. package/dist/chunk-XZ5ZFLZM.js +280 -0
  49. package/dist/chunk-XZ5ZFLZM.js.map +1 -0
  50. package/dist/chunk-Z7XOFKM4.cjs +733 -0
  51. package/dist/chunk-Z7XOFKM4.cjs.map +1 -0
  52. package/dist/chunk-ZGMXOMCB.js +266 -0
  53. package/dist/chunk-ZGMXOMCB.js.map +1 -0
  54. package/dist/data.cjs +70 -0
  55. package/dist/data.cjs.map +1 -0
  56. package/dist/data.d.cts +963 -0
  57. package/dist/data.d.ts +963 -0
  58. package/dist/data.js +5 -0
  59. package/dist/data.js.map +1 -0
  60. package/dist/form.cjs +151 -0
  61. package/dist/form.cjs.map +1 -0
  62. package/dist/form.d.cts +2639 -0
  63. package/dist/form.d.ts +2639 -0
  64. package/dist/form.js +6 -0
  65. package/dist/form.js.map +1 -0
  66. package/dist/index.cjs +1158 -0
  67. package/dist/index.cjs.map +1 -0
  68. package/dist/index.d.cts +439 -0
  69. package/dist/index.d.ts +439 -0
  70. package/dist/index.js +547 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/layout.cjs +67 -0
  73. package/dist/layout.cjs.map +1 -0
  74. package/dist/layout.d.cts +729 -0
  75. package/dist/layout.d.ts +729 -0
  76. package/dist/layout.js +6 -0
  77. package/dist/layout.js.map +1 -0
  78. package/dist/motion.cjs +50 -0
  79. package/dist/motion.cjs.map +1 -0
  80. package/dist/motion.d.cts +681 -0
  81. package/dist/motion.d.ts +681 -0
  82. package/dist/motion.js +5 -0
  83. package/dist/motion.js.map +1 -0
  84. package/dist/navigation.cjs +48 -0
  85. package/dist/navigation.cjs.map +1 -0
  86. package/dist/navigation.d.cts +515 -0
  87. package/dist/navigation.d.ts +515 -0
  88. package/dist/navigation.js +7 -0
  89. package/dist/navigation.js.map +1 -0
  90. package/dist/overlay.cjs +61 -0
  91. package/dist/overlay.cjs.map +1 -0
  92. package/dist/overlay.d.cts +772 -0
  93. package/dist/overlay.d.ts +772 -0
  94. package/dist/overlay.js +8 -0
  95. package/dist/overlay.js.map +1 -0
  96. package/dist/position-Cn7qP1pn.d.cts +50 -0
  97. package/dist/position-Cn7qP1pn.d.ts +50 -0
  98. package/dist/primitives.cjs +129 -0
  99. package/dist/primitives.cjs.map +1 -0
  100. package/dist/primitives.d.cts +300 -0
  101. package/dist/primitives.d.ts +300 -0
  102. package/dist/primitives.js +8 -0
  103. package/dist/primitives.js.map +1 -0
  104. package/dist/sidebar-CQqEmpid.d.cts +124 -0
  105. package/dist/sidebar-CTZ-Ckko.d.ts +124 -0
  106. package/dist/styles.css +5593 -0
  107. package/dist/utils-IKPG3zcC.d.cts +46 -0
  108. package/dist/utils-IKPG3zcC.d.ts +46 -0
  109. package/package.json +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/navigation/tabs.ts","../src/components/navigation/breadcrumbs.ts","../src/components/navigation/nav-menu.ts","../src/components/disclosure.ts"],"names":["defineComponent","ref","h"],"mappings":"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","file":"chunk-T425FIC7.js","sourcesContent":["import { type PropType, computed, defineComponent, h, ref } from 'vue'\nimport { type SlotContent, cx, resolveSlotContent, useId } from '../../primitives/utils'\nimport { useControllableState } from '../../primitives/use-controllable-state'\nimport { useRovingFocus } from '../../primitives/focus'\n\nexport interface TabItem {\n id: string\n label: SlotContent\n icon?: SlotContent\n /** Count or status shown after the label. */\n badge?: SlotContent\n disabled?: boolean\n content?: SlotContent\n}\n\nexport type TabsVariant = 'underline' | 'pill' | 'enclosed'\nexport type TabsOrientation = 'horizontal' | 'vertical'\nexport type TabsSize = 'sm' | 'md'\n\n/**\n * Tabs — the Vue counterpart of `@ansh-ui/react`'s `Tabs`.\n *\n * The full WAI-ARIA tab pattern: a single tab stop for the whole list (roving tabindex, via\n * `useRovingFocus`), arrow keys to move between tabs, Home/End to jump to the ends, and\n * `aria-controls`/`aria-labelledby` linking each tab to its panel in both directions.\n *\n * `useRovingFocus`'s `items` ref only receives an element for *enabled* tabs — a disabled tab's slot\n * is left `null`, which is exactly what the hook filters out, so disabled tabs are skipped during\n * arrow-key and Home/End navigation without any extra bookkeeping here.\n *\n * Panels are unmounted when inactive rather than hidden (the render function simply never creates\n * the `v-if`-equivalent branch), matching the React version's reasoning: hiding keeps the whole tree\n * mounted, so timers keep running, media keeps buffering and forms keep their state — the last of\n * which sounds desirable until a hidden required field blocks submission with no visible error.\n *\n * `v-model` selects the active tab id. Leave it unbound with `default-value` for an uncontrolled\n * tab bar.\n */\nexport const Tabs = defineComponent({\n name: 'AnshTabs',\n inheritAttrs: false,\n props: {\n items: { type: Array as PropType<readonly TabItem[]>, required: true },\n modelValue: { type: String, default: undefined },\n defaultValue: { type: String, default: undefined },\n variant: { type: String as PropType<TabsVariant>, default: 'underline' },\n orientation: { type: String as PropType<TabsOrientation>, default: 'horizontal' },\n size: { type: String as PropType<TabsSize>, default: 'md' },\n /** Stretch tabs to fill the available width. */\n fitted: { type: Boolean, default: false },\n /**\n * Activate on arrow-key focus, rather than requiring Enter/Space.\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: { type: Boolean, default: true },\n /** Accessible name for the tab list. */\n label: { type: String, required: true },\n },\n emits: ['update:modelValue'],\n setup(props, { attrs, emit, slots }) {\n const initialActive = props.defaultValue ?? props.items.find((item) => !item.disabled)?.id ?? ''\n\n const [active, setActive] = useControllableState(\n () => props.modelValue,\n initialActive,\n (next) => emit('update:modelValue', next),\n )\n\n const baseId = useId()\n const tabRefs = ref<Array<HTMLElement | null>>([])\n\n const activeItem = computed(() => props.items.find((item) => item.id === active.value))\n const enabledIds = computed(() =>\n props.items.filter((item) => !item.disabled).map((item) => item.id),\n )\n\n const onRovingActiveChange = (position: number): void => {\n const id = enabledIds.value[position]\n if (id !== undefined && props.activateOnFocus) setActive(id)\n }\n\n const onKeydown = useRovingFocus({\n items: tabRefs,\n active: () => enabledIds.value.indexOf(active.value),\n onActiveChange: onRovingActiveChange,\n orientation: props.orientation,\n loop: true,\n })\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n const currentActive = active.value\n const currentActiveItem = activeItem.value\n const hasPanel = currentActiveItem?.content !== undefined || Boolean(slots.default)\n\n return h(\n 'div',\n {\n class: cx(\n 'ansh-tabs',\n `ansh-tabs--${props.variant}`,\n `ansh-tabs--${props.orientation}`,\n `ansh-tabs--${props.size}`,\n attrClass as string,\n ),\n ...restAttrs,\n },\n [\n h(\n 'div',\n {\n role: 'tablist',\n 'aria-label': props.label,\n 'aria-orientation': props.orientation,\n class: cx('ansh-tabs__list', props.fitted && 'ansh-tabs__list--fitted'),\n onKeydown,\n },\n props.items.map((item, index) => {\n const selected = item.id === currentActive\n return h(\n 'button',\n {\n key: item.id,\n ref: (node) => {\n tabRefs.value[index] = item.disabled ? null : (node as HTMLElement | null)\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 class: cx(\n 'ansh-tabs__tab',\n selected && 'ansh-tabs__tab--active',\n 'ansh-focusable',\n ),\n onClick: () => setActive(item.id),\n },\n [\n item.icon !== undefined\n ? h('span', { class: 'ansh-tabs__icon' }, [resolveSlotContent(item.icon)])\n : null,\n h('span', {}, [resolveSlotContent(item.label)]),\n item.badge !== undefined\n ? h('span', { class: 'ansh-tabs__badge' }, [resolveSlotContent(item.badge)])\n : null,\n ],\n )\n }),\n ),\n\n hasPanel\n ? h(\n 'div',\n {\n role: 'tabpanel',\n id: `${baseId}-panel-${currentActive}`,\n 'aria-labelledby': `${baseId}-tab-${currentActive}`,\n // Focusable so a keyboard user can Tab from the tab into its panel and scroll it,\n // which is required when the panel has no focusable content of its own.\n tabindex: '0',\n class: 'ansh-tabs__panel ansh-focusable',\n },\n [\n currentActiveItem?.content !== undefined\n ? resolveSlotContent(currentActiveItem.content)\n : slots.default?.(),\n ],\n )\n : null,\n ],\n )\n }\n },\n})\n","import { type PropType, defineComponent, h, ref } from 'vue'\nimport { type SlotContent, cx, resolveSlotContent } from '../../primitives/utils'\n\nexport interface Crumb {\n label: SlotContent\n href?: string\n icon?: SlotContent\n onClick?: () => void\n}\n\n/**\n * A breadcrumb trail — the Vue counterpart of `@ansh-ui/react`'s `Breadcrumbs`.\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 const Breadcrumbs = defineComponent({\n name: 'AnshBreadcrumbs',\n inheritAttrs: false,\n props: {\n items: { type: Array as PropType<readonly Crumb[]>, required: true },\n /** Collapse the middle when there are more than this many. Default `Infinity`. */\n maxItems: { type: Number, default: Number.POSITIVE_INFINITY },\n separator: { type: [String, Object, Function] as PropType<SlotContent>, default: undefined },\n },\n setup(props, { attrs }) {\n const expanded = ref(false)\n\n const defaultChevron = () =>\n h('svg', { viewBox: '0 0 12 12', width: '12', height: '12', 'aria-hidden': 'true' }, [\n h('path', {\n d: 'M4.5 2.5L8 6l-3.5 3.5',\n stroke: 'currentColor',\n 'stroke-width': '1.5',\n fill: 'none',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ])\n\n const renderChevron = () =>\n props.separator !== undefined ? resolveSlotContent(props.separator) : defaultChevron()\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n const items = props.items\n const collapsed = !expanded.value && items.length > props.maxItems && props.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 return h(\n 'nav',\n {\n 'aria-label': 'Breadcrumb',\n class: cx('ansh-breadcrumbs', attrClass as string),\n ...restAttrs,\n },\n [\n h(\n 'ol',\n { class: 'ansh-breadcrumbs__list' },\n shown.map((crumb, index) => {\n const isLast = index === shown.length - 1\n\n return h('li', { key: index, class: 'ansh-breadcrumbs__item' }, [\n index > 0\n ? h('span', { class: 'ansh-breadcrumbs__separator', 'aria-hidden': 'true' }, [\n renderChevron(),\n ])\n : null,\n\n isLast\n ? h('span', { class: 'ansh-breadcrumbs__current', 'aria-current': 'page' }, [\n crumb.icon !== undefined ? resolveSlotContent(crumb.icon) : null,\n resolveSlotContent(crumb.label),\n ])\n : h(\n 'a',\n {\n href: crumb.href ?? '#',\n class: 'ansh-breadcrumbs__link ansh-focusable',\n onClick: crumb.onClick\n ? (event: MouseEvent) => {\n event.preventDefault()\n crumb.onClick!()\n }\n : undefined,\n },\n [\n crumb.icon !== undefined ? resolveSlotContent(crumb.icon) : null,\n resolveSlotContent(crumb.label),\n ],\n ),\n\n index === gapAfter\n ? [\n h('span', { class: 'ansh-breadcrumbs__separator', 'aria-hidden': 'true' }, [\n renderChevron(),\n ]),\n h(\n 'button',\n {\n type: 'button',\n class: 'ansh-breadcrumbs__more ansh-focusable',\n 'aria-label': `Show ${items.length - 3} hidden breadcrumbs`,\n 'aria-expanded': false,\n onClick: () => {\n expanded.value = true\n },\n },\n '…',\n ),\n ]\n : null,\n ])\n }),\n ),\n ],\n )\n }\n },\n})\n\nexport interface Step {\n id: string\n label: SlotContent\n description?: SlotContent\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 type StepperOrientation = 'horizontal' | 'vertical'\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 *\n * `current` is always controlled by the caller — there is no uncontrolled mode, matching the React\n * version. `update:current` fires (in addition to plain click handling) so `v-model:current` works\n * for callers that want it.\n */\nexport const Stepper = defineComponent({\n name: 'AnshStepper',\n inheritAttrs: false,\n props: {\n steps: { type: Array as PropType<readonly Step[]>, required: true },\n /** Index of the current step. Steps before it are complete. */\n current: { type: Number, required: true },\n orientation: { type: String as PropType<StepperOrientation>, default: 'horizontal' },\n },\n emits: ['update:current'],\n setup(props, { attrs, emit }) {\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n\n return h(\n 'nav',\n {\n class: cx('ansh-stepper', `ansh-stepper--${props.orientation}`, attrClass as string),\n 'aria-label': 'Progress',\n ...restAttrs,\n },\n [\n h(\n 'ol',\n { class: 'ansh-stepper__list' },\n props.steps.map((step, index) => {\n const complete = index < props.current\n const active = index === props.current\n const state = step.error\n ? 'error'\n : complete\n ? 'complete'\n : active\n ? 'current'\n : 'upcoming'\n const interactive = step.clickable && index !== props.current\n\n const inner = [\n h(\n 'span',\n {\n class: cx('ansh-stepper__marker', `ansh-stepper__marker--${state}`),\n 'aria-hidden': 'true',\n },\n [\n step.error\n ? '!'\n : complete\n ? h('svg', { viewBox: '0 0 14 14', width: '12', height: '12' }, [\n h('path', {\n d: 'M2.5 7.5l3 3 6-6.5',\n stroke: 'currentColor',\n 'stroke-width': '2',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n fill: 'none',\n }),\n ])\n : String(index + 1),\n ],\n ),\n h('span', { class: 'ansh-stepper__text' }, [\n h('span', { class: 'ansh-stepper__label' }, [resolveSlotContent(step.label)]),\n step.description\n ? h('span', { class: 'ansh-stepper__description' }, [\n resolveSlotContent(step.description),\n ])\n : null,\n h('span', { class: 'ansh-visually-hidden' }, [\n step.error\n ? ' — has errors'\n : complete\n ? ' — completed'\n : active\n ? ' — current step'\n : ' — not started',\n ]),\n ]),\n ]\n\n return h(\n 'li',\n {\n key: step.id,\n class: cx('ansh-stepper__item', `ansh-stepper__item--${state}`),\n 'aria-current': active ? 'step' : undefined,\n },\n [\n interactive\n ? h(\n 'button',\n {\n type: 'button',\n class: 'ansh-stepper__button ansh-focusable',\n onClick: () => emit('update:current', index),\n },\n inner,\n )\n : h('span', { class: 'ansh-stepper__button' }, inner),\n ],\n )\n }),\n ),\n ],\n )\n }\n },\n})\n","import { type PropType, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { type SlotContent, cx, resolveSlotContent, useId } from '../../primitives/utils'\n\nexport interface MegaMenuLink {\n id: string\n label: string\n description?: string\n href?: string\n icon?: SlotContent\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?: SlotContent\n}\n\n/**\n * A site navigation bar with mega-menu dropdowns — the Vue counterpart of `@ansh-ui/react`'s\n * `NavigationMenu` (exported under that name even though the file is `nav-menu.ts`, matching the\n * React source).\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 `Teleport`. A mega menu is\n * full-width and anchored to the bar, not to a point, so a portal's viewport-relative positioning\n * would fight the layout rather than help it — the same reasoning the React version documents.\n */\nexport const NavigationMenu = defineComponent({\n name: 'AnshNavigationMenu',\n inheritAttrs: false,\n props: {\n items: { type: Array as PropType<readonly NavMenuItem[]>, required: true },\n label: { type: String, default: 'Main navigation' },\n },\n setup(props, { attrs }) {\n const openId = ref<string | null>(null)\n const rootRef = ref<HTMLElement | null>(null)\n const baseId = useId()\n let timer: ReturnType<typeof setTimeout> | undefined\n\n const schedule = (next: string | null, delay: number): void => {\n clearTimeout(timer)\n timer = setTimeout(() => {\n openId.value = next\n }, delay)\n }\n\n onBeforeUnmount(() => clearTimeout(timer))\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 watch(openId, (id, _previous, onCleanup) => {\n if (!id) return\n const root = rootRef.value\n if (!root) return\n\n const onFocusOut = (event: FocusEvent): void => {\n const next = event.relatedTarget as Node | null\n if (next && root.contains(next)) return\n openId.value = null\n }\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') return\n openId.value = null\n root.querySelector<HTMLElement>('[aria-expanded=\"true\"]')?.focus()\n }\n\n root.addEventListener('focusout', onFocusOut)\n document.addEventListener('keydown', onKeyDown)\n onCleanup(() => {\n root.removeEventListener('focusout', onFocusOut)\n document.removeEventListener('keydown', onKeyDown)\n })\n })\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n\n return h(\n 'nav',\n {\n ref: rootRef,\n class: cx('ansh-navmenu', attrClass as string),\n 'aria-label': props.label,\n onMouseleave: () => schedule(null, 200),\n ...restAttrs,\n },\n [\n h(\n 'ul',\n { class: 'ansh-navmenu__list' },\n props.items.map((item) => {\n const hasPanel = Boolean(item.columns?.length)\n const open = openId.value === item.id\n const panelId = `${baseId}-${item.id}`\n\n if (!hasPanel) {\n return h('li', { key: item.id, class: 'ansh-navmenu__item' }, [\n h(\n 'a',\n { href: item.href ?? '#', class: 'ansh-navmenu__link ansh-focusable' },\n item.label,\n ),\n ])\n }\n\n return h(\n 'li',\n {\n key: item.id,\n class: cx('ansh-navmenu__item', open && 'ansh-navmenu__item--open'),\n onMouseenter: () => schedule(item.id, 80),\n },\n [\n h(\n 'button',\n {\n type: 'button',\n class: 'ansh-navmenu__link ansh-navmenu__link--trigger ansh-focusable',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n onClick: () => {\n openId.value = open ? null : item.id\n },\n onKeydown: (event: KeyboardEvent) => {\n if (event.key !== 'ArrowDown') return\n event.preventDefault()\n openId.value = 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 h(\n 'span',\n {\n class: cx('ansh-navmenu__chevron', open && 'ansh-navmenu__chevron--open'),\n 'aria-hidden': 'true',\n },\n [\n h('svg', { viewBox: '0 0 12 12', width: '10', height: '10' }, [\n h('path', {\n d: 'M3 4.5L6 7.5l3-3',\n stroke: 'currentColor',\n 'stroke-width': '1.5',\n fill: 'none',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ]),\n ],\n ),\n ],\n ),\n\n h(\n 'div',\n {\n id: panelId,\n class: 'ansh-navmenu__panel',\n hidden: !open,\n onMouseenter: () => clearTimeout(timer),\n },\n [\n h('div', { class: 'ansh-navmenu__grid' }, [\n ...item.columns!.map((column) =>\n h('div', { class: 'ansh-navmenu__column', key: column.id }, [\n column.heading\n ? h('p', { class: 'ansh-navmenu__heading' }, column.heading)\n : null,\n h(\n 'ul',\n { class: 'ansh-navmenu__links' },\n column.links.map((link) =>\n h('li', { key: link.id }, [\n h(\n 'a',\n {\n href: link.href ?? '#',\n class: 'ansh-navmenu__entry ansh-focusable',\n onClick: link.onClick\n ? (event: MouseEvent) => {\n event.preventDefault()\n link.onClick!()\n openId.value = null\n }\n : () => {\n openId.value = null\n },\n },\n [\n link.icon !== undefined\n ? h(\n 'span',\n { class: 'ansh-navmenu__icon', 'aria-hidden': 'true' },\n [resolveSlotContent(link.icon)],\n )\n : null,\n h('span', { class: 'ansh-navmenu__entry-text' }, [\n h(\n 'span',\n { class: 'ansh-navmenu__entry-label' },\n link.label,\n ),\n link.description\n ? h(\n 'span',\n { class: 'ansh-navmenu__entry-description' },\n link.description,\n )\n : null,\n ]),\n ],\n ),\n ]),\n ),\n ),\n ]),\n ),\n\n item.feature !== undefined\n ? h('div', { class: 'ansh-navmenu__feature' }, [\n resolveSlotContent(item.feature),\n ])\n : null,\n ]),\n ],\n ),\n ],\n )\n }),\n ),\n ],\n )\n }\n },\n})\n","import { type PropType, defineComponent, h, ref } from 'vue'\nimport { type SlotContent, cx, resolveSlotContent, useId } from '../primitives/utils'\nimport { useControllableState } from '../primitives/use-controllable-state'\nimport { useRovingFocus } from '../primitives/focus'\n\n/**\n * Disclosure widgets — the Vue counterpart of `@ansh-ui/react`'s `disclosure.tsx`.\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 — pure CSS keyed off the `data-state` attribute these components set. It\n * needs the extra wrapper with `min-height: 0` — without that the grid child refuses to shrink below\n * its content size and nothing animates. See `packages/react/src/styles/navigation.css`'s\n * `.ansh-collapsible__region` / `.ansh-accordion__region` rules for the mechanism itself; nothing on the\n * Vue side has to know about it beyond setting the same attribute.\n */\n\nexport interface CollapsibleProps {\n open?: boolean\n defaultOpen?: boolean\n trigger: SlotContent\n /** Render the trigger as-is rather than wrapping it in the styled button row. */\n bare?: boolean\n}\n\n/**\n * A single show/hide region.\n *\n * `v-model:open` (or `default-open` for an uncontrolled one) drives the disclosed state, routed\n * through `useControllableState` exactly like `Accordion`'s open-item set below.\n */\nexport const Collapsible = defineComponent({\n name: 'AnshCollapsible',\n inheritAttrs: false,\n props: {\n open: { type: Boolean, default: undefined },\n defaultOpen: { type: Boolean, default: false },\n trigger: { type: [String, Object, Function] as PropType<SlotContent>, required: true },\n bare: { type: Boolean, default: false },\n },\n emits: ['update:open'],\n setup(props, { attrs, emit, slots }) {\n const [isOpen, setOpen] = useControllableState(\n () => props.open,\n props.defaultOpen,\n (next) => emit('update:open', next),\n )\n const id = useId()\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n\n return h(\n 'div',\n {\n class: cx('ansh-collapsible', attrClass as string),\n 'data-state': isOpen.value ? 'open' : 'closed',\n ...restAttrs,\n },\n [\n h(\n 'button',\n {\n type: 'button',\n class: cx(\n props.bare ? 'ansh-collapsible__bare' : 'ansh-collapsible__trigger',\n 'ansh-focusable',\n ),\n 'aria-expanded': isOpen.value,\n 'aria-controls': id,\n onClick: () => setOpen(!isOpen.value),\n },\n [\n resolveSlotContent(props.trigger),\n h(\n 'span',\n {\n class: cx(\n 'ansh-collapsible__chevron',\n isOpen.value && 'ansh-collapsible__chevron--open',\n ),\n 'aria-hidden': 'true',\n },\n [\n h('svg', { viewBox: '0 0 12 12', width: '12', height: '12' }, [\n h('path', {\n d: 'M3 4.5L6 7.5l3-3',\n stroke: 'currentColor',\n 'stroke-width': '1.5',\n fill: 'none',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ]),\n ],\n ),\n ],\n ),\n\n h(\n 'div',\n {\n class: 'ansh-collapsible__region',\n id,\n role: 'region',\n 'data-state': isOpen.value ? 'open' : 'closed',\n },\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\n // that is visually closed — invisible focus, and no way to tell where they are.\n h(\n 'div',\n { class: 'ansh-collapsible__inner', ...(isOpen.value ? null : { inert: true }) },\n slots.default?.(),\n ),\n ],\n ),\n ],\n )\n }\n },\n})\n\nexport interface AccordionItem {\n id: string\n title: SlotContent\n /** Secondary line under the title. */\n subtitle?: SlotContent\n icon?: SlotContent\n disabled?: boolean\n content: SlotContent\n}\n\nexport type AccordionVariant = 'bordered' | 'separated' | 'plain'\n\n/**\n * A stack of collapsible sections — the Vue counterpart of `@ansh-ui/react`'s `Accordion`.\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, via `useRovingFocus` bound to the\n * accordion root. Unlike `Tabs`, this is *not* a single-tab-stop composite — every header stays in\n * the normal Tab order (no `tabindex` is set on them at all), matching the ARIA APG accordion\n * pattern, where arrow keys are an addition to Tab rather than a replacement for it.\n * `useRovingFocus`'s `active()` getter is derived from `document.activeElement` rather than a stored\n * index for exactly that reason — there is no single \"selected\" header the way `Tabs` has a selected\n * tab, only whichever header currently has focus.\n *\n * `v-model` (or `default-value` for an uncontrolled accordion) is the array of open item ids, exactly\n * like the React version's `value`/`defaultValue`.\n */\nexport const Accordion = defineComponent({\n name: 'AnshAccordion',\n inheritAttrs: false,\n props: {\n items: { type: Array as PropType<readonly AccordionItem[]>, required: true },\n /** Allow several panels open at once. Default `false`. */\n multiple: { type: Boolean, default: false },\n modelValue: { type: Array as PropType<readonly string[]>, default: undefined },\n defaultValue: { type: Array as PropType<readonly string[]>, default: () => [] },\n variant: { type: String as PropType<AccordionVariant>, default: 'bordered' },\n },\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const [openIds, setOpenIds] = useControllableState<readonly string[]>(\n () => props.modelValue,\n props.defaultValue,\n (next) => emit('update:modelValue', next),\n )\n const baseId = useId()\n const headerRefs = ref<Array<HTMLElement | null>>([])\n\n const toggle = (id: string): void => {\n if (openIds.value.includes(id)) {\n setOpenIds(openIds.value.filter((entry) => entry !== id))\n } else {\n setOpenIds(props.multiple ? [...openIds.value, id] : [id])\n }\n }\n\n const onKeydown = useRovingFocus({\n items: headerRefs,\n // There is no single \"active\" header the way `Tabs` has a selected tab — arrow keys move\n // relative to whichever header currently owns focus.\n active: () => {\n const enabled = headerRefs.value.filter((node): node is HTMLElement => node !== null)\n return enabled.indexOf(document.activeElement as HTMLElement)\n },\n // The hook already moves focus to the target header; there is no selection model to sync.\n onActiveChange: () => {},\n orientation: 'vertical',\n loop: true,\n })\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n\n return h(\n 'div',\n {\n class: cx('ansh-accordion', `ansh-accordion--${props.variant}`, attrClass as string),\n onKeydown,\n ...restAttrs,\n },\n props.items.map((item, index) => {\n const open = openIds.value.includes(item.id)\n const panelId = `${baseId}-panel-${item.id}`\n const headerId = `${baseId}-header-${item.id}`\n\n return h(\n 'div',\n {\n key: item.id,\n class: cx('ansh-accordion__item', open && 'ansh-accordion__item--open'),\n 'data-state': open ? 'open' : 'closed',\n },\n [\n h('h3', { class: 'ansh-accordion__heading' }, [\n h(\n 'button',\n {\n ref: (node) => {\n headerRefs.value[index] = item.disabled ? null : (node as HTMLElement | null)\n },\n type: 'button',\n id: headerId,\n class: 'ansh-accordion__trigger ansh-focusable',\n 'aria-expanded': open,\n 'aria-controls': panelId,\n disabled: item.disabled,\n onClick: () => toggle(item.id),\n },\n [\n item.icon !== undefined\n ? h('span', { class: 'ansh-accordion__icon' }, [\n resolveSlotContent(item.icon),\n ])\n : null,\n h('span', { class: 'ansh-accordion__text' }, [\n h('span', { class: 'ansh-accordion__title' }, [\n resolveSlotContent(item.title),\n ]),\n item.subtitle\n ? h('span', { class: 'ansh-accordion__subtitle' }, [\n resolveSlotContent(item.subtitle),\n ])\n : null,\n ]),\n h(\n 'span',\n {\n class: cx(\n 'ansh-accordion__chevron',\n open && 'ansh-accordion__chevron--open',\n ),\n 'aria-hidden': 'true',\n },\n [\n h('svg', { viewBox: '0 0 12 12', width: '12', height: '12' }, [\n h('path', {\n d: 'M3 4.5L6 7.5l3-3',\n stroke: 'currentColor',\n 'stroke-width': '1.5',\n fill: 'none',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n }),\n ]),\n ],\n ),\n ],\n ),\n ]),\n\n h(\n 'div',\n {\n class: 'ansh-accordion__region',\n id: panelId,\n role: 'region',\n 'aria-labelledby': headerId,\n 'data-state': open ? 'open' : 'closed',\n },\n [\n h('div', { class: 'ansh-accordion__panel', ...(open ? null : { inert: true }) }, [\n resolveSlotContent(item.content),\n ]),\n ],\n ),\n ],\n )\n }),\n )\n }\n },\n})\n\nexport interface DisclosureListProps {\n /** Simple show-more list — the pattern for \"N more items\". */\n items: readonly SlotContent[]\n /** How many to show before collapsing. Default `3`. */\n initial?: number\n moreLabel?: (hidden: number) => string\n lessLabel?: string\n}\n\n/** Show a few items with a \"show N more\" toggle. */\nexport const DisclosureList = defineComponent({\n name: 'AnshDisclosureList',\n inheritAttrs: false,\n props: {\n items: { type: Array as PropType<readonly SlotContent[]>, required: true },\n initial: { type: Number, default: 3 },\n moreLabel: {\n type: Function as PropType<(hidden: number) => string>,\n default: (hidden: number) => `Show ${hidden} more`,\n },\n lessLabel: { type: String, default: 'Show less' },\n },\n setup(props, { attrs }) {\n const expanded = ref(false)\n const id = useId()\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n const hidden = props.items.length - props.initial\n\n if (hidden <= 0) {\n return h(\n 'ul',\n { class: cx('ansh-disclosure-list', attrClass as string), ...restAttrs },\n props.items.map((item, index) => h('li', { key: index }, [resolveSlotContent(item)])),\n )\n }\n\n const shown = expanded.value ? props.items : props.items.slice(0, props.initial)\n\n return h('div', { class: attrClass as string, ...restAttrs }, [\n h(\n 'ul',\n { class: 'ansh-disclosure-list', id },\n shown.map((item, index) => h('li', { key: index }, [resolveSlotContent(item)])),\n ),\n h(\n 'button',\n {\n type: 'button',\n class: 'ansh-disclosure-list__toggle ansh-focusable',\n 'aria-expanded': expanded.value,\n 'aria-controls': id,\n onClick: () => {\n expanded.value = !expanded.value\n },\n },\n expanded.value ? props.lessLabel : props.moreLabel(hidden),\n ),\n ])\n }\n },\n})\n"]}
@@ -0,0 +1,152 @@
1
+ import { watch, getCurrentScope, onScopeDispose } from 'vue';
2
+
3
+ // src/primitives/focus.ts
4
+ var FOCUSABLE_SELECTOR = [
5
+ "a[href]",
6
+ "button:not([disabled])",
7
+ 'input:not([disabled]):not([type="hidden"])',
8
+ "select:not([disabled])",
9
+ "textarea:not([disabled])",
10
+ "audio[controls]",
11
+ "video[controls]",
12
+ '[contenteditable]:not([contenteditable="false"])',
13
+ '[tabindex]:not([tabindex="-1"])'
14
+ ].join(",");
15
+ function isVisible(element) {
16
+ if (element.hasAttribute("inert")) return false;
17
+ if (element.offsetParent !== null) return true;
18
+ const rect = element.getBoundingClientRect();
19
+ return rect.width > 0 || rect.height > 0;
20
+ }
21
+ function getTabbable(container) {
22
+ if (!container) return [];
23
+ const nodes = Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR));
24
+ return nodes.filter((node) => {
25
+ if (node.getAttribute("aria-hidden") === "true") return false;
26
+ if (node.closest("[inert]")) return false;
27
+ return isVisible(node);
28
+ });
29
+ }
30
+ function useFocusTrap(target, active) {
31
+ let detach = null;
32
+ const attach = () => {
33
+ const container = target.value;
34
+ if (!container || detach) return;
35
+ const onKeyDown = (event) => {
36
+ if (event.key !== "Tab") return;
37
+ const tabbable = getTabbable(container);
38
+ if (tabbable.length === 0) {
39
+ event.preventDefault();
40
+ return;
41
+ }
42
+ const first = tabbable[0];
43
+ const last = tabbable[tabbable.length - 1];
44
+ const activeElement = document.activeElement;
45
+ if (event.shiftKey && (activeElement === first || activeElement === container)) {
46
+ event.preventDefault();
47
+ last.focus();
48
+ } else if (!event.shiftKey && activeElement === last) {
49
+ event.preventDefault();
50
+ first.focus();
51
+ }
52
+ };
53
+ container.addEventListener("keydown", onKeyDown);
54
+ detach = () => {
55
+ container.removeEventListener("keydown", onKeyDown);
56
+ detach = null;
57
+ };
58
+ };
59
+ watch([active, target], () => active.value ? attach() : detach?.(), {
60
+ immediate: true,
61
+ flush: "post"
62
+ });
63
+ if (getCurrentScope()) onScopeDispose(() => detach?.());
64
+ }
65
+ function useFocusRestore(active) {
66
+ let previous = null;
67
+ watch(
68
+ active,
69
+ (isActive) => {
70
+ if (isActive) {
71
+ previous = document.activeElement;
72
+ return;
73
+ }
74
+ if (previous && previous.isConnected) previous.focus?.({ preventScroll: true });
75
+ previous = null;
76
+ },
77
+ { flush: "post" }
78
+ );
79
+ }
80
+ function useAutoFocus(target, active, initialFocus) {
81
+ let frame = null;
82
+ watch(
83
+ [active, target],
84
+ () => {
85
+ if (frame !== null) cancelAnimationFrame(frame);
86
+ if (!active.value) return;
87
+ const container = target.value;
88
+ if (!container) return;
89
+ frame = requestAnimationFrame(() => {
90
+ frame = null;
91
+ const explicit = initialFocus?.value;
92
+ if (explicit?.isConnected) {
93
+ explicit.focus({ preventScroll: true });
94
+ return;
95
+ }
96
+ const target2 = getTabbable(container)[0] ?? container;
97
+ target2.focus({ preventScroll: true });
98
+ });
99
+ },
100
+ { immediate: true, flush: "post" }
101
+ );
102
+ if (getCurrentScope()) {
103
+ onScopeDispose(() => {
104
+ if (frame !== null) cancelAnimationFrame(frame);
105
+ });
106
+ }
107
+ }
108
+ function useRovingFocus(options) {
109
+ const { items, active, onActiveChange, orientation = "horizontal", loop = true } = options;
110
+ return (event) => {
111
+ const nodes = items.value.filter((item) => item !== null);
112
+ if (nodes.length === 0) return;
113
+ const horizontal = orientation === "horizontal" || orientation === "both";
114
+ const vertical = orientation === "vertical" || orientation === "both";
115
+ let next = active();
116
+ switch (event.key) {
117
+ case "ArrowRight":
118
+ if (!horizontal) return;
119
+ next = active() + 1;
120
+ break;
121
+ case "ArrowLeft":
122
+ if (!horizontal) return;
123
+ next = active() - 1;
124
+ break;
125
+ case "ArrowDown":
126
+ if (!vertical) return;
127
+ next = active() + 1;
128
+ break;
129
+ case "ArrowUp":
130
+ if (!vertical) return;
131
+ next = active() - 1;
132
+ break;
133
+ case "Home":
134
+ next = 0;
135
+ break;
136
+ case "End":
137
+ next = nodes.length - 1;
138
+ break;
139
+ default:
140
+ return;
141
+ }
142
+ event.preventDefault();
143
+ if (next < 0) next = loop ? nodes.length - 1 : 0;
144
+ if (next >= nodes.length) next = loop ? 0 : nodes.length - 1;
145
+ onActiveChange(next);
146
+ nodes[next]?.focus();
147
+ };
148
+ }
149
+
150
+ export { getTabbable, useAutoFocus, useFocusRestore, useFocusTrap, useRovingFocus };
151
+ //# sourceMappingURL=chunk-TMG3M6TK.js.map
152
+ //# sourceMappingURL=chunk-TMG3M6TK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/focus.ts"],"names":[],"mappings":"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","file":"chunk-TMG3M6TK.js","sourcesContent":["import { type Ref, getCurrentScope, onScopeDispose, watch } from 'vue'\nimport { type ReadonlyRef } from './utils'\n\n/**\n * Focus management for overlay surfaces — the Vue counterpart of `@ansh-ui/react`'s `focus.ts`.\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\nfunction isVisible(element: HTMLElement): boolean {\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 | undefined): 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 land\n * on and announce as blank; intercepting the key does not.\n */\nexport function useFocusTrap(\n target: Ref<HTMLElement | null | undefined>,\n active: ReadonlyRef<boolean>,\n): void {\n let detach: (() => void) | null = null\n\n const attach = (): void => {\n const container = target.value\n if (!container || detach) return\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab') return\n\n const tabbable = getTabbable(container)\n if (tabbable.length === 0) {\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 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 detach = () => {\n container.removeEventListener('keydown', onKeyDown)\n detach = null\n }\n }\n\n watch([active, target], () => (active.value ? attach() : detach?.()), {\n immediate: true,\n flush: 'post',\n })\n\n if (getCurrentScope()) onScopeDispose(() => detach?.())\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: ReadonlyRef<boolean>): void {\n let previous: HTMLElement | null = null\n\n watch(\n active,\n (isActive) => {\n if (isActive) {\n previous = document.activeElement as HTMLElement | null\n return\n }\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 previous = null\n },\n { flush: 'post' },\n )\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. The\n * container fallback matters for a dialog whose only content is text: focus must land inside it so a\n * screen reader announces the dialog rather than continuing from the page behind.\n */\nexport function useAutoFocus(\n target: Ref<HTMLElement | null | undefined>,\n active: ReadonlyRef<boolean>,\n initialFocus?: Ref<HTMLElement | null | undefined>,\n): void {\n let frame: number | null = null\n\n watch(\n [active, target],\n () => {\n if (frame !== null) cancelAnimationFrame(frame)\n if (!active.value) return\n const container = target.value\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 frame = requestAnimationFrame(() => {\n frame = null\n const explicit = initialFocus?.value\n if (explicit?.isConnected) {\n explicit.focus({ preventScroll: true })\n return\n }\n const target2 = getTabbable(container)[0] ?? container\n target2.focus({ preventScroll: true })\n })\n },\n { immediate: true, flush: 'post' },\n )\n\n if (getCurrentScope()) {\n onScopeDispose(() => {\n if (frame !== null) cancelAnimationFrame(frame)\n })\n }\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 within\n * it. Returns a keydown handler to bind on the composite's container.\n */\nexport function useRovingFocus(options: {\n /** Items in DOM order. */\n items: Ref<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: KeyboardEvent) => void {\n const { items, active, onActiveChange, orientation = 'horizontal', loop = true } = options\n\n return (event: KeyboardEvent) => {\n const nodes = items.value.filter((item): item is HTMLElement => item !== null)\n if (nodes.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 = nodes.length - 1\n break\n default:\n return\n }\n\n event.preventDefault()\n\n if (next < 0) next = loop ? nodes.length - 1 : 0\n if (next >= nodes.length) next = loop ? 0 : nodes.length - 1\n\n onActiveChange(next)\n nodes[next]?.focus()\n }\n}\n"]}
@@ -0,0 +1,286 @@
1
+ 'use strict';
2
+
3
+ var chunk6732H4BQ_cjs = require('./chunk-6732H4BQ.cjs');
4
+ var vue = require('vue');
5
+
6
+ var layers = [];
7
+ function getLayerStack() {
8
+ return layers;
9
+ }
10
+ function useDismiss(target, open, onDismiss, options = {}) {
11
+ const { outsidePress = true, escapeKey = true, ignore = [] } = options;
12
+ const id = chunk6732H4BQ_cjs.useId("layer");
13
+ let detach = null;
14
+ const attach = () => {
15
+ if (detach) return;
16
+ layers.push(id);
17
+ const onKeyDown = (event) => {
18
+ if (!escapeKey || event.key !== "Escape") return;
19
+ if (layers[layers.length - 1] !== id) return;
20
+ event.stopPropagation();
21
+ onDismiss();
22
+ };
23
+ const onPointerDown = (event) => {
24
+ if (!outsidePress) return;
25
+ const target2 = event.target;
26
+ if (!target2 || !target2.isConnected) return;
27
+ if (target.value?.contains(target2)) return;
28
+ for (const other of ignore) {
29
+ if (other.value?.contains(target2)) return;
30
+ }
31
+ onDismiss();
32
+ };
33
+ document.addEventListener("pointerdown", onPointerDown, true);
34
+ document.addEventListener("keydown", onKeyDown, true);
35
+ detach = () => {
36
+ const index = layers.indexOf(id);
37
+ if (index >= 0) layers.splice(index, 1);
38
+ document.removeEventListener("pointerdown", onPointerDown, true);
39
+ document.removeEventListener("keydown", onKeyDown, true);
40
+ detach = null;
41
+ };
42
+ };
43
+ vue.watch(open, (isOpen) => isOpen ? attach() : detach?.(), { immediate: true });
44
+ if (vue.getCurrentScope()) vue.onScopeDispose(() => detach?.());
45
+ }
46
+ var scrollLocks = 0;
47
+ var restoreStyles = null;
48
+ function useScrollLock(active) {
49
+ let locked = false;
50
+ const lock = () => {
51
+ if (locked || typeof document === "undefined") return;
52
+ locked = true;
53
+ scrollLocks += 1;
54
+ if (scrollLocks === 1) {
55
+ const { body } = document;
56
+ restoreStyles = { overflow: body.style.overflow, paddingRight: body.style.paddingRight };
57
+ const gutter = window.innerWidth - document.documentElement.clientWidth;
58
+ body.style.overflow = "hidden";
59
+ if (gutter > 0) {
60
+ const current = Number.parseFloat(window.getComputedStyle(body).paddingRight) || 0;
61
+ body.style.paddingRight = `${current + gutter}px`;
62
+ }
63
+ }
64
+ };
65
+ const unlock = () => {
66
+ if (!locked) return;
67
+ locked = false;
68
+ scrollLocks -= 1;
69
+ if (scrollLocks === 0 && restoreStyles) {
70
+ document.body.style.overflow = restoreStyles.overflow;
71
+ document.body.style.paddingRight = restoreStyles.paddingRight;
72
+ restoreStyles = null;
73
+ }
74
+ };
75
+ vue.watch(active, (isActive) => isActive ? lock() : unlock(), { immediate: true });
76
+ if (vue.getCurrentScope()) vue.onScopeDispose(unlock);
77
+ }
78
+
79
+ // src/primitives/position.ts
80
+ function parse(placement) {
81
+ const [side, align = "center"] = placement.split("-");
82
+ return { side, align };
83
+ }
84
+ var OPPOSITE = { top: "bottom", bottom: "top", left: "right", right: "left" };
85
+ function space(anchor, viewport, padding) {
86
+ return {
87
+ top: anchor.y - viewport.y - padding,
88
+ bottom: viewport.y + viewport.height - (anchor.y + anchor.height) - padding,
89
+ left: anchor.x - viewport.x - padding,
90
+ right: viewport.x + viewport.width - (anchor.x + anchor.width) - padding
91
+ };
92
+ }
93
+ function place(anchor, floating, side, align, offset) {
94
+ let x = 0;
95
+ let y = 0;
96
+ switch (side) {
97
+ case "top":
98
+ y = anchor.y - floating.height - offset;
99
+ break;
100
+ case "bottom":
101
+ y = anchor.y + anchor.height + offset;
102
+ break;
103
+ case "left":
104
+ x = anchor.x - floating.width - offset;
105
+ break;
106
+ case "right":
107
+ x = anchor.x + anchor.width + offset;
108
+ break;
109
+ }
110
+ const vertical = side === "top" || side === "bottom";
111
+ if (vertical) {
112
+ if (align === "start") x = anchor.x;
113
+ else if (align === "end") x = anchor.x + anchor.width - floating.width;
114
+ else x = anchor.x + anchor.width / 2 - floating.width / 2;
115
+ } else {
116
+ if (align === "start") y = anchor.y;
117
+ else if (align === "end") y = anchor.y + anchor.height - floating.height;
118
+ else y = anchor.y + anchor.height / 2 - floating.height / 2;
119
+ }
120
+ return { x, y };
121
+ }
122
+ function computePosition(anchor, floating, viewport, options = {}) {
123
+ const {
124
+ placement = "bottom",
125
+ offset = 8,
126
+ padding = 8,
127
+ flip = true,
128
+ shift = true,
129
+ arrowSize = 0
130
+ } = options;
131
+ const requested = parse(placement);
132
+ let side = requested.side;
133
+ const align = requested.align;
134
+ if (flip) {
135
+ const available = space(anchor, viewport, padding);
136
+ const needed = side === "top" || side === "bottom" ? floating.height : floating.width;
137
+ const opposite = OPPOSITE[side];
138
+ if (available[side] < needed + offset && available[opposite] > available[side]) {
139
+ side = opposite;
140
+ }
141
+ }
142
+ let { x, y } = place(anchor, floating, side, align, offset);
143
+ const minX = viewport.x + padding;
144
+ const maxX = viewport.x + viewport.width - floating.width - padding;
145
+ const minY = viewport.y + padding;
146
+ const maxY = viewport.y + viewport.height - floating.height - padding;
147
+ if (shift) {
148
+ if (side === "top" || side === "bottom") {
149
+ x = maxX < minX ? minX : Math.min(Math.max(x, minX), maxX);
150
+ } else {
151
+ y = maxY < minY ? minY : Math.min(Math.max(y, minY), maxY);
152
+ }
153
+ }
154
+ let arrow = null;
155
+ if (arrowSize > 0) {
156
+ const half = arrowSize / 2;
157
+ const inset = arrowSize + 4;
158
+ if (side === "top" || side === "bottom") {
159
+ const centre = anchor.x + anchor.width / 2 - x - half;
160
+ const limit = Math.max(inset, floating.width - inset - arrowSize);
161
+ arrow = {
162
+ x: Math.min(Math.max(centre, inset), limit),
163
+ y: side === "top" ? floating.height : -arrowSize
164
+ };
165
+ } else {
166
+ const centre = anchor.y + anchor.height / 2 - y - half;
167
+ const limit = Math.max(inset, floating.height - inset - arrowSize);
168
+ arrow = {
169
+ x: side === "left" ? floating.width : -arrowSize,
170
+ y: Math.min(Math.max(centre, inset), limit)
171
+ };
172
+ }
173
+ }
174
+ const hidden = anchor.y + anchor.height < viewport.y || anchor.y > viewport.y + viewport.height || anchor.x + anchor.width < viewport.x || anchor.x > viewport.x + viewport.width;
175
+ return {
176
+ x: Math.round(x),
177
+ y: Math.round(y),
178
+ placement: align === "center" ? side : `${side}-${align}`,
179
+ side,
180
+ align,
181
+ arrow,
182
+ hidden
183
+ };
184
+ }
185
+ var HIDDEN = {
186
+ position: "fixed",
187
+ top: "0px",
188
+ left: "0px",
189
+ // Rendered off-screen rather than `display: none` for the first frame, so the element has real
190
+ // dimensions to measure. Measuring a `display: none` element returns a zero rect, which would
191
+ // place the surface at the anchor's corner for one frame — a visible jump on every open.
192
+ transform: "translate3d(0, -200vh, 0)",
193
+ pointerEvents: "none"
194
+ };
195
+ function useAnchoredPosition(anchorRef, floatingRef, open, options = {}) {
196
+ const {
197
+ matchWidth = false,
198
+ placement = "bottom",
199
+ offset = 8,
200
+ padding = 8,
201
+ flip = true,
202
+ shift = true,
203
+ arrowSize = 0
204
+ } = options;
205
+ const result = vue.shallowRef(null);
206
+ const anchorWidth = vue.shallowRef(null);
207
+ function update() {
208
+ const anchor = anchorRef.value;
209
+ const floating = floatingRef.value;
210
+ if (!anchor || !floating) return;
211
+ const anchorRect = anchor.getBoundingClientRect();
212
+ const floatingRect = floating.getBoundingClientRect();
213
+ if (floatingRect.width === 0 && floatingRect.height === 0) return;
214
+ anchorWidth.value = matchWidth ? anchorRect.width : null;
215
+ result.value = computePosition(
216
+ anchorRect,
217
+ floatingRect,
218
+ { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight },
219
+ { placement, offset, padding, flip, shift, arrowSize }
220
+ );
221
+ }
222
+ let cleanup = null;
223
+ vue.watch(
224
+ open,
225
+ (isOpen) => {
226
+ cleanup?.();
227
+ cleanup = null;
228
+ if (!isOpen) {
229
+ result.value = null;
230
+ return;
231
+ }
232
+ update();
233
+ const onScroll = () => update();
234
+ window.addEventListener("scroll", onScroll, { capture: true, passive: true });
235
+ window.addEventListener("resize", onScroll, { passive: true });
236
+ let observer;
237
+ if (typeof ResizeObserver !== "undefined") {
238
+ observer = new ResizeObserver(() => update());
239
+ if (anchorRef.value) observer.observe(anchorRef.value);
240
+ if (floatingRef.value) observer.observe(floatingRef.value);
241
+ }
242
+ cleanup = () => {
243
+ window.removeEventListener("scroll", onScroll, { capture: true });
244
+ window.removeEventListener("resize", onScroll);
245
+ observer?.disconnect();
246
+ };
247
+ },
248
+ { immediate: true, flush: "post" }
249
+ );
250
+ if (vue.getCurrentScope()) vue.onScopeDispose(() => cleanup?.());
251
+ const position = vue.computed(() => {
252
+ const r = result.value;
253
+ if (!r) {
254
+ return {
255
+ style: matchWidth && anchorWidth.value !== null ? { ...HIDDEN, width: `${anchorWidth.value}px` } : { ...HIDDEN },
256
+ arrowStyle: void 0,
257
+ placement,
258
+ side: placement.split("-")[0]
259
+ };
260
+ }
261
+ return {
262
+ style: {
263
+ position: "fixed",
264
+ top: "0px",
265
+ left: "0px",
266
+ // `transform` rather than `top`/`left`: it is composited, so repositioning during scroll
267
+ // does not invalidate layout for the rest of the page.
268
+ transform: `translate3d(${r.x}px, ${r.y}px, 0)`,
269
+ ...r.hidden ? { visibility: "hidden", pointerEvents: "none" } : null,
270
+ ...anchorWidth.value !== null ? { width: `${anchorWidth.value}px` } : null
271
+ },
272
+ arrowStyle: r.arrow ? { position: "absolute", left: `${r.arrow.x}px`, top: `${r.arrow.y}px` } : void 0,
273
+ placement: r.placement,
274
+ side: r.side
275
+ };
276
+ });
277
+ return { position, update };
278
+ }
279
+
280
+ exports.computePosition = computePosition;
281
+ exports.getLayerStack = getLayerStack;
282
+ exports.useAnchoredPosition = useAnchoredPosition;
283
+ exports.useDismiss = useDismiss;
284
+ exports.useScrollLock = useScrollLock;
285
+ //# sourceMappingURL=chunk-XLLSS464.cjs.map
286
+ //# sourceMappingURL=chunk-XLLSS464.cjs.map