diff --git a/apps/dashboard/src/lib/observatory/ObservatoryStage.svelte b/apps/dashboard/src/lib/observatory/ObservatoryStage.svelte index 8ad5d0f..d7ea608 100644 --- a/apps/dashboard/src/lib/observatory/ObservatoryStage.svelte +++ b/apps/dashboard/src/lib/observatory/ObservatoryStage.svelte @@ -44,6 +44,19 @@ ondemochange?: (demo: DemoMode) => void; /** When provided, renders the exit control (× back to the dashboard). */ onexit?: () => void; + /** + * Embedded mode — the stage fills its PARENT (absolute) instead of the + * viewport (fixed). Used by the main graph page, where the field is the + * default renderer living under the page's own chrome. + */ + embedded?: boolean; + /** + * 'full' — telemetry strip, spine, verdicts, switcher, exit (the route + * and the takeover overlay). + * 'none' — pure living canvas + loading/error text only; the host page + * provides all chrome (the main graph's field renderer). + */ + chrome?: 'full' | 'none'; } let { @@ -53,7 +66,9 @@ capture = false, showSwitcher = true, ondemochange, - onexit + onexit, + embedded = false, + chrome = 'full' }: Props = $props(); // Human labels for the switcher chips — short, mono, uppercase (visual DNA §7.3). @@ -246,8 +261,11 @@ - -
+ +
+ capture hides it all (pure canvas for recording); H toggles; + chrome='none' leaves only loading/error (host page owns the chrome). --> {#if showHud}
+ {#if chrome === 'full'} + {/if} - {#if onexit} + {#if chrome === 'full' && onexit}
{:else if graphData} - + {#if renderMode === 'field'} + +
+ +
+ {:else} + + {/if} {/if} @@ -304,7 +340,8 @@ disown [padding-top:max(0.75rem,env(safe-area-inset-top))] [padding-left:max(0.75rem,env(safe-area-inset-left))] [padding-right:max(0.75rem,env(safe-area-inset-right))] sm:[padding-top:0] sm:[padding-left:0] sm:[padding-right:0]" > - + + {#if renderMode === 'classic'}
Focus
+ {/if}
+ +
+ + +
+ + {#if renderMode === 'classic'} @@ -386,6 +451,7 @@ disown {graphState.brightness.toFixed(1)}x + {/if}