@lavalogic/scoria 0.40.1 → 0.40.2
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 +46 -46
- package/dist/Components/AccordionGroupButton.svelte +76 -76
- package/dist/Components/Action.svelte +136 -136
- package/dist/Components/AlertModal.svelte +195 -195
- package/dist/Components/AppointmentCalendar/AppointmentCalendar.svelte +729 -729
- package/dist/Components/Base/BaseModal.svelte +125 -125
- package/dist/Components/Base/ContextWrapper.svelte +72 -72
- package/dist/Components/Base/Pagination.svelte +198 -198
- package/dist/Components/Base/Snippets.svelte +36 -36
- package/dist/Components/BigRadioSet.svelte +38 -38
- package/dist/Components/Bubble.svelte +101 -101
- package/dist/Components/Button.svelte +209 -209
- package/dist/Components/Checkbox.svelte +86 -86
- package/dist/Components/CollapsibleCard.svelte +78 -78
- package/dist/Components/Contexts/ContextMenu.svelte +164 -164
- package/dist/Components/Contexts/ContextMenuDivider.svelte +15 -15
- package/dist/Components/Contexts/ContextMenuOption.svelte +60 -60
- package/dist/Components/Contexts/Toast.svelte +86 -86
- package/dist/Components/Contexts/ToastContainer.svelte +65 -65
- package/dist/Components/Contexts/Tooltip.svelte +37 -37
- package/dist/Components/DataMatrixIcon.svelte +112 -112
- package/dist/Components/DateInput.svelte +148 -148
- package/dist/Components/DatePicker.svelte +300 -300
- package/dist/Components/DesktopModal.svelte +90 -90
- package/dist/Components/Dial.svelte +204 -204
- package/dist/Components/DimensionInput.svelte +170 -170
- package/dist/Components/DragMenu/DragMenuHolder.svelte +119 -119
- package/dist/Components/DragMenu/DraggableCard.svelte +77 -77
- package/dist/Components/FileCard.svelte +24 -24
- package/dist/Components/FileUpload.svelte +236 -236
- package/dist/Components/GridInput.svelte +196 -196
- package/dist/Components/GridInputSet.svelte +29 -29
- package/dist/Components/HorizontalTabGroup.svelte +82 -82
- package/dist/Components/HorizontalTabGroupButton.svelte +44 -44
- package/dist/Components/Icon.svelte +128 -128
- package/dist/Components/Icons.js +357 -357
- package/dist/Components/InfoAlert.svelte +35 -35
- package/dist/Components/LoadingAnimation.svelte +29 -29
- package/dist/Components/LoadingModal.svelte +45 -45
- package/dist/Components/LoadingOverlay.svelte +25 -25
- package/dist/Components/Modal.svelte +258 -258
- package/dist/Components/MultiSelect.svelte +220 -220
- package/dist/Components/Nav/Nav.svelte +110 -110
- package/dist/Components/Nav/NavServiceMenuList.svelte +43 -43
- package/dist/Components/Nav/NavTab.svelte +62 -62
- package/dist/Components/Nav/ServiceMenuItem.svelte +112 -112
- package/dist/Components/Nav/ServicesNav.svelte +80 -80
- package/dist/Components/NumberInput.svelte +157 -157
- package/dist/Components/PageHeading.svelte +25 -25
- package/dist/Components/PasswordInput.svelte +88 -88
- package/dist/Components/Portal.svelte +36 -36
- package/dist/Components/ProgressBubble.svelte +107 -107
- package/dist/Components/QuerySelect.svelte +366 -366
- package/dist/Components/SingleSelect.svelte +250 -250
- package/dist/Components/StepButton.svelte +70 -70
- package/dist/Components/StepForm.svelte +140 -140
- package/dist/Components/Switch.svelte +69 -69
- package/dist/Components/Table/ARCHITECTURE.md +298 -298
- package/dist/Components/Table/Body/QuickSearchCell.svelte +679 -679
- package/dist/Components/Table/Body/Rows/ColumnHighlight.svelte +51 -51
- package/dist/Components/Table/Body/Rows/ColumnList.svelte +59 -59
- package/dist/Components/Table/Body/Rows/ColumnListRow.svelte +454 -454
- package/dist/Components/Table/Body/Rows/Columns/AccessorComponent.svelte +79 -79
- package/dist/Components/Table/Body/Rows/Columns/ActionsCell.svelte +185 -185
- package/dist/Components/Table/Body/Rows/Columns/BubbleCell.svelte +124 -124
- package/dist/Components/Table/Body/Rows/Columns/ExpandCell.svelte +131 -120
- package/dist/Components/Table/Body/Rows/Columns/FocusableImmutableCell.svelte +234 -234
- package/dist/Components/Table/Body/Rows/Columns/ProgressCell.svelte +105 -105
- package/dist/Components/Table/Body/Rows/Columns/TableAction.svelte +87 -87
- package/dist/Components/Table/Body/Rows/Columns/TableCheckbox.svelte +126 -126
- package/dist/Components/Table/Body/Rows/Columns/TableColumn.svelte +159 -159
- package/dist/Components/Table/Body/Rows/Columns/TableDatePicker.svelte +246 -246
- package/dist/Components/Table/Body/Rows/Columns/TableNumberInput.svelte +216 -216
- package/dist/Components/Table/Body/Rows/Columns/TableQuerySelect.svelte +252 -252
- package/dist/Components/Table/Body/Rows/Columns/TableRowSelectionCheckbox.svelte +179 -179
- package/dist/Components/Table/Body/Rows/Columns/TableSelect.svelte +221 -221
- package/dist/Components/Table/Body/Rows/Columns/TableTextInput.svelte +197 -197
- package/dist/Components/Table/Body/Rows/Columns/ValidityCell.svelte +190 -190
- package/dist/Components/Table/Body/Rows/TableRow.svelte +290 -290
- package/dist/Components/Table/Body/TableBody.svelte +155 -155
- package/dist/Components/Table/ColumnFactory.svelte.js +1 -0
- package/dist/Components/Table/Headers/HighlightAllHeader.svelte +41 -41
- package/dist/Components/Table/Headers/SelectAllHeader.svelte +30 -30
- package/dist/Components/Table/Headers/TableHead.svelte +415 -415
- package/dist/Components/Table/Misc/ColumnPanel.svelte +39 -39
- package/dist/Components/Table/Misc/ColumnPanelModal.svelte +39 -39
- package/dist/Components/Table/Misc/FilterInput.svelte +641 -641
- package/dist/Components/Table/Misc/FilterPanel.svelte +190 -190
- package/dist/Components/Table/Misc/FilterPanelModal.svelte +31 -31
- package/dist/Components/Table/Misc/ShareViewModal.svelte +291 -291
- package/dist/Components/Table/Misc/SidePanel.svelte +35 -35
- package/dist/Components/Table/Misc/TableConfigurationModal.svelte +644 -644
- package/dist/Components/Table/Misc/TableFooter.svelte +340 -340
- package/dist/Components/Table/Misc/TableHorizontalBar.svelte +140 -140
- package/dist/Components/Table/Misc/TableSidebar.svelte +200 -200
- package/dist/Components/Table/Misc/TableViewDropdown.svelte +105 -105
- package/dist/Components/Table/Misc/ToolboxPanel.svelte +100 -100
- package/dist/Components/Table/Misc/ToolboxPanelModal.svelte +107 -107
- package/dist/Components/Table/Misc/UpdateViewOptionsModal.svelte +192 -192
- package/dist/Components/Table/NestedTable.svelte +130 -130
- package/dist/Components/Table/Table.svelte +692 -692
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.d.ts +5 -0
- package/dist/Components/Table/Types/Columns/Definitions/Expand/ExpandDef.svelte.js +3 -0
- package/dist/Components/Table/Types/Public/ColumnOptions.d.ts +10 -0
- package/dist/Components/Test/TestContextConsumer.svelte +13 -13
- package/dist/Components/TextArea.svelte +130 -130
- package/dist/Components/TextInput.svelte +176 -176
- package/dist/Components/ThreeStateRadio.svelte +131 -131
- package/dist/Components/Touch/BoolCard.svelte +45 -45
- package/dist/Components/Touch/DateModal.svelte +209 -209
- package/dist/Components/Touch/EditCard.svelte +59 -59
- package/dist/Components/Touch/InfoCard.svelte +31 -31
- package/dist/Components/Touch/InfoTextCard.svelte +28 -28
- package/dist/Components/Touch/ModalExplanation.svelte +17 -17
- package/dist/Components/Touch/NumberKeyboard.svelte +225 -225
- package/dist/Components/Touch/NumberModal.svelte +79 -79
- package/dist/Components/Touch/PlusMinusCard.svelte +46 -46
- package/dist/Components/Touch/SelectModal.svelte +127 -127
- package/dist/Components/Touch/SummaryCard.svelte +93 -93
- package/dist/Components/Touch/TextAreaModal.svelte +95 -95
- package/dist/Components/Touch/TextModal.svelte +106 -106
- package/dist/Components/Touch/TouchCard.svelte +33 -33
- package/dist/Components/Touch/TouchModal.svelte +274 -274
- package/dist/Components/Touch/UtilityButton.svelte +109 -109
- package/dist/Components/VerticalTabGroup.svelte +79 -79
- package/dist/Components/VerticalTabGroupButton.svelte +58 -58
- package/dist/Helpers/Datamatrix.d.ts +19 -19
- package/dist/Helpers/Datamatrix.js +291 -291
- package/dist/Types/Examples/ExampleModal.svelte +35 -35
- 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,127 @@
|
|
|
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
|
-
import { devCatch } from '../../Helpers/Helpers.svelte.js';
|
|
25
|
-
import { onMount, tick } from 'svelte';
|
|
26
|
-
import type { BaseModalProps } from './BaseModalProps.js';
|
|
27
|
-
|
|
28
|
-
let {
|
|
29
|
-
value = $bindable(true),
|
|
30
|
-
children,
|
|
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
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
onMount(() => {
|
|
52
|
-
// HACK tick() helps with Portal shenanigans. Matches the legacy
|
|
53
|
-
// Modal.svelte open-on-mount sequence.
|
|
54
|
-
tick()
|
|
55
|
-
.then(() => {
|
|
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) {
|
|
73
|
-
dialog.showModal();
|
|
74
|
-
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
|
-
}
|
|
86
|
-
onclose?.();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function handleKeydown(e: KeyboardEvent) {
|
|
90
|
-
if (e.key === 'Escape') {
|
|
91
|
-
// stopPropagation matches the legacy Modal.svelte behaviour
|
|
92
|
-
// (prevents Escape bubbling out of a nested modal stack).
|
|
93
|
-
e.stopPropagation();
|
|
94
|
-
if (mandatory || !closeOnEscape) {
|
|
95
|
-
e.preventDefault();
|
|
96
|
-
}
|
|
97
|
-
// otherwise let the browser-native Escape close the dialog,
|
|
98
|
-
// which fires the `close` event and `handleNativeClose`.
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function handleBackdropClick(e: MouseEvent) {
|
|
103
|
-
if (e.target === dialog) {
|
|
104
|
-
if (!mandatory && closeOnBackdropClick) {
|
|
105
|
-
dialog.close();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
</script>
|
|
110
|
-
|
|
111
|
-
<dialog
|
|
112
|
-
bind:this={dialog}
|
|
113
|
-
class={dialogClass}
|
|
114
|
-
style={dialogStyle}
|
|
115
|
-
aria-modal="true"
|
|
116
|
-
aria-labelledby={ariaLabelledby}
|
|
117
|
-
aria-describedby={ariaDescribedby}
|
|
118
|
-
onclose={handleNativeClose}
|
|
119
|
-
onkeydown={handleKeydown}
|
|
120
|
-
onclick={handleBackdropClick}
|
|
121
|
-
>
|
|
122
|
-
{@render children()}
|
|
123
|
-
</dialog>
|
|
124
|
-
|
|
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
|
+
import { devCatch } from '../../Helpers/Helpers.svelte.js';
|
|
25
|
+
import { onMount, tick } from 'svelte';
|
|
26
|
+
import type { BaseModalProps } from './BaseModalProps.js';
|
|
27
|
+
|
|
28
|
+
let {
|
|
29
|
+
value = $bindable(true),
|
|
30
|
+
children,
|
|
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
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
onMount(() => {
|
|
52
|
+
// HACK tick() helps with Portal shenanigans. Matches the legacy
|
|
53
|
+
// Modal.svelte open-on-mount sequence.
|
|
54
|
+
tick()
|
|
55
|
+
.then(() => {
|
|
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) {
|
|
73
|
+
dialog.showModal();
|
|
74
|
+
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
|
+
}
|
|
86
|
+
onclose?.();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
90
|
+
if (e.key === 'Escape') {
|
|
91
|
+
// stopPropagation matches the legacy Modal.svelte behaviour
|
|
92
|
+
// (prevents Escape bubbling out of a nested modal stack).
|
|
93
|
+
e.stopPropagation();
|
|
94
|
+
if (mandatory || !closeOnEscape) {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
}
|
|
97
|
+
// otherwise let the browser-native Escape close the dialog,
|
|
98
|
+
// which fires the `close` event and `handleNativeClose`.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function handleBackdropClick(e: MouseEvent) {
|
|
103
|
+
if (e.target === dialog) {
|
|
104
|
+
if (!mandatory && closeOnBackdropClick) {
|
|
105
|
+
dialog.close();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
</script>
|
|
110
|
+
|
|
111
|
+
<dialog
|
|
112
|
+
bind:this={dialog}
|
|
113
|
+
class={dialogClass}
|
|
114
|
+
style={dialogStyle}
|
|
115
|
+
aria-modal="true"
|
|
116
|
+
aria-labelledby={ariaLabelledby}
|
|
117
|
+
aria-describedby={ariaDescribedby}
|
|
118
|
+
onclose={handleNativeClose}
|
|
119
|
+
onkeydown={handleKeydown}
|
|
120
|
+
onclick={handleBackdropClick}
|
|
121
|
+
>
|
|
122
|
+
{@render children()}
|
|
123
|
+
</dialog>
|
|
124
|
+
|
|
125
125
|
<style>dialog {
|
|
126
126
|
overflow: clip;
|
|
127
127
|
background-color: #e9ecf1;
|
|
@@ -175,4 +175,4 @@ dialog .modal-main.noscroll {
|
|
|
175
175
|
}
|
|
176
176
|
dialog .footer {
|
|
177
177
|
flex-shrink: 0;
|
|
178
|
-
}</style>
|
|
178
|
+
}</style>
|
|
@@ -1,72 +1,72 @@
|
|
|
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
|
-
import { AlertContext } from '../../Contexts/AlertContext.svelte.js';
|
|
38
|
-
import { ContextMenuContext } from '../../Contexts/ContextMenuContext.svelte.js';
|
|
39
|
-
import { ToastContext } from '../../Contexts/ToastContext.svelte.js';
|
|
40
|
-
import { TooltipContext } from '../../Contexts/TooltipContext.svelte.js';
|
|
41
|
-
import { UntypedInputContext } from '../../Contexts/UntypedInputContext.svelte.js';
|
|
42
|
-
import { setContext } from 'svelte';
|
|
43
|
-
import AlertModal from '../AlertModal.svelte';
|
|
44
|
-
import ContextMenu from '../Contexts/ContextMenu.svelte';
|
|
45
|
-
import ToastContainer from '../Contexts/ToastContainer.svelte';
|
|
46
|
-
import Tooltip from '../Contexts/Tooltip.svelte';
|
|
47
|
-
import type { ContextWrapperProps } from './ContextWrapperProps.js';
|
|
48
|
-
|
|
49
|
-
const { children, debug = false }: ContextWrapperProps = $props();
|
|
50
|
-
|
|
51
|
-
setContext(ContextMenuContext.identifier, new ContextMenuContext());
|
|
52
|
-
setContext(TooltipContext.identifier, new TooltipContext());
|
|
53
|
-
setContext(ToastContext.identifier, new ToastContext());
|
|
54
|
-
const alertContext = new AlertContext();
|
|
55
|
-
setContext(AlertContext.identifier, alertContext);
|
|
56
|
-
|
|
57
|
-
// NOTE known limitation. `debug` is captured at construction time;
|
|
58
|
-
// later prop changes are not propagated to the listener because the
|
|
59
|
-
// keydown handler closes over the constructed context instance.
|
|
60
|
-
// svelte-ignore state_referenced_locally
|
|
61
|
-
const untypedListenerContext = new UntypedInputContext(debug);
|
|
62
|
-
setContext(UntypedInputContext.identifier, untypedListenerContext);
|
|
63
|
-
</script>
|
|
64
|
-
|
|
65
|
-
<ContextMenu />
|
|
66
|
-
<Tooltip />
|
|
67
|
-
<ToastContainer />
|
|
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">
|
|
37
|
+
import { AlertContext } from '../../Contexts/AlertContext.svelte.js';
|
|
38
|
+
import { ContextMenuContext } from '../../Contexts/ContextMenuContext.svelte.js';
|
|
39
|
+
import { ToastContext } from '../../Contexts/ToastContext.svelte.js';
|
|
40
|
+
import { TooltipContext } from '../../Contexts/TooltipContext.svelte.js';
|
|
41
|
+
import { UntypedInputContext } from '../../Contexts/UntypedInputContext.svelte.js';
|
|
42
|
+
import { setContext } from 'svelte';
|
|
43
|
+
import AlertModal from '../AlertModal.svelte';
|
|
44
|
+
import ContextMenu from '../Contexts/ContextMenu.svelte';
|
|
45
|
+
import ToastContainer from '../Contexts/ToastContainer.svelte';
|
|
46
|
+
import Tooltip from '../Contexts/Tooltip.svelte';
|
|
47
|
+
import type { ContextWrapperProps } from './ContextWrapperProps.js';
|
|
48
|
+
|
|
49
|
+
const { children, debug = false }: ContextWrapperProps = $props();
|
|
50
|
+
|
|
51
|
+
setContext(ContextMenuContext.identifier, new ContextMenuContext());
|
|
52
|
+
setContext(TooltipContext.identifier, new TooltipContext());
|
|
53
|
+
setContext(ToastContext.identifier, new ToastContext());
|
|
54
|
+
const alertContext = new AlertContext();
|
|
55
|
+
setContext(AlertContext.identifier, alertContext);
|
|
56
|
+
|
|
57
|
+
// NOTE known limitation. `debug` is captured at construction time;
|
|
58
|
+
// later prop changes are not propagated to the listener because the
|
|
59
|
+
// keydown handler closes over the constructed context instance.
|
|
60
|
+
// svelte-ignore state_referenced_locally
|
|
61
|
+
const untypedListenerContext = new UntypedInputContext(debug);
|
|
62
|
+
setContext(UntypedInputContext.identifier, untypedListenerContext);
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<ContextMenu />
|
|
66
|
+
<Tooltip />
|
|
67
|
+
<ToastContainer />
|
|
68
|
+
{#if alertContext.showModal}
|
|
69
|
+
<AlertModal />
|
|
70
|
+
{/if}
|
|
71
|
+
<svelte:window onkeydown={untypedListenerContext.handleGlobalKeydown} />
|
|
72
|
+
{@render children()}
|