sh3-core 0.15.3 → 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} +22 -10
- package/dist/{shellRuntime.svelte.js → sh3Runtime.svelte.js} +12 -10
- package/dist/sh3Runtime.svelte.test.d.ts +1 -0
- package/dist/sh3Runtime.svelte.test.js +46 -0
- 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
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
2
|
import { render, fireEvent } from '@testing-library/svelte';
|
|
3
3
|
import Select from './Select.svelte';
|
|
4
|
-
vi.mock('../../
|
|
5
|
-
|
|
4
|
+
vi.mock('../../sh3Runtime.svelte', () => ({
|
|
5
|
+
sh3: { popup: { show: () => ({ close: () => { } }) } },
|
|
6
6
|
}));
|
|
7
7
|
describe('Select event contract', () => {
|
|
8
8
|
const options = [
|
|
@@ -71,9 +71,9 @@
|
|
|
71
71
|
|
|
72
72
|
.sh3-slider__track {
|
|
73
73
|
position: absolute;
|
|
74
|
-
background: var(--
|
|
75
|
-
border: 1px solid var(--
|
|
76
|
-
border-radius: var(--
|
|
74
|
+
background: var(--sh3-track-bg);
|
|
75
|
+
border: 1px solid var(--sh3-track-border);
|
|
76
|
+
border-radius: var(--sh3-widget-radius-pill);
|
|
77
77
|
pointer-events: none;
|
|
78
78
|
}
|
|
79
79
|
.sh3-slider--horizontal .sh3-slider__track {
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
|
|
90
90
|
.sh3-slider__fill {
|
|
91
91
|
position: absolute;
|
|
92
|
-
background: var(--
|
|
92
|
+
background: var(--sh3-track-fill);
|
|
93
93
|
border-radius: inherit;
|
|
94
94
|
}
|
|
95
95
|
.sh3-slider--horizontal .sh3-slider__fill {
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
|
|
104
104
|
.sh3-slider__tick {
|
|
105
105
|
position: absolute;
|
|
106
|
-
background: var(--
|
|
106
|
+
background: var(--sh3-tick-bg);
|
|
107
107
|
}
|
|
108
108
|
.sh3-slider--horizontal .sh3-slider__tick {
|
|
109
109
|
width: 1px; height: 8px; top: 50%;
|
|
@@ -139,12 +139,12 @@
|
|
|
139
139
|
cursor: not-allowed;
|
|
140
140
|
opacity: 1;
|
|
141
141
|
}
|
|
142
|
-
.sh3-slider--invalid .sh3-slider__track { border-color: var(--
|
|
142
|
+
.sh3-slider--invalid .sh3-slider__track { border-color: var(--sh3-error); }
|
|
143
143
|
|
|
144
144
|
/* Disabled state: shift the fill + thumb to muted/border tokens
|
|
145
145
|
instead of using opacity, so the thumb stays opaque (no see-through). */
|
|
146
146
|
.sh3-slider:has(.sh3-slider__native:disabled) .sh3-slider__fill {
|
|
147
|
-
background: var(--
|
|
147
|
+
background: var(--sh3-border-strong);
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
.sh3-slider__native::-webkit-slider-thumb {
|
|
@@ -152,9 +152,9 @@
|
|
|
152
152
|
width: var(--thumb-size);
|
|
153
153
|
height: var(--thumb-size);
|
|
154
154
|
border-radius: 50%;
|
|
155
|
-
background: var(--
|
|
156
|
-
border: 2px solid var(--
|
|
157
|
-
box-shadow: var(--
|
|
155
|
+
background: var(--sh3-thumb-bg);
|
|
156
|
+
border: 2px solid var(--sh3-thumb-border);
|
|
157
|
+
box-shadow: var(--sh3-thumb-shadow);
|
|
158
158
|
cursor: pointer;
|
|
159
159
|
opacity: 1;
|
|
160
160
|
}
|
|
@@ -162,21 +162,21 @@
|
|
|
162
162
|
width: var(--thumb-size);
|
|
163
163
|
height: var(--thumb-size);
|
|
164
164
|
border-radius: 50%;
|
|
165
|
-
background: var(--
|
|
166
|
-
border: 2px solid var(--
|
|
167
|
-
box-shadow: var(--
|
|
165
|
+
background: var(--sh3-thumb-bg);
|
|
166
|
+
border: 2px solid var(--sh3-thumb-border);
|
|
167
|
+
box-shadow: var(--sh3-thumb-shadow);
|
|
168
168
|
cursor: pointer;
|
|
169
169
|
opacity: 1;
|
|
170
170
|
}
|
|
171
171
|
.sh3-slider__native:disabled::-webkit-slider-thumb {
|
|
172
|
-
background: var(--
|
|
173
|
-
border-color: var(--
|
|
172
|
+
background: var(--sh3-fg-subtle);
|
|
173
|
+
border-color: var(--sh3-border-strong);
|
|
174
174
|
cursor: not-allowed;
|
|
175
175
|
opacity: 1;
|
|
176
176
|
}
|
|
177
177
|
.sh3-slider__native:disabled::-moz-range-thumb {
|
|
178
|
-
background: var(--
|
|
179
|
-
border-color: var(--
|
|
178
|
+
background: var(--sh3-fg-subtle);
|
|
179
|
+
border-color: var(--sh3-border-strong);
|
|
180
180
|
cursor: not-allowed;
|
|
181
181
|
opacity: 1;
|
|
182
182
|
}
|
|
@@ -185,16 +185,16 @@
|
|
|
185
185
|
background: transparent;
|
|
186
186
|
}
|
|
187
187
|
.sh3-slider__native:focus-visible::-webkit-slider-thumb {
|
|
188
|
-
box-shadow: var(--
|
|
188
|
+
box-shadow: var(--sh3-focus-ring), var(--sh3-thumb-shadow);
|
|
189
189
|
}
|
|
190
190
|
.sh3-slider__native:focus-visible::-moz-range-thumb {
|
|
191
|
-
box-shadow: var(--
|
|
191
|
+
box-shadow: var(--sh3-focus-ring), var(--sh3-thumb-shadow);
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
.sh3-slider__value {
|
|
195
195
|
position: absolute;
|
|
196
196
|
font-size: 0.75rem;
|
|
197
|
-
color: var(--
|
|
197
|
+
color: var(--sh3-fg-muted);
|
|
198
198
|
pointer-events: none;
|
|
199
199
|
transform: translate(-50%, 0);
|
|
200
200
|
}
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
</div>
|
|
48
48
|
|
|
49
49
|
<style>
|
|
50
|
-
.sh3-sg { display: inline-flex; gap: var(--
|
|
50
|
+
.sh3-sg { display: inline-flex; gap: var(--sh3-pad-md); }
|
|
51
51
|
.sh3-sg--vertical { flex-direction: row; align-items: end; }
|
|
52
52
|
.sh3-sg--horizontal { flex-direction: column; }
|
|
53
53
|
.sh3-sg__channel {
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
.sh3-sg--vertical .sh3-sg__channel { flex-direction: column-reverse; align-items: center; }
|
|
57
57
|
.sh3-sg__label {
|
|
58
58
|
font-size: 0.75rem;
|
|
59
|
-
color: var(--
|
|
59
|
+
color: var(--sh3-fg-muted);
|
|
60
60
|
min-width: 60px;
|
|
61
61
|
}
|
|
62
62
|
.sh3-sg--vertical .sh3-sg__label { min-width: 0; text-align: center; }
|
|
@@ -55,33 +55,33 @@
|
|
|
55
55
|
display: inline-flex;
|
|
56
56
|
flex-direction: column;
|
|
57
57
|
gap: 4px;
|
|
58
|
-
font-family: var(--
|
|
58
|
+
font-family: var(--sh3-font-ui);
|
|
59
59
|
font-size: 0.8125rem;
|
|
60
60
|
}
|
|
61
61
|
.sh3-textarea__label {
|
|
62
|
-
color: var(--
|
|
62
|
+
color: var(--sh3-fg-muted);
|
|
63
63
|
font-size: 0.75rem;
|
|
64
64
|
}
|
|
65
65
|
.sh3-textarea__input {
|
|
66
|
-
background: var(--
|
|
67
|
-
color: var(--
|
|
68
|
-
border: 1px solid var(--
|
|
69
|
-
border-radius: var(--
|
|
70
|
-
padding: var(--
|
|
66
|
+
background: var(--sh3-input-bg);
|
|
67
|
+
color: var(--sh3-fg);
|
|
68
|
+
border: 1px solid var(--sh3-border);
|
|
69
|
+
border-radius: var(--sh3-widget-radius);
|
|
70
|
+
padding: var(--sh3-pad-sm) var(--sh3-field-pad-x);
|
|
71
71
|
font: inherit;
|
|
72
72
|
outline: none;
|
|
73
|
-
transition: border-color var(--
|
|
73
|
+
transition: border-color var(--sh3-motion-fast) var(--sh3-ease-standard);
|
|
74
74
|
}
|
|
75
75
|
.sh3-textarea__input:focus {
|
|
76
|
-
border-color: var(--
|
|
77
|
-
box-shadow: var(--
|
|
76
|
+
border-color: var(--sh3-input-border-focus);
|
|
77
|
+
box-shadow: var(--sh3-focus-ring);
|
|
78
78
|
}
|
|
79
79
|
.sh3-textarea--invalid .sh3-textarea__input {
|
|
80
|
-
border-color: var(--
|
|
80
|
+
border-color: var(--sh3-error);
|
|
81
81
|
}
|
|
82
82
|
.sh3-textarea__helper {
|
|
83
|
-
color: var(--
|
|
83
|
+
color: var(--sh3-fg-muted);
|
|
84
84
|
font-size: 0.75rem;
|
|
85
85
|
}
|
|
86
|
-
.sh3-textarea__helper--error { color: var(--
|
|
86
|
+
.sh3-textarea__helper--error { color: var(--sh3-error); }
|
|
87
87
|
</style>
|
|
@@ -166,13 +166,13 @@
|
|
|
166
166
|
|
|
167
167
|
<style>
|
|
168
168
|
.sh3-listbox {
|
|
169
|
-
background: var(--
|
|
170
|
-
border: 1px solid var(--
|
|
171
|
-
border-radius: var(--
|
|
172
|
-
box-shadow: var(--
|
|
169
|
+
background: var(--sh3-bg-elevated);
|
|
170
|
+
border: 1px solid var(--sh3-border);
|
|
171
|
+
border-radius: var(--sh3-widget-radius);
|
|
172
|
+
box-shadow: var(--sh3-shadow-sm);
|
|
173
173
|
min-width: 180px;
|
|
174
174
|
max-width: 320px;
|
|
175
|
-
color: var(--
|
|
175
|
+
color: var(--sh3-fg);
|
|
176
176
|
font-size: 0.8125rem;
|
|
177
177
|
overflow: hidden;
|
|
178
178
|
}
|
|
@@ -180,10 +180,10 @@
|
|
|
180
180
|
width: 100%;
|
|
181
181
|
height: 26px;
|
|
182
182
|
padding: 0 8px;
|
|
183
|
-
background: var(--
|
|
183
|
+
background: var(--sh3-input-bg);
|
|
184
184
|
border: none;
|
|
185
|
-
border-bottom: 1px solid var(--
|
|
186
|
-
color: var(--
|
|
185
|
+
border-bottom: 1px solid var(--sh3-border);
|
|
186
|
+
color: var(--sh3-fg);
|
|
187
187
|
font: inherit;
|
|
188
188
|
outline: none;
|
|
189
189
|
}
|
|
@@ -197,11 +197,11 @@
|
|
|
197
197
|
padding: 4px 10px;
|
|
198
198
|
cursor: pointer;
|
|
199
199
|
}
|
|
200
|
-
.sh3-listbox__opt--active { background: var(--
|
|
201
|
-
.sh3-listbox__opt--selected { color: var(--
|
|
202
|
-
.sh3-listbox__opt--active.sh3-listbox__opt--selected { background: var(--
|
|
200
|
+
.sh3-listbox__opt--active { background: var(--sh3-bg); }
|
|
201
|
+
.sh3-listbox__opt--selected { color: var(--sh3-accent); }
|
|
202
|
+
.sh3-listbox__opt--active.sh3-listbox__opt--selected { background: var(--sh3-accent); color: var(--sh3-fg-on-accent); }
|
|
203
203
|
.sh3-listbox__list > div[aria-disabled="true"] {
|
|
204
|
-
color: var(--
|
|
204
|
+
color: var(--sh3-fg-subtle);
|
|
205
205
|
cursor: not-allowed;
|
|
206
206
|
}
|
|
207
207
|
.sh3-listbox__check {
|
|
@@ -214,15 +214,15 @@
|
|
|
214
214
|
display: block;
|
|
215
215
|
width: 100%;
|
|
216
216
|
height: 100%;
|
|
217
|
-
background: var(--
|
|
217
|
+
background: var(--sh3-accent);
|
|
218
218
|
clip-path: polygon(14% 44%, 0 60%, 40% 100%, 100% 20%, 85% 8%, 38% 70%);
|
|
219
219
|
}
|
|
220
220
|
.sh3-listbox__opt--active.sh3-listbox__opt--selected .sh3-listbox__check--on::before {
|
|
221
|
-
background: var(--
|
|
221
|
+
background: var(--sh3-fg-on-accent);
|
|
222
222
|
}
|
|
223
223
|
.sh3-listbox__empty {
|
|
224
224
|
padding: 6px 10px;
|
|
225
|
-
color: var(--
|
|
225
|
+
color: var(--sh3-fg-muted);
|
|
226
226
|
font-style: italic;
|
|
227
227
|
}
|
|
228
228
|
</style>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* `null` means the user is in their personal scope. Otherwise it carries
|
|
5
5
|
* the active project's id. Read at app launch by `launchApp` to bind
|
|
6
|
-
* `ctx.scopeId`, and read by
|
|
6
|
+
* `ctx.scopeId`, and read by Sh3Home / BrandSlot for UX rendering.
|
|
7
7
|
*
|
|
8
8
|
* Setting the slot through `setActiveProjectId` is the only supported
|
|
9
9
|
* mutation path: it clears the breadcrumb pointer (so resuming an app
|
|
@@ -97,11 +97,11 @@
|
|
|
97
97
|
.delete-project-dialog__title {
|
|
98
98
|
font-size: 16px;
|
|
99
99
|
font-weight: 600;
|
|
100
|
-
color: var(--
|
|
100
|
+
color: var(--sh3-fg);
|
|
101
101
|
}
|
|
102
102
|
.delete-project-dialog__body {
|
|
103
103
|
font-size: 13px;
|
|
104
|
-
color: var(--
|
|
104
|
+
color: var(--sh3-fg-muted, var(--sh3-fg));
|
|
105
105
|
line-height: 1.5;
|
|
106
106
|
}
|
|
107
107
|
.delete-project-dialog__opt {
|
|
@@ -109,18 +109,18 @@
|
|
|
109
109
|
align-items: flex-start;
|
|
110
110
|
gap: 8px;
|
|
111
111
|
font-size: 13px;
|
|
112
|
-
color: var(--
|
|
112
|
+
color: var(--sh3-fg);
|
|
113
113
|
cursor: pointer;
|
|
114
114
|
}
|
|
115
115
|
.delete-project-dialog__opt input { margin-top: 3px; }
|
|
116
116
|
.delete-project-dialog__path {
|
|
117
117
|
display: block;
|
|
118
|
-
font-family: var(--
|
|
118
|
+
font-family: var(--sh3-font-mono, monospace);
|
|
119
119
|
font-size: 11px;
|
|
120
|
-
color: var(--
|
|
121
|
-
background: var(--
|
|
120
|
+
color: var(--sh3-fg-muted);
|
|
121
|
+
background: var(--sh3-bg-elevated);
|
|
122
122
|
padding: 2px 6px;
|
|
123
|
-
border-radius: var(--
|
|
123
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
124
124
|
margin-top: 2px;
|
|
125
125
|
word-break: break-all;
|
|
126
126
|
}
|
|
@@ -133,10 +133,10 @@
|
|
|
133
133
|
.delete-project-dialog__btn {
|
|
134
134
|
font-size: 13px;
|
|
135
135
|
padding: 6px 14px;
|
|
136
|
-
border-radius: var(--
|
|
137
|
-
border: 1px solid var(--
|
|
136
|
+
border-radius: var(--sh3-radius-sm, 4px);
|
|
137
|
+
border: 1px solid var(--sh3-border-strong);
|
|
138
138
|
background: transparent;
|
|
139
|
-
color: var(--
|
|
139
|
+
color: var(--sh3-fg);
|
|
140
140
|
cursor: pointer;
|
|
141
141
|
}
|
|
142
142
|
.delete-project-dialog__btn:disabled {
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
cursor: not-allowed;
|
|
145
145
|
}
|
|
146
146
|
.delete-project-dialog__btn--danger {
|
|
147
|
-
color: var(--
|
|
148
|
-
border-color: var(--
|
|
147
|
+
color: var(--sh3-error, #d32f2f);
|
|
148
|
+
border-color: var(--sh3-error, #d32f2f);
|
|
149
149
|
}
|
|
150
150
|
</style>
|
|
@@ -152,8 +152,8 @@
|
|
|
152
152
|
display: flex;
|
|
153
153
|
flex-direction: column;
|
|
154
154
|
font: inherit;
|
|
155
|
-
color: var(--
|
|
156
|
-
background: var(--
|
|
155
|
+
color: var(--sh3-fg);
|
|
156
|
+
background: var(--sh3-bg);
|
|
157
157
|
}
|
|
158
158
|
.body {
|
|
159
159
|
flex: 1;
|
|
@@ -161,8 +161,8 @@
|
|
|
161
161
|
padding: 16px 16px 8px;
|
|
162
162
|
}
|
|
163
163
|
h2 { margin: 0 0 8px; font-size: 16px; }
|
|
164
|
-
.project-id { font-size: 12px; color: var(--
|
|
165
|
-
.project-id code { font-family: var(--
|
|
164
|
+
.project-id { font-size: 12px; color: var(--sh3-fg-muted); margin: 0 0 16px; }
|
|
165
|
+
.project-id code { font-family: var(--sh3-font-mono, monospace); }
|
|
166
166
|
.field {
|
|
167
167
|
display: flex;
|
|
168
168
|
flex-direction: column;
|
|
@@ -170,50 +170,50 @@
|
|
|
170
170
|
margin-bottom: 12px;
|
|
171
171
|
font-size: 13px;
|
|
172
172
|
}
|
|
173
|
-
.field span { color: var(--
|
|
174
|
-
.hint { font-size: 11px; color: var(--
|
|
173
|
+
.field span { color: var(--sh3-fg-muted); }
|
|
174
|
+
.hint { font-size: 11px; color: var(--sh3-fg-muted); }
|
|
175
175
|
.hint code {
|
|
176
|
-
font-family: var(--
|
|
177
|
-
color: var(--
|
|
178
|
-
background: var(--
|
|
176
|
+
font-family: var(--sh3-font-mono, monospace);
|
|
177
|
+
color: var(--sh3-fg);
|
|
178
|
+
background: var(--sh3-bg-elevated);
|
|
179
179
|
padding: 0 4px;
|
|
180
|
-
border-radius: var(--
|
|
180
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
181
181
|
}
|
|
182
182
|
.field input,
|
|
183
183
|
.field textarea {
|
|
184
|
-
background: var(--
|
|
185
|
-
color: var(--
|
|
186
|
-
border: 1px solid var(--
|
|
187
|
-
border-radius: var(--
|
|
184
|
+
background: var(--sh3-bg-elevated);
|
|
185
|
+
color: var(--sh3-fg);
|
|
186
|
+
border: 1px solid var(--sh3-border);
|
|
187
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
188
188
|
padding: 6px 8px;
|
|
189
189
|
font: inherit;
|
|
190
190
|
font-size: 13px;
|
|
191
191
|
}
|
|
192
192
|
.field textarea { resize: vertical; min-height: 60px; }
|
|
193
|
-
.error { color: var(--
|
|
193
|
+
.error { color: var(--sh3-error, #c33); font-size: 13px; margin: 0 0 8px; }
|
|
194
194
|
.actions {
|
|
195
195
|
display: flex;
|
|
196
196
|
gap: 8px;
|
|
197
197
|
padding: 12px 16px;
|
|
198
|
-
border-top: 1px solid var(--
|
|
199
|
-
background: var(--
|
|
198
|
+
border-top: 1px solid var(--sh3-border);
|
|
199
|
+
background: var(--sh3-bg);
|
|
200
200
|
flex: 0 0 auto;
|
|
201
201
|
}
|
|
202
202
|
.actions button {
|
|
203
|
-
background: var(--
|
|
204
|
-
color: var(--
|
|
205
|
-
border: 1px solid var(--
|
|
206
|
-
border-radius: var(--
|
|
203
|
+
background: var(--sh3-bg-elevated);
|
|
204
|
+
color: var(--sh3-fg);
|
|
205
|
+
border: 1px solid var(--sh3-border);
|
|
206
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
207
207
|
padding: 6px 14px;
|
|
208
208
|
font: inherit;
|
|
209
209
|
cursor: pointer;
|
|
210
210
|
}
|
|
211
|
-
.actions button:hover { border-color: var(--
|
|
211
|
+
.actions button:hover { border-color: var(--sh3-accent); }
|
|
212
212
|
.actions button.primary {
|
|
213
|
-
background: var(--
|
|
213
|
+
background: var(--sh3-accent);
|
|
214
214
|
color: #fff;
|
|
215
|
-
border-color: var(--
|
|
215
|
+
border-color: var(--sh3-accent);
|
|
216
216
|
}
|
|
217
|
-
.actions button.danger { margin-left: auto; color: var(--
|
|
217
|
+
.actions button.danger { margin-left: auto; color: var(--sh3-error, #c33); }
|
|
218
218
|
.actions button:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
219
219
|
</style>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
/*
|
|
3
|
-
* Projects section for
|
|
3
|
+
* Projects section for Sh3Home.
|
|
4
4
|
*
|
|
5
5
|
* Renders the list of projects the current user is a member of as
|
|
6
6
|
* selectable cards. Selecting a project sets sessionState.activeProjectId
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
font-weight: 600;
|
|
70
70
|
text-transform: uppercase;
|
|
71
71
|
letter-spacing: 0.06em;
|
|
72
|
-
color: var(--
|
|
72
|
+
color: var(--sh3-fg-subtle);
|
|
73
73
|
margin: 0 0 12px;
|
|
74
74
|
}
|
|
75
75
|
.projects-grid {
|
|
@@ -84,9 +84,9 @@
|
|
|
84
84
|
align-items: flex-start;
|
|
85
85
|
gap: 4px;
|
|
86
86
|
padding: 12px 14px;
|
|
87
|
-
background: var(--
|
|
88
|
-
border: 1px solid var(--
|
|
89
|
-
border-radius: var(--
|
|
87
|
+
background: var(--sh3-grad-bg-elevated, var(--sh3-bg-elevated));
|
|
88
|
+
border: 1px solid var(--sh3-border);
|
|
89
|
+
border-radius: var(--sh3-radius-md);
|
|
90
90
|
cursor: pointer;
|
|
91
91
|
text-align: left;
|
|
92
92
|
color: inherit;
|
|
@@ -100,21 +100,21 @@
|
|
|
100
100
|
right: 6px;
|
|
101
101
|
background: transparent;
|
|
102
102
|
border: 0;
|
|
103
|
-
color: var(--
|
|
103
|
+
color: var(--sh3-fg-muted);
|
|
104
104
|
cursor: pointer;
|
|
105
105
|
padding: 2px 6px;
|
|
106
106
|
font-size: 14px;
|
|
107
|
-
border-radius: var(--
|
|
107
|
+
border-radius: var(--sh3-radius-sm, 3px);
|
|
108
108
|
}
|
|
109
|
-
.project-card-edit:hover { color: var(--
|
|
109
|
+
.project-card-edit:hover { color: var(--sh3-fg); background: var(--sh3-bg-elevated); }
|
|
110
110
|
.project-card:hover {
|
|
111
|
-
border-color: var(--
|
|
111
|
+
border-color: var(--sh3-accent);
|
|
112
112
|
transform: translateY(-1px);
|
|
113
113
|
}
|
|
114
114
|
.project-card.active {
|
|
115
|
-
border-color: var(--
|
|
116
|
-
box-shadow: 0 0 0 2px color-mix(in srgb, var(--
|
|
115
|
+
border-color: var(--sh3-accent);
|
|
116
|
+
box-shadow: 0 0 0 2px color-mix(in srgb, var(--sh3-accent) 40%, transparent);
|
|
117
117
|
}
|
|
118
118
|
.project-name { font-weight: 600; font-size: 13px; }
|
|
119
|
-
.project-meta { font-size: 11px; color: var(--
|
|
119
|
+
.project-meta { font-size: 11px; color: var(--sh3-fg-muted); }
|
|
120
120
|
</style>
|
|
@@ -53,7 +53,7 @@ export declare function listInstalledPackages(): Promise<InstalledPackage[]>;
|
|
|
53
53
|
* Load all installed packages from IndexedDB and register them.
|
|
54
54
|
*
|
|
55
55
|
* Called once at boot by `bootstrap()`, before any glob-discovered shards
|
|
56
|
-
* or the
|
|
57
|
-
* as warnings but do not prevent the
|
|
56
|
+
* or the sh3 shard are registered. Individual package failures are logged
|
|
57
|
+
* as warnings but do not prevent the sh3 from booting.
|
|
58
58
|
*/
|
|
59
59
|
export declare function loadInstalledPackages(): Promise<void>;
|
|
@@ -163,8 +163,8 @@ export async function listInstalledPackages() {
|
|
|
163
163
|
* Load all installed packages from IndexedDB and register them.
|
|
164
164
|
*
|
|
165
165
|
* Called once at boot by `bootstrap()`, before any glob-discovered shards
|
|
166
|
-
* or the
|
|
167
|
-
* as warnings but do not prevent the
|
|
166
|
+
* or the sh3 shard are registered. Individual package failures are logged
|
|
167
|
+
* as warnings but do not prevent the sh3 from booting.
|
|
168
168
|
*/
|
|
169
169
|
export async function loadInstalledPackages() {
|
|
170
170
|
let packages;
|
package/dist/registry/loader.js
CHANGED
|
@@ -60,7 +60,7 @@ const shimUrls = {
|
|
|
60
60
|
// `svelte/internal/disclose-version` is a side-effect-only import (no exports).
|
|
61
61
|
// Create an empty shim so the import doesn't fail.
|
|
62
62
|
shimUrls['svelte/internal/disclose-version'] = URL.createObjectURL(new Blob([''], { type: 'application/javascript' }));
|
|
63
|
-
// `sh3/tokens.css` — design tokens are already loaded by the host
|
|
63
|
+
// `sh3/tokens.css` — design tokens are already loaded by the host sh3.
|
|
64
64
|
// Bundles that import this path get a no-op so the import doesn't fail.
|
|
65
65
|
shimUrls['sh3-core/tokens.css'] = URL.createObjectURL(new Blob([''], { type: 'application/javascript' }));
|
|
66
66
|
// ---- bare specifier rewriting ----------------------------------------------
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export const PERMISSION_DESCRIPTIONS = {
|
|
10
10
|
'state:manage': {
|
|
11
|
-
title: 'Manage
|
|
11
|
+
title: 'Manage sh3 state zones',
|
|
12
12
|
description: 'Read and write state zones belonging to other shards.',
|
|
13
13
|
},
|
|
14
14
|
'documents:browse': {
|
|
@@ -37,7 +37,7 @@ export const PERMISSION_DESCRIPTIONS = {
|
|
|
37
37
|
},
|
|
38
38
|
'keys:mint': {
|
|
39
39
|
title: 'Mint API keys',
|
|
40
|
-
description: 'Issue long-lived access tokens for this
|
|
40
|
+
description: 'Issue long-lived access tokens for this sh3.',
|
|
41
41
|
},
|
|
42
42
|
};
|
|
43
43
|
export function describePermission(id) {
|
|
@@ -3,7 +3,7 @@ import { describePermission, extractBundlePermissions, PERMISSION_DESCRIPTIONS,
|
|
|
3
3
|
describe('describePermission', () => {
|
|
4
4
|
it('returns the registered entry for a known permission id', () => {
|
|
5
5
|
const result = describePermission('state:manage');
|
|
6
|
-
expect(result.title).toBe('Manage
|
|
6
|
+
expect(result.title).toBe('Manage sh3 state zones');
|
|
7
7
|
expect(result.description).toContain('state zones');
|
|
8
8
|
});
|
|
9
9
|
it('covers every permission advertised in the module registry', () => {
|
|
@@ -95,7 +95,7 @@ describe('shell-shard programmatic verbs (integration)', () => {
|
|
|
95
95
|
throw new Error('unreachable');
|
|
96
96
|
expect(entry.text).toMatch(/no active app/);
|
|
97
97
|
});
|
|
98
|
-
it('shards emits a rich entry containing the active
|
|
98
|
+
it('shards emits a rich entry containing the active sh3 shard', async () => {
|
|
99
99
|
const out = await runVerbProgrammatic('shell', 'shards', []);
|
|
100
100
|
const entry = out.scrollback[0];
|
|
101
101
|
expect(entry.kind).toBe('rich');
|
|
@@ -140,7 +140,7 @@ describe('shell-shard programmatic verbs (integration)', () => {
|
|
|
140
140
|
expect(entry.level).toBe('warn');
|
|
141
141
|
});
|
|
142
142
|
it('zone with shardId+zoneName emits a rich entry exposing data.value', async () => {
|
|
143
|
-
const out = await runVerbProgrammatic('shell', 'zone', ['
|
|
143
|
+
const out = await runVerbProgrammatic('shell', 'zone', ['sh3', 'workspace']);
|
|
144
144
|
const entry = out.scrollback[0];
|
|
145
145
|
expect(entry.kind).toBe('rich');
|
|
146
146
|
if (entry.kind !== 'rich')
|
package/dist/runtime/runVerb.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* runVerbProgrammatic — programmatic verb dispatch with synthesized VerbContext.
|
|
3
3
|
*
|
|
4
4
|
* Used by `ctx.runVerb(...)` (see shards/activate.svelte.ts). Builds a
|
|
5
|
-
* sink scrollback that captures entries into an array, a headless
|
|
5
|
+
* sink scrollback that captures entries into an array, a headless Sh3Api
|
|
6
6
|
* (no terminal-bound state), a stub SessionClient, and a real TenantFsClient.
|
|
7
7
|
* Verbs that opt in via `programmatic: true` run against this synthesized
|
|
8
8
|
* context; non-programmatic verbs are rejected.
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
* fire-and-forget semantics).
|
|
14
14
|
*
|
|
15
15
|
* Resolution: prefixed names (`'sh3-store:install'`) look up directly;
|
|
16
|
-
* unprefixed
|
|
16
|
+
* unprefixed sh3 names (`'apps'`) resolve against shardId 'sh3'.
|
|
17
17
|
*/
|
|
18
18
|
import { activeShards } from '../shards/activate.svelte';
|
|
19
19
|
import { getVerb, listVerbsWithShard } from '../shards/registry';
|
|
20
|
-
import {
|
|
20
|
+
import { makeSh3ApiHeadless } from '../sh3Api/headless';
|
|
21
21
|
import { Scrollback } from '../shell-shard/scrollback.svelte';
|
|
22
22
|
import { SessionClient } from '../shell-shard/session-client.svelte';
|
|
23
23
|
import { TenantFsClient } from '../shell-shard/tenant-fs-client';
|
|
@@ -53,7 +53,7 @@ export async function runVerbProgrammatic(shardId, name, args, opts) {
|
|
|
53
53
|
async function buildProgrammaticContext(b) {
|
|
54
54
|
var _a, _b;
|
|
55
55
|
const ctx = {
|
|
56
|
-
|
|
56
|
+
sh3: makeSh3ApiHeadless(),
|
|
57
57
|
scrollback: b.sinkScrollback,
|
|
58
58
|
session: makeStubSession(),
|
|
59
59
|
cwd: '/',
|
|
@@ -129,18 +129,18 @@ describe('runVerbProgrammatic', () => {
|
|
|
129
129
|
await activateShard('tester');
|
|
130
130
|
await expect(runVerbProgrammatic('tester', 'tester:boom', [])).rejects.toThrow('kaboom');
|
|
131
131
|
});
|
|
132
|
-
it('exposes vctx.
|
|
132
|
+
it('exposes vctx.sh3.dispatchToTerminal that returns no-active-context', async () => {
|
|
133
133
|
let observed = undefined;
|
|
134
134
|
registerShard({
|
|
135
135
|
manifest: { id: 'tester', label: 'T', version: '0.0.0', views: [] },
|
|
136
136
|
activate(ctx) {
|
|
137
|
-
ctx.registerVerb(makeVerb('peek-
|
|
138
|
-
observed = vctx.
|
|
137
|
+
ctx.registerVerb(makeVerb('peek-sh3', true, async (vctx) => {
|
|
138
|
+
observed = vctx.sh3.dispatchToTerminal('foo');
|
|
139
139
|
}));
|
|
140
140
|
},
|
|
141
141
|
});
|
|
142
142
|
await activateShard('tester');
|
|
143
|
-
await runVerbProgrammatic('tester', 'tester:peek-
|
|
143
|
+
await runVerbProgrammatic('tester', 'tester:peek-sh3', []);
|
|
144
144
|
expect(observed).toMatchObject({
|
|
145
145
|
ok: false,
|
|
146
146
|
error: 'no-active-context',
|
|
@@ -94,17 +94,17 @@
|
|
|
94
94
|
</div>
|
|
95
95
|
|
|
96
96
|
<style>
|
|
97
|
-
.keys-peers { padding: 24px; font-family: system-ui, sans-serif; color: var(--
|
|
97
|
+
.keys-peers { padding: 24px; font-family: system-ui, sans-serif; color: var(--sh3-fg); }
|
|
98
98
|
.keys-peers-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
|
|
99
99
|
.keys-peers-header h2 { margin: 0; font-size: 18px; }
|
|
100
100
|
.keys-peers-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
|
|
101
|
-
.keys-peers-item { display: flex; justify-content: space-between; align-items: flex-start; padding: 12px 16px; background: var(--
|
|
101
|
+
.keys-peers-item { display: flex; justify-content: space-between; align-items: flex-start; padding: 12px 16px; background: var(--sh3-bg-elevated, #252540); border: 1px solid var(--sh3-border, #3a3a5c); border-radius: var(--sh3-radius, 6px); gap: 12px; }
|
|
102
102
|
.keys-peers-info { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
103
103
|
.keys-peers-label { font-weight: 600; }
|
|
104
|
-
.keys-peers-meta { font-size: 11px; color: var(--
|
|
104
|
+
.keys-peers-meta { font-size: 11px; color: var(--sh3-fg-subtle); }
|
|
105
105
|
.keys-peers-actions { display: flex; gap: 6px; flex-shrink: 0; align-items: flex-start; padding-top: 2px; }
|
|
106
|
-
.keys-peers-btn-danger { background: transparent; color: var(--
|
|
107
|
-
.keys-peers-btn-secondary { background: transparent; color: var(--
|
|
108
|
-
.keys-peers-muted { color: var(--
|
|
109
|
-
.keys-peers-error { color: var(--
|
|
106
|
+
.keys-peers-btn-danger { background: transparent; color: var(--sh3-error, #d32f2f); border: 1px solid var(--sh3-error, #d32f2f); font-size: 12px; padding: 4px 10px; border-radius: var(--sh3-radius, 6px); cursor: pointer; }
|
|
107
|
+
.keys-peers-btn-secondary { background: transparent; color: var(--sh3-fg-subtle); border: 1px solid var(--sh3-border, #3a3a5c); font-size: 12px; padding: 4px 10px; border-radius: var(--sh3-radius, 6px); cursor: pointer; }
|
|
108
|
+
.keys-peers-muted { color: var(--sh3-fg-muted); font-style: italic; }
|
|
109
|
+
.keys-peers-error { color: var(--sh3-error, #d32f2f); font-size: 13px; }
|
|
110
110
|
</style>
|