+ {#if own}
+
+ {#if savedPath && path && path !== savedPath}
+
+ {/if}
+ {#if onBehalfOfEmail}
+
+ This flow will be redeployed on behalf of you ({$userStore?.email}) instead of {onBehalfOfEmail}
+
+ {/if}
+ {:else}
+
+ {/if}
+
+ {/snippet}
+
diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte
index 7cd3111d0f..7bbec410f8 100644
--- a/frontend/src/lib/components/ScriptBuilder.svelte
+++ b/frontend/src/lib/components/ScriptBuilder.svelte
@@ -94,8 +94,8 @@
import DefaultScripts from './DefaultScripts.svelte'
import { getContext, onDestroy, onMount, setContext, tick, untrack } from 'svelte'
import EditorHeader from './EditorHeader.svelte'
- import EditableInput from './common/EditableInput.svelte'
import PageHeaderContent from '$lib/components/PageHeaderContent.svelte'
+ import PathEditPopover from '$lib/components/PathEditPopover.svelte'
import { pageHeader, PHONE_BAR } from '$lib/components/pageHeaderRegistry.svelte'
import ScriptSettingsBadges from './ScriptSettingsBadges.svelte'
import Badge from './common/badge/Badge.svelte'
@@ -200,6 +200,10 @@
// right group (hide the ~200px tag select, icon-only Diff/Settings) before the
// full group crowds the path into heavy truncation; ~900 is where the path
// keeps a usable width given the right group's natural ~440px.
+ /** Held by the pen's popover while it is open; the band's trail reads it so the path does not
+ * reflow under the pointer as the user types. */
+ let pathSnapshot = $state(undefined)
+
let topbarWidth = $state(0)
// In the page header the buttons share the row with the breadcrumb, so they collapse sooner:
// the trail and the summary take ~560px before either truncates, and the full button group is
@@ -2280,7 +2284,12 @@
@@ -2329,18 +2338,23 @@
{/if}
{#snippet scriptSummary()}
-
- (script.summary = v.trim())}
- textClass="text-xs font-medium text-emphasis leading-tight"
- class="max-w-full min-w-0"
- />
+
+
{/snippet}
{#snippet scriptMarks()}
diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
index f6b2faee5d..3e2f4e01a7 100644
--- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
+++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte
@@ -52,8 +52,8 @@
import DebugPanel from './contextPanel/DebugPanel.svelte'
import EditorHeader from '$lib/components/EditorHeader.svelte'
- import EditableInput from '$lib/components/common/EditableInput.svelte'
import PageHeaderContent from '$lib/components/PageHeaderContent.svelte'
+ import PathEditPopover from '$lib/components/PathEditPopover.svelte'
import { pageHeader, PHONE_BAR } from '$lib/components/pageHeaderRegistry.svelte'
import AutosaveIndicator from '$lib/components/AutosaveIndicator.svelte'
import { editPathFor } from '$lib/components/workspacePicker'
@@ -232,6 +232,10 @@
// The header's buttons render under the page header, not under this component, so the contexts
// they look up have to travel with them. The app's own two carry everything the canvas toggles,
// the panel buttons, Debug runs and the preview switch read.
+ /** Held by the pen's popover while it is open; the band's trail reads it so the path does not
+ * reflow under the pointer as the user types. */
+ let pathSnapshot = $state(undefined)
+
const headerContexts = new Map([
['AppViewerContext', getContext('AppViewerContext')],
['AppEditorContext', getContext('AppEditorContext')]
@@ -947,8 +951,9 @@
// The path being edited, not the stored one: a brand-new app is parked at a
// `draft_` placeholder, and the trail would name that instead of the path Deploy
// will create. Same fallback chain the rename sites read.
+ // Frozen while the pen's popover is open so the trail holds still as the user types.
kind: 'app',
- path: newEditedPath || $appPath || newPath || undefined,
+ path: pathSnapshot ?? newEditedPath ?? $appPath ?? newPath ?? undefined,
summaryContent: appSummary
}}
actions={appHeaderActions}
@@ -985,18 +990,18 @@
{/if}
{#snippet appSummary()}
-
-
{/snippet}
diff --git a/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte b/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte
index 35b1d6ab56..6edcf4b782 100644
--- a/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte
+++ b/frontend/src/lib/components/raw_apps/RawAppEditorHeader.svelte
@@ -82,7 +82,7 @@
} from '$lib/components/operatingWorkspace.svelte'
import PageHeaderContent from '$lib/components/PageHeaderContent.svelte'
import { pageHeader, PHONE_BAR } from '$lib/components/pageHeaderRegistry.svelte'
- import EditableInput from '$lib/components/common/EditableInput.svelte'
+ import PathEditPopover from '$lib/components/PathEditPopover.svelte'
const operatingWorkspace = useOperatingWorkspace()
const operatingUser = useOperatingUser()
@@ -336,6 +336,10 @@
// header uses.
const headerBtnSize = $derived(condensedHeader || ownsPageHeader ? 'sm' : 'md')
+ /** Held by the pen's popover while it is open; the band's trail reads it so the path does not
+ * reflow under the pointer as the user types. */
+ let pathSnapshot = $state(undefined)
+
// The actions render under the band, outside the subtree RawAppEditor declared the operating
// workspace in, so it has to travel with them: OpenInSessionButton asks who the acting user is.
const headerContexts = new Map([operatingWorkspaceContextEntry()])
@@ -931,15 +935,15 @@
{#if ownsPageHeader}
+ the breadcrumb's, and everything else the bar carried rides along as the header's actions. -->
` placeholder, and the trail would name that instead of the path Deploy
- // will create — which is why `newEditedPath` refuses the placeholder.
+ // will create — which is why `newEditedPath` refuses the placeholder. Frozen while the
+ // pen's popover is open so the trail holds still as the user types.
kind: 'app',
- path: newEditedPath || appPath || newPath || undefined,
+ path: pathSnapshot ?? newEditedPath ?? appPath ?? newPath ?? undefined,
summaryContent: appSummary
}}
actions={rawAppHeaderActions}
@@ -1017,18 +1021,18 @@
{/snippet}
{#snippet appSummary()}
-
-