sh3-core 0.15.4 → 0.16.1
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/dist/BrandSlot.svelte +9 -9
- package/dist/{Shell.svelte → Sh3.svelte} +65 -65
- package/dist/Sh3.svelte.d.ts +5 -0
- package/dist/__test__/render.js +1 -1
- package/dist/actions/ActionPanel.svelte +3 -3
- package/dist/actions/CommandPalette.svelte +2 -2
- package/dist/actions/MenuBar.svelte +1 -1
- package/dist/actions/MenuBar.test.js +1 -1
- package/dist/actions/MenuButton.svelte +3 -3
- package/dist/actions/dispatcher.svelte.js +1 -1
- package/dist/actions/listActive.js +1 -1
- package/dist/actions/listeners.js +6 -6
- package/dist/actions/selection.svelte.d.ts +2 -2
- package/dist/actions/selection.svelte.js +4 -4
- package/dist/actions/selection.test.js +1 -1
- package/dist/actions/{shellActions.test.js → sh3Actions.test.js} +14 -14
- package/dist/actions/state.svelte.d.ts +3 -3
- package/dist/actions/state.svelte.js +3 -3
- package/dist/actions/syncMountedViewIds.test.js +1 -1
- package/dist/actions/types.d.ts +1 -1
- package/dist/api.d.ts +5 -5
- package/dist/api.js +7 -7
- package/dist/app/admin/ApiKeysView.svelte +9 -9
- package/dist/app/admin/AuthSettingsView.svelte +6 -6
- package/dist/app/admin/SystemView.svelte +12 -12
- package/dist/app/admin/UsersView.svelte +8 -8
- package/dist/app/store/AppUpdateAvailableModal.svelte +14 -14
- package/dist/app/store/PermissionConfirmModal.svelte +20 -20
- package/dist/app/store/StoreView.svelte +51 -51
- package/dist/app/store/UninstallAppDialog.svelte +14 -14
- package/dist/app/store/storeShard.svelte.js +1 -1
- package/dist/app/store/verbs.js +1 -1
- package/dist/apps/lifecycle.d.ts +1 -1
- package/dist/apps/lifecycle.js +4 -4
- package/dist/apps/lifecycle.test.js +5 -5
- package/dist/apps/registry.svelte.d.ts +2 -2
- package/dist/apps/registry.svelte.js +3 -3
- package/dist/apps/types.d.ts +1 -1
- package/dist/auth/GuestBanner.svelte +19 -19
- package/dist/auth/SignInWall.svelte +17 -17
- package/dist/auth/auth.svelte.d.ts +1 -1
- package/dist/auth/auth.svelte.js +1 -1
- package/dist/boot/satellitePayload.js +1 -1
- package/dist/build.d.ts +27 -0
- package/dist/build.js +59 -1
- package/dist/build.test.js +31 -0
- package/dist/color/api.d.ts +1 -1
- package/dist/color/api.js +1 -1
- package/dist/color/{shell-api.js → sh3-api.js} +3 -3
- package/dist/conflicts/ConflictModal.svelte +1 -1
- package/dist/conflicts/ConflictModal.svelte.d.ts +1 -1
- package/dist/conflicts/DetailView.svelte +19 -19
- package/dist/conflicts/PromptView.svelte +9 -9
- package/dist/conflicts/adapter-documents.js +1 -1
- package/dist/conflicts/api.d.ts +1 -1
- package/dist/conflicts/api.js +2 -2
- package/dist/conflicts/renderer-registry.js +1 -1
- package/dist/conflicts/renderers/MetaOnlyRenderer.svelte +8 -8
- package/dist/conflicts/renderers/TextDiffRenderer.svelte +15 -15
- package/dist/conflicts/renderers/index.js +1 -1
- package/dist/conflicts/resolve-primitive.js +1 -1
- package/dist/conflicts/{shell-api.js → sh3-api.js} +2 -2
- package/dist/contributions/registry.js +1 -1
- package/dist/createShell.d.ts +2 -2
- package/dist/createShell.js +6 -6
- package/dist/host-entry.d.ts +1 -1
- package/dist/host-entry.js +2 -2
- package/dist/host.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/keys/ConsentDialog.svelte +15 -15
- package/dist/keys/consent.svelte.d.ts +2 -2
- package/dist/keys/consent.svelte.js +3 -3
- package/dist/keys/revocation-bus.svelte.d.ts +3 -3
- package/dist/keys/revocation-bus.svelte.js +3 -3
- package/dist/layout/DragPreview.svelte +9 -9
- package/dist/layout/LayoutRenderer.browser.test.js +2 -2
- package/dist/layout/LayoutRenderer.svelte +4 -4
- package/dist/layout/SlotContainer.svelte +12 -12
- package/dist/layout/SlotDropZone.svelte +2 -2
- package/dist/layout/inspection.d.ts +1 -1
- package/dist/layout/inspection.js +1 -1
- package/dist/layout/store.svelte.js +3 -3
- package/dist/layout/types.d.ts +1 -1
- package/dist/layouts-shard/LayoutSaveModal.svelte +20 -20
- package/dist/layouts-shard/LayoutsSection.svelte +11 -11
- package/dist/layouts-shard/filter.test.js +3 -3
- package/dist/layouts-shard/layoutsApi.test.js +3 -3
- package/dist/layouts-shard/layoutsShard.svelte.test.js +7 -7
- package/dist/migrations/mode-id-rename.js +2 -2
- package/dist/overlays/ConfirmDialog.svelte +8 -8
- package/dist/overlays/EntityAppearanceModal.svelte +19 -19
- package/dist/overlays/FloatFrame.svelte +20 -20
- package/dist/overlays/FloatLayer.svelte +1 -1
- package/dist/overlays/ModalFrame.svelte +5 -5
- package/dist/overlays/PopupFrame.svelte +4 -4
- package/dist/overlays/ToastItem.svelte +12 -12
- package/dist/overlays/float.d.ts +2 -2
- package/dist/overlays/float.js +3 -3
- package/dist/overlays/float.test.js +6 -6
- package/dist/overlays/modal.js +1 -1
- package/dist/overlays/modal.test.js +2 -2
- package/dist/overlays/parentHost.js +2 -2
- package/dist/overlays/parentHost.test.js +5 -5
- package/dist/overlays/popup.js +2 -2
- package/dist/overlays/popup.test.js +2 -2
- package/dist/overlays/roots.js +4 -4
- package/dist/overlays/toast.js +1 -1
- package/dist/overlays/types.js +3 -3
- package/dist/primitives/Button.svelte +16 -16
- package/dist/primitives/Collapsible.svelte +11 -11
- package/dist/primitives/ResizableSplitter.svelte +10 -10
- package/dist/primitives/TabbedPanel.svelte +19 -19
- package/dist/primitives/base.css +57 -57
- package/dist/primitives/widgets/ColorSwatch.svelte +15 -15
- package/dist/primitives/widgets/ColorSwatch.svelte.test.js +4 -4
- package/dist/primitives/widgets/Field.svelte +20 -20
- package/dist/primitives/widgets/FilePicker.svelte +13 -13
- package/dist/primitives/widgets/IconPicker.svelte +14 -14
- package/dist/primitives/widgets/IconToggleGroup.svelte +14 -14
- package/dist/primitives/widgets/NumberInput.svelte +17 -17
- package/dist/primitives/widgets/PickerList.svelte +17 -17
- package/dist/primitives/widgets/RangeSlider.svelte +16 -16
- package/dist/primitives/widgets/Segmented.svelte +16 -16
- package/dist/primitives/widgets/Select.svelte +14 -14
- package/dist/primitives/widgets/Select.svelte.test.js +2 -2
- package/dist/primitives/widgets/Slider.svelte +20 -20
- package/dist/primitives/widgets/SliderGroup.svelte +2 -2
- package/dist/primitives/widgets/Textarea.svelte +13 -13
- package/dist/primitives/widgets/_select-listbox.svelte +15 -15
- package/dist/projects/session-state.svelte.js +1 -1
- package/dist/projects-shard/DeleteProjectDialog.svelte +12 -12
- package/dist/projects-shard/ProjectManage.svelte +25 -25
- package/dist/projects-shard/ProjectsSection.svelte +12 -12
- package/dist/registry/installer.d.ts +2 -2
- package/dist/registry/installer.js +2 -2
- package/dist/registry/loader.js +1 -1
- package/dist/registry/permission-descriptions.js +2 -2
- package/dist/registry/permission-descriptions.test.js +1 -1
- package/dist/runtime/runVerb-shell.test.js +2 -2
- package/dist/runtime/runVerb.js +4 -4
- package/dist/runtime/runVerb.test.js +4 -4
- package/dist/satellite/SatelliteShell.svelte +2 -2
- package/dist/{shell → sh3}/views/KeysAndPeers.svelte +7 -7
- package/dist/sh3Api/headless.d.ts +4 -0
- package/dist/{shell-shard/shellApi.js → sh3Api/headless.js} +5 -5
- package/dist/{shell-shard/shellApi.svelte.test.js → sh3Api/headless.svelte.test.js} +11 -11
- package/dist/{shellApi → sh3Api}/window.js +2 -2
- package/dist/{shellApi → sh3Api}/window.test.js +1 -1
- package/dist/{shellRuntime.svelte.d.ts → sh3Runtime.svelte.d.ts} +11 -11
- package/dist/{shellRuntime.svelte.js → sh3Runtime.svelte.js} +10 -10
- package/dist/sh3Runtime.svelte.test.d.ts +1 -0
- package/dist/{shellRuntime.svelte.test.js → sh3Runtime.svelte.test.js} +10 -10
- package/dist/sh3core-shard/AppInfoView.svelte +19 -19
- package/dist/sh3core-shard/{ShellHome.svelte → Sh3Home.svelte} +82 -82
- package/dist/sh3core-shard/Sh3Home.svelte.d.ts +3 -0
- package/dist/sh3core-shard/{ShellTitle.svelte → Sh3Title.svelte} +11 -11
- package/dist/sh3core-shard/Sh3Title.svelte.d.ts +3 -0
- package/dist/sh3core-shard/appActions.js +3 -3
- package/dist/sh3core-shard/sh3coreShard.svelte.js +7 -7
- package/dist/shards/activate.svelte.d.ts +1 -1
- package/dist/shards/activate.svelte.js +6 -6
- package/dist/shards/types.d.ts +5 -5
- package/dist/shards/types.js +2 -2
- package/dist/shell-shard/CommandLine.svelte +7 -7
- package/dist/shell-shard/InputLine.svelte +3 -3
- package/dist/shell-shard/ScrollbackView.svelte +2 -2
- package/dist/shell-shard/Terminal.svelte +5 -5
- package/dist/shell-shard/Terminal.svelte.d.ts +2 -2
- package/dist/shell-shard/dispatch-custom.test.js +2 -2
- package/dist/shell-shard/dispatch-gating.test.js +2 -2
- package/dist/shell-shard/dispatch-invoke.test.js +2 -2
- package/dist/shell-shard/dispatch-to-terminal.js +1 -1
- package/dist/shell-shard/dispatch.d.ts +2 -2
- package/dist/shell-shard/dispatch.js +2 -2
- package/dist/shell-shard/entries/PromptEntry.svelte +4 -4
- package/dist/shell-shard/entries/StatusEntry.svelte +4 -4
- package/dist/shell-shard/entries/TextEntry.svelte +3 -3
- package/dist/shell-shard/locateSlot.test.js +9 -9
- package/dist/shell-shard/manifest.js +2 -2
- package/dist/shell-shard/registry.d.ts +2 -2
- package/dist/shell-shard/rich/AppCard.svelte +1 -1
- package/dist/shell-shard/rich/AppsTable.svelte +1 -1
- package/dist/shell-shard/rich/HelpTable.svelte +1 -1
- package/dist/shell-shard/rich/HistoryList.svelte +1 -1
- package/dist/shell-shard/rich/ViewsTable.svelte +1 -1
- package/dist/shell-shard/rich/ZoneTree.svelte +2 -2
- package/dist/shell-shard/shellShard.svelte.d.ts +1 -1
- package/dist/shell-shard/shellShard.svelte.js +8 -8
- package/dist/shell-shard/terminal-dispatch.test.js +2 -2
- package/dist/shell-shard/toolbar/Toolbar.svelte +4 -4
- package/dist/shell-shard/toolbar/Toolbar.svelte.d.ts +2 -2
- package/dist/shell-shard/toolbar/slots/BusySlot.svelte +2 -2
- package/dist/shell-shard/toolbar/slots/FocusLockSlot.svelte +2 -2
- package/dist/shell-shard/toolbar/slots/ModeSlot.svelte +1 -1
- package/dist/shell-shard/toolbar/slots/TargetShardSlot.svelte +1 -1
- package/dist/shell-shard/toolbar/slots.d.ts +3 -3
- package/dist/shell-shard/verbs/apps.js +3 -3
- package/dist/shell-shard/verbs/help.js +1 -1
- package/dist/shell-shard/verbs/help.svelte.test.js +1 -1
- package/dist/shell-shard/verbs/history.js +1 -1
- package/dist/shell-shard/verbs/mode.js +2 -2
- package/dist/shell-shard/verbs/mode.test.js +2 -2
- package/dist/shell-shard/verbs/shards.js +1 -1
- package/dist/shell-shard/verbs/views.js +8 -8
- package/dist/shell-shard/verbs/zones.js +2 -2
- package/dist/state/zones.svelte.d.ts +2 -2
- package/dist/state/zones.svelte.js +4 -4
- package/dist/theme.d.ts +3 -3
- package/dist/theme.js +5 -5
- package/dist/tokens.css +68 -68
- package/dist/verbs/types.d.ts +5 -5
- package/dist/verbs/types.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/Shell.svelte.d.ts +0 -5
- package/dist/sh3core-shard/ShellHome.svelte.d.ts +0 -3
- package/dist/sh3core-shard/ShellTitle.svelte.d.ts +0 -3
- package/dist/shell-shard/shellApi.d.ts +0 -4
- /package/dist/actions/{shellActions.test.d.ts → sh3Actions.test.d.ts} +0 -0
- /package/dist/{shell-shard/shellApi.svelte.test.d.ts → build.test.d.ts} +0 -0
- /package/dist/color/{shell-api.d.ts → sh3-api.d.ts} +0 -0
- /package/dist/conflicts/{shell-api.d.ts → sh3-api.d.ts} +0 -0
- /package/dist/{shell → sh3}/views/KeysAndPeers.svelte.d.ts +0 -0
- /package/dist/{shellApi/window.test.d.ts → sh3Api/headless.svelte.test.d.ts} +0 -0
- /package/dist/{shellApi → sh3Api}/window.d.ts +0 -0
- /package/dist/{shellRuntime.svelte.test.d.ts → sh3Api/window.test.d.ts} +0 -0
|
@@ -42,13 +42,13 @@
|
|
|
42
42
|
pointer-events: auto;
|
|
43
43
|
display: flex;
|
|
44
44
|
align-items: center;
|
|
45
|
-
gap: var(--
|
|
46
|
-
padding: var(--
|
|
47
|
-
background: var(--
|
|
48
|
-
color: var(--
|
|
49
|
-
border: 1px solid var(--
|
|
45
|
+
gap: var(--sh3-pad-md);
|
|
46
|
+
padding: var(--sh3-pad-sm) var(--sh3-pad-md);
|
|
47
|
+
background: var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));
|
|
48
|
+
color: var(--sh3-fg);
|
|
49
|
+
border: 1px solid var(--sh3-border-strong);
|
|
50
50
|
border-left-width: 3px;
|
|
51
|
-
border-radius: var(--
|
|
51
|
+
border-radius: var(--sh3-radius-sm);
|
|
52
52
|
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
|
|
53
53
|
font-size: 12px;
|
|
54
54
|
min-width: 220px;
|
|
@@ -58,17 +58,17 @@
|
|
|
58
58
|
}
|
|
59
59
|
.toast-level {
|
|
60
60
|
text-transform: uppercase;
|
|
61
|
-
font-family: var(--
|
|
61
|
+
font-family: var(--sh3-font-mono);
|
|
62
62
|
font-size: 10px;
|
|
63
63
|
letter-spacing: 0.5px;
|
|
64
|
-
color: var(--
|
|
64
|
+
color: var(--sh3-fg-muted);
|
|
65
65
|
}
|
|
66
66
|
.toast-message { flex: 1; }
|
|
67
67
|
|
|
68
|
-
.toast-info { border-left-color: var(--
|
|
69
|
-
.toast-success { border-left-color: var(--
|
|
70
|
-
.toast-warn { border-left-color: var(--
|
|
71
|
-
.toast-error { border-left-color: var(--
|
|
68
|
+
.toast-info { border-left-color: var(--sh3-accent); }
|
|
69
|
+
.toast-success { border-left-color: var(--sh3-success); }
|
|
70
|
+
.toast-warn { border-left-color: var(--sh3-warning); }
|
|
71
|
+
.toast-error { border-left-color: var(--sh3-error); }
|
|
72
72
|
|
|
73
73
|
@keyframes toast-in {
|
|
74
74
|
from { opacity: 0; transform: translateY(8px); }
|
package/dist/overlays/float.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ export interface FloatManager {
|
|
|
51
51
|
/**
|
|
52
52
|
* Snapshot the current rect, override with the float layer bounds, and
|
|
53
53
|
* raise. No-op if the float is already maximized or unknown. Bounds are
|
|
54
|
-
* frozen at maximize time —
|
|
54
|
+
* frozen at maximize time — sh3 resize while maximized does not refit.
|
|
55
55
|
*/
|
|
56
56
|
maximize(floatId: string): void;
|
|
57
57
|
/**
|
|
@@ -72,7 +72,7 @@ export interface FloatManager {
|
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
74
|
* Bind the manager to the active LayoutTree's `floats` array. Called
|
|
75
|
-
* from
|
|
75
|
+
* from Sh3.svelte during boot. `getBounds` returns the current
|
|
76
76
|
* tree-allocated area for cascade-position wraparound.
|
|
77
77
|
*/
|
|
78
78
|
export declare function bindFloatStore(floats: FloatEntry[], getBounds: () => {
|
package/dist/overlays/float.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Float manager — layer 1 of the overlay stack.
|
|
3
3
|
*
|
|
4
|
-
* Public API (
|
|
4
|
+
* Public API (sh3.float):
|
|
5
5
|
* open(viewId, options?) → floatId
|
|
6
6
|
* close(floatId)
|
|
7
7
|
* list() → FloatEntry[]
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*
|
|
23
23
|
* Binding:
|
|
24
24
|
* The manager is bound to a live FloatEntry[] (the active LayoutTree's
|
|
25
|
-
* floats) by `bindFloatStore()` during
|
|
25
|
+
* floats) by `bindFloatStore()` during Sh3 boot. Before binding, an
|
|
26
26
|
* in-memory fallback array is used — this is both the test environment
|
|
27
27
|
* and the pre-boot state.
|
|
28
28
|
*/
|
|
@@ -35,7 +35,7 @@ let boundFloats = null;
|
|
|
35
35
|
let getTreeBounds = () => ({ w: 1600, h: 900 });
|
|
36
36
|
/**
|
|
37
37
|
* Bind the manager to the active LayoutTree's `floats` array. Called
|
|
38
|
-
* from
|
|
38
|
+
* from Sh3.svelte during boot. `getBounds` returns the current
|
|
39
39
|
* tree-allocated area for cascade-position wraparound.
|
|
40
40
|
*/
|
|
41
41
|
export function bindFloatStore(floats, getBounds) {
|
|
@@ -89,7 +89,7 @@ describe('floatManager — anchor-aware parent host', () => {
|
|
|
89
89
|
});
|
|
90
90
|
function makeOverlayHost(kind) {
|
|
91
91
|
const host = document.createElement('div');
|
|
92
|
-
host.dataset.
|
|
92
|
+
host.dataset.sh3OverlayHost = kind;
|
|
93
93
|
const anchor = document.createElement('button');
|
|
94
94
|
host.appendChild(anchor);
|
|
95
95
|
document.body.appendChild(host);
|
|
@@ -366,7 +366,7 @@ describe('floats — F.7 anchor portals to enclosing overlay host', () => {
|
|
|
366
366
|
const { container } = renderWithShell(FloatLayer, {});
|
|
367
367
|
const fakeModalHost = document.createElement('div');
|
|
368
368
|
fakeModalHost.className = 'fake-modal-host';
|
|
369
|
-
fakeModalHost.dataset.
|
|
369
|
+
fakeModalHost.dataset.sh3OverlayHost = 'modal';
|
|
370
370
|
const anchor = document.createElement('button');
|
|
371
371
|
fakeModalHost.appendChild(anchor);
|
|
372
372
|
document.body.appendChild(fakeModalHost);
|
|
@@ -397,7 +397,7 @@ describe('floats — F.7 anchor portals to enclosing overlay host', () => {
|
|
|
397
397
|
const { container } = renderWithShell(FloatLayer, {});
|
|
398
398
|
const fakeModalHost = document.createElement('div');
|
|
399
399
|
fakeModalHost.className = 'fake-modal-host';
|
|
400
|
-
fakeModalHost.dataset.
|
|
400
|
+
fakeModalHost.dataset.sh3OverlayHost = 'modal';
|
|
401
401
|
const anchor = document.createElement('button');
|
|
402
402
|
fakeModalHost.appendChild(anchor);
|
|
403
403
|
document.body.appendChild(fakeModalHost);
|
|
@@ -423,13 +423,13 @@ describe('floats — F.8 overlay host marker', () => {
|
|
|
423
423
|
resetFramework();
|
|
424
424
|
bindManagerToStore();
|
|
425
425
|
});
|
|
426
|
-
it('marks each FloatFrame with data-
|
|
426
|
+
it('marks each FloatFrame with data-sh3-overlay-host="float"', async () => {
|
|
427
427
|
const { container } = renderWithShell(FloatLayer, {});
|
|
428
428
|
floatManager.open('test:view', { title: 'Marked' });
|
|
429
429
|
await tick();
|
|
430
430
|
const frame = container.querySelector('[role="dialog"][aria-label="Marked"]');
|
|
431
431
|
expect(frame).toBeTruthy();
|
|
432
|
-
expect(frame.dataset.
|
|
432
|
+
expect(frame.dataset.sh3OverlayHost).toBe('float');
|
|
433
433
|
});
|
|
434
434
|
});
|
|
435
435
|
// ---------------------------------------------------------------------------
|
|
@@ -842,7 +842,7 @@ describe('floatManager.openWithContent', () => {
|
|
|
842
842
|
const content = {
|
|
843
843
|
type: 'tabs',
|
|
844
844
|
activeTab: 0,
|
|
845
|
-
tabs: [{ slotId: 'restored:1', viewId: 'shell:terminal', label: '
|
|
845
|
+
tabs: [{ slotId: 'restored:1', viewId: 'shell:terminal', label: 'Sh3' }],
|
|
846
846
|
};
|
|
847
847
|
const id = floatManager.openWithContent({
|
|
848
848
|
content,
|
package/dist/overlays/modal.js
CHANGED
|
@@ -109,7 +109,7 @@ function openModal(Content, props, options) {
|
|
|
109
109
|
const root = getLayerRoot('modal');
|
|
110
110
|
const host = document.createElement('div');
|
|
111
111
|
host.className = 'sh3-modal-host';
|
|
112
|
-
host.dataset.
|
|
112
|
+
host.dataset.sh3OverlayHost = 'modal';
|
|
113
113
|
host.style.position = 'absolute';
|
|
114
114
|
host.style.inset = '0';
|
|
115
115
|
host.style.pointerEvents = 'auto';
|
|
@@ -97,11 +97,11 @@ describe('modal — overlay host marker', () => {
|
|
|
97
97
|
modalManager.closeAll();
|
|
98
98
|
teardownLayerRoot(layerRoot);
|
|
99
99
|
});
|
|
100
|
-
it('marks the modal host with data-
|
|
100
|
+
it('marks the modal host with data-sh3-overlay-host="modal"', async () => {
|
|
101
101
|
modalManager.open(DummyFrame, {});
|
|
102
102
|
await tick();
|
|
103
103
|
const host = layerRoot.querySelector('.sh3-modal-host');
|
|
104
104
|
expect(host).not.toBeNull();
|
|
105
|
-
expect(host.dataset.
|
|
105
|
+
expect(host.dataset.sh3OverlayHost).toBe('modal');
|
|
106
106
|
});
|
|
107
107
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Walks up from `anchor` looking for an element marked as an overlay host
|
|
3
|
-
* via `data-
|
|
3
|
+
* via `data-sh3-overlay-host`. Modal hosts, popup hosts, and float frames
|
|
4
4
|
* tag themselves so anchored overlays (popups, dismissable picker floats)
|
|
5
5
|
* can mount inside their opener's stacking context instead of at a global
|
|
6
6
|
* layer root — which is what the layer-z-index invariant gives us when a
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
* `Element.closest`, so a marker on the anchor itself counts.
|
|
12
12
|
*/
|
|
13
13
|
export function findEnclosingOverlayHost(anchor) {
|
|
14
|
-
return anchor.closest('[data-
|
|
14
|
+
return anchor.closest('[data-sh3-overlay-host]');
|
|
15
15
|
}
|
|
@@ -4,9 +4,9 @@ afterEach(() => {
|
|
|
4
4
|
document.body.innerHTML = '';
|
|
5
5
|
});
|
|
6
6
|
describe('findEnclosingOverlayHost', () => {
|
|
7
|
-
it('returns the nearest ancestor with data-
|
|
7
|
+
it('returns the nearest ancestor with data-sh3-overlay-host', () => {
|
|
8
8
|
const host = document.createElement('div');
|
|
9
|
-
host.dataset.
|
|
9
|
+
host.dataset.sh3OverlayHost = 'modal';
|
|
10
10
|
const inner = document.createElement('div');
|
|
11
11
|
const anchor = document.createElement('button');
|
|
12
12
|
inner.appendChild(anchor);
|
|
@@ -16,7 +16,7 @@ describe('findEnclosingOverlayHost', () => {
|
|
|
16
16
|
});
|
|
17
17
|
it('returns the anchor itself when it carries the marker', () => {
|
|
18
18
|
const anchor = document.createElement('div');
|
|
19
|
-
anchor.dataset.
|
|
19
|
+
anchor.dataset.sh3OverlayHost = 'float';
|
|
20
20
|
document.body.appendChild(anchor);
|
|
21
21
|
expect(findEnclosingOverlayHost(anchor)).toBe(anchor);
|
|
22
22
|
});
|
|
@@ -27,9 +27,9 @@ describe('findEnclosingOverlayHost', () => {
|
|
|
27
27
|
});
|
|
28
28
|
it('returns the innermost host when overlay hosts are nested', () => {
|
|
29
29
|
const outer = document.createElement('div');
|
|
30
|
-
outer.dataset.
|
|
30
|
+
outer.dataset.sh3OverlayHost = 'modal';
|
|
31
31
|
const inner = document.createElement('div');
|
|
32
|
-
inner.dataset.
|
|
32
|
+
inner.dataset.sh3OverlayHost = 'float';
|
|
33
33
|
const anchor = document.createElement('button');
|
|
34
34
|
inner.appendChild(anchor);
|
|
35
35
|
outer.appendChild(inner);
|
package/dist/overlays/popup.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* Implementation notes:
|
|
16
16
|
* - The manager keeps at most one active entry. show() closes any
|
|
17
17
|
* prior entry before opening a new one — so callers can wire a
|
|
18
|
-
* menu button to `
|
|
18
|
+
* menu button to `sh3.popup.show(...)` without worrying about
|
|
19
19
|
* toggling themselves.
|
|
20
20
|
* - Dismissal listeners (pointerdown for outside-click, keydown for
|
|
21
21
|
* Escape) are installed when the popup opens and removed on close.
|
|
@@ -83,7 +83,7 @@ function showPopup(Content, options, props) {
|
|
|
83
83
|
const root = getLayerRoot('popup');
|
|
84
84
|
const host = document.createElement('div');
|
|
85
85
|
host.className = 'sh3-popup-host';
|
|
86
|
-
host.dataset.
|
|
86
|
+
host.dataset.sh3OverlayHost = 'popup';
|
|
87
87
|
host.style.position = 'absolute';
|
|
88
88
|
host.style.inset = '0';
|
|
89
89
|
host.style.pointerEvents = 'none'; // only the frame captures pointer events
|
|
@@ -138,10 +138,10 @@ describe('popup — overlay host marker', () => {
|
|
|
138
138
|
teardownLayerRoot(layerRoot);
|
|
139
139
|
vi.unstubAllGlobals();
|
|
140
140
|
});
|
|
141
|
-
it('marks the popup host with data-
|
|
141
|
+
it('marks the popup host with data-sh3-overlay-host="popup"', () => {
|
|
142
142
|
popupManager.show(DummyFrame, { anchor: { x: 100, y: 100 } }, {});
|
|
143
143
|
const host = layerRoot.querySelector('.sh3-popup-host');
|
|
144
144
|
expect(host).not.toBeNull();
|
|
145
|
-
expect(host.dataset.
|
|
145
|
+
expect(host.dataset.sh3OverlayHost).toBe('popup');
|
|
146
146
|
});
|
|
147
147
|
});
|
package/dist/overlays/roots.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Layer root registry.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Sh3.svelte owns the six overlay root <div>s (one per layer). Overlay
|
|
5
5
|
* managers — which are plain TypeScript modules, not Svelte components —
|
|
6
6
|
* need DOM references to those roots so they can append transient content
|
|
7
7
|
* (modals, popups, toasts) into the correct stacking context.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* Sh3.svelte calls `registerLayerRoot(name, el)` on each root during its
|
|
10
10
|
* own mount effect. Managers call `getLayerRoot(name)` lazily the first
|
|
11
|
-
* time they need to open something, which is always *after*
|
|
11
|
+
* time they need to open something, which is always *after* Sh3 has
|
|
12
12
|
* rendered because overlay triggers originate from views mounted into the
|
|
13
13
|
* layout tree. No race; no DOM queries.
|
|
14
14
|
*
|
|
@@ -25,7 +25,7 @@ export function getLayerRoot(layer) {
|
|
|
25
25
|
const el = roots[layer];
|
|
26
26
|
if (!el) {
|
|
27
27
|
throw new Error(`Overlay layer "${layer}" root is not registered — ` +
|
|
28
|
-
`
|
|
28
|
+
`Sh3.svelte must mount before opening overlays on this layer.`);
|
|
29
29
|
}
|
|
30
30
|
return el;
|
|
31
31
|
}
|
package/dist/overlays/toast.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* toastManager.clear()
|
|
7
7
|
*
|
|
8
8
|
* Semantics (from docs/design/layout.md):
|
|
9
|
-
* - Toasts queue and stack vertically at the bottom-right of the
|
|
9
|
+
* - Toasts queue and stack vertically at the bottom-right of the sh3.
|
|
10
10
|
* - Each toast auto-dismisses after `duration` ms (default 3000).
|
|
11
11
|
* `duration: Infinity` pins the toast until the caller calls close().
|
|
12
12
|
* - Clicking a toast dismisses it immediately.
|
package/dist/overlays/types.js
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* above the docked layout in an explicit numbered stack (0 = docked,
|
|
6
6
|
* 1 = floating, 2 = drag preview, 3 = popup, 4 = modal, 5 = toast,
|
|
7
7
|
* 6 = command palette). Phase 5 wires up layers 3/4/5; the rest are
|
|
8
|
-
* stubbed as DOM roots in
|
|
8
|
+
* stubbed as DOM roots in Sh3.svelte but have no managers yet.
|
|
9
9
|
*
|
|
10
10
|
* No component in the codebase writes a z-index directly — the only
|
|
11
|
-
* z-index values live on the overlay root divs in
|
|
12
|
-
* by the --
|
|
11
|
+
* z-index values live on the overlay root divs in Sh3.svelte driven
|
|
12
|
+
* by the --sh3-z-layer-N tokens. Overlay content is appended into the
|
|
13
13
|
* corresponding layer root and inherits its stacking context.
|
|
14
14
|
*/
|
|
15
15
|
export {};
|
|
@@ -112,21 +112,21 @@
|
|
|
112
112
|
display: inline-flex;
|
|
113
113
|
align-items: center;
|
|
114
114
|
justify-content: center;
|
|
115
|
-
gap: var(--
|
|
115
|
+
gap: var(--sh3-pad-sm);
|
|
116
116
|
padding: 6px 14px;
|
|
117
|
-
background: var(--
|
|
118
|
-
color: var(--
|
|
117
|
+
background: var(--sh3-accent);
|
|
118
|
+
color: var(--sh3-fg-on-accent);
|
|
119
119
|
border: none;
|
|
120
|
-
border-radius: var(--
|
|
120
|
+
border-radius: var(--sh3-radius);
|
|
121
121
|
cursor: pointer;
|
|
122
122
|
font-family: inherit;
|
|
123
123
|
font-size: 0.875rem;
|
|
124
|
-
line-height: var(--
|
|
124
|
+
line-height: var(--sh3-line);
|
|
125
125
|
}
|
|
126
126
|
.sh3-btn:hover:not(:disabled) { filter: brightness(1.12); }
|
|
127
127
|
.sh3-btn:active:not(:disabled) { filter: brightness(0.92); }
|
|
128
128
|
.sh3-btn:focus-visible {
|
|
129
|
-
box-shadow: var(--
|
|
129
|
+
box-shadow: var(--sh3-focus-ring);
|
|
130
130
|
outline: none;
|
|
131
131
|
}
|
|
132
132
|
.sh3-btn:disabled {
|
|
@@ -135,33 +135,33 @@
|
|
|
135
135
|
}
|
|
136
136
|
|
|
137
137
|
.sh3-btn--alert {
|
|
138
|
-
background: var(--
|
|
139
|
-
color: var(--
|
|
138
|
+
background: var(--sh3-error);
|
|
139
|
+
color: var(--sh3-fg-on-error);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
.sh3-btn--ghost {
|
|
143
143
|
background: transparent;
|
|
144
|
-
color: var(--
|
|
145
|
-
border: 1px solid var(--
|
|
144
|
+
color: var(--sh3-fg);
|
|
145
|
+
border: 1px solid var(--sh3-border);
|
|
146
146
|
}
|
|
147
147
|
.sh3-btn--ghost:hover:not(:disabled) {
|
|
148
|
-
background: var(--
|
|
148
|
+
background: var(--sh3-bg-elevated);
|
|
149
149
|
filter: none;
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
.sh3-btn--icon {
|
|
153
153
|
background: transparent;
|
|
154
|
-
color: var(--
|
|
155
|
-
padding: var(--
|
|
154
|
+
color: var(--sh3-fg-muted);
|
|
155
|
+
padding: var(--sh3-pad-sm);
|
|
156
156
|
}
|
|
157
157
|
.sh3-btn--icon:hover:not(:disabled) {
|
|
158
|
-
background: var(--
|
|
159
|
-
color: var(--
|
|
158
|
+
background: var(--sh3-bg-elevated);
|
|
159
|
+
color: var(--sh3-fg);
|
|
160
160
|
filter: none;
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
.sh3-btn--icon-only {
|
|
164
|
-
padding: var(--
|
|
164
|
+
padding: var(--sh3-pad-sm);
|
|
165
165
|
width: 26px;
|
|
166
166
|
height: 26px;
|
|
167
167
|
}
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
|
|
66
66
|
<style>
|
|
67
67
|
.sh3-collapsible {
|
|
68
|
-
border: 1px solid var(--
|
|
69
|
-
border-radius: var(--
|
|
68
|
+
border: 1px solid var(--sh3-border);
|
|
69
|
+
border-radius: var(--sh3-radius);
|
|
70
70
|
background: transparent;
|
|
71
71
|
}
|
|
72
72
|
.sh3-collapsible__head {
|
|
@@ -74,28 +74,28 @@
|
|
|
74
74
|
width: 100%;
|
|
75
75
|
display: inline-flex;
|
|
76
76
|
align-items: center;
|
|
77
|
-
gap: var(--
|
|
78
|
-
padding: var(--
|
|
77
|
+
gap: var(--sh3-pad-sm);
|
|
78
|
+
padding: var(--sh3-pad-sm) 12px;
|
|
79
79
|
background: transparent;
|
|
80
|
-
color: var(--
|
|
80
|
+
color: var(--sh3-fg);
|
|
81
81
|
border: none;
|
|
82
82
|
border-radius: inherit;
|
|
83
83
|
cursor: pointer;
|
|
84
84
|
font-family: inherit;
|
|
85
85
|
font-size: 0.875rem;
|
|
86
|
-
line-height: var(--
|
|
86
|
+
line-height: var(--sh3-line);
|
|
87
87
|
text-align: left;
|
|
88
88
|
}
|
|
89
|
-
.sh3-collapsible__head:hover { background: var(--
|
|
89
|
+
.sh3-collapsible__head:hover { background: var(--sh3-bg-elevated); }
|
|
90
90
|
.sh3-collapsible__head:focus-visible {
|
|
91
|
-
box-shadow: var(--
|
|
91
|
+
box-shadow: var(--sh3-focus-ring);
|
|
92
92
|
outline: none;
|
|
93
93
|
}
|
|
94
94
|
.sh3-collapsible__caret {
|
|
95
95
|
width: 12px;
|
|
96
96
|
height: 12px;
|
|
97
97
|
flex-shrink: 0;
|
|
98
|
-
color: var(--
|
|
98
|
+
color: var(--sh3-fg-muted);
|
|
99
99
|
}
|
|
100
100
|
.sh3-collapsible--open .sh3-collapsible__caret {
|
|
101
101
|
transform: rotate(90deg);
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
flex: 1;
|
|
105
105
|
}
|
|
106
106
|
.sh3-collapsible__body {
|
|
107
|
-
padding: var(--
|
|
108
|
-
border-top: 1px solid var(--
|
|
107
|
+
padding: var(--sh3-pad-sm) 12px;
|
|
108
|
+
border-top: 1px solid var(--sh3-border);
|
|
109
109
|
}
|
|
110
110
|
</style>
|
|
@@ -295,16 +295,16 @@
|
|
|
295
295
|
display: flex;
|
|
296
296
|
align-items: center;
|
|
297
297
|
justify-content: center;
|
|
298
|
-
background: var(--
|
|
298
|
+
background: var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));
|
|
299
299
|
border: none;
|
|
300
|
-
color: var(--
|
|
300
|
+
color: var(--sh3-fg-muted);
|
|
301
301
|
cursor: pointer;
|
|
302
302
|
padding: 0;
|
|
303
303
|
font-size: 10px;
|
|
304
304
|
}
|
|
305
305
|
.collapse-header:hover {
|
|
306
|
-
color: var(--
|
|
307
|
-
background: var(--
|
|
306
|
+
color: var(--sh3-fg);
|
|
307
|
+
background: var(--sh3-accent-muted);
|
|
308
308
|
}
|
|
309
309
|
/* Suppress misleading hover feedback during drag-reorganize. */
|
|
310
310
|
:global(body[data-dragging]) .collapse-header {
|
|
@@ -322,23 +322,23 @@
|
|
|
322
322
|
.collapse-header.expanded.horizontal {
|
|
323
323
|
width: 16px;
|
|
324
324
|
height: 100%;
|
|
325
|
-
border-right: 1px solid var(--
|
|
325
|
+
border-right: 1px solid var(--sh3-border);
|
|
326
326
|
}
|
|
327
327
|
.collapse-header.expanded.vertical {
|
|
328
328
|
width: 100%;
|
|
329
329
|
height: 16px;
|
|
330
|
-
border-bottom: 1px solid var(--
|
|
330
|
+
border-bottom: 1px solid var(--sh3-border);
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
.splitter-handle {
|
|
334
334
|
flex: 0 0 auto;
|
|
335
|
-
background: var(--
|
|
335
|
+
background: var(--sh3-border);
|
|
336
336
|
transition: background-color 120ms ease;
|
|
337
337
|
touch-action: none;
|
|
338
338
|
}
|
|
339
339
|
.splitter-handle:hover,
|
|
340
340
|
.splitter-handle.dragging {
|
|
341
|
-
background: var(--
|
|
341
|
+
background: var(--sh3-accent);
|
|
342
342
|
}
|
|
343
343
|
:global(body[data-dragging]) .splitter-handle {
|
|
344
344
|
pointer-events: none;
|
|
@@ -350,11 +350,11 @@
|
|
|
350
350
|
.splitter-handle.frozen {
|
|
351
351
|
cursor: default;
|
|
352
352
|
pointer-events: none;
|
|
353
|
-
background: var(--
|
|
353
|
+
background: var(--sh3-border);
|
|
354
354
|
opacity: 0.5;
|
|
355
355
|
}
|
|
356
356
|
.splitter-handle.frozen:hover {
|
|
357
|
-
background: var(--
|
|
357
|
+
background: var(--sh3-border);
|
|
358
358
|
}
|
|
359
359
|
|
|
360
360
|
.horizontal > .splitter-handle {
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
height: 100%;
|
|
211
211
|
min-width: 0;
|
|
212
212
|
min-height: 0;
|
|
213
|
-
background: var(--
|
|
213
|
+
background: var(--sh3-grad-bg, var(--sh3-bg));
|
|
214
214
|
}
|
|
215
215
|
|
|
216
216
|
.tab-strip {
|
|
@@ -218,9 +218,9 @@
|
|
|
218
218
|
flex: 0 0 auto;
|
|
219
219
|
display: flex;
|
|
220
220
|
gap: 1px;
|
|
221
|
-
background: var(--
|
|
222
|
-
border-bottom: 1px solid var(--
|
|
223
|
-
padding: 0 var(--
|
|
221
|
+
background: var(--sh3-grad-bg-sunken, var(--sh3-bg-sunken));
|
|
222
|
+
border-bottom: 1px solid var(--sh3-border);
|
|
223
|
+
padding: 0 var(--sh3-pad-sm);
|
|
224
224
|
user-select: none;
|
|
225
225
|
}
|
|
226
226
|
|
|
@@ -228,14 +228,14 @@
|
|
|
228
228
|
appearance: none;
|
|
229
229
|
background: transparent;
|
|
230
230
|
border: none;
|
|
231
|
-
color: var(--
|
|
231
|
+
color: var(--sh3-fg-muted);
|
|
232
232
|
font: inherit;
|
|
233
233
|
font-size: 12px;
|
|
234
|
-
padding: var(--
|
|
234
|
+
padding: var(--sh3-pad-sm) var(--sh3-pad-md);
|
|
235
235
|
margin-top: 2px;
|
|
236
236
|
display: inline-flex;
|
|
237
237
|
align-items: center;
|
|
238
|
-
gap: var(--
|
|
238
|
+
gap: var(--sh3-pad-sm);
|
|
239
239
|
cursor: pointer;
|
|
240
240
|
border-top: 2px solid transparent;
|
|
241
241
|
border-radius: 2px 2px 0 0;
|
|
@@ -246,13 +246,13 @@
|
|
|
246
246
|
touch-action: none;
|
|
247
247
|
}
|
|
248
248
|
.tab:hover {
|
|
249
|
-
color: var(--
|
|
250
|
-
background: var(--
|
|
249
|
+
color: var(--sh3-fg);
|
|
250
|
+
background: var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));
|
|
251
251
|
}
|
|
252
252
|
.tab.active {
|
|
253
|
-
color: var(--
|
|
254
|
-
background: var(--
|
|
255
|
-
border-top-color: var(--
|
|
253
|
+
color: var(--sh3-fg);
|
|
254
|
+
background: var(--sh3-grad-bg, var(--sh3-bg));
|
|
255
|
+
border-top-color: var(--sh3-accent);
|
|
256
256
|
}
|
|
257
257
|
.tab-icon { font-size: 11px; }
|
|
258
258
|
.tab-label { white-space: nowrap; }
|
|
@@ -261,7 +261,7 @@
|
|
|
261
261
|
width: 8px;
|
|
262
262
|
height: 8px;
|
|
263
263
|
border-radius: 50%;
|
|
264
|
-
background: var(--
|
|
264
|
+
background: var(--sh3-accent);
|
|
265
265
|
flex-shrink: 0;
|
|
266
266
|
}
|
|
267
267
|
.tab-close {
|
|
@@ -269,22 +269,22 @@
|
|
|
269
269
|
font-size: 10px;
|
|
270
270
|
line-height: 1;
|
|
271
271
|
padding: 2px;
|
|
272
|
-
border-radius: var(--
|
|
273
|
-
color: var(--
|
|
272
|
+
border-radius: var(--sh3-radius-sm);
|
|
273
|
+
color: var(--sh3-fg-muted);
|
|
274
274
|
cursor: pointer;
|
|
275
275
|
flex-shrink: 0;
|
|
276
276
|
margin-left: auto;
|
|
277
277
|
}
|
|
278
278
|
.tab-close:hover {
|
|
279
|
-
color: var(--
|
|
280
|
-
background: var(--
|
|
279
|
+
color: var(--sh3-fg);
|
|
280
|
+
background: var(--sh3-bg-sunken);
|
|
281
281
|
}
|
|
282
282
|
|
|
283
283
|
.drop-indicator {
|
|
284
284
|
position: absolute;
|
|
285
285
|
width: 2px;
|
|
286
|
-
background: var(--
|
|
287
|
-
box-shadow: 0 0 6px var(--
|
|
286
|
+
background: var(--sh3-accent);
|
|
287
|
+
box-shadow: 0 0 6px var(--sh3-accent);
|
|
288
288
|
pointer-events: none;
|
|
289
289
|
border-radius: 1px;
|
|
290
290
|
}
|