@happyvertical/smrt-svelte 0.37.9 → 0.37.10

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.
Files changed (86) hide show
  1. package/AGENTS.md +21 -85
  2. package/README.md +14 -10
  3. package/dist/components/workspace/MIGRATION.md +55 -0
  4. package/dist/components/workspace/README.md +22 -25
  5. package/dist/components/workspace/__tests__/AdminShell.test.js +55 -0
  6. package/dist/components/workspace/__tests__/admin-shell-hotkeys.test.js +34 -0
  7. package/dist/components/workspace/__tests__/admin-shell-settings.test.js +25 -0
  8. package/dist/components/workspace/__tests__/admin-shell-state.test.js +110 -0
  9. package/dist/components/workspace/__tests__/index.test.js +15 -24
  10. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts +2 -1
  11. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.d.ts.map +1 -1
  12. package/dist/components/workspace/__tests__/typed-tool-fixture/register-typed-tool.js +1 -1
  13. package/dist/components/workspace/admin-shell/ActivityBadge.svelte +25 -0
  14. package/dist/components/workspace/admin-shell/ActivityBadge.svelte.d.ts +9 -0
  15. package/dist/components/workspace/admin-shell/ActivityBadge.svelte.d.ts.map +1 -0
  16. package/dist/components/workspace/admin-shell/ActivityItem.svelte +85 -0
  17. package/dist/components/workspace/admin-shell/ActivityItem.svelte.d.ts +8 -0
  18. package/dist/components/workspace/admin-shell/ActivityItem.svelte.d.ts.map +1 -0
  19. package/dist/components/workspace/admin-shell/ActivityList.svelte +41 -0
  20. package/dist/components/workspace/admin-shell/ActivityList.svelte.d.ts +10 -0
  21. package/dist/components/workspace/admin-shell/ActivityList.svelte.d.ts.map +1 -0
  22. package/dist/components/workspace/admin-shell/ActivityToasts.svelte +140 -0
  23. package/dist/components/workspace/admin-shell/ActivityToasts.svelte.d.ts +16 -0
  24. package/dist/components/workspace/admin-shell/ActivityToasts.svelte.d.ts.map +1 -0
  25. package/dist/components/workspace/admin-shell/AdminShell.svelte +691 -0
  26. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts +24 -0
  27. package/dist/components/workspace/admin-shell/AdminShell.svelte.d.ts.map +1 -0
  28. package/dist/components/workspace/admin-shell/AppScopePanel.svelte +94 -0
  29. package/dist/components/workspace/admin-shell/AppScopePanel.svelte.d.ts +14 -0
  30. package/dist/components/workspace/admin-shell/AppScopePanel.svelte.d.ts.map +1 -0
  31. package/dist/components/workspace/admin-shell/HotkeyInput.svelte +74 -0
  32. package/dist/components/workspace/admin-shell/HotkeyInput.svelte.d.ts +11 -0
  33. package/dist/components/workspace/admin-shell/HotkeyInput.svelte.d.ts.map +1 -0
  34. package/dist/components/workspace/admin-shell/ShellCorner.svelte +25 -0
  35. package/dist/components/workspace/admin-shell/ShellCorner.svelte.d.ts +9 -0
  36. package/dist/components/workspace/admin-shell/ShellCorner.svelte.d.ts.map +1 -0
  37. package/dist/components/workspace/admin-shell/ShellDockTool.svelte +19 -0
  38. package/dist/components/workspace/admin-shell/ShellDockTool.svelte.d.ts +7 -0
  39. package/dist/components/workspace/admin-shell/ShellDockTool.svelte.d.ts.map +1 -0
  40. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte +146 -0
  41. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte.d.ts +4 -0
  42. package/dist/components/workspace/admin-shell/ShellSettingsPanel.svelte.d.ts.map +1 -0
  43. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte +81 -0
  44. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte.d.ts +7 -0
  45. package/dist/components/workspace/admin-shell/ShortcutsOverlay.svelte.d.ts.map +1 -0
  46. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte +118 -0
  47. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte.d.ts +9 -0
  48. package/dist/components/workspace/admin-shell/SystemScopePanel.svelte.d.ts.map +1 -0
  49. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte +71 -0
  50. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte.d.ts +8 -0
  51. package/dist/components/workspace/admin-shell/SystemStatusChips.svelte.d.ts.map +1 -0
  52. package/dist/components/workspace/admin-shell/TenantNav.svelte +101 -0
  53. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts +10 -0
  54. package/dist/components/workspace/admin-shell/TenantNav.svelte.d.ts.map +1 -0
  55. package/dist/components/workspace/admin-shell/context.d.ts +6 -0
  56. package/dist/components/workspace/admin-shell/context.d.ts.map +1 -0
  57. package/dist/components/workspace/admin-shell/context.js +16 -0
  58. package/dist/components/workspace/admin-shell/hotkeys.d.ts +14 -0
  59. package/dist/components/workspace/admin-shell/hotkeys.d.ts.map +1 -0
  60. package/dist/components/workspace/admin-shell/hotkeys.js +62 -0
  61. package/dist/components/workspace/admin-shell/settings.d.ts +14 -0
  62. package/dist/components/workspace/admin-shell/settings.d.ts.map +1 -0
  63. package/dist/components/workspace/admin-shell/settings.js +139 -0
  64. package/dist/components/workspace/admin-shell/state.svelte.d.ts +47 -0
  65. package/dist/components/workspace/admin-shell/state.svelte.d.ts.map +1 -0
  66. package/dist/components/workspace/admin-shell/state.svelte.js +252 -0
  67. package/dist/components/workspace/admin-shell/types.d.ts +137 -0
  68. package/dist/components/workspace/admin-shell/types.d.ts.map +1 -0
  69. package/dist/components/workspace/admin-shell/types.js +13 -0
  70. package/dist/components/workspace/index.d.ts +25 -11
  71. package/dist/components/workspace/index.d.ts.map +1 -1
  72. package/dist/components/workspace/index.js +24 -10
  73. package/dist/i18n/strings.workspace.d.ts +30 -0
  74. package/dist/i18n/strings.workspace.d.ts.map +1 -1
  75. package/dist/i18n/strings.workspace.js +31 -0
  76. package/dist/web/__tests__/harness.svelte +25 -0
  77. package/dist/web/__tests__/harness.svelte.d.ts +15 -0
  78. package/dist/web/__tests__/harness.svelte.d.ts.map +1 -0
  79. package/dist/web/__tests__/live-collection.svelte.test.js +184 -0
  80. package/dist/web/index.d.ts +13 -0
  81. package/dist/web/index.d.ts.map +1 -0
  82. package/dist/web/index.js +12 -0
  83. package/dist/web/live-collection.svelte.d.ts +132 -0
  84. package/dist/web/live-collection.svelte.d.ts.map +1 -0
  85. package/dist/web/live-collection.svelte.js +173 -0
  86. package/package.json +13 -4
@@ -0,0 +1,252 @@
1
+ import { LocalStorageShellSettingsAdapter, mergeShellSettingsDelta, resolveInitialPanelState, resolveShellConfig, } from './settings.js';
2
+ import { PANEL_EDGES, SCOPE_EDGES } from './types.js';
3
+ export class ShellState {
4
+ config;
5
+ adapter;
6
+ settings = $state({});
7
+ panels = $state({
8
+ top: 'collapsed',
9
+ left: 'collapsed',
10
+ right: 'collapsed',
11
+ bottom: 'collapsed',
12
+ });
13
+ focusTools = $state([]);
14
+ activeFocusToolId = $state(null);
15
+ activities = $state([]);
16
+ activityListeners = new Set();
17
+ constructor(options = {}) {
18
+ this.config = resolveShellConfig(options.config);
19
+ this.adapter =
20
+ options.settingsAdapter ??
21
+ (options.storageKey
22
+ ? new LocalStorageShellSettingsAdapter(options.storageKey)
23
+ : null);
24
+ this.applySettings(options.settings ?? {}, { persist: false });
25
+ }
26
+ async hydrate() {
27
+ if (!this.adapter)
28
+ return;
29
+ const delta = await this.adapter.read();
30
+ if (delta)
31
+ this.applySettings(delta, { persist: false });
32
+ }
33
+ snapshot() {
34
+ return {
35
+ panels: { ...this.panels },
36
+ activeFocusToolId: this.activeFocusToolId,
37
+ settings: {
38
+ ...this.settings,
39
+ keymap: this.settings.keymap ? { ...this.settings.keymap } : undefined,
40
+ panels: this.settings.panels ? { ...this.settings.panels } : undefined,
41
+ },
42
+ };
43
+ }
44
+ applySettings(delta, options = {}) {
45
+ this.settings = mergeShellSettingsDelta(this.settings, delta);
46
+ for (const edge of PANEL_EDGES) {
47
+ this.panels[edge] = resolveInitialPanelState(edge, this.config.panels[edge], this.settings);
48
+ }
49
+ this.activeFocusToolId =
50
+ this.settings.activeFocusToolId ?? this.activeFocusToolId;
51
+ if (options.persist !== false)
52
+ void this.persistSettings();
53
+ }
54
+ setHotkeysEnabled(enabled) {
55
+ this.applySettings({ hotkeysEnabled: enabled });
56
+ }
57
+ setHotkey(edge, code) {
58
+ this.applySettings({
59
+ keymap: {
60
+ [edge]: code ? { code } : null,
61
+ },
62
+ });
63
+ }
64
+ setPanel(edge, state) {
65
+ if (this.config.panels[edge].initial === 'hidden') {
66
+ this.panels[edge] = 'hidden';
67
+ return;
68
+ }
69
+ if (state === 'expanded')
70
+ this.closeExclusivePeers(edge);
71
+ this.panels[edge] = state;
72
+ this.settings = mergeShellSettingsDelta(this.settings, {
73
+ panels: { [edge]: state },
74
+ });
75
+ void this.persistSettings();
76
+ }
77
+ togglePanel(edge) {
78
+ if (this.panels[edge] === 'hidden')
79
+ return;
80
+ this.setPanel(edge, this.panels[edge] === 'expanded' ? 'collapsed' : 'expanded');
81
+ }
82
+ expandPanel(edge) {
83
+ this.setPanel(edge, 'expanded');
84
+ }
85
+ collapsePanel(edge) {
86
+ this.setPanel(edge, 'collapsed');
87
+ }
88
+ closeTopmostExpanded() {
89
+ for (const edge of [...PANEL_EDGES].reverse()) {
90
+ if (this.panels[edge] === 'expanded') {
91
+ this.collapsePanel(edge);
92
+ return true;
93
+ }
94
+ }
95
+ return false;
96
+ }
97
+ registerFocusTool(tool) {
98
+ this.focusTools = [
99
+ ...this.focusTools.filter((existing) => existing.id !== tool.id),
100
+ tool,
101
+ ].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
102
+ if (!this.activeFocusToolId)
103
+ this.activeFocusToolId = tool.id;
104
+ return () => this.unregisterFocusTool(tool.id);
105
+ }
106
+ unregisterFocusTool(id) {
107
+ this.focusTools = this.focusTools.filter((tool) => tool.id !== id);
108
+ if (this.activeFocusToolId === id) {
109
+ this.activeFocusToolId = this.focusTools[0]?.id ?? null;
110
+ }
111
+ }
112
+ openFocusTool(id) {
113
+ if (!this.focusTools.some((tool) => tool.id === id))
114
+ return;
115
+ this.activeFocusToolId = id;
116
+ this.settings = mergeShellSettingsDelta(this.settings, {
117
+ activeFocusToolId: id,
118
+ });
119
+ this.expandPanel('right');
120
+ void this.persistSettings();
121
+ }
122
+ upsertActivity(activity) {
123
+ const now = new Date().toISOString();
124
+ const normalized = {
125
+ ...activity,
126
+ edge: activity.edge ?? this.homeEdgeForScope(activity.scope),
127
+ createdAt: activity.createdAt ?? now,
128
+ updatedAt: activity.updatedAt ?? now,
129
+ };
130
+ const previous = this.activities.find((item) => item.id === activity.id);
131
+ this.activities = [
132
+ ...this.activities.filter((item) => item.id !== activity.id),
133
+ normalized,
134
+ ];
135
+ this.emitActivity({
136
+ type: previous && previous.status !== normalized.status
137
+ ? 'transition'
138
+ : 'upsert',
139
+ activity: normalized,
140
+ previous,
141
+ });
142
+ }
143
+ updateActivity(id, patch) {
144
+ const current = this.activities.find((activity) => activity.id === id);
145
+ if (!current)
146
+ return;
147
+ this.upsertActivity({
148
+ ...current,
149
+ ...patch,
150
+ id,
151
+ updatedAt: new Date().toISOString(),
152
+ });
153
+ }
154
+ removeActivity(id) {
155
+ const current = this.activities.find((activity) => activity.id === id);
156
+ if (!current)
157
+ return;
158
+ this.activities = this.activities.filter((activity) => activity.id !== id);
159
+ this.emitActivity({ type: 'remove', activity: current });
160
+ }
161
+ watchActivities(listener) {
162
+ this.activityListeners.add(listener);
163
+ return () => this.activityListeners.delete(listener);
164
+ }
165
+ listActivities(filter = {}) {
166
+ return this.activities
167
+ .map((activity) => ({
168
+ ...activity,
169
+ edge: activity.edge ?? this.homeEdgeForScope(activity.scope),
170
+ }))
171
+ .filter((activity) => activityMatchesFilter(activity, filter));
172
+ }
173
+ activityBadge(edge) {
174
+ const activities = this.listActivities({ edge }).filter((activity) => isActiveStatus(activity.status));
175
+ const determinate = activities
176
+ .map((activity) => activity.progress)
177
+ .filter((progress) => typeof progress === 'number');
178
+ return {
179
+ count: activities.length,
180
+ running: activities.filter((activity) => activity.status === 'running')
181
+ .length,
182
+ hasFailed: this.listActivities({ edge }).some((activity) => activity.status === 'failed'),
183
+ progress: determinate.length === 0
184
+ ? null
185
+ : determinate.reduce((total, progress) => total + progress, 0) /
186
+ determinate.length,
187
+ };
188
+ }
189
+ homeEdgeForScope(scope) {
190
+ const preferred = SCOPE_EDGES[scope];
191
+ if (this.panels[preferred] !== 'hidden')
192
+ return preferred;
193
+ if (this.panels.bottom !== 'hidden')
194
+ return 'bottom';
195
+ // Both the scope's edge and System are hidden — fall back to any visible
196
+ // edge so the activity still surfaces somewhere rather than homing to a
197
+ // hidden edge where its badge never renders.
198
+ const visible = PANEL_EDGES.find((edge) => this.panels[edge] !== 'hidden');
199
+ return visible ?? preferred;
200
+ }
201
+ closeExclusivePeers(edge) {
202
+ const group = this.config.panels[edge].exclusiveGroup;
203
+ if (!group)
204
+ return;
205
+ for (const peer of PANEL_EDGES) {
206
+ if (peer !== edge &&
207
+ this.config.panels[peer].exclusiveGroup === group &&
208
+ this.panels[peer] === 'expanded') {
209
+ this.panels[peer] = 'collapsed';
210
+ // Persist the peer collapse too, otherwise its stale 'expanded' delta
211
+ // survives and both panels reopen on reload, defeating exclusivity.
212
+ this.settings = mergeShellSettingsDelta(this.settings, {
213
+ panels: { [peer]: 'collapsed' },
214
+ });
215
+ }
216
+ }
217
+ }
218
+ async persistSettings() {
219
+ await this.adapter?.write(this.settings);
220
+ }
221
+ emitActivity(event) {
222
+ for (const listener of this.activityListeners)
223
+ listener(event);
224
+ }
225
+ }
226
+ export function createShellState(options = {}) {
227
+ return new ShellState(options);
228
+ }
229
+ function activityMatchesFilter(activity, filter) {
230
+ if (filter.edge && activity.edge !== filter.edge)
231
+ return false;
232
+ if (filter.scope && activity.scope !== filter.scope)
233
+ return false;
234
+ if (filter.kind && !matchesOne(activity.kind, filter.kind))
235
+ return false;
236
+ if (filter.status && !matchesOne(activity.status, filter.status)) {
237
+ return false;
238
+ }
239
+ if (filter.subject) {
240
+ return (activity.subject?.type === filter.subject.type &&
241
+ activity.subject.id === filter.subject.id);
242
+ }
243
+ return true;
244
+ }
245
+ function matchesOne(value, expected) {
246
+ return Array.isArray(expected)
247
+ ? expected.includes(value)
248
+ : value === expected;
249
+ }
250
+ function isActiveStatus(status) {
251
+ return status === 'queued' || status === 'running';
252
+ }
@@ -0,0 +1,137 @@
1
+ import type { Component, Snippet } from 'svelte';
2
+ export type PanelEdge = 'top' | 'left' | 'right' | 'bottom';
3
+ export type ShellScope = 'app' | 'tenant' | 'focus' | 'system';
4
+ export type PanelState = 'hidden' | 'collapsed' | 'expanded';
5
+ export type VisiblePanelState = Exclude<PanelState, 'hidden'>;
6
+ export type PanelPresentation = 'push' | 'overlay';
7
+ export type ActivityStatus = 'queued' | 'running' | 'completed' | 'failed' | 'canceled';
8
+ export interface ShellHotkeyBinding {
9
+ code: string;
10
+ altKey?: boolean;
11
+ ctrlKey?: boolean;
12
+ metaKey?: boolean;
13
+ shiftKey?: boolean;
14
+ }
15
+ export interface ShellPanelConfig {
16
+ edge: PanelEdge;
17
+ scope: ShellScope;
18
+ label: string;
19
+ initial: PanelState;
20
+ presentation: PanelPresentation;
21
+ hotkey: ShellHotkeyBinding | null;
22
+ collapsedSize: string;
23
+ expandedSize: string;
24
+ exclusiveGroup?: string;
25
+ }
26
+ export type ShellPanelDefaults = Partial<Record<PanelEdge, Partial<ShellPanelConfig> | false>>;
27
+ export interface ShellSettingsDelta {
28
+ hotkeysEnabled?: boolean;
29
+ keymap?: Partial<Record<PanelEdge, ShellHotkeyBinding | null>>;
30
+ panels?: Partial<Record<PanelEdge, VisiblePanelState>>;
31
+ activeFocusToolId?: string | null;
32
+ }
33
+ export interface ShellSettingsAdapter {
34
+ read(): ShellSettingsDelta | null | Promise<ShellSettingsDelta | null>;
35
+ write(delta: ShellSettingsDelta): void | Promise<void>;
36
+ }
37
+ export interface ResolvedShellConfig {
38
+ panels: Record<PanelEdge, ShellPanelConfig>;
39
+ }
40
+ export interface ShellFocusToolSubject {
41
+ type: string;
42
+ id: string;
43
+ label?: string;
44
+ }
45
+ export interface ShellNavItem {
46
+ href: string;
47
+ label: string;
48
+ icon?: string;
49
+ description?: string;
50
+ badge?: number | string | null;
51
+ children?: ShellNavItem[];
52
+ }
53
+ export interface ShellFocusTool {
54
+ id: string;
55
+ label: string;
56
+ description?: string;
57
+ order?: number;
58
+ badge?: number | string | null;
59
+ component?: Component | null;
60
+ render?: Snippet<[{
61
+ tool: ShellFocusTool;
62
+ }]>;
63
+ scopeId?: string;
64
+ subject?: ShellFocusToolSubject;
65
+ activityKinds?: string[];
66
+ }
67
+ export interface ShellActivity {
68
+ id: string;
69
+ label: string;
70
+ kind: string;
71
+ scope: ShellScope;
72
+ status: ActivityStatus;
73
+ subject?: ShellFocusToolSubject;
74
+ edge?: PanelEdge;
75
+ progress?: number | null;
76
+ detailHref?: string;
77
+ message?: string;
78
+ createdAt?: string;
79
+ updatedAt?: string;
80
+ cancel?: () => void | Promise<void>;
81
+ }
82
+ export interface ShellActivityFilter {
83
+ edge?: PanelEdge;
84
+ scope?: ShellScope;
85
+ kind?: string | string[];
86
+ status?: ActivityStatus | ActivityStatus[];
87
+ subject?: ShellFocusToolSubject;
88
+ }
89
+ export interface ShellActivityBadge {
90
+ count: number;
91
+ running: number;
92
+ hasFailed: boolean;
93
+ progress: number | null;
94
+ }
95
+ export interface ShellActivityEvent {
96
+ type: 'upsert' | 'transition' | 'remove';
97
+ activity: ShellActivity;
98
+ previous?: ShellActivity;
99
+ }
100
+ export type ShellStatusTone = 'neutral' | 'success' | 'warning' | 'error' | 'info';
101
+ export interface ShellStatusChip {
102
+ id: string;
103
+ label: string;
104
+ value?: string | number;
105
+ tone?: ShellStatusTone;
106
+ href?: string;
107
+ }
108
+ export interface ShellSystemItem {
109
+ id: string;
110
+ label: string;
111
+ status: string;
112
+ detail?: string;
113
+ href?: string;
114
+ updatedAt?: string;
115
+ }
116
+ export interface ShellSystemPanel {
117
+ id: string;
118
+ label: string;
119
+ items: ShellSystemItem[];
120
+ }
121
+ export interface ShellStateSnapshot {
122
+ panels: Record<PanelEdge, PanelState>;
123
+ activeFocusToolId: string | null;
124
+ settings: ShellSettingsDelta;
125
+ }
126
+ export interface AdminShellProps {
127
+ title?: string;
128
+ subtitle?: string;
129
+ config?: ShellPanelDefaults;
130
+ settings?: ShellSettingsDelta;
131
+ settingsAdapter?: ShellSettingsAdapter;
132
+ storageKey?: string;
133
+ }
134
+ export declare const PANEL_EDGES: PanelEdge[];
135
+ export declare const EDGE_SCOPES: Record<PanelEdge, ShellScope>;
136
+ export declare const SCOPE_EDGES: Record<ShellScope, PanelEdge>;
137
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/workspace/admin-shell/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export const PANEL_EDGES = ['top', 'left', 'right', 'bottom'];
2
+ export const EDGE_SCOPES = {
3
+ top: 'app',
4
+ left: 'tenant',
5
+ right: 'focus',
6
+ bottom: 'system',
7
+ };
8
+ export const SCOPE_EDGES = {
9
+ app: 'top',
10
+ tenant: 'left',
11
+ focus: 'right',
12
+ system: 'bottom',
13
+ };
@@ -1,16 +1,30 @@
1
1
  /**
2
2
  * @happyvertical/smrt-svelte/workspace
3
3
  *
4
- * Workspace shell primitives for admin UIs. See packages/smrt-svelte/CLAUDE.md
5
- * for layering principles. Implementations land via #1227, #1228, #1229.
4
+ * Canonical AdminShell family for SMRT admin UIs. The first-generation
5
+ * WorkspaceShell / RoleShell / NavTree / ToolsDock source files remain in this
6
+ * package as migration references, but the public workspace surface now points
7
+ * at the four-edge AdminShell contract.
6
8
  */
7
- export { default as Breadcrumbs } from './Breadcrumbs.svelte';
8
- export { type NavSection, type NavTreeFromManifestOptions, navTreeFromManifest, pluralizeClassName, type SmrtManifestEntryLike, type SmrtManifestLike, } from './manifest-nav.js';
9
- export { default as NavTree } from './NavTree.svelte';
10
- export { default as RoleShell } from './RoleShell.svelte';
11
- export { type DefineToolsDockOptions, defineToolsDock, TOOLS_DOCK_KEY, type ToolsDockInstance, } from './tools-dock/define-tools-dock.svelte.js';
12
- export { default as ToolsDock } from './tools-dock/ToolsDock.svelte';
13
- export { tryUseToolsDock, useToolsDock } from './tools-dock/use-tools-dock.js';
14
- export type { AvailableTool, BreadcrumbItem, NavItem, RoleConfig, ToolDef, ToolsDockApi, ToolsDockContext, ToolsDockEvents, } from './types.js';
15
- export { default as WorkspaceShell } from './WorkspaceShell.svelte';
9
+ export { default as ActivityBadge } from './admin-shell/ActivityBadge.svelte';
10
+ export { default as ActivityItem } from './admin-shell/ActivityItem.svelte';
11
+ export { default as ActivityList } from './admin-shell/ActivityList.svelte';
12
+ export { default as ActivityToasts } from './admin-shell/ActivityToasts.svelte';
13
+ export { default as AdminShell } from './admin-shell/AdminShell.svelte';
14
+ export { default as AppScopePanel } from './admin-shell/AppScopePanel.svelte';
15
+ export { ADMIN_SHELL_CONTEXT, setAdminShell, tryUseAdminShell, useAdminShell, } from './admin-shell/context.js';
16
+ export { default as HotkeyInput } from './admin-shell/HotkeyInput.svelte';
17
+ export { formatHotkeyBinding, hotkeyMatchesEvent, isEditableTarget, isShortcutsEvent, type ShellHotkeyAction, shellActionFromKeyboardEvent, shouldIgnoreShellHotkey, } from './admin-shell/hotkeys.js';
18
+ export { default as ShellCorner } from './admin-shell/ShellCorner.svelte';
19
+ export { default as ShellDockTool } from './admin-shell/ShellDockTool.svelte';
20
+ export { default as ShellSettingsPanel } from './admin-shell/ShellSettingsPanel.svelte';
21
+ export { default as ShortcutsOverlay } from './admin-shell/ShortcutsOverlay.svelte';
22
+ export { default as SystemScopePanel } from './admin-shell/SystemScopePanel.svelte';
23
+ export { default as SystemStatusChips } from './admin-shell/SystemStatusChips.svelte';
24
+ export { DEFAULT_SHELL_KEYMAP, LocalStorageShellSettingsAdapter, mergeShellSettingsDelta, pruneShellSettingsDelta, resolveHotkey, resolveInitialPanelState, resolveShellConfig, } from './admin-shell/settings.js';
25
+ export { createShellState, ShellState } from './admin-shell/state.svelte.js';
26
+ export { default as TenantNav } from './admin-shell/TenantNav.svelte';
27
+ export type { ActivityStatus, AdminShellProps, PanelEdge, PanelPresentation, PanelState, ResolvedShellConfig, ShellActivity, ShellActivityBadge, ShellActivityEvent, ShellActivityFilter, ShellFocusTool, ShellFocusToolSubject, ShellHotkeyBinding, ShellNavItem, ShellPanelConfig, ShellPanelDefaults, ShellScope, ShellSettingsAdapter, ShellSettingsDelta, ShellStateSnapshot, ShellStatusChip, ShellStatusTone, ShellSystemItem, ShellSystemPanel, VisiblePanelState, } from './admin-shell/types.js';
28
+ export { EDGE_SCOPES, PANEL_EDGES, SCOPE_EDGES } from './admin-shell/types.js';
29
+ export { type NavSection, type NavTreeFromManifestOptions, navTreeFromManifest as tenantNavFromManifest, pluralizeClassName, type SmrtManifestEntryLike, type SmrtManifestLike, } from './manifest-nav.js';
16
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EACL,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,KAAK,sBAAsB,EAC3B,eAAe,EACf,cAAc,EACd,KAAK,iBAAiB,GACvB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC/E,YAAY,EACV,aAAa,EACb,cAAc,EACd,OAAO,EACP,UAAU,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EACL,oBAAoB,EACpB,gCAAgC,EAChC,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EACV,cAAc,EACd,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,mBAAmB,IAAI,qBAAqB,EAC5C,kBAAkB,EAClB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC"}
@@ -1,14 +1,28 @@
1
1
  /**
2
2
  * @happyvertical/smrt-svelte/workspace
3
3
  *
4
- * Workspace shell primitives for admin UIs. See packages/smrt-svelte/CLAUDE.md
5
- * for layering principles. Implementations land via #1227, #1228, #1229.
4
+ * Canonical AdminShell family for SMRT admin UIs. The first-generation
5
+ * WorkspaceShell / RoleShell / NavTree / ToolsDock source files remain in this
6
+ * package as migration references, but the public workspace surface now points
7
+ * at the four-edge AdminShell contract.
6
8
  */
7
- export { default as Breadcrumbs } from './Breadcrumbs.svelte';
8
- export { navTreeFromManifest, pluralizeClassName, } from './manifest-nav.js';
9
- export { default as NavTree } from './NavTree.svelte';
10
- export { default as RoleShell } from './RoleShell.svelte';
11
- export { defineToolsDock, TOOLS_DOCK_KEY, } from './tools-dock/define-tools-dock.svelte.js';
12
- export { default as ToolsDock } from './tools-dock/ToolsDock.svelte';
13
- export { tryUseToolsDock, useToolsDock } from './tools-dock/use-tools-dock.js';
14
- export { default as WorkspaceShell } from './WorkspaceShell.svelte';
9
+ export { default as ActivityBadge } from './admin-shell/ActivityBadge.svelte';
10
+ export { default as ActivityItem } from './admin-shell/ActivityItem.svelte';
11
+ export { default as ActivityList } from './admin-shell/ActivityList.svelte';
12
+ export { default as ActivityToasts } from './admin-shell/ActivityToasts.svelte';
13
+ export { default as AdminShell } from './admin-shell/AdminShell.svelte';
14
+ export { default as AppScopePanel } from './admin-shell/AppScopePanel.svelte';
15
+ export { ADMIN_SHELL_CONTEXT, setAdminShell, tryUseAdminShell, useAdminShell, } from './admin-shell/context.js';
16
+ export { default as HotkeyInput } from './admin-shell/HotkeyInput.svelte';
17
+ export { formatHotkeyBinding, hotkeyMatchesEvent, isEditableTarget, isShortcutsEvent, shellActionFromKeyboardEvent, shouldIgnoreShellHotkey, } from './admin-shell/hotkeys.js';
18
+ export { default as ShellCorner } from './admin-shell/ShellCorner.svelte';
19
+ export { default as ShellDockTool } from './admin-shell/ShellDockTool.svelte';
20
+ export { default as ShellSettingsPanel } from './admin-shell/ShellSettingsPanel.svelte';
21
+ export { default as ShortcutsOverlay } from './admin-shell/ShortcutsOverlay.svelte';
22
+ export { default as SystemScopePanel } from './admin-shell/SystemScopePanel.svelte';
23
+ export { default as SystemStatusChips } from './admin-shell/SystemStatusChips.svelte';
24
+ export { DEFAULT_SHELL_KEYMAP, LocalStorageShellSettingsAdapter, mergeShellSettingsDelta, pruneShellSettingsDelta, resolveHotkey, resolveInitialPanelState, resolveShellConfig, } from './admin-shell/settings.js';
25
+ export { createShellState, ShellState } from './admin-shell/state.svelte.js';
26
+ export { default as TenantNav } from './admin-shell/TenantNav.svelte';
27
+ export { EDGE_SCOPES, PANEL_EDGES, SCOPE_EDGES } from './admin-shell/types.js';
28
+ export { navTreeFromManifest as tenantNavFromManifest, pluralizeClassName, } from './manifest-nav.js';
@@ -26,5 +26,35 @@ export declare const M: {
26
26
  readonly 'ui.tools_dock.no_tools_context': "ui.tools_dock.no_tools_context";
27
27
  readonly 'ui.tools_dock.select_tool': "ui.tools_dock.select_tool";
28
28
  readonly 'ui.tools_dock.workspace_tools': "ui.tools_dock.workspace_tools";
29
+ readonly 'ui.admin_shell.no_focus_tools': "ui.admin_shell.no_focus_tools";
30
+ readonly 'ui.admin_shell.no_app_panel': "ui.admin_shell.no_app_panel";
31
+ readonly 'ui.admin_shell.no_system_panel': "ui.admin_shell.no_system_panel";
32
+ readonly 'ui.admin_shell.shell_shortcuts': "ui.admin_shell.shell_shortcuts";
33
+ readonly 'ui.admin_shell.close_shortcuts': "ui.admin_shell.close_shortcuts";
34
+ readonly 'ui.admin_shell.shortcuts': "ui.admin_shell.shortcuts";
35
+ readonly 'ui.admin_shell.close': "ui.admin_shell.close";
36
+ readonly 'ui.activity_toasts.dismiss': "ui.activity_toasts.dismiss";
37
+ readonly 'ui.activity_toasts.dismiss_action': "ui.activity_toasts.dismiss_action";
38
+ readonly 'ui.activity_item.view': "ui.activity_item.view";
39
+ readonly 'ui.activity_item.cancel': "ui.activity_item.cancel";
40
+ readonly 'ui.activity_list.empty': "ui.activity_list.empty";
41
+ readonly 'ui.app_scope_panel.app_scope': "ui.app_scope_panel.app_scope";
42
+ readonly 'ui.hotkey_input.capture_title': "ui.hotkey_input.capture_title";
43
+ readonly 'ui.hotkey_input.conflicts_with': "ui.hotkey_input.conflicts_with";
44
+ readonly 'ui.shell_settings_panel.shell_settings': "ui.shell_settings_panel.shell_settings";
45
+ readonly 'ui.shell_settings_panel.description': "ui.shell_settings_panel.description";
46
+ readonly 'ui.shell_settings_panel.disable_hotkeys': "ui.shell_settings_panel.disable_hotkeys";
47
+ readonly 'ui.shell_settings_panel.enable_hotkeys': "ui.shell_settings_panel.enable_hotkeys";
48
+ readonly 'ui.shell_settings_panel.collapse': "ui.shell_settings_panel.collapse";
49
+ readonly 'ui.shell_settings_panel.expand': "ui.shell_settings_panel.expand";
50
+ readonly 'ui.shortcuts_overlay.open_shortcuts': "ui.shortcuts_overlay.open_shortcuts";
51
+ readonly 'ui.shortcuts_overlay.close_drawer': "ui.shortcuts_overlay.close_drawer";
52
+ readonly 'ui.shortcuts_overlay.close': "ui.shortcuts_overlay.close";
53
+ readonly 'ui.shortcuts_overlay.escape': "ui.shortcuts_overlay.escape";
54
+ readonly 'ui.system_scope_panel.system_scope': "ui.system_scope_panel.system_scope";
55
+ readonly 'ui.system_scope_panel.activities': "ui.system_scope_panel.activities";
56
+ readonly 'ui.system_scope_panel.no_running_work': "ui.system_scope_panel.no_running_work";
57
+ readonly 'ui.system_status_chips.system_status': "ui.system_status_chips.system_status";
58
+ readonly 'ui.tenant_nav.tenant_navigation': "ui.tenant_nav.tenant_navigation";
29
59
  };
30
60
  //# sourceMappingURL=strings.workspace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.workspace.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;CAuBZ,CAAC"}
1
+ {"version":3,"file":"strings.workspace.d.ts","sourceRoot":"","sources":["../../src/i18n/strings.workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDZ,CAAC"}
@@ -30,4 +30,35 @@ export const M = defineMessages({
30
30
  'ui.tools_dock.no_tools_context': 'No tools are available for the current context.',
31
31
  'ui.tools_dock.select_tool': 'Select a tool to begin.',
32
32
  'ui.tools_dock.workspace_tools': 'Workspace tools',
33
+ // components/workspace/admin-shell/*
34
+ 'ui.admin_shell.no_focus_tools': 'No focus tools',
35
+ 'ui.admin_shell.no_app_panel': 'No app panel',
36
+ 'ui.admin_shell.no_system_panel': 'No system panel',
37
+ 'ui.admin_shell.shell_shortcuts': 'Shell shortcuts',
38
+ 'ui.admin_shell.close_shortcuts': 'Close shortcuts',
39
+ 'ui.admin_shell.shortcuts': 'Shortcuts',
40
+ 'ui.admin_shell.close': 'Close',
41
+ 'ui.activity_toasts.dismiss': 'Dismiss activity notification',
42
+ 'ui.activity_toasts.dismiss_action': 'Dismiss',
43
+ 'ui.activity_item.view': 'View',
44
+ 'ui.activity_item.cancel': 'Cancel',
45
+ 'ui.activity_list.empty': 'No activities',
46
+ 'ui.app_scope_panel.app_scope': 'App scope',
47
+ 'ui.hotkey_input.capture_title': 'Press a key to capture it',
48
+ 'ui.hotkey_input.conflicts_with': 'Conflicts with',
49
+ 'ui.shell_settings_panel.shell_settings': 'Shell settings',
50
+ 'ui.shell_settings_panel.description': 'Panel preferences and physical-key shortcuts.',
51
+ 'ui.shell_settings_panel.disable_hotkeys': 'Disable hotkeys',
52
+ 'ui.shell_settings_panel.enable_hotkeys': 'Enable hotkeys',
53
+ 'ui.shell_settings_panel.collapse': 'Collapse',
54
+ 'ui.shell_settings_panel.expand': 'Expand',
55
+ 'ui.shortcuts_overlay.open_shortcuts': 'Open shortcuts',
56
+ 'ui.shortcuts_overlay.close_drawer': 'Close drawer',
57
+ 'ui.shortcuts_overlay.close': 'Close',
58
+ 'ui.shortcuts_overlay.escape': 'Esc',
59
+ 'ui.system_scope_panel.system_scope': 'System scope',
60
+ 'ui.system_scope_panel.activities': 'Activities',
61
+ 'ui.system_scope_panel.no_running_work': 'No running work',
62
+ 'ui.system_status_chips.system_status': 'System status',
63
+ 'ui.tenant_nav.tenant_navigation': 'Tenant navigation',
33
64
  });
@@ -0,0 +1,25 @@
1
+ <script lang="ts">
2
+ /**
3
+ * Test harness — invokes liveCollection() inside a component init scope so the
4
+ * `$effect` that `useLiveQuery` installs wires up correctly, then hands the
5
+ * returned reactive view back to the test via the `onReady` callback prop.
6
+ */
7
+ import type { SmrtWebCollection } from '@happyvertical/smrt-web';
8
+ import {
9
+ type LiveCollection,
10
+ liveCollection,
11
+ } from '../live-collection.svelte.js';
12
+
13
+ interface Props {
14
+ handle: SmrtWebCollection<Record<string, unknown>>;
15
+ onReady: (view: LiveCollection<Record<string, unknown>>) => void;
16
+ }
17
+
18
+ const props: Props = $props();
19
+ // This harness intentionally snapshots the handle during setup.
20
+ // svelte-ignore state_referenced_locally
21
+ const view = liveCollection(props.handle);
22
+ // This harness intentionally snapshots the callback during setup.
23
+ // svelte-ignore state_referenced_locally
24
+ props.onReady(view);
25
+ </script>
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Test harness — invokes liveCollection() inside a component init scope so the
3
+ * `$effect` that `useLiveQuery` installs wires up correctly, then hands the
4
+ * returned reactive view back to the test via the `onReady` callback prop.
5
+ */
6
+ import type { SmrtWebCollection } from '@happyvertical/smrt-web';
7
+ import { type LiveCollection } from '../live-collection.svelte.js';
8
+ interface Props {
9
+ handle: SmrtWebCollection<Record<string, unknown>>;
10
+ onReady: (view: LiveCollection<Record<string, unknown>>) => void;
11
+ }
12
+ declare const Harness: import("svelte").Component<Props, {}, "">;
13
+ type Harness = ReturnType<typeof Harness>;
14
+ export default Harness;
15
+ //# sourceMappingURL=harness.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.svelte.d.ts","sourceRoot":"","sources":["../../../src/web/__tests__/harness.svelte.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,8BAA8B,CAAC;AAGtC,UAAU,KAAK;IACb,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;CAClE;AAkBD,QAAA,MAAM,OAAO,2CAAwC,CAAC;AACtD,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;AAC1C,eAAe,OAAO,CAAC"}