@lavalogic/scoria 0.40.0 → 0.40.2

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 +46 -46
  3. package/dist/Components/AccordionGroupButton.svelte +76 -76
  4. package/dist/Components/Action.svelte +136 -136
  5. package/dist/Components/AlertModal.svelte +195 -195
  6. package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +729 -729
  7. package/dist/Components/Base/BaseModal.svelte +125 -125
  8. package/dist/Components/Base/ContextWrapper.svelte +72 -72
  9. package/dist/Components/Base/Pagination.svelte +198 -198
  10. package/dist/Components/Base/Snippets.svelte +36 -36
  11. package/dist/Components/BigRadioSet.svelte +38 -38
  12. package/dist/Components/Bubble.svelte +101 -101
  13. package/dist/Components/Button.svelte +209 -209
  14. package/dist/Components/Checkbox.svelte +86 -86
  15. package/dist/Components/CollapsibleCard.svelte +78 -78
  16. package/dist/Components/Contexts/ContextMenu.svelte +164 -164
  17. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  18. package/dist/Components/Contexts/ContextMenuOption.svelte +60 -60
  19. package/dist/Components/Contexts/Toast.svelte +86 -86
  20. package/dist/Components/Contexts/ToastContainer.svelte +65 -65
  21. package/dist/Components/Contexts/Tooltip.svelte +37 -37
  22. package/dist/Components/DataMatrixIcon.svelte +112 -112
  23. package/dist/Components/DateInput.svelte +148 -148
  24. package/dist/Components/DatePicker.svelte +300 -300
  25. package/dist/Components/DesktopModal.svelte +90 -90
  26. package/dist/Components/Dial.svelte +204 -204
  27. package/dist/Components/DimensionInput.svelte +170 -170
  28. package/dist/Components/DragMenu/DragMenuHolder.svelte +119 -119
  29. package/dist/Components/DragMenu/DraggableCard.svelte +77 -77
  30. package/dist/Components/FileCard.svelte +24 -24
  31. package/dist/Components/FileUpload.svelte +236 -236
  32. package/dist/Components/GridInput.svelte +196 -196
  33. package/dist/Components/GridInputSet.svelte +29 -29
  34. package/dist/Components/HorizontalTabGroup.svelte +82 -82
  35. package/dist/Components/HorizontalTabGroupButton.svelte +44 -44
  36. package/dist/Components/Icon.svelte +128 -128
  37. package/dist/Components/Icons.js +357 -357
  38. package/dist/Components/InfoAlert.svelte +35 -35
  39. package/dist/Components/LoadingAnimation.svelte +29 -29
  40. package/dist/Components/LoadingModal.svelte +45 -45
  41. package/dist/Components/LoadingOverlay.svelte +25 -25
  42. package/dist/Components/Modal.svelte +258 -258
  43. package/dist/Components/MultiSelect.svelte +220 -220
  44. package/dist/Components/Nav/Nav.svelte +110 -110
  45. package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
  46. package/dist/Components/Nav/NavTab.svelte +62 -62
  47. package/dist/Components/Nav/ServiceMenuItem.svelte +112 -112
  48. package/dist/Components/Nav/ServicesNav.svelte +80 -80
  49. package/dist/Components/NumberInput.svelte +157 -157
  50. package/dist/Components/PageHeading.svelte +25 -25
  51. package/dist/Components/PasswordInput.svelte +88 -88
  52. package/dist/Components/Portal.svelte +36 -36
  53. package/dist/Components/ProgressBubble.svelte +107 -107
  54. package/dist/Components/QuerySelect.svelte +366 -366
  55. package/dist/Components/SingleSelect.svelte +250 -250
  56. package/dist/Components/StepButton.svelte +70 -70
  57. package/dist/Components/StepForm.svelte +140 -140
  58. package/dist/Components/Switch.svelte +69 -69
  59. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  60. package/dist/Components/Table/Body/QuickSearchCell.svelte +679 -679
  61. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +51 -51
  62. package/dist/Components/Table/Body/Rows/ColumnList.svelte +59 -59
  63. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +454 -454
  64. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
  65. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +185 -185
  66. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +124 -124
  67. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +131 -120
  68. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +234 -234
  69. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
  70. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +87 -87
  71. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +126 -126
  72. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +159 -159
  73. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +246 -246
  74. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +216 -216
  75. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +252 -252
  76. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
  77. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +221 -221
  78. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +197 -197
  79. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +190 -190
  80. package/dist/Components/Table/Body/Rows/TableRow.svelte +290 -290
  81. package/dist/Components/Table/Body/TableBody.svelte +155 -155
  82. package/dist/Components/Table/ColumnFactory.svelte.js +1 -0
  83. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +41 -41
  84. package/dist/Components/Table/Headers/SelectAllHeader.svelte +30 -30
  85. package/dist/Components/Table/Headers/TableHead.svelte +415 -415
  86. package/dist/Components/Table/Misc/ColumnPanel.svelte +39 -39
  87. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +39 -39
  88. package/dist/Components/Table/Misc/FilterInput.svelte +641 -641
  89. package/dist/Components/Table/Misc/FilterPanel.svelte +190 -190
  90. package/dist/Components/Table/Misc/FilterPanelModal.svelte +31 -31
  91. package/dist/Components/Table/Misc/ShareViewModal.svelte +291 -291
  92. package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
  93. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +644 -644
  94. package/dist/Components/Table/Misc/TableFooter.svelte +340 -340
  95. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +140 -140
  96. package/dist/Components/Table/Misc/TableSidebar.svelte +200 -200
  97. package/dist/Components/Table/Misc/TableViewDropdown.svelte +105 -105
  98. package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
  99. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
  100. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +192 -192
  101. package/dist/Components/Table/NestedTable.svelte +130 -130
  102. package/dist/Components/Table/Table.svelte +692 -692
  103. package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.d.ts +5 -0
  104. package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.js +3 -0
  105. package/dist/Components/Table/Types/Public/ColumnOptions.d.ts +10 -0
  106. package/dist/Components/Test/TestContextConsumer.svelte +13 -13
  107. package/dist/Components/TextArea.svelte +130 -130
  108. package/dist/Components/TextInput.svelte +176 -176
  109. package/dist/Components/ThreeStateRadio.svelte +131 -131
  110. package/dist/Components/Touch/BoolCard.svelte +45 -45
  111. package/dist/Components/Touch/DateModal.svelte +209 -209
  112. package/dist/Components/Touch/EditCard.svelte +59 -59
  113. package/dist/Components/Touch/InfoCard.svelte +31 -31
  114. package/dist/Components/Touch/InfoTextCard.svelte +28 -28
  115. package/dist/Components/Touch/ModalExplanation.svelte +17 -17
  116. package/dist/Components/Touch/NumberKeyboard.svelte +225 -225
  117. package/dist/Components/Touch/NumberModal.svelte +79 -79
  118. package/dist/Components/Touch/PlusMinusCard.svelte +46 -46
  119. package/dist/Components/Touch/SelectModal.svelte +127 -127
  120. package/dist/Components/Touch/SummaryCard.svelte +93 -93
  121. package/dist/Components/Touch/TextAreaModal.svelte +95 -95
  122. package/dist/Components/Touch/TextModal.svelte +106 -106
  123. package/dist/Components/Touch/TouchCard.svelte +33 -33
  124. package/dist/Components/Touch/TouchModal.svelte +274 -274
  125. package/dist/Components/Touch/UtilityButton.svelte +109 -109
  126. package/dist/Components/VerticalTabGroup.svelte +79 -79
  127. package/dist/Components/VerticalTabGroupButton.svelte +58 -58
  128. package/dist/Helpers/Datamatrix.d.ts +19 -19
  129. package/dist/Helpers/Datamatrix.js +291 -291
  130. package/dist/Types/Examples/ExampleModal.svelte +35 -35
  131. package/dist/scss/_basics.scss +12 -12
  132. package/dist/scss/_colours.scss +134 -134
  133. package/dist/scss/_mixins.scss +3392 -3392
  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,81 +1,81 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { useAsyncFlag } from '../../Helpers/AsyncFlag.svelte.js';
5
- import { passthrough } from '../../Helpers/Helpers.svelte.js';
6
- import NumberKeyboard from './NumberKeyboard.svelte';
7
- import type { NumberModalProps } from './NumberModalProps.js';
8
- import TouchModal from './TouchModal.svelte';
9
- let {
10
- coerceValue = false,
11
- header,
12
- value,
13
- label,
14
- placeholder,
15
- min,
16
- max,
17
- cancelEditing,
18
- confirm,
19
- decimal,
20
- isValid,
21
- explanation,
22
- }: NumberModalProps = $props();
23
-
24
- // Mirror external `value` snapshots into a writable derived. Reads from
25
- // `value` are tracked; writes happen through the assignment binding
26
- // fed back to `NumberKeyboard`.
27
- let tempValue: number | null = $derived(value);
28
-
29
- const isAcceptableValue = useAsyncFlag(
30
- () => (tempValue == null ? false : (isValid?.(tempValue) ?? true)),
31
- false
32
- );
33
- </script>
34
-
35
- <TouchModal
36
- onclose={() => {
37
- cancelEditing();
38
- }}
39
- {header}
40
- mandatory
41
- onsubmit={(e: SubmitEvent) => {
42
- e.preventDefault();
43
- if (tempValue == null) {
44
- return;
45
- }
46
- confirm(tempValue);
47
- }}
48
- {explanation}
49
- >
50
- <div class="number-input-wrapper">
51
- <NumberKeyboard
52
- {coerceValue}
53
- {min}
54
- {max}
55
- {label}
56
- {placeholder}
57
- bind:value={tempValue}
58
- {decimal}
59
- />
60
- </div>
61
- {#snippet footer()}
62
- <div class="modal-footer">
63
- <button
64
- onkeydown={passthrough}
65
- type="submit"
66
- disabled={!isAcceptableValue.value}>Confirm</button
67
- >
68
- <button
69
- onkeydown={passthrough}
70
- type="button"
71
- onclick={() => {
72
- cancelEditing();
73
- }}>Cancel</button
74
- >
75
- </div>
76
- {/snippet}
77
- </TouchModal>
78
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { useAsyncFlag } from '../../Helpers/AsyncFlag.svelte.js';
5
+ import { passthrough } from '../../Helpers/Helpers.svelte.js';
6
+ import NumberKeyboard from './NumberKeyboard.svelte';
7
+ import type { NumberModalProps } from './NumberModalProps.js';
8
+ import TouchModal from './TouchModal.svelte';
9
+ let {
10
+ coerceValue = false,
11
+ header,
12
+ value,
13
+ label,
14
+ placeholder,
15
+ min,
16
+ max,
17
+ cancelEditing,
18
+ confirm,
19
+ decimal,
20
+ isValid,
21
+ explanation,
22
+ }: NumberModalProps = $props();
23
+
24
+ // Mirror external `value` snapshots into a writable derived. Reads from
25
+ // `value` are tracked; writes happen through the assignment binding
26
+ // fed back to `NumberKeyboard`.
27
+ let tempValue: number | null = $derived(value);
28
+
29
+ const isAcceptableValue = useAsyncFlag(
30
+ () => (tempValue == null ? false : (isValid?.(tempValue) ?? true)),
31
+ false
32
+ );
33
+ </script>
34
+
35
+ <TouchModal
36
+ onclose={() => {
37
+ cancelEditing();
38
+ }}
39
+ {header}
40
+ mandatory
41
+ onsubmit={(e: SubmitEvent) => {
42
+ e.preventDefault();
43
+ if (tempValue == null) {
44
+ return;
45
+ }
46
+ confirm(tempValue);
47
+ }}
48
+ {explanation}
49
+ >
50
+ <div class="number-input-wrapper">
51
+ <NumberKeyboard
52
+ {coerceValue}
53
+ {min}
54
+ {max}
55
+ {label}
56
+ {placeholder}
57
+ bind:value={tempValue}
58
+ {decimal}
59
+ />
60
+ </div>
61
+ {#snippet footer()}
62
+ <div class="modal-footer">
63
+ <button
64
+ onkeydown={passthrough}
65
+ type="submit"
66
+ disabled={!isAcceptableValue.value}>Confirm</button
67
+ >
68
+ <button
69
+ onkeydown={passthrough}
70
+ type="button"
71
+ onclick={() => {
72
+ cancelEditing();
73
+ }}>Cancel</button
74
+ >
75
+ </div>
76
+ {/snippet}
77
+ </TouchModal>
78
+
79
79
  <style>dialog {
80
80
  overflow: clip;
81
81
  background-color: #e9ecf1;
@@ -342,4 +342,4 @@ button {
342
342
  }
343
343
  .modal-footer button[type=submit]:not([disabled]):focus {
344
344
  outline-offset: -2px;
345
- }</style>
345
+ }</style>
@@ -1,48 +1,48 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { Size } from '../../Types/Internal/Size.js';
5
- import Action from '../Action.svelte';
6
- import type { PlusMinusCardProps } from './PlusMinusCardProps.js';
7
-
8
- let { callback, disabled = false, children }: PlusMinusCardProps = $props();
9
- </script>
10
-
11
- <div
12
- class="card pad-right"
13
- class:disabled
14
- >
15
- <div class="icon-left">
16
- <Action
17
- {disabled}
18
- label="Decrement"
19
- onclick={() => {
20
- callback(-1);
21
- }}
22
- icon={{
23
- name: 'circle-minus',
24
- size: Size.DoubleXLarge,
25
- }}
26
- size={Size.DoubleXLarge}
27
- />
28
- </div>
29
- <span class="value">{@render children()}</span>
30
- <div class="icon-right">
31
- <Action
32
- {disabled}
33
- label="Increment"
34
- onclick={() => {
35
- callback(1);
36
- }}
37
- icon={{
38
- name: 'circle-plus',
39
- size: Size.DoubleXLarge,
40
- }}
41
- size={Size.DoubleXLarge}
42
- />
43
- </div>
44
- </div>
45
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { Size } from '../../Types/Internal/Size.js';
5
+ import Action from '../Action.svelte';
6
+ import type { PlusMinusCardProps } from './PlusMinusCardProps.js';
7
+
8
+ let { callback, disabled = false, children }: PlusMinusCardProps = $props();
9
+ </script>
10
+
11
+ <div
12
+ class="card pad-right"
13
+ class:disabled
14
+ >
15
+ <div class="icon-left">
16
+ <Action
17
+ {disabled}
18
+ label="Decrement"
19
+ onclick={() => {
20
+ callback(-1);
21
+ }}
22
+ icon={{
23
+ name: 'circle-minus',
24
+ size: Size.DoubleXLarge,
25
+ }}
26
+ size={Size.DoubleXLarge}
27
+ />
28
+ </div>
29
+ <span class="value">{@render children()}</span>
30
+ <div class="icon-right">
31
+ <Action
32
+ {disabled}
33
+ label="Increment"
34
+ onclick={() => {
35
+ callback(1);
36
+ }}
37
+ icon={{
38
+ name: 'circle-plus',
39
+ size: Size.DoubleXLarge,
40
+ }}
41
+ size={Size.DoubleXLarge}
42
+ />
43
+ </div>
44
+ </div>
45
+
46
46
  <style>.card {
47
47
  color: #3a4952;
48
48
  fill: #3a4952;
@@ -91,4 +91,4 @@
91
91
  .card.disabled {
92
92
  background-color: #f4f7f9;
93
93
  color: #8096a5;
94
- }</style>
94
+ }</style>
@@ -1,129 +1,129 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { devCatch, passthrough } from '../../Helpers/Helpers.svelte.js';
5
- import { InputVariant } from '../../Types/Internal/InputVariant.js';
6
- import { onMount, tick } from 'svelte';
7
- import TextInput from '../TextInput.svelte';
8
- import type { SelectModalProps } from './SelectModalProps.js';
9
- import TouchModal from './TouchModal.svelte';
10
-
11
- const {
12
- header,
13
- searchbar = false,
14
- choices,
15
- cancelEditing,
16
- selected,
17
- }: SelectModalProps = $props();
18
-
19
- let selectedRef: HTMLButtonElement | undefined = $state();
20
- let searchValue = $state('');
21
-
22
- // Cache the search needle's upper-case form so we do not re-upper-case
23
- // the same string on every keystroke per choice. Per-label upper-casing
24
- // is unavoidable but the needle is constant across the filter pass.
25
- const searchNeedle = $derived(searchValue.toLocaleUpperCase());
26
- const filteredChoices = $derived(
27
- searchbar
28
- ? choices.filter((it) => it.label.toLocaleUpperCase().includes(searchNeedle))
29
- : choices
30
- );
31
-
32
- onMount(() => {
33
- tick()
34
- .then(() => {
35
- if (selected) {
36
- selectedRef?.scrollIntoView({ block: 'center', inline: 'center' });
37
- if (!searchbar) {
38
- selectedRef?.focus();
39
- }
40
- }
41
- })
42
- .catch(devCatch);
43
- });
44
- </script>
45
-
46
- <TouchModal
47
- onclose={() => {
48
- cancelEditing();
49
- }}
50
- {header}
51
- mandatory
52
- staticHeight
53
- onsubmit={(e: SubmitEvent) => {
54
- e.preventDefault();
55
- if (searchbar) {
56
- filteredChoices[0]?.callback?.()?.catch(devCatch);
57
- }
58
- }}
59
- >
60
- <div
61
- class="select-container"
62
- class:with-top-padding={!searchbar}
63
- >
64
- {#if filteredChoices.length === 0}
65
- <span>No Results</span>
66
- {/if}
67
- <!-- Keyed by index, not `choice.label`: labels are not guaranteed
68
- unique (e.g. a courier can expose two services with the same
69
- name), and a duplicate `{#each}` key throws `each_key_duplicate`.
70
- The buttons hold no per-item state, so index keying is safe. -->
71
- {#each filteredChoices as choice, index (index)}
72
- {#if selected === choice.label}
73
- {#if choice.callback}
74
- <button
75
- onkeydown={passthrough}
76
- bind:this={selectedRef}
77
- type="button"
78
- onclick={() => choice.callback?.()}>{choice.label}</button
79
- >
80
- {:else}
81
- <button
82
- onkeydown={passthrough}
83
- bind:this={selectedRef}
84
- type={choice.type}>{choice.label}</button
85
- >
86
- {/if}
87
- {:else if choice.callback}
88
- <button
89
- onkeydown={passthrough}
90
- type="button"
91
- onclick={() => choice.callback?.()}>{choice.label}</button
92
- >
93
- {:else}
94
- <button
95
- onkeydown={passthrough}
96
- type={choice.type}>{choice.label}</button
97
- >
98
- {/if}
99
- {/each}
100
- </div>
101
-
102
- {#snippet headerExtra()}
103
- {#if searchbar}
104
- <div class="header-extra visible">
105
- <TextInput
106
- labelTop="Search"
107
- bind:value={searchValue}
108
- variant={InputVariant.Modal}
109
- />
110
- </div>
111
- {/if}
112
- {/snippet}
113
-
114
- {#snippet footer()}
115
- <div class="cancel-container">
116
- <button
117
- onkeydown={passthrough}
118
- type="button"
119
- onclick={() => {
120
- cancelEditing();
121
- }}>Cancel</button
122
- >
123
- </div>
124
- {/snippet}
125
- </TouchModal>
126
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { devCatch, passthrough } from '../../Helpers/Helpers.svelte.js';
5
+ import { InputVariant } from '../../Types/Internal/InputVariant.js';
6
+ import { onMount, tick } from 'svelte';
7
+ import TextInput from '../TextInput.svelte';
8
+ import type { SelectModalProps } from './SelectModalProps.js';
9
+ import TouchModal from './TouchModal.svelte';
10
+
11
+ const {
12
+ header,
13
+ searchbar = false,
14
+ choices,
15
+ cancelEditing,
16
+ selected,
17
+ }: SelectModalProps = $props();
18
+
19
+ let selectedRef: HTMLButtonElement | undefined = $state();
20
+ let searchValue = $state('');
21
+
22
+ // Cache the search needle's upper-case form so we do not re-upper-case
23
+ // the same string on every keystroke per choice. Per-label upper-casing
24
+ // is unavoidable but the needle is constant across the filter pass.
25
+ const searchNeedle = $derived(searchValue.toLocaleUpperCase());
26
+ const filteredChoices = $derived(
27
+ searchbar
28
+ ? choices.filter((it) => it.label.toLocaleUpperCase().includes(searchNeedle))
29
+ : choices
30
+ );
31
+
32
+ onMount(() => {
33
+ tick()
34
+ .then(() => {
35
+ if (selected) {
36
+ selectedRef?.scrollIntoView({ block: 'center', inline: 'center' });
37
+ if (!searchbar) {
38
+ selectedRef?.focus();
39
+ }
40
+ }
41
+ })
42
+ .catch(devCatch);
43
+ });
44
+ </script>
45
+
46
+ <TouchModal
47
+ onclose={() => {
48
+ cancelEditing();
49
+ }}
50
+ {header}
51
+ mandatory
52
+ staticHeight
53
+ onsubmit={(e: SubmitEvent) => {
54
+ e.preventDefault();
55
+ if (searchbar) {
56
+ filteredChoices[0]?.callback?.()?.catch(devCatch);
57
+ }
58
+ }}
59
+ >
60
+ <div
61
+ class="select-container"
62
+ class:with-top-padding={!searchbar}
63
+ >
64
+ {#if filteredChoices.length === 0}
65
+ <span>No Results</span>
66
+ {/if}
67
+ <!-- Keyed by index, not `choice.label`: labels are not guaranteed
68
+ unique (e.g. a courier can expose two services with the same
69
+ name), and a duplicate `{#each}` key throws `each_key_duplicate`.
70
+ The buttons hold no per-item state, so index keying is safe. -->
71
+ {#each filteredChoices as choice, index (index)}
72
+ {#if selected === choice.label}
73
+ {#if choice.callback}
74
+ <button
75
+ onkeydown={passthrough}
76
+ bind:this={selectedRef}
77
+ type="button"
78
+ onclick={() => choice.callback?.()}>{choice.label}</button
79
+ >
80
+ {:else}
81
+ <button
82
+ onkeydown={passthrough}
83
+ bind:this={selectedRef}
84
+ type={choice.type}>{choice.label}</button
85
+ >
86
+ {/if}
87
+ {:else if choice.callback}
88
+ <button
89
+ onkeydown={passthrough}
90
+ type="button"
91
+ onclick={() => choice.callback?.()}>{choice.label}</button
92
+ >
93
+ {:else}
94
+ <button
95
+ onkeydown={passthrough}
96
+ type={choice.type}>{choice.label}</button
97
+ >
98
+ {/if}
99
+ {/each}
100
+ </div>
101
+
102
+ {#snippet headerExtra()}
103
+ {#if searchbar}
104
+ <div class="header-extra visible">
105
+ <TextInput
106
+ labelTop="Search"
107
+ bind:value={searchValue}
108
+ variant={InputVariant.Modal}
109
+ />
110
+ </div>
111
+ {/if}
112
+ {/snippet}
113
+
114
+ {#snippet footer()}
115
+ <div class="cancel-container">
116
+ <button
117
+ onkeydown={passthrough}
118
+ type="button"
119
+ onclick={() => {
120
+ cancelEditing();
121
+ }}>Cancel</button
122
+ >
123
+ </div>
124
+ {/snippet}
125
+ </TouchModal>
126
+
127
127
  <style>dialog {
128
128
  overflow: clip;
129
129
  background-color: #e9ecf1;
@@ -375,4 +375,4 @@ button {
375
375
 
376
376
  button {
377
377
  align-items: center;
378
- }</style>
378
+ }</style>