diff --git a/tests/browser/focused-node.spec.mjs b/tests/browser/focused-node.spec.mjs index 6642cbdc..6ab2818c 100644 --- a/tests/browser/focused-node.spec.mjs +++ b/tests/browser/focused-node.spec.mjs @@ -45,6 +45,9 @@ test(`${variant} Save to library switch saves its value and loads older workflow const toggle=page.getByRole('checkbox',{name:'Save to library',exact:true}); await expect(toggle).toBeChecked(); expect(await page.evaluate(()=>node.widgets.map(widget=>widget.name))).toEqual(['text','category','tags','search_text','prepend_text','append_text','save_to_library']); + // The native switch is drawn in the toolbar only: the host keeps it hidden and zero-height, like the text fallbacks + expect(await page.evaluate(()=>{const widget=node.widgets.find(item=>item.name==='save_to_library');return {type:widget.type,hidden:widget.hidden,size:widget.computeSize()};})).toEqual({type:'hidden',hidden:true,size:[0,-4]}); + expect(await page.evaluate(()=>node.widgets.find(item=>item.name==='text').computeSize())).toEqual([0,-4]); await toggle.uncheck(); await expect(page.locator('.pm-focused > .pm-editor-status[role=status]')).toHaveText('Save to library is off: runs of this node are not added to the library.'); const saved=await page.evaluate(()=>node.serialize()); diff --git a/web/js/focused-node.js b/web/js/focused-node.js index 4960278f..f4aae5a1 100644 --- a/web/js/focused-node.js +++ b/web/js/focused-node.js @@ -6,6 +6,9 @@ import {SAVE_WIDGET, normalizeSaveWidget, placeSaveWidgetLast, saveWidget, saves const names = ['text', 'category', 'tags', 'search_text', 'prepend_text', 'append_text']; let nextEditorId = 0; +// The editor draws these widgets itself; the host keeps them as hidden, zero-height values. +function hiddenWidgetSize() { return [0, -4]; } +function hideNativeWidget(widget) { widget.hidden = true; widget.type = 'hidden'; widget.computeSize = hiddenWidgetSize; } function loadStyles() { const href = new URL('./prompt-editor.css', import.meta.url).href; @@ -44,7 +47,7 @@ export function installFocusedNode(nodeType, app, api, parseQuery, {layout = 'fo for (const name of pair ? [...names,'negative_text'] : names) { let widget = this.widgets?.find(item => item.name === name); if (!widget) widget = this.addWidget('text', name, '', () => {}, {}); - widget.hidden = true; widget.type = 'hidden'; widget.computeSize = () => [0, -4]; + hideNativeWidget(widget); widgets.set(name, widget); } exposeTextSockets(this, textInputs); @@ -52,7 +55,7 @@ export function installFocusedNode(nodeType, app, api, parseQuery, {layout = 'fo // toolbar, like the other hidden widgets are drawn by the editor. placeSaveWidgetLast(this); const nativeSave = saveWidget(this); - if (nativeSave) { nativeSave.hidden = true; nativeSave.type = 'hidden'; nativeSave.computeSize = () => [0, -4]; } + if (nativeSave) hideNativeWidget(nativeSave); const element = document.createElement('div'); element.className = `ca-tools pm-focused${split ? ' pm-split' : ''}${pair ? ' pm-pair' : ''}`; element.setAttribute('aria-label',pair ? 'Paired prompt editor' : split ? 'Split prompt editor' : 'Focused prompt editor'); loadStyles(); mountTheme(element, app.ui?.settings, scope);