@lavalogic/scoria 0.40.13 → 0.40.15

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 (143) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +35 -46
  3. package/dist/Components/AccordionGroupButton.svelte +68 -76
  4. package/dist/Components/Action.svelte +103 -135
  5. package/dist/Components/AlertModal.svelte +171 -190
  6. package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +614 -697
  7. package/dist/Components/Base/BaseModal.svelte +90 -116
  8. package/dist/Components/Base/ContextWrapper.svelte +67 -72
  9. package/dist/Components/Base/Pagination.svelte +173 -196
  10. package/dist/Components/Base/Snippets.svelte +34 -36
  11. package/dist/Components/BigRadioSet.svelte +36 -38
  12. package/dist/Components/Bubble.svelte +78 -101
  13. package/dist/Components/Button.svelte +175 -208
  14. package/dist/Components/Checkbox.svelte +75 -86
  15. package/dist/Components/CollapsibleCard.svelte +72 -87
  16. package/dist/Components/CollapsibleMenuGroup.svelte +53 -57
  17. package/dist/Components/ConditionBuilder/ConditionBuilder.svelte +39 -64
  18. package/dist/Components/Contexts/ContextMenu.svelte +141 -156
  19. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  20. package/dist/Components/Contexts/ContextMenuOption.svelte +53 -60
  21. package/dist/Components/Contexts/Toast.svelte +81 -86
  22. package/dist/Components/Contexts/ToastContainer.svelte +58 -62
  23. package/dist/Components/Contexts/Tooltip.svelte +36 -37
  24. package/dist/Components/DataMatrixIcon.svelte +95 -108
  25. package/dist/Components/DateInput.svelte +118 -146
  26. package/dist/Components/DatePicker.svelte +255 -294
  27. package/dist/Components/DesktopModal.svelte +70 -90
  28. package/dist/Components/Dial.svelte +167 -197
  29. package/dist/Components/DimensionInput.svelte +124 -169
  30. package/dist/Components/DragMenu/DragMenuHolder.svelte +98 -114
  31. package/dist/Components/DragMenu/DraggableCard.svelte +64 -76
  32. package/dist/Components/FileCard.svelte +21 -24
  33. package/dist/Components/FileUpload.svelte +190 -225
  34. package/dist/Components/GridInput.svelte +159 -196
  35. package/dist/Components/GridInputSet.svelte +24 -29
  36. package/dist/Components/HorizontalTabGroup.svelte +73 -89
  37. package/dist/Components/HorizontalTabGroupButton.svelte +40 -44
  38. package/dist/Components/Icon.svelte +99 -128
  39. package/dist/Components/Icons.js +357 -357
  40. package/dist/Components/InfoAlert.svelte +35 -38
  41. package/dist/Components/LoadingAnimation.svelte +691 -755
  42. package/dist/Components/LoadingModal.svelte +36 -44
  43. package/dist/Components/LoadingOverlay.svelte +22 -26
  44. package/dist/Components/Modal.svelte +204 -254
  45. package/dist/Components/MultiSelect.svelte +186 -216
  46. package/dist/Components/Nav/Nav.svelte +94 -110
  47. package/dist/Components/Nav/NavServiceMenuList.svelte +57 -61
  48. package/dist/Components/Nav/NavTab.svelte +58 -62
  49. package/dist/Components/Nav/ServiceMenuItem.svelte +103 -111
  50. package/dist/Components/Nav/ServicesNav.svelte +72 -79
  51. package/dist/Components/NumberInput.svelte +121 -155
  52. package/dist/Components/OptionCards.svelte +62 -73
  53. package/dist/Components/PageHeading.svelte +23 -25
  54. package/dist/Components/PasswordInput.svelte +69 -88
  55. package/dist/Components/PopoverButton.svelte +151 -0
  56. package/dist/Components/PopoverButton.svelte.d.ts +9 -0
  57. package/dist/Components/PopoverButtonProps.d.ts +21 -0
  58. package/dist/Components/PopoverButtonProps.js +1 -0
  59. package/dist/Components/Portal.svelte +29 -35
  60. package/dist/Components/ProgressBubble.svelte +91 -106
  61. package/dist/Components/QuerySelect.svelte +260 -346
  62. package/dist/Components/SidebarPanel.svelte +34 -36
  63. package/dist/Components/SingleSelect.svelte +196 -244
  64. package/dist/Components/StepButton.svelte +65 -70
  65. package/dist/Components/StepForm.svelte +115 -135
  66. package/dist/Components/Switch.svelte +57 -69
  67. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  68. package/dist/Components/Table/Body/QuickSearchCell.svelte +578 -655
  69. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +42 -51
  70. package/dist/Components/Table/Body/Rows/ColumnList.svelte +42 -58
  71. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +403 -442
  72. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +51 -78
  73. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +165 -184
  74. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +110 -123
  75. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +134 -160
  76. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +190 -231
  77. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +82 -104
  78. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +52 -87
  79. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +122 -150
  80. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +132 -159
  81. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +190 -236
  82. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +173 -211
  83. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +204 -244
  84. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +140 -177
  85. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +188 -217
  86. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +173 -193
  87. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +166 -187
  88. package/dist/Components/Table/Body/Rows/TableRow.svelte +245 -288
  89. package/dist/Components/Table/Body/TableBody.svelte +141 -154
  90. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +35 -41
  91. package/dist/Components/Table/Headers/SelectAllHeader.svelte +24 -30
  92. package/dist/Components/Table/Headers/TableHead.svelte +348 -402
  93. package/dist/Components/Table/Misc/ColumnPanel.svelte +37 -39
  94. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +35 -39
  95. package/dist/Components/Table/Misc/FilterInput.svelte +556 -619
  96. package/dist/Components/Table/Misc/FilterPanel.svelte +170 -183
  97. package/dist/Components/Table/Misc/FilterPanelModal.svelte +25 -31
  98. package/dist/Components/Table/Misc/ShareViewModal.svelte +252 -281
  99. package/dist/Components/Table/Misc/SidePanel.svelte +32 -35
  100. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +574 -629
  101. package/dist/Components/Table/Misc/TableFooter.svelte +326 -332
  102. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +134 -140
  103. package/dist/Components/Table/Misc/TableSidebar.svelte +183 -198
  104. package/dist/Components/Table/Misc/TableViewDropdown.svelte +83 -103
  105. package/dist/Components/Table/Misc/ToolboxPanel.svelte +83 -100
  106. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +88 -107
  107. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +163 -190
  108. package/dist/Components/Table/NestedTable.svelte +102 -128
  109. package/dist/Components/Table/Table.svelte +531 -663
  110. package/dist/Components/Test/TestContextConsumer.svelte +11 -13
  111. package/dist/Components/TextArea.svelte +95 -130
  112. package/dist/Components/TextInput.svelte +125 -176
  113. package/dist/Components/ThreeStateRadio.svelte +111 -130
  114. package/dist/Components/Touch/BoolCard.svelte +33 -45
  115. package/dist/Components/Touch/DateModal.svelte +164 -204
  116. package/dist/Components/Touch/EditCard.svelte +48 -59
  117. package/dist/Components/Touch/InfoCard.svelte +28 -31
  118. package/dist/Components/Touch/InfoTextCard.svelte +26 -28
  119. package/dist/Components/Touch/ModalExplanation.svelte +15 -17
  120. package/dist/Components/Touch/NumberKeyboard.svelte +181 -218
  121. package/dist/Components/Touch/NumberModal.svelte +59 -79
  122. package/dist/Components/Touch/PlusMinusCard.svelte +43 -46
  123. package/dist/Components/Touch/SelectModal.svelte +111 -126
  124. package/dist/Components/Touch/SummaryCard.svelte +80 -93
  125. package/dist/Components/Touch/TextAreaModal.svelte +72 -94
  126. package/dist/Components/Touch/TextModal.svelte +77 -105
  127. package/dist/Components/Touch/TouchCard.svelte +31 -33
  128. package/dist/Components/Touch/TouchModal.svelte +214 -270
  129. package/dist/Components/Touch/UtilityButton.svelte +88 -109
  130. package/dist/Components/VerticalTabGroup.svelte +60 -78
  131. package/dist/Components/VerticalTabGroupButton.svelte +54 -58
  132. package/dist/Helpers/Datamatrix.d.ts +19 -19
  133. package/dist/Helpers/Datamatrix.js +291 -291
  134. package/dist/Types/Examples/ExampleModal.svelte +31 -35
  135. package/dist/index.d.ts +2 -0
  136. package/dist/index.js +1 -0
  137. package/dist/scss/_basics.scss +12 -12
  138. package/dist/scss/_colours.scss +134 -134
  139. package/dist/scss/_mixins.scss +3392 -3392
  140. package/dist/scss/_motion.scss +57 -57
  141. package/dist/scss/_sizing.scss +85 -85
  142. package/dist/scss/_transitions.scss +8 -8
  143. package/package.json +1 -1
@@ -1,198 +1,161 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- module
6
- >
7
- import { dev } from '$app/environment';
8
- import { loadingText } from '../Helpers/Helpers.svelte.js';
9
- import type { GridItem } from '../Types/Internal/GridItem.js';
10
- import type {
11
- GridMultiSelectItem,
12
- GridMultiSelectItemAsObject,
13
- GridMultiSelectItemAsPrimitive,
14
- } from '../Types/Internal/GridMultiSelectItem.js';
15
- import type { GridSelectItem } from '../Types/Internal/GridSelectItem.js';
16
- import type {
17
- GridSingleSelectItem,
18
- GridSingleSelectItemAsObject,
19
- GridSingleSelectItemAsPrimitive,
20
- } from '../Types/Internal/GridSingleSelectItem.js';
21
- import type { GridTextItem } from '../Types/Internal/GridTextItem.js';
22
- import type { ValueProp } from '../Types/Internal/Misc.js';
23
- import type { GridInputProps } from './GridInputProps.js';
24
- import MultiSelect from './MultiSelect.svelte';
25
- import SingleSelect from './SingleSelect.svelte';
26
- import TextInput from './TextInput.svelte';
27
-
28
- const textTypes = new Set(['text', 'email', 'tel']);
29
- </script>
30
-
31
- <script
32
- lang="ts"
33
- generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
34
- >
35
- const { item, first, last }: GridInputProps<V, VP> = $props();
36
-
37
- let value = $derived(isText(item) ? (item.value ?? '') : '');
38
-
39
- function isText<V extends Record<string, unknown>, VP extends ValueProp<V>>(
40
- item: GridItem<V, VP>
41
- ): item is GridTextItem {
42
- return item.type == null || textTypes.has(item.type);
43
- }
44
-
45
- function isSelect(item: GridItem<V, VP>): item is GridSelectItem<V, VP> {
46
- return item.type == 'select';
47
- }
48
-
49
- function isMultiSelect<A extends Record<string, unknown>, B extends ValueProp<A>>(
50
- item: GridSelectItem<A, B>
51
- ): item is GridMultiSelectItem<A, B> {
52
- return 'multi' in item && item.multi === true;
53
- }
54
-
55
- function isMultiSelectPrimitive<A extends Record<string, unknown>, B extends ValueProp<A>>(
56
- item: GridMultiSelectItem<A, B>
57
- ): item is GridMultiSelectItemAsPrimitive<A, B> {
58
- return 'valueAsObject' in item && !item.valueAsObject;
59
- }
60
-
61
- function isMultiSelectObject<A extends Record<string, unknown>, B extends ValueProp<A>>(
62
- item: GridMultiSelectItem<A, B>
63
- ): item is GridMultiSelectItemAsObject<A, B> {
64
- return 'valueAsObject' in item && item.valueAsObject;
65
- }
66
-
67
- function isSingleSelect<A extends Record<string, unknown>, B extends ValueProp<A>>(
68
- item: GridSelectItem<A, B>
69
- ): item is GridSingleSelectItem<A, B> {
70
- return !('multi' in item) || item.multi === false;
71
- }
72
-
73
- function isSingleSelectPrimitive<A extends Record<string, unknown>, B extends ValueProp<A>>(
74
- item: GridSingleSelectItem<A, B>
75
- ): item is GridSingleSelectItemAsPrimitive<A, B> {
76
- return 'valueAsObject' in item && !item.valueAsObject;
77
- }
78
-
79
- function isSingleSelectObject<A extends Record<string, unknown>, B extends ValueProp<A>>(
80
- item: GridSingleSelectItem<A, B>
81
- ): item is GridSingleSelectItemAsObject<A, B> {
82
- return 'valueAsObject' in item && item.valueAsObject;
83
- }
84
- </script>
85
-
86
- <label
87
- class:first
88
- class:last
89
- >
90
- <div class="left">
91
- <span
92
- class:first
93
- class:last>{item.label}</span
94
- >
95
- </div>
96
- {#if isText(item)}
97
- <TextInput
98
- disabled={item.disabled}
99
- bind:value
100
- oninput={() => {
101
- item.updater(value);
102
- }}
103
- required={item.required}
104
- invalid={item.invalid}
105
- />
106
- {:else if isSelect(item)}
107
- {#if isMultiSelect(item)}
108
- {#await item.options}
109
- {loadingText}
110
- {:then options}
111
- {#if isMultiSelectObject<V, VP>(item)}
112
- <MultiSelect
113
- name={item.name}
114
- {options}
115
- valueAsObject={true}
116
- labelProp={item.labelProp}
117
- valueProp={item.valueProp}
118
- selectedValues={item.value}
119
- invalid={item.invalid}
120
- onchange={(v: Array<V>) => {
121
- item.updater(v);
122
- }}
123
- />
124
- {:else if isMultiSelectPrimitive(item)}
125
- <MultiSelect
126
- name={item.name}
127
- {options}
128
- valueAsObject={false}
129
- labelProp={item.labelProp}
130
- valueProp={item.valueProp}
131
- selectedValues={item.value}
132
- invalid={item.invalid}
133
- onchange={(v: Array<V[VP]>) => {
134
- // `valueAsObject={false}` → primitives, not SelectOption objects.
135
- item.updater(v);
136
- }}
137
- />
138
- {/if}
139
- {/await}
140
- {:else if isSingleSelect(item)}
141
- {#await item.options}
142
- {loadingText}
143
- {:then options}
144
- {#if isSingleSelectObject(item)}
145
- <SingleSelect
146
- {options}
147
- name={item.name}
148
- valueAsObject={true}
149
- labelProp={item.labelProp}
150
- valueProp={item.valueProp}
151
- value={item.value}
152
- required={item.required}
153
- clearable={!item.required}
154
- disabled={item.disabled}
155
- invalid={item.invalid}
156
- onchange={(v: V | null) => {
157
- item.updater(v);
158
- }}
159
- />
160
- {:else if isSingleSelectPrimitive(item)}
161
- <SingleSelect
162
- {options}
163
- name={item.name}
164
- valueAsObject={false}
165
- labelProp={item.labelProp}
166
- valueProp={item.valueProp}
167
- value={item.value}
168
- required={item.required}
169
- clearable={!item.required}
170
- disabled={item.disabled}
171
- invalid={item.invalid}
172
- onchange={(
173
- // `valueAsObject={false}` → primitive value, not a
174
- // SelectOption. `clearable` is on (since the field is
175
- // not required) so the callback must accept null.
176
- // The annotation collapses to `unknown | null` because
177
- // `V extends Record<string, unknown>` makes `V[VP]`
178
- // itself `unknown`.
179
- // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
180
- v: V[VP] | null
181
- ) => {
182
- item.updater(v);
183
- }}
184
- />
185
- {/if}
186
- {/await}
187
- {/if}
188
- {:else if dev}
189
- {@const type = item.type}
190
- unknown type: {type}
191
- <!-- eslint-disable-next-line svelte/no-at-debug-tags -->
192
- {@debug type}
193
- {/if}
194
- </label>
195
-
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ module
6
+ >import { dev } from "$app/environment";
7
+ import { loadingText } from "../Helpers/Helpers.svelte.js";
8
+ import MultiSelect from "./MultiSelect.svelte";
9
+ import SingleSelect from "./SingleSelect.svelte";
10
+ import TextInput from "./TextInput.svelte";
11
+ const textTypes = new Set([
12
+ "text",
13
+ "email",
14
+ "tel"
15
+ ]);
16
+ </script>
17
+
18
+ <script
19
+ lang="ts"
20
+ generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
21
+ >const { item, first, last } = $props();
22
+ let value = $derived(isText(item) ? item.value ?? "" : "");
23
+ function isText(item) {
24
+ return item.type == null || textTypes.has(item.type);
25
+ }
26
+ function isSelect(item) {
27
+ return item.type == "select";
28
+ }
29
+ function isMultiSelect(item) {
30
+ return "multi" in item && item.multi === true;
31
+ }
32
+ function isMultiSelectPrimitive(item) {
33
+ return "valueAsObject" in item && !item.valueAsObject;
34
+ }
35
+ function isMultiSelectObject(item) {
36
+ return "valueAsObject" in item && item.valueAsObject;
37
+ }
38
+ function isSingleSelect(item) {
39
+ return !("multi" in item) || item.multi === false;
40
+ }
41
+ function isSingleSelectPrimitive(item) {
42
+ return "valueAsObject" in item && !item.valueAsObject;
43
+ }
44
+ function isSingleSelectObject(item) {
45
+ return "valueAsObject" in item && item.valueAsObject;
46
+ }
47
+ </script>
48
+
49
+ <label
50
+ class:first
51
+ class:last
52
+ >
53
+ <div class="left">
54
+ <span
55
+ class:first
56
+ class:last>{item.label}</span
57
+ >
58
+ </div>
59
+ {#if isText(item)}
60
+ <TextInput
61
+ disabled={item.disabled}
62
+ bind:value
63
+ oninput={() => {
64
+ item.updater(value);
65
+ }}
66
+ required={item.required}
67
+ invalid={item.invalid}
68
+ />
69
+ {:else if isSelect(item)}
70
+ {#if isMultiSelect(item)}
71
+ {#await item.options}
72
+ {loadingText}
73
+ {:then options}
74
+ {#if isMultiSelectObject<V, VP>(item)}
75
+ <MultiSelect
76
+ name={item.name}
77
+ {options}
78
+ valueAsObject={true}
79
+ labelProp={item.labelProp}
80
+ valueProp={item.valueProp}
81
+ selectedValues={item.value}
82
+ invalid={item.invalid}
83
+ onchange={(v: Array<V>) => {
84
+ item.updater(v);
85
+ }}
86
+ />
87
+ {:else if isMultiSelectPrimitive(item)}
88
+ <MultiSelect
89
+ name={item.name}
90
+ {options}
91
+ valueAsObject={false}
92
+ labelProp={item.labelProp}
93
+ valueProp={item.valueProp}
94
+ selectedValues={item.value}
95
+ invalid={item.invalid}
96
+ onchange={(v: Array<V[VP]>) => {
97
+ // `valueAsObject={false}` → primitives, not SelectOption objects.
98
+ item.updater(v);
99
+ }}
100
+ />
101
+ {/if}
102
+ {/await}
103
+ {:else if isSingleSelect(item)}
104
+ {#await item.options}
105
+ {loadingText}
106
+ {:then options}
107
+ {#if isSingleSelectObject(item)}
108
+ <SingleSelect
109
+ {options}
110
+ name={item.name}
111
+ valueAsObject={true}
112
+ labelProp={item.labelProp}
113
+ valueProp={item.valueProp}
114
+ value={item.value}
115
+ required={item.required}
116
+ clearable={!item.required}
117
+ disabled={item.disabled}
118
+ invalid={item.invalid}
119
+ onchange={(v: V | null) => {
120
+ item.updater(v);
121
+ }}
122
+ />
123
+ {:else if isSingleSelectPrimitive(item)}
124
+ <SingleSelect
125
+ {options}
126
+ name={item.name}
127
+ valueAsObject={false}
128
+ labelProp={item.labelProp}
129
+ valueProp={item.valueProp}
130
+ value={item.value}
131
+ required={item.required}
132
+ clearable={!item.required}
133
+ disabled={item.disabled}
134
+ invalid={item.invalid}
135
+ onchange={(
136
+ // `valueAsObject={false}` → primitive value, not a
137
+ // SelectOption. `clearable` is on (since the field is
138
+ // not required) so the callback must accept null.
139
+ // The annotation collapses to `unknown | null` because
140
+ // `V extends Record<string, unknown>` makes `V[VP]`
141
+ // itself `unknown`.
142
+ // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
143
+ v: V[VP] | null
144
+ ) => {
145
+ item.updater(v);
146
+ }}
147
+ />
148
+ {/if}
149
+ {/await}
150
+ {/if}
151
+ {:else if dev}
152
+ {@const type = item.type}
153
+ unknown type: {type}
154
+ <!-- eslint-disable-next-line svelte/no-at-debug-tags -->
155
+ {@debug type}
156
+ {/if}
157
+ </label>
158
+
196
159
  <style>label {
197
160
  display: contents;
198
161
  --input-border-radius: 0;
@@ -211,4 +174,4 @@ label.first {
211
174
  }
212
175
  label.last {
213
176
  border-radius: 0 0 4px 4px;
214
- }</style>
177
+ }</style>
@@ -1,31 +1,26 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
6
- >
7
- import type { ValueProp } from '../Types/Internal/Misc.js';
8
- import GridInput from './GridInput.svelte';
9
- import type { GridInputSetProps } from './GridInputSetProps.js';
10
-
11
- const { items, header }: GridInputSetProps<V, VP> = $props();
12
-
13
- const lastIndex = $derived(items.length - 1);
14
- </script>
15
-
16
- <div class="grid">
17
- {#if header}
18
- {@render header()}
19
- {/if}
20
- {#each items as item, index (item.label)}
21
- <GridInput
22
- {item}
23
- first={index == 0}
24
- last={index == lastIndex}
25
- />
26
- {/each}
27
- </div>
28
-
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="V extends Record<string, unknown>,VP extends ValueProp<V>"
6
+ >import GridInput from "./GridInput.svelte";
7
+ const { items, header } = $props();
8
+ const lastIndex = $derived(items.length - 1);
9
+ </script>
10
+
11
+ <div class="grid">
12
+ {#if header}
13
+ {@render header()}
14
+ {/if}
15
+ {#each items as item, index (item.label)}
16
+ <GridInput
17
+ {item}
18
+ first={index == 0}
19
+ last={index == lastIndex}
20
+ />
21
+ {/each}
22
+ </div>
23
+
29
24
  <style>.grid {
30
25
  display: grid;
31
26
  grid-template-columns: [label] 16rem [value] 1fr;
@@ -33,4 +28,4 @@
33
28
  border: solid 1px #dae0e5;
34
29
  border-radius: 4px;
35
30
  background-color: #dae0e5;
36
- }</style>
31
+ }</style>
@@ -1,91 +1,75 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- generics="CommonDenominator"
6
- >
7
- import { ellipses } from '../Helpers/Helpers.svelte.js';
8
- import { Colour } from '../scss/colours.js';
9
- import HorizontalTabGroupButton from './HorizontalTabGroupButton.svelte';
10
- import type { HorizontalTabGroupProps } from './HorizontalTabGroupProps.js';
11
- import TextInput from './TextInput.svelte';
12
- let {
13
- tabComponent,
14
- tabs,
15
- selected,
16
- noRadius = false,
17
- grow = false,
18
- dense = false,
19
- filterable = false,
20
- filterFn,
21
- searchValue = $bindable(''),
22
- searchInfo,
23
- searchPlaceholder,
24
- }: HorizontalTabGroupProps<CommonDenominator> = $props();
25
-
26
- // Debounce only the search value, not the tabs array. This way a parent
27
- // rebuilding `tabs` shows the new list immediately, while typing still
28
- // pays the 300ms cost.
29
- let debouncedSearch = $state('');
30
- $effect(() => {
31
- const term = searchValue;
32
- const id = setTimeout(() => {
33
- debouncedSearch = term;
34
- }, 300);
35
- return () => {
36
- clearTimeout(id);
37
- };
38
- });
39
-
40
- const filteredTabs = $derived(filterFn ? tabs.filter((t) => filterFn(t, debouncedSearch)) : tabs);
41
- </script>
42
-
43
- <div
44
- class="wrapper"
45
- class:no-radius={noRadius}
46
- class:grow
47
- class:dense
48
- >
49
- <div class="tabs">
50
- <div class="sticky">
51
- {#if filterable}
52
- <div class="searchbar">
53
- <TextInput
54
- bind:value={searchValue}
55
- placeholder={searchPlaceholder ?? `Search any keyword to find matches${ellipses}`}
56
- rightIcon={{ name: 'search-1', colour: Colour['$ui-blue-4'] }}
57
- />
58
- {#if searchInfo}
59
- <span class="search-info">
60
- <!-- eslint-disable-next-line @typescript-eslint/no-confusing-void-expression -->
61
- {@render searchInfo()}
62
- </span>
63
- {/if}
64
- </div>
65
- {/if}
66
- </div>
67
- {#if tabComponent}
68
- {#each filteredTabs as option (option.label)}
69
- {@render tabComponent(option, selected?.label === option.label)}
70
- {/each}
71
- {:else}
72
- {#each filteredTabs as option (option.label)}
73
- <HorizontalTabGroupButton
74
- {option}
75
- noRadius={noRadius || filterable}
76
- selected={selected?.label === option.label}
77
- />
78
- {/each}
79
- {/if}
80
- </div>
81
-
82
- <div class="content">
83
- {#if selected}
84
- {@render selected.content(selected.args)}
85
- {/if}
86
- </div>
87
- </div>
88
-
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="CommonDenominator"
6
+ >import { ellipses } from "../Helpers/Helpers.svelte.js";
7
+ import { Colour } from "../scss/colours.js";
8
+ import HorizontalTabGroupButton from "./HorizontalTabGroupButton.svelte";
9
+ import TextInput from "./TextInput.svelte";
10
+ let { tabComponent, tabs, selected, noRadius = false, grow = false, dense = false, filterable = false, filterFn, searchValue = $bindable(""), searchInfo, searchPlaceholder } = $props();
11
+ // Debounce only the search value, not the tabs array. This way a parent
12
+ // rebuilding `tabs` shows the new list immediately, while typing still
13
+ // pays the 300ms cost.
14
+ let debouncedSearch = $state("");
15
+ $effect(() => {
16
+ const term = searchValue;
17
+ const id = setTimeout(() => {
18
+ debouncedSearch = term;
19
+ }, 300);
20
+ return () => {
21
+ clearTimeout(id);
22
+ };
23
+ });
24
+ const filteredTabs = $derived(filterFn ? tabs.filter((t) => filterFn(t, debouncedSearch)) : tabs);
25
+ </script>
26
+
27
+ <div
28
+ class="wrapper"
29
+ class:no-radius={noRadius}
30
+ class:grow
31
+ class:dense
32
+ >
33
+ <div class="tabs">
34
+ <div class="sticky">
35
+ {#if filterable}
36
+ <div class="searchbar">
37
+ <TextInput
38
+ bind:value={searchValue}
39
+ placeholder={searchPlaceholder ?? `Search any keyword to find matches${ellipses}`}
40
+ rightIcon={{ name: 'search-1', colour: Colour['$ui-blue-4'] }}
41
+ />
42
+ {#if searchInfo}
43
+ <span class="search-info">
44
+ <!-- eslint-disable-next-line @typescript-eslint/no-confusing-void-expression -->
45
+ {@render searchInfo()}
46
+ </span>
47
+ {/if}
48
+ </div>
49
+ {/if}
50
+ </div>
51
+ {#if tabComponent}
52
+ {#each filteredTabs as option (option.label)}
53
+ {@render tabComponent(option, selected?.label === option.label)}
54
+ {/each}
55
+ {:else}
56
+ {#each filteredTabs as option (option.label)}
57
+ <HorizontalTabGroupButton
58
+ {option}
59
+ noRadius={noRadius || filterable}
60
+ selected={selected?.label === option.label}
61
+ />
62
+ {/each}
63
+ {/if}
64
+ </div>
65
+
66
+ <div class="content">
67
+ {#if selected}
68
+ {@render selected.content(selected.args)}
69
+ {/if}
70
+ </div>
71
+ </div>
72
+
89
73
  <style>.searchbar {
90
74
  display: flex;
91
75
  flex-flow: row nowrap;
@@ -152,4 +136,4 @@
152
136
  flex-grow: 1;
153
137
  overflow: visible;
154
138
  border-radius: 0 4px 0 4px;
155
- }</style>
139
+ }</style>