@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,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>