@ansh-ui/vue 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-2VSROZ2N.js +1281 -0
  3. package/dist/chunk-2VSROZ2N.js.map +1 -0
  4. package/dist/chunk-5BQEZYG6.cjs +1294 -0
  5. package/dist/chunk-5BQEZYG6.cjs.map +1 -0
  6. package/dist/chunk-6732H4BQ.cjs +28 -0
  7. package/dist/chunk-6732H4BQ.cjs.map +1 -0
  8. package/dist/chunk-6ABPGOJP.js +722 -0
  9. package/dist/chunk-6ABPGOJP.js.map +1 -0
  10. package/dist/chunk-6XJOB6LE.js +62 -0
  11. package/dist/chunk-6XJOB6LE.js.map +1 -0
  12. package/dist/chunk-774WBLDR.cjs +24 -0
  13. package/dist/chunk-774WBLDR.cjs.map +1 -0
  14. package/dist/chunk-B6OXKW5Q.js +567 -0
  15. package/dist/chunk-B6OXKW5Q.js.map +1 -0
  16. package/dist/chunk-DMPNT3MY.cjs +64 -0
  17. package/dist/chunk-DMPNT3MY.cjs.map +1 -0
  18. package/dist/chunk-EISHOEB6.cjs +158 -0
  19. package/dist/chunk-EISHOEB6.cjs.map +1 -0
  20. package/dist/chunk-EVO23GUS.js +223 -0
  21. package/dist/chunk-EVO23GUS.js.map +1 -0
  22. package/dist/chunk-FVKLCGA4.js +1035 -0
  23. package/dist/chunk-FVKLCGA4.js.map +1 -0
  24. package/dist/chunk-IOXGBPOV.cjs +3681 -0
  25. package/dist/chunk-IOXGBPOV.cjs.map +1 -0
  26. package/dist/chunk-J2LA4GRP.cjs +1051 -0
  27. package/dist/chunk-J2LA4GRP.cjs.map +1 -0
  28. package/dist/chunk-JQ4YLXXM.cjs +580 -0
  29. package/dist/chunk-JQ4YLXXM.cjs.map +1 -0
  30. package/dist/chunk-KCA7RNJ4.cjs +781 -0
  31. package/dist/chunk-KCA7RNJ4.cjs.map +1 -0
  32. package/dist/chunk-NJDDNO4C.js +23 -0
  33. package/dist/chunk-NJDDNO4C.js.map +1 -0
  34. package/dist/chunk-OAQ7MDYX.js +22 -0
  35. package/dist/chunk-OAQ7MDYX.js.map +1 -0
  36. package/dist/chunk-PP6OYURM.cjs +238 -0
  37. package/dist/chunk-PP6OYURM.cjs.map +1 -0
  38. package/dist/chunk-SHX2JGID.cjs +269 -0
  39. package/dist/chunk-SHX2JGID.cjs.map +1 -0
  40. package/dist/chunk-SOYRICHU.js +3645 -0
  41. package/dist/chunk-SOYRICHU.js.map +1 -0
  42. package/dist/chunk-T425FIC7.js +773 -0
  43. package/dist/chunk-T425FIC7.js.map +1 -0
  44. package/dist/chunk-TMG3M6TK.js +152 -0
  45. package/dist/chunk-TMG3M6TK.js.map +1 -0
  46. package/dist/chunk-XLLSS464.cjs +286 -0
  47. package/dist/chunk-XLLSS464.cjs.map +1 -0
  48. package/dist/chunk-XZ5ZFLZM.js +280 -0
  49. package/dist/chunk-XZ5ZFLZM.js.map +1 -0
  50. package/dist/chunk-Z7XOFKM4.cjs +733 -0
  51. package/dist/chunk-Z7XOFKM4.cjs.map +1 -0
  52. package/dist/chunk-ZGMXOMCB.js +266 -0
  53. package/dist/chunk-ZGMXOMCB.js.map +1 -0
  54. package/dist/data.cjs +70 -0
  55. package/dist/data.cjs.map +1 -0
  56. package/dist/data.d.cts +963 -0
  57. package/dist/data.d.ts +963 -0
  58. package/dist/data.js +5 -0
  59. package/dist/data.js.map +1 -0
  60. package/dist/form.cjs +151 -0
  61. package/dist/form.cjs.map +1 -0
  62. package/dist/form.d.cts +2639 -0
  63. package/dist/form.d.ts +2639 -0
  64. package/dist/form.js +6 -0
  65. package/dist/form.js.map +1 -0
  66. package/dist/index.cjs +1158 -0
  67. package/dist/index.cjs.map +1 -0
  68. package/dist/index.d.cts +439 -0
  69. package/dist/index.d.ts +439 -0
  70. package/dist/index.js +547 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/layout.cjs +67 -0
  73. package/dist/layout.cjs.map +1 -0
  74. package/dist/layout.d.cts +729 -0
  75. package/dist/layout.d.ts +729 -0
  76. package/dist/layout.js +6 -0
  77. package/dist/layout.js.map +1 -0
  78. package/dist/motion.cjs +50 -0
  79. package/dist/motion.cjs.map +1 -0
  80. package/dist/motion.d.cts +681 -0
  81. package/dist/motion.d.ts +681 -0
  82. package/dist/motion.js +5 -0
  83. package/dist/motion.js.map +1 -0
  84. package/dist/navigation.cjs +48 -0
  85. package/dist/navigation.cjs.map +1 -0
  86. package/dist/navigation.d.cts +515 -0
  87. package/dist/navigation.d.ts +515 -0
  88. package/dist/navigation.js +7 -0
  89. package/dist/navigation.js.map +1 -0
  90. package/dist/overlay.cjs +61 -0
  91. package/dist/overlay.cjs.map +1 -0
  92. package/dist/overlay.d.cts +772 -0
  93. package/dist/overlay.d.ts +772 -0
  94. package/dist/overlay.js +8 -0
  95. package/dist/overlay.js.map +1 -0
  96. package/dist/position-Cn7qP1pn.d.cts +50 -0
  97. package/dist/position-Cn7qP1pn.d.ts +50 -0
  98. package/dist/primitives.cjs +129 -0
  99. package/dist/primitives.cjs.map +1 -0
  100. package/dist/primitives.d.cts +300 -0
  101. package/dist/primitives.d.ts +300 -0
  102. package/dist/primitives.js +8 -0
  103. package/dist/primitives.js.map +1 -0
  104. package/dist/sidebar-CQqEmpid.d.cts +124 -0
  105. package/dist/sidebar-CTZ-Ckko.d.ts +124 -0
  106. package/dist/styles.css +5593 -0
  107. package/dist/utils-IKPG3zcC.d.cts +46 -0
  108. package/dist/utils-IKPG3zcC.d.ts +46 -0
  109. package/package.json +91 -0
@@ -0,0 +1,1051 @@
1
+ 'use strict';
2
+
3
+ var chunk774WBLDR_cjs = require('./chunk-774WBLDR.cjs');
4
+ var chunk6732H4BQ_cjs = require('./chunk-6732H4BQ.cjs');
5
+ var vue = require('vue');
6
+ var core = require('@ansh-ui/core');
7
+
8
+ var DATA_TABLE_PROP_KEYS = [
9
+ "data",
10
+ "columns",
11
+ "getRowId",
12
+ "caption",
13
+ "selectable",
14
+ "selected",
15
+ "sort",
16
+ "defaultSort",
17
+ "pageSize",
18
+ "page",
19
+ "loading",
20
+ "emptyState",
21
+ "onRowClick",
22
+ "stickyHeader",
23
+ "density",
24
+ "striped",
25
+ "rowClassName"
26
+ ];
27
+ function compare(a, b) {
28
+ if (a == null && b == null) return 0;
29
+ if (a == null) return 1;
30
+ if (b == null) return -1;
31
+ if (typeof a === "number" && typeof b === "number") return a - b;
32
+ if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();
33
+ return String(a).localeCompare(String(b), void 0, { numeric: true, sensitivity: "base" });
34
+ }
35
+ var DataTable = vue.defineComponent(
36
+ (props, { emit, attrs }) => {
37
+ const [sortState, setSortState] = chunk774WBLDR_cjs.useControllableState(
38
+ () => props.sort,
39
+ props.defaultSort ?? null,
40
+ (next) => emit("update:sort", next)
41
+ );
42
+ const [selection, setSelection] = chunk774WBLDR_cjs.useControllableState(
43
+ () => props.selected,
44
+ [],
45
+ (next) => emit("update:selected", next)
46
+ );
47
+ const [currentPage, setCurrentPage] = chunk774WBLDR_cjs.useControllableState(
48
+ () => props.page,
49
+ 0,
50
+ (next) => emit("update:page", next)
51
+ );
52
+ const sorted = vue.computed(() => {
53
+ const state = sortState.value;
54
+ if (!state) return props.data;
55
+ const column = props.columns.find((c) => c.id === state.columnId);
56
+ const sortValue = column?.sortValue;
57
+ if (!sortValue) return props.data;
58
+ const rows = [...props.data];
59
+ rows.sort((a, b) => {
60
+ const result = compare(sortValue(a), sortValue(b));
61
+ return state.direction === "asc" ? result : -result;
62
+ });
63
+ return rows;
64
+ });
65
+ const pageCount = vue.computed(
66
+ () => props.pageSize ? Math.max(1, Math.ceil(sorted.value.length / props.pageSize)) : 1
67
+ );
68
+ const safePage = vue.computed(() => Math.min(currentPage.value, pageCount.value - 1));
69
+ const visible = vue.computed(() => {
70
+ const pageSize = props.pageSize;
71
+ if (!pageSize) return sorted.value;
72
+ const start = safePage.value * pageSize;
73
+ return sorted.value.slice(start, start + pageSize);
74
+ });
75
+ const visibleIds = vue.computed(() => visible.value.map(props.getRowId));
76
+ const selectedSet = vue.computed(() => new Set(selection.value));
77
+ const allVisibleSelected = vue.computed(
78
+ () => visibleIds.value.length > 0 && visibleIds.value.every((id) => selectedSet.value.has(id))
79
+ );
80
+ const someVisibleSelected = vue.computed(
81
+ () => visibleIds.value.some((id) => selectedSet.value.has(id))
82
+ );
83
+ const toggleAll = () => {
84
+ if (allVisibleSelected.value) {
85
+ setSelection(selection.value.filter((id) => !visibleIds.value.includes(id)));
86
+ } else {
87
+ setSelection([.../* @__PURE__ */ new Set([...selection.value, ...visibleIds.value])]);
88
+ }
89
+ };
90
+ const toggleRow = (rowId) => {
91
+ setSelection(
92
+ selectedSet.value.has(rowId) ? selection.value.filter((v) => v !== rowId) : [...selection.value, rowId]
93
+ );
94
+ };
95
+ const onSort = (column) => {
96
+ if (!column.sortable) return;
97
+ const state = sortState.value;
98
+ if (state?.columnId !== column.id) {
99
+ setSortState({ columnId: column.id, direction: "asc" });
100
+ } else if (state.direction === "asc") {
101
+ setSortState({ columnId: column.id, direction: "desc" });
102
+ } else {
103
+ setSortState(null);
104
+ }
105
+ };
106
+ return () => {
107
+ const columns = props.columns;
108
+ const selectable = props.selectable ?? false;
109
+ const density = props.density ?? "comfortable";
110
+ const striped = props.striped ?? false;
111
+ const columnCount = columns.length + (selectable ? 1 : 0);
112
+ const onRowClick = props.onRowClick;
113
+ const renderBody = () => {
114
+ if (props.loading) {
115
+ return Array.from(
116
+ { length: props.pageSize ?? 5 },
117
+ (_, rowIndex) => vue.h("tr", { key: `skeleton-${rowIndex}`, class: "ansh-table__row" }, [
118
+ ...Array.from(
119
+ { length: columnCount },
120
+ (_2, cellIndex) => vue.h("td", { key: cellIndex, class: "ansh-table__cell" }, [
121
+ vue.h("span", {
122
+ class: "ansh-skeleton",
123
+ style: { width: `${50 + cellIndex * 37 % 40}%`, height: "1em" }
124
+ })
125
+ ])
126
+ )
127
+ ])
128
+ );
129
+ }
130
+ if (visible.value.length === 0) {
131
+ return [
132
+ vue.h("tr", {}, [
133
+ vue.h("td", { colspan: columnCount, class: "ansh-table__empty" }, [
134
+ props.emptyState ? chunk6732H4BQ_cjs.resolveSlotContent(props.emptyState) : "No results"
135
+ ])
136
+ ])
137
+ ];
138
+ }
139
+ return visible.value.map((row, index) => {
140
+ const rowId = props.getRowId(row);
141
+ const isSelected = selectedSet.value.has(rowId);
142
+ return vue.h(
143
+ "tr",
144
+ {
145
+ key: rowId,
146
+ class: chunk6732H4BQ_cjs.cx(
147
+ "ansh-table__row",
148
+ isSelected && "ansh-table__row--selected",
149
+ Boolean(onRowClick) && "ansh-table__row--clickable",
150
+ props.rowClassName?.(row)
151
+ ),
152
+ "aria-selected": selectable ? isSelected : void 0,
153
+ // A click that started on a control inside the row belongs to that control —
154
+ // opening a detail view because someone ticked a checkbox is the classic
155
+ // clickable-row bug.
156
+ onClick: onRowClick ? (event) => {
157
+ const target = event.target;
158
+ if (target.closest("button, a, input, select, textarea")) return;
159
+ onRowClick(row);
160
+ } : void 0
161
+ },
162
+ [
163
+ selectable ? vue.h("td", { class: "ansh-table__cell ansh-table__cell--check" }, [
164
+ vue.h("input", {
165
+ type: "checkbox",
166
+ class: "ansh-table__checkbox",
167
+ checked: isSelected,
168
+ "aria-label": `Select row ${index + 1}`,
169
+ onChange: () => toggleRow(rowId)
170
+ })
171
+ ]) : null,
172
+ ...columns.map(
173
+ (column) => vue.h(
174
+ "td",
175
+ {
176
+ key: column.id,
177
+ class: chunk6732H4BQ_cjs.cx(
178
+ "ansh-table__cell",
179
+ column.align && `ansh-table__cell--${column.align}`,
180
+ column.hideBelow && `ansh-hide-below-${column.hideBelow}`
181
+ )
182
+ },
183
+ [column.cell(row, index)]
184
+ )
185
+ )
186
+ ]
187
+ );
188
+ });
189
+ };
190
+ return vue.h(
191
+ "div",
192
+ {
193
+ class: chunk6732H4BQ_cjs.cx(
194
+ "ansh-table-wrap",
195
+ props.stickyHeader && "ansh-table-wrap--sticky",
196
+ attrs.class
197
+ )
198
+ },
199
+ [
200
+ vue.h(
201
+ "table",
202
+ { class: chunk6732H4BQ_cjs.cx("ansh-table", `ansh-table--${density}`, striped && "ansh-table--striped") },
203
+ [
204
+ vue.h("caption", { class: "ansh-visually-hidden" }, [
205
+ props.caption,
206
+ sortState.value ? `, sorted by ${columns.find((c) => c.id === sortState.value.columnId)?.id} ${sortState.value.direction === "asc" ? "ascending" : "descending"}` : ""
207
+ ]),
208
+ vue.h("thead", { class: "ansh-table__head" }, [
209
+ vue.h("tr", {}, [
210
+ selectable ? vue.h("th", { scope: "col", class: "ansh-table__cell ansh-table__cell--check" }, [
211
+ vue.h("input", {
212
+ type: "checkbox",
213
+ class: "ansh-table__checkbox",
214
+ checked: allVisibleSelected.value,
215
+ // Mixed state when only some rows are ticked — announced as "partially
216
+ // checked" rather than lying about the state. A fresh function
217
+ // identity every render is what makes Vue re-invoke this ref callback
218
+ // (mirroring the React version's inline ref) so the flag stays current.
219
+ ref: (el) => {
220
+ if (el) {
221
+ el.indeterminate = !allVisibleSelected.value && someVisibleSelected.value;
222
+ }
223
+ },
224
+ "aria-label": allVisibleSelected.value ? "Deselect all rows" : "Select all rows",
225
+ onChange: toggleAll
226
+ })
227
+ ]) : null,
228
+ ...columns.map((column) => {
229
+ const isSorted = sortState.value?.columnId === column.id;
230
+ return vue.h(
231
+ "th",
232
+ {
233
+ key: column.id,
234
+ scope: "col",
235
+ class: chunk6732H4BQ_cjs.cx(
236
+ "ansh-table__cell",
237
+ "ansh-table__cell--head",
238
+ column.align && `ansh-table__cell--${column.align}`,
239
+ column.hideBelow && `ansh-hide-below-${column.hideBelow}`
240
+ ),
241
+ style: column.width ? { width: column.width } : void 0,
242
+ // `aria-sort` on the header is what makes a screen reader announce the
243
+ // sort state; the arrow glyph alone conveys nothing.
244
+ "aria-sort": isSorted ? sortState.value.direction === "asc" ? "ascending" : "descending" : void 0
245
+ },
246
+ [
247
+ column.sortable ? vue.h(
248
+ "button",
249
+ {
250
+ type: "button",
251
+ class: "ansh-table__sort ansh-focusable",
252
+ onClick: () => onSort(column),
253
+ "aria-label": column.ariaLabel ? `Sort by ${column.ariaLabel}` : typeof column.header === "string" ? `Sort by ${column.header}` : "Sort column"
254
+ },
255
+ [
256
+ vue.h("span", {}, [chunk6732H4BQ_cjs.resolveSlotContent(column.header)]),
257
+ vue.h(
258
+ "span",
259
+ {
260
+ class: chunk6732H4BQ_cjs.cx(
261
+ "ansh-table__arrow",
262
+ isSorted && "ansh-table__arrow--on"
263
+ ),
264
+ "aria-hidden": "true",
265
+ "data-direction": isSorted ? sortState.value.direction : "none"
266
+ },
267
+ [
268
+ vue.h("svg", { viewBox: "0 0 10 12", width: "10", height: "12" }, [
269
+ vue.h("path", {
270
+ d: "M5 1v10M2 4l3-3 3 3M2 8l3 3 3-3",
271
+ stroke: "currentColor",
272
+ "stroke-width": "1.4",
273
+ fill: "none",
274
+ "stroke-linecap": "round",
275
+ "stroke-linejoin": "round"
276
+ })
277
+ ])
278
+ ]
279
+ )
280
+ ]
281
+ ) : chunk6732H4BQ_cjs.resolveSlotContent(column.header)
282
+ ]
283
+ );
284
+ })
285
+ ])
286
+ ]),
287
+ vue.h("tbody", {}, renderBody())
288
+ ]
289
+ ),
290
+ // Selection count and page changes announced without stealing focus.
291
+ vue.h(
292
+ "span",
293
+ { class: "ansh-visually-hidden", role: "status", "aria-live": "polite" },
294
+ selectable && selection.value.length > 0 ? `${selection.value.length} selected` : ""
295
+ ),
296
+ props.pageSize && pageCount.value > 1 ? vue.h(Pagination, {
297
+ page: safePage.value,
298
+ pageCount: pageCount.value,
299
+ total: sorted.value.length,
300
+ pageSize: props.pageSize,
301
+ onPageChange: setCurrentPage
302
+ }) : null
303
+ ]
304
+ );
305
+ };
306
+ },
307
+ {
308
+ name: "AnshDataTable",
309
+ inheritAttrs: false,
310
+ props: DATA_TABLE_PROP_KEYS,
311
+ emits: ["update:sort", "update:selected", "update:page"]
312
+ }
313
+ );
314
+ var Pagination = vue.defineComponent({
315
+ name: "AnshPagination",
316
+ inheritAttrs: false,
317
+ props: {
318
+ page: { type: Number, required: true },
319
+ pageCount: { type: Number, required: true },
320
+ onPageChange: { type: Function, required: true },
321
+ total: { type: Number, default: void 0 },
322
+ pageSize: { type: Number, default: void 0 },
323
+ siblings: { type: Number, default: 1 }
324
+ },
325
+ setup(props, { attrs }) {
326
+ return () => {
327
+ const pages = [];
328
+ const first = 0;
329
+ const last = props.pageCount - 1;
330
+ for (let index = first; index <= last; index++) {
331
+ const nearCurrent = Math.abs(index - props.page) <= props.siblings;
332
+ const isEdge = index === first || index === last;
333
+ if (nearCurrent || isEdge) {
334
+ pages.push(index);
335
+ } else if (pages[pages.length - 1] !== "gap") {
336
+ pages.push("gap");
337
+ }
338
+ }
339
+ const from = props.pageSize ? props.page * props.pageSize + 1 : null;
340
+ const to = props.pageSize && props.total ? Math.min((props.page + 1) * props.pageSize, props.total) : null;
341
+ return vue.h(
342
+ "nav",
343
+ { class: chunk6732H4BQ_cjs.cx("ansh-pagination", attrs.class), "aria-label": "Pagination" },
344
+ [
345
+ from !== null && to !== null ? vue.h("p", { class: "ansh-pagination__summary" }, `${from}\u2013${to} of ${props.total}`) : null,
346
+ vue.h("ol", { class: "ansh-pagination__list" }, [
347
+ vue.h("li", {}, [
348
+ vue.h(
349
+ "button",
350
+ {
351
+ type: "button",
352
+ class: "ansh-pagination__button ansh-focusable",
353
+ disabled: props.page === 0,
354
+ "aria-label": "Previous page",
355
+ onClick: () => props.onPageChange(props.page - 1)
356
+ },
357
+ [
358
+ vue.h(
359
+ "svg",
360
+ { viewBox: "0 0 12 12", width: "12", height: "12", "aria-hidden": "true" },
361
+ [
362
+ vue.h("path", {
363
+ d: "M7.5 2.5L4 6l3.5 3.5",
364
+ stroke: "currentColor",
365
+ "stroke-width": "1.5",
366
+ fill: "none",
367
+ "stroke-linecap": "round",
368
+ "stroke-linejoin": "round"
369
+ })
370
+ ]
371
+ )
372
+ ]
373
+ )
374
+ ]),
375
+ ...pages.map(
376
+ (entry, index) => entry === "gap" ? vue.h(
377
+ "li",
378
+ { key: `gap-${index}`, "aria-hidden": "true", class: "ansh-pagination__gap" },
379
+ "\u2026"
380
+ ) : vue.h("li", { key: entry }, [
381
+ vue.h(
382
+ "button",
383
+ {
384
+ type: "button",
385
+ class: chunk6732H4BQ_cjs.cx(
386
+ "ansh-pagination__button",
387
+ entry === props.page && "ansh-pagination__button--current",
388
+ "ansh-focusable"
389
+ ),
390
+ "aria-current": entry === props.page ? "page" : void 0,
391
+ "aria-label": `Page ${entry + 1}`,
392
+ onClick: () => props.onPageChange(entry)
393
+ },
394
+ String(entry + 1)
395
+ )
396
+ ])
397
+ ),
398
+ vue.h("li", {}, [
399
+ vue.h(
400
+ "button",
401
+ {
402
+ type: "button",
403
+ class: "ansh-pagination__button ansh-focusable",
404
+ disabled: props.page >= props.pageCount - 1,
405
+ "aria-label": "Next page",
406
+ onClick: () => props.onPageChange(props.page + 1)
407
+ },
408
+ [
409
+ vue.h(
410
+ "svg",
411
+ { viewBox: "0 0 12 12", width: "12", height: "12", "aria-hidden": "true" },
412
+ [
413
+ vue.h("path", {
414
+ d: "M4.5 2.5L8 6l-3.5 3.5",
415
+ stroke: "currentColor",
416
+ "stroke-width": "1.5",
417
+ fill: "none",
418
+ "stroke-linecap": "round",
419
+ "stroke-linejoin": "round"
420
+ })
421
+ ]
422
+ )
423
+ ]
424
+ )
425
+ ])
426
+ ])
427
+ ]
428
+ );
429
+ };
430
+ }
431
+ });
432
+ var Table = vue.defineComponent({
433
+ name: "AnshTable",
434
+ inheritAttrs: false,
435
+ props: {
436
+ caption: { type: String, default: void 0 },
437
+ density: { type: String, default: "comfortable" },
438
+ striped: { type: Boolean, default: false }
439
+ },
440
+ setup(props, { slots, attrs }) {
441
+ return () => vue.h("div", { class: chunk6732H4BQ_cjs.cx("ansh-table-wrap", attrs.class) }, [
442
+ vue.h(
443
+ "table",
444
+ {
445
+ class: chunk6732H4BQ_cjs.cx(
446
+ "ansh-table",
447
+ `ansh-table--${props.density}`,
448
+ props.striped && "ansh-table--striped"
449
+ )
450
+ },
451
+ [
452
+ props.caption ? vue.h("caption", { class: "ansh-visually-hidden" }, props.caption) : null,
453
+ slots.default?.()
454
+ ]
455
+ )
456
+ ]);
457
+ }
458
+ });
459
+ var Badge = vue.defineComponent({
460
+ name: "AnshBadge",
461
+ inheritAttrs: false,
462
+ props: {
463
+ tone: { type: String, default: "neutral" },
464
+ variant: { type: String, default: "soft" },
465
+ size: { type: String, default: "md" },
466
+ /** Leading dot. Useful for statuses where the label is short. */
467
+ dot: { type: Boolean, default: false },
468
+ icon: { type: [String, Object, Function], default: void 0 }
469
+ },
470
+ setup(props, { slots, attrs }) {
471
+ return () => {
472
+ const { class: attrClass, ...restAttrs } = attrs;
473
+ return vue.h(
474
+ "span",
475
+ {
476
+ class: chunk6732H4BQ_cjs.cx(
477
+ "ansh-badge",
478
+ `ansh-badge--${props.tone}`,
479
+ `ansh-badge--${props.variant}`,
480
+ `ansh-badge--${props.size}`,
481
+ attrClass
482
+ ),
483
+ ...restAttrs
484
+ },
485
+ [
486
+ props.dot ? vue.h("span", { class: "ansh-badge__dot", "aria-hidden": "true" }) : null,
487
+ props.icon ? vue.h("span", { class: "ansh-badge__icon" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.icon)]) : null,
488
+ slots.default?.()
489
+ ]
490
+ );
491
+ };
492
+ }
493
+ });
494
+ function initials(name) {
495
+ const words = name.trim().split(/\s+/).filter(Boolean);
496
+ if (words.length === 0) return "?";
497
+ if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
498
+ return (words[0][0] + words[words.length - 1][0]).toUpperCase();
499
+ }
500
+ function hash(text) {
501
+ let value = 0;
502
+ for (let i = 0; i < text.length; i++) {
503
+ value = value * 31 + text.charCodeAt(i) | 0;
504
+ }
505
+ return Math.abs(value);
506
+ }
507
+ var Avatar = vue.defineComponent({
508
+ name: "AnshAvatar",
509
+ inheritAttrs: false,
510
+ props: {
511
+ src: { type: String, default: void 0 },
512
+ name: { type: String, required: true },
513
+ size: { type: String, default: "md" },
514
+ shape: { type: String, default: "circle" },
515
+ status: {
516
+ type: String,
517
+ default: void 0
518
+ }
519
+ },
520
+ setup(props, { attrs }) {
521
+ const failed = vue.ref(false);
522
+ const colors = vue.computed(() => {
523
+ const hue = hash(props.name) % 360;
524
+ const backgroundHex = core.toHex(core.parseColor(`oklch(72% 0.13 ${hue})`));
525
+ return {
526
+ background: backgroundHex,
527
+ foreground: core.toHex(core.pickReadable(backgroundHex, "#ffffff", "#101828"))
528
+ };
529
+ });
530
+ const showImage = vue.computed(() => Boolean(props.src) && !failed.value);
531
+ return () => {
532
+ const { class: attrClass, ...restAttrs } = attrs;
533
+ return vue.h(
534
+ "span",
535
+ {
536
+ class: chunk6732H4BQ_cjs.cx(
537
+ "ansh-avatar",
538
+ `ansh-avatar--${props.size}`,
539
+ `ansh-avatar--${props.shape}`,
540
+ attrClass
541
+ ),
542
+ ...restAttrs
543
+ },
544
+ [
545
+ showImage.value ? vue.h("img", {
546
+ src: props.src,
547
+ alt: props.name,
548
+ class: "ansh-avatar__image",
549
+ // Falling back on error rather than showing a broken-image icon, which is what a
550
+ // bare `<img>` does when a CDN URL expires.
551
+ onError: () => {
552
+ failed.value = true;
553
+ }
554
+ }) : vue.h(
555
+ "span",
556
+ {
557
+ class: "ansh-avatar__fallback",
558
+ style: { background: colors.value.background, color: colors.value.foreground },
559
+ "aria-hidden": "true"
560
+ },
561
+ initials(props.name)
562
+ ),
563
+ // The name is always available to assistive technology, even when the initials are
564
+ // shown as decorative.
565
+ !showImage.value ? vue.h("span", { class: "ansh-visually-hidden" }, props.name) : null,
566
+ props.status ? vue.h(
567
+ "span",
568
+ { class: chunk6732H4BQ_cjs.cx("ansh-avatar__status", `ansh-avatar__status--${props.status}`) },
569
+ [vue.h("span", { class: "ansh-visually-hidden" }, props.status)]
570
+ ) : null
571
+ ]
572
+ );
573
+ };
574
+ }
575
+ });
576
+ var AvatarGroup = vue.defineComponent({
577
+ name: "AnshAvatarGroup",
578
+ inheritAttrs: false,
579
+ props: {
580
+ /** Maximum shown before collapsing into a "+N" chip. Default `4`. */
581
+ max: { type: Number, default: 4 },
582
+ size: { type: String, default: void 0 }
583
+ },
584
+ setup(props, { slots, attrs }) {
585
+ return () => {
586
+ const items = slots.default?.() ?? [];
587
+ const shown = items.slice(0, props.max);
588
+ const overflow = items.length - shown.length;
589
+ return vue.h(
590
+ "span",
591
+ {
592
+ class: chunk6732H4BQ_cjs.cx(
593
+ "ansh-avatar-group",
594
+ props.size && `ansh-avatar-group--${props.size}`,
595
+ attrs.class
596
+ )
597
+ },
598
+ [
599
+ shown,
600
+ overflow > 0 ? vue.h(
601
+ "span",
602
+ {
603
+ class: chunk6732H4BQ_cjs.cx(
604
+ "ansh-avatar",
605
+ props.size && `ansh-avatar--${props.size}`,
606
+ "ansh-avatar--circle",
607
+ "ansh-avatar--more"
608
+ )
609
+ },
610
+ [
611
+ vue.h(
612
+ "span",
613
+ { class: "ansh-avatar__fallback", "aria-hidden": "true" },
614
+ `+${overflow}`
615
+ ),
616
+ vue.h("span", { class: "ansh-visually-hidden" }, `and ${overflow} more`)
617
+ ]
618
+ ) : null
619
+ ]
620
+ );
621
+ };
622
+ }
623
+ });
624
+ var Kbd = vue.defineComponent({
625
+ name: "AnshKbd",
626
+ inheritAttrs: false,
627
+ setup(_props, { slots, attrs }) {
628
+ return () => {
629
+ const nodes = slots.default?.() ?? [];
630
+ const text = nodes.map((node) => typeof node.children === "string" ? node.children : "").join("");
631
+ const keys = text.split("+").map((key) => key.trim());
632
+ return vue.h(
633
+ "span",
634
+ { class: chunk6732H4BQ_cjs.cx("ansh-kbd-group", attrs.class) },
635
+ keys.map(
636
+ (key, index) => vue.h("span", { key: `${key}-${index}` }, [
637
+ index > 0 ? vue.h("span", { class: "ansh-kbd__plus", "aria-hidden": "true" }, "+") : null,
638
+ vue.h("kbd", { class: "ansh-kbd" }, key)
639
+ ])
640
+ )
641
+ );
642
+ };
643
+ }
644
+ });
645
+ var Stat = vue.defineComponent({
646
+ name: "AnshStat",
647
+ inheritAttrs: false,
648
+ props: {
649
+ label: { type: [String, Object, Function], required: true },
650
+ value: { type: [String, Object, Function], required: true },
651
+ delta: { type: Number, default: void 0 },
652
+ deltaLabel: { type: String, default: void 0 },
653
+ invertDelta: { type: Boolean, default: false },
654
+ hint: { type: [String, Object, Function], default: void 0 },
655
+ icon: { type: [String, Object, Function], default: void 0 }
656
+ },
657
+ setup(props, { attrs }) {
658
+ return () => {
659
+ const delta = props.delta;
660
+ const positive = delta !== void 0 && delta > 0;
661
+ const negative = delta !== void 0 && delta < 0;
662
+ const good = props.invertDelta ? negative : positive;
663
+ return vue.h("div", { class: chunk6732H4BQ_cjs.cx("ansh-stat", attrs.class) }, [
664
+ vue.h("div", { class: "ansh-stat__head" }, [
665
+ vue.h("span", { class: "ansh-stat__label" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.label)]),
666
+ props.icon ? vue.h("span", { class: "ansh-stat__icon" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.icon)]) : null
667
+ ]),
668
+ vue.h("div", { class: "ansh-stat__value" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.value)]),
669
+ delta !== void 0 ? vue.h(
670
+ "div",
671
+ {
672
+ class: chunk6732H4BQ_cjs.cx(
673
+ "ansh-stat__delta",
674
+ delta !== 0 && (good ? "ansh-stat__delta--good" : "ansh-stat__delta--bad")
675
+ )
676
+ },
677
+ [
678
+ vue.h(
679
+ "span",
680
+ { class: "ansh-stat__arrow", "aria-hidden": "true" },
681
+ positive ? "\u2191" : negative ? "\u2193" : "\u2192"
682
+ ),
683
+ vue.h("span", {}, props.deltaLabel ?? `${delta > 0 ? "+" : ""}${delta}%`),
684
+ props.hint ? vue.h("span", { class: "ansh-stat__hint" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.hint)]) : null
685
+ ]
686
+ ) : props.hint ? vue.h("div", { class: "ansh-stat__hint" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.hint)]) : null
687
+ ]);
688
+ };
689
+ }
690
+ });
691
+ var EmptyState = vue.defineComponent({
692
+ name: "AnshEmptyState",
693
+ inheritAttrs: false,
694
+ props: {
695
+ title: { type: [String, Object, Function], required: true },
696
+ description: { type: [String, Object, Function], default: void 0 },
697
+ icon: { type: [String, Object, Function], default: void 0 },
698
+ action: { type: [String, Object, Function], default: void 0 },
699
+ size: { type: String, default: "md" }
700
+ },
701
+ setup(props, { attrs }) {
702
+ return () => vue.h("div", { class: chunk6732H4BQ_cjs.cx("ansh-empty", `ansh-empty--${props.size}`, attrs.class) }, [
703
+ props.icon ? vue.h("span", { class: "ansh-empty__icon", "aria-hidden": "true" }, [
704
+ chunk6732H4BQ_cjs.resolveSlotContent(props.icon)
705
+ ]) : null,
706
+ vue.h("p", { class: "ansh-empty__title" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.title)]),
707
+ props.description ? vue.h("p", { class: "ansh-empty__description" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.description)]) : null,
708
+ props.action ? vue.h("div", { class: "ansh-empty__action" }, [chunk6732H4BQ_cjs.resolveSlotContent(props.action)]) : null
709
+ ]);
710
+ }
711
+ });
712
+ var DescriptionList = vue.defineComponent({
713
+ name: "AnshDescriptionList",
714
+ inheritAttrs: false,
715
+ props: {
716
+ items: {
717
+ type: Array,
718
+ required: true
719
+ },
720
+ orientation: { type: String, default: "horizontal" }
721
+ },
722
+ setup(props, { attrs }) {
723
+ return () => vue.h(
724
+ "dl",
725
+ { class: chunk6732H4BQ_cjs.cx("ansh-dl", `ansh-dl--${props.orientation}`, attrs.class) },
726
+ props.items.map(
727
+ (item, index) => vue.h("div", { class: "ansh-dl__row", key: index }, [
728
+ vue.h("dt", { class: "ansh-dl__term" }, [chunk6732H4BQ_cjs.resolveSlotContent(item.term)]),
729
+ vue.h("dd", { class: "ansh-dl__description" }, [chunk6732H4BQ_cjs.resolveSlotContent(item.description)])
730
+ ])
731
+ )
732
+ );
733
+ }
734
+ });
735
+ var Timeline = vue.defineComponent({
736
+ name: "AnshTimeline",
737
+ inheritAttrs: false,
738
+ props: {
739
+ items: { type: Array, required: true }
740
+ },
741
+ setup(props, { attrs }) {
742
+ return () => vue.h(
743
+ "ol",
744
+ { class: chunk6732H4BQ_cjs.cx("ansh-timeline", attrs.class) },
745
+ props.items.map(
746
+ (item) => vue.h(
747
+ "li",
748
+ {
749
+ key: item.id,
750
+ class: chunk6732H4BQ_cjs.cx("ansh-timeline__item", item.tone && `ansh-timeline__item--${item.tone}`)
751
+ },
752
+ [
753
+ vue.h("span", { class: "ansh-timeline__marker", "aria-hidden": "true" }, [
754
+ item.icon ? chunk6732H4BQ_cjs.resolveSlotContent(item.icon) : null
755
+ ]),
756
+ vue.h("div", { class: "ansh-timeline__body" }, [
757
+ vue.h("div", { class: "ansh-timeline__head" }, [
758
+ vue.h("span", { class: "ansh-timeline__title" }, [chunk6732H4BQ_cjs.resolveSlotContent(item.title)]),
759
+ item.timestamp ? vue.h("span", { class: "ansh-timeline__time" }, [
760
+ chunk6732H4BQ_cjs.resolveSlotContent(item.timestamp)
761
+ ]) : null
762
+ ]),
763
+ item.description ? vue.h("p", { class: "ansh-timeline__description" }, [
764
+ chunk6732H4BQ_cjs.resolveSlotContent(item.description)
765
+ ]) : null
766
+ ])
767
+ ]
768
+ )
769
+ )
770
+ );
771
+ }
772
+ });
773
+ var CodeBlock = vue.defineComponent({
774
+ name: "AnshCodeBlock",
775
+ inheritAttrs: false,
776
+ props: {
777
+ code: { type: String, required: true },
778
+ language: { type: String, default: "tsx" },
779
+ copyable: { type: Boolean, default: true },
780
+ lineNumbers: { type: Boolean, default: false },
781
+ filename: { type: String, default: void 0 }
782
+ },
783
+ setup(props, { attrs }) {
784
+ const copied = vue.ref(false);
785
+ let timer;
786
+ const copy = async () => {
787
+ try {
788
+ await navigator.clipboard.writeText(props.code);
789
+ copied.value = true;
790
+ clearTimeout(timer);
791
+ timer = setTimeout(() => {
792
+ copied.value = false;
793
+ }, 1600);
794
+ } catch {
795
+ }
796
+ };
797
+ vue.onBeforeUnmount(() => clearTimeout(timer));
798
+ return () => {
799
+ const lines = props.code.split("\n");
800
+ return vue.h("div", { class: chunk6732H4BQ_cjs.cx("ansh-code", attrs.class) }, [
801
+ props.filename || props.copyable ? vue.h("div", { class: "ansh-code__bar" }, [
802
+ vue.h("span", { class: "ansh-code__filename" }, props.filename ?? props.language),
803
+ props.copyable ? vue.h(
804
+ "button",
805
+ { type: "button", class: "ansh-code__copy ansh-focusable", onClick: copy },
806
+ [
807
+ copied.value ? "Copied" : "Copy",
808
+ vue.h("span", { class: "ansh-visually-hidden" }, " code to clipboard")
809
+ ]
810
+ ) : null
811
+ ]) : null,
812
+ vue.h("pre", { class: chunk6732H4BQ_cjs.cx("ansh-code__pre", props.lineNumbers && "ansh-code__pre--numbered") }, [
813
+ vue.h(
814
+ "code",
815
+ { class: `language-${props.language}` },
816
+ props.lineNumbers ? lines.map(
817
+ (line, index) => vue.h("span", { class: "ansh-code__line", key: index }, [
818
+ vue.h(
819
+ "span",
820
+ { class: "ansh-code__lineno", "aria-hidden": "true" },
821
+ String(index + 1)
822
+ ),
823
+ line,
824
+ "\n"
825
+ ])
826
+ ) : props.code
827
+ )
828
+ ])
829
+ ]);
830
+ };
831
+ }
832
+ });
833
+ var Progress = vue.defineComponent({
834
+ name: "AnshProgress",
835
+ inheritAttrs: false,
836
+ props: {
837
+ value: { type: Number, default: void 0 },
838
+ max: { type: Number, default: 100 },
839
+ size: { type: String, default: "md" },
840
+ tone: {
841
+ type: String,
842
+ default: "accent"
843
+ },
844
+ label: { type: String, required: true },
845
+ showLabel: { type: Boolean, default: false },
846
+ formatValue: {
847
+ type: Function,
848
+ default: void 0
849
+ }
850
+ },
851
+ setup(props, { attrs }) {
852
+ return () => {
853
+ const rawValue = props.value;
854
+ const indeterminate = rawValue === void 0;
855
+ const clamped = rawValue === void 0 ? 0 : Math.min(Math.max(rawValue, 0), props.max);
856
+ const percent = clamped / props.max * 100;
857
+ const text = props.formatValue ? props.formatValue(clamped, props.max) : `${Math.round(percent)}%`;
858
+ return vue.h(
859
+ "div",
860
+ {
861
+ class: chunk6732H4BQ_cjs.cx(
862
+ "ansh-progress",
863
+ `ansh-progress--${props.size}`,
864
+ `ansh-progress--${props.tone}`,
865
+ attrs.class
866
+ )
867
+ },
868
+ [
869
+ props.showLabel ? vue.h("div", { class: "ansh-progress__labels" }, [
870
+ vue.h("span", { class: "ansh-progress__label" }, props.label),
871
+ !indeterminate ? vue.h("span", { class: "ansh-progress__value" }, text) : null
872
+ ]) : null,
873
+ vue.h(
874
+ "div",
875
+ {
876
+ class: chunk6732H4BQ_cjs.cx(
877
+ "ansh-progress__track",
878
+ indeterminate && "ansh-progress__track--indeterminate"
879
+ ),
880
+ role: "progressbar",
881
+ "aria-label": props.label,
882
+ // An indeterminate progressbar omits `aria-valuenow` entirely. Setting it to 0 would
883
+ // be announced as "0 percent", implying stalled work rather than unknown duration.
884
+ ...indeterminate ? null : {
885
+ "aria-valuenow": clamped,
886
+ "aria-valuemin": 0,
887
+ "aria-valuemax": props.max,
888
+ "aria-valuetext": text
889
+ }
890
+ },
891
+ [
892
+ vue.h("div", {
893
+ class: "ansh-progress__fill",
894
+ style: indeterminate ? void 0 : { width: `${percent}%` }
895
+ })
896
+ ]
897
+ )
898
+ ]
899
+ );
900
+ };
901
+ }
902
+ });
903
+ var CircularProgress = vue.defineComponent({
904
+ name: "AnshCircularProgress",
905
+ inheritAttrs: false,
906
+ props: {
907
+ value: { type: Number, default: void 0 },
908
+ max: { type: Number, default: 100 },
909
+ size: { type: Number, default: 48 },
910
+ thickness: { type: Number, default: 4 },
911
+ tone: {
912
+ type: String,
913
+ default: "accent"
914
+ },
915
+ label: { type: String, required: true },
916
+ formatValue: {
917
+ type: Function,
918
+ default: void 0
919
+ }
920
+ },
921
+ setup(props, { attrs, slots }) {
922
+ return () => {
923
+ const rawValue = props.value;
924
+ const indeterminate = rawValue === void 0;
925
+ const clamped = rawValue === void 0 ? 25 : Math.min(Math.max(rawValue, 0), props.max);
926
+ const fraction = clamped / props.max;
927
+ const radius = (props.size - props.thickness) / 2;
928
+ const circumference = 2 * Math.PI * radius;
929
+ const text = props.formatValue ? props.formatValue(clamped, props.max) : `${Math.round(fraction * 100)}%`;
930
+ return vue.h(
931
+ "div",
932
+ {
933
+ class: chunk6732H4BQ_cjs.cx(
934
+ "ansh-ring",
935
+ `ansh-ring--${props.tone}`,
936
+ indeterminate && "ansh-ring--indeterminate",
937
+ attrs.class
938
+ ),
939
+ style: { width: `${props.size}px`, height: `${props.size}px` },
940
+ role: "progressbar",
941
+ "aria-label": props.label,
942
+ ...indeterminate ? null : {
943
+ "aria-valuenow": clamped,
944
+ "aria-valuemin": 0,
945
+ "aria-valuemax": props.max,
946
+ "aria-valuetext": text
947
+ }
948
+ },
949
+ [
950
+ vue.h(
951
+ "svg",
952
+ {
953
+ width: props.size,
954
+ height: props.size,
955
+ viewBox: `0 0 ${props.size} ${props.size}`,
956
+ "aria-hidden": "true"
957
+ },
958
+ [
959
+ vue.h("circle", {
960
+ class: "ansh-ring__track",
961
+ cx: props.size / 2,
962
+ cy: props.size / 2,
963
+ r: radius,
964
+ fill: "none",
965
+ "stroke-width": props.thickness
966
+ }),
967
+ vue.h("circle", {
968
+ class: "ansh-ring__fill",
969
+ cx: props.size / 2,
970
+ cy: props.size / 2,
971
+ r: radius,
972
+ fill: "none",
973
+ "stroke-width": props.thickness,
974
+ "stroke-linecap": "round",
975
+ "stroke-dasharray": circumference,
976
+ "stroke-dashoffset": circumference * (1 - fraction),
977
+ transform: `rotate(-90 ${props.size / 2} ${props.size / 2})`
978
+ })
979
+ ]
980
+ ),
981
+ slots.default ? vue.h("span", { class: "ansh-ring__content" }, slots.default()) : null
982
+ ]
983
+ );
984
+ };
985
+ }
986
+ });
987
+ var Meter = vue.defineComponent({
988
+ name: "AnshMeter",
989
+ inheritAttrs: false,
990
+ props: {
991
+ value: { type: Number, required: true },
992
+ min: { type: Number, default: 0 },
993
+ max: { type: Number, default: 100 },
994
+ low: { type: Number, default: void 0 },
995
+ high: { type: Number, default: void 0 },
996
+ inverted: { type: Boolean, default: false },
997
+ label: { type: String, required: true },
998
+ showValue: { type: Boolean, default: true },
999
+ formatValue: { type: Function, default: void 0 }
1000
+ },
1001
+ setup(props, { attrs }) {
1002
+ return () => {
1003
+ const clamped = Math.min(Math.max(props.value, props.min), props.max);
1004
+ const percent = (clamped - props.min) / (props.max - props.min) * 100;
1005
+ let tone = "success";
1006
+ if (props.low !== void 0 && clamped < props.low)
1007
+ tone = props.inverted ? "success" : "danger";
1008
+ else if (props.high !== void 0 && clamped > props.high)
1009
+ tone = props.inverted ? "danger" : "success";
1010
+ else if (props.low !== void 0 || props.high !== void 0) tone = "warning";
1011
+ const text = props.formatValue ? props.formatValue(clamped) : String(clamped);
1012
+ return vue.h("div", { class: chunk6732H4BQ_cjs.cx("ansh-meter", `ansh-meter--${tone}`, attrs.class) }, [
1013
+ vue.h("div", { class: "ansh-progress__labels" }, [
1014
+ vue.h("span", { class: "ansh-progress__label" }, props.label),
1015
+ props.showValue ? vue.h("span", { class: "ansh-progress__value" }, text) : null
1016
+ ]),
1017
+ vue.h(
1018
+ "div",
1019
+ {
1020
+ class: "ansh-progress__track",
1021
+ role: "meter",
1022
+ "aria-label": props.label,
1023
+ "aria-valuenow": clamped,
1024
+ "aria-valuemin": props.min,
1025
+ "aria-valuemax": props.max,
1026
+ "aria-valuetext": text
1027
+ },
1028
+ [vue.h("div", { class: "ansh-progress__fill", style: { width: `${percent}%` } })]
1029
+ )
1030
+ ]);
1031
+ };
1032
+ }
1033
+ });
1034
+
1035
+ exports.Avatar = Avatar;
1036
+ exports.AvatarGroup = AvatarGroup;
1037
+ exports.Badge = Badge;
1038
+ exports.CircularProgress = CircularProgress;
1039
+ exports.CodeBlock = CodeBlock;
1040
+ exports.DataTable = DataTable;
1041
+ exports.DescriptionList = DescriptionList;
1042
+ exports.EmptyState = EmptyState;
1043
+ exports.Kbd = Kbd;
1044
+ exports.Meter = Meter;
1045
+ exports.Pagination = Pagination;
1046
+ exports.Progress = Progress;
1047
+ exports.Stat = Stat;
1048
+ exports.Table = Table;
1049
+ exports.Timeline = Timeline;
1050
+ //# sourceMappingURL=chunk-J2LA4GRP.cjs.map
1051
+ //# sourceMappingURL=chunk-J2LA4GRP.cjs.map