@obelism/content 0.28.2 → 0.28.3
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 +7 -4
- package/dist/bridge.d.mts +2 -1
- package/dist/bridge.d.mts.map +1 -1
- package/dist/bridge.d.ts +2 -1
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.global.js +2 -2
- package/dist/bridge.js +35 -9
- package/dist/bridge.mjs +35 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -381,10 +381,13 @@ how often each block is clicked on the page itself: a label on a block
|
|
|
381
381
|
("24% clicked"), and a little tag on the corner of each tagged link or
|
|
382
382
|
button — a cross before its first click, an hourglass while fewer than 20
|
|
383
383
|
visitors saw its page, then its rate ("24%"). In the visual editor the
|
|
384
|
-
**Show click rates on the page** switch turns them on and off.
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
384
|
+
**Show click rates on the page** switch turns them on and off. The on-site
|
|
385
|
+
editor shows a rate once its block is selected (or, outside the blocks, its
|
|
386
|
+
element clicked) and keeps it while the page is open, so a few can be
|
|
387
|
+
compared. Clicking one selects its block. The rates come from Obelism
|
|
388
|
+
Numbers over the last 30 days, so tag a block's clickable element with its
|
|
389
|
+
uid and load Numbers' script on the site (see the CMS's visual editor
|
|
390
|
+
guide, "Click rates"):
|
|
388
391
|
|
|
389
392
|
```tsx
|
|
390
393
|
<a href={block.link} data-numbers-id={block._uid}>
|
package/dist/bridge.d.mts
CHANGED
|
@@ -19,10 +19,11 @@ type StatsOverlay = {
|
|
|
19
19
|
refresh(): void;
|
|
20
20
|
destroy(): void;
|
|
21
21
|
};
|
|
22
|
-
declare const mountStatsOverlay: (win: Window, { selector, onSelect, checked, labels: labelOverrides, }: {
|
|
22
|
+
declare const mountStatsOverlay: (win: Window, { selector, onSelect, checked, shows, labels: labelOverrides, }: {
|
|
23
23
|
selector: (uid: string) => string;
|
|
24
24
|
onSelect: (uid: string) => void;
|
|
25
25
|
checked?: ((id: string) => boolean) | undefined;
|
|
26
|
+
shows?: ((id: string, element: Element) => boolean) | undefined;
|
|
26
27
|
labels?: Partial<StatsLabels> | undefined;
|
|
27
28
|
}) => StatsOverlay;
|
|
28
29
|
|
package/dist/bridge.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.mts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/labels.ts","../src/bridge/promptBox.ts","../src/bridge/siteEditor.ts","../src/bridge.ts"],"mappings":";;AAAA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,oBAAoB,EAAE,WAAW;AAgB/C,KAAK,YAAY;AACjB,kBAAkB,QAAQ,CAAC,MAAM,SAAS,UAAU;AACpD;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,MAAM;AAC7C;AACA;AACA;AACA,aAAa,OAAO,CAAC,WAAW;AAChC,MAAM,YAAY;;
|
|
1
|
+
{"version":3,"file":"bridge.d.mts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/labels.ts","../src/bridge/promptBox.ts","../src/bridge/siteEditor.ts","../src/bridge.ts"],"mappings":"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","names":[]}
|
package/dist/bridge.d.ts
CHANGED
|
@@ -19,10 +19,11 @@ type StatsOverlay = {
|
|
|
19
19
|
refresh(): void;
|
|
20
20
|
destroy(): void;
|
|
21
21
|
};
|
|
22
|
-
declare const mountStatsOverlay: (win: Window, { selector, onSelect, checked, labels: labelOverrides, }: {
|
|
22
|
+
declare const mountStatsOverlay: (win: Window, { selector, onSelect, checked, shows, labels: labelOverrides, }: {
|
|
23
23
|
selector: (uid: string) => string;
|
|
24
24
|
onSelect: (uid: string) => void;
|
|
25
25
|
checked?: ((id: string) => boolean) | undefined;
|
|
26
|
+
shows?: ((id: string, element: Element) => boolean) | undefined;
|
|
26
27
|
labels?: Partial<StatsLabels> | undefined;
|
|
27
28
|
}) => StatsOverlay;
|
|
28
29
|
|
package/dist/bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/labels.ts","../src/bridge/promptBox.ts","../src/bridge/siteEditor.ts","../src/bridge.ts"],"mappings":";;AAAA,KAAK,UAAU;AACf;AACA;AACA;AACA;AACA;AACA,KAAK,WAAW;AAChB;AACA;AACA;AACA;AACA;AACA;AACA,cAAc,oBAAoB,EAAE,WAAW;AAgB/C,KAAK,YAAY;AACjB,kBAAkB,QAAQ,CAAC,MAAM,SAAS,UAAU;AACpD;AACA;AACA;AACA,cAAc,iBAAiB,QAAQ,MAAM;AAC7C;AACA;AACA;AACA,aAAa,OAAO,CAAC,WAAW;AAChC,MAAM,YAAY;;
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sources":["../src/bridge/statsOverlay.ts","../src/bridge/createBridge.ts","../src/bridge/labels.ts","../src/bridge/promptBox.ts","../src/bridge/siteEditor.ts","../src/bridge.ts"],"mappings":"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","names":[]}
|
package/dist/bridge.global.js
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
width: 12px; height: 12px; fill: none; stroke: currentColor;
|
|
38
38
|
stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round;
|
|
39
39
|
}
|
|
40
|
-
`,c=(e,{selector:r,onSelect:n,checked:a,labels:i})=>{let c=e.document,u={...o,...i},g=c.createElement("div");g.setAttribute("data-obelism-stats","");let h=g.attachShadow({mode:"open"}),b=c.createElement("style");b.textContent=p;let m=c.createElement("div");m.className="layer",h.append(b,m),c.body.appendChild(g);let f={},v=!1,x=null,y=(r,a,i)=>{let o,s=a.getBoundingClientRect();if(!s.width&&!s.height||s.bottom<0||s.top>e.innerHeight)return;let p=f[r],g=p&&0!==p.clicks?p.viewers<20?"counting":"rate":"none",h=c.createElement("button");h.type="button",h.dataset.uid=r,h.dataset.status=g;let b=p?Math.round(100*p.rate):0;h.title="rate"===g?d(u.title,{clickers:p.clickers,viewers:p.viewers,clicks:p.clicks}):"none"===g?u.noClicks:d(u.counting,{clicks:p.clicks,viewers:p.viewers,needed:20});let{top:v,left:x}="rate"===g&&s.height>=64?{top:Math.max(s.top,0)+8,left:s.right-8}:(o={width:e.innerWidth,height:e.innerHeight},{top:Math.min(Math.max(s.top,10),o.height-10),left:Math.min(s.right,o.width-10)});"rate"===g&&s.height>=64?(h.className="badge",h.textContent=d(u.clicked,{rate:b})):(h.className="tag","rate"===g?h.textContent=d(u.clickedShort,{rate:b}):h.innerHTML=`<svg viewBox="0 0 24 24" aria-hidden="true">${l[g]}</svg>`,h.setAttribute("aria-label",h.title)),h.style.top=`${v}px`,h.style.left=`${x}px`;let y=i.has(r)?r:a.closest(`[${t}]`)?.getAttribute(t);y&&h.addEventListener("click",()=>n(y)),m.appendChild(h)},w=()=>{if(x=null,m.replaceChildren(),m.hidden=!v,!v)return;let e=new Set;for(let r of c.querySelectorAll(`[${t}]`))e.add(r.getAttribute(t)??"");let n=a??(t=>e.has(t)),i=new Set;for(let t of c.querySelectorAll(`[${s}]`)){let r=t.getAttribute(s);r&&(f[r]||n(r))&&(i.add(r),y(r,t,e))}for(let t of Object.keys(f)){if(i.has(t)||!e.has(t))continue;let n=c.querySelector(r(t));n&&y(t,n,e)}},k=()=>{null===x&&v&&(x=e.requestAnimationFrame(w))};e.addEventListener("scroll",k,{capture:!0,passive:!0}),e.addEventListener("resize",k);let E=e.MutationObserver,C="function"==typeof E?new E(k):null;return C?.observe(c.body,{childList:!0,subtree:!0}),{update(t,r){f=t,v=r,null!==x&&(e.cancelAnimationFrame?.(x),x=null),w()},refresh:k,destroy(){null!==x&&e.cancelAnimationFrame?.(x),e.removeEventListener("scroll",k,{capture:!0}),e.removeEventListener("resize",k),C?.disconnect(),g.remove()}}},u=/(-?\d*\.?\d+)(?:s|l|d)?vh\b/g,g=(e,t)=>(u.lastIndex=0,u.test(e))?e.replace(u,(e,r)=>`${Math.round(Number(r)*t/100*100)/100}px`):null,h=(e,t)=>{for(let r=0;r<e.length;r++){let n=e.item(r),a=g(e.getPropertyValue(n),t);null!==a&&e.setProperty(n,a,e.getPropertyPriority(n))}},b=(e,t)=>{for(let r of Array.from(e)){let{style:e,cssRules:n}=r;e&&h(e,t),n&&b(n,t)}},m="obelism-content-bridge",f="#d58a1f",v=(e="")=>`${e}[${t}]{cursor:pointer;transition:outline-color .15s}${e}[${t}]:hover{outline:2px dashed ${f};outline-offset:2px}${e}[${t}][data-cms-selected]{outline:2px solid ${f};outline-offset:2px}`,x={features:[],selectedUid:null,prompting:!1,canUndo:!1,unsaved:!1,saving:!1,publishing:!1,selecting:!1,stats:{},statsVisible:!1},y=()=>{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)}}}},w=()=>Promise.reject(Error("Save and publish in the visual editor itself")),k=()=>Promise.reject(Error("Only while signed in to edit on the site")),E={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:k,applyJson:k,openForm:(e,t={})=>(queueMicrotask(()=>t.onError?.("Only while signed in to edit on the site")),{close:()=>{}}),pages:k,openPage:()=>{},undo:()=>{},save:w,publish:w,signOut:()=>{},select:()=>{},setSelecting:()=>{}},C=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0,A=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??{};C(e)&&C(a)&&C(i)&&C(o)&&(t[r]={clicks:e,clickers:a,viewers:i,rate:o})}return t},N=e=>`[${t}="${e.replace(/["\\]/g,"\\$&")}"]`,S=(e,t)=>{let r=y();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:()=>x,...E,destroy:()=>{}}},L=(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},P='<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"/>',$='<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"/>',M=(e,t,r)=>{let n=L(e,"span",{className:t});return n.setAttribute("aria-hidden","true"),n.innerHTML=`<svg viewBox="0 0 24 24">${r}</svg>`,n},U=(e,t)=>e.replace(/\{(\w+)\}/g,(e,r)=>r in t?String(t[r]):e),z={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">${P}</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"/>'},O=(e,t)=>M(e,"icon",z[t]),I=(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}}},j={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."},T={...j,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"},R={...j,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.",scopeUp:"Up to {name}",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"},D=(e,t,r,{onLoad:n,onClose:a})=>{let i=L(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=L(e,"label",{className:"search"},O(e,"search"),i),s=L(e,"ul",{className:"options",id:"obelism-pages"});s.setAttribute("role","listbox"),s.setAttribute("aria-label",r.pages);let l=L(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=L(e,"li",{className:`option${a===u?" active":""}`,id:`obelism-page-${a}`},L(e,"span",{className:"option-text"},L(e,"span",{textContent:n.name}),L(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(L(e,"span",{className:"badge",textContent:"draft"===n.status?r.pageDraft:r.pageChanged})),n.entryId===t.entryId){i.setAttribute("aria-current","page");let t=O(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}},q=e=>e instanceof Error?e.message:String(e),F=(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}},B=(e,t)=>"collection"===t?{add:e.addCollectionPage,adding:e.addingCollectionPage,hint:e.collectionPageHint}:{add:e.addProductPage,adding:e.addingProductPage,hint:e.productPageHint},V=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:q(e),error:!0}}},H=async(e,t)=>{try{return await e[t](),null}catch(e){return q(e)}},_="obelism-content-prompt-side",W=`
|
|
40
|
+
`,c=(e,{selector:r,onSelect:n,checked:a,shows:i,labels:c})=>{let u=e.document,g={...o,...c},h=u.createElement("div");h.setAttribute("data-obelism-stats","");let b=h.attachShadow({mode:"open"}),m=u.createElement("style");m.textContent=p;let f=u.createElement("div");f.className="layer",b.append(m,f),u.body.appendChild(h);let v={},x=!1,y=null,w=(r,a,i)=>{let o,s=a.getBoundingClientRect();if(!s.width&&!s.height||s.bottom<0||s.top>e.innerHeight)return;let p=v[r],c=p&&0!==p.clicks?p.viewers<20?"counting":"rate":"none",h=u.createElement("button");h.type="button",h.dataset.uid=r,h.dataset.status=c;let b=p?Math.round(100*p.rate):0;h.title="rate"===c?d(g.title,{clickers:p.clickers,viewers:p.viewers,clicks:p.clicks}):"none"===c?g.noClicks:d(g.counting,{clicks:p.clicks,viewers:p.viewers,needed:20});let{top:m,left:x}="rate"===c&&s.height>=64?{top:Math.max(s.top,0)+8,left:s.right-8}:(o={width:e.innerWidth,height:e.innerHeight},{top:Math.min(Math.max(s.top,10),o.height-10),left:Math.min(s.right,o.width-10)});"rate"===c&&s.height>=64?(h.className="badge",h.textContent=d(g.clicked,{rate:b})):(h.className="tag","rate"===c?h.textContent=d(g.clickedShort,{rate:b}):h.innerHTML=`<svg viewBox="0 0 24 24" aria-hidden="true">${l[c]}</svg>`,h.setAttribute("aria-label",h.title)),h.style.top=`${m}px`,h.style.left=`${x}px`;let y=i.has(r)?r:a.closest(`[${t}]`)?.getAttribute(t);y&&h.addEventListener("click",()=>n(y)),f.appendChild(h)},k=()=>{if(y=null,f.replaceChildren(),f.hidden=!x,!x)return;let e=new Set;for(let r of u.querySelectorAll(`[${t}]`))e.add(r.getAttribute(t)??"");let n=a??(t=>e.has(t)),o=new Set;for(let t of u.querySelectorAll(`[${s}]`)){let r=t.getAttribute(s);r&&(v[r]||n(r))&&(o.add(r),(!i||i(r,t))&&w(r,t,e))}for(let t of Object.keys(v)){if(o.has(t)||!e.has(t))continue;let n=u.querySelector(r(t));n&&(!i||i(t,n))&&w(t,n,e)}},E=()=>{null===y&&x&&(y=e.requestAnimationFrame(k))};e.addEventListener("scroll",E,{capture:!0,passive:!0}),e.addEventListener("resize",E);let C=e.MutationObserver,A="function"==typeof C?new C(E):null;return A?.observe(u.body,{childList:!0,subtree:!0}),{update(t,r){v=t,x=r,null!==y&&(e.cancelAnimationFrame?.(y),y=null),k()},refresh:E,destroy(){null!==y&&e.cancelAnimationFrame?.(y),e.removeEventListener("scroll",E,{capture:!0}),e.removeEventListener("resize",E),A?.disconnect(),h.remove()}}},u=/(-?\d*\.?\d+)(?:s|l|d)?vh\b/g,g=(e,t)=>(u.lastIndex=0,u.test(e))?e.replace(u,(e,r)=>`${Math.round(Number(r)*t/100*100)/100}px`):null,h=(e,t)=>{for(let r=0;r<e.length;r++){let n=e.item(r),a=g(e.getPropertyValue(n),t);null!==a&&e.setProperty(n,a,e.getPropertyPriority(n))}},b=(e,t)=>{for(let r of Array.from(e)){let{style:e,cssRules:n}=r;e&&h(e,t),n&&b(n,t)}},m="obelism-content-bridge",f="#d58a1f",v=(e="")=>`${e}[${t}]{cursor:pointer;transition:outline-color .15s}${e}[${t}]:hover{outline:2px dashed ${f};outline-offset:2px}${e}[${t}][data-cms-selected]{outline:2px solid ${f};outline-offset:2px}`,x={features:[],selectedUid:null,prompting:!1,canUndo:!1,unsaved:!1,saving:!1,publishing:!1,selecting:!1,stats:{},statsVisible:!1},y=()=>{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)}}}},w=()=>Promise.reject(Error("Save and publish in the visual editor itself")),k=()=>Promise.reject(Error("Only while signed in to edit on the site")),E={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:k,applyJson:k,openForm:(e,t={})=>(queueMicrotask(()=>t.onError?.("Only while signed in to edit on the site")),{close:()=>{}}),pages:k,openPage:()=>{},undo:()=>{},save:w,publish:w,signOut:()=>{},select:()=>{},setSelecting:()=>{}},C=e=>"number"==typeof e&&Number.isFinite(e)&&e>=0,A=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??{};C(e)&&C(a)&&C(i)&&C(o)&&(t[r]={clicks:e,clickers:a,viewers:i,rate:o})}return t},N=e=>`[${t}="${e.replace(/["\\]/g,"\\$&")}"]`,S=(e,t)=>{let r=y();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:()=>x,...E,destroy:()=>{}}},L=(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},P='<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"/>',$='<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"/>',M=(e,t,r)=>{let n=L(e,"span",{className:t});return n.setAttribute("aria-hidden","true"),n.innerHTML=`<svg viewBox="0 0 24 24">${r}</svg>`,n},U=(e,t)=>e.replace(/\{(\w+)\}/g,(e,r)=>r in t?String(t[r]):e),z={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">${P}</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"/>'},O=(e,t)=>M(e,"icon",z[t]),I=(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}}},j={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."},T={...j,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"},R={...j,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.",scopeUp:"Up to {name}",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"},D=(e,t,r,{onLoad:n,onClose:a})=>{let i=L(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=L(e,"label",{className:"search"},O(e,"search"),i),s=L(e,"ul",{className:"options",id:"obelism-pages"});s.setAttribute("role","listbox"),s.setAttribute("aria-label",r.pages);let l=L(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=L(e,"li",{className:`option${a===u?" active":""}`,id:`obelism-page-${a}`},L(e,"span",{className:"option-text"},L(e,"span",{textContent:n.name}),L(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(L(e,"span",{className:"badge",textContent:"draft"===n.status?r.pageDraft:r.pageChanged})),n.entryId===t.entryId){i.setAttribute("aria-current","page");let t=O(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}},q=e=>e instanceof Error?e.message:String(e),F=(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}},B=(e,t)=>"collection"===t?{add:e.addCollectionPage,adding:e.addingCollectionPage,hint:e.collectionPageHint}:{add:e.addProductPage,adding:e.addingProductPage,hint:e.productPageHint},V=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:q(e),error:!0}}},H=async(e,t)=>{try{return await e[t](),null}catch(e){return q(e)}},_="obelism-content-prompt-side",W=`
|
|
41
41
|
:host { all: initial; }
|
|
42
42
|
* { box-sizing: border-box; font: inherit; color: inherit; margin: 0; }
|
|
43
43
|
.root {
|
|
@@ -591,4 +591,4 @@ textarea:disabled, .path input:disabled { opacity: .6; }
|
|
|
591
591
|
.chips .accent-chip .mark { color: rgb(23 22 20); }
|
|
592
592
|
.chips .accent-chip .mark svg { width: 11px; height: 11px; }
|
|
593
593
|
.chips .ink-chip { background: rgb(23 22 20); color: rgb(255 255 255); font-weight: 500; }
|
|
594
|
-
`,ee=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)},et=e=>!!e&&"object"==typeof e&&!Array.isArray(e),er=(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=et(e)&&"string"==typeof e._uid?e._uid:a,o=et(e)&&"string"==typeof e._type?e._type:null;er(e,o?ee(o):t,`${r}/${i}`,n)});return}for(let[a,i]of Object.entries(e))"_uid"!==a&&"_type"!==a&&er(i,t?`${t} \xb7 ${ee(a)}`:ee(a),`${r}/${a}`,n)}},en=(e,n,a={})=>{let i,o={...R,...a.labels},s=e.defaultView,l=e.documentElement,d=(t,...r)=>L(e,"button",{className:t,type:"button"},...r),p=L(e,"div");p.setAttribute("data-obelism-content-editor","");let c=p.attachShadow({mode:"open"}),u=L(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=L(e,"span",{className:"tile"},M(e,"mark",P)),h=L(e,"span"),b=d("page-button hit",h,L(e,"span",{className:"visually-hidden",textContent:`, ${o.pages}`}),O(e,"chevrons"));b.setAttribute("aria-haspopup","listbox"),b.setAttribute("aria-expanded","false"),b.setAttribute("aria-controls","obelism-pages");let m=L(e,"span",{className:"page-name"}),f=L(e,"span"),v=L(e,"span",{className:"env"},L(e,"span",{className:"visually-hidden",textContent:`${o.environment}: `}),f),x=d("icon-button hit",O(e,"dash"));x.setAttribute("aria-label",o.minimize),x.title=o.minimize;let y=d("mode hit",M(e,"mark",P),o.modePrompt);y.setAttribute("aria-pressed","false");let w=L(e,"div",{className:"head"},g,b,m,v,L(e,"span",{className:"spacer"}),y,x),k=D(e,n,o,{onLoad:()=>td(),onClose:()=>tb(!1)}),E=d("button quiet new-page",O(e,"plus"),o.newPage),C=L(e,"div",{className:"pages"},k.searchRow,k.list,k.note,E),A=d("button primary",o.keep),S=d("button quiet",o.undo),z=L(e,"div",{className:"gate"},L(e,"p",{textContent:o.keepBeforeFields}),L(e,"div",{className:"actions"},A,S));z.setAttribute("role","alert");let j=L(e,"span"),T=d("",o.scopeEntry),_=d("",o.newPageCancel),W=L(e,"div",{className:"note"},O(e,"scope"),j,T,_),Y=L(e,"p",{className:"intro",textContent:o.askIntro}),X=L(e,"p",{className:"summary"}),K=L(e,"span"),J=d("button primary",O(e,"plus"),K),Z=L(e,"div",{className:"shop"},X,J),en=L(e,"div",{className:"log"});en.setAttribute("role","log");let ea=L(e,"div",{className:"scroll"},W,Y,Z,en),ei=L(e,"input",{type:"text",placeholder:o.pathPlaceholder,autocomplete:"off",spellcheck:!1}),eo=L(e,"label",{className:"path"},L(e,"span",{textContent:o.path}),ei),es=L(e,"textarea",{rows:1});es.setAttribute("aria-label",o.open);let el=O(e,"arrowUp"),ed=M(e,"working",$),ep=L(e,"button",{className:"send",type:"submit",title:o.send},L(e,"span",{className:"visually-hidden",textContent:o.send}),el,ed),ec=L(e,"div",{className:"bar"},M(e,"mark",P),es,ep),eu=L(e,"form",{className:"composer"},eo,ec),eg=L(e,"div",{className:"ask",id:"obelism-ask"},ea,eu);eg.setAttribute("role","tabpanel"),eg.setAttribute("aria-label",o.modePrompt);let eh=L(e,"p",{className:"form-note"});eh.setAttribute("role","status");let eb=L(e,"div",{className:"form"},eh),em=L(e,"span"),ef=d("",o.scopeEntry),ev=L(e,"div",{className:"note"},O(e,"scope"),em,ef),ex=L(e,"div",{className:"fields",id:"obelism-fields"},ev,eb);ex.setAttribute("role","tabpanel"),ex.setAttribute("aria-label",o.form);let ey=L(e,"p",{className:"save-state"});ey.setAttribute("aria-live","polite");let ew=L(e,"slot");ew.name="actions-footer";let ek=d("button quiet",O(e,"undo"),o.undo),eE=d("button secondary",o.saveDraft),eC=d("button primary",o.publish),eA=L(e,"div",{className:"foot"},ey,ew,ek,eE,eC),eN=L(e,"p",{className:"visually-hidden"});eN.setAttribute("role","status");let eS=L(e,"aside",{className:"panel",id:"obelism-editor"},w,C,z,eg,ex,eA,eN);eS.setAttribute("aria-label",o.editor);let eL=d("launch",L(e,"span",{className:"launch-tile"},M(e,"mark",P)),o.editing);eL.setAttribute("aria-controls",eS.id);let eP=L(e,"span",{className:"reading"},L(e,"span",{className:"launch-tile"},M(e,"mark",P)),o.viewingDrafts),e$=O(e,"eye"),eM=O(e,"eyeOff"),eU=d("eye",e$,eM);eU.setAttribute("aria-label",o.hideOutlines),eU.title=o.hideOutlines;let ez=L(e,"slot");ez.name="actions-bar";let eO=d("exit",o.signOut),eI=L(e,"div",{className:"launcher"},eL,eP,eU,ez,eO);a.actions&&p.appendChild(a.actions);let ej=L(e,"div",{className:"layer"});ej.setAttribute("aria-hidden","true");let eT=L(e,"div",{className:"wash"});eT.setAttribute("aria-hidden","true");let eR=L(e,"div",{className:"root"},eT,ej,eS,eI);c.append(L(e,"style",{textContent:Q}),eR);let eD=(e=>{try{return e?.localStorage.getItem(G)!=="minimised"}catch{return!0}})(s),eq="fields",eF="fields",eB=!1,eV=!1,eH=!0,e_=!1,eW=null,eY=!1,eX=null,eK=[],eJ=!0,eZ=null,eG=new Map,eQ=new Map,e0="idle",e1=!1,e2=I(n,eb,o.formTitle,{onReady:()=>{td(),eD&&"fields"===eF&&e4()},onError:()=>td(),onEscape:()=>tf()}),e4=()=>eb.querySelector("iframe")?.focus(),e5=()=>eK.filter(({status:e})=>"pending"===e),e6=()=>e5().slice(-1)[0]??null,e3=()=>eK.some(({status:e})=>"working"===e)?null:e6(),e8=e=>(eG.has(e)||"loading"===e0||(eG.set(e,null),n.view({uid:e}).then(t=>{"string"==typeof t._type&&eG.set(e,ee(t._type)),td()},()=>{})),eG.get(e)??o.block),e7=(e,t=null)=>{if(Array.isArray(e))e.forEach(e=>e7(e,t));else if(et(e)){let r=t;"string"==typeof e._uid&&"string"==typeof e._type&&(r=e._uid,eQ.set(r,t),eG.set(r,ee(e._type))),Object.values(e).forEach(e=>e7(e,r))}},e9=r=>e.querySelector(N(r))?.parentElement?.closest(`[${t}]`)?.getAttribute(t)??eQ.get(r)??null,te=()=>k.current()?.name||e.title.trim(),tt=null,tr=()=>{null===tt&&s&&(tt=s.requestAnimationFrame(()=>{tt=null,(t=>{if(ej.replaceChildren(),eT.replaceChildren(),!ta(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=L(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=L(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=L(e,"span",{className:"accent-chip"});return r&&n.appendChild(M(e,"mark",P)),n.appendChild(e.createTextNode(t)),n},l=e6(),d=l?l.uid?N(l.uid):`[${r}]`:null,p=d?n(d):null;if(p&&a(p,"fill",eT),eZ&&eZ!==t.selectedUid){let t=n(N(eZ));if(t){a(t,"hover");let r=t.top-23<0,n=L(e,"span",{className:`name-tab${r?" inside":""}`,textContent:e8(eZ)});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(N(t.selectedUid));if(r){let n=e8(t.selectedUid),a=te();i(r,s(c?U(o.previewChip,{name:n}):n,c),...a?[L(e,"span",{className:"ink-chip",textContent:a})]:[])}}if(p&&!c){a(p,"preview");let e=l.uid?e8(l.uid):te()||o.pages;i(p,s(U(o.previewChip,{name:e}),!0))}})(n.getState())}))},tn=e=>e.features.includes("prompt")&&eD,ta=e=>tn(e)&&eH&&!eV,ti=t=>L(e,"span",{className:`value${t?"":" none"}`,textContent:t||o.emptyValue}),to=t=>{let r=t.node.querySelector(".card");if(r.querySelector(".status-line")?.remove(),"failed"===t.status)return void r.appendChild(L(e,"p",{className:"failure"},O(e,"alert"),t.summary));for(let n of(r.appendChild(t.eyebrow),t.summary&&r.appendChild(L(e,"p",{className:"summary",textContent:t.summary})),t.diffs.slice(0,3))){let a=L(e,"div",{className:"diff-field"},L(e,"span",{className:"diff-label",textContent:n.label}),L(e,"div",{className:"diff"},L(e,"div",{className:"before"},L(e,"span",{className:"tag",textContent:o.before}),ti(n.before)),L(e,"div",{className:"after"},L(e,"span",{className:"tag",textContent:o.after}),ti(n.after))));t.details.push(a),r.appendChild(a)}if(t.diffs.length>3){let n=L(e,"p",{className:"more",textContent:U(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",()=>tv()),a.addEventListener("click",()=>void tw(t)),i.addEventListener("click",()=>tx(t)),t.actions=L(e,"div",{className:"actions"},n,a,i),r.appendChild(t.actions)}},ts=(t,r)=>{let n=L(e,"div",{className:"card"},L(e,"span",{className:"visually-hidden",textContent:`${o.obelism}: `}),L(e,"p",{className:"status-line"},M(e,"working",$),eV?o.creating:o.working)),a=L(e,"div",{className:"answer"},L(e,"span",{className:"chip"},M(e,"mark",P)),n);a.dataset.status="working";let i={prompt:t,uid:r,status:"working",summary:"",diffs:[],step:null,node:a,eyebrow:L(e,"p",{className:"eyebrow"}),actions:null,details:[]};return eK.push(i),en.appendChild(a),i},tl=t=>{if(e1)return;let r=t.features.includes("prompt"),i=t.saving||t.publishing,s=t.prompting||i,p=r&&eD,{site:c,canCreate:u,pageless:g,shopHere:x,onlyNew:w}=F(n,t,a.promptWithoutPage);u||(eV=!1),w&&(eV=!0);let N=c&&!eV&&!g&&t.features.includes("form");eF=N?eq:"ask";let P=e5().length>0;for(let e of(P&&"fields"!==eF||(eB=!1),eK))null!==e.step&&e.step>(t.undoSteps??0)&&(e.step=null);eR.hidden=!r&&!c,eS.toggleAttribute("data-closed",!p),eS.inert=!p,eL.hidden=!r,eL.setAttribute("aria-expanded",String(p)),eP.hidden=r,eU.hidden=!p,eU.setAttribute("aria-pressed",String(!eH)),e$.hidden=!eH,eM.hidden=eH,eO.hidden=!1===a.signOut;let I=p&&eJ;l.toggleAttribute("data-obelism-docked",I),l.style.setProperty("--obelism-dock",`${436*!!I}px`);let R=p&&eH&&!eV;t.selecting!==R&&n.setSelecting(R);let D=p&&"fields"===eF;D&&!e2.mounted?e2.mount():!D&&e2.mounted&&e2.unmount(),e_&&!p&&(e_=!1),h.textContent=te()||o.pages,b.hidden=null===k.pages&&null!==k.error,m.hidden=!b.hidden,m.textContent=te()||o.pages,b.setAttribute("aria-expanded",String(e_)),C.hidden=!e_,E.hidden=!u||eV,E.disabled=s;let q=n.environment;v.hidden=!q,v.dataset.env=q??"",f.textContent="production"===q?o.envProduction:q??"",y.hidden=!N,y.setAttribute("aria-pressed",String("ask"===eF)),y.disabled=s,z.hidden=!eB,A.disabled=S.disabled=s,eg.hidden="ask"!==eF,ex.hidden="fields"!==eF;let V=null!==x&&!eV;if(eV)j.textContent=o.newPage;else if(t.selectedUid){let[r,n=""]=o.scopeNoteBlock.split("{name}");for(let a of[j,em])a.replaceChildren(r??"",L(e,"strong",{textContent:e8(t.selectedUid)}),n)}else j.textContent=o.scopeNotePage;let H=t.selectedUid?e9(t.selectedUid):null,G=H?U(o.scopeUp,{name:e8(H)}):o.scopeEntry;for(let e of[T,ef])e.textContent!==G&&(e.textContent=G);ev.hidden=eV||!t.selectedUid,W.hidden=V||g&&!eV&&!a.promptWithoutPage,T.hidden=eV||!t.selectedUid,_.hidden=!eV||w,Y.hidden=eK.length>0||V||eV,Z.hidden=!V;let Q=B(o,x);K.textContent=t.prompting&&V?Q.adding:Q.add,J.disabled=s,X.textContent=eX?.text??Q.hint,X.className=eX?.error?"failure":"summary",eu.hidden=V,eo.hidden=!eV,ei.disabled=s,es.placeholder=eV?o.newPagePlaceholder:o.placeholder,es.disabled=s,ep.disabled=s||""===es.value.trim()||eV&&""===ei.value.trim(),ep.setAttribute("aria-busy",String(t.prompting)),el.hidden=t.prompting,ed.hidden=!t.prompting,ek.hidden=P||!t.canUndo||eV,ek.disabled=s,eE.hidden=!t.features.includes("save")||g,eE.disabled=s||P||!t.unsaved,eC.hidden=!t.features.includes("publish")||g,eC.disabled=s||P,a.actions&&(a.actions.slot=p?"actions-footer":"actions-bar"),eA.hidden=!c,t.unsaved&&!eY&&(eW=null),eY=t.unsaved;let ee=i?M(e,"working",$):eW?.kind==="error"?O(e,"alert"):P||t.unsaved?L(e,"span",{className:"dot"}):O(e,"check"),et=t.saving?o.saving:t.publishing?o.publishing:eW?.kind==="error"?`${"save"===eW.action?o.saveFailed:o.publishFailed}: ${eW.text}`:P?o.keepFirst:t.unsaved?o.unsaved:eW?.kind==="saved"?o.saved:eW?.kind==="published"?o.published:o.upToDate,er=i?"saving":eW?.kind==="error"?"error":P||t.unsaved?"unsaved":"saved";if((ey.dataset.state!==er||ey.dataset.text!==et)&&(ey.dataset.state=er,ey.dataset.text=et,ey.replaceChildren(ee,L(e,"span",{textContent:et})),eW?.kind==="error"&&!i)){let e=eW.action,t=d("link",o.tryAgain);t.addEventListener("click",()=>void tE(e)),ey.appendChild(t)}eb.classList.toggle("loading",e2.loading||null!==e2.error),eh.hidden=!e2.loading&&null===e2.error,eh.className=`form-note${null!==e2.error?" error":""}`,eh.textContent=e2.error??o.formLoading;let en=e3();for(let e of eK){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!==en),e.details))r.hidden="undone"===e.status}p&&((()=>{if("idle"!==e0||null===n.entryId)return;e0="loading";let e=()=>{e0="done",td()};n.view({uid:null}).then(t=>{e7(t),e()},e)})(),null===k.pages&&null===k.error&&k.fetch()),tr()},td=()=>tl(n.getState()),tp=()=>{es.style.height="auto",es.style.height=`${es.scrollHeight}px`},tc=()=>{ea.scrollTop=ea.scrollHeight},tu=e=>{eD=e;try{s?.localStorage.setItem(G,eD?"open":"minimised")}catch{}eD||(e_=!1),td(),eD?eV?ei.focus():"fields"===eF?e4():es.focus():eL.focus()},tg=e=>{if("fields"===e&&e5().length>0){eB=!0,td(),A.focus();return}if(eB=!1,eq===e)return td();eq=e,td()},th=e=>{e_=!1,(eV=e)&&n.select(null),td(),(eV?ei:es).focus()},tb=e=>{(e_=e)&&k.reset(),td(),(e_?k.search:b).focus()},tm=()=>{let{selectedUid:e}=n.getState();return e&&n.select(e9(e)),!n.getState().selectedUid},tf=()=>{let e=n.getState();if(!tn(e))return!1;if(e_)tb(!1);else{if(!e.selectedUid)return!1;tm()}return!0},tv=(e=!0)=>{let t=e5();t.length&&e3()&&(t.forEach(e=>{e.status="kept"}),td(),e&&es.focus())},tx=(e,t=!0)=>{e===e3()&&(n.undo(),e.status="undone",td(),t&&es.focus())},ty=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;er(e,"","",r),er(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=q(t),e.status="failed"}to(e),td(),tc()},tw=async e=>{if(e!==e3())return;n.undo(),e.status="undone";let t=ts(e.prompt,e.uid);td(),tc(),es.focus(),await ty(t,U(o.retryPrompt,{prompt:e.prompt}))},tk=async()=>{let t=es.value.trim(),r=n.getState();if(!t||r.prompting)return;let a=ei.value.trim();if(eV&&!a)return ei.focus();let i=eV?null:r.selectedUid,s=eV?`${o.newPage} \xb7 ${a}`:i?e8(i):o.scopeEntry;en.appendChild(L(e,"p",{className:"bubble"},L(e,"span",{className:"visually-hidden",textContent:`${o.you} (${s}): `}),t)),es.value="",tp();let l=ts(t,i);if(td(),tc(),eV){try{await n.createPage(a,t),k.forget(),l.summary=o.created,l.status="kept"}catch(e){l.summary=q(e),l.status="failed"}to(l),td()}else await ty(l,t);es.focus()},tE=async e=>{eW=null;let t=await H(n,e);eW=t?{kind:"error",action:e,text:t}:{kind:"save"===e?"saved":"published"},td()};eL.addEventListener("click",()=>tu(!eD)),x.addEventListener("click",()=>tu(!1)),eU.addEventListener("click",()=>{eH=!eH,td()}),eO.addEventListener("click",()=>n.signOut()),b.addEventListener("click",()=>tb(!e_)),E.addEventListener("click",()=>th(!0)),_.addEventListener("click",()=>th(!1)),T.addEventListener("click",()=>{tm()&&es.focus()}),ef.addEventListener("click",()=>{tm()&&e4()}),J.addEventListener("click",async()=>{eX=null,eX=await V(n,o),td()}),y.addEventListener("click",()=>tg("ask"===eq?"fields":"ask")),A.addEventListener("click",()=>{tv(!1),tg("fields"),e4()}),S.addEventListener("click",()=>{for(let e=e3();e;e=e3())tx(e,!1);tg("fields"),e4()}),ek.addEventListener("click",()=>{let e=n.getState().undoSteps,t=void 0===e?void 0:eK.find(t=>"kept"===t.status&&t.step===e);if(n.undo(),t){var r;t.status="undone",td(),r=`${o.undone}: ${t.summary}`,eN.textContent="",eN.textContent=r}ek.hidden&&es.focus()}),eE.addEventListener("click",()=>void tE("save")),eC.addEventListener("click",()=>void tE("publish")),eu.addEventListener("submit",e=>{e.preventDefault(),tk()}),es.addEventListener("input",()=>{tp(),td()}),es.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing||(e.preventDefault(),tk())}),ei.addEventListener("input",td),ei.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing||(e.preventDefault(),es.focus())});let tC=e=>{"Escape"===e.key&&!e.defaultPrevented&&tf()&&e.preventDefault()};e.addEventListener("keydown",tC);let tA=e=>{let r=e.target,n=r?.closest?.(`[${t}]`),a=n?.getAttribute(t)??null;a!==eZ&&(eZ=a,tr())},tN=()=>{eZ=null,tr()};e.addEventListener("pointerover",tA),l.addEventListener("pointerleave",tN),s?.addEventListener("scroll",tr,{capture:!0,passive:!0}),s?.addEventListener("resize",tr);let tS=s?.MutationObserver,tL="function"==typeof tS?new tS(tr):null;tL?.observe(e.body,{childList:!0,subtree:!0});let tP=s?.ResizeObserver,t$="function"==typeof tP?new tP(tr):null;t$?.observe(l);let tM=s?.matchMedia?.("(min-width: 768px)")??null;eJ=tM?.matches??!0;let tU=()=>{eJ=tM?.matches??!0,td()};tM?.addEventListener?.("change",tU);let tz=n.on("change",tl);return l.setAttribute("data-obelism-editor",""),e.head.appendChild(u),e.body.appendChild(p),td(),()=>{e1=!0,tz(),e2.unmount(),null!==tt&&s?.cancelAnimationFrame?.(tt),e.removeEventListener("keydown",tC),e.removeEventListener("pointerover",tA),l.removeEventListener("pointerleave",tN),s?.removeEventListener("scroll",tr,{capture:!0}),s?.removeEventListener("resize",tr),tM?.removeEventListener?.("change",tU),tL?.disconnect(),t$?.disconnect(),n.setSelecting(!1),l.removeAttribute("data-obelism-editor"),l.removeAttribute("data-obelism-docked"),l.style.removeProperty("--obelism-dock"),u.remove(),p.remove()}},ea=Symbol.for("@obelism/content/bridge"),ei=S({isEditing:!1,entryId:null,on:()=>{}},new URLSearchParams),eo=({url:e,prompt:o=!0,pagePath:l,productPath:d,collectionPath:p}={})=>{let u;if("u"<typeof window)return ei;let g=window;if(g[ea])return g[ea];if(g.ObelismBridge)u=S(g.ObelismBridge,new URLSearchParams(g.location.search));else{let f=(u=((e,r)=>{let n,a,o,s,l,d=new URLSearchParams(e.location.search),p=e.parent!==e&&d.has("cms_preview"),u=y(),g=[],f={...x,selecting:!0},w=e=>{f={...f,...e},u.emit("change",f)},k={isEditing:p,mode:p?"editor":null,entryId:d.get("cms_entry"),environment:d.get(i),product:null,collection:null,on:u.on,getState:()=>f,...E,destroy:()=>{g.splice(0).forEach(e=>e())}};if(!p)return k;let C=e.document,S=(t,n={})=>{e.parent.postMessage({source:m,type:t,...n},r)},L=C.createElement("style");L.textContent=v(),C.head.appendChild(L),g.push(()=>L.remove());let P=(e,t)=>{if(C.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),f.selectedUid!==(e??null)&&w({selectedUid:e??null}),!e)return;let r=C.querySelector(N(e));r&&(r.setAttribute("data-cms-selected",""),t&&r.scrollIntoView({behavior:"smooth",block:"center"}))},$=e=>{let r=e.target,n=r?.closest?.(`[${t}]`);if(!n)return;e.preventDefault(),e.stopPropagation();let a=n.getAttribute(t);P(a,!1),S("select",{uid:a})};C.addEventListener("click",$,!0),g.push(()=>C.removeEventListener("click",$,!0));let M=()=>Math.ceil(Math.max(C.documentElement.scrollHeight,C.body?.scrollHeight??0)),U=0,z=()=>{U=M(),S("ready",{url:e.location.href,height:U})},O=e.ResizeObserver;if("function"==typeof O){let e=new O(()=>{let e=M();e!==U&&(U=e,S("size",{height:e}))});e.observe(C.documentElement),C.body&&e.observe(C.body),g.push(()=>e.disconnect())}let I=new Map,j=0,T=e=>{let t=I.get(e);return t?(clearTimeout(t.timer),I.delete(e),0===I.size&&w({prompting:!1}),t):null};k.prompt=(e,t={})=>{let r=e.trim();if(!r)return Promise.reject(Error("Say what to change"));if(!f.features.includes("prompt"))return Promise.reject(Error("The editor does not offer prompts here"));let n=`prompt_${++j}`,a=void 0===t.uid?f.selectedUid:t.uid;return new Promise((e,t)=>{let i=setTimeout(()=>{T(n)?.reject(Error("The editor did not answer in time"))},12e4);I.set(n,{resolve:e,reject:t,timer:i}),w({prompting:!0}),S("prompt",{id:n,prompt:r,uid:a})})},k.undo=()=>S("undo"),k.select=e=>{P(e,!1),S("select",{uid:e})};let R=null;g.push(()=>R?.destroy()),g.push(()=>{for(let e of I.keys())T(e)?.reject(Error("The bridge was destroyed"))});let D=(n=new WeakSet,a=null,o=null,s=!1,l=()=>{if(null!==a){for(let e of Array.from(C.styleSheets)){let t;if(!n.has(e)){try{t=e.cssRules}catch{continue}n.add(e),b(t,a)}}C.querySelectorAll('[style*="vh"]').forEach(e=>{h(e.style,a)})}},{freeze(e){if(null!==a||!(e>0))return;a=e,l();let t=C.defaultView?.MutationObserver;t&&(o=new t(()=>{if(s)return;s=!0;let e=()=>{s=!1,l()};C.defaultView?.requestAnimationFrame?C.defaultView.requestAnimationFrame(e):e()})).observe(C.documentElement,{childList:!0,subtree:!0})},destroy(){o?.disconnect()}});g.push(()=>D.destroy());let q=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)z();else if("update"===n.type&&n.entry)u.emit("update",{entry:n.entry,selectedUid:n.selectedUid??null}),e.requestAnimationFrame(()=>P(n.selectedUid,!1)),R?.refresh();else if("select"===n.type)P(n.uid,!0);else if("saved"===n.type||"published"===n.type)u.emit(n.type,{}),0===u.listeners.update.size&&e.location.reload();else if("features"===n.type&&Array.isArray(n.features))w({features:n.features.filter(e=>"string"==typeof e)});else if("stats"===n.type)w({stats:A(n.stats),statsVisible:!1!==n.visible}),(R||Object.keys(f.stats).length)&&(R??(R=c(e,{selector:N,onSelect:e=>k.select(e)})),R.update(f.stats,f.statsVisible));else if("viewport"===n.type&&"number"==typeof n.height)D.freeze(n.height);else if("promptState"===n.type)w({canUndo:!0===n.canUndo});else if("promptResult"===n.type&&"string"==typeof n.id){let e=T(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",q),g.push(()=>e.removeEventListener("message",q)),"loading"===C.readyState?(C.addEventListener("DOMContentLoaded",z,{once:!0}),g.push(()=>C.removeEventListener("DOMContentLoaded",z))):z(),k})(g,new URL(e||X).origin)).isEditing||g.parent!==g?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 K.test(e)?e:null}catch{break}}return null})(g.document);if(f&&(u=((e,i,{pagePath:o=e=>`/${e.replace(/^\/+/,"")}`,productPath:l,collectionPath:d}={})=>{let p=e.document,u=y(),g=[],h=new Map,b=[],f=new Set,w=null,k=null,E=-1/0,C=new Map,S=x,L=e=>{S={...S,...e},u.emit("change",S)},P=()=>L({unsaved:[...h.values()].some(({content:e,saved:t})=>!Z(e,t)),canUndo:b.length>0,undoSteps:b.length}),$=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 L({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},M=()=>p.querySelector(`[${r}]`)?.getAttribute(r)??null,U=()=>{let e=p.querySelector(`[${n}]`),t=e?.getAttribute(n),r=e?.getAttribute("data-cms-product-handle");return t&&r?{id:t,handle:r}:null},z=()=>{let e=p.querySelector(`[${a}]`),t=e?.getAttribute(a),r=e?.getAttribute("data-cms-collection-handle");return t&&r?{id:t,handle:r}:null},O=e=>{let t=e?p.querySelector(N(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??M()},I=()=>{if(!w)return;let e=w.space.locales.map(({code:e})=>e),t=p.documentElement.lang;if(e.includes(t))return t;let r=t.split("-")[0]??"";return e.includes(r)?r:w.space.defaultLocale},j=new Map,T=async e=>{let t=h.get(e);if(t)return t;let r=j.get(e);return r||(r=$(`entries/${encodeURIComponent(e)}`).then(t=>{let r=h.get(e)??{content:t.content,saved:t.content,revision:t.draftRevision};return h.set(e,r),r}).finally(()=>j.delete(e)),j.set(e,r)),r},R=e=>{let t=void 0===e?S.selectedUid:e,r=O(t);if(!r)throw Error("Nothing on this page is marked as an entry: add editable(entry)");return{uid:t,entryId:r}},D=e=>{p.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),S.selectedUid!==e&&L({selectedUid:e}),e&&p.querySelector(N(e))?.setAttribute("data-cms-selected","")},q=async t=>{if(0===u.listeners.update.size)return;let r=h.get(t)?.content,{entry:n}=await $(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:I()});u.emit("update",{entry:n,selectedUid:S.selectedUid}),e.requestAnimationFrame(()=>D(S.selectedUid))},F=e=>console.error("[@obelism/content bridge]",e),B=t=>{u.emit(t,{}),0===u.listeners.update.size&&e.location.reload()},V=async()=>{for(let[e,t]of h){if(Z(t.content,t.saved))continue;let{draftRevision:r}=await $(`entries/${encodeURIComponent(e)}/save`,{content:t.content,baseRevision:t.revision});t.saved=t.content,t.revision=r,f.add(e)}b.length=0,E=-1/0,P()},H={isEditing:!0,mode:"site",get entryId(){return M()},get product(){return U()},get collection(){return z()},get environment(){return w?.environment??null},on:u.on,getState:()=>S,async prompt(e,t={}){let r=e.trim();if(!r)throw Error("Say what to change");if(!S.features.includes("prompt"))throw Error("You may not edit content here");let{uid:n,entryId:a}=R(t.uid);L({prompting:!0});try{let e=await T(a),t=await $(`entries/${encodeURIComponent(a)}/prompt`,{prompt:r,content:e.content,locale:I(),uid:n});return b.push({entryId:a,content:e.content}),E=-1/0,e.content=t.content,P(),await q(a),{summary:t.summary}}finally{L({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(!S.features.includes("create"))throw Error("You may not add pages here");if(S.unsaved)throw Error("Save or undo your changes before adding a page");L({prompting:!0});try{let r=await $("entries",{path:t,prompt:n,locale:I(),from:M()}),a=o(r.path,I()??"");return e.location.assign(J(a)),{summary:r.summary,entryId:r.entryId,path:r.path,url:a}}finally{L({prompting:!1})}},async createProductPage(t=U()??void 0){if(!t)throw Error("Nothing on this page is marked as a product: add editableProduct(product)");if(!S.features.includes("create"))throw Error("You may not add pages here");if(S.unsaved)throw Error("Save or undo your changes before adding a page");L({prompting:!0});try{let r=await $("product-pages",{product:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{L({prompting:!1})}},async createCollectionPage(t=z()??void 0){if(!t)throw Error("Nothing on this page is marked as a collection: add editableCollection(collection)");if(!S.features.includes("create"))throw Error("You may not add pages here");if(S.unsaved)throw Error("Save or undo your changes before adding a page");L({prompting:!0});try{let r=await $("collection-pages",{collection:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{L({prompting:!1})}},async view(e={}){let{uid:t,entryId:r}=R(e.uid),n=await T(r),{view:a}=await $(`entries/${encodeURIComponent(r)}/view`,{content:n.content,locale:I(),uid:t});return a},async applyJson(e,t={}){if(!S.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}=R(t.uid);L({prompting:!0});try{let t=await T(n),a=await $(`entries/${encodeURIComponent(n)}/apply`,{changes:e,content:t.content,locale:I(),uid:r});return Z(a.content,t.content)||(b.push({entryId:n,content:t.content}),E=-1/0,t.content=a.content,P(),await q(n)),{changed:a.changed??[],...a.view&&{view:a.view}}}finally{L({prompting:!1})}},openForm(t,r={}){let{title:n="Content form",onReady:a,onError:i,onEscape:o}=r;k?.();let s=!1,l=null,d=null,p=()=>{},c=e=>{s||i?.(e instanceof Error?e.message:String(e))},g=()=>{s||(s=!0,p(),l?.destroy(),k===g&&(k=null))};k=g;let f=()=>{if(s||!l)return;let e=O(S.selectedUid);if(!e)return;let t=h.get(e);if(!t)return void T(e).then(f,c);let r={entryId:e,content:t.content,locale:I(),selectedUid:S.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:h.get(r);if(s||void 0===r||!n||Z(e,n.content))return;let a=Date.now();a-E>=1e3&&b.push({entryId:r,content:n.content}),E=a,n.content=e,d?.entryId===r&&(d={...d,content:e}),P(),clearTimeout(C.get(r)),C.set(r,setTimeout(()=>{C.delete(r),q(r).catch(F)},300))};return(async()=>{if(!S.features.includes("form"))throw Error("You may not edit content here");await T(R(void 0).entryId);let{url:r}=await $("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:m,type:"content",...p},o)},u=setTimeout(()=>{d||a.onError("The form did not open")},3e4),g=()=>{d=!0,clearTimeout(u),a.onReady()},h=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",h),t.appendChild(s),{show(e){p=e,c()},destroy(){clearTimeout(u),e.removeEventListener("message",h),s.remove()}}})(e,t,"string"==typeof r?r:"",n,{onReady:()=>a?.(),onChange:v,onError:e=>i?.(e),onEscape:()=>o?.()}),p=u.on("change",f),f())})().catch(c),{close:g}},async pages(){let{pages:e}=await $("pages"),t=[I(),w?.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,l?l(r,a):(w?.productPath??"/products/{handle}").replaceAll("{handle}",encodeURIComponent(r))):e.collection?(n=e.collection.handle,d?d(n,a):(w?.collectionPath??"/collections/{handle}").replaceAll("{handle}",encodeURIComponent(n))):o(i,a),product:e.product??null,collection:e.collection??null}]})},openPage(t){(!S.unsaved||e.confirm("Leave this page and lose the changes you have not saved?"))&&(h.clear(),b.length=0,P(),e.location.assign(J(t.url)))},undo(){let e=b.pop(),t=e&&h.get(e.entryId);e&&t&&(E=-1/0,t.content=e.content,P(),q(e.entryId).catch(F))},async save(){if(!S.features.includes("save"))throw Error("You may not edit content here");L({saving:!0});try{await V()}finally{L({saving:!1})}B("saved")},async publish(){if(!S.features.includes("publish"))throw Error("You may not publish here");L({publishing:!0});try{await V();let e=M(),t=f.size>0?[...f]: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 $(`entries/${encodeURIComponent(e)}/publish`,{}),f.delete(e)}finally{L({publishing:!1})}B("published")},signOut(){if(S.unsaved&&!e.confirm("Sign out and lose the changes you have not saved?"))return;h.clear(),P();let t=e.location.pathname+e.location.search;e.location.href=`${i}/logout?return_to=${encodeURIComponent(t)}`},select(e){D(e)},setSelecting(e){e?p.documentElement.setAttribute("data-cms-selecting",""):p.documentElement.removeAttribute("data-cms-selecting"),L({selecting:e,statsVisible:e}),et()},destroy(){k?.(),C.forEach(e=>clearTimeout(e)),C.clear(),g.splice(0).forEach(e=>e())}},_=p.createElement("style");_.textContent=v("html[data-cms-selecting] "),p.head.appendChild(_),g.push(()=>_.remove()),g.push(()=>p.documentElement.removeAttribute("data-cms-selecting"));let W=e=>{if(!S.selecting)return;let r=e.target,n=r?.closest?.(`[${t}]`);n&&(e.preventDefault(),e.stopPropagation(),D(n.getAttribute(t)))};p.addEventListener("click",W,!0),g.push(()=>p.removeEventListener("click",W,!0));let Y=e=>{S.unsaved&&(e.preventDefault(),e.returnValue="")};e.addEventListener("beforeunload",Y),g.push(()=>e.removeEventListener("beforeunload",Y));let X=new Set,K=new Set,G=!1,Q=null,ee=null,et=()=>Q?.update(S.stats,S.statsVisible),er=async()=>{if(G)return;let t=[...new Set([...p.querySelectorAll(`[${s}]`)].map(e=>e.getAttribute(s)??""))].filter(e=>e&&!X.has(e)),n=t.slice(0,500);if(!n.length)return;n.forEach(e=>X.add(e));let a=[...new Set([...p.querySelectorAll(`[${r}]`)].map(e=>e.getAttribute(r)??""))].filter(Boolean).slice(0,20);try{let{stats:e}=await $("stats",{uids:n,...a.length>0&&{entries:a}});n.forEach(e=>K.add(e)),L({stats:{...S.stats,...A(e)}})}catch{G=!0;return}Q??(Q=c(e,{selector:N,onSelect:e=>D(e),checked:e=>K.has(e)})),et(),t.length>n.length&&en()},en=()=>{null!==ee||G||(ee=setTimeout(()=>{ee=null,er()},1e3))},ea=e.MutationObserver,ei="function"==typeof ea?new ea(en):null;return g.push(()=>{ei?.disconnect(),null!==ee&&clearTimeout(ee),Q?.destroy()}),$("session").then(e=>{w=e,L({features:e.features}),er(),ei?.observe(p.body,{childList:!0,subtree:!0})}).catch(e=>console.error("[@obelism/content bridge]",e)),H})(g,f,{pagePath:l,productPath:d,collectionPath:p})),u.isEditing&&o){let e=g.document,t=()=>{},r=!1,n=f?en:Y,a=()=>{r||(t=n(e,u,!0===o?{}:o))};e.body?a():e.addEventListener("DOMContentLoaded",a,{once:!0});let i=u.destroy;u.destroy=()=>{r=!0,e.removeEventListener("DOMContentLoaded",a),t(),i()}}}return g[ea]=u,u};(e=window).ObelismBridge=eo((e=>{let t=e?.dataset.url,r=t||X;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:eo,mountPromptBox:Y,mountSiteEditor:en}}();
|
|
594
|
+
`,ee=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)},et=e=>!!e&&"object"==typeof e&&!Array.isArray(e),er=(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=et(e)&&"string"==typeof e._uid?e._uid:a,o=et(e)&&"string"==typeof e._type?e._type:null;er(e,o?ee(o):t,`${r}/${i}`,n)});return}for(let[a,i]of Object.entries(e))"_uid"!==a&&"_type"!==a&&er(i,t?`${t} \xb7 ${ee(a)}`:ee(a),`${r}/${a}`,n)}},en=(e,n,a={})=>{let i,o={...R,...a.labels},s=e.defaultView,l=e.documentElement,d=(t,...r)=>L(e,"button",{className:t,type:"button"},...r),p=L(e,"div");p.setAttribute("data-obelism-content-editor","");let c=p.attachShadow({mode:"open"}),u=L(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=L(e,"span",{className:"tile"},M(e,"mark",P)),h=L(e,"span"),b=d("page-button hit",h,L(e,"span",{className:"visually-hidden",textContent:`, ${o.pages}`}),O(e,"chevrons"));b.setAttribute("aria-haspopup","listbox"),b.setAttribute("aria-expanded","false"),b.setAttribute("aria-controls","obelism-pages");let m=L(e,"span",{className:"page-name"}),f=L(e,"span"),v=L(e,"span",{className:"env"},L(e,"span",{className:"visually-hidden",textContent:`${o.environment}: `}),f),x=d("icon-button hit",O(e,"dash"));x.setAttribute("aria-label",o.minimize),x.title=o.minimize;let y=d("mode hit",M(e,"mark",P),o.modePrompt);y.setAttribute("aria-pressed","false");let w=L(e,"div",{className:"head"},g,b,m,v,L(e,"span",{className:"spacer"}),y,x),k=D(e,n,o,{onLoad:()=>td(),onClose:()=>tb(!1)}),E=d("button quiet new-page",O(e,"plus"),o.newPage),C=L(e,"div",{className:"pages"},k.searchRow,k.list,k.note,E),A=d("button primary",o.keep),S=d("button quiet",o.undo),z=L(e,"div",{className:"gate"},L(e,"p",{textContent:o.keepBeforeFields}),L(e,"div",{className:"actions"},A,S));z.setAttribute("role","alert");let j=L(e,"span"),T=d("",o.scopeEntry),_=d("",o.newPageCancel),W=L(e,"div",{className:"note"},O(e,"scope"),j,T,_),Y=L(e,"p",{className:"intro",textContent:o.askIntro}),X=L(e,"p",{className:"summary"}),K=L(e,"span"),J=d("button primary",O(e,"plus"),K),Z=L(e,"div",{className:"shop"},X,J),en=L(e,"div",{className:"log"});en.setAttribute("role","log");let ea=L(e,"div",{className:"scroll"},W,Y,Z,en),ei=L(e,"input",{type:"text",placeholder:o.pathPlaceholder,autocomplete:"off",spellcheck:!1}),eo=L(e,"label",{className:"path"},L(e,"span",{textContent:o.path}),ei),es=L(e,"textarea",{rows:1});es.setAttribute("aria-label",o.open);let el=O(e,"arrowUp"),ed=M(e,"working",$),ep=L(e,"button",{className:"send",type:"submit",title:o.send},L(e,"span",{className:"visually-hidden",textContent:o.send}),el,ed),ec=L(e,"div",{className:"bar"},M(e,"mark",P),es,ep),eu=L(e,"form",{className:"composer"},eo,ec),eg=L(e,"div",{className:"ask",id:"obelism-ask"},ea,eu);eg.setAttribute("role","tabpanel"),eg.setAttribute("aria-label",o.modePrompt);let eh=L(e,"p",{className:"form-note"});eh.setAttribute("role","status");let eb=L(e,"div",{className:"form"},eh),em=L(e,"span"),ef=d("",o.scopeEntry),ev=L(e,"div",{className:"note"},O(e,"scope"),em,ef),ex=L(e,"div",{className:"fields",id:"obelism-fields"},ev,eb);ex.setAttribute("role","tabpanel"),ex.setAttribute("aria-label",o.form);let ey=L(e,"p",{className:"save-state"});ey.setAttribute("aria-live","polite");let ew=L(e,"slot");ew.name="actions-footer";let ek=d("button quiet",O(e,"undo"),o.undo),eE=d("button secondary",o.saveDraft),eC=d("button primary",o.publish),eA=L(e,"div",{className:"foot"},ey,ew,ek,eE,eC),eN=L(e,"p",{className:"visually-hidden"});eN.setAttribute("role","status");let eS=L(e,"aside",{className:"panel",id:"obelism-editor"},w,C,z,eg,ex,eA,eN);eS.setAttribute("aria-label",o.editor);let eL=d("launch",L(e,"span",{className:"launch-tile"},M(e,"mark",P)),o.editing);eL.setAttribute("aria-controls",eS.id);let eP=L(e,"span",{className:"reading"},L(e,"span",{className:"launch-tile"},M(e,"mark",P)),o.viewingDrafts),e$=O(e,"eye"),eM=O(e,"eyeOff"),eU=d("eye",e$,eM);eU.setAttribute("aria-label",o.hideOutlines),eU.title=o.hideOutlines;let ez=L(e,"slot");ez.name="actions-bar";let eO=d("exit",o.signOut),eI=L(e,"div",{className:"launcher"},eL,eP,eU,ez,eO);a.actions&&p.appendChild(a.actions);let ej=L(e,"div",{className:"layer"});ej.setAttribute("aria-hidden","true");let eT=L(e,"div",{className:"wash"});eT.setAttribute("aria-hidden","true");let eR=L(e,"div",{className:"root"},eT,ej,eS,eI);c.append(L(e,"style",{textContent:Q}),eR);let eD=(e=>{try{return e?.localStorage.getItem(G)!=="minimised"}catch{return!0}})(s),eq="fields",eF="fields",eB=!1,eV=!1,eH=!0,e_=!1,eW=null,eY=!1,eX=null,eK=[],eJ=!0,eZ=null,eG=new Map,eQ=new Map,e0="idle",e1=!1,e2=I(n,eb,o.formTitle,{onReady:()=>{td(),eD&&"fields"===eF&&e4()},onError:()=>td(),onEscape:()=>tf()}),e4=()=>eb.querySelector("iframe")?.focus(),e5=()=>eK.filter(({status:e})=>"pending"===e),e6=()=>e5().slice(-1)[0]??null,e3=()=>eK.some(({status:e})=>"working"===e)?null:e6(),e8=e=>(eG.has(e)||"loading"===e0||(eG.set(e,null),n.view({uid:e}).then(t=>{"string"==typeof t._type&&eG.set(e,ee(t._type)),td()},()=>{})),eG.get(e)??o.block),e7=(e,t=null)=>{if(Array.isArray(e))e.forEach(e=>e7(e,t));else if(et(e)){let r=t;"string"==typeof e._uid&&"string"==typeof e._type&&(r=e._uid,eQ.set(r,t),eG.set(r,ee(e._type))),Object.values(e).forEach(e=>e7(e,r))}},e9=r=>e.querySelector(N(r))?.parentElement?.closest(`[${t}]`)?.getAttribute(t)??eQ.get(r)??null,te=()=>k.current()?.name||e.title.trim(),tt=null,tr=()=>{null===tt&&s&&(tt=s.requestAnimationFrame(()=>{tt=null,(t=>{if(ej.replaceChildren(),eT.replaceChildren(),!ta(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=L(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=L(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=L(e,"span",{className:"accent-chip"});return r&&n.appendChild(M(e,"mark",P)),n.appendChild(e.createTextNode(t)),n},l=e6(),d=l?l.uid?N(l.uid):`[${r}]`:null,p=d?n(d):null;if(p&&a(p,"fill",eT),eZ&&eZ!==t.selectedUid){let t=n(N(eZ));if(t){a(t,"hover");let r=t.top-23<0,n=L(e,"span",{className:`name-tab${r?" inside":""}`,textContent:e8(eZ)});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(N(t.selectedUid));if(r){let n=e8(t.selectedUid),a=te();i(r,s(c?U(o.previewChip,{name:n}):n,c),...a?[L(e,"span",{className:"ink-chip",textContent:a})]:[])}}if(p&&!c){a(p,"preview");let e=l.uid?e8(l.uid):te()||o.pages;i(p,s(U(o.previewChip,{name:e}),!0))}})(n.getState())}))},tn=e=>e.features.includes("prompt")&&eD,ta=e=>tn(e)&&eH&&!eV,ti=t=>L(e,"span",{className:`value${t?"":" none"}`,textContent:t||o.emptyValue}),to=t=>{let r=t.node.querySelector(".card");if(r.querySelector(".status-line")?.remove(),"failed"===t.status)return void r.appendChild(L(e,"p",{className:"failure"},O(e,"alert"),t.summary));for(let n of(r.appendChild(t.eyebrow),t.summary&&r.appendChild(L(e,"p",{className:"summary",textContent:t.summary})),t.diffs.slice(0,3))){let a=L(e,"div",{className:"diff-field"},L(e,"span",{className:"diff-label",textContent:n.label}),L(e,"div",{className:"diff"},L(e,"div",{className:"before"},L(e,"span",{className:"tag",textContent:o.before}),ti(n.before)),L(e,"div",{className:"after"},L(e,"span",{className:"tag",textContent:o.after}),ti(n.after))));t.details.push(a),r.appendChild(a)}if(t.diffs.length>3){let n=L(e,"p",{className:"more",textContent:U(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",()=>tv()),a.addEventListener("click",()=>void tw(t)),i.addEventListener("click",()=>tx(t)),t.actions=L(e,"div",{className:"actions"},n,a,i),r.appendChild(t.actions)}},ts=(t,r)=>{let n=L(e,"div",{className:"card"},L(e,"span",{className:"visually-hidden",textContent:`${o.obelism}: `}),L(e,"p",{className:"status-line"},M(e,"working",$),eV?o.creating:o.working)),a=L(e,"div",{className:"answer"},L(e,"span",{className:"chip"},M(e,"mark",P)),n);a.dataset.status="working";let i={prompt:t,uid:r,status:"working",summary:"",diffs:[],step:null,node:a,eyebrow:L(e,"p",{className:"eyebrow"}),actions:null,details:[]};return eK.push(i),en.appendChild(a),i},tl=t=>{if(e1)return;let r=t.features.includes("prompt"),i=t.saving||t.publishing,s=t.prompting||i,p=r&&eD,{site:c,canCreate:u,pageless:g,shopHere:x,onlyNew:w}=F(n,t,a.promptWithoutPage);u||(eV=!1),w&&(eV=!0);let N=c&&!eV&&!g&&t.features.includes("form");eF=N?eq:"ask";let P=e5().length>0;for(let e of(P&&"fields"!==eF||(eB=!1),eK))null!==e.step&&e.step>(t.undoSteps??0)&&(e.step=null);eR.hidden=!r&&!c,eS.toggleAttribute("data-closed",!p),eS.inert=!p,eL.hidden=!r,eL.setAttribute("aria-expanded",String(p)),eP.hidden=r,eU.hidden=!p,eU.setAttribute("aria-pressed",String(!eH)),e$.hidden=!eH,eM.hidden=eH,eO.hidden=!1===a.signOut;let I=p&&eJ;l.toggleAttribute("data-obelism-docked",I),l.style.setProperty("--obelism-dock",`${436*!!I}px`);let R=p&&eH&&!eV;t.selecting!==R&&n.setSelecting(R);let D=p&&"fields"===eF;D&&!e2.mounted?e2.mount():!D&&e2.mounted&&e2.unmount(),e_&&!p&&(e_=!1),h.textContent=te()||o.pages,b.hidden=null===k.pages&&null!==k.error,m.hidden=!b.hidden,m.textContent=te()||o.pages,b.setAttribute("aria-expanded",String(e_)),C.hidden=!e_,E.hidden=!u||eV,E.disabled=s;let q=n.environment;v.hidden=!q,v.dataset.env=q??"",f.textContent="production"===q?o.envProduction:q??"",y.hidden=!N,y.setAttribute("aria-pressed",String("ask"===eF)),y.disabled=s,z.hidden=!eB,A.disabled=S.disabled=s,eg.hidden="ask"!==eF,ex.hidden="fields"!==eF;let V=null!==x&&!eV;if(eV)j.textContent=o.newPage;else if(t.selectedUid){let[r,n=""]=o.scopeNoteBlock.split("{name}");for(let a of[j,em])a.replaceChildren(r??"",L(e,"strong",{textContent:e8(t.selectedUid)}),n)}else j.textContent=o.scopeNotePage;let H=t.selectedUid?e9(t.selectedUid):null,G=H?U(o.scopeUp,{name:e8(H)}):o.scopeEntry;for(let e of[T,ef])e.textContent!==G&&(e.textContent=G);ev.hidden=eV||!t.selectedUid,W.hidden=V||g&&!eV&&!a.promptWithoutPage,T.hidden=eV||!t.selectedUid,_.hidden=!eV||w,Y.hidden=eK.length>0||V||eV,Z.hidden=!V;let Q=B(o,x);K.textContent=t.prompting&&V?Q.adding:Q.add,J.disabled=s,X.textContent=eX?.text??Q.hint,X.className=eX?.error?"failure":"summary",eu.hidden=V,eo.hidden=!eV,ei.disabled=s,es.placeholder=eV?o.newPagePlaceholder:o.placeholder,es.disabled=s,ep.disabled=s||""===es.value.trim()||eV&&""===ei.value.trim(),ep.setAttribute("aria-busy",String(t.prompting)),el.hidden=t.prompting,ed.hidden=!t.prompting,ek.hidden=P||!t.canUndo||eV,ek.disabled=s,eE.hidden=!t.features.includes("save")||g,eE.disabled=s||P||!t.unsaved,eC.hidden=!t.features.includes("publish")||g,eC.disabled=s||P,a.actions&&(a.actions.slot=p?"actions-footer":"actions-bar"),eA.hidden=!c,t.unsaved&&!eY&&(eW=null),eY=t.unsaved;let ee=i?M(e,"working",$):eW?.kind==="error"?O(e,"alert"):P||t.unsaved?L(e,"span",{className:"dot"}):O(e,"check"),et=t.saving?o.saving:t.publishing?o.publishing:eW?.kind==="error"?`${"save"===eW.action?o.saveFailed:o.publishFailed}: ${eW.text}`:P?o.keepFirst:t.unsaved?o.unsaved:eW?.kind==="saved"?o.saved:eW?.kind==="published"?o.published:o.upToDate,er=i?"saving":eW?.kind==="error"?"error":P||t.unsaved?"unsaved":"saved";if((ey.dataset.state!==er||ey.dataset.text!==et)&&(ey.dataset.state=er,ey.dataset.text=et,ey.replaceChildren(ee,L(e,"span",{textContent:et})),eW?.kind==="error"&&!i)){let e=eW.action,t=d("link",o.tryAgain);t.addEventListener("click",()=>void tE(e)),ey.appendChild(t)}eb.classList.toggle("loading",e2.loading||null!==e2.error),eh.hidden=!e2.loading&&null===e2.error,eh.className=`form-note${null!==e2.error?" error":""}`,eh.textContent=e2.error??o.formLoading;let en=e3();for(let e of eK){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!==en),e.details))r.hidden="undone"===e.status}p&&((()=>{if("idle"!==e0||null===n.entryId)return;e0="loading";let e=()=>{e0="done",td()};n.view({uid:null}).then(t=>{e7(t),e()},e)})(),null===k.pages&&null===k.error&&k.fetch()),tr()},td=()=>tl(n.getState()),tp=()=>{es.style.height="auto",es.style.height=`${es.scrollHeight}px`},tc=()=>{ea.scrollTop=ea.scrollHeight},tu=e=>{eD=e;try{s?.localStorage.setItem(G,eD?"open":"minimised")}catch{}eD||(e_=!1),td(),eD?eV?ei.focus():"fields"===eF?e4():es.focus():eL.focus()},tg=e=>{if("fields"===e&&e5().length>0){eB=!0,td(),A.focus();return}if(eB=!1,eq===e)return td();eq=e,td()},th=e=>{e_=!1,(eV=e)&&n.select(null),td(),(eV?ei:es).focus()},tb=e=>{(e_=e)&&k.reset(),td(),(e_?k.search:b).focus()},tm=()=>{let{selectedUid:e}=n.getState();return e&&n.select(e9(e)),!n.getState().selectedUid},tf=()=>{let e=n.getState();if(!tn(e))return!1;if(e_)tb(!1);else{if(!e.selectedUid)return!1;tm()}return!0},tv=(e=!0)=>{let t=e5();t.length&&e3()&&(t.forEach(e=>{e.status="kept"}),td(),e&&es.focus())},tx=(e,t=!0)=>{e===e3()&&(n.undo(),e.status="undone",td(),t&&es.focus())},ty=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;er(e,"","",r),er(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=q(t),e.status="failed"}to(e),td(),tc()},tw=async e=>{if(e!==e3())return;n.undo(),e.status="undone";let t=ts(e.prompt,e.uid);td(),tc(),es.focus(),await ty(t,U(o.retryPrompt,{prompt:e.prompt}))},tk=async()=>{let t=es.value.trim(),r=n.getState();if(!t||r.prompting)return;let a=ei.value.trim();if(eV&&!a)return ei.focus();let i=eV?null:r.selectedUid,s=eV?`${o.newPage} \xb7 ${a}`:i?e8(i):o.scopeEntry;en.appendChild(L(e,"p",{className:"bubble"},L(e,"span",{className:"visually-hidden",textContent:`${o.you} (${s}): `}),t)),es.value="",tp();let l=ts(t,i);if(td(),tc(),eV){try{await n.createPage(a,t),k.forget(),l.summary=o.created,l.status="kept"}catch(e){l.summary=q(e),l.status="failed"}to(l),td()}else await ty(l,t);es.focus()},tE=async e=>{eW=null;let t=await H(n,e);eW=t?{kind:"error",action:e,text:t}:{kind:"save"===e?"saved":"published"},td()};eL.addEventListener("click",()=>tu(!eD)),x.addEventListener("click",()=>tu(!1)),eU.addEventListener("click",()=>{eH=!eH,td()}),eO.addEventListener("click",()=>n.signOut()),b.addEventListener("click",()=>tb(!e_)),E.addEventListener("click",()=>th(!0)),_.addEventListener("click",()=>th(!1)),T.addEventListener("click",()=>{tm()&&es.focus()}),ef.addEventListener("click",()=>{tm()&&e4()}),J.addEventListener("click",async()=>{eX=null,eX=await V(n,o),td()}),y.addEventListener("click",()=>tg("ask"===eq?"fields":"ask")),A.addEventListener("click",()=>{tv(!1),tg("fields"),e4()}),S.addEventListener("click",()=>{for(let e=e3();e;e=e3())tx(e,!1);tg("fields"),e4()}),ek.addEventListener("click",()=>{let e=n.getState().undoSteps,t=void 0===e?void 0:eK.find(t=>"kept"===t.status&&t.step===e);if(n.undo(),t){var r;t.status="undone",td(),r=`${o.undone}: ${t.summary}`,eN.textContent="",eN.textContent=r}ek.hidden&&es.focus()}),eE.addEventListener("click",()=>void tE("save")),eC.addEventListener("click",()=>void tE("publish")),eu.addEventListener("submit",e=>{e.preventDefault(),tk()}),es.addEventListener("input",()=>{tp(),td()}),es.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||e.isComposing||(e.preventDefault(),tk())}),ei.addEventListener("input",td),ei.addEventListener("keydown",e=>{"Enter"!==e.key||e.isComposing||(e.preventDefault(),es.focus())});let tC=e=>{"Escape"===e.key&&!e.defaultPrevented&&tf()&&e.preventDefault()};e.addEventListener("keydown",tC);let tA=e=>{let r=e.target,n=r?.closest?.(`[${t}]`),a=n?.getAttribute(t)??null;a!==eZ&&(eZ=a,tr())},tN=()=>{eZ=null,tr()};e.addEventListener("pointerover",tA),l.addEventListener("pointerleave",tN),s?.addEventListener("scroll",tr,{capture:!0,passive:!0}),s?.addEventListener("resize",tr);let tS=s?.MutationObserver,tL="function"==typeof tS?new tS(tr):null;tL?.observe(e.body,{childList:!0,subtree:!0});let tP=s?.ResizeObserver,t$="function"==typeof tP?new tP(tr):null;t$?.observe(l);let tM=s?.matchMedia?.("(min-width: 768px)")??null;eJ=tM?.matches??!0;let tU=()=>{eJ=tM?.matches??!0,td()};tM?.addEventListener?.("change",tU);let tz=n.on("change",tl);return l.setAttribute("data-obelism-editor",""),e.head.appendChild(u),e.body.appendChild(p),td(),()=>{e1=!0,tz(),e2.unmount(),null!==tt&&s?.cancelAnimationFrame?.(tt),e.removeEventListener("keydown",tC),e.removeEventListener("pointerover",tA),l.removeEventListener("pointerleave",tN),s?.removeEventListener("scroll",tr,{capture:!0}),s?.removeEventListener("resize",tr),tM?.removeEventListener?.("change",tU),tL?.disconnect(),t$?.disconnect(),n.setSelecting(!1),l.removeAttribute("data-obelism-editor"),l.removeAttribute("data-obelism-docked"),l.style.removeProperty("--obelism-dock"),u.remove(),p.remove()}},ea=Symbol.for("@obelism/content/bridge"),ei=S({isEditing:!1,entryId:null,on:()=>{}},new URLSearchParams),eo=({url:e,prompt:o=!0,pagePath:l,productPath:d,collectionPath:p}={})=>{let u;if("u"<typeof window)return ei;let g=window;if(g[ea])return g[ea];if(g.ObelismBridge)u=S(g.ObelismBridge,new URLSearchParams(g.location.search));else{let f=(u=((e,r)=>{let n,a,o,s,l,d=new URLSearchParams(e.location.search),p=e.parent!==e&&d.has("cms_preview"),u=y(),g=[],f={...x,selecting:!0},w=e=>{f={...f,...e},u.emit("change",f)},k={isEditing:p,mode:p?"editor":null,entryId:d.get("cms_entry"),environment:d.get(i),product:null,collection:null,on:u.on,getState:()=>f,...E,destroy:()=>{g.splice(0).forEach(e=>e())}};if(!p)return k;let C=e.document,S=(t,n={})=>{e.parent.postMessage({source:m,type:t,...n},r)},L=C.createElement("style");L.textContent=v(),C.head.appendChild(L),g.push(()=>L.remove());let P=(e,t)=>{if(C.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),f.selectedUid!==(e??null)&&w({selectedUid:e??null}),!e)return;let r=C.querySelector(N(e));r&&(r.setAttribute("data-cms-selected",""),t&&r.scrollIntoView({behavior:"smooth",block:"center"}))},$=e=>{let r=e.target,n=r?.closest?.(`[${t}]`);if(!n)return;e.preventDefault(),e.stopPropagation();let a=n.getAttribute(t);P(a,!1),S("select",{uid:a})};C.addEventListener("click",$,!0),g.push(()=>C.removeEventListener("click",$,!0));let M=()=>Math.ceil(Math.max(C.documentElement.scrollHeight,C.body?.scrollHeight??0)),U=0,z=()=>{U=M(),S("ready",{url:e.location.href,height:U})},O=e.ResizeObserver;if("function"==typeof O){let e=new O(()=>{let e=M();e!==U&&(U=e,S("size",{height:e}))});e.observe(C.documentElement),C.body&&e.observe(C.body),g.push(()=>e.disconnect())}let I=new Map,j=0,T=e=>{let t=I.get(e);return t?(clearTimeout(t.timer),I.delete(e),0===I.size&&w({prompting:!1}),t):null};k.prompt=(e,t={})=>{let r=e.trim();if(!r)return Promise.reject(Error("Say what to change"));if(!f.features.includes("prompt"))return Promise.reject(Error("The editor does not offer prompts here"));let n=`prompt_${++j}`,a=void 0===t.uid?f.selectedUid:t.uid;return new Promise((e,t)=>{let i=setTimeout(()=>{T(n)?.reject(Error("The editor did not answer in time"))},12e4);I.set(n,{resolve:e,reject:t,timer:i}),w({prompting:!0}),S("prompt",{id:n,prompt:r,uid:a})})},k.undo=()=>S("undo"),k.select=e=>{P(e,!1),S("select",{uid:e})};let R=null;g.push(()=>R?.destroy()),g.push(()=>{for(let e of I.keys())T(e)?.reject(Error("The bridge was destroyed"))});let D=(n=new WeakSet,a=null,o=null,s=!1,l=()=>{if(null!==a){for(let e of Array.from(C.styleSheets)){let t;if(!n.has(e)){try{t=e.cssRules}catch{continue}n.add(e),b(t,a)}}C.querySelectorAll('[style*="vh"]').forEach(e=>{h(e.style,a)})}},{freeze(e){if(null!==a||!(e>0))return;a=e,l();let t=C.defaultView?.MutationObserver;t&&(o=new t(()=>{if(s)return;s=!0;let e=()=>{s=!1,l()};C.defaultView?.requestAnimationFrame?C.defaultView.requestAnimationFrame(e):e()})).observe(C.documentElement,{childList:!0,subtree:!0})},destroy(){o?.disconnect()}});g.push(()=>D.destroy());let q=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)z();else if("update"===n.type&&n.entry)u.emit("update",{entry:n.entry,selectedUid:n.selectedUid??null}),e.requestAnimationFrame(()=>P(n.selectedUid,!1)),R?.refresh();else if("select"===n.type)P(n.uid,!0);else if("saved"===n.type||"published"===n.type)u.emit(n.type,{}),0===u.listeners.update.size&&e.location.reload();else if("features"===n.type&&Array.isArray(n.features))w({features:n.features.filter(e=>"string"==typeof e)});else if("stats"===n.type)w({stats:A(n.stats),statsVisible:!1!==n.visible}),(R||Object.keys(f.stats).length)&&(R??(R=c(e,{selector:N,onSelect:e=>k.select(e)})),R.update(f.stats,f.statsVisible));else if("viewport"===n.type&&"number"==typeof n.height)D.freeze(n.height);else if("promptState"===n.type)w({canUndo:!0===n.canUndo});else if("promptResult"===n.type&&"string"==typeof n.id){let e=T(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",q),g.push(()=>e.removeEventListener("message",q)),"loading"===C.readyState?(C.addEventListener("DOMContentLoaded",z,{once:!0}),g.push(()=>C.removeEventListener("DOMContentLoaded",z))):z(),k})(g,new URL(e||X).origin)).isEditing||g.parent!==g?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 K.test(e)?e:null}catch{break}}return null})(g.document);if(f&&(u=((e,i,{pagePath:o=e=>`/${e.replace(/^\/+/,"")}`,productPath:l,collectionPath:d}={})=>{let p=e.document,u=y(),g=[],h=new Map,b=[],f=new Set,w=null,k=null,E=-1/0,C=new Map,S=x,L=e=>{S={...S,...e},u.emit("change",S)},P=()=>L({unsaved:[...h.values()].some(({content:e,saved:t})=>!Z(e,t)),canUndo:b.length>0,undoSteps:b.length}),$=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 L({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},M=()=>p.querySelector(`[${r}]`)?.getAttribute(r)??null,U=()=>{let e=p.querySelector(`[${n}]`),t=e?.getAttribute(n),r=e?.getAttribute("data-cms-product-handle");return t&&r?{id:t,handle:r}:null},z=()=>{let e=p.querySelector(`[${a}]`),t=e?.getAttribute(a),r=e?.getAttribute("data-cms-collection-handle");return t&&r?{id:t,handle:r}:null},O=e=>{let t=e?p.querySelector(N(e)):null;return t?.closest(`[${r}]`)?.getAttribute(r)??M()},I=()=>{if(!w)return;let e=w.space.locales.map(({code:e})=>e),t=p.documentElement.lang;if(e.includes(t))return t;let r=t.split("-")[0]??"";return e.includes(r)?r:w.space.defaultLocale},j=new Map,T=async e=>{let t=h.get(e);if(t)return t;let r=j.get(e);return r||(r=$(`entries/${encodeURIComponent(e)}`).then(t=>{let r=h.get(e)??{content:t.content,saved:t.content,revision:t.draftRevision};return h.set(e,r),r}).finally(()=>j.delete(e)),j.set(e,r)),r},R=e=>{let t=void 0===e?S.selectedUid:e,r=O(t);if(!r)throw Error("Nothing on this page is marked as an entry: add editable(entry)");return{uid:t,entryId:r}},D=new Set,q=null,F=new Set,B=new Set,V=e=>{p.querySelectorAll("[data-cms-selected]").forEach(e=>{e.removeAttribute("data-cms-selected")}),S.selectedUid!==e&&L({selectedUid:e}),e&&(p.querySelector(N(e))?.setAttribute("data-cms-selected",""),D.has(e)||(D.add(e),q?.refresh()))},H=async t=>{if(0===u.listeners.update.size)return;let r=h.get(t)?.content,{entry:n}=await $(`entries/${encodeURIComponent(t)}/preview`,{content:r,locale:I()});u.emit("update",{entry:n,selectedUid:S.selectedUid}),e.requestAnimationFrame(()=>V(S.selectedUid))},_=e=>console.error("[@obelism/content bridge]",e),W=t=>{u.emit(t,{}),0===u.listeners.update.size&&e.location.reload()},Y=async()=>{for(let[e,t]of h){if(Z(t.content,t.saved))continue;let{draftRevision:r}=await $(`entries/${encodeURIComponent(e)}/save`,{content:t.content,baseRevision:t.revision});t.saved=t.content,t.revision=r,f.add(e)}b.length=0,E=-1/0,P()},X={isEditing:!0,mode:"site",get entryId(){return M()},get product(){return U()},get collection(){return z()},get environment(){return w?.environment??null},on:u.on,getState:()=>S,async prompt(e,t={}){let r=e.trim();if(!r)throw Error("Say what to change");if(!S.features.includes("prompt"))throw Error("You may not edit content here");let{uid:n,entryId:a}=R(t.uid);L({prompting:!0});try{let e=await T(a),t=await $(`entries/${encodeURIComponent(a)}/prompt`,{prompt:r,content:e.content,locale:I(),uid:n});return b.push({entryId:a,content:e.content}),E=-1/0,e.content=t.content,P(),await H(a),{summary:t.summary}}finally{L({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(!S.features.includes("create"))throw Error("You may not add pages here");if(S.unsaved)throw Error("Save or undo your changes before adding a page");L({prompting:!0});try{let r=await $("entries",{path:t,prompt:n,locale:I(),from:M()}),a=o(r.path,I()??"");return e.location.assign(J(a)),{summary:r.summary,entryId:r.entryId,path:r.path,url:a}}finally{L({prompting:!1})}},async createProductPage(t=U()??void 0){if(!t)throw Error("Nothing on this page is marked as a product: add editableProduct(product)");if(!S.features.includes("create"))throw Error("You may not add pages here");if(S.unsaved)throw Error("Save or undo your changes before adding a page");L({prompting:!0});try{let r=await $("product-pages",{product:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{L({prompting:!1})}},async createCollectionPage(t=z()??void 0){if(!t)throw Error("Nothing on this page is marked as a collection: add editableCollection(collection)");if(!S.features.includes("create"))throw Error("You may not add pages here");if(S.unsaved)throw Error("Save or undo your changes before adding a page");L({prompting:!0});try{let r=await $("collection-pages",{collection:{id:t.id,handle:t.handle}});return e.location.reload(),r}finally{L({prompting:!1})}},async view(e={}){let{uid:t,entryId:r}=R(e.uid),n=await T(r),{view:a}=await $(`entries/${encodeURIComponent(r)}/view`,{content:n.content,locale:I(),uid:t});return a},async applyJson(e,t={}){if(!S.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}=R(t.uid);L({prompting:!0});try{let t=await T(n),a=await $(`entries/${encodeURIComponent(n)}/apply`,{changes:e,content:t.content,locale:I(),uid:r});return Z(a.content,t.content)||(b.push({entryId:n,content:t.content}),E=-1/0,t.content=a.content,P(),await H(n)),{changed:a.changed??[],...a.view&&{view:a.view}}}finally{L({prompting:!1})}},openForm(t,r={}){let{title:n="Content form",onReady:a,onError:i,onEscape:o}=r;k?.();let s=!1,l=null,d=null,p=()=>{},c=e=>{s||i?.(e instanceof Error?e.message:String(e))},g=()=>{s||(s=!0,p(),l?.destroy(),k===g&&(k=null))};k=g;let f=()=>{if(s||!l)return;let e=O(S.selectedUid);if(!e)return;let t=h.get(e);if(!t)return void T(e).then(f,c);let r={entryId:e,content:t.content,locale:I(),selectedUid:S.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:h.get(r);if(s||void 0===r||!n||Z(e,n.content))return;let a=Date.now();a-E>=1e3&&b.push({entryId:r,content:n.content}),E=a,n.content=e,d?.entryId===r&&(d={...d,content:e}),P(),clearTimeout(C.get(r)),C.set(r,setTimeout(()=>{C.delete(r),H(r).catch(_)},300))};return(async()=>{if(!S.features.includes("form"))throw Error("You may not edit content here");await T(R(void 0).entryId);let{url:r}=await $("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:m,type:"content",...p},o)},u=setTimeout(()=>{d||a.onError("The form did not open")},3e4),g=()=>{d=!0,clearTimeout(u),a.onReady()},h=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",h),t.appendChild(s),{show(e){p=e,c()},destroy(){clearTimeout(u),e.removeEventListener("message",h),s.remove()}}})(e,t,"string"==typeof r?r:"",n,{onReady:()=>a?.(),onChange:v,onError:e=>i?.(e),onEscape:()=>o?.()}),p=u.on("change",f),f())})().catch(c),{close:g}},async pages(){let{pages:e}=await $("pages"),t=[I(),w?.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,l?l(r,a):(w?.productPath??"/products/{handle}").replaceAll("{handle}",encodeURIComponent(r))):e.collection?(n=e.collection.handle,d?d(n,a):(w?.collectionPath??"/collections/{handle}").replaceAll("{handle}",encodeURIComponent(n))):o(i,a),product:e.product??null,collection:e.collection??null}]})},openPage(t){(!S.unsaved||e.confirm("Leave this page and lose the changes you have not saved?"))&&(h.clear(),b.length=0,P(),e.location.assign(J(t.url)))},undo(){let e=b.pop(),t=e&&h.get(e.entryId);e&&t&&(E=-1/0,t.content=e.content,P(),H(e.entryId).catch(_))},async save(){if(!S.features.includes("save"))throw Error("You may not edit content here");L({saving:!0});try{await Y()}finally{L({saving:!1})}W("saved")},async publish(){if(!S.features.includes("publish"))throw Error("You may not publish here");L({publishing:!0});try{await Y();let e=M(),t=f.size>0?[...f]: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 $(`entries/${encodeURIComponent(e)}/publish`,{}),f.delete(e)}finally{L({publishing:!1})}W("published")},signOut(){if(S.unsaved&&!e.confirm("Sign out and lose the changes you have not saved?"))return;h.clear(),P();let t=e.location.pathname+e.location.search;e.location.href=`${i}/logout?return_to=${encodeURIComponent(t)}`},select(e){V(e)},setSelecting(e){e?p.documentElement.setAttribute("data-cms-selecting",""):p.documentElement.removeAttribute("data-cms-selecting"),L({selecting:e,statsVisible:e}),er()},destroy(){k?.(),C.forEach(e=>clearTimeout(e)),C.clear(),g.splice(0).forEach(e=>e())}},K=p.createElement("style");K.textContent=v("html[data-cms-selecting] "),p.head.appendChild(K),g.push(()=>K.remove()),g.push(()=>p.documentElement.removeAttribute("data-cms-selecting"));let G=e=>{if(!S.selecting)return;let r=e.target,n=r?.closest?.(`[${t}]`),a=n?null:r?.closest?.(`[${s}]`),i=a?.getAttribute(s);if(i&&B.has(i)){e.preventDefault(),e.stopPropagation(),D.has(i)||(D.add(i),q?.refresh());return}n&&(e.preventDefault(),e.stopPropagation(),V(n.getAttribute(t)))};p.addEventListener("click",G,!0),g.push(()=>p.removeEventListener("click",G,!0));let Q=e=>{S.unsaved&&(e.preventDefault(),e.returnValue="")};e.addEventListener("beforeunload",Q),g.push(()=>e.removeEventListener("beforeunload",Q));let ee=!1,et=null,er=()=>q?.update(S.stats,S.statsVisible),en=async()=>{if(ee)return;let n=[...new Set([...p.querySelectorAll(`[${s}]`)].map(e=>e.getAttribute(s)??""))].filter(e=>e&&!F.has(e)),a=n.slice(0,500);if(!a.length)return;a.forEach(e=>F.add(e));let i=[...new Set([...p.querySelectorAll(`[${r}]`)].map(e=>e.getAttribute(r)??""))].filter(Boolean).slice(0,20);try{let{stats:e}=await $("stats",{uids:a,...i.length>0&&{entries:i}});a.forEach(e=>B.add(e)),L({stats:{...S.stats,...A(e)}})}catch{ee=!0;return}q??(q=c(e,{selector:N,onSelect:e=>V(e),checked:e=>B.has(e),shows:(e,r)=>D.has(r.closest(`[${t}]`)?.getAttribute(t)??e)})),er(),n.length>a.length&&ea()},ea=()=>{null!==et||ee||(et=setTimeout(()=>{et=null,en()},1e3))},ei=e.MutationObserver,eo="function"==typeof ei?new ei(ea):null;return g.push(()=>{eo?.disconnect(),null!==et&&clearTimeout(et),q?.destroy()}),$("session").then(e=>{w=e,L({features:e.features}),en(),eo?.observe(p.body,{childList:!0,subtree:!0})}).catch(e=>console.error("[@obelism/content bridge]",e)),X})(g,f,{pagePath:l,productPath:d,collectionPath:p})),u.isEditing&&o){let e=g.document,t=()=>{},r=!1,n=f?en:Y,a=()=>{r||(t=n(e,u,!0===o?{}:o))};e.body?a():e.addEventListener("DOMContentLoaded",a,{once:!0});let i=u.destroy;u.destroy=()=>{r=!0,e.removeEventListener("DOMContentLoaded",a),t(),i()}}}return g[ea]=u,u};(e=window).ObelismBridge=eo((e=>{let t=e?.dataset.url,r=t||X;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:eo,mountPromptBox:Y,mountSiteEditor:en}}();
|
package/dist/bridge.js
CHANGED
|
@@ -79,7 +79,7 @@ const placeTag = (rect, viewport)=>({
|
|
|
79
79
|
top: Math.min(Math.max(rect.top, 10), viewport.height - 10),
|
|
80
80
|
left: Math.min(rect.right, viewport.width - 10)
|
|
81
81
|
});
|
|
82
|
-
const mountStatsOverlay = (win, { selector, onSelect, checked, labels: labelOverrides })=>{
|
|
82
|
+
const mountStatsOverlay = (win, { selector, onSelect, checked, shows, labels: labelOverrides })=>{
|
|
83
83
|
const doc = win.document;
|
|
84
84
|
const labels = {
|
|
85
85
|
...DEFAULT_STATS_LABELS,
|
|
@@ -157,13 +157,14 @@ const mountStatsOverlay = (win, { selector, onSelect, checked, labels: labelOver
|
|
|
157
157
|
const id = element.getAttribute(TAG_ATTRIBUTE);
|
|
158
158
|
if (!id || !stats[id] && !isChecked(id)) continue;
|
|
159
159
|
tagged.add(id);
|
|
160
|
+
if (shows && !shows(id, element)) continue;
|
|
160
161
|
draw(id, element, blocks);
|
|
161
162
|
}
|
|
162
163
|
// Rates of blocks the site doesn't tag an element of.
|
|
163
164
|
for (const id of Object.keys(stats)){
|
|
164
165
|
if (tagged.has(id) || !blocks.has(id)) continue;
|
|
165
166
|
const element = doc.querySelector(selector(id));
|
|
166
|
-
if (element) draw(id, element, blocks);
|
|
167
|
+
if (element && (!shows || shows(id, element))) draw(id, element, blocks);
|
|
167
168
|
}
|
|
168
169
|
};
|
|
169
170
|
// At most once a frame, however many scroll and mutation events come in.
|
|
@@ -2155,6 +2156,13 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2155
2156
|
entryId
|
|
2156
2157
|
};
|
|
2157
2158
|
};
|
|
2159
|
+
// The blocks selected on this page, and the tags clicked outside the
|
|
2160
|
+
// blocks: only their rates show (statsOverlay.ts), so a few can be
|
|
2161
|
+
// compared without every tag at once.
|
|
2162
|
+
const revealed = new Set();
|
|
2163
|
+
let overlay = null;
|
|
2164
|
+
const asked = new Set();
|
|
2165
|
+
const answered = new Set();
|
|
2158
2166
|
const highlight = (uid)=>{
|
|
2159
2167
|
doc.querySelectorAll('[data-cms-selected]').forEach((element)=>{
|
|
2160
2168
|
element.removeAttribute('data-cms-selected');
|
|
@@ -2162,7 +2170,13 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2162
2170
|
if (state.selectedUid !== uid) setState({
|
|
2163
2171
|
selectedUid: uid
|
|
2164
2172
|
});
|
|
2165
|
-
if (uid)
|
|
2173
|
+
if (uid) {
|
|
2174
|
+
doc.querySelector(blockSelector(uid))?.setAttribute('data-cms-selected', '');
|
|
2175
|
+
if (!revealed.has(uid)) {
|
|
2176
|
+
revealed.add(uid);
|
|
2177
|
+
overlay?.refresh();
|
|
2178
|
+
}
|
|
2179
|
+
}
|
|
2166
2180
|
};
|
|
2167
2181
|
// Shows the in-memory content through `update`, shaped like the delivery
|
|
2168
2182
|
// API. A page without `update` listeners shows it once saved (it reloads).
|
|
@@ -2607,6 +2621,19 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2607
2621
|
if (!state.selecting) return;
|
|
2608
2622
|
const target = event.target;
|
|
2609
2623
|
const element = target?.closest?.(`[${preview.UID_ATTRIBUTE}]`);
|
|
2624
|
+
// A tagged element outside the blocks (a menu button) can't be
|
|
2625
|
+
// selected: a click shows its rate, when the CMS answered for it.
|
|
2626
|
+
const tag = element ? null : target?.closest?.(`[${TAG_ATTRIBUTE}]`);
|
|
2627
|
+
const tagId = tag?.getAttribute(TAG_ATTRIBUTE);
|
|
2628
|
+
if (tagId && answered.has(tagId)) {
|
|
2629
|
+
event.preventDefault();
|
|
2630
|
+
event.stopPropagation();
|
|
2631
|
+
if (!revealed.has(tagId)) {
|
|
2632
|
+
revealed.add(tagId);
|
|
2633
|
+
overlay?.refresh();
|
|
2634
|
+
}
|
|
2635
|
+
return;
|
|
2636
|
+
}
|
|
2610
2637
|
if (!element) return;
|
|
2611
2638
|
event.preventDefault();
|
|
2612
2639
|
event.stopPropagation();
|
|
@@ -2621,12 +2648,10 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2621
2648
|
};
|
|
2622
2649
|
win.addEventListener('beforeunload', onBeforeUnload);
|
|
2623
2650
|
cleanup.push(()=>win.removeEventListener('beforeunload', onBeforeUnload));
|
|
2624
|
-
// The tags on the page's links (statsOverlay.ts)
|
|
2625
|
-
// outlined: the rates of the ids the page tags, asked for
|
|
2626
|
-
|
|
2627
|
-
const answered = new Set();
|
|
2651
|
+
// The tags on the page's links (statsOverlay.ts) of what was selected,
|
|
2652
|
+
// while blocks are outlined: the rates of the ids the page tags, asked for
|
|
2653
|
+
// as they appear.
|
|
2628
2654
|
let statsOff = false;
|
|
2629
|
-
let overlay = null;
|
|
2630
2655
|
let statsTimer = null;
|
|
2631
2656
|
const showStats = ()=>overlay?.update(state.stats, state.statsVisible);
|
|
2632
2657
|
const loadStats = async ()=>{
|
|
@@ -2667,7 +2692,8 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2667
2692
|
overlay ??= mountStatsOverlay(win, {
|
|
2668
2693
|
selector: blockSelector,
|
|
2669
2694
|
onSelect: (uid)=>highlight(uid),
|
|
2670
|
-
checked: (id)=>answered.has(id)
|
|
2695
|
+
checked: (id)=>answered.has(id),
|
|
2696
|
+
shows: (id, element)=>revealed.has(element.closest(`[${preview.UID_ATTRIBUTE}]`)?.getAttribute(preview.UID_ATTRIBUTE) ?? id)
|
|
2671
2697
|
});
|
|
2672
2698
|
showStats();
|
|
2673
2699
|
if (ids.length > batch.length) scheduleStats();
|
package/dist/bridge.mjs
CHANGED
|
@@ -77,7 +77,7 @@ const placeTag = (rect, viewport)=>({
|
|
|
77
77
|
top: Math.min(Math.max(rect.top, 10), viewport.height - 10),
|
|
78
78
|
left: Math.min(rect.right, viewport.width - 10)
|
|
79
79
|
});
|
|
80
|
-
const mountStatsOverlay = (win, { selector, onSelect, checked, labels: labelOverrides })=>{
|
|
80
|
+
const mountStatsOverlay = (win, { selector, onSelect, checked, shows, labels: labelOverrides })=>{
|
|
81
81
|
const doc = win.document;
|
|
82
82
|
const labels = {
|
|
83
83
|
...DEFAULT_STATS_LABELS,
|
|
@@ -155,13 +155,14 @@ const mountStatsOverlay = (win, { selector, onSelect, checked, labels: labelOver
|
|
|
155
155
|
const id = element.getAttribute(TAG_ATTRIBUTE);
|
|
156
156
|
if (!id || !stats[id] && !isChecked(id)) continue;
|
|
157
157
|
tagged.add(id);
|
|
158
|
+
if (shows && !shows(id, element)) continue;
|
|
158
159
|
draw(id, element, blocks);
|
|
159
160
|
}
|
|
160
161
|
// Rates of blocks the site doesn't tag an element of.
|
|
161
162
|
for (const id of Object.keys(stats)){
|
|
162
163
|
if (tagged.has(id) || !blocks.has(id)) continue;
|
|
163
164
|
const element = doc.querySelector(selector(id));
|
|
164
|
-
if (element) draw(id, element, blocks);
|
|
165
|
+
if (element && (!shows || shows(id, element))) draw(id, element, blocks);
|
|
165
166
|
}
|
|
166
167
|
};
|
|
167
168
|
// At most once a frame, however many scroll and mutation events come in.
|
|
@@ -2153,6 +2154,13 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2153
2154
|
entryId
|
|
2154
2155
|
};
|
|
2155
2156
|
};
|
|
2157
|
+
// The blocks selected on this page, and the tags clicked outside the
|
|
2158
|
+
// blocks: only their rates show (statsOverlay.ts), so a few can be
|
|
2159
|
+
// compared without every tag at once.
|
|
2160
|
+
const revealed = new Set();
|
|
2161
|
+
let overlay = null;
|
|
2162
|
+
const asked = new Set();
|
|
2163
|
+
const answered = new Set();
|
|
2156
2164
|
const highlight = (uid)=>{
|
|
2157
2165
|
doc.querySelectorAll('[data-cms-selected]').forEach((element)=>{
|
|
2158
2166
|
element.removeAttribute('data-cms-selected');
|
|
@@ -2160,7 +2168,13 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2160
2168
|
if (state.selectedUid !== uid) setState({
|
|
2161
2169
|
selectedUid: uid
|
|
2162
2170
|
});
|
|
2163
|
-
if (uid)
|
|
2171
|
+
if (uid) {
|
|
2172
|
+
doc.querySelector(blockSelector(uid))?.setAttribute('data-cms-selected', '');
|
|
2173
|
+
if (!revealed.has(uid)) {
|
|
2174
|
+
revealed.add(uid);
|
|
2175
|
+
overlay?.refresh();
|
|
2176
|
+
}
|
|
2177
|
+
}
|
|
2164
2178
|
};
|
|
2165
2179
|
// Shows the in-memory content through `update`, shaped like the delivery
|
|
2166
2180
|
// API. A page without `update` listeners shows it once saved (it reloads).
|
|
@@ -2605,6 +2619,19 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2605
2619
|
if (!state.selecting) return;
|
|
2606
2620
|
const target = event.target;
|
|
2607
2621
|
const element = target?.closest?.(`[${UID_ATTRIBUTE}]`);
|
|
2622
|
+
// A tagged element outside the blocks (a menu button) can't be
|
|
2623
|
+
// selected: a click shows its rate, when the CMS answered for it.
|
|
2624
|
+
const tag = element ? null : target?.closest?.(`[${TAG_ATTRIBUTE}]`);
|
|
2625
|
+
const tagId = tag?.getAttribute(TAG_ATTRIBUTE);
|
|
2626
|
+
if (tagId && answered.has(tagId)) {
|
|
2627
|
+
event.preventDefault();
|
|
2628
|
+
event.stopPropagation();
|
|
2629
|
+
if (!revealed.has(tagId)) {
|
|
2630
|
+
revealed.add(tagId);
|
|
2631
|
+
overlay?.refresh();
|
|
2632
|
+
}
|
|
2633
|
+
return;
|
|
2634
|
+
}
|
|
2608
2635
|
if (!element) return;
|
|
2609
2636
|
event.preventDefault();
|
|
2610
2637
|
event.stopPropagation();
|
|
@@ -2619,12 +2646,10 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2619
2646
|
};
|
|
2620
2647
|
win.addEventListener('beforeunload', onBeforeUnload);
|
|
2621
2648
|
cleanup.push(()=>win.removeEventListener('beforeunload', onBeforeUnload));
|
|
2622
|
-
// The tags on the page's links (statsOverlay.ts)
|
|
2623
|
-
// outlined: the rates of the ids the page tags, asked for
|
|
2624
|
-
|
|
2625
|
-
const answered = new Set();
|
|
2649
|
+
// The tags on the page's links (statsOverlay.ts) of what was selected,
|
|
2650
|
+
// while blocks are outlined: the rates of the ids the page tags, asked for
|
|
2651
|
+
// as they appear.
|
|
2626
2652
|
let statsOff = false;
|
|
2627
|
-
let overlay = null;
|
|
2628
2653
|
let statsTimer = null;
|
|
2629
2654
|
const showStats = ()=>overlay?.update(state.stats, state.statsVisible);
|
|
2630
2655
|
const loadStats = async ()=>{
|
|
@@ -2665,7 +2690,8 @@ const createSiteBridge = (win, basePath, { pagePath = (path)=>`/${path.replace(/
|
|
|
2665
2690
|
overlay ??= mountStatsOverlay(win, {
|
|
2666
2691
|
selector: blockSelector,
|
|
2667
2692
|
onSelect: (uid)=>highlight(uid),
|
|
2668
|
-
checked: (id)=>answered.has(id)
|
|
2693
|
+
checked: (id)=>answered.has(id),
|
|
2694
|
+
shows: (id, element)=>revealed.has(element.closest(`[${UID_ATTRIBUTE}]`)?.getAttribute(UID_ATTRIBUTE) ?? id)
|
|
2669
2695
|
});
|
|
2670
2696
|
showStats();
|
|
2671
2697
|
if (ids.length > batch.length) scheduleStats();
|
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.28.
|
|
4
|
+
"version": "0.28.3",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cms",
|
|
7
7
|
"headless-cms",
|