@lavalogic/scoria 0.37.44 → 0.37.46

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 (239) 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 +86 -83
  22. package/dist/Components/Contexts/Toast.svelte.d.ts +8 -5
  23. package/dist/Components/Contexts/ToastContainer.svelte +65 -65
  24. package/dist/Components/Contexts/Tooltip.svelte +37 -37
  25. package/dist/Components/DataMatrixIcon.svelte +112 -112
  26. package/dist/Components/DataMatrixIconProps.d.ts +3 -13
  27. package/dist/Components/DateInput.svelte +148 -148
  28. package/dist/Components/DatePicker.svelte +300 -300
  29. package/dist/Components/DesktopModal.svelte +90 -90
  30. package/dist/Components/Dial.svelte +204 -204
  31. package/dist/Components/DialProps.d.ts +1 -18
  32. package/dist/Components/DimensionInput.svelte +170 -170
  33. package/dist/Components/DragMenu/DragMenuHolder.svelte +119 -119
  34. package/dist/Components/DragMenu/DraggableCard.svelte +77 -77
  35. package/dist/Components/FileCard.svelte +24 -24
  36. package/dist/Components/FileUpload.svelte +236 -236
  37. package/dist/Components/GridInput.svelte +196 -200
  38. package/dist/Components/GridInputSet.svelte +29 -29
  39. package/dist/Components/HorizontalTabGroup.svelte +82 -82
  40. package/dist/Components/HorizontalTabGroupButton.svelte +44 -44
  41. package/dist/Components/Icon.svelte +128 -128
  42. package/dist/Components/IconProps.d.ts +2 -7
  43. package/dist/Components/Icons.js +357 -357
  44. package/dist/Components/LoadingAnimation.svelte +29 -29
  45. package/dist/Components/LoadingModal.svelte +45 -45
  46. package/dist/Components/LoadingOverlay.svelte +25 -25
  47. package/dist/Components/LoadingOverlayProps.d.ts +3 -7
  48. package/dist/Components/Modal.svelte +258 -258
  49. package/dist/Components/ModalProps.d.ts +0 -3
  50. package/dist/Components/MultiSelect.svelte +220 -220
  51. package/dist/Components/MultiSelectCommonProps.d.ts +6 -17
  52. package/dist/Components/Nav/Nav.svelte +110 -99
  53. package/dist/Components/Nav/NavProps.d.ts +4 -11
  54. package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
  55. package/dist/Components/Nav/NavTab.svelte +62 -62
  56. package/dist/Components/Nav/ServiceMenuItem.svelte +100 -100
  57. package/dist/Components/Nav/ServicesNav.svelte +80 -80
  58. package/dist/Components/NumberInput.svelte +157 -157
  59. package/dist/Components/PageHeading.svelte +25 -25
  60. package/dist/Components/PasswordInput.svelte +88 -88
  61. package/dist/Components/Portal.svelte +36 -36
  62. package/dist/Components/ProgressBubble.svelte +107 -108
  63. package/dist/Components/ProgressBubbleProps.d.ts +3 -3
  64. package/dist/Components/QuerySelect.svelte +366 -366
  65. package/dist/Components/QuerySelectProps.d.ts +4 -14
  66. package/dist/Components/SingleSelect.svelte +250 -250
  67. package/dist/Components/SingleSelectCommonProps.d.ts +3 -19
  68. package/dist/Components/StepButton.svelte +70 -70
  69. package/dist/Components/StepForm.svelte +140 -140
  70. package/dist/Components/Switch.svelte +69 -69
  71. package/dist/Components/Table/ARCHITECTURE.md +298 -0
  72. package/dist/Components/Table/Body/QuickSearchCell.svelte +683 -694
  73. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +51 -51
  74. package/dist/Components/Table/Body/Rows/ColumnList.svelte +59 -59
  75. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +456 -478
  76. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
  77. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +185 -188
  78. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +124 -124
  79. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +120 -120
  80. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +230 -230
  81. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
  82. package/dist/Components/Table/Body/Rows/Columns/SelectColumn.d.ts +12 -9
  83. package/dist/Components/Table/Body/Rows/Columns/SelectTableCell.d.ts +5 -5
  84. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +87 -87
  85. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +126 -126
  86. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +159 -159
  87. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +246 -246
  88. package/dist/Components/Table/Body/Rows/Columns/TableDatePickerProps.d.ts +4 -4
  89. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +216 -216
  90. package/dist/Components/Table/Body/Rows/Columns/TableQueryCell.d.ts +6 -5
  91. package/dist/Components/Table/Body/Rows/Columns/TableQueryColumn.d.ts +7 -6
  92. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +252 -257
  93. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
  94. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +221 -229
  95. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte.d.ts +11 -11
  96. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +197 -197
  97. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +190 -190
  98. package/dist/Components/Table/Body/Rows/TableRow.svelte +290 -290
  99. package/dist/Components/Table/Body/TableBody.svelte +155 -155
  100. package/dist/Components/Table/ColumnDefinitions/ExampleItemColumnDefRepository.svelte.js +2 -3
  101. package/dist/Components/Table/ColumnFactory.svelte.d.ts +9 -11
  102. package/dist/Components/Table/ColumnFactory.svelte.js +110 -143
  103. package/dist/Components/Table/ColumnKindRegistry.d.ts +112 -0
  104. package/dist/Components/Table/ColumnKindRegistry.js +63 -0
  105. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +41 -41
  106. package/dist/Components/Table/Headers/SelectAllHeader.svelte +30 -30
  107. package/dist/Components/Table/Headers/TableHead.svelte +415 -413
  108. package/dist/Components/Table/Misc/ColumnPanel.svelte +94 -94
  109. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +112 -112
  110. package/dist/Components/Table/Misc/FilterInput.svelte +620 -644
  111. package/dist/Components/Table/Misc/FilterInput.svelte.d.ts +12 -12
  112. package/dist/Components/Table/Misc/FilterInputProps.d.ts +2 -2
  113. package/dist/Components/Table/Misc/FilterPanel.svelte +257 -257
  114. package/dist/Components/Table/Misc/FilterPanelModal.svelte +30 -30
  115. package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
  116. package/dist/Components/Table/Misc/TableFooter.svelte +311 -311
  117. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +125 -125
  118. package/dist/Components/Table/Misc/TableSidebar.svelte +157 -157
  119. package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
  120. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
  121. package/dist/Components/Table/NestedTable.svelte +130 -133
  122. package/dist/Components/Table/SubApis.svelte.d.ts +1 -5
  123. package/dist/Components/Table/SubApis.svelte.js +33 -32
  124. package/dist/Components/Table/Table.svelte +692 -745
  125. package/dist/Components/Table/TableHelpers.svelte.d.ts +6 -19
  126. package/dist/Components/Table/TableHelpers.svelte.js +6 -14
  127. package/dist/Components/Table/Types/Columns/Column.d.ts +2 -2
  128. package/dist/Components/Table/Types/Columns/DateColumn.d.ts +3 -3
  129. package/dist/Components/Table/Types/Columns/DateTableCell.d.ts +7 -7
  130. package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.d.ts +7 -8
  131. package/dist/Components/Table/Types/Columns/Definitions/Accessors/AccessorDef.svelte.js +4 -5
  132. package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.svelte.d.ts +11 -14
  133. package/dist/Components/Table/Types/Columns/Definitions/Accessors/CheckboxDef.svelte.js +3 -4
  134. package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.d.ts +7 -11
  135. package/dist/Components/Table/Types/Columns/Definitions/Accessors/DateInputDef.svelte.js +3 -3
  136. package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.d.ts +13 -18
  137. package/dist/Components/Table/Types/Columns/Definitions/Accessors/NumberInputDef.svelte.js +4 -5
  138. package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.svelte.d.ts +5 -5
  139. package/dist/Components/Table/Types/Columns/Definitions/Accessors/QueryDef.svelte.js +2 -2
  140. package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.d.ts +15 -12
  141. package/dist/Components/Table/Types/Columns/Definitions/Accessors/SelectDef.svelte.js +4 -5
  142. package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.svelte.d.ts +8 -12
  143. package/dist/Components/Table/Types/Columns/Definitions/Accessors/TextInputDef.svelte.js +3 -3
  144. package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.d.ts +6 -6
  145. package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.js +3 -3
  146. package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.d.ts +49 -16
  147. package/dist/Components/Table/Types/Columns/Definitions/ColumnDef.svelte.js +27 -5
  148. package/dist/Components/Table/Types/Columns/Definitions/Display/AbstractDisplayDef.svelte.d.ts +7 -7
  149. package/dist/Components/Table/Types/Columns/Definitions/Display/AbstractDisplayDef.svelte.js +4 -4
  150. package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.d.ts +5 -5
  151. package/dist/Components/Table/Types/Columns/Definitions/Display/BubbleDef.svelte.js +2 -2
  152. package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.svelte.d.ts +5 -5
  153. package/dist/Components/Table/Types/Columns/Definitions/Display/DisplayDef.svelte.js +2 -2
  154. package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.d.ts +5 -5
  155. package/dist/Components/Table/Types/Columns/Definitions/Display/ProgressBarDef.svelte.js +2 -2
  156. package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.d.ts +5 -5
  157. package/dist/Components/Table/Types/Columns/Definitions/Display/ValidityDef.svelte.js +2 -2
  158. package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.d.ts +11 -19
  159. package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.js +4 -8
  160. package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.svelte.d.ts +6 -7
  161. package/dist/Components/Table/Types/Columns/Definitions/FilterOnly/FilterOnlyDef.svelte.js +3 -4
  162. package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.d.ts +9 -9
  163. package/dist/Components/Table/Types/Columns/Definitions/RowSelection/RowSelectionDef.svelte.js +4 -4
  164. package/dist/Components/Table/Types/Columns/ExpandTableCell.d.ts +5 -5
  165. package/dist/Components/Table/Types/Columns/ProgressBarTableCell.d.ts +6 -6
  166. package/dist/Components/Table/Types/Columns/TableCell.d.ts +7 -6
  167. package/dist/Components/Table/Types/Context/ClipboardState.svelte.d.ts +98 -0
  168. package/dist/Components/Table/Types/Context/ClipboardState.svelte.js +290 -0
  169. package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.d.ts +17 -45
  170. package/dist/Components/Table/Types/Context/ColumnLayoutState.svelte.js +17 -45
  171. package/dist/Components/Table/Types/Context/FilteringState.svelte.d.ts +9 -20
  172. package/dist/Components/Table/Types/Context/FilteringState.svelte.js +9 -20
  173. package/dist/Components/Table/Types/Context/FocusState.svelte.d.ts +23 -42
  174. package/dist/Components/Table/Types/Context/FocusState.svelte.js +32 -59
  175. package/dist/Components/Table/Types/Context/ITable.d.ts +5 -8
  176. package/dist/Components/Table/Types/Context/PreferencesState.svelte.d.ts +29 -56
  177. package/dist/Components/Table/Types/Context/PreferencesState.svelte.js +28 -55
  178. package/dist/Components/Table/Types/Context/QueryValuesState.svelte.d.ts +50 -0
  179. package/dist/Components/Table/Types/Context/QueryValuesState.svelte.js +62 -0
  180. package/dist/Components/Table/Types/Context/SelectionState.svelte.d.ts +17 -28
  181. package/dist/Components/Table/Types/Context/SelectionState.svelte.js +17 -28
  182. package/dist/Components/Table/Types/Context/SortingState.svelte.d.ts +15 -29
  183. package/dist/Components/Table/Types/Context/SortingState.svelte.js +17 -31
  184. package/dist/Components/Table/Types/Context/TableContext.svelte.d.ts +212 -325
  185. package/dist/Components/Table/Types/Context/TableContext.svelte.js +292 -706
  186. package/dist/Components/Table/Types/Context/VirtualisationState.svelte.d.ts +62 -79
  187. package/dist/Components/Table/Types/Context/VirtualisationState.svelte.js +54 -73
  188. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.d.ts +16 -27
  189. package/dist/Components/Table/Types/DataRepository/BuiltInRemoteRepository.svelte.js +16 -27
  190. package/dist/Components/Table/Types/DataRepository/IDataRepository.d.ts +12 -15
  191. package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.d.ts +15 -30
  192. package/dist/Components/Table/Types/DataRepository/TableDataRepository.svelte.js +16 -28
  193. package/dist/Components/Table/Types/Header.d.ts +4 -4
  194. package/dist/Components/Table/Types/HeaderGroup.d.ts +5 -5
  195. package/dist/Components/Table/Types/Public/index.d.ts +2 -4
  196. package/dist/Components/Table/Types/Public/index.js +2 -4
  197. package/dist/Components/Table/clipboardEscape.d.ts +32 -0
  198. package/dist/Components/Table/clipboardEscape.js +45 -0
  199. package/dist/Components/Table/createTable.svelte.d.ts +8 -18
  200. package/dist/Components/Table/createTable.svelte.js +19 -47
  201. package/dist/Components/Test/TestContextConsumer.svelte +13 -13
  202. package/dist/Components/TextArea.svelte +130 -130
  203. package/dist/Components/TextInput.svelte +176 -176
  204. package/dist/Components/ThreeStateRadio.svelte +131 -131
  205. package/dist/Components/Touch/BoolCard.svelte +45 -45
  206. package/dist/Components/Touch/DateModal.svelte +209 -209
  207. package/dist/Components/Touch/EditCard.svelte +59 -59
  208. package/dist/Components/Touch/InfoCard.svelte +31 -31
  209. package/dist/Components/Touch/InfoTextCard.svelte +28 -28
  210. package/dist/Components/Touch/ModalExplanation.svelte +17 -17
  211. package/dist/Components/Touch/NumberKeyboard.svelte +225 -225
  212. package/dist/Components/Touch/NumberModal.svelte +79 -79
  213. package/dist/Components/Touch/PlusMinusCard.svelte +46 -46
  214. package/dist/Components/Touch/SelectModal.svelte +123 -123
  215. package/dist/Components/Touch/SummaryCard.svelte +93 -93
  216. package/dist/Components/Touch/TextAreaModal.svelte +95 -95
  217. package/dist/Components/Touch/TextModal.svelte +106 -106
  218. package/dist/Components/Touch/TouchCard.svelte +33 -33
  219. package/dist/Components/Touch/TouchModal.svelte +274 -274
  220. package/dist/Components/Touch/UtilityButton.svelte +109 -109
  221. package/dist/Components/VerticalTabGroup.svelte +79 -79
  222. package/dist/Components/VerticalTabGroupButton.svelte +58 -58
  223. package/dist/Contexts/ToastContext.svelte.js +3 -4
  224. package/dist/Helpers/Datamatrix.d.ts +19 -19
  225. package/dist/Helpers/Datamatrix.js +291 -291
  226. package/dist/Helpers/Helpers.svelte.d.ts +47 -4
  227. package/dist/Helpers/Helpers.svelte.js +97 -4
  228. package/dist/Helpers/dropdownPortal.d.ts +26 -41
  229. package/dist/Helpers/dropdownPortal.js +62 -116
  230. package/dist/Types/Examples/ExampleModal.svelte +35 -35
  231. package/dist/index.d.ts +1 -2
  232. package/dist/index.js +1 -1
  233. package/dist/scss/_basics.scss +12 -12
  234. package/dist/scss/_colours.scss +134 -134
  235. package/dist/scss/_mixins.scss +3358 -3360
  236. package/dist/scss/_motion.scss +57 -57
  237. package/dist/scss/_sizing.scss +85 -85
  238. package/dist/scss/_transitions.scss +8 -8
  239. package/package.json +8 -6
@@ -1,4 +1,4 @@
1
- import { browser } from '$app/environment';
1
+ import { browser, dev } from '$app/environment';
2
2
  import { SvelteMap, SvelteSet } from 'svelte/reactivity';
3
3
  import { PaginationType } from '../Pagination/PaginationType.js';
4
4
  /**
@@ -6,12 +6,6 @@ import { PaginationType } from '../Pagination/PaginationType.js';
6
6
  * Owns pagination state with localStorage write-through on `pageSize`,
7
7
  * the reactive filter-mode map, the force-refresh hook, and shared
8
8
  * static helpers for parsing comma-separated filter input.
9
- *
10
- * The `out FilterValueType` variance annotation is currently advisory:
11
- * `filtering` reads the parameter (contravariant) but `__queryValues`
12
- * does not currently use it. A proper variance audit is deferred to a
13
- * future workorder; the existing annotation does not break type
14
- * checking.
15
9
  */
16
10
  export class TableDataRepository {
17
11
  tableName;
@@ -20,14 +14,6 @@ export class TableDataRepository {
20
14
  this.tableName = tableName;
21
15
  this.getUserId = getUserId;
22
16
  }
23
- /**
24
- * Reactive bag of consumer-defined query values keyed by column id.
25
- * Stored as `unknown` because the shape depends on the column type;
26
- * narrowing to `FilterValueType` is deferred (would force consumers
27
- * to choose a single value type at construction time, which is too
28
- * restrictive for tables mixing several filter modes).
29
- */
30
- __queryValues = new SvelteMap();
31
17
  _paginationState = $state({
32
18
  pageIndex: 0,
33
19
  pageSize: 20,
@@ -37,10 +23,10 @@ export class TableDataRepository {
37
23
  return this._paginationState;
38
24
  }
39
25
  /**
40
- * Replaces pagination state and writes the new `pageSize` through to
26
+ * Replace pagination state and write the new `pageSize` through to
41
27
  * localStorage. Idempotent: identical states are dropped so the
42
- * previously-viewed-page tracker does not lose its value when the
43
- * same state is reassigned (e.g. from a `$derived` re-evaluation).
28
+ * previously-viewed-page tracker keeps its value when the same state
29
+ * is reassigned (e.g. from a `$derived` re-evaluation).
44
30
  */
45
31
  set paginationState(v) {
46
32
  if (v.pageIndex === this._paginationState.pageIndex &&
@@ -83,24 +69,26 @@ export class TableDataRepository {
83
69
  return this._forceRefresh;
84
70
  }
85
71
  /**
86
- * Replaces the force-refresh callback. Also invokes the new callback
87
- * immediately so callers wiring up a remote repo can request a fresh
88
- * payload as a single assignment.
72
+ * @deprecated Assigning the setter both replaces the callback AND
73
+ * invokes it immediately, which is a footgun for callers wiring it up
74
+ * inside a constructor or `$effect.pre`. Use `registerRefreshMethod`
75
+ * to assign without the implicit invoke; call `repo.forceRefresh()`
76
+ * via the getter when an explicit refresh is wanted.
89
77
  *
90
- * The implicit invocation on set is a known footgun (TableDataRepository
91
- * P1 finding): a future workorder will introduce a dedicated
92
- * `triggerRefresh()` method and remove the side effect from the
93
- * setter. Behaviour preserved here to avoid breaking existing
94
- * consumers.
78
+ * Behaviour is preserved for backwards compatibility; the setter logs
79
+ * a dev-only warning so existing call sites surface in development.
95
80
  */
96
81
  set forceRefresh(v) {
82
+ if (dev) {
83
+ console.warn('[scoria] `forceRefresh =` setter is deprecated: it invokes the callback on assignment. Use `registerRefreshMethod(fn)` then call `repo.forceRefresh()` when a refresh is wanted.');
84
+ }
97
85
  this._forceRefresh = v;
98
86
  this._forceRefresh();
99
87
  }
100
88
  /**
101
89
  * Registers a refresh callback without invoking it. Preferred over
102
- * the `forceRefresh` setter when the caller does not want the
103
- * implicit immediate refresh.
90
+ * the deprecated `forceRefresh` setter; call `repo.forceRefresh()`
91
+ * separately when an explicit refresh is wanted.
104
92
  */
105
93
  registerRefreshMethod = (method) => {
106
94
  this._forceRefresh = method;
@@ -4,14 +4,14 @@ import type { Column } from './Columns/Column.js';
4
4
  * consumed by `TableHead.svelte`. Holds the underlying `Column` plus
5
5
  * header-only affordances: column-span, header size, and the resize handler.
6
6
  *
7
- * Variance markers (`in FilterValueType`, `out FilterOptionsType`) mirror
8
- * the inner `Column<T, F, O>` so headers compose with column assignability.
7
+ * The variance marker `in FilterValueType` mirrors the inner
8
+ * `Column<T, F>` so headers compose with column assignability.
9
9
  */
10
- export interface Header<T extends object, in FilterValueType, out FilterOptionsType> {
10
+ export interface Header<T extends object, in FilterValueType> {
11
11
  id: string;
12
12
  colSpan: number;
13
13
  getSize: () => number;
14
- column: Column<T, FilterValueType, FilterOptionsType>;
14
+ column: Column<T, FilterValueType>;
15
15
  isPlaceholder: boolean;
16
16
  getResizeHandler: () => (e: MouseEvent) => void;
17
17
  }
@@ -1,12 +1,12 @@
1
1
  import type { Header } from './Header.js';
2
2
  /**
3
3
  * One row of headers (left / centre / right group). `headers` is typed with
4
- * the conservative placeholder element type `Header<T, never, unknown>`
5
- * because the group holds heterogeneous columns whose per-column filter
6
- * value type cannot be expressed in the array element type. Tightening to
7
- * `Header<T, unknown, unknown>` is deferred (workorder Types-Root finding 1).
4
+ * the conservative placeholder element type `Header<T, never>` because
5
+ * the group holds heterogeneous columns whose per-column filter value
6
+ * type cannot be expressed in the array element type. Tightening to
7
+ * `Header<T, unknown>` is deferred (workorder Types-Root finding 1).
8
8
  */
9
9
  export interface HeaderGroup<T extends object> {
10
10
  id: string;
11
- headers: Array<Header<T, never, unknown>>;
11
+ headers: Array<Header<T, never>>;
12
12
  }
@@ -1,9 +1,7 @@
1
1
  /**
2
2
  * Barrel re-export of every public Table API type. Imported by
3
- * `src/lib/index.ts` and by sub-deliverable 1.2's `ColumnFactory`
4
- * runtime module.
5
- *
6
- * Phase 1 is type-only; no runtime symbols flow through this barrel.
3
+ * `src/lib/index.ts` and by the `ColumnFactory` runtime module. This
4
+ * barrel is type-only; no runtime symbols flow through it.
7
5
  */
8
6
  export type { AnyEditEvent } from './AnyEditEvent.js';
9
7
  export type { BaseColumnOptions } from './BaseColumnOptions.js';
@@ -1,8 +1,6 @@
1
1
  /**
2
2
  * Barrel re-export of every public Table API type. Imported by
3
- * `src/lib/index.ts` and by sub-deliverable 1.2's `ColumnFactory`
4
- * runtime module.
5
- *
6
- * Phase 1 is type-only; no runtime symbols flow through this barrel.
3
+ * `src/lib/index.ts` and by the `ColumnFactory` runtime module. This
4
+ * barrel is type-only; no runtime symbols flow through it.
7
5
  */
8
6
  export {};
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Clipboard escape helpers for the Table copy path.
3
+ *
4
+ * Every value written to `navigator.clipboard.writeText` from `<Table>`
5
+ * passes through these helpers so that pasted payloads cannot evaluate
6
+ * as spreadsheet formulas in the receiving application.
7
+ */
8
+ /**
9
+ * Neutralises CSV / TSV formula-injection prefixes recognised by Excel,
10
+ * LibreOffice Calc, Google Sheets, and Apple Numbers.
11
+ *
12
+ * When a clipboard payload reaches a spreadsheet, any cell whose first
13
+ * character is one of `=`, `+`, `-`, `@`, `\t`, `\r` is treated as a
14
+ * formula and evaluated in the user's context. Untrusted row data
15
+ * containing `=cmd|'/c calc'!A1` (or DDE / web-query equivalents) is the
16
+ * canonical attack vector. Prefixing such a value with a single quote
17
+ * (`'`) makes the spreadsheet interpret the cell as a literal string.
18
+ *
19
+ * Trade-off: the leading apostrophe is invisible in the rendered cell of
20
+ * every major spreadsheet, but the underlying cell value differs from
21
+ * the source when read back by another formula referencing the cell.
22
+ * This is the accepted industry mitigation (OWASP CSV Injection
23
+ * cheat sheet).
24
+ */
25
+ export declare function escapeForSpreadsheet(value: string): string;
26
+ /**
27
+ * Wraps a single TSV / CSV cell value in double quotes, escaping any
28
+ * embedded quotes and replacing newlines with spaces so each cell stays
29
+ * on a single line. Runs `escapeForSpreadsheet` on the value first so
30
+ * the final string is also formula-injection safe.
31
+ */
32
+ export declare function encapsulate(value: string): string;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Clipboard escape helpers for the Table copy path.
3
+ *
4
+ * Every value written to `navigator.clipboard.writeText` from `<Table>`
5
+ * passes through these helpers so that pasted payloads cannot evaluate
6
+ * as spreadsheet formulas in the receiving application.
7
+ */
8
+ /**
9
+ * Neutralises CSV / TSV formula-injection prefixes recognised by Excel,
10
+ * LibreOffice Calc, Google Sheets, and Apple Numbers.
11
+ *
12
+ * When a clipboard payload reaches a spreadsheet, any cell whose first
13
+ * character is one of `=`, `+`, `-`, `@`, `\t`, `\r` is treated as a
14
+ * formula and evaluated in the user's context. Untrusted row data
15
+ * containing `=cmd|'/c calc'!A1` (or DDE / web-query equivalents) is the
16
+ * canonical attack vector. Prefixing such a value with a single quote
17
+ * (`'`) makes the spreadsheet interpret the cell as a literal string.
18
+ *
19
+ * Trade-off: the leading apostrophe is invisible in the rendered cell of
20
+ * every major spreadsheet, but the underlying cell value differs from
21
+ * the source when read back by another formula referencing the cell.
22
+ * This is the accepted industry mitigation (OWASP CSV Injection
23
+ * cheat sheet).
24
+ */
25
+ export function escapeForSpreadsheet(value) {
26
+ if (value.length === 0) {
27
+ return value;
28
+ }
29
+ const first = value.charCodeAt(0);
30
+ // '=' 61, '+' 43, '-' 45, '@' 64, '\t' 9, '\r' 13
31
+ if (first === 61 || first === 43 || first === 45 || first === 64 || first === 9 || first === 13) {
32
+ return `'${value}`;
33
+ }
34
+ return value;
35
+ }
36
+ /**
37
+ * Wraps a single TSV / CSV cell value in double quotes, escaping any
38
+ * embedded quotes and replacing newlines with spaces so each cell stays
39
+ * on a single line. Runs `escapeForSpreadsheet` on the value first so
40
+ * the final string is also formula-injection safe.
41
+ */
42
+ export function encapsulate(value) {
43
+ const safe = escapeForSpreadsheet(value);
44
+ return `"${safe.replace(/[\n]/gm, ' ').replace(/["]/g, '""')}"`;
45
+ }
@@ -1,21 +1,11 @@
1
1
  /**
2
- * `createTable` is the entry point for the new public Table API. It accepts
3
- * a single options object and returns a structured `Table<TRow, TRowId>`
4
- * instance.
2
+ * `createTable` is the entry point for the public Table API. It accepts a
3
+ * single options object and returns a structured `Table<TRow, TRowId>`
4
+ * instance whose sub-APIs are facades over the internal sub-contexts.
5
5
  *
6
- * Phase 1 implementation strategy: this function is a thin facade. It
7
- * unwraps the column specs, constructs the existing internal repository
8
- * (`LocalTableDataRepository` for `kind: 'local'`, the new
9
- * `BuiltInRemoteRepository` for `kind: 'remote'`, an adapter for
10
- * `kind: 'custom'`), invokes `TableContext.init`, wires the per-column
11
- * edit handlers and the optional `onAnyEdit` observer, then returns a
12
- * structured `Table` instance whose sub-APIs are facades over the Phase 6
13
- * sub-contexts. Phase 2 will inline the internals.
14
- *
15
- * The structured `Table` instance is also exposed as the `_context` field
16
- * for the Phase 1 `<Table>` component which still reads from a
17
- * `TableContext` via `setContext`. Phase 2 reshapes `<Table>` to consume
18
- * the structured instance directly.
6
+ * The structured `Table` instance also exposes a `_context` field so the
7
+ * `<Table>` component can read from the underlying `TableContext` via
8
+ * `setContext`.
19
9
  */
20
10
  import { TableContext } from './Types/Context/TableContext.svelte.js';
21
11
  import type { Primitive } from './Types/Context/TableInitOptions.js';
@@ -25,8 +15,8 @@ import type { Table } from './Types/Public/Table.js';
25
15
  /**
26
16
  * Construct a new Table from the supplied options. Returns the structured
27
17
  * `Table<TRow, TRowId>` instance. Mount the rendering component via
28
- * `<Table {table} />` (Phase 1 also accepts the legacy
29
- * `<Table tableContext={table._context} />` form).
18
+ * `<Table {table} />` (the legacy `<Table tableContext={table._context} />`
19
+ * form is also accepted).
30
20
  *
31
21
  * @example
32
22
  * ```ts
@@ -1,21 +1,11 @@
1
1
  /**
2
- * `createTable` is the entry point for the new public Table API. It accepts
3
- * a single options object and returns a structured `Table<TRow, TRowId>`
4
- * instance.
2
+ * `createTable` is the entry point for the public Table API. It accepts a
3
+ * single options object and returns a structured `Table<TRow, TRowId>`
4
+ * instance whose sub-APIs are facades over the internal sub-contexts.
5
5
  *
6
- * Phase 1 implementation strategy: this function is a thin facade. It
7
- * unwraps the column specs, constructs the existing internal repository
8
- * (`LocalTableDataRepository` for `kind: 'local'`, the new
9
- * `BuiltInRemoteRepository` for `kind: 'remote'`, an adapter for
10
- * `kind: 'custom'`), invokes `TableContext.init`, wires the per-column
11
- * edit handlers and the optional `onAnyEdit` observer, then returns a
12
- * structured `Table` instance whose sub-APIs are facades over the Phase 6
13
- * sub-contexts. Phase 2 will inline the internals.
14
- *
15
- * The structured `Table` instance is also exposed as the `_context` field
16
- * for the Phase 1 `<Table>` component which still reads from a
17
- * `TableContext` via `setContext`. Phase 2 reshapes `<Table>` to consume
18
- * the structured instance directly.
6
+ * The structured `Table` instance also exposes a `_context` field so the
7
+ * `<Table>` component can read from the underlying `TableContext` via
8
+ * `setContext`.
19
9
  */
20
10
  import { devCatch, refWrapper } from '../../Helpers/Helpers.svelte.js';
21
11
  import { BuiltInRemoteRepository, CustomRemoteRepository, } from './Types/DataRepository/BuiltInRemoteRepository.svelte.js';
@@ -30,8 +20,8 @@ import { makeClipboardApi, makeColumnsApi, makeFilteringApi, makeFocusApi, makeM
30
20
  /**
31
21
  * Construct a new Table from the supplied options. Returns the structured
32
22
  * `Table<TRow, TRowId>` instance. Mount the rendering component via
33
- * `<Table {table} />` (Phase 1 also accepts the legacy
34
- * `<Table tableContext={table._context} />` form).
23
+ * `<Table {table} />` (the legacy `<Table tableContext={table._context} />`
24
+ * form is also accepted).
35
25
  *
36
26
  * @example
37
27
  * ```ts
@@ -48,15 +38,11 @@ import { makeClipboardApi, makeColumnsApi, makeFilteringApi, makeFocusApi, makeM
48
38
  * ```
49
39
  */
50
40
  export function createTable(options) {
51
- // ── 1. Resolve rowId ────────────────────────────────────────────
52
41
  const rowIdFn = resolveRowId(options.rowId);
53
- // ── 2. Run the column-builder closure ───────────────────────────
54
42
  const factory = createColumnFactory();
55
43
  const specs = options.columns(factory);
56
- // Build a Map<columnId, ColumnSpec> for the ColumnsApi, plus a
57
- // Map<columnId, perColumnOnEdit> for the onEditCell dispatcher.
58
- // These are constructed once during init and never reassigned reactively,
59
- // so a plain Map is correct here.
44
+ // These maps are constructed once during init and never reassigned
45
+ // reactively, so a plain Map is correct here (no SvelteMap needed).
60
46
  // eslint-disable-next-line svelte/prefer-svelte-reactivity
61
47
  const specsById = new Map();
62
48
  // eslint-disable-next-line svelte/prefer-svelte-reactivity
@@ -71,18 +57,14 @@ export function createTable(options) {
71
57
  });
72
58
  // remoteFilters resolution order:
73
59
  // 1. Explicit `options.remoteFilters` thunk on createTable.
74
- // 2. `kind: 'custom'` row source's `remoteFilters` field (set by
75
- // `createRemoteRowSource` from its own option of the same name).
76
- // This means a caller can hand the same `SvelteMap` to the custom
77
- // row-source factory once and the filter panel picks it up for free.
60
+ // 2. `kind: 'custom'` row source's `remoteFilters` field.
61
+ // A caller can hand the same `SvelteMap` to the custom row-source
62
+ // factory once and the filter panel picks it up for free.
78
63
  const remoteFilters = options.remoteFilters?.() ??
79
64
  (options.rows.kind === 'custom' ? options.rows.remoteFilters : undefined);
80
65
  const defsWrapper = remoteFilters ? { defs, remoteFilters } : { defs };
81
- // ── 3. Construct the repository for the chosen row source ──────
82
66
  const repository = makeRepository(options.name, options.rows, options.getUserId);
83
- // ── 4. Build the `onEditCell` wrapper ──────────────────────────
84
67
  const onEditCell = makeOnEditCell(editHandlers, options.onAnyEdit);
85
- // ── 5. Translate the new options to TableInitOptions ───────────
86
68
  const initOptions = {
87
69
  selectionExtractor: rowIdFn,
88
70
  getUserId: options.getUserId ?? (() => undefined),
@@ -97,23 +79,17 @@ export function createTable(options) {
97
79
  onEditCell,
98
80
  debug: options.debug,
99
81
  };
100
- // ── 6. Build the TableContext ──────────────────────────────────
101
82
  const ctx = TableContext.init(defsWrapper, options.name, repository, initOptions);
102
- // ── 7. Wire selection.bindTo (Phase 1 uses the existing setter) ─
103
83
  if (options.selection && options.selection.mode !== 'none' && options.selection.bindTo) {
104
84
  ctx.setSelectionMap(options.selection.bindTo);
105
85
  }
106
- // ── 8. Apply initialState ───────────────────────────────────────
107
86
  if (options.initialState) {
108
87
  applyInitialState(ctx, options.initialState);
109
88
  }
110
- // ── 9. Auto-pin structural columns ──────────────────────────────
111
- // `col.actions` (the ellipsis menu) and `col.rowSelection` (the
112
- // select-row checkbox) are conventionally pinned to the right and
113
- // left respectively across every table in the app, so apply that
114
- // pin automatically here. The caller can override either pin via
115
- // `initialState.columnPinning` (which runs first above), or via
116
- // the live `setColumnPinning` updater on the table context.
89
+ // Auto-pin structural columns. `col.actions` (ellipsis menu) pins right
90
+ // and `col.rowSelection` (select-row checkbox) pins left by convention.
91
+ // Callers can override either pin via `initialState.columnPinning` (which
92
+ // runs above) or via the live `setColumnPinning` updater.
117
93
  const autoPinLeft = new Map();
118
94
  const autoPinRight = new Map();
119
95
  for (const spec of specs) {
@@ -145,7 +121,6 @@ export function createTable(options) {
145
121
  }
146
122
  ctx.columnPinning = { left: nextLeft, right: nextRight };
147
123
  }
148
- // ── 9. Build the structured Table instance ─────────────────────
149
124
  const table = Object.freeze({
150
125
  get name() {
151
126
  return ctx.tableName;
@@ -172,8 +147,7 @@ export function createTable(options) {
172
147
  return ctx.dataRepo.reload?.() ?? Promise.resolve();
173
148
  },
174
149
  destroy() {
175
- // Phase 1: no teardown hook exists on TableContext. Phase 2 will
176
- // introduce one when <Table> consumes the structured instance.
150
+ // No teardown hook on TableContext yet.
177
151
  },
178
152
  _context: ctx,
179
153
  });
@@ -292,9 +266,7 @@ function translateToolbar(toolbar) {
292
266
  return ToolbarPosition.None;
293
267
  }
294
268
  }
295
- /** Apply the `initialState` options to a freshly-constructed TableContext.
296
- * Phase 1 wires the subset of fields the existing sub-contexts already
297
- * support; Phase 2 may extend the surface. */
269
+ /** Apply the `initialState` options to a freshly-constructed TableContext. */
298
270
  function applyInitialState(ctx, state) {
299
271
  if (state.sortBy && state.sortBy.length > 0) {
300
272
  ctx.dataRepo.updateSorting?.(state.sortBy.map((s) => ({ id: s.id, desc: s.desc ?? false })));
@@ -1,13 +1,13 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { TestContext } from '../../Contexts/TestContext.svelte.js';
5
- import { getContext } from 'svelte';
6
-
7
- const testContext = getContext<TestContext>(TestContext.identifier);
8
- </script>
9
-
10
- <h1>counter 1: {testContext.value1.value}</h1>
11
- <p>Ref wrapper 1 is incremented every time you click the button</p>
12
- <h2>counter 2: {testContext.value2.value}</h2>
13
- <p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { TestContext } from '../../Contexts/TestContext.svelte.js';
5
+ import { getContext } from 'svelte';
6
+
7
+ const testContext = getContext<TestContext>(TestContext.identifier);
8
+ </script>
9
+
10
+ <h1>counter 1: {testContext.value1.value}</h1>
11
+ <p>Ref wrapper 1 is incremented every time you click the button</p>
12
+ <h2>counter 2: {testContext.value2.value}</h2>
13
+ <p>ref wrapper 2 adds ref wrapper 1's value every time ref wrapper 1's value is divisible by 3</p>