@lavalogic/scoria 0.40.32 → 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 (135) 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/InfoAlert.svelte +32 -32
  38. package/dist/Components/LoadingAnimation.svelte +228 -227
  39. package/dist/Components/LoadingModal.svelte +19 -19
  40. package/dist/Components/LoadingOverlay.svelte +20 -20
  41. package/dist/Components/Modal.svelte +127 -127
  42. package/dist/Components/MultiSelect.svelte +126 -126
  43. package/dist/Components/Nav/Nav.svelte +71 -71
  44. package/dist/Components/Nav/NavServiceMenuList.svelte +37 -37
  45. package/dist/Components/Nav/NavTab.svelte +46 -46
  46. package/dist/Components/Nav/ServiceMenuItem.svelte +62 -62
  47. package/dist/Components/Nav/ServicesNav.svelte +50 -50
  48. package/dist/Components/NumberInput.svelte +98 -98
  49. package/dist/Components/OptionCards.svelte +58 -58
  50. package/dist/Components/PageHeading.svelte +21 -21
  51. package/dist/Components/PasswordInput.svelte +61 -61
  52. package/dist/Components/PopoverButton.svelte +53 -53
  53. package/dist/Components/Portal.svelte +7 -7
  54. package/dist/Components/ProgressBubble.svelte +42 -42
  55. package/dist/Components/QuerySelect.svelte +102 -102
  56. package/dist/Components/ResourceCalendar/ResourceCalendar.svelte +241 -241
  57. package/dist/Components/SidebarPanel.svelte +32 -32
  58. package/dist/Components/SingleSelect.svelte +122 -122
  59. package/dist/Components/StepButton.svelte +48 -48
  60. package/dist/Components/StepForm.svelte +58 -58
  61. package/dist/Components/Switch.svelte +43 -43
  62. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  63. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +30 -30
  64. package/dist/Components/Table/Body/Rows/ColumnList.svelte +24 -24
  65. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +165 -165
  66. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +13 -13
  67. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +120 -120
  68. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +81 -81
  69. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +92 -92
  70. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +110 -110
  71. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +54 -54
  72. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +35 -35
  73. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +64 -64
  74. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +82 -82
  75. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +88 -88
  76. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +90 -90
  77. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +96 -96
  78. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +71 -71
  79. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +124 -124
  80. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +91 -91
  81. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +88 -88
  82. package/dist/Components/Table/Body/Rows/TableRow.svelte +127 -127
  83. package/dist/Components/Table/Body/TableBody.svelte +92 -92
  84. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +25 -25
  85. package/dist/Components/Table/Headers/SelectAllHeader.svelte +20 -20
  86. package/dist/Components/Table/Headers/TableHead.svelte +175 -175
  87. package/dist/Components/Table/Misc/ColumnPanel.svelte +32 -32
  88. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +29 -29
  89. package/dist/Components/Table/Misc/FilterInput.svelte +326 -326
  90. package/dist/Components/Table/Misc/FilterPanel.svelte +79 -79
  91. package/dist/Components/Table/Misc/FilterPanelModal.svelte +21 -21
  92. package/dist/Components/Table/Misc/ShareViewModal.svelte +118 -118
  93. package/dist/Components/Table/Misc/SidePanel.svelte +24 -24
  94. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +318 -318
  95. package/dist/Components/Table/Misc/TableFooter.svelte +201 -201
  96. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +112 -112
  97. package/dist/Components/Table/Misc/TableSidebar.svelte +116 -116
  98. package/dist/Components/Table/Misc/TableViewDropdown.svelte +25 -25
  99. package/dist/Components/Table/Misc/ToolboxPanel.svelte +60 -60
  100. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +63 -63
  101. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +101 -101
  102. package/dist/Components/Table/NestedTable.svelte +29 -29
  103. package/dist/Components/Table/Table.svelte +140 -140
  104. package/dist/Components/Test/TestContextConsumer.svelte +8 -8
  105. package/dist/Components/TextArea.svelte +92 -90
  106. package/dist/Components/TextInput.svelte +128 -117
  107. package/dist/Components/ThreeStateRadio.svelte +101 -101
  108. package/dist/Components/Touch/BoolCard.svelte +27 -27
  109. package/dist/Components/Touch/DateModal.svelte +98 -98
  110. package/dist/Components/Touch/EditCard.svelte +44 -44
  111. package/dist/Components/Touch/InfoCard.svelte +25 -25
  112. package/dist/Components/Touch/InfoTextCard.svelte +22 -22
  113. package/dist/Components/Touch/ModalExplanation.svelte +13 -13
  114. package/dist/Components/Touch/NumberKeyboard.svelte +81 -81
  115. package/dist/Components/Touch/NumberModal.svelte +49 -49
  116. package/dist/Components/Touch/PlusMinusCard.svelte +40 -40
  117. package/dist/Components/Touch/SelectModal.svelte +86 -86
  118. package/dist/Components/Touch/SummaryCard.svelte +74 -74
  119. package/dist/Components/Touch/TextAreaModal.svelte +53 -53
  120. package/dist/Components/Touch/TextModal.svelte +56 -56
  121. package/dist/Components/Touch/TouchCard.svelte +28 -28
  122. package/dist/Components/Touch/TouchModal.svelte +141 -141
  123. package/dist/Components/Touch/UtilityButton.svelte +63 -63
  124. package/dist/Components/VerticalTabGroup.svelte +38 -38
  125. package/dist/Components/VerticalTabGroupButton.svelte +46 -46
  126. package/dist/Helpers/Datamatrix.d.ts +19 -19
  127. package/dist/Helpers/Datamatrix.js +291 -291
  128. package/dist/Types/Examples/ExampleModal.svelte +27 -27
  129. package/dist/paraglide/README.md +1 -1
  130. package/dist/scss/_basics.scss +12 -12
  131. package/dist/scss/_colours.scss +140 -140
  132. package/dist/scss/_motion.scss +57 -57
  133. package/dist/scss/_sizing.scss +85 -85
  134. package/dist/scss/_transitions.scss +8 -8
  135. 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>