@blinkk/root-cms 3.1.4 → 3.1.5

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.
Files changed (102) hide show
  1. package/dist/app.js +3 -2
  2. package/dist/{chunk-NC3CRIFA.js → chunk-6CTCV2PN.js} +1 -1
  3. package/dist/{chunk-AFBSITEO.js → chunk-ETHWZSNM.js} +4 -0
  4. package/dist/{chunk-MYN76V3L.js → chunk-MUXSUGFF.js} +2 -2
  5. package/dist/cli.js +1 -1
  6. package/dist/client.js +1 -1
  7. package/dist/core/schema.d.ts +88 -3
  8. package/dist/core.js +1 -1
  9. package/dist/functions.js +2 -2
  10. package/dist/plugin.js +3 -3
  11. package/dist/ui/AIPage-25WICIOT.js +1 -0
  12. package/dist/ui/{AssetsPage-QUL2NBWK.js → AssetsPage-WKTM2J2G.js} +1 -1
  13. package/dist/ui/CollectionPage-5ZOVG7IG.js +1 -0
  14. package/dist/ui/{ComparePage-DCP5QHDE.js → ComparePage-DDIFYYTK.js} +1 -1
  15. package/dist/ui/{DataPage-TUVFBALT.js → DataPage-RFNGSDDN.js} +1 -1
  16. package/dist/ui/{DataSourcePage-YE2ZOHYI.js → DataSourcePage-U46CDIH2.js} +1 -1
  17. package/dist/ui/{DocTranslationsPage-3ILTQOP2.js → DocTranslationsPage-BFCM2PE3.js} +1 -1
  18. package/dist/ui/{DocumentPage-JFQ3Y2GH.js → DocumentPage-OTBXM55S.js} +1 -1
  19. package/dist/ui/{EditDataSourcePage-WHPZDMD4.js → EditDataSourcePage-NKKIF6AD.js} +1 -1
  20. package/dist/ui/EditReleasePage-TKNOUT7A.js +1 -0
  21. package/dist/ui/EmbeddedAIPage-4AX7VO3T.js +1 -0
  22. package/dist/ui/{EmbeddedDocumentPage-6FYHUHTE.js → EmbeddedDocumentPage-2CNQJTW5.js} +1 -1
  23. package/dist/ui/{ImageEditorDialog-Q44YTLB5.js → ImageEditorDialog-YDKOGVJV.js} +1 -1
  24. package/dist/ui/LogsPage-SCECIAZH.js +1 -0
  25. package/dist/ui/{NewDataSourcePage-QXW54CHQ.js → NewDataSourcePage-FAOPK2RZ.js} +1 -1
  26. package/dist/ui/NewReleasePage-HD6T6UV2.js +1 -0
  27. package/dist/ui/{NotFoundPage-RMNPVSD3.js → NotFoundPage-JRYFUENW.js} +1 -1
  28. package/dist/ui/{ProjectPage-VY4EJX6J.js → ProjectPage-2WIMWCSX.js} +1 -1
  29. package/dist/ui/ReleasePage-GUMEMLF6.js +1 -0
  30. package/dist/ui/{ReleasesPage-A4BLUNJE.js → ReleasesPage-AW6PICTQ.js} +1 -1
  31. package/dist/ui/{SettingsPage-MP3YHQDP.js → SettingsPage-KFLNZ356.js} +1 -1
  32. package/dist/ui/{SidebarToolsPage-S5DMIEQ6.js → SidebarToolsPage-3R7BQ2F7.js} +1 -1
  33. package/dist/ui/{TaskPage-LCBDMA4I.js → TaskPage-GZGPKIL5.js} +1 -1
  34. package/dist/ui/TasksPage-G3GBTV3L.js +1 -0
  35. package/dist/ui/{TranslationsArbPage-B7TIRREV.js → TranslationsArbPage-K272JEAA.js} +1 -1
  36. package/dist/ui/{TranslationsEditPage-VQG4YHA6.js → TranslationsEditPage-XWXPNKRQ.js} +1 -1
  37. package/dist/ui/{TranslationsPage-6VCVMNXI.js → TranslationsPage-7KUHVTLK.js} +1 -1
  38. package/dist/ui/{chunk-IMXZTYAA.js → chunk-2FQMT5AB.js} +1 -1
  39. package/dist/ui/{chunk-EYVQCOAD.js → chunk-2PTLQRTU.js} +1 -1
  40. package/dist/ui/{chunk-FF4CLAZS.js → chunk-2RRM4HEQ.js} +1 -1
  41. package/dist/ui/{chunk-MAZJRNAL.js → chunk-34W6H4YG.js} +1 -1
  42. package/dist/ui/{chunk-L3O3CLWO.js → chunk-44ZU5WMI.js} +1 -1
  43. package/dist/ui/{chunk-MYKJ6VAM.js → chunk-535JU7FU.js} +1 -1
  44. package/dist/ui/{chunk-JSWRHHTZ.js → chunk-5KSGCGYY.js} +1 -1
  45. package/dist/ui/{chunk-UHK5N75L.js → chunk-75NMQ3LW.js} +1 -1
  46. package/dist/ui/{chunk-W2ZAVRAT.js → chunk-7UHZS56B.js} +57 -57
  47. package/dist/ui/{chunk-76PG55CM.js → chunk-DWV5J2W7.js} +1 -1
  48. package/dist/ui/{chunk-VB5VMEN7.js → chunk-F7RQT4XN.js} +1 -1
  49. package/dist/ui/{chunk-CSUKZZK5.js → chunk-FVWSVOOY.js} +1 -1
  50. package/dist/ui/{chunk-V3G3554T.js → chunk-GCSN3YEC.js} +1 -1
  51. package/dist/ui/{chunk-74OB6FM4.js → chunk-H37RXS4R.js} +1 -1
  52. package/dist/ui/{chunk-LC6WLVRS.js → chunk-HV3JJ5UT.js} +1 -1
  53. package/dist/ui/{chunk-K3UM5OQF.js → chunk-HXSB6YB2.js} +1 -1
  54. package/dist/ui/{chunk-AZ2SK2ZK.js → chunk-IGZDFHVM.js} +1 -1
  55. package/dist/ui/chunk-ISUGBMXC.js +1 -0
  56. package/dist/ui/{chunk-WN7HUDGY.js → chunk-JBLSUM6W.js} +1 -1
  57. package/dist/ui/{chunk-F4F5MH7A.js → chunk-N5RJIILP.js} +1 -1
  58. package/dist/ui/{chunk-KBJ4AK5O.js → chunk-NCZD5IWS.js} +1 -1
  59. package/dist/ui/{chunk-NEA3XU6N.js → chunk-NXWYS4HG.js} +1 -1
  60. package/dist/ui/{chunk-4N6CPIOQ.js → chunk-OWBT6YUM.js} +1 -1
  61. package/dist/ui/chunk-OWYV43BT.js +1 -0
  62. package/dist/ui/{chunk-XM35ZJBQ.js → chunk-PIJ3E47R.js} +1 -1
  63. package/dist/ui/{chunk-WAT22UHZ.js → chunk-PLYSJ7W5.js} +1 -1
  64. package/dist/ui/{chunk-H3PYPGNR.js → chunk-QFDU6FXP.js} +1 -1
  65. package/dist/ui/{chunk-W3ICOHMF.js → chunk-QLIIVG5Q.js} +1 -1
  66. package/dist/ui/{chunk-ELKXEMOU.js → chunk-QRAFYIAW.js} +1 -1
  67. package/dist/ui/{chunk-VRRRFAIV.js → chunk-QWB6MAPJ.js} +1 -1
  68. package/dist/ui/{chunk-GCMX5V3P.js → chunk-RB23LLKL.js} +1 -1
  69. package/dist/ui/{chunk-3WQCVKK4.js → chunk-T5BJNOWE.js} +1 -1
  70. package/dist/ui/chunk-TNW2GNUR.js +1 -0
  71. package/dist/ui/{chunk-HVYNDEA7.js → chunk-UCYWQEAS.js} +1 -1
  72. package/dist/ui/{chunk-6P75AZ3B.js → chunk-UJX25CXD.js} +1 -1
  73. package/dist/ui/chunk-UPN3EMUS.js +1 -0
  74. package/dist/ui/{chunk-5SY2SVEX.js → chunk-VPZHG7JL.js} +1 -1
  75. package/dist/ui/{chunk-WS37MDM3.js → chunk-WASID5UU.js} +1 -1
  76. package/dist/ui/{chunk-2PDMFZBF.js → chunk-WC7KMPEQ.js} +1 -1
  77. package/dist/ui/chunk-WRA24P66.js +7 -0
  78. package/dist/ui/{chunk-ETPZ3TXX.js.LEGAL.txt → chunk-WRA24P66.js.LEGAL.txt} +4 -1
  79. package/dist/ui/{chunk-XJUQOX4E.js → chunk-XUBZH4ON.js} +1 -1
  80. package/dist/ui/{chunk-QHOZXW7Y.js → chunk-Y5EOMMNI.js} +1 -1
  81. package/dist/ui/{chunk-EIMRPYCD.js → chunk-YBHFGQ3Z.js} +1 -1
  82. package/dist/ui/{chunk-62VPTZJL.js → chunk-YP6ZH3MT.js} +1 -1
  83. package/dist/ui/{chunk-PR7NB5VK.js → chunk-Z3ZJJWFT.js} +1 -1
  84. package/dist/ui/ui.css +1 -1
  85. package/dist/ui/ui.js +1 -1
  86. package/package.json +3 -3
  87. package/dist/ui/AIPage-4W4MFELY.js +0 -1
  88. package/dist/ui/CollectionPage-7VU6SUUP.js +0 -1
  89. package/dist/ui/EditReleasePage-QKWHIURV.js +0 -1
  90. package/dist/ui/EmbeddedAIPage-SQLOV4IT.js +0 -1
  91. package/dist/ui/LogsPage-RC5O722W.js +0 -1
  92. package/dist/ui/NewReleasePage-TKYWVTOH.js +0 -1
  93. package/dist/ui/ReleasePage-VZAL4KUI.js +0 -1
  94. package/dist/ui/TasksPage-72KVSUQY.js +0 -1
  95. package/dist/ui/chunk-ETPZ3TXX.js +0 -7
  96. package/dist/ui/chunk-J5KDO4RM.js +0 -1
  97. package/dist/ui/chunk-SLLTYDVX.js +0 -1
  98. package/dist/ui/chunk-SWTNOWNE.js +0 -1
  99. package/dist/ui/chunk-YV5SGR24.js +0 -1
  100. /package/dist/ui/{ImageEditorDialog-Q44YTLB5.js.LEGAL.txt → ImageEditorDialog-YDKOGVJV.js.LEGAL.txt} +0 -0
  101. /package/dist/ui/{chunk-W2ZAVRAT.js.LEGAL.txt → chunk-7UHZS56B.js.LEGAL.txt} +0 -0
  102. /package/dist/ui/{chunk-5SY2SVEX.js.LEGAL.txt → chunk-VPZHG7JL.js.LEGAL.txt} +0 -0
@@ -1 +0,0 @@
1
- import{b as le}from"./chunk-LC6WLVRS.js";import{a as oe}from"./chunk-CSUKZZK5.js";import{a as ee,b as R,c as T}from"./chunk-JDW4UORS.js";import{a as ie}from"./chunk-YDO2EDVY.js";import{a as M}from"./chunk-5MV6XVGA.js";import{b as te}from"./chunk-EYVQCOAD.js";import{a as $}from"./chunk-XM35ZJBQ.js";import{a as j}from"./chunk-KBJ4AK5O.js";import{P as re,c as ne}from"./chunk-YV5SGR24.js";import{b as K,f as U,g as _,i as y,o as Y}from"./chunk-XOWWPE7X.js";import{d as Z,e as se}from"./chunk-WS37MDM3.js";import{A as G,Ga as f,a as p,c as w,da as P,e as v,g as B,h as I,i as W,j as O,ra as Q,ua as q,za as J}from"./chunk-ETPZ3TXX.js";import{j as X,k as Se}from"./chunk-KUCVLANF.js";function z(e){let t=window.__ROOT_CTX.collections[e.collectionId];if(!t)throw new Error(`collection not found: ${e.collectionId}`);if(!t.url)return"";let n=t.domain||window.__ROOT_CTX.rootConfig.domain||"https://example.com",r=Ee(e);return`${n}${r}`}function Ee(e){let o=window.__ROOT_CTX.collections,{collectionId:t,slug:n,locale:r}=e,s=o[t];if(!s)throw new Error(`collection not found: ${t}`);if(!s.url)return"";let l=window.__ROOT_CTX.rootConfig,g=l.base||"/",u="/[base]/[path]";r&&(u=l.i18n.urlFormat||"/[locale]/[base]/[path]");let d="",a=s?.url;if(a)if(n){let c=a.replace(/\[.*slug\]/,n).replaceAll("--","/").replace(/\/+/g,"/");c==="/index"&&(c="/"),d=c}else d=a;return ce(u,{base:g,path:d,locale:r||"",slug:n})}function ye(e){let o=window.__ROOT_CTX.collections,{collectionId:t,slug:n,locale:r}=e,s=o[t];if(!s)throw new Error(`collection not found: ${t}`);let l=window.__ROOT_CTX.rootConfig,g=l.base||"/",u="/[base]/[path]";r&&(u=l.i18n.urlFormat||"/[locale]/[base]/[path]");let d="",a=s?.previewUrl||s?.url;if(a)if(n){let c=a.replace(/\[.*slug\]/,n).replaceAll("--","/").replace(/\/+/g,"/");c==="/index"&&(c="/"),d=c}else d=a;return ce(u,{base:g,path:d,locale:r||"",slug:n})}function ce(e,o){let t=e.replaceAll(/\[\[?(\.\.\.)?([\w\-_]*)\]?\]/g,(n,r,s)=>o[s]??n);return Ce(t,{trailingSlash:window.__ROOT_CTX.rootConfig.server.trailingSlash})}function Ce(e,o){return e=e.replace(/\/+/g,"/"),o?.trailingSlash===!1&&e!=="/"&&e.endsWith("/")&&(e=e.replace(/\/*$/g,"")),(e.endsWith("/index")||e.endsWith("/index/"))&&(e=e.slice(0,-6)),e.startsWith("/")||(e=`/${e}`),o?.trailingSlash&&!e.endsWith("/")&&(e=`${e}/`),e}O();function Re(e,o){let[t,n]=p([]),[r,s]=p(!0),g=le().db,u=window.__ROOT_CTX.rootConfig.projectId||"default",d=o.includeArchived??!1,a=async()=>{s(!0);let c=K(g,"Projects",u,"Collections",e,"Drafts"),i=c,m=o.orderBy;if(m==="modifiedAt")i=_(c,y("sys.modifiedAt","desc"));else if(m==="newest")i=_(c,y("sys.createdAt","desc"));else if(m==="oldest")i=_(c,y("sys.createdAt"));else if(m==="slug")i=_(c,y(U()));else if(m==="slugDesc")i=_(c,y(U(),"desc"));else{let S=window.__ROOT_CTX.collections[e]?.sortOptions?.find(C=>C.id===m);S&&(i=S.direction==="desc"?_(c,y(S.field,"desc")):_(c,y(S.field)))}await te(async()=>{let h=await Y(i),S=[];h.docs.forEach(C=>{let k=C.data(),E=C.id,b=`${e}/${E}`,x={...k,id:b,slug:E};ne(b,x),!(!d&&x?.sys?.archivedAt)&&S.push(x)}),n(S)}),s(!1)};return w(()=>{s(!0),a()},[e,o.orderBy,d]),[r,a,t]}Se();O();var D={CONNECTED:"connected",SCHEMA_CHANGED:"schemaChanged"};function ae(e){let t=new URLSearchParams(window.location.search).get("e");return t?t.split(",").includes(e):!1}var ve="/cms/api/sse.connect",L=ae("EnableVerboseLogging"),ue=window.location.hostname==="localhost",F=class{constructor(){this.map=new Map}on(o,t){return this.map.has(o)||this.map.set(o,new Set),this.map.get(o).add(t),()=>{this.map.get(o)?.delete(t)}}emit(o,t,n){this.map.get(o)?.forEach(r=>r(t,n)),this.map.get("*")?.forEach(r=>r({type:o,data:t},n))}},fe=X(null);function Fe(e){let t=v(new F).current,n=v(null),r=v(!1),s=v({attempt:0,timer:0}),l=v(""),g=()=>{n.current&&(n.current.close(),n.current=null)},u=I(()=>{L&&console.log("[sse] connecting..."),g();let a=new EventSource(ve);n.current=a,a.addEventListener(D.CONNECTED,i=>{if(L&&console.log("[sse] connected"),r.current=!1,s.current.attempt=0,ue){let h=de(i.data)?.serverVersion||"";l.current?l.current!==h&&(console.log(`server version changed: ${l.current} -> ${h}`),console.log("reloading..."),window.location.reload()):l.current=h}});let c=i=>{if(!i||!i.type)return;let m=de(i.data);L&&console.log("[sse] event:",i.type,m),t.emit(i.type,m,i)};Object.values(D).forEach(i=>{a.addEventListener(i,c)}),a.addEventListener("error",()=>{L&&console.log("[sse] disconnected"),a.readyState===EventSource.CLOSED&&!r.current&&(r.current=!0,(()=>{let m=++s.current.attempt,h=Math.min(3e4,Math.pow(2,m)*500),S=Math.random()*.3*h,C=h+S;window.clearTimeout(s.current.timer),s.current.timer=window.setTimeout(()=>{r.current=!1,u()},C)})())})},[t]);w(()=>{if(!ue)return;u();let a=()=>{document.visibilityState==="visible"&&n.current?.readyState!==EventSource.OPEN&&u()};return document.addEventListener("visibilitychange",a),()=>{document.removeEventListener("visibilitychange",a),window.clearTimeout(s.current.timer),g()}},[u]);let d=B(()=>({emitter:t}),[t]);return f(fe.Provider,{value:d,children:e.children})}function de(e){try{return JSON.parse(e)}catch{return e}}function ge(e,o){let t=W(fe);if(!t)throw new Error("useSSE() must be used within an <SSEProvider>");let n=v(o);w(()=>{n.current=o},[o]),w(()=>t.emitter.on(e,(r,s)=>n.current(r,s)),[t,e])}O();O();function me(e){let[o,t]=p(!0),[n,r]=p(null),s=I(async()=>{try{let l=await ie(e);r(l)}catch(l){console.error(l),$({title:`Failed to load collection: ${e}`,message:String(l),color:"red",autoClose:!1})}t(!1)},[e]);return w(()=>{s()},[e]),ge(D.SCHEMA_CHANGED,async l=>{await s();let g=l.file?`Applied updates from changes to ${l.file}.`:"Applied updates from changes to a .schema.ts file.";$({title:"Updated schema!",message:g})}),{loading:o,schema:n}}function H(e){let o={_array:[]};return e.forEach(t=>{let n=we();o._array.push(n),o[n]=t}),o}function we(){let e=[],o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",t=o.length;for(let n=0;n<6;n++)e.push(o.charAt(Math.floor(Math.random()*t)));return e.join("")}function V(e){let o={};return e.fields.forEach(t=>{t.id&&(t.type==="array"&&t.default&&Array.isArray(t.default)?o[t.id]=H(t.default):t.default?o[t.id]=t.default:t.type==="object"&&(o[t.id]=V(t)))}),o}function A(e,o,t){let n={...o};return e.fields.forEach(r=>{if(!r.id)return;let s=n[r.id];if(s!=null){if(r.type==="array"&&Array.isArray(s)){let l=s.map(g=>_e(r.of,g,t));n[r.id]=H(l)}else if(r.type==="object"&&M(s))n[r.id]=A(r,s,t);else if(r.type==="oneof"&&M(s)&&typeof s._type=="string"&&t){let l=t[s._type];l&&(n[r.id]=A(l,s,t))}}}),n}function _e(e,o,t){if(!M(o))return o;if(e.type==="object")return A(e,o,t);if(e.type==="oneof"&&typeof o._type=="string"&&t){let n=t[o._type];if(n)return A(n,o,t)}return o}O();function pe(e){let[o,t]=p(e.collectionId||""),n=v(null),[r,s]=p(e.initialSlug||""),l=window.__ROOT_CTX.collections[o],g=[];e.collectionId&&e.collectionDisabled?g.push({value:e.collectionId,label:e.collectionId}):Object.keys(window.__ROOT_CTX.collections).forEach(i=>{g.push({value:i,label:i})});let u="",d="";if(l?.url){if(r){let i=T(r),m=l?.slugRegex;ee(i,m)?u=z({collectionId:o,slug:i}):d=R(i,m)}else u=z({collectionId:o,slug:"[slug]"});u.endsWith("/index")&&(u=u.replace(/\/index$/,"/"))}function a(i){t(i),e.onChange&&e.onChange({collectionId:i,slug:r})}function c(i){s(i),e.onChange&&e.onChange({collectionId:o,slug:i})}return f("div",{className:se(e.className,"SlugInput"),children:[f("div",{className:"SlugInput__inputs",children:[f(J,{className:"SlugInput__collection",placeholder:"Collection",size:"xs",data:g,onChange:i=>a(i),value:o,disabled:!!e.collectionDisabled}),f("div",{className:"SlugInput__divider",children:"/"}),f(q,{className:"SlugInput__slug",name:"slug",ref:n,value:r,onChange:i=>{c(i.currentTarget.value)},placeholder:"slug",autoComplete:"off",size:"xs"})]}),u&&f(j,{className:"SlugInput__urlHelp",size:"body-sm",children:u}),d&&f(j,{className:"SlugInput__slugError",size:"body-sm",children:d})]})}function bt(e){let{route:o}=Z(),t=G(),n=e.collection,r=window.__ROOT_CTX.collections[n];if(!r)throw new Error(`collection not found: ${n}`);let[s]=p(()=>r.autoSlug?oe(r.autoSlug):""),[l,g]=p(s),[u,d]=p(!1),[a,c]=p(()=>S(s)),[i,m]=p(""),h=me(n);function S(E){let b=T(E);return b?R(b,r.slugRegex):""}function C(){e.onClose&&e.onClose()}async function k(E){if(E.preventDefault(),d(!0),c(""),S(l)){d(!1);return}let x=T(l),he=`${n}/${x}`;try{let N={};!h.loading&&h.schema&&(N=await V(h.schema)),await re(he,{fields:N})}catch(N){m(String(N)),d(!1);return}d(!1),e.skipNavigation?C():o(`/cms/content/${e.collection}/${x}`)}return f(Q,{className:"NewDocModal",opened:e.opened||!1,onClose:()=>C(),title:"New",size:"500px",overlayColor:t.colorScheme==="dark"?t.colors.dark[9]:t.colors.gray[2],children:[f("div",{className:"NewDocModal__body",children:"Enter a slug for the new doc. The slug is the ID of the page and is what's used in the URL. Use only lowercase letters, numbers, and dashes."}),f("form",{onSubmit:E=>k(E),children:[f(pe,{className:"NewDocModal__slug",collectionId:n,initialSlug:s,onChange:E=>{g(E.slug),c(S(E.slug)),m("")}}),i&&f("div",{className:"NewDocModal__slugError",children:i}),f("div",{className:"NewDocModal__buttons",children:[f(P,{variant:"outline",onClick:()=>C(),type:"button",size:"xs",color:"dark",children:"Cancel"}),f(P,{variant:"filled",type:"submit",size:"xs",color:"dark",loading:h.loading||u,disabled:!!a||!!i,children:"Submit"})]})]})]})}export{z as a,Ee as b,ye as c,pe as d,Re as e,Fe as f,me as g,V as h,A as i,bt as j};
@@ -1 +0,0 @@
1
- import{c as F}from"./chunk-CSUKZZK5.js";import{b as P}from"./chunk-5MV6XVGA.js";import{b as $}from"./chunk-EYVQCOAD.js";import{N as T,b as S}from"./chunk-YV5SGR24.js";import{B as b,z as p}from"./chunk-XOWWPE7X.js";import{e as w}from"./chunk-WS37MDM3.js";import{Fa as g,Ga as t,V as N,a as f,ba as l,c as h,e as k,i as R,j as B,la as I}from"./chunk-ETPZ3TXX.js";import{d as y,j as x,k as M}from"./chunk-KUCVLANF.js";M();B();var L=x(null);function W(e){let[i,n]=f([]),[o,a]=f(!1),r=k("idle");function u(){r.current==="idle"&&(r.current="fetching",a(!0),F().then(s=>{let c=s.filter(m=>!m.publishedAt&&!m.archivedAt);n(c)}).catch(s=>{console.error("Failed to fetch pending releases:",s)}).finally(()=>{r.current="done",a(!1)}))}function d(s){return i.filter(c=>c.docIds?.includes(s))}return t(L.Provider,{value:{releases:i,getReleasesForDoc:d,loading:o,fetchReleases:u},children:e.children})}function A(){let e=R(L);if(!e)throw new Error("usePendingReleases must be used within a <PendingReleasesProvider>");let{fetchReleases:i,...n}=e;return h(()=>{i()},[]),n}function z(e){let i={transition:"pop"},n=e.doc,o=n.sys;return t("div",{className:"DocStatusBadges",children:[(!o.publishedAt||!o.modifiedAt||o.modifiedAt>o.publishedAt)&&t(g,{...i,label:`Modified ${_(o.modifiedAt)} by ${o.modifiedBy}`,children:t(l,{size:"xs",variant:"gradient",gradient:{from:"indigo",to:"cyan"},children:"Draft"})}),!!o.publishedAt&&t(g,{...i,label:`Published ${_(o.publishedAt)} by ${o.publishedBy}`,children:t(l,{size:"xs",variant:"gradient",gradient:{from:"teal",to:"lime",deg:105},children:"Published"})}),!!o.scheduledAt&&t(g,{...i,label:`Scheduled ${b(o.scheduledAt)} by ${o.scheduledBy}`,children:t(l,{size:"xs",variant:"gradient",gradient:{from:"grape",to:"pink",deg:35},children:"Scheduled"})}),!e.hideReleases&&t(K,{docId:e.docId||n.id,tooltipProps:i}),T(n)&&t(g,{...i,label:O(n),children:t(l,{size:"xs",variant:"gradient",gradient:{from:"orange",to:"red"},className:e.onPublishingLockClick?"DocStatusBadges__badge--clickable":void 0,style:e.onPublishingLockClick?{cursor:"pointer"}:void 0,role:e.onPublishingLockClick?"button":void 0,tabIndex:e.onPublishingLockClick?0:void 0,onClick:e.onPublishingLockClick,onKeyDown:e.onPublishingLockClick?a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),e.onPublishingLockClick())}:void 0,children:"Locked"})}),!!o.archivedAt&&t(g,{...i,label:`Archived ${_(o.archivedAt)} by ${o.archivedBy}`,children:t(l,{size:"xs",variant:"gradient",gradient:{from:"gray",to:"dark"},children:"Archived"})})]})}function O(e){let i=e.sys?.publishingLocked;return i?i.until?`Locked until ${b(i.until)} by ${i.lockedBy}: "${i.reason}"`:`Locked by ${i.lockedBy}: "${i.reason}"`:""}function K(e){let{getReleasesForDoc:i}=A(),n=i(e.docId);return n.length===0?null:t(y,{children:n.map(o=>t(g,{...e.tooltipProps,label:`In release: ${o.id}`,children:t(l,{component:"a",href:`/cms/releases/${o.id}`,size:"xs",variant:"gradient",gradient:{from:"violet",to:"grape"},style:{cursor:"pointer"},children:o.id})},o.id))})}function _(e){return e?p(e.toMillis()):p(new Date().getTime())}function E(e){let{file:i,width:n,height:o,withPlaceholder:a,className:r,alt:u}=e,d=typeof i=="string"?i:i?.src;return U(i)?t(X,{className:r,src:d,width:n,height:o}):t(I,{className:r,src:d,width:n,height:o,withPlaceholder:a,alt:u})}function U(e){if(!e)return!1;if(typeof e=="string")return/\.mp4($|\?)/i.test(e);if(typeof e.mimeType=="string")return e.mimeType.toLowerCase()==="video/mp4";let i=e.src;return typeof i!="string"?!1:/\.mp4($|\?)/i.test(i)}function X(e){return t("video",{className:e.className,src:e.src,width:e.width,height:e.height,muted:!0,playsInline:!0,preload:"metadata",style:{width:`${e.width}px`,height:`${e.height}px`,backgroundColor:"#f1f3f5",objectFit:"cover",display:"block"}})}B();function De(e){let i=e.docId,[n,o]=f(e.doc),[a,r]=f(!e.doc);async function u(){r(!0),await $(async()=>{let V=await S(i);o(V)}),r(!1)}if(h(()=>{u()},[i]),a)return t("div",{className:w(e.className,"DocPreviewCard","DocPreviewCard--loading",e.variant&&`DocPreviewCard--${e.variant}`),children:t(N,{color:"gray",size:"sm"})});if(!n)return;let[d]=i.split("/"),s=n.fields||{},c=window.__ROOT_CTX.collections[d];if(!c)return console.error(`could not find collection: ${d}`),t("div",{className:"DocPreviewCard",children:["Collection ",t("b",{children:d})," not found."]});let m=P(s,c.preview?.title||"meta.title"),C=P(s,c.preview?.image||"meta.image")||c.preview?.defaultImage,D="div",v={};return e.clickable&&(D="a",v.href=`/cms/content/${e.docId}`,v.target="_blank"),t(D,{className:w(e.className,"DocPreviewCard",e.variant&&`DocPreviewCard--${e.variant}`),...v,children:[t("div",{className:"DocPreviewCard__image",children:t(E,{file:C,width:80,height:60,withPlaceholder:!C?.src})}),t("div",{className:"DocPreviewCard__content",children:[t("div",{className:"DocPreviewCard__content__header",children:t("div",{className:"DocPreviewCard__content__header__docId",children:n.id})}),t("div",{className:"DocPreviewCard__content__title",children:m||"[UNTITLED]"}),e.statusBadges&&n&&t("div",{className:"DocPreviewCard__content__badges",children:t(z,{doc:n,hideReleases:e.hideReleases})})]})]})}export{W as a,A as b,z as c,O as d,E as e,De as f};
@@ -1 +0,0 @@
1
- import{e}from"./chunk-WS37MDM3.js";import{Ga as o}from"./chunk-ETPZ3TXX.js";function n(r){return o("div",{className:e(r.className,"Surface"),children:r.children})}export{n as a};
@@ -1 +0,0 @@
1
- import{a as te,g as se,h as U,i as oe,j as ne,m as ie}from"./chunk-DZYYWCHX.js";import{D as p,a as k,b as I,c as l,f as J,g as x,h as D,i as O,j as F,l as Y,n as B,o as j,p as M,q as w,r as Z,t as $,u as R,v as m,w as ee,x as T}from"./chunk-XOWWPE7X.js";import{k as N}from"./chunk-7SK47HHZ.js";function re(e){return typeof e=="object"&&!Array.isArray(e)&&e!==null}function ce(e){return re(e)&&Array.isArray(e.blocks)&&e.blocks.length>0}var X=new Map;function Re(e){return X.get(e)||null}async function We(e){let t=Re(e);if(t)return t;let s=b(e),o=(await B(s)).data();return De(e,o),o}function De(e,t){X.set(e,t)}function q(e){X.delete(e)}function L(e){for(let t of e)q(t)}function ae(e){e||(e=6);let t=[],s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=s.length;for(let o=0;o<e;o++)t.push(s.charAt(Math.floor(Math.random()*n)));return t.join("")}var v=class extends Error{},le=200,Ce=/[/\\\u0000-\u001f]/;function C(){let e=window.__ROOT_CTX.rootConfig.projectId,t=window.firebase.db;return I(t,"Projects",e,"Assets")}var Te="root-cms:assetPicker:lastFolder";function ue(){let e=window.__ROOT_CTX.rootConfig.projectId;return`${Te}:${e}`}function rt(){try{return localStorage.getItem(ue())||""}catch{return""}}function ct(e){try{localStorage.setItem(ue(),e||"")}catch{}}function H(e){let t=(e||"").trim();if(!t)throw new v("Name is required.");if(t.length>le)throw new v(`Name is too long (max ${le} chars).`);if(Ce.test(t))throw new v("Name cannot contain slashes.");if(t==="."||t==="..")throw new v("Invalid name.");return t}function _(e,t){return e?`${e}/${t}`:t}function at(e){return e?e.split("/").filter(Boolean):[]}function E(e){return`folder-${encodeURIComponent(e)}`}function me(e){return e.sort((t,s)=>t.type!==s.type?t.type==="folder"?-1:1:(t.name||"").localeCompare(s.name||"",void 0,{numeric:!0,sensitivity:"base"}))}function pe(e){return!!e&&typeof e.name=="string"&&(e.type==="file"||e.type==="folder")}async function Be(e){let t=C(),s=x(t,D("parent","==",e||"")),n=await j(s),o=[];return n.forEach(i=>{let r=i.data();pe(r)&&o.push(r)}),me(o)}var de=1e3;async function lt(e){let t=C(),s;e?s=x(t,D("parent",">=",e),D("parent","<=",`${e}\uF8FF`),F(de)):s=x(t,F(de));let n=await j(s),o=[];return n.forEach(i=>{let r=i.data();pe(r)&&(!e||Q(r.parent,e))&&o.push(r)}),me(o)}function dt(e,t){return t?e===t?"":e.startsWith(`${t}/`)?e.slice(t.length+1):e:e}async function P(e){let t=l(C(),e),s=await B(t);return s.exists()?s.data():null}async function ft(e,t){let s=H(t),n=_(e,s),o=E(n),i=l(C(),o),r={id:o,type:"folder",parent:e||"",name:s,createdAt:m(),createdBy:window.firebase.user.email,modifiedAt:m(),modifiedBy:window.firebase.user.email};return await M(i,r,{merge:!0}),p("asset.folder_create",{metadata:{folder:n}}),await P(o)}async function ut(e){let t=W(e.file),s=H(e.name||t.filename||Fe(t.src)),n=ae(12),o=l(C(),n);return await M(o,{id:n,type:"file",parent:e.parent||"",name:s,file:t,createdAt:m(),createdBy:window.firebase.user.email,modifiedAt:m(),modifiedBy:window.firebase.user.email}),p("asset.upload",{metadata:{assetId:n,name:s}}),await P(n)}async function mt(e,t){let s=H(t);if(s===e.name)return;if(e.type==="folder"){let o=_(e.parent,e.name),i=_(e.parent,s);await ge(e,i,s,e.parent),p("asset.rename",{metadata:{from:o,to:i}});return}let n=l(C(),e.id);await w(n,{name:s,modifiedAt:m(),modifiedBy:window.firebase.user.email}),p("asset.rename",{metadata:{assetId:e.id,from:e.name,to:s}})}async function pt(e,t){let s=t||"";if(s===e.parent)return;if(e.type==="folder"){let o=_(e.parent,e.name),i=_(s,e.name);if(i===o||Q(i,o))throw new Error("Cannot move a folder into itself.");await ge(e,i,e.name,s),p("asset.move",{metadata:{from:o,to:i}});return}let n=l(C(),e.id);await w(n,{parent:s,modifiedAt:m(),modifiedBy:window.firebase.user.email}),p("asset.move",{metadata:{assetId:e.id,from:e.parent,to:s}})}function Q(e,t){return e===t||e.startsWith(`${t}/`)}async function ge(e,t,s,n){let o=_(e.parent,e.name),i=C(),r=window.firebase.db,c=x(i,D("parent",">=",o),D("parent","<=",`${o}\uF8FF`)),a=await j(c),f=[];a.forEach(h=>{let A=h.data();Q(A.parent,o)&&f.push(A)});let d=T(r),g=0,y=async()=>{g+=1,g>=400&&(await d.commit(),d=T(r),g=0)},u=E(t);d.set(l(i,u),{id:u,type:"folder",parent:n,name:s,createdAt:e.createdAt??m(),createdBy:e.createdBy??window.firebase.user.email,modifiedAt:m(),modifiedBy:window.firebase.user.email}),await y();for(let h of f){let A=t+h.parent.slice(o.length);if(h.type==="folder"){let S=_(A,h.name);d.set(l(i,E(S)),{...h,id:E(S),parent:A,modifiedAt:m(),modifiedBy:window.firebase.user.email}),await y(),d.delete(l(i,h.id)),await y()}else d.update(l(i,h.id),{parent:A,modifiedAt:m(),modifiedBy:window.firebase.user.email}),await y()}u!==e.id&&(d.delete(l(i,e.id)),g+=1),g>0&&await d.commit()}async function gt(e){if(e.type==="folder"){let t=_(e.parent,e.name);if((await Be(t)).length>0)throw new Error("Folder is not empty.")}await Z(l(C(),e.id)),p("asset.delete",{metadata:{assetId:e.id,name:e.name}})}async function yt(e,t){let s=W(t);!s.alt&&e.file?.alt&&(s.alt=e.file.alt),e.file?.altDisabled&&(s.altDisabled=!0);let n=l(C(),e.id),o={file:s,modifiedAt:m(),modifiedBy:window.firebase.user.email},i=N(s.filename||s.src||""),r=je(e.name,i);return r!==e.name&&(o.name=r),await w(n,o),p("asset.replace",{metadata:{assetId:e.id,name:e.name}}),await P(e.id)}function je(e,t){let s=(e||"").lastIndexOf(".");return!t||s<=0||N(e)===t?e:`${e.slice(0,s)}.${t}`}async function ht(e,t){let s=l(C(),e.id);return await w(s,{"file.alt":t||"",modifiedAt:m(),modifiedBy:window.firebase.user.email}),await P(e.id)}async function wt(e,t){let s=l(C(),e.id);return await w(s,{"file.altDisabled":t?!0:R(),modifiedAt:m(),modifiedBy:window.firebase.user.email}),p("asset.alt_disabled",{metadata:{assetId:e.id,name:e.name,disabled:t}}),await P(e.id)}function _e(e){let t={...W(e.file),assetId:e.id};return t.altDisabled&&(t.alt=""),t}function K(e){let t=new Set;return G(e,t),Array.from(t).sort()}function G(e,t){if(!(!e||typeof e!="object")){if(Array.isArray(e)){for(let s of e)G(s,t);return}if(typeof e.toMillis!="function"){if(z(e)){t.add(e.assetId);return}for(let s of Object.keys(e))G(e[s],t)}}}function z(e){return typeof e?.assetId=="string"&&typeof e?.src=="string"}function fe(e){if(!e||typeof e!="object")return!1;if(Array.isArray(e)){for(let t of e)if(fe(t))return!0;return!1}if(typeof e.toMillis=="function")return!1;if(z(e))return!0;for(let t of Object.keys(e))if(fe(e[t]))return!0;return!1}async function ke(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,n=Object.keys(window.__ROOT_CTX.collections||{});return(await Promise.all(n.map(async r=>{let c=I(s,"Projects",t,"Collections",r,"Drafts"),a=x(c,D("sys.assets","array-contains",e)),f=await j(a),d=[];return f.forEach(g=>{d.push(g.data())}),d}))).flat().sort((r,c)=>r.id.localeCompare(c.id))}async function bt(e,t={}){let s=window.__ROOT_CTX.rootConfig.projectId,n=window.firebase.db,o=t.docs??await ke(e.id),i=[],r=[];for(let c of o){let a=[];if(ye(c.fields,e.id,"fields",a),a.length===0)continue;let f={};for(let u of a)f[u.path]=Ie(e,u.value,t.previousFile);f["sys.modifiedAt"]=m(),f["sys.modifiedBy"]=window.firebase.user.email;let[d,g]=c.id.split("/"),y=l(n,"Projects",s,"Collections",d,"Drafts",g);try{await w(y,f),i.push(c.id)}catch(u){console.error(`failed to sync asset ${e.id} to ${c.id}:`,u),r.push(c.id)}}return i.length>0&&(L(i),p("asset.sync",{metadata:{assetId:e.id,name:e.name,docIds:i}})),{updatedDocIds:i,failedDocIds:r}}function ye(e,t,s,n){if(!(!e||typeof e!="object")&&!Array.isArray(e)&&typeof e.toMillis!="function"){if(z(e)){e.assetId===t&&n.push({path:s,value:e});return}for(let o of Object.keys(e))ye(e[o],t,`${s}.${o}`,n)}}function Ie(e,t,s){let n=_e(e);if(!e.file?.altDisabled){let i=s?.alt??e.file?.alt??"",r=t?.alt||"";r&&r!==i&&(n.alt=r)}let o=s?.canvasBgColor??e.file?.canvasBgColor;return t?.canvasBgColor&&t.canvasBgColor!==o&&(n.canvasBgColor=t.canvasBgColor),n}function W(e){let t={};return Object.entries(e||{}).forEach(([s,n])=>{n!==void 0&&(t[s]=n)}),t}function Fe(e){return(e||"").split("?")[0].split("/").pop()||"untitled"}async function Ft(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,[n,o]=e.split("/"),i=l(s,"Projects",t,"Collections",n,"Drafts",o),r=l(s,"Projects",t,"Collections",n,"Published",o),c=l(s,"Projects",t,"Collections",n,"Scheduled",o),a=T(s);a.delete(i),a.delete(r),a.delete(c),await a.commit(),console.log(`deleted doc: ${e}`),p("doc.delete",{metadata:{docId:e}})}async function vt(e,t){await ve([e],t)}async function ve(e,t){if(e.length===0){console.log("no docs to publish");return}let s=window.firebase.db;if(e.length>100)throw new Error("publish docs exceeds limit of 100 docs. break up your request into multiple calls.");let n=await Ve(e),o=t?.batch||T(s),i=["published"];t?.releaseId&&i.push(`release:${t.releaseId}`),e.forEach(r=>{let c=n[r];if(!c)throw new Error(`doc does not exist: ${r}`);Me(o,r,c,i,t?.publishMessage)}),await o.commit(),e.length===1?console.log(`published ${e[0]}`):console.log(`published ${e.length} docs: ${e.join(", ")}`);for(let r of e){let c={docId:r};t?.publishMessage&&(c.publishMessage=t.publishMessage),p("doc.publish",{metadata:c})}L(e)}function Me(e,t,s,n,o){if(Se(s))throw new Error(`publishing is locked for doc: ${s.id}`);if(Pe(s))throw new Error(`cannot publish archived doc: ${s.id}`);let i=window.__ROOT_CTX.rootConfig.projectId,r=window.firebase.db,[c,a]=t.split("/"),f=l(r,"Projects",i,"Collections",c,"Drafts",a),d=l(r,"Projects",i,"Collections",c,"Scheduled",a),g=l(r,"Projects",i,"Collections",c,"Published",a),y={...s},u=y.sys??{};u.modifiedAt=m(),u.modifiedBy=window.firebase.user.email,u.publishedAt=m(),u.publishedBy=window.firebase.user.email,u.firstPublishedAt??=m(),u.firstPublishedBy??=window.firebase.user.email,delete u.scheduledAt,delete u.scheduledBy,e.update(f,{sys:u}),e.set(g,{...y,sys:u}),e.delete(d);let h=l(r,"Projects",i,"Collections",c,"Drafts",a,"Versions",String(Date.now())),A={id:t,collection:c,slug:a,fields:y.fields||{},sys:u};n?.length&&(A.tags=n),o&&(A.publishMessage=o),e.set(h,A)}async function Mt(e,t,s){let n=window.__ROOT_CTX.rootConfig.projectId,o=window.firebase.db,[i,r]=e.split("/"),c=l(o,"Projects",n,"Collections",i,"Drafts",r),a=l(o,"Projects",n,"Collections",i,"Scheduled",r);await $(o,async d=>{let g=await d.get(c);if(!g.exists())throw new Error(`${c.id} does not exist`);let y={...g.data()},u=y.sys??{};u.modifiedAt=m(),u.modifiedBy=window.firebase.user.email,u.scheduledAt=k.fromMillis(t),u.scheduledBy=window.firebase.user.email,d.update(c,{sys:u});let h={...y,sys:u};s?.publishMessage&&(h.scheduledPublishMessage=s.publishMessage),d.set(a,h)}),console.log(`saved ${a.id}`);let f={docId:e,scheduledAt:t};s?.publishMessage&&(f.publishMessage=s.publishMessage),p("doc.schedule",{metadata:f})}async function Pt(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,[n,o]=e.split("/"),i=l(s,"Projects",t,"Collections",n,"Drafts",o),r=l(s,"Projects",t,"Collections",n,"Scheduled",o),c=l(s,"Projects",t,"Collections",n,"Published",o),a=T(s);a.update(i,{"sys.modifiedAt":m(),"sys.modifiedBy":window.firebase.user.email,"sys.publishedAt":R(),"sys.publishedBy":R(),"sys.firstPublishedAt":R(),"sys.firstPublishedBy":R()}),a.delete(r),a.delete(c),await a.commit(),console.log(`unpublished ${e}`),p("doc.unpublish",{metadata:{docId:e}}),q(e)}async function St(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,[n,o]=e.split("/"),i=l(s,"Projects",t,"Collections",n,"Drafts",o),r=l(s,"Projects",t,"Collections",n,"Published",o);await $(s,async c=>{let a=await c.get(r);if(!a.exists())throw new Error(`${r.id} does not exist`);let f=a.data();c.set(i,f)}),console.log(`reverted draft ${e}`),p("doc.revert",{metadata:{docId:e}})}async function Ot(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,[n,o]=e.split("/"),i=l(s,"Projects",t,"Collections",n,"Drafts",o),r=l(s,"Projects",t,"Collections",n,"Scheduled",o),c=T(s);c.update(i,{"sys.modifiedAt":m(),"sys.modifiedBy":window.firebase.user.email,"sys.scheduledAt":R(),"sys.scheduledBy":R()}),c.delete(r),await c.commit(),console.log(`unscheduled ${e}`),p("doc.unschedule",{metadata:{docId:e}})}async function Lt(e,t){let s={lockedAt:m(),lockedBy:window.firebase.user.email,reason:t.reason||`Locked by ${window.firebase.user.email}.`};t.until&&(s.until=k.fromMillis(t.until));let n=b(e);await w(n,{"sys.publishingLocked":s});let i={docId:e,reason:t.reason};t.until&&(i.until=t.until),p("doc.lock_publishing",{metadata:i})}async function Et(e){let t=b(e),s={"sys.publishingLocked":R()};await w(t,s),p("doc.unlock_publishing",{metadata:{docId:e}})}async function Vt(e){let t=b(e);await w(t,{"sys.archivedAt":m(),"sys.archivedBy":window.firebase.user.email}),p("doc.archive",{metadata:{docId:e}})}async function $t(e){let t=b(e);await w(t,{"sys.archivedAt":R(),"sys.archivedBy":R()}),p("doc.unarchive",{metadata:{docId:e}})}function Pe(e){return!!e?.sys?.archivedAt}function Nt(e){let t=k.now().toMillis();return(e?.sys?.scheduledAt?.toMillis()||0)>t}function Se(e){if(e?.sys?.publishingLocked){if(e.sys.publishingLocked.until){let t=k.now().toMillis(),s=e.sys.publishingLocked.until.toMillis();return t<s}return!0}return!1}async function Ut(e,t,s){let n=b(e),o=await B(n);if(!o.exists())throw new Error(`doc ${e} does not exist`);let i=o.data(),r=i.fields??{},c=i.sys?.locales;await Oe(t,{fields:r,locales:c,overwrite:s?.overwrite})}async function Oe(e,t){let[s,n]=e.split("/"),o=b(e),i=await B(o);if(i.exists()&&!t?.overwrite)throw new Error(`${e} already exists`);let r=t?.fields??{},c={id:e,collection:s,slug:n,sys:{createdAt:m(),createdBy:window.firebase.user.email,modifiedAt:m(),modifiedBy:window.firebase.user.email,locales:t?.locales??["en"]},fields:r};if(i.exists()&&t?.overwrite){let f=i.data();c.sys={...f.sys,locales:t?.locales??f.sys.locales,modifiedAt:m(),modifiedBy:window.firebase.user.email}}let a=K(r);a.length>0?c.sys.assets=a:delete c.sys.assets,await M(o,c),p("doc.create",{metadata:{docId:e}})}async function Xt(e,t,s){let n={};for(let d of t){if(!d.source)continue;let g={source:U(d.source)},y={},u={};Object.entries(d).forEach(([A,S])=>{if(A==="source")return;let Ae=ne(A);for(let V of ie(A)){if(oe(V))continue;let xe=V===Ae?u:y;xe[V]=U(S||"")}}),Object.assign(g,y,u);let h=await se(g.source);n[h]=g}let i=[e.split("/")[0],e];s?.tags&&i.push(...s.tags);let r=te(),c=window.firebase.db,a=T(c),f=0;for(let d in n){let g=n[d],y=l(r,d);a.set(y,{...g,tags:ee(...i)},{merge:!0}),f+=1,f>=500&&(await a.commit(),a=T(c),console.log(`saved ${f} strings`),f=0)}return f>0&&(await a.commit(),console.log(`saved ${f} strings`)),p("doc.import_translations",{metadata:{docId:e,...s?.actionMetadata},links:s?.actionLinks}),n}function b(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,[n,o]=e.split("/");return l(s,"Projects",t,"Collections",n,"Drafts",o)}function Le(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,[n,o]=e.split("/");return l(s,"Projects",t,"Collections",n,"Published",o)}function Ee(e,t){let s=window.__ROOT_CTX.rootConfig.projectId,n=window.firebase.db,[o,i]=e.split("/");return l(n,"Projects",s,"Collections",o,"Drafts",i,"Versions",t)}async function Ve(e){let t=window.__ROOT_CTX.rootConfig.projectId,s=window.firebase.db,n={};e.forEach(i=>{let[r,c]=i.split("/");r in n?n[r].push(c):n[r]=[c]});let o={};return await Promise.all(Object.entries(n).map(async([i,r])=>{let c=I(s,"Projects",t,"Collections",i,"Drafts"),a=x(c,D(J(),"in",r));(await j(a)).forEach(d=>{let g=`${i}/${d.id}`;o[g]=d.data()})})),o}async function qt(e,t){let s=window.firebase.db,n=b(e),o=I(s,n.path,"Versions"),i=t?.limit??50,r=x(o,O("sys.modifiedAt","desc"),F(i));t?.tags&&(r=x(r,D("tags","array-contains-any",t.tags))),t?.cursor&&(r=x(r,Y(t.cursor)));let c=await j(r),a=[],f=null;return c.forEach(d=>{let g={...d.data(),_versionId:d.id};a.push(g),f=d}),{versions:a,lastDoc:f,hasMore:c.size===i}}async function Gt(e,t){let s=b(e),n={"sys.modifiedAt":m(),"sys.modifiedBy":window.firebase.user.email,"sys.assets":K(t.fields||{}),fields:t.fields||{}};await w(s,n),p("doc.restore_version",{metadata:{docId:e,versionModifiedAt:t.sys?.modifiedAt,versionModifiedBy:t.sys?.modifiedBy}})}var $e=/^(before|after):(\d+)$/,Ne=10*1e3;async function Ue(e,t){let s=String(t).match($e);if(s)return await Xe(e,s[1],parseInt(s[2]));let n;t==="draft"?n=b(e):t==="published"?n=Le(e):n=Ee(e,t);let o=await B(n);return o.exists()?o.data():null}async function Xe(e,t,s){let n=window.firebase.db,o=b(e),i=I(n,o.path,"Versions"),r=k.fromMillis(s-Ne),c;t==="before"?c=x(i,D("sys.modifiedAt","<",r),O("sys.modifiedAt","desc"),F(1)):c=x(i,D("sys.modifiedAt",">=",r),O("sys.modifiedAt","asc"),F(1));let a=await j(c);return a.empty?t==="after"?await Ue(e,"draft"):null:a.docs[0].data()}async function Ht(e,t){if(!t?.spreadsheetId)throw new Error("no spreadsheet id");let s=b(e),n={"sys.l10nSheet":{spreadsheetId:t.spreadsheetId,gid:t.gid||0,linkedAt:m(),linkedBy:window.firebase.user.email}};await w(s,n),p("doc.link_sheet",{metadata:{docId:e,sheetId:t}})}async function Qt(e){let t=b(e),s={"sys.l10nSheet":R()};await w(t,s),p("doc.unlink_sheet",{metadata:{docId:e}})}async function Kt(e){let t=b(e),o=(await B(t)).data()?.sys?.l10nSheet||{};return o?.spreadsheetId?{spreadsheetId:o.spreadsheetId,gid:o.gid||0}:null}function he(e,t){let s={};for(let n in e){let o=e[n];if(be(o))if(o.toMillis)s[n]=o.toMillis();else if(Object.hasOwn(o,"_array")&&Array.isArray(o._array)){let i=o._array.map(r=>{let c={...he(o[r]||{},t),_arrayKey:r};return t?.removeArrayKey&&delete c._arrayKey,c});s[n]=i}else s[n]=he(o,t);else s[n]=o}return s}async function zt(e,t){let s=await window.fetch("/cms/api/ai.diff",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({docId:e,beforeVersion:t?.beforeVersion||"published",afterVersion:t?.afterVersion||"draft"})}),n=await s.text(),o=null;try{o=JSON.parse(n)}catch{}if(!s.ok||o?.success===!1){let i=o&&(o.error||o.message)||n;throw new Error(i||"Failed to fetch AI summary")}return typeof o?.summary=="string"?o.summary:typeof o?.data?.summary=="string"?o.data.summary:!o&&n?n:""}function be(e){return typeof e=="object"&&!Array.isArray(e)&&e!==null}function Wt(e){let[t,s]=e.split("/");return{id:e,collection:t,slug:s}}function we(e){if(qe(e))return k.fromMillis(e.seconds*1e3);if(ce(e))return e.time=Date.now(),e;if(Array.isArray(e))return e.map(t=>we(t));if(be(e)){let t={};return Object.keys(e).forEach(s=>{t[s]=we(e[s])}),t}return e}function qe(e){return e?.type==="firestore/timestamp/1.0"}export{ce as a,We as b,De as c,ae as d,rt as e,ct as f,_ as g,at as h,Be as i,lt as j,dt as k,P as l,ft as m,ut as n,mt as o,pt as p,gt as q,yt as r,je as s,ht as t,wt as u,_e as v,K as w,fe as x,ke as y,bt as z,Ft as A,vt as B,ve as C,Mt as D,Pt as E,St as F,Ot as G,Lt as H,Et as I,Vt as J,$t as K,Pe as L,Nt as M,Se as N,Ut as O,Oe as P,Xt as Q,Ve as R,qt as S,Gt as T,Ue as U,Ht as V,Qt as W,Kt as X,he as Y,zt as Z,Wt as _,we as $};