@acuity/directus-extension-acuity-backup 2.1.7 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/app.js CHANGED
@@ -1 +1 @@
1
- import{defineModule as e,useApi as t,useStores as a}from"@directus/extensions-sdk";import{defineComponent as n,resolveComponent as l,createBlock as o,openBlock as r,withCtx as s,createElementBlock as d,Fragment as i,renderList as c,createVNode as u,ref as p,onMounted as v,resolveDirective as m,createElementVNode as g,createCommentVNode as f,withDirectives as b,toDisplayString as h,normalizeClass as y,createTextVNode as x,computed as k,watch as w,onBeforeUnmount as _,onUnmounted as z,withModifiers as C,vModelRadio as S,Transition as R,vModelCheckbox as D}from"vue";import{useRouter as B}from"vue-router";const V=[],T=[],E=[],F=[e({id:"acuity-backup",name:"Backup",icon:"cloud_download",routes:[{path:"",props:!0,component:()=>Promise.resolve().then(function(){return Ra})},{path:":page",props:!0,component:()=>Promise.resolve().then(function(){return Ra})}]})],I=[],U=[],j=[];var L=n({__name:"navigation",props:{current:{},pages:{}},setup:e=>(t,a)=>{const n=l("v-icon"),p=l("v-list-item-icon"),v=l("v-text-overflow"),m=l("v-list-item-content"),g=l("v-list-item"),f=l("v-list");return r(),o(f,{nav:""},{default:s(()=>[(r(!0),d(i,null,c(e.pages,t=>(r(),o(g,{key:t.route,clickable:"",active:e.current===t.route,to:"/acuity-backup"+(t.route?"/"+t.route:"")},{default:s(()=>[u(p,null,{default:s(()=>[u(n,{name:t.icon},null,8,["name"])]),_:2},1024),u(m,null,{default:s(()=>[u(v,{text:t.label},null,8,["text"])]),_:2},1024)]),_:2},1032,["active","to"]))),128))]),_:1})}});const $={class:"restore-logs-page"},A={class:"section"},P={class:"section-header"},M={key:0,class:"empty-state"},N={class:"table-wrapper"},O={class:"logs-table"},G={class:"col-date"},H={class:"date-primary"},W={class:"date-relative"},q={class:"col-backup"},K={class:"backup-id"},Y={class:"col-status"},J={class:"col-duration"},Q={class:"col-items"},X={class:"col-errors"},Z={key:0,class:"no-errors"},ee={key:1,class:"error-count"},te={class:"col-actions"},ae={class:"detail-header"},ne={class:"detail-section"},le={class:"detail-row"},oe={class:"detail-value mono"},re={class:"detail-row"},se={class:"detail-value mono"},de={class:"detail-row"},ie={class:"detail-value"},ce={class:"detail-row"},ue={class:"detail-row"},pe={class:"detail-value"},ve={class:"detail-section"},me={class:"summary-grid"},ge={class:"summary-item"},fe={class:"summary-value"},be={class:"summary-item"},he={class:"summary-value success"},ye={class:"summary-item"},xe={class:"summary-item"},ke={class:"summary-value"},we={class:"summary-item"},_e={class:"summary-value"},ze={class:"summary-item"},Ce={class:"summary-value"},Se={class:"summary-item"},Re={class:"summary-value"},De={key:0,class:"detail-section"},Be={class:"section-subtitle"},Ve={class:"errors-container"},Te={key:0,class:"error-collection"},Ee={class:"error-message"},Fe={class:"error-timestamp"},Ie={class:"dialog-title-row"},Ue={class:"dialog-title-icon-wrap danger-icon-wrap"};var je=n({__name:"restore-logs",setup(e){const a=t(),n=p([]),k=p(!1),w=p(!1),_=p(null),z=p(!1),C=p(!1),S=p(null);async function R(){k.value=!0;try{const e=await a.get("/acuity-backup/restore-logs");n.value=e.data.data}catch(e){console.error("Failed to load restore logs:",e)}finally{k.value=!1}}async function D(){if(S.value){C.value=!0;try{await a.delete(`/acuity-backup/restore-logs/${S.value.id}`),n.value=n.value.filter(e=>e.id!==S.value.id),z.value=!1,w.value=!1}catch(e){console.error("Failed to delete restore log:",e)}finally{C.value=!1}}}function B(e){return new Date(e).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function V(e){const t=new Date(e),a=new Date,n=Math.floor((a.getTime()-t.getTime())/1e3);if(n<60)return"just now";const l=Math.floor(n/60);if(l<60)return`${l}m ago`;const o=Math.floor(l/60);if(o<24)return`${o}h ago`;return`${Math.floor(o/24)}d ago`}function T(e){const t=Math.floor(e/1e3);if(t<60)return`${t}s`;return`${Math.floor(t/60)}m ${t%60}s`}function E(e){switch(e){case"success":return"Success";case"partial":return"Partial";case"failed":return"Failed";default:return e}}return v(()=>{R()}),(e,t)=>{const a=l("v-icon"),p=l("v-button"),v=l("v-card-title"),F=l("v-card-text"),I=l("v-card-actions"),U=l("v-card"),j=l("v-dialog"),L=l("v-notice"),je=m("tooltip");return r(),d(i,null,[g("div",$,[g("div",A,[g("div",P,[t[7]||(t[7]=g("h2",{class:"section-title"},"Restore History",-1)),b((r(),o(p,{small:"",secondary:"",icon:"",loading:k.value,onClick:R},{default:s(()=>[u(a,{name:"refresh"})]),_:1},8,["loading"])),[[je,"Refresh list"]])]),f(" Empty state "),k.value||0!==n.value.length?(r(),d(i,{key:1},[f(" Table "),g("div",N,[g("table",O,[t[10]||(t[10]=g("thead",null,[g("tr",null,[g("th",{class:"col-date"},"Date"),g("th",{class:"col-backup"},"Backup ID"),g("th",{class:"col-status"},"Status"),g("th",{class:"col-duration"},"Duration"),g("th",{class:"col-items"},"Items"),g("th",{class:"col-errors"},"Errors"),g("th",{class:"col-actions"},"Actions")])],-1)),g("tbody",null,[(r(!0),d(i,null,c(n.value,e=>{return r(),d("tr",{key:e.id,class:"log-row"},[g("td",G,[g("span",H,h((t=e.timestamp,new Date(t).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}))),1),g("span",W,h(V(e.timestamp)),1)]),g("td",q,[g("code",K,h(e.backupId.substring(0,8)),1)]),g("td",Y,[g("span",{class:y(["status-badge",`status-${e.status}`])},h(E(e.status)),3)]),g("td",J,h(T(e.duration)),1),g("td",Q,h(e.summary.itemsRestored),1),g("td",X,[0===e.errors.length?(r(),d("span",Z,"—")):(r(),d("span",ee,h(e.errors.length),1))]),g("td",te,[b((r(),o(p,{small:"",icon:"",secondary:"",onClick:t=>function(e){_.value=e,w.value=!0}(e)},{default:s(()=>[u(a,{name:"info"})]),_:1},8,["onClick"])),[[je,"View details"]]),b((r(),o(p,{small:"",icon:"",secondary:"",danger:"",onClick:t=>function(e){S.value=e,z.value=!0}(e)},{default:s(()=>[u(a,{name:"delete"})]),_:1},8,["onClick"])),[[je,"Delete log"]])])]);var t}),128))])])])],2112)):(r(),d("div",M,[u(a,{name:"history",class:"empty-icon"}),t[8]||(t[8]=g("p",{class:"empty-title"},"No restore logs",-1)),t[9]||(t[9]=g("p",{class:"empty-subtitle"},"Restore operations will appear here.",-1))]))])]),f(" Detail Modal "),u(j,{modelValue:w.value,"onUpdate:modelValue":t[2]||(t[2]=e=>w.value=e),onEsc:t[3]||(t[3]=e=>w.value=!1)},{default:s(()=>[_.value?(r(),o(U,{key:0,class:"detail-modal"},{default:s(()=>[u(v,null,{default:s(()=>[g("div",ae,[t[11]||(t[11]=g("span",null,"Restore Log",-1)),u(p,{icon:"",secondary:"",small:"",onClick:t[0]||(t[0]=e=>w.value=!1)},{default:s(()=>[u(a,{name:"close"})]),_:1})])]),_:1}),u(F,null,{default:s(()=>{return[g("div",ne,[g("div",le,[t[12]||(t[12]=g("span",{class:"detail-label"},"Session ID",-1)),g("code",oe,h(_.value.sessionId),1)]),g("div",re,[t[13]||(t[13]=g("span",{class:"detail-label"},"Backup ID",-1)),g("code",se,h(_.value.backupId),1)]),g("div",de,[t[14]||(t[14]=g("span",{class:"detail-label"},"Date",-1)),g("span",ie,h((e=_.value.timestamp,new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}))),1)]),g("div",ce,[t[15]||(t[15]=g("span",{class:"detail-label"},"Status",-1)),g("span",{class:y(["status-badge",`status-${_.value.status}`])},h(E(_.value.status)),3)]),g("div",ue,[t[16]||(t[16]=g("span",{class:"detail-label"},"Duration",-1)),g("span",pe,h(T(_.value.duration)),1)])]),g("div",ve,[t[24]||(t[24]=g("h3",{class:"section-subtitle"},"Summary",-1)),g("div",me,[g("div",ge,[t[17]||(t[17]=g("span",{class:"summary-label"},"Collections Attempted",-1)),g("span",fe,h(_.value.summary.collectionsAttempted),1)]),g("div",be,[t[18]||(t[18]=g("span",{class:"summary-label"},"Collections Success",-1)),g("span",he,h(_.value.summary.collectionsSuccess),1)]),g("div",ye,[t[19]||(t[19]=g("span",{class:"summary-label"},"Collections Failed",-1)),g("span",{class:y(["summary-value",{error:_.value.summary.collectionsFailed>0}])},h(_.value.summary.collectionsFailed),3)]),g("div",xe,[t[20]||(t[20]=g("span",{class:"summary-label"},"Items Restored",-1)),g("span",ke,h(_.value.summary.itemsRestored),1)]),g("div",we,[t[21]||(t[21]=g("span",{class:"summary-label"},"Media Files",-1)),g("span",_e,h(_.value.summary.mediaFilesRestored),1)]),g("div",ze,[t[22]||(t[22]=g("span",{class:"summary-label"},"Field Groups",-1)),g("span",Ce,h(_.value.summary.fieldGroupsRestored),1)]),g("div",Se,[t[23]||(t[23]=g("span",{class:"summary-label"},"Collection Views",-1)),g("span",Re,h(_.value.summary.collectionViewsRestored),1)])])]),_.value.errors.length>0?(r(),d("div",De,[g("h3",Be,"Errors ("+h(_.value.errors.length)+")",1),g("div",Ve,[(r(!0),d(i,null,c(_.value.errors,(e,t)=>(r(),d("div",{key:t,class:"error-detail"},[e.collection?(r(),d("span",Te,h(e.collection),1)):f("v-if",!0),g("span",Ee,h(e.message),1),g("span",Fe,h(B(e.timestamp)),1)]))),128))])])):f("v-if",!0)];var e}),_:1}),u(I,null,{default:s(()=>[u(p,{secondary:"",onClick:t[1]||(t[1]=e=>w.value=!1)},{default:s(()=>[...t[25]||(t[25]=[x("Close",-1)])]),_:1}),u(p,{danger:"",onClick:D},{default:s(()=>[...t[26]||(t[26]=[x("Delete Log",-1)])]),_:1})]),_:1})]),_:1})):f("v-if",!0)]),_:1},8,["modelValue"]),f(" Delete confirmation "),u(j,{modelValue:z.value,"onUpdate:modelValue":t[5]||(t[5]=e=>z.value=e),onEsc:t[6]||(t[6]=e=>z.value=!1)},{default:s(()=>[u(U,{class:"confirm-dialog"},{default:s(()=>[u(v,null,{default:s(()=>[g("div",Ie,[g("div",Ue,[u(a,{name:"delete_forever"})]),t[27]||(t[27]=g("span",null,"Delete Restore Log",-1))])]),_:1}),u(F,null,{default:s(()=>[u(L,{type:"danger"},{default:s(()=>[...t[28]||(t[28]=[x(" This will permanently delete the restore log. This action cannot be undone. ",-1)])]),_:1})]),_:1}),u(I,null,{default:s(()=>[u(p,{secondary:"",onClick:t[4]||(t[4]=e=>z.value=!1)},{default:s(()=>[...t[29]||(t[29]=[x("Cancel",-1)])]),_:1}),u(p,{danger:"",onClick:D,loading:C.value},{default:s(()=>[u(a,{name:"delete_forever",left:""}),t[30]||(t[30]=x(" Delete Permanently ",-1))]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}}),Le=[],$e=[];function Ae(e,t){if(e&&"undefined"!=typeof document){var a,n=!0===t.prepend?"prepend":"append",l=!0===t.singleTag,o="string"==typeof t.container?document.querySelector(t.container):document.getElementsByTagName("head")[0];if(l){var r=Le.indexOf(o);-1===r&&(r=Le.push(o)-1,$e[r]={}),a=$e[r]&&$e[r][n]?$e[r][n]:$e[r][n]=s()}else a=s();65279===e.charCodeAt(0)&&(e=e.substring(1)),a.styleSheet?a.styleSheet.cssText+=e:a.appendChild(document.createTextNode(e))}function s(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),t.attributes)for(var a=Object.keys(t.attributes),l=0;l<a.length;l++)e.setAttribute(a[l],t.attributes[a[l]]);var r="prepend"===n?"afterbegin":"beforeend";return o.insertAdjacentElement(r,e),e}}Ae("\n.restore-logs-page[data-v-4d4855df] {\n\tpadding: 16px;\n\tmax-width: 1100px;\n}\n.section[data-v-4d4855df] {\n\tbackground: var(--theme--background);\n\tborder: 1px solid var(--theme--border-color);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 16px;\n}\n.section-header[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: 16px;\n}\n.section-title[data-v-4d4855df] {\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tmargin: 0;\n\tcolor: var(--theme--foreground);\n}\n.empty-state[data-v-4d4855df] {\n\ttext-align: center;\n\tpadding: 40px 20px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.empty-icon[data-v-4d4855df] {\n\tfont-size: 48px;\n\tmargin-bottom: 12px;\n\topacity: 0.5;\n}\n.empty-title[data-v-4d4855df] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tmargin: 0 0 4px 0;\n}\n.empty-subtitle[data-v-4d4855df] {\n\tfont-size: 14px;\n\tmargin: 0;\n\tcolor: var(--theme--foreground-subdued);\n}\n.table-wrapper[data-v-4d4855df] {\n\toverflow-x: auto;\n}\n.logs-table[data-v-4d4855df] {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n.logs-table thead[data-v-4d4855df] {\n\tbackground: var(--theme--background-subdued);\n\tborder-bottom: 2px solid var(--theme--border-color);\n}\n.logs-table th[data-v-4d4855df] {\n\tpadding: 12px 16px;\n\ttext-align: left;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\twhite-space: nowrap;\n}\n.logs-table tbody tr[data-v-4d4855df] {\n\tborder-bottom: 1px solid var(--theme--border-color);\n\ttransition: background 0.2s;\n}\n.logs-table tbody tr[data-v-4d4855df]:hover {\n\tbackground: var(--theme--background-subdued);\n}\n.logs-table td[data-v-4d4855df] {\n\tpadding: 12px 16px;\n\tvertical-align: middle;\n}\n.col-date[data-v-4d4855df],\n.col-backup[data-v-4d4855df],\n.col-status[data-v-4d4855df],\n.col-duration[data-v-4d4855df],\n.col-items[data-v-4d4855df],\n.col-errors[data-v-4d4855df],\n.col-actions[data-v-4d4855df] {\n\ttext-align: left;\n}\n.date-primary[data-v-4d4855df] {\n\tdisplay: block;\n\tfont-weight: 500;\n\tcolor: var(--theme--foreground);\n}\n.date-relative[data-v-4d4855df] {\n\tdisplay: block;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.backup-id[data-v-4d4855df] {\n\tfont-family: monospace;\n\tfont-size: 12px;\n\tbackground: var(--theme--background-subdued);\n\tpadding: 2px 6px;\n\tborder-radius: 3px;\n}\n.status-badge[data-v-4d4855df] {\n\tdisplay: inline-block;\n\tpadding: 4px 8px;\n\tborder-radius: 3px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n.status-success[data-v-4d4855df] {\n\tbackground: rgba(34, 197, 94, 0.1);\n\tcolor: rgb(34, 197, 94);\n}\n.status-partial[data-v-4d4855df] {\n\tbackground: rgba(251, 146, 60, 0.1);\n\tcolor: rgb(251, 146, 60);\n}\n.status-failed[data-v-4d4855df] {\n\tbackground: rgba(239, 68, 68, 0.1);\n\tcolor: rgb(239, 68, 68);\n}\n.no-errors[data-v-4d4855df] {\n\tcolor: var(--theme--foreground-subdued);\n}\n.error-count[data-v-4d4855df] {\n\tcolor: rgb(239, 68, 68);\n\tfont-weight: 600;\n}\n.col-actions[data-v-4d4855df] {\n\ttext-align: right;\n\twhite-space: nowrap;\n}\n.detail-modal[data-v-4d4855df] {\n\tmax-width: 600px;\n}\n.detail-header[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n.detail-section[data-v-4d4855df] {\n\tmargin-bottom: 24px;\n}\n.detail-section[data-v-4d4855df]:last-child {\n\tmargin-bottom: 0;\n}\n.detail-row[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmargin-bottom: 8px;\n\tpadding: 8px;\n\tbackground: var(--theme--background-subdued);\n\tborder-radius: 3px;\n}\n.detail-label[data-v-4d4855df] {\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\tmin-width: 120px;\n}\n.detail-value[data-v-4d4855df] {\n\tcolor: var(--theme--foreground);\n\tword-break: break-all;\n}\n.detail-value.mono[data-v-4d4855df] {\n\tfont-family: monospace;\n\tfont-size: 12px;\n}\n.section-subtitle[data-v-4d4855df] {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.5px;\n\tmargin: 0 0 12px 0;\n\tpadding-bottom: 8px;\n\tborder-bottom: 1px solid var(--theme--border-color);\n}\n.summary-grid[data-v-4d4855df] {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n\tgap: 12px;\n}\n.summary-item[data-v-4d4855df] {\n\tbackground: var(--theme--background-subdued);\n\tpadding: 12px;\n\tborder-radius: 3px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n.summary-label[data-v-4d4855df] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.summary-value[data-v-4d4855df] {\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n}\n.summary-value.success[data-v-4d4855df] {\n\tcolor: rgb(34, 197, 94);\n}\n.summary-value.error[data-v-4d4855df] {\n\tcolor: rgb(239, 68, 68);\n}\n.errors-container[data-v-4d4855df] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmax-height: 400px;\n\toverflow-y: auto;\n}\n.error-detail[data-v-4d4855df] {\n\tdisplay: flex;\n\tgap: 12px;\n\tpadding: 8px 12px;\n\tbackground: rgba(239, 68, 68, 0.05);\n\tborder-left: 3px solid rgb(239, 68, 68);\n\tborder-radius: 3px;\n\tfont-size: 12px;\n}\n.error-collection[data-v-4d4855df] {\n\tcolor: rgb(239, 68, 68);\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n.error-message[data-v-4d4855df] {\n\tflex: 1;\n\tcolor: var(--theme--foreground);\n\tword-break: break-word;\n}\n.error-timestamp[data-v-4d4855df] {\n\tcolor: var(--theme--foreground-subdued);\n\twhite-space: nowrap;\n\tfont-size: 11px;\n}\n.confirm-dialog[data-v-4d4855df] {\n\tmax-width: 400px;\n}\n.dialog-title-row[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n}\n.dialog-title-icon-wrap[data-v-4d4855df] {\n\twidth: 40px;\n\theight: 40px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tborder-radius: 50%;\n\tbackground: rgba(239, 68, 68, 0.1);\n}\n.dialog-title-icon-wrap.danger-icon-wrap[data-v-4d4855df] {\n\tbackground: rgba(239, 68, 68, 0.1);\n\tcolor: rgb(239, 68, 68);\n}\n",{});var Pe=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a},Me=Pe(je,[["__scopeId","data-v-4d4855df"]]);const Ne={key:0,class:"backup-module-content"},Oe={class:"section"},Ge={class:"section-header"},He={key:0,class:"skeleton-rows"},We={class:"empty-state"},qe={class:"table-wrapper"},Ke={class:"backup-table"},Ye={class:"col-date"},Je={class:"date-primary"},Qe={class:"date-relative"},Xe={class:"col-type"},Ze={class:"type-cell"},et={key:0,class:"media-badge"},tt={class:"col-collections"},at={key:0,class:"all-collections"},nt={key:1,class:"collection-list"},lt={key:0,class:"more-collections"},ot={class:"col-size"},rt={class:"col-status"},st={key:0,class:"status-badge status-restoring"},dt={key:1,class:"status-badge status-valid"},it={class:"col-actions"},ct={class:"action-buttons"},ut={key:3,class:"auto-refresh-notice"},pt={class:"backup-module-content"},vt={class:"section"},mt={class:"schedule-card"},gt={key:0,class:"schedule-loading"},ft={class:"schedule-toggle-row"},bt={class:"cron-presets"},ht=["onClick","disabled"],yt={class:"cron-input-row"},xt={key:0,class:"last-run-row"},kt={key:0,class:"error-notice"},wt={class:"schedule-footer"},_t={class:"dialog-section"},zt={class:"radio-group"},Ct={class:"radio-content"},St={class:"radio-content"},Rt={key:0,class:"dialog-section collection-selector"},Dt={key:0,class:"collections-loading"},Bt={key:1,class:"collections-empty"},Vt={key:2,class:"collection-list-scroll"},Tt=["value"],Et={class:"collection-item-content"},Ft={class:"collection-name"},It={key:0,class:"collection-count"},Ut={key:3,class:"validation-msg"},jt={class:"dialog-section"},Lt={class:"toggle-row"},$t={key:0,class:"running-state"},At={key:1,class:"error-notice"},Pt={class:"dialog-title-row"},Mt={class:"dialog-title-icon-wrap restore-icon-wrap"},Nt={key:0,class:"confirm-details"},Ot={class:"detail-row"},Gt={class:"detail-value"},Ht={class:"detail-row"},Wt={class:"detail-value"},qt={class:"detail-row"},Kt={class:"detail-value"},Yt={class:"detail-row"},Jt={class:"detail-value"},Qt={class:"detail-row"},Xt={class:"detail-value"},Zt={class:"toggle-row restore-option-row"},ea={key:1,class:"running-state restore-progress"},ta={class:"progress-info"},aa={class:"progress-header"},na={class:"running-title"},la={class:"progress-percentage"},oa={class:"progress-details"},ra={class:"phase-text"},sa={class:"elapsed-time"},da={key:0,class:"errors-section"},ia={class:"errors-details"},ca={class:"errors-summary"},ua={class:"errors-list"},pa={key:0,class:"error-collection"},va={class:"error-message"},ma={key:2,class:"error-notice"},ga={class:"dialog-title-row"},fa={class:"dialog-title-icon-wrap danger-icon-wrap"},ba={key:0,class:"confirm-details"},ha={class:"detail-row"},ya={class:"detail-value"},xa={class:"detail-row"},ka={class:"detail-value"},wa={class:"detail-row"},_a={class:"detail-value"},za={key:1,class:"error-notice"};var Ca=n({__name:"module",props:{page:{}},setup(e){const n=e,V=B(),T=k(()=>n.page??""),E=[{route:"",label:"Backups",icon:"backup"},{route:"schedule",label:"Schedule",icon:"schedule"},{route:"restore-logs",label:"Restore Logs",icon:"history"}],F=k(()=>{switch(T.value){case"schedule":return"Schedule";case"restore-logs":return"Restore Logs";default:return"Backups"}}),I=k(()=>[{name:"Backup",to:"/acuity-backup"},{name:F.value}]);w(T,e=>{""===e?G():"schedule"===e?Fe():"restore-logs"===e||V.replace("/acuity-backup")},{immediate:!1});const U=t(),{useNotificationsStore:j}=a(),$=j(),A=p([]),P=p(!1),M=p(null),N=k(()=>M.value?M.value.toLocaleTimeString():"Never");let O=null;async function G(){P.value=!0;try{const e=await U.get("/acuity-backup/list");A.value=e.data.data??[],M.value=new Date}catch(e){Ae("Failed to load backup history. "+$e(e),"error")}finally{P.value=!1}}const H=p(!1),W=p("full"),q=p(!0),K=p(!1),Y=p(""),J=p([]),Q=p([]),X=p(!1);function Z(){Y.value="",W.value="full",q.value=!0,J.value=[],H.value=!0,async function(){if(Q.value.length>0)return;X.value=!0;try{const e=await U.get("/acuity-backup/collections");Q.value=e.data.data??[]}catch(e){Ae("Failed to load collections. "+$e(e),"error")}finally{X.value=!1}}()}function ee(){K.value||(H.value=!1)}function te(){J.value=Q.value.map(e=>e.collection)}function ae(){J.value=[]}async function ne(){if("selective"!==W.value||0!==J.value.length){K.value=!0,Y.value="";try{await U.post("/acuity-backup/run",{type:W.value,collections:"selective"===W.value?J.value:void 0,includeMedia:q.value}),Ae("Backup completed successfully.","success"),H.value=!1,await G()}catch(e){Y.value="Backup failed: "+$e(e)}finally{K.value=!1}}}const le=p(null),oe=p(!1);function re(){le.value?.click()}async function se(e){const t=e.target,a=t.files?.[0];if(t.value="",a)if(a.name.endsWith(".zip")){oe.value=!0;try{const e=new FormData;e.append("title","Backup Upload (temporary)"),e.append("file",a);const t=(await U.post("/files",e)).data.data.id;try{await U.post("/acuity-backup/upload",{fileId:t})}catch(e){try{await U.delete(`/files/${t}`)}catch{}throw e}Ae("Backup uploaded successfully.","success"),await G()}catch(e){Ae("Upload failed: "+$e(e),"error")}finally{oe.value=!1}}else Ae("Please select a .zip backup file.","warning")}const de=p(!1),ie=p(null),ce=p(null),ue=p(!1),pe=p(""),ve=p(null),me=p({phase:"",progressPercentage:0,elapsedSeconds:0,errors:[]}),ge=p(!1);let fe=null;function be(){null===ce.value&&(de.value=!1)}function he(){de.value=!1,ce.value=null,ve.value=null,ge.value=!1,G()}async function ye(){if(ie.value){ce.value=ie.value.id,pe.value="",me.value={phase:"",progressPercentage:0,elapsedSeconds:0,errors:[]};try{const e=(await U.post("/acuity-backup/restore",{backupId:ie.value.id,truncateCollections:ue.value})).data.data.sessionId;ve.value=e;let t="";fe=window.setInterval(async()=>{try{const a=(await U.get(`/acuity-backup/status/${e}`)).data.data;me.value={phase:a.phase||"",progressPercentage:a.progressPercentage||0,elapsedSeconds:a.elapsedSeconds||0,errors:a.errors||[]},"running"!==a.status&&(fe&&(clearInterval(fe),fe=null),ge.value=!0,"completed"===a.status?Ae("Restore completed successfully.","success"):pe.value="Restore failed. Check errors above for details."),t=a.status}catch(e){"running"!==t&&fe&&(clearInterval(fe),fe=null)}},250)}catch(e){pe.value="Failed to initiate restore: "+$e(e),ce.value=null,ve.value=null}}}const xe=p(!1),ke=p(null),we=p(null),_e=p("");async function ze(){if(ke.value){we.value=ke.value.id,_e.value="";try{await U.delete(`/acuity-backup/${ke.value.id}`),Ae("Backup deleted.","success"),xe.value=!1,A.value=A.value.filter(e=>e.id!==ke.value.id)}catch(e){_e.value="Delete failed: "+$e(e)}finally{we.value=null}}}const Ce=[{label:"Daily",value:"0 0 * * *"},{label:"Weekly",value:"0 0 * * 0"},{label:"Monthly",value:"0 0 1 * *"},{label:"Disabled",value:""}],Se=p(!1),Re=p("0 0 * * *"),De=p(void 0),Be=p(!1),Ve=p(!1),Te=p("");let Ee=!1;async function Fe(){if(!Ee){Be.value=!0;try{const e=(await U.get("/acuity-backup/schedule")).data.data;Se.value=e.enabled,Re.value=e.cronExpression,De.value=e.lastRun,Ee=!0}catch(e){Ae("Failed to load schedule configuration. "+$e(e),"error")}finally{Be.value=!1}}}async function Ie(){if(Te.value="",Se.value){const e=Re.value.trim();if(!e)return void(Te.value="A cron expression is required when automatic backups are enabled.");if(5!==e.split(/\s+/).length)return void(Te.value="The cron expression must have exactly 5 fields (minute hour day-of-month month day-of-week).")}Ve.value=!0;try{await U.post("/acuity-backup/schedule",{enabled:Se.value,cronExpression:Re.value.trim()||"0 0 * * *"}),Ae("Schedule saved successfully.","success")}catch(e){Te.value="Failed to save schedule: "+$e(e)}finally{Ve.value=!1}}function Ue(e){try{return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(new Date(e))}catch{return e}}function je(e){try{const t=Date.now()-new Date(e).getTime(),a=Math.floor(t/1e3);return a<60?"just now":a<3600?`${Math.floor(a/60)}m ago`:a<86400?`${Math.floor(a/3600)}h ago`:a<604800?`${Math.floor(a/86400)}d ago`:`${Math.floor(a/604800)}w ago`}catch{return""}}function Le(e){if(!e||0===e)return"—";const t=["B","KB","MB","GB"];let a=e,n=0;for(;a>=1024&&n<t.length-1;)a/=1024,n++;return`${a.toFixed(a<10?1:0)} ${t[n]}`}function $e(e){if(e&&"object"==typeof e){const t=e,a=t.response?.data?.errors?.[0]?.message;if(a)return a;if(t.message)return t.message}return String(e)}function Ae(e,t="success"){$.add({title:"success"===t?"Success":"error"===t?"Error":"Warning",text:e,type:t,persist:"error"===t})}return v(()=>{"schedule"===T.value?Fe():(G(),O=setInterval(G,3e4))}),_(()=>{null!==fe&&(clearInterval(fe),fe=null)}),z(()=>{null!==O&&(clearInterval(O),O=null)}),(e,t)=>{const a=l("v-breadcrumb"),n=l("v-icon"),p=l("v-button"),v=l("v-progress-circular"),k=l("v-checkbox"),w=l("v-input"),_=l("v-notice"),z=l("v-card-title"),B=l("v-card-text"),V=l("v-card-actions"),j=l("v-card"),$=l("v-dialog"),M=l("v-progress-linear"),O=l("private-view"),ve=m("tooltip");return r(),o(O,{title:F.value},{headline:s(()=>[u(a,{items:I.value},null,8,["items"])]),"title-outer:prepend":s(()=>[u(p,{class:"header-icon",rounded:"",icon:"",secondary:"",disabled:""},{default:s(()=>[u(n,{name:"cloud_download"})]),_:1})]),actions:s(()=>[""===T.value?(r(),o(p,{key:0,secondary:"",onClick:re,loading:oe.value},{default:s(()=>[u(n,{name:"upload_file",left:""}),t[12]||(t[12]=x(" Upload Backup ",-1))]),_:1},8,["loading"])):f("v-if",!0),""===T.value?(r(),o(p,{key:1,onClick:Z,loading:K.value},{default:s(()=>[u(n,{name:"add",left:""}),t[13]||(t[13]=x(" Run Backup ",-1))]),_:1},8,["loading"])):f("v-if",!0)]),navigation:s(()=>[u(L,{current:T.value,pages:E},null,8,["current"])]),default:s(()=>[""===T.value?(r(),d("div",Ne,[f(" Backup history table "),g("div",Oe,[g("div",Ge,[t[14]||(t[14]=g("h2",{class:"section-title"},"Backup History",-1)),b((r(),o(p,{small:"",secondary:"",icon:"",loading:P.value,onClick:G},{default:s(()=>[u(n,{name:"refresh"})]),_:1},8,["loading"])),[[ve,"Refresh list"]])]),f(" Loading skeleton "),P.value&&0===A.value.length?(r(),d("div",He,[(r(),d(i,null,c(3,e=>g("div",{key:e,class:"skeleton-row"},[...t[15]||(t[15]=[g("div",{class:"skeleton-cell skeleton-date"},null,-1),g("div",{class:"skeleton-cell skeleton-type"},null,-1),g("div",{class:"skeleton-cell skeleton-collections"},null,-1),g("div",{class:"skeleton-cell skeleton-size"},null,-1),g("div",{class:"skeleton-cell skeleton-status"},null,-1),g("div",{class:"skeleton-cell skeleton-actions"},null,-1)])])),64))])):P.value||0!==A.value.length?(r(),d(i,{key:2},[f(" Table "),g("div",qe,[g("table",Ke,[t[21]||(t[21]=g("thead",null,[g("tr",null,[g("th",{class:"col-date"},"Date"),g("th",{class:"col-type"},"Type"),g("th",{class:"col-collections"},"Collections"),g("th",{class:"col-size"},"Size"),g("th",{class:"col-status"},"Status"),g("th",{class:"col-actions"},"Actions")])],-1)),g("tbody",null,[(r(!0),d(i,null,c(A.value,e=>(r(),d("tr",{key:e.id,class:"backup-row"},[f(" Date "),g("td",Ye,[g("span",Je,h(Ue(e.timestamp)),1),g("span",Qe,h(je(e.timestamp)),1)]),f(" Type badge "),g("td",Xe,[g("div",Ze,[g("span",{class:y(["type-badge","full"===e.type?"type-full":"type-selective"])},h("full"===e.type?"Full":"Selective"),3),e.includeMedia?b((r(),d("span",et,[u(n,{name:"image",small:""})])),[[ve,"Includes media files"]]):f("v-if",!0)])]),f(" Collections "),g("td",tt,["full"===e.type?(r(),d("span",at,"All collections")):(r(),d("span",nt,[x(h(e.collections.slice(0,3).join(", "))+" ",1),e.collections.length>3?(r(),d("span",lt," +"+h(e.collections.length-3)+" more ",1)):f("v-if",!0)]))]),f(" Size "),g("td",ot,h(Le(e.fileSize)),1),f(" Status "),g("td",rt,[ce.value===e.id?(r(),d("span",st,[u(v,{"x-small":"",indeterminate:"",class:"status-spinner"}),t[19]||(t[19]=x(" Restoring… ",-1))])):(r(),d("span",dt,[u(n,{name:"check_circle","x-small":"",class:"status-icon"}),t[20]||(t[20]=x(" Ready ",-1))]))]),f(" Actions "),g("td",it,[g("div",ct,[f(" Download "),b((r(),o(p,{"x-small":"",secondary:"",icon:"",onClick:C(t=>async function(e){try{const t=await U.get(`/acuity-backup/download/${e.id}`,{responseType:"blob"}),a=new Blob([t.data],{type:"application/zip"}),n=URL.createObjectURL(a),l=document.createElement("a");l.href=n,l.download=e.filename,l.click(),URL.revokeObjectURL(n)}catch{const t=document.createElement("a");t.href=function(e){return`/acuity-backup/download/${e.id}`}(e),t.download=e.filename,t.click()}}(e),["prevent"])},{default:s(()=>[u(n,{name:"download"})]),_:1},8,["onClick"])),[[ve,"Download backup archive"]]),f(" Restore — uses warning styling to signal impact "),b((r(),o(p,{"x-small":"",icon:"",class:"btn-restore",loading:ce.value===e.id,disabled:null!==ce.value&&ce.value!==e.id,onClick:t=>function(e){ie.value=e,ue.value=!1,pe.value="",ge.value=!1,de.value=!0}(e)},{default:s(()=>[u(n,{name:"settings_backup_restore"})]),_:1},8,["loading","disabled","onClick"])),[[ve,"Restore data from this backup"]]),f(" Delete "),b((r(),o(p,{"x-small":"",secondary:"",icon:"",class:"btn-danger",loading:we.value===e.id,disabled:null!==we.value&&we.value!==e.id,onClick:t=>function(e){ke.value=e,_e.value="",xe.value=!0}(e)},{default:s(()=>[u(n,{name:"delete_outline"})]),_:1},8,["loading","disabled","onClick"])),[[ve,"Permanently delete this backup"]])])])]))),128))])])])],2112)):(r(),d(i,{key:1},[f(" Empty state "),g("div",We,[u(n,{name:"cloud_off",class:"empty-icon"}),t[17]||(t[17]=g("p",{class:"empty-title"},"No backups yet",-1)),t[18]||(t[18]=g("p",{class:"empty-subtitle"},'Create your first backup by clicking "Run Backup" above.',-1)),u(p,{class:"empty-cta",onClick:Z},{default:s(()=>[u(n,{name:"add",left:""}),t[16]||(t[16]=x(" Run Backup ",-1))]),_:1})])],2112)),A.value.length>0?(r(),d("p",ut,[u(n,{name:"autorenew","x-small":"",class:"refresh-icon"}),x(" Auto-refreshes every 30 s — last updated: "+h(N.value),1)])):f("v-if",!0)])])):"schedule"===T.value?(r(),d(i,{key:1},[f(' ================================================================\n\t\t PAGE: SCHEDULE (route "schedule")\n\t\t ================================================================ '),g("div",pt,[g("div",vt,[t[28]||(t[28]=g("div",{class:"section-header"},[g("h2",{class:"section-title"},"Automatic Backups")],-1)),g("div",mt,[Be.value?(r(),d("div",gt,[u(v,{indeterminate:""}),t[22]||(t[22]=g("span",null,"Loading schedule…",-1))])):(r(),d(i,{key:1},[g("div",ft,[t[23]||(t[23]=g("div",{class:"toggle-info"},[g("label",{class:"toggle-label",for:"schedule-enabled"},"Enable Automatic Backups"),g("span",{class:"toggle-desc"},"Runs a full backup on the schedule defined below")],-1)),u(k,{id:"schedule-enabled",modelValue:Se.value,"onUpdate:modelValue":t[0]||(t[0]=e=>Se.value=e)},null,8,["modelValue"])]),g("div",{class:y(["schedule-body",!Se.value&&"schedule-body--disabled"])},[g("div",bt,[t[24]||(t[24]=g("span",{class:"preset-label"},"Presets:",-1)),(r(),d(i,null,c(Ce,e=>g("button",{key:e.label,class:y(["preset-btn",Re.value===e.value&&"preset-btn--active"]),onClick:t=>function(e){"Disabled"===e.label?Se.value=!1:(Re.value=e.value,Se.value=!0)}(e),disabled:!Se.value},h(e.label),11,ht)),64))]),g("div",yt,[t[25]||(t[25]=g("label",{class:"field-label",for:"cron-expression"},"Cron Expression",-1)),u(w,{id:"cron-expression",modelValue:Re.value,"onUpdate:modelValue":t[1]||(t[1]=e=>Re.value=e),placeholder:"0 0 * * *",disabled:!Se.value,"font-mono":"",class:"cron-input"},null,8,["modelValue","disabled"]),t[26]||(t[26]=g("p",{class:"field-hint"},[x(" Five fields: minute hour day-of-month month day-of-week. "),g("a",{href:"https://crontab.guru/",target:"_blank",rel:"noopener noreferrer"},"crontab.guru")],-1))]),De.value?(r(),d("div",xt,[u(n,{name:"history",small:""}),g("span",null,"Last run: "+h(Ue(De.value))+" ("+h(je(De.value))+")",1)])):f("v-if",!0)],2),Te.value?(r(),d("div",kt,[u(_,{type:"danger"},{default:s(()=>[x(h(Te.value),1)]),_:1})])):f("v-if",!0),g("div",wt,[u(p,{onClick:Ie,loading:Ve.value},{default:s(()=>[u(n,{name:"save",left:""}),t[27]||(t[27]=x(" Save Schedule ",-1))]),_:1},8,["loading"])])],64))])])])],2112)):"restore-logs"===T.value?(r(),d(i,{key:2},[f(' ================================================================\n\t\t PAGE: RESTORE LOGS (route "restore-logs")\n\t\t ================================================================ '),u(Me)],2112)):f("v-if",!0),u($,{modelValue:H.value,"onUpdate:modelValue":t[6]||(t[6]=e=>H.value=e),onEsc:ee},{default:s(()=>[u(j,{class:"backup-dialog"},{default:s(()=>[u(z,null,{default:s(()=>[u(n,{name:"add_circle",class:"dialog-title-icon"}),t[29]||(t[29]=x(" New Backup ",-1))]),_:1}),u(B,null,{default:s(()=>[f(" Backup type selection "),g("div",_t,[t[32]||(t[32]=g("label",{class:"field-label"},"Backup Type",-1)),g("div",zt,[g("label",{class:y(["radio-option",{"radio-option--active":"full"===W.value}])},[b(g("input",{type:"radio","onUpdate:modelValue":t[2]||(t[2]=e=>W.value=e),value:"full"},null,512),[[S,W.value]]),g("div",Ct,[u(n,{name:"cloud_download"}),t[30]||(t[30]=g("div",null,[g("span",{class:"radio-title"},"Full Backup"),g("span",{class:"radio-desc"},"Back up all collections and optionally all media files")],-1))])],2),g("label",{class:y(["radio-option",{"radio-option--active":"selective"===W.value}])},[b(g("input",{type:"radio","onUpdate:modelValue":t[3]||(t[3]=e=>W.value=e),value:"selective"},null,512),[[S,W.value]]),g("div",St,[u(n,{name:"checklist"}),t[31]||(t[31]=g("div",null,[g("span",{class:"radio-title"},"Selected Collections"),g("span",{class:"radio-desc"},"Choose specific collections to include in this backup")],-1))])],2)])]),f(" Collection selector (visible only for selective backup) "),u(R,{name:"slide-down"},{default:s(()=>["selective"===W.value?(r(),d("div",Rt,[g("div",{class:"collection-selector-header"},[t[34]||(t[34]=g("label",{class:"field-label"},"Collections",-1)),g("div",{class:"selector-actions"},[g("button",{class:"text-btn",onClick:te},"Select all"),t[33]||(t[33]=g("span",{class:"separator"},"·",-1)),g("button",{class:"text-btn",onClick:ae},"Clear")])]),X.value?(r(),d("div",Dt,[u(v,{indeterminate:"",small:""}),t[35]||(t[35]=g("span",null,"Loading collections…",-1))])):0===Q.value.length?(r(),d("div",Bt," No user collections found. ")):(r(),d("div",Vt,[(r(!0),d(i,null,c(Q.value,e=>(r(),d("label",{key:e.collection,class:y(["collection-item",{"collection-item--selected":J.value.includes(e.collection)}])},[b(g("input",{type:"checkbox",value:e.collection,"onUpdate:modelValue":t[4]||(t[4]=e=>J.value=e)},null,8,Tt),[[D,J.value]]),g("div",Et,[u(n,{name:e.icon||"table_chart",small:"",class:"collection-icon"},null,8,["name"]),g("span",Ft,h(e.collection),1),void 0!==e.itemCount?(r(),d("span",It,h(e.itemCount.toLocaleString())+" items ",1)):f("v-if",!0)])],2))),128))])),"selective"===W.value&&0===J.value.length?(r(),d("p",Ut," Please select at least one collection. ")):f("v-if",!0)])):f("v-if",!0)]),_:1}),f(" Include media toggle "),g("div",jt,[g("div",Lt,[t[36]||(t[36]=g("div",{class:"toggle-info"},[g("span",{class:"toggle-title"},"Include Media Files"),g("span",{class:"toggle-desc"},"Store metadata for all files in the media library")],-1)),u(k,{modelValue:q.value,"onUpdate:modelValue":t[5]||(t[5]=e=>q.value=e)},null,8,["modelValue"])])]),f(" Running state "),K.value?(r(),d("div",$t,[u(v,{indeterminate:""}),t[37]||(t[37]=g("div",{class:"running-text"},[g("span",{class:"running-title"},"Backup in progress…"),g("span",{class:"running-desc"},"This may take a few moments. Please do not close this window.")],-1))])):f("v-if",!0),f(" Error from last attempt "),Y.value?(r(),d("div",At,[u(_,{type:"danger"},{default:s(()=>[x(h(Y.value),1)]),_:1})])):f("v-if",!0)]),_:1}),u(V,null,{default:s(()=>[u(p,{secondary:"",onClick:ee,disabled:K.value},{default:s(()=>[...t[38]||(t[38]=[x(" Cancel ",-1)])]),_:1},8,["disabled"]),u(p,{onClick:ne,loading:K.value,disabled:"selective"===W.value&&0===J.value.length},{default:s(()=>[u(n,{name:"play_arrow",left:""}),t[39]||(t[39]=x(" Start Backup ",-1))]),_:1},8,["loading","disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),u($,{modelValue:de.value,"onUpdate:modelValue":t[8]||(t[8]=e=>de.value=e),onEsc:be},{default:s(()=>[u(j,{class:"confirm-dialog restore-dialog"},{default:s(()=>[u(z,{class:"restore-dialog-title"},{default:s(()=>[g("div",Pt,[g("div",Mt,[u(n,{name:"settings_backup_restore"})]),t[40]||(t[40]=g("span",null,"Restore Backup",-1))])]),_:1}),u(B,null,{default:s(()=>[f(" Prominent warning "),u(_,{type:"warning",class:"restore-warning-notice"},{default:s(()=>[...t[41]||(t[41]=[g("strong",null,"Data will be overwritten.",-1),x(" Restoring replaces existing records in the selected collections with the backup data. This action cannot be undone — consider creating a new backup first. ",-1)])]),_:1}),f(" Backup details summary "),ie.value?(r(),d("div",Nt,[g("div",Ot,[t[42]||(t[42]=g("span",{class:"detail-label"},"Backup date",-1)),g("span",Gt,h(Ue(ie.value.timestamp)),1)]),g("div",Ht,[t[43]||(t[43]=g("span",{class:"detail-label"},"Age",-1)),g("span",Wt,h(je(ie.value.timestamp)),1)]),g("div",qt,[t[44]||(t[44]=g("span",{class:"detail-label"},"Type",-1)),g("span",Kt,h("full"===ie.value.type?"Full Backup":"Selective Backup"),1)]),g("div",Yt,[t[45]||(t[45]=g("span",{class:"detail-label"},"Collections",-1)),g("span",Jt,h("full"===ie.value.type?"All collections":ie.value.collections.join(", ")),1)]),g("div",Qt,[t[46]||(t[46]=g("span",{class:"detail-label"},"File size",-1)),g("span",Xt,h(Le(ie.value.fileSize)),1)])])):f("v-if",!0),f(" Truncate toggle "),g("div",Zt,[t[47]||(t[47]=g("div",{class:"toggle-info"},[g("span",{class:"toggle-title"},"Truncate before restore"),g("span",{class:"toggle-desc"},"Delete all existing records before importing — ensures a clean, exact restore")],-1)),u(k,{modelValue:ue.value,"onUpdate:modelValue":t[7]||(t[7]=e=>ue.value=e)},null,8,["modelValue"])]),f(" Restore progress "),null!==ce.value?(r(),d("div",ea,[g("div",ta,[g("div",aa,[g("span",na,h(ge.value?"Restore completed":"Restoring backup…"),1),g("span",la,h(me.value.progressPercentage)+"%",1)]),u(M,{value:me.value.progressPercentage,class:"progress-bar"},null,8,["value"]),g("div",oa,[g("span",ra,h(me.value.phase),1),g("span",sa,h(me.value.elapsedSeconds)+"s",1)])]),me.value.errors.length>0?(r(),d("div",da,[g("details",ia,[g("summary",ca,h(me.value.errors.length)+" error(s) occurred",1),g("div",ua,[(r(!0),d(i,null,c(me.value.errors,(e,t)=>(r(),d("div",{key:t,class:"error-item"},[e.collection?(r(),d("span",pa,h(e.collection)+": ",1)):f("v-if",!0),g("span",va,h(e.message),1)]))),128))])])])):f("v-if",!0)])):f("v-if",!0),f(" Error "),pe.value?(r(),d("div",ma,[u(_,{type:"danger"},{default:s(()=>[x(h(pe.value),1)]),_:1})])):f("v-if",!0)]),_:1}),u(V,null,{default:s(()=>[ge.value?f("v-if",!0):(r(),o(p,{key:0,secondary:"",onClick:be,disabled:null!==ce.value},{default:s(()=>[...t[48]||(t[48]=[x(" Cancel ",-1)])]),_:1},8,["disabled"])),ge.value?(r(),o(p,{key:1,onClick:he},{default:s(()=>[u(n,{name:"close",left:""}),t[49]||(t[49]=x(" Close ",-1))]),_:1})):(r(),o(p,{key:2,class:"btn-restore-confirm",onClick:ye,loading:null!==ce.value&&!ge.value},{default:s(()=>[u(n,{name:"settings_backup_restore",left:""}),t[50]||(t[50]=x(" Restore Now ",-1))]),_:1},8,["loading"]))]),_:1})]),_:1})]),_:1},8,["modelValue"]),u($,{modelValue:xe.value,"onUpdate:modelValue":t[10]||(t[10]=e=>xe.value=e),onEsc:t[11]||(t[11]=e=>xe.value=!1)},{default:s(()=>[u(j,{class:"confirm-dialog"},{default:s(()=>[u(z,null,{default:s(()=>[g("div",ga,[g("div",fa,[u(n,{name:"delete_forever"})]),t[51]||(t[51]=g("span",null,"Delete Backup",-1))])]),_:1}),u(B,null,{default:s(()=>[u(_,{type:"danger"},{default:s(()=>[...t[52]||(t[52]=[x(" This will permanently delete the backup archive from disk. This action cannot be undone. ",-1)])]),_:1}),ke.value?(r(),d("div",ba,[g("div",ha,[t[53]||(t[53]=g("span",{class:"detail-label"},"Backup date",-1)),g("span",ya,h(Ue(ke.value.timestamp)),1)]),g("div",xa,[t[54]||(t[54]=g("span",{class:"detail-label"},"Type",-1)),g("span",ka,h("full"===ke.value.type?"Full Backup":"Selective Backup"),1)]),g("div",wa,[t[55]||(t[55]=g("span",{class:"detail-label"},"File size",-1)),g("span",_a,h(Le(ke.value.fileSize)),1)])])):f("v-if",!0),_e.value?(r(),d("div",za,[u(_,{type:"danger"},{default:s(()=>[x(h(_e.value),1)]),_:1})])):f("v-if",!0)]),_:1}),u(V,null,{default:s(()=>[u(p,{secondary:"",onClick:t[9]||(t[9]=e=>xe.value=!1),disabled:null!==we.value},{default:s(()=>[...t[56]||(t[56]=[x(" Cancel ",-1)])]),_:1},8,["disabled"]),u(p,{danger:"",onClick:ze,loading:null!==we.value},{default:s(()=>[u(n,{name:"delete_forever",left:""}),t[57]||(t[57]=x(" Delete Permanently ",-1))]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),g("input",{ref_key:"fileInputRef",ref:le,type:"file",accept:".zip",style:{display:"none"},onChange:se},null,544)]),_:1},8,["title"])}}});Ae('\n/* ============================================================\n Layout\n ============================================================ */\n.backup-module-content[data-v-d39e5c72] {\n\tpadding: var(--content-padding);\n\tpadding-bottom: var(--content-padding-bottom);\n\tmax-width: 1100px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 40px;\n}\n.header-icon[data-v-d39e5c72] {\n\t--v-button-background-color: var(--theme--primary-background);\n\t--v-button-color: var(--theme--primary);\n}\n\n/* ============================================================\n Sections\n ============================================================ */\n.section[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n.section-header[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n}\n.section-title[data-v-d39e5c72] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n\tmargin: 0;\n}\n\n/* ============================================================\n Skeleton loader\n ============================================================ */\n.skeleton-rows[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tborder-radius: var(--theme--border-radius);\n\toverflow: hidden;\n\tborder: 1px solid var(--theme--border-color-subdued);\n}\n.skeleton-row[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 16px;\n\tpadding: 14px 16px;\n\tbackground: var(--theme--background);\n}\n.skeleton-cell[data-v-d39e5c72] {\n\theight: 14px;\n\tborder-radius: 4px;\n\tbackground: var(--theme--background-subdued);\n\tanimation: shimmer-d39e5c72 1.5s ease-in-out infinite;\n}\n.skeleton-date[data-v-d39e5c72] { width: 140px;\n}\n.skeleton-type[data-v-d39e5c72] { width: 70px;\n}\n.skeleton-collections[data-v-d39e5c72] { width: 200px; flex: 1;\n}\n.skeleton-size[data-v-d39e5c72] { width: 60px;\n}\n.skeleton-status[data-v-d39e5c72] { width: 80px;\n}\n.skeleton-actions[data-v-d39e5c72] { width: 110px;\n}\n@keyframes shimmer-d39e5c72 {\n0%, 100% { opacity: 1;\n}\n50% { opacity: 0.4;\n}\n}\n\n/* ============================================================\n Empty state\n ============================================================ */\n.empty-state[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 60px 24px;\n\tborder: 2px dashed var(--theme--border-color);\n\tborder-radius: var(--theme--border-radius);\n\ttext-align: center;\n\tgap: 8px;\n}\n.empty-icon[data-v-d39e5c72] {\n\t--v-icon-size: 48px;\n\t--v-icon-color: var(--theme--foreground-subdued);\n\tmargin-bottom: 8px;\n}\n.empty-title[data-v-d39e5c72] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n\tmargin: 0;\n}\n.empty-subtitle[data-v-d39e5c72] {\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin: 0 0 8px;\n}\n.empty-cta[data-v-d39e5c72] {\n\tmargin-top: 8px;\n}\n\n/* ============================================================\n Backup table\n ============================================================ */\n.table-wrapper[data-v-d39e5c72] {\n\toverflow-x: auto;\n\tborder: 1px solid var(--theme--border-color-subdued);\n\tborder-radius: var(--theme--border-radius);\n}\n.backup-table[data-v-d39e5c72] {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n.backup-table thead[data-v-d39e5c72] {\n\tbackground: var(--theme--background-subdued);\n}\n.backup-table th[data-v-d39e5c72] {\n\tpadding: 10px 16px;\n\ttext-align: left;\n\tfont-weight: 600;\n\tfont-size: 12px;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.05em;\n\tcolor: var(--theme--foreground-subdued);\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n\twhite-space: nowrap;\n}\n.backup-table td[data-v-d39e5c72] {\n\tpadding: 12px 16px;\n\tvertical-align: middle;\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n\tcolor: var(--theme--foreground);\n}\n.backup-row:last-child td[data-v-d39e5c72] {\n\tborder-bottom: none;\n}\n.backup-row:hover td[data-v-d39e5c72] {\n\tbackground: var(--theme--background-subdued);\n}\n\n/* Column widths */\n.col-date[data-v-d39e5c72] { min-width: 160px;\n}\n.col-type[data-v-d39e5c72] { min-width: 120px;\n}\n.col-collections[data-v-d39e5c72] { min-width: 180px;\n}\n.col-size[data-v-d39e5c72] { min-width: 80px; white-space: nowrap;\n}\n.col-status[data-v-d39e5c72] { min-width: 100px;\n}\n.col-actions[data-v-d39e5c72] { min-width: 130px; text-align: right;\n}\n.date-primary[data-v-d39e5c72] {\n\tdisplay: block;\n\tfont-weight: 500;\n}\n.date-relative[data-v-d39e5c72] {\n\tdisplay: block;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin-top: 2px;\n}\n\n/* Type badges */\n.type-cell[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n}\n.type-badge[data-v-d39e5c72] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tpadding: 2px 8px;\n\tborder-radius: 100px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n}\n.type-full[data-v-d39e5c72] {\n\tbackground: var(--theme--primary-background);\n\tcolor: var(--theme--primary);\n}\n.type-selective[data-v-d39e5c72] {\n\tbackground: var(--theme--secondary-background, #f0f4ff);\n\tcolor: var(--theme--secondary, #6644dd);\n}\n.media-badge[data-v-d39e5c72] {\n\t--v-icon-color: var(--theme--foreground-subdued);\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n\n/* Status badges */\n.status-badge[data-v-d39e5c72] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 5px;\n\tpadding: 3px 8px;\n\tborder-radius: 100px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n.status-valid[data-v-d39e5c72] {\n\tbackground: color-mix(in srgb, var(--theme--success) 12%, transparent);\n\tcolor: var(--theme--success);\n}\n.status-restoring[data-v-d39e5c72] {\n\tbackground: color-mix(in srgb, var(--theme--warning) 12%, transparent);\n\tcolor: var(--theme--warning);\n}\n.status-icon[data-v-d39e5c72] {\n\t--v-icon-size: 14px;\n\t--v-icon-color: currentColor;\n}\n.status-spinner[data-v-d39e5c72] {\n\t--v-progress-circular-size: 14px;\n}\n\n/* ============================================================\n Action buttons\n ============================================================ */\n.action-buttons[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\tgap: 6px;\n}\n\n/*\n * Restore button — amber/warning palette so it stands out from the\n * neutral Download button and the red Delete button.\n * Uses Directus warning tokens with a solid filled style.\n */\n.btn-restore[data-v-d39e5c72] {\n\t--v-button-background-color: color-mix(in srgb, var(--theme--warning) 15%, transparent);\n\t--v-button-color: var(--theme--warning);\n\t--v-button-border-color: color-mix(in srgb, var(--theme--warning) 40%, transparent);\n\t--v-button-background-color-hover: var(--theme--warning);\n\t--v-button-color-hover: var(--white);\n\t--v-button-border-color-hover: var(--theme--warning);\n}\n.btn-danger[data-v-d39e5c72] {\n\t--v-button-color: var(--theme--danger);\n\t--v-button-color-hover: var(--white);\n\t--v-button-background-color-hover: var(--theme--danger);\n\t--v-button-border-color-hover: var(--theme--danger);\n}\n.auto-refresh-notice[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 5px;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin: 0;\n}\n.refresh-icon[data-v-d39e5c72] {\n\t--v-icon-size: 13px;\n\t--v-icon-color: var(--theme--foreground-subdued);\n}\n\n/* ============================================================\n Schedule card\n ============================================================ */\n.schedule-card[data-v-d39e5c72] {\n\tbackground: var(--theme--background);\n\tborder: 1px solid var(--theme--border-color-subdued);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 24px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 20px;\n}\n.schedule-loading[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tfont-size: 14px;\n}\n.schedule-toggle-row[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 16px;\n}\n.toggle-label[data-v-d39e5c72] {\n\tfont-size: 15px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n}\n.schedule-body[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n\ttransition: opacity 0.2s ease;\n}\n.schedule-body--disabled[data-v-d39e5c72] {\n\topacity: 0.45;\n\tpointer-events: none;\n}\n.cron-presets[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: 8px;\n}\n.preset-label[data-v-d39e5c72] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\tfont-weight: 500;\n}\n.preset-btn[data-v-d39e5c72] {\n\tpadding: 4px 14px;\n\tborder-radius: 100px;\n\tborder: 1px solid var(--theme--border-color);\n\tbackground: var(--theme--background-subdued);\n\tcolor: var(--theme--foreground);\n\tfont-size: 13px;\n\tcursor: pointer;\n\ttransition: background 0.15s, border-color 0.15s, color 0.15s;\n}\n.preset-btn[data-v-d39e5c72]:hover:not(:disabled) {\n\tbackground: var(--theme--primary-background);\n\tborder-color: var(--theme--primary);\n\tcolor: var(--theme--primary);\n}\n.preset-btn--active[data-v-d39e5c72] {\n\tbackground: var(--theme--primary);\n\tborder-color: var(--theme--primary);\n\tcolor: var(--white);\n}\n.preset-btn--active[data-v-d39e5c72]:hover:not(:disabled) {\n\tbackground: var(--theme--primary);\n\tcolor: var(--white);\n}\n.preset-btn[data-v-d39e5c72]:disabled {\n\tcursor: not-allowed;\n}\n.cron-input-row[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n.field-label[data-v-d39e5c72] {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.05em;\n}\n.cron-input[data-v-d39e5c72] {\n\tmax-width: 320px;\n\tfont-family: var(--theme--fonts--mono--font-family, monospace);\n}\n.field-hint[data-v-d39e5c72] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin: 0;\n}\n.field-hint a[data-v-d39e5c72] {\n\tcolor: var(--theme--primary);\n\ttext-decoration: none;\n}\n.field-hint a[data-v-d39e5c72]:hover {\n\ttext-decoration: underline;\n}\n.last-run-row[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\t--v-icon-color: var(--theme--foreground-subdued);\n}\n.schedule-footer[data-v-d39e5c72] {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tpadding-top: 4px;\n\tborder-top: 1px solid var(--theme--border-color-subdued);\n}\n\n/* ============================================================\n Dialogs — shared\n ============================================================ */\n.backup-dialog[data-v-d39e5c72],\n.confirm-dialog[data-v-d39e5c72] {\n\twidth: 560px;\n\tmax-width: calc(100vw - 32px);\n}\n.dialog-section[data-v-d39e5c72] {\n\tmargin-bottom: 20px;\n}\n.dialog-section[data-v-d39e5c72]:last-child {\n\tmargin-bottom: 0;\n}\n\n/* Dialog title with icon */\n.dialog-title-row[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n}\n.dialog-title-icon-wrap[data-v-d39e5c72] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder-radius: 50%;\n\tflex-shrink: 0;\n}\n.restore-icon-wrap[data-v-d39e5c72] {\n\tbackground: color-mix(in srgb, var(--theme--warning) 15%, transparent);\n\tcolor: var(--theme--warning);\n\t--v-icon-color: var(--theme--warning);\n}\n.danger-icon-wrap[data-v-d39e5c72] {\n\tbackground: color-mix(in srgb, var(--theme--danger) 12%, transparent);\n\tcolor: var(--theme--danger);\n\t--v-icon-color: var(--theme--danger);\n}\n\n/* ============================================================\n Restore dialog specifics\n ============================================================ */\n.restore-warning-notice[data-v-d39e5c72] {\n\tmargin-bottom: 0;\n}\n.restore-option-row[data-v-d39e5c72] {\n\tmargin-top: 16px;\n}\n.restore-progress[data-v-d39e5c72] {\n\tmargin-top: 16px;\n}\n\n/* Restore confirm button — warning/amber so it reads as impactful but not destructive */\n.btn-restore-confirm[data-v-d39e5c72] {\n\t--v-button-background-color: var(--theme--warning);\n\t--v-button-color: var(--white);\n\t--v-button-border-color: var(--theme--warning);\n\t--v-button-background-color-hover: color-mix(in srgb, var(--theme--warning) 85%, black);\n\t--v-button-color-hover: var(--white);\n\t--v-button-border-color-hover: color-mix(in srgb, var(--theme--warning) 85%, black);\n}\n\n/* ============================================================\n Radio group (New Backup dialog)\n ============================================================ */\n.radio-group[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmargin-top: 8px;\n}\n.radio-option[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 0;\n\tborder: 1px solid var(--theme--border-color);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 14px 16px;\n\tcursor: pointer;\n\ttransition: border-color 0.15s, background 0.15s;\n}\n.radio-option input[type="radio"][data-v-d39e5c72] {\n\tposition: absolute;\n\topacity: 0;\n\tpointer-events: none;\n}\n.radio-option--active[data-v-d39e5c72] {\n\tborder-color: var(--theme--primary);\n\tbackground: var(--theme--primary-background);\n}\n.radio-option[data-v-d39e5c72]:hover:not(.radio-option--active) {\n\tbackground: var(--theme--background-subdued);\n\tborder-color: var(--theme--border-color-subdued);\n}\n.radio-content[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 12px;\n\twidth: 100%;\n\t--v-icon-color: var(--theme--primary);\n}\n.radio-title[data-v-d39e5c72] {\n\tdisplay: block;\n\tfont-weight: 600;\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground);\n}\n.radio-desc[data-v-d39e5c72] {\n\tdisplay: block;\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin-top: 2px;\n}\n\n/* ============================================================\n Collection selector\n ============================================================ */\n.collection-selector[data-v-d39e5c72] {\n\tborder: 1px solid var(--theme--border-color-subdued);\n\tborder-radius: var(--theme--border-radius);\n\toverflow: hidden;\n}\n.collection-selector-header[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 10px 14px;\n\tbackground: var(--theme--background-subdued);\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n}\n.selector-actions[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n}\n.text-btn[data-v-d39e5c72] {\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tfont-size: 13px;\n\tcolor: var(--theme--primary);\n\tpadding: 0;\n}\n.text-btn[data-v-d39e5c72]:hover {\n\ttext-decoration: underline;\n}\n.separator[data-v-d39e5c72] {\n\tcolor: var(--theme--border-color);\n}\n.collections-loading[data-v-d39e5c72],\n.collections-empty[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 16px 14px;\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.collection-list-scroll[data-v-d39e5c72] {\n\tmax-height: 240px;\n\toverflow-y: auto;\n}\n.collection-item[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 8px 14px;\n\tcursor: pointer;\n\ttransition: background 0.1s;\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n}\n.collection-item[data-v-d39e5c72]:last-child {\n\tborder-bottom: none;\n}\n.collection-item input[type="checkbox"][data-v-d39e5c72] {\n\twidth: 16px;\n\theight: 16px;\n\tflex-shrink: 0;\n\taccent-color: var(--theme--primary);\n\tcursor: pointer;\n}\n.collection-item--selected[data-v-d39e5c72] {\n\tbackground: var(--theme--primary-background);\n}\n.collection-item[data-v-d39e5c72]:hover:not(.collection-item--selected) {\n\tbackground: var(--theme--background-subdued);\n}\n.collection-item-content[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tmargin-left: 10px;\n\tflex: 1;\n}\n.collection-icon[data-v-d39e5c72] {\n\t--v-icon-color: var(--theme--foreground-subdued);\n}\n.collection-name[data-v-d39e5c72] {\n\tflex: 1;\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground);\n\tfont-family: var(--theme--fonts--mono--font-family, monospace);\n}\n.collection-count[data-v-d39e5c72] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\twhite-space: nowrap;\n}\n\n/* ============================================================\n Toggle rows (shared between dialogs and schedule card)\n ============================================================ */\n.toggle-row[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 16px;\n\tpadding: 12px 0;\n\tborder-top: 1px solid var(--theme--border-color-subdued);\n}\n.toggle-info[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n.toggle-title[data-v-d39e5c72] {\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n}\n.toggle-desc[data-v-d39e5c72] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n}\n\n/* ============================================================\n Running / progress state\n ============================================================ */\n.running-state[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 14px;\n\tpadding: 16px;\n\tbackground: var(--theme--primary-background);\n\tborder-radius: var(--theme--border-radius);\n\tborder: 1px solid var(--theme--primary);\n\tmargin-top: 16px;\n}\n.running-text[data-v-d39e5c72] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n.running-title[data-v-d39e5c72] {\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tcolor: var(--theme--primary);\n}\n.running-desc[data-v-d39e5c72] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.progress-info[data-v-d39e5c72] {\n\tflex: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n}\n.progress-header[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 16px;\n}\n.progress-percentage[data-v-d39e5c72] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tcolor: var(--theme--primary);\n\tmin-width: 50px;\n\ttext-align: right;\n}\n.progress-bar[data-v-d39e5c72] {\n\twidth: 100%;\n}\n.progress-details[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.phase-text[data-v-d39e5c72] {\n\tflex: 1;\n}\n.elapsed-time[data-v-d39e5c72] {\n\twhite-space: nowrap;\n\tmargin-left: 16px;\n}\n.errors-section[data-v-d39e5c72] {\n\tmargin-top: 8px;\n}\n.errors-details[data-v-d39e5c72] {\n\tcursor: pointer;\n}\n.errors-summary[data-v-d39e5c72] {\n\tfont-size: 12px;\n\tcolor: var(--theme--danger);\n\tfont-weight: 500;\n\tuser-select: none;\n\tpadding: 8px;\n\tmargin: -8px;\n\tborder-radius: var(--theme--border-radius);\n}\n.errors-summary[data-v-d39e5c72]:hover {\n\tbackground: var(--theme--background-subdued);\n}\n.errors-list[data-v-d39e5c72] {\n\tmargin-top: 8px;\n\tpadding-left: 12px;\n\tborder-left: 2px solid var(--theme--danger);\n\tmax-height: 200px;\n\toverflow-y: auto;\n}\n.error-item[data-v-d39e5c72] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tpadding: 4px 0;\n\tword-break: break-word;\n}\n.error-collection[data-v-d39e5c72] {\n\tcolor: var(--theme--danger);\n\tfont-weight: 500;\n}\n.error-message[data-v-d39e5c72] {\n\tcolor: var(--theme--foreground-subdued);\n}\n\n/* ============================================================\n Confirm dialog details panel\n ============================================================ */\n.confirm-details[data-v-d39e5c72] {\n\tmargin-top: 16px;\n\tbackground: var(--theme--background-subdued);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 12px 16px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n.detail-row[data-v-d39e5c72] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 12px;\n}\n.detail-label[data-v-d39e5c72] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\tmin-width: 110px;\n\tflex-shrink: 0;\n}\n.detail-value[data-v-d39e5c72] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground);\n\tword-break: break-word;\n}\n\n/* ============================================================\n Error & validation notices\n ============================================================ */\n.error-notice[data-v-d39e5c72] {\n\tmargin-top: 12px;\n}\n.validation-msg[data-v-d39e5c72] {\n\tfont-size: 12px;\n\tcolor: var(--theme--danger);\n\tpadding: 6px 14px;\n\tmargin: 0;\n}\n\n/* ============================================================\n Transitions\n ============================================================ */\n.slide-down-enter-active[data-v-d39e5c72],\n.slide-down-leave-active[data-v-d39e5c72] {\n\ttransition: opacity 0.2s ease, transform 0.2s ease, max-height 0.25s ease;\n\tmax-height: 400px;\n\toverflow: hidden;\n}\n.slide-down-enter-from[data-v-d39e5c72],\n.slide-down-leave-to[data-v-d39e5c72] {\n\topacity: 0;\n\ttransform: translateY(-6px);\n\tmax-height: 0;\n}\n\n/* ============================================================\n Responsive\n ============================================================ */\n@media (max-width: 900px) {\n.col-collections[data-v-d39e5c72] { display: none;\n}\n}\n@media (max-width: 768px) {\n.backup-module-content[data-v-d39e5c72] {\n\t\tpadding: 16px;\n\t\tgap: 28px;\n}\n.col-size[data-v-d39e5c72] { display: none;\n}\n.col-status[data-v-d39e5c72] { display: none;\n}\n\n\t/* Collapse action buttons to icon-only on small viewports — already icon-only, but tighten gap */\n.action-buttons[data-v-d39e5c72] {\n\t\tgap: 4px;\n}\n.backup-dialog[data-v-d39e5c72],\n\t.confirm-dialog[data-v-d39e5c72] {\n\t\twidth: 100%;\n}\n.cron-input[data-v-d39e5c72] {\n\t\tmax-width: 100%;\n}\n.schedule-card[data-v-d39e5c72] {\n\t\tpadding: 16px;\n}\n.cron-presets[data-v-d39e5c72] {\n\t\tgap: 6px;\n}\n.dialog-title-row[data-v-d39e5c72] {\n\t\tgap: 8px;\n}\n}\n',{});var Sa=Pe(Ca,[["__scopeId","data-v-d39e5c72"]]),Ra=Object.freeze({__proto__:null,default:Sa});export{T as displays,V as interfaces,E as layouts,F as modules,j as operations,I as panels,U as themes};
1
+ import{defineModule as e,useApi as a,useStores as t}from"@directus/extensions-sdk";import{defineComponent as n,resolveComponent as l,createBlock as o,openBlock as r,withCtx as s,createElementBlock as i,Fragment as d,renderList as c,createVNode as u,ref as p,onMounted as v,resolveDirective as m,createElementVNode as g,createCommentVNode as f,withDirectives as b,toDisplayString as h,normalizeClass as y,createTextVNode as x,computed as k,watch as w,onBeforeUnmount as _,onUnmounted as z,withModifiers as C,vModelRadio as S,Transition as R,vModelCheckbox as D}from"vue";import{useRouter as B}from"vue-router";const V=[],E=[],T=[],F=[e({id:"acuity-backup",name:"Backup",icon:"cloud_download",routes:[{path:"",props:!0,component:()=>Promise.resolve().then(function(){return At})},{path:":page",props:!0,component:()=>Promise.resolve().then(function(){return At})}]})],U=[],I=[],L=[];var j=n({__name:"navigation",props:{current:{},pages:{}},setup:e=>(a,t)=>{const n=l("v-icon"),p=l("v-list-item-icon"),v=l("v-text-overflow"),m=l("v-list-item-content"),g=l("v-list-item"),f=l("v-list");return r(),o(f,{nav:""},{default:s(()=>[(r(!0),i(d,null,c(e.pages,a=>(r(),o(g,{key:a.route,clickable:"",active:e.current===a.route,to:"/acuity-backup"+(a.route?"/"+a.route:"")},{default:s(()=>[u(p,null,{default:s(()=>[u(n,{name:a.icon},null,8,["name"])]),_:2},1024),u(m,null,{default:s(()=>[u(v,{text:a.label},null,8,["text"])]),_:2},1024)]),_:2},1032,["active","to"]))),128))]),_:1})}});const $={class:"restore-logs-page"},A={class:"section"},P={class:"section-header"},M={key:0,class:"empty-state"},O={class:"table-wrapper"},N={class:"logs-table"},G={class:"col-date"},H={class:"date-primary"},W={class:"date-relative"},q={class:"col-backup"},K={class:"backup-id"},Y={class:"col-status"},J={class:"col-duration"},Q={class:"col-items"},X={class:"col-errors"},Z={key:0,class:"no-errors"},ee={key:1,class:"error-count"},ae={class:"col-actions"},te={class:"detail-header"},ne={class:"detail-section"},le={class:"detail-row"},oe={class:"detail-value mono"},re={class:"detail-row"},se={class:"detail-value mono"},ie={class:"detail-row"},de={class:"detail-value"},ce={class:"detail-row"},ue={class:"detail-row"},pe={class:"detail-value"},ve={class:"detail-section"},me={class:"summary-grid"},ge={class:"summary-item"},fe={class:"summary-value"},be={class:"summary-item"},he={class:"summary-value success"},ye={class:"summary-item"},xe={class:"summary-item"},ke={class:"summary-value"},we={class:"summary-item"},_e={class:"summary-value"},ze={class:"summary-item"},Ce={class:"summary-value"},Se={class:"summary-item"},Re={class:"summary-value"},De={key:0,class:"detail-section"},Be={class:"section-subtitle"},Ve={class:"errors-container"},Ee={key:0,class:"error-collection"},Te={class:"error-message"},Fe={class:"error-timestamp"},Ue={class:"dialog-title-row"},Ie={class:"dialog-title-icon-wrap danger-icon-wrap"};var Le=n({__name:"restore-logs",setup(e){const t=a(),n=p([]),k=p(!1),w=p(!1),_=p(null),z=p(!1),C=p(!1),S=p(null);async function R(){k.value=!0;try{const e=await t.get("/acuity-backup/restore-logs");n.value=e.data.data}catch(e){console.error("Failed to load restore logs:",e)}finally{k.value=!1}}async function D(){if(S.value){C.value=!0;try{await t.delete(`/acuity-backup/restore-logs/${S.value.id}`),n.value=n.value.filter(e=>e.id!==S.value.id),z.value=!1,w.value=!1}catch(e){console.error("Failed to delete restore log:",e)}finally{C.value=!1}}}function B(e){return new Date(e).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit"})}function V(e){const a=new Date(e),t=new Date,n=Math.floor((t.getTime()-a.getTime())/1e3);if(n<60)return"just now";const l=Math.floor(n/60);if(l<60)return`${l}m ago`;const o=Math.floor(l/60);if(o<24)return`${o}h ago`;return`${Math.floor(o/24)}d ago`}function E(e){const a=Math.floor(e/1e3);if(a<60)return`${a}s`;return`${Math.floor(a/60)}m ${a%60}s`}function T(e){switch(e){case"success":return"Success";case"partial":return"Partial";case"failed":return"Failed";default:return e}}return v(()=>{R()}),(e,a)=>{const t=l("v-icon"),p=l("v-button"),v=l("v-card-title"),F=l("v-card-text"),U=l("v-card-actions"),I=l("v-card"),L=l("v-dialog"),j=l("v-notice"),Le=m("tooltip");return r(),i(d,null,[g("div",$,[g("div",A,[g("div",P,[a[7]||(a[7]=g("h2",{class:"section-title"},"Restore History",-1)),b((r(),o(p,{small:"",secondary:"",icon:"",loading:k.value,onClick:R},{default:s(()=>[u(t,{name:"refresh"})]),_:1},8,["loading"])),[[Le,"Refresh list"]])]),f(" Empty state "),k.value||0!==n.value.length?(r(),i(d,{key:1},[f(" Table "),g("div",O,[g("table",N,[a[10]||(a[10]=g("thead",null,[g("tr",null,[g("th",{class:"col-date"},"Date"),g("th",{class:"col-backup"},"Backup ID"),g("th",{class:"col-status"},"Status"),g("th",{class:"col-duration"},"Duration"),g("th",{class:"col-items"},"Items"),g("th",{class:"col-errors"},"Errors"),g("th",{class:"col-actions"},"Actions")])],-1)),g("tbody",null,[(r(!0),i(d,null,c(n.value,e=>{return r(),i("tr",{key:e.id,class:"log-row"},[g("td",G,[g("span",H,h((a=e.timestamp,new Date(a).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}))),1),g("span",W,h(V(e.timestamp)),1)]),g("td",q,[g("code",K,h(e.backupId.substring(0,8)),1)]),g("td",Y,[g("span",{class:y(["status-badge",`status-${e.status}`])},h(T(e.status)),3)]),g("td",J,h(E(e.duration)),1),g("td",Q,h(e.summary.itemsRestored),1),g("td",X,[0===e.errors.length?(r(),i("span",Z,"—")):(r(),i("span",ee,h(e.errors.length),1))]),g("td",ae,[b((r(),o(p,{small:"",icon:"",secondary:"",onClick:a=>function(e){_.value=e,w.value=!0}(e)},{default:s(()=>[u(t,{name:"info"})]),_:1},8,["onClick"])),[[Le,"View details"]]),b((r(),o(p,{small:"",icon:"",secondary:"",danger:"",onClick:a=>function(e){S.value=e,z.value=!0}(e)},{default:s(()=>[u(t,{name:"delete"})]),_:1},8,["onClick"])),[[Le,"Delete log"]])])]);var a}),128))])])])],2112)):(r(),i("div",M,[u(t,{name:"history",class:"empty-icon"}),a[8]||(a[8]=g("p",{class:"empty-title"},"No restore logs",-1)),a[9]||(a[9]=g("p",{class:"empty-subtitle"},"Restore operations will appear here.",-1))]))])]),f(" Detail Modal "),u(L,{modelValue:w.value,"onUpdate:modelValue":a[2]||(a[2]=e=>w.value=e),onEsc:a[3]||(a[3]=e=>w.value=!1)},{default:s(()=>[_.value?(r(),o(I,{key:0,class:"detail-modal"},{default:s(()=>[u(v,null,{default:s(()=>[g("div",te,[a[11]||(a[11]=g("span",null,"Restore Log",-1)),u(p,{icon:"",secondary:"",small:"",onClick:a[0]||(a[0]=e=>w.value=!1)},{default:s(()=>[u(t,{name:"close"})]),_:1})])]),_:1}),u(F,null,{default:s(()=>{return[g("div",ne,[g("div",le,[a[12]||(a[12]=g("span",{class:"detail-label"},"Session ID",-1)),g("code",oe,h(_.value.sessionId),1)]),g("div",re,[a[13]||(a[13]=g("span",{class:"detail-label"},"Backup ID",-1)),g("code",se,h(_.value.backupId),1)]),g("div",ie,[a[14]||(a[14]=g("span",{class:"detail-label"},"Date",-1)),g("span",de,h((e=_.value.timestamp,new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit"}))),1)]),g("div",ce,[a[15]||(a[15]=g("span",{class:"detail-label"},"Status",-1)),g("span",{class:y(["status-badge",`status-${_.value.status}`])},h(T(_.value.status)),3)]),g("div",ue,[a[16]||(a[16]=g("span",{class:"detail-label"},"Duration",-1)),g("span",pe,h(E(_.value.duration)),1)])]),g("div",ve,[a[24]||(a[24]=g("h3",{class:"section-subtitle"},"Summary",-1)),g("div",me,[g("div",ge,[a[17]||(a[17]=g("span",{class:"summary-label"},"Collections Attempted",-1)),g("span",fe,h(_.value.summary.collectionsAttempted),1)]),g("div",be,[a[18]||(a[18]=g("span",{class:"summary-label"},"Collections Success",-1)),g("span",he,h(_.value.summary.collectionsSuccess),1)]),g("div",ye,[a[19]||(a[19]=g("span",{class:"summary-label"},"Collections Failed",-1)),g("span",{class:y(["summary-value",{error:_.value.summary.collectionsFailed>0}])},h(_.value.summary.collectionsFailed),3)]),g("div",xe,[a[20]||(a[20]=g("span",{class:"summary-label"},"Items Restored",-1)),g("span",ke,h(_.value.summary.itemsRestored),1)]),g("div",we,[a[21]||(a[21]=g("span",{class:"summary-label"},"Media Files",-1)),g("span",_e,h(_.value.summary.mediaFilesRestored),1)]),g("div",ze,[a[22]||(a[22]=g("span",{class:"summary-label"},"Field Groups",-1)),g("span",Ce,h(_.value.summary.fieldGroupsRestored),1)]),g("div",Se,[a[23]||(a[23]=g("span",{class:"summary-label"},"Collection Views",-1)),g("span",Re,h(_.value.summary.collectionViewsRestored),1)])])]),_.value.errors.length>0?(r(),i("div",De,[g("h3",Be,"Errors ("+h(_.value.errors.length)+")",1),g("div",Ve,[(r(!0),i(d,null,c(_.value.errors,(e,a)=>(r(),i("div",{key:a,class:"error-detail"},[e.collection?(r(),i("span",Ee,h(e.collection),1)):f("v-if",!0),g("span",Te,h(e.message),1),g("span",Fe,h(B(e.timestamp)),1)]))),128))])])):f("v-if",!0)];var e}),_:1}),u(U,null,{default:s(()=>[u(p,{secondary:"",onClick:a[1]||(a[1]=e=>w.value=!1)},{default:s(()=>[...a[25]||(a[25]=[x("Close",-1)])]),_:1}),u(p,{danger:"",onClick:D},{default:s(()=>[...a[26]||(a[26]=[x("Delete Log",-1)])]),_:1})]),_:1})]),_:1})):f("v-if",!0)]),_:1},8,["modelValue"]),f(" Delete confirmation "),u(L,{modelValue:z.value,"onUpdate:modelValue":a[5]||(a[5]=e=>z.value=e),onEsc:a[6]||(a[6]=e=>z.value=!1)},{default:s(()=>[u(I,{class:"confirm-dialog"},{default:s(()=>[u(v,null,{default:s(()=>[g("div",Ue,[g("div",Ie,[u(t,{name:"delete_forever"})]),a[27]||(a[27]=g("span",null,"Delete Restore Log",-1))])]),_:1}),u(F,null,{default:s(()=>[u(j,{type:"danger"},{default:s(()=>[...a[28]||(a[28]=[x(" This will permanently delete the restore log. This action cannot be undone. ",-1)])]),_:1})]),_:1}),u(U,null,{default:s(()=>[u(p,{secondary:"",onClick:a[4]||(a[4]=e=>z.value=!1)},{default:s(()=>[...a[29]||(a[29]=[x("Cancel",-1)])]),_:1}),u(p,{danger:"",onClick:D,loading:C.value},{default:s(()=>[u(t,{name:"delete_forever",left:""}),a[30]||(a[30]=x(" Delete Permanently ",-1))]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64)}}}),je=[],$e=[];function Ae(e,a){if(e&&"undefined"!=typeof document){var t,n=!0===a.prepend?"prepend":"append",l=!0===a.singleTag,o="string"==typeof a.container?document.querySelector(a.container):document.getElementsByTagName("head")[0];if(l){var r=je.indexOf(o);-1===r&&(r=je.push(o)-1,$e[r]={}),t=$e[r]&&$e[r][n]?$e[r][n]:$e[r][n]=s()}else t=s();65279===e.charCodeAt(0)&&(e=e.substring(1)),t.styleSheet?t.styleSheet.cssText+=e:t.appendChild(document.createTextNode(e))}function s(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),a.attributes)for(var t=Object.keys(a.attributes),l=0;l<t.length;l++)e.setAttribute(t[l],a.attributes[t[l]]);var r="prepend"===n?"afterbegin":"beforeend";return o.insertAdjacentElement(r,e),e}}Ae("\n.restore-logs-page[data-v-4d4855df] {\n\tpadding: 16px;\n\tmax-width: 1100px;\n}\n.section[data-v-4d4855df] {\n\tbackground: var(--theme--background);\n\tborder: 1px solid var(--theme--border-color);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 16px;\n}\n.section-header[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tmargin-bottom: 16px;\n}\n.section-title[data-v-4d4855df] {\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tmargin: 0;\n\tcolor: var(--theme--foreground);\n}\n.empty-state[data-v-4d4855df] {\n\ttext-align: center;\n\tpadding: 40px 20px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.empty-icon[data-v-4d4855df] {\n\tfont-size: 48px;\n\tmargin-bottom: 12px;\n\topacity: 0.5;\n}\n.empty-title[data-v-4d4855df] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tmargin: 0 0 4px 0;\n}\n.empty-subtitle[data-v-4d4855df] {\n\tfont-size: 14px;\n\tmargin: 0;\n\tcolor: var(--theme--foreground-subdued);\n}\n.table-wrapper[data-v-4d4855df] {\n\toverflow-x: auto;\n}\n.logs-table[data-v-4d4855df] {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n.logs-table thead[data-v-4d4855df] {\n\tbackground: var(--theme--background-subdued);\n\tborder-bottom: 2px solid var(--theme--border-color);\n}\n.logs-table th[data-v-4d4855df] {\n\tpadding: 12px 16px;\n\ttext-align: left;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\twhite-space: nowrap;\n}\n.logs-table tbody tr[data-v-4d4855df] {\n\tborder-bottom: 1px solid var(--theme--border-color);\n\ttransition: background 0.2s;\n}\n.logs-table tbody tr[data-v-4d4855df]:hover {\n\tbackground: var(--theme--background-subdued);\n}\n.logs-table td[data-v-4d4855df] {\n\tpadding: 12px 16px;\n\tvertical-align: middle;\n}\n.col-date[data-v-4d4855df],\n.col-backup[data-v-4d4855df],\n.col-status[data-v-4d4855df],\n.col-duration[data-v-4d4855df],\n.col-items[data-v-4d4855df],\n.col-errors[data-v-4d4855df],\n.col-actions[data-v-4d4855df] {\n\ttext-align: left;\n}\n.date-primary[data-v-4d4855df] {\n\tdisplay: block;\n\tfont-weight: 500;\n\tcolor: var(--theme--foreground);\n}\n.date-relative[data-v-4d4855df] {\n\tdisplay: block;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.backup-id[data-v-4d4855df] {\n\tfont-family: monospace;\n\tfont-size: 12px;\n\tbackground: var(--theme--background-subdued);\n\tpadding: 2px 6px;\n\tborder-radius: 3px;\n}\n.status-badge[data-v-4d4855df] {\n\tdisplay: inline-block;\n\tpadding: 4px 8px;\n\tborder-radius: 3px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n.status-success[data-v-4d4855df] {\n\tbackground: rgba(34, 197, 94, 0.1);\n\tcolor: rgb(34, 197, 94);\n}\n.status-partial[data-v-4d4855df] {\n\tbackground: rgba(251, 146, 60, 0.1);\n\tcolor: rgb(251, 146, 60);\n}\n.status-failed[data-v-4d4855df] {\n\tbackground: rgba(239, 68, 68, 0.1);\n\tcolor: rgb(239, 68, 68);\n}\n.no-errors[data-v-4d4855df] {\n\tcolor: var(--theme--foreground-subdued);\n}\n.error-count[data-v-4d4855df] {\n\tcolor: rgb(239, 68, 68);\n\tfont-weight: 600;\n}\n.col-actions[data-v-4d4855df] {\n\ttext-align: right;\n\twhite-space: nowrap;\n}\n.detail-modal[data-v-4d4855df] {\n\tmax-width: 600px;\n}\n.detail-header[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n.detail-section[data-v-4d4855df] {\n\tmargin-bottom: 24px;\n}\n.detail-section[data-v-4d4855df]:last-child {\n\tmargin-bottom: 0;\n}\n.detail-row[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmargin-bottom: 8px;\n\tpadding: 8px;\n\tbackground: var(--theme--background-subdued);\n\tborder-radius: 3px;\n}\n.detail-label[data-v-4d4855df] {\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\tmin-width: 120px;\n}\n.detail-value[data-v-4d4855df] {\n\tcolor: var(--theme--foreground);\n\tword-break: break-all;\n}\n.detail-value.mono[data-v-4d4855df] {\n\tfont-family: monospace;\n\tfont-size: 12px;\n}\n.section-subtitle[data-v-4d4855df] {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.5px;\n\tmargin: 0 0 12px 0;\n\tpadding-bottom: 8px;\n\tborder-bottom: 1px solid var(--theme--border-color);\n}\n.summary-grid[data-v-4d4855df] {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(150px, 1fr));\n\tgap: 12px;\n}\n.summary-item[data-v-4d4855df] {\n\tbackground: var(--theme--background-subdued);\n\tpadding: 12px;\n\tborder-radius: 3px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n.summary-label[data-v-4d4855df] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.summary-value[data-v-4d4855df] {\n\tfont-size: 18px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n}\n.summary-value.success[data-v-4d4855df] {\n\tcolor: rgb(34, 197, 94);\n}\n.summary-value.error[data-v-4d4855df] {\n\tcolor: rgb(239, 68, 68);\n}\n.errors-container[data-v-4d4855df] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmax-height: 400px;\n\toverflow-y: auto;\n}\n.error-detail[data-v-4d4855df] {\n\tdisplay: flex;\n\tgap: 12px;\n\tpadding: 8px 12px;\n\tbackground: rgba(239, 68, 68, 0.05);\n\tborder-left: 3px solid rgb(239, 68, 68);\n\tborder-radius: 3px;\n\tfont-size: 12px;\n}\n.error-collection[data-v-4d4855df] {\n\tcolor: rgb(239, 68, 68);\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n.error-message[data-v-4d4855df] {\n\tflex: 1;\n\tcolor: var(--theme--foreground);\n\tword-break: break-word;\n}\n.error-timestamp[data-v-4d4855df] {\n\tcolor: var(--theme--foreground-subdued);\n\twhite-space: nowrap;\n\tfont-size: 11px;\n}\n.confirm-dialog[data-v-4d4855df] {\n\tmax-width: 400px;\n}\n.dialog-title-row[data-v-4d4855df] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n}\n.dialog-title-icon-wrap[data-v-4d4855df] {\n\twidth: 40px;\n\theight: 40px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tborder-radius: 50%;\n\tbackground: rgba(239, 68, 68, 0.1);\n}\n.dialog-title-icon-wrap.danger-icon-wrap[data-v-4d4855df] {\n\tbackground: rgba(239, 68, 68, 0.1);\n\tcolor: rgb(239, 68, 68);\n}\n",{});var Pe=(e,a)=>{const t=e.__vccOpts||e;for(const[e,n]of a)t[e]=n;return t},Me=Pe(Le,[["__scopeId","data-v-4d4855df"]]);const Oe={key:0,class:"backup-module-content"},Ne={class:"section"},Ge={class:"section-header"},He={key:0,class:"skeleton-rows"},We={class:"empty-state"},qe={class:"table-wrapper"},Ke={class:"backup-table"},Ye={class:"col-date"},Je={class:"date-primary"},Qe={class:"date-relative"},Xe={class:"col-type"},Ze={class:"type-cell"},ea={key:0,class:"structure-badge"},aa={key:1,class:"media-badge"},ta={class:"col-collections"},na={key:0,class:"all-collections"},la={key:1,class:"collection-list"},oa={key:0,class:"more-collections"},ra={class:"col-size"},sa={class:"col-status"},ia={key:0,class:"status-badge status-restoring"},da={key:1,class:"status-badge status-valid"},ca={class:"col-actions"},ua={class:"action-buttons"},pa={key:3,class:"auto-refresh-notice"},va={class:"backup-module-content"},ma={class:"section"},ga={class:"schedule-card"},fa={key:0,class:"schedule-loading"},ba={class:"schedule-toggle-row"},ha={class:"cron-presets"},ya=["onClick","disabled"],xa={class:"cron-input-row"},ka={key:0,class:"last-run-row"},wa={key:0,class:"error-notice"},_a={class:"schedule-footer"},za={class:"dialog-section"},Ca={class:"radio-group"},Sa={class:"radio-content"},Ra={class:"radio-content"},Da={class:"radio-content"},Ba={key:0,class:"dialog-section collection-selector"},Va={key:0,class:"collections-loading"},Ea={key:1,class:"collections-empty"},Ta={key:2,class:"collection-list-scroll"},Fa=["value"],Ua={class:"collection-item-content"},Ia={class:"collection-name"},La={key:0,class:"collection-count"},ja=["onClick"],$a={key:3,class:"validation-msg"},Aa={key:0,class:"dialog-section collection-selector"},Pa={key:0,class:"collections-loading"},Ma={key:1,class:"collections-empty"},Oa={key:2,class:"collection-list-scroll"},Na=["value"],Ga={class:"collection-item-content"},Ha={class:"collection-name"},Wa={key:0,class:"collection-count"},qa={key:0,class:"dialog-section"},Ka={class:"toggle-row"},Ya={key:1,class:"dialog-section"},Ja={key:2,class:"running-state"},Qa={key:3,class:"error-notice"},Xa={class:"dialog-title-row"},Za={class:"dialog-title-icon-wrap restore-icon-wrap"},et={key:0,class:"confirm-details"},at={class:"detail-row"},tt={class:"detail-value"},nt={class:"detail-row"},lt={class:"detail-value"},ot={class:"detail-row"},rt={class:"detail-value"},st={class:"detail-row"},it={class:"detail-value"},dt={class:"detail-row"},ct={class:"detail-value"},ut={class:"toggle-row restore-option-row"},pt={key:1,class:"running-state restore-progress"},vt={class:"progress-info"},mt={class:"progress-header"},gt={class:"running-title"},ft={class:"progress-percentage"},bt={class:"progress-details"},ht={class:"phase-text"},yt={class:"elapsed-time"},xt={key:0,class:"errors-section"},kt={class:"errors-details"},wt={class:"errors-summary"},_t={class:"errors-list"},zt={key:0,class:"error-collection"},Ct={class:"error-message"},St={key:2,class:"error-notice"},Rt={class:"dialog-title-row"},Dt={class:"dialog-title-icon-wrap danger-icon-wrap"},Bt={key:0,class:"confirm-details"},Vt={class:"detail-row"},Et={class:"detail-value"},Tt={class:"detail-row"},Ft={class:"detail-value"},Ut={class:"detail-row"},It={class:"detail-value"},Lt={key:1,class:"error-notice"};var jt=n({__name:"module",props:{page:{}},setup(e){const n=e,V=B(),E=k(()=>n.page??""),T=[{route:"",label:"Backups",icon:"backup"},{route:"schedule",label:"Schedule",icon:"schedule"},{route:"restore-logs",label:"Restore Logs",icon:"history"}],F=k(()=>{switch(E.value){case"schedule":return"Schedule";case"restore-logs":return"Restore Logs";default:return"Backups"}}),U=k(()=>[{name:"Backup",to:"/acuity-backup"},{name:F.value}]);w(E,e=>{""===e?G():"schedule"===e?Le():"restore-logs"===e||V.replace("/acuity-backup")},{immediate:!1});const I=a(),{useNotificationsStore:L}=t(),$=L(),A=p([]),P=p(!1),M=p(null),O=k(()=>M.value?M.value.toLocaleTimeString():"Never");let N=null;async function G(){P.value=!0;try{const e=await I.get("/acuity-backup/list");A.value=e.data.data??[],M.value=new Date}catch(e){$t("Failed to load backup history. "+jt(e),"error")}finally{P.value=!1}}const H=p(!1),W=p("full"),q=p(!0),K=p([]),Y=p(!1),J=p(""),Q=p([]),X=p([]),Z=p(!1);function ee(){J.value="",W.value="full",K.value=[],q.value=!0,Q.value=[],H.value=!0,async function(){if(X.value.length>0)return;Z.value=!0;try{const e=await I.get("/acuity-backup/collections");X.value=e.data.data??[]}catch(e){$t("Failed to load collections. "+jt(e),"error")}finally{Z.value=!1}}()}function ae(){Y.value||(H.value=!1)}function te(){Q.value=X.value.map(e=>e.collection)}function ne(){Q.value=[]}function le(e){if(e.structureOnly)return"Structure only";const a=e.structureOnlyCollections?.length??0;return a>0?`Data excluded: ${a}`:""}function oe(e){return K.value.includes(e)}async function re(){if("selective"===W.value&&0===Q.value.length)return;Y.value=!0,J.value="";const e=W.value,a=K.value.filter(e=>Q.value.includes(e));try{await I.post("/acuity-backup/run",{type:"selective"===e?"selective":"full",collections:"selective"===e?Q.value:void 0,structureOnly:"structure"===e,structureOnlyCollections:"structure"===e?[]:"selective"===e?a:K.value,includeMedia:"structure"!==e&&q.value}),$t("Backup completed successfully.","success"),H.value=!1,await G()}catch(e){J.value="Backup failed: "+jt(e)}finally{Y.value=!1}}w(W,()=>{K.value=[]});const se=p(null),ie=p(!1);function de(){se.value?.click()}async function ce(e){const a=e.target,t=a.files?.[0];if(a.value="",t)if(t.name.endsWith(".zip")){ie.value=!0;try{const e=new FormData;e.append("title","Backup Upload (temporary)"),e.append("file",t);const a=(await I.post("/files",e)).data.data.id;try{await I.post("/acuity-backup/upload",{fileId:a})}catch(e){try{await I.delete(`/files/${a}`)}catch{}throw e}$t("Backup uploaded successfully.","success"),await G()}catch(e){$t("Upload failed: "+jt(e),"error")}finally{ie.value=!1}}else $t("Please select a .zip backup file.","warning")}const ue=p(!1),pe=p(null),ve=p(null),me=p(!1),ge=p(""),fe=p(null),be=p({phase:"",progressPercentage:0,elapsedSeconds:0,errors:[]}),he=p(!1);let ye=null;function xe(){null===ve.value&&(ue.value=!1)}function ke(){ue.value=!1,ve.value=null,fe.value=null,he.value=!1,G()}async function we(){if(pe.value){ve.value=pe.value.id,ge.value="",be.value={phase:"",progressPercentage:0,elapsedSeconds:0,errors:[]};try{const e=(await I.post("/acuity-backup/restore",{backupId:pe.value.id,truncateCollections:me.value})).data.data.sessionId;fe.value=e;let a="";ye=window.setInterval(async()=>{try{const t=(await I.get(`/acuity-backup/status/${e}`)).data.data;be.value={phase:t.phase||"",progressPercentage:t.progressPercentage||0,elapsedSeconds:t.elapsedSeconds||0,errors:t.errors||[]},"running"!==t.status&&(ye&&(clearInterval(ye),ye=null),he.value=!0,"completed"===t.status?$t("Restore completed successfully.","success"):ge.value="Restore failed. Check errors above for details."),a=t.status}catch(e){"running"!==a&&ye&&(clearInterval(ye),ye=null)}},250)}catch(e){ge.value="Failed to initiate restore: "+jt(e),ve.value=null,fe.value=null}}}const _e=p(!1),ze=p(null),Ce=p(null),Se=p("");async function Re(){if(ze.value){Ce.value=ze.value.id,Se.value="";try{await I.delete(`/acuity-backup/${ze.value.id}`),$t("Backup deleted.","success"),_e.value=!1,A.value=A.value.filter(e=>e.id!==ze.value.id)}catch(e){Se.value="Delete failed: "+jt(e)}finally{Ce.value=null}}}const De=[{label:"Daily",value:"0 0 * * *"},{label:"Weekly",value:"0 0 * * 0"},{label:"Monthly",value:"0 0 1 * *"},{label:"Disabled",value:""}],Be=p(!1),Ve=p("0 0 * * *"),Ee=p(void 0),Te=p(!1),Fe=p(!1),Ue=p("");let Ie=!1;async function Le(){if(!Ie){Te.value=!0;try{const e=(await I.get("/acuity-backup/schedule")).data.data;Be.value=e.enabled,Ve.value=e.cronExpression,Ee.value=e.lastRun,Ie=!0}catch(e){$t("Failed to load schedule configuration. "+jt(e),"error")}finally{Te.value=!1}}}async function je(){if(Ue.value="",Be.value){const e=Ve.value.trim();if(!e)return void(Ue.value="A cron expression is required when automatic backups are enabled.");if(5!==e.split(/\s+/).length)return void(Ue.value="The cron expression must have exactly 5 fields (minute hour day-of-month month day-of-week).")}Fe.value=!0;try{await I.post("/acuity-backup/schedule",{enabled:Be.value,cronExpression:Ve.value.trim()||"0 0 * * *"}),$t("Schedule saved successfully.","success")}catch(e){Ue.value="Failed to save schedule: "+jt(e)}finally{Fe.value=!1}}function $e(e){try{return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(new Date(e))}catch{return e}}function Ae(e){try{const a=Date.now()-new Date(e).getTime(),t=Math.floor(a/1e3);return t<60?"just now":t<3600?`${Math.floor(t/60)}m ago`:t<86400?`${Math.floor(t/3600)}h ago`:t<604800?`${Math.floor(t/86400)}d ago`:`${Math.floor(t/604800)}w ago`}catch{return""}}function Pe(e){if(!e||0===e)return"—";const a=["B","KB","MB","GB"];let t=e,n=0;for(;t>=1024&&n<a.length-1;)t/=1024,n++;return`${t.toFixed(t<10?1:0)} ${a[n]}`}function jt(e){if(e&&"object"==typeof e){const a=e,t=a.response?.data?.errors?.[0]?.message;if(t)return t;if(a.message)return a.message}return String(e)}function $t(e,a="success"){$.add({title:"success"===a?"Success":"error"===a?"Error":"Warning",text:e,type:a,persist:"error"===a})}return v(()=>{"schedule"===E.value?Le():(G(),N=setInterval(G,3e4))}),_(()=>{null!==ye&&(clearInterval(ye),ye=null)}),z(()=>{null!==N&&(clearInterval(N),N=null)}),(e,a)=>{const t=l("v-breadcrumb"),n=l("v-icon"),p=l("v-button"),v=l("v-progress-circular"),k=l("v-checkbox"),w=l("v-input"),_=l("v-notice"),z=l("v-card-title"),B=l("v-card-text"),V=l("v-card-actions"),L=l("v-card"),$=l("v-dialog"),M=l("v-progress-linear"),N=l("private-view"),fe=m("tooltip");return r(),o(N,{title:F.value},{headline:s(()=>[u(t,{items:U.value},null,8,["items"])]),"title-outer:prepend":s(()=>[u(p,{class:"header-icon",rounded:"",icon:"",secondary:"",disabled:""},{default:s(()=>[u(n,{name:"cloud_download"})]),_:1})]),actions:s(()=>[""===E.value?(r(),o(p,{key:0,secondary:"",onClick:de,loading:ie.value},{default:s(()=>[u(n,{name:"upload_file",left:""}),a[14]||(a[14]=x(" Upload Backup ",-1))]),_:1},8,["loading"])):f("v-if",!0),""===E.value?(r(),o(p,{key:1,onClick:ee,loading:Y.value},{default:s(()=>[u(n,{name:"add",left:""}),a[15]||(a[15]=x(" Run Backup ",-1))]),_:1},8,["loading"])):f("v-if",!0)]),navigation:s(()=>[u(j,{current:E.value,pages:T},null,8,["current"])]),default:s(()=>[""===E.value?(r(),i("div",Oe,[f(" Backup history table "),g("div",Ne,[g("div",Ge,[a[16]||(a[16]=g("h2",{class:"section-title"},"Backup History",-1)),b((r(),o(p,{small:"",secondary:"",icon:"",loading:P.value,onClick:G},{default:s(()=>[u(n,{name:"refresh"})]),_:1},8,["loading"])),[[fe,"Refresh list"]])]),f(" Loading skeleton "),P.value&&0===A.value.length?(r(),i("div",He,[(r(),i(d,null,c(3,e=>g("div",{key:e,class:"skeleton-row"},[...a[17]||(a[17]=[g("div",{class:"skeleton-cell skeleton-date"},null,-1),g("div",{class:"skeleton-cell skeleton-type"},null,-1),g("div",{class:"skeleton-cell skeleton-collections"},null,-1),g("div",{class:"skeleton-cell skeleton-size"},null,-1),g("div",{class:"skeleton-cell skeleton-status"},null,-1),g("div",{class:"skeleton-cell skeleton-actions"},null,-1)])])),64))])):P.value||0!==A.value.length?(r(),i(d,{key:2},[f(" Table "),g("div",qe,[g("table",Ke,[a[23]||(a[23]=g("thead",null,[g("tr",null,[g("th",{class:"col-date"},"Date"),g("th",{class:"col-type"},"Type"),g("th",{class:"col-collections"},"Collections"),g("th",{class:"col-size"},"Size"),g("th",{class:"col-status"},"Status"),g("th",{class:"col-actions"},"Actions")])],-1)),g("tbody",null,[(r(!0),i(d,null,c(A.value,e=>(r(),i("tr",{key:e.id,class:"backup-row"},[f(" Date "),g("td",Ye,[g("span",Je,h($e(e.timestamp)),1),g("span",Qe,h(Ae(e.timestamp)),1)]),f(" Type badge "),g("td",Xe,[g("div",Ze,[g("span",{class:y(["type-badge","full"===e.type?"type-full":"type-selective"])},h("full"===e.type?"Full":"Selective"),3),le(e)?b((r(),i("span",ea,[x(h(le(e)),1)])),[[fe,"Row-data scope of this backup"]]):f("v-if",!0),e.includeMedia?b((r(),i("span",aa,[u(n,{name:"image",small:""})])),[[fe,"Includes media files"]]):f("v-if",!0)])]),f(" Collections "),g("td",ta,["full"===e.type?(r(),i("span",na,"All collections")):(r(),i("span",la,[x(h(e.collections.slice(0,3).join(", "))+" ",1),e.collections.length>3?(r(),i("span",oa," +"+h(e.collections.length-3)+" more ",1)):f("v-if",!0)]))]),f(" Size "),g("td",ra,h(Pe(e.fileSize)),1),f(" Status "),g("td",sa,[ve.value===e.id?(r(),i("span",ia,[u(v,{"x-small":"",indeterminate:"",class:"status-spinner"}),a[21]||(a[21]=x(" Restoring… ",-1))])):(r(),i("span",da,[u(n,{name:"check_circle","x-small":"",class:"status-icon"}),a[22]||(a[22]=x(" Ready ",-1))]))]),f(" Actions "),g("td",ca,[g("div",ua,[f(" Download "),b((r(),o(p,{"x-small":"",secondary:"",icon:"",onClick:C(a=>async function(e){try{const a=await I.get(`/acuity-backup/download/${e.id}`,{responseType:"blob"}),t=new Blob([a.data],{type:"application/zip"}),n=URL.createObjectURL(t),l=document.createElement("a");l.href=n,l.download=e.filename,l.click(),URL.revokeObjectURL(n)}catch{const a=document.createElement("a");a.href=function(e){return`/acuity-backup/download/${e.id}`}(e),a.download=e.filename,a.click()}}(e),["prevent"])},{default:s(()=>[u(n,{name:"download"})]),_:1},8,["onClick"])),[[fe,"Download backup archive"]]),f(" Restore — uses warning styling to signal impact "),b((r(),o(p,{"x-small":"",icon:"",class:"btn-restore",loading:ve.value===e.id,disabled:null!==ve.value&&ve.value!==e.id,onClick:a=>function(e){pe.value=e,me.value=!1,ge.value="",he.value=!1,ue.value=!0}(e)},{default:s(()=>[u(n,{name:"settings_backup_restore"})]),_:1},8,["loading","disabled","onClick"])),[[fe,"Restore data from this backup"]]),f(" Delete "),b((r(),o(p,{"x-small":"",secondary:"",icon:"",class:"btn-danger",loading:Ce.value===e.id,disabled:null!==Ce.value&&Ce.value!==e.id,onClick:a=>function(e){ze.value=e,Se.value="",_e.value=!0}(e)},{default:s(()=>[u(n,{name:"delete_outline"})]),_:1},8,["loading","disabled","onClick"])),[[fe,"Permanently delete this backup"]])])])]))),128))])])])],2112)):(r(),i(d,{key:1},[f(" Empty state "),g("div",We,[u(n,{name:"cloud_off",class:"empty-icon"}),a[19]||(a[19]=g("p",{class:"empty-title"},"No backups yet",-1)),a[20]||(a[20]=g("p",{class:"empty-subtitle"},'Create your first backup by clicking "Run Backup" above.',-1)),u(p,{class:"empty-cta",onClick:ee},{default:s(()=>[u(n,{name:"add",left:""}),a[18]||(a[18]=x(" Run Backup ",-1))]),_:1})])],2112)),A.value.length>0?(r(),i("p",pa,[u(n,{name:"autorenew","x-small":"",class:"refresh-icon"}),x(" Auto-refreshes every 30 s — last updated: "+h(O.value),1)])):f("v-if",!0)])])):"schedule"===E.value?(r(),i(d,{key:1},[f(' ================================================================\n\t\t PAGE: SCHEDULE (route "schedule")\n\t\t ================================================================ '),g("div",va,[g("div",ma,[a[30]||(a[30]=g("div",{class:"section-header"},[g("h2",{class:"section-title"},"Automatic Backups")],-1)),g("div",ga,[Te.value?(r(),i("div",fa,[u(v,{indeterminate:""}),a[24]||(a[24]=g("span",null,"Loading schedule…",-1))])):(r(),i(d,{key:1},[g("div",ba,[a[25]||(a[25]=g("div",{class:"toggle-info"},[g("label",{class:"toggle-label",for:"schedule-enabled"},"Enable Automatic Backups"),g("span",{class:"toggle-desc"},"Runs a full backup on the schedule defined below")],-1)),u(k,{id:"schedule-enabled",modelValue:Be.value,"onUpdate:modelValue":a[0]||(a[0]=e=>Be.value=e)},null,8,["modelValue"])]),g("div",{class:y(["schedule-body",!Be.value&&"schedule-body--disabled"])},[g("div",ha,[a[26]||(a[26]=g("span",{class:"preset-label"},"Presets:",-1)),(r(),i(d,null,c(De,e=>g("button",{key:e.label,class:y(["preset-btn",Ve.value===e.value&&"preset-btn--active"]),onClick:a=>function(e){"Disabled"===e.label?Be.value=!1:(Ve.value=e.value,Be.value=!0)}(e),disabled:!Be.value},h(e.label),11,ya)),64))]),g("div",xa,[a[27]||(a[27]=g("label",{class:"field-label",for:"cron-expression"},"Cron Expression",-1)),u(w,{id:"cron-expression",modelValue:Ve.value,"onUpdate:modelValue":a[1]||(a[1]=e=>Ve.value=e),placeholder:"0 0 * * *",disabled:!Be.value,"font-mono":"",class:"cron-input"},null,8,["modelValue","disabled"]),a[28]||(a[28]=g("p",{class:"field-hint"},[x(" Five fields: minute hour day-of-month month day-of-week. "),g("a",{href:"https://crontab.guru/",target:"_blank",rel:"noopener noreferrer"},"crontab.guru")],-1))]),Ee.value?(r(),i("div",ka,[u(n,{name:"history",small:""}),g("span",null,"Last run: "+h($e(Ee.value))+" ("+h(Ae(Ee.value))+")",1)])):f("v-if",!0)],2),Ue.value?(r(),i("div",wa,[u(_,{type:"danger"},{default:s(()=>[x(h(Ue.value),1)]),_:1})])):f("v-if",!0),g("div",_a,[u(p,{onClick:je,loading:Fe.value},{default:s(()=>[u(n,{name:"save",left:""}),a[29]||(a[29]=x(" Save Schedule ",-1))]),_:1},8,["loading"])])],64))])])])],2112)):"restore-logs"===E.value?(r(),i(d,{key:2},[f(' ================================================================\n\t\t PAGE: RESTORE LOGS (route "restore-logs")\n\t\t ================================================================ '),u(Me)],2112)):f("v-if",!0),u($,{modelValue:H.value,"onUpdate:modelValue":a[8]||(a[8]=e=>H.value=e),onEsc:ae},{default:s(()=>[u(L,{class:"backup-dialog"},{default:s(()=>[u(z,null,{default:s(()=>[u(n,{name:"add_circle",class:"dialog-title-icon"}),a[31]||(a[31]=x(" New Backup ",-1))]),_:1}),u(B,null,{default:s(()=>[f(" Backup type selection "),g("div",za,[a[35]||(a[35]=g("label",{class:"field-label"},"Backup Type",-1)),g("div",Ca,[g("label",{class:y(["radio-option",{"radio-option--active":"full"===W.value}])},[b(g("input",{type:"radio","onUpdate:modelValue":a[2]||(a[2]=e=>W.value=e),value:"full"},null,512),[[S,W.value]]),g("div",Sa,[u(n,{name:"cloud_download"}),a[32]||(a[32]=g("div",null,[g("span",{class:"radio-title"},"Full Backup"),g("span",{class:"radio-desc"},"Back up all collections and optionally all media files")],-1))])],2),g("label",{class:y(["radio-option",{"radio-option--active":"structure"===W.value}])},[b(g("input",{type:"radio","onUpdate:modelValue":a[3]||(a[3]=e=>W.value=e),value:"structure"},null,512),[[S,W.value]]),g("div",Ra,[u(n,{name:"schema"}),a[33]||(a[33]=g("div",null,[g("span",{class:"radio-title"},"Full Structure Only"),g("span",{class:"radio-desc"},"All collections' structure with no row data and no media")],-1))])],2),g("label",{class:y(["radio-option",{"radio-option--active":"selective"===W.value}])},[b(g("input",{type:"radio","onUpdate:modelValue":a[4]||(a[4]=e=>W.value=e),value:"selective"},null,512),[[S,W.value]]),g("div",Da,[u(n,{name:"checklist"}),a[34]||(a[34]=g("div",null,[g("span",{class:"radio-title"},"Selected Collections"),g("span",{class:"radio-desc"},"Choose specific collections to include in this backup")],-1))])],2)])]),f(" Collection selector (visible only for selective backup) "),u(R,{name:"slide-down"},{default:s(()=>["selective"===W.value?(r(),i("div",Ba,[g("div",{class:"collection-selector-header"},[a[37]||(a[37]=g("label",{class:"field-label"},"Collections",-1)),g("div",{class:"selector-actions"},[g("button",{class:"text-btn",onClick:te},"Select all"),a[36]||(a[36]=g("span",{class:"separator"},"·",-1)),g("button",{class:"text-btn",onClick:ne},"Clear")])]),Z.value?(r(),i("div",Va,[u(v,{indeterminate:"",small:""}),a[38]||(a[38]=g("span",null,"Loading collections…",-1))])):0===X.value.length?(r(),i("div",Ea," No user collections found. ")):(r(),i("div",Ta,[(r(!0),i(d,null,c(X.value,e=>(r(),i("label",{key:e.collection,class:y(["collection-item",{"collection-item--selected":Q.value.includes(e.collection)}])},[b(g("input",{type:"checkbox",value:e.collection,"onUpdate:modelValue":a[5]||(a[5]=e=>Q.value=e)},null,8,Fa),[[D,Q.value]]),g("div",Ua,[u(n,{name:e.icon||"table_chart",small:"",class:"collection-icon"},null,8,["name"]),g("span",Ia,h(e.collection),1),void 0!==e.itemCount?(r(),i("span",La,h(e.itemCount.toLocaleString())+" items ",1)):f("v-if",!0)]),Q.value.includes(e.collection)?b((r(),i("button",{key:0,type:"button",class:y(["structure-toggle",{"structure-toggle--on":oe(e.collection)}]),onClick:C(a=>function(e){const a=K.value.indexOf(e);-1===a?K.value.push(e):K.value.splice(a,1)}(e.collection),["stop","prevent"])},[u(n,{name:oe(e.collection)?"check_box":"check_box_outline_blank","x-small":""},null,8,["name"]),a[39]||(a[39]=x(" Structure only ",-1))],10,ja)),[[fe,"Back up this collection's structure only (no row data)"]]):f("v-if",!0)],2))),128))])),"selective"===W.value&&0===Q.value.length?(r(),i("p",$a," Please select at least one collection. ")):f("v-if",!0)])):f("v-if",!0)]),_:1}),f(" Exclude-data selector (visible only for full backup) "),u(R,{name:"slide-down"},{default:s(()=>["full"===W.value?(r(),i("div",Aa,[a[41]||(a[41]=g("label",{class:"field-label"},"Exclude row data from these collections (structure kept)",-1)),Z.value?(r(),i("div",Pa,[u(v,{indeterminate:"",small:""}),a[40]||(a[40]=g("span",null,"Loading collections…",-1))])):0===X.value.length?(r(),i("div",Ma," No user collections found. ")):(r(),i("div",Oa,[(r(!0),i(d,null,c(X.value,e=>(r(),i("label",{key:"excl-"+e.collection,class:y(["collection-item",{"collection-item--selected":K.value.includes(e.collection)}])},[b(g("input",{type:"checkbox",value:e.collection,"onUpdate:modelValue":a[6]||(a[6]=e=>K.value=e)},null,8,Na),[[D,K.value]]),g("div",Ga,[u(n,{name:e.icon||"table_chart",small:"",class:"collection-icon"},null,8,["name"]),g("span",Ha,h(e.collection),1),void 0!==e.itemCount?(r(),i("span",Wa,h(e.itemCount.toLocaleString())+" items ",1)):f("v-if",!0)])],2))),128))])),a[42]||(a[42]=g("p",{class:"field-hint"},"Leave empty to back up everything with data.",-1))])):f("v-if",!0)]),_:1}),f(" Include media toggle (hidden for structure-only backups) "),"structure"!==W.value?(r(),i("div",qa,[g("div",Ka,[a[43]||(a[43]=g("div",{class:"toggle-info"},[g("span",{class:"toggle-title"},"Include Media Files"),g("span",{class:"toggle-desc"},"Store metadata for all files in the media library")],-1)),u(k,{modelValue:q.value,"onUpdate:modelValue":a[7]||(a[7]=e=>q.value=e)},null,8,["modelValue"])])])):(r(),i("div",Ya,[u(_,{type:"info"},{default:s(()=>[...a[44]||(a[44]=[x("Structure-only backups never include row data or media files.",-1)])]),_:1})])),f(" Running state "),Y.value?(r(),i("div",Ja,[u(v,{indeterminate:""}),a[45]||(a[45]=g("div",{class:"running-text"},[g("span",{class:"running-title"},"Backup in progress…"),g("span",{class:"running-desc"},"This may take a few moments. Please do not close this window.")],-1))])):f("v-if",!0),f(" Error from last attempt "),J.value?(r(),i("div",Qa,[u(_,{type:"danger"},{default:s(()=>[x(h(J.value),1)]),_:1})])):f("v-if",!0)]),_:1}),u(V,null,{default:s(()=>[u(p,{secondary:"",onClick:ae,disabled:Y.value},{default:s(()=>[...a[46]||(a[46]=[x(" Cancel ",-1)])]),_:1},8,["disabled"]),u(p,{onClick:re,loading:Y.value,disabled:"selective"===W.value&&0===Q.value.length},{default:s(()=>[u(n,{name:"play_arrow",left:""}),a[47]||(a[47]=x(" Start Backup ",-1))]),_:1},8,["loading","disabled"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),u($,{modelValue:ue.value,"onUpdate:modelValue":a[10]||(a[10]=e=>ue.value=e),onEsc:xe},{default:s(()=>[u(L,{class:"confirm-dialog restore-dialog"},{default:s(()=>[u(z,{class:"restore-dialog-title"},{default:s(()=>[g("div",Xa,[g("div",Za,[u(n,{name:"settings_backup_restore"})]),a[48]||(a[48]=g("span",null,"Restore Backup",-1))])]),_:1}),u(B,null,{default:s(()=>[f(" Prominent warning "),u(_,{type:"warning",class:"restore-warning-notice"},{default:s(()=>[...a[49]||(a[49]=[g("strong",null,"Data will be overwritten.",-1),x(" Restoring replaces existing records in the selected collections with the backup data. This action cannot be undone — consider creating a new backup first. ",-1)])]),_:1}),f(" Backup details summary "),pe.value?(r(),i("div",et,[g("div",at,[a[50]||(a[50]=g("span",{class:"detail-label"},"Backup date",-1)),g("span",tt,h($e(pe.value.timestamp)),1)]),g("div",nt,[a[51]||(a[51]=g("span",{class:"detail-label"},"Age",-1)),g("span",lt,h(Ae(pe.value.timestamp)),1)]),g("div",ot,[a[52]||(a[52]=g("span",{class:"detail-label"},"Type",-1)),g("span",rt,h("full"===pe.value.type?"Full Backup":"Selective Backup"),1)]),g("div",st,[a[53]||(a[53]=g("span",{class:"detail-label"},"Collections",-1)),g("span",it,h("full"===pe.value.type?"All collections":pe.value.collections.join(", ")),1)]),g("div",dt,[a[54]||(a[54]=g("span",{class:"detail-label"},"File size",-1)),g("span",ct,h(Pe(pe.value.fileSize)),1)])])):f("v-if",!0),f(" Truncate toggle "),g("div",ut,[a[55]||(a[55]=g("div",{class:"toggle-info"},[g("span",{class:"toggle-title"},"Truncate before restore"),g("span",{class:"toggle-desc"},"Delete all existing records before importing — ensures a clean, exact restore")],-1)),u(k,{modelValue:me.value,"onUpdate:modelValue":a[9]||(a[9]=e=>me.value=e)},null,8,["modelValue"])]),f(" Restore progress "),null!==ve.value?(r(),i("div",pt,[g("div",vt,[g("div",mt,[g("span",gt,h(he.value?"Restore completed":"Restoring backup…"),1),g("span",ft,h(be.value.progressPercentage)+"%",1)]),u(M,{value:be.value.progressPercentage,class:"progress-bar"},null,8,["value"]),g("div",bt,[g("span",ht,h(be.value.phase),1),g("span",yt,h(be.value.elapsedSeconds)+"s",1)])]),be.value.errors.length>0?(r(),i("div",xt,[g("details",kt,[g("summary",wt,h(be.value.errors.length)+" error(s) occurred",1),g("div",_t,[(r(!0),i(d,null,c(be.value.errors,(e,a)=>(r(),i("div",{key:a,class:"error-item"},[e.collection?(r(),i("span",zt,h(e.collection)+": ",1)):f("v-if",!0),g("span",Ct,h(e.message),1)]))),128))])])])):f("v-if",!0)])):f("v-if",!0),f(" Error "),ge.value?(r(),i("div",St,[u(_,{type:"danger"},{default:s(()=>[x(h(ge.value),1)]),_:1})])):f("v-if",!0)]),_:1}),u(V,null,{default:s(()=>[he.value?f("v-if",!0):(r(),o(p,{key:0,secondary:"",onClick:xe,disabled:null!==ve.value},{default:s(()=>[...a[56]||(a[56]=[x(" Cancel ",-1)])]),_:1},8,["disabled"])),he.value?(r(),o(p,{key:1,onClick:ke},{default:s(()=>[u(n,{name:"close",left:""}),a[57]||(a[57]=x(" Close ",-1))]),_:1})):(r(),o(p,{key:2,class:"btn-restore-confirm",onClick:we,loading:null!==ve.value&&!he.value},{default:s(()=>[u(n,{name:"settings_backup_restore",left:""}),a[58]||(a[58]=x(" Restore Now ",-1))]),_:1},8,["loading"]))]),_:1})]),_:1})]),_:1},8,["modelValue"]),u($,{modelValue:_e.value,"onUpdate:modelValue":a[12]||(a[12]=e=>_e.value=e),onEsc:a[13]||(a[13]=e=>_e.value=!1)},{default:s(()=>[u(L,{class:"confirm-dialog"},{default:s(()=>[u(z,null,{default:s(()=>[g("div",Rt,[g("div",Dt,[u(n,{name:"delete_forever"})]),a[59]||(a[59]=g("span",null,"Delete Backup",-1))])]),_:1}),u(B,null,{default:s(()=>[u(_,{type:"danger"},{default:s(()=>[...a[60]||(a[60]=[x(" This will permanently delete the backup archive from disk. This action cannot be undone. ",-1)])]),_:1}),ze.value?(r(),i("div",Bt,[g("div",Vt,[a[61]||(a[61]=g("span",{class:"detail-label"},"Backup date",-1)),g("span",Et,h($e(ze.value.timestamp)),1)]),g("div",Tt,[a[62]||(a[62]=g("span",{class:"detail-label"},"Type",-1)),g("span",Ft,h("full"===ze.value.type?"Full Backup":"Selective Backup"),1)]),g("div",Ut,[a[63]||(a[63]=g("span",{class:"detail-label"},"File size",-1)),g("span",It,h(Pe(ze.value.fileSize)),1)])])):f("v-if",!0),Se.value?(r(),i("div",Lt,[u(_,{type:"danger"},{default:s(()=>[x(h(Se.value),1)]),_:1})])):f("v-if",!0)]),_:1}),u(V,null,{default:s(()=>[u(p,{secondary:"",onClick:a[11]||(a[11]=e=>_e.value=!1),disabled:null!==Ce.value},{default:s(()=>[...a[64]||(a[64]=[x(" Cancel ",-1)])]),_:1},8,["disabled"]),u(p,{danger:"",onClick:Re,loading:null!==Ce.value},{default:s(()=>[u(n,{name:"delete_forever",left:""}),a[65]||(a[65]=x(" Delete Permanently ",-1))]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),g("input",{ref_key:"fileInputRef",ref:se,type:"file",accept:".zip",style:{display:"none"},onChange:ce},null,544)]),_:1},8,["title"])}}});Ae('\n/* ============================================================\n Layout\n ============================================================ */\n.backup-module-content[data-v-a4ea46ea] {\n\tpadding: var(--content-padding);\n\tpadding-bottom: var(--content-padding-bottom);\n\tmax-width: 1100px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 40px;\n}\n.header-icon[data-v-a4ea46ea] {\n\t--v-button-background-color: var(--theme--primary-background);\n\t--v-button-color: var(--theme--primary);\n}\n\n/* ============================================================\n Sections\n ============================================================ */\n.section[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n.section-header[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 12px;\n}\n.section-title[data-v-a4ea46ea] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n\tmargin: 0;\n}\n\n/* ============================================================\n Skeleton loader\n ============================================================ */\n.skeleton-rows[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n\tborder-radius: var(--theme--border-radius);\n\toverflow: hidden;\n\tborder: 1px solid var(--theme--border-color-subdued);\n}\n.skeleton-row[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 16px;\n\tpadding: 14px 16px;\n\tbackground: var(--theme--background);\n}\n.skeleton-cell[data-v-a4ea46ea] {\n\theight: 14px;\n\tborder-radius: 4px;\n\tbackground: var(--theme--background-subdued);\n\tanimation: shimmer-a4ea46ea 1.5s ease-in-out infinite;\n}\n.skeleton-date[data-v-a4ea46ea] { width: 140px;\n}\n.skeleton-type[data-v-a4ea46ea] { width: 70px;\n}\n.skeleton-collections[data-v-a4ea46ea] { width: 200px; flex: 1;\n}\n.skeleton-size[data-v-a4ea46ea] { width: 60px;\n}\n.skeleton-status[data-v-a4ea46ea] { width: 80px;\n}\n.skeleton-actions[data-v-a4ea46ea] { width: 110px;\n}\n@keyframes shimmer-a4ea46ea {\n0%, 100% { opacity: 1;\n}\n50% { opacity: 0.4;\n}\n}\n\n/* ============================================================\n Empty state\n ============================================================ */\n.empty-state[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: 60px 24px;\n\tborder: 2px dashed var(--theme--border-color);\n\tborder-radius: var(--theme--border-radius);\n\ttext-align: center;\n\tgap: 8px;\n}\n.empty-icon[data-v-a4ea46ea] {\n\t--v-icon-size: 48px;\n\t--v-icon-color: var(--theme--foreground-subdued);\n\tmargin-bottom: 8px;\n}\n.empty-title[data-v-a4ea46ea] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n\tmargin: 0;\n}\n.empty-subtitle[data-v-a4ea46ea] {\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin: 0 0 8px;\n}\n.empty-cta[data-v-a4ea46ea] {\n\tmargin-top: 8px;\n}\n\n/* ============================================================\n Backup table\n ============================================================ */\n.table-wrapper[data-v-a4ea46ea] {\n\toverflow-x: auto;\n\tborder: 1px solid var(--theme--border-color-subdued);\n\tborder-radius: var(--theme--border-radius);\n}\n.backup-table[data-v-a4ea46ea] {\n\twidth: 100%;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n.backup-table thead[data-v-a4ea46ea] {\n\tbackground: var(--theme--background-subdued);\n}\n.backup-table th[data-v-a4ea46ea] {\n\tpadding: 10px 16px;\n\ttext-align: left;\n\tfont-weight: 600;\n\tfont-size: 12px;\n\ttext-transform: uppercase;\n\tletter-spacing: 0.05em;\n\tcolor: var(--theme--foreground-subdued);\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n\twhite-space: nowrap;\n}\n.backup-table td[data-v-a4ea46ea] {\n\tpadding: 12px 16px;\n\tvertical-align: middle;\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n\tcolor: var(--theme--foreground);\n}\n.backup-row:last-child td[data-v-a4ea46ea] {\n\tborder-bottom: none;\n}\n.backup-row:hover td[data-v-a4ea46ea] {\n\tbackground: var(--theme--background-subdued);\n}\n\n/* Column widths */\n.col-date[data-v-a4ea46ea] { min-width: 160px;\n}\n.col-type[data-v-a4ea46ea] { min-width: 120px;\n}\n.col-collections[data-v-a4ea46ea] { min-width: 180px;\n}\n.col-size[data-v-a4ea46ea] { min-width: 80px; white-space: nowrap;\n}\n.col-status[data-v-a4ea46ea] { min-width: 100px;\n}\n.col-actions[data-v-a4ea46ea] { min-width: 130px; text-align: right;\n}\n.date-primary[data-v-a4ea46ea] {\n\tdisplay: block;\n\tfont-weight: 500;\n}\n.date-relative[data-v-a4ea46ea] {\n\tdisplay: block;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin-top: 2px;\n}\n\n/* Type badges */\n.type-cell[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n}\n.type-badge[data-v-a4ea46ea] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tpadding: 2px 8px;\n\tborder-radius: 100px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n}\n.type-full[data-v-a4ea46ea] {\n\tbackground: var(--theme--primary-background);\n\tcolor: var(--theme--primary);\n}\n.type-selective[data-v-a4ea46ea] {\n\tbackground: var(--theme--secondary-background, #f0f4ff);\n\tcolor: var(--theme--secondary, #6644dd);\n}\n.media-badge[data-v-a4ea46ea] {\n\t--v-icon-color: var(--theme--foreground-subdued);\n\tdisplay: inline-flex;\n\talign-items: center;\n}\n\n/* Status badges */\n.status-badge[data-v-a4ea46ea] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 5px;\n\tpadding: 3px 8px;\n\tborder-radius: 100px;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n.status-valid[data-v-a4ea46ea] {\n\tbackground: color-mix(in srgb, var(--theme--success) 12%, transparent);\n\tcolor: var(--theme--success);\n}\n.status-restoring[data-v-a4ea46ea] {\n\tbackground: color-mix(in srgb, var(--theme--warning) 12%, transparent);\n\tcolor: var(--theme--warning);\n}\n.status-icon[data-v-a4ea46ea] {\n\t--v-icon-size: 14px;\n\t--v-icon-color: currentColor;\n}\n.status-spinner[data-v-a4ea46ea] {\n\t--v-progress-circular-size: 14px;\n}\n\n/* ============================================================\n Action buttons\n ============================================================ */\n.action-buttons[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\tgap: 6px;\n}\n\n/*\n * Restore button — amber/warning palette so it stands out from the\n * neutral Download button and the red Delete button.\n * Uses Directus warning tokens with a solid filled style.\n */\n.btn-restore[data-v-a4ea46ea] {\n\t--v-button-background-color: color-mix(in srgb, var(--theme--warning) 15%, transparent);\n\t--v-button-color: var(--theme--warning);\n\t--v-button-border-color: color-mix(in srgb, var(--theme--warning) 40%, transparent);\n\t--v-button-background-color-hover: var(--theme--warning);\n\t--v-button-color-hover: var(--white);\n\t--v-button-border-color-hover: var(--theme--warning);\n}\n.btn-danger[data-v-a4ea46ea] {\n\t--v-button-color: var(--theme--danger);\n\t--v-button-color-hover: var(--white);\n\t--v-button-background-color-hover: var(--theme--danger);\n\t--v-button-border-color-hover: var(--theme--danger);\n}\n.auto-refresh-notice[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 5px;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin: 0;\n}\n.refresh-icon[data-v-a4ea46ea] {\n\t--v-icon-size: 13px;\n\t--v-icon-color: var(--theme--foreground-subdued);\n}\n\n/* ============================================================\n Schedule card\n ============================================================ */\n.schedule-card[data-v-a4ea46ea] {\n\tbackground: var(--theme--background);\n\tborder: 1px solid var(--theme--border-color-subdued);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 24px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 20px;\n}\n.schedule-loading[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tfont-size: 14px;\n}\n.schedule-toggle-row[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 16px;\n}\n.toggle-label[data-v-a4ea46ea] {\n\tfont-size: 15px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n}\n.schedule-body[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n\ttransition: opacity 0.2s ease;\n}\n.schedule-body--disabled[data-v-a4ea46ea] {\n\topacity: 0.45;\n\tpointer-events: none;\n}\n.cron-presets[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: 8px;\n}\n.preset-label[data-v-a4ea46ea] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\tfont-weight: 500;\n}\n.preset-btn[data-v-a4ea46ea] {\n\tpadding: 4px 14px;\n\tborder-radius: 100px;\n\tborder: 1px solid var(--theme--border-color);\n\tbackground: var(--theme--background-subdued);\n\tcolor: var(--theme--foreground);\n\tfont-size: 13px;\n\tcursor: pointer;\n\ttransition: background 0.15s, border-color 0.15s, color 0.15s;\n}\n.preset-btn[data-v-a4ea46ea]:hover:not(:disabled) {\n\tbackground: var(--theme--primary-background);\n\tborder-color: var(--theme--primary);\n\tcolor: var(--theme--primary);\n}\n.preset-btn--active[data-v-a4ea46ea] {\n\tbackground: var(--theme--primary);\n\tborder-color: var(--theme--primary);\n\tcolor: var(--white);\n}\n.preset-btn--active[data-v-a4ea46ea]:hover:not(:disabled) {\n\tbackground: var(--theme--primary);\n\tcolor: var(--white);\n}\n.preset-btn[data-v-a4ea46ea]:disabled {\n\tcursor: not-allowed;\n}\n.cron-input-row[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n.field-label[data-v-a4ea46ea] {\n\tfont-size: 13px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground-subdued);\n\ttext-transform: uppercase;\n\tletter-spacing: 0.05em;\n}\n.cron-input[data-v-a4ea46ea] {\n\tmax-width: 320px;\n\tfont-family: var(--theme--fonts--mono--font-family, monospace);\n}\n.field-hint[data-v-a4ea46ea] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin: 0;\n}\n.field-hint a[data-v-a4ea46ea] {\n\tcolor: var(--theme--primary);\n\ttext-decoration: none;\n}\n.field-hint a[data-v-a4ea46ea]:hover {\n\ttext-decoration: underline;\n}\n.last-run-row[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\t--v-icon-color: var(--theme--foreground-subdued);\n}\n.schedule-footer[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tpadding-top: 4px;\n\tborder-top: 1px solid var(--theme--border-color-subdued);\n}\n\n/* ============================================================\n Dialogs — shared\n ============================================================ */\n.backup-dialog[data-v-a4ea46ea],\n.confirm-dialog[data-v-a4ea46ea] {\n\twidth: 560px;\n\tmax-width: calc(100vw - 32px);\n}\n.dialog-section[data-v-a4ea46ea] {\n\tmargin-bottom: 20px;\n}\n.dialog-section[data-v-a4ea46ea]:last-child {\n\tmargin-bottom: 0;\n}\n\n/* Dialog title with icon */\n.dialog-title-row[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n}\n.dialog-title-icon-wrap[data-v-a4ea46ea] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 32px;\n\theight: 32px;\n\tborder-radius: 50%;\n\tflex-shrink: 0;\n}\n.restore-icon-wrap[data-v-a4ea46ea] {\n\tbackground: color-mix(in srgb, var(--theme--warning) 15%, transparent);\n\tcolor: var(--theme--warning);\n\t--v-icon-color: var(--theme--warning);\n}\n.danger-icon-wrap[data-v-a4ea46ea] {\n\tbackground: color-mix(in srgb, var(--theme--danger) 12%, transparent);\n\tcolor: var(--theme--danger);\n\t--v-icon-color: var(--theme--danger);\n}\n\n/* ============================================================\n Restore dialog specifics\n ============================================================ */\n.restore-warning-notice[data-v-a4ea46ea] {\n\tmargin-bottom: 0;\n}\n.restore-option-row[data-v-a4ea46ea] {\n\tmargin-top: 16px;\n}\n.restore-progress[data-v-a4ea46ea] {\n\tmargin-top: 16px;\n}\n\n/* Restore confirm button — warning/amber so it reads as impactful but not destructive */\n.btn-restore-confirm[data-v-a4ea46ea] {\n\t--v-button-background-color: var(--theme--warning);\n\t--v-button-color: var(--white);\n\t--v-button-border-color: var(--theme--warning);\n\t--v-button-background-color-hover: color-mix(in srgb, var(--theme--warning) 85%, black);\n\t--v-button-color-hover: var(--white);\n\t--v-button-border-color-hover: color-mix(in srgb, var(--theme--warning) 85%, black);\n}\n\n/* ============================================================\n Radio group (New Backup dialog)\n ============================================================ */\n.radio-group[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tmargin-top: 8px;\n}\n.radio-option[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 0;\n\tborder: 1px solid var(--theme--border-color);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 14px 16px;\n\tcursor: pointer;\n\ttransition: border-color 0.15s, background 0.15s;\n}\n.radio-option input[type="radio"][data-v-a4ea46ea] {\n\tposition: absolute;\n\topacity: 0;\n\tpointer-events: none;\n}\n.radio-option--active[data-v-a4ea46ea] {\n\tborder-color: var(--theme--primary);\n\tbackground: var(--theme--primary-background);\n}\n.radio-option[data-v-a4ea46ea]:hover:not(.radio-option--active) {\n\tbackground: var(--theme--background-subdued);\n\tborder-color: var(--theme--border-color-subdued);\n}\n.radio-content[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 12px;\n\twidth: 100%;\n\t--v-icon-color: var(--theme--primary);\n}\n.radio-title[data-v-a4ea46ea] {\n\tdisplay: block;\n\tfont-weight: 600;\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground);\n}\n.radio-desc[data-v-a4ea46ea] {\n\tdisplay: block;\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\tmargin-top: 2px;\n}\n\n/* ============================================================\n Collection selector\n ============================================================ */\n.collection-selector[data-v-a4ea46ea] {\n\tborder: 1px solid var(--theme--border-color-subdued);\n\tborder-radius: var(--theme--border-radius);\n\toverflow: hidden;\n}\n.collection-selector-header[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tpadding: 10px 14px;\n\tbackground: var(--theme--background-subdued);\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n}\n.selector-actions[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n}\n.text-btn[data-v-a4ea46ea] {\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tfont-size: 13px;\n\tcolor: var(--theme--primary);\n\tpadding: 0;\n}\n.text-btn[data-v-a4ea46ea]:hover {\n\ttext-decoration: underline;\n}\n.separator[data-v-a4ea46ea] {\n\tcolor: var(--theme--border-color);\n}\n.collections-loading[data-v-a4ea46ea],\n.collections-empty[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 16px 14px;\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.collection-list-scroll[data-v-a4ea46ea] {\n\tmax-height: 240px;\n\toverflow-y: auto;\n}\n.collection-item[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 8px 14px;\n\tcursor: pointer;\n\ttransition: background 0.1s;\n\tborder-bottom: 1px solid var(--theme--border-color-subdued);\n}\n.collection-item[data-v-a4ea46ea]:last-child {\n\tborder-bottom: none;\n}\n.collection-item input[type="checkbox"][data-v-a4ea46ea] {\n\twidth: 16px;\n\theight: 16px;\n\tflex-shrink: 0;\n\taccent-color: var(--theme--primary);\n\tcursor: pointer;\n}\n.collection-item--selected[data-v-a4ea46ea] {\n\tbackground: var(--theme--primary-background);\n}\n.collection-item[data-v-a4ea46ea]:hover:not(.collection-item--selected) {\n\tbackground: var(--theme--background-subdued);\n}\n.collection-item-content[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tmargin-left: 10px;\n\tflex: 1;\n}\n.collection-icon[data-v-a4ea46ea] {\n\t--v-icon-color: var(--theme--foreground-subdued);\n}\n.collection-name[data-v-a4ea46ea] {\n\tflex: 1;\n\tfont-size: 14px;\n\tcolor: var(--theme--foreground);\n\tfont-family: var(--theme--fonts--mono--font-family, monospace);\n}\n.collection-count[data-v-a4ea46ea] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\twhite-space: nowrap;\n}\n\n/* ============================================================\n Toggle rows (shared between dialogs and schedule card)\n ============================================================ */\n.toggle-row[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 16px;\n\tpadding: 12px 0;\n\tborder-top: 1px solid var(--theme--border-color-subdued);\n}\n.toggle-info[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 2px;\n}\n.toggle-title[data-v-a4ea46ea] {\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tcolor: var(--theme--foreground);\n}\n.toggle-desc[data-v-a4ea46ea] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n}\n\n/* ============================================================\n Running / progress state\n ============================================================ */\n.running-state[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 14px;\n\tpadding: 16px;\n\tbackground: var(--theme--primary-background);\n\tborder-radius: var(--theme--border-radius);\n\tborder: 1px solid var(--theme--primary);\n\tmargin-top: 16px;\n}\n.running-text[data-v-a4ea46ea] {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n.running-title[data-v-a4ea46ea] {\n\tfont-size: 14px;\n\tfont-weight: 600;\n\tcolor: var(--theme--primary);\n}\n.running-desc[data-v-a4ea46ea] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.progress-info[data-v-a4ea46ea] {\n\tflex: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 12px;\n}\n.progress-header[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tgap: 16px;\n}\n.progress-percentage[data-v-a4ea46ea] {\n\tfont-size: 16px;\n\tfont-weight: 600;\n\tcolor: var(--theme--primary);\n\tmin-width: 50px;\n\ttext-align: right;\n}\n.progress-bar[data-v-a4ea46ea] {\n\twidth: 100%;\n}\n.progress-details[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n}\n.phase-text[data-v-a4ea46ea] {\n\tflex: 1;\n}\n.elapsed-time[data-v-a4ea46ea] {\n\twhite-space: nowrap;\n\tmargin-left: 16px;\n}\n.errors-section[data-v-a4ea46ea] {\n\tmargin-top: 8px;\n}\n.errors-details[data-v-a4ea46ea] {\n\tcursor: pointer;\n}\n.errors-summary[data-v-a4ea46ea] {\n\tfont-size: 12px;\n\tcolor: var(--theme--danger);\n\tfont-weight: 500;\n\tuser-select: none;\n\tpadding: 8px;\n\tmargin: -8px;\n\tborder-radius: var(--theme--border-radius);\n}\n.errors-summary[data-v-a4ea46ea]:hover {\n\tbackground: var(--theme--background-subdued);\n}\n.errors-list[data-v-a4ea46ea] {\n\tmargin-top: 8px;\n\tpadding-left: 12px;\n\tborder-left: 2px solid var(--theme--danger);\n\tmax-height: 200px;\n\toverflow-y: auto;\n}\n.error-item[data-v-a4ea46ea] {\n\tfont-size: 12px;\n\tcolor: var(--theme--foreground-subdued);\n\tpadding: 4px 0;\n\tword-break: break-word;\n}\n.error-collection[data-v-a4ea46ea] {\n\tcolor: var(--theme--danger);\n\tfont-weight: 500;\n}\n.error-message[data-v-a4ea46ea] {\n\tcolor: var(--theme--foreground-subdued);\n}\n\n/* ============================================================\n Confirm dialog details panel\n ============================================================ */\n.confirm-details[data-v-a4ea46ea] {\n\tmargin-top: 16px;\n\tbackground: var(--theme--background-subdued);\n\tborder-radius: var(--theme--border-radius);\n\tpadding: 12px 16px;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n}\n.detail-row[data-v-a4ea46ea] {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 12px;\n}\n.detail-label[data-v-a4ea46ea] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground-subdued);\n\tmin-width: 110px;\n\tflex-shrink: 0;\n}\n.detail-value[data-v-a4ea46ea] {\n\tfont-size: 13px;\n\tcolor: var(--theme--foreground);\n\tword-break: break-word;\n}\n\n/* ============================================================\n Error & validation notices\n ============================================================ */\n.error-notice[data-v-a4ea46ea] {\n\tmargin-top: 12px;\n}\n.validation-msg[data-v-a4ea46ea] {\n\tfont-size: 12px;\n\tcolor: var(--theme--danger);\n\tpadding: 6px 14px;\n\tmargin: 0;\n}\n\n/* ============================================================\n Transitions\n ============================================================ */\n.slide-down-enter-active[data-v-a4ea46ea],\n.slide-down-leave-active[data-v-a4ea46ea] {\n\ttransition: opacity 0.2s ease, transform 0.2s ease, max-height 0.25s ease;\n\tmax-height: 400px;\n\toverflow: hidden;\n}\n.slide-down-enter-from[data-v-a4ea46ea],\n.slide-down-leave-to[data-v-a4ea46ea] {\n\topacity: 0;\n\ttransform: translateY(-6px);\n\tmax-height: 0;\n}\n\n/* ============================================================\n Responsive\n ============================================================ */\n@media (max-width: 900px) {\n.col-collections[data-v-a4ea46ea] { display: none;\n}\n}\n@media (max-width: 768px) {\n.backup-module-content[data-v-a4ea46ea] {\n\t\tpadding: 16px;\n\t\tgap: 28px;\n}\n.col-size[data-v-a4ea46ea] { display: none;\n}\n.col-status[data-v-a4ea46ea] { display: none;\n}\n\n\t/* Collapse action buttons to icon-only on small viewports — already icon-only, but tighten gap */\n.action-buttons[data-v-a4ea46ea] {\n\t\tgap: 4px;\n}\n.backup-dialog[data-v-a4ea46ea],\n\t.confirm-dialog[data-v-a4ea46ea] {\n\t\twidth: 100%;\n}\n.cron-input[data-v-a4ea46ea] {\n\t\tmax-width: 100%;\n}\n.schedule-card[data-v-a4ea46ea] {\n\t\tpadding: 16px;\n}\n.cron-presets[data-v-a4ea46ea] {\n\t\tgap: 6px;\n}\n.dialog-title-row[data-v-a4ea46ea] {\n\t\tgap: 8px;\n}\n}\n.structure-toggle[data-v-a4ea46ea] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 4px;\n\tmargin-left: auto;\n\tpadding: 2px 8px;\n\tborder: 1px solid var(--theme--border-color, var(--border-normal));\n\tborder-radius: var(--theme--border-radius, 6px);\n\tbackground: transparent;\n\tcolor: var(--theme--foreground-subdued, var(--foreground-subdued));\n\tfont-size: 12px;\n\tcursor: pointer;\n}\n.structure-toggle--on[data-v-a4ea46ea] {\n\tborder-color: var(--theme--primary, var(--primary));\n\tcolor: var(--theme--primary, var(--primary));\n}\n.collection-selector .field-hint[data-v-a4ea46ea] {\n\tmargin-top: 6px;\n}\n.structure-badge[data-v-a4ea46ea] {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tpadding: 1px 8px;\n\tborder-radius: 10px;\n\tbackground: var(--theme--background-accent, var(--background-subdued));\n\tcolor: var(--theme--foreground-subdued, var(--foreground-subdued));\n\tfont-size: 11px;\n\twhite-space: nowrap;\n}\n',{});var $t=Pe(jt,[["__scopeId","data-v-a4ea46ea"]]),At=Object.freeze({__proto__:null,default:$t});export{E as displays,V as interfaces,T as layouts,F as modules,L as operations,U as panels,I as themes};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@acuity/directus-extension-acuity-backup",
3
3
  "description": "Backup Directus collections, schema, and media files to ZIP archives. Provided free, courtesy of Acuity Consulting Inc. — we help companies build smarter systems, automate workflows with AI, and scale with confidence.",
4
4
  "icon": "icon.png",
5
- "version": "2.1.7",
5
+ "version": "2.2.0",
6
6
  "license": "MIT",
7
7
  "author": {
8
8
  "name": "Acuity Consulting Inc.",