@ansh-ui/vue 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/dist/{chunk-B6OXKW5Q.js → chunk-AL4PPK25.js} +5 -2
  2. package/dist/chunk-AL4PPK25.js.map +1 -0
  3. package/dist/{chunk-2VSROZ2N.js → chunk-D3HH726R.js} +152 -144
  4. package/dist/chunk-D3HH726R.js.map +1 -0
  5. package/dist/{chunk-5BQEZYG6.cjs → chunk-EDAF7RAN.cjs} +163 -155
  6. package/dist/chunk-EDAF7RAN.cjs.map +1 -0
  7. package/dist/{chunk-TMG3M6TK.js → chunk-G2OX2NH2.js} +3 -3
  8. package/dist/chunk-G2OX2NH2.js.map +1 -0
  9. package/dist/{chunk-SOYRICHU.js → chunk-G3EIU6VM.js} +14 -8
  10. package/dist/chunk-G3EIU6VM.js.map +1 -0
  11. package/dist/{chunk-KCA7RNJ4.cjs → chunk-IHH6KMBY.cjs} +239 -5
  12. package/dist/chunk-IHH6KMBY.cjs.map +1 -0
  13. package/dist/{chunk-J2LA4GRP.cjs → chunk-IO6WJEJI.cjs} +122 -120
  14. package/dist/chunk-IO6WJEJI.cjs.map +1 -0
  15. package/dist/{chunk-IOXGBPOV.cjs → chunk-JJBYF7AH.cjs} +14 -8
  16. package/dist/chunk-JJBYF7AH.cjs.map +1 -0
  17. package/dist/{chunk-Z7XOFKM4.cjs → chunk-KKCZ5RUE.cjs} +4 -2
  18. package/dist/chunk-KKCZ5RUE.cjs.map +1 -0
  19. package/dist/{chunk-6ABPGOJP.js → chunk-LFGAOD32.js} +4 -2
  20. package/dist/chunk-LFGAOD32.js.map +1 -0
  21. package/dist/{chunk-EISHOEB6.cjs → chunk-MWGVDY6K.cjs} +3 -3
  22. package/dist/chunk-MWGVDY6K.cjs.map +1 -0
  23. package/dist/{chunk-FVKLCGA4.js → chunk-NJMTWLT2.js} +123 -121
  24. package/dist/chunk-NJMTWLT2.js.map +1 -0
  25. package/dist/{chunk-T425FIC7.js → chunk-NKRPZTQA.js} +238 -5
  26. package/dist/chunk-NKRPZTQA.js.map +1 -0
  27. package/dist/{chunk-JQ4YLXXM.cjs → chunk-PNR4RQ4T.cjs} +5 -2
  28. package/dist/chunk-PNR4RQ4T.cjs.map +1 -0
  29. package/dist/data.cjs +16 -16
  30. package/dist/data.d.cts +54 -52
  31. package/dist/data.d.ts +54 -52
  32. package/dist/data.js +1 -1
  33. package/dist/form.cjs +36 -36
  34. package/dist/form.d.cts +53 -45
  35. package/dist/form.d.ts +53 -45
  36. package/dist/form.js +1 -1
  37. package/dist/index.cjs +208 -180
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +33 -8
  40. package/dist/index.d.ts +33 -8
  41. package/dist/index.js +31 -15
  42. package/dist/index.js.map +1 -1
  43. package/dist/layout.cjs +13 -13
  44. package/dist/layout.d.cts +23 -14
  45. package/dist/layout.d.ts +23 -14
  46. package/dist/layout.js +1 -1
  47. package/dist/motion.cjs +11 -11
  48. package/dist/motion.d.cts +41 -37
  49. package/dist/motion.d.ts +41 -37
  50. package/dist/motion.js +1 -1
  51. package/dist/navigation.cjs +13 -9
  52. package/dist/navigation.d.cts +125 -4
  53. package/dist/navigation.d.ts +125 -4
  54. package/dist/navigation.js +2 -2
  55. package/dist/overlay.cjs +14 -14
  56. package/dist/overlay.d.cts +36 -33
  57. package/dist/overlay.d.ts +36 -33
  58. package/dist/overlay.js +2 -2
  59. package/dist/{position-Cn7qP1pn.d.cts → position-CiY171HP.d.cts} +2 -1
  60. package/dist/{position-Cn7qP1pn.d.ts → position-CiY171HP.d.ts} +2 -1
  61. package/dist/primitives.cjs +6 -6
  62. package/dist/primitives.d.cts +6 -5
  63. package/dist/primitives.d.ts +6 -5
  64. package/dist/primitives.js +1 -1
  65. package/dist/{sidebar-CTZ-Ckko.d.ts → sidebar-B9zDHMbn.d.cts} +5 -4
  66. package/dist/{sidebar-CQqEmpid.d.cts → sidebar-DMrKHqZ5.d.ts} +5 -4
  67. package/dist/styles.css +464 -0
  68. package/dist/{utils-IKPG3zcC.d.cts → utils-D4XwXDeX.d.cts} +2 -1
  69. package/dist/{utils-IKPG3zcC.d.ts → utils-D4XwXDeX.d.ts} +2 -1
  70. package/package.json +3 -3
  71. package/dist/chunk-2VSROZ2N.js.map +0 -1
  72. package/dist/chunk-5BQEZYG6.cjs.map +0 -1
  73. package/dist/chunk-6ABPGOJP.js.map +0 -1
  74. package/dist/chunk-B6OXKW5Q.js.map +0 -1
  75. package/dist/chunk-EISHOEB6.cjs.map +0 -1
  76. package/dist/chunk-FVKLCGA4.js.map +0 -1
  77. package/dist/chunk-IOXGBPOV.cjs.map +0 -1
  78. package/dist/chunk-J2LA4GRP.cjs.map +0 -1
  79. package/dist/chunk-JQ4YLXXM.cjs.map +0 -1
  80. package/dist/chunk-KCA7RNJ4.cjs.map +0 -1
  81. package/dist/chunk-SOYRICHU.js.map +0 -1
  82. package/dist/chunk-T425FIC7.js.map +0 -1
  83. package/dist/chunk-TMG3M6TK.js.map +0 -1
  84. package/dist/chunk-Z7XOFKM4.cjs.map +0 -1
@@ -1,7 +1,8 @@
1
- import { useRovingFocus } from './chunk-TMG3M6TK.js';
1
+ import { useRovingFocus } from './chunk-G2OX2NH2.js';
2
2
  import { useControllableState } from './chunk-OAQ7MDYX.js';
3
3
  import { useId, cx, resolveSlotContent } from './chunk-NJDDNO4C.js';
4
- import { defineComponent, ref, computed, h, onBeforeUnmount, watch } from 'vue';
4
+ import { defineComponent, ref, computed, h, watch, onBeforeUnmount } from 'vue';
5
+ import { clamp } from '@ansh-ui/core';
5
6
 
6
7
  var Tabs = defineComponent({
7
8
  name: "AnshTabs",
@@ -130,6 +131,238 @@ var Tabs = defineComponent({
130
131
  };
131
132
  }
132
133
  });
134
+ var Carousel = defineComponent({
135
+ name: "AnshCarousel",
136
+ inheritAttrs: false,
137
+ props: {
138
+ items: { type: Array, required: true },
139
+ modelValue: { type: Number, default: void 0 },
140
+ defaultValue: { type: Number, default: 0 },
141
+ /** Wrap past the ends. */
142
+ loop: { type: Boolean, default: true },
143
+ /** Advance on a timer. */
144
+ autoPlay: { type: Boolean, default: false },
145
+ /** Seconds each slide is held when auto-playing. */
146
+ interval: { type: Number, default: 5 },
147
+ showDots: { type: Boolean, default: true },
148
+ showArrows: { type: Boolean, default: true },
149
+ draggable: { type: Boolean, default: true },
150
+ /** Accessible name for the carousel region. */
151
+ label: { type: String, required: true }
152
+ },
153
+ emits: ["update:modelValue"],
154
+ setup(props, { attrs, emit }) {
155
+ const count = computed(() => props.items.length);
156
+ const [index, setIndex] = useControllableState(
157
+ () => props.modelValue,
158
+ clamp(props.defaultValue, 0, Math.max(0, props.items.length - 1)),
159
+ (next) => emit("update:modelValue", next)
160
+ );
161
+ const paused = ref(false);
162
+ const playing = ref(props.autoPlay);
163
+ const drag = ref(0);
164
+ const dragStart = ref(null);
165
+ const viewport = ref(null);
166
+ const baseId = useId();
167
+ const active = computed(() => count.value > 0 ? clamp(index.value, 0, count.value - 1) : 0);
168
+ const goTo = (next) => {
169
+ const total = count.value;
170
+ if (total === 0) return;
171
+ setIndex(props.loop ? (next + total) % total : clamp(next, 0, total - 1));
172
+ };
173
+ let timer;
174
+ const stopTimer = () => {
175
+ if (timer !== void 0) window.clearInterval(timer);
176
+ timer = void 0;
177
+ };
178
+ const syncTimer = () => {
179
+ stopTimer();
180
+ if (!playing.value || paused.value || count.value < 2) return;
181
+ const ms = Math.max(1e3, props.interval * 1e3);
182
+ timer = window.setInterval(() => {
183
+ const next = active.value + 1;
184
+ setIndex(props.loop ? next % count.value : Math.min(next, count.value - 1));
185
+ }, ms);
186
+ };
187
+ watch([playing, paused, () => props.interval, count, () => props.loop], syncTimer, {
188
+ immediate: true
189
+ });
190
+ onBeforeUnmount(stopTimer);
191
+ const onKeydown = (event) => {
192
+ if (event.key === "ArrowLeft") {
193
+ event.preventDefault();
194
+ goTo(active.value - 1);
195
+ } else if (event.key === "ArrowRight") {
196
+ event.preventDefault();
197
+ goTo(active.value + 1);
198
+ } else if (event.key === "Home") {
199
+ event.preventDefault();
200
+ goTo(0);
201
+ } else if (event.key === "End") {
202
+ event.preventDefault();
203
+ goTo(count.value - 1);
204
+ }
205
+ };
206
+ const onPointerdown = (event) => {
207
+ if (!props.draggable || count.value < 2) return;
208
+ dragStart.value = event.clientX;
209
+ event.currentTarget.setPointerCapture(event.pointerId);
210
+ };
211
+ const onPointermove = (event) => {
212
+ if (dragStart.value === null) return;
213
+ drag.value = event.clientX - dragStart.value;
214
+ };
215
+ const endDrag = (event) => {
216
+ if (dragStart.value === null) return;
217
+ const target = event.currentTarget;
218
+ if (target.hasPointerCapture(event.pointerId)) target.releasePointerCapture(event.pointerId);
219
+ const width = viewport.value?.clientWidth ?? 1;
220
+ const travelled = drag.value;
221
+ dragStart.value = null;
222
+ drag.value = 0;
223
+ if (Math.abs(travelled) > width * 0.25) goTo(active.value + (travelled < 0 ? 1 : -1));
224
+ };
225
+ return () => {
226
+ const { class: attrClass, ...restAttrs } = attrs;
227
+ const total = count.value;
228
+ if (total === 0) return null;
229
+ const current = active.value;
230
+ const atStart = !props.loop && current === 0;
231
+ const atEnd = !props.loop && current === total - 1;
232
+ const dragPercent = drag.value !== 0 ? drag.value / (viewport.value?.clientWidth || 1) * 100 : 0;
233
+ const slides = props.items.map(
234
+ (item, i) => h(
235
+ "div",
236
+ {
237
+ key: i,
238
+ class: "ansh-carousel__slide",
239
+ id: `${baseId}-slide-${i}`,
240
+ role: "group",
241
+ "aria-roledescription": "slide",
242
+ "aria-label": `${i + 1} of ${total}`,
243
+ "aria-hidden": i === current ? void 0 : "true",
244
+ // `''` not `true`: Vue renders `true` as `inert="true"` while React renders
245
+ // `inert=""`. Both are inert to the browser, but the markup-parity contract compares
246
+ // serialised HTML, so they have to agree exactly.
247
+ inert: i === current ? void 0 : ""
248
+ },
249
+ [resolveSlotContent(item)]
250
+ )
251
+ );
252
+ const arrows = props.showArrows && total > 1 ? [
253
+ h(
254
+ "button",
255
+ {
256
+ type: "button",
257
+ class: "ansh-carousel__arrow ansh-carousel__arrow--prev",
258
+ disabled: atStart,
259
+ "aria-label": "Previous slide",
260
+ onClick: () => goTo(current - 1)
261
+ },
262
+ "\u2039"
263
+ ),
264
+ h(
265
+ "button",
266
+ {
267
+ type: "button",
268
+ class: "ansh-carousel__arrow ansh-carousel__arrow--next",
269
+ disabled: atEnd,
270
+ "aria-label": "Next slide",
271
+ onClick: () => goTo(current + 1)
272
+ },
273
+ "\u203A"
274
+ )
275
+ ] : [];
276
+ const controlChildren = [];
277
+ if (props.autoPlay) {
278
+ controlChildren.push(
279
+ h(
280
+ "button",
281
+ {
282
+ type: "button",
283
+ class: "ansh-carousel__pause",
284
+ "aria-label": playing.value ? "Pause carousel" : "Play carousel",
285
+ onClick: () => {
286
+ playing.value = !playing.value;
287
+ }
288
+ },
289
+ playing.value ? "\u275A\u275A" : "\u25B6"
290
+ )
291
+ );
292
+ }
293
+ if (props.showDots && total > 1) {
294
+ controlChildren.push(
295
+ h(
296
+ "div",
297
+ { class: "ansh-carousel__dots" },
298
+ props.items.map(
299
+ (_, i) => h("button", {
300
+ key: i,
301
+ type: "button",
302
+ class: "ansh-carousel__dot",
303
+ "aria-label": `Go to slide ${i + 1}`,
304
+ "aria-current": i === current ? "true" : void 0,
305
+ onClick: () => goTo(i)
306
+ })
307
+ )
308
+ )
309
+ );
310
+ }
311
+ return h(
312
+ "section",
313
+ {
314
+ ...restAttrs,
315
+ class: cx("ansh-carousel", attrClass),
316
+ "aria-roledescription": "carousel",
317
+ "aria-label": props.label,
318
+ onKeydown,
319
+ onPointerenter: () => {
320
+ paused.value = true;
321
+ },
322
+ onPointerleave: () => {
323
+ paused.value = false;
324
+ },
325
+ onFocusin: () => {
326
+ paused.value = true;
327
+ },
328
+ onFocusout: () => {
329
+ paused.value = false;
330
+ }
331
+ },
332
+ [
333
+ h(
334
+ "div",
335
+ {
336
+ class: "ansh-carousel__viewport",
337
+ ref: viewport,
338
+ "aria-live": playing.value ? "off" : "polite",
339
+ "data-dragging": dragStart.value !== null ? "" : void 0,
340
+ onPointerdown,
341
+ onPointermove,
342
+ onPointerup: endDrag,
343
+ onPointercancel: endDrag
344
+ },
345
+ [
346
+ h(
347
+ "div",
348
+ {
349
+ class: "ansh-carousel__track",
350
+ style: {
351
+ transform: `translate3d(${-current * 100 + dragPercent}%, 0, 0)`,
352
+ transition: dragStart.value !== null ? "none" : void 0
353
+ }
354
+ },
355
+ slides
356
+ )
357
+ ]
358
+ ),
359
+ ...arrows,
360
+ controlChildren.length > 0 ? h("div", { class: "ansh-carousel__controls" }, controlChildren) : null
361
+ ]
362
+ );
363
+ };
364
+ }
365
+ });
133
366
  var Breadcrumbs = defineComponent({
134
367
  name: "AnshBreadcrumbs",
135
368
  inheritAttrs: false,
@@ -768,6 +1001,6 @@ var DisclosureList = defineComponent({
768
1001
  }
769
1002
  });
770
1003
 
771
- export { Accordion, Breadcrumbs, Collapsible, DisclosureList, NavigationMenu, Stepper, Tabs };
772
- //# sourceMappingURL=chunk-T425FIC7.js.map
773
- //# sourceMappingURL=chunk-T425FIC7.js.map
1004
+ export { Accordion, Breadcrumbs, Carousel, Collapsible, DisclosureList, NavigationMenu, Stepper, Tabs };
1005
+ //# sourceMappingURL=chunk-NKRPZTQA.js.map
1006
+ //# sourceMappingURL=chunk-NKRPZTQA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/navigation/tabs.ts","../src/components/navigation/carousel.ts","../src/components/navigation/breadcrumbs.ts","../src/components/navigation/nav-menu.ts","../src/components/disclosure.ts"],"names":["defineComponent","computed","ref","h","onBeforeUnmount","watch"],"mappings":"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","file":"chunk-NKRPZTQA.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, computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'\nimport { clamp } from '@ansh-ui/core'\nimport { type SlotContent, cx, resolveSlotContent, useId } from '../../primitives/utils'\nimport { useControllableState } from '../../primitives/use-controllable-state'\n\n/**\n * Carousel — the Vue counterpart of `@ansh-ui/react`'s `Carousel`.\n *\n * Same markup, same class names, same ARIA. The reasoning behind each decision lives in the React\n * file; the ones that matter for reading this code:\n *\n * - The track is **translated**, not scrolled, so the index stays authoritative and a controlled\n * `v-model` cannot fight a scroll position for control of it.\n * - `aria-live` is `polite` only while idle and `off` while auto-playing, so a screen reader\n * announces changes the user asked for and stays quiet during automatic ones.\n * - Auto-play ships a real pause button, because WCAG 2.2.2 is not satisfied by pause-on-hover.\n * - Off-screen slides are `inert`, or every control inside them sits in the tab order.\n *\n * `v-model` is the active slide index.\n */\nexport const Carousel = defineComponent({\n name: 'AnshCarousel',\n inheritAttrs: false,\n props: {\n items: { type: Array as PropType<readonly SlotContent[]>, required: true },\n modelValue: { type: Number, default: undefined },\n defaultValue: { type: Number, default: 0 },\n /** Wrap past the ends. */\n loop: { type: Boolean, default: true },\n /** Advance on a timer. */\n autoPlay: { type: Boolean, default: false },\n /** Seconds each slide is held when auto-playing. */\n interval: { type: Number, default: 5 },\n showDots: { type: Boolean, default: true },\n showArrows: { type: Boolean, default: true },\n draggable: { type: Boolean, default: true },\n /** Accessible name for the carousel region. */\n label: { type: String, required: true },\n },\n emits: ['update:modelValue'],\n setup(props, { attrs, emit }) {\n const count = computed(() => props.items.length)\n\n const [index, setIndex] = useControllableState(\n () => props.modelValue,\n clamp(props.defaultValue, 0, Math.max(0, props.items.length - 1)),\n (next) => emit('update:modelValue', next),\n )\n\n const paused = ref(false)\n const playing = ref(props.autoPlay)\n const drag = ref(0)\n const dragStart = ref<number | null>(null)\n const viewport = ref<HTMLElement | null>(null)\n const baseId = useId()\n\n // Folded back into range, so an `items` list that shrinks cannot leave the index addressing a\n // slide that no longer exists.\n const active = computed(() => (count.value > 0 ? clamp(index.value, 0, count.value - 1) : 0))\n\n const goTo = (next: number): void => {\n const total = count.value\n if (total === 0) return\n setIndex(props.loop ? (next + total) % total : clamp(next, 0, total - 1))\n }\n\n let timer: number | undefined\n const stopTimer = (): void => {\n if (timer !== undefined) window.clearInterval(timer)\n timer = undefined\n }\n\n const syncTimer = (): void => {\n stopTimer()\n if (!playing.value || paused.value || count.value < 2) return\n const ms = Math.max(1000, props.interval * 1000)\n timer = window.setInterval(() => {\n const next = active.value + 1\n setIndex(props.loop ? next % count.value : Math.min(next, count.value - 1))\n }, ms)\n }\n\n watch([playing, paused, () => props.interval, count, () => props.loop], syncTimer, {\n immediate: true,\n })\n onBeforeUnmount(stopTimer)\n\n const onKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n goTo(active.value - 1)\n } else if (event.key === 'ArrowRight') {\n event.preventDefault()\n goTo(active.value + 1)\n } else if (event.key === 'Home') {\n event.preventDefault()\n goTo(0)\n } else if (event.key === 'End') {\n event.preventDefault()\n goTo(count.value - 1)\n }\n }\n\n const onPointerdown = (event: PointerEvent): void => {\n if (!props.draggable || count.value < 2) return\n dragStart.value = event.clientX\n ;(event.currentTarget as HTMLElement).setPointerCapture(event.pointerId)\n }\n\n const onPointermove = (event: PointerEvent): void => {\n if (dragStart.value === null) return\n drag.value = event.clientX - dragStart.value\n }\n\n const endDrag = (event: PointerEvent): void => {\n if (dragStart.value === null) return\n const target = event.currentTarget as HTMLElement\n if (target.hasPointerCapture(event.pointerId)) target.releasePointerCapture(event.pointerId)\n const width = viewport.value?.clientWidth ?? 1\n const travelled = drag.value\n dragStart.value = null\n drag.value = 0\n // A quarter of the viewport, matching React's commit threshold exactly.\n if (Math.abs(travelled) > width * 0.25) goTo(active.value + (travelled < 0 ? 1 : -1))\n }\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n const total = count.value\n if (total === 0) return null\n\n const current = active.value\n const atStart = !props.loop && current === 0\n const atEnd = !props.loop && current === total - 1\n const dragPercent =\n drag.value !== 0 ? (drag.value / (viewport.value?.clientWidth || 1)) * 100 : 0\n\n const slides = props.items.map((item, i) =>\n h(\n 'div',\n {\n key: i,\n class: 'ansh-carousel__slide',\n id: `${baseId}-slide-${i}`,\n role: 'group',\n 'aria-roledescription': 'slide',\n 'aria-label': `${i + 1} of ${total}`,\n 'aria-hidden': i === current ? undefined : 'true',\n // `''` not `true`: Vue renders `true` as `inert=\"true\"` while React renders\n // `inert=\"\"`. Both are inert to the browser, but the markup-parity contract compares\n // serialised HTML, so they have to agree exactly.\n inert: i === current ? undefined : '',\n },\n [resolveSlotContent(item)],\n ),\n )\n\n const arrows =\n props.showArrows && total > 1\n ? [\n h(\n 'button',\n {\n type: 'button',\n class: 'ansh-carousel__arrow ansh-carousel__arrow--prev',\n disabled: atStart,\n 'aria-label': 'Previous slide',\n onClick: () => goTo(current - 1),\n },\n '‹',\n ),\n h(\n 'button',\n {\n type: 'button',\n class: 'ansh-carousel__arrow ansh-carousel__arrow--next',\n disabled: atEnd,\n 'aria-label': 'Next slide',\n onClick: () => goTo(current + 1),\n },\n '›',\n ),\n ]\n : []\n\n const controlChildren = []\n if (props.autoPlay) {\n controlChildren.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'ansh-carousel__pause',\n 'aria-label': playing.value ? 'Pause carousel' : 'Play carousel',\n onClick: () => {\n playing.value = !playing.value\n },\n },\n playing.value ? '❚❚' : '▶',\n ),\n )\n }\n if (props.showDots && total > 1) {\n controlChildren.push(\n h(\n 'div',\n { class: 'ansh-carousel__dots' },\n props.items.map((_, i) =>\n h('button', {\n key: i,\n type: 'button',\n class: 'ansh-carousel__dot',\n 'aria-label': `Go to slide ${i + 1}`,\n 'aria-current': i === current ? 'true' : undefined,\n onClick: () => goTo(i),\n }),\n ),\n ),\n )\n }\n\n return h(\n 'section',\n {\n ...restAttrs,\n class: cx('ansh-carousel', attrClass as string),\n 'aria-roledescription': 'carousel',\n 'aria-label': props.label,\n onKeydown,\n onPointerenter: () => {\n paused.value = true\n },\n onPointerleave: () => {\n paused.value = false\n },\n onFocusin: () => {\n paused.value = true\n },\n onFocusout: () => {\n paused.value = false\n },\n },\n [\n h(\n 'div',\n {\n class: 'ansh-carousel__viewport',\n ref: viewport,\n 'aria-live': playing.value ? 'off' : 'polite',\n 'data-dragging': dragStart.value !== null ? '' : undefined,\n onPointerdown,\n onPointermove,\n onPointerup: endDrag,\n onPointercancel: endDrag,\n },\n [\n h(\n 'div',\n {\n class: 'ansh-carousel__track',\n style: {\n transform: `translate3d(${-current * 100 + dragPercent}%, 0, 0)`,\n transition: dragStart.value !== null ? 'none' : undefined,\n },\n },\n slides,\n ),\n ],\n ),\n ...arrows,\n controlChildren.length > 0\n ? h('div', { class: 'ansh-carousel__controls' }, controlChildren)\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"]}
@@ -4,6 +4,7 @@ var chunk774WBLDR_cjs = require('./chunk-774WBLDR.cjs');
4
4
  var chunk6732H4BQ_cjs = require('./chunk-6732H4BQ.cjs');
5
5
  var vue = require('vue');
6
6
 
7
+ // src/components/layout/shared.ts
7
8
  function space(value) {
8
9
  if (value === void 0) return void 0;
9
10
  if (typeof value === "string") return value;
@@ -13,6 +14,8 @@ function splitAttrs(attrs) {
13
14
  const { class: attrClass, style: attrStyle, ...rest } = attrs;
14
15
  return { class: attrClass ?? "", style: attrStyle, rest };
15
16
  }
17
+
18
+ // src/components/layout/stack.ts
16
19
  function stackProps() {
17
20
  return {
18
21
  as: { type: String, default: "div" },
@@ -576,5 +579,5 @@ exports.ScrollArea = ScrollArea;
576
579
  exports.Spacer = Spacer;
577
580
  exports.Stack = Stack;
578
581
  exports.VStack = VStack;
579
- //# sourceMappingURL=chunk-JQ4YLXXM.cjs.map
580
- //# sourceMappingURL=chunk-JQ4YLXXM.cjs.map
582
+ //# sourceMappingURL=chunk-PNR4RQ4T.cjs.map
583
+ //# sourceMappingURL=chunk-PNR4RQ4T.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/layout/shared.ts","../src/components/layout/stack.ts","../src/components/layout/grid.ts","../src/components/layout/container.ts","../src/components/layout/divider.ts","../src/components/layout/spacer.ts","../src/components/layout/center.ts","../src/components/layout/aspect-ratio.ts","../src/components/layout/scroll-area.ts","../src/components/layout/resizable.ts"],"names":["defineComponent","ref","h","cx","resolveSlotContent","Comment","Text","useControllableState"],"mappings":"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","file":"chunk-PNR4RQ4T.cjs","sourcesContent":["/**\n * Layout primitives — the Vue counterpart of `@ansh-ui/react`'s layout components.\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 for\n * the genuine one-off, but the type nudges toward the scale first.\n *\n * Every component here declares only its own props and renders with `inheritAttrs: false` plus a\n * manual `class`/`style`/rest spread, so native attributes not declared as props (`id`, `data-*`, a\n * `@click` listener) fall through onto the rendered element automatically — the same convention\n * `Input` and `PopoverContent` use elsewhere in this package.\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\n/**\n * A CSS `align-items`/`justify-content` value, typed as a plain string rather than\n * `CSSProperties['alignItems']`/`['justifyContent']`.\n *\n * The indexed-access csstype type is structurally correct but not **portable**: embedding it in an\n * exported component's props makes TypeScript's declaration emitter need to name an internal\n * `csstype` package type by its pnpm store path, which a consumer's project can't resolve and fails\n * the build with TS2742 (\"cannot be named without a reference to .pnpm/csstype@.../csstype\"). A\n * plain string loses autocomplete for the handful of valid values; the runtime behaviour — the\n * string flows straight into the style property — is identical.\n */\nexport type FlexAlign = string\n\nexport function 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\n/** Split `attrs` into the pieces every component here re-merges by hand. */\nexport function splitAttrs(attrs: Record<string, unknown>): {\n class: string\n style: unknown\n rest: Record<string, unknown>\n} {\n const { class: attrClass, style: attrStyle, ...rest } = attrs\n return { class: (attrClass as string | undefined) ?? '', style: attrStyle, rest }\n}\n","import { type CSSProperties, type PropType, defineComponent, h, ref } from 'vue'\nimport { cx } from '../../primitives/utils'\nimport { type FlexAlign, type SpaceToken, space, splitAttrs } from './shared'\n\nexport interface StackProps {\n as?: string\n /** Default `'vertical'` — the direction that needs a helper more often. */\n direction?: 'horizontal' | 'vertical'\n gap?: SpaceToken\n align?: FlexAlign\n justify?: FlexAlign\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\nfunction stackProps() {\n return {\n as: { type: String, default: 'div' },\n gap: { type: [Number, String] as PropType<SpaceToken>, default: 4 },\n align: { type: String as PropType<FlexAlign>, default: undefined },\n justify: { type: String as PropType<FlexAlign>, default: undefined },\n wrap: { type: Boolean, default: false },\n stretch: { type: Boolean, default: false },\n divide: { type: Boolean, default: false },\n }\n}\n\nfunction stackStyle(\n direction: 'horizontal' | 'vertical',\n props: {\n gap: SpaceToken\n align?: FlexAlign\n justify?: FlexAlign\n wrap: boolean\n stretch: boolean\n },\n): CSSProperties {\n return {\n display: 'flex',\n flexDirection: direction === 'horizontal' ? 'row' : 'column',\n gap: space(props.gap),\n // Cast at the point of use, not in the public prop type — see the `FlexAlign` doc comment.\n alignItems: (props.align ??\n (props.stretch ? 'stretch' : undefined)) as CSSProperties['alignItems'],\n justifyContent: props.justify as CSSProperties['justifyContent'],\n flexWrap: props.wrap ? 'wrap' : undefined,\n }\n}\n\n/**\n * One-dimensional flex layout.\n *\n * ```vue\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 = defineComponent({\n name: 'AnshStack',\n inheritAttrs: false,\n props: {\n ...stackProps(),\n direction: { type: String as PropType<'horizontal' | 'vertical'>, default: 'vertical' },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-stack', props.divide && 'ansh-stack--divide', attrClass),\n 'data-direction': props.direction,\n style: [stackStyle(props.direction, props), attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n/** Horizontal `Stack`, for readability at call sites. */\nexport const HStack = defineComponent({\n name: 'AnshHStack',\n inheritAttrs: false,\n props: stackProps(),\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-stack', props.divide && 'ansh-stack--divide', attrClass),\n 'data-direction': 'horizontal',\n style: [stackStyle('horizontal', props), attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\n/** Vertical `Stack`, for symmetry with `HStack`. */\nexport const VStack = defineComponent({\n name: 'AnshVStack',\n inheritAttrs: false,\n props: stackProps(),\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-stack', props.divide && 'ansh-stack--divide', attrClass),\n 'data-direction': 'vertical',\n style: [stackStyle('vertical', props), attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n","import { type PropType, defineComponent, h, ref } from 'vue'\nimport { cx } from '../../primitives/utils'\nimport { type FlexAlign, type SpaceToken, space, splitAttrs } from './shared'\n\nexport interface GridProps {\n as?: string\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?: FlexAlign\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 = defineComponent({\n name: 'AnshGrid',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n columns: { type: [Number, String] as PropType<number | 'auto'>, default: 'auto' },\n minColumnWidth: { type: String, default: '16rem' },\n gap: { type: [Number, String] as PropType<SpaceToken>, default: 4 },\n rowGap: { type: [Number, String] as PropType<SpaceToken>, default: undefined },\n align: { type: String as PropType<FlexAlign>, default: undefined },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-grid', attrClass),\n style: [\n {\n display: 'grid',\n gridTemplateColumns:\n props.columns === 'auto'\n ? `repeat(auto-fill, minmax(min(${props.minColumnWidth}, 100%), 1fr))`\n : `repeat(${props.columns}, minmax(0, 1fr))`,\n gap: space(props.gap),\n rowGap: space(props.rowGap),\n alignItems: props.align,\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n\nexport interface GridItemProps {\n as?: string\n /** Columns to span. `'full'` spans the whole row. */\n span?: number | 'full'\n rowSpan?: number\n}\n\nexport const GridItem = defineComponent({\n name: 'AnshGridItem',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n span: { type: [Number, String] as PropType<number | 'full'>, default: undefined },\n rowSpan: { type: Number, default: undefined },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: attrClass,\n style: [\n {\n gridColumn:\n props.span === 'full'\n ? '1 / -1'\n : props.span\n ? `span ${props.span} / span ${props.span}`\n : undefined,\n gridRow: props.rowSpan ? `span ${props.rowSpan} / span ${props.rowSpan}` : undefined,\n // `minWidth: 0` on every grid child. Without it a child containing a long unbroken\n // string or a table refuses to shrink below its content width and blows out the track.\n minWidth: 0,\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n","import { type PropType, defineComponent, h, ref } from 'vue'\nimport { cx } from '../../primitives/utils'\nimport { type SpaceToken, space, splitAttrs } from './shared'\n\nexport interface ContainerProps {\n as?: string\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 = defineComponent({\n name: 'AnshContainer',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n size: { type: String as PropType<'sm' | 'md' | 'lg' | 'xl' | 'full'>, default: 'lg' },\n padding: { type: [Number, String] as PropType<SpaceToken>, default: 6 },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-container', attrClass),\n style: [\n {\n width: '100%',\n maxWidth: CONTAINER_WIDTH[props.size],\n marginInline: 'auto',\n paddingInline: space(props.padding),\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n","import { type PropType, defineComponent, h } from 'vue'\nimport { type SlotContent, cx, resolveSlotContent } from '../../primitives/utils'\nimport { splitAttrs } from './shared'\n\nexport interface DividerProps {\n orientation?: 'horizontal' | 'vertical'\n /** Optional label rendered in the middle of the rule. */\n label?: SlotContent\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 *\n * Renders a plain `<div>` regardless of what `as` a caller might pass, matching\n * `@ansh-ui/react`'s `Divider` — which declares `as` on its props type via `BaseProps` but never\n * actually reads it, always rendering a literal `<div>`. Not declaring `as` here reproduces that\n * quirk exactly: an `as` attribute would simply fall through as an inert HTML attribute, same as it\n * does in React.\n */\nexport const Divider = defineComponent({\n name: 'AnshDivider',\n inheritAttrs: false,\n props: {\n orientation: { type: String as PropType<'horizontal' | 'vertical'>, default: 'horizontal' },\n label: { type: [String, Object, Function] as PropType<SlotContent>, default: undefined },\n },\n setup(props, { attrs }) {\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n\n if (props.label !== undefined) {\n return h(\n 'div',\n {\n class: cx('ansh-divider', 'ansh-divider--labelled', attrClass),\n style: attrStyle,\n ...rest,\n },\n [\n h('span', { class: 'ansh-divider__line' }),\n h('span', { class: 'ansh-divider__label' }, [resolveSlotContent(props.label)]),\n h('span', { class: 'ansh-divider__line' }),\n ],\n )\n }\n\n return h('div', {\n role: 'separator',\n 'aria-orientation': props.orientation,\n class: cx('ansh-divider', `ansh-divider--${props.orientation}`, attrClass),\n style: attrStyle,\n ...rest,\n })\n }\n },\n})\n","import { type PropType, defineComponent, h } from 'vue'\nimport { type SpaceToken, space } from './shared'\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 const Spacer = defineComponent({\n name: 'AnshSpacer',\n props: {\n size: { type: [Number, String] as PropType<SpaceToken>, default: undefined },\n grow: { type: Boolean, default: false },\n },\n setup(props) {\n return () =>\n h('span', {\n 'aria-hidden': 'true',\n style: {\n display: 'block',\n flexGrow: props.grow ? 1 : 0,\n flexShrink: 0,\n ...(props.size !== undefined\n ? { width: space(props.size), height: space(props.size) }\n : null),\n },\n })\n },\n})\n","import { defineComponent, h, ref } from 'vue'\nimport { splitAttrs } from './shared'\n\nexport interface CenterProps {\n as?: string\n}\n\n/** Centre a child on both axes. */\nexport const Center = defineComponent({\n name: 'AnshCenter',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: attrClass,\n style: [{ display: 'grid', placeItems: 'center' }, attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n","import { defineComponent, h, ref } from 'vue'\nimport { cx } from '../../primitives/utils'\nimport { splitAttrs } from './shared'\n\nexport interface AspectRatioProps {\n as?: string\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 = defineComponent({\n name: 'AnshAspectRatio',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n ratio: { type: Number, default: 16 / 9 },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-aspect', attrClass),\n style: [{ aspectRatio: String(props.ratio) }, attrStyle],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n","import { type PropType, defineComponent, h, ref } from 'vue'\nimport { cx } from '../../primitives/utils'\nimport { splitAttrs } from './shared'\n\nexport interface ScrollAreaProps {\n as?: string\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 = defineComponent({\n name: 'AnshScrollArea',\n inheritAttrs: false,\n props: {\n as: { type: String, default: 'div' },\n maxHeight: { type: String, default: undefined },\n axis: { type: String as PropType<'y' | 'x' | 'both'>, default: 'y' },\n fade: { type: Boolean, default: true },\n },\n setup(props, { attrs, slots, expose }) {\n const el = ref<HTMLElement | null>(null)\n expose({\n get element() {\n return el.value\n },\n })\n\n return () => {\n const {\n class: attrClass,\n style: attrStyle,\n rest,\n } = splitAttrs(attrs as Record<string, unknown>)\n return h(\n props.as,\n {\n ref: el,\n class: cx('ansh-scroll', props.fade && 'ansh-scroll--fade', attrClass),\n 'data-axis': props.axis,\n style: [\n {\n maxHeight: props.maxHeight,\n overflowY: props.axis === 'x' ? 'hidden' : 'auto',\n overflowX: props.axis === 'y' ? 'hidden' : 'auto',\n },\n attrStyle,\n ],\n ...rest,\n },\n slots.default?.(),\n )\n }\n },\n})\n","import { Comment, type PropType, Text, type VNode, defineComponent, h, ref } from 'vue'\nimport { cx } from '../../primitives/utils'\nimport { useControllableState } from '../../primitives/use-controllable-state'\n\n/**\n * A two-pane split with a draggable divider — the Vue counterpart of `@ansh-ui/react`'s `Resizable`.\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 move\n * it in 2% steps — WAI-ARIA calls this a window splitter and it is a documented pattern, not an\n * 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 Vue's renderer: a re-render per\n * pointer move makes the drag feel heavy on a complex page, and the value is only committed to state\n * on release.\n *\n * `size`/`update:size` follow this package's controlled-prop convention (see `Popover`'s\n * `open`/`update:open`), so `v-model:size` works for the controlled case; `onSizeChange` from the\n * React version becomes the `update:size` emit.\n */\n\nexport interface ResizableProps {\n direction?: 'horizontal' | 'vertical'\n /** First pane's size as a percentage, `0`–`100`. Default `50`. */\n defaultSize?: number\n size?: number\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 /** Accessible name for the handle — \"Resize sidebar\", not \"Resize\". */\n label?: string\n}\n\n/** Drop whitespace-only text nodes and `v-if=\"false\"` comment placeholders from a slot's output. */\nfunction normalizeChildren(nodes: VNode[] | undefined): VNode[] {\n return (nodes ?? []).filter((node) => {\n if (node.type === Comment) return false\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '') {\n return false\n }\n return true\n })\n}\n\nexport const Resizable = defineComponent({\n name: 'AnshResizable',\n inheritAttrs: false,\n props: {\n direction: { type: String as PropType<'horizontal' | 'vertical'>, default: 'horizontal' },\n defaultSize: { type: Number, default: 50 },\n size: { type: Number, default: undefined },\n minSize: { type: Number, default: 10 },\n maxSize: { type: Number, default: 90 },\n snapPoints: { type: Array as PropType<readonly number[]>, default: undefined },\n label: { type: String, default: 'Resize panes' },\n },\n emits: ['update:size'],\n setup(props, { attrs, slots, emit, expose }) {\n const [value, setValue] = useControllableState<number>(\n () => props.size,\n props.defaultSize,\n (next) => emit('update:size', next),\n )\n\n const containerRef = ref<HTMLDivElement | null>(null)\n const dragging = ref(false)\n\n expose({\n get element() {\n return containerRef.value\n },\n })\n\n const clamp = (next: number): number => {\n let result = Math.min(Math.max(next, props.minSize), props.maxSize)\n if (props.snapPoints) {\n for (const point of props.snapPoints) {\n if (Math.abs(result - point) < 3) {\n result = point\n break\n }\n }\n }\n return result\n }\n\n const onPointerdown = (event: PointerEvent): void => {\n const container = containerRef.value\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 as HTMLElement).setPointerCapture(event.pointerId)\n dragging.value = true\n\n let latest = value.value\n\n const onMove = (moveEvent: PointerEvent): void => {\n const rect = container.getBoundingClientRect()\n const fraction =\n props.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. Vue state is updated once, on release.\n container.style.setProperty('--ansh-split', `${latest}%`)\n }\n\n const onUp = (): void => {\n dragging.value = 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: KeyboardEvent): void => {\n const step = event.shiftKey ? 10 : 2\n const forward = props.direction === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n const backward = props.direction === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n\n let next: number | null = null\n if (event.key === forward) next = value.value + step\n else if (event.key === backward) next = value.value - step\n else if (event.key === 'Home') next = props.minSize\n else if (event.key === 'End') next = props.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.value <= props.minSize + 1 ? 50 : props.minSize\n\n if (next === null) return\n event.preventDefault()\n setValue(clamp(next))\n }\n\n return () => {\n const { class: attrClass, ...restAttrs } = attrs as Record<string, unknown>\n const panes = normalizeChildren(slots.default?.())\n\n return h(\n 'div',\n {\n ref: containerRef,\n class: cx(\n 'ansh-split',\n `ansh-split--${props.direction}`,\n dragging.value && 'ansh-split--dragging',\n attrClass as string,\n ),\n // Reactive on every render, mirroring the React version's `style` prop — kept in sync\n // outside a drag, when the pointer handler above is the one writing it directly.\n style: { ['--ansh-split' as string]: `${value.value}%` },\n ...restAttrs,\n },\n [\n h('div', { class: 'ansh-split__pane' }, [panes[0]]),\n\n h(\n 'div',\n {\n role: 'separator',\n tabindex: 0,\n 'aria-label': props.label,\n 'aria-orientation': props.direction === 'horizontal' ? 'vertical' : 'horizontal',\n 'aria-valuenow': Math.round(value.value),\n 'aria-valuemin': props.minSize,\n 'aria-valuemax': props.maxSize,\n class: 'ansh-split__handle ansh-focusable',\n onPointerdown,\n onKeydown,\n // Double-click resets to centre. Undocumented in the UI but universally expected, and\n // harmless to discover by accident.\n onDblclick: () => setValue(50),\n },\n [h('span', { class: 'ansh-split__grip', 'aria-hidden': 'true' })],\n ),\n\n h('div', { class: 'ansh-split__pane' }, [panes[1]]),\n ],\n )\n }\n },\n})\n"]}