@lavalogic/scoria 0.40.13 → 0.40.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +58 -58
  2. package/dist/Components/AccordionGroup.svelte +35 -46
  3. package/dist/Components/AccordionGroupButton.svelte +68 -76
  4. package/dist/Components/Action.svelte +103 -135
  5. package/dist/Components/AlertModal.svelte +171 -190
  6. package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +614 -697
  7. package/dist/Components/Base/BaseModal.svelte +90 -116
  8. package/dist/Components/Base/ContextWrapper.svelte +67 -72
  9. package/dist/Components/Base/Pagination.svelte +173 -196
  10. package/dist/Components/Base/Snippets.svelte +34 -36
  11. package/dist/Components/BigRadioSet.svelte +36 -38
  12. package/dist/Components/Bubble.svelte +78 -101
  13. package/dist/Components/Button.svelte +175 -208
  14. package/dist/Components/Checkbox.svelte +75 -86
  15. package/dist/Components/CollapsibleCard.svelte +72 -87
  16. package/dist/Components/CollapsibleMenuGroup.svelte +53 -57
  17. package/dist/Components/ConditionBuilder/ConditionBuilder.svelte +39 -64
  18. package/dist/Components/Contexts/ContextMenu.svelte +141 -156
  19. package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
  20. package/dist/Components/Contexts/ContextMenuOption.svelte +53 -60
  21. package/dist/Components/Contexts/Toast.svelte +81 -86
  22. package/dist/Components/Contexts/ToastContainer.svelte +58 -62
  23. package/dist/Components/Contexts/Tooltip.svelte +36 -37
  24. package/dist/Components/DataMatrixIcon.svelte +95 -108
  25. package/dist/Components/DateInput.svelte +118 -146
  26. package/dist/Components/DatePicker.svelte +255 -294
  27. package/dist/Components/DesktopModal.svelte +70 -90
  28. package/dist/Components/Dial.svelte +167 -197
  29. package/dist/Components/DimensionInput.svelte +124 -169
  30. package/dist/Components/DragMenu/DragMenuHolder.svelte +98 -114
  31. package/dist/Components/DragMenu/DraggableCard.svelte +64 -76
  32. package/dist/Components/FileCard.svelte +21 -24
  33. package/dist/Components/FileUpload.svelte +190 -225
  34. package/dist/Components/GridInput.svelte +159 -196
  35. package/dist/Components/GridInputSet.svelte +24 -29
  36. package/dist/Components/HorizontalTabGroup.svelte +73 -89
  37. package/dist/Components/HorizontalTabGroupButton.svelte +40 -44
  38. package/dist/Components/Icon.svelte +99 -128
  39. package/dist/Components/Icons.js +357 -357
  40. package/dist/Components/InfoAlert.svelte +35 -38
  41. package/dist/Components/LoadingAnimation.svelte +691 -755
  42. package/dist/Components/LoadingModal.svelte +36 -44
  43. package/dist/Components/LoadingOverlay.svelte +22 -26
  44. package/dist/Components/Modal.svelte +204 -254
  45. package/dist/Components/MultiSelect.svelte +186 -216
  46. package/dist/Components/Nav/Nav.svelte +94 -110
  47. package/dist/Components/Nav/NavServiceMenuList.svelte +57 -61
  48. package/dist/Components/Nav/NavTab.svelte +58 -62
  49. package/dist/Components/Nav/ServiceMenuItem.svelte +103 -111
  50. package/dist/Components/Nav/ServicesNav.svelte +72 -79
  51. package/dist/Components/NumberInput.svelte +121 -155
  52. package/dist/Components/OptionCards.svelte +62 -73
  53. package/dist/Components/PageHeading.svelte +23 -25
  54. package/dist/Components/PasswordInput.svelte +69 -88
  55. package/dist/Components/PopoverButton.svelte +151 -0
  56. package/dist/Components/PopoverButton.svelte.d.ts +9 -0
  57. package/dist/Components/PopoverButtonProps.d.ts +21 -0
  58. package/dist/Components/PopoverButtonProps.js +1 -0
  59. package/dist/Components/Portal.svelte +29 -35
  60. package/dist/Components/ProgressBubble.svelte +91 -106
  61. package/dist/Components/QuerySelect.svelte +260 -346
  62. package/dist/Components/SidebarPanel.svelte +34 -36
  63. package/dist/Components/SingleSelect.svelte +196 -244
  64. package/dist/Components/StepButton.svelte +65 -70
  65. package/dist/Components/StepForm.svelte +115 -135
  66. package/dist/Components/Switch.svelte +57 -69
  67. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  68. package/dist/Components/Table/Body/QuickSearchCell.svelte +578 -655
  69. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +42 -51
  70. package/dist/Components/Table/Body/Rows/ColumnList.svelte +42 -58
  71. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +403 -442
  72. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +51 -78
  73. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +165 -184
  74. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +110 -123
  75. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +134 -160
  76. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +190 -231
  77. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +82 -104
  78. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +52 -87
  79. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +122 -150
  80. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +132 -159
  81. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +190 -236
  82. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +173 -211
  83. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +204 -244
  84. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +140 -177
  85. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +188 -217
  86. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +173 -193
  87. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +166 -187
  88. package/dist/Components/Table/Body/Rows/TableRow.svelte +245 -288
  89. package/dist/Components/Table/Body/TableBody.svelte +141 -154
  90. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +35 -41
  91. package/dist/Components/Table/Headers/SelectAllHeader.svelte +24 -30
  92. package/dist/Components/Table/Headers/TableHead.svelte +348 -402
  93. package/dist/Components/Table/Misc/ColumnPanel.svelte +37 -39
  94. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +35 -39
  95. package/dist/Components/Table/Misc/FilterInput.svelte +556 -619
  96. package/dist/Components/Table/Misc/FilterPanel.svelte +170 -183
  97. package/dist/Components/Table/Misc/FilterPanelModal.svelte +25 -31
  98. package/dist/Components/Table/Misc/ShareViewModal.svelte +252 -281
  99. package/dist/Components/Table/Misc/SidePanel.svelte +32 -35
  100. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +574 -629
  101. package/dist/Components/Table/Misc/TableFooter.svelte +326 -332
  102. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +134 -140
  103. package/dist/Components/Table/Misc/TableSidebar.svelte +183 -198
  104. package/dist/Components/Table/Misc/TableViewDropdown.svelte +83 -103
  105. package/dist/Components/Table/Misc/ToolboxPanel.svelte +83 -100
  106. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +88 -107
  107. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +163 -190
  108. package/dist/Components/Table/NestedTable.svelte +102 -128
  109. package/dist/Components/Table/Table.svelte +531 -663
  110. package/dist/Components/Test/TestContextConsumer.svelte +11 -13
  111. package/dist/Components/TextArea.svelte +95 -130
  112. package/dist/Components/TextInput.svelte +125 -176
  113. package/dist/Components/ThreeStateRadio.svelte +111 -130
  114. package/dist/Components/Touch/BoolCard.svelte +33 -45
  115. package/dist/Components/Touch/DateModal.svelte +164 -204
  116. package/dist/Components/Touch/EditCard.svelte +48 -59
  117. package/dist/Components/Touch/InfoCard.svelte +28 -31
  118. package/dist/Components/Touch/InfoTextCard.svelte +26 -28
  119. package/dist/Components/Touch/ModalExplanation.svelte +15 -17
  120. package/dist/Components/Touch/NumberKeyboard.svelte +181 -218
  121. package/dist/Components/Touch/NumberModal.svelte +59 -79
  122. package/dist/Components/Touch/PlusMinusCard.svelte +43 -46
  123. package/dist/Components/Touch/SelectModal.svelte +111 -126
  124. package/dist/Components/Touch/SummaryCard.svelte +80 -93
  125. package/dist/Components/Touch/TextAreaModal.svelte +72 -94
  126. package/dist/Components/Touch/TextModal.svelte +77 -105
  127. package/dist/Components/Touch/TouchCard.svelte +31 -33
  128. package/dist/Components/Touch/TouchModal.svelte +214 -270
  129. package/dist/Components/Touch/UtilityButton.svelte +88 -109
  130. package/dist/Components/VerticalTabGroup.svelte +60 -78
  131. package/dist/Components/VerticalTabGroupButton.svelte +54 -58
  132. package/dist/Helpers/Datamatrix.d.ts +19 -19
  133. package/dist/Helpers/Datamatrix.js +291 -291
  134. package/dist/Types/Examples/ExampleModal.svelte +31 -35
  135. package/dist/index.d.ts +2 -0
  136. package/dist/index.js +1 -0
  137. package/dist/scss/_basics.scss +12 -12
  138. package/dist/scss/_colours.scss +134 -134
  139. package/dist/scss/_mixins.scss +3392 -3392
  140. package/dist/scss/_motion.scss +57 -57
  141. package/dist/scss/_sizing.scss +85 -85
  142. package/dist/scss/_transitions.scss +8 -8
  143. package/package.json +1 -1
@@ -1,79 +1,67 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { devCatch } from '../../Helpers/Helpers.svelte.js';
5
- import Checkbox from '../Checkbox.svelte';
6
- import type { DraggableCardProps } from './DraggableCardProps.js';
7
-
8
- // `selected` must remain `let` because it is `$bindable`; the rest
9
- // are read-only props.
10
- let {
11
- selectable,
12
- title,
13
- subtitle,
14
- index,
15
- selected = $bindable(false),
16
- touch = false,
17
- toggleSelected,
18
- }: DraggableCardProps = $props();
19
-
20
- function fireToggle(): void {
21
- if (!toggleSelected) {
22
- return;
23
- }
24
- const result = toggleSelected();
25
- if (result instanceof Promise) {
26
- result.catch((e: unknown) => {
27
- devCatch(e);
28
- });
29
- }
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">import { devCatch } from "../../Helpers/Helpers.svelte.js";
4
+ import Checkbox from "../Checkbox.svelte";
5
+ // `selected` must remain `let` because it is `$bindable`; the rest
6
+ // are read-only props.
7
+ let { selectable, title, subtitle, index, selected = $bindable(false), touch = false, toggleSelected } = $props();
8
+ function fireToggle() {
9
+ if (!toggleSelected) {
10
+ return;
30
11
  }
31
- </script>
32
-
33
- <div
34
- class="card"
35
- class:touch
36
- role={selectable ? 'checkbox' : 'listitem'}
37
- aria-checked={selectable ? selected : undefined}
38
- aria-label={title}
39
- >
40
- {#if selectable}
41
- <div
42
- class="limit-size"
43
- class:touch
44
- >
45
- <Checkbox
46
- value={selected}
47
- onchange={(
48
- e: Event & {
49
- currentTarget: EventTarget & HTMLInputElement;
50
- }
51
- ) => {
52
- e.stopPropagation();
53
- fireToggle();
54
- }}
55
- />
56
- </div>
57
- {/if}
58
- <div
59
- class="text"
60
- class:touch
61
- >
62
- <span
63
- class="title"
64
- class:touch>{title}</span
65
- >
66
- <span
67
- class="subtitle"
68
- class:touch>{subtitle}</span
69
- >
70
- </div>
71
- <span
72
- class="row"
73
- class:touch>{index + 1}</span
74
- >
75
- </div>
76
-
12
+ const result = toggleSelected();
13
+ if (result instanceof Promise) {
14
+ result.catch((e) => {
15
+ devCatch(e);
16
+ });
17
+ }
18
+ }
19
+ </script>
20
+
21
+ <div
22
+ class="card"
23
+ class:touch
24
+ role={selectable ? 'checkbox' : 'listitem'}
25
+ aria-checked={selectable ? selected : undefined}
26
+ aria-label={title}
27
+ >
28
+ {#if selectable}
29
+ <div
30
+ class="limit-size"
31
+ class:touch
32
+ >
33
+ <Checkbox
34
+ value={selected}
35
+ onchange={(
36
+ e: Event & {
37
+ currentTarget: EventTarget & HTMLInputElement;
38
+ }
39
+ ) => {
40
+ e.stopPropagation();
41
+ fireToggle();
42
+ }}
43
+ />
44
+ </div>
45
+ {/if}
46
+ <div
47
+ class="text"
48
+ class:touch
49
+ >
50
+ <span
51
+ class="title"
52
+ class:touch>{title}</span
53
+ >
54
+ <span
55
+ class="subtitle"
56
+ class:touch>{subtitle}</span
57
+ >
58
+ </div>
59
+ <span
60
+ class="row"
61
+ class:touch>{index + 1}</span
62
+ >
63
+ </div>
64
+
77
65
  <style>.limit-size:not(.touch) {
78
66
  width: 1.5rem;
79
67
  }
@@ -170,4 +158,4 @@
170
158
  height: 1.75rem;
171
159
  width: 1.75rem;
172
160
  margin-right: 1rem;
173
- }</style>
161
+ }</style>
@@ -1,30 +1,27 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import Action from './Action.svelte';
5
- import { Colour } from '../scss/colours.js';
6
- import type { FileCardProps } from './FileCardProps.js';
7
-
8
- const { file, ondelete }: FileCardProps = $props();
9
- </script>
10
-
11
- <div
12
- role="listitem"
13
- aria-label={file.name}
14
- >
15
- <span>{file.name}</span>
16
- <Action
17
- icon={{ name: 'circle-cross' }}
18
- backgroundColour={Colour['$transparent-0']}
19
- label="Delete"
20
- onclick={ondelete}
21
- />
22
- </div>
23
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">import Action from "./Action.svelte";
4
+ import { Colour } from "../scss/colours.js";
5
+ const { file, ondelete } = $props();
6
+ </script>
7
+
8
+ <div
9
+ role="listitem"
10
+ aria-label={file.name}
11
+ >
12
+ <span>{file.name}</span>
13
+ <Action
14
+ icon={{ name: 'circle-cross' }}
15
+ backgroundColour={Colour['$transparent-0']}
16
+ label="Delete"
17
+ onclick={ondelete}
18
+ />
19
+ </div>
20
+
24
21
  <style>div {
25
22
  display: flex;
26
23
  flex-flow: row nowrap;
27
24
  flex-grow: 1;
28
25
  align-items: center;
29
26
  gap: 0.375rem;
30
- }</style>
27
+ }</style>
@@ -1,238 +1,203 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { cssLength } from '../Helpers/Helpers.svelte.js';
5
- import { Colour, ColourSet } from '../scss/colours.js';
6
- import { InputVariant } from '../Types/Internal/InputVariant.js';
7
- import { Size } from '../Types/Internal/Size.js';
8
- import Action from './Action.svelte';
9
- import FileCard from './FileCard.svelte';
10
- import type { FileRejection, FileUploadProps } from './FileUploadProps.js';
11
- import Icon from './Icon.svelte';
12
-
13
- let {
14
- accept,
15
- files = $bindable([]),
16
- multiple = false,
17
- labelTop,
18
- labelRight,
19
- placeholder,
20
- required = false,
21
- variant = InputVariant.Default,
22
- disabled,
23
- optional = false,
24
- leftIcon,
25
- rightIcon,
26
- onLeftIconClick,
27
- onRightIconClick,
28
-
29
- inputRef = $bindable(),
30
- onblur,
31
- onfocus,
32
- onchange,
33
- onreject,
34
- maxSize,
35
- allowedMimeTypes,
36
- allowedExtensions,
37
- }: FileUploadProps = $props();
38
-
39
- function reasonToReject(file: File): FileRejection['reason'] | null {
40
- if (maxSize != undefined && file.size > maxSize) {
41
- return 'size';
42
- }
43
- if (allowedMimeTypes && allowedMimeTypes.length > 0) {
44
- if (!allowedMimeTypes.includes(file.type)) {
45
- return 'mime';
46
- }
47
- }
48
- if (allowedExtensions && allowedExtensions.length > 0) {
49
- const lower = file.name.toLocaleLowerCase();
50
- const matched = allowedExtensions.some((ext) => lower.endsWith(ext.toLocaleLowerCase()));
51
- if (!matched) {
52
- return 'extension';
53
- }
54
- }
55
- return null;
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">import { cssLength } from "../Helpers/Helpers.svelte.js";
4
+ import { Colour, ColourSet } from "../scss/colours.js";
5
+ import { InputVariant } from "../Types/Internal/InputVariant.js";
6
+ import { Size } from "../Types/Internal/Size.js";
7
+ import Action from "./Action.svelte";
8
+ import FileCard from "./FileCard.svelte";
9
+ import Icon from "./Icon.svelte";
10
+ let { accept, files = $bindable([]), multiple = false, labelTop, labelRight, placeholder, required = false, variant = InputVariant.Default, disabled, optional = false, leftIcon, rightIcon, onLeftIconClick, onRightIconClick, inputRef = $bindable(), onblur, onfocus, onchange, onreject, maxSize, allowedMimeTypes, allowedExtensions } = $props();
11
+ function reasonToReject(file) {
12
+ if (maxSize != undefined && file.size > maxSize) {
13
+ return "size";
56
14
  }
57
-
58
- function partition(candidates: ArrayLike<File>): {
59
- accepted: ReadonlyArray<File>;
60
- rejected: ReadonlyArray<FileRejection>;
61
- } {
62
- const accepted: Array<File> = [];
63
- const rejected: Array<FileRejection> = [];
64
- for (let i = 0; i < candidates.length; i++) {
65
- const file = candidates[i];
66
- const reason = reasonToReject(file);
67
- if (reason == null) {
68
- accepted.push(file);
69
- } else {
70
- rejected.push({ file, reason });
71
- }
15
+ if (allowedMimeTypes && allowedMimeTypes.length > 0) {
16
+ if (!allowedMimeTypes.includes(file.type)) {
17
+ return "mime";
72
18
  }
73
- return { accepted, rejected };
74
19
  }
75
-
76
- function commit(accepted: ReadonlyArray<File>) {
77
- if (accepted.length === 0) {
78
- return;
20
+ if (allowedExtensions && allowedExtensions.length > 0) {
21
+ const lower = file.name.toLocaleLowerCase();
22
+ const matched = allowedExtensions.some((ext) => lower.endsWith(ext.toLocaleLowerCase()));
23
+ if (!matched) {
24
+ return "extension";
79
25
  }
80
- files = [...files, ...accepted];
81
- onchange?.(files);
82
26
  }
83
-
84
- function onPickerChange(e: Event & { currentTarget: EventTarget & HTMLInputElement }) {
85
- const markedFiles = e.currentTarget.files ?? [];
86
- const { accepted, rejected } = partition(markedFiles);
87
- if (rejected.length > 0) {
88
- onreject?.(rejected);
27
+ return null;
28
+ }
29
+ function partition(candidates) {
30
+ const accepted = [];
31
+ const rejected = [];
32
+ for (let i = 0; i < candidates.length; i++) {
33
+ const file = candidates[i];
34
+ const reason = reasonToReject(file);
35
+ if (reason == null) {
36
+ accepted.push(file);
37
+ } else {
38
+ rejected.push({
39
+ file,
40
+ reason
41
+ });
89
42
  }
90
- commit(accepted);
91
43
  }
92
-
93
- function openPicker() {
94
- inputRef?.showPicker();
44
+ return {
45
+ accepted,
46
+ rejected
47
+ };
48
+ }
49
+ function commit(accepted) {
50
+ if (accepted.length === 0) {
51
+ return;
95
52
  }
96
-
97
- let dragover = $state(false);
98
-
99
- function ondrop(e: DragEvent) {
100
- e.stopPropagation();
101
- e.preventDefault();
102
- dragover = false;
103
-
104
- if (!e.dataTransfer?.files) {
105
- return;
106
- }
107
-
108
- const { accepted, rejected } = partition(e.dataTransfer.files);
109
- if (rejected.length > 0) {
110
- onreject?.(rejected);
111
- }
112
- commit(accepted);
53
+ files = [...files, ...accepted];
54
+ onchange?.(files);
55
+ }
56
+ function onPickerChange(e) {
57
+ const markedFiles = e.currentTarget.files ?? [];
58
+ const { accepted, rejected } = partition(markedFiles);
59
+ if (rejected.length > 0) {
60
+ onreject?.(rejected);
113
61
  }
114
-
115
- function ondragover(e: DragEvent) {
116
- e.preventDefault();
117
- dragover = true;
62
+ commit(accepted);
63
+ }
64
+ function openPicker() {
65
+ inputRef?.showPicker();
66
+ }
67
+ let dragover = $state(false);
68
+ function ondrop(e) {
69
+ e.stopPropagation();
70
+ e.preventDefault();
71
+ dragover = false;
72
+ if (!e.dataTransfer?.files) {
73
+ return;
118
74
  }
119
-
120
- function ondragleave(e: DragEvent) {
121
- e.preventDefault();
122
- dragover = false;
75
+ const { accepted, rejected } = partition(e.dataTransfer.files);
76
+ if (rejected.length > 0) {
77
+ onreject?.(rejected);
123
78
  }
124
- </script>
125
-
126
- <label
127
- class:dragover
128
- class:for-modal={variant === InputVariant.Modal}
129
- {ondrop}
130
- {ondragover}
131
- {ondragleave}
132
- >
133
- {#if labelTop && variant !== InputVariant.Modal}
134
- <span
135
- class="top-label"
136
- class:for-default={variant === InputVariant.Default}
137
- >{labelTop}{#if optional}<i>&nbsp;- optional</i>{/if}</span
138
- >
139
- {#if variant === InputVariant.Default}
140
- <span class="border"
141
- >{labelTop}{#if optional}<i>&nbsp;- optional</i>{/if}</span
142
- >
143
- {/if}
144
- {/if}
145
- <div
146
- class="icon-container"
147
- class:for-modal={variant == InputVariant.Modal}
148
- >
149
- {#if leftIcon}
150
- <Icon
151
- name={leftIcon.name}
152
- size={leftIcon.size ?? Size.Medium}
153
- colour={leftIcon.colour}
154
- float
155
- left={cssLength('0.75rem')}
156
- top={cssLength('50%')}
157
- anchorX={cssLength('0')}
158
- anchorY={cssLength('-50%')}
159
- clickable={!!onLeftIconClick}
160
- onclick={onLeftIconClick}
161
- />
162
- {/if}
163
- <input
164
- hidden
165
- class:left-pad={leftIcon != undefined}
166
- class:right-pad={rightIcon != undefined}
167
- class:for-modal={variant == InputVariant.Modal}
168
- {onblur}
169
- {accept}
170
- {onfocus}
171
- type="file"
172
- bind:this={inputRef}
173
- {placeholder}
174
- {required}
175
- {disabled}
176
- {multiple}
177
- onchange={onPickerChange}
178
- />
179
-
180
- <div
181
- class="file-list"
182
- role="list"
183
- aria-label="Selected files"
184
- >
185
- {#if files.length}
186
- {#each files as file, index (file)}
187
- <FileCard
188
- {file}
189
- ondelete={() => {
190
- files = files.toSpliced(index, 1);
191
- onchange?.(files);
192
- }}
193
- />
194
- {/each}
195
- {:else}
196
- <p>
197
- Drag and Drop or Click to Upload {#if multiple}multiple documents{:else}a document{/if}
198
- </p>
199
- {/if}
200
- </div>
201
- <div class="side">
202
- <Action
203
- colourSet={ColourSet.Secondary}
204
- backgroundColour={Colour['$transparent-0']}
205
- icon={{ name: 'upload' }}
206
- label="Upload"
207
- size={Size.Medium}
208
- onclick={() => {
209
- openPicker();
210
- }}
211
- />
212
- </div>
213
- {#if rightIcon}
214
- <Icon
215
- name={rightIcon.name}
216
- size={rightIcon.size ?? Size.Medium}
217
- colour={rightIcon.colour}
218
- float
219
- right={cssLength(variant == InputVariant.Modal ? '1rem' : '0.5rem')}
220
- top={cssLength('50%')}
221
- anchorX={cssLength('0')}
222
- anchorY={cssLength('-50%')}
223
- clickable={!!onRightIconClick}
224
- onclick={onRightIconClick}
225
- />
226
- {/if}
227
- {#if labelRight}
228
- <span
229
- class="right-label"
230
- class:for-modal={variant == InputVariant.Modal}>{labelRight}</span
231
- >
232
- {/if}
233
- </div>
234
- </label>
235
-
79
+ commit(accepted);
80
+ }
81
+ function ondragover(e) {
82
+ e.preventDefault();
83
+ dragover = true;
84
+ }
85
+ function ondragleave(e) {
86
+ e.preventDefault();
87
+ dragover = false;
88
+ }
89
+ </script>
90
+
91
+ <label
92
+ class:dragover
93
+ class:for-modal={variant === InputVariant.Modal}
94
+ {ondrop}
95
+ {ondragover}
96
+ {ondragleave}
97
+ >
98
+ {#if labelTop && variant !== InputVariant.Modal}
99
+ <span
100
+ class="top-label"
101
+ class:for-default={variant === InputVariant.Default}
102
+ >{labelTop}{#if optional}<i>&nbsp;- optional</i>{/if}</span
103
+ >
104
+ {#if variant === InputVariant.Default}
105
+ <span class="border"
106
+ >{labelTop}{#if optional}<i>&nbsp;- optional</i>{/if}</span
107
+ >
108
+ {/if}
109
+ {/if}
110
+ <div
111
+ class="icon-container"
112
+ class:for-modal={variant == InputVariant.Modal}
113
+ >
114
+ {#if leftIcon}
115
+ <Icon
116
+ name={leftIcon.name}
117
+ size={leftIcon.size ?? Size.Medium}
118
+ colour={leftIcon.colour}
119
+ float
120
+ left={cssLength('0.75rem')}
121
+ top={cssLength('50%')}
122
+ anchorX={cssLength('0')}
123
+ anchorY={cssLength('-50%')}
124
+ clickable={!!onLeftIconClick}
125
+ onclick={onLeftIconClick}
126
+ />
127
+ {/if}
128
+ <input
129
+ hidden
130
+ class:left-pad={leftIcon != undefined}
131
+ class:right-pad={rightIcon != undefined}
132
+ class:for-modal={variant == InputVariant.Modal}
133
+ {onblur}
134
+ {accept}
135
+ {onfocus}
136
+ type="file"
137
+ bind:this={inputRef}
138
+ {placeholder}
139
+ {required}
140
+ {disabled}
141
+ {multiple}
142
+ onchange={onPickerChange}
143
+ />
144
+
145
+ <div
146
+ class="file-list"
147
+ role="list"
148
+ aria-label="Selected files"
149
+ >
150
+ {#if files.length}
151
+ {#each files as file, index (file)}
152
+ <FileCard
153
+ {file}
154
+ ondelete={() => {
155
+ files = files.toSpliced(index, 1);
156
+ onchange?.(files);
157
+ }}
158
+ />
159
+ {/each}
160
+ {:else}
161
+ <p>
162
+ Drag and Drop or Click to Upload {#if multiple}multiple documents{:else}a document{/if}
163
+ </p>
164
+ {/if}
165
+ </div>
166
+ <div class="side">
167
+ <Action
168
+ colourSet={ColourSet.Secondary}
169
+ backgroundColour={Colour['$transparent-0']}
170
+ icon={{ name: 'upload' }}
171
+ label="Upload"
172
+ size={Size.Medium}
173
+ onclick={() => {
174
+ openPicker();
175
+ }}
176
+ />
177
+ </div>
178
+ {#if rightIcon}
179
+ <Icon
180
+ name={rightIcon.name}
181
+ size={rightIcon.size ?? Size.Medium}
182
+ colour={rightIcon.colour}
183
+ float
184
+ right={cssLength(variant == InputVariant.Modal ? '1rem' : '0.5rem')}
185
+ top={cssLength('50%')}
186
+ anchorX={cssLength('0')}
187
+ anchorY={cssLength('-50%')}
188
+ clickable={!!onRightIconClick}
189
+ onclick={onRightIconClick}
190
+ />
191
+ {/if}
192
+ {#if labelRight}
193
+ <span
194
+ class="right-label"
195
+ class:for-modal={variant == InputVariant.Modal}>{labelRight}</span
196
+ >
197
+ {/if}
198
+ </div>
199
+ </label>
200
+
236
201
  <style>input {
237
202
  box-sizing: border-box;
238
203
  height: 100%;
@@ -438,4 +403,4 @@ label {
438
403
 
439
404
  .dragover {
440
405
  background-color: rgba(31, 129, 160, 0.4);
441
- }</style>
406
+ }</style>