diff --git a/apps/web/src/lib/hooks/useLayout.ts b/apps/web/src/lib/hooks/useLayout.ts index ef1d903..da5de87 100644 --- a/apps/web/src/lib/hooks/useLayout.ts +++ b/apps/web/src/lib/hooks/useLayout.ts @@ -14,6 +14,70 @@ const DEFAULT_LAYOUT_NAME = "default"; */ const WORKSPACE_KEY = "mosaic-workspace-id"; +function createDefaultLayout(): LayoutConfig { + return { + id: DEFAULT_LAYOUT_NAME, + name: "Default Layout", + layout: [ + { + i: "tasks-1", + x: 0, + y: 0, + w: 2, + h: 3, + minW: 1, + minH: 2, + isDraggable: true, + isResizable: true, + }, + { + i: "calendar-1", + x: 2, + y: 0, + w: 2, + h: 2, + minW: 1, + minH: 2, + isDraggable: true, + isResizable: true, + }, + { + i: "agent-status-1", + x: 2, + y: 2, + w: 2, + h: 2, + minW: 1, + minH: 1, + isDraggable: true, + isResizable: true, + }, + { + i: "orchestrator-events-1", + x: 0, + y: 3, + w: 2, + h: 2, + minW: 1, + minH: 1, + isDraggable: true, + isResizable: true, + }, + { + i: "quick-capture-1", + x: 2, + y: 4, + w: 2, + h: 1, + minW: 1, + minH: 1, + isDraggable: true, + isResizable: true, + }, + ], + }; +} + interface UseLayoutReturn { layouts: Record; currentLayout: LayoutConfig | undefined; @@ -45,7 +109,18 @@ export function useLayout(): UseLayoutReturn { if (stored) { const emptyFallback: Record = {}; const parsed = safeJsonParse(stored, isLayoutConfigRecord, emptyFallback); - setLayouts(parsed as Record); + const parsedLayouts = parsed as Record; + if (Object.keys(parsedLayouts).length > 0) { + setLayouts(parsedLayouts); + } else { + setLayouts({ + [DEFAULT_LAYOUT_NAME]: createDefaultLayout(), + }); + } + } else { + setLayouts({ + [DEFAULT_LAYOUT_NAME]: createDefaultLayout(), + }); } // Load current layout ID preference @@ -195,11 +270,7 @@ export function useLayout(): UseLayoutReturn { const resetLayout = useCallback(() => { setLayouts({ - [DEFAULT_LAYOUT_NAME]: { - id: DEFAULT_LAYOUT_NAME, - name: "Default Layout", - layout: [], - }, + [DEFAULT_LAYOUT_NAME]: createDefaultLayout(), }); setCurrentLayoutId(DEFAULT_LAYOUT_NAME); }, []); diff --git a/docs/tasks.md b/docs/tasks.md index 039e71f..63cb9f1 100644 --- a/docs/tasks.md +++ b/docs/tasks.md @@ -385,3 +385,4 @@ | ORCH-OBS-006 | done | Add `WidgetRenderer` regression tests for hyphenated widget IDs | #411 | web | feature/mosaic-stack-finalization | ORCH-OBS-005 | | orch | 2026-02-17T16:48Z | 2026-02-17T16:50Z | 5K | 3K | | ORCH-OBS-007 | done | Add `OrchestratorEventsWidget` for live/recent orchestration visibility with Matrix signal hints | #411 | web | feature/mosaic-stack-finalization | ORCH-OBS-002 | | orch | 2026-02-17T16:55Z | 2026-02-17T17:03Z | 12K | 9K | | ORCH-OBS-008 | done | Integrate new widget into HUD/WidgetRegistry and extend widget regression coverage | #411 | web | feature/mosaic-stack-finalization | ORCH-OBS-007 | | orch | 2026-02-17T17:03Z | 2026-02-17T17:08Z | 10K | 7K | +| ORCH-OBS-009 | done | Seed default/reset local HUD layout with orchestration widgets so visibility works out-of-box | #411 | web | feature/mosaic-stack-finalization | ORCH-OBS-008 | | orch | 2026-02-17T17:10Z | 2026-02-17T17:14Z | 8K | 6K |