@lavalogic/scoria 0.40.14 → 0.40.16

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 (141) 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 -86
  16. package/dist/Components/CollapsibleMenuGroup.svelte +52 -56
  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 +69 -82
  56. package/dist/Components/Portal.svelte +29 -35
  57. package/dist/Components/ProgressBubble.svelte +91 -106
  58. package/dist/Components/QuerySelect.svelte +260 -346
  59. package/dist/Components/SidebarPanel.svelte +34 -36
  60. package/dist/Components/SingleSelect.svelte +196 -244
  61. package/dist/Components/StepButton.svelte +65 -70
  62. package/dist/Components/StepForm.svelte +115 -135
  63. package/dist/Components/Switch.svelte +57 -69
  64. package/dist/Components/Table/ARCHITECTURE.md +298 -298
  65. package/dist/Components/Table/Body/QuickSearchCell.svelte +578 -655
  66. package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +42 -51
  67. package/dist/Components/Table/Body/Rows/ColumnList.svelte +42 -58
  68. package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +403 -442
  69. package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +51 -78
  70. package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +165 -184
  71. package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +110 -123
  72. package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +134 -160
  73. package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +190 -231
  74. package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +82 -104
  75. package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +52 -87
  76. package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +122 -150
  77. package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +132 -159
  78. package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +190 -236
  79. package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +173 -211
  80. package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +204 -244
  81. package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +140 -177
  82. package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +188 -217
  83. package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +173 -193
  84. package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +166 -187
  85. package/dist/Components/Table/Body/Rows/TableRow.svelte +245 -288
  86. package/dist/Components/Table/Body/TableBody.svelte +141 -154
  87. package/dist/Components/Table/ColumnFactory.svelte.js +1 -0
  88. package/dist/Components/Table/Headers/HighlightAllHeader.svelte +35 -41
  89. package/dist/Components/Table/Headers/SelectAllHeader.svelte +24 -30
  90. package/dist/Components/Table/Headers/TableHead.svelte +348 -402
  91. package/dist/Components/Table/Misc/ColumnPanel.svelte +37 -39
  92. package/dist/Components/Table/Misc/ColumnPanelModal.svelte +35 -39
  93. package/dist/Components/Table/Misc/FilterInput.svelte +556 -619
  94. package/dist/Components/Table/Misc/FilterPanel.svelte +170 -183
  95. package/dist/Components/Table/Misc/FilterPanelModal.svelte +25 -31
  96. package/dist/Components/Table/Misc/ShareViewModal.svelte +252 -281
  97. package/dist/Components/Table/Misc/SidePanel.svelte +32 -35
  98. package/dist/Components/Table/Misc/TableConfigurationModal.svelte +574 -629
  99. package/dist/Components/Table/Misc/TableFooter.svelte +326 -332
  100. package/dist/Components/Table/Misc/TableHorizontalBar.svelte +134 -140
  101. package/dist/Components/Table/Misc/TableSidebar.svelte +183 -198
  102. package/dist/Components/Table/Misc/TableViewDropdown.svelte +83 -103
  103. package/dist/Components/Table/Misc/ToolboxPanel.svelte +83 -100
  104. package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +88 -107
  105. package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +163 -190
  106. package/dist/Components/Table/NestedTable.svelte +102 -128
  107. package/dist/Components/Table/Table.svelte +531 -663
  108. package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.d.ts +8 -6
  109. package/dist/Components/Table/Types/Columns/Definitions/Actions/ActionsDef.svelte.js +3 -3
  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/scss/_basics.scss +12 -12
  136. package/dist/scss/_colours.scss +134 -134
  137. package/dist/scss/_mixins.scss +3392 -3392
  138. package/dist/scss/_motion.scss +57 -57
  139. package/dist/scss/_sizing.scss +85 -85
  140. package/dist/scss/_transitions.scss +8 -8
  141. package/package.json +1 -1
@@ -1,72 +1,67 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- generics="Args"
6
- >
7
- import { useAsyncFlag } from '../Helpers/AsyncFlag.svelte.js';
8
- import { useTooltip } from '../Helpers/useTooltip.svelte.js';
9
- import { Colour } from '../scss/colours.js';
10
- import { Side } from '../Types/Internal/Side.js';
11
- import { Size } from '../Types/Internal/Size.js';
12
- import Icon from './Icon.svelte';
13
- import type { StepButtonProps } from './StepButtonProps.js';
14
-
15
- const { option, selected, index }: StepButtonProps<Args> = $props();
16
-
17
- const isValid = useAsyncFlag(() => option.isValid, true);
18
- const disabled = useAsyncFlag(() => option.disabled, false);
19
- const visible = useAsyncFlag(() => option.visible, true);
20
-
21
- // Shared tooltip lifecycle: hover handlers plus unmount-time teardown
22
- // (load-bearing because StepButton lives inside StepForm which
23
- // re-renders the tab strip on every step change).
24
- const tt = useTooltip({
25
- text: () => option.label,
26
- arrow: () => Side.Top,
27
- });
28
- </script>
29
-
30
- <button
31
- class:selected
32
- disabled={disabled.value}
33
- onclick={() => {
34
- option.onclick();
35
- }}
36
- type="button"
37
- class="tab"
38
- class:invalid={!isValid.value}
39
- class:hidden={!visible.value}
40
- onmouseenter={tt.onmouseenter}
41
- onmouseleave={tt.onmouseleave}
42
- >
43
- <div
44
- class="bordered"
45
- class:invalid={!isValid.value}
46
- >
47
- {#if option.iconLeft}
48
- <Icon
49
- {...option.iconLeft}
50
- colour={Colour['$brand-primary']}
51
- />
52
- {/if}
53
- {index + 1}
54
- {#if !isValid.value}
55
- <Icon
56
- name="error"
57
- colour={Colour['$error-border']}
58
- size={Size.Small}
59
- />
60
- {:else if option.iconRight}
61
- <Icon
62
- colour={Colour['$brand-primary']}
63
- size={Size.Small}
64
- {...option.iconRight}
65
- />
66
- {/if}
67
- </div>
68
- </button>
69
-
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="Args"
6
+ >import { useAsyncFlag } from "../Helpers/AsyncFlag.svelte.js";
7
+ import { useTooltip } from "../Helpers/useTooltip.svelte.js";
8
+ import { Colour } from "../scss/colours.js";
9
+ import { Side } from "../Types/Internal/Side.js";
10
+ import { Size } from "../Types/Internal/Size.js";
11
+ import Icon from "./Icon.svelte";
12
+ const { option, selected, index } = $props();
13
+ const isValid = useAsyncFlag(() => option.isValid, true);
14
+ const disabled = useAsyncFlag(() => option.disabled, false);
15
+ const visible = useAsyncFlag(() => option.visible, true);
16
+ // Shared tooltip lifecycle: hover handlers plus unmount-time teardown
17
+ // (load-bearing because StepButton lives inside StepForm which
18
+ // re-renders the tab strip on every step change).
19
+ const tt = useTooltip({
20
+ text: () => option.label,
21
+ arrow: () => Side.Top
22
+ });
23
+ </script>
24
+
25
+ <button
26
+ class:selected
27
+ disabled={disabled.value}
28
+ onclick={() => {
29
+ option.onclick();
30
+ }}
31
+ type="button"
32
+ class="tab"
33
+ class:invalid={!isValid.value}
34
+ class:hidden={!visible.value}
35
+ onmouseenter={tt.onmouseenter}
36
+ onmouseleave={tt.onmouseleave}
37
+ >
38
+ <div
39
+ class="bordered"
40
+ class:invalid={!isValid.value}
41
+ >
42
+ {#if option.iconLeft}
43
+ <Icon
44
+ {...option.iconLeft}
45
+ colour={Colour['$brand-primary']}
46
+ />
47
+ {/if}
48
+ {index + 1}
49
+ {#if !isValid.value}
50
+ <Icon
51
+ name="error"
52
+ colour={Colour['$error-border']}
53
+ size={Size.Small}
54
+ />
55
+ {:else if option.iconRight}
56
+ <Icon
57
+ colour={Colour['$brand-primary']}
58
+ size={Size.Small}
59
+ {...option.iconRight}
60
+ />
61
+ {/if}
62
+ </div>
63
+ </button>
64
+
70
65
  <style>button.tab.hidden {
71
66
  display: none !important;
72
67
  }
@@ -107,4 +102,4 @@
107
102
  color: #aa1414;
108
103
  border-color: #aa1414;
109
104
  background-color: #f9e9e9;
110
- }</style>
105
+ }</style>
@@ -1,142 +1,122 @@
1
- <svelte:options runes />
2
-
3
- <script
4
- lang="ts"
5
- generics="CommonDenominator"
6
- >
7
- import { readJSON } from '../Helpers/Storage.js';
8
- import { ColourSet } from '../scss/colours.js';
9
- import { Size } from '../Types/Internal/Size.js';
10
- import { onMount, untrack } from 'svelte';
11
- import Button from './Button.svelte';
12
- import StepButton from './StepButton.svelte';
13
- import type { StepFormProps } from './StepFormProps.js';
14
-
15
- const {
16
- name,
17
- steps,
18
- currentStep,
19
- noscroll = false,
20
- noStepMessage = 'No Step Selected',
21
- }: StepFormProps<CommonDenominator> = $props();
22
-
23
- const isNonEmptyString = (raw: unknown): raw is string =>
24
- typeof raw === 'string' && raw.length > 0;
25
-
26
- const storageKey = (key: string): string => `scoria-step-form:${key}:active-step`;
27
-
28
- onMount(() => {
29
- if (name) {
30
- const tabName = readJSON(sessionStorage, storageKey(name), isNonEmptyString, '');
31
- if (tabName) {
32
- steps.find((it) => it.label === tabName)?.onclick();
33
- }
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="CommonDenominator"
6
+ >import { readJSON } from "../Helpers/Storage.js";
7
+ import { ColourSet } from "../scss/colours.js";
8
+ import { Size } from "../Types/Internal/Size.js";
9
+ import { onMount, untrack } from "svelte";
10
+ import Button from "./Button.svelte";
11
+ import StepButton from "./StepButton.svelte";
12
+ const { name, steps, currentStep, noscroll = false, noStepMessage = "No Step Selected" } = $props();
13
+ const isNonEmptyString = (raw) => typeof raw === "string" && raw.length > 0;
14
+ const storageKey = (key) => `scoria-step-form:${key}:active-step`;
15
+ onMount(() => {
16
+ if (name) {
17
+ const tabName = readJSON(sessionStorage, storageKey(name), isNonEmptyString, "");
18
+ if (tabName) {
19
+ steps.find((it) => it.label === tabName)?.onclick();
34
20
  }
35
- });
36
-
37
- const indexOfCurrent = $derived(currentStep ? steps.indexOf(currentStep) : -1);
38
-
39
- const isReachable = (step: { disabled?: unknown; visible?: unknown } | undefined): boolean => {
40
- if (step == null) {
41
- return true;
21
+ }
22
+ });
23
+ const indexOfCurrent = $derived(currentStep ? steps.indexOf(currentStep) : -1);
24
+ const isReachable = (step) => {
25
+ if (step == null) {
26
+ return true;
27
+ }
28
+ // disabled may be a Promise; treat anything non-strictly-true as "reachable"
29
+ const disabled = step.disabled;
30
+ const visible = step.visible;
31
+ const isDisabled = disabled === true;
32
+ const isHidden = visible === false;
33
+ return !isDisabled && !isHidden;
34
+ };
35
+ const previous = $derived.by(() => {
36
+ for (let i = indexOfCurrent - 1; i > -1; i--) {
37
+ const candidate = steps.at(i);
38
+ if (candidate == null) {
39
+ return null;
42
40
  }
43
- // disabled may be a Promise; treat anything non-strictly-true as "reachable"
44
- const disabled = step.disabled;
45
- const visible = step.visible;
46
- const isDisabled = disabled === true;
47
- const isHidden = visible === false;
48
- return !isDisabled && !isHidden;
49
- };
50
-
51
- const previous = $derived.by(() => {
52
- for (let i = indexOfCurrent - 1; i > -1; i--) {
53
- const candidate = steps.at(i);
54
- if (candidate == null) {
55
- return null;
56
- }
57
- if (isReachable(candidate)) {
58
- return candidate;
59
- }
41
+ if (isReachable(candidate)) {
42
+ return candidate;
60
43
  }
61
- return null;
62
- });
63
-
64
- const next = $derived.by(() => {
65
- for (let i = indexOfCurrent + 1; i < steps.length; i++) {
66
- const candidate = steps.at(i);
67
- if (candidate == null) {
68
- return null;
69
- }
70
- if (isReachable(candidate)) {
71
- return candidate;
72
- }
44
+ }
45
+ return null;
46
+ });
47
+ const next = $derived.by(() => {
48
+ for (let i = indexOfCurrent + 1; i < steps.length; i++) {
49
+ const candidate = steps.at(i);
50
+ if (candidate == null) {
51
+ return null;
73
52
  }
74
- return null;
75
- });
76
-
77
- $effect(() => {
78
- if (name && currentStep) {
79
- untrack(() => {
80
- try {
81
- sessionStorage.setItem(storageKey(name), JSON.stringify(currentStep.label));
82
- } catch {
83
- // storage unavailable (private browsing, quota); persistence is best-effort
84
- }
85
- });
53
+ if (isReachable(candidate)) {
54
+ return candidate;
86
55
  }
87
- });
88
- </script>
89
-
90
- <div
91
- class:noscroll
92
- class="wrapper"
93
- >
94
- <div class="tabs">
95
- {#each steps as option, index (option.label)}
96
- <StepButton
97
- {option}
98
- {index}
99
- selected={currentStep?.label === option.label}
100
- />
101
- {/each}
102
- <div class="divider"></div>
103
-
104
- <div class="steps">
105
- <Button
106
- size={Size.Small}
107
- fullWidth
108
- disabled={!previous}
109
- onclick={() => {
110
- previous?.onclick();
111
- }}
112
- colourSet={ColourSet.Secondary}>Previous</Button
113
- >
114
- <Button
115
- size={Size.Small}
116
- fullWidth
117
- onclick={() => {
118
- next?.onclick();
119
- }}
120
- disabled={!next}
121
- colourSet={ColourSet.Primary}>Next</Button
122
- >
123
- </div>
124
- </div>
125
-
126
- <div
127
- class:noscroll
128
- class="content"
129
- >
130
- {#if currentStep}
131
- {@render currentStep.content(currentStep.args)}
132
- {:else}
133
- <div class="wrapper bg">
134
- <span class="red">{noStepMessage}</span>
135
- </div>
136
- {/if}
137
- </div>
138
- </div>
139
-
56
+ }
57
+ return null;
58
+ });
59
+ $effect(() => {
60
+ if (name && currentStep) {
61
+ untrack(() => {
62
+ try {
63
+ sessionStorage.setItem(storageKey(name), JSON.stringify(currentStep.label));
64
+ } catch {}
65
+ });
66
+ }
67
+ });
68
+ </script>
69
+
70
+ <div
71
+ class:noscroll
72
+ class="wrapper"
73
+ >
74
+ <div class="tabs">
75
+ {#each steps as option, index (option.label)}
76
+ <StepButton
77
+ {option}
78
+ {index}
79
+ selected={currentStep?.label === option.label}
80
+ />
81
+ {/each}
82
+ <div class="divider"></div>
83
+
84
+ <div class="steps">
85
+ <Button
86
+ size={Size.Small}
87
+ fullWidth
88
+ disabled={!previous}
89
+ onclick={() => {
90
+ previous?.onclick();
91
+ }}
92
+ colourSet={ColourSet.Secondary}>Previous</Button
93
+ >
94
+ <Button
95
+ size={Size.Small}
96
+ fullWidth
97
+ onclick={() => {
98
+ next?.onclick();
99
+ }}
100
+ disabled={!next}
101
+ colourSet={ColourSet.Primary}>Next</Button
102
+ >
103
+ </div>
104
+ </div>
105
+
106
+ <div
107
+ class:noscroll
108
+ class="content"
109
+ >
110
+ {#if currentStep}
111
+ {@render currentStep.content(currentStep.args)}
112
+ {:else}
113
+ <div class="wrapper bg">
114
+ <span class="red">{noStepMessage}</span>
115
+ </div>
116
+ {/if}
117
+ </div>
118
+ </div>
119
+
140
120
  <style>.bg {
141
121
  padding: 1.5rem;
142
122
  background-color: #f9e9e9;
@@ -192,4 +172,4 @@
192
172
  }
193
173
  .wrapper .content.noscroll {
194
174
  overflow: visible;
195
- }</style>
175
+ }</style>
@@ -1,71 +1,59 @@
1
- <svelte:options runes />
2
-
3
- <script lang="ts">
4
- import { generateWeakId } from '../Helpers/Helpers.svelte.js';
5
- import type { SwitchProps } from './SwitchProps.js';
6
-
7
- let {
8
- value = $bindable(false),
9
- id = generateWeakId(),
10
- label,
11
- disabled,
12
- isValid,
13
- onchange,
14
- }: SwitchProps = $props();
15
-
16
- let mirror: HTMLInputElement | undefined = $state();
17
-
18
- const toggle = () => {
19
- if (disabled) {
20
- return;
21
- }
22
- const next = !value;
23
- value = next;
24
- if (mirror && onchange) {
25
- mirror.checked = next;
26
- mirror.dispatchEvent(new Event('change', { bubbles: true }));
27
- }
28
- };
29
- </script>
30
-
31
- <div class="switch-wrapper">
32
- <button
33
- {id}
34
- class="text-label"
35
- class:invalid={isValid === false}
36
- type="button"
37
- role="switch"
38
- aria-checked={value}
39
- aria-label={label}
40
- onclick={toggle}
41
- {disabled}
42
- >
43
- <span>{label}</span>
44
-
45
- <div class="switch">
46
- <div
47
- class="switch-inner"
48
- class:on={value}
49
- >
50
- <div
51
- class="track"
52
- class:on={value}
53
- ></div>
54
- </div>
55
- </div>
56
- </button>
57
-
58
- <input
59
- name={id}
60
- {onchange}
61
- type="checkbox"
62
- tabindex="-1"
63
- aria-hidden="true"
64
- checked={value}
65
- bind:this={mirror}
66
- />
67
- </div>
68
-
1
+ <svelte:options runes />
2
+
3
+ <script lang="ts">import { generateWeakId } from "../Helpers/Helpers.svelte.js";
4
+ let { value = $bindable(false), id = generateWeakId(), label, disabled, isValid, onchange } = $props();
5
+ let mirror = $state();
6
+ const toggle = () => {
7
+ if (disabled) {
8
+ return;
9
+ }
10
+ const next = !value;
11
+ value = next;
12
+ if (mirror && onchange) {
13
+ mirror.checked = next;
14
+ mirror.dispatchEvent(new Event("change", { bubbles: true }));
15
+ }
16
+ };
17
+ </script>
18
+
19
+ <div class="switch-wrapper">
20
+ <button
21
+ {id}
22
+ class="text-label"
23
+ class:invalid={isValid === false}
24
+ type="button"
25
+ role="switch"
26
+ aria-checked={value}
27
+ aria-label={label}
28
+ onclick={toggle}
29
+ {disabled}
30
+ >
31
+ <span>{label}</span>
32
+
33
+ <div class="switch">
34
+ <div
35
+ class="switch-inner"
36
+ class:on={value}
37
+ >
38
+ <div
39
+ class="track"
40
+ class:on={value}
41
+ ></div>
42
+ </div>
43
+ </div>
44
+ </button>
45
+
46
+ <input
47
+ name={id}
48
+ {onchange}
49
+ type="checkbox"
50
+ tabindex="-1"
51
+ aria-hidden="true"
52
+ checked={value}
53
+ bind:this={mirror}
54
+ />
55
+ </div>
56
+
69
57
  <style>.switch-wrapper {
70
58
  display: contents;
71
59
  }
@@ -174,4 +162,4 @@
174
162
 
175
163
  input {
176
164
  display: none;
177
- }</style>
165
+ }</style>