diff --git a/frontend/src/routes/(root)/(logged)/pipeline/[folder]/+page.svelte b/frontend/src/routes/(root)/(logged)/pipeline/[folder]/+page.svelte
index b4ddb8350c..5f66f1b899 100644
--- a/frontend/src/routes/(root)/(logged)/pipeline/[folder]/+page.svelte
+++ b/frontend/src/routes/(root)/(logged)/pipeline/[folder]/+page.svelte
@@ -2,6 +2,7 @@
import { workspaceStore, userStore } from '$lib/stores'
import { PIPELINE_DRAFT_KIND, pipelineBundlePath } from '$lib/pipelinePaths'
import { base } from '$lib/base'
+ import PageHeaderContent from '$lib/components/PageHeaderContent.svelte'
import { page } from '$app/state'
import Button from '$lib/components/common/button/Button.svelte'
import DropdownV2 from '$lib/components/DropdownV2.svelte'
@@ -98,7 +99,6 @@
FolderSearch,
History,
Loader2,
- NetworkIcon,
Play,
RefreshCw,
Save,
@@ -2386,203 +2386,209 @@
Pipeline · {folder} — Windmill
-
-
-
-
-
-
{mode === 'edit' ? 'Pipeline editor' : 'Pipeline'}
-
·
- {#if otherPipelineFolders.length === 0}
-
- {:else}
-
- {#snippet buttonReplacement()}
-
-
- f/{folder}
-
-
- {/snippet}
-
- {/if}
- {#if summary.length > 0}
-
· {summary.join(' · ')}
- {/if}
-
- {#if !isOperator}
-
-
-
setMode(m)} />
- {#if mode === 'view' && pe.drafts.size > 0}
-
- (includeDrafts = !includeDrafts)}
- class={twMerge(
- 'flex items-center gap-1.5 px-2.5 py-1 rounded-md border text-xs font-medium transition-colors',
- includeDrafts
- ? 'bg-amber-50 dark:bg-amber-900/30 border-amber-300 dark:border-amber-700 text-amber-700 dark:text-amber-400'
- : 'bg-surface border-gray-300 dark:border-gray-600 text-secondary hover:bg-surface-hover'
- )}
- title={includeDrafts
- ? 'Showing undeployed drafts overlaid on the deployed pipeline — click to hide them'
- : 'Overlay your undeployed drafts to see what the pipeline will look like once deployed'}
- >
-
- {includeDrafts ? 'Showing' : 'Show'}
- {pe.drafts.size} draft{pe.drafts.size === 1 ? '' : 's'}
-
- {/if}
-
- {/if}
-
- {#if !isOperator && allPipelineScripts.length > 0}
-
- {#if recordingMode}
-
(recordingMode = false)}
- disabled={!!cascadeRunningRoot}
- class="flex items-center gap-1.5 px-2.5 py-1 rounded-md border text-xs font-medium transition-colors disabled:opacity-50 bg-red-50 dark:bg-red-900/30 border-red-300 dark:border-red-700 text-red-700 dark:text-red-400"
- title={RECORDING_ARMED_HINT}
- >
-
- Recording
-
- {/if}
-
-
- {cascadeRunningRoot ? 'Running…' : 'Run pipeline'}
-
- {/if}
- {#if mode === 'edit' && saveErrors.size > 0}
-
-
- {#snippet trigger()}
-
-
- {saveErrors.size} failed
-
- {/snippet}
- {#snippet content()}
-
-
Save errors
-
- {#each [...saveErrors.entries()] as [path, message]}
-
- {path}
-
- {message}
-
-
- {/each}
-
-
- {/snippet}
-
- {/if}
- {#if mode === 'edit' && pe.drafts.size > 0}
-
- {#if $workspaceStore}
-
- {/if}
-
- {savingAll ? 'Saving…' : `Save all (${pe.drafts.size})`}
-
- {/if}
- {#if mode === 'view'}
-
- Activity
-
- {/if}
-
graphRes.refetch()}
- disabled={graphRes.loading}
- iconOnly
- title="Refresh"
- />
-
-
-
+
+ {/snippet}
+
+ {/if}
+ {#if summary.length > 0}
+
· {summary.join(' · ')}
+ {/if}
+{/snippet}
+{#snippet pipelineActions()}
+ {#if !isOperator}
+
+
+
setMode(m)} />
+ {#if mode === 'view' && pe.drafts.size > 0}
+
+ (includeDrafts = !includeDrafts)}
+ class={twMerge(
+ 'flex items-center gap-1.5 px-2.5 py-1 rounded-md border text-xs font-medium transition-colors',
+ includeDrafts
+ ? 'bg-amber-50 dark:bg-amber-900/30 border-amber-300 dark:border-amber-700 text-amber-700 dark:text-amber-400'
+ : 'bg-surface border-gray-300 dark:border-gray-600 text-secondary hover:bg-surface-hover'
+ )}
+ title={includeDrafts
+ ? 'Showing undeployed drafts overlaid on the deployed pipeline — click to hide them'
+ : 'Overlay your undeployed drafts to see what the pipeline will look like once deployed'}
+ >
+
+ {includeDrafts ? 'Showing' : 'Show'}
+ {pe.drafts.size} draft{pe.drafts.size === 1 ? '' : 's'}
+
+ {/if}
+
+ {/if}
+ {#if !isOperator && allPipelineScripts.length > 0}
+
+ {#if recordingMode}
+
(recordingMode = false)}
+ disabled={!!cascadeRunningRoot}
+ class="flex items-center gap-1.5 px-2.5 py-1 rounded-md border text-xs font-medium transition-colors disabled:opacity-50 bg-red-50 dark:bg-red-900/30 border-red-300 dark:border-red-700 text-red-700 dark:text-red-400"
+ title={RECORDING_ARMED_HINT}
+ >
+
+ Recording
+
+ {/if}
+
+
+ {cascadeRunningRoot ? 'Running…' : 'Run pipeline'}
+
+ {/if}
+ {#if mode === 'edit' && saveErrors.size > 0}
+
+
+ {#snippet trigger()}
+
+
+ {saveErrors.size} failed
+
+ {/snippet}
+ {#snippet content()}
+
+
Save errors
+
+ {#each [...saveErrors.entries()] as [path, message]}
+
+ {path}
+
+ {message}
+
+
+ {/each}
+
+
+ {/snippet}
+
+ {/if}
+ {#if mode === 'edit' && pe.drafts.size > 0}
+
+ {#if $workspaceStore}
+
+ {/if}
+
+ {savingAll ? 'Saving…' : `Save all (${pe.drafts.size})`}
+
+ {/if}
+ {#if mode === 'view'}
+
+ Activity
+
+ {/if}
+
graphRes.refetch()}
+ disabled={graphRes.loading}
+ iconOnly
+ title="Refresh"
+ />
+
+{/snippet}
+
+
{#if graphRes.loading && !graphRes.current}