diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 3b5d447..25e7f38 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -90,6 +90,9 @@ if (Array.isArray(meta.savedThemes)) { savedThemes = meta.savedThemes as ThemeConfig[]; } + if (meta.panelSizes && typeof meta.panelSizes === 'object') { + panelSizes = meta.panelSizes as Record; + } } }) .catch((err) => { @@ -114,6 +117,7 @@ let savedCamera = $state({ x: 0, y: 0, zoom: 1.0 }); let gridEnabled = $state(false); let savedThemes = $state([]); + let panelSizes = $state>({}); // When workspace node appears in store (after creation), load its layout $effect(() => { @@ -161,6 +165,7 @@ camera: savedCamera, gridEnabled, savedThemes, + panelSizes, preferences: { ...(currentMeta.preferences ?? {}), theme: themeToMetadata(currentTheme), @@ -197,6 +202,8 @@ y: panel.y + (dy ?? 0), }; layout = { ...layout }; + // Remember size per trait type + panelSizes = { ...panelSizes, [trait]: { width, height } }; persistLayout(); } } @@ -220,6 +227,7 @@ function handleAddPanel(trait: string) { if (layout.panels.some(p => p.trait === trait)) return; const info = getPanelInfo(trait); + const remembered = panelSizes[trait]; const maxY = layout.panels.length > 0 ? Math.max(...layout.panels.map(p => p.y + p.height)) : 0; @@ -230,8 +238,8 @@ trait, x: 30, y: maxY + 30, - width: info.defaultWidth, - height: info.defaultHeight, + width: remembered?.width ?? info.defaultWidth, + height: remembered?.height ?? info.defaultHeight, }, ], };