@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,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>