@lavalogic/scoria 0.34.0 → 0.35.0

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 (125) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +42 -42
  3. package/dist/Components/AccordionGroupButton.svelte +99 -99
  4. package/dist/Components/Action.svelte +138 -138
  5. package/dist/Components/AlertModal.svelte +125 -125
  6. package/dist/Components/Base/ContextWrapper.svelte +50 -50
  7. package/dist/Components/Base/Pagination.svelte +190 -190
  8. package/dist/Components/Base/Snippets.svelte +29 -29
  9. package/dist/Components/BigRadioSet.svelte +29 -29
  10. package/dist/Components/Bubble.svelte +77 -77
  11. package/dist/Components/Button.svelte +197 -197
  12. package/dist/Components/Checkbox.svelte +68 -68
  13. package/dist/Components/CollapsibleCard.svelte +70 -70
  14. package/dist/Components/Contexts/ContextMenu.svelte +157 -157
  15. package/dist/Components/Contexts/ContextMenuDivider.svelte +11 -11
  16. package/dist/Components/Contexts/ContextMenuOption.svelte +52 -52
  17. package/dist/Components/Contexts/Toast.svelte +61 -61
  18. package/dist/Components/Contexts/ToastContainer.svelte +46 -46
  19. package/dist/Components/Contexts/Tooltip.svelte +26 -26
  20. package/dist/Components/DataMatrixIcon.svelte +41 -41
  21. package/dist/Components/DateInput.svelte +109 -109
  22. package/dist/Components/DatePicker.svelte +312 -312
  23. package/dist/Components/DesktopModal.svelte +106 -106
  24. package/dist/Components/Dial.svelte +151 -151
  25. package/dist/Components/DimensionInput.svelte +184 -184
  26. package/dist/Components/DragMenu/DragMenuHolder.svelte +106 -106
  27. package/dist/Components/DragMenu/DraggableCard.svelte +41 -41
  28. package/dist/Components/FileCard.svelte +20 -20
  29. package/dist/Components/FileUpload.svelte +196 -196
  30. package/dist/Components/GridInput.svelte +190 -190
  31. package/dist/Components/GridInputSet.svelte +22 -22
  32. package/dist/Components/HorizontalTabGroup.svelte +78 -78
  33. package/dist/Components/HorizontalTabGroupButton.svelte +96 -96
  34. package/dist/Components/Icon.svelte +97 -97
  35. package/dist/Components/Icons.js +357 -357
  36. package/dist/Components/LoadingAnimation.svelte +32 -32
  37. package/dist/Components/LoadingModal.svelte +47 -47
  38. package/dist/Components/LoadingOverlay.svelte +27 -27
  39. package/dist/Components/Modal.svelte +251 -251
  40. package/dist/Components/MultiSelect.svelte +197 -197
  41. package/dist/Components/Nav/Nav.svelte +97 -97
  42. package/dist/Components/Nav/NavServiceMenuList.svelte +34 -34
  43. package/dist/Components/Nav/NavTab.svelte +91 -91
  44. package/dist/Components/Nav/ServiceMenuItem.svelte +91 -91
  45. package/dist/Components/Nav/ServicesNav.svelte +53 -53
  46. package/dist/Components/NumberInput.svelte +144 -144
  47. package/dist/Components/PageHeading.svelte +36 -36
  48. package/dist/Components/PasswordInput.svelte +73 -73
  49. package/dist/Components/Portal.svelte +25 -25
  50. package/dist/Components/ProgressBubble.svelte +80 -80
  51. package/dist/Components/QuerySelect.svelte +411 -411
  52. package/dist/Components/SingleSelect.svelte +261 -261
  53. package/dist/Components/StepButton.svelte +120 -120
  54. package/dist/Components/StepForm.svelte +108 -108
  55. package/dist/Components/Switch.svelte +36 -36
  56. package/dist/Components/Table/Body/QuickSearchCell.svelte +632 -632
  57. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +30 -30
  58. package/dist/Components/Table/Body/Rows/ColumnList.svelte +56 -56
  59. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +179 -179
  60. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +49 -49
  61. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +180 -180
  62. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +102 -102
  63. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +119 -119
  64. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +114 -114
  65. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +96 -96
  66. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +72 -72
  67. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +131 -131
  68. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +144 -144
  69. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +238 -238
  70. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +358 -358
  71. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +338 -338
  72. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +183 -183
  73. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +309 -309
  74. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +369 -369
  75. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +170 -170
  76. package/dist/Components/Table/Body/Rows/TableRow.svelte +259 -259
  77. package/dist/Components/Table/Body/TableBody.svelte +67 -67
  78. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +39 -39
  79. package/dist/Components/Table/Headers/SelectAllHeader.svelte +28 -28
  80. package/dist/Components/Table/Headers/TableHead.svelte +260 -260
  81. package/dist/Components/Table/Misc/ColumnPanel.svelte +78 -78
  82. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +99 -99
  83. package/dist/Components/Table/Misc/FilterInput.svelte +556 -556
  84. package/dist/Components/Table/Misc/FilterPanel.svelte +46 -46
  85. package/dist/Components/Table/Misc/FilterPanelModal.svelte +67 -67
  86. package/dist/Components/Table/Misc/SidePanel.svelte +32 -32
  87. package/dist/Components/Table/Misc/TableFooter.svelte +304 -304
  88. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +156 -156
  89. package/dist/Components/Table/Misc/TableSidebar.svelte +176 -176
  90. package/dist/Components/Table/Misc/ToolboxPanel.svelte +77 -77
  91. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +91 -91
  92. package/dist/Components/Table/NestedTable.svelte +84 -84
  93. package/dist/Components/Table/Table.svelte +492 -492
  94. package/dist/Components/Test/TestContextConsumer.svelte +13 -13
  95. package/dist/Components/TextArea.svelte +108 -108
  96. package/dist/Components/TextInput.svelte +147 -147
  97. package/dist/Components/ThreeStateRadio.svelte +124 -124
  98. package/dist/Components/Touch/BoolCard.svelte +52 -52
  99. package/dist/Components/Touch/DateModal.svelte +217 -217
  100. package/dist/Components/Touch/EditCard.svelte +52 -52
  101. package/dist/Components/Touch/InfoCard.svelte +24 -24
  102. package/dist/Components/Touch/InfoTextCard.svelte +21 -21
  103. package/dist/Components/Touch/ModalExplanation.svelte +20 -20
  104. package/dist/Components/Touch/NumberKeyboard.svelte +268 -268
  105. package/dist/Components/Touch/NumberModal.svelte +69 -69
  106. package/dist/Components/Touch/PlusMinusCard.svelte +50 -50
  107. package/dist/Components/Touch/SelectModal.svelte +105 -105
  108. package/dist/Components/Touch/SummaryCard.svelte +65 -65
  109. package/dist/Components/Touch/TextAreaModal.svelte +86 -86
  110. package/dist/Components/Touch/TextModal.svelte +123 -123
  111. package/dist/Components/Touch/TouchCard.svelte +28 -28
  112. package/dist/Components/Touch/TouchModal.svelte +259 -259
  113. package/dist/Components/Touch/UtilityButton.svelte +91 -91
  114. package/dist/Components/VerticalTabGroup.svelte +66 -66
  115. package/dist/Components/VerticalTabGroupButton.svelte +97 -97
  116. package/dist/Helpers/Datamatrix.d.ts +10 -10
  117. package/dist/Helpers/Datamatrix.js +1 -1
  118. package/dist/Helpers/Helpers.svelte.js +6 -4
  119. package/dist/Types/Examples/ExampleModal.svelte +34 -34
  120. package/dist/scss/_basics.scss +12 -12
  121. package/dist/scss/_colours.scss +134 -134
  122. package/dist/scss/_mixins.scss +3016 -3016
  123. package/dist/scss/_sizing.scss +69 -69
  124. package/dist/scss/_transitions.scss +8 -8
  125. package/package.json +2 -2
@@ -1,186 +1,186 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { InputVariant } from '../Types/Internal/InputVariant.js';
5
- import type { Centimetres } from '../Types/Internal/Misc.js';
6
- import type { DimensionInputProps } from './DimensionInputProps.js';
7
-
8
- const min = 0;
9
- let {
10
- id,
11
- x = $bindable(null),
12
- y = $bindable(null),
13
- z = $bindable(null),
14
-
15
- // labelTop,
16
- // rightIcon,
17
- // onLeftIconClick,
18
- // onRightIconClick,
19
-
20
- max,
21
- placeholder,
22
- required = false,
23
- variant = InputVariant.Default,
24
- decimal = false,
25
- invalid = false,
26
- showErrorColours = false,
27
- disabled,
28
-
29
- leftIcon,
30
-
31
- onblur,
32
- onfocus,
33
- onkeydown,
34
- oninput,
35
-
36
- inputRef = $bindable(),
37
- 'data-type': dataType,
38
- }: DimensionInputProps = $props();
39
-
40
- // NOTE unable to edit signature
41
- function xNumberValidator(_node: HTMLInputElement, _newValue: number | null | undefined) {
42
- // function xNumberValidator() {
43
- return {
44
- update(newValue: number) {
45
- const underMinimum = min > newValue;
46
- const overMaximum = max != undefined && max < newValue;
47
-
48
- x = (
49
- isNaN(newValue) ? 0 : underMinimum ? min : overMaximum ? max : newValue
50
- ) as Centimetres;
51
- },
52
- };
53
- }
54
- function yNumberValidator(_node: HTMLInputElement, _newValue: number | null | undefined) {
55
- return {
56
- update(newValue: number) {
57
- const underMinimum = min > newValue;
58
- const overMaximum = max != undefined && max < newValue;
59
-
60
- y = (
61
- isNaN(newValue) ? 0 : underMinimum ? min : overMaximum ? max : newValue
62
- ) as Centimetres;
63
- },
64
- };
65
- }
66
-
67
- function zNumberValidator(_node: HTMLInputElement, _newValue: number | null | undefined) {
68
- // function zNumberValidator() {
69
- return {
70
- update(newValue: number) {
71
- const underMinimum = min > newValue;
72
- const overMaximum = max != undefined && max < newValue;
73
-
74
- z = (
75
- isNaN(newValue) ? 0 : underMinimum ? min : overMaximum ? max : newValue
76
- ) as Centimetres;
77
- },
78
- };
79
- }
80
- // ^
81
-
82
- let isInvalid = $derived(
83
- showErrorColours &&
84
- ((required &&
85
- (x == null ||
86
- x.toString().trim() === '' ||
87
- y == null ||
88
- y.toString().trim() === '' ||
89
- z == null ||
90
- z.toString().trim() === '')) ||
91
- invalid)
92
- );
93
- </script>
94
-
95
- <div
96
- class="error-wrapper"
97
- class:for-modal={variant == InputVariant.Modal}
98
- class:for-table={variant == InputVariant.Table}
99
- >
100
- <span
101
- class="top-label"
102
- class:for-default={variant === InputVariant.Default}
103
- class:invalid={isInvalid}>Dimensions - <span class="optional">optional</span></span
104
- >
105
- {#if variant === InputVariant.Default}
106
- <span class="border">Dimensions - <span class="optional">optional</span></span>
107
- {/if}
108
- <!-- style="--background-colour: {leftIcon?.backgroundColour ?? rightIcon?.backgroundColour};" -->
109
- <div
110
- class="icon-container"
111
- class:for-modal={variant == InputVariant.Modal}
112
- >
113
- <input
114
- {id}
115
- class:for-default={variant === InputVariant.Default}
116
- data-type={dataType}
117
- use:xNumberValidator={x}
118
- class:left-pad={leftIcon != undefined}
119
- class:for-modal={variant == InputVariant.Modal}
120
- type="number"
121
- bind:value={x as number}
122
- {onblur}
123
- {onfocus}
124
- {onkeydown}
125
- {oninput}
126
- bind:this={inputRef}
127
- {placeholder}
128
- {required}
129
- {disabled}
130
- {min}
131
- {max}
132
- step={decimal ? 0.01 : 1}
133
- />
134
- <input
135
- {id}
136
- class:for-default={variant === InputVariant.Default}
137
- data-type={dataType}
138
- use:yNumberValidator={y}
139
- class:left-pad={leftIcon != undefined}
140
- class:for-modal={variant == InputVariant.Modal}
141
- type="number"
142
- bind:value={y as number}
143
- {onblur}
144
- {onfocus}
145
- {onkeydown}
146
- {oninput}
147
- bind:this={inputRef}
148
- {placeholder}
149
- {required}
150
- {disabled}
151
- {min}
152
- {max}
153
- step={decimal ? 0.01 : 1}
154
- />
155
- <input
156
- {id}
157
- class:for-default={variant === InputVariant.Default}
158
- data-type={dataType}
159
- use:zNumberValidator={z}
160
- class:left-pad={leftIcon != undefined}
161
- class:for-modal={variant == InputVariant.Modal}
162
- type="number"
163
- bind:value={z as number}
164
- {onblur}
165
- {onfocus}
166
- {onkeydown}
167
- {oninput}
168
- bind:this={inputRef}
169
- {placeholder}
170
- {required}
171
- {disabled}
172
- {min}
173
- {max}
174
- step={decimal ? 0.01 : 1}
175
- />
176
- <div class="spacer"></div>
177
- <span
178
- class="right-label inset"
179
- class:for-modal={variant == InputVariant.Modal}>cm</span
180
- >
181
- </div>
182
- </div>
183
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import { InputVariant } from '../Types/Internal/InputVariant.js';
5
+ import type { Centimetres } from '../Types/Internal/Misc.js';
6
+ import type { DimensionInputProps } from './DimensionInputProps.js';
7
+
8
+ const min = 0;
9
+ let {
10
+ id,
11
+ x = $bindable(null),
12
+ y = $bindable(null),
13
+ z = $bindable(null),
14
+
15
+ // labelTop,
16
+ // rightIcon,
17
+ // onLeftIconClick,
18
+ // onRightIconClick,
19
+
20
+ max,
21
+ placeholder,
22
+ required = false,
23
+ variant = InputVariant.Default,
24
+ decimal = false,
25
+ invalid = false,
26
+ showErrorColours = false,
27
+ disabled,
28
+
29
+ leftIcon,
30
+
31
+ onblur,
32
+ onfocus,
33
+ onkeydown,
34
+ oninput,
35
+
36
+ inputRef = $bindable(),
37
+ 'data-type': dataType,
38
+ }: DimensionInputProps = $props();
39
+
40
+ // NOTE unable to edit signature
41
+ function xNumberValidator(_node: HTMLInputElement, _newValue: number | null | undefined) {
42
+ // function xNumberValidator() {
43
+ return {
44
+ update(newValue: number) {
45
+ const underMinimum = min > newValue;
46
+ const overMaximum = max != undefined && max < newValue;
47
+
48
+ x = (
49
+ isNaN(newValue) ? 0 : underMinimum ? min : overMaximum ? max : newValue
50
+ ) as Centimetres;
51
+ },
52
+ };
53
+ }
54
+ function yNumberValidator(_node: HTMLInputElement, _newValue: number | null | undefined) {
55
+ return {
56
+ update(newValue: number) {
57
+ const underMinimum = min > newValue;
58
+ const overMaximum = max != undefined && max < newValue;
59
+
60
+ y = (
61
+ isNaN(newValue) ? 0 : underMinimum ? min : overMaximum ? max : newValue
62
+ ) as Centimetres;
63
+ },
64
+ };
65
+ }
66
+
67
+ function zNumberValidator(_node: HTMLInputElement, _newValue: number | null | undefined) {
68
+ // function zNumberValidator() {
69
+ return {
70
+ update(newValue: number) {
71
+ const underMinimum = min > newValue;
72
+ const overMaximum = max != undefined && max < newValue;
73
+
74
+ z = (
75
+ isNaN(newValue) ? 0 : underMinimum ? min : overMaximum ? max : newValue
76
+ ) as Centimetres;
77
+ },
78
+ };
79
+ }
80
+ // ^
81
+
82
+ let isInvalid = $derived(
83
+ showErrorColours &&
84
+ ((required &&
85
+ (x == null ||
86
+ x.toString().trim() === '' ||
87
+ y == null ||
88
+ y.toString().trim() === '' ||
89
+ z == null ||
90
+ z.toString().trim() === '')) ||
91
+ invalid)
92
+ );
93
+ </script>
94
+
95
+ <div
96
+ class="error-wrapper"
97
+ class:for-modal={variant == InputVariant.Modal}
98
+ class:for-table={variant == InputVariant.Table}
99
+ >
100
+ <span
101
+ class="top-label"
102
+ class:for-default={variant === InputVariant.Default}
103
+ class:invalid={isInvalid}>Dimensions - <span class="optional">optional</span></span
104
+ >
105
+ {#if variant === InputVariant.Default}
106
+ <span class="border">Dimensions - <span class="optional">optional</span></span>
107
+ {/if}
108
+ <!-- style="--background-colour: {leftIcon?.backgroundColour ?? rightIcon?.backgroundColour};" -->
109
+ <div
110
+ class="icon-container"
111
+ class:for-modal={variant == InputVariant.Modal}
112
+ >
113
+ <input
114
+ {id}
115
+ class:for-default={variant === InputVariant.Default}
116
+ data-type={dataType}
117
+ use:xNumberValidator={x}
118
+ class:left-pad={leftIcon != undefined}
119
+ class:for-modal={variant == InputVariant.Modal}
120
+ type="number"
121
+ bind:value={x as number}
122
+ {onblur}
123
+ {onfocus}
124
+ {onkeydown}
125
+ {oninput}
126
+ bind:this={inputRef}
127
+ {placeholder}
128
+ {required}
129
+ {disabled}
130
+ {min}
131
+ {max}
132
+ step={decimal ? 0.01 : 1}
133
+ />
134
+ <input
135
+ {id}
136
+ class:for-default={variant === InputVariant.Default}
137
+ data-type={dataType}
138
+ use:yNumberValidator={y}
139
+ class:left-pad={leftIcon != undefined}
140
+ class:for-modal={variant == InputVariant.Modal}
141
+ type="number"
142
+ bind:value={y as number}
143
+ {onblur}
144
+ {onfocus}
145
+ {onkeydown}
146
+ {oninput}
147
+ bind:this={inputRef}
148
+ {placeholder}
149
+ {required}
150
+ {disabled}
151
+ {min}
152
+ {max}
153
+ step={decimal ? 0.01 : 1}
154
+ />
155
+ <input
156
+ {id}
157
+ class:for-default={variant === InputVariant.Default}
158
+ data-type={dataType}
159
+ use:zNumberValidator={z}
160
+ class:left-pad={leftIcon != undefined}
161
+ class:for-modal={variant == InputVariant.Modal}
162
+ type="number"
163
+ bind:value={z as number}
164
+ {onblur}
165
+ {onfocus}
166
+ {onkeydown}
167
+ {oninput}
168
+ bind:this={inputRef}
169
+ {placeholder}
170
+ {required}
171
+ {disabled}
172
+ {min}
173
+ {max}
174
+ step={decimal ? 0.01 : 1}
175
+ />
176
+ <div class="spacer"></div>
177
+ <span
178
+ class="right-label inset"
179
+ class:for-modal={variant == InputVariant.Modal}>cm</span
180
+ >
181
+ </div>
182
+ </div>
183
+
184
184
  <style>input {
185
185
  box-sizing: border-box;
186
186
  height: 100%;
@@ -459,4 +459,4 @@ div.spacer {
459
459
  .icon-container input:last-of-type {
460
460
  border-radius: 0;
461
461
  border-left-color: transparent;
462
- }</style>
462
+ }</style>
@@ -1,108 +1,108 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts" generics="T">
4
- import { type DndEvent, dndzone } from 'svelte-dnd-action';
5
- import { flip } from 'svelte/animate';
6
- import type { DragMenuHolderProps } from './DragMenuHolderProps.js';
7
- import type { Draggable } from './Draggable.js';
8
- import DraggableCard from './DraggableCard.svelte';
9
-
10
- const {
11
- items: originalItems,
12
- onUpdate,
13
- snippet: customSnippet,
14
- transformToDraggable,
15
- flipDurationMS = 60,
16
- label
17
- }: DragMenuHolderProps<T> = $props();
18
-
19
- let items: Array<Draggable<T>> = $state([]);
20
-
21
- function consider(newItems: Array<Draggable<T>>) {
22
- items = newItems;
23
- }
24
- function finalise(newItems: Array<Draggable<T>>) {
25
- items = newItems;
26
- onUpdate(items.map((it) => it.original));
27
- }
28
-
29
- $effect.pre(() => {
30
- void originalItems;
31
- items = originalItems.map(transformToDraggable);
32
- });
33
-
34
- const snippet = $derived(customSnippet ?? draggableWithSelect);
35
- </script>
36
-
37
- {#snippet draggableWithSelect<T>(item: Draggable<T>, index: number)}
38
- <DraggableCard
39
- title={item.title}
40
- subtitle={item.subtitle}
41
- {index}
42
- selectable
43
- selected={item.selected}
44
- />
45
- {/snippet}
46
-
47
- <div class="wrapper">
48
- {#if label}
49
- <span class="top-label">{label}</span>
50
- <span class="top-label-border">{label}</span>
51
- {/if}
52
- <div
53
- class="dnd"
54
- use:dndzone={{ items, flipDurationMs: flipDurationMS, delayTouchStart: 30 }}
55
- onconsider={(e: CustomEvent<DndEvent<Draggable<T>>>) => {
56
- consider(e.detail.items);
57
- }}
58
- onfinalize={(e: CustomEvent<DndEvent<Draggable<T>>>) => {
59
- finalise(e.detail.items);
60
- }}
61
- >
62
- <!-- svelte-ignore a11y_no_static_element_interactions -->
63
- {#each items as item, index (item.id)}
64
- <!-- svelte-ignore a11y_click_events_have_key_events -->
65
- <div
66
- class="contents"
67
- onclick={(e) => {
68
- if (item.toggleSelected) {
69
- e.stopPropagation();
70
- item.toggleSelected();
71
- }
72
- }}
73
- animate:flip={{ duration: flipDurationMS }}
74
- >
75
- <!-- eslint-disable-next-line @typescript-eslint/no-confusing-void-expression -->
76
- {@render snippet(item, index)}
77
- </div>
78
- {/each}
79
- </div>
80
- </div>
81
-
82
- <!--
83
- tabindex="0"
84
- role="button"
85
- onkeydown={(e) => {
86
- const prevTarget = e.target;
87
- console.log(e.key);
88
- if (e.key == 'ArrowUp') {
89
- e.stopPropagation();
90
- up(item, index);
91
- } else if (e.key == 'ArrowDown') {
92
- e.stopPropagation();
93
- down(item, index);
94
- } else if (e.key == ' ') {
95
- alert('SPACEBAR');
96
- }
97
- tick().then(() => {
98
- if (prevTarget && 'focus' in prevTarget) {
99
- (prevTarget as HTMLElement).focus();
100
- } else {
101
- console.warn(`prev target is undefined`);
102
- }
103
- });
104
- }} -->
105
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts" generics="T">
4
+ import { type DndEvent, dndzone } from 'svelte-dnd-action';
5
+ import { flip } from 'svelte/animate';
6
+ import type { DragMenuHolderProps } from './DragMenuHolderProps.js';
7
+ import type { Draggable } from './Draggable.js';
8
+ import DraggableCard from './DraggableCard.svelte';
9
+
10
+ const {
11
+ items: originalItems,
12
+ onUpdate,
13
+ snippet: customSnippet,
14
+ transformToDraggable,
15
+ flipDurationMS = 60,
16
+ label
17
+ }: DragMenuHolderProps<T> = $props();
18
+
19
+ let items: Array<Draggable<T>> = $state([]);
20
+
21
+ function consider(newItems: Array<Draggable<T>>) {
22
+ items = newItems;
23
+ }
24
+ function finalise(newItems: Array<Draggable<T>>) {
25
+ items = newItems;
26
+ onUpdate(items.map((it) => it.original));
27
+ }
28
+
29
+ $effect.pre(() => {
30
+ void originalItems;
31
+ items = originalItems.map(transformToDraggable);
32
+ });
33
+
34
+ const snippet = $derived(customSnippet ?? draggableWithSelect);
35
+ </script>
36
+
37
+ {#snippet draggableWithSelect<T>(item: Draggable<T>, index: number)}
38
+ <DraggableCard
39
+ title={item.title}
40
+ subtitle={item.subtitle}
41
+ {index}
42
+ selectable
43
+ selected={item.selected}
44
+ />
45
+ {/snippet}
46
+
47
+ <div class="wrapper">
48
+ {#if label}
49
+ <span class="top-label">{label}</span>
50
+ <span class="top-label-border">{label}</span>
51
+ {/if}
52
+ <div
53
+ class="dnd"
54
+ use:dndzone={{ items, flipDurationMs: flipDurationMS, delayTouchStart: 30 }}
55
+ onconsider={(e: CustomEvent<DndEvent<Draggable<T>>>) => {
56
+ consider(e.detail.items);
57
+ }}
58
+ onfinalize={(e: CustomEvent<DndEvent<Draggable<T>>>) => {
59
+ finalise(e.detail.items);
60
+ }}
61
+ >
62
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
63
+ {#each items as item, index (item.id)}
64
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
65
+ <div
66
+ class="contents"
67
+ onclick={(e) => {
68
+ if (item.toggleSelected) {
69
+ e.stopPropagation();
70
+ item.toggleSelected();
71
+ }
72
+ }}
73
+ animate:flip={{ duration: flipDurationMS }}
74
+ >
75
+ <!-- eslint-disable-next-line @typescript-eslint/no-confusing-void-expression -->
76
+ {@render snippet(item, index)}
77
+ </div>
78
+ {/each}
79
+ </div>
80
+ </div>
81
+
82
+ <!--
83
+ tabindex="0"
84
+ role="button"
85
+ onkeydown={(e) => {
86
+ const prevTarget = e.target;
87
+ console.log(e.key);
88
+ if (e.key == 'ArrowUp') {
89
+ e.stopPropagation();
90
+ up(item, index);
91
+ } else if (e.key == 'ArrowDown') {
92
+ e.stopPropagation();
93
+ down(item, index);
94
+ } else if (e.key == ' ') {
95
+ alert('SPACEBAR');
96
+ }
97
+ tick().then(() => {
98
+ if (prevTarget && 'focus' in prevTarget) {
99
+ (prevTarget as HTMLElement).focus();
100
+ } else {
101
+ console.warn(`prev target is undefined`);
102
+ }
103
+ });
104
+ }} -->
105
+
106
106
  <style>.top-label {
107
107
  position: absolute;
108
108
  left: 0.5rem;
@@ -158,4 +158,4 @@ div.dnd {
158
158
  gap: 0.5rem;
159
159
  padding: 0.5rem;
160
160
  outline-color: red;
161
- }</style>
161
+ }</style>
@@ -1,43 +1,43 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import Checkbox from '../Checkbox.svelte';
5
- import type { DraggableCardProps } from './DraggableCardProps.js';
6
-
7
- let {
8
- selectable,
9
- title,
10
- subtitle,
11
- index,
12
- selected = $bindable(false),
13
- touch = false,
14
- toggleSelected
15
- }: DraggableCardProps = $props();
16
- </script>
17
-
18
- <div class="card" class:touch>
19
- {#if selectable}
20
- <div class="limit-size" class:touch>
21
- <Checkbox
22
- value={selected}
23
- onchange={(
24
- e: Event & {
25
- currentTarget: EventTarget & HTMLInputElement;
26
- }
27
- ) => {
28
- e.stopPropagation();
29
- toggleSelected?.();
30
- }}
31
- />
32
- </div>
33
- {/if}
34
- <div class="text" class:touch>
35
- <span class="title" class:touch>{title}</span>
36
- <span class="subtitle" class:touch>{subtitle}</span>
37
- </div>
38
- <span class="row" class:touch>{index + 1}</span>
39
- </div>
40
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">
4
+ import Checkbox from '../Checkbox.svelte';
5
+ import type { DraggableCardProps } from './DraggableCardProps.js';
6
+
7
+ let {
8
+ selectable,
9
+ title,
10
+ subtitle,
11
+ index,
12
+ selected = $bindable(false),
13
+ touch = false,
14
+ toggleSelected
15
+ }: DraggableCardProps = $props();
16
+ </script>
17
+
18
+ <div class="card" class:touch>
19
+ {#if selectable}
20
+ <div class="limit-size" class:touch>
21
+ <Checkbox
22
+ value={selected}
23
+ onchange={(
24
+ e: Event & {
25
+ currentTarget: EventTarget & HTMLInputElement;
26
+ }
27
+ ) => {
28
+ e.stopPropagation();
29
+ toggleSelected?.();
30
+ }}
31
+ />
32
+ </div>
33
+ {/if}
34
+ <div class="text" class:touch>
35
+ <span class="title" class:touch>{title}</span>
36
+ <span class="subtitle" class:touch>{subtitle}</span>
37
+ </div>
38
+ <span class="row" class:touch>{index + 1}</span>
39
+ </div>
40
+
41
41
  <style>.limit-size:not(.touch) {
42
42
  width: 1.5rem;
43
43
  }
@@ -134,4 +134,4 @@
134
134
  height: 1.75rem;
135
135
  width: 1.75rem;
136
136
  margin-right: 1rem;
137
- }</style>
137
+ }</style>