-
+
@@ -1380,6 +1380,7 @@
{#if useDrawer}
draftSync.deployed}
+ reserveSpace={draftSync.hasBaseline}
getCurrent={() => draftSync.current}
onDiscard={() => draftSync.resetToDeployed(initialPath)}
disabled={!can_write}
diff --git a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte
index 6ca2d13ddd..01e4a28e29 100644
--- a/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte
+++ b/frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte
@@ -370,6 +370,7 @@
{#if useDrawer}
draftSync.deployed}
+ reserveSpace={draftSync.hasBaseline}
getCurrent={() => draftSync.current}
onDiscard={() => draftSync.resetToDeployed(initialPath)}
disabled={!can_write}
diff --git a/frontend/src/lib/components/triggers/useTriggerDraftSync.svelte.ts b/frontend/src/lib/components/triggers/useTriggerDraftSync.svelte.ts
index aba27de99f..ba09167d6d 100644
--- a/frontend/src/lib/components/triggers/useTriggerDraftSync.svelte.ts
+++ b/frontend/src/lib/components/triggers/useTriggerDraftSync.svelte.ts
@@ -48,6 +48,11 @@ export interface TriggerDraftSync {
* loading and for brand-new triggers (no deployed baseline yet).
*/
readonly hasDraft: boolean
+ /**
+ * Whether a deployed baseline exists (banner can appear). Reactive, unlike
+ * reading `deployed` directly (a plain `let`), so callers can reserve its slot.
+ */
+ readonly hasBaseline: boolean
/** The deployed baseline the dirty check compares against. */
readonly deployed: Cfg | undefined
/** The current form config (the live local draft). */
@@ -104,6 +109,10 @@ export function useTriggerDraftSync(opts: TriggerDraftSyncOptions): TriggerDraft
cfgDiffers(opts.getCfg() as Cfg, opts.deployed() as Cfg)
)
+ // Reactive "banner is possible" — depends on `drawerLoading()` so it
+ // re-evaluates (and re-reads the plain-`let` baseline) once the load settles.
+ const hasBaseline = $derived(!opts.drawerLoading() && opts.deployed() != null)
+
/** `auto: true` marks a discard from the reactive persist-effect (not an
* explicit user action), so it respects the "Enable auto-save" toggle — else
* with autosave off the editor would delete server drafts while writing none. */
@@ -189,6 +198,9 @@ export function useTriggerDraftSync(opts: TriggerDraftSyncOptions): TriggerDraft
get hasDraft() {
return hasDraft
},
+ get hasBaseline() {
+ return hasBaseline
+ },
get deployed() {
return opts.deployed()
},
diff --git a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte
index 77b5149933..361d5b610b 100644
--- a/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte
+++ b/frontend/src/lib/components/triggers/websocket/WebsocketTriggerEditorInner.svelte
@@ -457,6 +457,7 @@
{#if useDrawer}
draftSync.deployed}
+ reserveSpace={draftSync.hasBaseline}
getCurrent={() => draftSync.current}
onDiscard={() => draftSync.resetToDeployed(initialPath)}
disabled={!can_write}