diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte
index 9874495110..a347cd4003 100644
--- a/frontend/src/lib/components/FlowBuilder.svelte
+++ b/frontend/src/lib/components/FlowBuilder.svelte
@@ -1570,6 +1570,8 @@
{#if ownsPageHeader}
+
{:else}
diff --git a/frontend/src/lib/components/PageHeaderBar.svelte b/frontend/src/lib/components/PageHeaderBar.svelte
index 4b541c1592..ca2927712a 100644
--- a/frontend/src/lib/components/PageHeaderBar.svelte
+++ b/frontend/src/lib/components/PageHeaderBar.svelte
@@ -70,21 +70,24 @@ The row's height matches the sidebar's own header row, so the two read as one ba
// A page left while scrolled would otherwise hand its edge to the next one, which may have
// nothing to scroll at all.
afterNavigate(() => (scrolledUnder = false))
+
+ const separator = $derived(pageHeader.content?.separator ?? 'onScroll')
+ const showEdge = $derived(separator === 'always' || (separator === 'onScroll' && scrolledUnder))
-
+
pageHeader.barWidth, (w) => pageHeader.setBarWidth(w)}
class={twMerge(
'flex items-center gap-1 shrink-0 min-w-0 bg-surface transition-shadow duration-150',
phone ? 'flex-wrap content-center min-h-11 py-1 pl-1 pr-2' : 'h-11 pl-2 pr-4',
- scrolledUnder &&
+ showEdge &&
'shadow-[inset_0_-1px_0_0_rgb(var(--color-border-light))] dark:shadow-[inset_0_-1px_0_0_#374151] [html.github-dark_&]:shadow-[inset_0_-1px_0_0_rgb(var(--color-border-light))]'
)}
>
diff --git a/frontend/src/lib/components/PageHeaderContent.svelte b/frontend/src/lib/components/PageHeaderContent.svelte
index 462984e6e7..5e023a68b3 100644
--- a/frontend/src/lib/components/PageHeaderContent.svelte
+++ b/frontend/src/lib/components/PageHeaderContent.svelte
@@ -17,6 +17,7 @@ the header, so nesting is decided by the caller rather than guessed from context
actions,
actionsOrder,
actionsFlexible,
+ separator,
contexts,
actingWorkspaceId,
barRightInset
@@ -30,6 +31,7 @@ the header, so nesting is decided by the caller rather than guessed from context
actions,
actionsOrder,
actionsFlexible,
+ separator,
contexts,
actingWorkspaceId,
barRightInset
diff --git a/frontend/src/lib/components/PathEditPen.svelte b/frontend/src/lib/components/PathEditPen.svelte
new file mode 100644
index 0000000000..c74ea8dded
--- /dev/null
+++ b/frontend/src/lib/components/PathEditPen.svelte
@@ -0,0 +1,37 @@
+
+
+
+
diff --git a/frontend/src/lib/components/PathEditPopover.svelte b/frontend/src/lib/components/PathEditPopover.svelte
index 52b52a1e9d..96ad9daeea 100644
--- a/frontend/src/lib/components/PathEditPopover.svelte
+++ b/frontend/src/lib/components/PathEditPopover.svelte
@@ -8,8 +8,8 @@ to it — does not reflow under the pointer as the user types, which floating-ui
-->
{#if editable || onSaved}
- {
- summaryInput?.focus()
- return null
- }}
- bind:isOpen={popoverOpen}
+
+