@obelism/content 0.27.0 → 0.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -252,20 +252,21 @@ await bridge.createCollectionPage() // bridge.collection says which
252
252
  On the site the prompt box is the **on-site editor** instead
253
253
  (`mountSiteEditor`, mounted by `getContentBridge` with the same options): a
254
254
  panel docked on the right, the site reflowed beside it (a sheet over the page
255
- on small screens). **Ask** sends a prompt for the selected block — or the
256
- whole page — and shows the answer with what it changed, before and after; the
257
- change shows on the page straight away, outlined as a preview, and needs
258
- **Keep it** before it can be saved (**Try another** and **Undo** take it
259
- back). **Edit fields** is the CMS's own form for the page — or for the entry
260
- around the selected block — right in the panel: the fields, and blocks as
261
- cards to open and add, as in the dashboard. Edits apply as you make them:
262
- they land in the unsaved changes, show on the page, and undo a burst of
263
- typing at a time. Hovered blocks show their name; Escape goes from a block
264
- back to the whole page. The header names the page and opens every page of
265
- the space, drafts included, to go to one (at `pagePath`, in the page's
266
- language when it has a path there), and shows the environment. A launcher
267
- at the bottom left minimizes the panel, hides the outlines and exits. Its
268
- words are `labels` (`SiteEditorLabels`, defaults in
255
+ on small screens). It opens on **Edit fields**, the CMS's own form for the
256
+ page — or for the entry around the selected block — right in the panel: the
257
+ fields, and blocks as cards to open and add, as in the dashboard. Edits apply
258
+ as you make them: they land in the unsaved changes, show on the page, and
259
+ undo a burst of typing at a time. The small **Ask** button in the header
260
+ switches to prompts for the selected block — or the whole page — and shows
261
+ the answer with what it changed, before and after; the change shows on the
262
+ page straight away, outlined as a preview, and needs **Keep it** before it
263
+ can be saved (**Try another** and **Undo** take it back). Hovered blocks
264
+ show their name; Escape goes from a block back to the whole page. The header
265
+ names the page and opens every page of the space, drafts included, to go to
266
+ one (at `pagePath`, in the page's language when it has a path there), and
267
+ shows the environment. A launcher at the bottom left minimizes the panel,
268
+ hides the outlines and exits. Its words are `labels`
269
+ (`SiteEditorLabels`, defaults in
269
270
  `DEFAULT_SITE_EDITOR_LABELS`).
270
271
 
271
272
  The site makes room for the panel with a margin on `<html>`, which moves
@@ -22,7 +22,7 @@
22
22
  .badge[data-place='beside'] { transform: translateY(-50%); }
23
23
  .badge[data-place='above'] { transform: translate(-100%, -100%); }
24
24
  .badge:focus-visible { outline: 2px solid rgb(212 130 30); outline-offset: 2px; }
25
- `,d=(e,t)=>e.height>=64?{place:"inside",top:Math.max(e.top,0)+8,left:e.right-8}:e.right+8+140<=t?{place:"beside",top:e.top+e.height/2,left:e.right+8}:{place:"above",top:e.top-4,left:e.right},p=/(-?\d*\.?\d+)(?:s|l|d)?vh\b/g,c=(e,t)=>(p.lastIndex=0,p.test(e))?e.replace(p,(e,r)=>`${Math.round(Number(r)*t/100*100)/100}px`):null,u=(e,t)=>{for(let r=0;r<e.length;r++){let n=e.item(r),a=c(e.getPropertyValue(n),t);null!==a&&e.setProperty(n,a,e.getPropertyPriority(n))}},g=(e,t)=>{for(let r of Array.from(e)){let{style:e,cssRules:n}=r;e&&u(e,t),n&&g(n,t)}},h="obelism-content-bridge",b="#d58a1f",m=(e="")=>`${e}[${t}]{cursor:pointer;transition:outline-color .15s}${e}[${t}]:hover{outline:2px dashed ${b};outline-offset:2px}${e}[${t}][data-cms-selected]{outline:2px solid ${b};outline-offset:2px}`,f={features:[],selectedUid:null,prompting:!1,canUndo:!1,unsaved:!1,saving:!1,publishing:!1,selecting:!1,stats:{},statsVisible:!1},v=()=>{let e={update:new Set,saved:new Set,published:new Set,change:new Set};return{listeners:e,on:(t,r)=>(e[t].add(r),()=>{e[t].delete(r)}),emit(t,r){for(let n of e[t])try{n(r)}catch(e){console.error("[@obelism/content bridge]",e)}}}},x=()=>Promise.reject(Error("Save and publish in the visual editor itself")),y=()=>Promise.reject(Error("Only while signed in to edit on the site")),w={prompt:()=>Promise.reject(Error("Prompts only work inside the visual editor")),createPage:()=>Promise.reject(Error("New pages are made on the site itself")),createProductPage:()=>Promise.reject(Error("Product pages are made on the site itself")),createCollectionPage:()=>Promise.reject(Error("Collection pages are made on the site itself")),view:y,applyJson:y,openForm:(e,t={})=>(queueMicrotask(()=>t.onError?.("Only while signed in to edit on the site")),{close:()=>{}}),pages:y,openPage:()=>{},undo:()=>{},save:x,publish:x,signOut:()=>{},select:()=>{},setSelecting:()=>{}},k=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0,E=e=>`[${t}="${e.replace(/["\\]/g,"\\$&")}"]`,C=(e,t)=>{let r=v();e.on("saved",()=>r.emit("saved",{})),e.on("published",()=>r.emit("published",{}));let n=!1;return{isEditing:e.isEditing,mode:e.isEditing?"editor":null,entryId:e.entryId,environment:t.get(i),product:null,collection:null,on:(t,a)=>("update"!==t||n||(n=!0,e.on("update",e=>{let t=e?.entry;t&&r.emit("update",{entry:t,selectedUid:null})})),r.on(t,a)),getState:()=>f,...w,destroy:()=>{}}},A=(e,t,r={},...n)=>{let a=e.createElement(t);for(let t of(Object.assign(a,r),n))a.appendChild("string"==typeof t?e.createTextNode(t):t);return a},N='<rect x="10" y="2" width="4" height="20"/><rect x="2" y="10" width="20" height="4"/><circle cx="6" cy="6" r="2.6"/><circle cx="18" cy="6" r="2.6"/><circle cx="6" cy="18" r="2.6"/><circle cx="18" cy="18" r="2.6"/>',L='<circle cx="6" cy="6" r="2.2"/><circle cx="18" cy="6" r="2.2"/><circle cx="12" cy="12" r="2.2" class="accent"/><circle cx="6" cy="18" r="2.2"/><circle cx="18" cy="18" r="2.2"/>',P=(e,t,r)=>{let n=A(e,"span",{className:t});return n.setAttribute("aria-hidden","true"),n.innerHTML=`<svg viewBox="0 0 24 24">${r}</svg>`,n},S=(e,t)=>e.replace(/\{(\w+)\}/g,(e,r)=>r in t?String(t[r]):e),$={page:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>',newPage:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M9 15h6"/><path d="M12 18v-6"/>',block:'<rect width="18" height="18" x="3" y="3" rx="2"/><path d="M7 8h10"/><path d="M7 12h6"/>',undo:'<path d="M9 14 4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 0 11H11"/>',close:'<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',minimize:'<path d="m6 9 6 6 6-6"/>',expand:'<path d="m18 15-6-6-6 6"/>',chevrons:'<path d="m7 15 5 5 5-5"/><path d="m7 9 5-5 5 5"/>',search:'<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>',check:'<path d="M20 6 9 17l-5-5"/>',mark:`<g fill="currentColor" stroke="none">${N}</g>`,send:'<path d="M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"/><path d="M6 12h16"/>',arrowUp:'<path d="M12 19V5"/><path d="m5 12 7-7 7 7"/>',dash:'<path d="M5 12h14"/>',eye:'<path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z"/><circle cx="12" cy="12" r="3"/>',eyeOff:'<path d="M10.7 5.1A10 10 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-2.2 3.2"/><path d="M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a9.7 9.7 0 0 0 5.4-1.6"/><path d="M9.9 9.9a3 3 0 0 0 4.2 4.2"/><path d="m2 2 20 20"/>',plus:'<path d="M5 12h14"/><path d="M12 5v14"/>',scope:'<rect x="3" y="3" width="18" height="18" rx="3" stroke-dasharray="3 3"/>',alert:'<circle cx="12" cy="12" r="10"/><path d="M12 8v4"/><path d="M12 16h.01"/>'},M=(e,t)=>P(e,"icon",$[t]),U=(e,t,r,{onReady:n,onError:a,onEscape:i})=>{let o=null,s=!1,l=null;return{get mounted(){return null!==o},get loading(){return s},get error(){return l},mount(){s=!0,l=null;let d=e.openForm(t,{title:r,onReady:()=>{o===d&&(s=!1,n())},onError:e=>{o===d&&(s=!1,l=e,a(e))},onEscape:()=>{o===d&&i?.()}});o=d},unmount(){o?.close(),o=null,s=!1,l=null}}},z={open:"Edit with a prompt",placeholder:"Describe a change, like “make it warmer”",send:"Apply",undo:"Undo",minimize:"Minimize, to see the page",scopeEntry:"Whole page",working:"Working on it…",publish:"Publish",saving:"Saving…",publishing:"Publishing…",saved:"Saved as a draft",published:"Published",unsaved:"Unsaved changes",signOut:"Exit",viewingDrafts:"Viewing drafts",newPage:"New page",newPageCancel:"Edit this page instead",newPagePlaceholder:"Describe the new page, e.g. “a pricing page for agencies”",path:"Path",pathPlaceholder:"/pricing",creating:"Writing the page…",created:"Opening the new page…",modes:"Edit with",modePrompt:"Ask",form:"Edit fields",formTitle:"The content form",formLoading:"Opening the form…",pages:"Pages",pagesSearch:"Find a page",pagesLoading:"Loading pages…",pagesEmpty:"No pages match",pageCurrent:"This page",pageDraft:"Draft",pageChanged:"Changed",addProductPage:"Add a product page",addingProductPage:"Making the product page…",addedProductPage:"Opening the product page…",productPageHint:"This product has no page yet. Add one for what the store doesn’t say.",addCollectionPage:"Add a collection page",addingCollectionPage:"Making the collection page…",addedCollectionPage:"Opening the collection page…",collectionPageHint:"This collection has no page yet. Add one for what goes around its products."},I={...z,close:"Close",expand:"Expand",scopeNoPage:"Whole page",scopeBlock:"Selected block",clearBlock:"Edit the whole page instead",save:"Save",selectHint:"Click a block to change only that block"},O={...z,editor:"Obelism editor",editing:"Editing",hideOutlines:"Show the page without outlines",environment:"Environment",envProduction:"live",scopeNoteBlock:"Working on {name}. Click another block to switch.",scopeNotePage:"Working on the whole page. Click a block to change only that block.",block:"Block",previewChip:"{name} \xb7 preview",askIntro:"Describe a change and Obelism shows it on the page. Nothing is stored until you keep it and save.",you:"You",obelism:"Obelism",suggested:"Suggested by Obelism",keep:"Keep it",retry:"Try another",retryPrompt:"{prompt}\n\nWrite a different version than the last one.",kept:"Kept",undone:"Undone",before:"Before",after:"After",emptyValue:"Empty",moreChanges:"{count} more changed",keepFirst:"Keep or undo the suggestion to save",keepBeforeFields:"Keep or undo the suggestion before editing fields.",saveDraft:"Save draft",upToDate:"No unsaved changes",saveFailed:"Couldn’t save",publishFailed:"Couldn’t publish",tryAgain:"Try again"},j=(e,t,r,{onLoad:n,onClose:a})=>{let i=A(e,"input",{type:"text",placeholder:r.pagesSearch,autocomplete:"off",spellcheck:!1});i.setAttribute("role","combobox"),i.setAttribute("aria-label",r.pagesSearch),i.setAttribute("aria-autocomplete","list"),i.setAttribute("aria-expanded","true"),i.setAttribute("aria-controls","obelism-pages");let o=A(e,"label",{className:"search"},M(e,"search"),i),s=A(e,"ul",{className:"options",id:"obelism-pages"});s.setAttribute("role","listbox"),s.setAttribute("aria-label",r.pages);let l=A(e,"p",{className:"empty"}),d=null,p=null,c=null,u=0,g=()=>{let e=i.value.trim().toLowerCase();return(d??[]).filter(t=>!e||t.name.toLowerCase().includes(e)||t.url.toLowerCase().includes(e)||`/${t.path}`.toLowerCase().includes(e))},h=e=>{if(e.entryId===t.entryId)return a();t.openPage(e)},b=()=>{let n=g();u=Math.max(0,Math.min(u,n.length-1)),s.textContent="",n.forEach((n,a)=>{let i=A(e,"li",{className:`option${a===u?" active":""}`,id:`obelism-page-${a}`},A(e,"span",{className:"option-text"},A(e,"span",{textContent:n.name}),A(e,"span",{className:"option-path",textContent:n.url})));if(i.setAttribute("role","option"),i.setAttribute("aria-selected",String(a===u)),"published"!==n.status&&i.appendChild(A(e,"span",{className:"badge",textContent:"draft"===n.status?r.pageDraft:r.pageChanged})),n.entryId===t.entryId){i.setAttribute("aria-current","page");let t=M(e,"check");t.removeAttribute("aria-hidden"),t.setAttribute("role","img"),t.setAttribute("aria-label",r.pageCurrent),i.appendChild(t)}i.addEventListener("click",()=>h(n)),s.appendChild(i)});let a=s.children[u];a?(i.setAttribute("aria-activedescendant",a.id),a.scrollIntoView?.({block:"nearest"})):i.removeAttribute("aria-activedescendant"),l.textContent=(c??(d?"":r.pagesLoading))||(0===n.length?r.pagesEmpty:""),l.hidden=!l.textContent,l.className=`empty${c?" error":""}`},m=()=>(p??(p=t.pages().then(e=>{d=e,c=null,b(),n()},e=>{p=null,c=e instanceof Error?e.message:String(e),b(),n()})),p);return i.addEventListener("input",()=>{u=0,b()}),i.addEventListener("keydown",e=>{let t=s.children.length;if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),0===t)return;u=(u+("ArrowDown"===e.key?1:-1)+t)%t,b()}else if("Enter"!==e.key||e.isComposing)"Escape"===e.key&&(e.preventDefault(),a());else{e.preventDefault();let t=g()[u];t&&h(t)}}),{searchRow:o,search:i,list:s,note:l,get pages(){return d},get error(){return c},current:()=>d?.find(({entryId:e})=>e===t.entryId)??null,fetch:m,forget(){d=null,p=null},reset(){i.value="",u=Math.max(0,(d??[]).findIndex(({entryId:e})=>e===t.entryId)),m(),b()},render:b}},R=e=>e instanceof Error?e.message:String(e),D=(e,t,r)=>{let n="site"===e.mode,a=n&&t.features.includes("create"),i=n&&null===e.entryId,o=i&&a?e.product?"product":e.collection?"collection":null:null;return{site:n,canCreate:a,pageless:i,shopHere:o,onlyNew:i&&a&&!o&&!r}},T=(e,t)=>"collection"===t?{add:e.addCollectionPage,adding:e.addingCollectionPage,hint:e.collectionPageHint}:{add:e.addProductPage,adding:e.addingProductPage,hint:e.productPageHint},q=async(e,t)=>{try{if(e.product)return await e.createProductPage(),{text:t.addedProductPage,error:!1};return await e.createCollectionPage(),{text:t.addedCollectionPage,error:!1}}catch(e){return{text:R(e),error:!0}}},F=async(e,t)=>{try{return await e[t](),null}catch(e){return R(e)}},B="obelism-content-prompt-side",H=`
25
+ `,d=(e,t)=>e.height>=64?{place:"inside",top:Math.max(e.top,0)+8,left:e.right-8}:e.right+8+140<=t?{place:"beside",top:e.top+e.height/2,left:e.right+8}:{place:"above",top:e.top-4,left:e.right},p=/(-?\d*\.?\d+)(?:s|l|d)?vh\b/g,c=(e,t)=>(p.lastIndex=0,p.test(e))?e.replace(p,(e,r)=>`${Math.round(Number(r)*t/100*100)/100}px`):null,u=(e,t)=>{for(let r=0;r<e.length;r++){let n=e.item(r),a=c(e.getPropertyValue(n),t);null!==a&&e.setProperty(n,a,e.getPropertyPriority(n))}},g=(e,t)=>{for(let r of Array.from(e)){let{style:e,cssRules:n}=r;e&&u(e,t),n&&g(n,t)}},h="obelism-content-bridge",b="#d58a1f",m=(e="")=>`${e}[${t}]{cursor:pointer;transition:outline-color .15s}${e}[${t}]:hover{outline:2px dashed ${b};outline-offset:2px}${e}[${t}][data-cms-selected]{outline:2px solid ${b};outline-offset:2px}`,f={features:[],selectedUid:null,prompting:!1,canUndo:!1,unsaved:!1,saving:!1,publishing:!1,selecting:!1,stats:{},statsVisible:!1},v=()=>{let e={update:new Set,saved:new Set,published:new Set,change:new Set};return{listeners:e,on:(t,r)=>(e[t].add(r),()=>{e[t].delete(r)}),emit(t,r){for(let n of e[t])try{n(r)}catch(e){console.error("[@obelism/content bridge]",e)}}}},x=()=>Promise.reject(Error("Save and publish in the visual editor itself")),y=()=>Promise.reject(Error("Only while signed in to edit on the site")),w={prompt:()=>Promise.reject(Error("Prompts only work inside the visual editor")),createPage:()=>Promise.reject(Error("New pages are made on the site itself")),createProductPage:()=>Promise.reject(Error("Product pages are made on the site itself")),createCollectionPage:()=>Promise.reject(Error("Collection pages are made on the site itself")),view:y,applyJson:y,openForm:(e,t={})=>(queueMicrotask(()=>t.onError?.("Only while signed in to edit on the site")),{close:()=>{}}),pages:y,openPage:()=>{},undo:()=>{},save:x,publish:x,signOut:()=>{},select:()=>{},setSelecting:()=>{}},k=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0,E=e=>`[${t}="${e.replace(/["\\]/g,"\\$&")}"]`,C=(e,t)=>{let r=v();e.on("saved",()=>r.emit("saved",{})),e.on("published",()=>r.emit("published",{}));let n=!1;return{isEditing:e.isEditing,mode:e.isEditing?"editor":null,entryId:e.entryId,environment:t.get(i),product:null,collection:null,on:(t,a)=>("update"!==t||n||(n=!0,e.on("update",e=>{let t=e?.entry;t&&r.emit("update",{entry:t,selectedUid:null})})),r.on(t,a)),getState:()=>f,...w,destroy:()=>{}}},N=(e,t,r={},...n)=>{let a=e.createElement(t);for(let t of(Object.assign(a,r),n))a.appendChild("string"==typeof t?e.createTextNode(t):t);return a},A='<rect x="10" y="2" width="4" height="20"/><rect x="2" y="10" width="20" height="4"/><circle cx="6" cy="6" r="2.6"/><circle cx="18" cy="6" r="2.6"/><circle cx="6" cy="18" r="2.6"/><circle cx="18" cy="18" r="2.6"/>',L='<circle cx="6" cy="6" r="2.2"/><circle cx="18" cy="6" r="2.2"/><circle cx="12" cy="12" r="2.2" class="accent"/><circle cx="6" cy="18" r="2.2"/><circle cx="18" cy="18" r="2.2"/>',P=(e,t,r)=>{let n=N(e,"span",{className:t});return n.setAttribute("aria-hidden","true"),n.innerHTML=`<svg viewBox="0 0 24 24">${r}</svg>`,n},S=(e,t)=>e.replace(/\{(\w+)\}/g,(e,r)=>r in t?String(t[r]):e),$={page:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>',newPage:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M9 15h6"/><path d="M12 18v-6"/>',block:'<rect width="18" height="18" x="3" y="3" rx="2"/><path d="M7 8h10"/><path d="M7 12h6"/>',undo:'<path d="M9 14 4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 0 11H11"/>',close:'<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',minimize:'<path d="m6 9 6 6 6-6"/>',expand:'<path d="m18 15-6-6-6 6"/>',chevrons:'<path d="m7 15 5 5 5-5"/><path d="m7 9 5-5 5 5"/>',search:'<circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/>',check:'<path d="M20 6 9 17l-5-5"/>',mark:`<g fill="currentColor" stroke="none">${A}</g>`,send:'<path d="M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"/><path d="M6 12h16"/>',arrowUp:'<path d="M12 19V5"/><path d="m5 12 7-7 7 7"/>',dash:'<path d="M5 12h14"/>',eye:'<path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z"/><circle cx="12" cy="12" r="3"/>',eyeOff:'<path d="M10.7 5.1A10 10 0 0 1 12 5c6.5 0 10 7 10 7a17 17 0 0 1-2.2 3.2"/><path d="M6.6 6.6A17 17 0 0 0 2 12s3.5 7 10 7a9.7 9.7 0 0 0 5.4-1.6"/><path d="M9.9 9.9a3 3 0 0 0 4.2 4.2"/><path d="m2 2 20 20"/>',plus:'<path d="M5 12h14"/><path d="M12 5v14"/>',scope:'<rect x="3" y="3" width="18" height="18" rx="3" stroke-dasharray="3 3"/>',alert:'<circle cx="12" cy="12" r="10"/><path d="M12 8v4"/><path d="M12 16h.01"/>'},M=(e,t)=>P(e,"icon",$[t]),U=(e,t,r,{onReady:n,onError:a,onEscape:i})=>{let o=null,s=!1,l=null;return{get mounted(){return null!==o},get loading(){return s},get error(){return l},mount(){s=!0,l=null;let d=e.openForm(t,{title:r,onReady:()=>{o===d&&(s=!1,n())},onError:e=>{o===d&&(s=!1,l=e,a(e))},onEscape:()=>{o===d&&i?.()}});o=d},unmount(){o?.close(),o=null,s=!1,l=null}}},z={open:"Edit with a prompt",placeholder:"Describe a change, like “make it warmer”",send:"Apply",undo:"Undo",minimize:"Minimize, to see the page",scopeEntry:"Whole page",working:"Working on it…",publish:"Publish",saving:"Saving…",publishing:"Publishing…",saved:"Saved as a draft",published:"Published",unsaved:"Unsaved changes",signOut:"Exit",viewingDrafts:"Viewing drafts",newPage:"New page",newPageCancel:"Edit this page instead",newPagePlaceholder:"Describe the new page, e.g. “a pricing page for agencies”",path:"Path",pathPlaceholder:"/pricing",creating:"Writing the page…",created:"Opening the new page…",modes:"Edit with",modePrompt:"Ask",form:"Edit fields",formTitle:"The content form",formLoading:"Opening the form…",pages:"Pages",pagesSearch:"Find a page",pagesLoading:"Loading pages…",pagesEmpty:"No pages match",pageCurrent:"This page",pageDraft:"Draft",pageChanged:"Changed",addProductPage:"Add a product page",addingProductPage:"Making the product page…",addedProductPage:"Opening the product page…",productPageHint:"This product has no page yet. Add one for what the store doesn’t say.",addCollectionPage:"Add a collection page",addingCollectionPage:"Making the collection page…",addedCollectionPage:"Opening the collection page…",collectionPageHint:"This collection has no page yet. Add one for what goes around its products."},I={...z,close:"Close",expand:"Expand",scopeNoPage:"Whole page",scopeBlock:"Selected block",clearBlock:"Edit the whole page instead",save:"Save",selectHint:"Click a block to change only that block"},O={...z,editor:"Obelism editor",editing:"Editing",hideOutlines:"Show the page without outlines",environment:"Environment",envProduction:"live",scopeNoteBlock:"Working on {name}. Click another block to switch.",scopeNotePage:"Working on the whole page. Click a block to change only that block.",block:"Block",previewChip:"{name} \xb7 preview",askIntro:"Describe a change and Obelism shows it on the page. Nothing is stored until you keep it and save.",you:"You",obelism:"Obelism",suggested:"Suggested by Obelism",keep:"Keep it",retry:"Try another",retryPrompt:"{prompt}\n\nWrite a different version than the last one.",kept:"Kept",undone:"Undone",before:"Before",after:"After",emptyValue:"Empty",moreChanges:"{count} more changed",keepFirst:"Keep or undo the suggestion to save",keepBeforeFields:"Keep or undo the suggestion before editing fields.",saveDraft:"Save draft",upToDate:"No unsaved changes",saveFailed:"Couldn’t save",publishFailed:"Couldn’t publish",tryAgain:"Try again"},j=(e,t,r,{onLoad:n,onClose:a})=>{let i=N(e,"input",{type:"text",placeholder:r.pagesSearch,autocomplete:"off",spellcheck:!1});i.setAttribute("role","combobox"),i.setAttribute("aria-label",r.pagesSearch),i.setAttribute("aria-autocomplete","list"),i.setAttribute("aria-expanded","true"),i.setAttribute("aria-controls","obelism-pages");let o=N(e,"label",{className:"search"},M(e,"search"),i),s=N(e,"ul",{className:"options",id:"obelism-pages"});s.setAttribute("role","listbox"),s.setAttribute("aria-label",r.pages);let l=N(e,"p",{className:"empty"}),d=null,p=null,c=null,u=0,g=()=>{let e=i.value.trim().toLowerCase();return(d??[]).filter(t=>!e||t.name.toLowerCase().includes(e)||t.url.toLowerCase().includes(e)||`/${t.path}`.toLowerCase().includes(e))},h=e=>{if(e.entryId===t.entryId)return a();t.openPage(e)},b=()=>{let n=g();u=Math.max(0,Math.min(u,n.length-1)),s.textContent="",n.forEach((n,a)=>{let i=N(e,"li",{className:`option${a===u?" active":""}`,id:`obelism-page-${a}`},N(e,"span",{className:"option-text"},N(e,"span",{textContent:n.name}),N(e,"span",{className:"option-path",textContent:n.url})));if(i.setAttribute("role","option"),i.setAttribute("aria-selected",String(a===u)),"published"!==n.status&&i.appendChild(N(e,"span",{className:"badge",textContent:"draft"===n.status?r.pageDraft:r.pageChanged})),n.entryId===t.entryId){i.setAttribute("aria-current","page");let t=M(e,"check");t.removeAttribute("aria-hidden"),t.setAttribute("role","img"),t.setAttribute("aria-label",r.pageCurrent),i.appendChild(t)}i.addEventListener("click",()=>h(n)),s.appendChild(i)});let a=s.children[u];a?(i.setAttribute("aria-activedescendant",a.id),a.scrollIntoView?.({block:"nearest"})):i.removeAttribute("aria-activedescendant"),l.textContent=(c??(d?"":r.pagesLoading))||(0===n.length?r.pagesEmpty:""),l.hidden=!l.textContent,l.className=`empty${c?" error":""}`},m=()=>(p??(p=t.pages().then(e=>{d=e,c=null,b(),n()},e=>{p=null,c=e instanceof Error?e.message:String(e),b(),n()})),p);return i.addEventListener("input",()=>{u=0,b()}),i.addEventListener("keydown",e=>{let t=s.children.length;if("ArrowDown"===e.key||"ArrowUp"===e.key){if(e.preventDefault(),0===t)return;u=(u+("ArrowDown"===e.key?1:-1)+t)%t,b()}else if("Enter"!==e.key||e.isComposing)"Escape"===e.key&&(e.preventDefault(),a());else{e.preventDefault();let t=g()[u];t&&h(t)}}),{searchRow:o,search:i,list:s,note:l,get pages(){return d},get error(){return c},current:()=>d?.find(({entryId:e})=>e===t.entryId)??null,fetch:m,forget(){d=null,p=null},reset(){i.value="",u=Math.max(0,(d??[]).findIndex(({entryId:e})=>e===t.entryId)),m(),b()},render:b}},R=e=>e instanceof Error?e.message:String(e),T=(e,t,r)=>{let n="site"===e.mode,a=n&&t.features.includes("create"),i=n&&null===e.entryId,o=i&&a?e.product?"product":e.collection?"collection":null:null;return{site:n,canCreate:a,pageless:i,shopHere:o,onlyNew:i&&a&&!o&&!r}},D=(e,t)=>"collection"===t?{add:e.addCollectionPage,adding:e.addingCollectionPage,hint:e.collectionPageHint}:{add:e.addProductPage,adding:e.addingProductPage,hint:e.productPageHint},q=async(e,t)=>{try{if(e.product)return await e.createProductPage(),{text:t.addedProductPage,error:!1};return await e.createCollectionPage(),{text:t.addedCollectionPage,error:!1}}catch(e){return{text:R(e),error:!0}}},F=async(e,t)=>{try{return await e[t](),null}catch(e){return R(e)}},B="obelism-content-prompt-side",_=`
26
26
  :host { all: initial; }
27
27
  * { box-sizing: border-box; font: inherit; color: inherit; margin: 0; }
28
28
  .root {
@@ -253,7 +253,7 @@ button.chip:disabled { opacity: .5; }
253
253
  .empty { padding: 8px 12px; color: rgb(var(--theme-foreground-muted-rgb)); }
254
254
  .empty.error { color: var(--theme-error); }
255
255
  [hidden] { display: none !important; }
256
- `,_=(e,t,r={})=>{let n,a={...I,...r.labels},i=A(e,"div");i.setAttribute("data-obelism-content-prompt","");let o=i.attachShadow({mode:"open"}),s="site"===t.mode,l=A(e,"span",{textContent:a.open}),d=A(e,"button",{className:"pill",type:"button"},l,((n=M(e,"mark")).classList.add("mark"),n)),p=A(e,"span",{className:"pill compact"},`${a.viewingDrafts} \xb7 `),c=A(e,"button",{className:"link",type:"button",textContent:a.signOut});p.appendChild(c);let u=A(e,"p",{className:"status"});u.setAttribute("role","status");let g=A(e,"textarea",{placeholder:a.placeholder,rows:1});g.setAttribute("aria-label",a.open);let h=A(e,"div",{className:"form-loader",textContent:a.formLoading});h.setAttribute("role","status");let b=A(e,"div",{className:"form"},h),m=M(e,"page"),f=M(e,"block"),v=A(e,"span"),x=A(e,"button",{type:"button",title:a.clearBlock});x.setAttribute("aria-label",a.clearBlock),x.appendChild(M(e,"close"));let y=A(e,"span",{className:"chip scope"},m,f,v,x),w=A(e,"button",{className:"action chip",type:"button"},M(e,"undo"),a.undo),k=t=>{let r=A(e,"button",{type:"button",textContent:t});return r.setAttribute("aria-pressed","false"),r},E=k(a.modePrompt),C=k(a.form),N=A(e,"span",{className:"modes"},E,C);N.setAttribute("role","group"),N.setAttribute("aria-label",a.modes);let L=A(e,"button",{className:"action chip",type:"button"},M(e,"newPage"),a.newPage),P=A(e,"button",{className:"action chip product",type:"button"},M(e,"newPage"),a.addProductPage),S=A(e,"button",{type:"button",title:a.newPageCancel});S.setAttribute("aria-label",a.newPageCancel),S.appendChild(M(e,"close"));let $=A(e,"span",{className:"chip scope"},M(e,"newPage"),A(e,"span",{textContent:a.newPage}),S),z=A(e,"input",{type:"text",placeholder:a.pathPlaceholder,autocomplete:"off",spellcheck:!1}),O=A(e,"label",{className:"path"},A(e,"span",{textContent:a.path}),z),_=A(e,"button",{className:"close icon-button",type:"button",title:a.close},M(e,"close"));_.setAttribute("aria-label",a.close);let V=M(e,"minimize"),W=M(e,"expand"),Y=A(e,"button",{className:"icon-button",type:"button"},V,W),X=A(e,"button",{className:"action primary icon-button",type:"submit"},A(e,"span",{className:"visually-hidden",textContent:a.send}),M(e,"send"));X.title=a.send;let K=A(e,"span",{className:"divider"}),J=A(e,"div",{className:"toolbar"},y,$,N,w,P,L,A(e,"span",{className:"spacer"}),Y,_,K,X),Z=A(e,"span",{textContent:a.pages}),G=A(e,"button",{className:"chip page-chip",type:"button",title:a.pages},M(e,"page"),Z,M(e,"chevrons"));G.setAttribute("aria-haspopup","listbox"),G.setAttribute("aria-expanded","false"),G.setAttribute("aria-controls","obelism-pages");let Q=j(e,t,a,{onLoad:()=>eE(),onClose:()=>eL(!1)}),ee=A(e,"div",{className:"pages"},Q.searchRow,Q.list,Q.note),et=A(e,"slot");et.name="actions-footer";let er=A(e,"slot");er.name="actions-bar",r.actions&&(r.actions.slot="actions-bar",i.appendChild(r.actions));let en=A(e,"span",{className:"unsaved"});en.appendChild(A(e,"span",{className:"dot"})),en.appendChild(e.createTextNode(a.unsaved));let ea=A(e,"button",{className:"link",type:"button",textContent:a.signOut}),ei=A(e,"button",{className:"action chip",type:"button",textContent:a.save}),eo=A(e,"button",{className:"action chip",type:"button",textContent:a.publish}),es=A(e,"div",{className:"footer"},G,en,A(e,"span",{className:"spacer"}),et,ea,ei,eo),el=A(e,"form",{className:"panel"},u,O,g,b,J,ee,es),ed=A(e,"div",{className:"root"},A(e,"div",{className:"bar"},d,p,er),el);o.append(A(e,"style",{textContent:H}),ed);let ep=e.defaultView,ec=e=>{"center"===e?delete ed.dataset.side:ed.dataset.side=e};ec((()=>{try{let e=ep?.localStorage.getItem(B);return"left"===e||"right"===e?e:"center"}catch{return"center"}})());let eu=null,eg=!1;ed.addEventListener("pointerdown",e=>{if(eg=!1,0!==e.button||!e.isPrimary)return;let t=e.target.closest("button, input, textarea, select, iframe, a, label, .pages, .form");if(t&&t!==d)return;let{left:r,right:n}=ed.getBoundingClientRect();eu={id:e.pointerId,startX:e.clientX,x:e.clientX,velocity:0,time:e.timeStamp,moved:!1,min:Math.min(0,16-r),max:Math.max(0,(ep?.innerWidth??0)-16-n)}}),ed.addEventListener("pointermove",e=>{if(!eu||e.pointerId!==eu.id)return;let t=e.clientX-eu.startX;if(!eu.moved){if(6>Math.abs(t))return;eu.moved=!0,ed.classList.add("dragging");try{ed.setPointerCapture(e.pointerId)}catch{}}let r=e.timeStamp-eu.time;r>0&&(eu.velocity=(e.clientX-eu.x)/r),eu.x=e.clientX,eu.time=e.timeStamp;let n=Math.min(Math.max(t,eu.min),eu.max);ed.style.translate=`${n+(t-n)/3}px 0`});let eh=e=>{if(!eu||e.pointerId!==eu.id)return;let{moved:t,x:r,velocity:n,time:a}=eu;if(eu=null,!t)return;eg=!0;let i=ed.getBoundingClientRect().left,o=ep?.innerWidth??0,s=r+(e.timeStamp-a>80?0:Math.min(Math.max(150*n,-120),120)),l=s<o/3?"left":s>2*o/3?"right":"center";ec(l),ed.style.translate="";let d=ed.getBoundingClientRect().left;ed.style.translate=`${i-d}px 0`,ed.offsetWidth,ed.classList.remove("dragging"),ed.style.translate="";try{ep?.localStorage.setItem(B,l)}catch{}};ed.addEventListener("pointerup",eh),ed.addEventListener("pointercancel",eh),ed.addEventListener("click",e=>{eg&&(eg=!1,e.preventDefault(),e.stopPropagation())},!0);let eb=!1,em=!1,ef=!1,ev=null,ex=!1,ey=U(t,b,a.formTitle,{onReady:()=>{ev=null,eE()},onError:e=>{ev={text:e,error:!0},eE()}}),ew=!1,ek=e=>{let n=e.features.includes("prompt"),i=e.saving||e.publishing,o=e.prompting||i;ed.hidden=!n&&!s,d.hidden=eb||!n,p.hidden=n||!s,el.hidden=!eb||!n;let{canCreate:k,pageless:A,shopHere:M,onlyNew:U}=D(t,e,r.promptWithoutPage),I=null!==M,j=T(a,M);P.lastChild.textContent=j.add,k||(ef=!1),U&&(ef=!0),(ef||A||!s)&&(ex=!1);let R=eb&&n&&ex;R&&!ey.mounted?ey.mount():!R&&ey.mounted&&ey.unmount();let q=I&&!ef;l.textContent=q?j.add:U?a.newPage:a.open,S.hidden=U,y.hidden=ef||q,$.hidden=!ef,P.hidden=!q,P.disabled=o,L.hidden=ef||ex||!k,L.disabled=o,em&&(ew=!1),O.hidden=!ef||ew||em,z.disabled=o,g.hidden=ex||ew||em||q,b.hidden=!ex||ew||em,b.classList.toggle("loading",ey.loading),h.hidden=!ey.loading,J.hidden=ew,ee.hidden=!ew,g.placeholder=ef?a.newPagePlaceholder:a.placeholder,v.textContent=e.selectedUid?a.scopeBlock:A?a.scopeNoPage:a.scopeEntry,x.hidden=!e.selectedUid,m.hidden=!!e.selectedUid,f.hidden=!e.selectedUid,N.hidden=!s||ef||A||!e.features.includes("form"),E.setAttribute("aria-pressed",String(!ex)),C.setAttribute("aria-pressed",String(ex)),N.querySelectorAll("button").forEach(e=>{e.disabled=o}),w.hidden=ef||!e.canUndo,w.disabled=o,X.hidden=ex||em||q,K.hidden=ex||em||q;let F=em?a.expand:a.minimize;Y.title=F,Y.setAttribute("aria-label",F),Y.setAttribute("aria-expanded",String(!em)),V.hidden=em,W.hidden=!em,X.disabled=o||""===g.value.trim()||ef&&""===z.value.trim(),g.disabled=o,ei.hidden=!e.features.includes("save")||A,ei.disabled=o||!e.unsaved,ei.textContent=e.saving?a.saving:a.save,eo.hidden=!e.features.includes("publish")||A,eo.disabled=o,eo.textContent=e.publishing?a.publishing:a.publish,ea.hidden=!s||!1===r.signOut,c.hidden=!1===r.signOut,r.actions&&(r.actions.slot=eb&&n?"actions-footer":"actions-bar"),es.hidden=!s,en.hidden=!e.unsaved,G.hidden=!s,G.setAttribute("aria-expanded",String(ew)),Z.textContent=Q.current()?.name??a.pages;let B=ex&&ey.loading&&!ew,H=e.prompting,_=e.prompting?ef?a.creating:q?j.adding:a.working:B?"":ev?.text??(q?j.hint:!s||ef||ew||e.selectedUid?"":a.selectHint);u.textContent=_,u.hidden=!_||em,u.className=`status${H?" working":""}${!o&&!B&&ev?.error?" error":""}`},eE=()=>ek(t.getState()),eC=()=>{g.style.height="auto",g.style.height=`${g.scrollHeight}px`},eA=e=>{ex!==e&&(ex=e,ev=null,eE(),ex||g.focus())},eN=async()=>{if(ex)return;let e=g.value.trim();if(e&&!t.getState().prompting){ev=null;try{if(ef){let r=z.value.trim();if(!r)return z.focus();await t.createPage(r,e),Q.forget(),ev={text:a.created,error:!1}}else{let{summary:r}=await t.prompt(e);ev={text:r,error:!1}}g.value="",eC()}catch(e){ev={text:R(e),error:!0}}eE(),g.focus()}},eL=e=>{ev=null,(ew=e)&&Q.reset(),eE(),(ew?Q.search:G).focus()},eP=e=>{(eb=e)||(ew=!1,em=!1),eE(),s&&t.setSelecting(eb&&!ef),eb&&s&&Q.fetch()},eS=e=>{ef=e,ev=null,t.setSelecting(eb&&!ef),ef&&t.select(null),eE(),(ef?z:g).focus()},e$=async e=>{ev=null;let r=await F(t,e);ev=r?{text:r,error:!0}:{text:"save"===e?a.saved:a.published,error:!1},eE()};d.addEventListener("click",()=>{eP(!0),ex||(ef?z:g).focus()}),_.addEventListener("click",()=>eP(!1)),Y.addEventListener("click",()=>{em=!em,eE(),em||(ex?Y:g).focus()}),el.addEventListener("click",e=>{if(!em)return;let t=e.target.closest("button");t&&t!==Y&&t!==_&&(em=!1,eE())},!0),ei.addEventListener("click",()=>void e$("save")),eo.addEventListener("click",()=>void e$("publish")),ea.addEventListener("click",()=>t.signOut()),c.addEventListener("click",()=>t.signOut()),x.addEventListener("click",()=>t.select(null)),L.addEventListener("click",()=>eS(!0)),P.addEventListener("click",async()=>{ev=null,ev=await q(t,a),eE()}),S.addEventListener("click",()=>eS(!1)),E.addEventListener("click",()=>eA(!1)),C.addEventListener("click",()=>eA(!0)),G.addEventListener("click",()=>eL(!ew)),z.addEventListener("input",eE),z.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing?"Escape"===e.key&&eP(!1):(e.preventDefault(),g.focus())}),w.addEventListener("click",()=>{ev=null,t.undo()}),el.addEventListener("submit",e=>{e.preventDefault(),eN()}),g.addEventListener("input",()=>{eC(),eE()}),g.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing?"Escape"===e.key&&eP(!1):(e.preventDefault(),eN())});let eM=t.on("change",ek);return eE(),e.body.appendChild(i),()=>{eM(),ey.unmount(),i.remove()}},V="https://content.obelism.studio",W=/^(?:\/[\w.~-]+)+$/,Y=e=>{let{protocol:t}=new URL(e,"https://site.invalid");if("https:"!==t&&"http:"!==t)throw Error(`Not a page address: ${e}`);return e},X=(e,t)=>JSON.stringify(e)===JSON.stringify(t),K="obelism-content-editor",J=`
256
+ `,H=(e,t,r={})=>{let n,a={...I,...r.labels},i=N(e,"div");i.setAttribute("data-obelism-content-prompt","");let o=i.attachShadow({mode:"open"}),s="site"===t.mode,l=N(e,"span",{textContent:a.open}),d=N(e,"button",{className:"pill",type:"button"},l,((n=M(e,"mark")).classList.add("mark"),n)),p=N(e,"span",{className:"pill compact"},`${a.viewingDrafts} \xb7 `),c=N(e,"button",{className:"link",type:"button",textContent:a.signOut});p.appendChild(c);let u=N(e,"p",{className:"status"});u.setAttribute("role","status");let g=N(e,"textarea",{placeholder:a.placeholder,rows:1});g.setAttribute("aria-label",a.open);let h=N(e,"div",{className:"form-loader",textContent:a.formLoading});h.setAttribute("role","status");let b=N(e,"div",{className:"form"},h),m=M(e,"page"),f=M(e,"block"),v=N(e,"span"),x=N(e,"button",{type:"button",title:a.clearBlock});x.setAttribute("aria-label",a.clearBlock),x.appendChild(M(e,"close"));let y=N(e,"span",{className:"chip scope"},m,f,v,x),w=N(e,"button",{className:"action chip",type:"button"},M(e,"undo"),a.undo),k=t=>{let r=N(e,"button",{type:"button",textContent:t});return r.setAttribute("aria-pressed","false"),r},E=k(a.modePrompt),C=k(a.form),A=N(e,"span",{className:"modes"},E,C);A.setAttribute("role","group"),A.setAttribute("aria-label",a.modes);let L=N(e,"button",{className:"action chip",type:"button"},M(e,"newPage"),a.newPage),P=N(e,"button",{className:"action chip product",type:"button"},M(e,"newPage"),a.addProductPage),S=N(e,"button",{type:"button",title:a.newPageCancel});S.setAttribute("aria-label",a.newPageCancel),S.appendChild(M(e,"close"));let $=N(e,"span",{className:"chip scope"},M(e,"newPage"),N(e,"span",{textContent:a.newPage}),S),z=N(e,"input",{type:"text",placeholder:a.pathPlaceholder,autocomplete:"off",spellcheck:!1}),O=N(e,"label",{className:"path"},N(e,"span",{textContent:a.path}),z),H=N(e,"button",{className:"close icon-button",type:"button",title:a.close},M(e,"close"));H.setAttribute("aria-label",a.close);let V=M(e,"minimize"),W=M(e,"expand"),Y=N(e,"button",{className:"icon-button",type:"button"},V,W),X=N(e,"button",{className:"action primary icon-button",type:"submit"},N(e,"span",{className:"visually-hidden",textContent:a.send}),M(e,"send"));X.title=a.send;let K=N(e,"span",{className:"divider"}),J=N(e,"div",{className:"toolbar"},y,$,A,w,P,L,N(e,"span",{className:"spacer"}),Y,H,K,X),Z=N(e,"span",{textContent:a.pages}),G=N(e,"button",{className:"chip page-chip",type:"button",title:a.pages},M(e,"page"),Z,M(e,"chevrons"));G.setAttribute("aria-haspopup","listbox"),G.setAttribute("aria-expanded","false"),G.setAttribute("aria-controls","obelism-pages");let Q=j(e,t,a,{onLoad:()=>eE(),onClose:()=>eL(!1)}),ee=N(e,"div",{className:"pages"},Q.searchRow,Q.list,Q.note),et=N(e,"slot");et.name="actions-footer";let er=N(e,"slot");er.name="actions-bar",r.actions&&(r.actions.slot="actions-bar",i.appendChild(r.actions));let en=N(e,"span",{className:"unsaved"});en.appendChild(N(e,"span",{className:"dot"})),en.appendChild(e.createTextNode(a.unsaved));let ea=N(e,"button",{className:"link",type:"button",textContent:a.signOut}),ei=N(e,"button",{className:"action chip",type:"button",textContent:a.save}),eo=N(e,"button",{className:"action chip",type:"button",textContent:a.publish}),es=N(e,"div",{className:"footer"},G,en,N(e,"span",{className:"spacer"}),et,ea,ei,eo),el=N(e,"form",{className:"panel"},u,O,g,b,J,ee,es),ed=N(e,"div",{className:"root"},N(e,"div",{className:"bar"},d,p,er),el);o.append(N(e,"style",{textContent:_}),ed);let ep=e.defaultView,ec=e=>{"center"===e?delete ed.dataset.side:ed.dataset.side=e};ec((()=>{try{let e=ep?.localStorage.getItem(B);return"left"===e||"right"===e?e:"center"}catch{return"center"}})());let eu=null,eg=!1;ed.addEventListener("pointerdown",e=>{if(eg=!1,0!==e.button||!e.isPrimary)return;let t=e.target.closest("button, input, textarea, select, iframe, a, label, .pages, .form");if(t&&t!==d)return;let{left:r,right:n}=ed.getBoundingClientRect();eu={id:e.pointerId,startX:e.clientX,x:e.clientX,velocity:0,time:e.timeStamp,moved:!1,min:Math.min(0,16-r),max:Math.max(0,(ep?.innerWidth??0)-16-n)}}),ed.addEventListener("pointermove",e=>{if(!eu||e.pointerId!==eu.id)return;let t=e.clientX-eu.startX;if(!eu.moved){if(6>Math.abs(t))return;eu.moved=!0,ed.classList.add("dragging");try{ed.setPointerCapture(e.pointerId)}catch{}}let r=e.timeStamp-eu.time;r>0&&(eu.velocity=(e.clientX-eu.x)/r),eu.x=e.clientX,eu.time=e.timeStamp;let n=Math.min(Math.max(t,eu.min),eu.max);ed.style.translate=`${n+(t-n)/3}px 0`});let eh=e=>{if(!eu||e.pointerId!==eu.id)return;let{moved:t,x:r,velocity:n,time:a}=eu;if(eu=null,!t)return;eg=!0;let i=ed.getBoundingClientRect().left,o=ep?.innerWidth??0,s=r+(e.timeStamp-a>80?0:Math.min(Math.max(150*n,-120),120)),l=s<o/3?"left":s>2*o/3?"right":"center";ec(l),ed.style.translate="";let d=ed.getBoundingClientRect().left;ed.style.translate=`${i-d}px 0`,ed.offsetWidth,ed.classList.remove("dragging"),ed.style.translate="";try{ep?.localStorage.setItem(B,l)}catch{}};ed.addEventListener("pointerup",eh),ed.addEventListener("pointercancel",eh),ed.addEventListener("click",e=>{eg&&(eg=!1,e.preventDefault(),e.stopPropagation())},!0);let eb=!1,em=!1,ef=!1,ev=null,ex=!1,ey=U(t,b,a.formTitle,{onReady:()=>{ev=null,eE()},onError:e=>{ev={text:e,error:!0},eE()}}),ew=!1,ek=e=>{let n=e.features.includes("prompt"),i=e.saving||e.publishing,o=e.prompting||i;ed.hidden=!n&&!s,d.hidden=eb||!n,p.hidden=n||!s,el.hidden=!eb||!n;let{canCreate:k,pageless:N,shopHere:M,onlyNew:U}=T(t,e,r.promptWithoutPage),I=null!==M,j=D(a,M);P.lastChild.textContent=j.add,k||(ef=!1),U&&(ef=!0),(ef||N||!s)&&(ex=!1);let R=eb&&n&&ex;R&&!ey.mounted?ey.mount():!R&&ey.mounted&&ey.unmount();let q=I&&!ef;l.textContent=q?j.add:U?a.newPage:a.open,S.hidden=U,y.hidden=ef||q,$.hidden=!ef,P.hidden=!q,P.disabled=o,L.hidden=ef||ex||!k,L.disabled=o,em&&(ew=!1),O.hidden=!ef||ew||em,z.disabled=o,g.hidden=ex||ew||em||q,b.hidden=!ex||ew||em,b.classList.toggle("loading",ey.loading),h.hidden=!ey.loading,J.hidden=ew,ee.hidden=!ew,g.placeholder=ef?a.newPagePlaceholder:a.placeholder,v.textContent=e.selectedUid?a.scopeBlock:N?a.scopeNoPage:a.scopeEntry,x.hidden=!e.selectedUid,m.hidden=!!e.selectedUid,f.hidden=!e.selectedUid,A.hidden=!s||ef||N||!e.features.includes("form"),E.setAttribute("aria-pressed",String(!ex)),C.setAttribute("aria-pressed",String(ex)),A.querySelectorAll("button").forEach(e=>{e.disabled=o}),w.hidden=ef||!e.canUndo,w.disabled=o,X.hidden=ex||em||q,K.hidden=ex||em||q;let F=em?a.expand:a.minimize;Y.title=F,Y.setAttribute("aria-label",F),Y.setAttribute("aria-expanded",String(!em)),V.hidden=em,W.hidden=!em,X.disabled=o||""===g.value.trim()||ef&&""===z.value.trim(),g.disabled=o,ei.hidden=!e.features.includes("save")||N,ei.disabled=o||!e.unsaved,ei.textContent=e.saving?a.saving:a.save,eo.hidden=!e.features.includes("publish")||N,eo.disabled=o,eo.textContent=e.publishing?a.publishing:a.publish,ea.hidden=!s||!1===r.signOut,c.hidden=!1===r.signOut,r.actions&&(r.actions.slot=eb&&n?"actions-footer":"actions-bar"),es.hidden=!s,en.hidden=!e.unsaved,G.hidden=!s,G.setAttribute("aria-expanded",String(ew)),Z.textContent=Q.current()?.name??a.pages;let B=ex&&ey.loading&&!ew,_=e.prompting,H=e.prompting?ef?a.creating:q?j.adding:a.working:B?"":ev?.text??(q?j.hint:!s||ef||ew||e.selectedUid?"":a.selectHint);u.textContent=H,u.hidden=!H||em,u.className=`status${_?" working":""}${!o&&!B&&ev?.error?" error":""}`},eE=()=>ek(t.getState()),eC=()=>{g.style.height="auto",g.style.height=`${g.scrollHeight}px`},eN=e=>{ex!==e&&(ex=e,ev=null,eE(),ex||g.focus())},eA=async()=>{if(ex)return;let e=g.value.trim();if(e&&!t.getState().prompting){ev=null;try{if(ef){let r=z.value.trim();if(!r)return z.focus();await t.createPage(r,e),Q.forget(),ev={text:a.created,error:!1}}else{let{summary:r}=await t.prompt(e);ev={text:r,error:!1}}g.value="",eC()}catch(e){ev={text:R(e),error:!0}}eE(),g.focus()}},eL=e=>{ev=null,(ew=e)&&Q.reset(),eE(),(ew?Q.search:G).focus()},eP=e=>{(eb=e)||(ew=!1,em=!1),eE(),s&&t.setSelecting(eb&&!ef),eb&&s&&Q.fetch()},eS=e=>{ef=e,ev=null,t.setSelecting(eb&&!ef),ef&&t.select(null),eE(),(ef?z:g).focus()},e$=async e=>{ev=null;let r=await F(t,e);ev=r?{text:r,error:!0}:{text:"save"===e?a.saved:a.published,error:!1},eE()};d.addEventListener("click",()=>{eP(!0),ex||(ef?z:g).focus()}),H.addEventListener("click",()=>eP(!1)),Y.addEventListener("click",()=>{em=!em,eE(),em||(ex?Y:g).focus()}),el.addEventListener("click",e=>{if(!em)return;let t=e.target.closest("button");t&&t!==Y&&t!==H&&(em=!1,eE())},!0),ei.addEventListener("click",()=>void e$("save")),eo.addEventListener("click",()=>void e$("publish")),ea.addEventListener("click",()=>t.signOut()),c.addEventListener("click",()=>t.signOut()),x.addEventListener("click",()=>t.select(null)),L.addEventListener("click",()=>eS(!0)),P.addEventListener("click",async()=>{ev=null,ev=await q(t,a),eE()}),S.addEventListener("click",()=>eS(!1)),E.addEventListener("click",()=>eN(!1)),C.addEventListener("click",()=>eN(!0)),G.addEventListener("click",()=>eL(!ew)),z.addEventListener("input",eE),z.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing?"Escape"===e.key&&eP(!1):(e.preventDefault(),g.focus())}),w.addEventListener("click",()=>{ev=null,t.undo()}),el.addEventListener("submit",e=>{e.preventDefault(),eA()}),g.addEventListener("input",()=>{eC(),eE()}),g.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing?"Escape"===e.key&&eP(!1):(e.preventDefault(),eA())});let eM=t.on("change",ek);return eE(),e.body.appendChild(i),()=>{eM(),ey.unmount(),i.remove()}},V="https://content.obelism.studio",W=/^(?:\/[\w.~-]+)+$/,Y=e=>{let{protocol:t}=new URL(e,"https://site.invalid");if("https:"!==t&&"http:"!==t)throw Error(`Not a page address: ${e}`);return e},X=(e,t)=>JSON.stringify(e)===JSON.stringify(t),K="obelism-content-editor",J=`
257
257
  :host { all: initial; }
258
258
  * { box-sizing: border-box; font: inherit; color: inherit; margin: 0; }
259
259
  .root {
@@ -400,17 +400,15 @@ button:disabled { cursor: not-allowed; }
400
400
  .empty.error { color: rgb(var(--negative)); }
401
401
  .new-page { justify-content: flex-start; }
402
402
 
403
- .tabs {
404
- display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2px; flex: none;
405
- margin: 12px 14px 0; padding: 3px; border-radius: 999px; background: rgb(var(--actions));
406
- }
407
- .tab {
408
- display: flex; align-items: center; justify-content: center; gap: 6px; height: 38px;
409
- border-radius: 999px; font-size: 13px; font-weight: 500; color: rgb(var(--soft));
410
- }
411
- .tab:hover { color: rgb(var(--fg)); }
412
- .tab[aria-selected='true'] { background: rgb(var(--bg)); color: rgb(var(--fg)); box-shadow: var(--shadow-small); }
413
- .tab .mark svg { width: 12px; height: 12px; }
403
+ .mode {
404
+ display: inline-flex; align-items: center; gap: 6px; flex: none; height: 32px;
405
+ padding: 0 12px; border-radius: 999px; background: rgb(var(--paper));
406
+ font-size: 13px; font-weight: 500; color: rgb(var(--soft));
407
+ }
408
+ .mode:hover:not(:disabled) { background: rgb(var(--actions)); color: rgb(var(--fg)); }
409
+ .mode[aria-pressed='true'] { background: rgb(var(--coral-wash)); color: rgb(var(--coral-ink)); }
410
+ .mode:disabled { opacity: .5; }
411
+ .mode .mark svg { width: 12px; height: 12px; }
414
412
  .ask, .fields { flex: 1; min-height: 0; display: flex; flex-direction: column; }
415
413
  .scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 16px 14px; display: flex; flex-direction: column; gap: 14px; }
416
414
  .note {
@@ -575,4 +573,4 @@ textarea:disabled, .path input:disabled { opacity: .6; }
575
573
  .chips .accent-chip .mark { color: rgb(23 22 20); }
576
574
  .chips .accent-chip .mark svg { width: 11px; height: 11px; }
577
575
  .chips .ink-chip { background: rgb(23 22 20); color: rgb(255 255 255); font-weight: 500; }
578
- `,Z=e=>{let t=e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").trim().toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)},G=e=>!!e&&"object"==typeof e&&!Array.isArray(e),Q=(e,t,r,n)=>{if(null!=e&&""!==e){if("object"!=typeof e)return void n.set(r,{label:t,text:String(e)});if(Array.isArray(e)){if(e.every(e=>null===e||"object"!=typeof e)){e.length&&n.set(r,{label:t,text:e.join(", ")});return}e.forEach((e,a)=>{let i=G(e)&&"string"==typeof e._uid?e._uid:a,o=G(e)&&"string"==typeof e._type?e._type:null;Q(e,o?Z(o):t,`${r}/${i}`,n)});return}for(let[a,i]of Object.entries(e))"_uid"!==a&&"_type"!==a&&Q(i,t?`${t} \xb7 ${Z(a)}`:Z(a),`${r}/${a}`,n)}},ee=(e,n,a={})=>{let i,o={...O,...a.labels},s=e.defaultView,l=e.documentElement,d=(t,...r)=>A(e,"button",{className:t,type:"button"},...r),p=A(e,"div");p.setAttribute("data-obelism-content-editor","");let c=p.attachShadow({mode:"open"}),u=A(e,"style",{textContent:(i=`[${t}]`,`html[data-obelism-editor]{transition:margin-right .3s cubic-bezier(.2,.8,.2,1)}html[data-obelism-docked]{margin-right:436px!important}html[data-obelism-docked] [data-obelism-dock]{right:436px!important;max-width:calc(100vw - 436px)!important}html[data-obelism-editor][data-cms-selecting] ${i}:hover:not([data-cms-selected]){outline:none}html[data-obelism-editor][data-cms-selecting] ${i}[data-cms-selected]{outline:2px solid rgb(212 130 30);outline-offset:2px}@media (prefers-reduced-motion:reduce){html[data-obelism-editor]{transition:none}}`)}),g=A(e,"span",{className:"tile"},P(e,"mark",N)),h=A(e,"span"),b=d("page-button hit",h,A(e,"span",{className:"visually-hidden",textContent:`, ${o.pages}`}),M(e,"chevrons"));b.setAttribute("aria-haspopup","listbox"),b.setAttribute("aria-expanded","false"),b.setAttribute("aria-controls","obelism-pages");let m=A(e,"span",{className:"page-name"}),f=A(e,"span"),v=A(e,"span",{className:"env"},A(e,"span",{className:"visually-hidden",textContent:`${o.environment}: `}),f),x=d("icon-button hit",M(e,"dash"));x.setAttribute("aria-label",o.minimize),x.title=o.minimize;let y=A(e,"div",{className:"head"},g,b,m,v,A(e,"span",{className:"spacer"}),x),w=j(e,n,o,{onLoad:()=>ti(),onClose:()=>tc(!1)}),k=d("button quiet new-page",M(e,"plus"),o.newPage),C=A(e,"div",{className:"pages"},w.searchRow,w.list,w.note,k),$=(e,t,...r)=>{let n=d("tab",...r);return n.id=e,n.setAttribute("role","tab"),n.setAttribute("aria-controls",t),n},z=$("obelism-tab-ask","obelism-ask",P(e,"mark",N),o.modePrompt),I=$("obelism-tab-fields","obelism-fields",o.form),B=A(e,"div",{className:"tabs"},z,I);B.setAttribute("role","tablist"),B.setAttribute("aria-label",o.modes);let H=d("button primary",o.keep),_=d("button quiet",o.undo),V=A(e,"div",{className:"gate"},A(e,"p",{textContent:o.keepBeforeFields}),A(e,"div",{className:"actions"},H,_));V.setAttribute("role","alert");let W=A(e,"span"),Y=d("",o.scopeEntry),X=d("",o.newPageCancel),ee=A(e,"div",{className:"note"},M(e,"scope"),W,Y,X),et=A(e,"p",{className:"intro",textContent:o.askIntro}),er=A(e,"p",{className:"summary"}),en=A(e,"span"),ea=d("button primary",M(e,"plus"),en),ei=A(e,"div",{className:"shop"},er,ea),eo=A(e,"div",{className:"log"});eo.setAttribute("role","log");let es=A(e,"div",{className:"scroll"},ee,et,ei,eo),el=A(e,"input",{type:"text",placeholder:o.pathPlaceholder,autocomplete:"off",spellcheck:!1}),ed=A(e,"label",{className:"path"},A(e,"span",{textContent:o.path}),el),ep=A(e,"textarea",{rows:1});ep.setAttribute("aria-label",o.open);let ec=M(e,"arrowUp"),eu=P(e,"working",L),eg=A(e,"button",{className:"send",type:"submit",title:o.send},A(e,"span",{className:"visually-hidden",textContent:o.send}),ec,eu),eh=A(e,"div",{className:"bar"},P(e,"mark",N),ep,eg),eb=A(e,"form",{className:"composer"},ed,eh),em=A(e,"div",{className:"ask",id:"obelism-ask"},es,eb);em.setAttribute("role","tabpanel"),em.setAttribute("aria-labelledby",z.id);let ef=A(e,"p",{className:"form-note"});ef.setAttribute("role","status");let ev=A(e,"div",{className:"form"},ef),ex=A(e,"div",{className:"fields",id:"obelism-fields"},ev);ex.setAttribute("role","tabpanel"),ex.setAttribute("aria-labelledby",I.id);let ey=A(e,"p",{className:"save-state"});ey.setAttribute("aria-live","polite");let ew=A(e,"slot");ew.name="actions-footer";let ek=d("button quiet",M(e,"undo"),o.undo),eE=d("button secondary",o.saveDraft),eC=d("button primary",o.publish),eA=A(e,"div",{className:"foot"},ey,ew,ek,eE,eC),eN=A(e,"p",{className:"visually-hidden"});eN.setAttribute("role","status");let eL=A(e,"aside",{className:"panel",id:"obelism-editor"},y,C,B,V,em,ex,eA,eN);eL.setAttribute("aria-label",o.editor);let eP=d("launch",A(e,"span",{className:"launch-tile"},P(e,"mark",N)),o.editing);eP.setAttribute("aria-controls",eL.id);let eS=A(e,"span",{className:"reading"},A(e,"span",{className:"launch-tile"},P(e,"mark",N)),o.viewingDrafts),e$=M(e,"eye"),eM=M(e,"eyeOff"),eU=d("eye",e$,eM);eU.setAttribute("aria-label",o.hideOutlines),eU.title=o.hideOutlines;let ez=A(e,"slot");ez.name="actions-bar";let eI=d("exit",o.signOut),eO=A(e,"div",{className:"launcher"},eP,eS,eU,ez,eI);a.actions&&p.appendChild(a.actions);let ej=A(e,"div",{className:"layer"});ej.setAttribute("aria-hidden","true");let eR=A(e,"div",{className:"wash"});eR.setAttribute("aria-hidden","true");let eD=A(e,"div",{className:"root"},eR,ej,eL,eO);c.append(A(e,"style",{textContent:J}),eD);let eT=(e=>{try{return e?.localStorage.getItem(K)!=="minimised"}catch{return!0}})(s),eq="ask",eF=!1,eB=!1,eH=!0,e_=!1,eV=null,eW=!1,eY=null,eX=[],eK=!0,eJ=null,eZ=new Map,eG="idle",eQ=!1,e0=U(n,ev,o.formTitle,{onReady:()=>ti(),onError:()=>ti(),onEscape:()=>tu()}),e1=()=>eX.filter(({status:e})=>"pending"===e),e2=()=>e1().slice(-1)[0]??null,e4=()=>eX.some(({status:e})=>"working"===e)?null:e2(),e6=e=>(eZ.has(e)||"loading"===eG||(eZ.set(e,null),n.view({uid:e}).then(t=>{"string"==typeof t._type&&eZ.set(e,Z(t._type)),ti()},()=>{})),eZ.get(e)??o.block),e5=e=>{Array.isArray(e)?e.forEach(e5):G(e)&&("string"==typeof e._uid&&"string"==typeof e._type&&eZ.set(e._uid,Z(e._type)),Object.values(e).forEach(e5))},e3=()=>w.current()?.name||e.title.trim(),e8=null,e7=()=>{null===e8&&s&&(e8=s.requestAnimationFrame(()=>{e8=null,(t=>{if(ej.replaceChildren(),eR.replaceChildren(),!te(t))return;let n=t=>{let r=e.querySelector(t),n=r?.getBoundingClientRect();return n&&(n.width||n.height)?n:null},a=(t,r,n=ej)=>{let a=A(e,"div",{className:`box ${r}`});Object.assign(a.style,{top:`${t.top-3}px`,left:`${t.left-3}px`,width:`${t.width+6}px`,height:`${t.height+6}px`}),n.appendChild(a)},i=(t,...r)=>{let n=A(e,"div",{className:"chips"},...r),a=t.top-34<0?t.top+6:t.top-34;Object.assign(n.style,{top:`${a}px`,left:`${t.left-3}px`}),ej.appendChild(n)},s=(t,r)=>{let n=A(e,"span",{className:"accent-chip"});return r&&n.appendChild(P(e,"mark",N)),n.appendChild(e.createTextNode(t)),n},l=e2(),d=l?l.uid?E(l.uid):`[${r}]`:null,p=d?n(d):null;if(p&&a(p,"fill",eR),eJ&&eJ!==t.selectedUid){let t=n(E(eJ));if(t){a(t,"hover");let r=t.top-23<0,n=A(e,"span",{className:`name-tab${r?" inside":""}`,textContent:e6(eJ)});Object.assign(n.style,{top:`${r?t.top-1.5:t.top-23}px`,left:`${t.left-3}px`}),ej.appendChild(n)}}let c=!!l&&l.uid===t.selectedUid;if(t.selectedUid){let r=n(E(t.selectedUid));if(r){let n=e6(t.selectedUid),a=e3();i(r,s(c?S(o.previewChip,{name:n}):n,c),...a?[A(e,"span",{className:"ink-chip",textContent:a})]:[])}}if(p&&!c){a(p,"preview");let e=l.uid?e6(l.uid):e3()||o.pages;i(p,s(S(o.previewChip,{name:e}),!0))}})(n.getState())}))},e9=e=>e.features.includes("prompt")&&eT,te=e=>e9(e)&&eH&&!eB,tt=t=>A(e,"span",{className:`value${t?"":" none"}`,textContent:t||o.emptyValue}),tr=t=>{let r=t.node.querySelector(".card");if(r.querySelector(".status-line")?.remove(),"failed"===t.status)return void r.appendChild(A(e,"p",{className:"failure"},M(e,"alert"),t.summary));for(let n of(r.appendChild(t.eyebrow),t.summary&&r.appendChild(A(e,"p",{className:"summary",textContent:t.summary})),t.diffs.slice(0,3))){let a=A(e,"div",{className:"diff-field"},A(e,"span",{className:"diff-label",textContent:n.label}),A(e,"div",{className:"diff"},A(e,"div",{className:"before"},A(e,"span",{className:"tag",textContent:o.before}),tt(n.before)),A(e,"div",{className:"after"},A(e,"span",{className:"tag",textContent:o.after}),tt(n.after))));t.details.push(a),r.appendChild(a)}if(t.diffs.length>3){let n=A(e,"p",{className:"more",textContent:S(o.moreChanges,{count:t.diffs.length-3})});t.details.push(n),r.appendChild(n)}if("pending"===t.status){let n=d("button primary",o.keep),a=d("button secondary",o.retry),i=d("button quiet",o.undo);n.addEventListener("click",()=>tg()),a.addEventListener("click",()=>void tm(t)),i.addEventListener("click",()=>th(t)),t.actions=A(e,"div",{className:"actions"},n,a,i),r.appendChild(t.actions)}},tn=(t,r)=>{let n=A(e,"div",{className:"card"},A(e,"span",{className:"visually-hidden",textContent:`${o.obelism}: `}),A(e,"p",{className:"status-line"},P(e,"working",L),eB?o.creating:o.working)),a=A(e,"div",{className:"answer"},A(e,"span",{className:"chip"},P(e,"mark",N)),n);a.dataset.status="working";let i={prompt:t,uid:r,status:"working",summary:"",diffs:[],step:null,node:a,eyebrow:A(e,"p",{className:"eyebrow"}),actions:null,details:[]};return eX.push(i),eo.appendChild(a),i},ta=t=>{if(eQ)return;let r=t.features.includes("prompt"),i=t.saving||t.publishing,s=t.prompting||i,p=r&&eT,{site:c,canCreate:u,pageless:g,shopHere:x,onlyNew:y}=D(n,t,a.promptWithoutPage);u||(eB=!1),y&&(eB=!0);let E=c&&!eB&&!g&&t.features.includes("form");E||(eq="ask");let N=e1().length>0;for(let e of(N&&"fields"!==eq||(eF=!1),eX))null!==e.step&&e.step>(t.undoSteps??0)&&(e.step=null);eD.hidden=!r&&!c,eL.toggleAttribute("data-closed",!p),eL.inert=!p,eP.hidden=!r,eP.setAttribute("aria-expanded",String(p)),eS.hidden=r,eU.hidden=!p,eU.setAttribute("aria-pressed",String(!eH)),e$.hidden=!eH,eM.hidden=eH,eI.hidden=!1===a.signOut;let S=p&&eK;l.toggleAttribute("data-obelism-docked",S),l.style.setProperty("--obelism-dock",`${436*!!S}px`);let $=p&&eH&&!eB;t.selecting!==$&&n.setSelecting($);let U=p&&"fields"===eq;U&&!e0.mounted?e0.mount():!U&&e0.mounted&&e0.unmount(),e_&&!p&&(e_=!1),h.textContent=e3()||o.pages,b.hidden=null===w.pages&&null!==w.error,m.hidden=!b.hidden,m.textContent=e3()||o.pages,b.setAttribute("aria-expanded",String(e_)),C.hidden=!e_,k.hidden=!u||eB,k.disabled=s;let O=n.environment;v.hidden=!O,v.dataset.env=O??"",f.textContent="production"===O?o.envProduction:O??"",B.hidden=!E,z.setAttribute("aria-selected",String("ask"===eq)),I.setAttribute("aria-selected",String("fields"===eq)),z.disabled=I.disabled=s,z.tabIndex="ask"===eq?0:-1,I.tabIndex="fields"===eq?0:-1,V.hidden=!eF,H.disabled=_.disabled=s,em.hidden="ask"!==eq,ex.hidden="fields"!==eq;let j=null!==x&&!eB;if(eB)W.textContent=o.newPage;else if(t.selectedUid){let[r,n=""]=o.scopeNoteBlock.split("{name}");W.replaceChildren(r??"",A(e,"strong",{textContent:e6(t.selectedUid)}),n)}else W.textContent=o.scopeNotePage;ee.hidden=j||g&&!eB&&!a.promptWithoutPage,Y.hidden=eB||!t.selectedUid,X.hidden=!eB||y,et.hidden=eX.length>0||j||eB,ei.hidden=!j;let R=T(o,x);en.textContent=t.prompting&&j?R.adding:R.add,ea.disabled=s,er.textContent=eY?.text??R.hint,er.className=eY?.error?"failure":"summary",eb.hidden=j,ed.hidden=!eB,el.disabled=s,ep.placeholder=eB?o.newPagePlaceholder:o.placeholder,ep.disabled=s,eg.disabled=s||""===ep.value.trim()||eB&&""===el.value.trim(),eg.setAttribute("aria-busy",String(t.prompting)),ec.hidden=t.prompting,eu.hidden=!t.prompting,ek.hidden=N||!t.canUndo||eB,ek.disabled=s,eE.hidden=!t.features.includes("save")||g,eE.disabled=s||N||!t.unsaved,eC.hidden=!t.features.includes("publish")||g,eC.disabled=s||N,a.actions&&(a.actions.slot=p?"actions-footer":"actions-bar"),eA.hidden=!c,t.unsaved&&!eW&&(eV=null),eW=t.unsaved;let q=i?P(e,"working",L):eV?.kind==="error"?M(e,"alert"):N||t.unsaved?A(e,"span",{className:"dot"}):M(e,"check"),F=t.saving?o.saving:t.publishing?o.publishing:eV?.kind==="error"?`${"save"===eV.action?o.saveFailed:o.publishFailed}: ${eV.text}`:N?o.keepFirst:t.unsaved?o.unsaved:eV?.kind==="saved"?o.saved:eV?.kind==="published"?o.published:o.upToDate,K=i?"saving":eV?.kind==="error"?"error":N||t.unsaved?"unsaved":"saved";if((ey.dataset.state!==K||ey.dataset.text!==F)&&(ey.dataset.state=K,ey.dataset.text=F,ey.replaceChildren(q,A(e,"span",{textContent:F})),eV?.kind==="error"&&!i)){let e=eV.action,t=d("link",o.tryAgain);t.addEventListener("click",()=>void tv(e)),ey.appendChild(t)}ev.classList.toggle("loading",e0.loading||null!==e0.error),ef.hidden=!e0.loading&&null===e0.error,ef.className=`form-note${null!==e0.error?" error":""}`,ef.textContent=e0.error??o.formLoading;let J=e4();for(let e of eX){if("working"===e.status||"failed"===e.status)continue;e.node.dataset.status=e.status;let t="pending"===e.status?o.suggested:"kept"===e.status?o.kept:o.undone;for(let r of(e.eyebrow.textContent!==t&&(e.eyebrow.textContent=t),e.actions&&(e.actions.hidden=e!==J),e.details))r.hidden="undone"===e.status}p&&((()=>{if("idle"!==eG||null===n.entryId)return;eG="loading";let e=()=>{eG="done",ti()};n.view({uid:null}).then(t=>{e5(t),e()},e)})(),null===w.pages&&null===w.error&&w.fetch()),e7()},ti=()=>ta(n.getState()),to=()=>{ep.style.height="auto",ep.style.height=`${ep.scrollHeight}px`},ts=()=>{es.scrollTop=es.scrollHeight},tl=e=>{eT=e;try{s?.localStorage.setItem(K,eT?"open":"minimised")}catch{}eT||(e_=!1),ti(),eT?("fields"===eq?I:eB?el:ep).focus():eP.focus()},td=e=>{if("fields"===e&&e1().length>0){eF=!0,ti(),H.focus();return}if(eF=!1,eq===e)return ti();eq=e,ti()},tp=e=>{e_=!1,(eB=e)&&n.select(null),ti(),(eB?el:ep).focus()},tc=e=>{(e_=e)&&w.reset(),ti(),(e_?w.search:b).focus()},tu=()=>{let e=n.getState();if(!e9(e))return!1;if(e_)tc(!1);else{if(!e.selectedUid)return!1;n.select(null)}return!0},tg=(e=!0)=>{let t=e1();t.length&&e4()&&(t.forEach(e=>{e.status="kept"}),ti(),e&&ep.focus())},th=(e,t=!0)=>{e===e4()&&(n.undo(),e.status="undone",ti(),t&&ep.focus())},tb=async(e,t)=>{let r={uid:e.uid},a=await n.view(r).catch(()=>null);try{let{summary:i}=await n.prompt(t,r);e.step=n.getState().undoSteps??null;let o=a?await n.view(r).catch(()=>null):null;e.summary=i,e.diffs=a&&o?((e,t)=>{let r=new Map,n=new Map;Q(e,"","",r),Q(t,"","",n);let a=[];for(let e of new Set([...r.keys(),...n.keys()])){let t=r.get(e),i=n.get(e);t?.text!==i?.text&&a.push({label:(i??t).label,before:t?.text??"",after:i?.text??""})}return a})(a,o):[],e.status="pending"}catch(t){e.summary=R(t),e.status="failed"}tr(e),ti(),ts()},tm=async e=>{if(e!==e4())return;n.undo(),e.status="undone";let t=tn(e.prompt,e.uid);ti(),ts(),ep.focus(),await tb(t,S(o.retryPrompt,{prompt:e.prompt}))},tf=async()=>{let t=ep.value.trim(),r=n.getState();if(!t||r.prompting)return;let a=el.value.trim();if(eB&&!a)return el.focus();let i=eB?null:r.selectedUid,s=eB?`${o.newPage} \xb7 ${a}`:i?e6(i):o.scopeEntry;eo.appendChild(A(e,"p",{className:"bubble"},A(e,"span",{className:"visually-hidden",textContent:`${o.you} (${s}): `}),t)),ep.value="",to();let l=tn(t,i);if(ti(),ts(),eB){try{await n.createPage(a,t),w.forget(),l.summary=o.created,l.status="kept"}catch(e){l.summary=R(e),l.status="failed"}tr(l),ti()}else await tb(l,t);ep.focus()},tv=async e=>{eV=null;let t=await F(n,e);eV=t?{kind:"error",action:e,text:t}:{kind:"save"===e?"saved":"published"},ti()};eP.addEventListener("click",()=>tl(!eT)),x.addEventListener("click",()=>tl(!1)),eU.addEventListener("click",()=>{eH=!eH,ti()}),eI.addEventListener("click",()=>n.signOut()),b.addEventListener("click",()=>tc(!e_)),k.addEventListener("click",()=>tp(!0)),X.addEventListener("click",()=>tp(!1)),Y.addEventListener("click",()=>{n.select(null),ep.focus()}),ea.addEventListener("click",async()=>{eY=null,eY=await q(n,o),ti()}),z.addEventListener("click",()=>td("ask")),I.addEventListener("click",()=>td("fields")),B.addEventListener("keydown",e=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(e.key))return;e.preventDefault();let t=c.activeElement===z;("Home"===e.key?z:"End"===e.key||t?I:z).focus()}),H.addEventListener("click",()=>{tg(!1),td("fields"),I.focus()}),_.addEventListener("click",()=>{for(let e=e4();e;e=e4())th(e,!1);td("fields"),I.focus()}),ek.addEventListener("click",()=>{let e=n.getState().undoSteps,t=void 0===e?void 0:eX.find(t=>"kept"===t.status&&t.step===e);if(n.undo(),t){var r;t.status="undone",ti(),r=`${o.undone}: ${t.summary}`,eN.textContent="",eN.textContent=r}ek.hidden&&ep.focus()}),eE.addEventListener("click",()=>void tv("save")),eC.addEventListener("click",()=>void tv("publish")),eb.addEventListener("submit",e=>{e.preventDefault(),tf()}),ep.addEventListener("input",()=>{to(),ti()}),ep.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing||(e.preventDefault(),tf())}),el.addEventListener("input",ti),el.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing||(e.preventDefault(),ep.focus())});let tx=e=>{"Escape"===e.key&&!e.defaultPrevented&&tu()&&e.preventDefault()};e.addEventListener("keydown",tx);let ty=e=>{let r=e.target,n=r?.closest?.(`[${t}]`),a=n?.getAttribute(t)??null;a!==eJ&&(eJ=a,e7())},tw=()=>{eJ=null,e7()};e.addEventListener("pointerover",ty),l.addEventListener("pointerleave",tw),s?.addEventListener("scroll",e7,{capture:!0,passive:!0}),s?.addEventListener("resize",e7);let tk=s?.MutationObserver,tE="function"==typeof tk?new tk(e7):null;tE?.observe(e.body,{childList:!0,subtree:!0});let tC=s?.ResizeObserver,tA="function"==typeof tC?new tC(e7):null;tA?.observe(l);let tN=s?.matchMedia?.("(min-width: 768px)")??null;eK=tN?.matches??!0;let tL=()=>{eK=tN?.matches??!0,ti()};tN?.addEventListener?.("change",tL);let tP=n.on("change",ta);return l.setAttribute("data-obelism-editor",""),e.head.appendChild(u),e.body.appendChild(p),ti(),()=>{eQ=!0,tP(),e0.unmount(),null!==e8&&s?.cancelAnimationFrame?.(e8),e.removeEventListener("keydown",tx),e.removeEventListener("pointerover",ty),l.removeEventListener("pointerleave",tw),s?.removeEventListener("scroll",e7,{capture:!0}),s?.removeEventListener("resize",e7),tN?.removeEventListener?.("change",tL),tE?.disconnect(),tA?.disconnect(),n.setSelecting(!1),l.removeAttribute("data-obelism-editor"),l.removeAttribute("data-obelism-docked"),l.style.removeProperty("--obelism-dock"),u.remove(),p.remove()}},et=Symbol.for("@obelism/content/bridge"),er=C({isEditing:!1,entryId:null,on:()=>{}},new URLSearchParams),en=({url:e,prompt:p=!0,pagePath:c,productPath:b,collectionPath:x}={})=>{let y;if("u"<typeof window)return er;let A=window;if(A[et])return A[et];if(A.ObelismBridge)y=C(A.ObelismBridge,new URLSearchParams(A.location.search));else{let C=(y=((e,r)=>{let n,a,p,c,b,x=new URLSearchParams(e.location.search),y=e.parent!==e&&x.has("cms_preview"),C=v(),A=[],N={...f,selecting:!0},L=e=>{N={...N,...e},C.emit("change",N)},P={isEditing:y,mode:y?"editor":null,entryId:x.get("cms_entry"),environment:x.get(i),product:null,collection:null,on:C.on,getState:()=>N,...w,destroy:()=>{A.splice(0).forEach(e=>e())}};if(!y)return P;let S=e.document,$=(t,n={})=>{e.parent.postMessage({source:h,type:t,...n},r)},M=S.createElement("style");M.textContent=m(),S.head.appendChild(M),A.push(()=>M.remove());let U=(e,t)=>{if(S.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),N.selectedUid!==(e??null)&&L({selectedUid:e??null}),!e)return;let r=S.querySelector(E(e));r&&(r.setAttribute("data-cms-selected",""),t&&r.scrollIntoView({behavior:"smooth",block:"center"}))},z=e=>{let r=e.target,n=r?.closest?.(`[${t}]`);if(!n)return;e.preventDefault(),e.stopPropagation();let a=n.getAttribute(t);U(a,!1),$("select",{uid:a})};S.addEventListener("click",z,!0),A.push(()=>S.removeEventListener("click",z,!0));let I=()=>Math.ceil(Math.max(S.documentElement.scrollHeight,S.body?.scrollHeight??0)),O=0,j=()=>{O=I(),$("ready",{url:e.location.href,height:O})},R=e.ResizeObserver;if("function"==typeof R){let e=new R(()=>{let e=I();e!==O&&(O=e,$("size",{height:e}))});e.observe(S.documentElement),S.body&&e.observe(S.body),A.push(()=>e.disconnect())}let D=new Map,T=0,q=e=>{let t=D.get(e);return t?(clearTimeout(t.timer),D.delete(e),0===D.size&&L({prompting:!1}),t):null};P.prompt=(e,t={})=>{let r=e.trim();if(!r)return Promise.reject(Error("Say what to change"));if(!N.features.includes("prompt"))return Promise.reject(Error("The editor does not offer prompts here"));let n=`prompt_${++T}`,a=void 0===t.uid?N.selectedUid:t.uid;return new Promise((e,t)=>{let i=setTimeout(()=>{q(n)?.reject(Error("The editor did not answer in time"))},12e4);D.set(n,{resolve:e,reject:t,timer:i}),L({prompting:!0}),$("prompt",{id:n,prompt:r,uid:a})})},P.undo=()=>$("undo"),P.select=e=>{U(e,!1),$("select",{uid:e})};let F=null;A.push(()=>F?.destroy()),A.push(()=>{for(let e of D.keys())q(e)?.reject(Error("The bridge was destroyed"))});let B=(n=new WeakSet,a=null,p=null,c=!1,b=()=>{if(null!==a){for(let e of Array.from(S.styleSheets)){let t;if(!n.has(e)){try{t=e.cssRules}catch{continue}n.add(e),g(t,a)}}S.querySelectorAll('[style*="vh"]').forEach(e=>{u(e.style,a)})}},{freeze(e){if(null!==a||!(e>0))return;a=e,b();let t=S.defaultView?.MutationObserver;t&&(p=new t(()=>{if(c)return;c=!0;let e=()=>{c=!1,b()};S.defaultView?.requestAnimationFrame?S.defaultView.requestAnimationFrame(e):e()})).observe(S.documentElement,{childList:!0,subtree:!0})},destroy(){p?.disconnect()}});A.push(()=>B.destroy());let H=t=>{if(t.origin!==r||t.source!==e.parent)return;let n=t.data;if(n&&"obelism-content-editor"===n.source){if("connect"===n.type)j();else if("update"===n.type&&n.entry)C.emit("update",{entry:n.entry,selectedUid:n.selectedUid??null}),e.requestAnimationFrame(()=>U(n.selectedUid,!1)),F?.refresh();else if("select"===n.type)U(n.uid,!0);else if("saved"===n.type||"published"===n.type)C.emit(n.type,{}),0===C.listeners.update.size&&e.location.reload();else if("features"===n.type&&Array.isArray(n.features))L({features:n.features.filter(e=>"string"==typeof e)});else if("stats"===n.type)L({stats:(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return{};let t={};for(let[r,n]of Object.entries(e)){let{clicks:e,clickers:a,viewers:i,rate:o}=n??{};k(e)&&k(a)&&k(i)&&k(o)&&(t[r]={clicks:e,clickers:a,viewers:i,rate:o})}return t})(n.stats),statsVisible:!1!==n.visible}),(F||Object.keys(N.stats).length)&&(F??(F=((e,{selector:t,onSelect:r,labels:n})=>{let a=e.document,i={...o,...n},p=a.createElement("div");p.setAttribute("data-obelism-stats","");let c=p.attachShadow({mode:"open"}),u=a.createElement("style");u.textContent=l;let g=a.createElement("div");g.className="layer",c.append(u,g),a.body.appendChild(p);let h={},b=!1,m=null,f=()=>{if(m=null,g.replaceChildren(),g.hidden=!b,!b)return;let n=e.innerHeight;for(let[o,l]of Object.entries(h)){let p=a.querySelector(t(o));if(!p)continue;let c=p.getBoundingClientRect();if(!c.width&&!c.height||c.bottom<0||c.top>n)continue;let u=a.createElement("button");u.type="button",u.className="badge",u.dataset.uid=o,u.textContent=s(i.clicked,{rate:Math.round(100*l.rate)}),u.title=s(i.title,{clickers:l.clickers,viewers:l.viewers,clicks:l.clicks});let{place:h,top:b,left:m}=d(c,e.innerWidth);u.dataset.place=h,u.style.top=`${b}px`,u.style.left=`${m}px`,u.addEventListener("click",()=>r(o)),g.appendChild(u)}},v=()=>{null===m&&b&&(m=e.requestAnimationFrame(f))};e.addEventListener("scroll",v,{capture:!0,passive:!0}),e.addEventListener("resize",v);let x=e.MutationObserver,y="function"==typeof x?new x(v):null;return y?.observe(a.body,{childList:!0,subtree:!0}),{update(t,r){h=t,b=r,null!==m&&(e.cancelAnimationFrame?.(m),m=null),f()},refresh:v,destroy(){null!==m&&e.cancelAnimationFrame?.(m),e.removeEventListener("scroll",v,{capture:!0}),e.removeEventListener("resize",v),y?.disconnect(),p.remove()}}})(e,{selector:E,onSelect:e=>P.select(e)})),F.update(N.stats,N.statsVisible));else if("viewport"===n.type&&"number"==typeof n.height)B.freeze(n.height);else if("promptState"===n.type)L({canUndo:!0===n.canUndo});else if("promptResult"===n.type&&"string"==typeof n.id){let e=q(n.id);if(!e)return;!0===n.ok?e.resolve({summary:"string"==typeof n.summary?n.summary:""}):e.reject(Error("string"==typeof n.error?n.error:"The prompt failed"))}}};return e.addEventListener("message",H),A.push(()=>e.removeEventListener("message",H)),"loading"===S.readyState?(S.addEventListener("DOMContentLoaded",j,{once:!0}),A.push(()=>S.removeEventListener("DOMContentLoaded",j))):j(),P})(A,new URL(e||V).origin)).isEditing||A.parent!==A?null:(e=>{for(let t of e.cookie.split(";")){let[e,...r]=t.trim().split("=");if("obelism_content_editing"===e)try{let e=decodeURIComponent(r.join("="));return W.test(e)?e:null}catch{break}}return null})(A.document);if(C&&(y=((e,i,{pagePath:o=e=>`/${e.replace(/^\/+/,"")}`,productPath:s,collectionPath:l}={})=>{let d=e.document,p=v(),c=[],u=new Map,g=[],b=new Set,x=null,y=null,w=-1/0,k=new Map,C=f,A=e=>{C={...C,...e},p.emit("change",C)},N=()=>A({unsaved:[...u.values()].some(({content:e,saved:t})=>!X(e,t)),canUndo:g.length>0,undoSteps:g.length}),L=async(t,r)=>{let n=await e.fetch(`${i}/api/${t}`,void 0===r?{credentials:"same-origin"}:{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","x-obelism-content":"1"},body:JSON.stringify(r)}),a=await n.json().catch(()=>({}));if(401===n.status)throw A({features:[]}),Error("You were signed out. Sign in again to edit.");if(!n.ok)throw Error("string"==typeof a.error?a.error:`Obelism Content answered ${n.status}`);return a},P=()=>d.querySelector(`[${r}]`)?.getAttribute(r)??null,S=()=>{let e=d.querySelector(`[${n}]`),t=e?.getAttribute(n),r=e?.getAttribute("data-cms-product-handle");return t&&r?{id:t,handle:r}:null},$=()=>{let e=d.querySelector(`[${a}]`),t=e?.getAttribute(a),r=e?.getAttribute("data-cms-collection-handle");return t&&r?{id:t,handle:r}:null},M=e=>{let t=e?d.querySelector(E(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??P()},U=()=>{if(!x)return;let e=x.space.locales.map(({code:e})=>e),t=d.documentElement.lang;if(e.includes(t))return t;let r=t.split("-")[0]??"";return e.includes(r)?r:x.space.defaultLocale},z=new Map,I=async e=>{let t=u.get(e);if(t)return t;let r=z.get(e);return r||(r=L(`entries/${encodeURIComponent(e)}`).then(t=>{let r=u.get(e)??{content:t.content,saved:t.content,revision:t.draftRevision};return u.set(e,r),r}).finally(()=>z.delete(e)),z.set(e,r)),r},O=e=>{let t=void 0===e?C.selectedUid:e,r=M(t);if(!r)throw Error("Nothing on this page is marked as an entry: add editable(entry)");return{uid:t,entryId:r}},j=e=>{d.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),C.selectedUid!==e&&A({selectedUid:e}),e&&d.querySelector(E(e))?.setAttribute("data-cms-selected","")},R=async t=>{if(0===p.listeners.update.size)return;let r=u.get(t)?.content,{entry:n}=await L(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:U()});p.emit("update",{entry:n,selectedUid:C.selectedUid}),e.requestAnimationFrame(()=>j(C.selectedUid))},D=e=>console.error("[@obelism/content bridge]",e),T=t=>{p.emit(t,{}),0===p.listeners.update.size&&e.location.reload()},q=async()=>{for(let[e,t]of u){if(X(t.content,t.saved))continue;let{draftRevision:r}=await L(`entries/${encodeURIComponent(e)}/save`,{content:t.content,baseRevision:t.revision});t.saved=t.content,t.revision=r,b.add(e)}g.length=0,w=-1/0,N()},F={isEditing:!0,mode:"site",get entryId(){return P()},get product(){return S()},get collection(){return $()},get environment(){return x?.environment??null},on:p.on,getState:()=>C,async prompt(e,t={}){let r=e.trim();if(!r)throw Error("Say what to change");if(!C.features.includes("prompt"))throw Error("You may not edit content here");let{uid:n,entryId:a}=O(t.uid);A({prompting:!0});try{let e=await I(a),t=await L(`entries/${encodeURIComponent(a)}/prompt`,{prompt:r,content:e.content,locale:U(),uid:n});return g.push({entryId:a,content:e.content}),w=-1/0,e.content=t.content,N(),await R(a),{summary:t.summary}}finally{A({prompting:!1})}},async createPage(t,r){let n=r.trim();if(!n)throw Error("Say what the page is for");if(!t.trim())throw Error("Say where the page goes, like /pricing");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");A({prompting:!0});try{let r=await L("entries",{path:t,prompt:n,locale:U(),from:P()}),a=o(r.path,U()??"");return e.location.assign(Y(a)),{summary:r.summary,entryId:r.entryId,path:r.path,url:a}}finally{A({prompting:!1})}},async createProductPage(t=S()??void 0){if(!t)throw Error("Nothing on this page is marked as a product: add editableProduct(product)");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");A({prompting:!0});try{let r=await L("product-pages",{product:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{A({prompting:!1})}},async createCollectionPage(t=$()??void 0){if(!t)throw Error("Nothing on this page is marked as a collection: add editableCollection(collection)");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");A({prompting:!0});try{let r=await L("collection-pages",{collection:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{A({prompting:!1})}},async view(e={}){let{uid:t,entryId:r}=O(e.uid),n=await I(r),{view:a}=await L(`entries/${encodeURIComponent(r)}/view`,{content:n.content,locale:U(),uid:t});return a},async applyJson(e,t={}){if(!C.features.includes("prompt"))throw Error("You may not edit content here");if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Send the fields to change as an object");let{uid:r,entryId:n}=O(t.uid);A({prompting:!0});try{let t=await I(n),a=await L(`entries/${encodeURIComponent(n)}/apply`,{changes:e,content:t.content,locale:U(),uid:r});return X(a.content,t.content)||(g.push({entryId:n,content:t.content}),w=-1/0,t.content=a.content,N(),await R(n)),{changed:a.changed??[],...a.view&&{view:a.view}}}finally{A({prompting:!1})}},openForm(t,r={}){let{title:n="Content form",onReady:a,onError:i,onEscape:o}=r;y?.();let s=!1,l=null,d=null,c=()=>{},b=e=>{s||i?.(e instanceof Error?e.message:String(e))},m=()=>{s||(s=!0,c(),l?.destroy(),y===m&&(y=null))};y=m;let f=()=>{if(s||!l)return;let e=M(C.selectedUid);if(!e)return;let t=u.get(e);if(!t)return void I(e).then(f,b);let r={entryId:e,content:t.content,locale:U(),selectedUid:C.selectedUid};d&&d.entryId===r.entryId&&d.content===r.content&&d.locale===r.locale&&d.selectedUid===r.selectedUid||(d=r,l.show(r))},v=(e,t)=>{let r=t??d?.entryId,n=void 0===r?void 0:u.get(r);if(s||void 0===r||!n||X(e,n.content))return;let a=Date.now();a-w>=1e3&&g.push({entryId:r,content:n.content}),w=a,n.content=e,d?.entryId===r&&(d={...d,content:e}),N(),clearTimeout(k.get(r)),k.set(r,setTimeout(()=>{k.delete(r),R(r).catch(D)},300))};return(async()=>{if(!C.features.includes("form"))throw Error("You may not edit content here");await I(O(void 0).entryId);let{url:r}=await L("form",{});s||(l=((e,t,r,n,a)=>{let i=null;try{i=new URL(r)}catch{}if(!i||!/^https?:$/.test(i.protocol))throw Error("Obelism Content sent no form to open");let o=i.origin,s=t.ownerDocument.createElement("iframe");s.title=n,s.src=r;let l=!1,d=!1,p=null,c=()=>{l&&p&&s.contentWindow?.postMessage({source:h,type:"content",...p},o)},u=setTimeout(()=>{d||a.onError("The form did not open")},3e4),g=()=>{d=!0,clearTimeout(u),a.onReady()},b=e=>{if(e.origin!==o||!s.contentWindow||e.source!==s.contentWindow)return;let t=e.data;if(t&&"obelism-content-form"===t.source)if("ready"===t.type)l=!0,c(),!0!==t.loading&&g();else if("loaded"===t.type)l&&g();else{let e;if("change"!==t.type||!(e=t.content)||"object"!=typeof e||Array.isArray(e))if("height"===t.type){let e=t.height;if("number"==typeof e&&Number.isFinite(e)){let t=Math.round(Math.min(Math.max(e,80),4e3));s.style.height=`min(${t}px, 60vh)`}}else"escape"===t.type?a.onEscape?.():"error"===t.type&&a.onError("string"==typeof t.message&&t.message?t.message:"The form failed");else a.onChange(t.content,"string"==typeof t.entryId?t.entryId:void 0)}};return e.addEventListener("message",b),t.appendChild(s),{show(e){p=e,c()},destroy(){clearTimeout(u),e.removeEventListener("message",b),s.remove()}}})(e,t,"string"==typeof r?r:"",n,{onReady:()=>a?.(),onChange:v,onError:e=>i?.(e),onEscape:()=>o?.()}),c=p.on("change",f),f())})().catch(b),{close:m}},async pages(){let{pages:e}=await L("pages"),t=[U(),x?.space.defaultLocale];return e.flatMap(e=>{let r,n,a=t.find(t=>void 0!==t&&void 0!==e.paths[t])??Object.keys(e.paths)[0],i=void 0===a?void 0:e.paths[a];return void 0===a||void 0===i?[]:[{entryId:e.entryId,name:e.name,contentType:e.contentType,status:e.status,path:i,url:e.product?(r=e.product.handle,s?s(r,a):(x?.productPath??"/products/{handle}").replaceAll("{handle}",encodeURIComponent(r))):e.collection?(n=e.collection.handle,l?l(n,a):(x?.collectionPath??"/collections/{handle}").replaceAll("{handle}",encodeURIComponent(n))):o(i,a),product:e.product??null,collection:e.collection??null}]})},openPage(t){(!C.unsaved||e.confirm("Leave this page and lose the changes you have not saved?"))&&(u.clear(),g.length=0,N(),e.location.assign(Y(t.url)))},undo(){let e=g.pop(),t=e&&u.get(e.entryId);e&&t&&(w=-1/0,t.content=e.content,N(),R(e.entryId).catch(D))},async save(){if(!C.features.includes("save"))throw Error("You may not edit content here");A({saving:!0});try{await q()}finally{A({saving:!1})}T("saved")},async publish(){if(!C.features.includes("publish"))throw Error("You may not publish here");A({publishing:!0});try{await q();let e=P(),t=b.size>0?[...b]:e?[e]:[];if(0===t.length)throw Error("Nothing on this page is marked as an entry: add editable(entry)");for(let e of t)await L(`entries/${encodeURIComponent(e)}/publish`,{}),b.delete(e)}finally{A({publishing:!1})}T("published")},signOut(){if(C.unsaved&&!e.confirm("Sign out and lose the changes you have not saved?"))return;u.clear(),N();let t=e.location.pathname+e.location.search;e.location.href=`${i}/logout?return_to=${encodeURIComponent(t)}`},select(e){j(e)},setSelecting(e){e?d.documentElement.setAttribute("data-cms-selecting",""):d.documentElement.removeAttribute("data-cms-selecting"),A({selecting:e})},destroy(){y?.(),k.forEach(e=>clearTimeout(e)),k.clear(),c.splice(0).forEach(e=>e())}},B=d.createElement("style");B.textContent=m("html[data-cms-selecting] "),d.head.appendChild(B),c.push(()=>B.remove()),c.push(()=>d.documentElement.removeAttribute("data-cms-selecting"));let H=e=>{if(!C.selecting)return;let r=e.target,n=r?.closest?.(`[${t}]`);n&&(e.preventDefault(),e.stopPropagation(),j(n.getAttribute(t)))};d.addEventListener("click",H,!0),c.push(()=>d.removeEventListener("click",H,!0));let _=e=>{C.unsaved&&(e.preventDefault(),e.returnValue="")};return e.addEventListener("beforeunload",_),c.push(()=>e.removeEventListener("beforeunload",_)),L("session").then(e=>{x=e,A({features:e.features})}).catch(e=>console.error("[@obelism/content bridge]",e)),F})(A,C,{pagePath:c,productPath:b,collectionPath:x})),y.isEditing&&p){let e=A.document,t=()=>{},r=!1,n=C?ee:_,a=()=>{r||(t=n(e,y,!0===p?{}:p))};e.body?a():e.addEventListener("DOMContentLoaded",a,{once:!0});let i=y.destroy;y.destroy=()=>{r=!0,e.removeEventListener("DOMContentLoaded",a),t(),i()}}}return A[et]=y,y};(e=window).ObelismBridge=en((e=>{let t=e?.dataset.url,r=t||V;if(!t&&e?.src){let t=new URL(e.src);"/bridge.js"===t.pathname&&(r=t.origin)}return{url:r,prompt:e?.dataset.prompt!=="false"}})(document.currentScript)),e.ObelismContent={getContentBridge:en,mountPromptBox:_,mountSiteEditor:ee}}();
576
+ `,Z=e=>{let t=e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").trim().toLowerCase();return t.charAt(0).toUpperCase()+t.slice(1)},G=e=>!!e&&"object"==typeof e&&!Array.isArray(e),Q=(e,t,r,n)=>{if(null!=e&&""!==e){if("object"!=typeof e)return void n.set(r,{label:t,text:String(e)});if(Array.isArray(e)){if(e.every(e=>null===e||"object"!=typeof e)){e.length&&n.set(r,{label:t,text:e.join(", ")});return}e.forEach((e,a)=>{let i=G(e)&&"string"==typeof e._uid?e._uid:a,o=G(e)&&"string"==typeof e._type?e._type:null;Q(e,o?Z(o):t,`${r}/${i}`,n)});return}for(let[a,i]of Object.entries(e))"_uid"!==a&&"_type"!==a&&Q(i,t?`${t} \xb7 ${Z(a)}`:Z(a),`${r}/${a}`,n)}},ee=(e,n,a={})=>{let i,o={...O,...a.labels},s=e.defaultView,l=e.documentElement,d=(t,...r)=>N(e,"button",{className:t,type:"button"},...r),p=N(e,"div");p.setAttribute("data-obelism-content-editor","");let c=p.attachShadow({mode:"open"}),u=N(e,"style",{textContent:(i=`[${t}]`,`html[data-obelism-editor]{transition:margin-right .3s cubic-bezier(.2,.8,.2,1)}html[data-obelism-docked]{margin-right:436px!important}html[data-obelism-docked] [data-obelism-dock]{right:436px!important;max-width:calc(100vw - 436px)!important}html[data-obelism-editor][data-cms-selecting] ${i}:hover:not([data-cms-selected]){outline:none}html[data-obelism-editor][data-cms-selecting] ${i}[data-cms-selected]{outline:2px solid rgb(212 130 30);outline-offset:2px}@media (prefers-reduced-motion:reduce){html[data-obelism-editor]{transition:none}}`)}),g=N(e,"span",{className:"tile"},P(e,"mark",A)),h=N(e,"span"),b=d("page-button hit",h,N(e,"span",{className:"visually-hidden",textContent:`, ${o.pages}`}),M(e,"chevrons"));b.setAttribute("aria-haspopup","listbox"),b.setAttribute("aria-expanded","false"),b.setAttribute("aria-controls","obelism-pages");let m=N(e,"span",{className:"page-name"}),f=N(e,"span"),v=N(e,"span",{className:"env"},N(e,"span",{className:"visually-hidden",textContent:`${o.environment}: `}),f),x=d("icon-button hit",M(e,"dash"));x.setAttribute("aria-label",o.minimize),x.title=o.minimize;let y=d("mode hit",P(e,"mark",A),o.modePrompt);y.setAttribute("aria-pressed","false");let w=N(e,"div",{className:"head"},g,b,m,v,N(e,"span",{className:"spacer"}),y,x),k=j(e,n,o,{onLoad:()=>ta(),onClose:()=>tp(!1)}),C=d("button quiet new-page",M(e,"plus"),o.newPage),$=N(e,"div",{className:"pages"},k.searchRow,k.list,k.note,C),z=d("button primary",o.keep),I=d("button quiet",o.undo),B=N(e,"div",{className:"gate"},N(e,"p",{textContent:o.keepBeforeFields}),N(e,"div",{className:"actions"},z,I));B.setAttribute("role","alert");let _=N(e,"span"),H=d("",o.scopeEntry),V=d("",o.newPageCancel),W=N(e,"div",{className:"note"},M(e,"scope"),_,H,V),Y=N(e,"p",{className:"intro",textContent:o.askIntro}),X=N(e,"p",{className:"summary"}),ee=N(e,"span"),et=d("button primary",M(e,"plus"),ee),er=N(e,"div",{className:"shop"},X,et),en=N(e,"div",{className:"log"});en.setAttribute("role","log");let ea=N(e,"div",{className:"scroll"},W,Y,er,en),ei=N(e,"input",{type:"text",placeholder:o.pathPlaceholder,autocomplete:"off",spellcheck:!1}),eo=N(e,"label",{className:"path"},N(e,"span",{textContent:o.path}),ei),es=N(e,"textarea",{rows:1});es.setAttribute("aria-label",o.open);let el=M(e,"arrowUp"),ed=P(e,"working",L),ep=N(e,"button",{className:"send",type:"submit",title:o.send},N(e,"span",{className:"visually-hidden",textContent:o.send}),el,ed),ec=N(e,"div",{className:"bar"},P(e,"mark",A),es,ep),eu=N(e,"form",{className:"composer"},eo,ec),eg=N(e,"div",{className:"ask",id:"obelism-ask"},ea,eu);eg.setAttribute("role","tabpanel"),eg.setAttribute("aria-label",o.modePrompt);let eh=N(e,"p",{className:"form-note"});eh.setAttribute("role","status");let eb=N(e,"div",{className:"form"},eh),em=N(e,"div",{className:"fields",id:"obelism-fields"},eb);em.setAttribute("role","tabpanel"),em.setAttribute("aria-label",o.form);let ef=N(e,"p",{className:"save-state"});ef.setAttribute("aria-live","polite");let ev=N(e,"slot");ev.name="actions-footer";let ex=d("button quiet",M(e,"undo"),o.undo),ey=d("button secondary",o.saveDraft),ew=d("button primary",o.publish),ek=N(e,"div",{className:"foot"},ef,ev,ex,ey,ew),eE=N(e,"p",{className:"visually-hidden"});eE.setAttribute("role","status");let eC=N(e,"aside",{className:"panel",id:"obelism-editor"},w,$,B,eg,em,ek,eE);eC.setAttribute("aria-label",o.editor);let eN=d("launch",N(e,"span",{className:"launch-tile"},P(e,"mark",A)),o.editing);eN.setAttribute("aria-controls",eC.id);let eA=N(e,"span",{className:"reading"},N(e,"span",{className:"launch-tile"},P(e,"mark",A)),o.viewingDrafts),eL=M(e,"eye"),eP=M(e,"eyeOff"),eS=d("eye",eL,eP);eS.setAttribute("aria-label",o.hideOutlines),eS.title=o.hideOutlines;let e$=N(e,"slot");e$.name="actions-bar";let eM=d("exit",o.signOut),eU=N(e,"div",{className:"launcher"},eN,eA,eS,e$,eM);a.actions&&p.appendChild(a.actions);let ez=N(e,"div",{className:"layer"});ez.setAttribute("aria-hidden","true");let eI=N(e,"div",{className:"wash"});eI.setAttribute("aria-hidden","true");let eO=N(e,"div",{className:"root"},eI,ez,eC,eU);c.append(N(e,"style",{textContent:J}),eO);let ej=(e=>{try{return e?.localStorage.getItem(K)!=="minimised"}catch{return!0}})(s),eR="fields",eT="fields",eD=!1,eq=!1,eF=!0,eB=!1,e_=null,eH=!1,eV=null,eW=[],eY=!0,eX=null,eK=new Map,eJ="idle",eZ=!1,eG=U(n,eb,o.formTitle,{onReady:()=>{ta(),ej&&"fields"===eT&&eQ()},onError:()=>ta(),onEscape:()=>tc()}),eQ=()=>eb.querySelector("iframe")?.focus(),e0=()=>eW.filter(({status:e})=>"pending"===e),e1=()=>e0().slice(-1)[0]??null,e2=()=>eW.some(({status:e})=>"working"===e)?null:e1(),e4=e=>(eK.has(e)||"loading"===eJ||(eK.set(e,null),n.view({uid:e}).then(t=>{"string"==typeof t._type&&eK.set(e,Z(t._type)),ta()},()=>{})),eK.get(e)??o.block),e5=e=>{Array.isArray(e)?e.forEach(e5):G(e)&&("string"==typeof e._uid&&"string"==typeof e._type&&eK.set(e._uid,Z(e._type)),Object.values(e).forEach(e5))},e6=()=>k.current()?.name||e.title.trim(),e3=null,e8=()=>{null===e3&&s&&(e3=s.requestAnimationFrame(()=>{e3=null,(t=>{if(ez.replaceChildren(),eI.replaceChildren(),!e9(t))return;let n=t=>{let r=e.querySelector(t),n=r?.getBoundingClientRect();return n&&(n.width||n.height)?n:null},a=(t,r,n=ez)=>{let a=N(e,"div",{className:`box ${r}`});Object.assign(a.style,{top:`${t.top-3}px`,left:`${t.left-3}px`,width:`${t.width+6}px`,height:`${t.height+6}px`}),n.appendChild(a)},i=(t,...r)=>{let n=N(e,"div",{className:"chips"},...r),a=t.top-34<0?t.top+6:t.top-34;Object.assign(n.style,{top:`${a}px`,left:`${t.left-3}px`}),ez.appendChild(n)},s=(t,r)=>{let n=N(e,"span",{className:"accent-chip"});return r&&n.appendChild(P(e,"mark",A)),n.appendChild(e.createTextNode(t)),n},l=e1(),d=l?l.uid?E(l.uid):`[${r}]`:null,p=d?n(d):null;if(p&&a(p,"fill",eI),eX&&eX!==t.selectedUid){let t=n(E(eX));if(t){a(t,"hover");let r=t.top-23<0,n=N(e,"span",{className:`name-tab${r?" inside":""}`,textContent:e4(eX)});Object.assign(n.style,{top:`${r?t.top-1.5:t.top-23}px`,left:`${t.left-3}px`}),ez.appendChild(n)}}let c=!!l&&l.uid===t.selectedUid;if(t.selectedUid){let r=n(E(t.selectedUid));if(r){let n=e4(t.selectedUid),a=e6();i(r,s(c?S(o.previewChip,{name:n}):n,c),...a?[N(e,"span",{className:"ink-chip",textContent:a})]:[])}}if(p&&!c){a(p,"preview");let e=l.uid?e4(l.uid):e6()||o.pages;i(p,s(S(o.previewChip,{name:e}),!0))}})(n.getState())}))},e7=e=>e.features.includes("prompt")&&ej,e9=e=>e7(e)&&eF&&!eq,te=t=>N(e,"span",{className:`value${t?"":" none"}`,textContent:t||o.emptyValue}),tt=t=>{let r=t.node.querySelector(".card");if(r.querySelector(".status-line")?.remove(),"failed"===t.status)return void r.appendChild(N(e,"p",{className:"failure"},M(e,"alert"),t.summary));for(let n of(r.appendChild(t.eyebrow),t.summary&&r.appendChild(N(e,"p",{className:"summary",textContent:t.summary})),t.diffs.slice(0,3))){let a=N(e,"div",{className:"diff-field"},N(e,"span",{className:"diff-label",textContent:n.label}),N(e,"div",{className:"diff"},N(e,"div",{className:"before"},N(e,"span",{className:"tag",textContent:o.before}),te(n.before)),N(e,"div",{className:"after"},N(e,"span",{className:"tag",textContent:o.after}),te(n.after))));t.details.push(a),r.appendChild(a)}if(t.diffs.length>3){let n=N(e,"p",{className:"more",textContent:S(o.moreChanges,{count:t.diffs.length-3})});t.details.push(n),r.appendChild(n)}if("pending"===t.status){let n=d("button primary",o.keep),a=d("button secondary",o.retry),i=d("button quiet",o.undo);n.addEventListener("click",()=>tu()),a.addEventListener("click",()=>void tb(t)),i.addEventListener("click",()=>tg(t)),t.actions=N(e,"div",{className:"actions"},n,a,i),r.appendChild(t.actions)}},tr=(t,r)=>{let n=N(e,"div",{className:"card"},N(e,"span",{className:"visually-hidden",textContent:`${o.obelism}: `}),N(e,"p",{className:"status-line"},P(e,"working",L),eq?o.creating:o.working)),a=N(e,"div",{className:"answer"},N(e,"span",{className:"chip"},P(e,"mark",A)),n);a.dataset.status="working";let i={prompt:t,uid:r,status:"working",summary:"",diffs:[],step:null,node:a,eyebrow:N(e,"p",{className:"eyebrow"}),actions:null,details:[]};return eW.push(i),en.appendChild(a),i},tn=t=>{if(eZ)return;let r=t.features.includes("prompt"),i=t.saving||t.publishing,s=t.prompting||i,p=r&&ej,{site:c,canCreate:u,pageless:g,shopHere:x,onlyNew:w}=T(n,t,a.promptWithoutPage);u||(eq=!1),w&&(eq=!0);let E=c&&!eq&&!g&&t.features.includes("form");eT=E?eR:"ask";let A=e0().length>0;for(let e of(A&&"fields"!==eT||(eD=!1),eW))null!==e.step&&e.step>(t.undoSteps??0)&&(e.step=null);eO.hidden=!r&&!c,eC.toggleAttribute("data-closed",!p),eC.inert=!p,eN.hidden=!r,eN.setAttribute("aria-expanded",String(p)),eA.hidden=r,eS.hidden=!p,eS.setAttribute("aria-pressed",String(!eF)),eL.hidden=!eF,eP.hidden=eF,eM.hidden=!1===a.signOut;let S=p&&eY;l.toggleAttribute("data-obelism-docked",S),l.style.setProperty("--obelism-dock",`${436*!!S}px`);let U=p&&eF&&!eq;t.selecting!==U&&n.setSelecting(U);let O=p&&"fields"===eT;O&&!eG.mounted?eG.mount():!O&&eG.mounted&&eG.unmount(),eB&&!p&&(eB=!1),h.textContent=e6()||o.pages,b.hidden=null===k.pages&&null!==k.error,m.hidden=!b.hidden,m.textContent=e6()||o.pages,b.setAttribute("aria-expanded",String(eB)),$.hidden=!eB,C.hidden=!u||eq,C.disabled=s;let j=n.environment;v.hidden=!j,v.dataset.env=j??"",f.textContent="production"===j?o.envProduction:j??"",y.hidden=!E,y.setAttribute("aria-pressed",String("ask"===eT)),y.disabled=s,B.hidden=!eD,z.disabled=I.disabled=s,eg.hidden="ask"!==eT,em.hidden="fields"!==eT;let R=null!==x&&!eq;if(eq)_.textContent=o.newPage;else if(t.selectedUid){let[r,n=""]=o.scopeNoteBlock.split("{name}");_.replaceChildren(r??"",N(e,"strong",{textContent:e4(t.selectedUid)}),n)}else _.textContent=o.scopeNotePage;W.hidden=R||g&&!eq&&!a.promptWithoutPage,H.hidden=eq||!t.selectedUid,V.hidden=!eq||w,Y.hidden=eW.length>0||R||eq,er.hidden=!R;let q=D(o,x);ee.textContent=t.prompting&&R?q.adding:q.add,et.disabled=s,X.textContent=eV?.text??q.hint,X.className=eV?.error?"failure":"summary",eu.hidden=R,eo.hidden=!eq,ei.disabled=s,es.placeholder=eq?o.newPagePlaceholder:o.placeholder,es.disabled=s,ep.disabled=s||""===es.value.trim()||eq&&""===ei.value.trim(),ep.setAttribute("aria-busy",String(t.prompting)),el.hidden=t.prompting,ed.hidden=!t.prompting,ex.hidden=A||!t.canUndo||eq,ex.disabled=s,ey.hidden=!t.features.includes("save")||g,ey.disabled=s||A||!t.unsaved,ew.hidden=!t.features.includes("publish")||g,ew.disabled=s||A,a.actions&&(a.actions.slot=p?"actions-footer":"actions-bar"),ek.hidden=!c,t.unsaved&&!eH&&(e_=null),eH=t.unsaved;let F=i?P(e,"working",L):e_?.kind==="error"?M(e,"alert"):A||t.unsaved?N(e,"span",{className:"dot"}):M(e,"check"),K=t.saving?o.saving:t.publishing?o.publishing:e_?.kind==="error"?`${"save"===e_.action?o.saveFailed:o.publishFailed}: ${e_.text}`:A?o.keepFirst:t.unsaved?o.unsaved:e_?.kind==="saved"?o.saved:e_?.kind==="published"?o.published:o.upToDate,J=i?"saving":e_?.kind==="error"?"error":A||t.unsaved?"unsaved":"saved";if((ef.dataset.state!==J||ef.dataset.text!==K)&&(ef.dataset.state=J,ef.dataset.text=K,ef.replaceChildren(F,N(e,"span",{textContent:K})),e_?.kind==="error"&&!i)){let e=e_.action,t=d("link",o.tryAgain);t.addEventListener("click",()=>void tf(e)),ef.appendChild(t)}eb.classList.toggle("loading",eG.loading||null!==eG.error),eh.hidden=!eG.loading&&null===eG.error,eh.className=`form-note${null!==eG.error?" error":""}`,eh.textContent=eG.error??o.formLoading;let Z=e2();for(let e of eW){if("working"===e.status||"failed"===e.status)continue;e.node.dataset.status=e.status;let t="pending"===e.status?o.suggested:"kept"===e.status?o.kept:o.undone;for(let r of(e.eyebrow.textContent!==t&&(e.eyebrow.textContent=t),e.actions&&(e.actions.hidden=e!==Z),e.details))r.hidden="undone"===e.status}p&&((()=>{if("idle"!==eJ||null===n.entryId)return;eJ="loading";let e=()=>{eJ="done",ta()};n.view({uid:null}).then(t=>{e5(t),e()},e)})(),null===k.pages&&null===k.error&&k.fetch()),e8()},ta=()=>tn(n.getState()),ti=()=>{es.style.height="auto",es.style.height=`${es.scrollHeight}px`},to=()=>{ea.scrollTop=ea.scrollHeight},ts=e=>{ej=e;try{s?.localStorage.setItem(K,ej?"open":"minimised")}catch{}ej||(eB=!1),ta(),ej?eq?ei.focus():"fields"===eT?eQ():es.focus():eN.focus()},tl=e=>{if("fields"===e&&e0().length>0){eD=!0,ta(),z.focus();return}if(eD=!1,eR===e)return ta();eR=e,ta()},td=e=>{eB=!1,(eq=e)&&n.select(null),ta(),(eq?ei:es).focus()},tp=e=>{(eB=e)&&k.reset(),ta(),(eB?k.search:b).focus()},tc=()=>{let e=n.getState();if(!e7(e))return!1;if(eB)tp(!1);else{if(!e.selectedUid)return!1;n.select(null)}return!0},tu=(e=!0)=>{let t=e0();t.length&&e2()&&(t.forEach(e=>{e.status="kept"}),ta(),e&&es.focus())},tg=(e,t=!0)=>{e===e2()&&(n.undo(),e.status="undone",ta(),t&&es.focus())},th=async(e,t)=>{let r={uid:e.uid},a=await n.view(r).catch(()=>null);try{let{summary:i}=await n.prompt(t,r);e.step=n.getState().undoSteps??null;let o=a?await n.view(r).catch(()=>null):null;e.summary=i,e.diffs=a&&o?((e,t)=>{let r=new Map,n=new Map;Q(e,"","",r),Q(t,"","",n);let a=[];for(let e of new Set([...r.keys(),...n.keys()])){let t=r.get(e),i=n.get(e);t?.text!==i?.text&&a.push({label:(i??t).label,before:t?.text??"",after:i?.text??""})}return a})(a,o):[],e.status="pending"}catch(t){e.summary=R(t),e.status="failed"}tt(e),ta(),to()},tb=async e=>{if(e!==e2())return;n.undo(),e.status="undone";let t=tr(e.prompt,e.uid);ta(),to(),es.focus(),await th(t,S(o.retryPrompt,{prompt:e.prompt}))},tm=async()=>{let t=es.value.trim(),r=n.getState();if(!t||r.prompting)return;let a=ei.value.trim();if(eq&&!a)return ei.focus();let i=eq?null:r.selectedUid,s=eq?`${o.newPage} \xb7 ${a}`:i?e4(i):o.scopeEntry;en.appendChild(N(e,"p",{className:"bubble"},N(e,"span",{className:"visually-hidden",textContent:`${o.you} (${s}): `}),t)),es.value="",ti();let l=tr(t,i);if(ta(),to(),eq){try{await n.createPage(a,t),k.forget(),l.summary=o.created,l.status="kept"}catch(e){l.summary=R(e),l.status="failed"}tt(l),ta()}else await th(l,t);es.focus()},tf=async e=>{e_=null;let t=await F(n,e);e_=t?{kind:"error",action:e,text:t}:{kind:"save"===e?"saved":"published"},ta()};eN.addEventListener("click",()=>ts(!ej)),x.addEventListener("click",()=>ts(!1)),eS.addEventListener("click",()=>{eF=!eF,ta()}),eM.addEventListener("click",()=>n.signOut()),b.addEventListener("click",()=>tp(!eB)),C.addEventListener("click",()=>td(!0)),V.addEventListener("click",()=>td(!1)),H.addEventListener("click",()=>{n.select(null),es.focus()}),et.addEventListener("click",async()=>{eV=null,eV=await q(n,o),ta()}),y.addEventListener("click",()=>tl("ask"===eR?"fields":"ask")),z.addEventListener("click",()=>{tu(!1),tl("fields"),eQ()}),I.addEventListener("click",()=>{for(let e=e2();e;e=e2())tg(e,!1);tl("fields"),eQ()}),ex.addEventListener("click",()=>{let e=n.getState().undoSteps,t=void 0===e?void 0:eW.find(t=>"kept"===t.status&&t.step===e);if(n.undo(),t){var r;t.status="undone",ta(),r=`${o.undone}: ${t.summary}`,eE.textContent="",eE.textContent=r}ex.hidden&&es.focus()}),ey.addEventListener("click",()=>void tf("save")),ew.addEventListener("click",()=>void tf("publish")),eu.addEventListener("submit",e=>{e.preventDefault(),tm()}),es.addEventListener("input",()=>{ti(),ta()}),es.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing||(e.preventDefault(),tm())}),ei.addEventListener("input",ta),ei.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing||(e.preventDefault(),es.focus())});let tv=e=>{"Escape"===e.key&&!e.defaultPrevented&&tc()&&e.preventDefault()};e.addEventListener("keydown",tv);let tx=e=>{let r=e.target,n=r?.closest?.(`[${t}]`),a=n?.getAttribute(t)??null;a!==eX&&(eX=a,e8())},ty=()=>{eX=null,e8()};e.addEventListener("pointerover",tx),l.addEventListener("pointerleave",ty),s?.addEventListener("scroll",e8,{capture:!0,passive:!0}),s?.addEventListener("resize",e8);let tw=s?.MutationObserver,tk="function"==typeof tw?new tw(e8):null;tk?.observe(e.body,{childList:!0,subtree:!0});let tE=s?.ResizeObserver,tC="function"==typeof tE?new tE(e8):null;tC?.observe(l);let tN=s?.matchMedia?.("(min-width: 768px)")??null;eY=tN?.matches??!0;let tA=()=>{eY=tN?.matches??!0,ta()};tN?.addEventListener?.("change",tA);let tL=n.on("change",tn);return l.setAttribute("data-obelism-editor",""),e.head.appendChild(u),e.body.appendChild(p),ta(),()=>{eZ=!0,tL(),eG.unmount(),null!==e3&&s?.cancelAnimationFrame?.(e3),e.removeEventListener("keydown",tv),e.removeEventListener("pointerover",tx),l.removeEventListener("pointerleave",ty),s?.removeEventListener("scroll",e8,{capture:!0}),s?.removeEventListener("resize",e8),tN?.removeEventListener?.("change",tA),tk?.disconnect(),tC?.disconnect(),n.setSelecting(!1),l.removeAttribute("data-obelism-editor"),l.removeAttribute("data-obelism-docked"),l.style.removeProperty("--obelism-dock"),u.remove(),p.remove()}},et=Symbol.for("@obelism/content/bridge"),er=C({isEditing:!1,entryId:null,on:()=>{}},new URLSearchParams),en=({url:e,prompt:p=!0,pagePath:c,productPath:b,collectionPath:x}={})=>{let y;if("u"<typeof window)return er;let N=window;if(N[et])return N[et];if(N.ObelismBridge)y=C(N.ObelismBridge,new URLSearchParams(N.location.search));else{let C=(y=((e,r)=>{let n,a,p,c,b,x=new URLSearchParams(e.location.search),y=e.parent!==e&&x.has("cms_preview"),C=v(),N=[],A={...f,selecting:!0},L=e=>{A={...A,...e},C.emit("change",A)},P={isEditing:y,mode:y?"editor":null,entryId:x.get("cms_entry"),environment:x.get(i),product:null,collection:null,on:C.on,getState:()=>A,...w,destroy:()=>{N.splice(0).forEach(e=>e())}};if(!y)return P;let S=e.document,$=(t,n={})=>{e.parent.postMessage({source:h,type:t,...n},r)},M=S.createElement("style");M.textContent=m(),S.head.appendChild(M),N.push(()=>M.remove());let U=(e,t)=>{if(S.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),A.selectedUid!==(e??null)&&L({selectedUid:e??null}),!e)return;let r=S.querySelector(E(e));r&&(r.setAttribute("data-cms-selected",""),t&&r.scrollIntoView({behavior:"smooth",block:"center"}))},z=e=>{let r=e.target,n=r?.closest?.(`[${t}]`);if(!n)return;e.preventDefault(),e.stopPropagation();let a=n.getAttribute(t);U(a,!1),$("select",{uid:a})};S.addEventListener("click",z,!0),N.push(()=>S.removeEventListener("click",z,!0));let I=()=>Math.ceil(Math.max(S.documentElement.scrollHeight,S.body?.scrollHeight??0)),O=0,j=()=>{O=I(),$("ready",{url:e.location.href,height:O})},R=e.ResizeObserver;if("function"==typeof R){let e=new R(()=>{let e=I();e!==O&&(O=e,$("size",{height:e}))});e.observe(S.documentElement),S.body&&e.observe(S.body),N.push(()=>e.disconnect())}let T=new Map,D=0,q=e=>{let t=T.get(e);return t?(clearTimeout(t.timer),T.delete(e),0===T.size&&L({prompting:!1}),t):null};P.prompt=(e,t={})=>{let r=e.trim();if(!r)return Promise.reject(Error("Say what to change"));if(!A.features.includes("prompt"))return Promise.reject(Error("The editor does not offer prompts here"));let n=`prompt_${++D}`,a=void 0===t.uid?A.selectedUid:t.uid;return new Promise((e,t)=>{let i=setTimeout(()=>{q(n)?.reject(Error("The editor did not answer in time"))},12e4);T.set(n,{resolve:e,reject:t,timer:i}),L({prompting:!0}),$("prompt",{id:n,prompt:r,uid:a})})},P.undo=()=>$("undo"),P.select=e=>{U(e,!1),$("select",{uid:e})};let F=null;N.push(()=>F?.destroy()),N.push(()=>{for(let e of T.keys())q(e)?.reject(Error("The bridge was destroyed"))});let B=(n=new WeakSet,a=null,p=null,c=!1,b=()=>{if(null!==a){for(let e of Array.from(S.styleSheets)){let t;if(!n.has(e)){try{t=e.cssRules}catch{continue}n.add(e),g(t,a)}}S.querySelectorAll('[style*="vh"]').forEach(e=>{u(e.style,a)})}},{freeze(e){if(null!==a||!(e>0))return;a=e,b();let t=S.defaultView?.MutationObserver;t&&(p=new t(()=>{if(c)return;c=!0;let e=()=>{c=!1,b()};S.defaultView?.requestAnimationFrame?S.defaultView.requestAnimationFrame(e):e()})).observe(S.documentElement,{childList:!0,subtree:!0})},destroy(){p?.disconnect()}});N.push(()=>B.destroy());let _=t=>{if(t.origin!==r||t.source!==e.parent)return;let n=t.data;if(n&&"obelism-content-editor"===n.source){if("connect"===n.type)j();else if("update"===n.type&&n.entry)C.emit("update",{entry:n.entry,selectedUid:n.selectedUid??null}),e.requestAnimationFrame(()=>U(n.selectedUid,!1)),F?.refresh();else if("select"===n.type)U(n.uid,!0);else if("saved"===n.type||"published"===n.type)C.emit(n.type,{}),0===C.listeners.update.size&&e.location.reload();else if("features"===n.type&&Array.isArray(n.features))L({features:n.features.filter(e=>"string"==typeof e)});else if("stats"===n.type)L({stats:(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return{};let t={};for(let[r,n]of Object.entries(e)){let{clicks:e,clickers:a,viewers:i,rate:o}=n??{};k(e)&&k(a)&&k(i)&&k(o)&&(t[r]={clicks:e,clickers:a,viewers:i,rate:o})}return t})(n.stats),statsVisible:!1!==n.visible}),(F||Object.keys(A.stats).length)&&(F??(F=((e,{selector:t,onSelect:r,labels:n})=>{let a=e.document,i={...o,...n},p=a.createElement("div");p.setAttribute("data-obelism-stats","");let c=p.attachShadow({mode:"open"}),u=a.createElement("style");u.textContent=l;let g=a.createElement("div");g.className="layer",c.append(u,g),a.body.appendChild(p);let h={},b=!1,m=null,f=()=>{if(m=null,g.replaceChildren(),g.hidden=!b,!b)return;let n=e.innerHeight;for(let[o,l]of Object.entries(h)){let p=a.querySelector(t(o));if(!p)continue;let c=p.getBoundingClientRect();if(!c.width&&!c.height||c.bottom<0||c.top>n)continue;let u=a.createElement("button");u.type="button",u.className="badge",u.dataset.uid=o,u.textContent=s(i.clicked,{rate:Math.round(100*l.rate)}),u.title=s(i.title,{clickers:l.clickers,viewers:l.viewers,clicks:l.clicks});let{place:h,top:b,left:m}=d(c,e.innerWidth);u.dataset.place=h,u.style.top=`${b}px`,u.style.left=`${m}px`,u.addEventListener("click",()=>r(o)),g.appendChild(u)}},v=()=>{null===m&&b&&(m=e.requestAnimationFrame(f))};e.addEventListener("scroll",v,{capture:!0,passive:!0}),e.addEventListener("resize",v);let x=e.MutationObserver,y="function"==typeof x?new x(v):null;return y?.observe(a.body,{childList:!0,subtree:!0}),{update(t,r){h=t,b=r,null!==m&&(e.cancelAnimationFrame?.(m),m=null),f()},refresh:v,destroy(){null!==m&&e.cancelAnimationFrame?.(m),e.removeEventListener("scroll",v,{capture:!0}),e.removeEventListener("resize",v),y?.disconnect(),p.remove()}}})(e,{selector:E,onSelect:e=>P.select(e)})),F.update(A.stats,A.statsVisible));else if("viewport"===n.type&&"number"==typeof n.height)B.freeze(n.height);else if("promptState"===n.type)L({canUndo:!0===n.canUndo});else if("promptResult"===n.type&&"string"==typeof n.id){let e=q(n.id);if(!e)return;!0===n.ok?e.resolve({summary:"string"==typeof n.summary?n.summary:""}):e.reject(Error("string"==typeof n.error?n.error:"The prompt failed"))}}};return e.addEventListener("message",_),N.push(()=>e.removeEventListener("message",_)),"loading"===S.readyState?(S.addEventListener("DOMContentLoaded",j,{once:!0}),N.push(()=>S.removeEventListener("DOMContentLoaded",j))):j(),P})(N,new URL(e||V).origin)).isEditing||N.parent!==N?null:(e=>{for(let t of e.cookie.split(";")){let[e,...r]=t.trim().split("=");if("obelism_content_editing"===e)try{let e=decodeURIComponent(r.join("="));return W.test(e)?e:null}catch{break}}return null})(N.document);if(C&&(y=((e,i,{pagePath:o=e=>`/${e.replace(/^\/+/,"")}`,productPath:s,collectionPath:l}={})=>{let d=e.document,p=v(),c=[],u=new Map,g=[],b=new Set,x=null,y=null,w=-1/0,k=new Map,C=f,N=e=>{C={...C,...e},p.emit("change",C)},A=()=>N({unsaved:[...u.values()].some(({content:e,saved:t})=>!X(e,t)),canUndo:g.length>0,undoSteps:g.length}),L=async(t,r)=>{let n=await e.fetch(`${i}/api/${t}`,void 0===r?{credentials:"same-origin"}:{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","x-obelism-content":"1"},body:JSON.stringify(r)}),a=await n.json().catch(()=>({}));if(401===n.status)throw N({features:[]}),Error("You were signed out. Sign in again to edit.");if(!n.ok)throw Error("string"==typeof a.error?a.error:`Obelism Content answered ${n.status}`);return a},P=()=>d.querySelector(`[${r}]`)?.getAttribute(r)??null,S=()=>{let e=d.querySelector(`[${n}]`),t=e?.getAttribute(n),r=e?.getAttribute("data-cms-product-handle");return t&&r?{id:t,handle:r}:null},$=()=>{let e=d.querySelector(`[${a}]`),t=e?.getAttribute(a),r=e?.getAttribute("data-cms-collection-handle");return t&&r?{id:t,handle:r}:null},M=e=>{let t=e?d.querySelector(E(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??P()},U=()=>{if(!x)return;let e=x.space.locales.map(({code:e})=>e),t=d.documentElement.lang;if(e.includes(t))return t;let r=t.split("-")[0]??"";return e.includes(r)?r:x.space.defaultLocale},z=new Map,I=async e=>{let t=u.get(e);if(t)return t;let r=z.get(e);return r||(r=L(`entries/${encodeURIComponent(e)}`).then(t=>{let r=u.get(e)??{content:t.content,saved:t.content,revision:t.draftRevision};return u.set(e,r),r}).finally(()=>z.delete(e)),z.set(e,r)),r},O=e=>{let t=void 0===e?C.selectedUid:e,r=M(t);if(!r)throw Error("Nothing on this page is marked as an entry: add editable(entry)");return{uid:t,entryId:r}},j=e=>{d.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),C.selectedUid!==e&&N({selectedUid:e}),e&&d.querySelector(E(e))?.setAttribute("data-cms-selected","")},R=async t=>{if(0===p.listeners.update.size)return;let r=u.get(t)?.content,{entry:n}=await L(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:U()});p.emit("update",{entry:n,selectedUid:C.selectedUid}),e.requestAnimationFrame(()=>j(C.selectedUid))},T=e=>console.error("[@obelism/content bridge]",e),D=t=>{p.emit(t,{}),0===p.listeners.update.size&&e.location.reload()},q=async()=>{for(let[e,t]of u){if(X(t.content,t.saved))continue;let{draftRevision:r}=await L(`entries/${encodeURIComponent(e)}/save`,{content:t.content,baseRevision:t.revision});t.saved=t.content,t.revision=r,b.add(e)}g.length=0,w=-1/0,A()},F={isEditing:!0,mode:"site",get entryId(){return P()},get product(){return S()},get collection(){return $()},get environment(){return x?.environment??null},on:p.on,getState:()=>C,async prompt(e,t={}){let r=e.trim();if(!r)throw Error("Say what to change");if(!C.features.includes("prompt"))throw Error("You may not edit content here");let{uid:n,entryId:a}=O(t.uid);N({prompting:!0});try{let e=await I(a),t=await L(`entries/${encodeURIComponent(a)}/prompt`,{prompt:r,content:e.content,locale:U(),uid:n});return g.push({entryId:a,content:e.content}),w=-1/0,e.content=t.content,A(),await R(a),{summary:t.summary}}finally{N({prompting:!1})}},async createPage(t,r){let n=r.trim();if(!n)throw Error("Say what the page is for");if(!t.trim())throw Error("Say where the page goes, like /pricing");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");N({prompting:!0});try{let r=await L("entries",{path:t,prompt:n,locale:U(),from:P()}),a=o(r.path,U()??"");return e.location.assign(Y(a)),{summary:r.summary,entryId:r.entryId,path:r.path,url:a}}finally{N({prompting:!1})}},async createProductPage(t=S()??void 0){if(!t)throw Error("Nothing on this page is marked as a product: add editableProduct(product)");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");N({prompting:!0});try{let r=await L("product-pages",{product:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{N({prompting:!1})}},async createCollectionPage(t=$()??void 0){if(!t)throw Error("Nothing on this page is marked as a collection: add editableCollection(collection)");if(!C.features.includes("create"))throw Error("You may not add pages here");if(C.unsaved)throw Error("Save or undo your changes before adding a page");N({prompting:!0});try{let r=await L("collection-pages",{collection:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{N({prompting:!1})}},async view(e={}){let{uid:t,entryId:r}=O(e.uid),n=await I(r),{view:a}=await L(`entries/${encodeURIComponent(r)}/view`,{content:n.content,locale:U(),uid:t});return a},async applyJson(e,t={}){if(!C.features.includes("prompt"))throw Error("You may not edit content here");if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Send the fields to change as an object");let{uid:r,entryId:n}=O(t.uid);N({prompting:!0});try{let t=await I(n),a=await L(`entries/${encodeURIComponent(n)}/apply`,{changes:e,content:t.content,locale:U(),uid:r});return X(a.content,t.content)||(g.push({entryId:n,content:t.content}),w=-1/0,t.content=a.content,A(),await R(n)),{changed:a.changed??[],...a.view&&{view:a.view}}}finally{N({prompting:!1})}},openForm(t,r={}){let{title:n="Content form",onReady:a,onError:i,onEscape:o}=r;y?.();let s=!1,l=null,d=null,c=()=>{},b=e=>{s||i?.(e instanceof Error?e.message:String(e))},m=()=>{s||(s=!0,c(),l?.destroy(),y===m&&(y=null))};y=m;let f=()=>{if(s||!l)return;let e=M(C.selectedUid);if(!e)return;let t=u.get(e);if(!t)return void I(e).then(f,b);let r={entryId:e,content:t.content,locale:U(),selectedUid:C.selectedUid};d&&d.entryId===r.entryId&&d.content===r.content&&d.locale===r.locale&&d.selectedUid===r.selectedUid||(d=r,l.show(r))},v=(e,t)=>{let r=t??d?.entryId,n=void 0===r?void 0:u.get(r);if(s||void 0===r||!n||X(e,n.content))return;let a=Date.now();a-w>=1e3&&g.push({entryId:r,content:n.content}),w=a,n.content=e,d?.entryId===r&&(d={...d,content:e}),A(),clearTimeout(k.get(r)),k.set(r,setTimeout(()=>{k.delete(r),R(r).catch(T)},300))};return(async()=>{if(!C.features.includes("form"))throw Error("You may not edit content here");await I(O(void 0).entryId);let{url:r}=await L("form",{});s||(l=((e,t,r,n,a)=>{let i=null;try{i=new URL(r)}catch{}if(!i||!/^https?:$/.test(i.protocol))throw Error("Obelism Content sent no form to open");let o=i.origin,s=t.ownerDocument.createElement("iframe");s.title=n,s.src=r;let l=!1,d=!1,p=null,c=()=>{l&&p&&s.contentWindow?.postMessage({source:h,type:"content",...p},o)},u=setTimeout(()=>{d||a.onError("The form did not open")},3e4),g=()=>{d=!0,clearTimeout(u),a.onReady()},b=e=>{if(e.origin!==o||!s.contentWindow||e.source!==s.contentWindow)return;let t=e.data;if(t&&"obelism-content-form"===t.source)if("ready"===t.type)l=!0,c(),!0!==t.loading&&g();else if("loaded"===t.type)l&&g();else{let e;if("change"!==t.type||!(e=t.content)||"object"!=typeof e||Array.isArray(e))if("height"===t.type){let e=t.height;if("number"==typeof e&&Number.isFinite(e)){let t=Math.round(Math.min(Math.max(e,80),4e3));s.style.height=`min(${t}px, 60vh)`}}else"escape"===t.type?a.onEscape?.():"error"===t.type&&a.onError("string"==typeof t.message&&t.message?t.message:"The form failed");else a.onChange(t.content,"string"==typeof t.entryId?t.entryId:void 0)}};return e.addEventListener("message",b),t.appendChild(s),{show(e){p=e,c()},destroy(){clearTimeout(u),e.removeEventListener("message",b),s.remove()}}})(e,t,"string"==typeof r?r:"",n,{onReady:()=>a?.(),onChange:v,onError:e=>i?.(e),onEscape:()=>o?.()}),c=p.on("change",f),f())})().catch(b),{close:m}},async pages(){let{pages:e}=await L("pages"),t=[U(),x?.space.defaultLocale];return e.flatMap(e=>{let r,n,a=t.find(t=>void 0!==t&&void 0!==e.paths[t])??Object.keys(e.paths)[0],i=void 0===a?void 0:e.paths[a];return void 0===a||void 0===i?[]:[{entryId:e.entryId,name:e.name,contentType:e.contentType,status:e.status,path:i,url:e.product?(r=e.product.handle,s?s(r,a):(x?.productPath??"/products/{handle}").replaceAll("{handle}",encodeURIComponent(r))):e.collection?(n=e.collection.handle,l?l(n,a):(x?.collectionPath??"/collections/{handle}").replaceAll("{handle}",encodeURIComponent(n))):o(i,a),product:e.product??null,collection:e.collection??null}]})},openPage(t){(!C.unsaved||e.confirm("Leave this page and lose the changes you have not saved?"))&&(u.clear(),g.length=0,A(),e.location.assign(Y(t.url)))},undo(){let e=g.pop(),t=e&&u.get(e.entryId);e&&t&&(w=-1/0,t.content=e.content,A(),R(e.entryId).catch(T))},async save(){if(!C.features.includes("save"))throw Error("You may not edit content here");N({saving:!0});try{await q()}finally{N({saving:!1})}D("saved")},async publish(){if(!C.features.includes("publish"))throw Error("You may not publish here");N({publishing:!0});try{await q();let e=P(),t=b.size>0?[...b]:e?[e]:[];if(0===t.length)throw Error("Nothing on this page is marked as an entry: add editable(entry)");for(let e of t)await L(`entries/${encodeURIComponent(e)}/publish`,{}),b.delete(e)}finally{N({publishing:!1})}D("published")},signOut(){if(C.unsaved&&!e.confirm("Sign out and lose the changes you have not saved?"))return;u.clear(),A();let t=e.location.pathname+e.location.search;e.location.href=`${i}/logout?return_to=${encodeURIComponent(t)}`},select(e){j(e)},setSelecting(e){e?d.documentElement.setAttribute("data-cms-selecting",""):d.documentElement.removeAttribute("data-cms-selecting"),N({selecting:e})},destroy(){y?.(),k.forEach(e=>clearTimeout(e)),k.clear(),c.splice(0).forEach(e=>e())}},B=d.createElement("style");B.textContent=m("html[data-cms-selecting] "),d.head.appendChild(B),c.push(()=>B.remove()),c.push(()=>d.documentElement.removeAttribute("data-cms-selecting"));let _=e=>{if(!C.selecting)return;let r=e.target,n=r?.closest?.(`[${t}]`);n&&(e.preventDefault(),e.stopPropagation(),j(n.getAttribute(t)))};d.addEventListener("click",_,!0),c.push(()=>d.removeEventListener("click",_,!0));let H=e=>{C.unsaved&&(e.preventDefault(),e.returnValue="")};return e.addEventListener("beforeunload",H),c.push(()=>e.removeEventListener("beforeunload",H)),L("session").then(e=>{x=e,N({features:e.features})}).catch(e=>console.error("[@obelism/content bridge]",e)),F})(N,C,{pagePath:c,productPath:b,collectionPath:x})),y.isEditing&&p){let e=N.document,t=()=>{},r=!1,n=C?ee:H,a=()=>{r||(t=n(e,y,!0===p?{}:p))};e.body?a():e.addEventListener("DOMContentLoaded",a,{once:!0});let i=y.destroy;y.destroy=()=>{r=!0,e.removeEventListener("DOMContentLoaded",a),t(),i()}}}return N[et]=y,y};(e=window).ObelismBridge=en((e=>{let t=e?.dataset.url,r=t||V;if(!t&&e?.src){let t=new URL(e.src);"/bridge.js"===t.pathname&&(r=t.origin)}return{url:r,prompt:e?.dataset.prompt!=="false"}})(document.currentScript)),e.ObelismContent={getContentBridge:en,mountPromptBox:H,mountSiteEditor:ee}}();
package/dist/bridge.js CHANGED
@@ -2738,17 +2738,15 @@ button:disabled { cursor: not-allowed; }
2738
2738
  .empty.error { color: rgb(var(--negative)); }
2739
2739
  .new-page { justify-content: flex-start; }
2740
2740
 
2741
- .tabs {
2742
- display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2px; flex: none;
2743
- margin: 12px 14px 0; padding: 3px; border-radius: 999px; background: rgb(var(--actions));
2744
- }
2745
- .tab {
2746
- display: flex; align-items: center; justify-content: center; gap: 6px; height: 38px;
2747
- border-radius: 999px; font-size: 13px; font-weight: 500; color: rgb(var(--soft));
2748
- }
2749
- .tab:hover { color: rgb(var(--fg)); }
2750
- .tab[aria-selected='true'] { background: rgb(var(--bg)); color: rgb(var(--fg)); box-shadow: var(--shadow-small); }
2751
- .tab .mark svg { width: 12px; height: 12px; }
2741
+ .mode {
2742
+ display: inline-flex; align-items: center; gap: 6px; flex: none; height: 32px;
2743
+ padding: 0 12px; border-radius: 999px; background: rgb(var(--paper));
2744
+ font-size: 13px; font-weight: 500; color: rgb(var(--soft));
2745
+ }
2746
+ .mode:hover:not(:disabled) { background: rgb(var(--actions)); color: rgb(var(--fg)); }
2747
+ .mode[aria-pressed='true'] { background: rgb(var(--coral-wash)); color: rgb(var(--coral-ink)); }
2748
+ .mode:disabled { opacity: .5; }
2749
+ .mode .mark svg { width: 12px; height: 12px; }
2752
2750
  .ask, .fields { flex: 1; min-height: 0; display: flex; flex-direction: column; }
2753
2751
  .scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 16px 14px; display: flex; flex-direction: column; gap: 14px; }
2754
2752
  .note {
@@ -3037,11 +3035,15 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3037
3035
  const minimise = button('icon-button hit', icon('dash'));
3038
3036
  minimise.setAttribute('aria-label', labels.minimize);
3039
3037
  minimise.title = labels.minimize;
3038
+ // The fields are the editor's first view; Ask is this small button beside
3039
+ // the minimise one, pressed while the ask view shows.
3040
+ const askMode = button('mode hit', mark(), labels.modePrompt);
3041
+ askMode.setAttribute('aria-pressed', 'false');
3040
3042
  const head = element(doc, 'div', {
3041
3043
  className: 'head'
3042
3044
  }, tile, pageButton, pageName, env, element(doc, 'span', {
3043
3045
  className: 'spacer'
3044
- }), minimise);
3046
+ }), askMode, minimise);
3045
3047
  const picker = createPagesPicker(doc, bridge, labels, {
3046
3048
  onLoad: ()=>refresh(),
3047
3049
  onClose: ()=>setPicking(false)
@@ -3050,20 +3052,6 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3050
3052
  const pagesBox = element(doc, 'div', {
3051
3053
  className: 'pages'
3052
3054
  }, picker.searchRow, picker.list, picker.note, newPage);
3053
- const tab = (id, controls, ...children)=>{
3054
- const node = button('tab', ...children);
3055
- node.id = id;
3056
- node.setAttribute('role', 'tab');
3057
- node.setAttribute('aria-controls', controls);
3058
- return node;
3059
- };
3060
- const askTab = tab('obelism-tab-ask', 'obelism-ask', mark(), labels.modePrompt);
3061
- const fieldsTab = tab('obelism-tab-fields', 'obelism-fields', labels.form);
3062
- const tabs = element(doc, 'div', {
3063
- className: 'tabs'
3064
- }, askTab, fieldsTab);
3065
- tabs.setAttribute('role', 'tablist');
3066
- tabs.setAttribute('aria-label', labels.modes);
3067
3055
  // Edit fields asked for while a suggestion waits: it's kept or undone
3068
3056
  // first, never by the switch itself.
3069
3057
  const gateKeep = button('button primary', labels.keep);
@@ -3137,7 +3125,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3137
3125
  id: 'obelism-ask'
3138
3126
  }, scroll, composer);
3139
3127
  ask.setAttribute('role', 'tabpanel');
3140
- ask.setAttribute('aria-labelledby', askTab.id);
3128
+ ask.setAttribute('aria-label', labels.modePrompt);
3141
3129
  const formNote = element(doc, 'p', {
3142
3130
  className: 'form-note'
3143
3131
  });
@@ -3150,7 +3138,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3150
3138
  id: 'obelism-fields'
3151
3139
  }, formBox);
3152
3140
  fields.setAttribute('role', 'tabpanel');
3153
- fields.setAttribute('aria-labelledby', fieldsTab.id);
3141
+ fields.setAttribute('aria-label', labels.form);
3154
3142
  const saveState = element(doc, 'p', {
3155
3143
  className: 'save-state'
3156
3144
  });
@@ -3170,7 +3158,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3170
3158
  const panel = element(doc, 'aside', {
3171
3159
  className: 'panel',
3172
3160
  id: 'obelism-editor'
3173
- }, head, pagesBox, tabs, gate, ask, fields, foot, announcer);
3161
+ }, head, pagesBox, gate, ask, fields, foot, announcer);
3174
3162
  panel.setAttribute('aria-label', labels.editor);
3175
3163
  const launch = button('launch', element(doc, 'span', {
3176
3164
  className: 'launch-tile'
@@ -3208,7 +3196,10 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3208
3196
  textContent: CSS
3209
3197
  }), root);
3210
3198
  let open = readOpen(win);
3211
- let mode = 'ask';
3199
+ // The fields are the first view (mode); without the form the ask view
3200
+ // shows instead (view), and back once the form is there.
3201
+ let mode = 'fields';
3202
+ let view = 'fields';
3212
3203
  let gated = false;
3213
3204
  let creating = false;
3214
3205
  let outlines = true;
@@ -3224,10 +3215,17 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3224
3215
  let pageNames = 'idle';
3225
3216
  let destroyed = false;
3226
3217
  const formSlot = createFormSlot(bridge, formBox, labels.formTitle, {
3227
- onReady: ()=>refresh(),
3218
+ onReady: ()=>{
3219
+ refresh();
3220
+ // The form came while the fields show: straight into it.
3221
+ if (open && view === 'fields') focusForm();
3222
+ },
3228
3223
  onError: ()=>refresh(),
3229
3224
  onEscape: ()=>stepBack()
3230
3225
  });
3226
+ // The form's iframe, once the slot has one; the fields view's focus
3227
+ // target (the slot mounts it only while shown, so it may not be there).
3228
+ const focusForm = ()=>formBox.querySelector('iframe')?.focus();
3231
3229
  const pending = ()=>answers.filter(({ status })=>status === 'pending');
3232
3230
  const latestPending = ()=>pending().slice(-1)[0] ?? null;
3233
3231
  // Decided on while nothing else runs: undo would take the running one's
@@ -3490,9 +3488,9 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3490
3488
  if (!canCreate) creating = false;
3491
3489
  if (onlyNew) creating = true;
3492
3490
  const hasForm = site && !creating && !pageless && state.features.includes('form');
3493
- if (!hasForm) mode = 'ask';
3491
+ view = hasForm ? mode : 'ask';
3494
3492
  const waiting = pending().length > 0;
3495
- if (!waiting || mode === 'fields') gated = false;
3493
+ if (!waiting || view === 'fields') gated = false;
3496
3494
  // Steps undone elsewhere (or saved away) aren't any answer's any more.
3497
3495
  for (const answer of answers)if (answer.step !== null && answer.step > (state.undoSteps ?? 0)) answer.step = null;
3498
3496
  root.hidden = !available && !site;
@@ -3512,7 +3510,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3512
3510
  html.style.setProperty('--obelism-dock', `${docked ? DOCK_WIDTH_PX : 0}px`);
3513
3511
  const selecting = shown && outlines && !creating;
3514
3512
  if (state.selecting !== selecting) bridge.setSelecting(selecting);
3515
- const showForm = shown && mode === 'fields';
3513
+ const showForm = shown && view === 'fields';
3516
3514
  if (showForm && !formSlot.mounted) formSlot.mount();
3517
3515
  else if (!showForm && formSlot.mounted) formSlot.unmount();
3518
3516
  if (picking && !shown) picking = false;
@@ -3528,16 +3526,13 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3528
3526
  env.hidden = !environment;
3529
3527
  env.dataset.env = environment ?? '';
3530
3528
  envText.textContent = environment === 'production' ? labels.envProduction : environment ?? '';
3531
- tabs.hidden = !hasForm;
3532
- askTab.setAttribute('aria-selected', String(mode === 'ask'));
3533
- fieldsTab.setAttribute('aria-selected', String(mode === 'fields'));
3534
- askTab.disabled = fieldsTab.disabled = busy;
3535
- askTab.tabIndex = mode === 'ask' ? 0 : -1;
3536
- fieldsTab.tabIndex = mode === 'fields' ? 0 : -1;
3529
+ askMode.hidden = !hasForm;
3530
+ askMode.setAttribute('aria-pressed', String(view === 'ask'));
3531
+ askMode.disabled = busy;
3537
3532
  gate.hidden = !gated;
3538
3533
  gateKeep.disabled = gateUndo.disabled = busy;
3539
- ask.hidden = mode !== 'ask';
3540
- fields.hidden = mode !== 'fields';
3534
+ ask.hidden = view !== 'ask';
3535
+ fields.hidden = view !== 'fields';
3541
3536
  const offerShop = shopHere !== null && !creating;
3542
3537
  if (creating) {
3543
3538
  noteText.textContent = labels.newPage;
@@ -3628,7 +3623,9 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3628
3623
  if (!open) picking = false;
3629
3624
  refresh();
3630
3625
  if (open) {
3631
- (mode === 'fields' ? fieldsTab : creating ? pathInput : input).focus();
3626
+ if (creating) pathInput.focus();
3627
+ else if (view === 'fields') focusForm();
3628
+ else input.focus();
3632
3629
  } else {
3633
3630
  launch.focus();
3634
3631
  }
@@ -3787,30 +3784,16 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3787
3784
  shopMessage = await addShopPage(bridge, labels);
3788
3785
  refresh();
3789
3786
  });
3790
- askTab.addEventListener('click', ()=>setMode('ask'));
3791
- fieldsTab.addEventListener('click', ()=>setMode('fields'));
3792
- // Arrows move focus between the tabs; Enter or Space (a click) opens one.
3793
- tabs.addEventListener('keydown', (event)=>{
3794
- if (![
3795
- 'ArrowLeft',
3796
- 'ArrowRight',
3797
- 'Home',
3798
- 'End'
3799
- ].includes(event.key)) return;
3800
- event.preventDefault();
3801
- const onAsk = shadow.activeElement === askTab;
3802
- const target = event.key === 'Home' ? askTab : event.key === 'End' ? fieldsTab : onAsk ? fieldsTab : askTab;
3803
- target.focus();
3804
- });
3787
+ askMode.addEventListener('click', ()=>setMode(mode === 'ask' ? 'fields' : 'ask'));
3805
3788
  gateKeep.addEventListener('click', ()=>{
3806
3789
  keepAll(false);
3807
3790
  setMode('fields');
3808
- fieldsTab.focus();
3791
+ focusForm();
3809
3792
  });
3810
3793
  gateUndo.addEventListener('click', ()=>{
3811
3794
  for(let answer = decidable(); answer; answer = decidable())undoAnswer(answer, false);
3812
3795
  setMode('fields');
3813
- fieldsTab.focus();
3796
+ focusForm();
3814
3797
  });
3815
3798
  undo.addEventListener('click', ()=>{
3816
3799
  const step = bridge.getState().undoSteps;
package/dist/bridge.mjs CHANGED
@@ -2736,17 +2736,15 @@ button:disabled { cursor: not-allowed; }
2736
2736
  .empty.error { color: rgb(var(--negative)); }
2737
2737
  .new-page { justify-content: flex-start; }
2738
2738
 
2739
- .tabs {
2740
- display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2px; flex: none;
2741
- margin: 12px 14px 0; padding: 3px; border-radius: 999px; background: rgb(var(--actions));
2742
- }
2743
- .tab {
2744
- display: flex; align-items: center; justify-content: center; gap: 6px; height: 38px;
2745
- border-radius: 999px; font-size: 13px; font-weight: 500; color: rgb(var(--soft));
2746
- }
2747
- .tab:hover { color: rgb(var(--fg)); }
2748
- .tab[aria-selected='true'] { background: rgb(var(--bg)); color: rgb(var(--fg)); box-shadow: var(--shadow-small); }
2749
- .tab .mark svg { width: 12px; height: 12px; }
2739
+ .mode {
2740
+ display: inline-flex; align-items: center; gap: 6px; flex: none; height: 32px;
2741
+ padding: 0 12px; border-radius: 999px; background: rgb(var(--paper));
2742
+ font-size: 13px; font-weight: 500; color: rgb(var(--soft));
2743
+ }
2744
+ .mode:hover:not(:disabled) { background: rgb(var(--actions)); color: rgb(var(--fg)); }
2745
+ .mode[aria-pressed='true'] { background: rgb(var(--coral-wash)); color: rgb(var(--coral-ink)); }
2746
+ .mode:disabled { opacity: .5; }
2747
+ .mode .mark svg { width: 12px; height: 12px; }
2750
2748
  .ask, .fields { flex: 1; min-height: 0; display: flex; flex-direction: column; }
2751
2749
  .scroll { flex: 1; min-height: 0; overflow-y: auto; padding: 16px 14px; display: flex; flex-direction: column; gap: 14px; }
2752
2750
  .note {
@@ -3035,11 +3033,15 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3035
3033
  const minimise = button('icon-button hit', icon('dash'));
3036
3034
  minimise.setAttribute('aria-label', labels.minimize);
3037
3035
  minimise.title = labels.minimize;
3036
+ // The fields are the editor's first view; Ask is this small button beside
3037
+ // the minimise one, pressed while the ask view shows.
3038
+ const askMode = button('mode hit', mark(), labels.modePrompt);
3039
+ askMode.setAttribute('aria-pressed', 'false');
3038
3040
  const head = element(doc, 'div', {
3039
3041
  className: 'head'
3040
3042
  }, tile, pageButton, pageName, env, element(doc, 'span', {
3041
3043
  className: 'spacer'
3042
- }), minimise);
3044
+ }), askMode, minimise);
3043
3045
  const picker = createPagesPicker(doc, bridge, labels, {
3044
3046
  onLoad: ()=>refresh(),
3045
3047
  onClose: ()=>setPicking(false)
@@ -3048,20 +3050,6 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3048
3050
  const pagesBox = element(doc, 'div', {
3049
3051
  className: 'pages'
3050
3052
  }, picker.searchRow, picker.list, picker.note, newPage);
3051
- const tab = (id, controls, ...children)=>{
3052
- const node = button('tab', ...children);
3053
- node.id = id;
3054
- node.setAttribute('role', 'tab');
3055
- node.setAttribute('aria-controls', controls);
3056
- return node;
3057
- };
3058
- const askTab = tab('obelism-tab-ask', 'obelism-ask', mark(), labels.modePrompt);
3059
- const fieldsTab = tab('obelism-tab-fields', 'obelism-fields', labels.form);
3060
- const tabs = element(doc, 'div', {
3061
- className: 'tabs'
3062
- }, askTab, fieldsTab);
3063
- tabs.setAttribute('role', 'tablist');
3064
- tabs.setAttribute('aria-label', labels.modes);
3065
3053
  // Edit fields asked for while a suggestion waits: it's kept or undone
3066
3054
  // first, never by the switch itself.
3067
3055
  const gateKeep = button('button primary', labels.keep);
@@ -3135,7 +3123,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3135
3123
  id: 'obelism-ask'
3136
3124
  }, scroll, composer);
3137
3125
  ask.setAttribute('role', 'tabpanel');
3138
- ask.setAttribute('aria-labelledby', askTab.id);
3126
+ ask.setAttribute('aria-label', labels.modePrompt);
3139
3127
  const formNote = element(doc, 'p', {
3140
3128
  className: 'form-note'
3141
3129
  });
@@ -3148,7 +3136,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3148
3136
  id: 'obelism-fields'
3149
3137
  }, formBox);
3150
3138
  fields.setAttribute('role', 'tabpanel');
3151
- fields.setAttribute('aria-labelledby', fieldsTab.id);
3139
+ fields.setAttribute('aria-label', labels.form);
3152
3140
  const saveState = element(doc, 'p', {
3153
3141
  className: 'save-state'
3154
3142
  });
@@ -3168,7 +3156,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3168
3156
  const panel = element(doc, 'aside', {
3169
3157
  className: 'panel',
3170
3158
  id: 'obelism-editor'
3171
- }, head, pagesBox, tabs, gate, ask, fields, foot, announcer);
3159
+ }, head, pagesBox, gate, ask, fields, foot, announcer);
3172
3160
  panel.setAttribute('aria-label', labels.editor);
3173
3161
  const launch = button('launch', element(doc, 'span', {
3174
3162
  className: 'launch-tile'
@@ -3206,7 +3194,10 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3206
3194
  textContent: CSS
3207
3195
  }), root);
3208
3196
  let open = readOpen(win);
3209
- let mode = 'ask';
3197
+ // The fields are the first view (mode); without the form the ask view
3198
+ // shows instead (view), and back once the form is there.
3199
+ let mode = 'fields';
3200
+ let view = 'fields';
3210
3201
  let gated = false;
3211
3202
  let creating = false;
3212
3203
  let outlines = true;
@@ -3222,10 +3213,17 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3222
3213
  let pageNames = 'idle';
3223
3214
  let destroyed = false;
3224
3215
  const formSlot = createFormSlot(bridge, formBox, labels.formTitle, {
3225
- onReady: ()=>refresh(),
3216
+ onReady: ()=>{
3217
+ refresh();
3218
+ // The form came while the fields show: straight into it.
3219
+ if (open && view === 'fields') focusForm();
3220
+ },
3226
3221
  onError: ()=>refresh(),
3227
3222
  onEscape: ()=>stepBack()
3228
3223
  });
3224
+ // The form's iframe, once the slot has one; the fields view's focus
3225
+ // target (the slot mounts it only while shown, so it may not be there).
3226
+ const focusForm = ()=>formBox.querySelector('iframe')?.focus();
3229
3227
  const pending = ()=>answers.filter(({ status })=>status === 'pending');
3230
3228
  const latestPending = ()=>pending().slice(-1)[0] ?? null;
3231
3229
  // Decided on while nothing else runs: undo would take the running one's
@@ -3488,9 +3486,9 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3488
3486
  if (!canCreate) creating = false;
3489
3487
  if (onlyNew) creating = true;
3490
3488
  const hasForm = site && !creating && !pageless && state.features.includes('form');
3491
- if (!hasForm) mode = 'ask';
3489
+ view = hasForm ? mode : 'ask';
3492
3490
  const waiting = pending().length > 0;
3493
- if (!waiting || mode === 'fields') gated = false;
3491
+ if (!waiting || view === 'fields') gated = false;
3494
3492
  // Steps undone elsewhere (or saved away) aren't any answer's any more.
3495
3493
  for (const answer of answers)if (answer.step !== null && answer.step > (state.undoSteps ?? 0)) answer.step = null;
3496
3494
  root.hidden = !available && !site;
@@ -3510,7 +3508,7 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3510
3508
  html.style.setProperty('--obelism-dock', `${docked ? DOCK_WIDTH_PX : 0}px`);
3511
3509
  const selecting = shown && outlines && !creating;
3512
3510
  if (state.selecting !== selecting) bridge.setSelecting(selecting);
3513
- const showForm = shown && mode === 'fields';
3511
+ const showForm = shown && view === 'fields';
3514
3512
  if (showForm && !formSlot.mounted) formSlot.mount();
3515
3513
  else if (!showForm && formSlot.mounted) formSlot.unmount();
3516
3514
  if (picking && !shown) picking = false;
@@ -3526,16 +3524,13 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3526
3524
  env.hidden = !environment;
3527
3525
  env.dataset.env = environment ?? '';
3528
3526
  envText.textContent = environment === 'production' ? labels.envProduction : environment ?? '';
3529
- tabs.hidden = !hasForm;
3530
- askTab.setAttribute('aria-selected', String(mode === 'ask'));
3531
- fieldsTab.setAttribute('aria-selected', String(mode === 'fields'));
3532
- askTab.disabled = fieldsTab.disabled = busy;
3533
- askTab.tabIndex = mode === 'ask' ? 0 : -1;
3534
- fieldsTab.tabIndex = mode === 'fields' ? 0 : -1;
3527
+ askMode.hidden = !hasForm;
3528
+ askMode.setAttribute('aria-pressed', String(view === 'ask'));
3529
+ askMode.disabled = busy;
3535
3530
  gate.hidden = !gated;
3536
3531
  gateKeep.disabled = gateUndo.disabled = busy;
3537
- ask.hidden = mode !== 'ask';
3538
- fields.hidden = mode !== 'fields';
3532
+ ask.hidden = view !== 'ask';
3533
+ fields.hidden = view !== 'fields';
3539
3534
  const offerShop = shopHere !== null && !creating;
3540
3535
  if (creating) {
3541
3536
  noteText.textContent = labels.newPage;
@@ -3626,7 +3621,9 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3626
3621
  if (!open) picking = false;
3627
3622
  refresh();
3628
3623
  if (open) {
3629
- (mode === 'fields' ? fieldsTab : creating ? pathInput : input).focus();
3624
+ if (creating) pathInput.focus();
3625
+ else if (view === 'fields') focusForm();
3626
+ else input.focus();
3630
3627
  } else {
3631
3628
  launch.focus();
3632
3629
  }
@@ -3785,30 +3782,16 @@ const mountSiteEditor = (doc, bridge, options = {})=>{
3785
3782
  shopMessage = await addShopPage(bridge, labels);
3786
3783
  refresh();
3787
3784
  });
3788
- askTab.addEventListener('click', ()=>setMode('ask'));
3789
- fieldsTab.addEventListener('click', ()=>setMode('fields'));
3790
- // Arrows move focus between the tabs; Enter or Space (a click) opens one.
3791
- tabs.addEventListener('keydown', (event)=>{
3792
- if (![
3793
- 'ArrowLeft',
3794
- 'ArrowRight',
3795
- 'Home',
3796
- 'End'
3797
- ].includes(event.key)) return;
3798
- event.preventDefault();
3799
- const onAsk = shadow.activeElement === askTab;
3800
- const target = event.key === 'Home' ? askTab : event.key === 'End' ? fieldsTab : onAsk ? fieldsTab : askTab;
3801
- target.focus();
3802
- });
3785
+ askMode.addEventListener('click', ()=>setMode(mode === 'ask' ? 'fields' : 'ask'));
3803
3786
  gateKeep.addEventListener('click', ()=>{
3804
3787
  keepAll(false);
3805
3788
  setMode('fields');
3806
- fieldsTab.focus();
3789
+ focusForm();
3807
3790
  });
3808
3791
  gateUndo.addEventListener('click', ()=>{
3809
3792
  for(let answer = decidable(); answer; answer = decidable())undoAnswer(answer, false);
3810
3793
  setMode('fields');
3811
- fieldsTab.focus();
3794
+ focusForm();
3812
3795
  });
3813
3796
  undo.addEventListener('click', ()=>{
3814
3797
  const step = bridge.getState().undoSteps;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@obelism/content",
3
3
  "description": "Obelism Content SDK: the delivery API client, the visual editor bridge with prompt editing, editing on your own site, webhook verification, and the content model CLI",
4
- "version": "0.27.0",
4
+ "version": "0.27.1",
5
5
  "keywords": [
6
6
  "cms",
7
7
  "headless-cms",