sh3-core 0.15.4 → 0.16.0
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/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/{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/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/{shell-shard/shellApi.svelte.test.d.ts → sh3Api/headless.svelte.test.d.ts} +0 -0
- /package/dist/{shellApi → sh3Api}/window.d.ts +0 -0
- /package/dist/{shellApi → sh3Api}/window.test.d.ts +0 -0
- /package/dist/{shellRuntime.svelte.test.d.ts → sh3Runtime.svelte.test.d.ts} +0 -0
|
@@ -121,34 +121,34 @@
|
|
|
121
121
|
.sh3-conflict-text-dual { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; min-height: 0; flex: 1; }
|
|
122
122
|
.sh3-conflict-text-pane {
|
|
123
123
|
display: flex; flex-direction: column; min-height: 0;
|
|
124
|
-
border: 1px solid var(--
|
|
125
|
-
border-radius: var(--
|
|
126
|
-
background: var(--
|
|
124
|
+
border: 1px solid var(--sh3-border, #444);
|
|
125
|
+
border-radius: var(--sh3-radius-sm);
|
|
126
|
+
background: var(--sh3-input-bg, #2a2a2a);
|
|
127
127
|
cursor: pointer;
|
|
128
128
|
}
|
|
129
129
|
.sh3-conflict-text-pane.selected {
|
|
130
|
-
border-color: var(--
|
|
131
|
-
box-shadow: 0 0 0 2px var(--
|
|
130
|
+
border-color: var(--sh3-accent, #007acc);
|
|
131
|
+
box-shadow: 0 0 0 2px var(--sh3-focus-ring, rgba(0,122,204,0.3));
|
|
132
132
|
}
|
|
133
|
-
.sh3-conflict-text-head { padding: 6px 10px; font-size: 0.75rem; color: var(--
|
|
133
|
+
.sh3-conflict-text-head { padding: 6px 10px; font-size: 0.75rem; color: var(--sh3-fg-muted, #888); border-bottom: 1px solid var(--sh3-border, #444); }
|
|
134
134
|
.sh3-conflict-text-body {
|
|
135
135
|
margin: 0; padding: 10px; flex: 1; overflow: auto;
|
|
136
|
-
font-family: var(--
|
|
136
|
+
font-family: var(--sh3-font-mono, monospace); font-size: 0.8125rem;
|
|
137
137
|
}
|
|
138
138
|
.sh3-conflict-text-diff { margin-top: 8px; }
|
|
139
|
-
.sh3-conflict-text-diff pre { background: var(--
|
|
140
|
-
:global(.diff-left) { color: var(--
|
|
141
|
-
:global(.diff-right) { color: var(--
|
|
139
|
+
.sh3-conflict-text-diff pre { background: var(--sh3-input-bg, #2a2a2a); padding: 8px; overflow: auto; max-height: 240px; }
|
|
140
|
+
:global(.diff-left) { color: var(--sh3-error, #e35); }
|
|
141
|
+
:global(.diff-right) { color: var(--sh3-success, #3a3); }
|
|
142
142
|
:global(.diff-same) { opacity: 0.7; }
|
|
143
143
|
.sh3-conflict-text-tabs { display: flex; flex-direction: column; gap: 8px; min-height: 0; flex: 1; }
|
|
144
144
|
.sh3-conflict-text-picker select {
|
|
145
|
-
background: var(--
|
|
146
|
-
border: 1px solid var(--
|
|
145
|
+
background: var(--sh3-input-bg, #2a2a2a); color: var(--sh3-fg, #e0e0e0);
|
|
146
|
+
border: 1px solid var(--sh3-border, #444); padding: 2px 6px;
|
|
147
147
|
}
|
|
148
148
|
.sh3-conflict-text-tablist { display: flex; gap: 4px; flex-wrap: wrap; }
|
|
149
149
|
.sh3-conflict-text-tab {
|
|
150
|
-
padding: 4px 10px; background: var(--
|
|
151
|
-
border-radius: var(--
|
|
150
|
+
padding: 4px 10px; background: var(--sh3-input-bg, #2a2a2a); border: 1px solid var(--sh3-border, #444);
|
|
151
|
+
border-radius: var(--sh3-radius-sm); color: var(--sh3-fg, #e0e0e0); cursor: pointer; font-size: 0.8125rem;
|
|
152
152
|
}
|
|
153
|
-
.sh3-conflict-text-tab.selected { border-color: var(--
|
|
153
|
+
.sh3-conflict-text-tab.selected { border-color: var(--sh3-accent, #007acc); }
|
|
154
154
|
</style>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* selectedOrigin state and updates via the onSelect callback.
|
|
11
11
|
*
|
|
12
12
|
* ensureBuiltInRenderersRegistered() is idempotent; it's called from
|
|
13
|
-
*
|
|
13
|
+
* sh3-api.ts on the first sh3.conflicts use.
|
|
14
14
|
*/
|
|
15
15
|
import { mount, unmount } from 'svelte';
|
|
16
16
|
import { inferKind, registerBuiltInRenderer } from '../renderer-registry';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Generic conflict-resolve primitive — the modal machinery without the
|
|
3
3
|
* doc-zone adapter. Lives in its own file so `adapter-documents.ts` can
|
|
4
|
-
* import it statically without creating a cycle with the
|
|
4
|
+
* import it statically without creating a cycle with the sh3 runtime.
|
|
5
5
|
*/
|
|
6
6
|
import { modalManager } from '../overlays/modal';
|
|
7
7
|
import { list as listContributions } from '../contributions/registry';
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*
|
|
2
|
-
*
|
|
2
|
+
* sh3.conflicts assembled API.
|
|
3
3
|
*
|
|
4
4
|
* The generic primitive lives in resolve-primitive.ts and the doc-zone
|
|
5
5
|
* adapter in adapter-documents.ts; this file just binds them together
|
|
6
|
-
* as the object exposed on the
|
|
6
|
+
* as the object exposed on the sh3 singleton.
|
|
7
7
|
*/
|
|
8
8
|
import { resolvePrimitive } from './resolve-primitive';
|
|
9
9
|
import { resolveDocuments } from './adapter-documents';
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Emitters are a Set of zero-arg callbacks; subscribers re-read `list`
|
|
7
7
|
* themselves when notified.
|
|
8
8
|
*
|
|
9
|
-
* No tenant partitioning: the
|
|
9
|
+
* No tenant partitioning: the sh3 is single-tenant per session; a
|
|
10
10
|
* future multi-tenant client would add a tenant dimension to the
|
|
11
11
|
* outer map (see direction spec §5.2).
|
|
12
12
|
*/
|
package/dist/createShell.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Shard, App } from './index';
|
|
2
|
-
export interface
|
|
2
|
+
export interface Sh3Config {
|
|
3
3
|
/** Framework shard IDs to exclude (all included by default) */
|
|
4
4
|
excludeShards?: string[];
|
|
5
5
|
/** Additional shards to register */
|
|
@@ -23,4 +23,4 @@ export interface ShellConfig {
|
|
|
23
23
|
/** Server base URL ('' for same-origin) */
|
|
24
24
|
serverUrl?: string;
|
|
25
25
|
}
|
|
26
|
-
export declare function createShell(config?:
|
|
26
|
+
export declare function createShell(config?: Sh3Config): Promise<void>;
|
package/dist/createShell.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* createShell — public factory for booting an SH3
|
|
2
|
+
* createShell — public factory for booting an SH3 sh3.
|
|
3
3
|
*
|
|
4
4
|
* Consumers call this from their own main.ts instead of manually
|
|
5
|
-
* importing registerShard / registerApp / bootstrap /
|
|
5
|
+
* importing registerShard / registerApp / bootstrap / Sh3. The
|
|
6
6
|
* factory handles platform detection, boot config, auth gating,
|
|
7
7
|
* registration, bootstrap, and mounting in the correct order.
|
|
8
8
|
*/
|
|
9
9
|
import { mount, unmount } from 'svelte';
|
|
10
|
-
import {
|
|
10
|
+
import { Sh3 } from './index';
|
|
11
11
|
import { registerShard, registerApp, bootstrap, bootstrapSatellite, __setBackend, setLocalOwner, } from './host';
|
|
12
12
|
import { resolvePlatform } from './platform/index';
|
|
13
13
|
import { hydrateTokenOverrides } from './theme';
|
|
@@ -35,7 +35,7 @@ export async function createShell(config) {
|
|
|
35
35
|
}
|
|
36
36
|
__setEnvServerUrl(sUrl);
|
|
37
37
|
hydrateTokenOverrides();
|
|
38
|
-
// 2. Resolve mount target early (needed for both sign-in wall and
|
|
38
|
+
// 2. Resolve mount target early (needed for both sign-in wall and sh3)
|
|
39
39
|
const target = typeof (config === null || config === void 0 ? void 0 : config.target) === 'string'
|
|
40
40
|
? document.querySelector(config.target)
|
|
41
41
|
: (_b = config === null || config === void 0 ? void 0 : config.target) !== null && _b !== void 0 ? _b : document.getElementById('app');
|
|
@@ -130,8 +130,8 @@ export async function createShell(config) {
|
|
|
130
130
|
await bootstrap(bootstrapConfig);
|
|
131
131
|
// 8. Attach document-level keyboard / focus listeners
|
|
132
132
|
attachGlobalListeners();
|
|
133
|
-
// 9. Mount the
|
|
134
|
-
mount(
|
|
133
|
+
// 9. Mount the sh3
|
|
134
|
+
mount(Sh3, { target });
|
|
135
135
|
}
|
|
136
136
|
/**
|
|
137
137
|
* Fetch and register every package the server reported via /api/packages.
|
package/dist/host-entry.d.ts
CHANGED
|
@@ -10,4 +10,4 @@ export type { InstalledPackage, InstallResult, PackageMeta } from './registry/ty
|
|
|
10
10
|
export { initFromBoot, login, logout, register, setLocalOwner as setLocalOwnerAuth } from './auth/index';
|
|
11
11
|
export type { AuthUser, AuthSession, BootConfig, GlobalSettings } from './auth/types';
|
|
12
12
|
export { createShell } from './createShell';
|
|
13
|
-
export type {
|
|
13
|
+
export type { Sh3Config } from './createShell';
|
package/dist/host-entry.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Host-process entry for the `sh3-core` package.
|
|
3
3
|
*
|
|
4
4
|
* This file is what `import ... from 'sh3-core/host'` resolves to. Only code that
|
|
5
|
-
* boots an SH3
|
|
5
|
+
* boots an SH3 sh3 (a main.ts that mounts Sh3 and registers shards/apps)
|
|
6
6
|
* should touch this path. Shards and apps must not import from here.
|
|
7
7
|
*/
|
|
8
8
|
export { registerShard, registerApp, bootstrap, __setBackend, setLocalOwner } from './host';
|
|
@@ -13,5 +13,5 @@ export { __setEnvServerUrl } from './env/index';
|
|
|
13
13
|
export { installPackage, uninstallPackage, listInstalledPackages, loadInstalledPackages, } from './registry/index';
|
|
14
14
|
// Auth (host-only — session lifecycle, boot initialization).
|
|
15
15
|
export { initFromBoot, login, logout, register, setLocalOwner as setLocalOwnerAuth } from './auth/index';
|
|
16
|
-
//
|
|
16
|
+
// Sh3 boot factory.
|
|
17
17
|
export { createShell } from './createShell';
|
package/dist/host.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* framework-owned shards and apps (filtering any the host excludes via
|
|
10
10
|
* BootstrapConfig), walks the registered-shards map and activates every
|
|
11
11
|
* self-starting shard, then reads the last-app user-zone entry and
|
|
12
|
-
* either launches that app or leaves the
|
|
12
|
+
* either launches that app or leaves the sh3 on home.
|
|
13
13
|
*
|
|
14
14
|
* This file is intentionally NOT re-exported through `api.ts`. The
|
|
15
15
|
* import-hygiene rule is: shards and apps import from `api.ts`, the host
|
|
@@ -95,7 +95,7 @@ export async function bootstrap(config) {
|
|
|
95
95
|
}
|
|
96
96
|
catch (_a) {
|
|
97
97
|
// Already logged + recorded in erroredShards by activateShard.
|
|
98
|
-
// One bad self-starting shard must not prevent the
|
|
98
|
+
// One bad self-starting shard must not prevent the sh3 from booting.
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Main public entry for the `sh3-core` package.
|
|
3
3
|
*
|
|
4
4
|
* This file is what `import ... from 'sh3-core'` resolves to. It re-exports the
|
|
5
|
-
* phase 8 public surface (api.ts) plus the
|
|
5
|
+
* phase 8 public surface (api.ts) plus the Sh3 host component. Shard and
|
|
6
6
|
* app authors import from here.
|
|
7
7
|
*
|
|
8
8
|
* Host-process functions (registerShard, registerApp, bootstrap) are
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
* and apps must not register each other. See host-entry.ts.
|
|
11
11
|
*/
|
|
12
12
|
export * from './api';
|
|
13
|
-
export { default as
|
|
13
|
+
export { default as Sh3 } from './Sh3.svelte';
|
|
14
14
|
export * from './shell-shard/protocol';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<!--
|
|
2
|
-
|
|
2
|
+
Sh3-owned consent dialog. Listens for consent requests and routes the
|
|
3
3
|
user's Approve/Deny back into the runtime via resolveConsent().
|
|
4
4
|
|
|
5
|
-
Mounted once by the
|
|
5
|
+
Mounted once by the sh3 at boot; never by shards.
|
|
6
6
|
|
|
7
7
|
Security: all shard-provided strings (shardId, label, scope, peerId)
|
|
8
8
|
are rendered as plain text via Svelte's default interpolation — no @html.
|
|
@@ -76,9 +76,9 @@
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
.sh3-consent-card {
|
|
79
|
-
background: var(--
|
|
80
|
-
color: var(--
|
|
81
|
-
border: 1px solid var(--
|
|
79
|
+
background: var(--sh3-bg-elevated, #222);
|
|
80
|
+
color: var(--sh3-fg, #eee);
|
|
81
|
+
border: 1px solid var(--sh3-border, #444);
|
|
82
82
|
padding: 1.5rem;
|
|
83
83
|
border-radius: 8px;
|
|
84
84
|
min-width: 360px;
|
|
@@ -90,11 +90,11 @@
|
|
|
90
90
|
margin: 0 0 1rem;
|
|
91
91
|
font-size: 1rem;
|
|
92
92
|
font-weight: 600;
|
|
93
|
-
color: var(--
|
|
93
|
+
color: var(--sh3-fg, #eee);
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
.sh3-consent-title span {
|
|
97
|
-
color: var(--
|
|
97
|
+
color: var(--sh3-accent, #7eb8f7);
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
.sh3-consent-fields {
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
|
|
109
109
|
.sh3-consent-fields dt {
|
|
110
110
|
font-weight: 600;
|
|
111
|
-
color: var(--
|
|
111
|
+
color: var(--sh3-fg-muted, #aaa);
|
|
112
112
|
font-size: 0.8rem;
|
|
113
113
|
text-transform: uppercase;
|
|
114
114
|
letter-spacing: 0.05em;
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
border: 1px solid rgba(255, 255, 255, 0.12);
|
|
135
135
|
border-radius: 3px;
|
|
136
136
|
font-size: 0.82em;
|
|
137
|
-
font-family: var(--
|
|
137
|
+
font-family: var(--sh3-font-mono, monospace);
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
.sh3-consent-actions {
|
|
@@ -156,19 +156,19 @@
|
|
|
156
156
|
|
|
157
157
|
.sh3-consent-deny {
|
|
158
158
|
background: transparent;
|
|
159
|
-
color: var(--
|
|
160
|
-
border-color: var(--
|
|
159
|
+
color: var(--sh3-fg-muted, #aaa);
|
|
160
|
+
border-color: var(--sh3-border, #444);
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
.sh3-consent-deny:hover {
|
|
164
|
-
color: var(--
|
|
165
|
-
border-color: var(--
|
|
164
|
+
color: var(--sh3-fg, #eee);
|
|
165
|
+
border-color: var(--sh3-fg-muted, #aaa);
|
|
166
166
|
}
|
|
167
167
|
|
|
168
168
|
.sh3-consent-approve {
|
|
169
|
-
background: var(--
|
|
169
|
+
background: var(--sh3-accent, #7eb8f7);
|
|
170
170
|
color: #000;
|
|
171
|
-
border-color: var(--
|
|
171
|
+
border-color: var(--sh3-accent, #7eb8f7);
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
.sh3-consent-approve:hover {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Sh3-owned consent runtime — only place that can approve or deny a mint.
|
|
3
3
|
*
|
|
4
|
-
* The client shard calls requestConsent(); the
|
|
4
|
+
* The client shard calls requestConsent(); the sh3 shows ConsentDialog.svelte
|
|
5
5
|
* and calls resolveConsent(...) on user action.
|
|
6
6
|
*/
|
|
7
7
|
import type { MintOpts } from './types';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Sh3-owned consent runtime — only place that can approve or deny a mint.
|
|
3
3
|
*
|
|
4
|
-
* The client shard calls requestConsent(); the
|
|
4
|
+
* The client shard calls requestConsent(); the sh3 shows ConsentDialog.svelte
|
|
5
5
|
* and calls resolveConsent(...) on user action.
|
|
6
6
|
*/
|
|
7
7
|
const pending = new Map();
|
|
@@ -13,7 +13,7 @@ export function registerConsentListener(fn) {
|
|
|
13
13
|
}
|
|
14
14
|
export async function requestConsent(shardId, opts) {
|
|
15
15
|
if (!listener)
|
|
16
|
-
throw new Error('No consent listener registered — the
|
|
16
|
+
throw new Error('No consent listener registered — the sh3 must mount ConsentDialog.');
|
|
17
17
|
const requestId = `c_${Math.random().toString(36).slice(2)}${Date.now()}`;
|
|
18
18
|
return new Promise((resolve) => {
|
|
19
19
|
pending.set(requestId, { resolve });
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Notifies active shards when one of their minted keys is revoked —
|
|
3
|
-
* regardless of whether the revocation was initiated by the
|
|
3
|
+
* regardless of whether the revocation was initiated by the sh3 UI,
|
|
4
4
|
* the shard itself, or another tab.
|
|
5
5
|
*
|
|
6
6
|
* The bus is populated by a server-sent events stream on /api/keys/events
|
|
7
|
-
* (wired by the
|
|
7
|
+
* (wired by the sh3 runtime at boot) and/or by local revoke() calls.
|
|
8
8
|
*/
|
|
9
9
|
type Handler = (keyId: string) => void;
|
|
10
10
|
/**
|
|
@@ -26,7 +26,7 @@ export declare function emit(shardId: string | null, keyId: string): void;
|
|
|
26
26
|
* Open a server-sent events stream at /api/keys/events and forward
|
|
27
27
|
* revocation events into the local bus.
|
|
28
28
|
*
|
|
29
|
-
* Should be called once at
|
|
29
|
+
* Should be called once at sh3 boot. Returns a cleanup function that
|
|
30
30
|
* closes the EventSource.
|
|
31
31
|
*
|
|
32
32
|
* No-op in environments without EventSource (e.g. Node test runner).
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Notifies active shards when one of their minted keys is revoked —
|
|
3
|
-
* regardless of whether the revocation was initiated by the
|
|
3
|
+
* regardless of whether the revocation was initiated by the sh3 UI,
|
|
4
4
|
* the shard itself, or another tab.
|
|
5
5
|
*
|
|
6
6
|
* The bus is populated by a server-sent events stream on /api/keys/events
|
|
7
|
-
* (wired by the
|
|
7
|
+
* (wired by the sh3 runtime at boot) and/or by local revoke() calls.
|
|
8
8
|
*/
|
|
9
9
|
const handlersByShard = new Map();
|
|
10
10
|
/**
|
|
@@ -70,7 +70,7 @@ export function emit(shardId, keyId) {
|
|
|
70
70
|
* Open a server-sent events stream at /api/keys/events and forward
|
|
71
71
|
* revocation events into the local bus.
|
|
72
72
|
*
|
|
73
|
-
* Should be called once at
|
|
73
|
+
* Should be called once at sh3 boot. Returns a cleanup function that
|
|
74
74
|
* closes the EventSource.
|
|
75
75
|
*
|
|
76
76
|
* No-op in environments without EventSource (e.g. Node test runner).
|
|
@@ -44,19 +44,19 @@
|
|
|
44
44
|
position: absolute;
|
|
45
45
|
display: inline-flex;
|
|
46
46
|
align-items: center;
|
|
47
|
-
gap: var(--
|
|
48
|
-
padding: var(--
|
|
49
|
-
background: var(--
|
|
50
|
-
color: var(--
|
|
51
|
-
border: 1px solid var(--
|
|
52
|
-
border-radius: var(--
|
|
47
|
+
gap: var(--sh3-pad-sm);
|
|
48
|
+
padding: var(--sh3-pad-sm) var(--sh3-pad-md);
|
|
49
|
+
background: var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));
|
|
50
|
+
color: var(--sh3-fg);
|
|
51
|
+
border: 1px solid var(--sh3-accent);
|
|
52
|
+
border-radius: var(--sh3-radius-sm);
|
|
53
53
|
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);
|
|
54
54
|
font-size: 12px;
|
|
55
|
-
font-family: var(--
|
|
55
|
+
font-family: var(--sh3-font-ui);
|
|
56
56
|
pointer-events: none;
|
|
57
57
|
opacity: 0.9;
|
|
58
|
-
/* The layer root inherits its z-index from --
|
|
59
|
-
|
|
58
|
+
/* The layer root inherits its z-index from --sh3-z-layer-2 via
|
|
59
|
+
Sh3.svelte; we don't set z-index here. */
|
|
60
60
|
}
|
|
61
61
|
.drag-preview-icon { font-size: 11px; }
|
|
62
62
|
.drag-preview-label { white-space: nowrap; }
|
|
@@ -23,9 +23,9 @@ function stubView() {
|
|
|
23
23
|
function settle(ms = 50) {
|
|
24
24
|
return new Promise((r) => setTimeout(r, ms));
|
|
25
25
|
}
|
|
26
|
-
/** Remove all
|
|
26
|
+
/** Remove all sh3 host elements from the body (cleanup between tests). */
|
|
27
27
|
function cleanupDOM() {
|
|
28
|
-
const hosts = document.querySelectorAll('.sh3-
|
|
28
|
+
const hosts = document.querySelectorAll('.sh3-sh3-host');
|
|
29
29
|
hosts.forEach((h) => h.remove());
|
|
30
30
|
}
|
|
31
31
|
// ---------------------------------------------------------------------------
|
|
@@ -258,15 +258,15 @@
|
|
|
258
258
|
flex-direction: column;
|
|
259
259
|
align-items: center;
|
|
260
260
|
justify-content: center;
|
|
261
|
-
color: var(--
|
|
261
|
+
color: var(--sh3-fg-muted);
|
|
262
262
|
font-size: 12px;
|
|
263
263
|
background:
|
|
264
264
|
repeating-linear-gradient(
|
|
265
265
|
45deg,
|
|
266
|
-
var(--
|
|
267
|
-
var(--
|
|
266
|
+
var(--sh3-bg) 0 10px,
|
|
267
|
+
var(--sh3-bg-elevated) 10px 20px
|
|
268
268
|
);
|
|
269
|
-
border: 1px dashed var(--
|
|
269
|
+
border: 1px dashed var(--sh3-border-strong);
|
|
270
270
|
}
|
|
271
271
|
.empty-tabs-custom {
|
|
272
272
|
position: absolute;
|
|
@@ -129,32 +129,32 @@
|
|
|
129
129
|
flex-direction: column;
|
|
130
130
|
align-items: center;
|
|
131
131
|
justify-content: center;
|
|
132
|
-
gap: var(--
|
|
133
|
-
color: var(--
|
|
132
|
+
gap: var(--sh3-pad-sm);
|
|
133
|
+
color: var(--sh3-fg-muted);
|
|
134
134
|
font-size: 12px;
|
|
135
135
|
text-align: center;
|
|
136
|
-
padding: var(--
|
|
136
|
+
padding: var(--sh3-pad-md);
|
|
137
137
|
background:
|
|
138
138
|
repeating-linear-gradient(
|
|
139
139
|
45deg,
|
|
140
|
-
var(--
|
|
141
|
-
var(--
|
|
140
|
+
var(--sh3-bg) 0 10px,
|
|
141
|
+
var(--sh3-bg-elevated) 10px 20px
|
|
142
142
|
);
|
|
143
|
-
border: 1px dashed var(--
|
|
143
|
+
border: 1px dashed var(--sh3-border-strong);
|
|
144
144
|
pointer-events: none;
|
|
145
145
|
}
|
|
146
146
|
.slot-id {
|
|
147
|
-
color: var(--
|
|
148
|
-
font-family: var(--
|
|
147
|
+
color: var(--sh3-fg);
|
|
148
|
+
font-family: var(--sh3-font-mono);
|
|
149
149
|
font-size: 13px;
|
|
150
150
|
}
|
|
151
151
|
.slot-meta code {
|
|
152
|
-
font-family: var(--
|
|
153
|
-
color: var(--
|
|
152
|
+
font-family: var(--sh3-font-mono);
|
|
153
|
+
color: var(--sh3-accent);
|
|
154
154
|
}
|
|
155
155
|
.slot-dims {
|
|
156
|
-
font-family: var(--
|
|
157
|
-
color: var(--
|
|
156
|
+
font-family: var(--sh3-font-mono);
|
|
157
|
+
color: var(--sh3-fg-subtle);
|
|
158
158
|
font-size: 11px;
|
|
159
159
|
}
|
|
160
160
|
</style>
|
|
@@ -153,9 +153,9 @@
|
|
|
153
153
|
}
|
|
154
154
|
.quad-highlight {
|
|
155
155
|
position: absolute;
|
|
156
|
-
background: var(--
|
|
156
|
+
background: var(--sh3-accent);
|
|
157
157
|
opacity: 0.18;
|
|
158
|
-
border: 1px dashed var(--
|
|
158
|
+
border: 1px dashed var(--sh3-accent);
|
|
159
159
|
pointer-events: none;
|
|
160
160
|
transition: inset 80ms ease;
|
|
161
161
|
}
|
|
@@ -69,7 +69,7 @@ export declare function popoutView(slotId: string): string | null;
|
|
|
69
69
|
export declare function dockFloat(floatId: string): boolean;
|
|
70
70
|
/**
|
|
71
71
|
* Dock a view into the currently-rendered layout without caring which
|
|
72
|
-
* root it is. Used by the Ctrl+`
|
|
72
|
+
* root it is. Used by the Ctrl+` sh3 hotkey and other "just put it
|
|
73
73
|
* somewhere sensible" callers. Policy:
|
|
74
74
|
*
|
|
75
75
|
* 1. If a tab with the same `viewId` already exists, focus it and
|
|
@@ -274,7 +274,7 @@ function findFirstSlotPath(node, path = []) {
|
|
|
274
274
|
}
|
|
275
275
|
/**
|
|
276
276
|
* Dock a view into the currently-rendered layout without caring which
|
|
277
|
-
* root it is. Used by the Ctrl+`
|
|
277
|
+
* root it is. Used by the Ctrl+` sh3 hotkey and other "just put it
|
|
278
278
|
* somewhere sensible" callers. Policy:
|
|
279
279
|
*
|
|
280
280
|
* 1. If a tab with the same `viewId` already exists, focus it and
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Layout manager — owns both the framework-constant
|
|
2
|
+
* Layout manager — owns both the framework-constant sh3 home layout
|
|
3
3
|
* and the currently-active app's persisted layout, and swaps between
|
|
4
4
|
* them without tearing down the held tree.
|
|
5
5
|
*
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* entirely (there is no "held home while rendering app" state).
|
|
25
25
|
*
|
|
26
26
|
* Orphan cleanup:
|
|
27
|
-
* The pre-phase-8
|
|
27
|
+
* The pre-phase-8 sh3 wrote to `sh3:workspace:__shell__`. Phase 8
|
|
28
28
|
* switches to per-app keys; the old entry would otherwise sit as dead
|
|
29
29
|
* data. On first load after upgrade, the manager clears that orphan
|
|
30
30
|
* unconditionally (clearing a non-existent entry is a no-op).
|
|
@@ -35,7 +35,7 @@ import { normalizeInitialLayout } from './presets';
|
|
|
35
35
|
import { collectTreeSlotRefs } from './tree-walk';
|
|
36
36
|
import { bindPresetBlob, unbindPresetBlob } from '../overlays/presets';
|
|
37
37
|
import { getRegisteredApp } from '../apps/registry.svelte';
|
|
38
|
-
// ---------- orphan cleanup of pre-phase-8
|
|
38
|
+
// ---------- orphan cleanup of pre-phase-8 sh3 layout key ----------------
|
|
39
39
|
// Legacy pre-phase-8 orphan cleanup. The literal '__shell__' here is
|
|
40
40
|
// intentional — it clears data written under the old reserved id before
|
|
41
41
|
// this shard was restructured. Do not replace with '__sh3core__'.
|
package/dist/layout/types.d.ts
CHANGED
|
@@ -190,7 +190,7 @@ export type TreeRootRef = {
|
|
|
190
190
|
export declare const LAYOUT_SCHEMA_VERSION = 4;
|
|
191
191
|
/**
|
|
192
192
|
* The wire shape of a persisted layout in the workspace state zone.
|
|
193
|
-
* One blob per
|
|
193
|
+
* One blob per sh3 (or per program, once per-program layouts exist);
|
|
194
194
|
* the version field gates compatibility.
|
|
195
195
|
*/
|
|
196
196
|
export interface PersistedLayout {
|
|
@@ -100,46 +100,46 @@
|
|
|
100
100
|
.layout-save {
|
|
101
101
|
padding: 16px 20px;
|
|
102
102
|
max-width: 460px;
|
|
103
|
-
color: var(--
|
|
104
|
-
background: var(--
|
|
103
|
+
color: var(--sh3-fg);
|
|
104
|
+
background: var(--sh3-bg);
|
|
105
105
|
font: inherit;
|
|
106
106
|
}
|
|
107
107
|
h2 { margin: 0 0 12px; font-size: 16px; }
|
|
108
108
|
.row { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; font-size: 13px; }
|
|
109
|
-
.row span { color: var(--
|
|
109
|
+
.row span { color: var(--sh3-fg-muted); }
|
|
110
110
|
.name-input {
|
|
111
|
-
background: var(--
|
|
112
|
-
color: var(--
|
|
113
|
-
border: 1px solid var(--
|
|
114
|
-
border-radius: var(--
|
|
111
|
+
background: var(--sh3-bg-elevated);
|
|
112
|
+
color: var(--sh3-fg);
|
|
113
|
+
border: 1px solid var(--sh3-border);
|
|
114
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
115
115
|
padding: 6px 8px; font: inherit; font-size: 13px;
|
|
116
116
|
}
|
|
117
117
|
.preview { margin: 4px 0 12px; }
|
|
118
|
-
.preview-label { font-size: 12px; color: var(--
|
|
118
|
+
.preview-label { font-size: 12px; color: var(--sh3-fg-muted); margin-bottom: 4px; }
|
|
119
119
|
.preview-list {
|
|
120
120
|
list-style: none; padding: 0; margin: 0;
|
|
121
121
|
font-size: 12px; max-height: 160px; overflow: auto;
|
|
122
|
-
border: 1px solid var(--
|
|
123
|
-
border-radius: var(--
|
|
124
|
-
background: var(--
|
|
122
|
+
border: 1px solid var(--sh3-border);
|
|
123
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
124
|
+
background: var(--sh3-bg-elevated);
|
|
125
125
|
}
|
|
126
|
-
.preview-list li { padding: 4px 8px; border-bottom: 1px solid var(--
|
|
126
|
+
.preview-list li { padding: 4px 8px; border-bottom: 1px solid var(--sh3-border); }
|
|
127
127
|
.preview-list li:last-child { border-bottom: 0; }
|
|
128
|
-
.muted { color: var(--
|
|
128
|
+
.muted { color: var(--sh3-fg-muted); }
|
|
129
129
|
.error {
|
|
130
|
-
color: var(--
|
|
130
|
+
color: var(--sh3-fg-muted);
|
|
131
131
|
font-style: italic;
|
|
132
132
|
margin: 4px 0 12px;
|
|
133
133
|
}
|
|
134
134
|
.actions { display: flex; gap: 8px; margin-top: 8px; }
|
|
135
135
|
.actions button {
|
|
136
|
-
background: var(--
|
|
137
|
-
color: var(--
|
|
138
|
-
border: 1px solid var(--
|
|
139
|
-
border-radius: var(--
|
|
136
|
+
background: var(--sh3-bg-elevated);
|
|
137
|
+
color: var(--sh3-fg);
|
|
138
|
+
border: 1px solid var(--sh3-border);
|
|
139
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
140
140
|
padding: 6px 14px; font: inherit; cursor: pointer;
|
|
141
141
|
}
|
|
142
|
-
.actions button.primary { background: var(--
|
|
143
|
-
.actions button:hover { border-color: var(--
|
|
142
|
+
.actions button.primary { background: var(--sh3-accent); color: #fff; border-color: var(--sh3-accent); }
|
|
143
|
+
.actions button:hover { border-color: var(--sh3-accent); }
|
|
144
144
|
.actions button:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
145
145
|
</style>
|