@brightsideoy/kama 1.0.0-alpha.19 → 1.0.0-alpha.20

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.
@@ -65,5 +65,11 @@ fields:
65
65
  - tree
66
66
  - node
67
67
 
68
+ sortBy:
69
+ label: Sort by
70
+ type: node-sort
71
+ default: updatedAt_desc
72
+ public: true
73
+
68
74
  tabs:
69
75
  access: !include ../field-sets/access.yaml
@@ -1 +1 @@
1
- import{$ as e,B as t,E as n,Et as r,I as i,K as a,O as o,R as s,S as c,St as ee,T as l,Y as u,b as d,f,g as p,j as m,lt as h,o as g,q as _,t as v,tt as y,v as b,x,y as S}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{i as te}from"./useNodes-W5j_uxdQ.js";import{d as ne,s as re}from"./schema-helpers-1UXlO0Ye.js";import{a as ie,i as ae,n as oe,o as se,r as ce,t as C}from"./CmsImagePreview-DuHPBzml.js";import{n as w,t as le}from"./NodeContextMenu-C_HWBGeb.js";import{n as ue,t as T}from"./trash-2-CAUF1KtI.js";import{t as de}from"./layers-B6RgfpPR.js";import{t as fe}from"./panel-left-close-CVFakVaA.js";import{t as pe}from"./save-Ctv8vW9H.js";import{t as E}from"./CmsButton-CbOfxvjr.js";import{t as D}from"./CmsDataRow--H4iI_u_.js";import{t as O}from"./CmsBadge-D0Ob9qPU.js";m(),h(),u(),g();var me={class:`asset-editor-wrapper canvas`},he={class:`entity-header`},k={class:`top-row`},A={class:`node-info`},j={class:`dynamic-title-group`},M={class:`inline-title-input`},N={key:0},P={key:1},F={class:`meta-row`},I={key:0,class:`slug-badge`},L={class:`actions-group`},R={class:`btn-text`},ge={class:`editor-body`},_e={key:0,class:`loading-state`},ve={key:1,class:`asset-content-scroll`},ye={class:`main-preview-section`},be={key:1,class:`doc-preview`},xe={class:`preview-footer`},Se=[`href`],Ce={class:`data-column`},we={class:`data-header`},Te={class:`data-content`},Ee={class:`form-group`},De={class:`form-group`},Oe={class:`form-group`},ke={class:`usage-and-crops-section`},Ae={class:`usage-section-container`},je={class:`gallery-header-row`},Me={key:0,class:`usage-empty standalone-empty`},Ne={key:1,class:`list-container`},Pe={class:`node-title`},Fe={class:`meta-stack`},Ie={class:`node-field`},Le={key:0,class:`crop-showcase`},Re={class:`crop-name`},ze={key:0,class:`usage-section-container`,style:{"margin-top":`40px`}},Be={class:`gallery-header-row`},Ve={class:`list-container`},He={class:`meta-stack`},Ue={class:`node-field`},We={key:0,class:`crop-showcase`},Ge={class:`crop-item`},Ke={class:`crop-name`},qe=[`onClick`],z=v(o({__name:`AssetEditor`,props:{assetId:{}},setup(o){let u=o,{activeView:m,nodeSchemas:h}=re(),{confirmDiscard:g}=ne(),{navigateToNodeById:v}=te(),z=e(null),B=e(!0),V=e(!1),H=e({filename:``,title:``,alt:``}),U=e({filename:``,title:``,alt:``}),W=e(!1),G=e(null),K=e(null),Je=()=>{if(W.value){W.value=!1;return}G.value&&(K.value=G.value.getBoundingClientRect()),W.value=!0},Ye=b(()=>{let e=[{key:`copy-url`,label:`Copy Public URL`,icon:se},{key:`open-tab`,label:`Open in New Tab`,icon:w}];return z.value&&z.value.connectedNodes?.length>0&&(e.push({key:`div-nodes`,label:``,divider:!0}),e.push({key:`show-nodes`,label:`Connected Nodes (${z.value.connectedNodes.length})`,icon:oe})),e.push({key:`div-1`,label:``,divider:!0},{key:`delete`,label:`Delete Asset`,icon:T}),e}),Xe=async e=>{W.value=!1,z.value&&(e===`copy-url`&&z.value.url?await navigator.clipboard.writeText(z.value.url):e===`open-tab`&&z.value.url?window.open(z.value.url,`_blank`):e===`delete`?await g(`Are you sure you want to delete "${z.value.filename||`this asset`}"?`,`Delete Asset?`,`Delete`,`Cancel`)&&await Ze():e===`show-nodes`&&Y())},Ze=async()=>{try{(await fetch(`/api/admin/assets/${u.assetId}`,{method:`DELETE`})).ok&&(window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),m.value={type:`dashboard`})}catch{}},Qe=b(()=>H.value.filename!==U.value.filename||H.value.title!==U.value.title||H.value.alt!==U.value.alt),q=async()=>{B.value=!0;try{let e=await fetch(`/api/admin/assets/${u.assetId}/details`);if(e.ok){let t=await e.json();z.value=t;let n={filename:t.filename||``,title:t.title||``,alt:t.alt||``};H.value={...n},U.value={...n}}}catch{}finally{B.value=!1}},$e=async()=>{V.value=!0;try{(await fetch(`/api/admin/assets/${u.assetId}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(H.value)})).ok&&(U.value={...H.value},window.dispatchEvent(new CustomEvent(`cms-assets-updated`)))}catch{}finally{V.value=!1}},J=async e=>{let t=`Permanently delete orphaned crop "${z.value?.variants?.find(t=>String(t.id)===String(e))?.filename||`variant`}"?`;if(await g(t,`Delete Crop`,`Delete`,`Cancel`))try{(await fetch(`/api/admin/assets/purge/${e}`,{method:`DELETE`})).ok&&(z.value?.variants&&(z.value.variants=z.value.variants.filter(t=>String(t.id)!==String(e))),window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),await q())}catch{}},et=async()=>{let e=$.value;if(e.length===0)return;let t=`Are you sure you want to permanently delete all ${e.length} orphaned crops?`;if(await g(t,`Purge All Orphaned Crops`,`Purge All`,`Cancel`))try{for(let t of e)await fetch(`/api/admin/assets/purge/${t.id}`,{method:`DELETE`});window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),await q()}catch(e){console.error(`Failed to purge crops`,e)}},tt=e=>{m.value={type:`node`},v(String(e)),window.dispatchEvent(new CustomEvent(`cms-switch-sidebar-tab`,{detail:`vault`}))},Y=()=>{sessionStorage.setItem(`cms-vault-asset-filter`,u.assetId),window.dispatchEvent(new CustomEvent(`cms-filter-vault-by-asset`,{detail:u.assetId})),window.dispatchEvent(new CustomEvent(`cms-switch-sidebar-tab`,{detail:`vault`}))},X=b(()=>z.value&&(z.value.mimeType?.startsWith(`image/`)||/\.(jpg|jpeg|png|webp|gif|svg)$/i.test(z.value.filename))),Z=e=>{if(!e)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]},nt=(e,t)=>{if(!t||t===`Original`||t===`Unknown Crop`)return t||`Original Image`;try{let n=h.value[e];if(!n)return t;let r=null,i=e=>{if(!(!e||r))for(let n of Object.values(e))n.crop&&t===`standard`&&n.crop.label&&(r=n.crop.label),n.crops&&n.crops[t]&&n.crops[t].label&&(r=n.crops[t].label)};return i(n.fields),n.tabs&&Object.values(n.tabs).forEach(e=>i(e.fields)),r||t}catch{return t}},Q=b(()=>{if(!z.value||!z.value.connectedNodes)return[];let e=new Map;for(let t of z.value.connectedNodes){let n=String(t.id),r=t.contentType||t.nodeType,i=t.fieldKey?.split(`.`)[0]||`Content Area`,a=t.fieldKey?.match(/^blocks\[(\d+)\]/);a&&(i=`Block ${parseInt(a[1],10)+1}`);let o=String(t.assetId)!==String(z.value.id),s=null;if(o){let e=z.value.variants?.find(e=>String(e.id)===String(t.assetId));if(e){let n=`Unknown Crop`,i=t.fieldKey?.match(/\.variants\.([^.]+)/);if(i)n=i[1];else{let t=e.filename?.match(/^(.+?)_ast_/);t&&(n=t[1])}s={id:e.id,url:e.url,label:nt(r,n)}}}else s={id:z.value.id,url:z.value.url,label:`Original Image`};if(!e.has(n))e.set(n,{id:t.id,title:t.title,nodeType:r,fieldKeys:new Set([i]),usedAssets:s?[s]:[]});else{let t=e.get(n);t.fieldKeys.add(i),s&&!t.usedAssets.some(e=>e.id===s.id)&&t.usedAssets.push(s)}}return Array.from(e.values()).map(e=>({...e,fieldKey:Array.from(e.fieldKeys).join(`, `)}))}),$=b(()=>{if(!z.value||!z.value.variants)return[];let e=new Set(z.value.connectedNodes?.map(e=>String(e.assetId))||[]);return z.value.variants.filter(t=>!e.has(String(t.id)))}),rt=e=>{let t=e?.match(/^(.+?)_ast_/);return t?t[1]:`Unknown Crop`};return i(()=>q()),(e,i)=>(s(),c(`div`,me,[S(`header`,he,[S(`div`,k,[S(`div`,A,[S(`div`,j,[S(`span`,M,[z.value?(s(),c(`span`,N,r(z.value.filename),1)):(s(),c(`span`,P,`Loading Asset...`))])]),S(`div`,F,[z.value?(s(),c(`span`,I,r(Z(z.value.sizeBytes))+` • `+r(z.value.mimeType),1)):x(``,!0)])]),S(`div`,L,[z.value?(s(),c(`div`,{key:0,class:`context-wrapper`,ref_key:`contextTriggerRef`,ref:G},[n(E,{variant:`secondary`,title:`More Options`,onClick:Je,disabled:V.value,class:`transparent-btn icon-only-btn`},{default:a(()=>[n(y(ae),{size:16})]),_:1},8,[`disabled`]),n(le,{show:W.value,items:Ye.value,"anchor-rect":K.value,onSelect:Xe,onClose:i[0]||=e=>W.value=!1},null,8,[`show`,`items`,`anchor-rect`])],512)):x(``,!0),n(E,{variant:`primary`,class:`save-btn`,disabled:V.value||!Qe.value,onClick:$e},{default:a(()=>[n(y(pe),{size:14,class:`save-icon`}),S(`span`,R,r(V.value?`Saving...`:`Save Metadata`),1)]),_:1},8,[`disabled`])])])]),S(`div`,ge,[B.value?(s(),c(`div`,_e,`Loading asset details...`)):z.value?(s(),c(`div`,ve,[S(`div`,ye,[S(`div`,{class:ee([`preview-container`,{"is-doc":!X.value}])},[X.value?(s(),d(C,{key:0,url:z.value.url,alt:z.value.alt||z.value.filename,width:1200,quality:85,class:`main-preview-wrapper`},null,8,[`url`,`alt`])):(s(),c(`div`,be,[n(y(ue),{size:64}),i[4]||=S(`span`,null,`Preview not available for this file type`,-1)]))],2),S(`div`,xe,[S(`span`,null,`Original Upload: `+r(new Date(z.value.createdAt).toLocaleString()),1),S(`a`,{href:z.value.url,target:`_blank`,class:`ext-link`},[i[5]||=l(`Open original file `,-1),n(y(w),{size:12})],8,Se)])]),S(`div`,Ce,[S(`div`,we,[S(`h3`,null,[n(y(ce),{size:14,class:`inline-icon`}),i[6]||=l(` Metadata `,-1)])]),S(`div`,Te,[S(`div`,Ee,[i[7]||=S(`label`,null,`Filename`,-1),_(S(`input`,{"onUpdate:modelValue":i[1]||=e=>H.value.filename=e,type:`text`,class:`cms-input`},null,512),[[f,H.value.filename]]),i[8]||=S(`span`,{class:`help-text`},`Changing this does not break the permanent CDN link.`,-1)]),S(`div`,De,[i[9]||=S(`label`,null,`Title (Internal/SEO)`,-1),_(S(`input`,{"onUpdate:modelValue":i[2]||=e=>H.value.title=e,type:`text`,class:`cms-input`},null,512),[[f,H.value.title]])]),S(`div`,Oe,[i[10]||=S(`label`,null,`Alt Text (Accessibility)`,-1),_(S(`textarea`,{"onUpdate:modelValue":i[3]||=e=>H.value.alt=e,class:`cms-input cms-textarea`},null,512),[[f,H.value.alt]])])])]),S(`div`,ke,[S(`div`,Ae,[S(`div`,je,[S(`h3`,null,[n(y(de),{size:16,class:`inline-icon`}),i[11]||=l(` Node Usage `,-1)]),Q.value.length>0?(s(),c(`button`,{key:0,class:`action-btn outline`,onClick:Y,title:`Show these nodes in the left Vault pane`},[n(y(fe),{size:13}),i[12]||=l(` Vault Filter `,-1)])):x(``,!0)]),Q.value.length===0?(s(),c(`div`,Me,[...i[13]||=[S(`span`,{class:`status-dot warning`},null,-1),S(`span`,null,`Asset is not currently used on any nodes.`,-1)]])):(s(),c(`div`,Ne,[(s(!0),c(p,null,t(Q.value,e=>(s(),d(D,{key:e.id,clickable:``,onClick:t=>tt(e.id)},{title:a(()=>[i[14]||=S(`span`,{class:`status-dot success`},null,-1),S(`span`,Pe,r(e.title||`Untitled`),1),n(O,{variant:`type`},{default:a(()=>[l(r(e.nodeType||`page`),1)]),_:2},1024)]),meta:a(()=>[S(`div`,Fe,[S(`span`,Ie,`Used in field: `+r(e.fieldKey),1),X.value?(s(),c(`div`,Le,[(s(!0),c(p,null,t(e.usedAssets,e=>(s(),c(`div`,{key:e.id,class:`crop-item`},[n(C,{url:e.url,alt:e.label,width:200,quality:75,class:`crop-img-fixed-height`},null,8,[`url`,`alt`]),S(`span`,Re,r(e.label),1)]))),128))])):x(``,!0)])]),_:2},1032,[`onClick`]))),128))]))]),$.value.length>0?(s(),c(`div`,ze,[S(`div`,Be,[S(`h3`,null,[n(y(ie),{size:16,class:`inline-icon`}),l(` Orphaned Crops (`+r($.value.length)+`) `,1)]),S(`button`,{class:`action-btn outline text-danger`,onClick:et},[n(y(T),{size:13}),i[15]||=l(` Purge All `,-1)])]),i[18]||=S(`p`,{class:`gallery-desc`},`These crops were generated previously but are no longer attached to any nodes. You can safely delete them to save storage space.`,-1),S(`div`,Ve,[(s(!0),c(p,null,t($.value,e=>(s(),d(D,{key:e.id},{title:a(()=>[i[16]||=S(`span`,{class:`node-title`},`Orphaned Crop`,-1),n(O,{variant:`type`},{default:a(()=>[l(r(Z(e.sizeBytes)),1)]),_:2},1024)]),meta:a(()=>[S(`div`,He,[S(`span`,Ue,`Generated: `+r(new Date(e.createdAt).toLocaleDateString()),1),X.value?(s(),c(`div`,We,[S(`div`,Ge,[n(C,{url:e.url,alt:e.filename,width:200,quality:75,class:`crop-img-fixed-height`},null,8,[`url`,`alt`]),S(`span`,Ke,r(rt(e.filename)),1)])])):x(``,!0)])]),actions:a(()=>[S(`button`,{class:`action-btn outline text-danger`,style:{border:`none`},onClick:t=>J(e.id)},[n(y(T),{size:13}),i[17]||=l(` Purge `,-1)],8,qe)]),_:2},1024))),128))])])):x(``,!0)])])):x(``,!0)])]))}}),[[`__scopeId`,`data-v-cd1f3a28`]]);export{z as default};
1
+ import{$ as e,B as t,E as n,Et as r,I as i,K as a,O as o,R as s,S as c,St as ee,T as l,Y as u,b as d,f,g as p,j as m,lt as h,o as g,q as _,t as v,tt as y,v as b,x,y as S}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{i as te}from"./useNodes-D2-VxsxR.js";import{d as ne,s as re}from"./schema-helpers-DvficKko.js";import{a as ie,i as ae,n as oe,o as se,r as ce,t as C}from"./CmsImagePreview-DuHPBzml.js";import{n as w,t as le}from"./NodeContextMenu-C_HWBGeb.js";import{n as ue,t as T}from"./trash-2-CAUF1KtI.js";import{t as de}from"./layers-B6RgfpPR.js";import{t as fe}from"./panel-left-close-CVFakVaA.js";import{t as pe}from"./save-Ctv8vW9H.js";import{t as E}from"./CmsButton-CbOfxvjr.js";import{t as D}from"./CmsDataRow--H4iI_u_.js";import{t as O}from"./CmsBadge-D0Ob9qPU.js";m(),h(),u(),g();var me={class:`asset-editor-wrapper canvas`},he={class:`entity-header`},k={class:`top-row`},A={class:`node-info`},j={class:`dynamic-title-group`},M={class:`inline-title-input`},N={key:0},P={key:1},F={class:`meta-row`},I={key:0,class:`slug-badge`},L={class:`actions-group`},R={class:`btn-text`},ge={class:`editor-body`},_e={key:0,class:`loading-state`},ve={key:1,class:`asset-content-scroll`},ye={class:`main-preview-section`},be={key:1,class:`doc-preview`},xe={class:`preview-footer`},Se=[`href`],Ce={class:`data-column`},we={class:`data-header`},Te={class:`data-content`},Ee={class:`form-group`},De={class:`form-group`},Oe={class:`form-group`},ke={class:`usage-and-crops-section`},Ae={class:`usage-section-container`},je={class:`gallery-header-row`},Me={key:0,class:`usage-empty standalone-empty`},Ne={key:1,class:`list-container`},Pe={class:`node-title`},Fe={class:`meta-stack`},Ie={class:`node-field`},Le={key:0,class:`crop-showcase`},Re={class:`crop-name`},ze={key:0,class:`usage-section-container`,style:{"margin-top":`40px`}},Be={class:`gallery-header-row`},Ve={class:`list-container`},He={class:`meta-stack`},Ue={class:`node-field`},We={key:0,class:`crop-showcase`},Ge={class:`crop-item`},Ke={class:`crop-name`},qe=[`onClick`],z=v(o({__name:`AssetEditor`,props:{assetId:{}},setup(o){let u=o,{activeView:m,nodeSchemas:h}=re(),{confirmDiscard:g}=ne(),{navigateToNodeById:v}=te(),z=e(null),B=e(!0),V=e(!1),H=e({filename:``,title:``,alt:``}),U=e({filename:``,title:``,alt:``}),W=e(!1),G=e(null),K=e(null),Je=()=>{if(W.value){W.value=!1;return}G.value&&(K.value=G.value.getBoundingClientRect()),W.value=!0},Ye=b(()=>{let e=[{key:`copy-url`,label:`Copy Public URL`,icon:se},{key:`open-tab`,label:`Open in New Tab`,icon:w}];return z.value&&z.value.connectedNodes?.length>0&&(e.push({key:`div-nodes`,label:``,divider:!0}),e.push({key:`show-nodes`,label:`Connected Nodes (${z.value.connectedNodes.length})`,icon:oe})),e.push({key:`div-1`,label:``,divider:!0},{key:`delete`,label:`Delete Asset`,icon:T}),e}),Xe=async e=>{W.value=!1,z.value&&(e===`copy-url`&&z.value.url?await navigator.clipboard.writeText(z.value.url):e===`open-tab`&&z.value.url?window.open(z.value.url,`_blank`):e===`delete`?await g(`Are you sure you want to delete "${z.value.filename||`this asset`}"?`,`Delete Asset?`,`Delete`,`Cancel`)&&await Ze():e===`show-nodes`&&Y())},Ze=async()=>{try{(await fetch(`/api/admin/assets/${u.assetId}`,{method:`DELETE`})).ok&&(window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),m.value={type:`dashboard`})}catch{}},Qe=b(()=>H.value.filename!==U.value.filename||H.value.title!==U.value.title||H.value.alt!==U.value.alt),q=async()=>{B.value=!0;try{let e=await fetch(`/api/admin/assets/${u.assetId}/details`);if(e.ok){let t=await e.json();z.value=t;let n={filename:t.filename||``,title:t.title||``,alt:t.alt||``};H.value={...n},U.value={...n}}}catch{}finally{B.value=!1}},$e=async()=>{V.value=!0;try{(await fetch(`/api/admin/assets/${u.assetId}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(H.value)})).ok&&(U.value={...H.value},window.dispatchEvent(new CustomEvent(`cms-assets-updated`)))}catch{}finally{V.value=!1}},J=async e=>{let t=`Permanently delete orphaned crop "${z.value?.variants?.find(t=>String(t.id)===String(e))?.filename||`variant`}"?`;if(await g(t,`Delete Crop`,`Delete`,`Cancel`))try{(await fetch(`/api/admin/assets/purge/${e}`,{method:`DELETE`})).ok&&(z.value?.variants&&(z.value.variants=z.value.variants.filter(t=>String(t.id)!==String(e))),window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),await q())}catch{}},et=async()=>{let e=$.value;if(e.length===0)return;let t=`Are you sure you want to permanently delete all ${e.length} orphaned crops?`;if(await g(t,`Purge All Orphaned Crops`,`Purge All`,`Cancel`))try{for(let t of e)await fetch(`/api/admin/assets/purge/${t.id}`,{method:`DELETE`});window.dispatchEvent(new CustomEvent(`cms-assets-updated`)),await q()}catch(e){console.error(`Failed to purge crops`,e)}},tt=e=>{m.value={type:`node`},v(String(e)),window.dispatchEvent(new CustomEvent(`cms-switch-sidebar-tab`,{detail:`vault`}))},Y=()=>{sessionStorage.setItem(`cms-vault-asset-filter`,u.assetId),window.dispatchEvent(new CustomEvent(`cms-filter-vault-by-asset`,{detail:u.assetId})),window.dispatchEvent(new CustomEvent(`cms-switch-sidebar-tab`,{detail:`vault`}))},X=b(()=>z.value&&(z.value.mimeType?.startsWith(`image/`)||/\.(jpg|jpeg|png|webp|gif|svg)$/i.test(z.value.filename))),Z=e=>{if(!e)return`0 B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`],r=Math.floor(Math.log(e)/Math.log(t));return parseFloat((e/t**r).toFixed(1))+` `+n[r]},nt=(e,t)=>{if(!t||t===`Original`||t===`Unknown Crop`)return t||`Original Image`;try{let n=h.value[e];if(!n)return t;let r=null,i=e=>{if(!(!e||r))for(let n of Object.values(e))n.crop&&t===`standard`&&n.crop.label&&(r=n.crop.label),n.crops&&n.crops[t]&&n.crops[t].label&&(r=n.crops[t].label)};return i(n.fields),n.tabs&&Object.values(n.tabs).forEach(e=>i(e.fields)),r||t}catch{return t}},Q=b(()=>{if(!z.value||!z.value.connectedNodes)return[];let e=new Map;for(let t of z.value.connectedNodes){let n=String(t.id),r=t.contentType||t.nodeType,i=t.fieldKey?.split(`.`)[0]||`Content Area`,a=t.fieldKey?.match(/^blocks\[(\d+)\]/);a&&(i=`Block ${parseInt(a[1],10)+1}`);let o=String(t.assetId)!==String(z.value.id),s=null;if(o){let e=z.value.variants?.find(e=>String(e.id)===String(t.assetId));if(e){let n=`Unknown Crop`,i=t.fieldKey?.match(/\.variants\.([^.]+)/);if(i)n=i[1];else{let t=e.filename?.match(/^(.+?)_ast_/);t&&(n=t[1])}s={id:e.id,url:e.url,label:nt(r,n)}}}else s={id:z.value.id,url:z.value.url,label:`Original Image`};if(!e.has(n))e.set(n,{id:t.id,title:t.title,nodeType:r,fieldKeys:new Set([i]),usedAssets:s?[s]:[]});else{let t=e.get(n);t.fieldKeys.add(i),s&&!t.usedAssets.some(e=>e.id===s.id)&&t.usedAssets.push(s)}}return Array.from(e.values()).map(e=>({...e,fieldKey:Array.from(e.fieldKeys).join(`, `)}))}),$=b(()=>{if(!z.value||!z.value.variants)return[];let e=new Set(z.value.connectedNodes?.map(e=>String(e.assetId))||[]);return z.value.variants.filter(t=>!e.has(String(t.id)))}),rt=e=>{let t=e?.match(/^(.+?)_ast_/);return t?t[1]:`Unknown Crop`};return i(()=>q()),(e,i)=>(s(),c(`div`,me,[S(`header`,he,[S(`div`,k,[S(`div`,A,[S(`div`,j,[S(`span`,M,[z.value?(s(),c(`span`,N,r(z.value.filename),1)):(s(),c(`span`,P,`Loading Asset...`))])]),S(`div`,F,[z.value?(s(),c(`span`,I,r(Z(z.value.sizeBytes))+` • `+r(z.value.mimeType),1)):x(``,!0)])]),S(`div`,L,[z.value?(s(),c(`div`,{key:0,class:`context-wrapper`,ref_key:`contextTriggerRef`,ref:G},[n(E,{variant:`secondary`,title:`More Options`,onClick:Je,disabled:V.value,class:`transparent-btn icon-only-btn`},{default:a(()=>[n(y(ae),{size:16})]),_:1},8,[`disabled`]),n(le,{show:W.value,items:Ye.value,"anchor-rect":K.value,onSelect:Xe,onClose:i[0]||=e=>W.value=!1},null,8,[`show`,`items`,`anchor-rect`])],512)):x(``,!0),n(E,{variant:`primary`,class:`save-btn`,disabled:V.value||!Qe.value,onClick:$e},{default:a(()=>[n(y(pe),{size:14,class:`save-icon`}),S(`span`,R,r(V.value?`Saving...`:`Save Metadata`),1)]),_:1},8,[`disabled`])])])]),S(`div`,ge,[B.value?(s(),c(`div`,_e,`Loading asset details...`)):z.value?(s(),c(`div`,ve,[S(`div`,ye,[S(`div`,{class:ee([`preview-container`,{"is-doc":!X.value}])},[X.value?(s(),d(C,{key:0,url:z.value.url,alt:z.value.alt||z.value.filename,width:1200,quality:85,class:`main-preview-wrapper`},null,8,[`url`,`alt`])):(s(),c(`div`,be,[n(y(ue),{size:64}),i[4]||=S(`span`,null,`Preview not available for this file type`,-1)]))],2),S(`div`,xe,[S(`span`,null,`Original Upload: `+r(new Date(z.value.createdAt).toLocaleString()),1),S(`a`,{href:z.value.url,target:`_blank`,class:`ext-link`},[i[5]||=l(`Open original file `,-1),n(y(w),{size:12})],8,Se)])]),S(`div`,Ce,[S(`div`,we,[S(`h3`,null,[n(y(ce),{size:14,class:`inline-icon`}),i[6]||=l(` Metadata `,-1)])]),S(`div`,Te,[S(`div`,Ee,[i[7]||=S(`label`,null,`Filename`,-1),_(S(`input`,{"onUpdate:modelValue":i[1]||=e=>H.value.filename=e,type:`text`,class:`cms-input`},null,512),[[f,H.value.filename]]),i[8]||=S(`span`,{class:`help-text`},`Changing this does not break the permanent CDN link.`,-1)]),S(`div`,De,[i[9]||=S(`label`,null,`Title (Internal/SEO)`,-1),_(S(`input`,{"onUpdate:modelValue":i[2]||=e=>H.value.title=e,type:`text`,class:`cms-input`},null,512),[[f,H.value.title]])]),S(`div`,Oe,[i[10]||=S(`label`,null,`Alt Text (Accessibility)`,-1),_(S(`textarea`,{"onUpdate:modelValue":i[3]||=e=>H.value.alt=e,class:`cms-input cms-textarea`},null,512),[[f,H.value.alt]])])])]),S(`div`,ke,[S(`div`,Ae,[S(`div`,je,[S(`h3`,null,[n(y(de),{size:16,class:`inline-icon`}),i[11]||=l(` Node Usage `,-1)]),Q.value.length>0?(s(),c(`button`,{key:0,class:`action-btn outline`,onClick:Y,title:`Show these nodes in the left Vault pane`},[n(y(fe),{size:13}),i[12]||=l(` Vault Filter `,-1)])):x(``,!0)]),Q.value.length===0?(s(),c(`div`,Me,[...i[13]||=[S(`span`,{class:`status-dot warning`},null,-1),S(`span`,null,`Asset is not currently used on any nodes.`,-1)]])):(s(),c(`div`,Ne,[(s(!0),c(p,null,t(Q.value,e=>(s(),d(D,{key:e.id,clickable:``,onClick:t=>tt(e.id)},{title:a(()=>[i[14]||=S(`span`,{class:`status-dot success`},null,-1),S(`span`,Pe,r(e.title||`Untitled`),1),n(O,{variant:`type`},{default:a(()=>[l(r(e.nodeType||`page`),1)]),_:2},1024)]),meta:a(()=>[S(`div`,Fe,[S(`span`,Ie,`Used in field: `+r(e.fieldKey),1),X.value?(s(),c(`div`,Le,[(s(!0),c(p,null,t(e.usedAssets,e=>(s(),c(`div`,{key:e.id,class:`crop-item`},[n(C,{url:e.url,alt:e.label,width:200,quality:75,class:`crop-img-fixed-height`},null,8,[`url`,`alt`]),S(`span`,Re,r(e.label),1)]))),128))])):x(``,!0)])]),_:2},1032,[`onClick`]))),128))]))]),$.value.length>0?(s(),c(`div`,ze,[S(`div`,Be,[S(`h3`,null,[n(y(ie),{size:16,class:`inline-icon`}),l(` Orphaned Crops (`+r($.value.length)+`) `,1)]),S(`button`,{class:`action-btn outline text-danger`,onClick:et},[n(y(T),{size:13}),i[15]||=l(` Purge All `,-1)])]),i[18]||=S(`p`,{class:`gallery-desc`},`These crops were generated previously but are no longer attached to any nodes. You can safely delete them to save storage space.`,-1),S(`div`,Ve,[(s(!0),c(p,null,t($.value,e=>(s(),d(D,{key:e.id},{title:a(()=>[i[16]||=S(`span`,{class:`node-title`},`Orphaned Crop`,-1),n(O,{variant:`type`},{default:a(()=>[l(r(Z(e.sizeBytes)),1)]),_:2},1024)]),meta:a(()=>[S(`div`,He,[S(`span`,Ue,`Generated: `+r(new Date(e.createdAt).toLocaleDateString()),1),X.value?(s(),c(`div`,We,[S(`div`,Ge,[n(C,{url:e.url,alt:e.filename,width:200,quality:75,class:`crop-img-fixed-height`},null,8,[`url`,`alt`]),S(`span`,Ke,r(rt(e.filename)),1)])])):x(``,!0)])]),actions:a(()=>[S(`button`,{class:`action-btn outline text-danger`,style:{border:`none`},onClick:t=>J(e.id)},[n(y(T),{size:13}),i[17]||=l(` Purge `,-1)],8,qe)]),_:2},1024))),128))])])):x(``,!0)])])):x(``,!0)])]))}}),[[`__scopeId`,`data-v-cd1f3a28`]]);export{z as default};
@@ -1 +1 @@
1
- import{E as e,O as t,R as n,S as r,T as i,Y as a,j as o,t as s,tt as c,y as l}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{a as u,i as d}from"./useNodes-W5j_uxdQ.js";import{n as f,r as p,t as m}from"./plus-mqZr4I1D.js";import{t as h}from"./database-hg5SqKLG.js";import{t as g}from"./folder-tree-BWYot72H.js";import{t as _}from"./globe-BraoljaN.js";import{t as v}from"./layers-B6RgfpPR.js";o(),a();var y={class:`help-canvas`},b={class:`help-container`},x={class:`steps-grid`},S={class:`step-card`},C={class:`card-header`},w={class:`card-icon channel-icon`},T={class:`step-card`},E={class:`card-header`},D={class:`card-icon tree-icon`},O={class:`step-card`},k={class:`card-header`},A={class:`card-icon vault-icon`},j={class:`architecture-guide`},M={class:`guide-header`},N={class:`guide-columns`},P={class:`guide-col-arrow`},F={class:`guide-col-arrow`},I={class:`guide-col-arrow`},L=s(t({__name:`CmsHelp`,setup(t){let{handleAddNewChannel:a}=p(),{handleAddNewTree:o}=u(),{handleAddNewNode:s}=d();return(t,u)=>(n(),r(`main`,y,[l(`div`,b,[u[17]||=l(`header`,{class:`help-header`},[l(`h1`,null,`KAMA`),l(`p`,null,`Build modular content in the Vault, organize it into Navigation Trees, and expose it to your channels via API.`)],-1),l(`div`,x,[l(`div`,S,[l(`div`,C,[l(`div`,w,[e(c(_),{size:20})]),u[3]||=l(`div`,{class:`step-badge`},`Step 1`,-1)]),u[5]||=l(`div`,{class:`card-content`},[l(`h3`,null,`Channels`),l(`p`,null,`Delivery targets that consume your headless API.`)],-1),l(`button`,{class:`card-action-btn`,onClick:u[0]||=(...e)=>c(a)&&c(a)(...e)},[e(c(m),{size:16}),u[4]||=i(` Create Channel `,-1)])]),l(`div`,T,[l(`div`,E,[l(`div`,D,[e(c(g),{size:20})]),u[6]||=l(`div`,{class:`step-badge`},`Step 2`,-1)]),u[8]||=l(`div`,{class:`card-content`},[l(`h3`,null,`Trees`),l(`p`,null,`Decoupled structural hierarchies and navigation menus.`)],-1),l(`button`,{class:`card-action-btn`,onClick:u[1]||=(...e)=>c(o)&&c(o)(...e)},[e(c(m),{size:16}),u[7]||=i(` Create Tree `,-1)])]),l(`div`,O,[l(`div`,k,[l(`div`,A,[e(c(h),{size:20})]),u[9]||=l(`div`,{class:`step-badge`},`Step 3`,-1)]),u[11]||=l(`div`,{class:`card-content`},[l(`h3`,null,`Vault`),l(`p`,null,`Flat, headless content store for reusable content items.`)],-1),l(`button`,{class:`card-action-btn`,onClick:u[2]||=e=>c(s)()},[e(c(m),{size:16}),u[10]||=i(` Create Content `,-1)])])]),l(`section`,j,[l(`div`,M,[e(c(v),{size:18,class:`guide-icon`}),u[12]||=l(`h4`,null,`Architecture Flow`,-1)]),l(`div`,N,[u[13]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`1. Content Vault`),l(`p`,null,`Raw content entities existing independently of routing.`)],-1),l(`div`,P,[e(c(f),{size:16})]),u[14]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`2. Navigation Trees`),l(`p`,null,`Decoupled structures mapping content items to URL hierarchies.`)],-1),l(`div`,F,[e(c(f),{size:16})]),u[15]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`3. Channels`),l(`p`,null,`Delivery targets binding trees and languages to specific contexts.`)],-1),l(`div`,I,[e(c(f),{size:16})]),u[16]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`4. Headless API`),l(`p`,null,`Endpoints serving structured JSON to your frontends.`)],-1)])])])]))}}),[[`__scopeId`,`data-v-c739c397`]]);export{L as default};
1
+ import{E as e,O as t,R as n,S as r,T as i,Y as a,j as o,t as s,tt as c,y as l}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{a as u,i as d}from"./useNodes-D2-VxsxR.js";import{n as f,r as p,t as m}from"./plus-FQRsZBoJ.js";import{t as h}from"./database-hg5SqKLG.js";import{t as g}from"./folder-tree-BWYot72H.js";import{t as _}from"./globe-BraoljaN.js";import{t as v}from"./layers-B6RgfpPR.js";o(),a();var y={class:`help-canvas`},b={class:`help-container`},x={class:`steps-grid`},S={class:`step-card`},C={class:`card-header`},w={class:`card-icon channel-icon`},T={class:`step-card`},E={class:`card-header`},D={class:`card-icon tree-icon`},O={class:`step-card`},k={class:`card-header`},A={class:`card-icon vault-icon`},j={class:`architecture-guide`},M={class:`guide-header`},N={class:`guide-columns`},P={class:`guide-col-arrow`},F={class:`guide-col-arrow`},I={class:`guide-col-arrow`},L=s(t({__name:`CmsHelp`,setup(t){let{handleAddNewChannel:a}=p(),{handleAddNewTree:o}=u(),{handleAddNewNode:s}=d();return(t,u)=>(n(),r(`main`,y,[l(`div`,b,[u[17]||=l(`header`,{class:`help-header`},[l(`h1`,null,`KAMA`),l(`p`,null,`Build modular content in the Vault, organize it into Navigation Trees, and expose it to your channels via API.`)],-1),l(`div`,x,[l(`div`,S,[l(`div`,C,[l(`div`,w,[e(c(_),{size:20})]),u[3]||=l(`div`,{class:`step-badge`},`Step 1`,-1)]),u[5]||=l(`div`,{class:`card-content`},[l(`h3`,null,`Channels`),l(`p`,null,`Delivery targets that consume your headless API.`)],-1),l(`button`,{class:`card-action-btn`,onClick:u[0]||=(...e)=>c(a)&&c(a)(...e)},[e(c(m),{size:16}),u[4]||=i(` Create Channel `,-1)])]),l(`div`,T,[l(`div`,E,[l(`div`,D,[e(c(g),{size:20})]),u[6]||=l(`div`,{class:`step-badge`},`Step 2`,-1)]),u[8]||=l(`div`,{class:`card-content`},[l(`h3`,null,`Trees`),l(`p`,null,`Decoupled structural hierarchies and navigation menus.`)],-1),l(`button`,{class:`card-action-btn`,onClick:u[1]||=(...e)=>c(o)&&c(o)(...e)},[e(c(m),{size:16}),u[7]||=i(` Create Tree `,-1)])]),l(`div`,O,[l(`div`,k,[l(`div`,A,[e(c(h),{size:20})]),u[9]||=l(`div`,{class:`step-badge`},`Step 3`,-1)]),u[11]||=l(`div`,{class:`card-content`},[l(`h3`,null,`Vault`),l(`p`,null,`Flat, headless content store for reusable content items.`)],-1),l(`button`,{class:`card-action-btn`,onClick:u[2]||=e=>c(s)()},[e(c(m),{size:16}),u[10]||=i(` Create Content `,-1)])])]),l(`section`,j,[l(`div`,M,[e(c(v),{size:18,class:`guide-icon`}),u[12]||=l(`h4`,null,`Architecture Flow`,-1)]),l(`div`,N,[u[13]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`1. Content Vault`),l(`p`,null,`Raw content entities existing independently of routing.`)],-1),l(`div`,P,[e(c(f),{size:16})]),u[14]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`2. Navigation Trees`),l(`p`,null,`Decoupled structures mapping content items to URL hierarchies.`)],-1),l(`div`,F,[e(c(f),{size:16})]),u[15]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`3. Channels`),l(`p`,null,`Delivery targets binding trees and languages to specific contexts.`)],-1),l(`div`,I,[e(c(f),{size:16})]),u[16]||=l(`div`,{class:`guide-col`},[l(`strong`,null,`4. Headless API`),l(`p`,null,`Endpoints serving structured JSON to your frontends.`)],-1)])])])]))}}),[[`__scopeId`,`data-v-c739c397`]]);export{L as default};
@@ -1,3 +1,3 @@
1
- import{$ as e,B as t,E as n,Et as r,I as i,K as a,O as ee,R as o,S as s,T as c,Y as l,b as u,g as d,h as f,j as p,lt as m,o as h,t as g,tt as _,v,x as y,y as b}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{c as x,i as te}from"./useNodes-W5j_uxdQ.js";import{l as S,s as ne}from"./schema-helpers-1UXlO0Ye.js";import{t as C}from"./circle-check-A-QeFqt3.js";import{n as re,t as w}from"./send-F-mJeL54.js";import{t as ie}from"./folder-tree-BWYot72H.js";import{t as ae}from"./globe-BraoljaN.js";import{t as oe}from"./history-pqIbKK9u.js";import{t as T}from"./loader-circle-BoUkhDjq.js";import{t as E}from"./CmsButton-CbOfxvjr.js";import{t as D}from"./CmsDataRow--H4iI_u_.js";import{t as O}from"./CmsBadge-D0Ob9qPU.js";p(),l(),m(),h();var se={class:`publisher-canvas full-width`},ce={class:`publisher-container full-width`},le={class:`publisher-header`},ue={class:`header-actions`},de={key:0,class:`empty-publisher-state`},fe={key:1,class:`empty-publisher-state`},pe={key:2,class:`channel-groups-list`},k={class:`group-header`},A={class:`group-title`},j=[`checked`,`indeterminate`,`onChange`],M={class:`count-badge`},N={class:`nodes-table`},P=[`checked`,`onChange`],F={class:`node-title`},I={key:3,class:`history-section`},L={class:`history-header`},R={class:`history-card`},z={class:`node-title`},B={class:`history-time`},V=g(ee({__name:`CmsPublisher`,setup(ee){let l=ne(),{loadNodeContent:p}=te(),m=e(!1),h=e(new Set),g=e(null),V=e(!1),H=e([]),U=e([]),W=e(new Set),me=async()=>{if(l.hasLoadedStats.value){H.value=l.vaultStats.value?.pendingNodes||[],U.value=l.vaultStats.value?.recentActivity||[];return}m.value=!0;try{let e=await fetch(`/api/cms/stats`);if(e.ok){let t=await e.json();l.vaultStats.value=t,l.hasLoadedStats.value=!0,H.value=t.pendingNodes||[],U.value=t.recentActivity||[]}}catch{}finally{m.value=!1}},G=v(()=>{let e=new Map;if(H.value.forEach(t=>{let n=String(l.activeNode.value?.id)===String(t.id),r=x(t),i=n&&l.hasUnpublishedChanges.value||r.hasUnpublishedChanges;e.set(String(t.id),{...t,evalState:{...r,hasUnpublishedChanges:i}})}),l.activeNode.value?.id){let t=String(l.activeNode.value.id),n=x(l.activeNode.value),r=l.hasUnpublishedChanges.value||n.hasUnpublishedChanges;(n.isDraft||n.isUnpublishedDraft||r)&&(e.has(t)||e.set(t,{...l.activeNode.value,evalState:{...n,hasUnpublishedChanges:r}}))}return Array.from(e.values())}),he=v(()=>{let e=new Map,t=`Unassigned / Vault Only`;return e.set(t,{channelName:t,nodes:[]}),G.value.forEach(n=>{let r=n.channelNames||[];r.length===0?e.get(t).nodes.push(n):r.forEach(t=>{e.has(t)||e.set(t,{channelName:t,nodes:[]}),e.get(t).nodes.push(n)})}),Array.from(e.values()).filter(e=>e.nodes.length>0)}),K=e=>W.value.has(e),ge=e=>{let t=new Set(W.value);t.has(e)?t.delete(e):t.add(e),W.value=t},q=e=>e.filter(e=>W.value.has(e.id)).length,J=e=>e.length>0&&e.every(e=>W.value.has(e.id)),_e=e=>q(e)>0&&q(e)<e.length,Y=e=>{let t=new Set(W.value),n=J(e);e.forEach(e=>{n?t.delete(e.id):t.add(e.id)}),W.value=t},X=v(()=>W.value.size),Z=e=>{p({id:e.id,title:e.title,slug:e.slug,nodeType:e.contentType||e.nodeType,channelId:e.channelId||``,language:e.language||`en`,children:[]})},Q=e=>{U.value=[{id:e.id,title:e.title||`Untitled Document`,slug:e.slug,contentType:e.contentType||e.nodeType||`page`,updatedAt:new Date().toISOString()},...U.value.filter(t=>String(t.id)!==String(e.id))].slice(0,10)},ve=async e=>{h.value.add(e);try{let t=G.value.find(t=>String(t.id)===String(e));if((await S.publishNode(e)).ok){l.updateNodeInState(e,{status:`published`,hasUnpublishedChanges:!1}),H.value=H.value.filter(t=>String(t.id)!==String(e)),String(l.activeNode.value?.id)===String(e)&&(l.activeNode.value.status=`published`,l.activeNode.value.hasUnpublishedChanges=!1);let n=new Set(W.value);n.delete(e),W.value=n,t&&Q(t),l.invalidateStats(),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`cms-node-updated`))}}finally{h.value.delete(e)}},$=async e=>{if(e.length===0)return;let t=e.map(e=>e.id);t.forEach(e=>h.value.add(e));try{let e=await S.publishNodesBatch(t);if(e.ok){let t=(await e.json()).publishedIds||[];for(let e of t)l.updateNodeInState(e,{status:`published`,hasUnpublishedChanges:!1}),String(l.activeNode.value?.id)===String(e)&&(l.activeNode.value.status=`published`,l.activeNode.value.hasUnpublishedChanges=!1);G.value.filter(e=>t.includes(e.id)).forEach(e=>Q(e)),H.value=H.value.filter(e=>!t.includes(e.id));let n=new Set(W.value);t.forEach(e=>n.delete(e)),W.value=n,l.invalidateStats(),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`cms-node-updated`))}}finally{t.forEach(e=>h.value.delete(e))}},ye=async(e,t)=>{g.value=e;let n=q(t)>0?t.filter(e=>W.value.has(e.id)):t;await $(n),g.value=null},be=async()=>{V.value=!0;let e=X.value>0?G.value.filter(e=>W.value.has(e.id)):G.value;await $(e),V.value=!1},xe=e=>{if(!e)return``;try{return new Date(e).toLocaleString([],{dateStyle:`medium`,timeStyle:`short`})}catch{return e}};return i(()=>me()),(e,i)=>(o(),s(`main`,se,[b(`div`,ce,[b(`header`,le,[i[2]||=b(`div`,{class:`header-title-group`},[b(`h1`,null,`Publishing Center`),b(`p`,null,`Review and release pending drafts or bulk-publish updates across your distribution channels.`)],-1),b(`div`,ue,[G.value.length>0?(o(),u(E,{key:0,variant:`primary`,class:`publish-all-btn`,disabled:V.value||h.value.size>0,onClick:be},{default:a(()=>[V.value?(o(),u(_(T),{key:0,size:16,class:`spin`})):(o(),u(_(w),{key:1,size:16})),b(`span`,null,r(X.value>0?`Publish Selected (${X.value})`:`Publish All
1
+ import{$ as e,B as t,E as n,Et as r,I as i,K as a,O as ee,R as o,S as s,T as c,Y as l,b as u,g as d,h as f,j as p,lt as m,o as h,t as g,tt as _,v,x as y,y as b}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{c as x,i as te}from"./useNodes-D2-VxsxR.js";import{l as S,s as ne}from"./schema-helpers-DvficKko.js";import{t as C}from"./circle-check-A-QeFqt3.js";import{n as re,t as w}from"./send-F-mJeL54.js";import{t as ie}from"./folder-tree-BWYot72H.js";import{t as ae}from"./globe-BraoljaN.js";import{t as oe}from"./history-pqIbKK9u.js";import{t as T}from"./loader-circle-BoUkhDjq.js";import{t as E}from"./CmsButton-CbOfxvjr.js";import{t as D}from"./CmsDataRow--H4iI_u_.js";import{t as O}from"./CmsBadge-D0Ob9qPU.js";p(),l(),m(),h();var se={class:`publisher-canvas full-width`},ce={class:`publisher-container full-width`},le={class:`publisher-header`},ue={class:`header-actions`},de={key:0,class:`empty-publisher-state`},fe={key:1,class:`empty-publisher-state`},pe={key:2,class:`channel-groups-list`},k={class:`group-header`},A={class:`group-title`},j=[`checked`,`indeterminate`,`onChange`],M={class:`count-badge`},N={class:`nodes-table`},P=[`checked`,`onChange`],F={class:`node-title`},I={key:3,class:`history-section`},L={class:`history-header`},R={class:`history-card`},z={class:`node-title`},B={class:`history-time`},V=g(ee({__name:`CmsPublisher`,setup(ee){let l=ne(),{loadNodeContent:p}=te(),m=e(!1),h=e(new Set),g=e(null),V=e(!1),H=e([]),U=e([]),W=e(new Set),me=async()=>{if(l.hasLoadedStats.value){H.value=l.vaultStats.value?.pendingNodes||[],U.value=l.vaultStats.value?.recentActivity||[];return}m.value=!0;try{let e=await fetch(`/api/cms/stats`);if(e.ok){let t=await e.json();l.vaultStats.value=t,l.hasLoadedStats.value=!0,H.value=t.pendingNodes||[],U.value=t.recentActivity||[]}}catch{}finally{m.value=!1}},G=v(()=>{let e=new Map;if(H.value.forEach(t=>{let n=String(l.activeNode.value?.id)===String(t.id),r=x(t),i=n&&l.hasUnpublishedChanges.value||r.hasUnpublishedChanges;e.set(String(t.id),{...t,evalState:{...r,hasUnpublishedChanges:i}})}),l.activeNode.value?.id){let t=String(l.activeNode.value.id),n=x(l.activeNode.value),r=l.hasUnpublishedChanges.value||n.hasUnpublishedChanges;(n.isDraft||n.isUnpublishedDraft||r)&&(e.has(t)||e.set(t,{...l.activeNode.value,evalState:{...n,hasUnpublishedChanges:r}}))}return Array.from(e.values())}),he=v(()=>{let e=new Map,t=`Unassigned / Vault Only`;return e.set(t,{channelName:t,nodes:[]}),G.value.forEach(n=>{let r=n.channelNames||[];r.length===0?e.get(t).nodes.push(n):r.forEach(t=>{e.has(t)||e.set(t,{channelName:t,nodes:[]}),e.get(t).nodes.push(n)})}),Array.from(e.values()).filter(e=>e.nodes.length>0)}),K=e=>W.value.has(e),ge=e=>{let t=new Set(W.value);t.has(e)?t.delete(e):t.add(e),W.value=t},q=e=>e.filter(e=>W.value.has(e.id)).length,J=e=>e.length>0&&e.every(e=>W.value.has(e.id)),_e=e=>q(e)>0&&q(e)<e.length,Y=e=>{let t=new Set(W.value),n=J(e);e.forEach(e=>{n?t.delete(e.id):t.add(e.id)}),W.value=t},X=v(()=>W.value.size),Z=e=>{p({id:e.id,title:e.title,slug:e.slug,nodeType:e.contentType||e.nodeType,channelId:e.channelId||``,language:e.language||`en`,children:[]})},Q=e=>{U.value=[{id:e.id,title:e.title||`Untitled Document`,slug:e.slug,contentType:e.contentType||e.nodeType||`page`,updatedAt:new Date().toISOString()},...U.value.filter(t=>String(t.id)!==String(e.id))].slice(0,10)},ve=async e=>{h.value.add(e);try{let t=G.value.find(t=>String(t.id)===String(e));if((await S.publishNode(e)).ok){l.updateNodeInState(e,{status:`published`,hasUnpublishedChanges:!1}),H.value=H.value.filter(t=>String(t.id)!==String(e)),String(l.activeNode.value?.id)===String(e)&&(l.activeNode.value.status=`published`,l.activeNode.value.hasUnpublishedChanges=!1);let n=new Set(W.value);n.delete(e),W.value=n,t&&Q(t),l.invalidateStats(),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`cms-node-updated`))}}finally{h.value.delete(e)}},$=async e=>{if(e.length===0)return;let t=e.map(e=>e.id);t.forEach(e=>h.value.add(e));try{let e=await S.publishNodesBatch(t);if(e.ok){let t=(await e.json()).publishedIds||[];for(let e of t)l.updateNodeInState(e,{status:`published`,hasUnpublishedChanges:!1}),String(l.activeNode.value?.id)===String(e)&&(l.activeNode.value.status=`published`,l.activeNode.value.hasUnpublishedChanges=!1);G.value.filter(e=>t.includes(e.id)).forEach(e=>Q(e)),H.value=H.value.filter(e=>!t.includes(e.id));let n=new Set(W.value);t.forEach(e=>n.delete(e)),W.value=n,l.invalidateStats(),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`cms-node-updated`))}}finally{t.forEach(e=>h.value.delete(e))}},ye=async(e,t)=>{g.value=e;let n=q(t)>0?t.filter(e=>W.value.has(e.id)):t;await $(n),g.value=null},be=async()=>{V.value=!0;let e=X.value>0?G.value.filter(e=>W.value.has(e.id)):G.value;await $(e),V.value=!1},xe=e=>{if(!e)return``;try{return new Date(e).toLocaleString([],{dateStyle:`medium`,timeStyle:`short`})}catch{return e}};return i(()=>me()),(e,i)=>(o(),s(`main`,se,[b(`div`,ce,[b(`header`,le,[i[2]||=b(`div`,{class:`header-title-group`},[b(`h1`,null,`Publishing Center`),b(`p`,null,`Review and release pending drafts or bulk-publish updates across your distribution channels.`)],-1),b(`div`,ue,[G.value.length>0?(o(),u(E,{key:0,variant:`primary`,class:`publish-all-btn`,disabled:V.value||h.value.size>0,onClick:be},{default:a(()=>[V.value?(o(),u(_(T),{key:0,size:16,class:`spin`})):(o(),u(_(w),{key:1,size:16})),b(`span`,null,r(X.value>0?`Publish Selected (${X.value})`:`Publish All
2
2
  (${G.value.length})`),1)]),_:1},8,[`disabled`])):y(``,!0)])]),m.value&&G.value.length===0?(o(),s(`div`,de,[n(_(T),{size:28,class:`spin empty-icon`}),i[3]||=b(`p`,null,`Gathering pending content updates...`,-1)])):G.value.length===0?(o(),s(`div`,fe,[n(_(C),{size:36,class:`success-icon`}),i[4]||=b(`h3`,null,`All Content Published!`,-1),i[5]||=b(`p`,null,`No draft changes or pending revisions found. Your delivery channels are fully up to date.`,-1)])):(o(),s(`div`,pe,[(o(!0),s(d,null,t(he.value,e=>(o(),s(`section`,{key:e.channelName,class:`channel-group-card`},[b(`div`,k,[b(`div`,A,[b(`label`,{class:`checkbox-container`,onClick:i[0]||=f(()=>{},[`stop`])},[b(`input`,{type:`checkbox`,checked:J(e.nodes),indeterminate:_e(e.nodes),onChange:t=>Y(e.nodes)},null,40,j),i[6]||=b(`span`,{class:`checkmark`},null,-1)]),n(_(ae),{size:18,class:`channel-icon`}),b(`h2`,null,r(e.channelName),1),b(`span`,M,r(e.nodes.length)+` Pending`,1)]),n(E,{variant:`secondary`,size:`sm`,disabled:g.value===e.channelName||V.value,onClick:t=>ye(e.channelName,e.nodes)},{default:a(()=>[g.value===e.channelName?(o(),u(_(T),{key:0,size:14,class:`spin`})):(o(),u(_(w),{key:1,size:14})),b(`span`,null,r(q(e.nodes)>0?`Publish Selected
3
3
  (${q(e.nodes)})`:`Publish Channel Items`),1)]),_:2},1032,[`disabled`,`onClick`])]),b(`div`,N,[(o(!0),s(d,null,t(e.nodes,e=>(o(),u(D,{key:e.id,"is-selected":K(e.id),clickable:``,onClick:t=>Z(e)},{prefix:a(()=>[b(`label`,{class:`checkbox-container`,onClick:i[1]||=f(()=>{},[`stop`])},[b(`input`,{type:`checkbox`,checked:K(e.id),onChange:t=>ge(e.id)},null,40,P),i[7]||=b(`span`,{class:`checkmark`},null,-1)])]),title:a(()=>[b(`span`,F,r(e.title||`Untitled Draft`),1),n(O,{variant:`type`},{default:a(()=>[c(r(e.contentType||e.nodeType||`page`),1)]),_:2},1024)]),meta:a(()=>[n(O,{variant:`slug`},{default:a(()=>[c(`/`+r(e.slug),1)]),_:2},1024),(o(!0),s(d,null,t(e.treeNames,e=>(o(),u(O,{variant:`tree`,key:e},{default:a(()=>[n(_(ie),{size:11}),c(` `+r(e),1)]),_:2},1024))),128))]),actions:a(()=>[n(E,{variant:`secondary`,size:`sm`,class:`icon-only-btn`,title:`Publish Item`,disabled:h.value.has(e.id)||V.value,onClick:f(t=>ve(e.id),[`stop`])},{default:a(()=>[h.value.has(e.id)?(o(),u(_(T),{key:0,size:14,class:`spin`})):(o(),u(_(w),{key:1,size:14}))]),_:2},1032,[`disabled`,`onClick`])]),_:2},1032,[`is-selected`,`onClick`]))),128))])]))),128))])),U.value.length>0?(o(),s(`section`,I,[b(`div`,L,[n(_(oe),{size:18,class:`history-icon`}),i[8]||=b(`h2`,null,`Recently Published`,-1)]),b(`div`,R,[(o(!0),s(d,null,t(U.value,e=>(o(),u(D,{key:e.id,clickable:``,onClick:t=>Z(e)},{prefix:a(()=>[n(_(C),{size:16,class:`published-check`})]),title:a(()=>[b(`span`,z,r(e.title||`Untitled Document`),1),n(O,{variant:`type`},{default:a(()=>[c(r(e.contentType||e.nodeType||`page`),1)]),_:2},1024)]),meta:a(()=>[n(O,{variant:`slug`},{default:a(()=>[c(`/`+r(e.slug),1)]),_:2},1024)]),actions:a(()=>[b(`div`,B,[n(_(re),{size:12}),b(`span`,null,r(xe(e.updatedAt)),1)])]),_:2},1032,[`onClick`]))),128))])])):y(``,!0)])]))}}),[[`__scopeId`,`data-v-e0e64ba6`]]);export{V as default};
@@ -1 +1 @@
1
- import{$ as e,Ct as t,E as n,Et as r,F as i,I as a,K as o,O as s,P as ee,R as c,S as l,St as u,T as d,U as f,W as p,Y as m,b as h,g as te,j as g,lt as _,t as v,tt as y,v as b,x,y as S}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{s as C,t as ne}from"./schema-helpers-1UXlO0Ye.js";import{i as re,n as ie,r as ae,t as w}from"./useLocalStorage-C805uplI.js";import{n as oe,t as se}from"./NodeContextMenu-C_HWBGeb.js";import{i as ce,n as le,r as ue,t as de}from"./monitor-CrpvInqG.js";import{t as fe}from"./history-pqIbKK9u.js";import{t as pe}from"./smartphone-EPce6VdP.js";import{t as me}from"./StatusPill-CbeW5SMT.js";g(),m(),_();var he={class:`split-preview-pane`},ge={class:`preview-toolbar`},_e={class:`segmented-control`},ve={class:`device-controls-group`},ye=[`title`],be={class:`trigger-label`},xe=[`title`],Se={class:`toolbar-right`},Ce=[`href`],we=[`href`],Te=[`src`,`title`],T=v(s({__name:`EditorSplitPreview`,props:{paneWidthPx:{}},emits:[`close`],setup(s,{emit:m}){let g=s,_=m,{activeNode:v,selectedChannelId:T,selectedLanguage:E,allChannels:D,activeSnapshotVersion:O,nodeSchemas:Ee}=C(),k=e(null),A=e(null),j=w(`kama_preview_mode`,`draft`),M=w(`kama_preview_device`,`desktop`),N=w(`kama_preview_orientation`,`portrait`),P=w(`kama_preview_autofit`,!0),F=e({w:800,h:800}),I=e(Date.now()),L=e(``),R=async()=>{let e=v.value?.id;if(!e)return;let t=D.value.find(e=>String(e.id)===String(T.value)),n=!1;if(t)try{let r=t.channelRoot;!r&&t.dataJson&&(r=(typeof t.dataJson==`string`?JSON.parse(t.dataJson):t.dataJson)?.channelRoot),typeof r==`string`&&(r=JSON.parse(r));let i=r?.nodeId??r?.id;i&&String(i)===String(e)&&(n=!0)}catch{}if(n){L.value=`/`;return}try{let n=t?.id||T.value||``,r=await fetch(`/api/cms/nodes.json?id=${e}&channelId=${n}`);if(r.ok){let e=await r.json();if(e.node?.path){L.value=e.node.path;return}}}catch(e){console.error(`Failed to fetch live canonical route`,e)}let r=v.value?.slug||``;L.value=r===`index`?`/`:`/${r.replace(/^\/+|\/+$/g,``)}`};p(()=>v.value?.id,R,{immediate:!0});let z={desktop:{label:`Desktop (100% Fluid)`,width:null,height:null},desktop_4k:{label:`4K UHD (3840 × 2160)`,width:3840,height:2160},desktop_fhd:{label:`Full HD (1920 × 1080)`,width:1920,height:1080},macbook_air:{label:`MacBook Air (1440 × 900)`,width:1440,height:900},laptop_std:{label:`Laptop (1366 × 768)`,width:1366,height:768},ipad_pro:{label:`iPad Pro 12.9" (1024 × 1366)`,width:1024,height:1366},ipad_air:{label:`iPad Air / Mini (820 × 1180)`,width:820,height:1180},ipad_standard:{label:`iPad 10th Gen (810 × 1080)`,width:810,height:1080},iphone_15_pro_max:{label:`iPhone 15 Pro Max (430 × 932)`,width:430,height:932},iphone_15_pro:{label:`iPhone 15 Pro (393 × 852)`,width:393,height:852},iphone_se:{label:`iPhone SE (375 × 667)`,width:375,height:667},samsung_s23:{label:`Samsung Galaxy S23 (360 × 780)`,width:360,height:780}},B=b(()=>{let e=0;return Object.values(z).forEach(t=>{t.label.length>e&&(e=t.label.length)}),`${Math.ceil(e*7.2)+48}px`}),V=e(!1),H=e(null),U=e(null),De=b(()=>Object.entries(z).map(([e,t])=>({key:e,label:t.label,title:t.label,isActive:M.value===e}))),Oe=()=>{if(V.value){V.value=!1;return}H.value&&(U.value=H.value.getBoundingClientRect()),V.value=!0},ke=e=>{M.value=String(e),V.value=!1,X()},Ae=b(()=>z[M.value]?.label||`Select Device`),je=b(()=>{if(!v.value)return`Untitled`;let e=Ee.value?.[v.value.nodeType||``];return ne(e,v.value)}),W=b(()=>{let e=D.value.find(e=>String(e.id)===String(T.value)),t=e?.baseUrl||e?.url||(typeof window<`u`?window.location.origin:``);if((t.includes(`localhost:8787`)||t.includes(`127.0.0.1:8787`))&&(t=t.replace(`8787`,`4321`)),t=t.replace(/\/$/,``),!v.value?.id)return t;let n=L.value;n.startsWith(`/`)||(n=`/${n}`);let r=n===`/`?``:n,i=E.value?`/${E.value}`:``,a=`${t}${i}${r}`,o=`_cb=${I.value}`;return O.value?`${a}?preview=true&revisionId=${O.value}&${o}`:`${a}?${j.value===`draft`?`preview=true&`:``}${o}`}),Me=b(()=>{if(!v.value)return`#`;let e=L.value;e.startsWith(`/`)||(e=`/${e}`);let t=e===`/`?``:e,n=E.value?`&lang=${E.value}`:``,r=O.value?`&revisionId=${O.value}`:``,i=j.value===`draft`||!!O.value;return`/api/v1/node${t}?channelId=${T.value}&preview=${i}${n}${r}`}),G=b(()=>M.value!==`desktop`),K=b(()=>{let e=z[M.value];if(!e||!e.width||!e.height)return{w:null,h:null};let t=N.value===`landscape`;return{w:t?e.height:e.width,h:t?e.width:e.height}}),q=b(()=>{let{w:e,h:t}=K.value;return!e||!t||e>t?`landscape`:`portrait`}),J=b(()=>{if(!G.value||!P.value)return 1;let{w:e,h:t}=K.value;if(!e||!t)return 1;let n=Math.max(100,F.value.w-48),r=Math.max(100,F.value.h-48),i=n/e,a=r/t;return Math.max(.15,Math.min(i,a))}),Y=()=>{if(A.value){let e=A.value.clientWidth,t=A.value.clientHeight;if(e>0&&t>0)F.value={w:e,h:t};else{let e=A.value.getBoundingClientRect();e.width>0&&e.height>0&&(F.value={w:e.width,h:e.height})}}},X=()=>{ee(()=>{requestAnimationFrame(()=>{Y()})})},Z=()=>{N.value=N.value===`portrait`?`landscape`:`portrait`,X()},Ne=()=>{P.value=!P.value,X()},Pe=()=>{I.value=Date.now()},Fe=()=>{X()},Q=async()=>{let e=W.value;await R(),e===W.value&&k.value?.contentWindow&&k.value.contentWindow.postMessage({type:`kama-preview-update`,url:W.value},`*`)};p(O,e=>{e&&(j.value=`draft`)}),p(()=>g.paneWidthPx,()=>{Y()});let $=null;return a(()=>{typeof window<`u`&&window.addEventListener(`cms-node-updated`,Q),A.value&&(Y(),$=new ResizeObserver(()=>Y()),$.observe(A.value)),X()}),i(()=>{typeof window<`u`&&window.removeEventListener(`cms-node-updated`,Q),$&&$.disconnect()}),(e,i)=>(c(),l(`div`,he,[S(`header`,ge,[S(`div`,_e,[y(O)?(c(),h(me,{key:0,variant:`warning`,icon:y(fe),title:`Viewing Historical Snapshot`},{default:o(()=>[d(` v`+r(y(O)),1)]),_:1},8,[`icon`])):(c(),l(te,{key:1},[S(`button`,{type:`button`,class:u([`segmented-btn text-btn`,{active:y(j)===`draft`}]),onClick:i[0]||=e=>j.value=`draft`},` Draft `,2),S(`button`,{type:`button`,class:u([`segmented-btn text-btn`,{active:y(j)===`live`}]),onClick:i[1]||=e=>j.value=`live`},` Public `,2)],64))]),S(`div`,ve,[G.value?(c(),l(`button`,{key:0,type:`button`,class:u([`icon-btn zoom-btn`,{active:y(P)}]),title:y(P)?`Auto-Fit Active (Click for 1:1 Real Size)`:`1:1 Real Size Active (Click to Auto-Fit)`,onClick:Ne},[(c(),h(f(y(P)?y(le):y(ue)),{size:14}))],10,ye)):x(``,!0),S(`div`,{class:`device-menu-wrapper`,ref_key:`deviceTriggerRef`,ref:H,style:t({width:B.value})},[S(`button`,{type:`button`,class:`device-trigger-btn`,onClick:Oe},[n(y(de),{size:13,class:`trigger-icon`}),S(`span`,be,r(Ae.value),1),n(y(re),{size:12,class:`chevron-icon`})]),n(se,{show:V.value,items:De.value,"anchor-rect":U.value,"min-width":B.value,onSelect:ke,onClose:i[2]||=e=>V.value=!1},null,8,[`show`,`items`,`anchor-rect`,`min-width`])],4),G.value?(c(),l(`button`,{key:1,type:`button`,class:`icon-btn orientation-btn`,title:`Switch to ${q.value===`portrait`?`Landscape`:`Portrait`}`,onClick:Z},[n(y(pe),{size:14,style:t({transform:q.value===`landscape`?`rotate(90deg)`:`rotate(0deg)`,transition:`transform 0.2s`})},null,8,[`style`])],8,xe)):x(``,!0)]),S(`div`,Se,[S(`button`,{type:`button`,class:`icon-btn`,title:`Refresh Preview`,onClick:Pe},[n(y(ae),{size:13})]),S(`a`,{href:Me.value,target:`_blank`,class:`icon-btn`,title:`View JSON API Payload`},[n(y(ce),{size:13})],8,Ce),S(`a`,{href:W.value,target:`_blank`,class:`icon-btn`,title:`Open Preview in New Tab`},[n(y(oe),{size:13})],8,we),S(`button`,{type:`button`,class:`icon-btn close-btn`,title:`Close Split View`,onClick:i[3]||=e=>_(`close`)},[n(y(ie),{size:14})])])]),S(`div`,{ref_key:`stageRef`,ref:A,class:u([`preview-stage`,{"is-fixed-frame":G.value}])},[S(`div`,{class:`device-frame-wrapper`,style:t(G.value&&K.value.w&&K.value.h?{width:`${K.value.w*J.value}px`,height:`${K.value.h*J.value}px`}:{width:`100%`,height:`100%`})},[S(`div`,{class:`device-frame`,style:t(G.value&&K.value.w&&K.value.h?{width:`${K.value.w}px`,height:`${K.value.h}px`,transform:`scale(${J.value})`,transformOrigin:`top left`}:{width:`100%`,height:`100%`})},[(c(),l(`iframe`,{key:W.value,ref_key:`previewIframeRef`,ref:k,src:W.value,class:`preview-iframe`,title:je.value,onLoad:Fe},null,40,Te))],4)],4)],2)]))}}),[[`__scopeId`,`data-v-f9dd6bd0`]]);export{T as default};
1
+ import{$ as e,Ct as t,E as n,Et as r,F as i,I as a,K as o,O as s,P as ee,R as c,S as l,St as u,T as d,U as f,W as p,Y as m,b as h,g as te,j as g,lt as _,t as v,tt as y,v as b,x,y as S}from"./_plugin-vue_export-helper-CQxWhVtr.js";import{s as C,t as ne}from"./schema-helpers-DvficKko.js";import{i as re,n as ie,r as ae,t as w}from"./useLocalStorage-C805uplI.js";import{n as oe,t as se}from"./NodeContextMenu-C_HWBGeb.js";import{i as ce,n as le,r as ue,t as de}from"./monitor-CrpvInqG.js";import{t as fe}from"./history-pqIbKK9u.js";import{t as pe}from"./smartphone-EPce6VdP.js";import{t as me}from"./StatusPill-CbeW5SMT.js";g(),m(),_();var he={class:`split-preview-pane`},ge={class:`preview-toolbar`},_e={class:`segmented-control`},ve={class:`device-controls-group`},ye=[`title`],be={class:`trigger-label`},xe=[`title`],Se={class:`toolbar-right`},Ce=[`href`],we=[`href`],Te=[`src`,`title`],T=v(s({__name:`EditorSplitPreview`,props:{paneWidthPx:{}},emits:[`close`],setup(s,{emit:m}){let g=s,_=m,{activeNode:v,selectedChannelId:T,selectedLanguage:E,allChannels:D,activeSnapshotVersion:O,nodeSchemas:Ee}=C(),k=e(null),A=e(null),j=w(`kama_preview_mode`,`draft`),M=w(`kama_preview_device`,`desktop`),N=w(`kama_preview_orientation`,`portrait`),P=w(`kama_preview_autofit`,!0),F=e({w:800,h:800}),I=e(Date.now()),L=e(``),R=async()=>{let e=v.value?.id;if(!e)return;let t=D.value.find(e=>String(e.id)===String(T.value)),n=!1;if(t)try{let r=t.channelRoot;!r&&t.dataJson&&(r=(typeof t.dataJson==`string`?JSON.parse(t.dataJson):t.dataJson)?.channelRoot),typeof r==`string`&&(r=JSON.parse(r));let i=r?.nodeId??r?.id;i&&String(i)===String(e)&&(n=!0)}catch{}if(n){L.value=`/`;return}try{let n=t?.id||T.value||``,r=await fetch(`/api/cms/nodes.json?id=${e}&channelId=${n}`);if(r.ok){let e=await r.json();if(e.node?.path){L.value=e.node.path;return}}}catch(e){console.error(`Failed to fetch live canonical route`,e)}let r=v.value?.slug||``;L.value=r===`index`?`/`:`/${r.replace(/^\/+|\/+$/g,``)}`};p(()=>v.value?.id,R,{immediate:!0});let z={desktop:{label:`Desktop (100% Fluid)`,width:null,height:null},desktop_4k:{label:`4K UHD (3840 × 2160)`,width:3840,height:2160},desktop_fhd:{label:`Full HD (1920 × 1080)`,width:1920,height:1080},macbook_air:{label:`MacBook Air (1440 × 900)`,width:1440,height:900},laptop_std:{label:`Laptop (1366 × 768)`,width:1366,height:768},ipad_pro:{label:`iPad Pro 12.9" (1024 × 1366)`,width:1024,height:1366},ipad_air:{label:`iPad Air / Mini (820 × 1180)`,width:820,height:1180},ipad_standard:{label:`iPad 10th Gen (810 × 1080)`,width:810,height:1080},iphone_15_pro_max:{label:`iPhone 15 Pro Max (430 × 932)`,width:430,height:932},iphone_15_pro:{label:`iPhone 15 Pro (393 × 852)`,width:393,height:852},iphone_se:{label:`iPhone SE (375 × 667)`,width:375,height:667},samsung_s23:{label:`Samsung Galaxy S23 (360 × 780)`,width:360,height:780}},B=b(()=>{let e=0;return Object.values(z).forEach(t=>{t.label.length>e&&(e=t.label.length)}),`${Math.ceil(e*7.2)+48}px`}),V=e(!1),H=e(null),U=e(null),De=b(()=>Object.entries(z).map(([e,t])=>({key:e,label:t.label,title:t.label,isActive:M.value===e}))),Oe=()=>{if(V.value){V.value=!1;return}H.value&&(U.value=H.value.getBoundingClientRect()),V.value=!0},ke=e=>{M.value=String(e),V.value=!1,X()},Ae=b(()=>z[M.value]?.label||`Select Device`),je=b(()=>{if(!v.value)return`Untitled`;let e=Ee.value?.[v.value.nodeType||``];return ne(e,v.value)}),W=b(()=>{let e=D.value.find(e=>String(e.id)===String(T.value)),t=e?.baseUrl||e?.url||(typeof window<`u`?window.location.origin:``);if((t.includes(`localhost:8787`)||t.includes(`127.0.0.1:8787`))&&(t=t.replace(`8787`,`4321`)),t=t.replace(/\/$/,``),!v.value?.id)return t;let n=L.value;n.startsWith(`/`)||(n=`/${n}`);let r=n===`/`?``:n,i=E.value?`/${E.value}`:``,a=`${t}${i}${r}`,o=`_cb=${I.value}`;return O.value?`${a}?preview=true&revisionId=${O.value}&${o}`:`${a}?${j.value===`draft`?`preview=true&`:``}${o}`}),Me=b(()=>{if(!v.value)return`#`;let e=L.value;e.startsWith(`/`)||(e=`/${e}`);let t=e===`/`?``:e,n=E.value?`&lang=${E.value}`:``,r=O.value?`&revisionId=${O.value}`:``,i=j.value===`draft`||!!O.value;return`/api/v1/node${t}?channelId=${T.value}&preview=${i}${n}${r}`}),G=b(()=>M.value!==`desktop`),K=b(()=>{let e=z[M.value];if(!e||!e.width||!e.height)return{w:null,h:null};let t=N.value===`landscape`;return{w:t?e.height:e.width,h:t?e.width:e.height}}),q=b(()=>{let{w:e,h:t}=K.value;return!e||!t||e>t?`landscape`:`portrait`}),J=b(()=>{if(!G.value||!P.value)return 1;let{w:e,h:t}=K.value;if(!e||!t)return 1;let n=Math.max(100,F.value.w-48),r=Math.max(100,F.value.h-48),i=n/e,a=r/t;return Math.max(.15,Math.min(i,a))}),Y=()=>{if(A.value){let e=A.value.clientWidth,t=A.value.clientHeight;if(e>0&&t>0)F.value={w:e,h:t};else{let e=A.value.getBoundingClientRect();e.width>0&&e.height>0&&(F.value={w:e.width,h:e.height})}}},X=()=>{ee(()=>{requestAnimationFrame(()=>{Y()})})},Z=()=>{N.value=N.value===`portrait`?`landscape`:`portrait`,X()},Ne=()=>{P.value=!P.value,X()},Pe=()=>{I.value=Date.now()},Fe=()=>{X()},Q=async()=>{let e=W.value;await R(),e===W.value&&k.value?.contentWindow&&k.value.contentWindow.postMessage({type:`kama-preview-update`,url:W.value},`*`)};p(O,e=>{e&&(j.value=`draft`)}),p(()=>g.paneWidthPx,()=>{Y()});let $=null;return a(()=>{typeof window<`u`&&window.addEventListener(`cms-node-updated`,Q),A.value&&(Y(),$=new ResizeObserver(()=>Y()),$.observe(A.value)),X()}),i(()=>{typeof window<`u`&&window.removeEventListener(`cms-node-updated`,Q),$&&$.disconnect()}),(e,i)=>(c(),l(`div`,he,[S(`header`,ge,[S(`div`,_e,[y(O)?(c(),h(me,{key:0,variant:`warning`,icon:y(fe),title:`Viewing Historical Snapshot`},{default:o(()=>[d(` v`+r(y(O)),1)]),_:1},8,[`icon`])):(c(),l(te,{key:1},[S(`button`,{type:`button`,class:u([`segmented-btn text-btn`,{active:y(j)===`draft`}]),onClick:i[0]||=e=>j.value=`draft`},` Draft `,2),S(`button`,{type:`button`,class:u([`segmented-btn text-btn`,{active:y(j)===`live`}]),onClick:i[1]||=e=>j.value=`live`},` Public `,2)],64))]),S(`div`,ve,[G.value?(c(),l(`button`,{key:0,type:`button`,class:u([`icon-btn zoom-btn`,{active:y(P)}]),title:y(P)?`Auto-Fit Active (Click for 1:1 Real Size)`:`1:1 Real Size Active (Click to Auto-Fit)`,onClick:Ne},[(c(),h(f(y(P)?y(le):y(ue)),{size:14}))],10,ye)):x(``,!0),S(`div`,{class:`device-menu-wrapper`,ref_key:`deviceTriggerRef`,ref:H,style:t({width:B.value})},[S(`button`,{type:`button`,class:`device-trigger-btn`,onClick:Oe},[n(y(de),{size:13,class:`trigger-icon`}),S(`span`,be,r(Ae.value),1),n(y(re),{size:12,class:`chevron-icon`})]),n(se,{show:V.value,items:De.value,"anchor-rect":U.value,"min-width":B.value,onSelect:ke,onClose:i[2]||=e=>V.value=!1},null,8,[`show`,`items`,`anchor-rect`,`min-width`])],4),G.value?(c(),l(`button`,{key:1,type:`button`,class:`icon-btn orientation-btn`,title:`Switch to ${q.value===`portrait`?`Landscape`:`Portrait`}`,onClick:Z},[n(y(pe),{size:14,style:t({transform:q.value===`landscape`?`rotate(90deg)`:`rotate(0deg)`,transition:`transform 0.2s`})},null,8,[`style`])],8,xe)):x(``,!0)]),S(`div`,Se,[S(`button`,{type:`button`,class:`icon-btn`,title:`Refresh Preview`,onClick:Pe},[n(y(ae),{size:13})]),S(`a`,{href:Me.value,target:`_blank`,class:`icon-btn`,title:`View JSON API Payload`},[n(y(ce),{size:13})],8,Ce),S(`a`,{href:W.value,target:`_blank`,class:`icon-btn`,title:`Open Preview in New Tab`},[n(y(oe),{size:13})],8,we),S(`button`,{type:`button`,class:`icon-btn close-btn`,title:`Close Split View`,onClick:i[3]||=e=>_(`close`)},[n(y(ie),{size:14})])])]),S(`div`,{ref_key:`stageRef`,ref:A,class:u([`preview-stage`,{"is-fixed-frame":G.value}])},[S(`div`,{class:`device-frame-wrapper`,style:t(G.value&&K.value.w&&K.value.h?{width:`${K.value.w*J.value}px`,height:`${K.value.h*J.value}px`}:{width:`100%`,height:`100%`})},[S(`div`,{class:`device-frame`,style:t(G.value&&K.value.w&&K.value.h?{width:`${K.value.w}px`,height:`${K.value.h}px`,transform:`scale(${J.value})`,transformOrigin:`top left`}:{width:`100%`,height:`100%`})},[(c(),l(`iframe`,{key:W.value,ref_key:`previewIframeRef`,ref:k,src:W.value,class:`preview-iframe`,title:je.value,onLoad:Fe},null,40,Te))],4)],4)],2)]))}}),[[`__scopeId`,`data-v-f9dd6bd0`]]);export{T as default};