diff --git a/apps/web/src/lib/components/Calculator3dShell.svelte b/apps/web/src/lib/components/Calculator3dShell.svelte index afcce29..3a5e190 100644 --- a/apps/web/src/lib/components/Calculator3dShell.svelte +++ b/apps/web/src/lib/components/Calculator3dShell.svelte @@ -78,9 +78,10 @@ const NARROW_RESIZE_HANDLE_HEIGHT = 10; const CURRENT_3D_WORKING_ID_KEY = 'cartesium.current-working-document.3d'; const PENDING_PUBLICATION_KEY = 'cartesium:pending-publication-v2'; + const initialBounds3d = { ...gyroidPreset3d.bounds }; - let bounds = $state({ ...gyroidPreset3d.bounds }); - let resetBounds = $state({ ...gyroidPreset3d.bounds }); + let bounds = $state({ ...initialBounds3d }); + let resetBounds = $state({ ...initialBounds3d }); let fitViewKey = $state(0); let presentation = $state(undefined); let expressions = $state(expressionsForPreset(gyroidPreset3d)); @@ -953,9 +954,32 @@ } function addExpression() { const id = `expr-${nextId++}`; - expressions = [...expressions, { id, input_mode: 'text', source: 'vector([1, 2, 3])', enabled: true, color: null }]; + expressions = [...expressions, { id, input_mode: 'text', source: '', enabled: true, color: null }]; selectedId = id; } + function newGraph() { + if (!confirmDocumentReplacement()) return; + const emptyExpression: Expression3d = { + id: 'expr-1', + input_mode: 'text', + source: '', + enabled: true, + color: null + }; + graphName = ''; + expressions = [emptyExpression]; + bounds = { ...initialBounds3d }; + resetBounds = { ...initialBounds3d }; + fitViewKey += 1; + variableOverrides = {}; + selectedId = emptyExpression.id; + nextId = 2; + presetRevision += 1; + activeDocumentId = null; + presentation = undefined; + cleanDocumentSignature = documentSignature(); + shareStatus = ''; + } function removeExpression(id: string) { const variable = scene?.variables.find((candidate) => candidate.expression_id === id); if (variable) clearVariableOverride(variable.name); @@ -1051,6 +1075,7 @@ onpreset={loadPreset} documentName={graphName} onnamechange={(name) => (graphName = name)} + onnew={newGraph} activeDocumentId={activeDocumentId} documentDirty={documentSignature() !== cleanDocumentSignature} {shareStatus} diff --git a/apps/web/src/lib/components/CalculatorHeader.svelte b/apps/web/src/lib/components/CalculatorHeader.svelte index 8f2ce29..e14af67 100644 --- a/apps/web/src/lib/components/CalculatorHeader.svelte +++ b/apps/web/src/lib/components/CalculatorHeader.svelte @@ -98,7 +98,6 @@ {/each} - {#if onnew}{/if} {otherModeLabel} @@ -115,6 +114,7 @@ placeholder={mode === '2d' ? 'Untitled graph' : 'Untitled 3D graph'} aria-label="Graph name" /> + {#if onnew}{/if} diff --git a/apps/web/src/lib/components/ExpressionPanel3d.svelte b/apps/web/src/lib/components/ExpressionPanel3d.svelte index 37e63a1..3ff7390 100644 --- a/apps/web/src/lib/components/ExpressionPanel3d.svelte +++ b/apps/web/src/lib/components/ExpressionPanel3d.svelte @@ -32,6 +32,7 @@ onpreset, documentName, onnamechange, + onnew, activeDocumentId, documentDirty, shareStatus, @@ -60,6 +61,7 @@ onpreset: (id: string) => void; documentName: string; onnamechange: (name: string) => void; + onnew: () => void; activeDocumentId: string | null; documentDirty: boolean; shareStatus: string; @@ -273,6 +275,7 @@ {oncollapse} {onnamechange} {onpreset} + {onnew} {onsave} {onsaveas} {ondelete}