@vuetify/v0 1.0.0-alpha.4 → 1.0.0-beta.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 (145) hide show
  1. package/README.md +26 -5
  2. package/dist/{adapter-C9cR4AcY.mjs → adapter-BCVxBtDp.mjs} +11 -11
  3. package/dist/{adapter-Cr7Bl4la.d.mts → adapter-BO75n0Cn.d.mts} +7 -7
  4. package/dist/{adapter-C6JmOyYo.d.mts → adapter-DZeI0ZbW.d.mts} +1 -1
  5. package/dist/{adapter-DgBBe_BW.d.mts → adapter-we-0GbFH.d.mts} +2 -2
  6. package/dist/adapters-BHD1lc-K.mjs +4 -0
  7. package/dist/adapters-BYLWDmYl.mjs +5 -0
  8. package/dist/adapters-BxrTL8E3.mjs +4 -0
  9. package/dist/adapters-CBgBd7VE.mjs +2 -0
  10. package/dist/browser/index.js +2860 -908
  11. package/dist/components/index.d.mts +2 -3
  12. package/dist/components/index.mjs +2 -2
  13. package/dist/{components-BWxMSWr7.mjs → components-_uxZ_Zo3.mjs} +1054 -502
  14. package/dist/composables/index.d.mts +19 -18
  15. package/dist/composables/index.mjs +26 -26
  16. package/dist/{consola-Crr4qbeI.d.mts → consola-CUNHyu8J.d.mts} +1 -1
  17. package/dist/{consola-DYvbPNbF.mjs → consola-cad-VEV2.mjs} +5 -1
  18. package/dist/constants/index.d.mts +1 -1
  19. package/dist/constants/index.mjs +1 -1
  20. package/dist/{createDataTable-DDr2yY-A.mjs → createDataTable-DlFQyBTN.mjs} +192 -101
  21. package/dist/{createGroup-BSGtfBUE.mjs → createGroup-DsKJMuRd.mjs} +2 -2
  22. package/dist/{createRegistry-Db_juawd.mjs → createRegistry-tJ1PPNIr.mjs} +2 -2
  23. package/dist/{createSelection-BeKZMxha.mjs → createSelection-DEqhvdoj.mjs} +2 -2
  24. package/dist/{createSingle-Dms2efxr.mjs → createSingle-ClzWqRCe.mjs} +2 -2
  25. package/dist/{createTokens-B1lwHZvO.mjs → createTokens-mNxs8DQ3.mjs} +3 -3
  26. package/dist/{createTrinity-BTCs1pYx.mjs → createTrinity-z-3q9QWR.mjs} +5 -2
  27. package/dist/data-table/adapters/client/index.d.mts +1 -1
  28. package/dist/data-table/adapters/client/index.mjs +1 -1
  29. package/dist/data-table/adapters/index.d.mts +4 -4
  30. package/dist/data-table/adapters/index.mjs +5 -5
  31. package/dist/data-table/adapters/server/index.d.mts +1 -1
  32. package/dist/data-table/adapters/server/index.mjs +1 -1
  33. package/dist/data-table/adapters/virtual/index.d.mts +1 -1
  34. package/dist/data-table/adapters/virtual/index.mjs +1 -1
  35. package/dist/data-table/index.d.mts +6 -6
  36. package/dist/data-table/index.mjs +5 -5
  37. package/dist/date/index.d.mts +1 -1
  38. package/dist/date/index.mjs +2 -2
  39. package/dist/features/adapters/flagsmith/index.d.mts +1 -1
  40. package/dist/features/adapters/launchdarkly/index.d.mts +1 -1
  41. package/dist/features/adapters/posthog/index.d.mts +1 -1
  42. package/dist/features/adapters/posthog/index.mjs +1 -1
  43. package/dist/features/index.d.mts +2 -2
  44. package/dist/features/index.mjs +1 -1
  45. package/dist/{flagsmith-ygKMImos.d.mts → flagsmith-Cn_KVy6v.d.mts} +1 -1
  46. package/dist/{globals-BAe6tA_x.mjs → globals-DB-krEA-.mjs} +1 -1
  47. package/dist/{index-B3-FstpY.d.mts → index-ATZqco03.d.mts} +95 -2
  48. package/dist/{index-jQPkwo3G.d.mts → index-B3PDLk_Y.d.mts} +879 -454
  49. package/dist/{index-Cw04PFVO.d.mts → index-BIyQ3OxC.d.mts} +2 -168
  50. package/dist/{index-BfpLkDR_.d.mts → index-BN06veYe.d.mts} +947 -225
  51. package/dist/{index-CLR1QMM3.d.mts → index-DHmuwBdv.d.mts} +60 -1
  52. package/dist/index-DWAgQOBa.d.mts +170 -0
  53. package/dist/{index-BA7YU2xY.d.mts → index-ZD3hw2Zo.d.mts} +123 -62
  54. package/dist/index.d.mts +23 -22
  55. package/dist/index.mjs +29 -29
  56. package/dist/json/attributes.json +128 -0
  57. package/dist/json/importMap.json +24 -0
  58. package/dist/json/tags.json +57 -0
  59. package/dist/json/web-types.json +375 -2
  60. package/dist/{launchdarkly-BJR4vbbV.d.mts → launchdarkly-C3Knz7-v.d.mts} +1 -1
  61. package/dist/locale/adapters/index.d.mts +2 -2
  62. package/dist/locale/adapters/index.mjs +2 -2
  63. package/dist/locale/adapters/v0/index.d.mts +1 -1
  64. package/dist/locale/adapters/v0/index.mjs +1 -1
  65. package/dist/locale/adapters/vue-i18n/index.d.mts +1 -1
  66. package/dist/locale/index.d.mts +3 -3
  67. package/dist/locale/index.mjs +2 -2
  68. package/dist/logger/adapters/consola/index.d.mts +1 -1
  69. package/dist/logger/adapters/consola/index.mjs +1 -1
  70. package/dist/logger/adapters/index.d.mts +4 -4
  71. package/dist/logger/adapters/index.mjs +4 -4
  72. package/dist/logger/adapters/pino/index.d.mts +1 -1
  73. package/dist/logger/adapters/pino/index.mjs +1 -1
  74. package/dist/logger/adapters/v0/index.d.mts +1 -1
  75. package/dist/logger/adapters/v0/index.mjs +1 -1
  76. package/dist/logger/index.d.mts +5 -5
  77. package/dist/logger/index.mjs +4 -4
  78. package/dist/notifications/index.d.mts +1 -1
  79. package/dist/notifications/index.mjs +2 -2
  80. package/dist/palettes/ant/generate/index.mjs +6 -1
  81. package/dist/palettes/ant/index.d.mts +1 -1
  82. package/dist/palettes/index.d.mts +3 -3
  83. package/dist/palettes/leonardo/generate/index.mjs +6 -2
  84. package/dist/palettes/material/generate/index.mjs +11 -2
  85. package/dist/palettes/material/index.d.mts +1 -1
  86. package/dist/palettes/md1/index.d.mts +1 -1
  87. package/dist/palettes/md2/index.d.mts +1 -1
  88. package/dist/palettes/radix/index.d.mts +1 -1
  89. package/dist/palettes/tailwind/index.d.mts +1 -1
  90. package/dist/permissions/adapters/index.d.mts +1 -1
  91. package/dist/permissions/adapters/v0/index.d.mts +1 -1
  92. package/dist/permissions/index.d.mts +1 -1
  93. package/dist/permissions/index.mjs +1 -1
  94. package/dist/{pino-NmR7X0s4.d.mts → pino-BaYY_KIN.d.mts} +1 -1
  95. package/dist/{pino-CIcYlW3u.mjs → pino-BscMO3RR.mjs} +5 -2
  96. package/dist/{posthog-B3go2aCh.mjs → posthog-B5s_KGhy.mjs} +1 -1
  97. package/dist/{posthog-CQntUXFO.d.mts → posthog-CR8R2ywM.d.mts} +1 -1
  98. package/dist/rules/index.d.mts +2 -2
  99. package/dist/rules/index.mjs +1 -1
  100. package/dist/{server-DQK305lc.d.mts → server-7vjHxjNc.d.mts} +1 -1
  101. package/dist/{server-ZFXbgQoY.mjs → server-CZ83nTn_.mjs} +1 -1
  102. package/dist/storage/adapters/index.d.mts +2 -2
  103. package/dist/storage/adapters/memory/index.d.mts +1 -1
  104. package/dist/storage/index.d.mts +3 -3
  105. package/dist/storage/index.mjs +1 -1
  106. package/dist/theme/adapters/index.d.mts +1 -1
  107. package/dist/theme/adapters/index.mjs +3 -3
  108. package/dist/theme/adapters/unhead/index.d.mts +1 -1
  109. package/dist/theme/adapters/unhead/index.mjs +1 -1
  110. package/dist/theme/adapters/v0/index.d.mts +1 -1
  111. package/dist/theme/adapters/v0/index.mjs +1 -1
  112. package/dist/theme/index.d.mts +1 -1
  113. package/dist/theme/index.mjs +3 -3
  114. package/dist/types/index.d.mts +2 -2
  115. package/dist/{unhead-dPyVkgiJ.mjs → unhead-CG672gKh.mjs} +1 -1
  116. package/dist/{useClickOutside-B8naChaQ.mjs → useClickOutside-DoOgNtrj.mjs} +1583 -436
  117. package/dist/{useFeatures-x2iKp0C8.mjs → useFeatures-B-A-eOo-.mjs} +4 -4
  118. package/dist/{useLocale-BUms59Bw.mjs → useLocale-CbpoxbVU.mjs} +5 -5
  119. package/dist/{useLogger-DPSSa-YR.mjs → useLogger-CTgAedNH.mjs} +51 -7
  120. package/dist/{useNotifications-BPTmZWQy.mjs → useNotifications-BkKGUl_1.mjs} +6 -6
  121. package/dist/{usePermissions-CTi-3pBk.mjs → usePermissions-BYOrKcnk.mjs} +2 -2
  122. package/dist/{useRules-DNhljkyO.mjs → useRules-mD_DY9dy.mjs} +4 -3
  123. package/dist/{useTheme-3vW3kFNg.mjs → useTheme-B1lUya5B.mjs} +5 -5
  124. package/dist/utilities/index.d.mts +2 -2
  125. package/dist/utilities/index.mjs +116 -2
  126. package/dist/{v0-DadOcxFI.mjs → v0-Bx5Mi7qE.mjs} +1 -1
  127. package/dist/{v0-YJQoTLsp.mjs → v0-CG9o3on7.mjs} +1 -1
  128. package/dist/{v0-CotC1PiS.mjs → v0-CHK79mZX.mjs} +1 -1
  129. package/dist/{v0-DAlKpCR8.mjs → v0-COaQncfZ.mjs} +1 -1
  130. package/dist/{v0-CRGArJim.d.mts → v0-DWZ_N2GG.d.mts} +1 -1
  131. package/dist/{v0-DYsCJPIu.d.mts → v0-QIjffi4E.d.mts} +1 -1
  132. package/dist/{v0-DDELiSI6.d.mts → v0-WzS4GAIp.d.mts} +1 -1
  133. package/dist/{virtual-BqCRw0ly.d.mts → virtual-CrgGA-o6.d.mts} +1 -1
  134. package/dist/{virtual-Dnno49F8.mjs → virtual-UumJ2BQ9.mjs} +1 -1
  135. package/package.json +12 -3
  136. package/dist/adapters-B25KaYU4.mjs +0 -2
  137. package/dist/adapters-BcddLSNs.mjs +0 -4
  138. package/dist/adapters-Dv74Jk6A.mjs +0 -5
  139. package/dist/adapters-t6QC-zE8.mjs +0 -3
  140. /package/dist/{adapter-Dzyrlbz7.d.mts → adapter-B6IrPwib.d.mts} +0 -0
  141. /package/dist/{adapter-o8r-2vUn.d.mts → adapter-BEJXp-ie.d.mts} +0 -0
  142. /package/dist/{index-DWfPppPU.d.mts → index-BOn0AAue.d.mts} +0 -0
  143. /package/dist/{index-DewYtDsc.d.mts → index-C6NnIuDv.d.mts} +0 -0
  144. /package/dist/{index-DJQwYeyx.d.mts → index-PvkxPev3.d.mts} +0 -0
  145. /package/dist/{memory-B0w39kno.d.mts → memory-D-JbdKXg.d.mts} +0 -0
@@ -1,9 +1,10 @@
1
- import { isNullOrUndefined, isNumber, isString } from "./utilities/index.mjs";
2
- import { i as useContext, t as createTrinity } from "./createTrinity-BTCs1pYx.mjs";
3
- import { a as useLocale } from "./useLocale-BUms59Bw.mjs";
4
- import { t as createGroup } from "./createGroup-BSGtfBUE.mjs";
5
- import { t as ClientDataTableAdapter } from "./v0-DAlKpCR8.mjs";
6
- import "./adapters-Dv74Jk6A.mjs";
1
+ import { isNullOrUndefined } from "./utilities/index.mjs";
2
+ import { i as useContext, t as createTrinity } from "./createTrinity-z-3q9QWR.mjs";
3
+ import { t as createRegistry } from "./createRegistry-tJ1PPNIr.mjs";
4
+ import { a as useLocale } from "./useLocale-CbpoxbVU.mjs";
5
+ import { t as createGroup } from "./createGroup-DsKJMuRd.mjs";
6
+ import { t as ClientDataTableAdapter } from "./v0-COaQncfZ.mjs";
7
+ import "./adapters-BYLWDmYl.mjs";
7
8
  import { computed, shallowReactive, shallowReadonly, shallowRef, toRef, watch } from "vue";
8
9
  //#region src/composables/createDataTable/columns.ts
9
10
  /**
@@ -49,7 +50,7 @@ function resolveHeaders(columns) {
49
50
  for (const col of cols) if (col.children?.length) {
50
51
  const leaves = /* @__PURE__ */ extractLeaves(col.children);
51
52
  rows[depth].push({
52
- key: col.key,
53
+ id: col.id,
53
54
  title: col.title ?? "",
54
55
  colspan: leaves.length,
55
56
  rowspan: 1,
@@ -57,7 +58,7 @@ function resolveHeaders(columns) {
57
58
  });
58
59
  walk(col.children, depth + 1);
59
60
  } else rows[depth].push({
60
- key: col.key,
61
+ id: col.id,
61
62
  title: col.title ?? "",
62
63
  colspan: 1,
63
64
  rowspan: maxDepth - depth + 1,
@@ -79,6 +80,12 @@ function resolveHeaders(columns) {
79
80
  * reimplementing their logic. Uses createGroup's tri-state for sort direction
80
81
  * and delegates the data pipeline (filter, sort, paginate) to an adapter.
81
82
  *
83
+ * Rows and columns are both managed via internal registries. Call
84
+ * `table.columns.onboard([...])` / `table.columns.register({...})` to add
85
+ * columns and `table.onboard([...])` / `table.register({...})` for rows.
86
+ * Row identity is the ticket id (caller-supplied or auto-generated); column
87
+ * identity is the caller-supplied `id` (required — no auto-generation).
88
+ *
82
89
  * Key features:
83
90
  * - Adapter pattern for pipeline strategy (client, server, virtual)
84
91
  * - Sort via createGroup tri-state: selected=asc, mixed=desc, unselected=none
@@ -93,10 +100,18 @@ function resolveHeaders(columns) {
93
100
  * ```ts
94
101
  * import { createDataTable } from '@vuetify/v0'
95
102
  *
96
- * const table = createDataTable({
97
- * items: [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }],
98
- * columns: [{ key: 'name', title: 'Name', sortable: true }],
99
- * })
103
+ * const table = createDataTable<User>()
104
+ *
105
+ * table.columns.onboard([
106
+ * { id: 'name', title: 'Name', sortable: true },
107
+ * { id: 'email', title: 'Email', filterable: true },
108
+ * ])
109
+ *
110
+ * table.onboard([
111
+ * { id: 1, value: { id: 1, name: 'Alice', email: 'alice@test.com' } },
112
+ * { id: 2, value: { id: 2, name: 'Bob', email: 'bob@test.com' } },
113
+ * ])
114
+ *
100
115
  * table.sort.toggle('name')
101
116
  * ```
102
117
  */
@@ -104,43 +119,53 @@ function resolveHeaders(columns) {
104
119
  * Creates a data table instance with sort controls, selection, and an
105
120
  * adapter-driven data pipeline.
106
121
  *
122
+ * Rows and columns are both managed via internal registries. Use
123
+ * `table.columns.register({ id, ... })` / `table.columns.onboard([...])` to
124
+ * add columns and `table.register({ id, value })` / `table.onboard([...])`
125
+ * for rows. Removing entries from the column registry reactively updates
126
+ * `leaves`, `headers`, the sort group, and the filter pipeline.
127
+ *
107
128
  * Must be called inside a component `setup()` or a Vue effect scope.
108
129
  * Calling at module scope in SSR environments causes request state leakage.
109
130
  *
110
- * @param options Data table options
111
- * @returns Data table context with pipeline stages and controls
131
+ * @param options Data table options (all optional)
132
+ * @returns Data table context with pipeline stages, controls, and registry surface
112
133
  *
113
134
  * @example
114
135
  * ```ts
115
136
  * import { createDataTable } from '@vuetify/v0'
116
137
  *
117
- * const table = createDataTable({
118
- * items: users,
119
- * columns: [
120
- * { key: 'name', title: 'Name', sortable: true, filterable: true },
121
- * { key: 'email', title: 'Email', sortable: true, filterable: true },
122
- * { key: 'age', title: 'Age', sortable: true },
123
- * ],
124
- * })
138
+ * const table = createDataTable<User>()
139
+ *
140
+ * table.columns.onboard([
141
+ * { id: 'name', title: 'Name', sortable: true, filterable: true },
142
+ * { id: 'email', title: 'Email', sortable: true, filterable: true },
143
+ * { id: 'age', title: 'Age', sortable: true },
144
+ * ])
145
+ *
146
+ * table.onboard(users.map(value => ({ id: value.id, value })))
125
147
  *
126
- * // Search
127
148
  * table.search('john')
128
149
  *
129
- * // Sort
130
- * table.sort.toggle('name') // asc
131
- * table.sort.toggle('name') // desc
132
- * table.sort.toggle('name') // none
133
- * console.log(table.sort.columns.value) // [{ key: 'name', direction: 'asc' }]
150
+ * table.sort.toggle('name')
151
+ * table.sort.toggle('name')
152
+ * table.sort.toggle('name')
134
153
  *
135
- * // Paginate
136
154
  * table.pagination.next()
137
155
  *
138
- * // Select rows
139
- * table.selection.toggle('user-1')
156
+ * table.selection.toggle(1)
140
157
  * ```
141
158
  */
142
- function createDataTable(options) {
143
- const { items: _items, columns, itemValue = "id", filter: filterOptions = {}, pagination: paginationOptions = {}, sortMultiple = false, mandate = false, firstSortOrder = "asc", selectStrategy = "page", itemSelectable, groupBy, openAll = false, expandMultiple = true, locale: initialLocale, adapter = new ClientDataTableAdapter() } = options;
159
+ function createDataTable(options = {}) {
160
+ const { filter: filterOptions = {}, pagination: paginationOptions = {}, sortMultiple = false, mandate = false, firstSortOrder = "asc", selectStrategy = "page", itemSelectable, groupBy, openAll = false, expandMultiple = true, locale: initialLocale, adapter = new ClientDataTableAdapter() } = options;
161
+ const registry = createRegistry({
162
+ events: true,
163
+ reactive: true
164
+ });
165
+ const columns = createRegistry({
166
+ events: true,
167
+ reactive: true
168
+ });
144
169
  const _query = shallowRef("");
145
170
  function search(value) {
146
171
  _query.value = value;
@@ -151,44 +176,60 @@ function createDataTable(options) {
151
176
  if (!/* @__PURE__ */ isNullOrUndefined(selected)) return String(selected);
152
177
  return initialLocale;
153
178
  });
154
- const leaves = /* @__PURE__ */ extractLeaves(columns);
155
- const headers = toRef(() => /* @__PURE__ */ resolveHeaders(columns));
156
- const sortable = leaves.filter((col) => col.sortable === true);
179
+ const leaves = computed(() => /* @__PURE__ */ extractLeaves(columns.values()));
180
+ const headers = computed(() => /* @__PURE__ */ resolveHeaders(columns.values()));
181
+ const sortable = computed(() => leaves.value.filter((col) => col.sortable === true));
157
182
  const group = createGroup({ multiple: sortMultiple });
158
- group.onboard(sortable.map((col) => ({
159
- id: col.key,
160
- value: col.key
161
- })));
162
183
  const order = shallowReactive([]);
163
- function toggle(key) {
164
- if (!group.has(key)) return;
165
- const isAsc = group.selectedIds.has(key);
166
- const isDesc = group.mixed(key);
184
+ watch(sortable, (next) => {
185
+ const ids = /* @__PURE__ */ new Set();
186
+ for (const col of next) ids.add(String(col.id));
187
+ for (const id of group.keys()) {
188
+ const key = String(id);
189
+ if (!ids.has(key)) {
190
+ group.unregister(id);
191
+ const index = order.indexOf(key);
192
+ if (index !== -1) order.splice(index, 1);
193
+ }
194
+ }
195
+ for (const id of ids) if (!group.has(id)) group.register({
196
+ id,
197
+ value: id
198
+ });
199
+ }, {
200
+ flush: "sync",
201
+ immediate: true
202
+ });
203
+ function toggle(id) {
204
+ if (!group.has(id)) return;
205
+ const isAsc = group.selectedIds.has(id);
206
+ const isDesc = group.mixed(id);
167
207
  function clearOthers() {
168
208
  if (!sortMultiple) {
209
+ group.unselectAll();
169
210
  group.mixedIds.clear();
170
211
  order.length = 0;
171
212
  }
172
213
  }
173
214
  function setAsc() {
174
- group.unmix(key);
175
- group.select(key);
215
+ group.unmix(id);
216
+ group.select(id);
176
217
  }
177
218
  function setDesc() {
178
- group.unselect(key);
179
- group.mix(key);
219
+ group.unselect(id);
220
+ group.mix(id);
180
221
  }
181
222
  function setNone() {
182
- group.unselect(key);
183
- group.unmix(key);
184
- const index = order.indexOf(key);
223
+ group.unselect(id);
224
+ group.unmix(id);
225
+ const index = order.indexOf(id);
185
226
  if (index !== -1) order.splice(index, 1);
186
227
  }
187
228
  if (!isAsc && !isDesc) {
188
229
  clearOthers();
189
230
  if (firstSortOrder === "desc") setDesc();
190
231
  else setAsc();
191
- order.push(key);
232
+ order.push(id);
192
233
  } else if (isAsc) if (firstSortOrder === "desc" && !mandate) setNone();
193
234
  else setDesc();
194
235
  else if (firstSortOrder === "asc" && !mandate) setNone();
@@ -196,23 +237,23 @@ function createDataTable(options) {
196
237
  }
197
238
  const sortBy = computed(() => {
198
239
  const result = [];
199
- for (const key of order) if (group.selectedIds.has(key)) result.push({
200
- key,
240
+ for (const id of order) if (group.selectedIds.has(id)) result.push({
241
+ key: id,
201
242
  direction: "asc"
202
243
  });
203
- else if (group.mixed(key)) result.push({
204
- key,
244
+ else if (group.mixed(id)) result.push({
245
+ key: id,
205
246
  direction: "desc"
206
247
  });
207
248
  return result;
208
249
  });
209
- function direction(key) {
210
- if (group.selectedIds.has(key)) return "asc";
211
- if (group.mixed(key)) return "desc";
250
+ function direction(id) {
251
+ if (group.selectedIds.has(id)) return "asc";
252
+ if (group.mixed(id)) return "desc";
212
253
  return "none";
213
254
  }
214
- function priority(key) {
215
- return order.indexOf(key);
255
+ function priority(id) {
256
+ return order.indexOf(id);
216
257
  }
217
258
  function reset() {
218
259
  group.unselectAll();
@@ -227,32 +268,41 @@ function createDataTable(options) {
227
268
  priority,
228
269
  reset
229
270
  };
230
- const filterable = leaves.filter((col) => col.filterable === true).map((col) => col.key);
231
- const sorts = {};
232
- for (const col of leaves) if (col.sort) sorts[col.key] = col.sort;
233
- const filters = {};
234
- for (const col of leaves) if (col.filter) filters[col.key] = col.filter;
271
+ const filterable = computed(() => {
272
+ const ids = [];
273
+ for (const col of leaves.value) if (col.filterable === true) ids.push(String(col.id));
274
+ return ids;
275
+ });
276
+ const customSorts = computed(() => {
277
+ const sorts = {};
278
+ for (const col of leaves.value) if (col.sort) sorts[String(col.id)] = col.sort;
279
+ return sorts;
280
+ });
281
+ const customColumnFilters = computed(() => {
282
+ const filters = {};
283
+ for (const col of leaves.value) if (col.filter) filters[String(col.id)] = col.filter;
284
+ return filters;
285
+ });
286
+ const source = computed(() => registry.values().map((t) => t.value));
235
287
  const { allItems, filteredItems, sortedItems, items: visible, pagination, total, loading = toRef(() => false), error = toRef(() => null) } = adapter.setup({
236
- items: _items,
288
+ items: source,
237
289
  search: _query,
238
290
  filterableKeys: filterable,
239
291
  sortBy,
240
292
  locale,
241
293
  filterOptions,
242
294
  paginationOptions,
243
- customSorts: sorts,
244
- customColumnFilters: filters
295
+ customSorts,
296
+ customColumnFilters
245
297
  });
246
298
  const selectedIds = shallowReactive(/* @__PURE__ */ new Set());
247
- function rowId(item) {
248
- const value = item[itemValue];
249
- if (/* @__PURE__ */ isString(value) || /* @__PURE__ */ isNumber(value)) return value;
250
- throw new Error(`[v0:data-table] itemValue "${itemValue}" must resolve to a string or number`);
251
- }
252
299
  const selectableIds = computed(() => {
253
300
  if (!itemSelectable) return null;
254
301
  const ids = /* @__PURE__ */ new Set();
255
- for (const item of allItems.value) if (item[itemSelectable]) ids.add(rowId(item));
302
+ for (const ticket of registry.values()) {
303
+ const value = ticket.value;
304
+ if (!/* @__PURE__ */ isNullOrUndefined(value) && value[itemSelectable]) ids.add(ticket.id);
305
+ }
256
306
  return ids;
257
307
  });
258
308
  function isSelectable(id) {
@@ -262,9 +312,18 @@ function createDataTable(options) {
262
312
  if (selectStrategy === "single") return [];
263
313
  return selectStrategy === "all" ? sortedItems.value : visible.value;
264
314
  });
265
- const selectableScope = computed(() => {
266
- if (!itemSelectable) return scopeItems.value;
267
- return scopeItems.value.filter((item) => !!item[itemSelectable]);
315
+ const scopedTickets = computed(() => {
316
+ const scope = scopeItems.value;
317
+ if (scope.length === 0) return [];
318
+ const set = new Set(scope);
319
+ const result = [];
320
+ for (const ticket of registry.values()) {
321
+ const value = ticket.value;
322
+ if (/* @__PURE__ */ isNullOrUndefined(value) || !set.has(value)) continue;
323
+ if (itemSelectable && !value[itemSelectable]) continue;
324
+ result.push(ticket);
325
+ }
326
+ return result;
268
327
  });
269
328
  const selection = {
270
329
  selectedIds,
@@ -285,28 +344,39 @@ function createDataTable(options) {
285
344
  },
286
345
  isSelectable,
287
346
  selectAll() {
288
- for (const item of selectableScope.value) selectedIds.add(rowId(item));
347
+ for (const ticket of scopedTickets.value) selectedIds.add(ticket.id);
289
348
  },
290
349
  unselectAll() {
291
350
  selectedIds.clear();
292
351
  },
293
352
  toggleAll() {
294
353
  if (selectStrategy === "single") return;
295
- if (selection.isAllSelected.value) for (const item of selectableScope.value) selectedIds.delete(rowId(item));
354
+ if (selection.isAllSelected.value) for (const ticket of scopedTickets.value) selectedIds.delete(ticket.id);
296
355
  else selection.selectAll();
297
356
  },
298
357
  isAllSelected: computed(() => {
299
- const items = selectableScope.value;
300
- if (items.length === 0) return false;
301
- return items.every((item) => selectedIds.has(rowId(item)));
358
+ const tickets = scopedTickets.value;
359
+ if (tickets.length === 0) return false;
360
+ return tickets.every((ticket) => selectedIds.has(ticket.id));
302
361
  }),
303
362
  isMixed: computed(() => {
304
- const items = selectableScope.value;
305
- if (items.length === 0) return false;
306
- return items.some((item) => selectedIds.has(rowId(item))) && !selection.isAllSelected.value;
363
+ const tickets = scopedTickets.value;
364
+ if (tickets.length === 0) return false;
365
+ return tickets.some((ticket) => selectedIds.has(ticket.id)) && !selection.isAllSelected.value;
307
366
  })
308
367
  };
309
368
  const expandedIds = shallowReactive(/* @__PURE__ */ new Set());
369
+ const visibleTickets = computed(() => {
370
+ const scope = visible.value;
371
+ if (scope.length === 0) return [];
372
+ const set = new Set(scope);
373
+ const result = [];
374
+ for (const ticket of registry.values()) {
375
+ const value = ticket.value;
376
+ if (!/* @__PURE__ */ isNullOrUndefined(value) && set.has(value)) result.push(ticket);
377
+ }
378
+ return result;
379
+ });
310
380
  const expansion = {
311
381
  expandedIds,
312
382
  expand(id) {
@@ -325,12 +395,20 @@ function createDataTable(options) {
325
395
  },
326
396
  expandAll() {
327
397
  if (!expandMultiple) return;
328
- for (const item of visible.value) expandedIds.add(rowId(item));
398
+ for (const ticket of visibleTickets.value) expandedIds.add(ticket.id);
329
399
  },
330
400
  collapseAll() {
331
401
  expandedIds.clear();
332
402
  }
333
403
  };
404
+ registry.on("unregister:ticket", (ticket) => {
405
+ selectedIds.delete(ticket.id);
406
+ expandedIds.delete(ticket.id);
407
+ });
408
+ registry.on("clear:registry", () => {
409
+ selectedIds.clear();
410
+ expandedIds.clear();
411
+ });
334
412
  const opened = shallowReactive(/* @__PURE__ */ new Set());
335
413
  const groups = computed(() => {
336
414
  if (!groupBy) return [];
@@ -357,14 +435,18 @@ function createDataTable(options) {
357
435
  return result;
358
436
  });
359
437
  if (openAll) {
360
- for (const group of groups.value) opened.add(group.key);
361
- if (groups.value.length === 0) {
362
- const stop = watch(groups, (newGroups) => {
363
- if (newGroups.length === 0) return;
364
- for (const group of newGroups) opened.add(group.key);
365
- stop();
366
- });
438
+ const autoOpened = /* @__PURE__ */ new Set();
439
+ for (const group of groups.value) {
440
+ opened.add(group.key);
441
+ autoOpened.add(group.key);
367
442
  }
443
+ watch(groups, (newGroups) => {
444
+ for (const group of newGroups) {
445
+ if (autoOpened.has(group.key)) continue;
446
+ opened.add(group.key);
447
+ autoOpened.add(group.key);
448
+ }
449
+ }, { flush: "sync" });
368
450
  }
369
451
  const grouping = {
370
452
  groups,
@@ -389,6 +471,7 @@ function createDataTable(options) {
389
471
  }
390
472
  };
391
473
  return {
474
+ ...registry,
392
475
  items: visible,
393
476
  allItems,
394
477
  filteredItems,
@@ -405,12 +488,19 @@ function createDataTable(options) {
405
488
  grouping,
406
489
  total,
407
490
  loading,
408
- error
491
+ error,
492
+ get size() {
493
+ return registry.size;
494
+ }
409
495
  };
410
496
  }
411
497
  /**
412
498
  * Creates a data table context with dependency injection support.
413
499
  *
500
+ * The returned context exposes both row and column registries. Columns must
501
+ * be onboarded after construction — pass them via `context.columns.onboard`,
502
+ * not in the factory options.
503
+ *
414
504
  * @param options Data table context options including namespace
415
505
  * @returns A trinity tuple: [useDataTable, provideDataTable, defaultContext]
416
506
  *
@@ -418,22 +508,23 @@ function createDataTable(options) {
418
508
  * ```ts
419
509
  * import { createDataTableContext } from '@vuetify/v0'
420
510
  *
421
- * const [useDataTable, provideDataTable, context] = createDataTableContext({
511
+ * const [useDataTable, provideDataTable, context] = createDataTableContext<User>({
422
512
  * namespace: 'app:users',
423
- * items: users,
424
- * columns: [
425
- * { key: 'name', title: 'Name', sortable: true },
426
- * ],
427
513
  * })
428
514
  *
515
+ * context.columns.onboard([
516
+ * { id: 'name', title: 'Name', sortable: true },
517
+ * ])
518
+ *
429
519
  * // Parent component
430
520
  * provideDataTable()
521
+ * context.onboard(users.map(value => ({ id: value.id, value })))
431
522
  *
432
523
  * // Child component
433
524
  * const table = useDataTable()
434
525
  * ```
435
526
  */
436
- function createDataTableContext(_options) {
527
+ function createDataTableContext(_options = {}) {
437
528
  const { namespace = "v0:data-table", ...options } = _options;
438
529
  return createTrinity(namespace, createDataTable(options));
439
530
  }
@@ -1,6 +1,6 @@
1
1
  import { resolveIds, resolveIndexes, useId as useId$1 } from "./utilities/index.mjs";
2
- import { i as useContext, t as createTrinity } from "./createTrinity-BTCs1pYx.mjs";
3
- import { t as createSelection } from "./createSelection-BeKZMxha.mjs";
2
+ import { i as useContext, t as createTrinity } from "./createTrinity-z-3q9QWR.mjs";
3
+ import { t as createSelection } from "./createSelection-DEqhvdoj.mjs";
4
4
  import { t as toArray } from "./toArray-CD2-OxAz.mjs";
5
5
  import { computed, onScopeDispose, reactive, shallowReactive, toRef, toValue } from "vue";
6
6
  //#region src/composables/useProxyRegistry/index.ts
@@ -1,6 +1,6 @@
1
1
  import { clamp, isUndefined, useId as useId$1 } from "./utilities/index.mjs";
2
- import { i as useContext, t as createTrinity } from "./createTrinity-BTCs1pYx.mjs";
3
- import { i as useLogger } from "./useLogger-DPSSa-YR.mjs";
2
+ import { i as useContext, t as createTrinity } from "./createTrinity-z-3q9QWR.mjs";
3
+ import { i as useLogger } from "./useLogger-CTgAedNH.mjs";
4
4
  import { shallowReactive } from "vue";
5
5
  //#region src/composables/createRegistry/index.ts
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { isUndefined, resolveIds, useId as useId$1 } from "./utilities/index.mjs";
2
- import { i as useContext, t as createTrinity } from "./createTrinity-BTCs1pYx.mjs";
3
- import { t as createRegistry } from "./createRegistry-Db_juawd.mjs";
2
+ import { i as useContext, t as createTrinity } from "./createTrinity-z-3q9QWR.mjs";
3
+ import { t as createRegistry } from "./createRegistry-tJ1PPNIr.mjs";
4
4
  import { computed, isRef, shallowReactive, toRaw, toRef, toValue } from "vue";
5
5
  //#region src/composables/createModel/index.ts
6
6
  /**
@@ -1,5 +1,5 @@
1
- import { i as useContext, t as createTrinity } from "./createTrinity-BTCs1pYx.mjs";
2
- import { t as createSelection } from "./createSelection-BeKZMxha.mjs";
1
+ import { i as useContext, t as createTrinity } from "./createTrinity-z-3q9QWR.mjs";
2
+ import { t as createSelection } from "./createSelection-DEqhvdoj.mjs";
3
3
  import { toRef } from "vue";
4
4
  //#region src/composables/createSingle/index.ts
5
5
  /**
@@ -1,7 +1,7 @@
1
1
  import { isObject, isString, isUndefined } from "./utilities/index.mjs";
2
- import { i as useContext, t as createTrinity } from "./createTrinity-BTCs1pYx.mjs";
3
- import { i as useLogger } from "./useLogger-DPSSa-YR.mjs";
4
- import { t as createRegistry } from "./createRegistry-Db_juawd.mjs";
2
+ import { i as useContext, t as createTrinity } from "./createTrinity-z-3q9QWR.mjs";
3
+ import { i as useLogger } from "./useLogger-CTgAedNH.mjs";
4
+ import { t as createRegistry } from "./createRegistry-tJ1PPNIr.mjs";
5
5
  //#region src/composables/createTokens/index.ts
6
6
  /**
7
7
  * @module createTokens
@@ -1,4 +1,4 @@
1
- import { isObject, isString, isSymbol, isUndefined } from "./utilities/index.mjs";
1
+ import { V0Error, isObject, isString, isSymbol, isUndefined } from "./utilities/index.mjs";
2
2
  import { inject, provide } from "vue";
3
3
  //#region src/composables/createContext/index.ts
4
4
  /**
@@ -50,7 +50,10 @@ import { inject, provide } from "vue";
50
50
  */
51
51
  function useContext(key, defaultValue) {
52
52
  const context = inject(key, defaultValue);
53
- if (/* @__PURE__ */ isUndefined(context)) throw new Error(`Context "${String(key)}" not found. Ensure it's provided by an ancestor.`);
53
+ if (/* @__PURE__ */ isUndefined(context)) throw new V0Error(`Context "${String(key)}" not found. Ensure it's provided by an ancestor.`, {
54
+ code: "V0_CONTEXT_MISSING",
55
+ key
56
+ });
54
57
  return context;
55
58
  }
56
59
  /**
@@ -1,2 +1,2 @@
1
- import { t as ClientDataTableAdapter } from "../../../v0-DYsCJPIu.mjs";
1
+ import { t as ClientDataTableAdapter } from "../../../v0-QIjffi4E.mjs";
2
2
  export { ClientDataTableAdapter };
@@ -1,2 +1,2 @@
1
- import { t as ClientDataTableAdapter } from "../../../v0-DAlKpCR8.mjs";
1
+ import { t as ClientDataTableAdapter } from "../../../v0-COaQncfZ.mjs";
2
2
  export { ClientDataTableAdapter };
@@ -1,5 +1,5 @@
1
- import { a as SortEntry, i as SortDirection, n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "../../adapter-Cr7Bl4la.mjs";
2
- import { n as ServerDataTableAdapterOptions, t as ServerDataTableAdapter } from "../../server-DQK305lc.mjs";
3
- import { t as ClientDataTableAdapter } from "../../v0-DYsCJPIu.mjs";
4
- import { t as VirtualDataTableAdapter } from "../../virtual-BqCRw0ly.mjs";
1
+ import { a as SortEntry, i as SortDirection, n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "../../adapter-BO75n0Cn.mjs";
2
+ import { n as ServerDataTableAdapterOptions, t as ServerDataTableAdapter } from "../../server-7vjHxjNc.mjs";
3
+ import { t as ClientDataTableAdapter } from "../../v0-QIjffi4E.mjs";
4
+ import { t as VirtualDataTableAdapter } from "../../virtual-CrgGA-o6.mjs";
5
5
  export { ClientDataTableAdapter, DataTableAdapter, DataTableAdapterContext, DataTableAdapterResult, ServerDataTableAdapter, ServerDataTableAdapterOptions, SortDirection, SortEntry, VirtualDataTableAdapter };
@@ -1,6 +1,6 @@
1
- import { t as DataTableAdapter } from "../../adapter-C9cR4AcY.mjs";
2
- import { t as ClientDataTableAdapter } from "../../v0-DAlKpCR8.mjs";
3
- import { t as ServerDataTableAdapter } from "../../server-ZFXbgQoY.mjs";
4
- import { t as VirtualDataTableAdapter } from "../../virtual-Dnno49F8.mjs";
5
- import "../../adapters-Dv74Jk6A.mjs";
1
+ import { t as DataTableAdapter } from "../../adapter-BCVxBtDp.mjs";
2
+ import { t as ClientDataTableAdapter } from "../../v0-COaQncfZ.mjs";
3
+ import { t as ServerDataTableAdapter } from "../../server-CZ83nTn_.mjs";
4
+ import { t as VirtualDataTableAdapter } from "../../virtual-UumJ2BQ9.mjs";
5
+ import "../../adapters-BYLWDmYl.mjs";
6
6
  export { ClientDataTableAdapter, DataTableAdapter, ServerDataTableAdapter, VirtualDataTableAdapter };
@@ -1,2 +1,2 @@
1
- import { n as ServerDataTableAdapterOptions, t as ServerDataTableAdapter } from "../../../server-DQK305lc.mjs";
1
+ import { n as ServerDataTableAdapterOptions, t as ServerDataTableAdapter } from "../../../server-7vjHxjNc.mjs";
2
2
  export { ServerDataTableAdapter, ServerDataTableAdapterOptions };
@@ -1,2 +1,2 @@
1
- import { t as ServerDataTableAdapter } from "../../../server-ZFXbgQoY.mjs";
1
+ import { t as ServerDataTableAdapter } from "../../../server-CZ83nTn_.mjs";
2
2
  export { ServerDataTableAdapter };
@@ -1,2 +1,2 @@
1
- import { t as VirtualDataTableAdapter } from "../../../virtual-BqCRw0ly.mjs";
1
+ import { t as VirtualDataTableAdapter } from "../../../virtual-CrgGA-o6.mjs";
2
2
  export { VirtualDataTableAdapter };
@@ -1,2 +1,2 @@
1
- import { t as VirtualDataTableAdapter } from "../../../virtual-Dnno49F8.mjs";
1
+ import { t as VirtualDataTableAdapter } from "../../../virtual-UumJ2BQ9.mjs";
2
2
  export { VirtualDataTableAdapter };
@@ -1,6 +1,6 @@
1
- import { a as SortEntry, i as SortDirection, n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "../adapter-Cr7Bl4la.mjs";
2
- import { _ as computeDepth, a as DataTableGroup, c as DataTableSelection, d as SelectStrategy, f as createDataTable, g as InternalHeader, h as ColumnNode, i as DataTableExpansion, l as DataTableSort, m as useDataTable, n as DataTableContext, o as DataTableGrouping, p as createDataTableContext, r as DataTableContextOptions, s as DataTableOptions, t as DataTableColumn, u as KeysOfType, v as extractLeaves, y as resolveHeaders } from "../index-BA7YU2xY.mjs";
3
- import { n as ServerDataTableAdapterOptions, t as ServerDataTableAdapter } from "../server-DQK305lc.mjs";
4
- import { t as ClientDataTableAdapter } from "../v0-DYsCJPIu.mjs";
5
- import { t as VirtualDataTableAdapter } from "../virtual-BqCRw0ly.mjs";
6
- export { ClientDataTableAdapter, ColumnNode, DataTableAdapter, DataTableAdapterContext, DataTableAdapterResult, DataTableColumn, DataTableContext, DataTableContextOptions, DataTableExpansion, DataTableGroup, DataTableGrouping, DataTableOptions, DataTableSelection, DataTableSort, InternalHeader, KeysOfType, SelectStrategy, ServerDataTableAdapter, ServerDataTableAdapterOptions, SortDirection, SortEntry, VirtualDataTableAdapter, computeDepth, createDataTable, createDataTableContext, extractLeaves, resolveHeaders, useDataTable };
1
+ import { a as SortEntry, i as SortDirection, n as DataTableAdapterContext, r as DataTableAdapterResult, t as DataTableAdapter } from "../adapter-BO75n0Cn.mjs";
2
+ import { _ as ColumnNode, a as DataTableExpansion, b as extractLeaves, c as DataTableOptions, d as DataTableTicket, f as DataTableTicketInput, g as useDataTable, h as createDataTableContext, i as DataTableContextOptions, l as DataTableSelection, m as createDataTable, n as DataTableColumnTicketInput, o as DataTableGroup, p as SelectStrategy, r as DataTableContext, s as DataTableGrouping, t as DataTableColumnTicket, u as DataTableSort, v as InternalHeader, x as resolveHeaders, y as computeDepth } from "../index-ZD3hw2Zo.mjs";
3
+ import { n as ServerDataTableAdapterOptions, t as ServerDataTableAdapter } from "../server-7vjHxjNc.mjs";
4
+ import { t as ClientDataTableAdapter } from "../v0-QIjffi4E.mjs";
5
+ import { t as VirtualDataTableAdapter } from "../virtual-CrgGA-o6.mjs";
6
+ export { ClientDataTableAdapter, ColumnNode, DataTableAdapter, DataTableAdapterContext, DataTableAdapterResult, DataTableColumnTicket, DataTableColumnTicketInput, DataTableContext, DataTableContextOptions, DataTableExpansion, DataTableGroup, DataTableGrouping, DataTableOptions, DataTableSelection, DataTableSort, DataTableTicket, DataTableTicketInput, InternalHeader, SelectStrategy, ServerDataTableAdapter, ServerDataTableAdapterOptions, SortDirection, SortEntry, VirtualDataTableAdapter, computeDepth, createDataTable, createDataTableContext, extractLeaves, resolveHeaders, useDataTable };
@@ -1,6 +1,6 @@
1
- import { t as DataTableAdapter } from "../adapter-C9cR4AcY.mjs";
2
- import { t as ClientDataTableAdapter } from "../v0-DAlKpCR8.mjs";
3
- import { a as extractLeaves, i as computeDepth, n as createDataTableContext, o as resolveHeaders, r as useDataTable, t as createDataTable } from "../createDataTable-DDr2yY-A.mjs";
4
- import { t as ServerDataTableAdapter } from "../server-ZFXbgQoY.mjs";
5
- import { t as VirtualDataTableAdapter } from "../virtual-Dnno49F8.mjs";
1
+ import { t as DataTableAdapter } from "../adapter-BCVxBtDp.mjs";
2
+ import { t as ClientDataTableAdapter } from "../v0-COaQncfZ.mjs";
3
+ import { a as extractLeaves, i as computeDepth, n as createDataTableContext, o as resolveHeaders, r as useDataTable, t as createDataTable } from "../createDataTable-DlFQyBTN.mjs";
4
+ import { t as ServerDataTableAdapter } from "../server-CZ83nTn_.mjs";
5
+ import { t as VirtualDataTableAdapter } from "../virtual-UumJ2BQ9.mjs";
6
6
  export { ClientDataTableAdapter, DataTableAdapter, ServerDataTableAdapter, VirtualDataTableAdapter, computeDepth, createDataTable, createDataTableContext, extractLeaves, resolveHeaders, useDataTable };
@@ -1,4 +1,4 @@
1
- import { t as DateAdapter } from "../adapter-Dzyrlbz7.mjs";
1
+ import { t as DateAdapter } from "../adapter-B6IrPwib.mjs";
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
 
4
4
  //#region src/composables/useDate/adapters/v0.d.ts