@sectile/dom 0.6.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 (290) hide show
  1. package/README.md +3 -1
  2. package/dist/accordion.d.ts +0 -1
  3. package/dist/accordion.js +4 -1
  4. package/dist/accordion.js.map +1 -1
  5. package/dist/alert-dialog.d.ts +0 -1
  6. package/dist/calendar.d.ts +0 -1
  7. package/dist/calendar.js +4 -1
  8. package/dist/calendar.js.map +1 -1
  9. package/dist/carousel.d.ts +0 -1
  10. package/dist/carousel.js +5 -1
  11. package/dist/carousel.js.map +1 -1
  12. package/dist/cascade-list.d.ts +51 -0
  13. package/dist/cascade-list.js +166 -0
  14. package/dist/cascade-list.js.map +1 -0
  15. package/dist/cascade-select.d.ts +1 -2
  16. package/dist/cascade-select.js +20 -47
  17. package/dist/cascade-select.js.map +1 -1
  18. package/dist/checkbox-group.d.ts +0 -1
  19. package/dist/checkbox.d.ts +0 -1
  20. package/dist/color-picker.d.ts +0 -1
  21. package/dist/combobox.d.ts +0 -1
  22. package/dist/combobox.js +32 -2
  23. package/dist/combobox.js.map +1 -1
  24. package/dist/data-grid.d.ts +66 -0
  25. package/dist/data-grid.js +50 -0
  26. package/dist/data-grid.js.map +1 -0
  27. package/dist/data-table.d.ts +100 -0
  28. package/dist/data-table.js +359 -0
  29. package/dist/data-table.js.map +1 -0
  30. package/dist/data-tree-grid.d.ts +73 -0
  31. package/dist/data-tree-grid.js +53 -0
  32. package/dist/data-tree-grid.js.map +1 -0
  33. package/dist/date-field.d.ts +1 -2
  34. package/dist/date-field.js +17 -5
  35. package/dist/date-field.js.map +1 -1
  36. package/dist/date-picker.d.ts +3 -2
  37. package/dist/date-picker.js +13 -4
  38. package/dist/date-picker.js.map +1 -1
  39. package/dist/date-range-field.d.ts +0 -1
  40. package/dist/date-range-field.js +7 -2
  41. package/dist/date-range-field.js.map +1 -1
  42. package/dist/date-range-picker.d.ts +2 -2
  43. package/dist/date-range-picker.js +10 -5
  44. package/dist/date-range-picker.js.map +1 -1
  45. package/dist/date-time-field.d.ts +1 -2
  46. package/dist/date-time-field.js +15 -4
  47. package/dist/date-time-field.js.map +1 -1
  48. package/dist/date-time-picker.d.ts +2 -2
  49. package/dist/date-time-picker.js +23 -10
  50. package/dist/date-time-picker.js.map +1 -1
  51. package/dist/date-time-range-picker.d.ts +2 -2
  52. package/dist/date-time-range-picker.js +26 -12
  53. package/dist/date-time-range-picker.js.map +1 -1
  54. package/dist/dialog.d.ts +0 -1
  55. package/dist/disclosure.d.ts +0 -1
  56. package/dist/drawer.d.ts +0 -1
  57. package/dist/editable.d.ts +0 -1
  58. package/dist/feed.d.ts +0 -1
  59. package/dist/feed.js +4 -0
  60. package/dist/feed.js.map +1 -1
  61. package/dist/form.d.ts +51 -11
  62. package/dist/form.js +608 -58
  63. package/dist/form.js.map +1 -1
  64. package/dist/grid.d.ts +3 -3
  65. package/dist/grid.js +8 -4
  66. package/dist/grid.js.map +1 -1
  67. package/dist/index.d.ts +8 -30
  68. package/dist/index.js +4 -17
  69. package/dist/index.js.map +1 -1
  70. package/dist/interact-outside.d.ts +0 -1
  71. package/dist/internal/cascade-choice-binding.d.ts +34 -0
  72. package/dist/internal/cascade-choice-binding.js +112 -0
  73. package/dist/internal/cascade-choice-binding.js.map +1 -0
  74. package/dist/internal/checked-control.d.ts +4 -5
  75. package/dist/internal/checked-control.js +14 -27
  76. package/dist/internal/checked-control.js.map +1 -1
  77. package/dist/internal/controlled-field-input.d.ts +9 -0
  78. package/dist/internal/controlled-field-input.js +25 -0
  79. package/dist/internal/controlled-field-input.js.map +1 -0
  80. package/dist/internal/date-picker-cell.d.ts +0 -1
  81. package/dist/internal/delegated-event.d.ts +0 -1
  82. package/dist/internal/direction.d.ts +0 -1
  83. package/dist/internal/disabled-items.d.ts +0 -1
  84. package/dist/internal/disabled-items.js +2 -12
  85. package/dist/internal/disabled-items.js.map +1 -1
  86. package/dist/internal/exact-percentage.d.ts +2 -0
  87. package/dist/internal/exact-percentage.js +5 -0
  88. package/dist/internal/exact-percentage.js.map +1 -0
  89. package/dist/internal/interaction.d.ts +0 -1
  90. package/dist/internal/layer-binding.d.ts +0 -1
  91. package/dist/internal/layer-manager.d.ts +0 -1
  92. package/dist/internal/menu-control.d.ts +0 -1
  93. package/dist/internal/menu-control.js +48 -97
  94. package/dist/internal/menu-control.js.map +1 -1
  95. package/dist/internal/modal-effects.d.ts +0 -1
  96. package/dist/internal/picker-position.d.ts +7 -0
  97. package/dist/internal/picker-position.js +19 -0
  98. package/dist/internal/picker-position.js.map +1 -0
  99. package/dist/internal/popup-control.d.ts +2 -3
  100. package/dist/internal/popup-control.js +8 -10
  101. package/dist/internal/popup-control.js.map +1 -1
  102. package/dist/internal/position-connection.d.ts +22 -0
  103. package/dist/internal/position-connection.js +57 -0
  104. package/dist/internal/position-connection.js.map +1 -0
  105. package/dist/internal/positioning/engine.d.ts +65 -0
  106. package/dist/internal/positioning/engine.js +488 -0
  107. package/dist/internal/positioning/engine.js.map +1 -0
  108. package/dist/internal/reference-date.d.ts +0 -1
  109. package/dist/internal/result.d.ts +0 -3
  110. package/dist/internal/result.js.map +1 -1
  111. package/dist/internal/tabular-dom.d.ts +109 -0
  112. package/dist/internal/tabular-dom.js +316 -0
  113. package/dist/internal/tabular-dom.js.map +1 -0
  114. package/dist/internal/tabular-grid-dom.d.ts +151 -0
  115. package/dist/internal/tabular-grid-dom.js +524 -0
  116. package/dist/internal/tabular-grid-dom.js.map +1 -0
  117. package/dist/internal/text-element.d.ts +0 -1
  118. package/dist/listbox.d.ts +0 -1
  119. package/dist/listbox.js +5 -0
  120. package/dist/listbox.js.map +1 -1
  121. package/dist/menu-button.d.ts +0 -1
  122. package/dist/menu.d.ts +0 -1
  123. package/dist/menubar.d.ts +0 -1
  124. package/dist/meter-group.d.ts +39 -0
  125. package/dist/meter-group.js +182 -0
  126. package/dist/meter-group.js.map +1 -0
  127. package/dist/meter.d.ts +35 -0
  128. package/dist/meter.js +111 -0
  129. package/dist/meter.js.map +1 -0
  130. package/dist/month-picker.d.ts +0 -1
  131. package/dist/month-range-picker.d.ts +0 -1
  132. package/dist/multi-thumb-slider.d.ts +0 -1
  133. package/dist/navigation-menu.d.ts +0 -1
  134. package/dist/number-field.d.ts +0 -1
  135. package/dist/number-field.js +8 -1
  136. package/dist/number-field.js.map +1 -1
  137. package/dist/pagination.d.ts +0 -1
  138. package/dist/pin-input.d.ts +0 -1
  139. package/dist/pin-input.js +5 -3
  140. package/dist/pin-input.js.map +1 -1
  141. package/dist/popover.d.ts +6 -22
  142. package/dist/popover.js +6 -9
  143. package/dist/popover.js.map +1 -1
  144. package/dist/position.d.ts +19 -0
  145. package/dist/position.js +2 -0
  146. package/dist/position.js.map +1 -0
  147. package/dist/progress.d.ts +35 -0
  148. package/dist/progress.js +105 -0
  149. package/dist/progress.js.map +1 -0
  150. package/dist/quantity-field.d.ts +0 -1
  151. package/dist/quantity-field.js +12 -1
  152. package/dist/quantity-field.js.map +1 -1
  153. package/dist/radio-group.d.ts +0 -1
  154. package/dist/radio-group.js +13 -1
  155. package/dist/radio-group.js.map +1 -1
  156. package/dist/range-calendar.d.ts +0 -1
  157. package/dist/rating.d.ts +1 -2
  158. package/dist/rating.js +191 -27
  159. package/dist/rating.js.map +1 -1
  160. package/dist/reorder.d.ts +0 -1
  161. package/dist/select.d.ts +2 -15
  162. package/dist/select.js +7 -5
  163. package/dist/select.js.map +1 -1
  164. package/dist/slider.d.ts +0 -1
  165. package/dist/spin-button.d.ts +0 -1
  166. package/dist/stepper.d.ts +0 -1
  167. package/dist/switch.d.ts +0 -1
  168. package/dist/tabs.d.ts +0 -1
  169. package/dist/tabs.js +11 -2
  170. package/dist/tabs.js.map +1 -1
  171. package/dist/tabular.d.ts +3 -0
  172. package/dist/tabular.js +4 -0
  173. package/dist/tabular.js.map +1 -0
  174. package/dist/tags-input.d.ts +0 -1
  175. package/dist/tags-input.js +8 -4
  176. package/dist/tags-input.js.map +1 -1
  177. package/dist/text.d.ts +0 -1
  178. package/dist/time-field.d.ts +1 -2
  179. package/dist/time-field.js +11 -5
  180. package/dist/time-field.js.map +1 -1
  181. package/dist/time-range-field.d.ts +0 -1
  182. package/dist/time-range-field.js +3 -1
  183. package/dist/time-range-field.js.map +1 -1
  184. package/dist/timer.d.ts +0 -1
  185. package/dist/toast.d.ts +0 -1
  186. package/dist/toast.js +32 -5
  187. package/dist/toast.js.map +1 -1
  188. package/dist/toggle-button.d.ts +0 -1
  189. package/dist/toggle-group.d.ts +0 -1
  190. package/dist/toolbar.d.ts +0 -1
  191. package/dist/toolbar.js +4 -0
  192. package/dist/toolbar.js.map +1 -1
  193. package/dist/tooltip.d.ts +5 -23
  194. package/dist/tooltip.js +3 -6
  195. package/dist/tooltip.js.map +1 -1
  196. package/dist/tree-grid.d.ts +0 -1
  197. package/dist/tree-grid.js +14 -1
  198. package/dist/tree-grid.js.map +1 -1
  199. package/dist/tree-view.d.ts +0 -1
  200. package/dist/tree-view.js +4 -0
  201. package/dist/tree-view.js.map +1 -1
  202. package/dist/virtual.d.ts +2 -3
  203. package/dist/virtual.js +76 -28
  204. package/dist/virtual.js.map +1 -1
  205. package/dist/window-splitter.d.ts +0 -1
  206. package/dist/year-picker.d.ts +0 -1
  207. package/dist/year-range-picker.d.ts +0 -1
  208. package/package.json +135 -85
  209. package/dist/accordion.d.ts.map +0 -1
  210. package/dist/alert-dialog.d.ts.map +0 -1
  211. package/dist/calendar.d.ts.map +0 -1
  212. package/dist/carousel.d.ts.map +0 -1
  213. package/dist/cascade-select.d.ts.map +0 -1
  214. package/dist/checkbox-group.d.ts.map +0 -1
  215. package/dist/checkbox.d.ts.map +0 -1
  216. package/dist/color-picker.d.ts.map +0 -1
  217. package/dist/combobox.d.ts.map +0 -1
  218. package/dist/date-field.d.ts.map +0 -1
  219. package/dist/date-picker.d.ts.map +0 -1
  220. package/dist/date-range-field.d.ts.map +0 -1
  221. package/dist/date-range-picker.d.ts.map +0 -1
  222. package/dist/date-time-field.d.ts.map +0 -1
  223. package/dist/date-time-picker.d.ts.map +0 -1
  224. package/dist/date-time-range-picker.d.ts.map +0 -1
  225. package/dist/dialog.d.ts.map +0 -1
  226. package/dist/disclosure.d.ts.map +0 -1
  227. package/dist/drawer.d.ts.map +0 -1
  228. package/dist/editable.d.ts.map +0 -1
  229. package/dist/feed.d.ts.map +0 -1
  230. package/dist/form.d.ts.map +0 -1
  231. package/dist/grid.d.ts.map +0 -1
  232. package/dist/index.d.ts.map +0 -1
  233. package/dist/interact-outside.d.ts.map +0 -1
  234. package/dist/internal/checked-control.d.ts.map +0 -1
  235. package/dist/internal/date-picker-cell.d.ts.map +0 -1
  236. package/dist/internal/delegated-event.d.ts.map +0 -1
  237. package/dist/internal/direction.d.ts.map +0 -1
  238. package/dist/internal/disabled-items.d.ts.map +0 -1
  239. package/dist/internal/floating-position.d.ts +0 -26
  240. package/dist/internal/floating-position.d.ts.map +0 -1
  241. package/dist/internal/floating-position.js +0 -107
  242. package/dist/internal/floating-position.js.map +0 -1
  243. package/dist/internal/interaction.d.ts.map +0 -1
  244. package/dist/internal/layer-binding.d.ts.map +0 -1
  245. package/dist/internal/layer-manager.d.ts.map +0 -1
  246. package/dist/internal/menu-control.d.ts.map +0 -1
  247. package/dist/internal/modal-effects.d.ts.map +0 -1
  248. package/dist/internal/popup-control.d.ts.map +0 -1
  249. package/dist/internal/reference-date.d.ts.map +0 -1
  250. package/dist/internal/result.d.ts.map +0 -1
  251. package/dist/internal/text-element.d.ts.map +0 -1
  252. package/dist/listbox.d.ts.map +0 -1
  253. package/dist/menu-button.d.ts.map +0 -1
  254. package/dist/menu.d.ts.map +0 -1
  255. package/dist/menubar.d.ts.map +0 -1
  256. package/dist/month-picker.d.ts.map +0 -1
  257. package/dist/month-range-picker.d.ts.map +0 -1
  258. package/dist/multi-thumb-slider.d.ts.map +0 -1
  259. package/dist/navigation-menu.d.ts.map +0 -1
  260. package/dist/number-field.d.ts.map +0 -1
  261. package/dist/pagination.d.ts.map +0 -1
  262. package/dist/pin-input.d.ts.map +0 -1
  263. package/dist/popover.d.ts.map +0 -1
  264. package/dist/quantity-field.d.ts.map +0 -1
  265. package/dist/radio-group.d.ts.map +0 -1
  266. package/dist/range-calendar.d.ts.map +0 -1
  267. package/dist/rating.d.ts.map +0 -1
  268. package/dist/reorder.d.ts.map +0 -1
  269. package/dist/select.d.ts.map +0 -1
  270. package/dist/slider.d.ts.map +0 -1
  271. package/dist/spin-button.d.ts.map +0 -1
  272. package/dist/stepper.d.ts.map +0 -1
  273. package/dist/switch.d.ts.map +0 -1
  274. package/dist/tabs.d.ts.map +0 -1
  275. package/dist/tags-input.d.ts.map +0 -1
  276. package/dist/text.d.ts.map +0 -1
  277. package/dist/time-field.d.ts.map +0 -1
  278. package/dist/time-range-field.d.ts.map +0 -1
  279. package/dist/timer.d.ts.map +0 -1
  280. package/dist/toast.d.ts.map +0 -1
  281. package/dist/toggle-button.d.ts.map +0 -1
  282. package/dist/toggle-group.d.ts.map +0 -1
  283. package/dist/toolbar.d.ts.map +0 -1
  284. package/dist/tooltip.d.ts.map +0 -1
  285. package/dist/tree-grid.d.ts.map +0 -1
  286. package/dist/tree-view.d.ts.map +0 -1
  287. package/dist/virtual.d.ts.map +0 -1
  288. package/dist/window-splitter.d.ts.map +0 -1
  289. package/dist/year-picker.d.ts.map +0 -1
  290. package/dist/year-range-picker.d.ts.map +0 -1
@@ -0,0 +1,109 @@
1
+ import type { TabularCellAddress, TabularColumnDefinition, TabularColumnID, TabularHeaderNodeID, TabularQuery, TabularResult, TabularRow, TabularRowID, TabularRowSelection, TabularSnapshot, TabularView, TabularWireValue } from '@sectile/tabular';
2
+ export interface TabularDOMColumnSizeState {
3
+ readonly revision: number;
4
+ readonly values: Readonly<Record<TabularColumnID, number>>;
5
+ }
6
+ export interface TabularDOMColumnSizeOptions {
7
+ readonly columnSizes?: Readonly<Record<TabularColumnID, number>>;
8
+ readonly defaultColumnSizes?: Readonly<Record<TabularColumnID, number>>;
9
+ readonly onColumnSizesChange?: (state: TabularDOMColumnSizeState) => void;
10
+ }
11
+ export interface TabularDOMRegistrationOptions {
12
+ readonly expectedProjectionGeneration?: number;
13
+ }
14
+ export interface TabularDOMColumnResizeHandleOptions {
15
+ readonly columnID: TabularColumnID;
16
+ readonly minSize?: number;
17
+ readonly maxSize?: number;
18
+ readonly step?: number;
19
+ }
20
+ export type TabularDOMEditorElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;
21
+ export type TabularDOMEditorValueParser = (value: string) => TabularResult<TabularWireValue>;
22
+ export interface TabularDOMEditorOptions {
23
+ readonly cell: TabularCellAddress;
24
+ readonly parseValue?: TabularDOMEditorValueParser;
25
+ readonly commitOnBlur?: boolean;
26
+ readonly disabled?: boolean;
27
+ readonly readOnly?: boolean;
28
+ readonly label?: string;
29
+ }
30
+ export interface TabularHeaderMetrics {
31
+ readonly headerNodeID: TabularHeaderNodeID;
32
+ readonly columnID: TabularColumnID | null;
33
+ readonly columnIndex: number;
34
+ readonly colSpan: number;
35
+ readonly rowSpan: number;
36
+ readonly depth: number;
37
+ }
38
+ export type TabularDOMHeaderReference = {
39
+ readonly columnID: TabularColumnID;
40
+ readonly headerNodeID?: never;
41
+ } | {
42
+ readonly headerNodeID: TabularHeaderNodeID;
43
+ readonly columnID?: never;
44
+ };
45
+ export interface ResolvedTabularHeaderReference {
46
+ readonly headerNodeID: TabularHeaderNodeID;
47
+ readonly metric: TabularHeaderMetrics | undefined;
48
+ }
49
+ export type TabularDOMBulkSelectionState = 'unchecked' | 'indeterminate' | 'checked';
50
+ export interface TabularDOMRowSelectionAnchor {
51
+ readonly rowID: TabularRowID;
52
+ readonly projectionGeneration: number;
53
+ }
54
+ export type TabularDOMRowSelectionEvent = {
55
+ readonly type: 'toggle-row-selection';
56
+ readonly rowID: TabularRowID;
57
+ } | {
58
+ readonly type: 'set-row-selection-range';
59
+ readonly anchorRowID: TabularRowID;
60
+ readonly rowID: TabularRowID;
61
+ readonly selected: boolean;
62
+ };
63
+ export interface TabularDOMRowSelectionActivation {
64
+ readonly event: TabularDOMRowSelectionEvent;
65
+ readonly anchor: TabularDOMRowSelectionAnchor;
66
+ }
67
+ export declare class ColumnSizeStore {
68
+ #private;
69
+ constructor(options: TabularDOMColumnSizeOptions);
70
+ getState(): TabularDOMColumnSizeState;
71
+ synchronize(values: Readonly<Record<TabularColumnID, number>> | undefined): TabularResult<TabularDOMColumnSizeState>;
72
+ propose(columnID: TabularColumnID, size: number): TabularResult<TabularDOMColumnSizeState>;
73
+ }
74
+ export declare function validateColumnSizeOptions(options: TabularDOMColumnSizeOptions): TabularResult<true>;
75
+ export declare class BindingScope {
76
+ #private;
77
+ get active(): boolean;
78
+ retain(dispose: () => void): () => void;
79
+ disconnect(): void;
80
+ }
81
+ export declare function bindEvent<K extends keyof HTMLElementEventMap>(scope: BindingScope, element: HTMLElement, type: K, listener: (event: HTMLElementEventMap[K]) => void): () => void;
82
+ export declare function readEditorValue(element: TabularDOMEditorElement, parser: TabularDOMEditorValueParser | undefined): TabularResult<TabularWireValue>;
83
+ export declare function setEditorAttributes(element: TabularDOMEditorElement, options: TabularDOMEditorOptions, part: string): void;
84
+ export declare function bindColumnResizeHandle(scope: BindingScope, element: HTMLElement, store: ColumnSizeStore, options: TabularDOMColumnResizeHandleOptions, onUpdate: () => void): () => void;
85
+ export declare function validateRegistrationGeneration(current: number, options: TabularDOMRegistrationOptions): TabularResult<true>;
86
+ export declare function currentView(snapshot: TabularSnapshot): TabularView | null;
87
+ export declare function projectedColumns(snapshot: TabularSnapshot): readonly TabularColumnDefinition[];
88
+ export declare function projectedRows(snapshot: TabularSnapshot): readonly TabularRow[];
89
+ export declare function findProjectedRow(snapshot: TabularSnapshot, rowID: string): TabularRow | undefined;
90
+ export declare function orderedColumnIDs(snapshot: TabularSnapshot): readonly TabularColumnID[];
91
+ export declare function columnIndex(snapshot: TabularSnapshot, columnID: TabularColumnID): number;
92
+ export declare function rowIndex(snapshot: TabularSnapshot, rowID: string): number;
93
+ export declare function rowSelected(selection: TabularRowSelection, rowID: TabularRowID): boolean;
94
+ export declare function rowSelectionActivation(selection: TabularRowSelection, projectionGeneration: number, anchor: TabularDOMRowSelectionAnchor | null, rowID: TabularRowID, shiftKey: boolean): TabularDOMRowSelectionActivation;
95
+ export declare function setRowSelectionControlAttributes(element: HTMLElement, checked: boolean, disabled: boolean): void;
96
+ export declare function allMatchingSelectionState(snapshot: TabularSnapshot): TabularDOMBulkSelectionState;
97
+ export declare function setBulkSelectionControlAttributes(element: HTMLElement, state: TabularDOMBulkSelectionState, disabled: boolean): void;
98
+ export declare function queryWithSort(query: TabularQuery, columnID: TabularColumnID, comparator: string, direction: 'ascending' | 'descending' | null): TabularQuery;
99
+ export declare function queryWithFilter(query: TabularQuery, id: string, scope: 'global' | 'column', predicate: string, value: string, columnID?: TabularColumnID): TabularQuery;
100
+ export declare function headerMetrics(snapshot: TabularSnapshot): readonly TabularHeaderMetrics[];
101
+ export declare function resolveHeaderReference(snapshot: TabularSnapshot, reference: TabularDOMHeaderReference): ResolvedTabularHeaderReference;
102
+ export declare function headerElementID(headerNodeID: TabularHeaderNodeID): string;
103
+ export declare function leafHeaderID(snapshot: TabularSnapshot, columnID: TabularColumnID): string | null;
104
+ export declare function setColumnInlineSize(element: HTMLElement, columnID: TabularColumnID, state: TabularDOMColumnSizeState): void;
105
+ export declare function clearAttributes(element: HTMLElement, names: readonly string[]): void;
106
+ export declare function cellKey(cell: TabularCellAddress): string;
107
+ export declare function sameCell(left: TabularCellAddress, right: TabularCellAddress): boolean;
108
+ export declare function domFailure<T>(code: 'invalid-controlled-shape' | 'invalid-column-definition' | 'profile-view-mismatch' | 'stale-revision', message: string, details?: Readonly<Record<string, unknown>>): TabularResult<T>;
109
+ export declare function ok<T>(value: T): TabularResult<T>;
@@ -0,0 +1,316 @@
1
+ import { rowSelectionContains } from '@sectile/tabular/data-table';
2
+ export class ColumnSizeStore {
3
+ #controlled;
4
+ #onChange;
5
+ #state;
6
+ constructor(options) {
7
+ this.#controlled = options.columnSizes !== undefined;
8
+ this.#onChange = options.onColumnSizesChange;
9
+ const initial = options.columnSizes ?? options.defaultColumnSizes ?? {};
10
+ this.#state = freezeColumnSizes(0, initial);
11
+ }
12
+ getState() { return this.#state; }
13
+ synchronize(values) {
14
+ if (this.#controlled !== (values !== undefined)) {
15
+ return domFailure('invalid-controlled-shape', 'Controlled column sizes must preserve construction-time ownership.');
16
+ }
17
+ if (values === undefined)
18
+ return ok(this.#state);
19
+ const valid = validateColumnSizes(values);
20
+ if (!valid.ok)
21
+ return valid;
22
+ this.#state = freezeColumnSizes(this.#state.revision + 1, values);
23
+ return ok(this.#state);
24
+ }
25
+ propose(columnID, size) {
26
+ if (!Number.isFinite(size) || size <= 0)
27
+ return domFailure('invalid-column-definition', 'Column size must be a positive finite number.', { columnID, size });
28
+ const next = freezeColumnSizes(this.#state.revision + 1, { ...this.#state.values, [columnID]: size });
29
+ this.#onChange?.(next);
30
+ if (!this.#controlled)
31
+ this.#state = next;
32
+ return ok(this.#controlled ? this.#state : next);
33
+ }
34
+ }
35
+ export function validateColumnSizeOptions(options) {
36
+ return validateColumnSizes(options.columnSizes ?? options.defaultColumnSizes ?? {});
37
+ }
38
+ export class BindingScope {
39
+ #disposers = new Set();
40
+ #active = true;
41
+ get active() { return this.#active; }
42
+ retain(dispose) {
43
+ if (!this.#active)
44
+ return () => { };
45
+ let retained = true;
46
+ const wrapped = () => {
47
+ if (!retained)
48
+ return;
49
+ retained = false;
50
+ this.#disposers.delete(wrapped);
51
+ dispose();
52
+ };
53
+ this.#disposers.add(wrapped);
54
+ return wrapped;
55
+ }
56
+ disconnect() {
57
+ if (!this.#active)
58
+ return;
59
+ this.#active = false;
60
+ for (const dispose of [...this.#disposers])
61
+ dispose();
62
+ this.#disposers.clear();
63
+ }
64
+ }
65
+ export function bindEvent(scope, element, type, listener) {
66
+ const typed = listener;
67
+ element.addEventListener(type, typed);
68
+ return scope.retain(() => element.removeEventListener(type, typed));
69
+ }
70
+ export function readEditorValue(element, parser) {
71
+ return parser?.(element.value) ?? ok(element.value);
72
+ }
73
+ export function setEditorAttributes(element, options, part) {
74
+ element.setAttribute('data-part', part);
75
+ element.setAttribute('data-row-id', options.cell.rowID);
76
+ element.setAttribute('data-column-id', options.cell.columnID);
77
+ if (options.label === undefined)
78
+ element.removeAttribute('aria-label');
79
+ else
80
+ element.setAttribute('aria-label', options.label);
81
+ element.disabled = options.disabled === true;
82
+ if ('readOnly' in element)
83
+ element.readOnly = options.readOnly === true;
84
+ }
85
+ export function bindColumnResizeHandle(scope, element, store, options, onUpdate) {
86
+ const minimum = options.minSize ?? 24;
87
+ const maximum = options.maxSize ?? Number.MAX_SAFE_INTEGER;
88
+ const step = options.step ?? 8;
89
+ element.setAttribute('role', 'separator');
90
+ element.setAttribute('aria-orientation', 'vertical');
91
+ element.setAttribute('data-column-id', options.columnID);
92
+ element.tabIndex = 0;
93
+ const propose = (size) => {
94
+ const bounded = Math.min(maximum, Math.max(minimum, size));
95
+ if (store.propose(options.columnID, bounded).ok)
96
+ onUpdate();
97
+ };
98
+ const keydown = (event) => {
99
+ if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')
100
+ return;
101
+ event.preventDefault();
102
+ const current = store.getState().values[options.columnID] ?? minimum;
103
+ propose(current + (event.key === 'ArrowRight' ? step : -step));
104
+ };
105
+ const pointerdown = (event) => {
106
+ if (event.button !== 0)
107
+ return;
108
+ event.preventDefault();
109
+ const start = event.clientX;
110
+ const initial = store.getState().values[options.columnID] ?? Math.max(minimum, element.getBoundingClientRect().width);
111
+ const view = element.ownerDocument.defaultView;
112
+ if (view === null)
113
+ return;
114
+ const move = (next) => propose(initial + next.clientX - start);
115
+ const end = () => {
116
+ view.removeEventListener('pointermove', move);
117
+ view.removeEventListener('pointerup', end);
118
+ view.removeEventListener('pointercancel', end);
119
+ };
120
+ view.addEventListener('pointermove', move);
121
+ view.addEventListener('pointerup', end, { once: true });
122
+ view.addEventListener('pointercancel', end, { once: true });
123
+ scope.retain(end);
124
+ };
125
+ const removeKey = bindEvent(scope, element, 'keydown', keydown);
126
+ const removePointer = bindEvent(scope, element, 'pointerdown', pointerdown);
127
+ return scope.retain(() => { removeKey(); removePointer(); });
128
+ }
129
+ export function validateRegistrationGeneration(current, options) {
130
+ if (options.expectedProjectionGeneration !== undefined && options.expectedProjectionGeneration !== current) {
131
+ return domFailure('stale-revision', 'DOM registration projection generation is stale.', {
132
+ expectedProjectionGeneration: options.expectedProjectionGeneration,
133
+ currentProjectionGeneration: current,
134
+ });
135
+ }
136
+ return ok(true);
137
+ }
138
+ export function currentView(snapshot) {
139
+ return snapshot.state.acceptedViewState.kind === 'none' ? null : snapshot.state.acceptedViewState.view;
140
+ }
141
+ export function projectedColumns(snapshot) {
142
+ const view = currentView(snapshot);
143
+ return view?.columnSchema.columns ?? [];
144
+ }
145
+ export function projectedRows(snapshot) {
146
+ return currentView(snapshot)?.rows ?? [];
147
+ }
148
+ export function findProjectedRow(snapshot, rowID) {
149
+ return projectedRows(snapshot).find((row) => row.id === rowID);
150
+ }
151
+ export function orderedColumnIDs(snapshot) {
152
+ const state = snapshot.state.columnState;
153
+ const hidden = new Set(state.hidden);
154
+ return state.order.filter((id) => !hidden.has(id));
155
+ }
156
+ export function columnIndex(snapshot, columnID) {
157
+ return orderedColumnIDs(snapshot).indexOf(columnID) + 1;
158
+ }
159
+ export function rowIndex(snapshot, rowID) {
160
+ return projectedRows(snapshot).findIndex((row) => row.id === rowID) + 1;
161
+ }
162
+ export function rowSelected(selection, rowID) {
163
+ return rowSelectionContains(selection, rowID);
164
+ }
165
+ export function rowSelectionActivation(selection, projectionGeneration, anchor, rowID, shiftKey) {
166
+ const current = Object.freeze({ rowID, projectionGeneration });
167
+ if (!shiftKey || anchor === null || anchor.projectionGeneration !== projectionGeneration) {
168
+ return Object.freeze({ event: Object.freeze({ type: 'toggle-row-selection', rowID }), anchor: current });
169
+ }
170
+ return Object.freeze({
171
+ event: Object.freeze({
172
+ type: 'set-row-selection-range',
173
+ anchorRowID: anchor.rowID,
174
+ rowID,
175
+ selected: !rowSelected(selection, rowID),
176
+ }),
177
+ anchor,
178
+ });
179
+ }
180
+ export function setRowSelectionControlAttributes(element, checked, disabled) {
181
+ if (element.tagName === 'INPUT') {
182
+ const input = element;
183
+ input.checked = checked;
184
+ input.indeterminate = false;
185
+ input.disabled = disabled;
186
+ return;
187
+ }
188
+ element.setAttribute('role', 'checkbox');
189
+ element.setAttribute('aria-checked', String(checked));
190
+ element.setAttribute('aria-disabled', String(disabled));
191
+ element.setAttribute('data-state', checked ? 'checked' : 'unchecked');
192
+ }
193
+ export function allMatchingSelectionState(snapshot) {
194
+ const selection = snapshot.state.rowSelection;
195
+ const view = currentView(snapshot);
196
+ const count = view?.matchingLeafCount;
197
+ const total = count?.kind === 'known' ? count.value : null;
198
+ if (total === 0)
199
+ return 'unchecked';
200
+ if (selection.kind === 'explicit-rows') {
201
+ const visibleLeafIDs = view?.rows.filter((row) => row.kind === 'leaf').map((row) => row.id) ?? [];
202
+ const selectedVisibleCount = visibleLeafIDs.filter((rowID) => rowSelected(selection, rowID)).length;
203
+ if (selectedVisibleCount === 0)
204
+ return 'unchecked';
205
+ return total !== null && visibleLeafIDs.length === total && selectedVisibleCount === total ? 'checked' : 'indeterminate';
206
+ }
207
+ if (selection.excludedRowIDs.length === 0)
208
+ return 'checked';
209
+ return total !== null && selection.excludedRowIDs.length >= total ? 'unchecked' : 'indeterminate';
210
+ }
211
+ export function setBulkSelectionControlAttributes(element, state, disabled) {
212
+ element.setAttribute('role', 'checkbox');
213
+ element.setAttribute('aria-checked', state === 'indeterminate' ? 'mixed' : String(state === 'checked'));
214
+ element.setAttribute('aria-disabled', String(disabled));
215
+ element.setAttribute('data-state', state);
216
+ }
217
+ export function queryWithSort(query, columnID, comparator, direction) {
218
+ const retained = query.sort.filter((sort) => sort.columnID !== columnID);
219
+ const sort = direction === null ? retained : [...retained, { id: `sort:${columnID}`, columnID, comparator, direction }];
220
+ return Object.freeze({ ...query, sort: Object.freeze(sort) });
221
+ }
222
+ export function queryWithFilter(query, id, scope, predicate, value, columnID) {
223
+ const retained = query.filters.filter((filter) => filter.id !== id);
224
+ const filters = value.length === 0
225
+ ? retained
226
+ : [...retained, { id, scope, predicate, value, enabled: true, ...(columnID === undefined ? {} : { columnID }) }];
227
+ return Object.freeze({ ...query, filters: Object.freeze(filters) });
228
+ }
229
+ export function headerMetrics(snapshot) {
230
+ const view = currentView(snapshot);
231
+ const columns = orderedColumnIDs(snapshot);
232
+ const source = view?.columnSchema.headers.length
233
+ ? view.columnSchema.headers
234
+ : (view?.columnSchema.columns ?? []).map((column) => ({
235
+ kind: 'column',
236
+ id: column.headerNodeID ?? column.id,
237
+ columnID: column.id,
238
+ ...(column.label === undefined ? {} : { label: column.label }),
239
+ }));
240
+ const maximumDepth = Math.max(0, ...source.map(nodeDepth));
241
+ const output = [];
242
+ let logicalColumn = 1;
243
+ const visit = (node, depth) => {
244
+ if (node.kind === 'column') {
245
+ const index = columns.indexOf(node.columnID) + 1;
246
+ if (index < 1)
247
+ return 0;
248
+ output.push(Object.freeze({ headerNodeID: node.id, columnID: node.columnID, columnIndex: index, colSpan: 1, rowSpan: maximumDepth - depth + 1, depth }));
249
+ logicalColumn = Math.max(logicalColumn, index + 1);
250
+ return 1;
251
+ }
252
+ const start = logicalColumn;
253
+ let span = 0;
254
+ for (const child of node.children)
255
+ span += visit(child, depth + 1);
256
+ if (span > 0)
257
+ output.push(Object.freeze({ headerNodeID: node.id, columnID: null, columnIndex: start, colSpan: span, rowSpan: 1, depth }));
258
+ return span;
259
+ };
260
+ for (const node of source)
261
+ visit(node, 0);
262
+ return Object.freeze(output);
263
+ }
264
+ export function resolveHeaderReference(snapshot, reference) {
265
+ const metrics = headerMetrics(snapshot);
266
+ const metric = reference.columnID === undefined
267
+ ? metrics.find((entry) => entry.headerNodeID === reference.headerNodeID)
268
+ : metrics.find((entry) => entry.columnID === reference.columnID);
269
+ const fallback = reference.columnID === undefined ? reference.headerNodeID : reference.columnID;
270
+ return Object.freeze({
271
+ headerNodeID: metric?.headerNodeID ?? fallback,
272
+ metric,
273
+ });
274
+ }
275
+ export function headerElementID(headerNodeID) {
276
+ return `sectile-tabular-header-${encodeURIComponent(headerNodeID)}`;
277
+ }
278
+ export function leafHeaderID(snapshot, columnID) {
279
+ const metric = headerMetrics(snapshot).find((entry) => entry.columnID === columnID);
280
+ return metric === undefined ? null : headerElementID(metric.headerNodeID);
281
+ }
282
+ export function setColumnInlineSize(element, columnID, state) {
283
+ const size = state.values[columnID];
284
+ if (size === undefined)
285
+ element.style.removeProperty('inline-size');
286
+ else
287
+ element.style.inlineSize = `${size}px`;
288
+ }
289
+ export function clearAttributes(element, names) {
290
+ for (const name of names)
291
+ element.removeAttribute(name);
292
+ }
293
+ export function cellKey(cell) {
294
+ return JSON.stringify([cell.rowID, cell.columnID]);
295
+ }
296
+ export function sameCell(left, right) {
297
+ return left.rowID === right.rowID && left.columnID === right.columnID;
298
+ }
299
+ export function domFailure(code, message, details) {
300
+ return { ok: false, error: { class: 'construction', code, message, ...(details === undefined ? {} : { details }) } };
301
+ }
302
+ export function ok(value) { return { ok: true, value }; }
303
+ function validateColumnSizes(values) {
304
+ for (const [columnID, size] of Object.entries(values)) {
305
+ if (!Number.isFinite(size) || size <= 0)
306
+ return domFailure('invalid-column-definition', 'Column sizes must be positive finite numbers.', { columnID, size });
307
+ }
308
+ return ok(true);
309
+ }
310
+ function freezeColumnSizes(revision, values) {
311
+ return Object.freeze({ revision, values: Object.freeze({ ...values }) });
312
+ }
313
+ function nodeDepth(node) {
314
+ return node.kind === 'column' ? 0 : 1 + Math.max(0, ...node.children.map(nodeDepth));
315
+ }
316
+ //# sourceMappingURL=tabular-dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabular-dom.js","sourceRoot":"","sources":["../../src/internal/tabular-dom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ import type { TabularCellAddress, TabularColumnID, TabularControlledValues, TabularGroupID, TabularResult, TabularRow, TabularRowID, TabularRowSelection, TabularSnapshot, TabularViewResponse } from '@sectile/tabular';
2
+ import { type TabularDOMColumnResizeHandleOptions, type TabularDOMColumnSizeOptions, type TabularDOMColumnSizeState, type TabularDOMEditorElement, type TabularDOMEditorOptions, type TabularDOMHeaderReference, type TabularDOMRegistrationOptions } from './tabular-dom.js';
3
+ export interface GridDOMCursorState {
4
+ readonly current: TabularCellAddress | null;
5
+ }
6
+ export type GridDOMEditState = {
7
+ readonly kind: 'navigation';
8
+ } | {
9
+ readonly kind: 'editing';
10
+ readonly cell: TabularCellAddress;
11
+ };
12
+ export interface GridDOMState {
13
+ readonly revision: number;
14
+ readonly tabular: TabularSnapshot;
15
+ readonly cursor: GridDOMCursorState;
16
+ readonly edit: GridDOMEditState;
17
+ }
18
+ export interface GridDOMRow {
19
+ readonly row: TabularRow;
20
+ readonly rowID: TabularRowID | TabularGroupID;
21
+ readonly parentRowID: TabularGroupID | null;
22
+ readonly depth: number;
23
+ readonly cells: readonly TabularCellAddress[];
24
+ }
25
+ export interface GridDOMProjection {
26
+ readonly generation: number;
27
+ readonly rows: readonly GridDOMRow[];
28
+ readonly columns: {
29
+ readonly start: readonly TabularColumnID[];
30
+ readonly center: readonly TabularColumnID[];
31
+ readonly end: readonly TabularColumnID[];
32
+ };
33
+ readonly cursor: GridDOMCursorState;
34
+ readonly edit: GridDOMEditState;
35
+ readonly rowSelection: TabularRowSelection;
36
+ readonly expansion: {
37
+ readonly expandedRowIDs: readonly TabularGroupID[];
38
+ };
39
+ }
40
+ export interface GridDOMController<Event, Command, State extends GridDOMState, Projection extends GridDOMProjection> {
41
+ getSnapshot(): State;
42
+ getProjection(): Projection;
43
+ dispatch(event: Event, expectedRevision?: number): TabularResult<{
44
+ readonly snapshot: State;
45
+ readonly commands: readonly Command[];
46
+ }>;
47
+ synchronizeView(response: TabularViewResponse): TabularResult<State>;
48
+ syncControlledValues(values: TabularControlledValues): TabularResult<State>;
49
+ requestView(): TabularResult<State>;
50
+ abandonRequest(requestID: number): TabularResult<State>;
51
+ subscribeCommands(listener: (command: Command) => void): () => void;
52
+ dispose(): void;
53
+ }
54
+ export type GridRevealCellCommand = {
55
+ readonly type: 'request-reveal-cell';
56
+ readonly cell: TabularCellAddress;
57
+ readonly expectedProjectionGeneration: number;
58
+ };
59
+ export type GridRevealRowCommand = {
60
+ readonly type: 'request-reveal-row';
61
+ readonly rowID: TabularRowID;
62
+ readonly expectedProjectionGeneration: number;
63
+ };
64
+ export interface GridDOMConnectionOptions<Controller, Command> extends TabularDOMColumnSizeOptions {
65
+ readonly controller: Controller;
66
+ readonly root: HTMLElement;
67
+ readonly onCommand?: (command: Command | GridRevealCellCommand | GridRevealRowCommand) => void;
68
+ readonly onSnapshotChange?: (snapshot: GridDOMState) => void;
69
+ }
70
+ export interface GridDOMControlledValues extends TabularControlledValues {
71
+ readonly columnSizes?: Readonly<Record<TabularColumnID, number>>;
72
+ }
73
+ export type GridDOMColumnHeaderOptions = TabularDOMHeaderReference;
74
+ export interface GridDOMRowOptions extends TabularDOMRegistrationOptions {
75
+ readonly rowID: TabularRowID | TabularGroupID;
76
+ readonly disabled?: boolean;
77
+ }
78
+ export interface GridDOMCellOptions extends TabularDOMRegistrationOptions {
79
+ readonly cell: TabularCellAddress;
80
+ readonly disabled?: boolean;
81
+ }
82
+ export interface GridDOMSortTriggerOptions {
83
+ readonly columnID: TabularColumnID;
84
+ readonly comparator: string;
85
+ }
86
+ export type GridDOMFilterControlOptions = {
87
+ readonly scope: 'global';
88
+ readonly id: string;
89
+ readonly predicate: string;
90
+ } | {
91
+ readonly scope: 'column';
92
+ readonly id: string;
93
+ readonly predicate: string;
94
+ readonly columnID: TabularColumnID;
95
+ };
96
+ export interface GridDOMSelectionControlOptions {
97
+ readonly rowID: TabularRowID;
98
+ readonly name: string;
99
+ readonly value: string;
100
+ readonly form?: string;
101
+ readonly disabled?: boolean;
102
+ }
103
+ export type GridDOMBulkSelectionControlOptions = {
104
+ readonly target: {
105
+ readonly kind: 'all-matching';
106
+ };
107
+ readonly disabled?: boolean;
108
+ } | {
109
+ readonly target: {
110
+ readonly kind: 'group-leaves';
111
+ readonly groupID: TabularGroupID;
112
+ };
113
+ readonly disabled?: boolean;
114
+ };
115
+ export interface GridDOMDisclosureOptions {
116
+ readonly rowID: TabularGroupID;
117
+ readonly disabled?: boolean;
118
+ }
119
+ export interface GridDOMEditorOptions extends TabularDOMEditorOptions {
120
+ }
121
+ export declare class DOMTabularGrid<Event, Command, State extends GridDOMState, Projection extends GridDOMProjection> {
122
+ #private;
123
+ readonly controller: GridDOMController<Event, Command, State, Projection>;
124
+ constructor(options: GridDOMConnectionOptions<GridDOMController<Event, Command, State, Projection>, Command>, tree: boolean, ownsController: boolean);
125
+ getSnapshot(): State;
126
+ getProjection(): Projection;
127
+ getColumnSizeState(): TabularDOMColumnSizeState;
128
+ syncControlledValues(values: GridDOMControlledValues): TabularResult<State>;
129
+ synchronizeView(response: TabularViewResponse): TabularResult<State>;
130
+ requestView(): TabularResult<State>;
131
+ abandonRequest(requestID: number): TabularResult<State>;
132
+ handleEvent(event: Event): boolean;
133
+ setGridAttributes(element?: HTMLElement): void;
134
+ setColumnHeaderAttributes(element: HTMLElement, options: GridDOMColumnHeaderOptions): void;
135
+ setRowAttributes(element: HTMLElement, options: GridDOMRowOptions): void;
136
+ setCellAttributes(element: HTMLElement, options: GridDOMCellOptions): void;
137
+ registerRow(element: HTMLElement, options: GridDOMRowOptions): TabularResult<() => void>;
138
+ registerCell(element: HTMLElement, options: GridDOMCellOptions): TabularResult<() => void>;
139
+ bindSortTrigger(element: HTMLElement, options: GridDOMSortTriggerOptions): () => void;
140
+ bindFilterControl(element: HTMLInputElement | HTMLSelectElement, options: GridDOMFilterControlOptions): () => void;
141
+ bindRowSelectionControl(element: HTMLElement, options: GridDOMSelectionControlOptions): () => void;
142
+ bindBulkSelectionControl(element: HTMLElement, options: GridDOMBulkSelectionControlOptions): () => void;
143
+ bindRowDisclosure(element: HTMLElement, options: GridDOMDisclosureOptions): () => void;
144
+ bindEditor(element: TabularDOMEditorElement, options: GridDOMEditorOptions): () => void;
145
+ bindColumnResizeHandle(element: HTMLElement, options: TabularDOMColumnResizeHandleOptions): () => void;
146
+ requestRevealCell(cell: TabularCellAddress, expectedProjectionGeneration?: number): boolean;
147
+ requestRevealRow(rowID: TabularRowID, expectedProjectionGeneration?: number): boolean;
148
+ focusCurrent(): void;
149
+ refresh(): void;
150
+ disconnect(): void;
151
+ }