@lavalogic/scoria 0.40.31 → 0.40.33

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 (137) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +28 -28
  3. package/dist/Components/AccordionGroupButton.svelte +60 -60
  4. package/dist/Components/Action.svelte +48 -48
  5. package/dist/Components/AlertModal.svelte +102 -102
  6. package/dist/Components/Base/ContextWrapper.svelte +45 -45
  7. package/dist/Components/Base/Pagination.svelte +135 -135
  8. package/dist/Components/Base/Snippets.svelte +25 -25
  9. package/dist/Components/BigRadioSet.svelte +34 -34
  10. package/dist/Components/Bubble.svelte +38 -38
  11. package/dist/Components/Button.svelte +83 -83
  12. package/dist/Components/Checkbox.svelte +71 -71
  13. package/dist/Components/CollapsibleCard.svelte +59 -59
  14. package/dist/Components/CollapsibleMenuGroup.svelte +43 -43
  15. package/dist/Components/ConditionBuilder/ConditionBuilder.svelte +101 -101
  16. package/dist/Components/Contexts/ContextMenu.svelte +76 -76
  17. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  18. package/dist/Components/Contexts/ContextMenuOption.svelte +38 -38
  19. package/dist/Components/Contexts/Toast.svelte +71 -71
  20. package/dist/Components/Contexts/ToastContainer.svelte +34 -34
  21. package/dist/Components/Contexts/Tooltip.svelte +32 -32
  22. package/dist/Components/DataMatrixIcon.svelte +37 -37
  23. package/dist/Components/DateInput.svelte +80 -80
  24. package/dist/Components/DatePicker.svelte +86 -86
  25. package/dist/Components/DesktopModal.svelte +65 -65
  26. package/dist/Components/Dial.svelte +35 -35
  27. package/dist/Components/DimensionInput.svelte +95 -95
  28. package/dist/Components/DragMenu/DragMenuHolder.svelte +53 -53
  29. package/dist/Components/DragMenu/DraggableCard.svelte +49 -49
  30. package/dist/Components/FileCard.svelte +18 -18
  31. package/dist/Components/FileUpload.svelte +115 -115
  32. package/dist/Components/GridInput.svelte +123 -123
  33. package/dist/Components/GridInputSet.svelte +21 -21
  34. package/dist/Components/HorizontalTabGroup.svelte +54 -54
  35. package/dist/Components/HorizontalTabGroupButton.svelte +32 -32
  36. package/dist/Components/Icon.svelte +68 -68
  37. package/dist/Components/Icons.d.ts +3 -3
  38. package/dist/Components/Icons.js +11 -11
  39. package/dist/Components/InfoAlert.svelte +32 -32
  40. package/dist/Components/LoadingAnimation.svelte +228 -227
  41. package/dist/Components/LoadingModal.svelte +19 -19
  42. package/dist/Components/LoadingOverlay.svelte +20 -20
  43. package/dist/Components/Modal.svelte +127 -127
  44. package/dist/Components/MultiSelect.svelte +126 -126
  45. package/dist/Components/Nav/Nav.svelte +71 -71
  46. package/dist/Components/Nav/NavServiceMenuList.svelte +37 -37
  47. package/dist/Components/Nav/NavTab.svelte +46 -46
  48. package/dist/Components/Nav/ServiceMenuItem.svelte +62 -62
  49. package/dist/Components/Nav/ServicesNav.svelte +50 -50
  50. package/dist/Components/NumberInput.svelte +98 -98
  51. package/dist/Components/OptionCards.svelte +58 -58
  52. package/dist/Components/PageHeading.svelte +21 -21
  53. package/dist/Components/PasswordInput.svelte +61 -61
  54. package/dist/Components/PopoverButton.svelte +53 -53
  55. package/dist/Components/Portal.svelte +7 -7
  56. package/dist/Components/ProgressBubble.svelte +42 -42
  57. package/dist/Components/QuerySelect.svelte +102 -102
  58. package/dist/Components/ResourceCalendar/ResourceCalendar.svelte +241 -241
  59. package/dist/Components/SidebarPanel.svelte +32 -32
  60. package/dist/Components/SingleSelect.svelte +122 -122
  61. package/dist/Components/StepButton.svelte +48 -48
  62. package/dist/Components/StepForm.svelte +58 -58
  63. package/dist/Components/Switch.svelte +43 -43
  64. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  65. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +30 -30
  66. package/dist/Components/Table/Body/Rows/ColumnList.svelte +24 -24
  67. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +165 -165
  68. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +13 -13
  69. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +120 -120
  70. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +81 -81
  71. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +92 -92
  72. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +110 -110
  73. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +54 -54
  74. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +35 -35
  75. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +64 -64
  76. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +82 -82
  77. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +88 -88
  78. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +90 -90
  79. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +96 -96
  80. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +71 -71
  81. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +124 -124
  82. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +91 -91
  83. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +88 -88
  84. package/dist/Components/Table/Body/Rows/TableRow.svelte +127 -127
  85. package/dist/Components/Table/Body/TableBody.svelte +92 -92
  86. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +25 -25
  87. package/dist/Components/Table/Headers/SelectAllHeader.svelte +20 -20
  88. package/dist/Components/Table/Headers/TableHead.svelte +175 -175
  89. package/dist/Components/Table/Misc/ColumnPanel.svelte +32 -32
  90. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +29 -29
  91. package/dist/Components/Table/Misc/FilterInput.svelte +326 -326
  92. package/dist/Components/Table/Misc/FilterPanel.svelte +79 -79
  93. package/dist/Components/Table/Misc/FilterPanelModal.svelte +21 -21
  94. package/dist/Components/Table/Misc/ShareViewModal.svelte +118 -118
  95. package/dist/Components/Table/Misc/SidePanel.svelte +24 -24
  96. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +318 -318
  97. package/dist/Components/Table/Misc/TableFooter.svelte +201 -201
  98. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +112 -112
  99. package/dist/Components/Table/Misc/TableSidebar.svelte +116 -116
  100. package/dist/Components/Table/Misc/TableViewDropdown.svelte +25 -25
  101. package/dist/Components/Table/Misc/ToolboxPanel.svelte +60 -60
  102. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +63 -63
  103. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +101 -101
  104. package/dist/Components/Table/NestedTable.svelte +29 -29
  105. package/dist/Components/Table/Table.svelte +140 -140
  106. package/dist/Components/Test/TestContextConsumer.svelte +8 -8
  107. package/dist/Components/TextArea.svelte +92 -90
  108. package/dist/Components/TextInput.svelte +128 -117
  109. package/dist/Components/ThreeStateRadio.svelte +101 -101
  110. package/dist/Components/Touch/BoolCard.svelte +27 -27
  111. package/dist/Components/Touch/DateModal.svelte +98 -98
  112. package/dist/Components/Touch/EditCard.svelte +44 -44
  113. package/dist/Components/Touch/InfoCard.svelte +25 -25
  114. package/dist/Components/Touch/InfoTextCard.svelte +22 -22
  115. package/dist/Components/Touch/ModalExplanation.svelte +13 -13
  116. package/dist/Components/Touch/NumberKeyboard.svelte +81 -81
  117. package/dist/Components/Touch/NumberModal.svelte +49 -49
  118. package/dist/Components/Touch/PlusMinusCard.svelte +40 -40
  119. package/dist/Components/Touch/SelectModal.svelte +86 -86
  120. package/dist/Components/Touch/SummaryCard.svelte +74 -74
  121. package/dist/Components/Touch/TextAreaModal.svelte +53 -53
  122. package/dist/Components/Touch/TextModal.svelte +56 -56
  123. package/dist/Components/Touch/TouchCard.svelte +28 -28
  124. package/dist/Components/Touch/TouchModal.svelte +141 -141
  125. package/dist/Components/Touch/UtilityButton.svelte +63 -63
  126. package/dist/Components/VerticalTabGroup.svelte +38 -38
  127. package/dist/Components/VerticalTabGroupButton.svelte +46 -46
  128. package/dist/Helpers/Datamatrix.d.ts +19 -19
  129. package/dist/Helpers/Datamatrix.js +291 -291
  130. package/dist/Types/Examples/ExampleModal.svelte +27 -27
  131. package/dist/paraglide/README.md +1 -1
  132. package/dist/scss/_basics.scss +12 -12
  133. package/dist/scss/_colours.scss +140 -140
  134. package/dist/scss/_motion.scss +57 -57
  135. package/dist/scss/_sizing.scss +85 -85
  136. package/dist/scss/_transitions.scss +8 -8
  137. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- module
5
- lang="ts"
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ module
5
+ lang="ts"
6
6
  >import { m as i18n } from "../../paraglide/messages.js";
7
7
  import { devCatch, passthrough } from "../../Helpers/Helpers.svelte.js";
8
8
  import { InputVariant } from "../../Types/Internal/InputVariant.js";
@@ -20,8 +20,8 @@ const DIGITS = Object.freeze([
20
20
  8,
21
21
  9
22
22
  ]);
23
- </script>
24
-
23
+ </script>
24
+
25
25
  <script lang="ts">let { value = $bindable(null), label, labelRight, placeholder, min, max, decimal = false, inputRef = $bindable(), coerceValue = false } = $props();
26
26
  let _value = $derived(value != null && value % 1 == 0 ? value.toString() : getDecimalValue());
27
27
  function getDecimalPlaces(value) {
@@ -113,79 +113,79 @@ function onDigitClick(e) {
113
113
  addDigit(digit);
114
114
  }
115
115
  }
116
- </script>
117
-
118
- <div class="number-input-wrapper">
119
- <div class="left-side">
120
- <div class="value-container">
121
- <!-- textInput is the only available option when you try to add a decimal point programmatically -->
122
- <TextInput
123
- labelTop={label}
124
- {placeholder}
125
- {labelRight}
126
- bind:inputRef
127
- bind:value={_value}
128
- variant={InputVariant.Modal}
129
- required
130
- invalid={lessThanMin || moreThanMax}
131
- />
132
- {#if max != undefined}
133
- <TextInput
134
- value={`${max}`}
135
- labelTop={i18n['scoria.label.maximum']()}
136
- selectNone
137
- disabled
138
- variant={InputVariant.Modal}
139
- />
140
- {/if}
141
- </div>
142
- <div class="plus-minus">
143
- <button
144
- onkeydown={passthrough}
145
- type="button"
146
- disabled={value != null && min != null && value <= min}
147
- onclick={minus}><Icon name="minus" /></button
148
- >
149
- <button
150
- onkeydown={passthrough}
151
- type="button"
152
- disabled={value != null && max != null && value >= max}
153
- onclick={plus}><Icon name="plus" /></button
154
- >
155
- </div>
156
- </div>
157
- <div class="number-grid">
158
- {#each DIGITS as digit (digit)}
159
- <button
160
- onkeydown={passthrough}
161
- type="button"
162
- data-digit={digit}
163
- disabled={digitDisabled[digit]}
164
- onclick={onDigitClick}>{digit}</button
165
- >
166
- {/each}
167
- <button
168
- onkeydown={passthrough}
169
- type="button"
170
- disabled={!decimal || (value != null && value % 1 !== 0) || _value.endsWith('.')}
171
- onclick={addDecimal}>.</button
172
- >
173
- <button
174
- onkeydown={passthrough}
175
- type="button"
176
- data-digit="0"
177
- disabled={digitDisabled[0]}
178
- onclick={onDigitClick}>0</button
179
- >
180
- <button
181
- onkeydown={passthrough}
182
- type="button"
183
- disabled={_value.length === 0}
184
- onclick={backspace}>⌫</button
185
- >
186
- </div>
187
- </div>
188
-
116
+ </script>
117
+
118
+ <div class="number-input-wrapper">
119
+ <div class="left-side">
120
+ <div class="value-container">
121
+ <!-- textInput is the only available option when you try to add a decimal point programmatically -->
122
+ <TextInput
123
+ labelTop={label}
124
+ {placeholder}
125
+ {labelRight}
126
+ bind:inputRef
127
+ bind:value={_value}
128
+ variant={InputVariant.Modal}
129
+ required
130
+ invalid={lessThanMin || moreThanMax}
131
+ />
132
+ {#if max != undefined}
133
+ <TextInput
134
+ value={`${max}`}
135
+ labelTop={i18n['scoria.label.maximum']()}
136
+ selectNone
137
+ disabled
138
+ variant={InputVariant.Modal}
139
+ />
140
+ {/if}
141
+ </div>
142
+ <div class="plus-minus">
143
+ <button
144
+ onkeydown={passthrough}
145
+ type="button"
146
+ disabled={value != null && min != null && value <= min}
147
+ onclick={minus}><Icon name="minus" /></button
148
+ >
149
+ <button
150
+ onkeydown={passthrough}
151
+ type="button"
152
+ disabled={value != null && max != null && value >= max}
153
+ onclick={plus}><Icon name="plus" /></button
154
+ >
155
+ </div>
156
+ </div>
157
+ <div class="number-grid">
158
+ {#each DIGITS as digit (digit)}
159
+ <button
160
+ onkeydown={passthrough}
161
+ type="button"
162
+ data-digit={digit}
163
+ disabled={digitDisabled[digit]}
164
+ onclick={onDigitClick}>{digit}</button
165
+ >
166
+ {/each}
167
+ <button
168
+ onkeydown={passthrough}
169
+ type="button"
170
+ disabled={!decimal || (value != null && value % 1 !== 0) || _value.endsWith('.')}
171
+ onclick={addDecimal}>.</button
172
+ >
173
+ <button
174
+ onkeydown={passthrough}
175
+ type="button"
176
+ data-digit="0"
177
+ disabled={digitDisabled[0]}
178
+ onclick={onDigitClick}>0</button
179
+ >
180
+ <button
181
+ onkeydown={passthrough}
182
+ type="button"
183
+ disabled={_value.length === 0}
184
+ onclick={backspace}>⌫</button
185
+ >
186
+ </div>
187
+ </div>
188
+
189
189
  <style>button {
190
190
  color: #3a4952;
191
191
  fill: #3a4952;
@@ -273,4 +273,4 @@ button {
273
273
  }
274
274
  .number-input-wrapper .number-grid {
275
275
  flex-grow: 2;
276
- }</style>
276
+ }</style>
@@ -1,5 +1,5 @@
1
- <svelte:options runes />
2
-
1
+ <svelte:options runes />
2
+
3
3
  <script lang="ts">import { m as i18n } from "../../paraglide/messages.js";
4
4
  import { useAsyncFlag } from "../../Helpers/AsyncFlag.svelte.js";
5
5
  import { passthrough } from "../../Helpers/Helpers.svelte.js";
@@ -11,52 +11,52 @@ let { coerceValue = false, header, value, label, placeholder, min, max, cancelEd
11
11
  // fed back to `NumberKeyboard`.
12
12
  let tempValue = $derived(value);
13
13
  const isAcceptableValue = useAsyncFlag(() => tempValue == null ? false : isValid?.(tempValue) ?? true, false);
14
- </script>
15
-
16
- <TouchModal
17
- onclose={() => {
18
- cancelEditing();
19
- }}
20
- {header}
21
- mandatory
22
- onsubmit={(e: SubmitEvent) => {
23
- e.preventDefault();
24
- if (tempValue == null) {
25
- return;
26
- }
27
- confirm(tempValue);
28
- }}
29
- {explanation}
30
- >
31
- <div class="number-input-wrapper">
32
- <NumberKeyboard
33
- {coerceValue}
34
- {min}
35
- {max}
36
- {label}
37
- {placeholder}
38
- bind:value={tempValue}
39
- {decimal}
40
- />
41
- </div>
42
- {#snippet footer()}
43
- <div class="modal-footer">
44
- <button
45
- onkeydown={passthrough}
46
- type="submit"
47
- disabled={!isAcceptableValue.value}>{i18n['scoria.action.confirm']()}</button
48
- >
49
- <button
50
- onkeydown={passthrough}
51
- type="button"
52
- onclick={() => {
53
- cancelEditing();
54
- }}>{i18n['scoria.action.cancel']()}</button
55
- >
56
- </div>
57
- {/snippet}
58
- </TouchModal>
59
-
14
+ </script>
15
+
16
+ <TouchModal
17
+ onclose={() => {
18
+ cancelEditing();
19
+ }}
20
+ {header}
21
+ mandatory
22
+ onsubmit={(e: SubmitEvent) => {
23
+ e.preventDefault();
24
+ if (tempValue == null) {
25
+ return;
26
+ }
27
+ confirm(tempValue);
28
+ }}
29
+ {explanation}
30
+ >
31
+ <div class="number-input-wrapper">
32
+ <NumberKeyboard
33
+ {coerceValue}
34
+ {min}
35
+ {max}
36
+ {label}
37
+ {placeholder}
38
+ bind:value={tempValue}
39
+ {decimal}
40
+ />
41
+ </div>
42
+ {#snippet footer()}
43
+ <div class="modal-footer">
44
+ <button
45
+ onkeydown={passthrough}
46
+ type="submit"
47
+ disabled={!isAcceptableValue.value}>{i18n['scoria.action.confirm']()}</button
48
+ >
49
+ <button
50
+ onkeydown={passthrough}
51
+ type="button"
52
+ onclick={() => {
53
+ cancelEditing();
54
+ }}>{i18n['scoria.action.cancel']()}</button
55
+ >
56
+ </div>
57
+ {/snippet}
58
+ </TouchModal>
59
+
60
60
  <style>dialog {
61
61
  overflow: clip;
62
62
  background-color: #e9ecf1;
@@ -323,4 +323,4 @@ button {
323
323
  }
324
324
  .modal-footer button[type=submit]:not([disabled]):focus {
325
325
  outline-offset: -2px;
326
- }</style>
326
+ }</style>
@@ -1,46 +1,46 @@
1
- <svelte:options runes />
2
-
1
+ <svelte:options runes />
2
+
3
3
  <script lang="ts">import { m as i18n } from "../../paraglide/messages.js";
4
4
  import { Size } from "../../Types/Internal/Size.js";
5
5
  import Action from "../Action.svelte";
6
6
  let { callback, disabled = false, children } = $props();
7
- </script>
8
-
9
- <div
10
- class="card pad-right"
11
- class:disabled
12
- >
13
- <div class="icon-left">
14
- <Action
15
- {disabled}
16
- label={i18n['scoria.action.decrement']()}
17
- onclick={() => {
18
- callback(-1);
19
- }}
20
- icon={{
21
- name: 'circle-minus',
22
- size: Size.DoubleXLarge,
23
- }}
24
- size={Size.DoubleXLarge}
25
- />
26
- </div>
27
- <span class="value">{@render children()}</span>
28
- <div class="icon-right">
29
- <Action
30
- {disabled}
31
- label={i18n['scoria.action.increment']()}
32
- onclick={() => {
33
- callback(1);
34
- }}
35
- icon={{
36
- name: 'circle-plus',
37
- size: Size.DoubleXLarge,
38
- }}
39
- size={Size.DoubleXLarge}
40
- />
41
- </div>
42
- </div>
43
-
7
+ </script>
8
+
9
+ <div
10
+ class="card pad-right"
11
+ class:disabled
12
+ >
13
+ <div class="icon-left">
14
+ <Action
15
+ {disabled}
16
+ label={i18n['scoria.action.decrement']()}
17
+ onclick={() => {
18
+ callback(-1);
19
+ }}
20
+ icon={{
21
+ name: 'circle-minus',
22
+ size: Size.DoubleXLarge,
23
+ }}
24
+ size={Size.DoubleXLarge}
25
+ />
26
+ </div>
27
+ <span class="value">{@render children()}</span>
28
+ <div class="icon-right">
29
+ <Action
30
+ {disabled}
31
+ label={i18n['scoria.action.increment']()}
32
+ onclick={() => {
33
+ callback(1);
34
+ }}
35
+ icon={{
36
+ name: 'circle-plus',
37
+ size: Size.DoubleXLarge,
38
+ }}
39
+ size={Size.DoubleXLarge}
40
+ />
41
+ </div>
42
+ </div>
43
+
44
44
  <style>.card {
45
45
  color: #3a4952;
46
46
  fill: #3a4952;
@@ -89,4 +89,4 @@ let { callback, disabled = false, children } = $props();
89
89
  .card.disabled {
90
90
  background-color: #f4f7f9;
91
91
  color: #8096a5;
92
- }</style>
92
+ }</style>
@@ -1,5 +1,5 @@
1
- <svelte:options runes />
2
-
1
+ <svelte:options runes />
2
+
3
3
  <script lang="ts">import { m as i18n } from "../../paraglide/messages.js";
4
4
  import { devCatch, passthrough } from "../../Helpers/Helpers.svelte.js";
5
5
  import { InputVariant } from "../../Types/Internal/InputVariant.js";
@@ -27,89 +27,89 @@ onMount(() => {
27
27
  }
28
28
  }).catch(devCatch);
29
29
  });
30
- </script>
31
-
32
- <TouchModal
33
- onclose={() => {
34
- cancelEditing();
35
- }}
36
- {header}
37
- mandatory
38
- staticHeight
39
- onsubmit={(e: SubmitEvent) => {
40
- e.preventDefault();
41
- if (searchbar) {
42
- filteredChoices[0]?.callback?.()?.catch(devCatch);
43
- }
44
- }}
45
- >
46
- <div
47
- class="select-container"
48
- class:with-top-padding={!searchbar}
49
- >
50
- {#if filteredChoices.length === 0}
51
- <span>{i18n['scoria.text.no_results']()}</span>
52
- {/if}
53
- <!-- Keyed by index, not `choice.label`: labels are not guaranteed
54
- unique (e.g. a courier can expose two services with the same
55
- name), and a duplicate `{#each}` key throws `each_key_duplicate`.
56
- The buttons hold no per-item state, so index keying is safe. -->
57
- {#each filteredChoices as choice, index (index)}
58
- {#if selected === choice.label}
59
- {#if choice.callback}
60
- <button
61
- onkeydown={passthrough}
62
- bind:this={selectedRef}
63
- type="button"
64
- onclick={() => choice.callback?.()}>{choice.label}</button
65
- >
66
- {:else}
67
- <button
68
- onkeydown={passthrough}
69
- bind:this={selectedRef}
70
- type={choice.type}>{choice.label}</button
71
- >
72
- {/if}
73
- {:else if choice.callback}
74
- <button
75
- onkeydown={passthrough}
76
- type="button"
77
- onclick={() => choice.callback?.()}>{choice.label}</button
78
- >
79
- {:else}
80
- <button
81
- onkeydown={passthrough}
82
- type={choice.type}>{choice.label}</button
83
- >
84
- {/if}
85
- {/each}
86
- </div>
87
-
88
- {#snippet headerExtra()}
89
- {#if searchbar}
90
- <div class="header-extra visible">
91
- <TextInput
92
- labelTop={i18n['scoria.label.search']()}
93
- bind:value={searchValue}
94
- variant={InputVariant.Modal}
95
- />
96
- </div>
97
- {/if}
98
- {/snippet}
99
-
100
- {#snippet footer()}
101
- <div class="cancel-container">
102
- <button
103
- onkeydown={passthrough}
104
- type="button"
105
- onclick={() => {
106
- cancelEditing();
107
- }}>{i18n['scoria.action.cancel']()}</button
108
- >
109
- </div>
110
- {/snippet}
111
- </TouchModal>
112
-
30
+ </script>
31
+
32
+ <TouchModal
33
+ onclose={() => {
34
+ cancelEditing();
35
+ }}
36
+ {header}
37
+ mandatory
38
+ staticHeight
39
+ onsubmit={(e: SubmitEvent) => {
40
+ e.preventDefault();
41
+ if (searchbar) {
42
+ filteredChoices[0]?.callback?.()?.catch(devCatch);
43
+ }
44
+ }}
45
+ >
46
+ <div
47
+ class="select-container"
48
+ class:with-top-padding={!searchbar}
49
+ >
50
+ {#if filteredChoices.length === 0}
51
+ <span>{i18n['scoria.text.no_results']()}</span>
52
+ {/if}
53
+ <!-- Keyed by index, not `choice.label`: labels are not guaranteed
54
+ unique (e.g. a courier can expose two services with the same
55
+ name), and a duplicate `{#each}` key throws `each_key_duplicate`.
56
+ The buttons hold no per-item state, so index keying is safe. -->
57
+ {#each filteredChoices as choice, index (index)}
58
+ {#if selected === choice.label}
59
+ {#if choice.callback}
60
+ <button
61
+ onkeydown={passthrough}
62
+ bind:this={selectedRef}
63
+ type="button"
64
+ onclick={() => choice.callback?.()}>{choice.label}</button
65
+ >
66
+ {:else}
67
+ <button
68
+ onkeydown={passthrough}
69
+ bind:this={selectedRef}
70
+ type={choice.type}>{choice.label}</button
71
+ >
72
+ {/if}
73
+ {:else if choice.callback}
74
+ <button
75
+ onkeydown={passthrough}
76
+ type="button"
77
+ onclick={() => choice.callback?.()}>{choice.label}</button
78
+ >
79
+ {:else}
80
+ <button
81
+ onkeydown={passthrough}
82
+ type={choice.type}>{choice.label}</button
83
+ >
84
+ {/if}
85
+ {/each}
86
+ </div>
87
+
88
+ {#snippet headerExtra()}
89
+ {#if searchbar}
90
+ <div class="header-extra visible">
91
+ <TextInput
92
+ labelTop={i18n['scoria.label.search']()}
93
+ bind:value={searchValue}
94
+ variant={InputVariant.Modal}
95
+ />
96
+ </div>
97
+ {/if}
98
+ {/snippet}
99
+
100
+ {#snippet footer()}
101
+ <div class="cancel-container">
102
+ <button
103
+ onkeydown={passthrough}
104
+ type="button"
105
+ onclick={() => {
106
+ cancelEditing();
107
+ }}>{i18n['scoria.action.cancel']()}</button
108
+ >
109
+ </div>
110
+ {/snippet}
111
+ </TouchModal>
112
+
113
113
  <style>dialog {
114
114
  overflow: clip;
115
115
  background-color: #e9ecf1;
@@ -361,4 +361,4 @@ button {
361
361
 
362
362
  button {
363
363
  align-items: center;
364
- }</style>
364
+ }</style>