@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.
- package/README.md +58 -58
- package/dist/Components/AccordionGroup.svelte +35 -46
- package/dist/Components/AccordionGroupButton.svelte +68 -76
- package/dist/Components/Action.svelte +103 -135
- package/dist/Components/AlertModal.svelte +171 -190
- package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +614 -697
- package/dist/Components/Base/BaseModal.svelte +90 -116
- package/dist/Components/Base/ContextWrapper.svelte +67 -72
- package/dist/Components/Base/Pagination.svelte +173 -196
- package/dist/Components/Base/Snippets.svelte +34 -36
- package/dist/Components/BigRadioSet.svelte +36 -38
- package/dist/Components/Bubble.svelte +78 -101
- package/dist/Components/Button.svelte +175 -208
- package/dist/Components/Checkbox.svelte +75 -86
- package/dist/Components/CollapsibleCard.svelte +72 -87
- package/dist/Components/CollapsibleMenuGroup.svelte +53 -57
- package/dist/Components/ConditionBuilder/ConditionBuilder.svelte +39 -64
- package/dist/Components/Contexts/ContextMenu.svelte +141 -156
- package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
- package/dist/Components/Contexts/ContextMenuOption.svelte +53 -60
- package/dist/Components/Contexts/Toast.svelte +81 -86
- package/dist/Components/Contexts/ToastContainer.svelte +58 -62
- package/dist/Components/Contexts/Tooltip.svelte +36 -37
- package/dist/Components/DataMatrixIcon.svelte +95 -108
- package/dist/Components/DateInput.svelte +118 -146
- package/dist/Components/DatePicker.svelte +255 -294
- package/dist/Components/DesktopModal.svelte +70 -90
- package/dist/Components/Dial.svelte +167 -197
- package/dist/Components/DimensionInput.svelte +124 -169
- package/dist/Components/DragMenu/DragMenuHolder.svelte +98 -114
- package/dist/Components/DragMenu/DraggableCard.svelte +64 -76
- package/dist/Components/FileCard.svelte +21 -24
- package/dist/Components/FileUpload.svelte +190 -225
- package/dist/Components/GridInput.svelte +159 -196
- package/dist/Components/GridInputSet.svelte +24 -29
- package/dist/Components/HorizontalTabGroup.svelte +73 -89
- package/dist/Components/HorizontalTabGroupButton.svelte +40 -44
- package/dist/Components/Icon.svelte +99 -128
- package/dist/Components/Icons.js +357 -357
- package/dist/Components/InfoAlert.svelte +35 -38
- package/dist/Components/LoadingAnimation.svelte +691 -755
- package/dist/Components/LoadingModal.svelte +36 -44
- package/dist/Components/LoadingOverlay.svelte +22 -26
- package/dist/Components/Modal.svelte +204 -254
- package/dist/Components/MultiSelect.svelte +186 -216
- package/dist/Components/Nav/Nav.svelte +94 -110
- package/dist/Components/Nav/NavServiceMenuList.svelte +57 -61
- package/dist/Components/Nav/NavTab.svelte +58 -62
- package/dist/Components/Nav/ServiceMenuItem.svelte +103 -111
- package/dist/Components/Nav/ServicesNav.svelte +72 -79
- package/dist/Components/NumberInput.svelte +121 -155
- package/dist/Components/OptionCards.svelte +62 -73
- package/dist/Components/PageHeading.svelte +23 -25
- package/dist/Components/PasswordInput.svelte +69 -88
- package/dist/Components/PopoverButton.svelte +151 -0
- package/dist/Components/PopoverButton.svelte.d.ts +9 -0
- package/dist/Components/PopoverButtonProps.d.ts +21 -0
- package/dist/Components/PopoverButtonProps.js +1 -0
- package/dist/Components/Portal.svelte +29 -35
- package/dist/Components/ProgressBubble.svelte +91 -106
- package/dist/Components/QuerySelect.svelte +260 -346
- package/dist/Components/SidebarPanel.svelte +34 -36
- package/dist/Components/SingleSelect.svelte +196 -244
- package/dist/Components/StepButton.svelte +65 -70
- package/dist/Components/StepForm.svelte +115 -135
- package/dist/Components/Switch.svelte +57 -69
- package/dist/Components/Table/ARCHITECTURE.md +298 -298
- package/dist/Components/Table/Body/QuickSearchCell.svelte +578 -655
- package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +42 -51
- package/dist/Components/Table/Body/Rows/ColumnList.svelte +42 -58
- package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +403 -442
- package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +51 -78
- package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +165 -184
- package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +110 -123
- package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +134 -160
- package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +190 -231
- package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +82 -104
- package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +52 -87
- package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +122 -150
- package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +132 -159
- package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +190 -236
- package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +173 -211
- package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +204 -244
- package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +140 -177
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +188 -217
- package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +173 -193
- package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +166 -187
- package/dist/Components/Table/Body/Rows/TableRow.svelte +245 -288
- package/dist/Components/Table/Body/TableBody.svelte +141 -154
- package/dist/Components/Table/Headers/HighlightAllHeader.svelte +35 -41
- package/dist/Components/Table/Headers/SelectAllHeader.svelte +24 -30
- package/dist/Components/Table/Headers/TableHead.svelte +348 -402
- package/dist/Components/Table/Misc/ColumnPanel.svelte +37 -39
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte +35 -39
- package/dist/Components/Table/Misc/FilterInput.svelte +556 -619
- package/dist/Components/Table/Misc/FilterPanel.svelte +170 -183
- package/dist/Components/Table/Misc/FilterPanelModal.svelte +25 -31
- package/dist/Components/Table/Misc/ShareViewModal.svelte +252 -281
- package/dist/Components/Table/Misc/SidePanel.svelte +32 -35
- package/dist/Components/Table/Misc/TableConfigurationModal.svelte +574 -629
- package/dist/Components/Table/Misc/TableFooter.svelte +326 -332
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte +134 -140
- package/dist/Components/Table/Misc/TableSidebar.svelte +183 -198
- package/dist/Components/Table/Misc/TableViewDropdown.svelte +83 -103
- package/dist/Components/Table/Misc/ToolboxPanel.svelte +83 -100
- package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +88 -107
- package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +163 -190
- package/dist/Components/Table/NestedTable.svelte +102 -128
- package/dist/Components/Table/Table.svelte +531 -663
- package/dist/Components/Test/TestContextConsumer.svelte +11 -13
- package/dist/Components/TextArea.svelte +95 -130
- package/dist/Components/TextInput.svelte +125 -176
- package/dist/Components/ThreeStateRadio.svelte +111 -130
- package/dist/Components/Touch/BoolCard.svelte +33 -45
- package/dist/Components/Touch/DateModal.svelte +164 -204
- package/dist/Components/Touch/EditCard.svelte +48 -59
- package/dist/Components/Touch/InfoCard.svelte +28 -31
- package/dist/Components/Touch/InfoTextCard.svelte +26 -28
- package/dist/Components/Touch/ModalExplanation.svelte +15 -17
- package/dist/Components/Touch/NumberKeyboard.svelte +181 -218
- package/dist/Components/Touch/NumberModal.svelte +59 -79
- package/dist/Components/Touch/PlusMinusCard.svelte +43 -46
- package/dist/Components/Touch/SelectModal.svelte +111 -126
- package/dist/Components/Touch/SummaryCard.svelte +80 -93
- package/dist/Components/Touch/TextAreaModal.svelte +72 -94
- package/dist/Components/Touch/TextModal.svelte +77 -105
- package/dist/Components/Touch/TouchCard.svelte +31 -33
- package/dist/Components/Touch/TouchModal.svelte +214 -270
- package/dist/Components/Touch/UtilityButton.svelte +88 -109
- package/dist/Components/VerticalTabGroup.svelte +60 -78
- package/dist/Components/VerticalTabGroupButton.svelte +54 -58
- package/dist/Helpers/Datamatrix.d.ts +19 -19
- package/dist/Helpers/Datamatrix.js +291 -291
- package/dist/Types/Examples/ExampleModal.svelte +31 -35
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/scss/_basics.scss +12 -12
- package/dist/scss/_colours.scss +134 -134
- package/dist/scss/_mixins.scss +3392 -3392
- package/dist/scss/_motion.scss +57 -57
- package/dist/scss/_sizing.scss +85 -85
- package/dist/scss/_transitions.scss +8 -8
- package/package.json +1 -1
|
@@ -1,127 +1,101 @@
|
|
|
1
|
-
<svelte:options runes />
|
|
2
|
-
|
|
3
|
-
<!--
|
|
4
|
-
BaseModal.svelte - internal primitive that owns the `<dialog>`
|
|
5
|
-
open/close + Escape/backdrop dismissal + autofocus plumbing
|
|
6
|
-
shared between `Modal`, `DesktopModal`, and `TouchModal`. See
|
|
7
|
-
`BaseModalProps.ts` for the contract.
|
|
8
|
-
|
|
9
|
-
Cosmetic-free for inner content by design: each consumer renders
|
|
10
|
-
its own header / main / footer / button-row markup as
|
|
11
|
-
`{@render children()}`. The consumer also keeps its own
|
|
12
|
-
footer-text rules, scanner shortcut wiring, colourSet button
|
|
13
|
-
styling, etc. - those concerns intentionally do not live in
|
|
14
|
-
BaseModal.
|
|
15
|
-
|
|
16
|
-
The shared dialog SHELL styling (border, backdrop, zoom-in
|
|
17
|
-
animation, the `--dialog-*` size variables and the static-height
|
|
18
|
-
/ static-width / noscroll modifier classes) is included here via
|
|
19
|
-
the `@mixin dialog` SCSS so it is shared across all three
|
|
20
|
-
consumer modals.
|
|
21
|
-
-->
|
|
22
|
-
|
|
23
|
-
<script lang="ts">
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
onclose,
|
|
32
|
-
mandatory = false,
|
|
33
|
-
autofocusSelector,
|
|
34
|
-
ariaLabelledby,
|
|
35
|
-
ariaDescribedby,
|
|
36
|
-
closeOnEscape = true,
|
|
37
|
-
closeOnBackdropClick = true,
|
|
38
|
-
dialogClass,
|
|
39
|
-
dialogStyle,
|
|
40
|
-
}: BaseModalProps = $props();
|
|
41
|
-
|
|
42
|
-
let dialog: HTMLDialogElement | undefined = $state();
|
|
43
|
-
|
|
44
|
-
function tryFocusSelector() {
|
|
45
|
-
if (dialog && autofocusSelector != null && autofocusSelector.length > 0) {
|
|
46
|
-
const target = dialog.querySelector<HTMLElement>(autofocusSelector);
|
|
47
|
-
target?.focus();
|
|
48
|
-
}
|
|
1
|
+
<svelte:options runes />
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
BaseModal.svelte - internal primitive that owns the `<dialog>`
|
|
5
|
+
open/close + Escape/backdrop dismissal + autofocus plumbing
|
|
6
|
+
shared between `Modal`, `DesktopModal`, and `TouchModal`. See
|
|
7
|
+
`BaseModalProps.ts` for the contract.
|
|
8
|
+
|
|
9
|
+
Cosmetic-free for inner content by design: each consumer renders
|
|
10
|
+
its own header / main / footer / button-row markup as
|
|
11
|
+
`{@render children()}`. The consumer also keeps its own
|
|
12
|
+
footer-text rules, scanner shortcut wiring, colourSet button
|
|
13
|
+
styling, etc. - those concerns intentionally do not live in
|
|
14
|
+
BaseModal.
|
|
15
|
+
|
|
16
|
+
The shared dialog SHELL styling (border, backdrop, zoom-in
|
|
17
|
+
animation, the `--dialog-*` size variables and the static-height
|
|
18
|
+
/ static-width / noscroll modifier classes) is included here via
|
|
19
|
+
the `@mixin dialog` SCSS so it is shared across all three
|
|
20
|
+
consumer modals.
|
|
21
|
+
-->
|
|
22
|
+
|
|
23
|
+
<script lang="ts">import { devCatch } from "../../Helpers/Helpers.svelte.js";
|
|
24
|
+
import { onMount, tick } from "svelte";
|
|
25
|
+
let { value = $bindable(true), children, onclose, mandatory = false, autofocusSelector, ariaLabelledby, ariaDescribedby, closeOnEscape = true, closeOnBackdropClick = true, dialogClass, dialogStyle } = $props();
|
|
26
|
+
let dialog = $state();
|
|
27
|
+
function tryFocusSelector() {
|
|
28
|
+
if (dialog && autofocusSelector != null && autofocusSelector.length > 0) {
|
|
29
|
+
const target = dialog.querySelector(autofocusSelector);
|
|
30
|
+
target?.focus();
|
|
49
31
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (dialog && value && !dialog.open) {
|
|
57
|
-
dialog.showModal();
|
|
58
|
-
tryFocusSelector();
|
|
59
|
-
}
|
|
60
|
-
})
|
|
61
|
-
.catch(devCatch);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// React to parent flipping `value` after mount. We do not call
|
|
65
|
-
// showModal/close from inside a $derived because both have
|
|
66
|
-
// side-effects on the DOM; an $effect is the documented home
|
|
67
|
-
// for such bridges.
|
|
68
|
-
$effect(() => {
|
|
69
|
-
if (!dialog) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
if (value && !dialog.open) {
|
|
32
|
+
}
|
|
33
|
+
onMount(() => {
|
|
34
|
+
// HACK tick() helps with Portal shenanigans. Matches the legacy
|
|
35
|
+
// Modal.svelte open-on-mount sequence.
|
|
36
|
+
tick().then(() => {
|
|
37
|
+
if (dialog && value && !dialog.open) {
|
|
73
38
|
dialog.showModal();
|
|
74
39
|
tryFocusSelector();
|
|
75
|
-
} else if (!value && dialog.open) {
|
|
76
|
-
dialog.close();
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
function handleNativeClose() {
|
|
81
|
-
// The dialog closed (native dismiss, our own close(), or Escape).
|
|
82
|
-
// Sync `value` back to false and fire the consumer callback.
|
|
83
|
-
if (value) {
|
|
84
|
-
value = false;
|
|
85
40
|
}
|
|
86
|
-
|
|
41
|
+
}).catch(devCatch);
|
|
42
|
+
});
|
|
43
|
+
// React to parent flipping `value` after mount. We do not call
|
|
44
|
+
// showModal/close from inside a $derived because both have
|
|
45
|
+
// side-effects on the DOM; an $effect is the documented home
|
|
46
|
+
// for such bridges.
|
|
47
|
+
$effect(() => {
|
|
48
|
+
if (!dialog) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (value && !dialog.open) {
|
|
52
|
+
dialog.showModal();
|
|
53
|
+
tryFocusSelector();
|
|
54
|
+
} else if (!value && dialog.open) {
|
|
55
|
+
dialog.close();
|
|
87
56
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
57
|
+
});
|
|
58
|
+
function handleNativeClose() {
|
|
59
|
+
// The dialog closed (native dismiss, our own close(), or Escape).
|
|
60
|
+
// Sync `value` back to false and fire the consumer callback.
|
|
61
|
+
if (value) {
|
|
62
|
+
value = false;
|
|
63
|
+
}
|
|
64
|
+
onclose?.();
|
|
65
|
+
}
|
|
66
|
+
function handleKeydown(e) {
|
|
67
|
+
if (e.key === "Escape") {
|
|
68
|
+
// stopPropagation matches the legacy Modal.svelte behaviour
|
|
69
|
+
// (prevents Escape bubbling out of a nested modal stack).
|
|
70
|
+
e.stopPropagation();
|
|
71
|
+
if (mandatory || !closeOnEscape) {
|
|
72
|
+
e.preventDefault();
|
|
99
73
|
}
|
|
100
74
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
75
|
+
}
|
|
76
|
+
function handleBackdropClick(e) {
|
|
77
|
+
if (e.target === dialog) {
|
|
78
|
+
if (!mandatory && closeOnBackdropClick) {
|
|
79
|
+
dialog.close();
|
|
107
80
|
}
|
|
108
81
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
aria-
|
|
117
|
-
aria-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
82
|
+
}
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<dialog
|
|
86
|
+
bind:this={dialog}
|
|
87
|
+
class={dialogClass}
|
|
88
|
+
style={dialogStyle}
|
|
89
|
+
aria-modal="true"
|
|
90
|
+
aria-labelledby={ariaLabelledby}
|
|
91
|
+
aria-describedby={ariaDescribedby}
|
|
92
|
+
onclose={handleNativeClose}
|
|
93
|
+
onkeydown={handleKeydown}
|
|
94
|
+
onclick={handleBackdropClick}
|
|
95
|
+
>
|
|
96
|
+
{@render children()}
|
|
97
|
+
</dialog>
|
|
98
|
+
|
|
125
99
|
<style>dialog {
|
|
126
100
|
overflow: clip;
|
|
127
101
|
background-color: #e9ecf1;
|
|
@@ -175,4 +149,4 @@ dialog .modal-main.noscroll {
|
|
|
175
149
|
}
|
|
176
150
|
dialog .footer {
|
|
177
151
|
flex-shrink: 0;
|
|
178
|
-
}</style>
|
|
152
|
+
}</style>
|
|
@@ -1,72 +1,67 @@
|
|
|
1
|
-
<svelte:options runes />
|
|
2
|
-
|
|
3
|
-
<!--
|
|
4
|
-
@component
|
|
5
|
-
Application-level wrapper that mounts the global context hosts and
|
|
6
|
-
instantiates the contexts they depend on. Mount it once near the root
|
|
7
|
-
of a SvelteKit app, in `+layout.svelte` or `+page.svelte`, so that
|
|
8
|
-
every descendant can read the contexts via `getContext`.
|
|
9
|
-
|
|
10
|
-
### Hosts mounted
|
|
11
|
-
|
|
12
|
-
| Host | Driving context | Notes |
|
|
13
|
-
| ---------------- | ---------------------- | -------------------------------------------------- |
|
|
14
|
-
| `ContextMenu` | `ContextMenuContext` | Right-click / programmatic menus. |
|
|
15
|
-
| `Tooltip` | `TooltipContext` | Hover tooltips driven by Button / Action. |
|
|
16
|
-
| `ToastContainer` | `ToastContext` | Queue of toast notifications. |
|
|
17
|
-
| `AlertModal` | `AlertContext` | Mounts only when `alertContext.showModal` is true. |
|
|
18
|
-
|
|
19
|
-
`UntypedInputContext` is registered alongside the visual hosts. The
|
|
20
|
-
wrapper installs a `svelte:window onkeydown` listener that forwards
|
|
21
|
-
key events to `untypedListenerContext.handleGlobalKeydown` so barcode
|
|
22
|
-
scanners and similar untyped input sources reach the context queue.
|
|
23
|
-
|
|
24
|
-
### Usage
|
|
25
|
-
|
|
26
|
-
```svelte
|
|
27
|
-
<script lang="ts">
|
|
28
|
-
import { ContextWrapper } from '@lavalogic/scoria';
|
|
29
|
-
</script>
|
|
30
|
-
|
|
31
|
-
<ContextWrapper>
|
|
32
|
-
{@render children()}
|
|
33
|
-
</ContextWrapper>
|
|
34
|
-
```
|
|
35
|
-
-->
|
|
36
|
-
<script lang="ts">
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
{#if alertContext.showModal}
|
|
69
|
-
<AlertModal />
|
|
70
|
-
{/if}
|
|
71
|
-
<svelte:window onkeydown={untypedListenerContext.handleGlobalKeydown} />
|
|
72
|
-
{@render children()}
|
|
1
|
+
<svelte:options runes />
|
|
2
|
+
|
|
3
|
+
<!--
|
|
4
|
+
@component
|
|
5
|
+
Application-level wrapper that mounts the global context hosts and
|
|
6
|
+
instantiates the contexts they depend on. Mount it once near the root
|
|
7
|
+
of a SvelteKit app, in `+layout.svelte` or `+page.svelte`, so that
|
|
8
|
+
every descendant can read the contexts via `getContext`.
|
|
9
|
+
|
|
10
|
+
### Hosts mounted
|
|
11
|
+
|
|
12
|
+
| Host | Driving context | Notes |
|
|
13
|
+
| ---------------- | ---------------------- | -------------------------------------------------- |
|
|
14
|
+
| `ContextMenu` | `ContextMenuContext` | Right-click / programmatic menus. |
|
|
15
|
+
| `Tooltip` | `TooltipContext` | Hover tooltips driven by Button / Action. |
|
|
16
|
+
| `ToastContainer` | `ToastContext` | Queue of toast notifications. |
|
|
17
|
+
| `AlertModal` | `AlertContext` | Mounts only when `alertContext.showModal` is true. |
|
|
18
|
+
|
|
19
|
+
`UntypedInputContext` is registered alongside the visual hosts. The
|
|
20
|
+
wrapper installs a `svelte:window onkeydown` listener that forwards
|
|
21
|
+
key events to `untypedListenerContext.handleGlobalKeydown` so barcode
|
|
22
|
+
scanners and similar untyped input sources reach the context queue.
|
|
23
|
+
|
|
24
|
+
### Usage
|
|
25
|
+
|
|
26
|
+
```svelte
|
|
27
|
+
<script lang="ts">
|
|
28
|
+
import { ContextWrapper } from '@lavalogic/scoria';
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<ContextWrapper>
|
|
32
|
+
{@render children()}
|
|
33
|
+
</ContextWrapper>
|
|
34
|
+
```
|
|
35
|
+
-->
|
|
36
|
+
<script lang="ts">import { AlertContext } from "../../Contexts/AlertContext.svelte.js";
|
|
37
|
+
import { ContextMenuContext } from "../../Contexts/ContextMenuContext.svelte.js";
|
|
38
|
+
import { ToastContext } from "../../Contexts/ToastContext.svelte.js";
|
|
39
|
+
import { TooltipContext } from "../../Contexts/TooltipContext.svelte.js";
|
|
40
|
+
import { UntypedInputContext } from "../../Contexts/UntypedInputContext.svelte.js";
|
|
41
|
+
import { setContext } from "svelte";
|
|
42
|
+
import AlertModal from "../AlertModal.svelte";
|
|
43
|
+
import ContextMenu from "../Contexts/ContextMenu.svelte";
|
|
44
|
+
import ToastContainer from "../Contexts/ToastContainer.svelte";
|
|
45
|
+
import Tooltip from "../Contexts/Tooltip.svelte";
|
|
46
|
+
const { children, debug = false } = $props();
|
|
47
|
+
setContext(ContextMenuContext.identifier, new ContextMenuContext());
|
|
48
|
+
setContext(TooltipContext.identifier, new TooltipContext());
|
|
49
|
+
setContext(ToastContext.identifier, new ToastContext());
|
|
50
|
+
const alertContext = new AlertContext();
|
|
51
|
+
setContext(AlertContext.identifier, alertContext);
|
|
52
|
+
// NOTE known limitation. `debug` is captured at construction time;
|
|
53
|
+
// later prop changes are not propagated to the listener because the
|
|
54
|
+
// keydown handler closes over the constructed context instance.
|
|
55
|
+
// svelte-ignore state_referenced_locally
|
|
56
|
+
const untypedListenerContext = new UntypedInputContext(debug);
|
|
57
|
+
setContext(UntypedInputContext.identifier, untypedListenerContext);
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<ContextMenu />
|
|
61
|
+
<Tooltip />
|
|
62
|
+
<ToastContainer />
|
|
63
|
+
{#if alertContext.showModal}
|
|
64
|
+
<AlertModal />
|
|
65
|
+
{/if}
|
|
66
|
+
<svelte:window onkeydown={untypedListenerContext.handleGlobalKeydown} />
|
|
67
|
+
{@render children()}
|