@vuetify/v0 0.1.3 → 0.1.4

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 (127) hide show
  1. package/dist/adapter-BN-h5JbD.d.mts +344 -0
  2. package/dist/adapter-CJIj5ySf.d.mts +11 -0
  3. package/dist/adapter-D_0ptsPm.mjs +229 -0
  4. package/dist/adapters-BQ-Lr3PW.mjs +1 -0
  5. package/dist/adapters-DEXpW9If.mjs +1 -0
  6. package/dist/adapters-Q9WaOsJp.mjs +1 -0
  7. package/dist/adapters-SSDVth5e.mjs +1 -0
  8. package/dist/browser/index.js +359 -933
  9. package/dist/components/index.d.mts +19 -6
  10. package/dist/components/index.mjs +37 -5
  11. package/dist/{components-C0zEvP7w.mjs → components-CMuzTJdK.mjs} +11 -4
  12. package/dist/composables/index.d.mts +17 -4
  13. package/dist/composables/index.mjs +36 -4
  14. package/dist/consola-DiUk9j3y.d.mts +15 -0
  15. package/dist/consola-GBy8XRuL.mjs +31 -0
  16. package/dist/constants/index.d.mts +1 -1
  17. package/dist/constants/index.mjs +3 -3
  18. package/dist/constants-B8pMSkcW.mjs +1 -0
  19. package/dist/createDataTable-BJnmvxfb.mjs +387 -0
  20. package/dist/createGroup-CPhp6FUh.mjs +363 -0
  21. package/dist/createPagination-cyOWlpfH.mjs +234 -0
  22. package/dist/createSelection-uqEbFgha.mjs +261 -0
  23. package/dist/createSingle-B59ya3aa.mjs +179 -0
  24. package/dist/createTokens-BlhLdHXE.mjs +682 -0
  25. package/dist/createTrinity-EeHQSsb6.mjs +149 -0
  26. package/dist/data-table/adapters/client/index.d.mts +3 -0
  27. package/dist/data-table/adapters/client/index.mjs +9 -0
  28. package/dist/data-table/adapters/index.d.mts +5 -0
  29. package/dist/data-table/adapters/index.mjs +12 -0
  30. package/dist/data-table/adapters/server/index.d.mts +3 -0
  31. package/dist/data-table/adapters/server/index.mjs +7 -0
  32. package/dist/data-table/adapters/virtual/index.d.mts +3 -0
  33. package/dist/data-table/adapters/virtual/index.mjs +9 -0
  34. package/dist/data-table/index.d.mts +7 -0
  35. package/dist/data-table/index.mjs +25 -0
  36. package/dist/date/index.d.mts +1 -1
  37. package/dist/date/index.mjs +2 -2
  38. package/dist/features/adapters/flagsmith/index.d.mts +16 -0
  39. package/dist/features/adapters/flagsmith/index.mjs +3 -0
  40. package/dist/features/adapters/launchdarkly/index.d.mts +15 -0
  41. package/dist/features/adapters/launchdarkly/index.mjs +3 -0
  42. package/dist/features/adapters/posthog/index.d.mts +15 -0
  43. package/dist/features/adapters/posthog/index.mjs +4 -0
  44. package/dist/features/index.d.mts +17 -0
  45. package/dist/features/index.mjs +18 -0
  46. package/dist/flagsmith-CHmpPGR7.mjs +40 -0
  47. package/dist/{globals-BwYsH-rt.mjs → globals-B_GVfG06.mjs} +2 -2
  48. package/dist/index-7mWYFHA6.d.mts +251 -0
  49. package/dist/index-BDTbJClL.d.mts +11 -0
  50. package/dist/index-BuOz3Rgm.d.mts +32 -0
  51. package/dist/{index-Bmem4l8m.d.mts → index-Bv1VN_j5.d.mts} +1 -1
  52. package/dist/{index-DFM5iBqh.d.mts → index-CQrDeqsK.d.mts} +280 -279
  53. package/dist/{index-2wh69fk5.d.mts → index-Dd0m0LIJ.d.mts} +135 -1407
  54. package/dist/{index-DBZTizq2.d.mts → index-UNwEBkQT.d.mts} +16 -2
  55. package/dist/index.d.mts +20 -7
  56. package/dist/index.mjs +39 -7
  57. package/dist/json/web-types.json +1 -1
  58. package/dist/launchdarkly-W8t8ZANX.mjs +28 -0
  59. package/dist/locale/adapters/index.d.mts +3 -0
  60. package/dist/locale/adapters/index.mjs +6 -0
  61. package/dist/locale/adapters/v0/index.d.mts +3 -0
  62. package/dist/locale/adapters/v0/index.mjs +5 -0
  63. package/dist/locale/index.d.mts +17 -0
  64. package/dist/locale/index.mjs +17 -0
  65. package/dist/logger/adapters/consola/index.d.mts +3 -0
  66. package/dist/logger/adapters/consola/index.mjs +3 -0
  67. package/dist/logger/adapters/index.d.mts +5 -0
  68. package/dist/logger/adapters/index.mjs +8 -0
  69. package/dist/logger/adapters/pino/index.d.mts +3 -0
  70. package/dist/logger/adapters/pino/index.mjs +5 -0
  71. package/dist/logger/adapters/v0/index.d.mts +3 -0
  72. package/dist/logger/adapters/v0/index.mjs +5 -0
  73. package/dist/logger/index.d.mts +17 -0
  74. package/dist/logger/index.mjs +10 -0
  75. package/dist/memory-BsZGbGnG.mjs +27 -0
  76. package/dist/memory-DVjquu_v.d.mts +25 -0
  77. package/dist/permissions/adapters/index.d.mts +18 -0
  78. package/dist/permissions/adapters/index.mjs +6 -0
  79. package/dist/permissions/adapters/v0/index.d.mts +18 -0
  80. package/dist/permissions/adapters/v0/index.mjs +5 -0
  81. package/dist/permissions/index.d.mts +17 -0
  82. package/dist/permissions/index.mjs +15 -0
  83. package/dist/pino-01x_NmWp.mjs +49 -0
  84. package/dist/pino-p-jDkNQd.d.mts +24 -0
  85. package/dist/posthog-BrGBPPir.mjs +50 -0
  86. package/dist/server-6cs14bj1.d.mts +20 -0
  87. package/dist/server-ClCwiLMA.mjs +45 -0
  88. package/dist/storage/adapters/index.d.mts +3 -0
  89. package/dist/storage/adapters/index.mjs +3 -0
  90. package/dist/storage/adapters/memory/index.d.mts +2 -0
  91. package/dist/storage/adapters/memory/index.mjs +3 -0
  92. package/dist/storage/index.d.mts +17 -0
  93. package/dist/storage/index.mjs +37 -0
  94. package/dist/theme/adapters/index.d.mts +17 -0
  95. package/dist/theme/adapters/index.mjs +6 -0
  96. package/dist/theme/adapters/v0/index.d.mts +17 -0
  97. package/dist/theme/adapters/v0/index.mjs +5 -0
  98. package/dist/theme/index.d.mts +17 -0
  99. package/dist/theme/index.mjs +16 -0
  100. package/dist/toArray-DIeXVX1C.mjs +38 -0
  101. package/dist/types/index.d.mts +1 -1
  102. package/dist/useClickOutside-p8HP07At.mjs +4680 -0
  103. package/dist/useFeatures-C4JF3Hgr.mjs +122 -0
  104. package/dist/useLocale-DlbShzF-.mjs +85 -0
  105. package/dist/useLogger-CO9JwbSJ.mjs +283 -0
  106. package/dist/usePermissions-DQVT_4nD.mjs +128 -0
  107. package/dist/useTheme-Bcw1Ebyt.mjs +135 -0
  108. package/dist/utilities/index.d.mts +3 -3
  109. package/dist/utilities/index.mjs +3 -3
  110. package/dist/{utilities-BbKjbXTx.mjs → utilities-BqS1sC1W.mjs} +20 -3
  111. package/dist/v0-B40YkIQ-.mjs +21 -0
  112. package/dist/v0-BOxb3nD1.d.mts +33 -0
  113. package/dist/v0-BogbIzpM.mjs +41 -0
  114. package/dist/v0-BtQCSBOG.mjs +37 -0
  115. package/dist/v0-C-9dv_1S.d.mts +10 -0
  116. package/dist/v0-CtjuUUPl.mjs +73 -0
  117. package/dist/v0-DHMoZ7dS.d.mts +22 -0
  118. package/dist/v0-ONBWyQYQ.mjs +83 -0
  119. package/dist/v0-RepwEY1F.d.mts +9 -0
  120. package/dist/virtual-B3IPkHC0.d.mts +9 -0
  121. package/dist/virtual-BP9WXRzN.mjs +44 -0
  122. package/package.json +34 -2
  123. package/dist/useClickOutside-DrkNYxDe.mjs +0 -8871
  124. /package/dist/{adapter-D95FHAtt.d.mts → adapter-DcwxFryd.d.mts} +0 -0
  125. /package/dist/{constants-DHKqjdjH.mjs → adapters-BGJKsBrw.mjs} +0 -0
  126. /package/dist/{htmlElements-DO9n35bD.mjs → htmlElements-d8iBCGpO.mjs} +0 -0
  127. /package/dist/{index-BLK67J_-.d.mts → index-BFBN5Zl3.d.mts} +0 -0
@@ -0,0 +1,387 @@
1
+ import { l as isNullOrUndefined, p as isString, u as isNumber } from "./utilities-BqS1sC1W.mjs";
2
+ import { i as useContext, n as createContext, t as createTrinity } from "./createTrinity-EeHQSsb6.mjs";
3
+ import { t as createGroup } from "./createGroup-CPhp6FUh.mjs";
4
+ import { a as useLocale } from "./useLocale-DlbShzF-.mjs";
5
+ import { t as ClientAdapter } from "./v0-BogbIzpM.mjs";
6
+ import { computed, shallowReactive, shallowRef, toRef, watch } from "vue";
7
+
8
+ //#region src/composables/createDataTable/index.ts
9
+ /**
10
+ * @module createDataTable
11
+ *
12
+ * @remarks
13
+ * Composable data table that composes existing v0 primitives rather than
14
+ * reimplementing their logic. Uses createGroup's tri-state for sort direction
15
+ * and delegates the data pipeline (filter, sort, paginate) to an adapter.
16
+ *
17
+ * Key features:
18
+ * - Adapter pattern for pipeline strategy (client, server, virtual)
19
+ * - Sort via createGroup tri-state: selected=asc, mixed=desc, unselected=none
20
+ * - Selection strategies: single, page, all
21
+ * - Per-column custom sort/filter functions
22
+ * - Row selectability control via itemSelectable
23
+ * - Sort options: mandate, firstSortOrder
24
+ * - Row selection via lightweight Set (not registry-based)
25
+ * - Trinity pattern for dependency injection
26
+ */
27
+ /**
28
+ * Creates a data table instance with sort controls, selection, and an
29
+ * adapter-driven data pipeline.
30
+ *
31
+ * Must be called inside a component `setup()` or a Vue effect scope.
32
+ * Calling at module scope in SSR environments causes request state leakage.
33
+ *
34
+ * @param options Data table options
35
+ * @returns Data table context with pipeline stages and controls
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { createDataTable } from '@vuetify/v0'
40
+ *
41
+ * const table = createDataTable({
42
+ * items: users,
43
+ * columns: [
44
+ * { key: 'name', title: 'Name', sortable: true, filterable: true },
45
+ * { key: 'email', title: 'Email', sortable: true, filterable: true },
46
+ * { key: 'age', title: 'Age', sortable: true },
47
+ * ],
48
+ * })
49
+ *
50
+ * // Search
51
+ * table.search('john')
52
+ *
53
+ * // Sort
54
+ * table.sort.toggle('name') // asc
55
+ * table.sort.toggle('name') // desc
56
+ * table.sort.toggle('name') // none
57
+ * console.log(table.sort.columns.value) // [{ key: 'name', direction: 'asc' }]
58
+ *
59
+ * // Paginate
60
+ * table.pagination.next()
61
+ *
62
+ * // Select rows
63
+ * table.selection.toggle('user-1')
64
+ * ```
65
+ */
66
+ function createDataTable(options) {
67
+ const { items: _items, columns, itemValue = "id", filter: filterOptions = {}, pagination: paginationOptions = {}, sortMultiple = false, mandate = false, firstSortOrder = "asc", selectStrategy = "page", itemSelectable, groupBy, enroll = false, expandMultiple = true, locale: initialLocale, adapter = new ClientAdapter() } = options;
68
+ const _query = shallowRef("");
69
+ function search(value) {
70
+ _query.value = value;
71
+ }
72
+ const { selectedId: selectedLocale } = useLocale();
73
+ const locale = toRef(() => {
74
+ const selected = selectedLocale?.value;
75
+ if (!/* @__PURE__ */ isNullOrUndefined(selected)) return String(selected);
76
+ return initialLocale;
77
+ });
78
+ const sortable = columns.filter((col) => col.sortable === true);
79
+ const group = createGroup({ multiple: sortMultiple });
80
+ group.onboard(sortable.map((col) => ({
81
+ id: col.key,
82
+ value: col.key
83
+ })));
84
+ const order = shallowReactive([]);
85
+ function toggle(key) {
86
+ if (!group.has(key)) return;
87
+ const isAsc = group.selectedIds.has(key);
88
+ const isDesc = group.mixed(key);
89
+ function clearOthers() {
90
+ if (!sortMultiple) {
91
+ group.mixedIds.clear();
92
+ order.length = 0;
93
+ }
94
+ }
95
+ function setAsc() {
96
+ group.unmix(key);
97
+ group.select(key);
98
+ }
99
+ function setDesc() {
100
+ group.unselect(key);
101
+ group.mix(key);
102
+ }
103
+ function setNone() {
104
+ group.unselect(key);
105
+ group.unmix(key);
106
+ const idx = order.indexOf(key);
107
+ if (idx !== -1) order.splice(idx, 1);
108
+ }
109
+ if (!isAsc && !isDesc) {
110
+ clearOthers();
111
+ if (firstSortOrder === "desc") setDesc();
112
+ else setAsc();
113
+ order.push(key);
114
+ } else if (isAsc) if (firstSortOrder === "desc" && !mandate) setNone();
115
+ else setDesc();
116
+ else if (firstSortOrder === "asc" && !mandate) setNone();
117
+ else setAsc();
118
+ }
119
+ const sortBy = computed(() => {
120
+ const result = [];
121
+ for (const key of order) if (group.selectedIds.has(key)) result.push({
122
+ key,
123
+ direction: "asc"
124
+ });
125
+ else if (group.mixed(key)) result.push({
126
+ key,
127
+ direction: "desc"
128
+ });
129
+ return result;
130
+ });
131
+ function direction(key) {
132
+ if (group.selectedIds.has(key)) return "asc";
133
+ if (group.mixed(key)) return "desc";
134
+ return "none";
135
+ }
136
+ function priority(key) {
137
+ return order.indexOf(key);
138
+ }
139
+ function reset() {
140
+ group.unselectAll();
141
+ group.mixedIds.clear();
142
+ order.length = 0;
143
+ }
144
+ const sort = {
145
+ toggle,
146
+ columns: sortBy,
147
+ order,
148
+ direction,
149
+ priority,
150
+ reset
151
+ };
152
+ const filterable = columns.filter((col) => col.filterable === true).map((col) => col.key);
153
+ const customSorts = {};
154
+ for (const col of columns) if (col.sort) customSorts[col.key] = col.sort;
155
+ const customColumnFilters = {};
156
+ for (const col of columns) if (col.filter) customColumnFilters[col.key] = col.filter;
157
+ const { allItems, filteredItems, sortedItems, items: visible, pagination, total, loading = toRef(() => false), error = toRef(() => null) } = adapter.setup({
158
+ items: _items,
159
+ search: _query,
160
+ filterableKeys: filterable,
161
+ sortBy,
162
+ locale,
163
+ filterOptions,
164
+ paginationOptions,
165
+ customSorts,
166
+ customColumnFilters
167
+ });
168
+ const selectedIds = shallowReactive(/* @__PURE__ */ new Set());
169
+ function rowId(item) {
170
+ const value = item[itemValue];
171
+ if (/* @__PURE__ */ isString(value) || /* @__PURE__ */ isNumber(value)) return value;
172
+ throw new Error(`[v0:data-table] itemValue "${itemValue}" must resolve to a string or number`);
173
+ }
174
+ const selectableIds = computed(() => {
175
+ if (!itemSelectable) return null;
176
+ const ids = /* @__PURE__ */ new Set();
177
+ for (const item of allItems.value) if (item[itemSelectable]) ids.add(rowId(item));
178
+ return ids;
179
+ });
180
+ function isSelectable(id) {
181
+ return !selectableIds.value || selectableIds.value.has(id);
182
+ }
183
+ const scopeItems = toRef(() => {
184
+ if (selectStrategy === "single") return [];
185
+ return selectStrategy === "all" ? sortedItems.value : visible.value;
186
+ });
187
+ const selectableScope = computed(() => {
188
+ if (!itemSelectable) return scopeItems.value;
189
+ return scopeItems.value.filter((item) => !!item[itemSelectable]);
190
+ });
191
+ const selection = {
192
+ selectedIds,
193
+ select(id) {
194
+ if (!isSelectable(id)) return;
195
+ if (selectStrategy === "single") selectedIds.clear();
196
+ selectedIds.add(id);
197
+ },
198
+ unselect(id) {
199
+ selectedIds.delete(id);
200
+ },
201
+ toggle(id) {
202
+ if (selectedIds.has(id)) selectedIds.delete(id);
203
+ else selection.select(id);
204
+ },
205
+ isSelected(id) {
206
+ return selectedIds.has(id);
207
+ },
208
+ isSelectable,
209
+ selectAll() {
210
+ for (const item of selectableScope.value) selectedIds.add(rowId(item));
211
+ },
212
+ unselectAll() {
213
+ selectedIds.clear();
214
+ },
215
+ toggleAll() {
216
+ if (selectStrategy === "single") return;
217
+ if (selection.isAllSelected.value) for (const item of selectableScope.value) selectedIds.delete(rowId(item));
218
+ else selection.selectAll();
219
+ },
220
+ isAllSelected: computed(() => {
221
+ const items = selectableScope.value;
222
+ if (items.length === 0) return false;
223
+ return items.every((item) => selectedIds.has(rowId(item)));
224
+ }),
225
+ isMixed: computed(() => {
226
+ const items = selectableScope.value;
227
+ if (items.length === 0) return false;
228
+ return items.some((item) => selectedIds.has(rowId(item))) && !selection.isAllSelected.value;
229
+ })
230
+ };
231
+ const expandedIds = shallowReactive(/* @__PURE__ */ new Set());
232
+ const expansion = {
233
+ expandedIds,
234
+ expand(id) {
235
+ if (!expandMultiple) expandedIds.clear();
236
+ expandedIds.add(id);
237
+ },
238
+ collapse(id) {
239
+ expandedIds.delete(id);
240
+ },
241
+ toggle(id) {
242
+ if (expandedIds.has(id)) expandedIds.delete(id);
243
+ else expansion.expand(id);
244
+ },
245
+ isExpanded(id) {
246
+ return expandedIds.has(id);
247
+ },
248
+ expandAll() {
249
+ if (!expandMultiple) return;
250
+ for (const item of visible.value) expandedIds.add(rowId(item));
251
+ },
252
+ collapseAll() {
253
+ expandedIds.clear();
254
+ }
255
+ };
256
+ const openGroupKeys = shallowReactive(/* @__PURE__ */ new Set());
257
+ const groups = computed(() => {
258
+ if (!groupBy) return [];
259
+ const map = /* @__PURE__ */ new Map();
260
+ for (const item of sortedItems.value) {
261
+ const raw = item[groupBy];
262
+ const key = String(raw ?? "");
263
+ let entry = map.get(key);
264
+ if (!entry) {
265
+ entry = {
266
+ value: raw,
267
+ items: []
268
+ };
269
+ map.set(key, entry);
270
+ }
271
+ entry.items.push(item);
272
+ }
273
+ const result = [];
274
+ for (const [key, entry] of map) result.push({
275
+ key,
276
+ value: entry.value,
277
+ items: entry.items
278
+ });
279
+ return result;
280
+ });
281
+ if (enroll) {
282
+ for (const group$1 of groups.value) openGroupKeys.add(group$1.key);
283
+ if (groups.value.length === 0) {
284
+ const stop = watch(groups, (newGroups) => {
285
+ if (newGroups.length === 0) return;
286
+ for (const group$1 of newGroups) openGroupKeys.add(group$1.key);
287
+ stop();
288
+ });
289
+ }
290
+ }
291
+ return {
292
+ items: visible,
293
+ allItems,
294
+ filteredItems,
295
+ sortedItems,
296
+ columns,
297
+ search,
298
+ query: _query,
299
+ sort,
300
+ pagination,
301
+ selection,
302
+ expansion,
303
+ grouping: {
304
+ groups,
305
+ toggle(groupKey) {
306
+ if (openGroupKeys.has(groupKey)) openGroupKeys.delete(groupKey);
307
+ else openGroupKeys.add(groupKey);
308
+ },
309
+ isOpen(groupKey) {
310
+ return openGroupKeys.has(groupKey);
311
+ },
312
+ open(groupKey) {
313
+ openGroupKeys.add(groupKey);
314
+ },
315
+ close(groupKey) {
316
+ openGroupKeys.delete(groupKey);
317
+ },
318
+ openAll() {
319
+ for (const group$1 of groups.value) openGroupKeys.add(group$1.key);
320
+ },
321
+ closeAll() {
322
+ openGroupKeys.clear();
323
+ }
324
+ },
325
+ total,
326
+ loading,
327
+ error
328
+ };
329
+ }
330
+ /**
331
+ * Creates a data table context with dependency injection support.
332
+ *
333
+ * @param options Data table context options including namespace
334
+ * @returns A trinity tuple: [useDataTable, provideDataTable, defaultContext]
335
+ *
336
+ * @example
337
+ * ```ts
338
+ * import { createDataTableContext } from '@vuetify/v0'
339
+ *
340
+ * const [useDataTable, provideDataTable, context] = createDataTableContext({
341
+ * namespace: 'app:users',
342
+ * items: users,
343
+ * columns: [
344
+ * { key: 'name', title: 'Name', sortable: true },
345
+ * ],
346
+ * })
347
+ *
348
+ * // Parent component
349
+ * provideDataTable()
350
+ *
351
+ * // Child component
352
+ * const table = useDataTable()
353
+ * ```
354
+ */
355
+ function createDataTableContext(_options) {
356
+ const { namespace = "v0:data-table", ...options } = _options;
357
+ const [useDataTableContext, _provideDataTableContext] = createContext(namespace);
358
+ const context = createDataTable(options);
359
+ function provideDataTableContext(_context = context, app) {
360
+ return _provideDataTableContext(_context, app);
361
+ }
362
+ return createTrinity(useDataTableContext, provideDataTableContext, context);
363
+ }
364
+ /**
365
+ * Returns the current data table context from dependency injection.
366
+ *
367
+ * @typeParam T - Must be provided explicitly; cannot be inferred from namespace.
368
+ * Prefer the `useX` function from {@link createDataTableContext} for type-safe injection.
369
+ *
370
+ * @param namespace The namespace for the data table context. @default 'v0:data-table'
371
+ * @returns The current data table context
372
+ *
373
+ * @example
374
+ * ```vue
375
+ * <script setup lang="ts">
376
+ * import { useDataTable } from '@vuetify/v0'
377
+ *
378
+ * const table = useDataTable<User>()
379
+ * <\/script>
380
+ * ```
381
+ */
382
+ function useDataTable(namespace = "v0:data-table") {
383
+ return useContext(namespace);
384
+ }
385
+
386
+ //#endregion
387
+ export { createDataTableContext as n, useDataTable as r, createDataTable as t };