@lavalogic/scoria 0.37.44 → 0.37.45

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 (237) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +46 -46
  3. package/dist/Components/AccordionGroupButton.svelte +76 -76
  4. package/dist/Components/Action.svelte +136 -136
  5. package/dist/Components/ActionProps.d.ts +2 -6
  6. package/dist/Components/AlertModal.svelte +195 -183
  7. package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +702 -702
  8. package/dist/Components/Base/BaseModal.svelte +125 -125
  9. package/dist/Components/Base/ContextWrapper.svelte +72 -72
  10. package/dist/Components/Base/Pagination.svelte +198 -198
  11. package/dist/Components/Base/Snippets.svelte +36 -36
  12. package/dist/Components/BigRadioSet.svelte +38 -38
  13. package/dist/Components/Bubble.svelte +101 -101
  14. package/dist/Components/Button.svelte +209 -209
  15. package/dist/Components/ButtonProps.d.ts +2 -6
  16. package/dist/Components/Checkbox.svelte +86 -86
  17. package/dist/Components/CollapsibleCard.svelte +78 -78
  18. package/dist/Components/Contexts/ContextMenu.svelte +164 -164
  19. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  20. package/dist/Components/Contexts/ContextMenuOption.svelte +60 -60
  21. package/dist/Components/Contexts/Toast.svelte +83 -83
  22. package/dist/Components/Contexts/ToastContainer.svelte +65 -65
  23. package/dist/Components/Contexts/Tooltip.svelte +37 -37
  24. package/dist/Components/DataMatrixIcon.svelte +112 -112
  25. package/dist/Components/DataMatrixIconProps.d.ts +3 -13
  26. package/dist/Components/DateInput.svelte +148 -148
  27. package/dist/Components/DatePicker.svelte +300 -300
  28. package/dist/Components/DesktopModal.svelte +90 -90
  29. package/dist/Components/Dial.svelte +204 -204
  30. package/dist/Components/DialProps.d.ts +1 -18
  31. package/dist/Components/DimensionInput.svelte +170 -170
  32. package/dist/Components/DragMenu/DragMenuHolder.svelte +119 -119
  33. package/dist/Components/DragMenu/DraggableCard.svelte +77 -77
  34. package/dist/Components/FileCard.svelte +24 -24
  35. package/dist/Components/FileUpload.svelte +236 -236
  36. package/dist/Components/GridInput.svelte +196 -200
  37. package/dist/Components/GridInputSet.svelte +29 -29
  38. package/dist/Components/HorizontalTabGroup.svelte +82 -82
  39. package/dist/Components/HorizontalTabGroupButton.svelte +44 -44
  40. package/dist/Components/Icon.svelte +128 -128
  41. package/dist/Components/IconProps.d.ts +2 -7
  42. package/dist/Components/Icons.js +357 -357
  43. package/dist/Components/LoadingAnimation.svelte +29 -29
  44. package/dist/Components/LoadingModal.svelte +45 -45
  45. package/dist/Components/LoadingOverlay.svelte +25 -25
  46. package/dist/Components/LoadingOverlayProps.d.ts +3 -7
  47. package/dist/Components/Modal.svelte +258 -258
  48. package/dist/Components/ModalProps.d.ts +0 -3
  49. package/dist/Components/MultiSelect.svelte +220 -220
  50. package/dist/Components/MultiSelectCommonProps.d.ts +6 -17
  51. package/dist/Components/Nav/Nav.svelte +99 -99
  52. package/dist/Components/Nav/NavProps.d.ts +4 -11
  53. package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
  54. package/dist/Components/Nav/NavTab.svelte +62 -62
  55. package/dist/Components/Nav/ServiceMenuItem.svelte +100 -100
  56. package/dist/Components/Nav/ServicesNav.svelte +80 -80
  57. package/dist/Components/NumberInput.svelte +157 -157
  58. package/dist/Components/PageHeading.svelte +25 -25
  59. package/dist/Components/PasswordInput.svelte +88 -88
  60. package/dist/Components/Portal.svelte +36 -36
  61. package/dist/Components/ProgressBubble.svelte +107 -108
  62. package/dist/Components/ProgressBubbleProps.d.ts +3 -3
  63. package/dist/Components/QuerySelect.svelte +366 -366
  64. package/dist/Components/QuerySelectProps.d.ts +4 -14
  65. package/dist/Components/SingleSelect.svelte +250 -250
  66. package/dist/Components/SingleSelectCommonProps.d.ts +3 -19
  67. package/dist/Components/StepButton.svelte +70 -70
  68. package/dist/Components/StepForm.svelte +140 -140
  69. package/dist/Components/Switch.svelte +69 -69
  70. package/dist/Components/Table/ARCHITECTURE.md +298 -0
  71. package/dist/Components/Table/Body/QuickSearchCell.svelte +679 -694
  72. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +51 -51
  73. package/dist/Components/Table/Body/Rows/ColumnList.svelte +59 -59
  74. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +456 -478
  75. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
  76. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +185 -188
  77. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +124 -124
  78. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +120 -120
  79. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +230 -230
  80. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
  81. package/dist/Components/Table/Body/Rows/Columns/SelectColumn.d.ts +12 -9
  82. package/dist/Components/Table/Body/Rows/Columns/SelectTableCell.d.ts +5 -5
  83. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +87 -87
  84. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +126 -126
  85. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +159 -159
  86. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +246 -246
  87. package/dist/Components/Table/Body/Rows/Columns/TableDatePickerProps.d.ts +4 -4
  88. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +216 -216
  89. package/dist/Components/Table/Body/Rows/Columns/TableQueryCell.d.ts +6 -5
  90. package/dist/Components/Table/Body/Rows/Columns/TableQueryColumn.d.ts +7 -6
  91. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +252 -257
  92. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
  93. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +221 -229
  94. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte.d.ts +11 -11
  95. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +197 -197
  96. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +190 -190
  97. package/dist/Components/Table/Body/Rows/TableRow.svelte +290 -290
  98. package/dist/Components/Table/Body/TableBody.svelte +155 -155
  99. package/dist/Components/Table/ColumnDefinitions/ExampleItemColumnDefRepository.svelte.js +2 -3
  100. package/dist/Components/Table/ColumnFactory.svelte.d.ts +9 -11
  101. package/dist/Components/Table/ColumnFactory.svelte.js +101 -118
  102. package/dist/Components/Table/ColumnKindRegistry.d.ts +112 -0
  103. package/dist/Components/Table/ColumnKindRegistry.js +63 -0
  104. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +41 -41
  105. package/dist/Components/Table/Headers/SelectAllHeader.svelte +30 -30
  106. package/dist/Components/Table/Headers/TableHead.svelte +415 -413
  107. package/dist/Components/Table/Misc/ColumnPanel.svelte +94 -94
  108. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +112 -112
  109. package/dist/Components/Table/Misc/FilterInput.svelte +620 -644
  110. package/dist/Components/Table/Misc/FilterInput.svelte.d.ts +12 -12
  111. package/dist/Components/Table/Misc/FilterInputProps.d.ts +2 -2
  112. package/dist/Components/Table/Misc/FilterPanel.svelte +257 -257
  113. package/dist/Components/Table/Misc/FilterPanelModal.svelte +30 -30
  114. package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
  115. package/dist/Components/Table/Misc/TableFooter.svelte +311 -311
  116. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +125 -125
  117. package/dist/Components/Table/Misc/TableSidebar.svelte +157 -157
  118. package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
  119. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
  120. package/dist/Components/Table/NestedTable.svelte +130 -133
  121. package/dist/Components/Table/SubApis.svelte.d.ts +1 -5
  122. package/dist/Components/Table/SubApis.svelte.js +33 -32
  123. package/dist/Components/Table/Table.svelte +692 -745
  124. package/dist/Components/Table/TableHelpers.svelte.d.ts +6 -19
  125. package/dist/Components/Table/TableHelpers.svelte.js +6 -14
  126. package/dist/Components/Table/Types/Columns/Column.d.ts +2 -2
  127. package/dist/Components/Table/Types/Columns/DateColumn.d.ts +3 -3
  128. package/dist/Components/Table/Types/Columns/DateTableCell.d.ts +7 -7
  129. package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.d.ts +7 -8
  130. package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.js +4 -5
  131. package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.svelte.d.ts +11 -14
  132. package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.svelte.js +3 -4
  133. package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.d.ts +7 -11
  134. package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.js +3 -3
  135. package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.d.ts +13 -18
  136. package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.js +4 -5
  137. package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.svelte.d.ts +5 -5
  138. package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.svelte.js +2 -2
  139. package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.d.ts +15 -12
  140. package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.js +4 -5
  141. package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.svelte.d.ts +8 -12
  142. package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.svelte.js +3 -3
  143. package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.d.ts +6 -6
  144. package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.js +3 -3
  145. package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.d.ts +49 -16
  146. package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.js +27 -5
  147. package/dist/Components/Table/Types/Columns/Definitions/Display/AbstractDisplayDef.svelte.d.ts +7 -7
  148. package/dist/Components/Table/Types/Columns/Definitions/Display/AbstractDisplayDef.svelte.js +4 -4
  149. package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.d.ts +5 -5
  150. package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.js +2 -2
  151. package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.svelte.d.ts +5 -5
  152. package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.svelte.js +2 -2
  153. package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.d.ts +5 -5
  154. package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.js +2 -2
  155. package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.d.ts +5 -5
  156. package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.js +2 -2
  157. package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.d.ts +11 -19
  158. package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.js +4 -8
  159. package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.svelte.d.ts +6 -7
  160. package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.svelte.js +3 -4
  161. package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.d.ts +9 -9
  162. package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.js +4 -4
  163. package/dist/Components/Table/Types/Columns/ExpandTableCell.d.ts +5 -5
  164. package/dist/Components/Table/Types/Columns/ProgressBarTableCell.d.ts +6 -6
  165. package/dist/Components/Table/Types/Columns/TableCell.d.ts +7 -6
  166. package/dist/Components/Table/Types/Context/ClipboardState.svelte.d.ts +98 -0
  167. package/dist/Components/Table/Types/Context/ClipboardState.svelte.js +290 -0
  168. package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.d.ts +17 -45
  169. package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.js +17 -45
  170. package/dist/Components/Table/Types/Context/FilteringState.svelte.d.ts +9 -20
  171. package/dist/Components/Table/Types/Context/FilteringState.svelte.js +9 -20
  172. package/dist/Components/Table/Types/Context/FocusState.svelte.d.ts +23 -42
  173. package/dist/Components/Table/Types/Context/FocusState.svelte.js +32 -59
  174. package/dist/Components/Table/Types/Context/ITable.d.ts +5 -8
  175. package/dist/Components/Table/Types/Context/PreferencesState.svelte.d.ts +29 -56
  176. package/dist/Components/Table/Types/Context/PreferencesState.svelte.js +28 -55
  177. package/dist/Components/Table/Types/Context/QueryValuesState.svelte.d.ts +50 -0
  178. package/dist/Components/Table/Types/Context/QueryValuesState.svelte.js +62 -0
  179. package/dist/Components/Table/Types/Context/SelectionState.svelte.d.ts +17 -28
  180. package/dist/Components/Table/Types/Context/SelectionState.svelte.js +17 -28
  181. package/dist/Components/Table/Types/Context/SortingState.svelte.d.ts +15 -29
  182. package/dist/Components/Table/Types/Context/SortingState.svelte.js +17 -31
  183. package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +212 -325
  184. package/dist/Components/Table/Types/Context/TableContext.svelte.js +292 -706
  185. package/dist/Components/Table/Types/Context/VirtualisationState.svelte.d.ts +62 -79
  186. package/dist/Components/Table/Types/Context/VirtualisationState.svelte.js +54 -73
  187. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.d.ts +16 -27
  188. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.js +16 -27
  189. package/dist/Components/Table/Types/DataRepository/IDataRepository.d.ts +12 -15
  190. package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.d.ts +15 -30
  191. package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.js +16 -28
  192. package/dist/Components/Table/Types/Header.d.ts +4 -4
  193. package/dist/Components/Table/Types/HeaderGroup.d.ts +5 -5
  194. package/dist/Components/Table/Types/Public/index.d.ts +2 -4
  195. package/dist/Components/Table/Types/Public/index.js +2 -4
  196. package/dist/Components/Table/clipboardEscape.d.ts +32 -0
  197. package/dist/Components/Table/clipboardEscape.js +45 -0
  198. package/dist/Components/Table/createTable.svelte.d.ts +8 -18
  199. package/dist/Components/Table/createTable.svelte.js +19 -47
  200. package/dist/Components/Test/TestContextConsumer.svelte +13 -13
  201. package/dist/Components/TextArea.svelte +130 -130
  202. package/dist/Components/TextInput.svelte +176 -176
  203. package/dist/Components/ThreeStateRadio.svelte +131 -131
  204. package/dist/Components/Touch/BoolCard.svelte +45 -45
  205. package/dist/Components/Touch/DateModal.svelte +209 -209
  206. package/dist/Components/Touch/EditCard.svelte +59 -59
  207. package/dist/Components/Touch/InfoCard.svelte +31 -31
  208. package/dist/Components/Touch/InfoTextCard.svelte +28 -28
  209. package/dist/Components/Touch/ModalExplanation.svelte +17 -17
  210. package/dist/Components/Touch/NumberKeyboard.svelte +225 -225
  211. package/dist/Components/Touch/NumberModal.svelte +79 -79
  212. package/dist/Components/Touch/PlusMinusCard.svelte +46 -46
  213. package/dist/Components/Touch/SelectModal.svelte +123 -123
  214. package/dist/Components/Touch/SummaryCard.svelte +93 -93
  215. package/dist/Components/Touch/TextAreaModal.svelte +95 -95
  216. package/dist/Components/Touch/TextModal.svelte +106 -106
  217. package/dist/Components/Touch/TouchCard.svelte +33 -33
  218. package/dist/Components/Touch/TouchModal.svelte +274 -274
  219. package/dist/Components/Touch/UtilityButton.svelte +109 -109
  220. package/dist/Components/VerticalTabGroup.svelte +79 -79
  221. package/dist/Components/VerticalTabGroupButton.svelte +58 -58
  222. package/dist/Contexts/ToastContext.svelte.js +3 -4
  223. package/dist/Helpers/Datamatrix.d.ts +19 -19
  224. package/dist/Helpers/Datamatrix.js +291 -291
  225. package/dist/Helpers/Helpers.svelte.d.ts +2 -4
  226. package/dist/Helpers/Helpers.svelte.js +2 -4
  227. package/dist/Helpers/dropdownPortal.d.ts +26 -41
  228. package/dist/Helpers/dropdownPortal.js +62 -116
  229. package/dist/Types/Examples/ExampleModal.svelte +35 -35
  230. package/dist/index.d.ts +0 -1
  231. package/dist/scss/_basics.scss +12 -12
  232. package/dist/scss/_colours.scss +134 -134
  233. package/dist/scss/_mixins.scss +3348 -3360
  234. package/dist/scss/_motion.scss +57 -57
  235. package/dist/scss/_sizing.scss +85 -85
  236. package/dist/scss/_transitions.scss +8 -8
  237. package/package.json +2 -1
@@ -1,135 +1,132 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- module
6
- >
7
- import Table from './Table.svelte';
8
- import type { NestedTableProps } from './NestedTableProps.js';
9
- import type { Primitive, TableInitOptions } from './Types/Context/TableInitOptions.js';
10
- import { TableContext } from './Types/Context/TableContext.svelte.js';
11
- import { LocalTableDataRepository } from './Types/DataRepository/LocalTableDataRepository.svelte.js';
12
- import { ToolbarPosition } from './Types/Toolbar/ToolbarPosition.js';
13
-
14
- /**
15
- * Default `TableInitOptions` overrides applied to every nested table.
16
- * Tuned for read-only inline display: copy, resize and column
17
- * reordering are turned off, quick / advanced filtering remain on so
18
- * the consumer can still narrow rows, the toolbar is hidden, and the
19
- * footer is suppressed because pagination is rarely useful for inline
20
- * nested data.
21
- *
22
- * Frozen so consumers cannot accidentally mutate the shared default
23
- * object.
24
- */
25
- const DEFAULT_NESTED_TABLE_OPTIONS: Omit<
26
- TableInitOptions<object, never>,
27
- 'selectionExtractor' | 'getUserId'
28
- > = Object.freeze({
29
- allowCopy: false,
30
- enableResize: false,
31
- // Was `false`; flipped to `true` so nested-table columns can be
32
- // reordered and pinned by default like the outer table. The
33
- // `inner.allowReorder` option on `col.expand` (and the matching
34
- // `allowReorder` on top-level `createTable`) still lets callers
35
- // opt out per inner table when they want to lock the layout.
36
- allowColumnReordering: true,
37
- allowQuickFiltering: true,
38
- allowAdvancedFiltering: true,
39
- toolbar: ToolbarPosition.None,
40
- displayFooter: false,
41
- });
42
- </script>
43
-
44
- <script
45
- lang="ts"
46
- generics="T extends object,IdType extends Primitive"
47
- >
48
- const {
49
- tableName,
50
- data,
51
- columnDefWrapper,
52
- options,
53
- oncontextmenu,
54
- getUserId,
55
- }: NestedTableProps<T, IdType> = $props();
56
-
57
- // Reactive wrapper exposing the `data` prop as `.value` so the
58
- // underlying LocalTableDataRepository can read it through its
59
- // RefWrapper contract without us materialising a copy.
60
- const wrapper = {
61
- get value() {
62
- return data;
63
- },
64
- };
65
-
66
- let root: HTMLDivElement | undefined = $state();
67
-
68
- // Track the parent `.datatable`'s visible width (clientWidth) via
69
- // ResizeObserver. `.datatable` is the horizontal scroll container,
70
- // so its `clientWidth` is the visible viewport regardless of how
71
- // wide the inner `.datatable-grid` has grown via `min-width:
72
- // max-content`. Measuring `.flex_table` instead would pick up the
73
- // scroll-content width through flex `min-width: auto` propagation,
74
- // which sized the nested table to the full grid (much wider than
75
- // the visible area) and broke the sticky-fit behaviour.
76
- //
77
- // Reading layout inside a derivation would force a synchronous
78
- // reflow on every reactive re-run; the ResizeObserver path keeps
79
- // it out of the reactive graph (workorder NestedTable P1).
80
- let maxWidth: number | undefined = $state();
81
- $effect(() => {
82
- if (!root) {
83
- return;
84
- }
85
- const scrollHost = root.closest('.datatable');
86
- if (!(scrollHost instanceof HTMLElement)) {
87
- return;
88
- }
89
- maxWidth = scrollHost.clientWidth;
90
- const ro = new ResizeObserver(() => {
91
- maxWidth = scrollHost.clientWidth;
92
- });
93
- ro.observe(scrollHost);
94
- return () => {
95
- ro.disconnect();
96
- };
97
- });
98
-
99
- // These class instances are plain objects whose internal fields are
100
- // already `$state`-backed; wrapping them in `$state(...)` (as the
101
- // pre-cleanup version did) adds a redundant reactive layer. The
102
- // dataRepo and tableContext references must remain stable across
103
- // updates: a fresh `dataRepo` would clear filter/sort state, and a
104
- // fresh `tableContext` would tear down focus.
105
- //
106
- // svelte-ignore state_referenced_locally
107
- const dataRepo = new LocalTableDataRepository<T>(tableName, wrapper, () => getUserId());
108
-
109
- // svelte-ignore state_referenced_locally
110
- const tableContext = TableContext.init<T, IdType>(columnDefWrapper, tableName, dataRepo, {
111
- ...DEFAULT_NESTED_TABLE_OPTIONS,
112
- ...options,
113
- getUserId: () => getUserId(),
114
- });
115
- </script>
116
-
117
- <!-- svelte-ignore a11y_no_static_element_interactions -->
118
- <div
119
- class="limit-height"
120
- bind:this={root}
121
- style:width={maxWidth != null ? `${maxWidth}px` : null}
122
- oncontextmenu={(e) => {
123
- e.stopPropagation();
124
- oncontextmenu?.(e);
125
- }}
126
- >
127
- <Table
128
- nested
129
- {tableContext}
130
- />
131
- </div>
132
-
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ module
6
+ >
7
+ import Table from './Table.svelte';
8
+ import type { NestedTableProps } from './NestedTableProps.js';
9
+ import type { Primitive, TableInitOptions } from './Types/Context/TableInitOptions.js';
10
+ import { TableContext } from './Types/Context/TableContext.svelte.js';
11
+ import { LocalTableDataRepository } from './Types/DataRepository/LocalTableDataRepository.svelte.js';
12
+ import { ToolbarPosition } from './Types/Toolbar/ToolbarPosition.js';
13
+
14
+ /**
15
+ * Default `TableInitOptions` overrides applied to every nested table.
16
+ * Tuned for read-only inline display: copy, resize and column
17
+ * reordering are turned off, quick / advanced filtering remain on so
18
+ * the consumer can still narrow rows, the toolbar is hidden, and the
19
+ * footer is suppressed because pagination is rarely useful for inline
20
+ * nested data.
21
+ *
22
+ * Frozen so consumers cannot accidentally mutate the shared default
23
+ * object.
24
+ */
25
+ const DEFAULT_NESTED_TABLE_OPTIONS: Omit<
26
+ TableInitOptions<object, never>,
27
+ 'selectionExtractor' | 'getUserId'
28
+ > = Object.freeze({
29
+ allowCopy: false,
30
+ enableResize: false,
31
+ // Nested-table columns can be reordered and pinned by default like
32
+ // the outer table. Callers opt out per inner table via the
33
+ // `inner.allowReorder` option on `col.expand` (or the matching
34
+ // `allowReorder` on top-level `createTable`).
35
+ allowColumnReordering: true,
36
+ allowQuickFiltering: true,
37
+ allowAdvancedFiltering: true,
38
+ toolbar: ToolbarPosition.None,
39
+ displayFooter: false,
40
+ });
41
+ </script>
42
+
43
+ <script
44
+ lang="ts"
45
+ generics="T extends object,IdType extends Primitive"
46
+ >
47
+ const {
48
+ tableName,
49
+ data,
50
+ columnDefWrapper,
51
+ options,
52
+ oncontextmenu,
53
+ getUserId,
54
+ }: NestedTableProps<T, IdType> = $props();
55
+
56
+ // Reactive wrapper exposing the `data` prop as `.value` so the
57
+ // underlying LocalTableDataRepository can read it through its
58
+ // RefWrapper contract without us materialising a copy.
59
+ const wrapper = {
60
+ get value() {
61
+ return data;
62
+ },
63
+ };
64
+
65
+ let root: HTMLDivElement | undefined = $state();
66
+
67
+ // Track the parent `.datatable`'s visible width (clientWidth) via
68
+ // ResizeObserver. `.datatable` is the horizontal scroll container, so
69
+ // its `clientWidth` is the visible viewport regardless of how wide the
70
+ // inner `.datatable-grid` has grown via `min-width: max-content`. Do
71
+ // NOT measure `.flex_table` instead - flex `min-width: auto`
72
+ // propagates the scroll-content width and sizes the nested table to
73
+ // the full grid, breaking the sticky-fit behaviour.
74
+ //
75
+ // Reading layout inside a derivation would force a synchronous reflow
76
+ // on every reactive re-run; the ResizeObserver path keeps it out of
77
+ // the reactive graph.
78
+ let maxWidth: number | undefined = $state();
79
+ $effect(() => {
80
+ if (!root) {
81
+ return;
82
+ }
83
+ const scrollHost = root.closest('.datatable');
84
+ if (!(scrollHost instanceof HTMLElement)) {
85
+ return;
86
+ }
87
+ maxWidth = scrollHost.clientWidth;
88
+ const ro = new ResizeObserver(() => {
89
+ maxWidth = scrollHost.clientWidth;
90
+ });
91
+ ro.observe(scrollHost);
92
+ return () => {
93
+ ro.disconnect();
94
+ };
95
+ });
96
+
97
+ // These class instances have `$state`-backed internal fields, so they
98
+ // must NOT be wrapped in `$state(...)` (that would add a redundant
99
+ // reactive layer). The `dataRepo` and `tableContext` references must
100
+ // stay stable across updates: a fresh `dataRepo` would clear
101
+ // filter/sort state, and a fresh `tableContext` would tear down focus.
102
+ //
103
+ // svelte-ignore state_referenced_locally
104
+ const dataRepo = new LocalTableDataRepository<T>(tableName, wrapper, () => getUserId());
105
+
106
+ // svelte-ignore state_referenced_locally
107
+ const tableContext = TableContext.init<T, IdType>(columnDefWrapper, tableName, dataRepo, {
108
+ ...DEFAULT_NESTED_TABLE_OPTIONS,
109
+ ...options,
110
+ getUserId: () => getUserId(),
111
+ });
112
+ </script>
113
+
114
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
115
+ <div
116
+ class="limit-height"
117
+ bind:this={root}
118
+ style:width={maxWidth != null ? `${maxWidth}px` : null}
119
+ oncontextmenu={(e) => {
120
+ e.stopPropagation();
121
+ oncontextmenu?.(e);
122
+ }}
123
+ >
124
+ <Table
125
+ nested
126
+ {tableContext}
127
+ />
128
+ </div>
129
+
133
130
  <style>.limit-height {
134
131
  position: sticky;
135
132
  left: 0;
@@ -138,4 +135,4 @@
138
135
  box-sizing: border-box;
139
136
  background-color: #f4f7f9;
140
137
  box-shadow: inset 0px 7px 5px -6px #cbd4da, inset 0px -7px 5px -6px #cbd4da;
141
- }</style>
138
+ }</style>
@@ -1,13 +1,9 @@
1
1
  /**
2
2
  * Sub-API facade constructors. Each `makeXxxApi(tableContext)` returns a
3
3
  * frozen object literal whose shape matches the corresponding interface in
4
- * `Types/Public/TableSubApis.ts`. Reads delegate to the underlying Phase 6
4
+ * `Types/Public/TableSubApis.ts`. Reads delegate to the underlying
5
5
  * sub-context (`tableContext._selection`, `_filtering`, etc.); writes
6
6
  * delegate to the matching setter or method.
7
- *
8
- * Phase 1 ships these as a thin facade over the existing internals. Phase 2
9
- * will collapse the duplication once the legacy delegating accessors on
10
- * `TableContext` are removed.
11
7
  */
12
8
  import type { TableContext } from './Types/Context/TableContext.svelte.js';
13
9
  import type { Primitive } from './Types/Context/TableInitOptions.js';
@@ -1,14 +1,11 @@
1
1
  /**
2
2
  * Sub-API facade constructors. Each `makeXxxApi(tableContext)` returns a
3
3
  * frozen object literal whose shape matches the corresponding interface in
4
- * `Types/Public/TableSubApis.ts`. Reads delegate to the underlying Phase 6
4
+ * `Types/Public/TableSubApis.ts`. Reads delegate to the underlying
5
5
  * sub-context (`tableContext._selection`, `_filtering`, etc.); writes
6
6
  * delegate to the matching setter or method.
7
- *
8
- * Phase 1 ships these as a thin facade over the existing internals. Phase 2
9
- * will collapse the duplication once the legacy delegating accessors on
10
- * `TableContext` are removed.
11
7
  */
8
+ import { escapeForSpreadsheet } from './clipboardEscape.js';
12
9
  // ─────────────────────────────────────────────────────────────────────────
13
10
  // Selection
14
11
  // ─────────────────────────────────────────────────────────────────────────
@@ -23,11 +20,23 @@ export function makeSelectionApi(ctx) {
23
20
  toggle(row) {
24
21
  void ctx._selection.toggleSelected(row);
25
22
  },
26
- set(rowId, row) {
27
- ctx._selection.selectedItems.set(rowId, row);
23
+ set(_rowId, row) {
24
+ // Route through the sub-context's flush-aware writer so the
25
+ // pending-changes buffer and `_keyCache` stay consistent. The
26
+ // caller's `rowId` is ignored — the underlying writer recomputes
27
+ // the key from the row reference via the configured
28
+ // `selectionExtractor`, which is the source of truth.
29
+ void ctx._selection.setSelected(row, true);
28
30
  },
29
31
  delete(rowId) {
30
- ctx._selection.selectedItems.delete(rowId);
32
+ // Resolve the row from the live selected map so we can route
33
+ // removal through `setSelected(false)` and pick up the same
34
+ // flush + cache-invalidation semantics. No-op when the id is
35
+ // not currently selected.
36
+ const row = ctx._selection.selectedItems.get(rowId);
37
+ if (row !== undefined) {
38
+ void ctx._selection.setSelected(row, false);
39
+ }
31
40
  },
32
41
  clear() {
33
42
  ctx._selection.resetSelectedItems();
@@ -160,11 +169,9 @@ export function makeColumnsApi(ctx, specsById) {
160
169
  ctx._columnLayout.columnVisibility = next;
161
170
  },
162
171
  setPinning(columnId, side) {
163
- // `ColumnPinningState` is `{ left?: ReadonlyMap<string, number>;
164
- // right?: ReadonlyMap<string, number>; }`. Each map keys a column
165
- // id to the width at which it is pinned. The columns sub-context
166
- // fills in widths from the column-sizing state when we delegate;
167
- // here we provide 0 as a placeholder for newly-pinned columns.
172
+ // `ColumnPinningState` maps each column id to the pinned width.
173
+ // The columns sub-context fills in real widths from column-sizing
174
+ // when we delegate, so 0 is a safe placeholder here.
168
175
  const current = ctx._columnLayout.columnPinning;
169
176
  // Local, single-shot rebuild before reassigning the reactive container.
170
177
  // eslint-disable-next-line svelte/prefer-svelte-reactivity
@@ -212,8 +219,8 @@ export function makeFocusApi(ctx) {
212
219
  },
213
220
  moveTo(row, column) {
214
221
  // `CellCoordinates` carries `{ id, row, column }` so the focus
215
- // target is addressable by both ordinal index and stable id. We
216
- // look up the id from the column-layout's ordered defs.
222
+ // target is addressable by both ordinal index and stable id; the
223
+ // id is looked up from the column-layout's ordered defs.
217
224
  const defs = ctx._columnLayout.columnDefs;
218
225
  if (column < 0 || column >= defs.length) {
219
226
  return;
@@ -231,16 +238,12 @@ export function makeFocusApi(ctx) {
231
238
  // ─────────────────────────────────────────────────────────────────────────
232
239
  export function makePreferencesApi(ctx) {
233
240
  // Adapt the internal `ColumnDefSet<T>` shape to the public `SavedPreset`
234
- // shape. The internal `ColumnDefSet` carries `name`, `sortingState`,
235
- // `visibilityState`, `columnPinningState`, and `columnDefs`. It does NOT
236
- // carry a `savedAt` timestamp or a per-column `columnSizing` map; the
237
- // public `SavedPreset.savedAt` is a placeholder until Phase 2 extends
238
- // the internal shape, and the per-column `width` falls back to the def's
239
- // `minSize`.
241
+ // shape. `ColumnDefSet` has no `savedAt` timestamp or per-column sizing
242
+ // map, so `savedAt` is an epoch-zero placeholder and per-column `width`
243
+ // falls back to the def's `minSize`.
240
244
  const adapt = (set) => ({
241
245
  name: set.name,
242
- // Static epoch-zero placeholder until Phase 2 extends ColumnDefSet with a
243
- // real timestamp; no reactivity needed for a literal placeholder.
246
+ // Literal placeholder, no reactivity needed.
244
247
  // eslint-disable-next-line svelte/prefer-svelte-reactivity
245
248
  savedAt: new Date(0).toISOString(),
246
249
  columns: set.columnDefs.map((c) => ({
@@ -333,11 +336,9 @@ export function makeModalApi(ctx) {
333
336
  return ctx.openModalCell;
334
337
  },
335
338
  open(row, columnId) {
336
- // The underlying setter takes the row by reference. Cells
337
- // compare via object identity, so passing the same instance
338
- // the table holds for the row is load-bearing - callers
339
- // typically have that instance in hand from `table.rows`,
340
- // `table.selection.map`, or a `col.actions` callback.
339
+ // Cells compare row identity by reference, so callers must pass
340
+ // the same instance the table holds (from `table.rows`,
341
+ // `table.selection.map`, or a `col.actions` callback).
341
342
  ctx.setOpenModalCell({ row, columnId });
342
343
  },
343
344
  close() {
@@ -357,9 +358,6 @@ export function makeClipboardApi(ctx) {
357
358
  await ctx.copyHighlightedRowsToClipboard();
358
359
  },
359
360
  async copyCell(row, columnId) {
360
- // Phase 1: minimal implementation. Phase 2 will route through the
361
- // shared `escapeForSpreadsheet` helper to neutralise formula-
362
- // injection prefixes consistently with the other copy paths.
363
361
  const def = ctx._columnLayout.columnDefsById.get(columnId);
364
362
  if (!def) {
365
363
  return;
@@ -374,7 +372,10 @@ export function makeClipboardApi(ctx) {
374
372
  : typeof value === 'number' || typeof value === 'boolean'
375
373
  ? value.toString()
376
374
  : JSON.stringify(value);
377
- await navigator.clipboard.writeText(text);
375
+ // Neutralise formula-injection prefixes ('=', '+', '-', '@', tab,
376
+ // CR). Aligns single-cell copy with copySelection /
377
+ // copyHighlighted, which both pass through `escapeForSpreadsheet`.
378
+ await navigator.clipboard.writeText(escapeForSpreadsheet(text));
378
379
  },
379
380
  });
380
381
  }