@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,9 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkEISHOEB6_cjs = require('./chunk-EISHOEB6.cjs');
3
+ var chunkMWGVDY6K_cjs = require('./chunk-MWGVDY6K.cjs');
4
4
  var chunk774WBLDR_cjs = require('./chunk-774WBLDR.cjs');
5
5
  var chunk6732H4BQ_cjs = require('./chunk-6732H4BQ.cjs');
6
6
  var vue = require('vue');
7
+ var core = require('@ansh-ui/core');
7
8
 
8
9
  var Tabs = vue.defineComponent({
9
10
  name: "AnshTabs",
@@ -45,7 +46,7 @@ var Tabs = vue.defineComponent({
45
46
  const id = enabledIds.value[position];
46
47
  if (id !== void 0 && props.activateOnFocus) setActive(id);
47
48
  };
48
- const onKeydown = chunkEISHOEB6_cjs.useRovingFocus({
49
+ const onKeydown = chunkMWGVDY6K_cjs.useRovingFocus({
49
50
  items: tabRefs,
50
51
  active: () => enabledIds.value.indexOf(active.value),
51
52
  onActiveChange: onRovingActiveChange,
@@ -132,6 +133,238 @@ var Tabs = vue.defineComponent({
132
133
  };
133
134
  }
134
135
  });
136
+ var Carousel = vue.defineComponent({
137
+ name: "AnshCarousel",
138
+ inheritAttrs: false,
139
+ props: {
140
+ items: { type: Array, required: true },
141
+ modelValue: { type: Number, default: void 0 },
142
+ defaultValue: { type: Number, default: 0 },
143
+ /** Wrap past the ends. */
144
+ loop: { type: Boolean, default: true },
145
+ /** Advance on a timer. */
146
+ autoPlay: { type: Boolean, default: false },
147
+ /** Seconds each slide is held when auto-playing. */
148
+ interval: { type: Number, default: 5 },
149
+ showDots: { type: Boolean, default: true },
150
+ showArrows: { type: Boolean, default: true },
151
+ draggable: { type: Boolean, default: true },
152
+ /** Accessible name for the carousel region. */
153
+ label: { type: String, required: true }
154
+ },
155
+ emits: ["update:modelValue"],
156
+ setup(props, { attrs, emit }) {
157
+ const count = vue.computed(() => props.items.length);
158
+ const [index, setIndex] = chunk774WBLDR_cjs.useControllableState(
159
+ () => props.modelValue,
160
+ core.clamp(props.defaultValue, 0, Math.max(0, props.items.length - 1)),
161
+ (next) => emit("update:modelValue", next)
162
+ );
163
+ const paused = vue.ref(false);
164
+ const playing = vue.ref(props.autoPlay);
165
+ const drag = vue.ref(0);
166
+ const dragStart = vue.ref(null);
167
+ const viewport = vue.ref(null);
168
+ const baseId = chunk6732H4BQ_cjs.useId();
169
+ const active = vue.computed(() => count.value > 0 ? core.clamp(index.value, 0, count.value - 1) : 0);
170
+ const goTo = (next) => {
171
+ const total = count.value;
172
+ if (total === 0) return;
173
+ setIndex(props.loop ? (next + total) % total : core.clamp(next, 0, total - 1));
174
+ };
175
+ let timer;
176
+ const stopTimer = () => {
177
+ if (timer !== void 0) window.clearInterval(timer);
178
+ timer = void 0;
179
+ };
180
+ const syncTimer = () => {
181
+ stopTimer();
182
+ if (!playing.value || paused.value || count.value < 2) return;
183
+ const ms = Math.max(1e3, props.interval * 1e3);
184
+ timer = window.setInterval(() => {
185
+ const next = active.value + 1;
186
+ setIndex(props.loop ? next % count.value : Math.min(next, count.value - 1));
187
+ }, ms);
188
+ };
189
+ vue.watch([playing, paused, () => props.interval, count, () => props.loop], syncTimer, {
190
+ immediate: true
191
+ });
192
+ vue.onBeforeUnmount(stopTimer);
193
+ const onKeydown = (event) => {
194
+ if (event.key === "ArrowLeft") {
195
+ event.preventDefault();
196
+ goTo(active.value - 1);
197
+ } else if (event.key === "ArrowRight") {
198
+ event.preventDefault();
199
+ goTo(active.value + 1);
200
+ } else if (event.key === "Home") {
201
+ event.preventDefault();
202
+ goTo(0);
203
+ } else if (event.key === "End") {
204
+ event.preventDefault();
205
+ goTo(count.value - 1);
206
+ }
207
+ };
208
+ const onPointerdown = (event) => {
209
+ if (!props.draggable || count.value < 2) return;
210
+ dragStart.value = event.clientX;
211
+ event.currentTarget.setPointerCapture(event.pointerId);
212
+ };
213
+ const onPointermove = (event) => {
214
+ if (dragStart.value === null) return;
215
+ drag.value = event.clientX - dragStart.value;
216
+ };
217
+ const endDrag = (event) => {
218
+ if (dragStart.value === null) return;
219
+ const target = event.currentTarget;
220
+ if (target.hasPointerCapture(event.pointerId)) target.releasePointerCapture(event.pointerId);
221
+ const width = viewport.value?.clientWidth ?? 1;
222
+ const travelled = drag.value;
223
+ dragStart.value = null;
224
+ drag.value = 0;
225
+ if (Math.abs(travelled) > width * 0.25) goTo(active.value + (travelled < 0 ? 1 : -1));
226
+ };
227
+ return () => {
228
+ const { class: attrClass, ...restAttrs } = attrs;
229
+ const total = count.value;
230
+ if (total === 0) return null;
231
+ const current = active.value;
232
+ const atStart = !props.loop && current === 0;
233
+ const atEnd = !props.loop && current === total - 1;
234
+ const dragPercent = drag.value !== 0 ? drag.value / (viewport.value?.clientWidth || 1) * 100 : 0;
235
+ const slides = props.items.map(
236
+ (item, i) => vue.h(
237
+ "div",
238
+ {
239
+ key: i,
240
+ class: "ansh-carousel__slide",
241
+ id: `${baseId}-slide-${i}`,
242
+ role: "group",
243
+ "aria-roledescription": "slide",
244
+ "aria-label": `${i + 1} of ${total}`,
245
+ "aria-hidden": i === current ? void 0 : "true",
246
+ // `''` not `true`: Vue renders `true` as `inert="true"` while React renders
247
+ // `inert=""`. Both are inert to the browser, but the markup-parity contract compares
248
+ // serialised HTML, so they have to agree exactly.
249
+ inert: i === current ? void 0 : ""
250
+ },
251
+ [chunk6732H4BQ_cjs.resolveSlotContent(item)]
252
+ )
253
+ );
254
+ const arrows = props.showArrows && total > 1 ? [
255
+ vue.h(
256
+ "button",
257
+ {
258
+ type: "button",
259
+ class: "ansh-carousel__arrow ansh-carousel__arrow--prev",
260
+ disabled: atStart,
261
+ "aria-label": "Previous slide",
262
+ onClick: () => goTo(current - 1)
263
+ },
264
+ "\u2039"
265
+ ),
266
+ vue.h(
267
+ "button",
268
+ {
269
+ type: "button",
270
+ class: "ansh-carousel__arrow ansh-carousel__arrow--next",
271
+ disabled: atEnd,
272
+ "aria-label": "Next slide",
273
+ onClick: () => goTo(current + 1)
274
+ },
275
+ "\u203A"
276
+ )
277
+ ] : [];
278
+ const controlChildren = [];
279
+ if (props.autoPlay) {
280
+ controlChildren.push(
281
+ vue.h(
282
+ "button",
283
+ {
284
+ type: "button",
285
+ class: "ansh-carousel__pause",
286
+ "aria-label": playing.value ? "Pause carousel" : "Play carousel",
287
+ onClick: () => {
288
+ playing.value = !playing.value;
289
+ }
290
+ },
291
+ playing.value ? "\u275A\u275A" : "\u25B6"
292
+ )
293
+ );
294
+ }
295
+ if (props.showDots && total > 1) {
296
+ controlChildren.push(
297
+ vue.h(
298
+ "div",
299
+ { class: "ansh-carousel__dots" },
300
+ props.items.map(
301
+ (_, i) => vue.h("button", {
302
+ key: i,
303
+ type: "button",
304
+ class: "ansh-carousel__dot",
305
+ "aria-label": `Go to slide ${i + 1}`,
306
+ "aria-current": i === current ? "true" : void 0,
307
+ onClick: () => goTo(i)
308
+ })
309
+ )
310
+ )
311
+ );
312
+ }
313
+ return vue.h(
314
+ "section",
315
+ {
316
+ ...restAttrs,
317
+ class: chunk6732H4BQ_cjs.cx("ansh-carousel", attrClass),
318
+ "aria-roledescription": "carousel",
319
+ "aria-label": props.label,
320
+ onKeydown,
321
+ onPointerenter: () => {
322
+ paused.value = true;
323
+ },
324
+ onPointerleave: () => {
325
+ paused.value = false;
326
+ },
327
+ onFocusin: () => {
328
+ paused.value = true;
329
+ },
330
+ onFocusout: () => {
331
+ paused.value = false;
332
+ }
333
+ },
334
+ [
335
+ vue.h(
336
+ "div",
337
+ {
338
+ class: "ansh-carousel__viewport",
339
+ ref: viewport,
340
+ "aria-live": playing.value ? "off" : "polite",
341
+ "data-dragging": dragStart.value !== null ? "" : void 0,
342
+ onPointerdown,
343
+ onPointermove,
344
+ onPointerup: endDrag,
345
+ onPointercancel: endDrag
346
+ },
347
+ [
348
+ vue.h(
349
+ "div",
350
+ {
351
+ class: "ansh-carousel__track",
352
+ style: {
353
+ transform: `translate3d(${-current * 100 + dragPercent}%, 0, 0)`,
354
+ transition: dragStart.value !== null ? "none" : void 0
355
+ }
356
+ },
357
+ slides
358
+ )
359
+ ]
360
+ ),
361
+ ...arrows,
362
+ controlChildren.length > 0 ? vue.h("div", { class: "ansh-carousel__controls" }, controlChildren) : null
363
+ ]
364
+ );
365
+ };
366
+ }
367
+ });
135
368
  var Breadcrumbs = vue.defineComponent({
136
369
  name: "AnshBreadcrumbs",
137
370
  inheritAttrs: false,
@@ -611,7 +844,7 @@ var Accordion = vue.defineComponent({
611
844
  setOpenIds(props.multiple ? [...openIds.value, id] : [id]);
612
845
  }
613
846
  };
614
- const onKeydown = chunkEISHOEB6_cjs.useRovingFocus({
847
+ const onKeydown = chunkMWGVDY6K_cjs.useRovingFocus({
615
848
  items: headerRefs,
616
849
  // There is no single "active" header the way `Tabs` has a selected tab — arrow keys move
617
850
  // relative to whichever header currently owns focus.
@@ -772,10 +1005,11 @@ var DisclosureList = vue.defineComponent({
772
1005
 
773
1006
  exports.Accordion = Accordion;
774
1007
  exports.Breadcrumbs = Breadcrumbs;
1008
+ exports.Carousel = Carousel;
775
1009
  exports.Collapsible = Collapsible;
776
1010
  exports.DisclosureList = DisclosureList;
777
1011
  exports.NavigationMenu = NavigationMenu;
778
1012
  exports.Stepper = Stepper;
779
1013
  exports.Tabs = Tabs;
780
- //# sourceMappingURL=chunk-KCA7RNJ4.cjs.map
781
- //# sourceMappingURL=chunk-KCA7RNJ4.cjs.map
1014
+ //# sourceMappingURL=chunk-IHH6KMBY.cjs.map
1015
+ //# sourceMappingURL=chunk-IHH6KMBY.cjs.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","useControllableState","useId","ref","computed","useRovingFocus","h","cx","resolveSlotContent","clamp","watch","onBeforeUnmount"],"mappings":"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","file":"chunk-IHH6KMBY.cjs","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"]}