@sectile/vue 0.7.0 → 0.8.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 (319) hide show
  1. package/README.md +4 -2
  2. package/dist/accordion.d.ts +0 -1
  3. package/dist/alert-dialog.d.ts +0 -2
  4. package/dist/alert-dialog.js.map +1 -1
  5. package/dist/calendar.d.ts +2 -3
  6. package/dist/calendar.js +14 -14
  7. package/dist/calendar.js.map +1 -1
  8. package/dist/carousel.d.ts +22 -1
  9. package/dist/carousel.js +7 -1
  10. package/dist/carousel.js.map +1 -1
  11. package/dist/cascade-list.d.ts +339 -0
  12. package/dist/cascade-list.js +240 -0
  13. package/dist/cascade-list.js.map +1 -0
  14. package/dist/cascade-select.d.ts +11 -42
  15. package/dist/cascade-select.js +19 -27
  16. package/dist/cascade-select.js.map +1 -1
  17. package/dist/checkbox-group.d.ts +9 -1
  18. package/dist/checkbox-group.js +57 -13
  19. package/dist/checkbox-group.js.map +1 -1
  20. package/dist/checkbox.d.ts +0 -1
  21. package/dist/checkbox.js +15 -8
  22. package/dist/checkbox.js.map +1 -1
  23. package/dist/color-picker.d.ts +0 -1
  24. package/dist/combobox.d.ts +0 -1
  25. package/dist/combobox.js +46 -6
  26. package/dist/combobox.js.map +1 -1
  27. package/dist/data-grid.d.ts +214 -0
  28. package/dist/data-grid.js +107 -0
  29. package/dist/data-grid.js.map +1 -0
  30. package/dist/data-table.d.ts +232 -0
  31. package/dist/data-table.js +116 -0
  32. package/dist/data-table.js.map +1 -0
  33. package/dist/data-tree-grid.d.ts +225 -0
  34. package/dist/data-tree-grid.js +98 -0
  35. package/dist/data-tree-grid.js.map +1 -0
  36. package/dist/date-field.d.ts +1 -2
  37. package/dist/date-field.js +1 -1
  38. package/dist/date-field.js.map +1 -1
  39. package/dist/date-picker.d.ts +37 -6
  40. package/dist/date-picker.js +3 -1
  41. package/dist/date-picker.js.map +1 -1
  42. package/dist/date-range-field.d.ts +2 -3
  43. package/dist/date-range-field.js +24 -6
  44. package/dist/date-range-field.js.map +1 -1
  45. package/dist/date-range-picker.d.ts +37 -6
  46. package/dist/date-range-picker.js +3 -1
  47. package/dist/date-range-picker.js.map +1 -1
  48. package/dist/date-time-field.d.ts +1 -2
  49. package/dist/date-time-field.js +1 -1
  50. package/dist/date-time-field.js.map +1 -1
  51. package/dist/date-time-picker.d.ts +38 -7
  52. package/dist/date-time-picker.js +3 -1
  53. package/dist/date-time-picker.js.map +1 -1
  54. package/dist/date-time-range-picker.d.ts +38 -7
  55. package/dist/date-time-range-picker.js +3 -1
  56. package/dist/date-time-range-picker.js.map +1 -1
  57. package/dist/dialog.d.ts +0 -2
  58. package/dist/dialog.js.map +1 -1
  59. package/dist/disclosure.d.ts +0 -1
  60. package/dist/drawer.d.ts +1 -2
  61. package/dist/editable.d.ts +0 -1
  62. package/dist/editable.js +25 -6
  63. package/dist/editable.js.map +1 -1
  64. package/dist/feed.d.ts +0 -1
  65. package/dist/form.d.ts +88 -115
  66. package/dist/form.js +461 -233
  67. package/dist/form.js.map +1 -1
  68. package/dist/grid.d.ts +0 -1
  69. package/dist/grid.js +51 -6
  70. package/dist/grid.js.map +1 -1
  71. package/dist/host-provider.d.ts +0 -13
  72. package/dist/host-provider.js +0 -16
  73. package/dist/host-provider.js.map +1 -1
  74. package/dist/index.d.ts +14 -39
  75. package/dist/index.js +6 -19
  76. package/dist/index.js.map +1 -1
  77. package/dist/internal/cascade-choice.d.ts +204 -0
  78. package/dist/internal/cascade-choice.js +161 -0
  79. package/dist/internal/cascade-choice.js.map +1 -0
  80. package/dist/internal/collection.d.ts +3 -8
  81. package/dist/internal/collection.js +14 -20
  82. package/dist/internal/collection.js.map +1 -1
  83. package/dist/internal/controlled-state.d.ts +0 -1
  84. package/dist/internal/date-picker.d.ts +78 -9
  85. package/dist/internal/date-picker.js +116 -27
  86. package/dist/internal/date-picker.js.map +1 -1
  87. package/dist/internal/decimal-input.d.ts +1 -0
  88. package/dist/internal/decimal-input.js +24 -0
  89. package/dist/internal/decimal-input.js.map +1 -0
  90. package/dist/internal/form-control-inventory.d.ts +4 -1
  91. package/dist/internal/form-control-inventory.js +1 -0
  92. package/dist/internal/form-control-inventory.js.map +1 -1
  93. package/dist/internal/form-control.d.ts +100 -2
  94. package/dist/internal/form-control.js +103 -1
  95. package/dist/internal/form-control.js.map +1 -1
  96. package/dist/internal/native-field.d.ts +0 -1
  97. package/dist/internal/native-field.js +11 -2
  98. package/dist/internal/native-field.js.map +1 -1
  99. package/dist/internal/native-input.d.ts +0 -1
  100. package/dist/internal/part-contract.d.ts +0 -1
  101. package/dist/internal/popup.d.ts +5 -27
  102. package/dist/internal/popup.js +14 -20
  103. package/dist/internal/popup.js.map +1 -1
  104. package/dist/internal/presence.d.ts +0 -1
  105. package/dist/internal/scheduled-task.d.ts +5 -0
  106. package/dist/internal/scheduled-task.js +28 -0
  107. package/dist/internal/scheduled-task.js.map +1 -0
  108. package/dist/internal/tabs-context.d.ts +2 -3
  109. package/dist/internal/tabular-components.d.ts +27 -0
  110. package/dist/internal/tabular-components.js +26 -0
  111. package/dist/internal/tabular-components.js.map +1 -0
  112. package/dist/internal/tabular-parts.d.ts +57 -0
  113. package/dist/internal/tabular-parts.js +239 -0
  114. package/dist/internal/tabular-parts.js.map +1 -0
  115. package/dist/internal/tabular-profile.d.ts +75 -0
  116. package/dist/internal/tabular-profile.js +209 -0
  117. package/dist/internal/tabular-profile.js.map +1 -0
  118. package/dist/internal/virtual-collection-model.d.ts +42 -0
  119. package/dist/internal/virtual-collection-model.js +241 -0
  120. package/dist/internal/virtual-collection-model.js.map +1 -0
  121. package/dist/internal/virtual-collection.d.ts +38 -0
  122. package/dist/internal/virtual-collection.js +87 -0
  123. package/dist/internal/virtual-collection.js.map +1 -0
  124. package/dist/{virtual.d.ts → internal/virtual-core.d.ts} +9 -4
  125. package/dist/{virtual.js → internal/virtual-core.js} +7 -7
  126. package/dist/internal/virtual-core.js.map +1 -0
  127. package/dist/internal/virtual-list.d.ts +214 -0
  128. package/dist/internal/virtual-list.js +401 -0
  129. package/dist/internal/virtual-list.js.map +1 -0
  130. package/dist/listbox.d.ts +0 -1
  131. package/dist/listbox.js +52 -6
  132. package/dist/listbox.js.map +1 -1
  133. package/dist/menu-button.d.ts +0 -1
  134. package/dist/menu.d.ts +0 -1
  135. package/dist/menubar.d.ts +0 -1
  136. package/dist/meter-group.d.ts +369 -0
  137. package/dist/meter-group.js +271 -0
  138. package/dist/meter-group.js.map +1 -0
  139. package/dist/meter.d.ts +191 -0
  140. package/dist/meter.js +133 -0
  141. package/dist/meter.js.map +1 -0
  142. package/dist/month-picker.d.ts +37 -6
  143. package/dist/month-picker.js +3 -1
  144. package/dist/month-picker.js.map +1 -1
  145. package/dist/month-range-picker.d.ts +37 -6
  146. package/dist/month-range-picker.js +3 -1
  147. package/dist/month-range-picker.js.map +1 -1
  148. package/dist/multi-thumb-slider.d.ts +0 -1
  149. package/dist/navigation-menu.d.ts +0 -1
  150. package/dist/number-field.d.ts +0 -1
  151. package/dist/pagination.d.ts +23 -2
  152. package/dist/pagination.js +6 -1
  153. package/dist/pagination.js.map +1 -1
  154. package/dist/pin-input.d.ts +0 -1
  155. package/dist/pin-input.js +1 -1
  156. package/dist/pin-input.js.map +1 -1
  157. package/dist/popover.d.ts +0 -2
  158. package/dist/popover.js.map +1 -1
  159. package/dist/primitive.d.ts +0 -1
  160. package/dist/primitive.js +8 -4
  161. package/dist/primitive.js.map +1 -1
  162. package/dist/progress.d.ts +148 -0
  163. package/dist/progress.js +110 -0
  164. package/dist/progress.js.map +1 -0
  165. package/dist/quantity-field.d.ts +0 -1
  166. package/dist/radio-group.d.ts +0 -1
  167. package/dist/radio-group.js +1 -1
  168. package/dist/radio-group.js.map +1 -1
  169. package/dist/range-calendar.d.ts +2 -3
  170. package/dist/rating.d.ts +0 -1
  171. package/dist/rating.js +10 -1
  172. package/dist/rating.js.map +1 -1
  173. package/dist/reorder.d.ts +1 -2
  174. package/dist/select.d.ts +18 -44
  175. package/dist/select.js +11 -13
  176. package/dist/select.js.map +1 -1
  177. package/dist/slider.d.ts +0 -1
  178. package/dist/spin-button.d.ts +0 -1
  179. package/dist/spin-button.js +17 -4
  180. package/dist/spin-button.js.map +1 -1
  181. package/dist/stepper.d.ts +0 -1
  182. package/dist/stepper.js +19 -2
  183. package/dist/stepper.js.map +1 -1
  184. package/dist/switch.d.ts +0 -1
  185. package/dist/tabs.d.ts +0 -1
  186. package/dist/tabs.js +4 -22
  187. package/dist/tabs.js.map +1 -1
  188. package/dist/tags-input.d.ts +0 -1
  189. package/dist/tags-input.js +18 -5
  190. package/dist/tags-input.js.map +1 -1
  191. package/dist/temporal-provider.d.ts +21 -0
  192. package/dist/temporal-provider.js +30 -0
  193. package/dist/temporal-provider.js.map +1 -0
  194. package/dist/text.d.ts +0 -1
  195. package/dist/text.js +18 -4
  196. package/dist/text.js.map +1 -1
  197. package/dist/time-field.d.ts +1 -2
  198. package/dist/time-field.js +1 -1
  199. package/dist/time-field.js.map +1 -1
  200. package/dist/time-range-field.d.ts +2 -2
  201. package/dist/time-range-field.js +6 -4
  202. package/dist/time-range-field.js.map +1 -1
  203. package/dist/timer.d.ts +0 -1
  204. package/dist/toast.d.ts +11 -2
  205. package/dist/toast.js +22 -9
  206. package/dist/toast.js.map +1 -1
  207. package/dist/toggle-button.d.ts +0 -1
  208. package/dist/toggle-group.d.ts +0 -1
  209. package/dist/toggle-group.js +1 -1
  210. package/dist/toggle-group.js.map +1 -1
  211. package/dist/toolbar.d.ts +0 -1
  212. package/dist/tooltip.d.ts +1 -3
  213. package/dist/tooltip.js.map +1 -1
  214. package/dist/tree-grid.d.ts +0 -1
  215. package/dist/tree-grid.js +62 -8
  216. package/dist/tree-grid.js.map +1 -1
  217. package/dist/tree-view.d.ts +0 -1
  218. package/dist/tree-view.js +51 -10
  219. package/dist/tree-view.js.map +1 -1
  220. package/dist/virtual-core.d.ts +1 -0
  221. package/dist/virtual-core.js +2 -0
  222. package/dist/virtual-core.js.map +1 -0
  223. package/dist/virtual-grid.d.ts +188 -0
  224. package/dist/virtual-grid.js +306 -0
  225. package/dist/virtual-grid.js.map +1 -0
  226. package/dist/virtual-list.d.ts +1 -0
  227. package/dist/virtual-list.js +2 -0
  228. package/dist/virtual-list.js.map +1 -0
  229. package/dist/virtual-masonry.d.ts +198 -0
  230. package/dist/virtual-masonry.js +221 -0
  231. package/dist/virtual-masonry.js.map +1 -0
  232. package/dist/virtual-spatial.d.ts +157 -0
  233. package/dist/virtual-spatial.js +159 -0
  234. package/dist/virtual-spatial.js.map +1 -0
  235. package/dist/window-splitter.d.ts +0 -1
  236. package/dist/year-picker.d.ts +37 -6
  237. package/dist/year-picker.js +3 -1
  238. package/dist/year-picker.js.map +1 -1
  239. package/dist/year-range-picker.d.ts +37 -6
  240. package/dist/year-range-picker.js +3 -1
  241. package/dist/year-range-picker.js.map +1 -1
  242. package/package.json +173 -89
  243. package/dist/accordion.d.ts.map +0 -1
  244. package/dist/alert-dialog.d.ts.map +0 -1
  245. package/dist/calendar.d.ts.map +0 -1
  246. package/dist/carousel.d.ts.map +0 -1
  247. package/dist/cascade-select.d.ts.map +0 -1
  248. package/dist/checkbox-group.d.ts.map +0 -1
  249. package/dist/checkbox.d.ts.map +0 -1
  250. package/dist/color-picker.d.ts.map +0 -1
  251. package/dist/combobox.d.ts.map +0 -1
  252. package/dist/date-field.d.ts.map +0 -1
  253. package/dist/date-picker.d.ts.map +0 -1
  254. package/dist/date-range-field.d.ts.map +0 -1
  255. package/dist/date-range-picker.d.ts.map +0 -1
  256. package/dist/date-time-field.d.ts.map +0 -1
  257. package/dist/date-time-picker.d.ts.map +0 -1
  258. package/dist/date-time-range-picker.d.ts.map +0 -1
  259. package/dist/dialog.d.ts.map +0 -1
  260. package/dist/disclosure.d.ts.map +0 -1
  261. package/dist/drawer.d.ts.map +0 -1
  262. package/dist/editable.d.ts.map +0 -1
  263. package/dist/feed.d.ts.map +0 -1
  264. package/dist/form.d.ts.map +0 -1
  265. package/dist/grid.d.ts.map +0 -1
  266. package/dist/host-provider.d.ts.map +0 -1
  267. package/dist/index.d.ts.map +0 -1
  268. package/dist/internal/collection.d.ts.map +0 -1
  269. package/dist/internal/controlled-state.d.ts.map +0 -1
  270. package/dist/internal/date-picker.d.ts.map +0 -1
  271. package/dist/internal/form-control-inventory.d.ts.map +0 -1
  272. package/dist/internal/form-control.d.ts.map +0 -1
  273. package/dist/internal/native-field.d.ts.map +0 -1
  274. package/dist/internal/native-input.d.ts.map +0 -1
  275. package/dist/internal/part-contract.d.ts.map +0 -1
  276. package/dist/internal/popup.d.ts.map +0 -1
  277. package/dist/internal/presence.d.ts.map +0 -1
  278. package/dist/internal/tabs-context.d.ts.map +0 -1
  279. package/dist/listbox.d.ts.map +0 -1
  280. package/dist/menu-button.d.ts.map +0 -1
  281. package/dist/menu.d.ts.map +0 -1
  282. package/dist/menubar.d.ts.map +0 -1
  283. package/dist/month-picker.d.ts.map +0 -1
  284. package/dist/month-range-picker.d.ts.map +0 -1
  285. package/dist/multi-thumb-slider.d.ts.map +0 -1
  286. package/dist/navigation-menu.d.ts.map +0 -1
  287. package/dist/number-field.d.ts.map +0 -1
  288. package/dist/pagination.d.ts.map +0 -1
  289. package/dist/pin-input.d.ts.map +0 -1
  290. package/dist/popover.d.ts.map +0 -1
  291. package/dist/primitive.d.ts.map +0 -1
  292. package/dist/quantity-field.d.ts.map +0 -1
  293. package/dist/radio-group.d.ts.map +0 -1
  294. package/dist/range-calendar.d.ts.map +0 -1
  295. package/dist/rating.d.ts.map +0 -1
  296. package/dist/reorder.d.ts.map +0 -1
  297. package/dist/select.d.ts.map +0 -1
  298. package/dist/slider.d.ts.map +0 -1
  299. package/dist/spin-button.d.ts.map +0 -1
  300. package/dist/stepper.d.ts.map +0 -1
  301. package/dist/switch.d.ts.map +0 -1
  302. package/dist/tabs.d.ts.map +0 -1
  303. package/dist/tags-input.d.ts.map +0 -1
  304. package/dist/text.d.ts.map +0 -1
  305. package/dist/time-field.d.ts.map +0 -1
  306. package/dist/time-range-field.d.ts.map +0 -1
  307. package/dist/timer.d.ts.map +0 -1
  308. package/dist/toast.d.ts.map +0 -1
  309. package/dist/toggle-button.d.ts.map +0 -1
  310. package/dist/toggle-group.d.ts.map +0 -1
  311. package/dist/toolbar.d.ts.map +0 -1
  312. package/dist/tooltip.d.ts.map +0 -1
  313. package/dist/tree-grid.d.ts.map +0 -1
  314. package/dist/tree-view.d.ts.map +0 -1
  315. package/dist/virtual.d.ts.map +0 -1
  316. package/dist/virtual.js.map +0 -1
  317. package/dist/window-splitter.d.ts.map +0 -1
  318. package/dist/year-picker.d.ts.map +0 -1
  319. package/dist/year-range-picker.d.ts.map +0 -1
@@ -0,0 +1,209 @@
1
+ import { computed, inject, onBeforeUnmount, onMounted, provide, readonly, shallowRef, } from 'vue';
2
+ const semantics = new WeakMap();
3
+ const refreshers = new WeakMap();
4
+ export function createVueProfileController(semantic) {
5
+ const snapshot = shallowRef(semantic.getSnapshot());
6
+ const refresh = () => { snapshot.value = semantic.getSnapshot(); };
7
+ const controller = Object.freeze({
8
+ snapshot: snapshot,
9
+ acceptedViewState: computed(() => stateOf(snapshot.value).acceptedViewState),
10
+ requestState: computed(() => stateOf(snapshot.value).requestState),
11
+ getSnapshot: () => semantic.getSnapshot(),
12
+ dispatch: (event, revision) => {
13
+ const result = semantic.dispatch(event, revision);
14
+ if (result.ok)
15
+ refresh();
16
+ return result;
17
+ },
18
+ synchronizeView: (response) => {
19
+ const result = semantic.synchronizeView(response);
20
+ if (result.ok)
21
+ refresh();
22
+ return result;
23
+ },
24
+ syncControlledValues: (values) => {
25
+ const result = semantic.syncControlledValues(values);
26
+ if (result.ok)
27
+ refresh();
28
+ return result;
29
+ },
30
+ requestView: () => {
31
+ const result = semantic.requestView();
32
+ if (result.ok)
33
+ refresh();
34
+ return result;
35
+ },
36
+ abandonRequest: (requestID) => {
37
+ const result = semantic.abandonRequest(requestID);
38
+ if (result.ok)
39
+ refresh();
40
+ return result;
41
+ },
42
+ subscribeCommands: (listener) => semantic.subscribeCommands(listener),
43
+ attachRequestExecutor: (listener) => semantic.attachRequestExecutor(listener),
44
+ dispose: () => semantic.dispose(),
45
+ });
46
+ semantics.set(controller, semantic);
47
+ refreshers.set(controller, refresh);
48
+ return controller;
49
+ }
50
+ export function refreshVueProfileController(controller) {
51
+ refreshers.get(controller)?.();
52
+ }
53
+ export function semanticController(controller) {
54
+ const semantic = semantics.get(controller);
55
+ if (semantic === undefined)
56
+ throw new TypeError('Unknown Vue Tabular controller.');
57
+ return semantic;
58
+ }
59
+ export function aliasVueProfileController(alias, source) {
60
+ const semantic = semantics.get(source);
61
+ const refresh = refreshers.get(source);
62
+ if (semantic !== undefined)
63
+ semantics.set(alias, semantic);
64
+ if (refresh !== undefined)
65
+ refreshers.set(alias, refresh);
66
+ }
67
+ export function stateOf(value) {
68
+ const candidate = value;
69
+ const state = candidate.tabular?.state ?? candidate.state;
70
+ if (state === undefined)
71
+ throw new TypeError('Invalid Tabular profile snapshot.');
72
+ return state;
73
+ }
74
+ export function provideProfile(publicKey, privateKey, controller) {
75
+ const connection = shallowRef(null);
76
+ const context = Object.freeze({
77
+ controller,
78
+ snapshot: controller.snapshot,
79
+ acceptedViewState: controller.acceptedViewState,
80
+ requestState: controller.requestState,
81
+ query: computed(() => stateOf(controller.snapshot.value).query),
82
+ rowSelection: computed(() => stateOf(controller.snapshot.value).rowSelection),
83
+ columnState: computed(() => stateOf(controller.snapshot.value).columnState),
84
+ accessState: computed(() => stateOf(controller.snapshot.value).accessState),
85
+ connection,
86
+ });
87
+ const publicContext = Object.freeze({
88
+ controller: context.controller,
89
+ snapshot: context.snapshot,
90
+ acceptedViewState: context.acceptedViewState,
91
+ requestState: context.requestState,
92
+ query: context.query,
93
+ rowSelection: context.rowSelection,
94
+ columnState: context.columnState,
95
+ accessState: context.accessState,
96
+ });
97
+ provide(publicKey, publicContext);
98
+ provide(privateKey, context);
99
+ return context;
100
+ }
101
+ export function useProfile(key, name) {
102
+ const context = inject(key);
103
+ if (context === undefined)
104
+ throw new TypeError(`${name} must be used inside its matching Provider.`);
105
+ return context;
106
+ }
107
+ export function useProfileSource(controller, initialResolver, options = {}) {
108
+ const status = shallowRef('idle');
109
+ const error = shallowRef(null);
110
+ let resolver = initialResolver;
111
+ let active = null;
112
+ let mounted = false;
113
+ let disposed = false;
114
+ let queued = null;
115
+ const setStatus = (next) => {
116
+ status.value = next;
117
+ options.onStatusChange?.(next);
118
+ };
119
+ const abandon = (requestID) => { controller.abandonRequest(requestID); };
120
+ const cancel = () => {
121
+ const current = active;
122
+ active = null;
123
+ queued = null;
124
+ if (current !== null) {
125
+ current.abort.abort();
126
+ abandon(current.requestID);
127
+ }
128
+ if (!disposed)
129
+ setStatus('idle');
130
+ };
131
+ const execute = (request) => {
132
+ if (!mounted || disposed) {
133
+ queued = request;
134
+ return;
135
+ }
136
+ if (active !== null) {
137
+ active.abort.abort();
138
+ abandon(active.requestID);
139
+ }
140
+ const abort = new AbortController();
141
+ active = { requestID: request.requestID, abort };
142
+ error.value = null;
143
+ setStatus('loading');
144
+ Promise.resolve().then(() => resolver(request, { signal: abort.signal })).then((response) => {
145
+ if (disposed || abort.signal.aborted || active?.requestID !== request.requestID)
146
+ return;
147
+ const synchronized = controller.synchronizeView(response);
148
+ if (!synchronized.ok) {
149
+ active = null;
150
+ error.value = synchronized.error;
151
+ setStatus('error');
152
+ options.onError?.(synchronized.error);
153
+ return;
154
+ }
155
+ active = null;
156
+ setStatus('success');
157
+ }, (reason) => {
158
+ if (disposed || abort.signal.aborted || active?.requestID !== request.requestID)
159
+ return;
160
+ active = null;
161
+ abandon(request.requestID);
162
+ error.value = reason;
163
+ setStatus('error');
164
+ options.onError?.(reason);
165
+ });
166
+ };
167
+ const attached = controller.attachRequestExecutor((command) => execute(command.request));
168
+ if (!attached.ok)
169
+ throw new TypeError(attached.error.message);
170
+ const releaseExecutor = attached.value;
171
+ const reload = () => {
172
+ const requested = controller.requestView();
173
+ if (!requested.ok)
174
+ throw new TypeError(requested.error.message);
175
+ };
176
+ const replaceResolver = (next) => {
177
+ cancel();
178
+ resolver = next;
179
+ const replaced = controller.dispatch({ type: 'replace-source' });
180
+ if (!replaced.ok)
181
+ throw new TypeError(replaced.error.message);
182
+ };
183
+ const dispose = () => {
184
+ if (disposed)
185
+ return;
186
+ disposed = true;
187
+ cancel();
188
+ releaseExecutor();
189
+ };
190
+ onMounted(() => {
191
+ mounted = true;
192
+ const pending = queued ?? controller.requestState.value.pendingRequest;
193
+ queued = null;
194
+ if (pending !== null)
195
+ execute(pending);
196
+ });
197
+ onBeforeUnmount(dispose);
198
+ return Object.freeze({ status: readonly(status), error: readonly(error), reload, cancel, replaceResolver, dispose });
199
+ }
200
+ export function controlledValues(options) {
201
+ return Object.freeze({
202
+ ...(options.query === undefined ? {} : { query: options.query.value }),
203
+ ...(options.rowSelection === undefined ? {} : { rowSelection: options.rowSelection.value }),
204
+ ...(options.columnState === undefined ? {} : { columnState: options.columnState.value }),
205
+ ...(options.accessState === undefined ? {} : { accessState: options.accessState.value }),
206
+ ...(options.expansion === undefined ? {} : { expansion: options.expansion.value }),
207
+ });
208
+ }
209
+ //# sourceMappingURL=tabular-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabular-profile.js","sourceRoot":"","sources":["../../src/internal/tabular-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type Sequence } from '@sectile/core/sequence';
2
+ import type { Extent } from '@sectile/virtual/extent-index';
3
+ import type { LinearLayoutState, LinearPatch } from '@sectile/virtual/linear-layout';
4
+ export type VirtualListKeyResolver<Value> = {
5
+ bivarianceHack(value: Value, index: number): string;
6
+ }['bivarianceHack'];
7
+ export type VirtualListEstimate<Value> = number | {
8
+ bivarianceHack(value: Value, index: number): number;
9
+ }['bivarianceHack'];
10
+ export type VirtualListItemAttributes<Value> = {
11
+ bivarianceHack(value: Value, index: number): Readonly<Record<string, unknown>>;
12
+ }['bivarianceHack'];
13
+ export interface PreparedVirtualList {
14
+ readonly items: readonly unknown[];
15
+ readonly ids: readonly string[];
16
+ readonly getKey: VirtualListKeyResolver<unknown>;
17
+ readonly change: PreparedVirtualListChange | null;
18
+ readonly initialIndex: ReadonlyMap<string, number> | null;
19
+ }
20
+ export interface PreparedVirtualListChange {
21
+ readonly index: number;
22
+ readonly deleteCount: number;
23
+ readonly inserted: readonly string[];
24
+ }
25
+ export declare function prepareVirtualList(items: readonly unknown[], getKey: VirtualListKeyResolver<unknown>): PreparedVirtualList;
26
+ export declare function updatePreparedVirtualList(previous: PreparedVirtualList, items: readonly unknown[], getKey: VirtualListKeyResolver<unknown>): PreparedVirtualList;
27
+ export declare function validateVirtualListKey(id: string): string;
28
+ export declare function createPreparedVirtualListSequence(prepared: PreparedVirtualList, maxItems: number): Sequence<string>;
29
+ export declare function isWellFormedVirtualListKey(value: string): boolean;
30
+ export declare function reconcileVirtualList(state: Pick<LinearLayoutState<string>, 'domain' | 'extents'>, next: PreparedVirtualList, items: readonly unknown[], props: Readonly<{
31
+ itemSize: number | undefined;
32
+ estimateSize: VirtualListEstimate<unknown> | undefined;
33
+ }>, automaticEstimate?: number): LinearPatch<string> | null;
34
+ export declare function assertVirtualListSizeMode(itemSize: number | undefined, estimateSize: VirtualListEstimate<unknown> | undefined): void;
35
+ export declare function initialExtent(props: Readonly<{
36
+ itemSize: number | undefined;
37
+ estimateSize: VirtualListEstimate<unknown> | undefined;
38
+ }>, value: unknown, index: number, automaticEstimate?: number): Extent;
39
+ export declare function requireAutomaticEstimate(estimate: VirtualListEstimate<unknown> | undefined): VirtualListEstimate<unknown>;
40
+ export declare function requiresDOMBootstrap(itemSize: number | undefined, estimateSize: VirtualListEstimate<unknown> | undefined): boolean;
41
+ export declare function exactExtent(value: number): Extent;
42
+ export declare function estimatedExtent(estimate: VirtualListEstimate<unknown>, value: unknown, index: number): Extent;
@@ -0,0 +1,241 @@
1
+ import { createSequence } from '@sectile/core/sequence';
2
+ export function prepareVirtualList(items, getKey) {
3
+ const ids = [];
4
+ const indexByID = new Map();
5
+ for (let index = 0; index < items.length; index += 1) {
6
+ const value = items[index];
7
+ const id = getKey(value, index);
8
+ if (typeof id !== 'string' || id.length === 0) {
9
+ throw new TypeError('VirtualList getKey must return a non-empty string.');
10
+ }
11
+ if (id.length > 1_024) {
12
+ throw new TypeError('VirtualList keys must contain at most 1,024 UTF-16 code units.');
13
+ }
14
+ if (!isWellFormedVirtualListKey(id)) {
15
+ throw new TypeError('VirtualList keys must be well-formed UTF-16 strings.');
16
+ }
17
+ if (indexByID.has(id)) {
18
+ throw new TypeError(`VirtualList getKey returned the duplicate key ${JSON.stringify(id)}.`);
19
+ }
20
+ ids.push(id);
21
+ indexByID.set(id, index);
22
+ }
23
+ return Object.freeze({
24
+ items,
25
+ ids: Object.freeze(ids),
26
+ getKey,
27
+ change: null,
28
+ initialIndex: indexByID,
29
+ });
30
+ }
31
+ export function updatePreparedVirtualList(previous, items, getKey) {
32
+ if (previous.items === items && previous.getKey === getKey)
33
+ return previous;
34
+ if (previous.getKey !== getKey) {
35
+ const prepared = prepareVirtualList(items, getKey);
36
+ let prefix = 0;
37
+ while (prefix < previous.ids.length
38
+ && prefix < prepared.ids.length
39
+ && previous.ids[prefix] === prepared.ids[prefix])
40
+ prefix += 1;
41
+ let suffix = 0;
42
+ while (suffix < previous.ids.length - prefix
43
+ && suffix < prepared.ids.length - prefix
44
+ && previous.ids[previous.ids.length - suffix - 1]
45
+ === prepared.ids[prepared.ids.length - suffix - 1])
46
+ suffix += 1;
47
+ if (prefix === previous.ids.length && prefix === prepared.ids.length) {
48
+ return Object.freeze({
49
+ items,
50
+ ids: previous.ids,
51
+ getKey,
52
+ change: null,
53
+ initialIndex: previous.initialIndex,
54
+ });
55
+ }
56
+ const inserted = Object.freeze(prepared.ids.slice(prefix, prepared.ids.length - suffix));
57
+ return Object.freeze({
58
+ ...prepared,
59
+ change: Object.freeze({
60
+ index: prefix,
61
+ deleteCount: previous.ids.length - prefix - suffix,
62
+ inserted,
63
+ }),
64
+ });
65
+ }
66
+ let prefix = 0;
67
+ while (prefix < previous.items.length
68
+ && prefix < items.length
69
+ && Object.is(previous.items[prefix], items[prefix]))
70
+ prefix += 1;
71
+ let suffix = 0;
72
+ while (suffix < previous.items.length - prefix
73
+ && suffix < items.length - prefix
74
+ && Object.is(previous.items[previous.items.length - suffix - 1], items[items.length - suffix - 1]))
75
+ suffix += 1;
76
+ if (prefix === previous.items.length && prefix === items.length) {
77
+ return Object.freeze({
78
+ items,
79
+ ids: previous.ids,
80
+ getKey,
81
+ change: null,
82
+ initialIndex: previous.initialIndex,
83
+ });
84
+ }
85
+ const changedEnd = items.length - suffix;
86
+ if (previous.items.length === items.length) {
87
+ let sameDomain = true;
88
+ for (let index = prefix; index < changedEnd; index += 1) {
89
+ if (validateVirtualListKey(getKey(items[index], index)) !== previous.ids[index]) {
90
+ sameDomain = false;
91
+ break;
92
+ }
93
+ }
94
+ if (sameDomain) {
95
+ return Object.freeze({
96
+ items,
97
+ ids: previous.ids,
98
+ getKey,
99
+ change: null,
100
+ initialIndex: previous.initialIndex,
101
+ });
102
+ }
103
+ }
104
+ const inserted = [];
105
+ const insertedIDs = new Set();
106
+ for (let index = prefix; index < changedEnd; index += 1) {
107
+ const id = validateVirtualListKey(getKey(items[index], index));
108
+ if (insertedIDs.has(id)) {
109
+ throw new TypeError(`VirtualList getKey returned the duplicate key ${JSON.stringify(id)}.`);
110
+ }
111
+ inserted.push(id);
112
+ insertedIDs.add(id);
113
+ }
114
+ const frozenInserted = Object.freeze(inserted);
115
+ return Object.freeze({
116
+ items,
117
+ ids: Object.freeze([
118
+ ...previous.ids.slice(0, prefix),
119
+ ...frozenInserted,
120
+ ...previous.ids.slice(previous.ids.length - suffix),
121
+ ]),
122
+ getKey,
123
+ initialIndex: null,
124
+ change: Object.freeze({
125
+ index: prefix,
126
+ deleteCount: previous.ids.length - prefix - suffix,
127
+ inserted: frozenInserted,
128
+ }),
129
+ });
130
+ }
131
+ export function validateVirtualListKey(id) {
132
+ if (typeof id !== 'string' || id.length === 0) {
133
+ throw new TypeError('VirtualList getKey must return a non-empty string.');
134
+ }
135
+ if (id.length > 1_024) {
136
+ throw new TypeError('VirtualList keys must contain at most 1,024 UTF-16 code units.');
137
+ }
138
+ if (!isWellFormedVirtualListKey(id)) {
139
+ throw new TypeError('VirtualList keys must be well-formed UTF-16 strings.');
140
+ }
141
+ return id;
142
+ }
143
+ export function createPreparedVirtualListSequence(prepared, maxItems) {
144
+ if (!Number.isSafeInteger(maxItems) || maxItems < 0) {
145
+ throw new TypeError('VirtualList maxItems must be a non-negative safe integer.');
146
+ }
147
+ if (prepared.ids.length > maxItems) {
148
+ throw new RangeError(`VirtualList received ${prepared.ids.length} items, exceeding maxItems ${maxItems}.`);
149
+ }
150
+ const index = prepared.initialIndex;
151
+ if (index === null)
152
+ return createSequence(prepared.ids, { maxItems, maxIDCodeUnits: 1_024 });
153
+ let materialized;
154
+ const complete = () => {
155
+ materialized ??= createSequence(prepared.ids, { maxItems, maxIDCodeUnits: 1_024 });
156
+ return materialized;
157
+ };
158
+ return Object.freeze({
159
+ size: prepared.ids.length,
160
+ ids: prepared.ids,
161
+ maxItems,
162
+ maxIDCodeUnits: 1_024,
163
+ at: (position) => (Number.isSafeInteger(position) && position >= 0 && position < prepared.ids.length
164
+ ? prepared.ids[position] ?? null
165
+ : null),
166
+ indexOf: (id) => index.get(id) ?? null,
167
+ contains: (id) => index.has(id),
168
+ compare: (left, right) => {
169
+ const leftIndex = index.get(left);
170
+ const rightIndex = index.get(right);
171
+ if (leftIndex === undefined || rightIndex === undefined)
172
+ return null;
173
+ return leftIndex === rightIndex ? 0 : leftIndex < rightIndex ? -1 : 1;
174
+ },
175
+ project: (predicate) => complete().project(predicate),
176
+ move: (current, direction, boundary, options) => complete().move(current, direction, boundary, options),
177
+ });
178
+ }
179
+ export function isWellFormedVirtualListKey(value) {
180
+ for (let index = 0; index < value.length; index += 1) {
181
+ const code = value.charCodeAt(index);
182
+ if (code >= 0xd800 && code <= 0xdbff) {
183
+ const next = value.charCodeAt(index + 1);
184
+ if (next < 0xdc00 || next > 0xdfff)
185
+ return false;
186
+ index += 1;
187
+ }
188
+ else if (code >= 0xdc00 && code <= 0xdfff)
189
+ return false;
190
+ }
191
+ return true;
192
+ }
193
+ export function reconcileVirtualList(state, next, items, props, automaticEstimate) {
194
+ const change = next.change;
195
+ if (change === null)
196
+ return null;
197
+ const inserted = change.inserted;
198
+ return Object.freeze({
199
+ patch: Object.freeze({
200
+ type: 'splice',
201
+ index: change.index,
202
+ deleteCount: change.deleteCount,
203
+ inserted,
204
+ }),
205
+ insertedExtents: Object.freeze(inserted.map((id, localIndex) => {
206
+ const nextIndex = change.index + localIndex;
207
+ const previousIndex = state.domain.indexOf(id);
208
+ return (previousIndex === null ? null : state.extents.extentAt(previousIndex))
209
+ ?? initialExtent(props, items[nextIndex], nextIndex, automaticEstimate);
210
+ })),
211
+ });
212
+ }
213
+ export function assertVirtualListSizeMode(itemSize, estimateSize) {
214
+ if (itemSize !== undefined && estimateSize !== undefined) {
215
+ throw new TypeError('VirtualList itemSize and estimateSize are mutually exclusive.');
216
+ }
217
+ }
218
+ export function initialExtent(props, value, index, automaticEstimate) {
219
+ return props.itemSize === undefined
220
+ ? estimatedExtent(requireAutomaticEstimate(props.estimateSize ?? automaticEstimate), value, index)
221
+ : exactExtent(props.itemSize);
222
+ }
223
+ export function requireAutomaticEstimate(estimate) {
224
+ if (estimate === undefined) {
225
+ throw new TypeError('Automatic virtual size must be measured before layout initialization.');
226
+ }
227
+ return estimate;
228
+ }
229
+ export function requiresDOMBootstrap(itemSize, estimateSize) {
230
+ return itemSize === undefined && estimateSize === undefined;
231
+ }
232
+ export function exactExtent(value) {
233
+ return Object.freeze({ kind: 'exact', value });
234
+ }
235
+ export function estimatedExtent(estimate, value, index) {
236
+ return Object.freeze({
237
+ kind: 'unknown',
238
+ fallback: typeof estimate === 'number' ? estimate : estimate(value, index),
239
+ });
240
+ }
241
+ //# sourceMappingURL=virtual-collection-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-collection-model.js","sourceRoot":"","sources":["../../src/internal/virtual-collection-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type ShallowRef, type VNodeArrayChildren, type VNodeChild } from 'vue';
2
+ import type { VirtualInsets, VirtualLayoutPlan, VirtualPlacement, VirtualRect, VirtualScrollAlignment, VirtualizerConnection } from '@sectile/dom/virtual';
3
+ import { type VirtualizerItemSize, type VirtualizerRootExpose } from './virtual-core.js';
4
+ import type { PreparedVirtualList, VirtualListItemAttributes, VirtualListKeyResolver } from './virtual-collection-model.js';
5
+ export interface VirtualCollectionBaseProps<Value> {
6
+ readonly items: readonly Value[];
7
+ readonly getKey: VirtualListKeyResolver<Value>;
8
+ readonly overscan?: number | Partial<VirtualInsets>;
9
+ readonly maxItems?: number;
10
+ readonly initialViewport?: VirtualRect;
11
+ readonly as?: string;
12
+ readonly contentAs?: string;
13
+ readonly itemAs?: string;
14
+ readonly itemAttributes?: VirtualListItemAttributes<Value>;
15
+ }
16
+ export interface ResponsiveLaneProps {
17
+ readonly laneCount?: number;
18
+ readonly minLaneSize?: number;
19
+ readonly maxLaneCount?: number;
20
+ readonly laneGap?: number;
21
+ }
22
+ export interface VirtualCollectionExpose<State> {
23
+ readonly root: ShallowRef<HTMLElement | null | undefined>;
24
+ readonly state: State;
25
+ readonly plan: VirtualLayoutPlan<string> | null;
26
+ scrollTo(id: string, alignment?: VirtualScrollAlignment): ReturnType<VirtualizerConnection<object, string, unknown, unknown>['scrollTo']> | undefined;
27
+ refresh(): void;
28
+ flush(): ReturnType<VirtualizerConnection<object, string, unknown, unknown>['flush']> | undefined;
29
+ }
30
+ export interface ResponsiveLaneGeometry {
31
+ readonly count: number;
32
+ readonly extent: number;
33
+ }
34
+ export declare function resolveResponsiveLanes(crossExtent: number, requestedCount: number | undefined, minLaneSize: number, maxLaneCount: number, laneGap: number): ResponsiveLaneGeometry;
35
+ export declare function renderHighLevelItems(scope: string, placements: readonly VirtualPlacement<string>[], prepared: PreparedVirtualList, items: readonly unknown[], itemAs: string, itemAttributes: VirtualListItemAttributes<unknown> | undefined, size: VirtualizerItemSize, render: (value: unknown, key: string, index: number, placement: VirtualPlacement<string>) => VNodeChild, empty: (() => VNodeChild) | undefined): VNodeArrayChildren;
36
+ export declare function renderCollectionBootstrapItems(scope: string, prepared: PreparedVirtualList, items: readonly unknown[], count: number, width: number, itemAs: string, itemAttributes: VirtualListItemAttributes<unknown> | undefined, render: (value: unknown, key: string, index: number, placement: VirtualPlacement<string>) => VNodeChild, itemRef: (index: number, value: unknown) => void): VNodeArrayChildren;
37
+ export declare function createHighLevelVirtualExpose<State>(root: ShallowRef<VirtualizerRootExpose | undefined>, initialState: State): VirtualCollectionExpose<State>;
38
+ export declare function nearlyEqual(left: number, right: number): boolean;
@@ -0,0 +1,87 @@
1
+ import { h, shallowRef } from 'vue';
2
+ import { VirtualizerItem } from './virtual-core.js';
3
+ export function resolveResponsiveLanes(crossExtent, requestedCount, minLaneSize, maxLaneCount, laneGap) {
4
+ if (!Number.isFinite(minLaneSize) || minLaneSize <= 0)
5
+ throw new TypeError('minLaneSize must be a positive finite number.');
6
+ if (!Number.isSafeInteger(maxLaneCount) || maxLaneCount < 1)
7
+ throw new TypeError('maxLaneCount must be a positive safe integer.');
8
+ if (!Number.isFinite(laneGap) || laneGap < 0)
9
+ throw new TypeError('laneGap must be a non-negative finite number.');
10
+ if (requestedCount !== undefined && (!Number.isSafeInteger(requestedCount) || requestedCount < 1))
11
+ throw new TypeError('laneCount must be a positive safe integer.');
12
+ const available = Number.isFinite(crossExtent) && crossExtent > 0 ? crossExtent : minLaneSize;
13
+ const count = requestedCount ?? Math.max(1, Math.min(maxLaneCount, Math.floor((available + laneGap) / (minLaneSize + laneGap))));
14
+ return Object.freeze({
15
+ count,
16
+ extent: Math.max(1, (available - laneGap * (count - 1)) / count),
17
+ });
18
+ }
19
+ export function renderHighLevelItems(scope, placements, prepared, items, itemAs, itemAttributes, size, render, empty) {
20
+ if (prepared.ids.length === 0) {
21
+ const child = empty?.();
22
+ return child === undefined || child === null ? [] : [child];
23
+ }
24
+ return placements.flatMap((placement) => {
25
+ const index = placement.index;
26
+ if (index >= items.length || prepared.ids[index] !== placement.id)
27
+ return [];
28
+ const value = items[index];
29
+ const attributes = itemAttributes?.(value, index) ?? {};
30
+ return [h(VirtualizerItem, {
31
+ ...attributes,
32
+ key: placement.id,
33
+ placement,
34
+ size,
35
+ as: itemAs,
36
+ style: attributes['style'],
37
+ 'data-scope': scope,
38
+ 'data-virtual-layout': scope,
39
+ 'data-part': 'item',
40
+ }, { default: () => render(value, placement.id, index, placement) })];
41
+ });
42
+ }
43
+ export function renderCollectionBootstrapItems(scope, prepared, items, count, width, itemAs, itemAttributes, render, itemRef) {
44
+ return Array.from({ length: Math.min(count, prepared.ids.length) }, (_unused, index) => {
45
+ const id = prepared.ids[index];
46
+ const value = items[index];
47
+ const attributes = itemAttributes?.(value, index) ?? {};
48
+ const placement = Object.freeze({
49
+ id,
50
+ index,
51
+ rect: Object.freeze({ x: index * width, y: 0, width, height: 0 }),
52
+ visible: true,
53
+ });
54
+ const rendered = render(value, id, index, placement);
55
+ const children = rendered === undefined || rendered === null
56
+ ? []
57
+ : Array.isArray(rendered)
58
+ ? rendered
59
+ : [rendered];
60
+ return h(itemAs, {
61
+ ...attributes,
62
+ key: id,
63
+ ref: (element) => itemRef(index, element),
64
+ style: [attributes['style'], { width: `${width}px` }],
65
+ 'data-scope': scope,
66
+ 'data-virtual-layout': scope,
67
+ 'data-part': 'item',
68
+ 'data-index': index,
69
+ 'data-bootstrap': '',
70
+ }, children);
71
+ });
72
+ }
73
+ export function createHighLevelVirtualExpose(root, initialState) {
74
+ const emptyRoot = shallowRef(null);
75
+ return Object.freeze({
76
+ get root() { return root.value?.root ?? emptyRoot; },
77
+ get state() { return root.value?.state ?? initialState; },
78
+ get plan() { return root.value?.plan ?? null; },
79
+ scrollTo: (id, alignment) => root.value?.scrollTo(id, alignment),
80
+ refresh: () => root.value?.refresh(),
81
+ flush: () => root.value?.flush(),
82
+ });
83
+ }
84
+ export function nearlyEqual(left, right) {
85
+ return Math.abs(left - right) < 0.01;
86
+ }
87
+ //# sourceMappingURL=virtual-collection.js.map