@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 +15 -14
- package/dist/bridge.global.js +12 -14
- package/dist/bridge.js +43 -60
- package/dist/bridge.mjs +43 -60
- package/package.json +1 -1
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).
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
back to the whole page. The header
|
|
265
|
-
the space, drafts included, to go to
|
|
266
|
-
language when it has a path there), and
|
|
267
|
-
at the bottom left minimizes the panel,
|
|
268
|
-
words are `labels`
|
|
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
|
package/dist/bridge.global.js
CHANGED
|
@@ -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
|
-
`,
|
|
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
|
-
.
|
|
404
|
-
display:
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
.
|
|
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
|
-
.
|
|
2742
|
-
display:
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
}
|
|
2749
|
-
.
|
|
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-
|
|
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-
|
|
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,
|
|
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
|
-
|
|
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: ()=>
|
|
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
|
-
|
|
3491
|
+
view = hasForm ? mode : 'ask';
|
|
3494
3492
|
const waiting = pending().length > 0;
|
|
3495
|
-
if (!waiting ||
|
|
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 &&
|
|
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
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
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 =
|
|
3540
|
-
fields.hidden =
|
|
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
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
.
|
|
2740
|
-
display:
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
2746
|
-
}
|
|
2747
|
-
.
|
|
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-
|
|
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-
|
|
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,
|
|
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
|
-
|
|
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: ()=>
|
|
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
|
-
|
|
3489
|
+
view = hasForm ? mode : 'ask';
|
|
3492
3490
|
const waiting = pending().length > 0;
|
|
3493
|
-
if (!waiting ||
|
|
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 &&
|
|
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
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
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 =
|
|
3538
|
-
fields.hidden =
|
|
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
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
4
|
+
"version": "0.27.1",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cms",
|
|
7
7
|
"headless-cms",
|