@brftech/filex-core 0.27.6 → 0.29.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/filex-core.js +5 -5
- package/dist/filex-core.js.map +1 -1
- package/dist/filex-core.umd.cjs +1 -1
- package/dist/filex-core.umd.cjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/listing.ts +10 -2
- package/src/locales/en.ts +2 -2
- package/src/locales/tr.ts +2 -2
package/dist/filex-core.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(Fe,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],n):(Fe=typeof globalThis<"u"?globalThis:Fe||self,n(Fe.FilexCore={},Fe.Vue))})(this,function(Fe,n){"use strict";var WP=Object.defineProperty;var jP=(Fe,n,Lr)=>n in Fe?WP(Fe,n,{enumerable:!0,configurable:!0,writable:!0,value:Lr}):Fe[n]=Lr;var Sa=(Fe,n,Lr)=>jP(Fe,typeof n!="symbol"?n+"":n,Lr);function Lr(e,t){for(var a=0;a<t.length;a++){const r=t[a];if(typeof r!="string"&&!Array.isArray(r)){for(const i in r)if(i!=="default"&&!(i in e)){const o=Object.getOwnPropertyDescriptor(r,i);o&&Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:()=>r[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}function vc(e){return!!e&&e.enabled&&e.state==="ok"}function Af(e){const t=e.apiBase!=null?e.apiBase.replace(/\/+$/,""):null;function a(i,o){return i||(t===null?null:`${t}${o}`)}const r=e.endpoint??(t!==null?`${t}/api/files/manager`:null);if(!r)throw new Error("[@brftech/filex-core] config requires either `apiBase` or `endpoint`");return{manager:r,uploadBegin:a(e.uploadBegin,"/api/files/upload/begin"),uploadInit:a(e.uploadInit,"/api/files/upload/init"),uploadFinalize:a(e.uploadFinalize,"/api/files/upload/finalize"),uploadAbort:a(e.uploadAbort,"/api/files/upload/abort"),shareCreate:a(e.shareCreate,"/api/files/share"),shareList:a(e.shareList,"/api/files/share"),shareDelete:a(e.shareDelete,"/api/files/share/{uuid}"),limits:a(e.limits,"/api/files/limits"),capabilities:a(e.capabilities,"/api/files/capabilities"),archiveList:a(e.archiveList,"/api/files/archive/list"),archiveExtract:a(e.archiveExtract,"/api/files/archive/extract"),archiveAdd:a(e.archiveAdd,"/api/files/archive/add"),copy:a(e.copy,"/api/files/copy"),moveAsync:a(e.moveAsync,"/api/files/move"),deleteAsync:a(e.deleteAsync,"/api/files/delete"),opsList:a(e.opsList,"/api/files/ops"),opsShow:a(e.opsShow,"/api/files/ops/{id}"),onlyOfficeConfig:a(e.onlyOfficeConfig,"/api/files/onlyoffice/config"),saveText:a(e.saveText,"/api/files/save-text"),restore:a(e.restore,"/api/files/restore"),trashList:a(e.trashList,"/api/files/manager/trash"),trashRestore:a(e.trashRestore,"/api/files/manager/restore")}}async function Fk(e){if(typeof e=="function"){const t=e();return t instanceof Promise?await t:t}return e}function Pk(e){return e?"kind"in e?e:e.type==="bearer"?{kind:"bearer",token:e.token}:e.type==="csrf"?{kind:"csrf",csrf:e.csrf}:{kind:"none"}:{kind:"none"}}function zr(e){const t=Af(e),a=Pk(e.auth);let r=null;async function i(ge={}){const he={Accept:"application/json",...ge};if(a.kind==="bearer"){const Ae=await Fk(a.token);Ae&&(he.Authorization=`Bearer ${Ae}`,r=Ae)}else if(a.kind==="csrf")he["X-CSRF-TOKEN"]=a.csrf,he["X-Requested-With"]="XMLHttpRequest";else if(a.kind==="basic"){const Ae=btoa(`${a.user}:${a.pass}`);he.Authorization=`Basic ${Ae}`}return he}function o(ge={}){const he={Accept:"application/json",...ge};if(a.kind==="bearer"){const Ae=typeof a.token=="string"?a.token:r;Ae&&(he.Authorization=`Bearer ${Ae}`)}else if(a.kind==="csrf")he["X-CSRF-TOKEN"]=a.csrf,he["X-Requested-With"]="XMLHttpRequest";else if(a.kind==="basic"){const Ae=btoa(`${a.user}:${a.pass}`);he.Authorization=`Basic ${Ae}`}return he}function s(){return a.kind==="csrf"?"include":"same-origin"}function l(ge){const he=(e.locale??"tr")!=="en",nt={400:["Geçersiz istek","Bad request"],401:["Oturum gerekli, tekrar giriş yapın","Sign-in required"],403:["Bu işlem için yetkiniz yok","You are not allowed to do this"],404:["Bulunamadı","Not found"],409:["Zaten var / çakışma","Already exists / conflict"],413:["Dosya çok büyük","File too large"],415:["Bu dosya türü desteklenmiyor","Unsupported file type"],422:["Geçersiz veri","Invalid data"],429:["Çok fazla istek, biraz bekleyin","Too many requests"],500:["Sunucu hatası","Server error"],501:["Bu işlem desteklenmiyor","Not supported"],503:["Servis şu an kullanılamıyor","Service unavailable"]}[ge];return nt?he?nt[0]:nt[1]:he?`Hata (${ge})`:`Error (${ge})`}async function c(ge,he={}){const Ae={...await i(),...he.headers??{}},nt=await fetch(ge,{...he,headers:Ae,credentials:s()});if(!nt.ok){const Me=await nt.text().catch(()=>""),fe=new Error(l(nt.status));throw fe.status=nt.status,fe.detail=Me.slice(0,300),fe}if(nt.status===204||nt.status===205)return;const Re=await nt.text();if(Re)return JSON.parse(Re)}function d(ge=""){return t.manager.replace(/\/manager(\?.*)?$/,"/permissions")+ge}async function u(ge){return c(d()+"?path="+encodeURIComponent(ge))}async function p(ge){return c(d("/resolve")+"?email="+encodeURIComponent(ge))}async function f(ge){return c(d("/users")+"?q="+encodeURIComponent(ge))}async function h(ge){return c(d(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}async function _(ge,he){return c(d("/"+ge),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({level:he})})}async function b(ge){return c(d("/"+ge),{method:"DELETE"})}async function k(ge){return c(d("/invite"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}async function m(ge){return c(d("/share-mail"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}function v(ge){const he=new URLSearchParams;for(const[Ae,nt]of Object.entries(ge))nt!=null&&he.set(Ae,String(nt));return he.toString()}function g(ge,he={}){const Ae=t.manager.includes("?")?"&":"?";return`${t.manager}${Ae}${v({q:ge,action:ge,...he})}`}async function y(ge){return c(g("index",{path:ge}))}async function S(ge,he){return c(g("search",{path:ge,filter:he}))}async function x(ge,he={}){const Ae=t.manager.replace(/\/manager(\?.*)?$/,"/search"),nt=Ae.includes("?")?"&":"?",Re=`${Ae}${nt}${v({q:ge,limit:he.limit,scope:he.scope})}`,Me=await c(Re);return Array.isArray(Me==null?void 0:Me.results)?Me.results:[]}async function N(ge){return c(g("subfolders",{path:ge}))}async function w(ge,he){return c(g("newfolder"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,name:he})})}async function E(ge,he,Ae){return c(g("rename"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,item:he,name:Ae})})}async function C(ge,he,Ae){return c(g("move"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,item:Ae,items:he.map(nt=>({path:nt}))})})}async function A(ge,he){return c(g("delete"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,items:he.map(Ae=>({path:Ae}))})})}async function L(ge,he){if(!t.copy)throw new Error("copy endpoint not configured");return c(t.copy,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge,target:he})})}async function R(ge,he,Ae){if(!t.moveAsync)throw new Error("moveAsync endpoint not configured");return c(t.moveAsync,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge,target:he,sourceDir:Ae})})}async function $(ge,he){if(!t.deleteAsync)throw new Error("deleteAsync endpoint not configured");return c(t.deleteAsync,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge,sourceDir:he})})}async function Y(ge){if(!t.restore)throw new Error("restore endpoint not configured");return c(t.restore,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge})})}async function F(ge){if(!t.trashList)throw new Error("trashList endpoint not configured");const he=t.trashList,Ae=he.includes("?")?"&":"?",nt=ge?`${he}${Ae}storage=${encodeURIComponent(ge)}`:he;return c(nt)}async function q(ge){const he=t.trashRestore;if(!he)throw new Error("trashRestore endpoint not configured");let Ae=0;for(const nt of ge)try{await c(he,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:nt})}),Ae++}catch{}return{restored:Ae}}async function X(ge,he,Ae){const nt=new FormData;nt.append("path",ge);for(const Me of he)nt.append("file[]",Me,Me.name);const Re=await i();return new Promise((Me,fe)=>{const Te=new XMLHttpRequest;Te.open("POST",g("upload"));for(const[Ue,et]of Object.entries(Re))Ue!=="Content-Type"&&Te.setRequestHeader(Ue,et);Te.withCredentials=s()==="include",Te.upload.onprogress=Ue=>{Ae&&Ue.lengthComputable&&Ae(Math.round(Ue.loaded/Ue.total*100))},Te.onload=()=>{if(Te.status>=200&&Te.status<300)try{Me(JSON.parse(Te.responseText))}catch(Ue){fe(Ue)}else fe(new Error(`${Te.status} ${Te.statusText}: ${Te.responseText.slice(0,200)}`))},Te.onerror=()=>fe(new Error("Network error")),Te.send(nt)})}function z(ge){return g("download",{path:ge})}function H(ge){return g("preview",{path:ge})}async function O(ge){const he=await i(),Ae=await fetch(H(ge),{headers:he,credentials:s()});if(!Ae.ok){const fe=await Ae.text().catch(()=>"");throw new Error(`${Ae.status} ${Ae.statusText}${fe?" — "+fe.slice(0,200):""}`)}const nt=await Ae.blob(),Re=nt.type||Ae.headers.get("content-type")||"";return{url:URL.createObjectURL(nt),blob:nt,mime:Re}}async function P(ge){const he=await i(),Ae=await fetch(H(ge),{headers:he,credentials:s()});if(!Ae.ok){const nt=await Ae.text().catch(()=>"");throw new Error(`${Ae.status} ${Ae.statusText}${nt?" — "+nt.slice(0,200):""}`)}return Ae.arrayBuffer()}async function K(){return t.limits?c(t.limits):{max_upload_mb:1024}}async function J(){return t.capabilities?c(t.capabilities):{ffmpeg:!1,ghostscript:!1,libreoffice:!1,max_chunk_mb:5,upload_limit_mb:1024,onlyoffice_url:e.onlyOfficeBase??null,drawio_url:e.drawioBase??null,convert_url:e.convertBase??null}}async function de(ge){if(!t.shareCreate)throw new Error("shareCreate endpoint not configured");return c(t.shareCreate,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}async function xe(ge){if(!t.shareList)return{shares:[]};const he=t.shareList.includes("?")?"&":"?";return c(`${t.shareList}${he}path=${encodeURIComponent(ge)}`)}async function ke(ge){if(!t.shareDelete)throw new Error("shareDelete endpoint not configured");const he=t.shareDelete.replace("{uuid}",encodeURIComponent(ge));return c(he,{method:"DELETE"})}async function ae(ge){if(!t.archiveList)throw new Error("archiveList endpoint not configured");return{entries:(await c(t.archiveList,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge})})).entries.map(Ae=>({name:Ae.name,size:Ae.size,isDir:Ae.is_dir,lastModified:Ae.mtime}))}}async function be(ge,he){if(!t.archiveExtract)throw new Error("archiveExtract endpoint not configured");return c(t.archiveExtract,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,members:he})})}async function _e(ge,he){if(!t.archiveAdd)throw new Error("archiveAdd endpoint not configured");return c(t.archiveAdd,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,files:he})})}function Ce(ge=""){return t.manager.replace(/\/manager(\?.*)?$/,"/versions")+ge}async function Ve(ge){const he=await c(Ce()+"?node_id="+encodeURIComponent(String(ge)));return Array.isArray(he==null?void 0:he.versions)?he.versions:[]}async function rt(ge,he,Ae=!0){await c(Ce("/restore"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:ge,version_id:he,snapshot_current:Ae})})}async function tt(ge){await c(Ce("/snapshot"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:ge})})}function Pe(ge=""){return t.manager.replace(/\/manager(\?.*)?$/,"/comments")+ge}async function ze(ge){const he=await c(Pe()+"?node_id="+encodeURIComponent(String(ge)));return Array.isArray(he==null?void 0:he.comments)?he.comments:[]}async function Ie(ge,he){return(await c(Pe(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:ge,body:he})})).comment}async function pe(ge){await c(Pe("/"+encodeURIComponent(String(ge))),{method:"DELETE"})}async function Ge(){const ge=t.manager.replace(/\/manager(\?.*)?$/,"/ws-ticket");try{return await c(ge,{method:"POST"})}catch{return null}}return{wsTicket:Ge,index:y,search:S,globalSearch:x,subfolders:N,newFolder:w,rename:E,move:C,copy:L,moveAsync:R,deleteAsync:$,deleteItems:A,restore:Y,listTrash:F,restoreIds:q,uploadMultipart:X,downloadUrl:z,previewUrl:H,fetchBlob:O,fetchArrayBuffer:P,limits:K,capabilities:J,createShare:de,listShares:xe,revokeShare:ke,archiveList:ae,archiveExtract:be,archiveAdd:_e,listVersions:Ve,restoreVersion:rt,snapshotVersion:tt,listComments:ze,addComment:Ie,deleteComment:pe,listPermissions:u,resolveEmail:p,searchUsers:f,addPermission:h,updatePermission:_,deletePermission:b,invitePermission:k,shareMail:m,endpoints:t,authHeaders:i,authHeadersSync:o,credentialsMode:s,jsonFetch:c}}const kc="filex:uploads:v1",Mf=24*60*60*1e3;function fs(e,t){return[e,t.name,t.size,t.lastModified??0].join("\0")}function Of(){try{return typeof localStorage>"u"?null:(localStorage.getItem(kc),localStorage)}catch{return null}}function _c(e){if(!e)return{};try{const t=e.getItem(kc);if(!t)return{};const a=JSON.parse(t);return a&&typeof a=="object"?a:{}}catch{return{}}}function wc(e,t){if(e)try{e.setItem(kc,JSON.stringify(t))}catch{}}function Ec(e,t=Date.now()){const a=_c(e);let r=!1;for(const[i,o]of Object.entries(a))(!(o!=null&&o.uploadId)||t-(o.updatedAt??0)>Mf)&&(delete a[i],r=!0);return r&&wc(e,a),a}function Sc(e,t,a=Date.now()){return Ec(e,a)[t]??null}function If(e,t,a,r=Date.now()){const i=_c(e);i[t]={...a,updatedAt:r},wc(e,i)}function si(e,t){const a=_c(e);t in a&&(delete a[t],wc(e,a))}function Rf(e,t=Date.now()){return Object.values(Ec(e,t)).sort((a,r)=>r.updatedAt-a.updatedAt)}function $k(e){return!e||e==="staging"}function Lf(e){return e.stagedUnsupported=!0,e}function zf(e){return!!(e!=null&&e.stagedUnsupported)}function Ff(e,t,a=Of()){const r=e.chunkSize??8388608;function i(){const h=t.endpoints.uploadBegin;return h?h.replace(/\/begin$/,""):t.endpoints.manager.replace(/\/manager(\?.*)?$/,"/upload")}function o(){return!!i()}function s(){return r}function l(h){return o()&&h.size>s()}function c(h,_){return Sc(a,fs(h,_))}function d(){return Rf(a)}async function u(h){si(a,fs(h.path,{name:h.name,size:h.size,lastModified:h.lastModified}));try{await t.jsonFetch(`${i()}/${encodeURIComponent(h.uploadId)}`,{method:"DELETE"})}catch{}}async function p(h){return t.jsonFetch(`${i()}/${encodeURIComponent(h)}`)}async function f(h){var x,N;const _=fs(h.path,h.file),b={id:crypto.randomUUID(),file:h.file,path:h.path,totalBytes:h.file.size,uploadedBytes:0,percent:0,status:"initializing",cancel:()=>{}};let k=!1,m=null;b.cancel=()=>{k=!0,m==null||m.abort()};let v=0;function g(w=0){var E;b.uploadedBytes=Math.min(b.totalBytes,v+w),b.percent=b.totalBytes>0?Math.min(100,Math.round(b.uploadedBytes/b.totalBytes*100)):b.status==="done"?100:0,(E=h.onProgress)==null||E.call(h,b)}try{if(!o())throw Lf(new Error("staged upload endpoint not configured"));const w=i();let E="",C=h.chunkSize??r;const A=Sc(a,_);if(A)try{const $=await p(A.uploadId);$k($.state)&&($.total_size??0)===h.file.size?(E=A.uploadId,C=$.chunk_size??$.chunkSize??A.chunkSize,v=$.offset??0,b.resumedFrom=v):si(a,_)}catch{si(a,_)}if(!E){let $;try{$=await t.jsonFetch(`${w}/begin`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:h.path,name:h.file.name,size:h.file.size,mime:h.file.type||"application/octet-stream",chunk_size:h.chunkSize??r})})}catch(Y){const F=Y.status;throw(F===404||F===501)&&Lf(Y),Y}if(!($!=null&&$.id))throw new Error("begin returned no upload id");E=$.id,C=$.chunk_size??$.chunkSize??C,v=$.offset??0}b.uploadId=E,b.status="uploading",If(a,_,{uploadId:E,path:h.path,name:h.file.name,size:h.file.size,lastModified:h.file.lastModified,chunkSize:C,offset:v}),g();const L=4;for(;v<h.file.size;){if(k)throw new DOMException("Aborted by user","AbortError");const $=Math.min(v+C,h.file.size),Y=h.file.slice(v,$);let F=-1,q=null;for(let X=0;X<L;X++){if(X>0){if(await Pf(300*X+Math.floor(Math.random()*150)),k)throw new DOMException("Aborted by user","AbortError");try{const z=await p(E);if((z.offset??0)>=$){F=z.offset??$;break}if((z.offset??0)!==v){v=z.offset??v,g(),F=-2;break}}catch{}}try{F=await y(E,Y,v,$,h.file.size);break}catch(z){const H=z instanceof Error?z:new Error(String(z));if(k||H.name==="AbortError")throw H;const O=H.status;if(O&&O!==400&&O!==409&&O<500)throw H;q=H}}if(F!==-2){if(F<0)throw q??new Error("chunk upload failed");if(F<=v)throw new Error(`upload stalled at byte ${v}`);v=F,g(),If(a,_,{uploadId:E,path:h.path,name:h.file.name,size:h.file.size,lastModified:h.file.lastModified,chunkSize:C,offset:v})}}if(k)throw new DOMException("Aborted by user","AbortError");b.status="committing",g();const R=await t.jsonFetch(`${w}/${encodeURIComponent(E)}/commit`,{method:"POST"});return si(a,_),b.opId=R==null?void 0:R.op_id,b.nodeId=R==null?void 0:R.node_id,h.waitForTransfer&&(R!=null&&R.op_id)&&t.endpoints.opsShow&&(b.status="transferring",g(),await S(R.op_id)),b.status="done",v=b.totalBytes,g(),(x=h.onDone)==null||x.call(h,b,R),R}catch(w){const E=w instanceof Error?w:new Error(String(w));if(b.status=E.name==="AbortError"?"aborted":"error",b.error=E.message,g(),b.uploadId&&b.status==="aborted"){si(a,_);try{await t.jsonFetch(`${i()}/${encodeURIComponent(b.uploadId)}`,{method:"DELETE"})}catch{}}throw(N=h.onError)==null||N.call(h,b,E),E}function y(w,E,C,A,L){return new Promise((R,$)=>{const Y=new XMLHttpRequest;m=Y,Y.open("PUT",`${i()}/${encodeURIComponent(w)}`);const F=t.authHeadersSync({"Content-Type":"application/octet-stream","Content-Range":`bytes ${C}-${A-1}/${L}`});for(const[q,X]of Object.entries(F))Y.setRequestHeader(q,X);Y.withCredentials=t.credentialsMode()==="include",Y.upload.onprogress=q=>{q.lengthComputable&&g(q.loaded)},Y.onload=()=>{if(m=null,Y.status>=200&&Y.status<300){try{const X=JSON.parse(Y.responseText);R(X.offset??A)}catch{R(A)}return}const q=new Error(`chunk ${C}-${A-1} → ${Y.status}`);q.status=Y.status,q.detail=Y.responseText.slice(0,200),$(q)},Y.onerror=()=>{m=null,$(new Error(`chunk ${C}-${A-1}: network error`))},Y.onabort=()=>{m=null,$(new DOMException("Aborted","AbortError"))},Y.send(E)})}async function S(w){const E=t.endpoints.opsShow;if(!E)return;const C=E.replace("{id}",String(w));let A=200;for(;;){if(k)throw new DOMException("Aborted by user","AbortError");try{const L=await t.jsonFetch(C);if((L==null?void 0:L.status)==="ok")return;if((L==null?void 0:L.status)==="failed"||(L==null?void 0:L.status)==="partial")throw new Error(L.error||"transfer failed")}catch(L){if(L.message==="transfer failed"||L.name==="AbortError")throw L}await Pf(A),A=Math.min(A*2,2e3)}}}return{uploadFile:f,shouldChunk:l,threshold:s,resumableFor:c,listResumable:d,discardResumable:u}}function Pf(e){return new Promise(t=>setTimeout(t,e))}function $f(e){const t=n.ref(new Set),a=n.ref(null);function r(f,h={}){if(h.shift&&a.value){const _=e(),b=_.findIndex(y=>y.path===a.value),k=_.findIndex(y=>y.path===f);if(b===-1||k===-1){t.value=new Set([f]),a.value=f;return}const[m,v]=b<k?[b,k]:[k,b],g=new Set;for(let y=m;y<=v;y++)g.add(_[y].path);t.value=g;return}if(h.ctrl){const _=new Set(t.value);_.has(f)?_.delete(f):_.add(f),t.value=_,a.value=f;return}t.value=new Set([f]),a.value=f}function i(){t.value=new Set,a.value=null}function o(){t.value=new Set(e().map(f=>f.path))}function s(f){return t.value.has(f)}function l(f){const h=new Set(t.value);h.add(f),t.value=h}function c(f){const h=new Set(t.value);h.delete(f),t.value=h}const d=n.computed(()=>t.value.size),u=n.computed(()=>t.value.size===0),p=n.computed(()=>e().filter(h=>t.value.has(h.path)));return{selected:t,anchor:a,click:r,clear:i,selectAll:o,has:s,add:l,remove:c,size:d,isEmpty:u,nodes:p}}const cr=[{id:"palette",defaultCombo:"Ctrl+K",labelKey:"shortcuts.palette",groupKey:"shortcuts.group.nav"},{id:"search",defaultCombo:"/",labelKey:"shortcuts.search",groupKey:"shortcuts.group.nav"},{id:"go-up",defaultCombo:"Alt+↑",fixedCombos:["Backspace"],labelKey:"shortcuts.go_up",groupKey:"shortcuts.group.nav"},{id:"open",defaultCombo:"Enter",prevent:!1,labelKey:"shortcuts.open",groupKey:"shortcuts.group.nav"},{id:"quicklook",defaultCombo:"Space",labelKey:"shortcuts.quicklook",groupKey:"shortcuts.group.nav"},{id:"close",defaultCombo:"Esc",customizable:!1,prevent:!1,inForms:!0,labelKey:"shortcuts.close",groupKey:"shortcuts.group.nav"},{id:"inspector",defaultCombo:"I",labelKey:"shortcuts.inspector",groupKey:"shortcuts.group.nav"},{id:"help",defaultCombo:"?",labelKey:"shortcuts.help",groupKey:"shortcuts.group.nav"},{id:"toggle-hidden",defaultCombo:"Ctrl+Shift+.",labelKey:"shortcuts.toggle_hidden",groupKey:"shortcuts.group.nav"},{id:"select-all",defaultCombo:"Ctrl+A",labelKey:"shortcuts.select_all",groupKey:"shortcuts.group.selection"},{id:"rename",defaultCombo:"F2",labelKey:"shortcuts.rename",groupKey:"shortcuts.group.file"},{id:"delete",defaultCombo:"Del",labelKey:"shortcuts.delete",groupKey:"shortcuts.group.file"},{id:"cut",defaultCombo:"Ctrl+X",labelKey:"shortcuts.cut",groupKey:"shortcuts.group.file"},{id:"copy",defaultCombo:"Ctrl+C",labelKey:"shortcuts.copy",groupKey:"shortcuts.group.file"},{id:"paste",defaultCombo:"Ctrl+V",labelKey:"shortcuts.paste",groupKey:"shortcuts.group.file"},{id:"tab-new",defaultCombo:"Ctrl+T",labelKey:"shortcuts.tab_new",groupKey:"shortcuts.group.tabs"},{id:"tab-close",defaultCombo:"Ctrl+W",labelKey:"shortcuts.tab_close",groupKey:"shortcuts.group.tabs"},{id:"tab-next",defaultCombo:"Ctrl+Tab",labelKey:"shortcuts.tab_next",groupKey:"shortcuts.group.tabs"},{id:"tab-prev",defaultCombo:"Ctrl+Shift+Tab",labelKey:"shortcuts.tab_prev",groupKey:"shortcuts.group.tabs"}],Vk={palette:"onPathJump",search:"onFocusSearch","go-up":"onGoUp",open:"onOpen",quicklook:"onQuickLook",close:"onClose",inspector:"onToggleInspector","toggle-hidden":"onToggleHidden",help:"onShowHelp","select-all":"onSelectAll",rename:"onRename",delete:"onDelete",cut:"onCut",copy:"onCopy",paste:"onPaste","tab-new":"onTabNew","tab-close":"onTabClose","tab-next":"onTabNext","tab-prev":"onTabPrev"},xc="filex.shortcuts";function Uk(){try{const e=localStorage.getItem(xc);if(!e)return{};const t=JSON.parse(e);if(!t||typeof t!="object")return{};const a={};for(const[r,i]of Object.entries(t))typeof i=="string"&&cr.some(o=>o.id===r)&&(a[r]=i);return a}catch{return{}}}const xa=n.ref(Uk());function Cc(){try{Object.keys(xa.value).length===0?localStorage.removeItem(xc):localStorage.setItem(xc,JSON.stringify(xa.value))}catch{}}function Vf(e){return cr.find(t=>t.id===e)}function so(e){var a;const t=xa.value[e];return t!==void 0?t:((a=Vf(e))==null?void 0:a.defaultCombo)??""}function ps(e,t){const a=Vf(e);if(!a||a.customizable===!1)return;const r={...xa.value};t===a.defaultCombo?delete r[e]:r[e]=t,xa.value=r,Cc()}function Uf(e){if(!(e in xa.value))return;const t={...xa.value};delete t[e],xa.value=t,Cc()}function Hf(){xa.value={},Cc()}function Gf(e,t){var a;if(!e)return null;for(const r of cr)if(r.id!==t){if((a=r.fixedCombos)!=null&&a.includes(e))return{id:r.id,fixed:!0};if(so(r.id)===e)return{id:r.id,fixed:r.customizable===!1}}return null}const Hk={" ":"Space",Spacebar:"Space",Escape:"Esc",Delete:"Del",ArrowUp:"↑",ArrowDown:"↓",ArrowLeft:"←",ArrowRight:"→",PageUp:"PgUp",PageDown:"PgDn"},Gk=new Set(["Control","Alt","Shift","Meta","AltGraph","CapsLock","NumLock","ScrollLock","Fn","Dead"]);function Kk(e){const t=e.key;if(!t||Gk.has(t))return null;const a=Hk[t];return a||(t.length===1?t.toUpperCase():t)}function Nc(e){const t=Kk(e);if(!t)return null;const a=[];(e.ctrlKey||e.metaKey)&&a.push("Ctrl"),e.altKey&&a.push("Alt");const r=t.length===1&&t.toUpperCase()===t.toLowerCase();return e.shiftKey&&!r&&a.push("Shift"),a.push(t),a.join("+")}function Tc(){return n.computed(()=>cr.map(e=>{const t=so(e.id),a=e.fixedCombos??[];return{id:e.id,combo:t,fixedCombos:a,keys:[t,...a].filter(r=>!!r),labelKey:e.labelKey,groupKey:e.groupKey,customizable:e.customizable!==!1,overridden:xa.value[e.id]!==void 0}}))}cr.map(e=>({keys:[e.defaultCombo,...e.fixedCombos??[]].filter(t=>!!t),labelKey:e.labelKey,groupKey:e.groupKey}));function Kf(e,t){const a=n.computed(()=>{const i=new Map;for(const o of cr){const s=so(o.id);s&&i.set(s,o)}return i});function r(i){var p;if(!e.value||i.key!=="Escape"&&document.querySelector(".fe-ctx-backdrop"))return;const s=i.target,l=!!(s&&(s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.tagName==="SELECT"||s.isContentEditable)),c=Nc(i);if(!c)return;if(c==="Backspace"){if(l)return;(p=t.hasSelection)!=null&&p.call(t)&&t.onDelete?(i.preventDefault(),t.onDelete()):t.onGoUp&&(i.preventDefault(),t.onGoUp());return}const d=a.value.get(c);if(!d||l&&!d.inForms||c==="Space"&&s&&typeof s.closest=="function"&&s.closest('button, a, select, summary, [role="button"], [role="menuitem"]'))return;const u=t[Vk[d.id]];u&&(d.prevent!==!1&&i.preventDefault(),u())}n.onMounted(()=>window.addEventListener("keydown",r)),n.onBeforeUnmount(()=>window.removeEventListener("keydown",r))}const qf={"toolbar.new_folder":"Yeni Klasör","toolbar.upload":"Yükle","toolbar.search":"Ara","toolbar.search.placeholder":"Dosya adı…","toolbar.view.list":"Liste","toolbar.view.grid":"Izgara","toolbar.refresh":"Yenile","toolbar.go_up":"Üst Klasör","ctx.open":"Aç","ctx.preview":"Önizle","ctx.download":"İndir","ctx.convert":"Dönüştür","ctx.rename":"Yeniden Adlandır","ctx.delete":"Sil","ctx.delete_perm":"Kalıcı Olarak Sil","ctx.restore":"Geri Getir","ctx.share":"Paylaş","ctx.move":"Taşı","ctx.copy":"Kopyala","ctx.cut":"Kes","ctx.show_hidden":"Gizli dosyaları göster","ctx.hide_hidden":"Gizli dosyaları gizle","ctx.keep_local":"Bilgisayarda tut","ctx.keep_online":"Yalnızca çevrimiçi tut","ctx.keep_reveal":"Yerel klasörü aç","ctx.keep_inherited":"Üst klasörle bilgisayarda tutuluyor","keep.started":"Bilgisayarda tutulacak — eşitleme başladı","keep.failed":"Bilgisayarda tutulamadı","keep.badge_kept":"Bilgisayarda","keep.badge_syncing":"Eşitleniyor…","keep.badge_cloud":"Yalnızca çevrimiçi","keep.badge_partial":"İçinde bilgisayarda tutulanlar var","keep.strip_transfer":"{name} eşitleniyor — {done}/{total} (%{pct})","keep.strip_inventory":"{name} eşitleniyor — sunucu taranıyor…","keep.strip_settling":"{name} eşitleniyor — son durum kaydediliyor…","ctx.paste":"Yapıştır","ctx.info":"Bilgi","ctx.duplicate":"Kopyasını Oluştur","ctx.new_file":"Yeni Dosya","modal.delete.title":"Silinsin mi?","modal.delete.message":"{count} öğe çöpe atılacak.","modal.delete.confirm":"Çöpe At","modal.delete.cancel":"Vazgeç","modal.rename.title":"Yeniden Adlandır","modal.rename.save":"Kaydet","modal.rename.cancel":"Vazgeç","modal.newfolder.title":"Yeni Klasör","modal.newfolder.placeholder":"Klasör adı","modal.newfolder.create":"Oluştur","modal.newfolder.cancel":"Vazgeç","modal.share.title":"Paylaşım Linki","modal.share.pin":"PIN koruması","modal.share.expires":"Son kullanma","modal.share.max_downloads":"İndirme limiti","modal.share.create":"Paylaş","modal.share.cancel":"Vazgeç","modal.share.close":"Kapat","modal.share.limit_applied":"(sunucu sınırı uygulandı)","modal.share.copy":"Kopyala","modal.share.url_copied":"Link kopyalandı","modal.share.pin_copied":"PIN kopyalandı","modal.share.cli_copied":"CLI komutu kopyalandı","upload.progress":"Yükleniyor","upload.done":"Tamamlandı","upload.error":"Hata","upload.failed":"“{name}” yüklenemedi","upload.aborted":"İptal edildi","upload.cancel":"İptal","upload.resuming":"“{name}” %{percent} noktasından devam ediyor","upload.committing":"Tamamlanıyor","upload.transferring":"Depolamaya aktarılıyor","empty.folder":"Bu klasör boş","empty.search":"Sonuç bulunamadı",loading:"Yükleniyor…","notFound.title":"Klasör bulunamadı","notFound.desc":"Bu klasör mevcut değil, taşınmış ya da erişim yetkiniz yok.","notFound.goRoot":"Kök klasöre dön","col.name":"Ad","col.size":"Boyut","col.modified":"Tarih","col.type":"Tür","unit.bytes":"B","unit.kb":"KB","unit.mb":"MB","unit.gb":"GB","unit.tb":"TB","breadcrumb.root":"Kök","breadcrumb.copy_path":"Yolu Kopyala","breadcrumb.go_to_path":"Yola Git","breadcrumb.path_placeholder":"fileman/foo/bar","ops.copy":"Kopyalanıyor","ops.move":"Taşınıyor","ops.delete":"Siliniyor","ops.queued":"sırada","ops.done":"tamamlandı","ops.error":"hata","node.trash":"Çöp Kutusu","viewer.open_in_new_tab":"Yeni Sekmede Aç","viewer.loading":"Yükleniyor…","viewer.failed_to_load":"Dosya yüklenemedi","viewer.peer_not_installed":"Bu dosya tipi için opsiyonel kütüphane kurulu değil. Peer dependency yükle veya İndir düğmesini kullan.","viewer.format_unsupported_3d":"Bu 3B format tarayıcı önizlemesinde desteklenmiyor (model-viewer yalnızca .glb / .gltf / .usdz okur). Lütfen indirip yerel bir araçta açın.","viewer.zoom_in":"Yakınlaştır","viewer.zoom_out":"Uzaklaştır","viewer.fit_width":"Sayfa genişliğine sığdır","viewer.next_page":"Sonraki sayfa","viewer.prev_page":"Önceki sayfa","viewer.page_n_of_m":"Sayfa {n} / {m}","viewer.tags":"Etiketler","viewer.layers":"Katmanlar","viewer.toc":"İçindekiler","viewer.font_smaller":"Yazıyı küçült","viewer.font_larger":"Yazıyı büyüt","viewer.search":"Ara","viewer.download":"İndir","viewer.saving":"Kaydediliyor…","viewer.save":"Kaydet (Ctrl+S)","viewer.saved":"Kaydedildi","viewer.save_error":"Hata","viewer.editor_loading":"Editör yükleniyor…","viewer.no_preview":"Bu dosya tipi için önizleme henüz yok.","viewer.edit":"Düzenle","viewer.close":"Kapat","presence.expand":"İsimleri göster","presence.collapse":"Küçült","viewer.save_annotations":"Açıklamaları kaydet","viewer.annotations_on":"Açıklamalar: açık","viewer.annotations_off":"Açıklamalar: kapalı","viewer.read_only":"Salt okunur","viewer.csv_first_row_header":"İlk satır başlık olsun","viewer.csv_filter":"Satır filtrele…","viewer.epub_prev":"Önceki","viewer.epub_next":"Sonraki","viewer.drawio.disabled":"diagrams.net editörü bu filex kurulumunda yapılandırılmamış — yönetici FILEX_DRAWIO_URL'yi ayarlamalı.","viewer.archive.entries":"{n} dosya","viewer.archive.empty":"Arşiv boş.","viewer.archive.error":"Arşiv okunamadı.","viewer.name":"Ad","viewer.size":"Boyut","col.sort":"Sırala","group.today":"Bugün","group.yesterday":"Dün","group.this_week":"Bu Hafta","group.this_month":"Bu Ay","group.no_date":"Tarihsiz","toolbar.density.compact":"Sıkışık görünüm","toolbar.density.comfortable":"Rahat görünüm","palette.placeholder":"Dosya, klasör veya komut ara…","palette.files":"Dosyalar","palette.commands":"Komutlar","palette.goto":"Yola git","palette.empty":"Sonuç bulunamadı","palette.hint":"↑↓ gezin · Enter seç · Esc kapat","cmd.view_toggle":"Görünümü değiştir (liste ⇄ ızgara)","cmd.trash":"Çöp kutusunu aç","shortcuts.title":"Klavye Kısayolları","shortcuts.group.nav":"Gezinme","shortcuts.group.selection":"Seçim","shortcuts.group.file":"Dosya işlemleri","shortcuts.palette":"Komut paleti","shortcuts.search":"Aramaya odaklan","shortcuts.go_up":"Üst klasöre çık","shortcuts.open":"Seçili öğeyi aç","shortcuts.close":"Kapat / vazgeç","shortcuts.toggle_hidden":"Gizli dosyaları göster/gizle","shortcuts.help":"Bu yardım penceresi","shortcuts.select_all":"Tümünü seç","shortcuts.rename":"Yeniden adlandır","shortcuts.delete":"Sil","shortcuts.cut":"Kes","shortcuts.copy":"Kopyala","shortcuts.paste":"Yapıştır","breadcrumb.more":"Aradaki klasörler","empty.hint":"Dosyaları buraya sürükleyip bırakın","empty.upload":"Dosya yükle","empty.search.title":"Aramanla eşleşen dosya yok","empty.search.hint":"Farklı bir arama terimi deneyin","empty.trash.title":"Çöp kutusu boş","error.title":"Liste yüklenemedi","error.retry":"Yeniden dene","toast.undo":"Geri Al","toast.undone":"Geri alındı","toast.undo_failed":"Geri alınamadı","toast.renamed":"Yeniden adlandırıldı","toast.moved":"Taşındı","toast.trashed":"Çöpe taşındı","conn.offline":"Canlı bağlantı yok — değişiklikler gecikebilir","conn.tooltip":"Sunucuyla canlı bağlantı kurulamadı; liste belirli aralıklarla otomatik yenilenir. Bağlantı geri gelince bu uyarı kaybolur.","palette.everywhere":"Her yerde","palette.searching":"Aranıyor…","palette.saved":"Kayıtlı aramalar","palette.save":"Aramayı kaydet","palette.saved.delete":"Kayıtlı aramayı sil","search.in_content":"İçerikte","toolbar.more":"Diğer işlemler","toolbar.search.close":"Aramayı kapat","sheet.menu":"İşlemler","sheet.close":"Kapat","toolbar.inspector":"Ayrıntılar","ctx.details":"Ayrıntılar","shortcuts.inspector":"Ayrıntılar panelini aç/kapat","inspector.title":"Ayrıntılar","inspector.close":"Kapat","inspector.section.general":"Genel","inspector.section.versions":"Sürümler","inspector.section.permissions":"İzinler","inspector.section.shares":"Paylaşımlar","inspector.path":"Yol","inspector.size":"Boyut","inspector.modified":"Değiştirilme","inspector.mime":"MIME türü","inspector.etag":"ETag","inspector.copy":"Kopyala","inspector.copied":"Kopyalandı","inspector.error":"Yüklenemedi","inspector.items_summary":"{n} öğe, toplam {size}","inspector.folder_items":"{n} öğe","inspector.versions.empty":"Sürüm geçmişi yok","inspector.versions.v":"Sürüm {n}","inspector.versions.restore":"Geri yükle","inspector.versions.restore_confirm":"Bu sürüm geri yüklensin mi?","inspector.versions.snapshot_current":"Önce şimdiki halin sürümünü al","inspector.versions.confirm":"Onayla","inspector.versions.cancel":"Vazgeç","inspector.versions.take_snapshot":"Şimdiki halin sürümünü al","inspector.versions.restored":"Sürüm geri yüklendi","inspector.versions.snapshotted":"Sürüm alındı","inspector.versions.unsupported":"Sunucu bu işlemi desteklemiyor","inspector.perm.none":"Erişim yok","inspector.perm.viewer":"Görüntüleyen","inspector.perm.editor":"Düzenleyen","inspector.perm.owner":"Sahip","inspector.perm.manage":"İzinleri yönet","inspector.shares.empty":"Paylaşım linki yok","inspector.shares.copy":"Linki kopyala","theme.menu":"Tema","theme.title":"Tema Galerisi","theme.hint":"Tema yalnız renk paletini değiştirir; gündüz mü gece mi olduğu yukarıdaki seçim.","theme.mode.label":"Görünüm","theme.mode.light":"Gündüz","theme.mode.dark":"Gece","theme.mode.auto":"Otomatik","theme.reset":"Varsayılana dön","theme.close":"Kapat","theme.selected":"Seçili","theme.name.default":"Varsayılan","theme.name.night":"Gece Mavisi","theme.name.forest":"Orman","theme.name.amber":"Kehribar","theme.name.lilac":"Leylak","theme.name.contrast":"Yüksek Kontrast","theme.name.gray":"Yumuşak Gri","theme.name.terminal":"Terminal Yeşili","shortcuts.quicklook":"Hızlı bakış","shortcuts.customize":"Özelleştir","shortcuts.settings.menu":"Kısayollar","shortcuts.settings.title":"Kısayol Ayarları","shortcuts.settings.hint":'Bir kısayolu değiştirmek için "Değiştir"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',"shortcuts.settings.change":"Değiştir","shortcuts.settings.capture":"Tuşlara basın… (Esc iptal)","shortcuts.settings.reset":"Varsayılana dön","shortcuts.settings.reset_all":"Tümünü sıfırla","shortcuts.settings.unbound":"Atanmadı","shortcuts.settings.fixed":"Sabit","shortcuts.settings.customized":"Özelleştirildi","shortcuts.settings.conflict":'kombinasyonu "{name}" kısayolunda kullanılıyor.',"shortcuts.settings.conflict_fixed":'kombinasyonu "{name}" sabit kısayoluna ayrılmış — kullanılamaz.',"shortcuts.settings.conflict_take":"Eskisini boşa çıkar ve ata","shortcuts.settings.conflict_cancel":"Vazgeç","quicklook.hint_close":"kapat","quicklook.hint_nav":"önceki/sonraki","quicklook.hint_open":"aç","opc.title":"İşlemler","opc.aria_badge":"{n} işlem — işlem merkezini aç/kapat","opc.close":"Kapat","opc.active":"Sürüyor","opc.history":"Geçmiş","opc.clear":"Temizle","opc.empty":"İşlem yok","opc.cancel":"İptal","opc.retry":"Yeniden dene","opc.dismiss":"Kapat","opc.queued":"Sırada","opc.percent":"%{n}","opc.status.running":"Sürüyor","opc.status.done":"Bitti","opc.status.error":"Hata","opc.status.aborted":"İptal edildi","opc.kind.upload":"Yükleme","opc.kind.copy":"Kopyalama","opc.kind.move":"Taşıma","opc.kind.delete":"Silme","opc.kind.convert":"Dönüştürme","opc.kind.archive":"Arşiv","tour.aria":"Tanıtım turu","tour.restart":"Turu tekrar başlat","tour.skip":"Turu atla","tour.back":"Geri","tour.next":"İleri","tour.done":"Bitti","tour.progress":"{n} / {m}","tour.step.nav.title":"Depo ve klasörler","tour.step.nav.desc":"Bulunduğun konum burada görünür. Kırıntı çubuğundaki adımlara tıklayarak üst klasörlere ve depo köküne dönebilirsin.","tour.step.upload.title":"Dosya yükle","tour.step.upload.desc":"Bu düğmeyle dosya seçebilirsin; dosyaları doğrudan pencereye sürükleyip bırakmak da çalışır.","tour.step.search.title":"Arama","tour.step.search.desc":"Bu kutu bulunduğun klasörü filtreler. Ctrl+K komut paleti ile tüm depolarda arama yapabilir ve komut çalıştırabilirsin.","tour.step.view.title":"Görünümü değiştir","tour.step.view.desc":"Liste ve ızgara görünümü arasında geçiş yapabilirsin; seçimin hatırlanır.","tour.step.share.title":"Paylaşım","tour.step.share.desc":'Bir dosyaya sağ tıklayıp "Paylaş / İzinler" ile bağlantı oluşturabilir, PIN ve son kullanma süresi ekleyebilirsin.',"tour.step.help.title":"Kısayollar","tour.step.help.desc":'? tuşu kısayol kartını, Ctrl+K komut paletini açar. Bu turu menüdeki "Turu tekrar başlat" ile dilediğinde yeniden izleyebilirsin.',"error.hint":"Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.","error.details":"Teknik ayrıntılar","col.star":"Yıldız","toolbar.view_label":"Görünüm","list.aria":"Dosya listesi","grid.aria":"Dosya ızgarası","tabs.strip":"Sekmeler","tabs.new":"Yeni sekme","tabs.close":"Sekmeyi kapat","tabs.split":"Görünümü böl","tabs.split_off":"Bölmeyi kapat","ctx.open_new_tab":"Yeni sekmede aç","shortcuts.group.tabs":"Sekmeler","shortcuts.tab_new":"Yeni sekme","shortcuts.tab_close":"Sekmeyi kapat","shortcuts.tab_next":"Sonraki sekme","shortcuts.tab_prev":"Önceki sekme","cmd.tab_new":"Yeni sekme aç","cmd.split_toggle":"Görünümü böl / birleştir","split.pane":"İkincil panel","split.close":"Yan paneli kapat","split.error":"Liste yüklenemedi","split.retry":"Yeniden dene","split.copy_queued":"Kopyalama kuyruğa alındı","split.cross_copy":"Depolar farklı — kopyalama kuyruğa alındı","dragout.downloading":"Bırakılan klasöre indiriliyor…","dragout.not_found":"Bırakılan yer bulunamadı — dosya bir klasöre değil bir uygulamaya bırakıldıysa indirme yapılamaz","dragout.done":"İndirme tamamlandı","dragout.ready":"Dosyalar hazır — masaüstüne sürükleyebilirsin","dragout.preparing":"Sürükleme için hazırlanıyor…","split.cross_move":"Depolar farklı — taşıma kuyruğa alındı (baytlar aktarılıp kaynak silinir)","toolbar.view.gallery":"Galeri","gallery.aria":"Dosya galerisi","inspector.section.comments":"Yorumlar","inspector.comments.empty":"Henüz yorum yok.","inspector.comments.placeholder":"Yorum yaz…","inspector.comments.send":"Gönder","inspector.comments.delete":"Yorumu sil","e2e.create.title":"Şifreli klasör oluştur","e2e.create.option":"Şifreli klasör oluştur…","e2e.create.pw_placeholder":"Klasör parolası (en az 8 karakter)","e2e.create.pw2_placeholder":"Parolayı tekrar girin","e2e.create.warn_title":"GERİ DÖNÜŞÜ YOK","e2e.create.warn_body":"Dosyalar yalnız bu parolayla açılır. Parola sunucuda TUTULMAZ; unutursanız içerik sonsuza dek kaybolur. Kurtarma yolu yoktur — yönetici dahil kimse açamaz.","e2e.create.ack":"Anladım: parolayı kaybedersem verilerim kurtarılamaz.","e2e.create.ack_required":"Devam etmek için uyarıyı onaylayın.","e2e.create.pw_short":"Parola en az 8 karakter olmalı.","e2e.create.pw_mismatch":"Parolalar birbirini tutmuyor.","e2e.create.bad_name":"Geçersiz klasör adı.","e2e.create.create":"Şifreli klasörü oluştur","e2e.create.busy":"Oluşturuluyor…","e2e.create.done":"Şifreli klasör oluşturuldu","e2e.create.failed":"Şifreli klasör oluşturulamadı","e2e.create.nested":"Şifreli klasörün içine ikinci bir şifreli klasör açılamaz.","e2e.locked.title":"Bu klasör uçtan uca şifreli","e2e.locked.hint":"İçeriği görmek için klasör parolasını girin. Parola yalnız bu sekmede, bellekte tutulur.","e2e.locked.pw_placeholder":"Klasör parolası","e2e.locked.unlock":"Kilidi aç","e2e.locked.busy":"Doğrulanıyor…","e2e.unlock.wrong":"Parola yanlış.","e2e.unlock.marker_missing":"Şifre dosyası (.filex-e2e.json) okunamadı.","e2e.strip.label":"Şifreli klasör — kilit açık","e2e.strip.lock":"Kilitle","e2e.locked_toast":"Klasör kilitlendi","e2e.upload.too_big":"200 MB üstü dosyalar şifreli klasöre yüklenemez (MVP sınırı)","e2e.upload.locked":"Önce klasörün kilidini açın","e2e.decrypting":"Çözülüyor…","e2e.decrypt_failed":"Dosya çözülemedi (parola değişmiş ya da dosya bozulmuş olabilir).","e2e.download.failed":"Şifreli dosya indirilemedi.","conn.title":"Depo bağlantıları","conn.subtitle":"{host} sunucusunu bir arka uca bağlayın ya da kendi bilgisayarınızı {host} sunucusuna bağlayın.","conn.close":"Kapat","conn.tab.storages":"Depolar","conn.tab.connect":"Nasıl bağlanılır","conn.loading":"Yükleniyor…","conn.visibleOnly":"bu depoya göz atabilirsiniz","conn.denied.title":"Buraya depo ekleyebilen tek kişi yöneticidir","conn.denied.none":"Hesabınız dosyalara göz atabilir ama bu sunucunun nereye bağlı olduğunu değiştiremez. Depo eklemek ya da düzenlemek için sunucunun yöneticisine başvurun.","conn.denied.anonymous":"Bu sunucuda oturum açmış değilsiniz.","conn.denied.unreachable":"Sunucu yanıt vermedi: {error}","conn.denied.guideHint":"Zaten görebildiğiniz depolara kendi bilgisayarınızdan bağlanmak için yönetici yetkisi gerekmez.","conn.denied.guideCta":"Nasıl bağlanacağımı göster","conn.list.count":"{n} depo","conn.list.add":"Depo ekle","conn.list.empty":"Henüz yapılandırılmış depo yok. Bir tane ekleyin, dosyalar dosya yöneticisinde görünsün.","conn.list.edit":"Düzenle","conn.list.remove":"Kaldır","conn.list.confirm":"Gerçekten kaldırılsın mı?","conn.list.readOnly":"salt okunur","conn.list.disabled":"kapalı","conn.form.newTitle":"Yeni depo","conn.form.editTitle":"“{name}” düzenleniyor","conn.form.name":"Görünen isim","conn.form.namePlaceholder":"fotograflar","conn.form.nameHelp":"Bu deponun her yerdeki adı: dosya yöneticisinde, yollarda (isim://klasor) ve WebDAV adreslerinde.","conn.form.driver":"Tür","conn.form.driverLocked":"Bir deponun türü oluşturulduktan sonra değiştirilemez — yollar zaten ona işaret ediyor.","conn.form.readOnly":"Salt okunur (bu depoya hiçbir şey yazılamaz)","conn.form.enabled":"Etkin","conn.form.test":"Bağlantıyı sına","conn.form.testing":"Sınanıyor…","conn.form.testOk":"Bağlandı. Kökte {count} öğe var.","conn.form.testFail":"Bağlanılamadı: {error}","conn.form.save":"Kaydet","conn.form.saving":"Kaydediliyor…","conn.form.cancel":"Vazgeç","conn.form.nameRequired":"Depoya bir isim verin.","conn.form.fillRequired":"* ile işaretli alanları doldurun.","conn.form.required":"Zorunlu","conn.form.advanced":"Gelişmiş ayarlar","conn.form.noFields":"Bu sunucu bu sürücü için hiçbir ayar tanımlamadı.","conn.form.reveal":"Göster","conn.form.hide":"Gizle","conn.guide.protocol":"Protokol","conn.guide.storage":"Depo","conn.guide.allStorages":"Tüm depolar","conn.guide.copy":"Kopyala","conn.guide.copied":"Kopyalandı","conn.guide.goodToKnow":"Bilmekte fayda var","conn.guide.userPlaceholder":"eposta@ornek.com","conn.guide.secretPlaceholder":"parolaniz-ya-da-token","conn.guide.fact.url":"Adres","conn.guide.fact.urlRootHint":"Görebildiğiniz her depo bu adresin altında bir klasör olarak görünür.","conn.guide.fact.urlStorageHint":"Doğrudan “{storage}” deposunu bağlar. Son parçayı silerseniz tüm depoları görürsünüz.","conn.guide.fact.user":"Kullanıcı adı","conn.guide.fact.password":"Parola","conn.guide.webdav.summary":"WebDAV, filex’i bir sürücü gibi bağlar: Windows Gezgini, macOS Finder, Linux, rclone ve Cyberduck bu protokolü konuşur ve yapılan her değişiklik filex’e yansır.","conn.guide.webdav.userHint":"filex hesabınızın e-posta adresi — görünen adınız değil.","conn.guide.webdav.passwordHint":"Hesap parolanız ya da bir API token (Ayarlar → API token). İki adımlı doğrulaması açık bir hesap ZORUNLU olarak token kullanır: Basic kimlik doğrulamasında ikinci adım için yer yoktur.","conn.guide.webdav.win.s1":"Dosya Gezgini’ni açın, Bu bilgisayar’a sağ tıklayın ve “Ağ sürücüsü bağla…” deyin.","conn.guide.webdav.win.s2":"Bir sürücü harfi seçin ve klasör olarak {url} adresini girin.","conn.guide.webdav.win.s3":"“Farklı kimlik bilgileri kullanarak bağlan” kutusunu işaretleyin ve yukarıdaki kullanıcı adı/parola ile girin.","conn.guide.webdav.win.cmdCaption":"Komut İstemi (sihirbaz olmadan aynı iş)","conn.guide.webdav.win.limits":"Windows’un tam olarak filex hatası gibi görünen üç yerleşik sınırı vardır: aktarımlar ~47,7 MB’ta durur, yaklaşık bin dosyalı klasörler açılmaz (“Disk biçimlendirilmemiş”) ve her iki ayarı değiştirdikten sonra WebClient hizmeti yeniden başlatılmalıdır.","conn.guide.webdav.win.regCaption":"Yönetici olarak çalıştırın, sonra sürücüyü yeniden bağlayın","conn.guide.webdav.win.https":"HTTPS zorunludur. Windows Basic kimlik bilgilerini yalnızca TLS üzerinden gönderir; düz http:// üzerinde hiçbir açıklama vermeden reddeder. BasicAuthLevel değerini 2 yapmayın — TLS kullanın.","conn.guide.webdav.win.persist":"Bağlanan sürücü oturum kapatmayı atlatamaz: Windows 7’den beri Basic kimlik bilgileri Kimlik Bilgisi Yöneticisi’nde saklanamaz ve /persistent:yes bunu değiştirmez. Kendiliğinden geri gelsin istiyorsanız komutu bir oturum açma betiğinden yeniden çalıştırın.","conn.guide.webdav.win.service":"Hiç bağlanamıyorsa WebClient hizmetinin çalıştığından emin olun: sc config WebClient start= auto && net start WebClient.","conn.guide.webdav.mac.s1":"Finder’da Git → Sunucuya Bağlan… (⌘K) yolunu izleyin.","conn.guide.webdav.mac.s2":"{url} adresini girip bağlanın.","conn.guide.webdav.mac.s3":"Yukarıdaki kullanıcı adı ve parolayla kimliğinizi doğrulayın.","conn.guide.webdav.mac.note":"Sürücü Konumlar altında görünür; her depo en üst düzeyde bir klasördür.","conn.guide.webdav.linux.mountCaption":"davfs2 ya da masaüstü dosya yöneticisi (GNOME Dosyalar, Dolphin)","conn.guide.webdav.linux.gvfsComment":"ya da bu adresi GNOME Dosyalar / Dolphin icine yapistirin","conn.guide.webdav.linux.locks":"davfs2 için kilitler kapatılmalıdır. filex WebDAV kilitlerini süreç belleğinde tutar; yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar — davfs2 tersini varsayar ve takılır.","conn.guide.webdav.rclone.obscureCaption":"rclone parolayı gizlenmiş biçimde saklar — önce bunu çalıştırıp çıktısını aşağıya yapıştırın","conn.guide.webdav.rclone.passPlaceholder":"<rclone obscure çıktısı>","conn.guide.webdav.rclone.useCaption":"Kullanımı","conn.guide.webdav.duck.s1":"Yeni Yer İmi → WebDAV (HTTPS).","conn.guide.webdav.duck.s2":"Sunucu {host}, port 443.","conn.guide.webdav.duck.s3":"Yol {path}.","conn.guide.webdav.duck.s4":"Kullanıcı adı {user}, parola yukarıdaki gibi.","conn.guide.webdav.note.delete":"WebDAV üzerinden silme kalıcıdır. Web arayüzü dosyaları filex çöp kutusuna taşır; istemciden silme ise nesneyi doğrudan arka uçtan kaldırır.","conn.guide.webdav.note.locks":"Kilitler sunucu belleğinde durur: yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar. Windows ile Office’i memnun etmek için varlar, eşzamanlı düzenlemeyi hakemlemek için değil.","conn.guide.webdav.note.permissions":"Web arayüzünde ne görüyorsanız burada da onu görürsünüz. Kök yalnızca açabildiğiniz depoları listeler; yetkiniz dışındaki bir yol 403 değil 404 döner, böylece ağaç neyin var olduğunu sızdırmaz.","conn.guide.webdav.note.http":"Bu sunucuya düz http:// ile erişiliyor. Windows kimlik bilgilerinizi hiç göndermez, diğer tüm istemciler ise parolanızı açık metin olarak yollar. Bağlamadan önce filex’i TLS arkasına alın.","conn.s3keys.title":"S3 erişim anahtarları","conn.s3keys.lead":"Bir erişim anahtarı, S3 konuşan her istemcinin — rclone, restic, AWS CLI, mc, s3fs, Cyberduck — filex’e bağlanmasını sağlar. Anahtar sizin yetkinizi taşır, bir fazlasını değil.","conn.s3keys.disabled":"Bu sunucuda S3 ucu kapalı (FILEX_S3). Burada üretilen anahtar, yönetici ucu tekrar açana kadar bağlanmaz.","conn.s3keys.cannotMint":"Erişim anahtarı üretebilecek bir hesapla oturum açmış değilsiniz. Aşağıdaki talimatlar yine geçerli — bir anahtar isteyip yapıştırmanız yeter.","conn.s3keys.label":"Ne için? (dizüstü yedeği, CI, …)","conn.s3keys.defaultLabel":"erişim anahtarı","conn.s3keys.everyBucket":"Görebildiğim tüm kovalar","conn.s3keys.prefix":"Kova içindeki klasör (isteğe bağlı)","conn.s3keys.mint":"Anahtar oluştur","conn.s3keys.inheritNote":"Bir anahtar sahip olduğunuz yetkiyi yalnızca DARALTABİLİR: yetkileriniz, kiracınız, rolünüz. Anahtarı tek bir kovaya ya da klasöre kısıtlamak, bir dizüstü yedeği ile her şeyi okuyabilen bir kimlik arasındaki farktır.","conn.s3keys.once":"Gizli anahtarı şimdi kopyalayın — bir daha gösterilmeyecek.","conn.s3keys.accessKeyID":"Erişim anahtarı kimliği","conn.s3keys.secret":"Gizli anahtar","conn.s3keys.dismiss":"Kopyaladım","conn.s3keys.col.label":"Etiket","conn.s3keys.col.key":"Erişim anahtarı kimliği","conn.s3keys.col.scope":"Kapsam","conn.s3keys.col.lastUsed":"Son kullanım","conn.s3keys.scopeAll":"görebildiğiniz her şey","conn.s3keys.noLabel":"(etiketsiz)","conn.s3keys.neverUsed":"hiç","conn.s3keys.enable":"Aç","conn.s3keys.disable":"Kapat","conn.s3keys.revoke":"İptal et","conn.s3keys.confirm":"Emin misiniz?","conn.s3keys.empty":"Henüz erişim anahtarı yok.","conn.guide.s3.summary":"S3 ucu, S3 konuşan her şeyin — yedekleme, senkron araçları, SDK’lar — hedefi olarak filex’i kullanmanızı sağlar; hem de zaten sahip olduğunuz depolarla.","conn.guide.s3.keyPlaceholder":"yukarıdan bir anahtar oluşturun","conn.guide.s3.secretPlaceholder":"anahtarı oluştururken bir kez gösterilir","conn.guide.s3.fact.endpoint":"Uç adresi","conn.guide.s3.fact.endpointHint":"İstemciyi buraya yöneltin, filex’in web adresine değil.","conn.guide.s3.fact.bucket":"Kova","conn.guide.s3.fact.bucketHint":"Kova = filex deposu. Kovaları istemci değil yönetici oluşturur.","conn.guide.s3.fact.key":"Erişim anahtarı kimliği","conn.guide.s3.fact.keyHint":"Genel yarısı; her istekte gider.","conn.guide.s3.fact.secret":"Gizli anahtar","conn.guide.s3.fact.secretHint":"Yalnızca anahtar oluşturulurken bir kez gösterilir. filex bir daha gösteremez — kaybolduysa yeni anahtar üretin.","conn.guide.s3.fact.region":"Bölge","conn.guide.s3.fact.regionHint":"filex’te bölge yok; hangi değeri verirseniz aynen geri döner. Yine de istemciler bir değer ister.","conn.guide.s3.fact.addressing":"Adresleme","conn.guide.s3.fact.pathStyle":"yol tabanlı (zorunlu)","conn.guide.s3.fact.pathStyleHint":"Bu kurulumda S3’e ayrılmış bir alan adı yok, yani kova.host çözülmez.","conn.guide.s3.fact.virtualHosted":"sanal-host ya da yol tabanlı","conn.guide.s3.fact.virtualHostedHint":"Bu kurulumun kendi S3 alan adı var, iki adresleme de çalışır.","conn.guide.s3.rclone.useCaption":"Kullanımı","conn.guide.s3.rclone.mtime":"filex dosyanın değişiklik zamanını taşır (x-amz-meta-mtime); böylece rclone sync ilk turdan sonra oturur, her seferinde her şeyi yeniden yüklemez.","conn.guide.s3.aws.configureCaption":"Bir kez ayarlayın","conn.guide.s3.aws.useCaption":"Kullanımı","conn.guide.s3.aws.pathStyle":"AWS yapılandırmanıza yol tabanlı adreslemeyi ekleyin; yoksa her komut DNS aşamasında düşer.","conn.guide.s3.restic.envCaption":"Ortam değişkenleri","conn.guide.s3.restic.useCaption":"Yedekle, doğrula, buda","conn.guide.s3.restic.verified":"Bu uca karşı ölçüldü: restic check --read-data her pack’i bayt bayt okuyor ve hata bulmuyor.","conn.guide.s3.mc.aliasCaption":"Takma adı ekleyin","conn.guide.s3.mc.useCaption":"Kullanımı","conn.guide.s3.s3fs.credsCaption":"Kimlik dosyası","conn.guide.s3.s3fs.mountCaption":"Bağlayın","conn.guide.s3.s3fs.note":"s3fs üzerinden bir dosyayı düzenlemek nesnenin tamamını yeniden yazar; silme ise filex çöpüne gider. Paylaşılan bir klasör için iyi, veritabanı için değil.","conn.guide.s3.duck.s1":"Yeni yer imi → Amazon S3.","conn.guide.s3.duck.s2":"Sunucu: {host}.","conn.guide.s3.duck.s3":"Erişim anahtarı kimliği: {key}, gizli anahtar yukarıdaki.","conn.guide.s3.duck.s4":"Yer imini açın; kovalar sizin filex depolarınızdır.","conn.guide.s3.duck.pathStyle":'Tercihler → S3 altında "Use virtual host style" seçeneğini KAPATIN — bu kurulumda joker S3 alan adı yok.',"conn.guide.s3.sdk.note":"SigV4 konuşan her istemci aynı şekilde çalışır: uç adresi, anahtar, gizli anahtar ve bu kurulumun kendi S3 alan adı yoksa yol tabanlı adresleme.","conn.guide.s3.note.buckets":"Kova = filex deposu. İstemci kovanın İÇİNDE klasör ve nesne oluşturabilir, ama kovanın kendisini oluşturamaz: kova bir sürücü ve bir yol ister, bunu bir S3 isteği ifade edemez.","conn.guide.s3.note.permissions":'Anahtar tam olarak sizin gördüğünüzü görür. Açamayacağınız bir kova "yasak" değil "böyle bir kova yok" der; böylece uç, neyin var olduğunu sızdırmaz.',"conn.guide.s3.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.s3.note.mtime":"Yüklemeler değişiklik zamanını taşır; istemcinin gönderdiği sağlama toplamları (Content-MD5, x-amz-checksum-*) doğrulanır — bozulmuş bir yükleme saklanmaz, reddedilir.","conn.guide.s3.note.pathStyle":"Bu kurulumda S3’e ayrılmış alan adı yok; istemcilere yol tabanlı adresleme söylenmeli. Söylenmezse güncel bir SDK, ne filex’i ne de sebebi anan bir DNS hatasıyla düşer.","conn.guide.s3.note.http":"Bu uç düz http://. İmzalar isteği yine korur ama nesneler açık metin gider. Bir yedeği buraya yöneltmeden önce filex’i TLS arkasına alın.","conn.sshkeys.title":"SSH anahtarları","conn.sshkeys.lead":"Bir açık anahtar kaydedin; SSH konuşan her istemci — sftp, scp, WinSCP, FileZilla, rclone, sshfs — parolanızı göndermeden bağlansın.","conn.sshkeys.disabled":"Bu sunucuda SFTP ucu kapalı (FILEX_SFTP). Burada kaydedilen anahtar, yönetici ucu açana kadar bağlanmaz.","conn.sshkeys.cannotAdd":"Anahtar kaydedebilecek bir hesapla oturum açmış değilsiniz.","conn.sshkeys.paste":"~/.ssh/id_ed25519.pub dosyasının içeriğini yapıştırın","conn.sshkeys.name":"Ad (isteğe bağlı — boşsa anahtarın kendi yorumu kullanılır)","conn.sshkeys.add":"Anahtar ekle","conn.sshkeys.noCopyId":"ssh-copy-id burada çalışamaz: kabuk üzerinden ~/.ssh/authorized_keys dosyasına ekler, filex’in kabuğu yoktur. Giriş yolu bu kutudur.","conn.sshkeys.col.name":"Ad","conn.sshkeys.col.fingerprint":"Parmak izi","conn.sshkeys.col.added":"Eklendi","conn.sshkeys.col.lastUsed":"Son kullanım","conn.sshkeys.noName":"(adsız)","conn.sshkeys.neverUsed":"hiç","conn.sshkeys.enable":"Aç","conn.sshkeys.disable":"Kapat","conn.sshkeys.remove":"Sil","conn.sshkeys.confirm":"Emin misiniz?","conn.sshkeys.empty":"Henüz anahtar yok. Anahtarsız istemciler hesap parolanızla giriş yapar.","conn.guide.sftp.summary":"SFTP, filex’i SSH konuşan her şeyin erişebileceği hâle getirir: bir yedekleme işi, bir tarayıcı, WinSCP, rclone ya da bağlanmış bir klasör.","conn.guide.sftp.fact.host":"Sunucu","conn.guide.sftp.fact.hostHint":"Web uygulamasıyla aynı makine, kendine ait bir portta.","conn.guide.sftp.fact.port":"Port","conn.guide.sftp.fact.portHint":"Ne 22 ne 443: SFTP ham TCP’dir, web vekilinin içinden geçemez.","conn.guide.sftp.fact.userHint":"Kısa giriş adınız. Giriş adındaki @ işareti çoğu istemcinin ayar dosyasında tırnaklanmak zorundadır; bu alan tam da onu ortadan kaldırır.","conn.guide.sftp.fact.auth":"Giriş yöntemi","conn.guide.sftp.fact.authKey":"kayıtlı SSH anahtarınız (ya da parolanız)","conn.guide.sftp.fact.authPassword":"hesap parolanız — ya da yukarıdan bir anahtar kaydedin","conn.guide.sftp.fact.authHint":"API token da parola yerine geçer ve tek başına iptal edilebilir. İki adımlı doğrulaması açık bir hesap anahtar ya da token kullanmalıdır.","conn.guide.sftp.fact.path":"Yol","conn.guide.sftp.fact.pathHint":"İlk klasör bir depodur; kök, açabildiğiniz depoları listeler.","conn.guide.sftp.openssh.connectCaption":"Bağlan, gönder, al","conn.guide.sftp.openssh.noShell":"Burada kabuk yok, yalnız SFTP alt sistemi var. `ssh sunucu komut` bilerek reddedilir; scp çalışır çünkü OpenSSH 9 onun için de SFTP konuşur.","conn.guide.sftp.key.tab":"Anahtar kurulumu","conn.guide.sftp.key.s1":"Bağlanacak makinede bir anahtar çifti üretin (zaten varsa atlayın).","conn.guide.sftp.key.s2":"AÇIK yarısını kopyalayın — .pub dosyası, asla diğeri değil.","conn.guide.sftp.key.s3":"Yukarıdaki kutuya yapıştırıp bağlanın; o andan sonra parola gönderilmez.","conn.guide.sftp.key.genCaption":"Kendi makinenizde","conn.guide.sftp.key.noCopyId":"ssh-copy-id filex’e karşı ÇALIŞMAZ: ~/.ssh/authorized_keys dosyasına eklemek için kabuğa ihtiyacı var, filex’te kabuk yok. Anahtarı yukarıdan yapıştırın.","conn.guide.sftp.winscp.s1":"Yeni site → Dosya protokolü: SFTP.","conn.guide.sftp.winscp.s2":"Sunucu adı: {host}, port: {port}.","conn.guide.sftp.winscp.s3":"Kullanıcı adı: {user}. Anahtar için: Gelişmiş → SSH → Kimlik Doğrulama → özel anahtar dosyası.","conn.guide.sftp.winscp.s4":"WinSCP .ppk biçiminde özel anahtar ister — OpenSSH anahtarını kendi aracıyla (Araçlar → PuTTYgen) bir kez dönüştürün.","conn.guide.sftp.filezilla.s1":"Dosya → Site Yöneticisi → Yeni site, Protokol: SFTP.","conn.guide.sftp.filezilla.s2":"Sunucu: {host}, port: {port}.","conn.guide.sftp.filezilla.s3":"Kullanıcı: {user}. Giriş türü: parola için Normal, anahtar için Anahtar dosyası.","conn.guide.sftp.rclone.useCaption":"Kullanımı","conn.guide.sftp.sshfs.mountCaption":"Bağla ve çöz","conn.guide.sftp.sshfs.note":"Bağlanmış bir klasörde her kayıt dosyanın tamamını yeniden yazar. Belgeler için iyi; veritabanı ya da yerinde düzenlediğiniz bir video için değil.","conn.guide.sftp.note.storages":"Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.","conn.guide.sftp.note.permissions":"İstemcinizin çizdiği izin bitleri buradaki erişim seviyenizden gelir; yani salt-okunur görünen bir dosya sizin için gerçekten öyledir.","conn.guide.sftp.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.sftp.note.totp":"Hesabınızda iki adımlı doğrulama açıksa parola burada çalışmaz — SSH’ın kodu soracak bir kanalı yok. Bir anahtar kaydedin ya da parola yerine API token kullanın.","conn.guide.sftp.note.disabled":"Bu sunucuda SFTP ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.","conn.guide.ftps.summary":"FTPS, yalnızca FTP öğrenmiş ekipman için var: tarayıp-klasöre-atan yazıcılar, EDI muhatapları, eski laboratuvar ve endüstri yazılımları. Her zaman TLS üzerinden.","conn.guide.ftps.fact.host":"Sunucu","conn.guide.ftps.fact.hostHint":"Web uygulamasıyla aynı makine, kendine ait bir portta.","conn.guide.ftps.fact.port":"Port","conn.guide.ftps.fact.portHint":"Kontrol kanalı. Veri, aşağıdaki pasif aralıktan ayrı bir porttan akar.","conn.guide.ftps.fact.mode":"Şifreleme","conn.guide.ftps.fact.modeValue":"FTPS — açık (explicit) TLS, zorunlu","conn.guide.ftps.fact.modeHint":'Düz FTP, parola okunmadan reddedilir. "Require explicit FTP over TLS" seçin; "plain FTP" ya da "implicit" asla.',"conn.guide.ftps.fact.userHint":"Kısa giriş adınız ya da e-postanız. Parola yerine API token da geçer ve tek başına iptal edilebilir.","conn.guide.ftps.fact.passwordHint":"Hesap parolanız ya da bir API token. İki adımlı doğrulaması açık hesap token kullanmalıdır — FTP'nin kodu soracak bir yolu yok.","conn.guide.ftps.fact.pasv":"Pasif portlar","conn.guide.ftps.fact.pasvHint":"Veri bağlantıları buraya düşer. Güvenlik duvarınız bu aralığı kapatıyorsa aktarım iki tarafta da hata vermeden ASILI KALIR — FTP'nin klasik arızası budur.","conn.guide.ftps.filezilla.s1":"Dosya → Site Yöneticisi → Yeni site, Protokol: FTP.","conn.guide.ftps.filezilla.s2":"Sunucu: {host}, port: {port}.","conn.guide.ftps.filezilla.s3":'Şifreleme: "Require explicit FTP over TLS". Giriş türü: Normal, kullanıcı: {user}.',"conn.guide.ftps.filezilla.s4":"Aktarım ayarları → Pasif. Bu sunucu aktif modu reddeder.","conn.guide.ftps.winscp.s1":"Yeni site → Dosya protokolü: FTP, Şifreleme: TLS/SSL Explicit encryption.","conn.guide.ftps.winscp.s2":"Sunucu adı: {host}, port: {port}.","conn.guide.ftps.winscp.s3":"Kullanıcı adı: {user}, parola yukarıdaki.","conn.guide.ftps.curl.caption":"Gönder ve al","conn.guide.ftps.curl.sslReqd":"--ssl-reqd isteğe bağlı değil: curl'ün düz metne geri düşmek yerine TLS'i ZORUNLU kılmasını sağlar. Bu sunucu zaten düz metni reddediyor, ama alışkanlık sizi reddetmeyen sunuculara karşı korur.","conn.guide.ftps.lftp.caption":"Bağlan","conn.guide.ftps.lftp.protectData":"ssl-protect-data yalnız girişi değil DOSYAYI da şifreler. Olmazsa lftp TLS ile giriş yapar ve dosyayı açık metin gönderir — sahada en sık yapılan FTPS yanlışı budur.","conn.guide.ftps.rclone.useCaption":"Kullanımı","conn.guide.ftps.printer.tab":"Tarayıcı / yazıcı","conn.guide.ftps.printer.s1":"Cihazın tara-ve-FTP'ye-gönder ayarlarında: sunucu {host}, port {port}.","conn.guide.ftps.printer.s2":"Kullanıcı: {user}, parola yukarıdaki. Cihaz için kendi parolanız yerine bir API token üretin — başka hiçbir şeyi değiştirmeden iptal edilebilir.","conn.guide.ftps.printer.s3":"Yol: {path} — ya da önceden oluşturduğunuz bir alt klasör. Cihaz depo oluşturamaz.","conn.guide.ftps.printer.s4":'"SSL/TLS" ya da "FTPS explicit" seçeneğini AÇIN ve PASİF modu seçin.',"conn.guide.ftps.printer.noTLS":"Tara-ve-gönder yazılımlarının önemli bir kısmı TLS konuşamıyor. Bu sunucu öyle bir cihazla konuşmayacak ve bu bilinçli: alternatifi, belgelerinizin ve parolanızın ofis ağında açık metin dolaşması.","conn.guide.ftps.note.tls":"TLS zorunludur ve kapatan bir düğme yoktur. Düz FTP parolanızı açık metin gönderir, ardından dosyanızı da.","conn.guide.ftps.note.passive":"Yalnızca pasif mod. Aktif modda sunucu istemciyi geri arar; bu NAT arkasında çalışmaz ve çoğu güvenlik duvarı tarafından engellenir.","conn.guide.ftps.note.storages":"Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.","conn.guide.ftps.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.ftps.note.prefer":"İstemci SFTP konuşabiliyorsa onu tercih edin: tek bağlantı, tek port, pasif mod sürprizi yok.","conn.guide.ftps.note.selfSigned":"Bu sunucu kendinden imzalı bir sertifika kullanıyor. Kanalı şifreler ama karşı tarafın kim olduğunu kanıtlamaz; çoğu istemci bir kez onay ister. Önemli bir iş için gerçek sertifika koyun.","conn.guide.ftps.note.disabled":"Bu sunucuda FTPS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.","conn.nfs.title":"NFS export'ları","conn.nfs.lead":"Bir export, ağınızdaki bir makinenin filex'i sürücü olarak bağlamasını sağlar — medya oynatıcı, derleme sunucusu, yedek kutusu.","conn.nfs.pathIsSecret":"⚠ Export yolu PAROLANIN TA KENDİSİDİR. NFS, Kerberos olmadan istemciye kim olduğunu soramaz; bu yüzden filex yola 32 rastgele bayt koyar: yolu bilen sizin adınıza bağlanır. Bağlama satırını bir kimlik bilgisi gibi saklayın — /etc/fstab çoğu sistemde herkes tarafından okunabilir.","conn.nfs.disabled":"Bu sunucuda NFS ucu kapalı (FILEX_NFS). Burada oluşturulan export, yönetici ucu açana kadar bağlanmaz.","conn.nfs.cannotMint":"Export oluşturabilecek bir hesapla oturum açmış değilsiniz.","conn.nfs.label":"Ne için? (medya oynatıcı, yedek kutusu, …)","conn.nfs.defaultLabel":"nfs export","conn.nfs.everyStorage":"Görebildiğim tüm depolar","conn.nfs.prefix":"Depo içindeki klasör (isteğe bağlı)","conn.nfs.allowCidrs":"İzinli adresler, örn. 192.168.1.0/24 (isteğe bağlı)","conn.nfs.readOnly":"Salt okunur","conn.nfs.readOnlyHint":"Bir makine için güvenli varsayılan salt okunurdur: sizin yetkiniz ne olursa olsun bu bağlantı üzerinden her yazmayı reddeder. Adres listesi daha da daraltır — listenin dışından gelen bağlanamaz.","conn.nfs.mint":"Export oluştur","conn.nfs.once":"Şimdi kopyalayın — yol yalnızca bir kez gösterilir ve geri alınamaz.","conn.nfs.dismiss":"Kopyaladım","conn.nfs.col.label":"Etiket","conn.nfs.col.scope":"Kapsam","conn.nfs.col.mode":"Mod","conn.nfs.col.lastUsed":"Son bağlanma","conn.nfs.scopeAll":"görebildiğiniz her şey","conn.nfs.modeRead":"salt okunur","conn.nfs.modeWrite":"okuma/yazma","conn.nfs.noLabel":"(etiketsiz)","conn.nfs.neverUsed":"hiç","conn.nfs.enable":"Aç","conn.nfs.disable":"Kapat","conn.nfs.revoke":"İptal et","conn.nfs.confirm":"Emin misiniz?","conn.nfs.empty":"Henüz export yok.","conn.guide.nfs.summary":"NFS, filex'i kendi ağınızdaki bir makinede sürücü olarak bağlar — NAS protokolü, onu bekleyen cihazlar için.","conn.guide.nfs.pathPlaceholder":"yukarıdan bir export oluşturun","conn.guide.nfs.fact.host":"Sunucu","conn.guide.nfs.fact.hostHint":"Web uygulamasıyla aynı makine, kendine ait bir portta.","conn.guide.nfs.fact.port":"Port","conn.guide.nfs.fact.portHint":"Hem port= hem mountport= buna ayarlanmalı; filex mount ve NFS servislerini tek portta veriyor.","conn.guide.nfs.fact.export":"Export yolu","conn.guide.nfs.fact.exportHint":"Kimlik bilgisi budur. Export oluşturulurken bir kez gösterilir ve hash'li saklanır — filex bir daha gösteremez.","conn.guide.nfs.fact.options":"Bağlama seçenekleri","conn.guide.nfs.fact.optionsHint":"nolock, çünkü filex NFS kilit yöneticisini çalıştırmıyor; nfsvers=3, çünkü bu sunucunun konuştuğu sürüm bu.","conn.guide.nfs.linux.mountCaption":"Bağla","conn.guide.nfs.linux.fstabSecret":"Bu yolu içeren bir /etc/fstab satırı, herkesin okuyabildiği bir dosyadaki paroladır. Ortamınızda önemliyse kimlik korumalı automount kullanın ya da bağlamayı yalnız root'un okuyabildiği bir unit dosyasında tutun.","conn.guide.nfs.mac.mountCaption":"Bağla","conn.guide.nfs.mac.resvport":"macOS resvport ister: istemcisi ayrıcalıklı bir kaynak portta ısrar eder ve olmadan bağlantıyı reddeder.","conn.guide.nfs.win.s1":`Windows Özellikleri'nden "Services for NFS" → "Client for NFS" bileşenini açın (yalnız Pro ve Enterprise; Home'da yok).`,"conn.guide.nfs.win.s2":"Komut İstemi'ni yönetici olarak açın.","conn.guide.nfs.win.s3":"Aşağıdaki komutla export'u bir sürücü harfine bağlayın.","conn.guide.nfs.win.cmdCaption":"Z: sürücüsüne bağla","conn.guide.nfs.win.port":"Windows'un mount servisinin portunu söyleme imkânı yok; yalnızca standart 2049 portundaki bir NFS sunucusuna erişebilir. Bu sunucu başka bir porttaysa SFTP'yi ya da filex masaüstü uygulamasını kullanın.","conn.guide.nfs.nas.tab":"NAS / medya oynatıcı","conn.guide.nfs.nas.s1":"Cihazın NFS ayarlarında: sunucu {host}, port {port} (ayrı ayrı soruyorsa hem NFS hem mount portunu ayarlayın).","conn.guide.nfs.nas.s2":"Uzak yol: yukarıdaki export yolu, birebir.","conn.guide.nfs.nas.s3":"NFS sürüm 3, kilitleme kapalı. Cihazın gerçekten yazması gerekmiyorsa export'u salt okunur oluşturun.","conn.guide.nfs.note.unencrypted":"NFSv3 şifreli değildir. Trafiği okuyabilen dosyalarınızı görür, yolu öğrenen bağlanabilir. Ev/ofis ağında ya da VPN üzerinden kullanın — internet üzerinden asla.","conn.guide.nfs.note.pathIsSecret":"Export yolu kimlik bilgisinin tamamıdır. Sızarsa yukarıdaki listeden iptal edin; değiştirilecek başka bir şey yok.","conn.guide.nfs.note.noPortmapper":"111 portunda portmapper yok; portu söylenmeyen istemci sunucuyu bulamaz. Buradaki her komutun port= ve mountport= taşımasının sebebi bu.","conn.guide.nfs.note.uid":"İstemcinizin gönderdiği kullanıcı ve grup kimlikleri yok sayılır: bağlantı zaten kime ait olduğunu biliyor. Gördüğünüz izinler filex'teki erişiminizden gelir.","conn.guide.nfs.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.nfs.note.revoke":"İptal anında değil, bir sonraki istekte etkili olur: NFS'te sonlandırılacak bir oturum yok, bağlantısı açık olan istemci sıradaki işleminde hata alır.","conn.guide.nfs.note.disabled":"Bu sunucuda NFS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.","conn.tokens.title":"API jetonları","conn.tokens.lead":"FTPS, WebDAV ve filex mount hesap parolanız yerine bir jetonla giriş yapar. Buradan üretin — tek başına iptal edilebilir, ayrıca iki adımlı doğrulaması açık bir hesap bunlarda parolasını zaten kullanamaz.","conn.tokens.mint":"Jeton oluştur","conn.tokens.once":"Şimdi kopyalayın — yalnızca bir kez gösterilir. Sunucuda yalnız özeti saklandığı için bir daha gösterilemez.","conn.tokens.dismiss":"Kopyaladım","conn.tokens.cannotMint":"Bu oturum jeton üretemiyor. Kendi hesabınızla giriş yapıp oluşturun.","conn.tokens.empty":"Henüz jeton yok.","conn.tokens.neverUsed":"hiç","conn.tokens.revoke":"İptal et","conn.tokens.confirm":"Emin misin?","conn.tokens.col.label":"Ad","conn.tokens.col.scopes":"Yetkisi","conn.tokens.col.used":"Son kullanım","conn.tokens.revokeHint":"İptal, yalnız bir sonraki girişi değil AÇIK bağlantıyı da durdurur: SFTP ya da FTPS oturumu kesilir, bağlı bir sürücü yarım dakika içinde çalışmayı bırakır.","conn.guide.mount.summary":"filex mount, uzaktaki bir filex sunucusunu bu makinede bir klasöre bağlar — tarayıcının kullandığı aynı HTTPS üzerinden. Buradakilerin her yerden çalışan tek yöntemi: yerel ağ da gerekmez, ek sunucu da, üçüncü parti bir istemci de.","conn.guide.mount.fact.url":"Sunucu adresi","conn.guide.mount.fact.urlHint":"Tarayıcıda kullandığınız adresin aynısı. Başka hiçbir şeye erişilebilir olması gerekmez.","conn.guide.mount.fact.token":"API jetonu","conn.guide.mount.fact.tokenPlaceholder":"Jetonlar bölümünden oluşturun","conn.guide.mount.fact.tokenHint":"Parolanız değil, jeton — tek başına iptal edilebilir, ayrıca 2FA açık bir hesap burada parolasını zaten kullanamaz.","conn.guide.mount.fact.remote":"Neyi bağlayacağınız","conn.guide.mount.fact.remoteHint":"--remote vermezseniz her depo bir klasör olarak görünür; tek bir depoyu — ya da onun içindeki bir klasörü — adlandırırsanız yalnızca o bağlanır.","conn.guide.mount.linux.mountCaption":"Bağlayın","conn.guide.mount.linux.umountCaption":"Ayırın","conn.guide.mount.linux.umountWarn":"Süreci öldürerek değil, fusermount ile ayırın. Ayrılmadan ölen bir bağlantı, birileri elle fusermount çalıştırana kadar her ls komutunun asılı kaldığı bir klasör bırakır.","conn.guide.mount.linux.systemdCaption":"Girişte otomatik bağlansın (systemd kullanıcı birimi)","conn.guide.mount.win.winfsp":"Windows'ta bir kez WinFsp kurulması gerekiyor — ücretsiz ve açık kaynak: https://winfsp.dev. Başka bir şey gerekmiyor, sonrasında yönetici hakkı da istemiyor.","conn.guide.mount.win.mountCaption":"Sürücü olarak bağlayın","conn.guide.mount.win.freeLetter":"BOŞ bir sürücü harfi seçin. Harf bağlama sırasında oluşturulur, var olan bir şeye eklenmez; kullanımdaki bir harfi verirseniz bunu söylemeyen bir hatayla başarısız olur.","conn.guide.mount.win.stop":"O pencerede Ctrl-C ile durdurun. Sürücü kaybolur ve bu makinede hiçbir şey kalmaz.","conn.guide.mount.mac.unsupported":"filex mount macOS'ta çalışmıyor. macFUSE gerekiyor; lisansı filex gibi bir programın onu sizin yerinize kurmasına izin vermiyor ve Go bağlaması filex'in bilinçli olarak kullanmadığı bir C derleyicisi istiyor. Komut burada çalışıyormuş gibi görünüp hiçbir şey yapmak yerine açıkça reddediyor.","conn.guide.mount.mac.alternatives":"macOS'ta filex masaüstü uygulamasını klasör senkronuyla kullanın (dosyalar diskte durur) ya da sürücü bağlayabilen bir istemciyle SFTP.","conn.guide.mount.note.notASync":"Bu bir senkronizasyon değildir. Küçük bir okuma önbelleği dışında bu makineye hiçbir şey kopyalanmaz; yüz bin dosyanın içinden birini gerisini indirmeden açar. Dosyaları çevrimdışıyken istiyorsanız klasör senkronunu kullanın.","conn.guide.mount.note.reachable":"Sunucuya, tarayıcının geçtiği hangi vekil ya da tünel varsa oradan ulaşır — çünkü altında aynı API vardır. İzinleriniz, depolarınız ve çok kiracılı bir sunucuda kiracınız da birlikte gelir.","conn.guide.mount.note.wholeFileWrites":"Bağlantı üzerinden yazdığınız dosya, yazılırken değil, program onu kapattığında yüklenir. Çok büyük bir dosyayı yerinde düzenlemek burada yerel diskten yavaştır; içeri ve dışarı kopyalamak değildir.","conn.guide.mount.note.trash":"Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.mount.note.revoke":"Bir bağlantıyı durdurmak için jetonu iptal edin. Bağlantı hâlâ takılı olsa bile yarım dakika içinde hizmet vermeyi bırakır.","storages.driver.ftp":"FTP / FTPS","storages.driver.local":"Yerel dosya sistemi","storages.driver.s3":"S3 / Hetzner / MinIO","storages.driver.sftp":"SFTP","storages.driver.smb":"SMB / CIFS (NAS)","storages.driver.webdav":"WebDAV","storages.fieldHelp.smbShare":"Sunucu adı olmadan yalnızca paylaşım adı: `\\\\nas\\media` değil, `media`.","storages.fieldHelp.smbDomain":"Yalnızca Windows etki alanı hesabı için. NAS kullanıyorsanız boş bırakın.","storages.fieldHelp.smbRoot":"Paylaşımın içindeki alt klasör. Paylaşımın tamamı için boş bırakın.","storages.fields.share":"Paylaşım","storages.fields.domain":"Etki alanı / çalışma grubu","storages.fields.dialTimeout":"Bağlanma zaman aşımı (saniye)","storages.fieldHelp.disablePresign":"Depo, SDK'nın imzaladığı URL'leri reddediyorsa açın (Ceph RGW / bazı Hetzner kurulumları SignatureDoesNotMatch döner); yüklemeler o zaman arka uç üzerinden akar.","storages.fieldHelp.endpoint":"AWS S3 için boş bırakın. S3 uyumlu diğer tüm depolar kendi endpoint'ini ister.","storages.fieldHelp.hostKey":"authorized_keys / known_hosts satır biçiminde tek bir açık anahtar.","storages.fieldHelp.insecureSkipHostKey":"Her sunucu anahtarını kabul eder. Yalnızca geçici sunucular için.","storages.fieldHelp.keyPath":"Sunucudaki anahtar dosyasının yolu; depo başlarken okunur. PEM alanı boşken kullanılır.","storages.fieldHelp.knownHosts":"Katı sunucu anahtarı denetimi için OpenSSH known_hosts yolu. Varsayılan, ~/.filex/known_hosts içinde ilk bağlantıda güven.","storages.fieldHelp.passive":"Kapatmak aktif moda geçirir; bu, sunucunun bu makineye geri bağlanmasını gerektirir.","storages.fieldHelp.path":"Sunucudaki dizin. Yoksa oluşturulur; filex asla / dizinini mount etmez.","storages.fieldHelp.pathStyle":"AWS dışındaki tüm depolarda açık olmalı. Endpoint girildiyse ve bu alana hiç dokunulmadıysa kendiliğinden açılır.","storages.fieldHelp.prefix":"Bucket içindeki alt klasör. Zorunlu: filex bucket kökünün sahipliğini asla almaz.","storages.fieldHelp.region":'Boş bırakılırsa "auto" kullanılır.',"storages.fieldHelp.root":"Arka uçtaki alt klasör. Zorunlu: filex hesabın kökünü asla mount etmez.","storages.fieldHelp.sftpAuth":"Parola ya da özel anahtardan biri zorunludur.","storages.fieldHelp.tls":"Düz FTP kimlik bilgilerini açık metin gönderir — sunucu destekliyorsa açın.","storages.fields.accessKey":"Access key","storages.fields.basePath":"Temel yol","storages.fields.bucket":"Bucket","storages.fields.disablePresign":"İmzalı URL'leri kapat","storages.fields.endpoint":"Endpoint","storages.fields.host":"Sunucu","storages.fields.hostKey":"Sabitlenmiş sunucu anahtarı","storages.fields.insecureSkipHostKey":"Sunucu anahtarı doğrulamasını atla (güvensiz)","storages.fields.keyPath":"Özel anahtar dosyası","storages.fields.knownHosts":"known_hosts dosyası","storages.fields.name":"Görünen isim","storages.fields.namePlaceholder":"Kişisel fotoğraflar","storages.fields.passive":"Pasif mod (PASV)","storages.fields.password":"Parola","storages.fields.path":"Dizin yolu","storages.fields.pathStyle":"Path-style URL kullan (Hetzner, MinIO)","storages.fields.port":"Port","storages.fields.prefix":"Önek (prefix)","storages.fields.privateKey":"Özel anahtar (PEM)","storages.fields.rbac":"Öğe bazlı erişim denetimi (RBAC)","storages.fields.rbacHint":"Açıkken admin olmayanlar yalnızca izin panelinden kendilerine verilen dosya/klasörleri görür. Kapalıyken depo tüm kullanıcılara açıktır (yetki role göre).","storages.fields.readOnly":"Salt okunur mount","storages.fields.region":"Bölge","storages.fields.root":"Temel yol","storages.fields.secretKey":"Secret key","storages.fields.tls":"FTPS (açık AUTH TLS)","storages.fields.url":"Temel URL","storages.fields.user":"Kullanıcı"},Wf={"toolbar.new_folder":"New Folder","toolbar.upload":"Upload","toolbar.search":"Search","toolbar.search.placeholder":"File name…","toolbar.view.list":"List","toolbar.view.grid":"Grid","toolbar.refresh":"Refresh","toolbar.go_up":"Up one level","ctx.open":"Open","ctx.preview":"Preview","ctx.download":"Download","ctx.convert":"Convert","ctx.rename":"Rename","ctx.delete":"Delete","ctx.delete_perm":"Delete Permanently","ctx.restore":"Restore","ctx.share":"Share","ctx.move":"Move","ctx.copy":"Copy","ctx.cut":"Cut","ctx.show_hidden":"Show hidden files","ctx.hide_hidden":"Hide hidden files","ctx.keep_local":"Keep on this computer","ctx.keep_online":"Keep online only","ctx.keep_reveal":"Open local folder","ctx.keep_inherited":"Kept on this computer with its parent","keep.started":"Will be kept on this computer — sync started","keep.failed":"Could not keep on this computer","keep.badge_kept":"On this computer","keep.badge_syncing":"Syncing…","keep.badge_cloud":"Online only","keep.badge_partial":"Contains items kept on this computer","keep.strip_transfer":"Syncing {name} — {done}/{total} ({pct}%)","keep.strip_inventory":"Syncing {name} — scanning the server…","keep.strip_settling":"Syncing {name} — settling…","ctx.paste":"Paste","ctx.info":"Info","ctx.duplicate":"Duplicate","ctx.new_file":"New File","modal.delete.title":"Delete?","modal.delete.message":"{count} item(s) will be moved to trash.","modal.delete.confirm":"Move to Trash","modal.delete.cancel":"Cancel","modal.rename.title":"Rename","modal.rename.save":"Save","modal.rename.cancel":"Cancel","modal.newfolder.title":"New Folder","modal.newfolder.placeholder":"Folder name","modal.newfolder.create":"Create","modal.newfolder.cancel":"Cancel","modal.share.title":"Share Link","modal.share.pin":"PIN protected","modal.share.expires":"Expires at","modal.share.max_downloads":"Download limit","modal.share.create":"Share","modal.share.cancel":"Cancel","modal.share.close":"Close","modal.share.limit_applied":"(server limit applied)","modal.share.copy":"Copy","modal.share.url_copied":"Link copied","modal.share.pin_copied":"PIN copied","modal.share.cli_copied":"CLI command copied","upload.progress":"Uploading","upload.done":"Done","upload.error":"Error","upload.failed":"Could not upload “{name}”","upload.aborted":"Aborted","upload.cancel":"Cancel","upload.resuming":"Resuming “{name}” from {percent}%","upload.committing":"Finishing","upload.transferring":"Moving to storage","empty.folder":"This folder is empty","empty.search":"No results",loading:"Loading…","notFound.title":"Folder not found","notFound.desc":"This folder does not exist, was moved, or you do not have access to it.","notFound.goRoot":"Go to root folder","col.name":"Name","col.size":"Size","col.modified":"Modified","col.type":"Type","unit.bytes":"B","unit.kb":"KB","unit.mb":"MB","unit.gb":"GB","unit.tb":"TB","breadcrumb.root":"Root","breadcrumb.copy_path":"Copy Path","breadcrumb.go_to_path":"Go To Path","breadcrumb.path_placeholder":"fileman/foo/bar","ops.copy":"Copying","ops.move":"Moving","ops.delete":"Deleting","ops.queued":"queued","ops.done":"done","ops.error":"error","node.trash":"Trash","viewer.open_in_new_tab":"Open in New Tab","viewer.loading":"Loading…","viewer.failed_to_load":"Failed to load file","viewer.peer_not_installed":"Optional viewer library is not installed. Install the peer dependency or use the download button.","viewer.format_unsupported_3d":"This 3D format is not supported in the browser preview (model-viewer only reads .glb / .gltf / .usdz). Please download and open with a local tool.","viewer.zoom_in":"Zoom in","viewer.zoom_out":"Zoom out","viewer.fit_width":"Fit width","viewer.next_page":"Next page","viewer.prev_page":"Previous page","viewer.page_n_of_m":"Page {n} of {m}","viewer.tags":"Tags","viewer.layers":"Layers","viewer.toc":"Contents","viewer.font_smaller":"Smaller text","viewer.font_larger":"Larger text","viewer.search":"Search","viewer.download":"Download","viewer.saving":"Saving…","viewer.save":"Save (Ctrl+S)","viewer.saved":"Saved","viewer.save_error":"Error","viewer.editor_loading":"Loading editor…","viewer.no_preview":"No preview for this file type yet.","viewer.edit":"Edit","viewer.close":"Close","presence.expand":"Show names","presence.collapse":"Collapse","viewer.save_annotations":"Save annotations","viewer.annotations_on":"Annotations: on","viewer.annotations_off":"Annotations: off","viewer.read_only":"Read only","viewer.csv_first_row_header":"First row as header","viewer.csv_filter":"Filter rows…","viewer.epub_prev":"Previous","viewer.epub_next":"Next","viewer.drawio.disabled":"diagrams.net embed is not configured for this filex instance — operator must wire FILEX_DRAWIO_URL to enable the editor.","viewer.archive.entries":"{n} files","viewer.archive.empty":"Archive is empty.","viewer.archive.error":"Could not read archive contents.","viewer.name":"Name","viewer.size":"Size","col.sort":"Sort","group.today":"Today","group.yesterday":"Yesterday","group.this_week":"This Week","group.this_month":"This Month","group.no_date":"No date","toolbar.density.compact":"Compact view","toolbar.density.comfortable":"Comfortable view","palette.placeholder":"Search files, folders or commands…","palette.files":"Files","palette.commands":"Commands","palette.goto":"Go to path","palette.empty":"No results","palette.hint":"↑↓ navigate · Enter select · Esc close","cmd.view_toggle":"Toggle view (list ⇄ grid)","cmd.trash":"Open trash","shortcuts.title":"Keyboard Shortcuts","shortcuts.group.nav":"Navigation","shortcuts.group.selection":"Selection","shortcuts.group.file":"File operations","shortcuts.palette":"Command palette","shortcuts.search":"Focus search","shortcuts.go_up":"Go up one level","shortcuts.open":"Open selected item","shortcuts.close":"Close / cancel","shortcuts.toggle_hidden":"Show/hide hidden files","shortcuts.help":"This help dialog","shortcuts.select_all":"Select all","shortcuts.rename":"Rename","shortcuts.delete":"Delete","shortcuts.cut":"Cut","shortcuts.copy":"Copy","shortcuts.paste":"Paste","breadcrumb.more":"Hidden folders","empty.hint":"Drag and drop files here","empty.upload":"Upload files","empty.search.title":"No files match your search","empty.search.hint":"Try a different search term","empty.trash.title":"Trash is empty","error.title":"Could not load this folder","error.retry":"Try again","toast.undo":"Undo","toast.undone":"Undone","toast.undo_failed":"Could not undo","toast.renamed":"Renamed","toast.moved":"Moved","toast.trashed":"Moved to trash","conn.offline":"No live connection — changes may be delayed","conn.tooltip":"Live connection to the server is unavailable; the list refreshes periodically. This notice disappears once the connection is back.","palette.everywhere":"Everywhere","palette.searching":"Searching…","palette.saved":"Saved searches","palette.save":"Save search","palette.saved.delete":"Delete saved search","search.in_content":"In content","toolbar.more":"More actions","toolbar.search.close":"Close search","sheet.menu":"Actions","sheet.close":"Close","toolbar.inspector":"Details","ctx.details":"Details","shortcuts.inspector":"Toggle details panel","inspector.title":"Details","inspector.close":"Close","inspector.section.general":"General","inspector.section.versions":"Versions","inspector.section.permissions":"Permissions","inspector.section.shares":"Shares","inspector.path":"Path","inspector.size":"Size","inspector.modified":"Modified","inspector.mime":"MIME type","inspector.etag":"ETag","inspector.copy":"Copy","inspector.copied":"Copied","inspector.error":"Could not load","inspector.items_summary":"{n} items, {size} total","inspector.folder_items":"{n} items","inspector.versions.empty":"No version history","inspector.versions.v":"Version {n}","inspector.versions.restore":"Restore","inspector.versions.restore_confirm":"Restore this version?","inspector.versions.snapshot_current":"Snapshot the current state first","inspector.versions.confirm":"Confirm","inspector.versions.cancel":"Cancel","inspector.versions.take_snapshot":"Snapshot current state","inspector.versions.restored":"Version restored","inspector.versions.snapshotted":"Snapshot taken","inspector.versions.unsupported":"The server does not support this operation","inspector.perm.none":"No access","inspector.perm.viewer":"Viewer","inspector.perm.editor":"Editor","inspector.perm.owner":"Owner","inspector.perm.manage":"Manage permissions","inspector.shares.empty":"No share links","inspector.shares.copy":"Copy link","theme.menu":"Theme","theme.title":"Theme Gallery","theme.hint":"A theme only changes the colour palette — day or night is the choice above.","theme.mode.label":"Appearance","theme.mode.light":"Day","theme.mode.dark":"Night","theme.mode.auto":"Automatic","theme.reset":"Reset to default","theme.close":"Close","theme.selected":"Selected","theme.name.default":"Default","theme.name.night":"Night Blue","theme.name.forest":"Forest","theme.name.amber":"Amber","theme.name.lilac":"Lilac","theme.name.contrast":"High Contrast","theme.name.gray":"Soft Gray","theme.name.terminal":"Terminal Green","shortcuts.quicklook":"Quick look","shortcuts.customize":"Customize","shortcuts.settings.menu":"Shortcuts","shortcuts.settings.title":"Shortcut Settings","shortcuts.settings.hint":'To remap a shortcut, press "Change" and then the new key combination. Changes are stored in this browser only.',"shortcuts.settings.change":"Change","shortcuts.settings.capture":"Press keys… (Esc cancels)","shortcuts.settings.reset":"Reset to default","shortcuts.settings.reset_all":"Reset all","shortcuts.settings.unbound":"Not set","shortcuts.settings.fixed":"Fixed","shortcuts.settings.customized":"Customized","shortcuts.settings.conflict":'is already used by "{name}".',"shortcuts.settings.conflict_fixed":'is reserved by the fixed shortcut "{name}" — it cannot be used.',"shortcuts.settings.conflict_take":"Unassign old and use here","shortcuts.settings.conflict_cancel":"Cancel","quicklook.hint_close":"close","quicklook.hint_nav":"previous/next","quicklook.hint_open":"open","opc.title":"Operations","opc.aria_badge":"{n} operations — toggle operations center","opc.close":"Close","opc.active":"In progress","opc.history":"History","opc.clear":"Clear","opc.empty":"No operations","opc.cancel":"Cancel","opc.retry":"Retry","opc.dismiss":"Dismiss","opc.queued":"Queued","opc.percent":"{n}%","opc.status.running":"In progress","opc.status.done":"Done","opc.status.error":"Failed","opc.status.aborted":"Cancelled","opc.kind.upload":"Upload","opc.kind.copy":"Copy","opc.kind.move":"Move","opc.kind.delete":"Delete","opc.kind.convert":"Convert","opc.kind.archive":"Archive","tour.aria":"Onboarding tour","tour.restart":"Restart the tour","tour.skip":"Skip tour","tour.back":"Back","tour.next":"Next","tour.done":"Done","tour.progress":"{n} / {m}","tour.step.nav.title":"Storages & folders","tour.step.nav.desc":"Your current location lives here. Click any crumb to jump back to parent folders or the storage root.","tour.step.upload.title":"Upload files","tour.step.upload.desc":"Pick files with this button — or simply drag & drop them anywhere in the window.","tour.step.search.title":"Search","tour.step.search.desc":"This box filters the current folder. The Ctrl+K command palette searches across all storages and runs commands.","tour.step.view.title":"Switch views","tour.step.view.desc":"Toggle between the list and grid layout; your choice is remembered.","tour.step.share.title":"Sharing","tour.step.share.desc":'Right-click any file and use "Share / Permissions" to create a link with an optional PIN and expiry.',"tour.step.help.title":"Shortcuts","tour.step.help.desc":'Press ? for the shortcut cheat-sheet and Ctrl+K for the command palette. Replay this tour any time via "Restart the tour" in the menu.',"error.hint":"This may be a temporary network or server problem. Please try again.","error.details":"Technical details","col.star":"Star","toolbar.view_label":"View","list.aria":"File list","grid.aria":"File grid","tabs.strip":"Tabs","tabs.new":"New tab","tabs.close":"Close tab","tabs.split":"Split view","tabs.split_off":"Close split","ctx.open_new_tab":"Open in new tab","shortcuts.group.tabs":"Tabs","shortcuts.tab_new":"New tab","shortcuts.tab_close":"Close tab","shortcuts.tab_next":"Next tab","shortcuts.tab_prev":"Previous tab","cmd.tab_new":"Open a new tab","cmd.split_toggle":"Toggle split view","split.pane":"Secondary pane","split.close":"Close the side pane","split.error":"Could not load the listing","split.retry":"Retry","split.copy_queued":"Copy queued","split.cross_copy":"Different storages — copy queued instead","dragout.downloading":"Downloading into the folder you dropped on…","dragout.not_found":"Could not find where it was dropped — a drop onto an application (rather than a folder) cannot be filled in","dragout.done":"Download finished","dragout.ready":"Files are ready — drag them to your desktop","dragout.preparing":"Getting them ready to drag…","split.cross_move":"Different storages — move queued (bytes travel, then the original is removed)","toolbar.view.gallery":"Gallery","gallery.aria":"File gallery","inspector.section.comments":"Comments","inspector.comments.empty":"No comments yet.","inspector.comments.placeholder":"Write a comment…","inspector.comments.send":"Send","inspector.comments.delete":"Delete comment","e2e.create.title":"Create encrypted folder","e2e.create.option":"Create encrypted folder…","e2e.create.pw_placeholder":"Folder password (min 8 characters)","e2e.create.pw2_placeholder":"Repeat the password","e2e.create.warn_title":"NO WAY BACK","e2e.create.warn_body":"Files open ONLY with this password. The password is NEVER stored on the server; if you forget it the content is lost forever. There is no recovery — not even an admin can open it.","e2e.create.ack":"I understand: if I lose the password my data cannot be recovered.","e2e.create.ack_required":"Please confirm the warning to continue.","e2e.create.pw_short":"Password must be at least 8 characters.","e2e.create.pw_mismatch":"Passwords do not match.","e2e.create.bad_name":"Invalid folder name.","e2e.create.create":"Create encrypted folder","e2e.create.busy":"Creating…","e2e.create.done":"Encrypted folder created","e2e.create.failed":"Could not create the encrypted folder","e2e.create.nested":"You cannot create an encrypted folder inside another one.","e2e.locked.title":"This folder is end-to-end encrypted","e2e.locked.hint":"Enter the folder password to see its contents. The password stays in this tab’s memory only.","e2e.locked.pw_placeholder":"Folder password","e2e.locked.unlock":"Unlock","e2e.locked.busy":"Verifying…","e2e.unlock.wrong":"Wrong password.","e2e.unlock.marker_missing":"Could not read the key file (.filex-e2e.json).","e2e.strip.label":"Encrypted folder — unlocked","e2e.strip.lock":"Lock","e2e.locked_toast":"Folder locked","e2e.upload.too_big":"Files over 200 MB cannot be uploaded to an encrypted folder (MVP limit)","e2e.upload.locked":"Unlock the folder first","e2e.decrypting":"Decrypting…","e2e.decrypt_failed":"Could not decrypt the file (password changed or file corrupted).","e2e.download.failed":"Could not download the encrypted file.","conn.title":"Storage connections","conn.subtitle":"Connect {host} to a backend, or connect your computer to {host}.","conn.close":"Close","conn.tab.storages":"Storages","conn.tab.connect":"How to connect","conn.loading":"Loading…","conn.visibleOnly":"you can browse this one","conn.denied.title":"Only an administrator can add storages here","conn.denied.none":"Your account may browse files but not change what this server is connected to. Ask an administrator of this server to add or edit a storage.","conn.denied.anonymous":"You are not signed in on this server.","conn.denied.unreachable":"The server did not answer: {error}","conn.denied.guideHint":"You do not need administrator rights to connect your own computer to the storages you can already see.","conn.denied.guideCta":"Show me how to connect","conn.list.count":"{n} storage(s)","conn.list.add":"Add a storage","conn.list.empty":"No storage is configured yet. Add one and the files show up in the explorer.","conn.list.edit":"Edit","conn.list.remove":"Remove","conn.list.confirm":"Really remove?","conn.list.readOnly":"read-only","conn.list.disabled":"disabled","conn.form.newTitle":"New storage","conn.form.editTitle":"Edit “{name}”","conn.form.name":"Display name","conn.form.namePlaceholder":"photos","conn.form.nameHelp":"What this storage is called everywhere: in the explorer, in paths (name://folder) and in WebDAV URLs.","conn.form.driver":"Type","conn.form.driverLocked":"A storage's type cannot change after it is created — the paths already point at it.","conn.form.readOnly":"Read-only (nothing may be written to this storage)","conn.form.enabled":"Enabled","conn.form.test":"Test connection","conn.form.testing":"Testing…","conn.form.testOk":"Connected. {count} item(s) at the root.","conn.form.testFail":"Could not connect: {error}","conn.form.save":"Save","conn.form.saving":"Saving…","conn.form.cancel":"Cancel","conn.form.nameRequired":"Give the storage a name.","conn.form.fillRequired":"Fill in the fields marked with *.","conn.form.required":"Required","conn.form.advanced":"Advanced settings","conn.form.noFields":"This server did not describe any settings for this driver.","conn.form.reveal":"Show","conn.form.hide":"Hide","conn.guide.protocol":"Protocol","conn.guide.storage":"Storage","conn.guide.allStorages":"All storages","conn.guide.copy":"Copy","conn.guide.copied":"Copied","conn.guide.goodToKnow":"Good to know","conn.guide.userPlaceholder":"your-email@example.com","conn.guide.secretPlaceholder":"your-password-or-token","conn.guide.fact.url":"Address","conn.guide.fact.urlRootHint":"Every storage you can see appears as a folder under this address.","conn.guide.fact.urlStorageHint":"Mounts “{storage}” directly. Drop the last segment to see every storage.","conn.guide.fact.user":"Username","conn.guide.fact.password":"Password","conn.guide.webdav.summary":"WebDAV mounts filex as a drive: Windows Explorer, macOS Finder, Linux, rclone and Cyberduck all speak it, and every change is mirrored back into filex.","conn.guide.webdav.userHint":"Your filex account e-mail — not a display name.","conn.guide.webdav.passwordHint":"Your account password, or an API token (Settings → API tokens). An account with two-factor authentication MUST use a token: Basic auth has no second-factor slot.","conn.guide.webdav.win.s1":"Open File Explorer, right-click This PC and choose “Map network drive…”.","conn.guide.webdav.win.s2":"Pick a drive letter and enter {url} as the folder.","conn.guide.webdav.win.s3":"Tick “Connect using different credentials” and sign in with the username and password above.","conn.guide.webdav.win.cmdCaption":"Command Prompt (same thing, without the wizard)","conn.guide.webdav.win.limits":"Windows has three built-in limits that look exactly like filex bugs: transfers stop at ~47.7 MB, folders with about a thousand files refuse to open (“Disk is not formatted”), and the WebClient service must be restarted after changing either.","conn.guide.webdav.win.regCaption":"Run as administrator, then reconnect the drive","conn.guide.webdav.win.https":"HTTPS is mandatory. Windows sends Basic credentials over TLS only, and over plain http:// it silently refuses with no useful message. Do not set BasicAuthLevel to 2 — use TLS.","conn.guide.webdav.win.persist":"The mapped drive does not survive a sign-out: since Windows 7 Basic credentials cannot be stored in Credential Manager, and /persistent:yes does not change that. Re-run the command from a logon script if you need it back automatically.","conn.guide.webdav.win.service":"If nothing mounts at all, make sure the WebClient service is running: sc config WebClient start= auto && net start WebClient.","conn.guide.webdav.mac.s1":"In Finder choose Go → Connect to Server… (⌘K).","conn.guide.webdav.mac.s2":"Enter {url} and connect.","conn.guide.webdav.mac.s3":"Authenticate with the username and password above.","conn.guide.webdav.mac.note":"The drive appears under Locations; each storage is a top-level folder.","conn.guide.webdav.linux.mountCaption":"davfs2, or the desktop file manager (GNOME Files, Dolphin)","conn.guide.webdav.linux.gvfsComment":"or paste this address into GNOME Files / Dolphin","conn.guide.webdav.linux.locks":"davfs2 needs locking turned off. filex keeps WebDAV locks in process memory, so they do not survive a restart and are not shared between replicas — davfs2 assumes otherwise and hangs.","conn.guide.webdav.rclone.obscureCaption":"rclone stores an obscured password — run this first and paste the output below","conn.guide.webdav.rclone.passPlaceholder":"<output of rclone obscure>","conn.guide.webdav.rclone.useCaption":"Using it","conn.guide.webdav.duck.s1":"New Bookmark → WebDAV (HTTPS).","conn.guide.webdav.duck.s2":"Server {host}, port 443.","conn.guide.webdav.duck.s3":"Path {path}.","conn.guide.webdav.duck.s4":"Username {user}, password as above.","conn.guide.webdav.note.delete":"A WebDAV delete is permanent. The web UI moves files to the filex trash; a client delete removes the object from the backing storage directly.","conn.guide.webdav.note.locks":"Locks live in server memory: they do not survive a restart and are not shared between replicas. They exist to satisfy Windows and Office, not to arbitrate concurrent edits.","conn.guide.webdav.note.permissions":"You see exactly what you see in the web UI. The root lists only the storages you may open, and a path outside your grants answers 404 rather than 403, so the tree never leaks what exists.","conn.guide.webdav.note.http":"This server is reachable over plain http://. Windows will refuse to send your credentials at all, and every other client sends your password in the clear. Put filex behind TLS before mounting it.","conn.s3keys.title":"S3 access keys","conn.s3keys.lead":"An access key lets any S3 client — rclone, restic, the AWS CLI, mc, s3fs, Cyberduck — connect to filex. It carries your own permissions and nothing more.","conn.s3keys.disabled":"The S3 endpoint is switched off on this server (FILEX_S3). A key minted here will not connect until an operator turns it back on.","conn.s3keys.cannotMint":"You are not signed in with an account that can mint access keys. The instructions below still apply — ask for a key and paste it in.","conn.s3keys.label":"What is it for? (laptop backup, CI, …)","conn.s3keys.defaultLabel":"access key","conn.s3keys.everyBucket":"Every bucket I can see","conn.s3keys.prefix":"Folder inside the bucket (optional)","conn.s3keys.mint":"Create key","conn.s3keys.inheritNote":"A key can only ever narrow what you already have: your grants, your tenant, your role. Confining it to one bucket or folder is the difference between a laptop backup and a credential that can read everything.","conn.s3keys.once":"Copy the secret now — this is the only time it is shown.","conn.s3keys.accessKeyID":"Access key ID","conn.s3keys.secret":"Secret key","conn.s3keys.dismiss":"I have copied it","conn.s3keys.col.label":"Label","conn.s3keys.col.key":"Access key ID","conn.s3keys.col.scope":"Limited to","conn.s3keys.col.lastUsed":"Last used","conn.s3keys.scopeAll":"everything you can see","conn.s3keys.noLabel":"(no label)","conn.s3keys.neverUsed":"never","conn.s3keys.enable":"Enable","conn.s3keys.disable":"Disable","conn.s3keys.revoke":"Revoke","conn.s3keys.confirm":"Sure?","conn.s3keys.empty":"No access keys yet.","conn.guide.s3.summary":"The S3 endpoint makes filex the destination for anything that speaks S3 — backups, sync tools, SDKs — using the storages you already have.","conn.guide.s3.keyPlaceholder":"create a key above","conn.guide.s3.secretPlaceholder":"shown once, when you create the key","conn.guide.s3.fact.endpoint":"Endpoint","conn.guide.s3.fact.endpointHint":"Point the client here, not at the web address of filex.","conn.guide.s3.fact.bucket":"Bucket","conn.guide.s3.fact.bucketHint":"A bucket is a filex storage. Buckets are created by an administrator, not by the client.","conn.guide.s3.fact.key":"Access key ID","conn.guide.s3.fact.keyHint":"The public half. It travels in every request.","conn.guide.s3.fact.secret":"Secret key","conn.guide.s3.fact.secretHint":"Shown once, when the key is created. filex cannot show it again — create a new key if it is lost.","conn.guide.s3.fact.region":"Region","conn.guide.s3.fact.regionHint":"filex has no regions; any value works and is echoed back. Clients still insist on one.","conn.guide.s3.fact.addressing":"Addressing","conn.guide.s3.fact.pathStyle":"path-style (required)","conn.guide.s3.fact.pathStyleHint":"There is no dedicated S3 host on this install, so bucket.host does not resolve.","conn.guide.s3.fact.virtualHosted":"virtual-hosted or path-style","conn.guide.s3.fact.virtualHostedHint":"This install has its own S3 host, so both styles work.","conn.guide.s3.rclone.useCaption":"Use it","conn.guide.s3.rclone.mtime":"filex carries the file modification time (x-amz-meta-mtime), so rclone sync settles after the first run instead of re-uploading everything.","conn.guide.s3.aws.configureCaption":"Configure once","conn.guide.s3.aws.useCaption":"Use it","conn.guide.s3.aws.pathStyle":"Add path addressing to your AWS config, or every command fails at DNS.","conn.guide.s3.restic.envCaption":"Environment","conn.guide.s3.restic.useCaption":"Back up, verify, prune","conn.guide.s3.restic.verified":"Verified against this endpoint: restic check --read-data reads every pack byte for byte and reports no errors.","conn.guide.s3.mc.aliasCaption":"Add the alias","conn.guide.s3.mc.useCaption":"Use it","conn.guide.s3.s3fs.credsCaption":"Credentials file","conn.guide.s3.s3fs.mountCaption":"Mount it","conn.guide.s3.s3fs.note":"Editing a file over s3fs rewrites the whole object, and a delete goes to the filex trash. Good for a shared folder, not for a database.","conn.guide.s3.duck.s1":"New bookmark → Amazon S3.","conn.guide.s3.duck.s2":"Server: {host}.","conn.guide.s3.duck.s3":"Access key ID: {key}, secret as above.","conn.guide.s3.duck.s4":"Open the bookmark; the buckets are your filex storages.","conn.guide.s3.duck.pathStyle":'In Preferences → S3, turn OFF "Use virtual host style" — this install has no wildcard S3 host.',"conn.guide.s3.sdk.note":"Any SigV4 client works the same way: endpoint, key, secret, and path addressing when this install has no S3 host of its own.","conn.guide.s3.note.buckets":"A bucket is a filex storage. A client can create folders and objects inside one, but not the bucket itself — that needs a driver and a path, which an S3 request cannot express.","conn.guide.s3.note.permissions":'The key sees exactly what you see. A bucket you may not open answers "no such bucket" rather than "forbidden", so the endpoint never reveals what exists.',"conn.guide.s3.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.s3.note.mtime":"Uploads carry their modification time, and the checksums clients send (Content-MD5, x-amz-checksum-*) are verified — a corrupted upload is refused rather than stored.","conn.guide.s3.note.pathStyle":"This install has no dedicated S3 host, so clients must be told to use path-style addressing. Without it a current SDK fails at DNS with an error that names neither filex nor the cause.","conn.guide.s3.note.http":"This endpoint is plain http://. Signatures still protect the request, but the objects travel in the clear. Put filex behind TLS before pointing a backup at it.","conn.sshkeys.title":"SSH keys","conn.sshkeys.lead":"Register a public key and every SSH client — sftp, scp, WinSCP, FileZilla, rclone, sshfs — can connect without sending your password.","conn.sshkeys.disabled":"The SFTP endpoint is switched off on this server (FILEX_SFTP). A key registered here will not connect until an operator turns it back on.","conn.sshkeys.cannotAdd":"You are not signed in with an account that can register keys.","conn.sshkeys.paste":"Paste the contents of ~/.ssh/id_ed25519.pub","conn.sshkeys.name":"Name (optional — the key comment is used otherwise)","conn.sshkeys.add":"Add key","conn.sshkeys.noCopyId":"ssh-copy-id cannot work here: it appends to ~/.ssh/authorized_keys over a shell, and filex has none. This box is the way in.","conn.sshkeys.col.name":"Name","conn.sshkeys.col.fingerprint":"Fingerprint","conn.sshkeys.col.added":"Added","conn.sshkeys.col.lastUsed":"Last used","conn.sshkeys.noName":"(no name)","conn.sshkeys.neverUsed":"never","conn.sshkeys.enable":"Enable","conn.sshkeys.disable":"Disable","conn.sshkeys.remove":"Remove","conn.sshkeys.confirm":"Sure?","conn.sshkeys.empty":"No keys yet. Without one, clients sign in with your account password.","conn.guide.sftp.summary":"SFTP makes filex reachable by anything that already speaks SSH — a backup job, a scanner, WinSCP, rclone, or a mounted folder.","conn.guide.sftp.fact.host":"Host","conn.guide.sftp.fact.hostHint":"The same machine as the web app, on a port of its own.","conn.guide.sftp.fact.port":"Port","conn.guide.sftp.fact.portHint":"Not 22 and not 443: SFTP is raw TCP and cannot go through the web proxy.","conn.guide.sftp.fact.userHint":"Your short login name. An @ in a login has to be quoted in most client config files, which is what this avoids.","conn.guide.sftp.fact.auth":"Sign in with","conn.guide.sftp.fact.authKey":"your registered SSH key (or your password)","conn.guide.sftp.fact.authPassword":"your account password — or register a key above","conn.guide.sftp.fact.authHint":"An API token works as a password too, and is revocable on its own. An account with two-factor sign-in must use a key or a token.","conn.guide.sftp.fact.path":"Path","conn.guide.sftp.fact.pathHint":"The first folder is a storage; the root lists the ones you may open.","conn.guide.sftp.openssh.connectCaption":"Connect, put, get","conn.guide.sftp.openssh.noShell":"There is no shell here — only the SFTP subsystem. `ssh host command` is refused on purpose, and scp works because OpenSSH 9 speaks SFTP for it.","conn.guide.sftp.key.tab":"Set up a key","conn.guide.sftp.key.s1":"Generate a key pair on the machine that will connect (skip if you already have one).","conn.guide.sftp.key.s2":"Copy the PUBLIC half — the .pub file, never the other one.","conn.guide.sftp.key.s3":"Paste it into the box above and connect; no password is sent from then on.","conn.guide.sftp.key.genCaption":"On your own machine","conn.guide.sftp.key.noCopyId":"ssh-copy-id will NOT work against filex: it needs a shell to append to ~/.ssh/authorized_keys, and there is none. Paste the key above instead.","conn.guide.sftp.winscp.s1":"New site → File protocol: SFTP.","conn.guide.sftp.winscp.s2":"Host name: {host}, port: {port}.","conn.guide.sftp.winscp.s3":"User name: {user}. For a key: Advanced → SSH → Authentication → private key file.","conn.guide.sftp.winscp.s4":"WinSCP needs a .ppk private key — use its own tool (Tools → PuTTYgen) to convert an OpenSSH key once.","conn.guide.sftp.filezilla.s1":"File → Site Manager → New site, Protocol: SFTP.","conn.guide.sftp.filezilla.s2":"Host: {host}, port: {port}.","conn.guide.sftp.filezilla.s3":"User: {user}. Logon type: Normal for a password, or Key file for a key.","conn.guide.sftp.rclone.useCaption":"Use it","conn.guide.sftp.sshfs.mountCaption":"Mount and unmount","conn.guide.sftp.sshfs.note":"A mounted folder rewrites the whole file on every save. Good for documents, not for a database or a video you are editing in place.","conn.guide.sftp.note.storages":"The root is not a home directory: it lists the storages you may open, and the first path segment names one.","conn.guide.sftp.note.permissions":"The permission bits your client draws come from your access level here, so a file shown as read-only really is one for you.","conn.guide.sftp.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.sftp.note.totp":"If your account has two-factor sign-in, the password will not work here — SSH has no way to ask for the code. Register a key, or use an API token as the password.","conn.guide.sftp.note.disabled":"The SFTP endpoint is switched off on this server. These instructions will work once an operator enables it.","conn.guide.ftps.summary":"FTPS is here for the equipment that only ever learned FTP — scan-to-folder printers, EDI counterparties, older lab and industrial software. Always over TLS.","conn.guide.ftps.fact.host":"Host","conn.guide.ftps.fact.hostHint":"The same machine as the web app, on a port of its own.","conn.guide.ftps.fact.port":"Port","conn.guide.ftps.fact.portHint":"The control channel. Data moves on a separate port from the passive range below.","conn.guide.ftps.fact.mode":"Encryption","conn.guide.ftps.fact.modeValue":"FTPS — explicit TLS (AUTH TLS), required","conn.guide.ftps.fact.modeHint":'Plain FTP is refused before the password is read. Choose "Require explicit FTP over TLS", never "plain FTP" and never "implicit".',"conn.guide.ftps.fact.userHint":"Your short login name, or your e-mail. An API token works as the password too and can be revoked on its own.","conn.guide.ftps.fact.passwordHint":"Your account password, or an API token. An account with two-factor sign-in must use a token — FTP has no way to ask for the code.","conn.guide.ftps.fact.pasv":"Passive ports","conn.guide.ftps.fact.pasvHint":"Data connections land here. If your firewall blocks this range the transfer HANGS with no error on either side — that is the classic FTP failure.","conn.guide.ftps.filezilla.s1":"File → Site Manager → New site, Protocol: FTP.","conn.guide.ftps.filezilla.s2":"Host: {host}, port: {port}.","conn.guide.ftps.filezilla.s3":'Encryption: "Require explicit FTP over TLS". Logon type: Normal, user: {user}.',"conn.guide.ftps.filezilla.s4":"Transfer settings → Passive. Active mode is refused by this server.","conn.guide.ftps.winscp.s1":"New site → File protocol: FTP, Encryption: TLS/SSL Explicit encryption.","conn.guide.ftps.winscp.s2":"Host name: {host}, port: {port}.","conn.guide.ftps.winscp.s3":"User name: {user}, password as above.","conn.guide.ftps.curl.caption":"Upload and download","conn.guide.ftps.curl.sslReqd":"--ssl-reqd is not optional: it makes curl REQUIRE TLS instead of falling back to plaintext. This server refuses plaintext anyway, but the habit protects you against the servers that do not.","conn.guide.ftps.lftp.caption":"Connect","conn.guide.ftps.lftp.protectData":"ssl-protect-data encrypts the FILE as well as the login. Without it lftp logs in over TLS and then sends your file in the clear — which is the FTPS misconfiguration people actually ship.","conn.guide.ftps.rclone.useCaption":"Use it","conn.guide.ftps.printer.tab":"Scanner / printer","conn.guide.ftps.printer.s1":"In the device's scan-to-FTP settings: server {host}, port {port}.","conn.guide.ftps.printer.s2":"User: {user}, password as above. Create an API token for the device rather than using your own password — it can be revoked without changing anything else.","conn.guide.ftps.printer.s3":"Path: {path} — or a folder inside it that you created first. The device cannot create a storage.","conn.guide.ftps.printer.s4":'Turn ON "SSL/TLS" or "FTPS explicit", and PASSIVE mode.',"conn.guide.ftps.printer.noTLS":"Plenty of scan-to-FTP firmware cannot do TLS at all. This server will not talk to such a device, and that is deliberate — the alternative is your documents and your password crossing the office network in the clear.","conn.guide.ftps.note.tls":"TLS is mandatory and there is no switch to turn it off. Plain FTP sends your password in the clear and your file after it.","conn.guide.ftps.note.passive":"Passive mode only. Active mode has the server dial back to the client, which does not survive NAT and is blocked by most firewalls.","conn.guide.ftps.note.storages":"The root is not a home directory: it lists the storages you may open, and the first path segment names one.","conn.guide.ftps.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.ftps.note.prefer":"If the client can speak SFTP, prefer it: one connection, one port, no passive-mode surprises.","conn.guide.ftps.note.selfSigned":"This server is using a self-signed certificate. It encrypts the channel but proves nothing about who is on the other end — most clients will ask you to accept it once. Supply a real certificate for anything that matters.","conn.guide.ftps.note.disabled":"The FTPS endpoint is switched off on this server. These instructions will work once an operator enables it.","conn.nfs.title":"NFS exports","conn.nfs.lead":"An export lets a machine on your network mount filex as a drive — a media player, a build server, a backup box.","conn.nfs.pathIsSecret":"⚠ The export path IS the password. NFS cannot ask a client who it is without Kerberos, so filex puts 32 random bytes in the path instead: whoever knows it can mount as you. Treat the mount line like a credential — /etc/fstab is world-readable on most systems.","conn.nfs.disabled":"The NFS endpoint is switched off on this server (FILEX_NFS). An export created here will not mount until an operator turns it back on.","conn.nfs.cannotMint":"You are not signed in with an account that can create exports.","conn.nfs.label":"What is it for? (media player, backup box, …)","conn.nfs.defaultLabel":"nfs export","conn.nfs.everyStorage":"Every storage I can see","conn.nfs.prefix":"Folder inside the storage (optional)","conn.nfs.allowCidrs":"Allowed addresses, e.g. 192.168.1.0/24 (optional)","conn.nfs.readOnly":"Read-only","conn.nfs.readOnlyHint":"Read-only is the safer default for a machine: it refuses every write through this mount whatever your own permissions are. An address list narrows it further — outside it, the mount is refused.","conn.nfs.mint":"Create export","conn.nfs.once":"Copy this now — the path is shown only once and cannot be recovered.","conn.nfs.dismiss":"I have copied it","conn.nfs.col.label":"Label","conn.nfs.col.scope":"Limited to","conn.nfs.col.mode":"Mode","conn.nfs.col.lastUsed":"Last mounted","conn.nfs.scopeAll":"everything you can see","conn.nfs.modeRead":"read-only","conn.nfs.modeWrite":"read/write","conn.nfs.noLabel":"(no label)","conn.nfs.neverUsed":"never","conn.nfs.enable":"Enable","conn.nfs.disable":"Disable","conn.nfs.revoke":"Revoke","conn.nfs.confirm":"Sure?","conn.nfs.empty":"No exports yet.","conn.guide.nfs.summary":"NFS mounts filex as a drive on a machine in your own network — the NAS protocol, for the devices that expect one.","conn.guide.nfs.pathPlaceholder":"create an export above","conn.guide.nfs.fact.host":"Host","conn.guide.nfs.fact.hostHint":"The same machine as the web app, on a port of its own.","conn.guide.nfs.fact.port":"Port","conn.guide.nfs.fact.portHint":"Both port= and mountport= must be set to this; filex serves the mount and NFS services on one port.","conn.guide.nfs.fact.export":"Export path","conn.guide.nfs.fact.exportHint":"This is the credential. It is shown once, when you create the export, and is stored hashed — filex cannot show it again.","conn.guide.nfs.fact.options":"Mount options","conn.guide.nfs.fact.optionsHint":"nolock because filex does not run the NFS lock manager; nfsvers=3 because that is what this server speaks.","conn.guide.nfs.linux.mountCaption":"Mount it","conn.guide.nfs.linux.fstabSecret":"An /etc/fstab line containing this path is a password in a world-readable file. Use a credentials-protected automount, or keep the mount in a root-only unit, if that matters where you are.","conn.guide.nfs.mac.mountCaption":"Mount it","conn.guide.nfs.mac.resvport":"macOS needs resvport: its client insists on a privileged source port and refuses the mount without it.","conn.guide.nfs.win.s1":'Turn on "Services for NFS" → "Client for NFS" in Windows Features (Pro and Enterprise only; Home does not have it).',"conn.guide.nfs.win.s2":"Open a Command Prompt as administrator.","conn.guide.nfs.win.s3":"Map the export to a drive letter with the command below.","conn.guide.nfs.win.cmdCaption":"Map it to Z:","conn.guide.nfs.win.port":"Windows has no way to say which port the mount service is on, so it can only reach an NFS server on the standard port 2049. If this server is on another port, use SFTP or the filex desktop app instead.","conn.guide.nfs.nas.tab":"NAS / media player","conn.guide.nfs.nas.s1":"In the device's NFS settings: server {host}, port {port} (set both the NFS and the mount port if it asks for them separately).","conn.guide.nfs.nas.s2":"Remote path: the export path above, exactly as shown.","conn.guide.nfs.nas.s3":"NFS version 3, no locking. Create the export read-only unless the device genuinely needs to write.","conn.guide.nfs.note.unencrypted":"NFSv3 is not encrypted. Anyone who can read the traffic sees your files, and anyone who learns the path can mount them. Use it on a home or office network, or over a VPN — never across the internet.","conn.guide.nfs.note.pathIsSecret":"The export path is the whole credential. Revoke it from the list above if it leaks; there is nothing else to change.","conn.guide.nfs.note.noPortmapper":"There is no portmapper on port 111, so a client that is not told the port cannot find the server. That is why every command here carries port= and mountport=.","conn.guide.nfs.note.uid":"The user and group ids your client sends are ignored: the mount already knows whose it is. The permissions you see come from your access in filex.","conn.guide.nfs.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.nfs.note.revoke":"Revoking takes effect on the next request, not instantly: NFS has no session to end, so a client with the mount open sees its next operation fail.","conn.guide.nfs.note.disabled":"The NFS endpoint is switched off on this server. These instructions will work once an operator enables it.","conn.tokens.title":"API tokens","conn.tokens.lead":"FTPS, WebDAV and filex mount all sign in with a token instead of your account password. Mint one here — it can be revoked on its own, and an account with two-factor sign-in cannot use its password on these at all.","conn.tokens.mint":"Create token","conn.tokens.once":"Copy it now — this is the only time it is shown. Only a hash is stored, so it cannot be shown again.","conn.tokens.dismiss":"I have copied it","conn.tokens.cannotMint":"This session cannot create tokens. Sign in with your own account to make one.","conn.tokens.empty":"No tokens yet.","conn.tokens.neverUsed":"never","conn.tokens.revoke":"Revoke","conn.tokens.confirm":"Sure?","conn.tokens.col.label":"Name","conn.tokens.col.scopes":"Can do","conn.tokens.col.used":"Last used","conn.tokens.revokeHint":"Revoking stops a connection that is already open, not just the next sign-in: an SFTP or FTPS session is cut and a mount stops working within about half a minute.","conn.guide.mount.summary":"filex mount attaches a remote filex server to a folder on this machine, over the same HTTPS the browser uses. It is the only one of these that works from anywhere — no LAN, no extra server, no third-party client.","conn.guide.mount.fact.url":"Server URL","conn.guide.mount.fact.urlHint":"The same address you use in the browser. Nothing else has to be reachable.","conn.guide.mount.fact.token":"API token","conn.guide.mount.fact.tokenPlaceholder":"create one under Tokens","conn.guide.mount.fact.tokenHint":"A token, not your password — it can be revoked on its own, and an account with 2FA cannot use its password here at all.","conn.guide.mount.fact.remote":"What to mount","conn.guide.mount.fact.remoteHint":"Leave --remote off to see every storage as a folder, or name one storage — or a folder inside it — to mount just that.","conn.guide.mount.linux.mountCaption":"Mount it","conn.guide.mount.linux.umountCaption":"Unmount it","conn.guide.mount.linux.umountWarn":"Unmount with fusermount, not by killing the process. A mount whose process died without detaching leaves a folder where every ls hangs until somebody runs fusermount by hand.","conn.guide.mount.linux.systemdCaption":"Mount it at login (systemd user unit)","conn.guide.mount.win.winfsp":"Windows needs WinFsp installed once — it is free and open source: https://winfsp.dev. Nothing else, and no administrator rights after that.","conn.guide.mount.win.mountCaption":"Mount it as a drive","conn.guide.mount.win.freeLetter":"Pick a drive letter that is FREE. The letter is created by the mount, not attached to something that already exists, and pointing it at one that is in use fails with a message that does not say so.","conn.guide.mount.win.stop":"Stop it with Ctrl-C in that window. The drive disappears and nothing is left behind on this machine.","conn.guide.mount.mac.unsupported":"filex mount does not work on macOS. It needs macFUSE, whose licence does not allow a program like filex to install it for you, and whose Go binding needs a C compiler filex deliberately does not require. The command refuses here rather than appearing to work and doing nothing.","conn.guide.mount.mac.alternatives":"On macOS, use the filex desktop app with folder sync (keeps the files on disk), or SFTP with a client that mounts drives.","conn.guide.mount.note.notASync":"This is not a sync. Nothing is copied to this machine except a small read cache, so a mount opens one file out of a hundred thousand without downloading the rest. If you want the files when you are offline, use folder sync instead.","conn.guide.mount.note.reachable":"It reaches the server through whatever proxy or tunnel the browser goes through, because underneath it is the same API. Your permissions, your storages and — on a multi-tenant server — your tenant come with it.","conn.guide.mount.note.wholeFileWrites":"A file you write through the mount is uploaded when the program closes it, not while it is being written. Editing a very large file in place is slower here than a local disk; copying it in and out is not.","conn.guide.mount.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.mount.note.revoke":"Revoke the token to stop a mount. It stops serving within half a minute, even if the mount is still attached.","storages.driver.ftp":"FTP / FTPS","storages.driver.local":"Local filesystem","storages.driver.s3":"S3 / Hetzner / MinIO","storages.driver.sftp":"SFTP","storages.driver.smb":"SMB / CIFS (NAS)","storages.driver.webdav":"WebDAV","storages.fieldHelp.smbShare":"The share name alone, without the server: `media`, not `\\\\nas\\media`.","storages.fieldHelp.smbDomain":"Only for a Windows domain account. Leave empty for a NAS.","storages.fieldHelp.smbRoot":"Sub-folder inside the share. Leave empty for the whole share.","storages.fields.share":"Share","storages.fields.domain":"Domain / workgroup","storages.fields.dialTimeout":"Connect timeout (seconds)","storages.fieldHelp.disablePresign":"Turn on when the store rejects SDK-signed URLs (Ceph RGW / some Hetzner setups answer SignatureDoesNotMatch); uploads then stream through the backend.","storages.fieldHelp.endpoint":"Leave empty for AWS S3. Any S3-compatible store needs its endpoint.","storages.fieldHelp.hostKey":"A single public key in authorized_keys / known_hosts line form.","storages.fieldHelp.insecureSkipHostKey":"Accepts any host key. Only for throwaway hosts.","storages.fieldHelp.keyPath":"Path to a key file on the server, read when the storage starts. Used when the PEM field is empty.","storages.fieldHelp.knownHosts":"OpenSSH known_hosts path for strict host-key checking. Default is trust-on-first-use in ~/.filex/known_hosts.","storages.fieldHelp.passive":"Off switches to active mode, which needs the server to dial back into this host.","storages.fieldHelp.path":"Directory on the server. It is created if missing; filex never mounts /.","storages.fieldHelp.pathStyle":"On for every non-AWS store. It is turned on automatically when an endpoint is set and this was never touched.","storages.fieldHelp.prefix":"Sub-folder inside the bucket. Required: filex never takes ownership of the bucket root.","storages.fieldHelp.region":'Defaults to "auto" when left empty.',"storages.fieldHelp.root":"Sub-folder on the backend. Required: filex never mounts the account root.","storages.fieldHelp.sftpAuth":"Either a password or a private key is required.","storages.fieldHelp.tls":"Plain FTP sends credentials in the clear — turn this on whenever the server supports it.","storages.fields.accessKey":"Access key","storages.fields.basePath":"Base path","storages.fields.bucket":"Bucket","storages.fields.disablePresign":"Disable presigned URLs","storages.fields.endpoint":"Endpoint","storages.fields.host":"Host","storages.fields.hostKey":"Pinned host key","storages.fields.insecureSkipHostKey":"Skip host-key verification (insecure)","storages.fields.keyPath":"Private key file","storages.fields.knownHosts":"known_hosts file","storages.fields.name":"Display name","storages.fields.namePlaceholder":"Personal photos","storages.fields.passive":"Passive mode (PASV)","storages.fields.password":"Password","storages.fields.path":"Filesystem path","storages.fields.pathStyle":"Use path-style URLs (Hetzner, MinIO)","storages.fields.port":"Port","storages.fields.prefix":"Prefix","storages.fields.privateKey":"Private key (PEM)","storages.fields.rbac":"Per-item access control (RBAC)","storages.fields.rbacHint":"When on, non-admins see only files/folders explicitly granted to them via the permissions panel. When off, the storage is open to all users (capability by role).","storages.fields.readOnly":"Read-only mount","storages.fields.region":"Region","storages.fields.root":"Base path","storages.fields.secretKey":"Secret key","storages.fields.tls":"FTPS (explicit AUTH TLS)","storages.fields.url":"Base URL","storages.fields.user":"User"},Dc={tr:qf,en:Wf};function zt(e){const t=n.computed(()=>{const o=typeof e=="function"?e():e.value;return Dc[o]??Dc.tr});function a(o,s={}){const l=t.value[o]??o;return Object.entries(s).reduce((c,[d,u])=>c.replaceAll(`{${d}}`,String(u)),l)}function r(o){if(o==null||o<0)return"—";if(o===0)return`0 ${a("unit.bytes")}`;const s=[[1024**4,"unit.tb"],[1024**3,"unit.gb"],[1024**2,"unit.mb"],[1024,"unit.kb"],[1,"unit.bytes"]];for(const[l,c]of s)if(o>=l){const d=o/l;return`${d>=100?Math.round(d):d.toFixed(d>=10?1:2)} ${a(c)}`}return`${o} ${a("unit.bytes")}`}function i(o){if(o.basename===".trash")return a("node.trash");const s=o.basename.match(/^\d{8}-\d{6}-[A-Za-z0-9]+__(.+)$/);return s?s[1]:o.basename}return{t:a,formatSize:r,nodeDisplayName:i}}const qk=2e3,Wk=8e3;function jf(e){const t=(...l)=>{for(const c of l)if(typeof c=="number")return c;return 0},a=(...l)=>{for(const c of l)if(typeof c=="string"&&c!=="")return c;return null},r=String(e.status??"pending"),i=r==="ok"||r==="done"?"done":r==="failed"||r==="partial"||r==="error"?"error":r==="running"?"running":"pending",o=Array.isArray(e.sources)?e.sources:[],s=a(e.op_type,e.kind)??"delete";return{id:t(e.id),op_type:s==="copy"||s==="move"?s:"delete",status:i,progress_total:t(e.progress_total,e.total,o.length),progress_done:t(e.progress_done,e.done),target_path:a(e.target_path,e.dest),source_dir:a(e.source_dir),source_count:t(e.source_count,o.length),error_message:a(e.error_message,e.error),started_at:a(e.started_at),finished_at:a(e.finished_at),created_at:a(e.created_at)}}function Yf(e,t,a={}){const r=n.ref([]),i=new Set,o=new Map;let s=!1;const l=n.computed(()=>r.value.some(_=>_.status==="pending"||_.status==="running"));let c;function d(){c||t.endpoints.opsList&&(c=setInterval(()=>{p()},qk),p())}function u(){c&&(clearInterval(c),c=void 0)}async function p(){var _;if(t.endpoints.opsList)try{const k=((await t.jsonFetch(t.endpoints.opsList)).ops||[]).map(jf);for(const w of k)(w.status==="done"||w.status==="error")&&!i.has(w.id)&&(i.add(w.id),o.set(w.id,Date.now()),s&&((_=a.onSettled)==null||_.call(a,w)));const m=new Set(r.value.map(w=>w.id)),v=k.filter(w=>w.status==="pending"||w.status==="running"?!0:s?m.has(w.id):!1),g=new Set(v.map(w=>w.id)),y=r.value.filter(w=>!g.has(w.id)),S=[...v,...y];s=!0;const x=Date.now(),N=S.filter(w=>{if(w.status==="pending"||w.status==="running")return!0;const E=o.get(w.id);return E!==void 0&&x-E<Wk});r.value=N,!l.value&&N.length===0&&u()}catch(b){console.warn("[usePendingOps] poll failed:",b)}}function f(_){const b=jf(_);r.value.some(m=>m.id===b.id)||(r.value=[b,...r.value]),d()}function h(_){r.value=r.value.filter(b=>b.id!==_),o.delete(_)}return n.onBeforeUnmount(()=>{u()}),{ops:r,hasActive:l,register:f,dismiss:h,poll:p,startPolling:d,stopPolling:u}}const jk=25e3,Yk=15e3,Xk=6;class Zk{constructor(t){Sa(this,"ws",null);Sa(this,"opts");Sa(this,"closed",!1);Sa(this,"connecting",!1);Sa(this,"retries",0);Sa(this,"fallback",!1);Sa(this,"pingTimer",null);Sa(this,"reconnectTimer",null);Sa(this,"currentPath",null);Sa(this,"currentFocus",null);this.opts=t,this.connect()}subscribe(t){this.currentPath=t,this.currentFocus=null,t&&this.send({type:"subscribe",path:t})}setFocus(t){this.currentFocus=t,this.send({type:"focus",file:t})}close(){this.closed=!0,this.clearTimers(),this.dropSocket()}async connect(){if(this.closed||this.connecting||this.ws)return;this.connecting=!0;let t=null;try{t=await this.opts.getTicket()}catch{t=null}if(this.connecting=!1,this.closed)return;if(!t||!t.ticket||!t.ws_url){this.fail();return}const a=t.ws_url.includes("?")?"&":"?";let r;try{r=new WebSocket(`${t.ws_url}${a}ticket=${encodeURIComponent(t.ticket)}`)}catch{this.fail();return}this.ws=r,r.onopen=()=>{var i,o;this.retries=0,this.setFallback(!1),(o=(i=this.opts.handlers).onStatus)==null||o.call(i,!0),this.currentPath&&this.send({type:"subscribe",path:this.currentPath}),this.currentFocus!==null&&this.send({type:"focus",file:this.currentFocus}),this.startPing()},r.onmessage=i=>{var l,c,d,u;let o;try{o=JSON.parse(typeof i.data=="string"?i.data:"")}catch{return}const s=o;(s==null?void 0:s.type)==="change"?(c=(l=this.opts.handlers).onChange)==null||c.call(l,o):(s==null?void 0:s.type)==="presence"&&((u=(d=this.opts.handlers).onPresence)==null||u.call(d,o))},r.onerror=()=>{},r.onclose=()=>{var i,o;this.stopPing(),this.ws=null,(o=(i=this.opts.handlers).onStatus)==null||o.call(i,!1),this.fail()}}fail(){if(this.closed||this.reconnectTimer)return;if(this.retries>=Xk){this.setFallback(!0);return}const t=Math.min(1e3*2**this.retries,Yk);this.retries+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}setFallback(t){var a,r;this.fallback!==t&&(this.fallback=t,(r=(a=this.opts.handlers).onFallback)==null||r.call(a,t))}send(t){const a=this.ws;if(!(!a||a.readyState!==WebSocket.OPEN))try{a.send(JSON.stringify(t))}catch{}}startPing(){this.stopPing(),this.pingTimer=setInterval(()=>this.send({type:"ping"}),jk)}stopPing(){this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null)}dropSocket(){if(this.ws){try{this.ws.onclose=null,this.ws.close()}catch{}this.ws=null}}clearTimers(){this.stopPing(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}}const Jk=200,Qk=12e3;function e_(e,t){const a=n.ref([]),r=n.ref(!1),i=n.ref(!1);let o=null,s=null,l=null,c=null;function d(){l&&clearTimeout(l),l=setTimeout(()=>{l=null,t.reload()},Jk)}function u(k){s&&k.path&&k.path!==s||(a.value=Array.isArray(k.users)?k.users:[])}function p(k){i.value=k,k?(a.value=[],c||(c=setInterval(()=>t.reload(),Qk))):c&&(clearInterval(c),c=null)}function f(){o||(o=new Zk({getTicket:()=>e.wsTicket(),handlers:{onChange:d,onPresence:u,onFallback:p,onStatus:k=>{r.value=k}}}))}function h(k){a.value=[],s=k,o==null||o.subscribe(k)}function _(k){o==null||o.setFocus(k)}function b(){l&&(clearTimeout(l),l=null),c&&(clearInterval(c),c=null),o==null||o.close(),o=null,i.value=!1}return{presenceUsers:a,connected:r,degraded:i,start:f,subscribe:h,setFocus:_,stop:b}}const t_=500;function n_(e,t){const a=n.ref({}),r=[],i=new Set,o=new Set;function s(d){if(/^https?:\/\//i.test(d))return d;const u=(e||"").replace(/\/+$/,"");return u&&d.startsWith("/")?u+d:d}function l(d){const u=d.thumb_url;if(!u)return null;const p=a.value[u];return p||(!i.has(u)&&!o.has(u)&&c(u),null)}async function c(d){o.add(d);try{const u=await fetch(s(d),{headers:await t.authHeaders({Accept:"*/*"}),credentials:t.credentialsMode()});if(!u.ok)throw new Error(String(u.status));const p=await u.blob();if(r.length>=t_){const f=r.shift();if(f&&a.value[f]){URL.revokeObjectURL(a.value[f]);const h={...a.value};delete h[f],a.value=h}}r.push(d),a.value={...a.value,[d]:URL.createObjectURL(p)}}catch{i.add(d)}finally{o.delete(d)}}return{src:l}}let hs=null,ms=null,gs=null,bs=null;function lo(){hs||(hs=import("monaco-editor").then(e=>(gs=e.default??e,gs)).catch(()=>(gs=null,null))),ms||(ms=Promise.resolve().then(()=>JB).then(e=>(bs=e.default??e,bs)).catch(()=>(bs=null,null)))}async function ys(){return hs||lo(),hs}async function vs(){return ms||lo(),ms}function Bc(){return gs}function Xf(){return bs}function a_(){return lo(),{ensureMonaco:ys,ensureHighlight:vs,getMonaco:Bc,getHighlight:Xf}}const r_=["title"],i_=["src","alt"],o_={key:2,class:"fx-presence-dot","aria-hidden":"true"},Zf=n.defineComponent({__name:"PresenceAvatar",props:{user:{},title:{}},setup(e){const t=e,a=n.computed(()=>{const l=(t.user.avatar??"").trim();return/^(data:image\/|https?:\/\/|\/)/.test(l)?l:""}),r=n.ref(!1),i=n.computed(()=>!!a.value&&!r.value),o=n.computed(()=>{const l=t.user.name.trim().split(/\s+/).filter(Boolean);return l.length===0?"?":l.length===1?l[0].slice(0,2).toUpperCase():(l[0][0]+l[l.length-1][0]).toUpperCase()}),s=n.computed(()=>{const l=t.user.uid??String(t.user.id);let c=0;for(let d=0;d<l.length;d++)c=c*31+l.charCodeAt(d)>>>0;return c%360});return(l,c)=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(["fx-presence-avatar",{"fx-presence-avatar--photo":i.value}]),style:n.normalizeStyle({backgroundColor:`hsl(${s.value} 60% 45%)`}),title:e.title},[i.value?(n.openBlock(),n.createElementBlock("img",{key:0,class:"fx-presence-photo",src:a.value,alt:e.user.name,onError:c[0]||(c[0]=d=>r.value=!0)},null,40,i_)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString(o.value),1)],64)),e.user.file?(n.openBlock(),n.createElementBlock("span",o_)):n.createCommentVNode("",!0)],14,r_))}}),s_={key:0,class:"fx-presence-chips"},l_=["title"],c_={class:"fx-presence-chip-name"},d_={key:0,class:"fx-presence-chip-file"},u_=["title"],f_={key:0,class:"fx-presence-more"},p_=["title"],h_={class:"fx-presence-file"},m_=["title","aria-expanded"],Jf="filex.presence.expanded",g_=n.defineComponent({__name:"PresenceBar",props:{users:{},selfId:{},locale:{}},setup(e){const t=e,{t:a}=zt(()=>t.locale??"tr"),r=n.computed(()=>(t.users??[]).filter(c=>t.selfId==null||c.id!==t.selfId)),i=n.ref((()=>{try{return localStorage.getItem(Jf)==="1"}catch{return!1}})());function o(){i.value=!i.value;try{localStorage.setItem(Jf,i.value?"1":"0")}catch{}}function s(c){return c.uid??String(c.id)}function l(c){return c.file?`${c.name} · ${c.file}`:c.name}return(c,d)=>r.value.length?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fx-presence",{"fx-presence--wide":i.value}])},[i.value?(n.openBlock(),n.createElementBlock("div",s_,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r.value,u=>(n.openBlock(),n.createElementBlock("span",{key:s(u),class:"fx-presence-chip",title:l(u)},[n.createVNode(Zf,{user:u},null,8,["user"]),n.createElementVNode("span",c_,n.toDisplayString(u.name),1),u.file?(n.openBlock(),n.createElementBlock("span",d_,"· "+n.toDisplayString(u.file),1)):n.createCommentVNode("",!0)],8,l_))),128))])):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",{class:"fx-presence-avatars",title:r.value.map(l).join(", ")},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r.value.slice(0,5),u=>(n.openBlock(),n.createBlock(Zf,{key:s(u),user:u,title:l(u)},null,8,["user","title"]))),128)),r.value.length>5?(n.openBlock(),n.createElementBlock("span",f_,"+"+n.toDisplayString(r.value.length-5),1)):n.createCommentVNode("",!0)],8,u_),n.createElementVNode("span",{class:"fx-presence-text",title:r.value.map(l).join(", ")},[n.createTextVNode(n.toDisplayString(r.value.length===1?r.value[0].name:`${r.value.length} kişi`)+" ",1),r.value.length===1&&r.value[0].file?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[d[0]||(d[0]=n.createTextVNode(" · ",-1)),n.createElementVNode("span",h_,n.toDisplayString(r.value[0].file),1)],64)):n.createCommentVNode("",!0)],8,p_)],64)),n.createElementVNode("button",{type:"button",class:"fx-presence-toggle",title:i.value?n.unref(a)("presence.collapse"):n.unref(a)("presence.expand"),"aria-expanded":i.value,onClick:o},n.toDisplayString(i.value?"‹":"›"),9,m_)],2)):n.createCommentVNode("",!0)}}),b_=["data-prefers-dark"],y_=["aria-label"],v_=["aria-label","onKeydown"],k_={class:"fe-sheet__items"},__={key:0,class:"fe-ctx__sep",role:"separator"},w_=["disabled","onClick"],E_={key:0,class:"fe-ctx__icon","aria-hidden":"true"},S_={class:"fe-ctx__label"},x_=["aria-label"],C_={key:0,class:"fe-ctx__sep",role:"separator"},N_=["disabled","onClick"],T_={key:0,class:"fe-ctx__icon","aria-hidden":"true"},D_={class:"fe-ctx__label"},Ac=n.defineComponent({__name:"ContextMenu",props:{locale:{},actions:{},theme:{},sheet:{type:Boolean}},emits:["select"],setup(e,{expose:t,emit:a}){const r=e,i=a,{t:o}=zt(()=>r.locale),s=n.ref(!1),l=n.ref(0),c=n.ref(0),d=n.ref([]),u=n.ref(null);let p=0,f=0,h=null;async function _(z,H){var O;if(h=document.activeElement??null,s.value=!0,l.value=z.clientX,c.value=z.clientY,p=z.clientX,f=z.clientY,d.value=H,await n.nextTick(),r.sheet){(O=y.value)==null||O.focus();return}b(),v(0)}function b(){const z=u.value;if(!z||typeof window>"u")return;const H=z.getBoundingClientRect(),O=8,P=window.innerWidth,K=window.innerHeight;if(f+H.height>K-O){const J=f-H.height;c.value=J>=O?J:Math.max(O,K-H.height-O)}if(p+H.width>P-O){const J=p-H.width;l.value=J>=O?J:Math.max(O,P-H.width-O)}}function k(){var z;s.value=!1,S.value=!1,x.value=0,(z=h==null?void 0:h.focus)==null||z.call(h),h=null}function m(){const z=r.sheet?y.value:u.value;return z?Array.from(z.querySelectorAll(".fe-ctx__item:not(:disabled)")):[]}function v(z){var P;const H=m();if(H.length===0)return;const O=(z%H.length+H.length)%H.length;(P=H[O])==null||P.focus()}function g(z){const H=m();if(H.length===0)return;const O=document.activeElement,P=O?H.indexOf(O):-1;if(P===-1){v(z>0?0:H.length-1);return}v(P+z)}const y=n.ref(null),S=n.ref(!1),x=n.ref(0);let N=0;function w(z){const H=z.touches[0];H&&(S.value=!0,N=H.clientY,x.value=0)}function E(z){if(!S.value)return;const H=z.touches[0];H&&(x.value=Math.max(0,H.clientY-N))}function C(){if(!S.value)return;const z=x.value>72;S.value=!1,z?k():x.value=0}const A=n.computed(()=>x.value>0?{transform:`translateY(${x.value}px)`,transition:"none"}:void 0);function L(z){z.disabled||(i("select",z,d.value),k())}function R(z){if(z.key==="Escape"){z.stopPropagation(),k();return}if(z.key==="Enter"||z.key===" "){z.stopPropagation();return}z.key==="ArrowDown"?(z.preventDefault(),z.stopPropagation(),g(1)):z.key==="ArrowUp"?(z.preventDefault(),z.stopPropagation(),g(-1)):z.key==="Home"?(z.preventDefault(),v(0)):z.key==="End"?(z.preventDefault(),v(-1)):z.key==="Tab"&&(z.preventDefault(),k())}const $=n.computed(()=>{const z=r.actions.filter(O=>!O.hidden),H=[];for(const O of z)O.divider&&(H.length===0||H[H.length-1].divider)||H.push(O);for(;H.length>0&&H[H.length-1].divider;)H.pop();return H}),Y=n.ref(!1);let F;function q(z){Y.value=!!(z&&"matches"in z&&z.matches)}n.onMounted(()=>{var z;typeof window>"u"||(F=window.matchMedia("(prefers-color-scheme: dark)"),q(F),(z=F.addEventListener)==null||z.call(F,"change",q))}),n.onBeforeUnmount(()=>{var z;(z=F==null?void 0:F.removeEventListener)==null||z.call(F,"change",q)});const X=n.computed(()=>`fe-ctx-backdrop--theme-${r.theme||"auto"}`);return t({show:_,hide:k}),(z,H)=>(n.openBlock(),n.createBlock(n.Teleport,{to:"body"},[n.createVNode(n.Transition,{name:e.sheet?"fe-sheet":"fe-ctx"},{default:n.withCtx(()=>[s.value?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe-ctx-backdrop",[X.value,{"fe-ctx-backdrop--sheet":e.sheet}]]),"data-prefers-dark":Y.value?"1":"0",onClick:k,onContextmenu:n.withModifiers(k,["prevent"]),onKeydown:R},[e.sheet?(n.openBlock(),n.createElementBlock("div",{key:0,ref_key:"sheetEl",ref:y,class:"fe-sheet",role:"menu","aria-label":n.unref(o)("sheet.menu"),tabindex:"-1",style:n.normalizeStyle(A.value),onClick:H[0]||(H[0]=n.withModifiers(()=>{},["stop"]))},[n.createElementVNode("div",{class:"fe-sheet__handle",role:"button",tabindex:"0","aria-label":n.unref(o)("sheet.close"),onClick:k,onKeydown:n.withKeys(n.withModifiers(k,["prevent"]),["enter"]),onTouchstartPassive:w,onTouchmovePassive:E,onTouchend:C,onTouchcancel:C},null,40,v_),n.createElementVNode("div",k_,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList($.value,(O,P)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:O.key||P},[O.divider?(n.openBlock(),n.createElementBlock("div",__)):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:n.normalizeClass(["fe-ctx__item fe-sheet__item",{"is-danger":O.danger,"is-disabled":O.disabled}]),disabled:O.disabled,role:"menuitem",onClick:K=>L(O)},[O.icon?(n.openBlock(),n.createElementBlock("span",E_,n.toDisplayString(O.icon),1)):n.createCommentVNode("",!0),n.createElementVNode("span",S_,n.toDisplayString(O.label),1)],10,w_))],64))),128))])],12,y_)):(n.openBlock(),n.createElementBlock("div",{key:1,ref_key:"menuEl",ref:u,class:"fe-ctx",role:"menu","aria-orientation":"vertical","aria-label":n.unref(o)("sheet.menu"),style:n.normalizeStyle({top:c.value+"px",left:l.value+"px"}),onClick:H[1]||(H[1]=n.withModifiers(()=>{},["stop"]))},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList($.value,(O,P)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:O.key||P},[O.divider?(n.openBlock(),n.createElementBlock("div",C_)):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:n.normalizeClass(["fe-ctx__item",{"is-danger":O.danger,"is-disabled":O.disabled}]),disabled:O.disabled,role:"menuitem",onClick:K=>L(O)},[O.icon?(n.openBlock(),n.createElementBlock("span",T_,n.toDisplayString(O.icon),1)):n.createCommentVNode("",!0),n.createElementVNode("span",D_,n.toDisplayString(O.label),1)],10,N_))],64))),128))],12,x_))],42,b_)):n.createCommentVNode("",!0)]),_:1},8,["name"])]))}}),B_=["title","aria-label"],A_=["title"],M_={class:"fe-btn__label"},O_=["disabled","title","onClick"],I_={class:"fe-icon"},R_={class:"fe-btn__label"},L_=["title","aria-label"],z_={class:"fe-icon"},F_={class:"fe-btn__label"},P_=["title"],$_={class:"fe-btn__label"},V_={class:"fe-toolbar__search-group"},U_={class:"fe-search"},H_=["placeholder","value","aria-label"],G_=["title","aria-label"],K_=["title","aria-label"],q_=["aria-pressed","aria-label","title"],W_={key:0,class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","aria-hidden":"true",focusable:"false"},j_={key:1,class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","aria-hidden":"true",focusable:"false"},Y_=["aria-pressed","title","aria-label"],X_=["title","aria-label"],Z_=["aria-label"],J_=["aria-selected","title","aria-label"],Q_=["aria-selected","title","aria-label"],e4=["aria-selected","title","aria-label"],t4={class:"fe-search fe-search--full"},n4=["placeholder","value","aria-label","onKeydown"],a4=["title","aria-label"],r4=["title","aria-label"],i4=["title","aria-label"],o4=["title","aria-label"],s4=["title","aria-label"],Qf="filex.density",l4=40,c4=n.defineComponent({__name:"Toolbar",props:{viewMode:{},searchQuery:{},trashActive:{type:Boolean},actions:{},selectionMode:{},pasteEnabled:{type:Boolean},convertEnabled:{type:Boolean},canGoUp:{type:Boolean},atVirtualRoot:{type:Boolean},canWrite:{type:Boolean},locale:{},narrow:{type:Boolean},theme:{},inspectorOpen:{type:Boolean}},emits:["update:viewMode","update:searchQuery","new-folder","upload","refresh","go-up","action","open-recents","update:density","toggle-inspector","open-theme","open-shortcut-settings"],setup(e,{expose:t,emit:a}){const r=e,i=a,o=n.ref((()=>{try{return localStorage.getItem(Qf)==="compact"?"compact":"comfortable"}catch{return"comfortable"}})());n.onMounted(()=>i("update:density",o.value));function s(){o.value=o.value==="compact"?"comfortable":"compact";try{localStorage.setItem(Qf,o.value)}catch{}i("update:density",o.value)}const{t:l}=zt(()=>r.locale),c=n.ref(null),d=n.ref(r.searchQuery);n.watch(()=>r.searchQuery,O=>{d.value=O});let u;function p(O){const P=O.target.value;d.value=P,u&&clearTimeout(u),u=setTimeout(()=>i("update:searchQuery",P),200)}async function f(){var O,P;r.narrow&&!C.value&&(C.value=!0,await n.nextTick()),(O=c.value)==null||O.focus(),(P=c.value)==null||P.select()}t({focusSearch:f});const h=n.computed(()=>r.selectionMode??"none"),_=n.computed(()=>r.actions.filter(O=>!O.divider&&!O.hidden)),b=n.ref(null),k=n.ref(null),m=n.ref(null),v=n.ref(null),g=n.ref(Number.MAX_SAFE_INTEGER),y=n.computed(()=>_.value.slice(0,g.value)),S=n.computed(()=>_.value.slice(g.value));function x(){if(r.narrow)return;const O=b.value,P=k.value;if(!O||!P){g.value=_.value.length;return}const K=parseFloat(getComputedStyle(O).gap)||8;let J=0;for(const _e of Array.from(O.children))_e===P||_e===m.value||_e.classList.contains("fe-btn--fold")||_e.offsetWidth>0&&(J+=_e.offsetWidth+K);const de=Array.from(P.children).map(_e=>_e.offsetWidth+K),xe=de.reduce((_e,Ce)=>_e+Ce,0),ke=O.clientWidth-J;if(xe<=ke){g.value=de.length;return}let ae=l4+K,be=0;for(const _e of de){if(ae+_e>ke)break;ae+=_e,be+=1}g.value=be}let N;n.onMounted(()=>{typeof ResizeObserver<"u"&&b.value&&(N=new ResizeObserver(()=>x()),N.observe(b.value)),n.nextTick(x)}),n.onBeforeUnmount(()=>N==null?void 0:N.disconnect()),n.watch(()=>[_.value,r.narrow,r.trashActive,h.value],()=>void n.nextTick(x),{deep:!1});function w(){var P,K;const O=(P=m.value)==null?void 0:P.getBoundingClientRect();(K=v.value)==null||K.show({clientX:O?O.right:0,clientY:O?O.bottom+4:0},[])}function E(O){i("action",O)}const C=n.ref(!1);n.watch(()=>r.narrow,O=>{O||(C.value=!1)});async function A(){var O;C.value=!0,await n.nextTick(),(O=c.value)==null||O.focus()}function L(){C.value=!1}const R=n.ref(!1);let $;function Y(O){R.value=!!(O&&"matches"in O&&O.matches)}n.onMounted(()=>{var O;typeof window>"u"||!window.matchMedia||($=window.matchMedia("(pointer: coarse)"),Y($),(O=$.addEventListener)==null||O.call($,"change",Y))}),n.onBeforeUnmount(()=>{var O;(O=$==null?void 0:$.removeEventListener)==null||O.call($,"change",Y)});const F=n.ref(null),q=n.ref(null),X=n.computed(()=>{const O=[],P=!r.trashActive&&!r.atVirtualRoot&&r.canWrite!==!1;return h.value==="none"&&P&&(O.push({key:"new-folder",label:l("toolbar.new_folder"),icon:"📁"}),r.pasteEnabled&&O.push({key:"paste",label:l("ctx.paste"),icon:"📋"})),O.push(..._.value),O.length&&O.push({divider:!0,key:"bag-sep",label:""}),O.push({key:"refresh",label:l("toolbar.refresh"),icon:"↻"}),O.push({key:"density",label:o.value==="compact"?l("toolbar.density.comfortable"):l("toolbar.density.compact"),icon:"⇅"}),r.viewMode!=="list"&&O.push({key:"view-list",label:l("toolbar.view.list"),icon:"☰"}),r.viewMode!=="grid"&&O.push({key:"view-grid",label:l("toolbar.view.grid"),icon:"▦"}),r.viewMode!=="gallery"&&O.push({key:"view-gallery",label:l("toolbar.view.gallery"),icon:"▣"}),O.push({key:"inspector",label:l("toolbar.inspector"),icon:"ℹ"}),O.push({key:"theme",label:l("theme.menu"),icon:"🎨"}),O.push({key:"shortcut-settings",label:l("shortcuts.settings.menu"),icon:"⌨"}),O.push({key:"tour",label:l("tour.restart"),icon:"🎓"}),O});function z(){var P,K;const O=(P=F.value)==null?void 0:P.getBoundingClientRect();(K=q.value)==null||K.show({clientX:O?O.right:0,clientY:O?O.bottom+4:0},[])}function H(O){var P;switch(O.key){case"new-folder":i("new-folder");break;case"refresh":i("refresh");break;case"density":s();break;case"view-list":i("update:viewMode","list");break;case"view-grid":i("update:viewMode","grid");break;case"view-gallery":i("update:viewMode","gallery");break;case"inspector":i("toggle-inspector");break;case"theme":i("open-theme");break;case"shortcut-settings":i("open-shortcut-settings");break;case"tour":(P=F.value)==null||P.dispatchEvent(new CustomEvent("fe:tour-restart",{bubbles:!0}));break;default:E(O.key)}}return(O,P)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-toolbar",{"fe-toolbar--narrow":e.narrow,"fe-toolbar--searching":e.narrow&&C.value}])},[e.narrow?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[C.value?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",t4,[n.createElementVNode("input",{ref_key:"searchEl",ref:c,type:"search",class:"fe-search__input",placeholder:n.unref(l)("toolbar.search.placeholder"),value:d.value,"aria-label":n.unref(l)("toolbar.search"),onInput:p,onKeydown:n.withKeys(n.withModifiers(L,["stop","prevent"]),["esc"])},null,40,n4)]),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.search.close"),"aria-label":n.unref(l)("toolbar.search.close"),onClick:L},[...P[27]||(P[27]=[n.createElementVNode("span",{class:"fe-icon"},"✕",-1)])],8,a4)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[e.canGoUp?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.go_up"),"aria-label":n.unref(l)("toolbar.go_up"),onClick:P[10]||(P[10]=K=>i("go-up"))},[...P[28]||(P[28]=[n.createElementVNode("span",{class:"fe-icon"},"↑",-1)])],8,r4)):n.createCommentVNode("",!0),P[32]||(P[32]=n.createElementVNode("div",{class:"fe-toolbar__spacer"},null,-1)),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only fe-toolbar__search-toggle",{"is-active":!!d.value}]),title:n.unref(l)("toolbar.search"),"aria-label":n.unref(l)("toolbar.search"),onClick:A},[...P[29]||(P[29]=[n.createElementVNode("span",{class:"fe-icon"},"🔍",-1)])],10,i4),!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.upload"),"aria-label":n.unref(l)("toolbar.upload"),onClick:P[11]||(P[11]=K=>i("upload"))},[...P[30]||(P[30]=[n.createElementVNode("span",{class:"fe-icon"},"⬆",-1)])],8,o4)):n.createCommentVNode("",!0),n.createElementVNode("button",{ref_key:"moreBtnEl",ref:F,type:"button",class:"fe-btn fe-btn--icon-only fe-toolbar__more",title:n.unref(l)("toolbar.more"),"aria-label":n.unref(l)("toolbar.more"),"aria-haspopup":"menu",onClick:z},[...P[31]||(P[31]=[n.createElementVNode("span",{class:"fe-icon"},"⋯",-1)])],8,s4)],64)),n.createVNode(Ac,{ref_key:"moreRef",ref:q,locale:e.locale,theme:e.theme||"auto",sheet:R.value,actions:X.value,onSelect:H},null,8,["locale","theme","sheet","actions"])],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",{ref_key:"primaryEl",ref:b,class:"fe-toolbar__primary"},[e.canGoUp?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.go_up"),"aria-label":n.unref(l)("toolbar.go_up"),onClick:P[0]||(P[0]=K=>i("go-up"))},[...P[13]||(P[13]=[n.createElementVNode("span",{class:"fe-icon"},"↑",-1)])],8,B_)):n.createCommentVNode("",!0),h.value==="none"&&!e.trashActive&&!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-btn--primary",title:n.unref(l)("toolbar.new_folder"),onClick:P[1]||(P[1]=K=>i("new-folder"))},[P[14]||(P[14]=n.createElementVNode("span",{class:"fe-icon"},"📁",-1)),n.createElementVNode("span",M_,n.toDisplayString(n.unref(l)("toolbar.new_folder")),1)],8,A_)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(y.value,K=>(n.openBlock(),n.createElementBlock("button",{key:K.key,type:"button",class:n.normalizeClass(["fe-btn fe-btn--fold",{"fe-btn--danger":K.danger,"is-disabled":K.disabled}]),disabled:K.disabled,title:K.label,onClick:J=>E(K.key)},[n.createElementVNode("span",I_,n.toDisplayString(K.icon),1),n.createElementVNode("span",R_,n.toDisplayString(K.label),1)],10,O_))),128)),S.value.length>0?(n.openBlock(),n.createElementBlock("button",{key:2,ref_key:"wideMoreBtnEl",ref:m,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.more"),"aria-label":n.unref(l)("toolbar.more"),"aria-haspopup":"menu",onClick:w},[...P[15]||(P[15]=[n.createElementVNode("span",{class:"fe-icon"},"⋯",-1)])],8,L_)):n.createCommentVNode("",!0),n.createElementVNode("div",{ref_key:"measureEl",ref:k,class:"fe-toolbar__measure","aria-hidden":"true"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(_.value,K=>(n.openBlock(),n.createElementBlock("button",{key:"m-"+K.key,type:"button",class:"fe-btn",tabindex:"-1"},[n.createElementVNode("span",z_,n.toDisplayString(K.icon),1),n.createElementVNode("span",F_,n.toDisplayString(K.label),1)]))),128))],512),e.pasteEnabled&&h.value==="none"&&!e.trashActive&&!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:3,type:"button",class:"fe-btn",title:n.unref(l)("ctx.paste"),onClick:P[2]||(P[2]=K=>E("paste"))},[P[16]||(P[16]=n.createElementVNode("span",{class:"fe-icon"},"📋",-1)),n.createElementVNode("span",$_,n.toDisplayString(n.unref(l)("ctx.paste")),1)],8,P_)):n.createCommentVNode("",!0)],512),P[26]||(P[26]=n.createElementVNode("div",{class:"fe-toolbar__spacer"},null,-1)),n.createElementVNode("div",V_,[n.createElementVNode("div",U_,[n.createElementVNode("input",{ref_key:"searchEl",ref:c,type:"search",class:"fe-search__input",placeholder:n.unref(l)("toolbar.search.placeholder"),value:d.value,"aria-label":n.unref(l)("toolbar.search"),onInput:p},null,40,H_)]),!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.upload"),"aria-label":n.unref(l)("toolbar.upload"),onClick:P[3]||(P[3]=K=>i("upload"))},[...P[17]||(P[17]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"⬆",-1)])],8,G_)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.refresh"),"aria-label":n.unref(l)("toolbar.refresh"),onClick:P[4]||(P[4]=K=>i("refresh"))},[...P[18]||(P[18]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"↻",-1)])],8,K_)]),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only fe-toolbar__density",{"is-active":o.value==="compact"}]),"aria-pressed":o.value==="compact","aria-label":o.value==="compact"?n.unref(l)("toolbar.density.comfortable"):n.unref(l)("toolbar.density.compact"),title:o.value==="compact"?n.unref(l)("toolbar.density.comfortable"):n.unref(l)("toolbar.density.compact"),onClick:s},[o.value==="compact"?(n.openBlock(),n.createElementBlock("svg",W_,[...P[19]||(P[19]=[n.createElementVNode("path",{d:"M4 6.5h16M4 10.5h16M4 14.5h16M4 18.5h16"},null,-1)])])):(n.openBlock(),n.createElementBlock("svg",j_,[...P[20]||(P[20]=[n.createElementVNode("path",{d:"M4 5.5h16M4 12h16M4 18.5h16"},null,-1)])]))],10,q_),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only fe-toolbar__inspector",{"is-active":e.inspectorOpen}]),"aria-pressed":!!e.inspectorOpen,title:n.unref(l)("toolbar.inspector"),"aria-label":n.unref(l)("toolbar.inspector"),onClick:P[5]||(P[5]=K=>i("toggle-inspector"))},[...P[21]||(P[21]=[n.createElementVNode("svg",{class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","aria-hidden":"true",focusable:"false"},[n.createElementVNode("circle",{cx:"12",cy:"12",r:"9"}),n.createElementVNode("path",{d:"M12 11v5"}),n.createElementVNode("circle",{cx:"12",cy:"7.6",r:"1",fill:"currentColor",stroke:"none"})],-1)])],10,Y_),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--icon-only fe-toolbar__theme",title:n.unref(l)("theme.menu"),"aria-label":n.unref(l)("theme.menu"),onClick:P[6]||(P[6]=K=>i("open-theme"))},[...P[22]||(P[22]=[n.createElementVNode("svg",{class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},[n.createElementVNode("path",{d:"M12 3a9 9 0 1 0 0 18h1.4a2.1 2.1 0 0 0 1.5-3.6 2.1 2.1 0 0 1 1.5-3.6H19a2 2 0 0 0 2-2A9 9 0 0 0 12 3z"}),n.createElementVNode("circle",{cx:"7.8",cy:"10.2",r:"1.15",fill:"currentColor",stroke:"none"}),n.createElementVNode("circle",{cx:"11.6",cy:"7.2",r:"1.15",fill:"currentColor",stroke:"none"}),n.createElementVNode("circle",{cx:"16",cy:"8.6",r:"1.15",fill:"currentColor",stroke:"none"})],-1)])],8,X_),n.createElementVNode("div",{class:"fe-toolbar__view",role:"tablist","aria-label":n.unref(l)("toolbar.view_label")},[n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only",{"is-active":e.viewMode==="list"}]),role:"tab","aria-selected":e.viewMode==="list",title:n.unref(l)("toolbar.view.list"),"aria-label":n.unref(l)("toolbar.view.list"),onClick:P[7]||(P[7]=K=>i("update:viewMode","list"))},[...P[23]||(P[23]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"☰",-1)])],10,J_),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only",{"is-active":e.viewMode==="grid"}]),role:"tab","aria-selected":e.viewMode==="grid",title:n.unref(l)("toolbar.view.grid"),"aria-label":n.unref(l)("toolbar.view.grid"),onClick:P[8]||(P[8]=K=>i("update:viewMode","grid"))},[...P[24]||(P[24]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"▦",-1)])],10,Q_),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only",{"is-active":e.viewMode==="gallery"}]),role:"tab","aria-selected":e.viewMode==="gallery",title:n.unref(l)("toolbar.view.gallery"),"aria-label":n.unref(l)("toolbar.view.gallery"),onClick:P[9]||(P[9]=K=>i("update:viewMode","gallery"))},[...P[25]||(P[25]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"▣",-1)])],10,e4)],8,Z_)],64)),e.narrow?n.createCommentVNode("",!0):(n.openBlock(),n.createBlock(Ac,{key:2,ref_key:"wideMoreRef",ref:v,locale:e.locale,theme:e.theme||"auto",sheet:!1,actions:S.value,onSelect:P[12]||(P[12]=K=>E(K.key))},null,8,["locale","theme","actions"]))],2))}}),d4=["onClick"],ep=n.defineComponent({__name:"TagPicker",props:{nodeId:{},apiBase:{},authHeaders:{type:Function},authCredentials:{},palette:{}},emits:["change","error"],setup(e,{emit:t}){const a=e,r=t,i=n.ref([]),o=n.ref(!1),s=n.ref(!1),l=n.ref(""),c=n.computed(()=>a.palette??["#ef4444","#f59e0b","#10b981","#3b82f6","#8b5cf6","#ec4899","#14b8a6","#f97316"]);function d(b){let k=0;for(let v=0;v<b.length;v++)k=k*31+b.charCodeAt(v)|0;const m=c.value;return m[Math.abs(k)%m.length]}async function u(b={}){return{...await(a.authHeaders??(()=>({})))(),...b}}async function p(){o.value=!0;try{const b=a.apiBase??"",k=await fetch(`${b}/api/files/manager/tags?node_id=${a.nodeId}`,{headers:await u(),credentials:a.authCredentials??"same-origin"});if(k.ok){const m=await k.json();i.value=Array.isArray(m.tags)?m.tags:[]}}catch(b){r("error",b instanceof Error?b.message:String(b))}finally{o.value=!1}}async function f(b){const k=[...i.value];i.value=b;try{const m=a.apiBase??"",v=await fetch(`${m}/api/files/manager/tags`,{method:"POST",headers:await u({"Content-Type":"application/json"}),credentials:a.authCredentials??"same-origin",body:JSON.stringify({node_id:a.nodeId,tags:b})});if(!v.ok)throw new Error(`tag save failed: ${v.status}`);r("change",b)}catch(m){i.value=k,r("error",m instanceof Error?m.message:String(m))}}function h(){const b=l.value.trim();if(!b||i.value.includes(b)){l.value="",s.value=!1;return}f([...i.value,b]),l.value="",s.value=!1}function _(b){f(i.value.filter(k=>k!==b))}return n.onMounted(p),n.watch(()=>a.nodeId,p),(b,k)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["filex-tag-picker",{"is-loading":o.value}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.value,m=>(n.openBlock(),n.createElementBlock("span",{key:m,class:"filex-tag",style:n.normalizeStyle({"--filex-tag-color":d(m)})},[n.createTextVNode(n.toDisplayString(m)+" ",1),n.createElementVNode("button",{class:"filex-tag-x",type:"button",onClick:v=>_(m),"aria-label":"Remove tag"},"×",8,d4)],4))),128)),s.value?(n.openBlock(),n.createElementBlock("form",{key:0,class:"filex-tag-add",onSubmit:n.withModifiers(h,["prevent"])},[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":k[0]||(k[0]=m=>l.value=m),autofocus:"",placeholder:"tag name",onBlur:h,onKeydown:k[1]||(k[1]=n.withKeys(m=>{s.value=!1,l.value=""},["escape"]))},null,544),[[n.vModelText,l.value]])],32)):(n.openBlock(),n.createElementBlock("button",{key:1,class:"filex-tag-add-btn",type:"button",onClick:k[2]||(k[2]=m=>s.value=!0)},"+ Add tag"))],2))}}),u4={class:"filex-recent"},f4=["disabled"],p4={key:0},h4=["onClick"],m4={class:"filex-recent-name"},g4={class:"filex-recent-meta"},b4={key:1,class:"filex-recent-empty"},y4={key:2,class:"filex-recent-empty"},tp=n.defineComponent({__name:"RecentlyOpened",props:{apiBase:{},authHeaders:{type:Function},authCredentials:{},limit:{},refreshKey:{}},emits:["open","error"],setup(e,{emit:t}){const a=e,r=t,i=n.ref([]),o=n.ref(!1);async function s(){o.value=!0;try{const c=await(a.authHeaders??(()=>({})))(),d=a.apiBase??"",u=a.limit??20,p=await fetch(`${d}/api/files/manager/recent?limit=${u}`,{headers:c,credentials:a.authCredentials??"same-origin"});if(p.ok){const f=await p.json();i.value=Array.isArray(f.entries)?f.entries:Array.isArray(f)?f:[]}}catch(c){r("error",c instanceof Error?c.message:String(c))}finally{o.value=!1}}function l(c){if(!c)return"";const d=new Date(c).getTime();if(Number.isNaN(d))return"";const u=Date.now()-d;return u<6e4?"just now":u<36e5?`${Math.floor(u/6e4)}m ago`:u<864e5?`${Math.floor(u/36e5)}h ago`:`${Math.floor(u/864e5)}d ago`}return n.onMounted(s),n.watch(()=>a.refreshKey,s),(c,d)=>(n.openBlock(),n.createElementBlock("div",u4,[n.createElementVNode("header",null,[d[0]||(d[0]=n.createElementVNode("h3",null,"Recently opened",-1)),n.createElementVNode("button",{class:"filex-recent-refresh",type:"button",onClick:s,disabled:o.value}," ↻ ",8,f4)]),i.value.length?(n.openBlock(),n.createElementBlock("ul",p4,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.value,u=>(n.openBlock(),n.createElementBlock("li",{key:u.id},[n.createElementVNode("button",{type:"button",onClick:p=>r("open",u),class:"filex-recent-item"},[n.createElementVNode("span",m4,n.toDisplayString(u.name),1),n.createElementVNode("span",g4,n.toDisplayString(l(u.last_opened)),1)],8,h4)]))),128))])):o.value?(n.openBlock(),n.createElementBlock("p",y4,"Loading…")):(n.openBlock(),n.createElementBlock("p",b4,"Nothing here yet."))]))}}),np="application/x-brf-files",v4="application/x-brf-files-src";let li=null;const k4=5*6e4;function _4(e,t){li={items:e.slice(),origin:t,startedAt:Date.now()}}function ci(){li=null}function co(){return li?Date.now()-li.startedAt>k4?(li=null,null):li:null}function ta(e){var t;return(t=e.dataTransfer)!=null&&t.types.includes(np)?!0:co()!==null}function ks(e){var r;const t=(r=e.dataTransfer)==null?void 0:r.getData(np);if(t)try{const i=JSON.parse(t);return Array.isArray(i)&&i.length>0?i:null}catch{return null}const a=co();return a&&a.items.length>0?a.items:null}function Mc(e){var a,r;const t=(a=e.dataTransfer)==null?void 0:a.getData(v4);return t||((r=co())==null?void 0:r.origin)||void 0}function w4(e){const t=E4(e);return t===void 0||t==="none"||t==="csrf"}function E4(e){if(!e||typeof e!="object")return;const t=e;return typeof t.kind=="string"?t.kind:typeof t.type=="string"?t.type:void 0}function S4(e,t,a){if(e.type!=="file")return null;let r=t;try{r=new URL(t,typeof location<"u"?location.href:void 0).toString()}catch{return null}if(!/^https?:/i.test(r))return null;const i=e.basename.replace(/[:\r\n]/g,"_");return`${a&&a.trim()?a:"application/octet-stream"}:${i}:${r}`}function x4(e){return e.map(t=>t.path).sort().join("\0")}const C4={class:"fe-breadcrumb","aria-label":"Breadcrumb"},N4=["aria-current","onClick","onContextmenu","onDrop"],T4={key:0,class:"fe-breadcrumb__sep","aria-hidden":"true"},D4=["aria-expanded","aria-label","title"],B4={key:0,class:"fe-breadcrumb__menu",role:"menu"},A4=["onClick"],M4=["aria-current","onClick","onContextmenu","onDrop"],O4={key:0,class:"fe-breadcrumb__sep","aria-hidden":"true"},I4=["title","aria-label"],R4=["placeholder","onKeydown"],L4=4,z4=n.defineComponent({__name:"Breadcrumb",props:{dirname:{},adapter:{},rootLabel:{},locale:{},multiStorageRoot:{type:Boolean},rootPath:{}},emits:["navigate","copy-path","crumb-context","crumb-drop"],setup(e,{emit:t}){const a=e,r=n.computed(()=>{if(!a.rootPath)return"";const A=a.rootPath,L=A.indexOf("://");return(L>=0?A.slice(L+3):A).replace(/^\/+|\/+$/g,"")}),i=n.computed(()=>{const A=r.value;if(!A)return a.rootLabel||a.adapter;const L=A.split("/");return L[L.length-1]||a.rootLabel||a.adapter}),{t:o}=zt(()=>a.locale),s=t,l=n.computed(()=>{const A=`${a.adapter}://`,L=a.dirname.startsWith(A)?a.dirname.slice(A.length):a.dirname,R=L.split("/").filter(Boolean),$=[];if(a.rootPath){const F=r.value,q=L.replace(/^\/+|\/+$/g,""),X=F&&(q===F||q.startsWith(F+"/"))?q.slice(F.length).replace(/^\/+/,""):"";$.push({label:i.value,adapterPath:a.rootPath});let z=F;for(const H of X.split("/").filter(Boolean))z=z?`${z}/${H}`:H,$.push({label:H===".trash"?o("node.trash"):H,adapterPath:`${A}${z}`});return $}a.multiStorageRoot?($.push({label:"/",adapterPath:""}),a.adapter&&$.push({label:a.rootLabel||a.adapter,adapterPath:A})):$.push({label:a.rootLabel||a.adapter,adapterPath:A});let Y="";for(const F of R){Y=Y?`${Y}/${F}`:F;const q=F===".trash"?o("node.trash"):F;$.push({label:q,adapterPath:`${A}${Y}`})}return $}),c=n.computed(()=>l.value.length>L4),d=n.computed(()=>c.value?l.value.slice(0,1):l.value),u=n.computed(()=>c.value?l.value.slice(1,-2):[]),p=n.computed(()=>c.value?l.value.slice(-2):[]),f=n.ref(!1),h=n.ref(null);function _(A){f.value=!1,s("navigate",A.adapterPath)}function b(A){const L=h.value;L&&A.target instanceof Node&&L.contains(A.target)||(f.value=!1)}function k(A){A.key==="Escape"&&(A.stopPropagation(),f.value=!1)}n.watch(f,A=>{A?(document.addEventListener("click",b,!0),document.addEventListener("keydown",k,!0)):(document.removeEventListener("click",b,!0),document.removeEventListener("keydown",k,!0))}),n.watch(l,()=>{f.value=!1}),n.onBeforeUnmount(()=>{document.removeEventListener("click",b,!0),document.removeEventListener("keydown",k,!0)});function m(A){s("navigate",A.adapterPath)}function v(A,L){A.preventDefault(),A.stopPropagation(),s("crumb-context",{x:A.clientX,y:A.clientY,adapterPath:L.adapterPath,label:L.label})}function g(A){ta(A)&&(A.preventDefault(),A.stopPropagation(),A.dataTransfer&&(A.dataTransfer.dropEffect="move"))}function y(A,L){ta(A)&&(A.preventDefault(),A.stopPropagation(),s("crumb-drop",L.adapterPath,A))}const S=n.ref(!1),x=n.ref(""),N=n.ref(null);function w(){const A=`${a.adapter}://`,L=a.dirname.startsWith(A)?a.dirname.slice(A.length):a.dirname;if(a.rootPath){const R=r.value,$=L.replace(/^\/+|\/+$/g,""),Y=R&&($===R||$.startsWith(R+"/"))?$.slice(R.length).replace(/^\/+/,""):"";x.value=Y?`/${Y}`:"/",S.value=!0,n.nextTick(()=>{var F,q;(F=N.value)==null||F.focus(),(q=N.value)==null||q.select()});return}if(a.multiStorageRoot)if(!a.adapter)x.value="/";else{const R=L.replace(/^\/+|\/+$/g,"");x.value=R?`/${a.adapter}/${R}`:`/${a.adapter}`}else x.value=L;S.value=!0,n.nextTick(()=>{var R,$;(R=N.value)==null||R.focus(),($=N.value)==null||$.select()})}function E(){const A=x.value.trim();if(S.value=!1,a.rootPath){const R=A.replace(/^\/+|\/+$/g,""),$=r.value,Y=R?$?`${$}/${R}`:R:$;s("navigate",Y?`${a.adapter}://${Y}`:`${a.adapter}://`);return}if(a.multiStorageRoot){const R=A.replace(/^\/+|\/+$/g,"");if(!R){s("navigate","");return}const $=R.indexOf("/"),Y=$===-1?R:R.slice(0,$),F=$===-1?"":R.slice($+1);s("navigate",F?`${Y}://${F}`:`${Y}://`);return}const L=A.replace(/^\/+|\/+$/g,"");L&&s("navigate",`${a.adapter}://${L}`)}function C(){S.value=!1}return(A,L)=>(n.openBlock(),n.createElementBlock("nav",C4,[S.value?n.withDirectives((n.openBlock(),n.createElementBlock("input",{key:1,ref_key:"pathInput",ref:N,"onUpdate:modelValue":L[1]||(L[1]=R=>x.value=R),type:"text",class:"fe-breadcrumb__input",placeholder:n.unref(o)("breadcrumb.path_placeholder"),spellcheck:"false",autocomplete:"off",onKeydown:[n.withKeys(n.withModifiers(E,["prevent"]),["enter"]),n.withKeys(n.withModifiers(C,["prevent"]),["escape"])],onBlur:C},null,40,R4)),[[n.vModelText,x.value]]):(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d.value,(R,$)=>(n.openBlock(),n.createElementBlock("button",{key:R.adapterPath,class:n.normalizeClass(["fe-breadcrumb__crumb",{"is-last":!c.value&&$===d.value.length-1}]),type:"button","aria-current":!c.value&&$===d.value.length-1?"page":void 0,onClick:Y=>m(R),onContextmenu:Y=>v(Y,R),onDragover:g,onDrop:Y=>y(Y,R)},[n.createElementVNode("span",null,n.toDisplayString(R.label),1),c.value||$<d.value.length-1?(n.openBlock(),n.createElementBlock("span",T4,"›")):n.createCommentVNode("",!0)],42,N4))),128)),u.value.length?(n.openBlock(),n.createElementBlock("span",{key:0,ref_key:"moreWrapEl",ref:h,class:"fe-breadcrumb__more-wrap"},[n.createElementVNode("button",{type:"button",class:"fe-breadcrumb__more","aria-haspopup":"menu","aria-expanded":f.value,"aria-label":n.unref(o)("breadcrumb.more"),title:n.unref(o)("breadcrumb.more"),onClick:L[0]||(L[0]=R=>f.value=!f.value)},"…",8,D4),L[2]||(L[2]=n.createElementVNode("span",{class:"fe-breadcrumb__sep","aria-hidden":"true"},"›",-1)),f.value?(n.openBlock(),n.createElementBlock("div",B4,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(u.value,R=>(n.openBlock(),n.createElementBlock("button",{key:R.adapterPath,type:"button",class:"fe-breadcrumb__menu-item",role:"menuitem",onClick:$=>_(R)},n.toDisplayString(R.label),9,A4))),128))])):n.createCommentVNode("",!0)],512)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(p.value,(R,$)=>(n.openBlock(),n.createElementBlock("button",{key:R.adapterPath,class:n.normalizeClass(["fe-breadcrumb__crumb",{"is-last":$===p.value.length-1}]),type:"button","aria-current":$===p.value.length-1?"page":void 0,onClick:Y=>m(R),onContextmenu:Y=>v(Y,R),onDragover:g,onDrop:Y=>y(Y,R)},[n.createElementVNode("span",null,n.toDisplayString(R.label),1),$<p.value.length-1?(n.openBlock(),n.createElementBlock("span",O4,"›")):n.createCommentVNode("",!0)],42,M4))),128)),n.createElementVNode("button",{type:"button",class:"fe-breadcrumb__edit",title:n.unref(o)("breadcrumb.go_to_path"),"aria-label":n.unref(o)("breadcrumb.go_to_path"),onClick:w},"✏",8,I4)],64))]))}}),ap={};function Ca(e,t){for(const a of t)ap[a]=e}Ca("image",["jpg","jpeg","png","webp","gif","bmp","avif","heic","svg","ico","tiff","tif"]),Ca("video",["mp4","webm","mov","mkv","avi","ogv","m4v"]),Ca("audio",["mp3","wav","flac","ogg","m4a","aac","opus"]),Ca("pdf",["pdf"]),Ca("doc",["doc","docx","odt","rtf"]),Ca("sheet",["xls","xlsx","ods","csv"]),Ca("slides",["ppt","pptx","odp"]),Ca("archive",["zip","tar","gz","bz2","7z","rar","xz","zst"]),Ca("code",["js","ts","jsx","tsx","mjs","cjs","vue","py","go","rs","php","rb","java","kt","swift","c","cpp","h","hpp","cs","css","scss","less","html","htm","json","yml","yaml","xml","sh","bash","ps1","sql","toml"]),Ca("text",["txt","md","markdown","log","ini","conf","cfg","env"]);function F4(e){if(e.type==="dir")return"folder";const t=(e.extension||"").toLowerCase();return ap[t]??"unknown"}const dr='<path d="M6.5 3h7L18.5 8v11.5a1.5 1.5 0 0 1-1.5 1.5H6.5A1.5 1.5 0 0 1 5 19.5v-15A1.5 1.5 0 0 1 6.5 3z"/><path d="M13.5 3v5h5"/>',P4={folder:'<path d="M3 7a2 2 0 0 1 2-2h4.2l2 2.4H19a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" fill="currentColor" fill-opacity="0.14"/>',image:'<rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="8.6" cy="10" r="1.6"/><path d="M5.2 16.6l4.3-4.3 3 3 2.4-2.4 3.9 3.7"/>',video:'<rect x="3" y="5" width="18" height="14" rx="2"/><path d="M10.2 9.3v5.4l4.8-2.7z" fill="currentColor" stroke="none"/>',audio:'<path d="M9 17.5V7.2l9-2.2v10.4"/><circle cx="6.8" cy="17.6" r="2.2"/><circle cx="15.8" cy="15.5" r="2.2"/>',pdf:dr+'<rect x="7.5" y="12" width="9" height="5" rx="1" fill="currentColor" fill-opacity="0.14"/>',doc:dr+'<path d="M8.5 13h7M8.5 16h7"/>',sheet:dr+'<path d="M8 12.5h8M8 15.5h8M8 18h8M12 12.5V18"/>',slides:dr+'<rect x="8" y="12.5" width="8" height="5" rx="0.8"/>',archive:dr+'<path d="M10 3v1.6M10 6.6v1.6M10 10.2v1.6"/><rect x="8.6" y="14" width="2.8" height="3.4" rx="0.8"/>',code:dr+'<path d="M10.4 12.5L8.3 15l2.1 2.5M13.6 12.5l2.1 2.5-2.1 2.5"/>',text:dr+'<path d="M8.5 12h7M8.5 15h7M8.5 18h4.5"/>',unknown:dr+'<path d="M10.3 13.1a1.8 1.8 0 1 1 2.5 1.9c-.6.3-.8.7-.8 1.4"/><circle cx="12" cy="18.4" r="0.9" fill="currentColor" stroke="none"/>'},rp=new Map;function $4(e){let t=rp.get(e);return t||(t=`<svg class="fe-ficon fe-ficon--${e}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">${P4[e]}</svg>`,rp.set(e,t)),t}function di(e){return $4(F4(e))}function uo(e){const t=[];if(!e)return t;const a=/«([^«»]*)»/g;let r=0,i;for(;(i=a.exec(e))!==null;)i.index>r&&t.push({text:e.slice(r,i.index),match:!1}),i[1]&&t.push({text:i[1],match:!0}),r=i.index+i[0].length;return r<e.length&&t.push({text:e.slice(r),match:!1}),t}function Oc(e){return e==="content"||e==="both"}function Ic(e,t,a){const r=e.dataTransfer;if(!(!r||typeof document>"u"||typeof r.setDragImage!="function"))try{const i=document.createElement("div");i.className="fe-dragghost";const o=document.createElement("span");if(o.className="fe-dragghost__name",o.textContent=t,i.appendChild(o),a>1){const s=document.createElement("span");s.className="fe-dragghost__badge",s.textContent=String(a),i.appendChild(s)}i.style.position="fixed",i.style.top="-1000px",i.style.left="-1000px",document.body.appendChild(i),r.setDragImage(i,14,14),setTimeout(()=>i.remove(),0)}catch{}}const V4=["aria-pressed","title"],U4={viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true"},H4=["fill"],G4={key:0,class:"filex-star-label"},ip=n.defineComponent({__name:"StarButton",props:{starred:{type:Boolean},nodeId:{},apiBase:{},authHeaders:{type:Function},authCredentials:{},compact:{type:Boolean}},emits:["change","error"],setup(e,{emit:t}){const a=e,r=t,i=n.ref(a.starred);n.watch(()=>a.starred,s=>{i.value=s});async function o(){const s=!i.value;i.value=s;try{const l={"Content-Type":"application/json",...await(a.authHeaders??(()=>({})))()},c=a.apiBase??"",d=await fetch(`${c}/api/files/manager/star`,{method:"POST",headers:l,credentials:a.authCredentials??"same-origin",body:JSON.stringify({node_id:a.nodeId,starred:s})});if(!d.ok)throw new Error(`star toggle failed: ${d.status}`);r("change",s)}catch(l){i.value=!s,r("error",l instanceof Error?l.message:String(l))}}return(s,l)=>(n.openBlock(),n.createElementBlock("button",{type:"button",class:n.normalizeClass(["filex-star-btn",{"is-starred":i.value,"is-compact":e.compact}]),"aria-pressed":i.value,title:i.value?"Unstar":"Star",onClick:n.withModifiers(o,["stop"])},[(n.openBlock(),n.createElementBlock("svg",U4,[n.createElementVNode("path",{fill:i.value?"currentColor":"none",stroke:"currentColor","stroke-width":"2","stroke-linejoin":"round",d:"M12 2.5l3.09 6.26 6.91 1-5 4.87 1.18 6.87L12 18.27l-6.18 3.23L7 14.63 2 9.76l6.91-1z"},null,8,H4)])),e.compact?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("span",G4,n.toDisplayString(i.value?"Starred":"Star"),1))],10,V4))}}),K4=["aria-label","aria-busy"],q4={class:"fe-list__head",role:"row"},W4=["aria-label"],j4=["aria-sort"],Y4=["title"],X4={key:0,class:"fe-list__sort-arrow","aria-hidden":"true"},Z4=["aria-sort"],J4=["title"],Q4={key:0,class:"fe-list__sort-arrow","aria-hidden":"true"},e3=["aria-sort"],t3=["title"],n3={key:0,class:"fe-list__sort-arrow","aria-hidden":"true"},a3={class:"fe-list__body",role:"rowgroup"},r3={key:0,class:"fe-list__group",role:"presentation"},i3=["aria-selected","aria-label","data-fe-path","onClick","onDblclick","onContextmenu","onDragstart","onDragover","onDragleave","onDrop","onTouchstartPassive"],o3={class:"fe-list__col fe-list__col--name",role:"gridcell"},s3={key:0,class:"fe-list__icon","aria-hidden":"true"},l3=["innerHTML"],c3={class:"fe-list__name-wrap"},d3=["title"],u3={key:0,class:"fe-list__badge"},f3=["title","aria-label"],p3=["title"],h3={key:1,class:"fe-list__snippet"},m3={key:0,class:"fe-list__mark"},g3={class:"fe-list__col fe-list__col--size",role:"gridcell"},b3={class:"fe-list__col fe-list__col--mod",role:"gridcell"},y3={key:0,class:"fe-list__empty"},op="filex.list-sort",sp=n.defineComponent({__name:"ListView",props:{files:{},selected:{},clipped:{},showParentPath:{type:Boolean},locale:{},loading:{type:Boolean},starredIds:{},apiBase:{},authHeaders:{type:Function},authCredentials:{},keepBadgeFor:{type:Function}},emits:["click-row","dbl-row","context-row","item-drag-start","item-drop-into","star-change"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale);function l(O){return a.selected.has(O.path)}function c(O,P){r("click-row",O,{ctrl:P.ctrlKey||P.metaKey,shift:P.shiftKey})}function d(O){r("dbl-row",O)}function u(O,P){P.preventDefault(),P.stopPropagation(),r("context-row",O,P)}function p(O,P){Ic(P,s(O),a.selected.has(O.path)?a.selected.size:1),r("item-drag-start",O,P)}const f=n.ref(null);function h(O,P){O.type==="dir"&&ta(P)&&(P.preventDefault(),P.stopPropagation(),P.dataTransfer&&(P.dataTransfer.dropEffect="move"),f.value=O.path)}function _(O){f.value===O.path&&(f.value=null)}function b(O,P){f.value=null,O.type==="dir"&&ta(P)&&(P.preventDefault(),P.stopPropagation(),r("item-drop-into",O,P))}let k,m=null;function v(O,P){m=O,k&&clearTimeout(k),k=setTimeout(()=>{if(m){const K=P.touches[0];r("context-row",m,{clientX:K.clientX,clientY:K.clientY,preventDefault:()=>{}})}},500)}function g(){k&&clearTimeout(k),m=null}function y(O){return O.basename===".trash"?"🗑":O.mime_type==="inode/storage"?"💾":O.type==="dir"&&O.e2e===!0?"🔒":null}function S(O){return O==="kept"?"✓":O==="syncing"?"⟳":O==="partial"?"◐":"☁"}function x(O){return O.basename===".trash"||O.mime_type==="inode/storage"}function N(O){return O?new Date(O*(O<1e12?1e3:1)).toLocaleString():"—"}function w(O){const P=O.replace(/^[a-z][a-z0-9+.-]*:\/\//i,""),K=P.lastIndexOf("/");return K===-1?"":P.slice(0,K)}function E(O){const P=O.snippet;return typeof P=="string"?P:""}function C(O){return Oc(O.matched)}const A=n.ref(null),L=n.ref("asc");try{const O=localStorage.getItem(op);if(O){const P=JSON.parse(O);(P.key==="name"||P.key==="size"||P.key==="modified")&&(A.value=P.key),(P.dir==="asc"||P.dir==="desc")&&(L.value=P.dir)}}catch{}function R(O){return O==="modified"?"desc":"asc"}function $(O){A.value!==O?(A.value=O,L.value=R(O)):L.value===R(O)?L.value=L.value==="asc"?"desc":"asc":A.value=null;try{localStorage.setItem(op,JSON.stringify({key:A.value,dir:L.value}))}catch{}}function Y(O){return A.value!==O?"none":L.value==="asc"?"ascending":"descending"}function F(O){const P=O.last_modified;return P?P*(P<1e12?1e3:1):null}const q=n.computed(()=>{const O=A.value;if(!O)return a.files;const P=[],K=[];for(const de of a.files)(x(de)?P:K).push(de);const J=L.value==="asc"?1:-1;return K.sort((de,xe)=>{if(O==="name")return J*de.basename.localeCompare(xe.basename,void 0,{numeric:!0,sensitivity:"base"});if(O==="size")return J*((de.size??-1)-(xe.size??-1));const ke=F(de),ae=F(xe);return ke==null&&ae==null?0:ke==null?1:ae==null?-1:J*(ke-ae)}),[...P,...K]}),X=n.computed(()=>new Intl.DateTimeFormat(a.locale==="tr"?"tr-TR":"en-US",{month:"long",year:"numeric"}));function z(O){if(O==null)return{id:"none",label:i("group.no_date")};const P=new Date(O),K=new Date,J=ae=>new Date(ae.getFullYear(),ae.getMonth(),ae.getDate()).getTime(),de=J(K),xe=J(P),ke=864e5;return xe>=de?{id:"today",label:i("group.today")}:xe===de-ke?{id:"yesterday",label:i("group.yesterday")}:xe>de-7*ke?{id:"week",label:i("group.this_week")}:P.getFullYear()===K.getFullYear()&&P.getMonth()===K.getMonth()?{id:"month",label:i("group.this_month")}:{id:`m-${P.getFullYear()}-${P.getMonth()}`,label:X.value.format(P)}}const H=n.computed(()=>{const O=q.value;if(A.value!=="modified")return[{id:"all",label:null,nodes:O}];const P=[];let K=null;for(const J of O){const de=x(J)?{id:"pinned",label:null}:z(F(J));(!K||K.id!==de.id)&&(K={id:de.id,label:de.label,nodes:[]},P.push(K)),K.nodes.push(J)}return P});return(O,P)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-list",{"is-loading":e.loading,"has-star-col":!!e.apiBase||e.apiBase===""}]),role:"grid","aria-label":n.unref(i)("list.aria"),"aria-busy":e.loading?"true":void 0},[n.createElementVNode("div",q4,[n.createElementVNode("div",{class:"fe-list__col fe-list__col--star",role:"columnheader","aria-label":n.unref(i)("col.star")},null,8,W4),n.createElementVNode("div",{class:"fe-list__col fe-list__col--name",role:"columnheader","aria-sort":Y("name")},[n.createElementVNode("button",{type:"button",class:"fe-list__sort",title:n.unref(i)("col.sort"),onClick:P[0]||(P[0]=K=>$("name"))},[n.createTextVNode(n.toDisplayString(n.unref(i)("col.name"))+" ",1),A.value==="name"?(n.openBlock(),n.createElementBlock("span",X4,n.toDisplayString(L.value==="asc"?"↑":"↓"),1)):n.createCommentVNode("",!0)],8,Y4)],8,j4),n.createElementVNode("div",{class:"fe-list__col fe-list__col--size",role:"columnheader","aria-sort":Y("size")},[n.createElementVNode("button",{type:"button",class:"fe-list__sort",title:n.unref(i)("col.sort"),onClick:P[1]||(P[1]=K=>$("size"))},[n.createTextVNode(n.toDisplayString(n.unref(i)("col.size"))+" ",1),A.value==="size"?(n.openBlock(),n.createElementBlock("span",Q4,n.toDisplayString(L.value==="asc"?"↑":"↓"),1)):n.createCommentVNode("",!0)],8,J4)],8,Z4),n.createElementVNode("div",{class:"fe-list__col fe-list__col--mod",role:"columnheader","aria-sort":Y("modified")},[n.createElementVNode("button",{type:"button",class:"fe-list__sort",title:n.unref(i)("col.sort"),onClick:P[2]||(P[2]=K=>$("modified"))},[n.createTextVNode(n.toDisplayString(n.unref(i)("col.modified"))+" ",1),A.value==="modified"?(n.openBlock(),n.createElementBlock("span",n3,n.toDisplayString(L.value==="asc"?"↑":"↓"),1)):n.createCommentVNode("",!0)],8,t3)],8,e3)]),n.createElementVNode("div",a3,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(H.value,K=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:K.id},[K.label?(n.openBlock(),n.createElementBlock("div",r3,n.toDisplayString(K.label),1)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(K.nodes,J=>{var de,xe;return n.openBlock(),n.createElementBlock("div",{key:J.path,class:n.normalizeClass(["fe-list__row",{"is-selected":l(J),"is-dir":J.type==="dir","is-trash":J.trashed,"is-clipped":(de=e.clipped)==null?void 0:de.has(J.path),"is-droptarget":f.value===J.path}]),role:"row",tabindex:"0","aria-selected":l(J)?"true":"false","aria-label":n.unref(s)(J),"data-fe-path":J.path,draggable:"true",onClick:ke=>c(J,ke),onDblclick:ke=>d(J),onContextmenu:ke=>u(J,ke),onDragstart:ke=>p(J,ke),onDragover:ke=>h(J,ke),onDragleave:ke=>_(J),onDrop:ke=>b(J,ke),onTouchstartPassive:ke=>v(J,ke),onTouchend:g,onTouchmove:g},[n.createElementVNode("div",{class:"fe-list__col fe-list__col--star",role:"gridcell",onClick:P[3]||(P[3]=n.withModifiers(()=>{},["stop"]))},[typeof J.id=="number"&&J.type==="file"?(n.openBlock(),n.createBlock(ip,{key:0,starred:!!((xe=e.starredIds)!=null&&xe.has(J.id)),"node-id":J.id,"api-base":e.apiBase,"auth-headers":e.authHeaders,"auth-credentials":e.authCredentials,compact:"",onChange:ke=>r("star-change",J,ke)},null,8,["starred","node-id","api-base","auth-headers","auth-credentials","onChange"])):n.createCommentVNode("",!0)]),n.createElementVNode("div",o3,[y(J)?(n.openBlock(),n.createElementBlock("span",s3,n.toDisplayString(y(J)),1)):(n.openBlock(),n.createElementBlock("span",{key:1,class:"fe-list__icon fe-list__icon--svg","aria-hidden":"true",innerHTML:n.unref(di)(J)},null,8,l3)),n.createElementVNode("div",c3,[n.createElementVNode("span",{class:"fe-list__name",title:J.basename},[n.createTextVNode(n.toDisplayString(n.unref(s)(J))+" ",1),C(J)?(n.openBlock(),n.createElementBlock("span",u3,n.toDisplayString(n.unref(i)("search.in_content")),1)):n.createCommentVNode("",!0),e.keepBadgeFor&&e.keepBadgeFor(J)?(n.openBlock(),n.createElementBlock("span",{key:1,class:n.normalizeClass(["fe-keepbadge","fe-keepbadge--"+e.keepBadgeFor(J)]),title:n.unref(i)("keep.badge_"+e.keepBadgeFor(J)),role:"img","aria-label":n.unref(i)("keep.badge_"+e.keepBadgeFor(J))},n.toDisplayString(S(e.keepBadgeFor(J))),11,f3)):n.createCommentVNode("",!0)],8,d3),e.showParentPath?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-list__parent",title:w(J.path)},n.toDisplayString(w(J.path)||"—"),9,p3)):n.createCommentVNode("",!0),E(J)?(n.openBlock(),n.createElementBlock("span",h3,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(uo)(E(J)),(ke,ae)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:ae},[ke.match?(n.openBlock(),n.createElementBlock("mark",m3,n.toDisplayString(ke.text),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString(ke.text),1)],64))],64))),128))])):n.createCommentVNode("",!0)])]),n.createElementVNode("div",g3,n.toDisplayString(n.unref(o)(J.size)),1),n.createElementVNode("div",b3,n.toDisplayString(N(J.last_modified)),1)],42,i3)}),128))],64))),128)),!e.loading&&q.value.length===0?(n.openBlock(),n.createElementBlock("div",y3,n.toDisplayString(n.unref(i)("empty.folder")),1)):n.createCommentVNode("",!0)])],10,K4))}}),v3=["aria-label","aria-busy"],k3=["aria-selected","aria-label","data-fe-path","onClick","onDblclick","onContextmenu","onDragstart","onDragover","onDragleave","onDrop","onTouchstartPassive"],_3={class:"fe-grid__thumb"},w3=["src","alt"],E3={key:1,class:"fe-grid__icon"},S3=["innerHTML"],x3=["title"],C3=["title","aria-label"],N3=["title"],T3={class:"fe-grid__meta"},D3=["title"],B3={key:0,class:"fe-grid__mark"},A3={key:0,class:"fe-grid__empty"},lp=n.defineComponent({__name:"GridView",props:{files:{},selected:{},clipped:{},showParentPath:{type:Boolean},locale:{},loading:{type:Boolean},thumbSrc:{type:Function},keepBadgeFor:{type:Function}},emits:["click-card","dbl-card","context-card","item-drag-start","item-drop-into"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale);function l(C){return a.thumbSrc?a.thumbSrc(C):C.thumb_url??null}function c(C){return a.selected.has(C.path)}function d(C,A){r("click-card",C,{ctrl:A.ctrlKey||A.metaKey,shift:A.shiftKey})}function u(C){r("dbl-card",C)}function p(C,A){A.preventDefault(),A.stopPropagation(),r("context-card",C,A)}function f(C,A){Ic(A,s(C),a.selected.has(C.path)?a.selected.size:1),r("item-drag-start",C,A)}const h=n.ref(null);function _(C,A){C.type==="dir"&&ta(A)&&(A.preventDefault(),A.stopPropagation(),A.dataTransfer&&(A.dataTransfer.dropEffect="move"),h.value=C.path)}function b(C){h.value===C.path&&(h.value=null)}function k(C,A){h.value=null,C.type==="dir"&&ta(A)&&(A.preventDefault(),A.stopPropagation(),r("item-drop-into",C,A))}let m,v=null;function g(C,A){v=C,m&&clearTimeout(m),m=setTimeout(()=>{if(v){const L=A.touches[0];r("context-card",v,{clientX:L.clientX,clientY:L.clientY,preventDefault:()=>{}})}},500)}function y(){m&&clearTimeout(m),v=null}function S(C){const A=C.replace(/^[a-z][a-z0-9+.-]*:\/\//i,""),L=A.lastIndexOf("/");return L===-1?"":A.slice(0,L)}function x(C){return C==="kept"?"✓":C==="syncing"?"⟳":C==="partial"?"◐":"☁"}function N(C){return C.basename===".trash"?"🗑":C.mime_type==="inode/storage"?"💾":C.type==="dir"&&C.e2e===!0?"🔒":null}function w(C){const A=C.snippet;return typeof A=="string"?A:""}function E(C){return uo(C).map(A=>A.text).join("")}return(C,A)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-grid",{"is-loading":e.loading}]),role:"listbox","aria-multiselectable":"true","aria-label":n.unref(i)("grid.aria"),"aria-busy":e.loading?"true":void 0},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,L=>{var R;return n.openBlock(),n.createElementBlock("div",{key:L.path,class:n.normalizeClass(["fe-grid__card",{"is-selected":c(L),"is-dir":L.type==="dir","is-trash":L.trashed,"is-clipped":(R=e.clipped)==null?void 0:R.has(L.path),"is-droptarget":h.value===L.path}]),tabindex:"0",role:"option","aria-selected":c(L)?"true":"false","aria-label":n.unref(s)(L),"data-fe-path":L.path,draggable:"true",onClick:$=>d(L,$),onDblclick:$=>u(L),onContextmenu:$=>p(L,$),onDragstart:$=>f(L,$),onDragover:$=>_(L,$),onDragleave:$=>b(L),onDrop:$=>k(L,$),onTouchstartPassive:$=>g(L,$),onTouchend:y,onTouchmove:y},[n.createElementVNode("div",_3,[l(L)?(n.openBlock(),n.createElementBlock("img",{key:0,src:l(L),alt:L.basename,loading:"lazy",draggable:"false"},null,8,w3)):N(L)?(n.openBlock(),n.createElementBlock("span",E3,n.toDisplayString(N(L)),1)):(n.openBlock(),n.createElementBlock("span",{key:2,class:"fe-grid__icon fe-grid__icon--svg",innerHTML:n.unref(di)(L)},null,8,S3))]),n.createElementVNode("div",{class:"fe-grid__label",title:L.basename},[n.createTextVNode(n.toDisplayString(n.unref(s)(L))+" ",1),e.keepBadgeFor&&e.keepBadgeFor(L)?(n.openBlock(),n.createElementBlock("span",{key:0,class:n.normalizeClass(["fe-keepbadge","fe-keepbadge--"+e.keepBadgeFor(L)]),title:n.unref(i)("keep.badge_"+e.keepBadgeFor(L)),role:"img","aria-label":n.unref(i)("keep.badge_"+e.keepBadgeFor(L))},n.toDisplayString(x(e.keepBadgeFor(L))),11,C3)):n.createCommentVNode("",!0)],8,x3),e.showParentPath?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-grid__parent",title:S(L.path)},n.toDisplayString(S(L.path)||"—"),9,N3)):n.createCommentVNode("",!0),n.createElementVNode("div",T3,n.toDisplayString(n.unref(o)(L.size)),1),w(L)?(n.openBlock(),n.createElementBlock("div",{key:1,class:"fe-grid__snippet",title:E(w(L))},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(uo)(w(L)),($,Y)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:Y},[$.match?(n.openBlock(),n.createElementBlock("mark",B3,n.toDisplayString($.text),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString($.text),1)],64))],64))),128))],8,D3)):n.createCommentVNode("",!0)],42,k3)}),128)),!e.loading&&e.files.length===0?(n.openBlock(),n.createElementBlock("div",A3,n.toDisplayString(n.unref(i)("empty.folder")),1)):n.createCommentVNode("",!0)],10,v3))}}),M3=["aria-label","aria-busy"],O3=["aria-selected","aria-label","onClick","onDblclick","onContextmenu","onDragstart","onDragover","onDragleave","onDrop","onTouchstartPassive"],I3={class:"fe-gal__thumb"},R3=["src","alt"],L3={key:1,class:"fe-gal__icon"},z3=["innerHTML"],F3={class:"fe-gal__meta","aria-hidden":"true"},P3={key:0,class:"fe-gal__meta-line"},$3=["title"],V3=["title"],U3={key:0,class:"fe-gal__empty"},cp=n.defineComponent({__name:"GalleryView",props:{files:{},selected:{},clipped:{},showParentPath:{type:Boolean},locale:{},loading:{type:Boolean},thumbSrc:{type:Function}},emits:["click-card","dbl-card","context-card","item-drag-start","item-drop-into"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale);function l(E){return a.thumbSrc?a.thumbSrc(E):E.thumb_url??null}function c(E){return a.selected.has(E.path)}function d(E,C){r("click-card",E,{ctrl:C.ctrlKey||C.metaKey,shift:C.shiftKey})}function u(E){r("dbl-card",E)}function p(E,C){C.preventDefault(),C.stopPropagation(),r("context-card",E,C)}function f(E,C){Ic(C,s(E),a.selected.has(E.path)?a.selected.size:1),r("item-drag-start",E,C)}const h=n.ref(null);function _(E,C){E.type==="dir"&&ta(C)&&(C.preventDefault(),C.stopPropagation(),C.dataTransfer&&(C.dataTransfer.dropEffect="move"),h.value=E.path)}function b(E){h.value===E.path&&(h.value=null)}function k(E,C){h.value=null,E.type==="dir"&&ta(C)&&(C.preventDefault(),C.stopPropagation(),r("item-drop-into",E,C))}let m,v=null;function g(E,C){v=E,m&&clearTimeout(m),m=setTimeout(()=>{if(v){const A=C.touches[0];r("context-card",v,{clientX:A.clientX,clientY:A.clientY,preventDefault:()=>{}})}},500)}function y(){m&&clearTimeout(m),v=null}function S(E){const C=E.replace(/^[a-z][a-z0-9+.-]*:\/\//i,""),A=C.lastIndexOf("/");return A===-1?"":C.slice(0,A)}function x(E){return E.basename===".trash"?"🗑":E.mime_type==="inode/storage"?"💾":E.type==="dir"&&E.e2e===!0?"🔒":null}function N(E){return E?new Date(E*(E<1e12?1e3:1)).toLocaleString():""}function w(E){const C=N(E.last_modified);return[E.type==="dir"?"":o(E.size),C].filter(L=>!!L).join(" · ")}return(E,C)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-gal",{"is-loading":e.loading}]),role:"listbox","aria-multiselectable":"true","aria-label":n.unref(i)("gallery.aria"),"aria-busy":e.loading?"true":void 0},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,A=>{var L;return n.openBlock(),n.createElementBlock("div",{key:A.path,class:n.normalizeClass(["fe-gal__card",{"is-selected":c(A),"is-dir":A.type==="dir","is-trash":A.trashed,"is-clipped":(L=e.clipped)==null?void 0:L.has(A.path),"is-droptarget":h.value===A.path}]),tabindex:"0",role:"option","aria-selected":c(A)?"true":"false","aria-label":n.unref(s)(A),draggable:"true",onClick:R=>d(A,R),onDblclick:R=>u(A),onContextmenu:R=>p(A,R),onDragstart:R=>f(A,R),onDragover:R=>_(A,R),onDragleave:R=>b(A),onDrop:R=>k(A,R),onTouchstartPassive:R=>g(A,R),onTouchend:y,onTouchmove:y},[n.createElementVNode("div",I3,[l(A)?(n.openBlock(),n.createElementBlock("img",{key:0,src:l(A),alt:A.basename,loading:"lazy",draggable:"false"},null,8,R3)):x(A)?(n.openBlock(),n.createElementBlock("span",L3,n.toDisplayString(x(A)),1)):(n.openBlock(),n.createElementBlock("span",{key:2,class:"fe-gal__icon fe-gal__icon--svg",innerHTML:n.unref(di)(A)},null,8,z3)),n.createElementVNode("div",F3,[w(A)?(n.openBlock(),n.createElementBlock("span",P3,n.toDisplayString(w(A)),1)):n.createCommentVNode("",!0),e.showParentPath&&S(A.path)?(n.openBlock(),n.createElementBlock("span",{key:1,class:"fe-gal__meta-line fe-gal__meta-line--path",title:S(A.path)},n.toDisplayString(S(A.path)),9,$3)):n.createCommentVNode("",!0)])]),n.createElementVNode("div",{class:"fe-gal__label",title:A.basename},n.toDisplayString(n.unref(s)(A)),9,V3)],42,O3)}),128)),!e.loading&&e.files.length===0?(n.openBlock(),n.createElementBlock("div",U3,n.toDisplayString(n.unref(i)("empty.folder")),1)):n.createCommentVNode("",!0)],10,M3))}}),H3=n.defineComponent({__name:"UploadProgress",props:{jobs:{},locale:{},center:{}},emits:["cancel","dismiss","retry"],setup(e,{emit:t}){const a=e,r=t;function i(o){return o==="done"?"done":o==="error"?"error":o==="aborted"?"aborted":"running"}return n.watch(()=>a.jobs,o=>{a.center.sync("upload",o.map(s=>({input:{id:s.id,kind:"upload",name:s.file.name,percent:s.totalBytes>0||s.status==="done"?s.percent:null,status:i(s.status),error:s.error??null,uploadedBytes:s.uploadedBytes,totalBytes:s.totalBytes,cancellable:s.status==="uploading"||s.status==="initializing",retryable:s.status==="error"},actions:{cancel:()=>r("cancel",s),dismiss:()=>r("dismiss",s),retry:()=>r("retry",s)}})))},{immediate:!0}),(o,s)=>n.createCommentVNode("",!0)}}),G3=n.defineComponent({__name:"PendingOpsTray",props:{ops:{},locale:{},center:{}},emits:["dismiss"],setup(e,{emit:t}){const a=e,r=t;function i(s){return s.status==="done"?"done":s.status==="error"?"error":"running"}function o(s){return s.status==="done"?100:s.progress_total<=0?null:Math.min(100,Math.round(s.progress_done/s.progress_total*100))}return n.watch(()=>a.ops,s=>{a.center.sync("ops",s.map(l=>({input:{id:l.id,kind:l.op_type,name:l.target_path||l.source_dir||"",percent:o(l),status:i(l),error:l.error_message,queued:l.status==="pending",doneCount:l.progress_done,totalCount:l.progress_total,cancellable:!1,retryable:!1},actions:{dismiss:()=>r("dismiss",l.id)}})))},{immediate:!0}),(s,l)=>n.createCommentVNode("",!0)}}),K3=["aria-label"],q3={class:"fe-inspector__head"},W3={class:"fe-inspector__title"},j3=["title","aria-label"],Y3={class:"fe-inspector__scroll"},X3={class:"fe-inspector__section"},Z3={class:"fe-inspector__heading"},J3={key:0,class:"fe-inspector__hero"},Q3=["innerHTML"],ew={class:"fe-inspector__name"},tw={class:"fe-inspector__hero"},nw=["src"],aw=["innerHTML"],rw=["title"],iw={class:"fe-inspector__meta"},ow={class:"fe-inspector__row"},sw={class:"fe-inspector__pathcell"},lw=["title"],cw=["title","aria-label"],dw={key:0,class:"fe-inspector__row"},uw={class:"fe-inspector__row"},fw={key:1,class:"fe-inspector__row"},pw={class:"fe-inspector__mime"},hw={key:2,class:"fe-inspector__row"},mw={class:"fe-inspector__pathcell"},gw=["title"],bw=["title","aria-label"],yw={key:2,class:"fe-inspector__hero"},vw=["innerHTML"],kw=["title"],_w={class:"fe-inspector__sub"},ww={key:0,class:"fe-inspector__section"},Ew={class:"fe-inspector__heading"},Sw={key:0,class:"fe-inspector__empty"},xw={key:0,class:"fe-inspector__empty"},Cw={key:1,class:"fe-inspector__versions"},Nw={class:"fe-inspector__version-main"},Tw={class:"fe-inspector__version-n"},Dw={class:"fe-inspector__version-meta"},Bw={key:0,class:"fe-inspector__confirm"},Aw={class:"fe-inspector__confirm-q"},Mw={class:"fe-inspector__check"},Ow={class:"fe-inspector__confirm-actions"},Iw=["disabled","onClick"],Rw=["disabled"],Lw=["disabled","onClick"],zw=["disabled"],Fw={key:1,class:"fe-inspector__section"},Pw={class:"fe-inspector__heading"},$w={class:"fe-inspector__permrow"},Vw={key:2,class:"fe-inspector__section"},Uw={class:"fe-inspector__heading"},Hw={key:0,class:"fe-inspector__empty"},Gw={key:1,class:"fe-inspector__shares"},Kw=["title"],qw={key:0,class:"fe-inspector__badge fe-inspector__badge--pin"},Ww={key:1,class:"fe-inspector__share-exp"},jw=["title","aria-label","onClick"],Yw={key:3,class:"fe-inspector__section"},Xw={class:"fe-inspector__heading"},Zw={key:0,class:"fe-inspector__countbadge"},Jw={key:0,class:"fe-inspector__empty"},Qw={key:0,class:"fe-inspector__empty"},e5={key:1,class:"fe-inspector__comments"},t5={class:"fe-inspector__comment-top"},n5=["title"],a5=["title"],r5=["disabled","title","aria-label","onClick"],i5={class:"fe-inspector__comment-body"},o5=["placeholder","aria-label","disabled"],s5=["disabled"],l5=n.defineComponent({__name:"InspectorPanel",props:{api:{},nodes:{},dirLabel:{},dirCount:{},dirPerm:{},locale:{},narrow:{type:Boolean},thumbSrc:{type:Function}},emits:["close","manage-permissions","toast","changed"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale),l=n.computed(()=>a.nodes.length===1?a.nodes[0]:null),c=n.computed(()=>a.nodes.length>1),d=n.computed(()=>{var ae;return((ae=l.value)==null?void 0:ae.type)==="file"}),u=n.computed(()=>{var ae;return typeof((ae=l.value)==null?void 0:ae.id)=="number"?l.value.id:null}),p=n.computed(()=>a.nodes.reduce((ae,be)=>ae+(typeof be.size=="number"?be.size:0),0)),f=n.computed(()=>{var be;const ae=(be=l.value)==null?void 0:be.etag;return typeof ae=="string"&&ae!==""?ae:null}),h=n.computed(()=>l.value&&d.value&&a.thumbSrc?a.thumbSrc(l.value):null);function _(ae){return ae.length>12?`${ae.slice(0,12)}…`:ae}function b(ae){if(!ae)return"—";try{return new Date(ae).toLocaleString(a.locale==="en"?"en-GB":"tr-TR",{dateStyle:"medium",timeStyle:"short"})}catch{return new Date(ae).toISOString()}}function k(ae){if(!ae)return"—";const be=Date.parse(ae);return Number.isNaN(be)?ae:b(be)}async function m(ae){try{await navigator.clipboard.writeText(ae),r("toast",i("inspector.copied"))}catch{r("toast",ae)}}const v=n.computed(()=>{if(!l.value)return"";const ae=l.value.perm;return typeof ae=="string"&&ae!==""?ae:a.dirPerm||""}),g=n.computed(()=>v.value==="editor"||v.value==="owner");function y(ae){return i(`inspector.perm.${ae}`)===`inspector.perm.${ae}`?ae:i(`inspector.perm.${ae}`)}const S=n.ref("idle"),x=n.ref([]),N=n.ref(null),w=n.ref(!0),E=n.ref(!1),C=n.ref("idle"),A=n.ref([]);let L=0;async function R(){const ae=++L;if(N.value=null,x.value=[],A.value=[],l.value&&d.value&&u.value!=null?(S.value="loading",$(ae)):S.value="hidden",l.value){C.value="loading";const be=l.value.path;try{const{shares:_e}=await a.api.listShares(be);if(ae!==L)return;A.value=Array.isArray(_e)?_e:[],C.value="ok"}catch{if(ae!==L)return;C.value="hidden"}}else C.value="hidden"}async function $(ae){const be=u.value;if(be!=null)try{const _e=await a.api.listVersions(be);if(ae!==L)return;x.value=_e,S.value="ok"}catch(_e){if(ae!==L)return;const Ce=_e.status;Ce===401||Ce===403||Ce===404?S.value="hidden":S.value="error"}}function Y(ae){N.value=ae.id,w.value=!0}async function F(ae){const be=u.value;if(!(be==null||E.value)){E.value=!0;try{await a.api.restoreVersion(be,ae.id,w.value),r("toast",i("inspector.versions.restored")),N.value=null,r("changed"),await $(++L)}catch(_e){r("toast",_e.message)}finally{E.value=!1}}}async function q(){const ae=u.value;if(!(ae==null||E.value)){E.value=!0;try{await a.api.snapshotVersion(ae),r("toast",i("inspector.versions.snapshotted")),await $(++L)}catch(be){const _e=be.status;_e===404||_e===405||_e===501?r("toast",i("inspector.versions.unsupported")):r("toast",be.message)}finally{E.value=!1}}}n.watch(()=>a.nodes.map(ae=>ae.path).join("\0"),()=>void R(),{immediate:!0});const X=n.ref("hidden"),z=n.ref([]),H=n.ref(""),O=n.ref(!1),P=n.computed(()=>{var ae;return typeof((ae=l.value)==null?void 0:ae.id)=="number"?l.value.id:null});let K=0;async function J(){const ae=++K,be=P.value;if(be==null){X.value="hidden",z.value=[];return}X.value=z.value.length>0?"ok":"loading";try{const _e=await a.api.listComments(be);if(ae!==K)return;z.value=_e,X.value="ok"}catch(_e){if(ae!==K)return;z.value=[];const Ce=_e.status;X.value=Ce===401||Ce===403||Ce===404?"hidden":"error"}}async function de(){const ae=P.value,be=H.value.trim();if(!(ae==null||be===""||O.value)){O.value=!0;try{await a.api.addComment(ae,be),H.value="",await J()}catch(_e){r("toast",_e.message)}finally{O.value=!1}}}async function xe(ae){if(!O.value){O.value=!0;try{await a.api.deleteComment(ae.id),await J()}catch(be){r("toast",be.message)}finally{O.value=!1}}}function ke(ae){const be=Date.parse(ae);if(Number.isNaN(be))return ae;const _e=Math.round((be-Date.now())/1e3),Ce=Math.abs(_e),Ve=[["year",31536e3],["month",2592e3],["day",86400],["hour",3600],["minute",60]];try{const rt=new Intl.RelativeTimeFormat(a.locale==="en"?"en":"tr",{numeric:"auto"});for(const[tt,Pe]of Ve)if(Ce>=Pe)return rt.format(Math.trunc(_e/Pe),tt);return rt.format(_e,"second")}catch{return k(ae)}}return n.watch(()=>P.value,()=>{z.value=[],H.value="",J()},{immediate:!0}),(ae,be)=>(n.openBlock(),n.createElementBlock("aside",{class:n.normalizeClass(["fe-inspector",{"fe-inspector--overlay":e.narrow}]),role:"complementary","aria-label":n.unref(i)("inspector.title")},[n.createElementVNode("header",q3,[n.createElementVNode("h2",W3,n.toDisplayString(n.unref(i)("inspector.title")),1),n.createElementVNode("button",{type:"button",class:"fe-inspector__close",title:n.unref(i)("inspector.close"),"aria-label":n.unref(i)("inspector.close"),onClick:be[0]||(be[0]=_e=>r("close"))},"×",8,j3)]),n.createElementVNode("div",Y3,[n.createElementVNode("section",X3,[n.createElementVNode("h3",Z3,n.toDisplayString(n.unref(i)("inspector.section.general")),1),c.value?(n.openBlock(),n.createElementBlock("div",J3,[n.createElementVNode("span",{class:"fe-inspector__bigicon",innerHTML:n.unref(di)({type:"dir"})},null,8,Q3),n.createElementVNode("p",ew,n.toDisplayString(n.unref(i)("inspector.items_summary",{n:e.nodes.length,size:n.unref(o)(p.value)})),1)])):l.value?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",tw,[h.value?(n.openBlock(),n.createElementBlock("img",{key:0,class:"fe-inspector__thumb",src:h.value,alt:"","aria-hidden":"true"},null,8,nw)):(n.openBlock(),n.createElementBlock("span",{key:1,class:"fe-inspector__bigicon",innerHTML:n.unref(di)(l.value)},null,8,aw)),n.createElementVNode("p",{class:"fe-inspector__name",title:l.value.basename},n.toDisplayString(n.unref(s)(l.value)),9,rw)]),n.createElementVNode("dl",iw,[n.createElementVNode("div",ow,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.path")),1),n.createElementVNode("dd",sw,[n.createElementVNode("span",{class:"fe-inspector__path",title:l.value.path},n.toDisplayString(l.value.path),9,lw),n.createElementVNode("button",{type:"button",class:"fe-inspector__copy",title:n.unref(i)("inspector.copy"),"aria-label":n.unref(i)("inspector.copy"),onClick:be[1]||(be[1]=_e=>m(l.value.path))},"⧉",8,cw)])]),d.value?(n.openBlock(),n.createElementBlock("div",dw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.size")),1),n.createElementVNode("dd",null,n.toDisplayString(n.unref(o)(typeof l.value.size=="number"?l.value.size:null)),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",uw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.modified")),1),n.createElementVNode("dd",null,n.toDisplayString(b(l.value.last_modified)),1)]),d.value&&l.value.mime_type?(n.openBlock(),n.createElementBlock("div",fw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.mime")),1),n.createElementVNode("dd",pw,n.toDisplayString(l.value.mime_type),1)])):n.createCommentVNode("",!0),f.value?(n.openBlock(),n.createElementBlock("div",hw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.etag")),1),n.createElementVNode("dd",mw,[n.createElementVNode("span",{class:"fe-inspector__path",title:f.value},n.toDisplayString(_(f.value)),9,gw),n.createElementVNode("button",{type:"button",class:"fe-inspector__copy",title:n.unref(i)("inspector.copy"),"aria-label":n.unref(i)("inspector.copy"),onClick:be[2]||(be[2]=_e=>m(f.value))},"⧉",8,bw)])])):n.createCommentVNode("",!0)])],64)):(n.openBlock(),n.createElementBlock("div",yw,[n.createElementVNode("span",{class:"fe-inspector__bigicon",innerHTML:n.unref(di)({type:"dir"})},null,8,vw),n.createElementVNode("p",{class:"fe-inspector__name",title:e.dirLabel},n.toDisplayString(e.dirLabel),9,kw),n.createElementVNode("p",_w,n.toDisplayString(n.unref(i)("inspector.folder_items",{n:e.dirCount})),1)]))]),S.value==="ok"||S.value==="error"?(n.openBlock(),n.createElementBlock("section",ww,[n.createElementVNode("h3",Ew,n.toDisplayString(n.unref(i)("inspector.section.versions")),1),S.value==="error"?(n.openBlock(),n.createElementBlock("p",Sw,n.toDisplayString(n.unref(i)("inspector.error")),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[x.value.length===0?(n.openBlock(),n.createElementBlock("p",xw,n.toDisplayString(n.unref(i)("inspector.versions.empty")),1)):(n.openBlock(),n.createElementBlock("ul",Cw,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(x.value,_e=>(n.openBlock(),n.createElementBlock("li",{key:_e.id,class:"fe-inspector__version"},[n.createElementVNode("div",Nw,[n.createElementVNode("span",Tw,n.toDisplayString(n.unref(i)("inspector.versions.v",{n:_e.version_n})),1),n.createElementVNode("span",Dw,n.toDisplayString(k(_e.created_at))+" · "+n.toDisplayString(n.unref(o)(_e.size)),1)]),N.value===_e.id?(n.openBlock(),n.createElementBlock("div",Bw,[n.createElementVNode("p",Aw,n.toDisplayString(n.unref(i)("inspector.versions.restore_confirm")),1),n.createElementVNode("label",Mw,[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":be[3]||(be[3]=Ce=>w.value=Ce),type:"checkbox"},null,512),[[n.vModelCheckbox,w.value]]),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("inspector.versions.snapshot_current")),1)]),n.createElementVNode("div",Ow,[n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary fe-btn--sm",disabled:E.value,onClick:Ce=>F(_e)},n.toDisplayString(n.unref(i)("inspector.versions.confirm")),9,Iw),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--sm",disabled:E.value,onClick:be[4]||(be[4]=Ce=>N.value=null)},n.toDisplayString(n.unref(i)("inspector.versions.cancel")),9,Rw)])])):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-btn--sm",disabled:E.value,onClick:Ce=>Y(_e)},n.toDisplayString(n.unref(i)("inspector.versions.restore")),9,Lw))]))),128))])),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--sm fe-inspector__snapshot",disabled:E.value,onClick:q},n.toDisplayString(n.unref(i)("inspector.versions.take_snapshot")),9,zw)],64))])):n.createCommentVNode("",!0),l.value&&v.value?(n.openBlock(),n.createElementBlock("section",Fw,[n.createElementVNode("h3",Pw,n.toDisplayString(n.unref(i)("inspector.section.permissions")),1),n.createElementVNode("div",$w,[n.createElementVNode("span",{class:n.normalizeClass(["fe-inspector__badge",`fe-inspector__badge--${v.value}`])},n.toDisplayString(y(v.value)),3),g.value?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--sm",onClick:be[5]||(be[5]=_e=>r("manage-permissions",l.value))},n.toDisplayString(n.unref(i)("inspector.perm.manage")),1)):n.createCommentVNode("",!0)])])):n.createCommentVNode("",!0),C.value==="ok"?(n.openBlock(),n.createElementBlock("section",Vw,[n.createElementVNode("h3",Uw,n.toDisplayString(n.unref(i)("inspector.section.shares")),1),A.value.length===0?(n.openBlock(),n.createElementBlock("p",Hw,n.toDisplayString(n.unref(i)("inspector.shares.empty")),1)):(n.openBlock(),n.createElementBlock("ul",Gw,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(A.value,_e=>(n.openBlock(),n.createElementBlock("li",{key:_e.uuid,class:"fe-inspector__share"},[n.createElementVNode("span",{class:"fe-inspector__share-url",title:_e.url},n.toDisplayString(_e.url),9,Kw),_e.password_pin?(n.openBlock(),n.createElementBlock("span",qw,"PIN")):n.createCommentVNode("",!0),_e.expires_at?(n.openBlock(),n.createElementBlock("span",Ww,n.toDisplayString(k(_e.expires_at)),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-inspector__copy",title:n.unref(i)("inspector.shares.copy"),"aria-label":n.unref(i)("inspector.shares.copy"),onClick:Ce=>m(_e.url)},"⧉",8,jw)]))),128))]))])):n.createCommentVNode("",!0),X.value==="ok"||X.value==="error"?(n.openBlock(),n.createElementBlock("section",Yw,[n.createElementVNode("h3",Xw,[n.createTextVNode(n.toDisplayString(n.unref(i)("inspector.section.comments"))+" ",1),z.value.length>0?(n.openBlock(),n.createElementBlock("span",Zw,n.toDisplayString(z.value.length),1)):n.createCommentVNode("",!0)]),X.value==="error"?(n.openBlock(),n.createElementBlock("p",Jw,n.toDisplayString(n.unref(i)("inspector.error")),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[z.value.length===0?(n.openBlock(),n.createElementBlock("p",Qw,n.toDisplayString(n.unref(i)("inspector.comments.empty")),1)):(n.openBlock(),n.createElementBlock("ul",e5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(z.value,_e=>(n.openBlock(),n.createElementBlock("li",{key:_e.id,class:"fe-inspector__comment"},[n.createElementVNode("div",t5,[n.createElementVNode("span",{class:"fe-inspector__comment-author",title:_e.author_name},n.toDisplayString(_e.author_name||"—"),9,n5),n.createElementVNode("span",{class:"fe-inspector__comment-time",title:k(_e.created_at)},n.toDisplayString(ke(_e.created_at)),9,a5),_e.can_delete?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-inspector__comment-del",disabled:O.value,title:n.unref(i)("inspector.comments.delete"),"aria-label":n.unref(i)("inspector.comments.delete"),onClick:Ce=>xe(_e)},"×",8,r5)):n.createCommentVNode("",!0)]),n.createElementVNode("p",i5,n.toDisplayString(_e.body),1)]))),128))])),n.createElementVNode("form",{class:"fe-inspector__comment-form",onSubmit:n.withModifiers(de,["prevent"])},[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":be[6]||(be[6]=_e=>H.value=_e),type:"text",class:"fe-inspector__comment-input",maxlength:"5000",placeholder:n.unref(i)("inspector.comments.placeholder"),"aria-label":n.unref(i)("inspector.comments.placeholder"),disabled:O.value},null,8,o5),[[n.vModelText,H.value]]),n.createElementVNode("button",{type:"submit",class:"fe-btn fe-btn--primary fe-btn--sm",disabled:O.value||H.value.trim()===""},n.toDisplayString(n.unref(i)("inspector.comments.send")),9,s5)],32)],64))])):n.createCommentVNode("",!0)])],10,K3))}}),c5=["aria-label"],d5={class:"fe-cmdp__inputwrap"},u5=["placeholder"],f5=["aria-selected","onMouseenter","onClick"],p5={class:"fe-cmdp__icon","aria-hidden":"true"},h5={class:"fe-cmdp__label"},m5={class:"fe-cmdp__group"},g5=["aria-selected","onMouseenter","onClick"],b5={class:"fe-cmdp__icon","aria-hidden":"true"},y5={class:"fe-cmdp__label"},v5={class:"fe-cmdp__group"},k5={key:0,class:"fe-cmdp__loading"},_5=["aria-selected","onMouseenter","onClick"],w5={class:"fe-cmdp__icon","aria-hidden":"true"},E5={class:"fe-cmdp__hitbody"},S5={class:"fe-cmdp__hitline"},x5={class:"fe-cmdp__label"},C5={key:0,class:"fe-cmdp__badge"},N5=["title"],T5={key:1,class:"fe-cmdp__snippet"},D5={key:0,class:"fe-cmdp__mark"},B5={class:"fe-cmdp__group"},A5=["aria-selected","onMouseenter","onClick","onKeydown"],M5={class:"fe-cmdp__icon","aria-hidden":"true"},O5={class:"fe-cmdp__label"},I5=["title","aria-label","onClick"],R5={class:"fe-cmdp__group"},L5=["aria-selected","onMouseenter","onClick"],z5={class:"fe-cmdp__icon","aria-hidden":"true"},F5={class:"fe-cmdp__label"},P5={key:4,class:"fe-cmdp__empty"},$5={class:"fe-cmdp__hint"},V5=3,U5=8,H5=250,dp="filex.saved-searches",up=10,G5=n.defineComponent({__name:"CommandPalette",props:{open:{type:Boolean},locale:{},files:{},viewMode:{},canWrite:{type:Boolean},canGoUp:{type:Boolean},globalSearch:{type:Function},splitEnabled:{type:Boolean}},emits:["close","open-node","navigate","new-folder","upload","toggle-view","open-trash","refresh","go-up","open-hit","open-theme","open-shortcut-settings","start-tour","tab-new","split-toggle"],setup(e,{emit:t}){const a=e,r=t,{t:i,nodeDisplayName:o}=zt(()=>a.locale),s=n.ref(""),l=n.ref(0),c=n.ref(null),d=n.ref(null);function u(z,H){if(!H)return 0;const O=z.toLocaleLowerCase(),P=H.toLocaleLowerCase(),K=O.indexOf(P);if(K===-1)return-1;let J=100-Math.min(K,50);return K===0&&(J+=40),J-=Math.min(O.length,40)/4,J}const p=n.computed(()=>{const z=s.value.trim();if(!z.includes("/"))return[];const H=z.replace(/^\/+|\/+$/g,"");return H?[{kind:"goto",id:`goto:${H}`,label:`${i("palette.goto")}: ${H}`,icon:"➜",path:H}]:[]}),f=n.computed(()=>{const z=s.value.trim(),H=a.files.map(O=>({f:O,name:o(O),s:u(o(O),z)})).filter(O=>O.s>=0);return z&&H.sort((O,P)=>P.s-O.s),H.slice(0,8).map(O=>({kind:"file",id:`file:${O.f.path}`,label:O.name,icon:O.f.type==="dir"?"📁":"📄",node:O.f}))}),h=n.computed(()=>{const z=s.value.trim();return[{command:"new-folder",label:i("toolbar.new_folder"),icon:"📁",enabled:a.canWrite!==!1},{command:"upload",label:i("toolbar.upload"),icon:"⬆",enabled:a.canWrite!==!1},{command:"toggle-view",label:i("cmd.view_toggle"),icon:a.viewMode==="list"?"▦":a.viewMode==="grid"?"▣":"☰",enabled:!0},{command:"open-trash",label:i("cmd.trash"),icon:"🗑",enabled:!0},{command:"refresh",label:i("toolbar.refresh"),icon:"⟳",enabled:!0},{command:"go-up",label:i("toolbar.go_up"),icon:"↑",enabled:a.canGoUp!==!1},{command:"open-theme",label:i("theme.menu"),icon:"🎨",enabled:!0},{command:"open-shortcut-settings",label:i("shortcuts.settings.menu"),icon:"⌨",enabled:!0},{command:"start-tour",label:i("tour.restart"),icon:"🎓",enabled:!0},{command:"tab-new",label:i("cmd.tab_new"),icon:"⧉",enabled:!0},{command:"split-toggle",label:i("cmd.split_toggle"),icon:"◫",enabled:a.splitEnabled!==!1}].filter(O=>O.enabled&&u(O.label,z)>=0).map(O=>({kind:"command",id:`cmd:${O.command}`,label:O.label,icon:O.icon,command:O.command}))}),_=n.ref([]),b=n.ref(!1);let k,m=0;function v(z){k&&clearTimeout(k);const H=a.globalSearch;if(!H||z.length<V5){_.value=[],b.value=!1;return}b.value=!0,k=setTimeout(async()=>{const O=++m;try{const P=await H(z);if(O!==m)return;_.value=Array.isArray(P)?P.slice(0,U5):[]}catch{O===m&&(_.value=[])}finally{O===m&&(b.value=!1)}},H5)}function g(z){const H=String(z.path??"").replace(/^\/+|\/+$/g,""),O=H.lastIndexOf("/"),P=O===-1?"":H.slice(0,O),K=typeof z.storage=="string"&&z.storage||typeof z.storage_name=="string"&&z.storage_name||"";return K&&P?`${K}/${P}`:K||P||"/"}const y=n.computed(()=>_.value.map(z=>({kind:"hit",id:`hit:${z.storage_id??""}:${z.path??""}:${z.id??""}`,label:String(z.name??z.path??""),icon:z.type==="dir"?"📁":"📄",hit:z,crumb:g(z),inContent:Oc(z.matched),snippet:typeof z.snippet=="string"?z.snippet:""}))),S=n.ref([]);function x(){try{const z=localStorage.getItem(dp);if(!z)return[];const H=JSON.parse(z);return Array.isArray(H)?H.filter(O=>typeof O=="string"&&O.trim()!=="").slice(0,up):[]}catch{return[]}}function N(z){S.value=z.slice(0,up);try{localStorage.setItem(dp,JSON.stringify(S.value))}catch{}}function w(z){const H=z.trim();if(!H)return;const O=S.value.filter(P=>P!==H);O.unshift(H),N(O)}function E(z){N(S.value.filter(H=>H!==z)),l.value>=A.value.length&&(l.value=Math.max(0,A.value.length-1))}const C=n.computed(()=>{const z=s.value.trim(),H=[];z&&!S.value.includes(z)&&H.push({kind:"save",id:`save:${z}`,label:`${i("palette.save")}: ${z}`,icon:"💾",query:z});const O=S.value.map(P=>({s:P,sc:u(P,z)})).filter(P=>P.sc>=0||!z);for(const P of O)H.push({kind:"saved",id:`saved:${P.s}`,label:P.s,icon:"🔖",query:P.s});return H}),A=n.computed(()=>[...p.value,...f.value,...y.value,...C.value,...h.value]),L=n.computed(()=>p.value.length),R=n.computed(()=>L.value+f.value.length),$=n.computed(()=>R.value+y.value.length),Y=n.computed(()=>$.value+C.value.length);n.watch(s,z=>{l.value=0,v(z.trim())});function F(z){const H=A.value.length;H&&(l.value=(l.value+z+H)%H,n.nextTick(()=>{var O,P;(P=(O=d.value)==null?void 0:O.querySelector(".is-active"))==null||P.scrollIntoView({block:"nearest"})}))}function q(z){const H=z??A.value[l.value];if(H){if(H.kind==="saved"){s.value=H.query,n.nextTick(()=>{var O;return(O=c.value)==null?void 0:O.focus()});return}if(H.kind==="save"){w(H.query),n.nextTick(()=>{var O;return(O=c.value)==null?void 0:O.focus()});return}if(r("close"),H.kind==="hit"){r("open-hit",H.hit);return}if(H.kind==="file")r("open-node",H.node);else if(H.kind==="goto")r("navigate",H.path);else switch(H.command){case"new-folder":r("new-folder");break;case"upload":r("upload");break;case"toggle-view":r("toggle-view");break;case"open-trash":r("open-trash");break;case"refresh":r("refresh");break;case"go-up":r("go-up");break;case"open-theme":r("open-theme");break;case"open-shortcut-settings":r("open-shortcut-settings");break;case"start-tour":r("start-tour");break;case"tab-new":r("tab-new");break;case"split-toggle":r("split-toggle");break}}}function X(z){if(a.open)switch(z.key){case"ArrowDown":z.preventDefault(),z.stopPropagation(),F(1);break;case"ArrowUp":z.preventDefault(),z.stopPropagation(),F(-1);break;case"Enter":z.preventDefault(),z.stopPropagation(),q();break;case"Escape":z.preventDefault(),z.stopPropagation(),r("close");break}}return n.watch(()=>a.open,z=>{z?(s.value="",l.value=0,_.value=[],b.value=!1,S.value=x(),document.addEventListener("keydown",X,!0),n.nextTick(()=>{var H;return(H=c.value)==null?void 0:H.focus()})):(k&&clearTimeout(k),document.removeEventListener("keydown",X,!0))}),n.onBeforeUnmount(()=>{k&&clearTimeout(k),document.removeEventListener("keydown",X,!0)}),(z,H)=>(n.openBlock(),n.createBlock(n.Transition,{name:"fe-modal"},{default:n.withCtx(()=>[e.open?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-modal__backdrop fe-cmdp__backdrop",role:"presentation",onClick:H[2]||(H[2]=O=>r("close"))},[n.createElementVNode("div",{class:"fe-cmdp",role:"dialog","aria-modal":"true","aria-label":n.unref(i)("palette.placeholder"),onClick:H[1]||(H[1]=n.withModifiers(()=>{},["stop"]))},[n.createElementVNode("div",d5,[H[3]||(H[3]=n.createElementVNode("svg",{class:"fe-cmdp__glyph",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","aria-hidden":"true"},[n.createElementVNode("circle",{cx:"7",cy:"7",r:"4.5"}),n.createElementVNode("path",{d:"m10.5 10.5 3.5 3.5"})],-1)),n.withDirectives(n.createElementVNode("input",{ref_key:"inputEl",ref:c,"onUpdate:modelValue":H[0]||(H[0]=O=>s.value=O),type:"text",class:"fe-cmdp__input",placeholder:n.unref(i)("palette.placeholder"),autocomplete:"off",spellcheck:"false"},null,8,u5),[[n.vModelText,s.value]])]),n.createElementVNode("div",{ref_key:"listEl",ref:d,class:"fe-cmdp__list",role:"listbox"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(p.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item",{"is-active":P===l.value}]),role:"option","aria-selected":P===l.value,onMouseenter:K=>l.value=P,onClick:K=>q(O)},[n.createElementVNode("span",p5,n.toDisplayString(O.icon),1),n.createElementVNode("span",h5,n.toDisplayString(O.label),1)],42,f5))),128)),f.value.length?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",m5,n.toDisplayString(n.unref(i)("palette.files")),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(f.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item",{"is-active":L.value+P===l.value}]),role:"option","aria-selected":L.value+P===l.value,onMouseenter:K=>l.value=L.value+P,onClick:K=>q(O)},[n.createElementVNode("span",b5,n.toDisplayString(O.icon),1),n.createElementVNode("span",y5,n.toDisplayString(O.label),1)],42,g5))),128))],64)):n.createCommentVNode("",!0),y.value.length||b.value?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",v5,n.toDisplayString(n.unref(i)("palette.everywhere")),1),b.value&&!y.value.length?(n.openBlock(),n.createElementBlock("div",k5,n.toDisplayString(n.unref(i)("palette.searching")),1)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(y.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item fe-cmdp__item--hit",{"is-active":R.value+P===l.value}]),role:"option","aria-selected":R.value+P===l.value,onMouseenter:K=>l.value=R.value+P,onClick:K=>q(O)},[n.createElementVNode("span",w5,n.toDisplayString(O.icon),1),n.createElementVNode("span",E5,[n.createElementVNode("span",S5,[n.createElementVNode("span",x5,n.toDisplayString(O.label),1),O.inContent?(n.openBlock(),n.createElementBlock("span",C5,n.toDisplayString(n.unref(i)("search.in_content")),1)):n.createCommentVNode("",!0)]),O.crumb?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-cmdp__crumb",title:O.crumb},n.toDisplayString(O.crumb),9,N5)):n.createCommentVNode("",!0),O.snippet?(n.openBlock(),n.createElementBlock("span",T5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(uo)(O.snippet),(K,J)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:J},[K.match?(n.openBlock(),n.createElementBlock("mark",D5,n.toDisplayString(K.text),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString(K.text),1)],64))],64))),128))])):n.createCommentVNode("",!0)])],42,_5))),128))],64)):n.createCommentVNode("",!0),C.value.length?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("div",B5,n.toDisplayString(n.unref(i)("palette.saved")),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(C.value,(O,P)=>(n.openBlock(),n.createElementBlock("div",{key:O.id,class:n.normalizeClass(["fe-cmdp__item fe-cmdp__item--saved",{"is-active":$.value+P===l.value}]),role:"option","aria-selected":$.value+P===l.value,tabindex:"-1",onMouseenter:K=>l.value=$.value+P,onClick:K=>q(O),onKeydown:n.withKeys(n.withModifiers(K=>q(O),["prevent"]),["enter"])},[n.createElementVNode("span",M5,n.toDisplayString(O.icon),1),n.createElementVNode("span",O5,n.toDisplayString(O.label),1),O.kind==="saved"?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-cmdp__del",title:n.unref(i)("palette.saved.delete"),"aria-label":n.unref(i)("palette.saved.delete"),onClick:n.withModifiers(K=>E(O.query),["stop"])},"🗑",8,I5)):n.createCommentVNode("",!0)],42,A5))),128))],64)):n.createCommentVNode("",!0),h.value.length?(n.openBlock(),n.createElementBlock(n.Fragment,{key:3},[n.createElementVNode("div",R5,n.toDisplayString(n.unref(i)("palette.commands")),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(h.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item",{"is-active":Y.value+P===l.value}]),role:"option","aria-selected":Y.value+P===l.value,onMouseenter:K=>l.value=Y.value+P,onClick:K=>q(O)},[n.createElementVNode("span",z5,n.toDisplayString(O.icon),1),n.createElementVNode("span",F5,n.toDisplayString(O.label),1)],42,L5))),128))],64)):n.createCommentVNode("",!0),A.value.length===0&&!b.value?(n.openBlock(),n.createElementBlock("div",P5,n.toDisplayString(n.unref(i)("palette.empty")),1)):n.createCommentVNode("",!0)],512),n.createElementVNode("div",$5,n.toDisplayString(n.unref(i)("palette.hint")),1)],8,c5)])):n.createCommentVNode("",!0)]),_:1}))}}),K5=["aria-labelledby","aria-label"],q5={key:0,class:"fe-modal__head"},W5={class:"fe-modal__body"},j5={key:1,class:"fe-modal__actions"},fp='input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),a[href],[tabindex]:not([tabindex="-1"])',Ua=n.defineComponent({__name:"Modal",props:{open:{type:Boolean},title:{},size:{},closeOnBackdrop:{type:Boolean},chromeless:{type:Boolean},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,i=n.ref(null);let o=0;const s=`fe-modal-title-${++o}-${Math.random().toString(36).slice(2,7)}`;let l=null;n.watch(()=>a.open,u=>{var p;u?(l=document.activeElement??null,document.addEventListener("keydown",c),setTimeout(()=>{var h;const f=(h=i.value)==null?void 0:h.querySelector(fp);f==null||f.focus()},30)):(document.removeEventListener("keydown",c),(p=l==null?void 0:l.focus)==null||p.call(l),l=null)}),n.onBeforeUnmount(()=>document.removeEventListener("keydown",c));function c(u){if(u.key==="Escape"){r("close");return}if(u.key==="Tab"&&i.value){const p=Array.from(i.value.querySelectorAll(fp)).filter(b=>b.offsetParent!==null||b===document.activeElement);if(p.length===0)return;const f=p[0],h=p[p.length-1],_=document.activeElement;u.shiftKey&&(_===f||!i.value.contains(_))?(u.preventDefault(),h.focus()):!u.shiftKey&&(_===h||!i.value.contains(_))&&(u.preventDefault(),f.focus())}}function d(){a.closeOnBackdrop!==!1&&r("close")}return(u,p)=>(n.openBlock(),n.createBlock(n.Transition,{name:"fe-modal"},{default:n.withCtx(()=>[e.open?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe fe-modal__backdrop",[{"fe-modal__backdrop--chromeless":e.chromeless},e.theme==="light"?"fe--theme-light":"",e.theme==="dark"?"fe--theme-dark":""]]),role:"presentation",onClick:d},[n.createElementVNode("div",{ref_key:"cardEl",ref:i,class:n.normalizeClass(["fe-modal__card",[`fe-modal__card--${e.size||"md"}`,e.chromeless&&"fe-modal__card--chromeless"]]),role:"dialog","aria-modal":"true","aria-labelledby":e.title&&!e.chromeless?s:void 0,"aria-label":(!e.title||e.chromeless)&&e.title||void 0,onClick:p[1]||(p[1]=n.withModifiers(()=>{},["stop"]))},[e.title&&!e.chromeless?(n.openBlock(),n.createElementBlock("header",q5,[n.createElementVNode("h2",{id:s,class:"fe-modal__title"},n.toDisplayString(e.title),1),n.createElementVNode("button",{type:"button",class:"fe-modal__close","aria-label":"Close",onClick:p[0]||(p[0]=f=>r("close"))},"×")])):n.createCommentVNode("",!0),n.createElementVNode("div",W5,[n.renderSlot(u.$slots,"default")]),u.$slots.actions&&!e.chromeless?(n.openBlock(),n.createElementBlock("footer",j5,[n.renderSlot(u.$slots,"actions")])):n.createCommentVNode("",!0)],10,K5)],2)):n.createCommentVNode("",!0)]),_:3}))}}),Y5={class:"fe-shortcuts"},X5={class:"fe-shortcuts__heading"},Z5={class:"fe-shortcuts__table"},J5={class:"fe-shortcuts__keys"},Q5={key:0,class:"fe-shortcuts__unbound"},e6={class:"fe-kbd"},t6={key:0,class:"fe-shortcuts__or","aria-hidden":"true"},n6={class:"fe-shortcuts__desc"},a6=["title"],r6=n.defineComponent({__name:"ShortcutsHelp",props:{open:{type:Boolean},locale:{}},emits:["close","customize"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=Tc(),s=n.computed(()=>{const l=[],c=new Map;for(const d of o.value)c.has(d.groupKey)||(c.set(d.groupKey,[]),l.push(d.groupKey)),c.get(d.groupKey).push(d);return l.map(d=>({key:d,items:c.get(d)}))});return(l,c)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("shortcuts.title"),size:"md",onClose:c[2]||(c[2]=d=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:c[0]||(c[0]=d=>r("customize"))}," ⌨ "+n.toDisplayString(n.unref(i)("shortcuts.customize")),1),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:c[1]||(c[1]=d=>r("close"))},n.toDisplayString(n.unref(i)("viewer.close")),1)]),default:n.withCtx(()=>[n.createElementVNode("div",Y5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(s.value,d=>(n.openBlock(),n.createElementBlock("section",{key:d.key,class:"fe-shortcuts__group"},[n.createElementVNode("h3",X5,n.toDisplayString(n.unref(i)(d.key)),1),n.createElementVNode("div",Z5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d.items,u=>(n.openBlock(),n.createElementBlock("div",{key:u.id,class:"fe-shortcuts__row"},[n.createElementVNode("span",J5,[u.keys.length===0?(n.openBlock(),n.createElementBlock("span",Q5,n.toDisplayString(n.unref(i)("shortcuts.settings.unbound")),1)):(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(u.keys,(p,f)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:p},[n.createElementVNode("kbd",e6,n.toDisplayString(p),1),f<u.keys.length-1?(n.openBlock(),n.createElementBlock("span",t6,"/")):n.createCommentVNode("",!0)],64))),128))]),n.createElementVNode("span",n6,[n.createTextVNode(n.toDisplayString(n.unref(i)(u.labelKey))+" ",1),u.overridden?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-shortcuts__custom",title:n.unref(i)("shortcuts.settings.customized")},"●",8,a6)):n.createCommentVNode("",!0)])]))),128))])]))),128))])]),_:1},8,["open","title"]))}}),fo="filex.theme",pa="default",_s=[{id:pa,nameKey:"theme.name.default",light:{"--fe-bg":"#ffffff","--fe-bg-elev":"#f7f8fa","--fe-bg-hover":"#edf0f5","--fe-bg-selected":"#dfe8ff","--fe-border":"#e2e6ed","--fe-border-strong":"#c7ced9","--fe-text":"#1a1e27","--fe-text-muted":"#5a6475","--fe-text-on-primary":"#ffffff","--fe-primary":"#3b82f6","--fe-primary-hover":"#2563eb","--fe-danger":"#dc2626","--fe-danger-hover":"#b91c1c"},dark:{"--fe-bg":"#0f1419","--fe-bg-elev":"#161c25","--fe-bg-hover":"#1f2733","--fe-bg-selected":"#23324a","--fe-border":"#2a323e","--fe-border-strong":"#3a4453","--fe-text":"#e5e9f0","--fe-text-muted":"#8b95a7","--fe-text-on-primary":"#ffffff","--fe-primary":"#60a5fa","--fe-primary-hover":"#3b82f6","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"night",nameKey:"theme.name.night",light:{"--fe-bg":"#f6f8fd","--fe-bg-elev":"#edf1fa","--fe-bg-hover":"#e2e9f7","--fe-bg-selected":"#d2ddf4","--fe-border":"#d6deee","--fe-border-strong":"#aebfda","--fe-text":"#151f38","--fe-text-muted":"#49587a","--fe-text-on-primary":"#ffffff","--fe-primary":"#2c4a9e","--fe-primary-hover":"#213a80","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#0a1024","--fe-bg-elev":"#111a35","--fe-bg-hover":"#1a2547","--fe-bg-selected":"#243665","--fe-border":"#26335a","--fe-border-strong":"#3c4e84","--fe-text":"#dfe6f7","--fe-text-muted":"#96a5cc","--fe-text-on-primary":"#050b26","--fe-primary":"#6d8dfc","--fe-primary-hover":"#5273f2","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"forest",nameKey:"theme.name.forest",light:{"--fe-bg":"#f5faf5","--fe-bg-elev":"#eaf3eb","--fe-bg-hover":"#dcecdf","--fe-bg-selected":"#c8e2ce","--fe-border":"#d2e2d4","--fe-border-strong":"#a2c3a8","--fe-text":"#182b1d","--fe-text-muted":"#42604a","--fe-text-on-primary":"#ffffff","--fe-primary":"#2b7a41","--fe-primary-hover":"#226334","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#0d1611","--fe-bg-elev":"#132019","--fe-bg-hover":"#1b2d23","--fe-bg-selected":"#264532","--fe-border":"#28402f","--fe-border-strong":"#3e5f49","--fe-text":"#dcebe0","--fe-text-muted":"#93b09b","--fe-text-on-primary":"#04180b","--fe-primary":"#54c17a","--fe-primary-hover":"#3fae66","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"amber",nameKey:"theme.name.amber",light:{"--fe-bg":"#fdf9f0","--fe-bg-elev":"#f7efdd","--fe-bg-hover":"#f0e3c8","--fe-bg-selected":"#ead6ab","--fe-border":"#e6dabf","--fe-border-strong":"#c6b184","--fe-text":"#33270f","--fe-text-muted":"#655631","--fe-text-on-primary":"#ffffff","--fe-primary":"#9a4b00","--fe-primary-hover":"#7c3c00","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#191307","--fe-bg-elev":"#231a0c","--fe-bg-hover":"#2f2312","--fe-bg-selected":"#44331b","--fe-border":"#3b2e17","--fe-border-strong":"#5b4a29","--fe-text":"#f2e7d4","--fe-text-muted":"#bda887","--fe-text-on-primary":"#2a1c02","--fe-primary":"#f5a524","--fe-primary-hover":"#ffb84d","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"lilac",nameKey:"theme.name.lilac",light:{"--fe-bg":"#faf7fd","--fe-bg-elev":"#f2ecfa","--fe-bg-hover":"#e8ddf5","--fe-bg-selected":"#dccaf0","--fe-border":"#e1d6ee","--fe-border-strong":"#bda6d9","--fe-text":"#241a33","--fe-text-muted":"#584871","--fe-text-on-primary":"#ffffff","--fe-primary":"#7231e0","--fe-primary-hover":"#5f21c4","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#130f1c","--fe-bg-elev":"#1b1527","--fe-bg-hover":"#261d37","--fe-bg-selected":"#37294f","--fe-border":"#302546","--fe-border-strong":"#4b3a6d","--fe-text":"#e9e2f5","--fe-text-muted":"#a999c5","--fe-text-on-primary":"#180d33","--fe-primary":"#b197fa","--fe-primary-hover":"#9c7cf4","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"contrast",nameKey:"theme.name.contrast",light:{"--fe-bg":"#ffffff","--fe-bg-elev":"#f2f2f2","--fe-bg-hover":"#e0e0e0","--fe-bg-selected":"#c9dcff","--fe-border":"#5c5c5c","--fe-border-strong":"#000000","--fe-text":"#000000","--fe-text-muted":"#3d3d3d","--fe-text-on-primary":"#ffffff","--fe-primary":"#003d99","--fe-primary-hover":"#002a6b","--fe-danger":"#a80000","--fe-danger-hover":"#7d0000","--fe-shadow":"0 0 0 1px #000000, 0 10px 32px rgba(0, 0, 0, 0.25)","--fe-shadow-sm":"0 0 0 1px #000000"},dark:{"--fe-bg":"#000000","--fe-bg-elev":"#0d0d0d","--fe-bg-hover":"#212121","--fe-bg-selected":"#003d80","--fe-border":"#8f8f8f","--fe-border-strong":"#ffffff","--fe-text":"#ffffff","--fe-text-muted":"#d6d6d6","--fe-text-on-primary":"#001430","--fe-primary":"#7ab8ff","--fe-primary-hover":"#9ccaff","--fe-danger":"#ff7575","--fe-danger-hover":"#ff9999","--fe-shadow":"0 0 0 1px #ffffff, 0 12px 32px rgba(0, 0, 0, 0.65)","--fe-shadow-sm":"0 0 0 1px #ffffff"}},{id:"gray",nameKey:"theme.name.gray",light:{"--fe-bg":"#f7f7f8","--fe-bg-elev":"#efeff1","--fe-bg-hover":"#e4e4e7","--fe-bg-selected":"#d6d7db","--fe-border":"#dfdfe2","--fe-border-strong":"#b9b9c0","--fe-text":"#26272b","--fe-text-muted":"#585a63","--fe-text-on-primary":"#ffffff","--fe-primary":"#4b4b54","--fe-primary-hover":"#38383f","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#131316","--fe-bg-elev":"#1b1b1f","--fe-bg-hover":"#26262b","--fe-bg-selected":"#35353c","--fe-border":"#2d2d33","--fe-border-strong":"#4a4a52","--fe-text":"#e6e6e9","--fe-text-muted":"#a4a4ad","--fe-text-on-primary":"#17171b","--fe-primary":"#b0b0ba","--fe-primary-hover":"#c4c4cd","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"terminal",nameKey:"theme.name.terminal",light:{"--fe-bg":"#f3f9f4","--fe-bg-elev":"#e5f2e8","--fe-bg-hover":"#d5ead9","--fe-bg-selected":"#bce3c6","--fe-border":"#cbe2d1","--fe-border-strong":"#94c2a0","--fe-text":"#0c2913","--fe-text-muted":"#31573c","--fe-text-on-primary":"#ffffff","--fe-primary":"#116b33","--fe-primary-hover":"#0c5427","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f","--fe-font":'ui-monospace, "SF Mono", Consolas, Menlo, monospace'},dark:{"--fe-bg":"#050d07","--fe-bg-elev":"#0a1710","--fe-bg-hover":"#112418","--fe-bg-selected":"#1a3a26","--fe-border":"#1c3a2a","--fe-border-strong":"#316144","--fe-text":"#4fdd8b","--fe-text-muted":"#38a668","--fe-text-on-primary":"#03180a","--fe-primary":"#25c95e","--fe-primary-hover":"#4fdd8b","--fe-danger":"#ff6b62","--fe-danger-hover":"#ff8d86","--fe-font":'ui-monospace, "SF Mono", Consolas, Menlo, monospace'}}];function ui(e){return _s.find(t=>t.id===e)}const i6=Array.from(new Set(_s.flatMap(e=>[...Object.keys(e.light),...Object.keys(e.dark)])));function o6(){try{const e=localStorage.getItem(fo);return e&&ui(e)?e:pa}catch{return pa}}const Rc=n.ref(typeof window>"u"?pa:o6());function pp(e){const t=ui(e)?e:pa;Rc.value=t;try{t===pa?localStorage.removeItem(fo):localStorage.setItem(fo,t)}catch{}}function hp(){return{themeId:Rc,setTheme:pp}}const ws="filex.thememode",Lc=["host","auto","light","dark"];function s6(){try{const e=localStorage.getItem(ws);return e&&Lc.includes(e)?e:"host"}catch{return"host"}}const zc=n.ref(typeof window>"u"?"host":s6());function l6(e){const t=Lc.includes(e)?e:"host";zc.value=t;try{t==="host"?localStorage.removeItem(ws):localStorage.setItem(ws,t)}catch{}}function c6(){return{themeMode:zc,setThemeMode:l6}}if(typeof window<"u")try{window.addEventListener("storage",e=>{if(e.key!==ws)return;const t=e.newValue;zc.value=t&&Lc.includes(t)?t:"host"})}catch{}if(typeof window<"u")try{window.addEventListener("storage",e=>{e.key===fo&&(Rc.value=e.newValue&&ui(e.newValue)?e.newValue:pa)})}catch{}function mp(e,t,a){for(const o of i6)e.style.removeProperty(o);if(t===pa)return;const r=ui(t);if(!r)return;const i=a?r.dark:r.light;for(const[o,s]of Object.entries(i))e.style.setProperty(o,s)}const gp="data-filex-theme";function bp(e){return Object.entries(e).map(([t,a])=>`${t}:${a};`).join("")}function yp(e){const t=bp(e.light),a=bp(e.dark),r=[".fe--theme-dark",":root[data-theme='dark'] .fe",".fe.fe--theme-dark",":root.dark",".dark",":root.dark .fe",".dark .fe",".fe-ctx-backdrop--theme-dark",".fe-ctx-backdrop--theme-auto[data-prefers-dark='1']"].join(","),i=[".fe:not(.fe--theme-light)",".fe-ctx-backdrop--theme-auto:not(.fe-ctx-backdrop--theme-light)"].join(",");return`/* filex theme: ${e.id} */:root,.fe{${t}}${r}{${a}}@media (prefers-color-scheme: dark){${i}{${a}}}`}function vp(e){if(typeof document>"u")return;let t=document.head.querySelector(`style[${gp}]`);const a=e===pa?void 0:ui(e);if(!a){t&&(t.textContent="");return}t?t!==document.head.lastElementChild&&document.head.appendChild(t):(t=document.createElement("style"),t.setAttribute(gp,""),document.head.appendChild(t));const r=yp(a);t.textContent!==r&&(t.textContent=r)}const d6=["aria-label"],u6={class:"fe-thememode__label"},f6={class:"fe-thememode__seg"},p6=["aria-pressed","onClick"],h6={class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},m6={key:1,d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"},g6={class:"fe-themes__hint"},b6=["aria-label"],y6=["aria-selected","onClick"],v6={class:"fe-themecard__name"},k6=["title"],_6=["disabled"],kp=n.defineComponent({__name:"ThemeGallery",props:{open:{type:Boolean},locale:{},theme:{},dark:{type:Boolean},current:{},mode:{},hostMode:{}},emits:["close","select","mode"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=[{id:"light",labelKey:"theme.mode.light"},{id:"dark",labelKey:"theme.mode.dark"},{id:"auto",labelKey:"theme.mode.auto"}],s=n.computed(()=>a.mode==="host"?a.hostMode:a.mode);function l(d){return a.dark?d.dark:d.light}const c=pa;return(d,u)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("theme.title"),size:"lg",theme:e.theme,onClose:u[2]||(u[2]=p=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",disabled:e.current===n.unref(c),onClick:u[0]||(u[0]=p=>r("select",n.unref(c)))},n.toDisplayString(n.unref(i)("theme.reset")),9,_6),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:u[1]||(u[1]=p=>r("close"))},n.toDisplayString(n.unref(i)("theme.close")),1)]),default:n.withCtx(()=>[n.createElementVNode("div",{class:"fe-thememode",role:"group","aria-label":n.unref(i)("theme.mode.label")},[n.createElementVNode("span",u6,n.toDisplayString(n.unref(i)("theme.mode.label")),1),n.createElementVNode("div",f6,[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(o,p=>n.createElementVNode("button",{key:p.id,type:"button",class:n.normalizeClass(["fe-thememode__opt",{"is-active":s.value===p.id}]),"aria-pressed":s.value===p.id,onClick:f=>r("mode",p.id)},[(n.openBlock(),n.createElementBlock("svg",h6,[p.id==="light"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[u[3]||(u[3]=n.createElementVNode("circle",{cx:"12",cy:"12",r:"4"},null,-1)),u[4]||(u[4]=n.createElementVNode("path",{d:"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"},null,-1))],64)):p.id==="dark"?(n.openBlock(),n.createElementBlock("path",m6)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[u[5]||(u[5]=n.createElementVNode("circle",{cx:"12",cy:"12",r:"9"},null,-1)),u[6]||(u[6]=n.createElementVNode("path",{d:"M12 3a9 9 0 0 1 0 18z",fill:"currentColor",stroke:"none"},null,-1))],64))])),n.createElementVNode("span",null,n.toDisplayString(n.unref(i)(p.labelKey)),1)],10,p6)),64))])],8,d6),n.createElementVNode("p",g6,n.toDisplayString(n.unref(i)("theme.hint")),1),n.createElementVNode("div",{class:"fe-themes",role:"listbox","aria-label":n.unref(i)("theme.title")},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(_s),p=>(n.openBlock(),n.createElementBlock("button",{key:p.id,type:"button",class:n.normalizeClass(["fe-themecard",{"is-selected":p.id===e.current}]),role:"option","aria-selected":p.id===e.current,style:n.normalizeStyle(l(p)),onClick:f=>r("select",p.id)},[u[7]||(u[7]=n.createElementVNode("span",{class:"fe-themecard__preview","aria-hidden":"true"},[n.createElementVNode("span",{class:"fe-themecard__topbar"},[n.createElementVNode("span",{class:"fe-themecard__chip fe-themecard__chip--primary"}),n.createElementVNode("span",{class:"fe-themecard__chip"}),n.createElementVNode("span",{class:"fe-themecard__chip fe-themecard__chip--ghost"})]),n.createElementVNode("span",{class:"fe-themecard__row"},[n.createElementVNode("span",{class:"fe-themecard__dot"}),n.createElementVNode("span",{class:"fe-themecard__line",style:{width:"62%"}})]),n.createElementVNode("span",{class:"fe-themecard__row fe-themecard__row--selected"},[n.createElementVNode("span",{class:"fe-themecard__dot fe-themecard__dot--primary"}),n.createElementVNode("span",{class:"fe-themecard__line",style:{width:"44%"}})]),n.createElementVNode("span",{class:"fe-themecard__row"},[n.createElementVNode("span",{class:"fe-themecard__dot fe-themecard__dot--muted"}),n.createElementVNode("span",{class:"fe-themecard__line fe-themecard__line--muted",style:{width:"74%"}})])],-1)),n.createElementVNode("span",v6,[n.createTextVNode(n.toDisplayString(n.unref(i)(p.nameKey))+" ",1),p.id===e.current?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-themecard__check",title:n.unref(i)("theme.selected")},"✓",8,k6)):n.createCommentVNode("",!0)])],14,y6))),128))],8,b6)]),_:1},8,["open","title","theme"]))}}),w6={class:"fe-shortset"},E6={class:"fe-shortset__topbar"},S6={class:"fe-shortset__hint"},x6=["disabled"],C6={class:"fe-shortcuts__heading"},N6={class:"fe-shortset__row"},T6={class:"fe-shortset__label"},D6=["title"],B6={class:"fe-shortset__keys"},A6={key:0,class:"fe-shortset__capture",role:"status"},M6={key:0,class:"fe-shortcuts__unbound"},O6={class:"fe-kbd"},I6={key:0,class:"fe-shortcuts__or","aria-hidden":"true"},R6={class:"fe-shortset__actions"},L6=["onClick"],z6=["title","aria-label","onClick"],F6={key:1,class:"fe-shortset__fixed"},P6={key:0,class:"fe-shortset__conflict",role:"alert"},$6={class:"fe-shortset__conflict-msg"},V6={class:"fe-kbd"},U6={class:"fe-shortset__conflict-actions"},_p=n.defineComponent({__name:"ShortcutSettings",props:{open:{type:Boolean},locale:{},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=Tc(),s=n.computed(()=>{const y=[],S=new Map;for(const x of o.value)S.has(x.groupKey)||(S.set(x.groupKey,[]),y.push(x.groupKey)),S.get(x.groupKey).push(x);return y.map(x=>({key:x,items:S.get(x)}))}),l=n.computed(()=>o.value.some(y=>y.overridden)),c=n.ref(null),d=n.ref(null);function u(y){const S=cr.find(x=>x.id===y);return S?i(S.labelKey):y}function p(y){d.value=null,c.value=y}function f(){c.value=null}function h(y,S){if(c.value=null,S===so(y))return;const x=Gf(S,y);if(x){d.value={id:y,combo:S,conflictId:x.id,fixed:x.fixed};return}ps(y,S)}function _(){const y=d.value;!y||y.fixed||(ps(y.conflictId,""),ps(y.id,y.combo),d.value=null)}function b(){d.value=null}function k(y){d.value=null,Uf(y)}function m(){d.value=null,c.value=null,Hf()}function v(y){if(c.value){if(y.preventDefault(),y.stopPropagation(),y.key==="Escape"){f();return}const S=Nc(y);if(!S)return;h(c.value,S);return}y.key==="Escape"||y.key==="Tab"||y.stopPropagation()}n.watch(()=>a.open,y=>{y?window.addEventListener("keydown",v,!0):(window.removeEventListener("keydown",v,!0),c.value=null,d.value=null)}),n.onBeforeUnmount(()=>window.removeEventListener("keydown",v,!0));function g(){if(c.value){f();return}r("close")}return(y,S)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("shortcuts.settings.title"),size:"lg",theme:e.theme,onClose:g},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:g},n.toDisplayString(n.unref(i)("viewer.close")),1)]),default:n.withCtx(()=>[n.createElementVNode("div",w6,[n.createElementVNode("div",E6,[n.createElementVNode("p",S6,n.toDisplayString(n.unref(i)("shortcuts.settings.hint")),1),n.createElementVNode("button",{type:"button",class:"fe-btn fe-shortset__reset-all",disabled:!l.value,onClick:m}," ↺ "+n.toDisplayString(n.unref(i)("shortcuts.settings.reset_all")),9,x6)]),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(s.value,x=>(n.openBlock(),n.createElementBlock("section",{key:x.key,class:"fe-shortset__group"},[n.createElementVNode("h3",C6,n.toDisplayString(n.unref(i)(x.key)),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(x.items,N=>{var w;return n.openBlock(),n.createElementBlock("div",{key:N.id,class:n.normalizeClass(["fe-shortset__item",{"is-capturing":c.value===N.id,"is-conflict":((w=d.value)==null?void 0:w.id)===N.id}])},[n.createElementVNode("div",N6,[n.createElementVNode("span",T6,[n.createTextVNode(n.toDisplayString(n.unref(i)(N.labelKey))+" ",1),N.overridden?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-shortcuts__custom",title:n.unref(i)("shortcuts.settings.customized")},"●",8,D6)):n.createCommentVNode("",!0)]),n.createElementVNode("span",B6,[c.value===N.id?(n.openBlock(),n.createElementBlock("span",A6,n.toDisplayString(n.unref(i)("shortcuts.settings.capture")),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[N.keys.length===0?(n.openBlock(),n.createElementBlock("span",M6,n.toDisplayString(n.unref(i)("shortcuts.settings.unbound")),1)):(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(N.keys,(E,C)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:E},[n.createElementVNode("kbd",O6,n.toDisplayString(E),1),C<N.keys.length-1?(n.openBlock(),n.createElementBlock("span",I6,"/")):n.createCommentVNode("",!0)],64))),128))],64))]),n.createElementVNode("span",R6,[N.customizable?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[c.value!==N.id?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-shortset__btn",onClick:E=>p(N.id)},n.toDisplayString(n.unref(i)("shortcuts.settings.change")),9,L6)):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-shortset__btn",onClick:f},n.toDisplayString(n.unref(i)("shortcuts.settings.conflict_cancel")),1)),N.overridden?(n.openBlock(),n.createElementBlock("button",{key:2,type:"button",class:"fe-btn fe-btn--icon-only fe-shortset__btn",title:n.unref(i)("shortcuts.settings.reset"),"aria-label":n.unref(i)("shortcuts.settings.reset"),onClick:E=>k(N.id)}," ↺ ",8,z6)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock("span",F6,n.toDisplayString(n.unref(i)("shortcuts.settings.fixed")),1))])]),d.value&&d.value.id===N.id?(n.openBlock(),n.createElementBlock("div",P6,[n.createElementVNode("span",$6,[n.createElementVNode("kbd",V6,n.toDisplayString(d.value.combo),1),n.createTextVNode(" "+n.toDisplayString(d.value.fixed?n.unref(i)("shortcuts.settings.conflict_fixed",{name:u(d.value.conflictId)}):n.unref(i)("shortcuts.settings.conflict",{name:u(d.value.conflictId)})),1)]),n.createElementVNode("span",U6,[d.value.fixed?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--danger fe-shortset__btn",onClick:_},n.toDisplayString(n.unref(i)("shortcuts.settings.conflict_take")),1)),n.createElementVNode("button",{type:"button",class:"fe-btn fe-shortset__btn",onClick:b},n.toDisplayString(n.unref(i)("shortcuts.settings.conflict_cancel")),1)])])):n.createCommentVNode("",!0)],2)}),128))]))),128))])]),_:1},8,["open","title","theme"]))}}),H6={key:0,class:"fe-preview"},G6=["src","alt"],K6=["src"],q6=["src"],W6=["data"],j6={class:"fe-preview__fallback"},Y6=["href"],X6={key:0,class:"fe-preview__fallback"},Z6={key:1,class:"fe-preview__fallback"},J6=["href"],Q6={key:2,class:"fe-preview__md-split"},e8={class:"fe-preview__md-split-bar"},t8={key:0,class:"fe-preview__md-split-error"},n8=["disabled"],a8={class:"fe-preview__md-split-body"},r8=["onKeydown"],i8={key:0,class:"fe-preview__md-split-output fe-preview__md"},o8=["innerHTML"],s8={key:3,class:"fe-preview__fallback"},l8=["href"],c8=["innerHTML"],d8={key:5,class:"fe-preview__pre"},u8={key:0,class:"fe-preview__fallback"},f8=["href"],p8={key:1,class:"fe-preview__fallback"},h8={key:0,class:"fe-preview__fallback"},m8={key:1,class:"fe-preview__fallback"},g8=["href"],b8={key:2,class:"fe-preview__fallback"},y8=["href"],v8={key:3,class:"fe-preview__code-wrap"},k8={class:"fe-preview__code-toolbar"},_8={class:"fe-preview__code-lang"},w8={key:0,class:"fe-preview__code-status"},E8={key:1,class:"fe-preview__code-status fe-preview__code-status--ok"},S8=["title"],x8={key:3,class:"fe-preview__code-status"},C8=["disabled"],N8={key:0,class:"fe-preview__pre fe-preview__code hljs"},T8=["innerHTML"],D8=["data-lang"],B8={key:0,class:"fe-preview__fallback"},A8=["href"],M8={key:8,class:"fe-preview__fallback"},O8=["href"],I8=["href"],Fc=1e6,wp="fe-onlyoffice-api-js",Pc=n.defineComponent({__name:"PreviewModal",props:{open:{type:Boolean},locale:{},file:{},previewUrl:{type:Function},downloadUrl:{type:Function},onlyOfficeBase:{},onlyOfficeConfigEndpoint:{},saveTextEndpoint:{},openMode:{},authHeaders:{type:Function},authCredentials:{},drawioUrl:{},pdfWorkerUrl:{},pdfSaveUrl:{},viewerBaseUrl:{},newTabEnabled:{type:Boolean},chromeless:{type:Boolean},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale);function o(oe){return((oe==null?void 0:oe.extension)||"").toLowerCase()}const s=["jpg","jpeg","png","webp","gif","bmp","avif","svg","heic"],l=["mp4","webm","mov","mkv","m4v","ogv"],c=["mp3","wav","ogg","flac","m4a","aac","opus"],d={md:"markdown",markdown:"markdown",txt:"plaintext",log:"plaintext",js:"javascript",mjs:"javascript",cjs:"javascript",ts:"typescript",tsx:"typescript",jsx:"javascript",vue:"xml",svelte:"xml",html:"xml",htm:"xml",xml:"xml",svg:"xml",css:"css",scss:"scss",sass:"scss",less:"less",json:"json",jsonc:"json",yml:"yaml",yaml:"yaml",php:"php",py:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",swift:"swift",cpp:"cpp",c:"c",h:"cpp",hpp:"cpp",cs:"csharp",dart:"dart",sh:"bash",bash:"bash",zsh:"bash",fish:"bash",sql:"sql",toml:"ini",ini:"ini",conf:"ini",env:"bash",cfg:"ini",dockerfile:"dockerfile",graphql:"graphql",gql:"graphql",diff:"diff",patch:"diff"},u=["txt","log"],p=["docx","doc","xlsx","xls","pptx","ppt","odt","ods","odp","rtf"],f={glb:()=>Promise.resolve().then(()=>mi),gltf:()=>Promise.resolve().then(()=>mi),obj:()=>Promise.resolve().then(()=>mi),stl:()=>Promise.resolve().then(()=>mi),fbx:()=>Promise.resolve().then(()=>mi),"3ds":()=>Promise.resolve().then(()=>mi),epub:()=>Promise.resolve().then(()=>sA),mmd:()=>Promise.resolve().then(()=>Tm),mermaid:()=>Promise.resolve().then(()=>Tm),drawio:()=>Promise.resolve().then(()=>Dm),dio:()=>Promise.resolve().then(()=>Dm),tif:()=>Promise.resolve().then(()=>Bm),tiff:()=>Promise.resolve().then(()=>Bm),psd:()=>Promise.resolve().then(()=>CA),ipynb:()=>Promise.resolve().then(()=>GA),csv:()=>Promise.resolve().then(()=>Mm),tsv:()=>Promise.resolve().then(()=>Mm),zip:()=>Promise.resolve().then(()=>fM)},h=n.computed(()=>{const oe=o(a.file);if(!oe)return"other";if(s.includes(oe))return"image";if(l.includes(oe))return"video";if(c.includes(oe))return"audio";if(oe==="pdf")return"pdf";const ie=a.openMode!=="view";return oe==="md"||oe==="markdown"?"markdown":oe in d?"code":oe in f?"viewer":p.includes(oe)?"office":u.includes(oe)?ie?"code":"text":"other"}),_=n.shallowRef(null),b=n.ref(null),k=n.ref(!1);async function m(oe){_.value=null,b.value=null;const ie=f[oe];if(ie)try{const we=await ie();_.value=we.default??we}catch(we){b.value=we instanceof Error?we.message:"viewer load failed",oe==="pdf"&&(k.value=!0)}}function v(){k.value=!0}const g=n.computed(()=>{var we;const oe=o(a.file),ie={url:E.value,ext:oe,mime:(we=a.file)==null?void 0:we.mime_type,t:i,authHeaders:a.authHeaders,authCredentials:a.authCredentials};return a.file&&(ie.filePath=A(a.file.path),(oe==="zip"||oe==="rar"||oe==="7z"||oe==="tar"||oe==="gz"||oe==="tgz")&&(ie.filePath=a.file.path)),(oe==="drawio"||oe==="dio")&&(ie.drawioUrl=a.drawioUrl??void 0,ie.saveUrl=a.saveTextEndpoint??void 0,ie.readOnly=a.openMode==="view"),oe==="pdf"&&(ie.pdfWorkerUrl=a.pdfWorkerUrl??void 0,ie.pdfSaveUrl=a.pdfSaveUrl??void 0),ie});function y(){x(a.openMode||"edit")}function S(){x("edit")}function x(oe){if(!a.file)return;const ie=o(a.file),we=a.viewerBaseUrl||"/files/edit",te=we.includes("?")?"&":"?",ye=`${we}${te}path=${encodeURIComponent(a.file.path)}&type=${encodeURIComponent(ie)}&mode=${encodeURIComponent(oe)}`;window.open(ye,"_blank","noopener")}const N=new Set(["docx","doc","xlsx","xls","pptx","ppt","odt","ods","odp","rtf","drawio","dio","mmd","mermaid","md","markdown","txt","log","json","jsonc","yaml","yml","xml","svg","html","htm","js","mjs","cjs","ts","tsx","jsx","vue","svelte","css","scss","sass","less","php","py","rb","go","rs","java","kt","swift","cpp","c","h","hpp","cs","dart","sh","bash","sql","toml","ini","conf","cfg","env","dockerfile","graphql","gql"]),w=n.computed(()=>!!a.file&&N.has(o(a.file))),E=n.computed(()=>a.file?a.previewUrl(a.file.path):""),C=n.computed(()=>a.file?a.downloadUrl(a.file.path):"");function A(oe){const ie=oe.indexOf("://");return ie===-1?oe:oe.slice(ie+3)}const L=n.ref(!1),R=n.ref(null),$=n.ref(""),Y=n.ref(!1),F=n.ref(!1),q=n.ref(!1);let X,z;function H(){F.value=!0,X&&clearTimeout(X),X=setTimeout(()=>{xe($.value)},250),z&&clearTimeout(z),z=setTimeout(()=>{O()},1500)}async function O(){if(!(!a.saveTextEndpoint||!a.file||q.value)){q.value=!0,R.value=null;try{const oe={"Content-Type":"application/json",...await(a.authHeaders??(()=>({})))()},ie=await fetch(a.saveTextEndpoint,{method:"POST",headers:oe,credentials:a.authCredentials||"same-origin",body:JSON.stringify({path:A(a.file.path),content:$.value})});if(!ie.ok)throw new Error(`save failed: ${ie.status} ${await ie.text()}`);F.value=!1}catch(oe){R.value=oe instanceof Error?oe.message:String(oe)}finally{q.value=!1}}}async function P(oe){L.value=!0,R.value=null,$.value="",Y.value=!1;try{const ie={};a.authHeaders&&Object.assign(ie,await a.authHeaders());const we=await fetch(oe,{credentials:a.authCredentials||"same-origin",headers:ie});if(!we.ok)throw new Error(`${we.status} ${we.statusText}`);if(Number(we.headers.get("content-length")||"0")>Fc){Y.value=!0;return}const ye=await we.text();ye.length>Fc?(Y.value=!0,$.value=ye.slice(0,Fc)):$.value=ye}catch(ie){R.value=ie instanceof Error?ie.message:String(ie)}finally{L.value=!1}}const K=n.ref(""),J=n.ref(null),de=n.ref(!1);async function xe(oe){try{const ie=await import("markdown-it").catch(()=>null);if(!ie){K.value="",de.value=!0;return}de.value=!1;const we=ie.default??ie,ye=new we({html:!0,linkify:!0,breaks:!0,typographer:!0}).render(oe);K.value=ke(ye),await new Promise(V=>setTimeout(V,0)),await ae()}catch(ie){K.value="",R.value=ie instanceof Error?ie.message:String(ie)}}function ke(oe){return oe.replace(/<\s*script\b[^<]*(?:(?!<\s*\/\s*script\s*>)<[^<]*)*<\s*\/\s*script\s*>/gi,"").replace(/<\s*iframe\b[\s\S]*?<\s*\/\s*iframe\s*>/gi,"").replace(/<\s*object\b[\s\S]*?<\s*\/\s*object\s*>/gi,"").replace(/<\s*embed\b[^>]*>/gi,"").replace(/\son\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,"").replace(/(href|src|action|formaction|xlink:href)\s*=\s*(?:"\s*javascript:[^"]*"|'\s*javascript:[^']*')/gi,'$1="#"')}async function ae(){var ye,V,Be;if(!J.value)return;const oe=J.value,ie=Array.from(oe.querySelectorAll("pre > code"));if(ie.length===0)return;let we,te;for(const st of ie){const D=st.className||"",Ee=/\blanguage-mermaid\b/.test(D)||/\blanguage-mmd\b/.test(D),Se=/\blanguage-math\b/.test(D)||/\blanguage-latex\b/.test(D)||/\blanguage-tex\b/.test(D);if(Ee){if(we===void 0)try{const G=await import("mermaid");we=G.default??G,(ye=we.initialize)==null||ye.call(we,{startOnLoad:!1,securityLevel:"strict"})}catch{we=null}if(!we)continue;try{const G=`filex-md-mermaid-${Math.random().toString(36).slice(2)}`,{svg:re}=await we.render(G,st.textContent||""),ve=document.createElement("div");ve.className="fe-preview__md-mermaid",ve.innerHTML=re,(V=st.parentElement)==null||V.replaceWith(ve)}catch{}}else if(Se){if(te===void 0)try{const G=await Promise.resolve().then(()=>XO);te=G.default??G}catch{te=null}if(!te)continue;try{const G=te.renderToString(st.textContent||"",{displayMode:!0,throwOnError:!1}),re=document.createElement("div");re.className="fe-preview__md-math",re.innerHTML=G,(Be=st.parentElement)==null||Be.replaceWith(re)}catch{}}}}const be=n.ref("");async function _e(oe,ie){try{const we=await vs();if(!we){be.value="";return}const te=we.default??we;if(te.getLanguage(ie)){const ye=te.highlight(oe,{language:ie,ignoreIllegals:!0});be.value=ye.value}else{const ye=te.highlightAuto(oe);be.value=ye.value}}catch(we){be.value="",R.value=we instanceof Error?we.message:String(we)}}const Ce=n.ref(null);let Ve=null,rt;const tt=n.ref(!1),Pe=n.ref(!1),ze=n.ref(!1),Ie=n.ref(!1),pe=n.ref(null);function Ge(){if(Ve){try{Ve.dispose()}catch{}Ve=null}tt.value=!1,Ie.value=!1,pe.value=null}function ge(oe){return{js:"javascript",mjs:"javascript",cjs:"javascript",ts:"typescript",tsx:"typescript",jsx:"javascript",json:"json",jsonc:"json",css:"css",scss:"scss",sass:"scss",less:"less",html:"html",htm:"html",vue:"html",svelte:"html",xml:"xml",svg:"xml",md:"markdown",markdown:"markdown",php:"php",py:"python",yml:"yaml",yaml:"yaml",go:"go",rs:"rust",sql:"sql",cpp:"cpp",c:"c",h:"cpp",hpp:"cpp",sh:"shell",bash:"shell",dockerfile:"dockerfile",toml:"ini",ini:"ini",conf:"ini",cfg:"ini"}[oe]??"plaintext"}async function he(oe,ie){var te;const we=await ys();if(we||(Pe.value=!0),!we||!Ce.value)return!1;try{Ge();const ye=!!a.saveTextEndpoint&&a.openMode!=="view",V=a.theme==="dark"?!0:a.theme==="light"?!1:(te=window.matchMedia)==null?void 0:te.call(window,"(prefers-color-scheme: dark)").matches;return Ve=we.editor.create(Ce.value,{value:oe,language:ge(ie),readOnly:!ye,theme:V?"vs-dark":"vs",automaticLayout:!0,minimap:{enabled:!1},fontSize:13}),ye&&(Ve.addCommand(we.KeyMod.CtrlCmd|we.KeyCode.KeyS,()=>void Ae()),Ve.onDidChangeModelContent(()=>{rt&&clearTimeout(rt),rt=setTimeout(()=>{Ae()},1500)})),tt.value=!0,!0}catch(ye){return R.value=`Monaco mount fail: ${ye.message}`,!1}}async function Ae(){if(!(!a.saveTextEndpoint||!a.file)&&a.openMode!=="view"&&!ze.value){ze.value=!0,Ie.value=!1,pe.value=null;try{const oe=Ve?Ve.getValue():"",ie={"Content-Type":"application/json"};a.authHeaders&&Object.assign(ie,await a.authHeaders());const we=await fetch(a.saveTextEndpoint,{method:"POST",headers:ie,credentials:a.authCredentials||"same-origin",body:JSON.stringify({path:A(a.file.path),content:oe})});if(!we.ok){const te=await we.text().catch(()=>"");throw new Error(`${we.status} ${we.statusText}${te?" — "+te.slice(0,150):""}`)}Ie.value=!0,setTimeout(()=>{Ie.value=!1},2500)}catch(oe){pe.value=oe.message}finally{ze.value=!1}}}async function nt(oe,ie,we){if($.value="",K.value="",be.value="",R.value=null,fe.value=null,_.value=null,b.value=null,k.value=!1,et(),Ge(),!(!oe||!ie)){if(we==="viewer"){await m(o(a.file));return}if(we==="markdown"||we==="code"||we==="text"){if(await P(ie),Y.value)return;if(we==="markdown"){await xe($.value);return}const te=d[o(a.file)]||"";Bc()?(await new Promise(Be=>setTimeout(Be,0)),await he($.value,o(a.file))||await _e($.value,te)):(we==="code"&&await _e($.value,te),ys().then(async V=>{if(!V){Pe.value=!0;return}a.open&&(await new Promise(Be=>setTimeout(Be,0)),await he($.value,o(a.file)))}))}else we==="office"&&(await new Promise(te=>setTimeout(te,0)),await Ue())}}n.watch(()=>[a.open,E.value,h.value,a.openMode],([oe,ie,we])=>{nt(oe,ie,we)}),n.onMounted(()=>{n.nextTick(()=>{a.open&&nt(a.open,E.value,h.value)})});const Re=n.computed(()=>d[o(a.file)]||"plaintext"),Me=n.ref(null),fe=n.ref(null);let Te=null;async function Ue(){if(fe.value=null,!(!a.file||h.value!=="office")){if(!a.onlyOfficeConfigEndpoint){fe.value="OnlyOffice yapılandırması yok";return}if(Me.value)try{const oe={"Content-Type":"application/json"};a.authHeaders&&Object.assign(oe,await a.authHeaders());const ie=await fetch(a.onlyOfficeConfigEndpoint,{method:"POST",headers:oe,credentials:a.authCredentials||"same-origin",body:JSON.stringify({path:a.file.path,mode:a.openMode||"edit"})});if(!ie.ok)throw new Error(`Config fetch ${ie.status}: ${(await ie.text()).slice(0,200)}`);const{config:we,documentServerUrl:te}=await ie.json();await j(te),et();const ye="fe-onlyoffice-mount";Me.value.id=ye,we.events={onError:Be=>{fe.value=_t(Be)}};const V=window;if(!V.DocsAPI||!V.DocsAPI.DocEditor)throw new Error("DocsAPI not available after script load");Te=new V.DocsAPI.DocEditor(ye,we)}catch(oe){fe.value=oe instanceof Error?oe.message:String(oe)}}}function et(){var oe;try{(oe=Te==null?void 0:Te.destroyEditor)==null||oe.call(Te)}catch{}Te=null}n.onBeforeUnmount(()=>{et(),Ge()});function _t(oe){if(typeof oe=="string")return oe;const ie=oe;if(ie!=null&&ie.data&&typeof ie.data=="object"){const we=ie.data;if(typeof we.errorDescription=="string")return we.errorDescription;if(typeof we.message=="string")return we.message;if(we.errorCode!==void 0)return`OnlyOffice error ${we.errorCode}`}if(typeof(ie==null?void 0:ie.data)=="string")return ie.data;if(typeof(ie==null?void 0:ie.errorDescription)=="string")return ie.errorDescription;if(typeof(ie==null?void 0:ie.message)=="string")return ie.message;try{return JSON.stringify(oe)}catch{return"OnlyOffice error"}}function j(oe){return new Promise((ie,we)=>{var V;if((V=window.DocsAPI)!=null&&V.DocEditor){ie();return}const te=document.getElementById(wp);if(te){te.addEventListener("load",()=>ie()),te.addEventListener("error",()=>we(new Error("OnlyOffice api.js load failed")));return}const ye=document.createElement("script");ye.id=wp,ye.src=`${oe.replace(/\/$/,"")}/web-apps/apps/api/documents/api.js`,ye.async=!0,ye.onload=()=>ie(),ye.onerror=()=>we(new Error("OnlyOffice api.js load failed")),document.head.appendChild(ye)})}return(oe,ie)=>{var we;return n.openBlock(),n.createBlock(Ua,{open:e.open,size:"xl",title:((we=e.file)==null?void 0:we.basename)||"",chromeless:e.chromeless,theme:e.theme,onClose:ie[2]||(ie[2]=te=>r("close"))},{actions:n.withCtx(()=>[e.file&&e.openMode==="view"&&w.value&&e.newTabEnabled!==!1?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--primary",onClick:S},"✏ "+n.toDisplayString(n.unref(i)("viewer.edit")),1)):n.createCommentVNode("",!0),e.file&&e.newTabEnabled!==!1?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn",onClick:y},"↗ "+n.toDisplayString(n.unref(i)("viewer.open_in_new_tab")),1)):n.createCommentVNode("",!0),e.file?(n.openBlock(),n.createElementBlock("a",{key:2,href:C.value,class:"fe-btn"},n.toDisplayString(n.unref(i)("viewer.download")),9,I8)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:ie[1]||(ie[1]=te=>r("close"))},n.toDisplayString(n.unref(i)("viewer.close")),1)]),default:n.withCtx(()=>[e.file?(n.openBlock(),n.createElementBlock("div",H6,[h.value==="image"?(n.openBlock(),n.createElementBlock("img",{key:0,src:E.value,alt:e.file.basename,class:"fe-preview__image"},null,8,G6)):h.value==="video"?(n.openBlock(),n.createElementBlock("video",{key:1,src:E.value,controls:"",preload:"metadata",class:"fe-preview__video"},null,8,K6)):h.value==="audio"?(n.openBlock(),n.createElementBlock("audio",{key:2,src:E.value,controls:"",class:"fe-preview__audio"},null,8,q6)):h.value==="pdf"?(n.openBlock(),n.createElementBlock("object",{key:3,data:E.value,type:"application/pdf",class:"fe-preview__iframe"},[n.createElementVNode("div",j6,[ie[3]||(ie[3]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"📕",-1)),ie[4]||(ie[4]=n.createElementVNode("p",null,"Tarayıcı PDF'i inline açamadı.",-1)),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary",target:"_blank",rel:"noopener"},"PDF'i Yeni Sekmede Aç",8,Y6)])],8,W6)):h.value==="markdown"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:4},[L.value?(n.openBlock(),n.createElementBlock("div",X6,n.toDisplayString(n.unref(i)("viewer.loading")),1)):Y.value?(n.openBlock(),n.createElementBlock("div",Z6,[ie[5]||(ie[5]=n.createTextVNode(" Dosya çok büyük (>1 MB). ",-1)),n.createElementVNode("a",{href:C.value,class:"fe-btn"},n.toDisplayString(n.unref(i)("viewer.download")),9,J6)])):e.openMode==="edit"&&e.saveTextEndpoint?(n.openBlock(),n.createElementBlock("div",Q6,[n.createElementVNode("div",e8,[ie[6]||(ie[6]=n.createElementVNode("span",{class:"fe-preview__md-split-label"},"MARKDOWN",-1)),R.value?(n.openBlock(),n.createElementBlock("span",t8,n.toDisplayString(R.value),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",disabled:!F.value||q.value,onClick:O},n.toDisplayString(q.value?n.unref(i)("viewer.saving"):F.value?n.unref(i)("viewer.save"):n.unref(i)("viewer.saved")),9,n8)]),n.createElementVNode("div",a8,[n.withDirectives(n.createElementVNode("textarea",{class:"fe-preview__md-split-input","onUpdate:modelValue":ie[0]||(ie[0]=te=>$.value=te),onInput:H,onKeydown:[n.withKeys(n.withModifiers(O,["ctrl","prevent"]),["s"]),n.withKeys(n.withModifiers(O,["meta","prevent"]),["s"])],spellcheck:"false",placeholder:"# Markdown buraya…"},null,40,r8),[[n.vModelText,$.value]]),de.value?(n.openBlock(),n.createElementBlock("div",i8,n.toDisplayString(n.unref(i)("viewer.peer_not_installed")),1)):(n.openBlock(),n.createElementBlock("div",{key:1,ref_key:"markdownEl",ref:J,class:"fe-preview__md-split-output fe-preview__md",innerHTML:K.value},null,8,o8))])])):R.value?(n.openBlock(),n.createElementBlock("div",s8,[n.createElementVNode("p",null,n.toDisplayString(R.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,l8)])):K.value?(n.openBlock(),n.createElementBlock("div",{key:4,ref_key:"markdownEl",ref:J,class:"fe-preview__md",innerHTML:K.value},null,8,c8)):(n.openBlock(),n.createElementBlock("pre",d8,n.toDisplayString($.value),1))],64)):h.value==="viewer"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:5},[b.value&&!k.value?(n.openBlock(),n.createElementBlock("div",u8,[ie[7]||(ie[7]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"⚠️",-1)),n.createElementVNode("p",null,n.toDisplayString(b.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,f8)])):_.value?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(_.value),n.mergeProps({key:2},g.value,{class:"fe-preview__viewer",onFallback:v}),null,16)):(n.openBlock(),n.createElementBlock("div",p8,[ie[8]||(ie[8]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"⏳",-1)),n.createElementVNode("p",null,n.toDisplayString(n.unref(i)("viewer.loading")),1)]))],64)):h.value==="code"||h.value==="text"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:6},[L.value?(n.openBlock(),n.createElementBlock("div",h8,n.toDisplayString(n.unref(i)("viewer.loading")),1)):Y.value?(n.openBlock(),n.createElementBlock("div",m8,[ie[9]||(ie[9]=n.createTextVNode(" Dosya çok büyük (>1 MB). ",-1)),n.createElementVNode("a",{href:C.value,class:"fe-btn"},n.toDisplayString(n.unref(i)("viewer.download")),9,g8)])):R.value?(n.openBlock(),n.createElementBlock("div",b8,[n.createElementVNode("p",null,n.toDisplayString(R.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,y8)])):(n.openBlock(),n.createElementBlock("div",v8,[n.createElementVNode("div",k8,[n.createElementVNode("span",_8,n.toDisplayString(Re.value),1),!tt.value&&be.value?(n.openBlock(),n.createElementBlock("span",w8,n.toDisplayString(e.saveTextEndpoint&&!Pe.value?n.unref(i)("viewer.editor_loading"):n.unref(i)("viewer.read_only")),1)):n.createCommentVNode("",!0),Ie.value?(n.openBlock(),n.createElementBlock("span",E8,"✓ "+n.toDisplayString(n.unref(i)("viewer.saved")),1)):n.createCommentVNode("",!0),pe.value?(n.openBlock(),n.createElementBlock("span",{key:2,class:"fe-preview__code-status fe-preview__code-status--err",title:pe.value},"✗ "+n.toDisplayString(n.unref(i)("viewer.save_error")),9,S8)):n.createCommentVNode("",!0),e.openMode==="view"?(n.openBlock(),n.createElementBlock("span",x8,n.toDisplayString(n.unref(i)("viewer.read_only")),1)):e.saveTextEndpoint&&tt.value?(n.openBlock(),n.createElementBlock("button",{key:4,type:"button",class:"fe-btn fe-btn--primary",disabled:ze.value,onClick:Ae},n.toDisplayString(ze.value?n.unref(i)("viewer.saving"):n.unref(i)("viewer.save")),9,C8)):n.createCommentVNode("",!0)]),n.createElementVNode("div",{ref_key:"monacoEl",ref:Ce,class:n.normalizeClass(["fe-preview__code-editor",{"is-hidden":!tt.value}])},null,2),!tt.value&&be.value?(n.openBlock(),n.createElementBlock("pre",N8,[n.createElementVNode("code",{class:n.normalizeClass(`language-${Re.value}`),innerHTML:be.value},null,10,T8)])):!tt.value&&!be.value?(n.openBlock(),n.createElementBlock("pre",{key:1,class:"fe-preview__pre","data-lang":Re.value},n.toDisplayString($.value),9,D8)):n.createCommentVNode("",!0)]))],64)):h.value==="office"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:7},[fe.value?(n.openBlock(),n.createElementBlock("div",B8,[ie[10]||(ie[10]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"📄",-1)),n.createElementVNode("p",null,n.toDisplayString(fe.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,A8)])):(n.openBlock(),n.createElementBlock("div",{key:1,ref_key:"officeEl",ref:Me,class:"fe-preview__office"},null,512))],64)):(n.openBlock(),n.createElementBlock("div",M8,[ie[11]||(ie[11]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"📎",-1)),n.createElementVNode("p",null,n.toDisplayString(n.unref(i)("viewer.no_preview")),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,O8)]))])):n.createCommentVNode("",!0)]),_:1},8,["open","title","chromeless","theme"])}}}),Ep=n.defineComponent({__name:"QuickLook",props:{open:{type:Boolean},locale:{},file:{},previewUrl:{type:Function},downloadUrl:{type:Function},onlyOfficeBase:{},onlyOfficeConfigEndpoint:{},authHeaders:{type:Function},authCredentials:{},drawioUrl:{},pdfWorkerUrl:{},viewerBaseUrl:{},theme:{}},emits:["close","nav","open-full"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale);function o(l){const c=l;return!!(c&&(c.tagName==="INPUT"||c.tagName==="TEXTAREA"||c.tagName==="SELECT"||c.isContentEditable))}function s(l){if(a.open&&!(l.ctrlKey||l.metaKey||l.altKey)&&!o(l.target))switch(l.key){case" ":l.preventDefault(),l.stopPropagation(),r("close");break;case"ArrowRight":case"ArrowDown":l.preventDefault(),l.stopPropagation(),r("nav",1);break;case"ArrowLeft":case"ArrowUp":l.preventDefault(),l.stopPropagation(),r("nav",-1);break;case"Enter":l.preventDefault(),l.stopPropagation(),r("open-full");break}}return n.watch(()=>a.open,l=>{l?window.addEventListener("keydown",s,!0):window.removeEventListener("keydown",s,!0)},{immediate:!0}),n.onBeforeUnmount(()=>window.removeEventListener("keydown",s,!0)),(l,c)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[n.createVNode(Pc,{class:"fe-quicklook",open:e.open,locale:e.locale,file:e.file,theme:e.theme,"preview-url":e.previewUrl,"download-url":e.downloadUrl,"only-office-base":e.onlyOfficeBase,"only-office-config-endpoint":e.onlyOfficeConfigEndpoint,"open-mode":"view","auth-headers":e.authHeaders,"auth-credentials":e.authCredentials,"drawio-url":e.drawioUrl,"pdf-worker-url":e.pdfWorkerUrl,"viewer-base-url":e.viewerBaseUrl,onClose:c[0]||(c[0]=d=>r("close"))},null,8,["open","locale","file","theme","preview-url","download-url","only-office-base","only-office-config-endpoint","auth-headers","auth-credentials","drawio-url","pdf-worker-url","viewer-base-url"]),n.createVNode(n.Transition,{name:"fe-toast"},{default:n.withCtx(()=>[e.open?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe fe-ql-hint",{"fe--theme-light":e.theme==="light","fe--theme-dark":e.theme==="dark"}]),"aria-hidden":"true"},[c[1]||(c[1]=n.createElementVNode("kbd",{class:"fe-kbd"},"Space",-1)),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("quicklook.hint_close"))+" ",1),c[2]||(c[2]=n.createElementVNode("span",{class:"fe-ql-hint__sep"},"·",-1)),c[3]||(c[3]=n.createElementVNode("kbd",{class:"fe-kbd"},"↑",-1)),c[4]||(c[4]=n.createElementVNode("kbd",{class:"fe-kbd"},"↓",-1)),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("quicklook.hint_nav"))+" ",1),c[5]||(c[5]=n.createElementVNode("span",{class:"fe-ql-hint__sep"},"·",-1)),c[6]||(c[6]=n.createElementVNode("kbd",{class:"fe-kbd"},"Enter",-1)),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("quicklook.hint_open")),1)],2)):n.createCommentVNode("",!0)]),_:1})],64))}}),R8=["aria-label"],L8={class:"fe-opc__head"},z8=["aria-label"],F8={class:"fe-opc__body"},P8={key:0,class:"fe-opc__section","aria-live":"polite"},$8={class:"fe-opc__section-title"},V8={class:"fe-opc__list"},U8={class:"fe-opc__kicon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},H8=["d"],G8={class:"fe-opc__mid"},K8=["title"],q8={class:"fe-opc__sub"},W8={class:"fe-opc__kind"},j8={class:"fe-opc__state"},Y8=["aria-valuenow"],X8={key:0,class:"fe-opc__spin","aria-hidden":"true"},Z8={class:"fe-opc__acts"},J8=["onClick"],Q8=["onClick"],e7=["aria-label","onClick"],t7={key:1,class:"fe-opc__section"},n7={class:"fe-opc__section-title"},a7={class:"fe-opc__list fe-opc__list--history"},r7={class:"fe-opc__kicon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},i7=["d"],o7={class:"fe-opc__mid"},s7=["title"],l7={key:0,class:"fe-opc__sub fe-opc__sub--err"},c7={key:2,class:"fe-opc__empty"},d7=["aria-expanded","aria-label"],u7=["stroke-dashoffset"],f7={class:"fe-opc__count"},p7={key:0,class:"fe-opc__pct"},$c=8.5,Sp=n.defineComponent({__name:"OperationsCenter",props:{center:{},locale:{},narrow:{type:Boolean}},setup(e){const t=e,{t:a,formatSize:r}=zt(()=>t.locale),i=n.ref(!1),o=n.ref(null),s=n.computed(()=>t.center.active.value),l=n.computed(()=>t.center.history.value),c=n.computed(()=>t.center.hasError.value),d=n.computed(()=>t.center.overallPercent.value),u=n.computed(()=>t.center.runningCount.value),p=n.computed(()=>s.value.length>0||i.value&&l.value.length>0);n.watch(p,w=>{w||(i.value=!1)});const f=2*Math.PI*$c,h=n.computed(()=>{const w=d.value;return w===null?f*.72:f*(1-Math.min(100,Math.max(0,w))/100)}),_=n.computed(()=>d.value===null&&u.value>0),b=n.computed(()=>u.value===0||d.value===null?"":a("opc.percent",{n:d.value})),k=n.computed(()=>a("opc.aria_badge",{n:s.value.length})),m={upload:"M12 16V5M7 9.5 12 5l5 4.5M5 19h14",copy:"M9 9h11v11H9zM5 15V4h11",move:"M4 12h13M12 6l6 6-6 6",delete:"M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13",convert:"M20 8A8 8 0 0 0 6 6L4 8M4 16a8 8 0 0 0 14 2l2-2M20 3v5h-5M4 21v-5h5",archive:"M4 8V5h16v3zM5 8h14v12H5zM10 12h4"};function v(w){return a(`opc.kind.${w.kind}`)}function g(w){return w.name||v(w)}function y(w){return w.status==="running"?w.queued?a("opc.queued"):w.totalBytes&&w.totalBytes>0?`${r(w.uploadedBytes??0)} / ${r(w.totalBytes)}`:w.totalCount&&w.totalCount>0?`${w.doneCount??0}/${w.totalCount}`:a("opc.status.running"):w.status==="done"?a("opc.status.done"):w.status==="aborted"?a("opc.status.aborted"):w.error||a("opc.status.error")}function S(w){return a(`opc.status.${w.status==="running"?"running":w.status}`)}function x(w){if(!i.value)return;const E=o.value;E&&w.target instanceof Node&&!E.contains(w.target)&&(i.value=!1)}function N(w){i.value&&w.key==="Escape"&&(i.value=!1)}return n.onMounted(()=>{document.addEventListener("mousedown",x),document.addEventListener("keydown",N)}),n.onBeforeUnmount(()=>{document.removeEventListener("mousedown",x),document.removeEventListener("keydown",N)}),(w,E)=>p.value?(n.openBlock(),n.createElementBlock("div",{key:0,ref_key:"rootEl",ref:o,class:n.normalizeClass(["fe-opc",{"fe-opc--narrow":e.narrow,"fe-opc--open":i.value}])},[n.createVNode(n.Transition,{name:"fe-opc-pop"},{default:n.withCtx(()=>[i.value?(n.openBlock(),n.createElementBlock("section",{key:0,class:"fe-opc__panel",role:"dialog","aria-label":n.unref(a)("opc.title")},[n.createElementVNode("header",L8,[n.createElementVNode("strong",null,n.toDisplayString(n.unref(a)("opc.title")),1),n.createElementVNode("button",{type:"button",class:"fe-opc__x","aria-label":n.unref(a)("opc.close"),onClick:E[0]||(E[0]=C=>i.value=!1)},"×",8,z8)]),n.createElementVNode("div",F8,[s.value.length>0?(n.openBlock(),n.createElementBlock("div",P8,[n.createElementVNode("h3",$8,n.toDisplayString(n.unref(a)("opc.active")),1),n.createElementVNode("ul",V8,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(s.value,C=>(n.openBlock(),n.createElementBlock("li",{key:C.key,class:n.normalizeClass(["fe-opc__item",`is-${C.status}`])},[(n.openBlock(),n.createElementBlock("svg",U8,[n.createElementVNode("path",{d:m[C.kind]},null,8,H8)])),n.createElementVNode("div",G8,[n.createElementVNode("div",{class:"fe-opc__name",title:g(C)},n.toDisplayString(g(C)),9,K8),n.createElementVNode("div",q8,[n.createElementVNode("span",W8,n.toDisplayString(v(C)),1),E[3]||(E[3]=n.createElementVNode("span",{class:"fe-opc__dot","aria-hidden":"true"},"·",-1)),n.createElementVNode("span",j8,n.toDisplayString(y(C)),1)]),C.status==="running"&&C.percent!==null?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-opc__bar",role:"progressbar","aria-valuenow":C.percent,"aria-valuemin":"0","aria-valuemax":"100"},[n.createElementVNode("div",{class:"fe-opc__bar-fill",style:n.normalizeStyle({width:C.percent+"%"})},null,4)],8,Y8)):n.createCommentVNode("",!0)]),C.status==="running"&&C.percent===null&&!C.queued?(n.openBlock(),n.createElementBlock("span",X8)):n.createCommentVNode("",!0),n.createElementVNode("div",Z8,[C.status==="running"&&C.cancellable?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-opc__act",onClick:A=>e.center.cancel(C.key)},n.toDisplayString(n.unref(a)("opc.cancel")),9,J8)):n.createCommentVNode("",!0),C.status==="error"&&C.retryable?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-opc__act fe-opc__act--retry",onClick:A=>e.center.retry(C.key)},n.toDisplayString(n.unref(a)("opc.retry")),9,Q8)):n.createCommentVNode("",!0),C.status!=="running"?(n.openBlock(),n.createElementBlock("button",{key:2,type:"button",class:"fe-opc__x","aria-label":n.unref(a)("opc.dismiss"),onClick:A=>e.center.dismiss(C.key)},"×",8,e7)):n.createCommentVNode("",!0)])],2))),128))])])):n.createCommentVNode("",!0),l.value.length>0?(n.openBlock(),n.createElementBlock("div",t7,[n.createElementVNode("h3",n7,[n.createTextVNode(n.toDisplayString(n.unref(a)("opc.history"))+" ",1),n.createElementVNode("button",{type:"button",class:"fe-opc__act",onClick:E[1]||(E[1]=C=>e.center.clearHistory())},n.toDisplayString(n.unref(a)("opc.clear")),1)]),n.createElementVNode("ul",a7,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(l.value,C=>(n.openBlock(),n.createElementBlock("li",{key:"h-"+C.key,class:n.normalizeClass(["fe-opc__item fe-opc__item--history",`is-${C.status}`])},[(n.openBlock(),n.createElementBlock("svg",r7,[n.createElementVNode("path",{d:m[C.kind]},null,8,i7)])),n.createElementVNode("div",o7,[n.createElementVNode("div",{class:"fe-opc__name",title:g(C)},n.toDisplayString(g(C)),9,s7),C.status==="error"&&C.error?(n.openBlock(),n.createElementBlock("div",l7,n.toDisplayString(C.error),1)):n.createCommentVNode("",!0)]),n.createElementVNode("span",{class:n.normalizeClass(["fe-opc__chip",`is-${C.status}`])},n.toDisplayString(S(C)),3)],2))),128))])])):n.createCommentVNode("",!0),s.value.length===0&&l.value.length===0?(n.openBlock(),n.createElementBlock("p",c7,n.toDisplayString(n.unref(a)("opc.empty")),1)):n.createCommentVNode("",!0)])],8,R8)):n.createCommentVNode("",!0)]),_:1}),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-opc__badge",{"is-error":c.value}]),"aria-expanded":i.value,"aria-label":k.value,onClick:E[2]||(E[2]=C=>i.value=!i.value)},[(n.openBlock(),n.createElementBlock("svg",{class:n.normalizeClass(["fe-opc__ring",{"fe-opc__ring--spin":_.value}]),viewBox:"0 0 22 22","aria-hidden":"true",focusable:"false"},[n.createElementVNode("circle",{class:"fe-opc__ring-track",cx:"11",cy:"11",r:$c,fill:"none","stroke-width":"2.5"}),n.createElementVNode("circle",{class:"fe-opc__ring-fill",cx:"11",cy:"11",r:$c,fill:"none","stroke-width":"2.5","stroke-linecap":"round","stroke-dasharray":f,"stroke-dashoffset":h.value,transform:"rotate(-90 11 11)"},null,8,u7)],2)),n.createElementVNode("span",f7,n.toDisplayString(s.value.length),1),b.value?(n.openBlock(),n.createElementBlock("span",p7,n.toDisplayString(b.value),1)):n.createCommentVNode("",!0)],10,d7)],2)):n.createCommentVNode("",!0)}}),h7=4e3,xp=50;function m7(e,t,a){const r=t.status!=="running";return{key:e,kind:t.kind,name:t.name,percent:t.percent,status:t.status,error:t.error??null,queued:t.queued??!1,doneCount:t.doneCount??null,totalCount:t.totalCount??null,uploadedBytes:t.uploadedBytes??null,totalBytes:t.totalBytes??null,cancellable:t.cancellable??!1,retryable:t.retryable??!1,startedAt:(a==null?void 0:a.startedAt)??Date.now(),settledAt:(a==null?void 0:a.settledAt)??(r?Date.now():null)}}function Cp(){const e=n.ref([]),t=n.ref([]),a=new Map,r=new Set,i=new Map;function o(m){const v=i.get(m);v!==void 0&&(clearTimeout(v),i.delete(m))}function s(m,v={}){o(m);const g=e.value.findIndex(S=>S.key===m);if(g===-1)return;const[y]=e.value.splice(g,1);e.value=[...e.value],r.add(m),v.toHistory!==!1&&(t.value=[{...y,settledAt:y.settledAt??Date.now()},...t.value].slice(0,xp))}function l(m){i.has(m)||i.set(m,setTimeout(()=>{var g;i.delete(m);const v=a.get(m);s(m),(g=v==null?void 0:v.dismiss)==null||g.call(v)},h7))}function c(m,v){const g=`${m}:`,y=new Set;let S=[...e.value],x=!1;for(const N of v){const w=`${m}:${N.input.id}`;if(y.add(w),N.actions&&a.set(w,N.actions),r.has(w))continue;const E=S.findIndex(A=>A.key===w),C=m7(w,N.input,E===-1?void 0:S[E]);E===-1?(S=[C,...S],x=!0):JSON.stringify(S[E])!==JSON.stringify(C)&&(S[E]=C,x=!0),(C.status==="done"||C.status==="aborted")&&l(w)}for(const N of[...S])!N.key.startsWith(g)||y.has(N.key)||N.status!=="error"&&(o(N.key),S=S.filter(w=>w.key!==N.key),x=!0,N.status!=="running"&&(r.add(N.key),t.value=[{...N,settledAt:N.settledAt??Date.now()},...t.value].slice(0,xp)));for(const N of[...r])N.startsWith(g)&&!y.has(N)&&r.delete(N);for(const N of[...a.keys()])N.startsWith(g)&&!y.has(N)&&!e.value.some(w=>w.key===N)&&(S.some(w=>w.key===N)||a.delete(N));x&&(e.value=S)}function d(m){var v,g;(g=(v=a.get(m))==null?void 0:v.cancel)==null||g.call(v)}function u(m){var g,y;const v=a.get(m);s(m),(g=v==null?void 0:v.dismiss)==null||g.call(v),(y=v==null?void 0:v.retry)==null||y.call(v)}function p(m){var g;const v=a.get(m);s(m),(g=v==null?void 0:v.dismiss)==null||g.call(v)}function f(){t.value=[]}const h=n.computed(()=>e.value.filter(m=>m.status==="running").length),_=n.computed(()=>e.value.filter(m=>m.status==="error").length),b=n.computed(()=>_.value>0),k=n.computed(()=>{const m=e.value.filter(y=>y.status==="running");let v=0,g=0;for(const y of m){let S=null;y.totalBytes&&y.totalBytes>0?S=Math.min(1,(y.uploadedBytes??0)/y.totalBytes):y.totalCount&&y.totalCount>0?S=Math.min(1,(y.doneCount??0)/y.totalCount):y.percent!==null&&(S=Math.min(1,y.percent/100)),S!==null&&(v+=S,g+=1)}return g===0?null:Math.round(v/g*100)});return n.getCurrentScope()&&n.onScopeDispose(()=>{for(const m of i.values())clearTimeout(m);i.clear()}),{active:e,history:t,runningCount:h,errorCount:_,hasError:b,overallPercent:k,sync:c,cancel:d,retry:u,dismiss:p,clearHistory:f}}const g7=["data-prefers-dark","aria-label"],b7={key:1,class:"fe-tour__dim","aria-hidden":"true"},y7={class:"fe-tour__progress","aria-hidden":"true"},v7={class:"fe-tour__title"},k7={class:"fe-tour__desc"},_7={class:"fe-tour__dots","aria-hidden":"true"},w7={class:"fe-tour__actions"},fi=6,Np=12,E7=n.defineComponent({__name:"OnboardingTour",props:{open:{type:Boolean},locale:{},root:{},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale);function o(E,C){const A=E.querySelectorAll("button[title]");for(const L of Array.from(A))if(L.getAttribute("title")===C)return L;return null}const s=[{id:"nav",titleKey:"tour.step.nav.title",descKey:"tour.step.nav.desc",target:E=>E.querySelector(".fe-breadcrumb")},{id:"upload",titleKey:"tour.step.upload.title",descKey:"tour.step.upload.desc",target:E=>o(E,i("toolbar.upload"))||E.querySelector(".fe-fab")},{id:"search",titleKey:"tour.step.search.title",descKey:"tour.step.search.desc",target:E=>E.querySelector(".fe-search__input")||E.querySelector(".fe-toolbar__search-toggle")},{id:"view",titleKey:"tour.step.view.title",descKey:"tour.step.view.desc",target:E=>E.querySelector(".fe-toolbar__view")},{id:"share",titleKey:"tour.step.share.title",descKey:"tour.step.share.desc",target:E=>E.querySelector(".fe__body")},{id:"help",titleKey:"tour.step.help.title",descKey:"tour.step.help.desc",target:()=>null}],l=n.ref([]),c=n.ref(0),d=n.computed(()=>l.value[c.value]??null),u=n.computed(()=>l.value.length);function p(){const E=a.root;l.value=s.filter(C=>{if(C.id==="help")return!0;if(!E)return!1;const A=C.target(E);if(!A)return!1;const L=A.getBoundingClientRect();return L.width>0&&L.height>0})}const f=n.ref(null),h=n.ref({}),_=n.ref(null);async function b(){var z;const E=d.value,C=a.root;if(!E)return;const A=C?E.target(C):null;if(!A){f.value=null,h.value={};return}const L=A.getBoundingClientRect();if(L.width<=0&&L.height<=0){f.value=null,h.value={};return}f.value={top:L.top-fi,left:L.left-fi,width:L.width+fi*2,height:L.height+fi*2},await n.nextTick();const R=window.innerWidth,$=window.innerHeight,Y=Math.min(340,R-24),F=((z=_.value)==null?void 0:z.offsetHeight)??160;let q=L.bottom+fi+Np;q+F>$-12&&(q=Math.max(12,L.top-fi-Np-F));let X=L.left+L.width/2-Y/2;X=Math.min(Math.max(12,X),R-Y-12),h.value={top:`${Math.round(q)}px`,left:`${Math.round(X)}px`,width:`${Y}px`}}function k(){a.open&&b()}function m(){if(c.value>=u.value-1){r("close");return}c.value+=1}function v(){c.value>0&&(c.value-=1)}function g(){r("close")}function y(E){a.open&&(E.key==="Escape"?(E.stopPropagation(),g()):E.key==="ArrowRight"||E.key==="Enter"?(E.preventDefault(),m()):E.key==="ArrowLeft"&&(E.preventDefault(),v()))}n.watch(()=>a.open,async E=>{var C;E&&(c.value=0,p(),await n.nextTick(),await b(),(C=_.value)==null||C.focus())}),n.watch(c,async()=>{var E;await b(),(E=_.value)==null||E.focus()}),n.onMounted(()=>{window.addEventListener("resize",k),window.addEventListener("scroll",k,!0)}),n.onBeforeUnmount(()=>{window.removeEventListener("resize",k),window.removeEventListener("scroll",k,!0)});const S=n.ref(!1);let x;function N(E){S.value=!!(E&&"matches"in E&&E.matches)}n.onMounted(()=>{var E;typeof window>"u"||(x=window.matchMedia("(prefers-color-scheme: dark)"),N(x),(E=x.addEventListener)==null||E.call(x,"change",N))}),n.onBeforeUnmount(()=>{var E;(E=x==null?void 0:x.removeEventListener)==null||E.call(x,"change",N)});const w=n.computed(()=>`fe-ctx-backdrop--theme-${a.theme||"auto"}`);return(E,C)=>(n.openBlock(),n.createBlock(n.Teleport,{to:"body"},[n.createVNode(n.Transition,{name:"fe-tour"},{default:n.withCtx(()=>[e.open&&d.value?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe-tour",w.value]),"data-prefers-dark":S.value?"1":"0",role:"dialog","aria-modal":"true","aria-label":n.unref(i)("tour.aria"),onKeydown:y},[f.value?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-tour__spot",style:n.normalizeStyle({top:f.value.top+"px",left:f.value.left+"px",width:f.value.width+"px",height:f.value.height+"px"}),"aria-hidden":"true"},null,4)):(n.openBlock(),n.createElementBlock("div",b7)),n.createElementVNode("div",{ref_key:"cardEl",ref:_,class:n.normalizeClass(["fe-tour__card",{"fe-tour__card--center":!f.value}]),style:n.normalizeStyle(f.value?h.value:{}),tabindex:"-1"},[n.createElementVNode("p",y7,n.toDisplayString(n.unref(i)("tour.progress",{n:c.value+1,m:u.value})),1),n.createElementVNode("h3",v7,n.toDisplayString(n.unref(i)(d.value.titleKey)),1),n.createElementVNode("p",k7,n.toDisplayString(n.unref(i)(d.value.descKey)),1),n.createElementVNode("div",_7,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(l.value,(A,L)=>(n.openBlock(),n.createElementBlock("span",{key:A.id,class:n.normalizeClass(["fe-tour__dot",{"is-active":L===c.value}])},null,2))),128))]),n.createElementVNode("div",w7,[n.createElementVNode("button",{type:"button",class:"fe-btn fe-tour__skip",onClick:g},n.toDisplayString(n.unref(i)("tour.skip")),1),C[0]||(C[0]=n.createElementVNode("span",{class:"fe-tour__actions-spacer"},null,-1)),c.value>0?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn",onClick:v},n.toDisplayString(n.unref(i)("tour.back")),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:m},n.toDisplayString(c.value>=u.value-1?n.unref(i)("tour.done"):n.unref(i)("tour.next")),1)])],6)],42,g7)):n.createCommentVNode("",!0)]),_:1})]))}}),S7=["aria-label"],x7={class:"fe-tabs__scroll"},C7=["aria-selected","title","onClick","onKeydown","onAuxclick","onDragstart","onDragover","onDragleave","onDrop"],N7={key:0,class:"fe-tabs__splitdot","aria-hidden":"true"},T7={class:"fe-tabs__label"},D7=["aria-label","title","onClick"],B7=["aria-label","title"],A7=["aria-label","title","aria-pressed"],Tp=n.defineComponent({__name:"TabBar",props:{tabs:{},activeId:{},locale:{},splitEnabled:{type:Boolean},splitActive:{type:Boolean}},emits:["select","close","new","reorder","toggle-split"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=n.ref(null),s=n.ref(null);function l(_,b){var k;o.value=_,b.dataTransfer&&(b.dataTransfer.effectAllowed="move",b.dataTransfer.setData("text/plain",((k=a.tabs[_])==null?void 0:k.id)??""))}function c(_,b){o.value!==null&&(b.preventDefault(),b.stopPropagation(),b.dataTransfer&&(b.dataTransfer.dropEffect="move"),s.value=_)}function d(_){s.value===_&&(s.value=null)}function u(_,b){o.value!==null&&(b.preventDefault(),b.stopPropagation(),o.value!==_&&r("reorder",o.value,_),o.value=null,s.value=null)}function p(){o.value=null,s.value=null}function f(_){_.button===1&&_.preventDefault()}function h(_,b){b.button===1&&(b.preventDefault(),b.stopPropagation(),r("close",_))}return(_,b)=>(n.openBlock(),n.createElementBlock("div",{class:"fe-tabs",role:"tablist","aria-label":n.unref(i)("tabs.strip")},[n.createElementVNode("div",x7,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(k,m)=>(n.openBlock(),n.createElementBlock("div",{key:k.id,class:n.normalizeClass(["fe-tabs__tab",{"is-active":k.id===e.activeId,"is-dragover":s.value===m&&o.value!==null&&o.value!==m}]),role:"tab","aria-selected":k.id===e.activeId?"true":"false",tabindex:"0",draggable:"true",title:k.label,onClick:v=>r("select",k.id),onKeydown:n.withKeys(n.withModifiers(v=>r("select",k.id),["prevent"]),["enter"]),onMousedown:b[0]||(b[0]=v=>f(v)),onAuxclick:v=>h(k.id,v),onDragstart:v=>l(m,v),onDragover:v=>c(m,v),onDragleave:v=>d(m),onDrop:v=>u(m,v),onDragend:p},[k.split?(n.openBlock(),n.createElementBlock("span",N7)):n.createCommentVNode("",!0),n.createElementVNode("span",T7,n.toDisplayString(k.label),1),n.createElementVNode("button",{type:"button",class:"fe-tabs__close","aria-label":n.unref(i)("tabs.close"),title:n.unref(i)("tabs.close"),onClick:n.withModifiers(v=>r("close",k.id),["stop"])},"×",8,D7)],42,C7))),128))]),n.createElementVNode("button",{type:"button",class:"fe-tabs__new","aria-label":n.unref(i)("tabs.new"),title:n.unref(i)("tabs.new"),onClick:b[1]||(b[1]=k=>r("new"))},"+",8,B7),e.splitEnabled!==!1?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:n.normalizeClass(["fe-tabs__split",{"is-active":e.splitActive}]),"aria-label":e.splitActive?n.unref(i)("tabs.split_off"):n.unref(i)("tabs.split"),title:e.splitActive?n.unref(i)("tabs.split_off"):n.unref(i)("tabs.split"),"aria-pressed":e.splitActive?"true":"false",onClick:b[2]||(b[2]=k=>r("toggle-split"))},[...b[3]||(b[3]=[n.createElementVNode("svg",{class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},[n.createElementVNode("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),n.createElementVNode("path",{d:"M12 4v16"})],-1)])],10,A7)):n.createCommentVNode("",!0)],8,S7))}}),po=".filex-e2e.json",Dp="filexe2e",ho=1,Bp=6e5,M7=6e5,Vc=200*1024*1024,Ap=8,Mp="filex-e2e-verify-v1",Es=new TextEncoder().encode(Dp),Ss=97,Uc=9,Hc=21,O7=48,Gc=69,Na=12;class Kc extends Error{constructor(t="e2e: decrypt failed"){super(t),this.name="E2eDecryptError"}}function Op(e){let t="";for(let a=0;a<e.length;a++)t+=String.fromCharCode(e[a]);return btoa(t)}function Ip(e){const t=atob(e),a=new Uint8Array(t.length);for(let r=0;r<t.length;r++)a[r]=t.charCodeAt(r);return a}async function qc(e,t,a){const r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(t).buffer,iterations:a,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async function Rp(e,t=Bp){const a=Math.max(M7,t),r=crypto.getRandomValues(new Uint8Array(16)),i=await qc(e,r,a),o=crypto.getRandomValues(new Uint8Array(Na)),s=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o.buffer},i,new TextEncoder().encode(Mp))),l=new Uint8Array(Na+s.length);return l.set(o,0),l.set(s,Na),{marker:{v:ho,salt:Op(r),iter:a,verify:Op(l)},kek:i}}function Lp(e){try{const t=JSON.parse(e);return!t||t.v!==ho||typeof t.salt!="string"||typeof t.verify!="string"||typeof t.iter!="number"||t.iter<1?null:t}catch{return null}}async function zp(e,t){const a=Ip(e.salt),r=await qc(t,a,e.iter),i=Ip(e.verify);if(i.length<=Na)return null;try{const o=await crypto.subtle.decrypt({name:"AES-GCM",iv:i.slice(0,Na).buffer},r,i.slice(Na).buffer);return new TextDecoder().decode(o)!==Mp?null:r}catch{return null}}function xs(e){const t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<Es.length)return!1;for(let a=0;a<Es.length;a++)if(t[a]!==Es[a])return!1;return!0}async function Fp(e,t){if(t.byteLength>Vc)throw new Error("e2e: file exceeds the 200MB single-shot limit");const a=crypto.getRandomValues(new Uint8Array(32)),r=await crypto.subtle.importKey("raw",a.buffer,{name:"AES-GCM"},!1,["encrypt"]),i=crypto.getRandomValues(new Uint8Array(Na)),o=crypto.getRandomValues(new Uint8Array(Na)),s=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:i.buffer},e,a.buffer)),l=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o.buffer},r,t));a.fill(0);const c=new Uint8Array(Ss+l.length);return c.set(Es,0),c[8]=ho,c.set(i,Uc),c.set(s,Hc),c.set(o,Gc),c.set(l,Ss),c.buffer}async function Wc(e,t){const a=new Uint8Array(t);if(!xs(a)||a.length<Ss)throw new Error("e2e: not an encrypted file");if(a[8]!==ho)throw new Error(`e2e: unsupported version ${a[8]}`);const r=a.slice(Uc,Uc+Na),i=a.slice(Hc,Hc+O7),o=a.slice(Gc,Gc+Na);let s;try{s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r.buffer},e,i.buffer)}catch{throw new Kc("e2e: DEK unwrap failed (wrong password?)")}const l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["decrypt"]);try{return await crypto.subtle.decrypt({name:"AES-GCM",iv:o.buffer},l,a.slice(Ss).buffer)}catch{throw new Kc("e2e: content decrypt failed")}}function Pp(){const e=new Map;return{get(t){return e.get(t)},set(t,a){e.set(t,a)},lock(t){e.delete(t)},has(t){return e.has(t)},clear(){e.clear()}}}function $p(e){const t=e.indexOf("://");return t===-1?e:e.slice(t+3)}function I7(e){return(e||[]).filter(t=>!(t.path.includes(".thumbs")||t.path.includes(".versions")||t.basename===".versions"||t.basename===".trash"||t.basename===".keepdir"||t.basename===po))}const Vp="filex.showHidden";function R7(){try{return localStorage.getItem(Vp)==="1"}catch{return!1}}const mo=n.ref(R7());function L7(e){mo.value=e;try{localStorage.setItem(Vp,e?"1":"0")}catch{}}function z7(e,t){return t?e||[]:(e||[]).filter(a=>!(a.basename||"").startsWith("."))}function Up(e){return z7(I7(e),mo.value)}function F7(e){const t=$p(e);return t==="fileman"||t===""}function P7(e){return $p(e).startsWith("fileman/.trash")}function $7(e){return{type:"dir",path:`${e}://fileman/.trash`,basename:".trash",extension:"",storage:e,visibility:"private",size:0,file_size:0,mime_type:"inode/directory",extra_metadata:{}}}function Hp(e,t,a,r){return!r||P7(a)||!F7(a)?!1:(e.unshift($7(t)),!0)}async function Gp(e,t,a){try{const{entries:r}=await a.listTrash(t),i=e.find(l=>l.basename===".trash");if(!i)return;let o=0,s=0;for(const l of r){o+=l.size||0;const c=Date.parse(l.deleted_at);!Number.isNaN(c)&&c>s&&(s=c)}i.size=o,s>0&&(i.last_modified=s)}catch{}}const V7=["aria-label"],U7={class:"fe-split__crumbs"},H7=["title"],G7=["title","onClick"],K7=["aria-label","title"],q7={key:0,class:"fe-split__state",role:"status"},W7={key:1,class:"fe-split__state"},j7={key:2,class:"fe-split__state"},Y7="application/x-brf-files",X7="application/x-brf-files-src",Kp=n.defineComponent({__name:"SecondaryPane",props:{api:{},initialPath:{},locale:{},qualify:{type:Function},toUser:{type:Function},clamp:{type:Function},rootLabel:{},floor:{},multiRoot:{type:Boolean},virtualRows:{type:Function},active:{type:Boolean},viewMode:{},thumbSrc:{type:Function},keepBadgeFor:{type:Function},trashVisible:{type:Boolean}},emits:["navigate","activate","close","open-tab","transfer","context","open-trash"],setup(e,{expose:t,emit:a}){const r=e,i=a,{t:o}=zt(()=>r.locale),s=n.ref(""),l=n.ref([]),c=n.ref(!1),d=n.ref(""),u=n.ref(new Set);function p(H){return H.mime_type==="inode/storage"}const f=n.computed(()=>!!r.multiRoot&&!(s.value??"").replace(/^\/+|\/+$/g,""));async function h(H){const O=r.clamp(H??s.value??"");c.value=!0,d.value="";try{if(r.multiRoot&&!O){l.value=r.virtualRows?r.virtualRows():[],s.value="",u.value=new Set,i("navigate","");return}const P=await r.api.index(r.qualify(O));l.value=Up(P.files),Hp(l.value,P.adapter,P.dirname,r.trashVisible!==!1)&&Gp(l.value,P.adapter,r.api),s.value=r.toUser(P.dirname),u.value=new Set,i("navigate",s.value)}catch(P){d.value=P instanceof Error?P.message:String(P)}finally{c.value=!1}}h(r.initialPath??"");const _=n.computed(()=>{const H=(s.value||"").replace(/^\/+|\/+$/g,""),O=H?H.split("/"):[],P=(r.floor||"").replace(/^\/+|\/+$/g,""),K=[];let J="";for(const de of O)J=J?`${J}/${de}`:de,!(P&&!(J===P||J.startsWith(P+"/")))&&K.push({label:de,target:J,last:!1});return K.length>0&&(K[K.length-1].last=!0),K}),b=n.computed(()=>!r.floor);function k(H){i("activate"),h(H)}function m(H,O){i("activate");const P=O.ctrl||O.shift,K=new Set(P?u.value:[]);P&&K.has(H.path)?K.delete(H.path):K.add(H.path),u.value=K}function v(H,O){O.preventDefault(),O.stopPropagation(),i("activate"),u.value.has(H.path)||(u.value=new Set([H.path])),i("context",H,O)}function g(H){H.preventDefault(),H.stopPropagation(),i("activate"),u.value=new Set,i("context",null,H)}function y(H,O){w.value=!1,!(H.type!=="dir"||p(H))&&E(O)&&C(O,H.path)}function S(H){if(H.type==="dir"){if(H.basename===".trash"){i("activate"),i("open-trash");return}h(p(H)?H.path:r.toUser(H.path))}}function x(){u.value=new Set}function N(H,O){if(!O.dataTransfer)return;if(p(H)||f.value||H.basename===".trash"){O.preventDefault();return}u.value.has(H.path)||(u.value=new Set([H.path]));const P=l.value.filter(K=>u.value.has(K.path)&&!p(K)).map(K=>({path:K.path,basename:K.basename,type:K.type}));if(P.length===0){O.preventDefault();return}O.dataTransfer.setData(Y7,JSON.stringify(P)),O.dataTransfer.setData(X7,r.qualify(s.value)),O.dataTransfer.setData("text/plain",P.map(K=>K.path).join(`
|
|
1
|
+
(function(Fe,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],n):(Fe=typeof globalThis<"u"?globalThis:Fe||self,n(Fe.FilexCore={},Fe.Vue))})(this,function(Fe,n){"use strict";var WP=Object.defineProperty;var jP=(Fe,n,Lr)=>n in Fe?WP(Fe,n,{enumerable:!0,configurable:!0,writable:!0,value:Lr}):Fe[n]=Lr;var Sa=(Fe,n,Lr)=>jP(Fe,typeof n!="symbol"?n+"":n,Lr);function Lr(e,t){for(var a=0;a<t.length;a++){const r=t[a];if(typeof r!="string"&&!Array.isArray(r)){for(const i in r)if(i!=="default"&&!(i in e)){const o=Object.getOwnPropertyDescriptor(r,i);o&&Object.defineProperty(e,i,o.get?o:{enumerable:!0,get:()=>r[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}function vc(e){return!!e&&e.enabled&&e.state==="ok"}function Af(e){const t=e.apiBase!=null?e.apiBase.replace(/\/+$/,""):null;function a(i,o){return i||(t===null?null:`${t}${o}`)}const r=e.endpoint??(t!==null?`${t}/api/files/manager`:null);if(!r)throw new Error("[@brftech/filex-core] config requires either `apiBase` or `endpoint`");return{manager:r,uploadBegin:a(e.uploadBegin,"/api/files/upload/begin"),uploadInit:a(e.uploadInit,"/api/files/upload/init"),uploadFinalize:a(e.uploadFinalize,"/api/files/upload/finalize"),uploadAbort:a(e.uploadAbort,"/api/files/upload/abort"),shareCreate:a(e.shareCreate,"/api/files/share"),shareList:a(e.shareList,"/api/files/share"),shareDelete:a(e.shareDelete,"/api/files/share/{uuid}"),limits:a(e.limits,"/api/files/limits"),capabilities:a(e.capabilities,"/api/files/capabilities"),archiveList:a(e.archiveList,"/api/files/archive/list"),archiveExtract:a(e.archiveExtract,"/api/files/archive/extract"),archiveAdd:a(e.archiveAdd,"/api/files/archive/add"),copy:a(e.copy,"/api/files/copy"),moveAsync:a(e.moveAsync,"/api/files/move"),deleteAsync:a(e.deleteAsync,"/api/files/delete"),opsList:a(e.opsList,"/api/files/ops"),opsShow:a(e.opsShow,"/api/files/ops/{id}"),onlyOfficeConfig:a(e.onlyOfficeConfig,"/api/files/onlyoffice/config"),saveText:a(e.saveText,"/api/files/save-text"),restore:a(e.restore,"/api/files/restore"),trashList:a(e.trashList,"/api/files/manager/trash"),trashRestore:a(e.trashRestore,"/api/files/manager/restore")}}async function Fk(e){if(typeof e=="function"){const t=e();return t instanceof Promise?await t:t}return e}function Pk(e){return e?"kind"in e?e:e.type==="bearer"?{kind:"bearer",token:e.token}:e.type==="csrf"?{kind:"csrf",csrf:e.csrf}:{kind:"none"}:{kind:"none"}}function zr(e){const t=Af(e),a=Pk(e.auth);let r=null;async function i(ge={}){const he={Accept:"application/json",...ge};if(a.kind==="bearer"){const Ae=await Fk(a.token);Ae&&(he.Authorization=`Bearer ${Ae}`,r=Ae)}else if(a.kind==="csrf")he["X-CSRF-TOKEN"]=a.csrf,he["X-Requested-With"]="XMLHttpRequest";else if(a.kind==="basic"){const Ae=btoa(`${a.user}:${a.pass}`);he.Authorization=`Basic ${Ae}`}return he}function o(ge={}){const he={Accept:"application/json",...ge};if(a.kind==="bearer"){const Ae=typeof a.token=="string"?a.token:r;Ae&&(he.Authorization=`Bearer ${Ae}`)}else if(a.kind==="csrf")he["X-CSRF-TOKEN"]=a.csrf,he["X-Requested-With"]="XMLHttpRequest";else if(a.kind==="basic"){const Ae=btoa(`${a.user}:${a.pass}`);he.Authorization=`Basic ${Ae}`}return he}function s(){return a.kind==="csrf"?"include":"same-origin"}function l(ge){const he=(e.locale??"tr")!=="en",nt={400:["Geçersiz istek","Bad request"],401:["Oturum gerekli, tekrar giriş yapın","Sign-in required"],403:["Bu işlem için yetkiniz yok","You are not allowed to do this"],404:["Bulunamadı","Not found"],409:["Zaten var / çakışma","Already exists / conflict"],413:["Dosya çok büyük","File too large"],415:["Bu dosya türü desteklenmiyor","Unsupported file type"],422:["Geçersiz veri","Invalid data"],429:["Çok fazla istek, biraz bekleyin","Too many requests"],500:["Sunucu hatası","Server error"],501:["Bu işlem desteklenmiyor","Not supported"],503:["Servis şu an kullanılamıyor","Service unavailable"]}[ge];return nt?he?nt[0]:nt[1]:he?`Hata (${ge})`:`Error (${ge})`}async function c(ge,he={}){const Ae={...await i(),...he.headers??{}},nt=await fetch(ge,{...he,headers:Ae,credentials:s()});if(!nt.ok){const Me=await nt.text().catch(()=>""),fe=new Error(l(nt.status));throw fe.status=nt.status,fe.detail=Me.slice(0,300),fe}if(nt.status===204||nt.status===205)return;const Re=await nt.text();if(Re)return JSON.parse(Re)}function d(ge=""){return t.manager.replace(/\/manager(\?.*)?$/,"/permissions")+ge}async function u(ge){return c(d()+"?path="+encodeURIComponent(ge))}async function p(ge){return c(d("/resolve")+"?email="+encodeURIComponent(ge))}async function f(ge){return c(d("/users")+"?q="+encodeURIComponent(ge))}async function h(ge){return c(d(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}async function _(ge,he){return c(d("/"+ge),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({level:he})})}async function b(ge){return c(d("/"+ge),{method:"DELETE"})}async function k(ge){return c(d("/invite"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}async function m(ge){return c(d("/share-mail"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}function v(ge){const he=new URLSearchParams;for(const[Ae,nt]of Object.entries(ge))nt!=null&&he.set(Ae,String(nt));return he.toString()}function g(ge,he={}){const Ae=t.manager.includes("?")?"&":"?";return`${t.manager}${Ae}${v({q:ge,action:ge,...he})}`}async function y(ge){return c(g("index",{path:ge}))}async function S(ge,he){return c(g("search",{path:ge,filter:he}))}async function x(ge,he={}){const Ae=t.manager.replace(/\/manager(\?.*)?$/,"/search"),nt=Ae.includes("?")?"&":"?",Re=`${Ae}${nt}${v({q:ge,limit:he.limit,scope:he.scope})}`,Me=await c(Re);return Array.isArray(Me==null?void 0:Me.results)?Me.results:[]}async function N(ge){return c(g("subfolders",{path:ge}))}async function w(ge,he){return c(g("newfolder"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,name:he})})}async function E(ge,he,Ae){return c(g("rename"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,item:he,name:Ae})})}async function C(ge,he,Ae){return c(g("move"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,item:Ae,items:he.map(nt=>({path:nt}))})})}async function A(ge,he){return c(g("delete"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,items:he.map(Ae=>({path:Ae}))})})}async function L(ge,he){if(!t.copy)throw new Error("copy endpoint not configured");return c(t.copy,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge,target:he})})}async function R(ge,he,Ae){if(!t.moveAsync)throw new Error("moveAsync endpoint not configured");return c(t.moveAsync,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge,target:he,sourceDir:Ae})})}async function $(ge,he){if(!t.deleteAsync)throw new Error("deleteAsync endpoint not configured");return c(t.deleteAsync,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge,sourceDir:he})})}async function Y(ge){if(!t.restore)throw new Error("restore endpoint not configured");return c(t.restore,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({source:ge})})}async function F(ge){if(!t.trashList)throw new Error("trashList endpoint not configured");const he=t.trashList,Ae=he.includes("?")?"&":"?",nt=ge?`${he}${Ae}storage=${encodeURIComponent(ge)}`:he;return c(nt)}async function q(ge){const he=t.trashRestore;if(!he)throw new Error("trashRestore endpoint not configured");let Ae=0;for(const nt of ge)try{await c(he,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:nt})}),Ae++}catch{}return{restored:Ae}}async function X(ge,he,Ae){const nt=new FormData;nt.append("path",ge);for(const Me of he)nt.append("file[]",Me,Me.name);const Re=await i();return new Promise((Me,fe)=>{const Te=new XMLHttpRequest;Te.open("POST",g("upload"));for(const[Ue,et]of Object.entries(Re))Ue!=="Content-Type"&&Te.setRequestHeader(Ue,et);Te.withCredentials=s()==="include",Te.upload.onprogress=Ue=>{Ae&&Ue.lengthComputable&&Ae(Math.round(Ue.loaded/Ue.total*100))},Te.onload=()=>{if(Te.status>=200&&Te.status<300)try{Me(JSON.parse(Te.responseText))}catch(Ue){fe(Ue)}else fe(new Error(`${Te.status} ${Te.statusText}: ${Te.responseText.slice(0,200)}`))},Te.onerror=()=>fe(new Error("Network error")),Te.send(nt)})}function z(ge){return g("download",{path:ge})}function H(ge){return g("preview",{path:ge})}async function O(ge){const he=await i(),Ae=await fetch(H(ge),{headers:he,credentials:s()});if(!Ae.ok){const fe=await Ae.text().catch(()=>"");throw new Error(`${Ae.status} ${Ae.statusText}${fe?" — "+fe.slice(0,200):""}`)}const nt=await Ae.blob(),Re=nt.type||Ae.headers.get("content-type")||"";return{url:URL.createObjectURL(nt),blob:nt,mime:Re}}async function P(ge){const he=await i(),Ae=await fetch(H(ge),{headers:he,credentials:s()});if(!Ae.ok){const nt=await Ae.text().catch(()=>"");throw new Error(`${Ae.status} ${Ae.statusText}${nt?" — "+nt.slice(0,200):""}`)}return Ae.arrayBuffer()}async function K(){return t.limits?c(t.limits):{max_upload_mb:1024}}async function J(){return t.capabilities?c(t.capabilities):{ffmpeg:!1,ghostscript:!1,libreoffice:!1,max_chunk_mb:5,upload_limit_mb:1024,onlyoffice_url:e.onlyOfficeBase??null,drawio_url:e.drawioBase??null,convert_url:e.convertBase??null}}async function de(ge){if(!t.shareCreate)throw new Error("shareCreate endpoint not configured");return c(t.shareCreate,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(ge)})}async function xe(ge){if(!t.shareList)return{shares:[]};const he=t.shareList.includes("?")?"&":"?";return c(`${t.shareList}${he}path=${encodeURIComponent(ge)}`)}async function ke(ge){if(!t.shareDelete)throw new Error("shareDelete endpoint not configured");const he=t.shareDelete.replace("{uuid}",encodeURIComponent(ge));return c(he,{method:"DELETE"})}async function ae(ge){if(!t.archiveList)throw new Error("archiveList endpoint not configured");return{entries:(await c(t.archiveList,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge})})).entries.map(Ae=>({name:Ae.name,size:Ae.size,isDir:Ae.is_dir,lastModified:Ae.mtime}))}}async function be(ge,he){if(!t.archiveExtract)throw new Error("archiveExtract endpoint not configured");return c(t.archiveExtract,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,members:he})})}async function _e(ge,he){if(!t.archiveAdd)throw new Error("archiveAdd endpoint not configured");return c(t.archiveAdd,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:ge,files:he})})}function Ce(ge=""){return t.manager.replace(/\/manager(\?.*)?$/,"/versions")+ge}async function Ve(ge){const he=await c(Ce()+"?node_id="+encodeURIComponent(String(ge)));return Array.isArray(he==null?void 0:he.versions)?he.versions:[]}async function rt(ge,he,Ae=!0){await c(Ce("/restore"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:ge,version_id:he,snapshot_current:Ae})})}async function tt(ge){await c(Ce("/snapshot"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:ge})})}function Pe(ge=""){return t.manager.replace(/\/manager(\?.*)?$/,"/comments")+ge}async function ze(ge){const he=await c(Pe()+"?node_id="+encodeURIComponent(String(ge)));return Array.isArray(he==null?void 0:he.comments)?he.comments:[]}async function Ie(ge,he){return(await c(Pe(),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({node_id:ge,body:he})})).comment}async function pe(ge){await c(Pe("/"+encodeURIComponent(String(ge))),{method:"DELETE"})}async function Ge(){const ge=t.manager.replace(/\/manager(\?.*)?$/,"/ws-ticket");try{return await c(ge,{method:"POST"})}catch{return null}}return{wsTicket:Ge,index:y,search:S,globalSearch:x,subfolders:N,newFolder:w,rename:E,move:C,copy:L,moveAsync:R,deleteAsync:$,deleteItems:A,restore:Y,listTrash:F,restoreIds:q,uploadMultipart:X,downloadUrl:z,previewUrl:H,fetchBlob:O,fetchArrayBuffer:P,limits:K,capabilities:J,createShare:de,listShares:xe,revokeShare:ke,archiveList:ae,archiveExtract:be,archiveAdd:_e,listVersions:Ve,restoreVersion:rt,snapshotVersion:tt,listComments:ze,addComment:Ie,deleteComment:pe,listPermissions:u,resolveEmail:p,searchUsers:f,addPermission:h,updatePermission:_,deletePermission:b,invitePermission:k,shareMail:m,endpoints:t,authHeaders:i,authHeadersSync:o,credentialsMode:s,jsonFetch:c}}const kc="filex:uploads:v1",Mf=24*60*60*1e3;function fs(e,t){return[e,t.name,t.size,t.lastModified??0].join("\0")}function Of(){try{return typeof localStorage>"u"?null:(localStorage.getItem(kc),localStorage)}catch{return null}}function _c(e){if(!e)return{};try{const t=e.getItem(kc);if(!t)return{};const a=JSON.parse(t);return a&&typeof a=="object"?a:{}}catch{return{}}}function wc(e,t){if(e)try{e.setItem(kc,JSON.stringify(t))}catch{}}function Ec(e,t=Date.now()){const a=_c(e);let r=!1;for(const[i,o]of Object.entries(a))(!(o!=null&&o.uploadId)||t-(o.updatedAt??0)>Mf)&&(delete a[i],r=!0);return r&&wc(e,a),a}function Sc(e,t,a=Date.now()){return Ec(e,a)[t]??null}function If(e,t,a,r=Date.now()){const i=_c(e);i[t]={...a,updatedAt:r},wc(e,i)}function si(e,t){const a=_c(e);t in a&&(delete a[t],wc(e,a))}function Rf(e,t=Date.now()){return Object.values(Ec(e,t)).sort((a,r)=>r.updatedAt-a.updatedAt)}function $k(e){return!e||e==="staging"}function Lf(e){return e.stagedUnsupported=!0,e}function zf(e){return!!(e!=null&&e.stagedUnsupported)}function Ff(e,t,a=Of()){const r=e.chunkSize??8388608;function i(){const h=t.endpoints.uploadBegin;return h?h.replace(/\/begin$/,""):t.endpoints.manager.replace(/\/manager(\?.*)?$/,"/upload")}function o(){return!!i()}function s(){return r}function l(h){return o()&&h.size>s()}function c(h,_){return Sc(a,fs(h,_))}function d(){return Rf(a)}async function u(h){si(a,fs(h.path,{name:h.name,size:h.size,lastModified:h.lastModified}));try{await t.jsonFetch(`${i()}/${encodeURIComponent(h.uploadId)}`,{method:"DELETE"})}catch{}}async function p(h){return t.jsonFetch(`${i()}/${encodeURIComponent(h)}`)}async function f(h){var x,N;const _=fs(h.path,h.file),b={id:crypto.randomUUID(),file:h.file,path:h.path,totalBytes:h.file.size,uploadedBytes:0,percent:0,status:"initializing",cancel:()=>{}};let k=!1,m=null;b.cancel=()=>{k=!0,m==null||m.abort()};let v=0;function g(w=0){var E;b.uploadedBytes=Math.min(b.totalBytes,v+w),b.percent=b.totalBytes>0?Math.min(100,Math.round(b.uploadedBytes/b.totalBytes*100)):b.status==="done"?100:0,(E=h.onProgress)==null||E.call(h,b)}try{if(!o())throw Lf(new Error("staged upload endpoint not configured"));const w=i();let E="",C=h.chunkSize??r;const A=Sc(a,_);if(A)try{const $=await p(A.uploadId);$k($.state)&&($.total_size??0)===h.file.size?(E=A.uploadId,C=$.chunk_size??$.chunkSize??A.chunkSize,v=$.offset??0,b.resumedFrom=v):si(a,_)}catch{si(a,_)}if(!E){let $;try{$=await t.jsonFetch(`${w}/begin`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:h.path,name:h.file.name,size:h.file.size,mime:h.file.type||"application/octet-stream",chunk_size:h.chunkSize??r})})}catch(Y){const F=Y.status;throw(F===404||F===501)&&Lf(Y),Y}if(!($!=null&&$.id))throw new Error("begin returned no upload id");E=$.id,C=$.chunk_size??$.chunkSize??C,v=$.offset??0}b.uploadId=E,b.status="uploading",If(a,_,{uploadId:E,path:h.path,name:h.file.name,size:h.file.size,lastModified:h.file.lastModified,chunkSize:C,offset:v}),g();const L=4;for(;v<h.file.size;){if(k)throw new DOMException("Aborted by user","AbortError");const $=Math.min(v+C,h.file.size),Y=h.file.slice(v,$);let F=-1,q=null;for(let X=0;X<L;X++){if(X>0){if(await Pf(300*X+Math.floor(Math.random()*150)),k)throw new DOMException("Aborted by user","AbortError");try{const z=await p(E);if((z.offset??0)>=$){F=z.offset??$;break}if((z.offset??0)!==v){v=z.offset??v,g(),F=-2;break}}catch{}}try{F=await y(E,Y,v,$,h.file.size);break}catch(z){const H=z instanceof Error?z:new Error(String(z));if(k||H.name==="AbortError")throw H;const O=H.status;if(O&&O!==400&&O!==409&&O<500)throw H;q=H}}if(F!==-2){if(F<0)throw q??new Error("chunk upload failed");if(F<=v)throw new Error(`upload stalled at byte ${v}`);v=F,g(),If(a,_,{uploadId:E,path:h.path,name:h.file.name,size:h.file.size,lastModified:h.file.lastModified,chunkSize:C,offset:v})}}if(k)throw new DOMException("Aborted by user","AbortError");b.status="committing",g();const R=await t.jsonFetch(`${w}/${encodeURIComponent(E)}/commit`,{method:"POST"});return si(a,_),b.opId=R==null?void 0:R.op_id,b.nodeId=R==null?void 0:R.node_id,h.waitForTransfer&&(R!=null&&R.op_id)&&t.endpoints.opsShow&&(b.status="transferring",g(),await S(R.op_id)),b.status="done",v=b.totalBytes,g(),(x=h.onDone)==null||x.call(h,b,R),R}catch(w){const E=w instanceof Error?w:new Error(String(w));if(b.status=E.name==="AbortError"?"aborted":"error",b.error=E.message,g(),b.uploadId&&b.status==="aborted"){si(a,_);try{await t.jsonFetch(`${i()}/${encodeURIComponent(b.uploadId)}`,{method:"DELETE"})}catch{}}throw(N=h.onError)==null||N.call(h,b,E),E}function y(w,E,C,A,L){return new Promise((R,$)=>{const Y=new XMLHttpRequest;m=Y,Y.open("PUT",`${i()}/${encodeURIComponent(w)}`);const F=t.authHeadersSync({"Content-Type":"application/octet-stream","Content-Range":`bytes ${C}-${A-1}/${L}`});for(const[q,X]of Object.entries(F))Y.setRequestHeader(q,X);Y.withCredentials=t.credentialsMode()==="include",Y.upload.onprogress=q=>{q.lengthComputable&&g(q.loaded)},Y.onload=()=>{if(m=null,Y.status>=200&&Y.status<300){try{const X=JSON.parse(Y.responseText);R(X.offset??A)}catch{R(A)}return}const q=new Error(`chunk ${C}-${A-1} → ${Y.status}`);q.status=Y.status,q.detail=Y.responseText.slice(0,200),$(q)},Y.onerror=()=>{m=null,$(new Error(`chunk ${C}-${A-1}: network error`))},Y.onabort=()=>{m=null,$(new DOMException("Aborted","AbortError"))},Y.send(E)})}async function S(w){const E=t.endpoints.opsShow;if(!E)return;const C=E.replace("{id}",String(w));let A=200;for(;;){if(k)throw new DOMException("Aborted by user","AbortError");try{const L=await t.jsonFetch(C);if((L==null?void 0:L.status)==="ok")return;if((L==null?void 0:L.status)==="failed"||(L==null?void 0:L.status)==="partial")throw new Error(L.error||"transfer failed")}catch(L){if(L.message==="transfer failed"||L.name==="AbortError")throw L}await Pf(A),A=Math.min(A*2,2e3)}}}return{uploadFile:f,shouldChunk:l,threshold:s,resumableFor:c,listResumable:d,discardResumable:u}}function Pf(e){return new Promise(t=>setTimeout(t,e))}function $f(e){const t=n.ref(new Set),a=n.ref(null);function r(f,h={}){if(h.shift&&a.value){const _=e(),b=_.findIndex(y=>y.path===a.value),k=_.findIndex(y=>y.path===f);if(b===-1||k===-1){t.value=new Set([f]),a.value=f;return}const[m,v]=b<k?[b,k]:[k,b],g=new Set;for(let y=m;y<=v;y++)g.add(_[y].path);t.value=g;return}if(h.ctrl){const _=new Set(t.value);_.has(f)?_.delete(f):_.add(f),t.value=_,a.value=f;return}t.value=new Set([f]),a.value=f}function i(){t.value=new Set,a.value=null}function o(){t.value=new Set(e().map(f=>f.path))}function s(f){return t.value.has(f)}function l(f){const h=new Set(t.value);h.add(f),t.value=h}function c(f){const h=new Set(t.value);h.delete(f),t.value=h}const d=n.computed(()=>t.value.size),u=n.computed(()=>t.value.size===0),p=n.computed(()=>e().filter(h=>t.value.has(h.path)));return{selected:t,anchor:a,click:r,clear:i,selectAll:o,has:s,add:l,remove:c,size:d,isEmpty:u,nodes:p}}const cr=[{id:"palette",defaultCombo:"Ctrl+K",labelKey:"shortcuts.palette",groupKey:"shortcuts.group.nav"},{id:"search",defaultCombo:"/",labelKey:"shortcuts.search",groupKey:"shortcuts.group.nav"},{id:"go-up",defaultCombo:"Alt+↑",fixedCombos:["Backspace"],labelKey:"shortcuts.go_up",groupKey:"shortcuts.group.nav"},{id:"open",defaultCombo:"Enter",prevent:!1,labelKey:"shortcuts.open",groupKey:"shortcuts.group.nav"},{id:"quicklook",defaultCombo:"Space",labelKey:"shortcuts.quicklook",groupKey:"shortcuts.group.nav"},{id:"close",defaultCombo:"Esc",customizable:!1,prevent:!1,inForms:!0,labelKey:"shortcuts.close",groupKey:"shortcuts.group.nav"},{id:"inspector",defaultCombo:"I",labelKey:"shortcuts.inspector",groupKey:"shortcuts.group.nav"},{id:"help",defaultCombo:"?",labelKey:"shortcuts.help",groupKey:"shortcuts.group.nav"},{id:"toggle-hidden",defaultCombo:"Ctrl+Shift+.",labelKey:"shortcuts.toggle_hidden",groupKey:"shortcuts.group.nav"},{id:"select-all",defaultCombo:"Ctrl+A",labelKey:"shortcuts.select_all",groupKey:"shortcuts.group.selection"},{id:"rename",defaultCombo:"F2",labelKey:"shortcuts.rename",groupKey:"shortcuts.group.file"},{id:"delete",defaultCombo:"Del",labelKey:"shortcuts.delete",groupKey:"shortcuts.group.file"},{id:"cut",defaultCombo:"Ctrl+X",labelKey:"shortcuts.cut",groupKey:"shortcuts.group.file"},{id:"copy",defaultCombo:"Ctrl+C",labelKey:"shortcuts.copy",groupKey:"shortcuts.group.file"},{id:"paste",defaultCombo:"Ctrl+V",labelKey:"shortcuts.paste",groupKey:"shortcuts.group.file"},{id:"tab-new",defaultCombo:"Ctrl+T",labelKey:"shortcuts.tab_new",groupKey:"shortcuts.group.tabs"},{id:"tab-close",defaultCombo:"Ctrl+W",labelKey:"shortcuts.tab_close",groupKey:"shortcuts.group.tabs"},{id:"tab-next",defaultCombo:"Ctrl+Tab",labelKey:"shortcuts.tab_next",groupKey:"shortcuts.group.tabs"},{id:"tab-prev",defaultCombo:"Ctrl+Shift+Tab",labelKey:"shortcuts.tab_prev",groupKey:"shortcuts.group.tabs"}],Vk={palette:"onPathJump",search:"onFocusSearch","go-up":"onGoUp",open:"onOpen",quicklook:"onQuickLook",close:"onClose",inspector:"onToggleInspector","toggle-hidden":"onToggleHidden",help:"onShowHelp","select-all":"onSelectAll",rename:"onRename",delete:"onDelete",cut:"onCut",copy:"onCopy",paste:"onPaste","tab-new":"onTabNew","tab-close":"onTabClose","tab-next":"onTabNext","tab-prev":"onTabPrev"},xc="filex.shortcuts";function Uk(){try{const e=localStorage.getItem(xc);if(!e)return{};const t=JSON.parse(e);if(!t||typeof t!="object")return{};const a={};for(const[r,i]of Object.entries(t))typeof i=="string"&&cr.some(o=>o.id===r)&&(a[r]=i);return a}catch{return{}}}const xa=n.ref(Uk());function Cc(){try{Object.keys(xa.value).length===0?localStorage.removeItem(xc):localStorage.setItem(xc,JSON.stringify(xa.value))}catch{}}function Vf(e){return cr.find(t=>t.id===e)}function so(e){var a;const t=xa.value[e];return t!==void 0?t:((a=Vf(e))==null?void 0:a.defaultCombo)??""}function ps(e,t){const a=Vf(e);if(!a||a.customizable===!1)return;const r={...xa.value};t===a.defaultCombo?delete r[e]:r[e]=t,xa.value=r,Cc()}function Uf(e){if(!(e in xa.value))return;const t={...xa.value};delete t[e],xa.value=t,Cc()}function Hf(){xa.value={},Cc()}function Gf(e,t){var a;if(!e)return null;for(const r of cr)if(r.id!==t){if((a=r.fixedCombos)!=null&&a.includes(e))return{id:r.id,fixed:!0};if(so(r.id)===e)return{id:r.id,fixed:r.customizable===!1}}return null}const Hk={" ":"Space",Spacebar:"Space",Escape:"Esc",Delete:"Del",ArrowUp:"↑",ArrowDown:"↓",ArrowLeft:"←",ArrowRight:"→",PageUp:"PgUp",PageDown:"PgDn"},Gk=new Set(["Control","Alt","Shift","Meta","AltGraph","CapsLock","NumLock","ScrollLock","Fn","Dead"]);function Kk(e){const t=e.key;if(!t||Gk.has(t))return null;const a=Hk[t];return a||(t.length===1?t.toUpperCase():t)}function Nc(e){const t=Kk(e);if(!t)return null;const a=[];(e.ctrlKey||e.metaKey)&&a.push("Ctrl"),e.altKey&&a.push("Alt");const r=t.length===1&&t.toUpperCase()===t.toLowerCase();return e.shiftKey&&!r&&a.push("Shift"),a.push(t),a.join("+")}function Tc(){return n.computed(()=>cr.map(e=>{const t=so(e.id),a=e.fixedCombos??[];return{id:e.id,combo:t,fixedCombos:a,keys:[t,...a].filter(r=>!!r),labelKey:e.labelKey,groupKey:e.groupKey,customizable:e.customizable!==!1,overridden:xa.value[e.id]!==void 0}}))}cr.map(e=>({keys:[e.defaultCombo,...e.fixedCombos??[]].filter(t=>!!t),labelKey:e.labelKey,groupKey:e.groupKey}));function Kf(e,t){const a=n.computed(()=>{const i=new Map;for(const o of cr){const s=so(o.id);s&&i.set(s,o)}return i});function r(i){var p;if(!e.value||i.key!=="Escape"&&document.querySelector(".fe-ctx-backdrop"))return;const s=i.target,l=!!(s&&(s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.tagName==="SELECT"||s.isContentEditable)),c=Nc(i);if(!c)return;if(c==="Backspace"){if(l)return;(p=t.hasSelection)!=null&&p.call(t)&&t.onDelete?(i.preventDefault(),t.onDelete()):t.onGoUp&&(i.preventDefault(),t.onGoUp());return}const d=a.value.get(c);if(!d||l&&!d.inForms||c==="Space"&&s&&typeof s.closest=="function"&&s.closest('button, a, select, summary, [role="button"], [role="menuitem"]'))return;const u=t[Vk[d.id]];u&&(d.prevent!==!1&&i.preventDefault(),u())}n.onMounted(()=>window.addEventListener("keydown",r)),n.onBeforeUnmount(()=>window.removeEventListener("keydown",r))}const qf={"toolbar.new_folder":"Yeni Klasör","toolbar.upload":"Yükle","toolbar.search":"Ara","toolbar.search.placeholder":"Ada ya da tag: ile ara…","toolbar.view.list":"Liste","toolbar.view.grid":"Izgara","toolbar.refresh":"Yenile","toolbar.go_up":"Üst Klasör","ctx.open":"Aç","ctx.preview":"Önizle","ctx.download":"İndir","ctx.convert":"Dönüştür","ctx.rename":"Yeniden Adlandır","ctx.delete":"Sil","ctx.delete_perm":"Kalıcı Olarak Sil","ctx.restore":"Geri Getir","ctx.share":"Paylaş","ctx.move":"Taşı","ctx.copy":"Kopyala","ctx.cut":"Kes","ctx.show_hidden":"Gizli dosyaları göster","ctx.hide_hidden":"Gizli dosyaları gizle","ctx.keep_local":"Bilgisayarda tut","ctx.keep_online":"Yalnızca çevrimiçi tut","ctx.keep_reveal":"Yerel klasörü aç","ctx.keep_inherited":"Üst klasörle bilgisayarda tutuluyor","keep.started":"Bilgisayarda tutulacak — eşitleme başladı","keep.failed":"Bilgisayarda tutulamadı","keep.badge_kept":"Bilgisayarda","keep.badge_syncing":"Eşitleniyor…","keep.badge_cloud":"Yalnızca çevrimiçi","keep.badge_partial":"İçinde bilgisayarda tutulanlar var","keep.strip_transfer":"{name} eşitleniyor — {done}/{total} (%{pct})","keep.strip_inventory":"{name} eşitleniyor — sunucu taranıyor…","keep.strip_settling":"{name} eşitleniyor — son durum kaydediliyor…","ctx.paste":"Yapıştır","ctx.info":"Bilgi","ctx.duplicate":"Kopyasını Oluştur","ctx.new_file":"Yeni Dosya","modal.delete.title":"Silinsin mi?","modal.delete.message":"{count} öğe çöpe atılacak.","modal.delete.confirm":"Çöpe At","modal.delete.cancel":"Vazgeç","modal.rename.title":"Yeniden Adlandır","modal.rename.save":"Kaydet","modal.rename.cancel":"Vazgeç","modal.newfolder.title":"Yeni Klasör","modal.newfolder.placeholder":"Klasör adı","modal.newfolder.create":"Oluştur","modal.newfolder.cancel":"Vazgeç","modal.share.title":"Paylaşım Linki","modal.share.pin":"PIN koruması","modal.share.expires":"Son kullanma","modal.share.max_downloads":"İndirme limiti","modal.share.create":"Paylaş","modal.share.cancel":"Vazgeç","modal.share.close":"Kapat","modal.share.limit_applied":"(sunucu sınırı uygulandı)","modal.share.copy":"Kopyala","modal.share.url_copied":"Link kopyalandı","modal.share.pin_copied":"PIN kopyalandı","modal.share.cli_copied":"CLI komutu kopyalandı","upload.progress":"Yükleniyor","upload.done":"Tamamlandı","upload.error":"Hata","upload.failed":"“{name}” yüklenemedi","upload.aborted":"İptal edildi","upload.cancel":"İptal","upload.resuming":"“{name}” %{percent} noktasından devam ediyor","upload.committing":"Tamamlanıyor","upload.transferring":"Depolamaya aktarılıyor","empty.folder":"Bu klasör boş","empty.search":"Sonuç bulunamadı",loading:"Yükleniyor…","notFound.title":"Klasör bulunamadı","notFound.desc":"Bu klasör mevcut değil, taşınmış ya da erişim yetkiniz yok.","notFound.goRoot":"Kök klasöre dön","col.name":"Ad","col.size":"Boyut","col.modified":"Tarih","col.type":"Tür","unit.bytes":"B","unit.kb":"KB","unit.mb":"MB","unit.gb":"GB","unit.tb":"TB","breadcrumb.root":"Kök","breadcrumb.copy_path":"Yolu Kopyala","breadcrumb.go_to_path":"Yola Git","breadcrumb.path_placeholder":"fileman/foo/bar","ops.copy":"Kopyalanıyor","ops.move":"Taşınıyor","ops.delete":"Siliniyor","ops.queued":"sırada","ops.done":"tamamlandı","ops.error":"hata","node.trash":"Çöp Kutusu","viewer.open_in_new_tab":"Yeni Sekmede Aç","viewer.loading":"Yükleniyor…","viewer.failed_to_load":"Dosya yüklenemedi","viewer.peer_not_installed":"Bu dosya tipi için opsiyonel kütüphane kurulu değil. Peer dependency yükle veya İndir düğmesini kullan.","viewer.format_unsupported_3d":"Bu 3B format tarayıcı önizlemesinde desteklenmiyor (model-viewer yalnızca .glb / .gltf / .usdz okur). Lütfen indirip yerel bir araçta açın.","viewer.zoom_in":"Yakınlaştır","viewer.zoom_out":"Uzaklaştır","viewer.fit_width":"Sayfa genişliğine sığdır","viewer.next_page":"Sonraki sayfa","viewer.prev_page":"Önceki sayfa","viewer.page_n_of_m":"Sayfa {n} / {m}","viewer.tags":"Etiketler","viewer.layers":"Katmanlar","viewer.toc":"İçindekiler","viewer.font_smaller":"Yazıyı küçült","viewer.font_larger":"Yazıyı büyüt","viewer.search":"Ara","viewer.download":"İndir","viewer.saving":"Kaydediliyor…","viewer.save":"Kaydet (Ctrl+S)","viewer.saved":"Kaydedildi","viewer.save_error":"Hata","viewer.editor_loading":"Editör yükleniyor…","viewer.no_preview":"Bu dosya tipi için önizleme henüz yok.","viewer.edit":"Düzenle","viewer.close":"Kapat","presence.expand":"İsimleri göster","presence.collapse":"Küçült","viewer.save_annotations":"Açıklamaları kaydet","viewer.annotations_on":"Açıklamalar: açık","viewer.annotations_off":"Açıklamalar: kapalı","viewer.read_only":"Salt okunur","viewer.csv_first_row_header":"İlk satır başlık olsun","viewer.csv_filter":"Satır filtrele…","viewer.epub_prev":"Önceki","viewer.epub_next":"Sonraki","viewer.drawio.disabled":"diagrams.net editörü bu filex kurulumunda yapılandırılmamış — yönetici FILEX_DRAWIO_URL'yi ayarlamalı.","viewer.archive.entries":"{n} dosya","viewer.archive.empty":"Arşiv boş.","viewer.archive.error":"Arşiv okunamadı.","viewer.name":"Ad","viewer.size":"Boyut","col.sort":"Sırala","group.today":"Bugün","group.yesterday":"Dün","group.this_week":"Bu Hafta","group.this_month":"Bu Ay","group.no_date":"Tarihsiz","toolbar.density.compact":"Sıkışık görünüm","toolbar.density.comfortable":"Rahat görünüm","palette.placeholder":"Dosya, klasör veya komut ara…","palette.files":"Dosyalar","palette.commands":"Komutlar","palette.goto":"Yola git","palette.empty":"Sonuç bulunamadı","palette.hint":"↑↓ gezin · Enter seç · Esc kapat","cmd.view_toggle":"Görünümü değiştir (liste ⇄ ızgara)","cmd.trash":"Çöp kutusunu aç","shortcuts.title":"Klavye Kısayolları","shortcuts.group.nav":"Gezinme","shortcuts.group.selection":"Seçim","shortcuts.group.file":"Dosya işlemleri","shortcuts.palette":"Komut paleti","shortcuts.search":"Aramaya odaklan","shortcuts.go_up":"Üst klasöre çık","shortcuts.open":"Seçili öğeyi aç","shortcuts.close":"Kapat / vazgeç","shortcuts.toggle_hidden":"Gizli dosyaları göster/gizle","shortcuts.help":"Bu yardım penceresi","shortcuts.select_all":"Tümünü seç","shortcuts.rename":"Yeniden adlandır","shortcuts.delete":"Sil","shortcuts.cut":"Kes","shortcuts.copy":"Kopyala","shortcuts.paste":"Yapıştır","breadcrumb.more":"Aradaki klasörler","empty.hint":"Dosyaları buraya sürükleyip bırakın","empty.upload":"Dosya yükle","empty.search.title":"Aramanla eşleşen dosya yok","empty.search.hint":"Farklı bir arama terimi deneyin","empty.trash.title":"Çöp kutusu boş","error.title":"Liste yüklenemedi","error.retry":"Yeniden dene","toast.undo":"Geri Al","toast.undone":"Geri alındı","toast.undo_failed":"Geri alınamadı","toast.renamed":"Yeniden adlandırıldı","toast.moved":"Taşındı","toast.trashed":"Çöpe taşındı","conn.offline":"Canlı bağlantı yok — değişiklikler gecikebilir","conn.tooltip":"Sunucuyla canlı bağlantı kurulamadı; liste belirli aralıklarla otomatik yenilenir. Bağlantı geri gelince bu uyarı kaybolur.","palette.everywhere":"Her yerde","palette.searching":"Aranıyor…","palette.saved":"Kayıtlı aramalar","palette.save":"Aramayı kaydet","palette.saved.delete":"Kayıtlı aramayı sil","search.in_content":"İçerikte","toolbar.more":"Diğer işlemler","toolbar.search.close":"Aramayı kapat","sheet.menu":"İşlemler","sheet.close":"Kapat","toolbar.inspector":"Ayrıntılar","ctx.details":"Ayrıntılar","shortcuts.inspector":"Ayrıntılar panelini aç/kapat","inspector.title":"Ayrıntılar","inspector.close":"Kapat","inspector.section.general":"Genel","inspector.section.versions":"Sürümler","inspector.section.permissions":"İzinler","inspector.section.shares":"Paylaşımlar","inspector.path":"Yol","inspector.size":"Boyut","inspector.modified":"Değiştirilme","inspector.mime":"MIME türü","inspector.etag":"ETag","inspector.copy":"Kopyala","inspector.copied":"Kopyalandı","inspector.error":"Yüklenemedi","inspector.items_summary":"{n} öğe, toplam {size}","inspector.folder_items":"{n} öğe","inspector.versions.empty":"Sürüm geçmişi yok","inspector.versions.v":"Sürüm {n}","inspector.versions.restore":"Geri yükle","inspector.versions.restore_confirm":"Bu sürüm geri yüklensin mi?","inspector.versions.snapshot_current":"Önce şimdiki halin sürümünü al","inspector.versions.confirm":"Onayla","inspector.versions.cancel":"Vazgeç","inspector.versions.take_snapshot":"Şimdiki halin sürümünü al","inspector.versions.restored":"Sürüm geri yüklendi","inspector.versions.snapshotted":"Sürüm alındı","inspector.versions.unsupported":"Sunucu bu işlemi desteklemiyor","inspector.perm.none":"Erişim yok","inspector.perm.viewer":"Görüntüleyen","inspector.perm.editor":"Düzenleyen","inspector.perm.owner":"Sahip","inspector.perm.manage":"İzinleri yönet","inspector.shares.empty":"Paylaşım linki yok","inspector.shares.copy":"Linki kopyala","theme.menu":"Tema","theme.title":"Tema Galerisi","theme.hint":"Tema yalnız renk paletini değiştirir; gündüz mü gece mi olduğu yukarıdaki seçim.","theme.mode.label":"Görünüm","theme.mode.light":"Gündüz","theme.mode.dark":"Gece","theme.mode.auto":"Otomatik","theme.reset":"Varsayılana dön","theme.close":"Kapat","theme.selected":"Seçili","theme.name.default":"Varsayılan","theme.name.night":"Gece Mavisi","theme.name.forest":"Orman","theme.name.amber":"Kehribar","theme.name.lilac":"Leylak","theme.name.contrast":"Yüksek Kontrast","theme.name.gray":"Yumuşak Gri","theme.name.terminal":"Terminal Yeşili","shortcuts.quicklook":"Hızlı bakış","shortcuts.customize":"Özelleştir","shortcuts.settings.menu":"Kısayollar","shortcuts.settings.title":"Kısayol Ayarları","shortcuts.settings.hint":'Bir kısayolu değiştirmek için "Değiştir"e basıp yeni tuş kombinasyonuna basın. Değişiklikler yalnızca bu tarayıcıda saklanır.',"shortcuts.settings.change":"Değiştir","shortcuts.settings.capture":"Tuşlara basın… (Esc iptal)","shortcuts.settings.reset":"Varsayılana dön","shortcuts.settings.reset_all":"Tümünü sıfırla","shortcuts.settings.unbound":"Atanmadı","shortcuts.settings.fixed":"Sabit","shortcuts.settings.customized":"Özelleştirildi","shortcuts.settings.conflict":'kombinasyonu "{name}" kısayolunda kullanılıyor.',"shortcuts.settings.conflict_fixed":'kombinasyonu "{name}" sabit kısayoluna ayrılmış — kullanılamaz.',"shortcuts.settings.conflict_take":"Eskisini boşa çıkar ve ata","shortcuts.settings.conflict_cancel":"Vazgeç","quicklook.hint_close":"kapat","quicklook.hint_nav":"önceki/sonraki","quicklook.hint_open":"aç","opc.title":"İşlemler","opc.aria_badge":"{n} işlem — işlem merkezini aç/kapat","opc.close":"Kapat","opc.active":"Sürüyor","opc.history":"Geçmiş","opc.clear":"Temizle","opc.empty":"İşlem yok","opc.cancel":"İptal","opc.retry":"Yeniden dene","opc.dismiss":"Kapat","opc.queued":"Sırada","opc.percent":"%{n}","opc.status.running":"Sürüyor","opc.status.done":"Bitti","opc.status.error":"Hata","opc.status.aborted":"İptal edildi","opc.kind.upload":"Yükleme","opc.kind.copy":"Kopyalama","opc.kind.move":"Taşıma","opc.kind.delete":"Silme","opc.kind.convert":"Dönüştürme","opc.kind.archive":"Arşiv","tour.aria":"Tanıtım turu","tour.restart":"Turu tekrar başlat","tour.skip":"Turu atla","tour.back":"Geri","tour.next":"İleri","tour.done":"Bitti","tour.progress":"{n} / {m}","tour.step.nav.title":"Depo ve klasörler","tour.step.nav.desc":"Bulunduğun konum burada görünür. Kırıntı çubuğundaki adımlara tıklayarak üst klasörlere ve depo köküne dönebilirsin.","tour.step.upload.title":"Dosya yükle","tour.step.upload.desc":"Bu düğmeyle dosya seçebilirsin; dosyaları doğrudan pencereye sürükleyip bırakmak da çalışır.","tour.step.search.title":"Arama","tour.step.search.desc":'Bu kutu deponun tamamında ada göre arar; ayraçları ve bir harflik yazım hatasını affeder, yani "fatura 2026" yazdığında fatura_2026.pdf gelir. tag:fatura yazarak etikete göre süzebilirsin. Ctrl+K komut paleti ayrıca komut da çalıştırır.',"tour.step.view.title":"Görünümü değiştir","tour.step.view.desc":"Liste ve ızgara görünümü arasında geçiş yapabilirsin; seçimin hatırlanır.","tour.step.share.title":"Paylaşım","tour.step.share.desc":'Bir dosyaya sağ tıklayıp "Paylaş / İzinler" ile bağlantı oluşturabilir, PIN ve son kullanma süresi ekleyebilirsin.',"tour.step.help.title":"Kısayollar","tour.step.help.desc":'? tuşu kısayol kartını, Ctrl+K komut paletini açar. Bu turu menüdeki "Turu tekrar başlat" ile dilediğinde yeniden izleyebilirsin.',"error.hint":"Bağlantı ya da sunucu kaynaklı geçici bir sorun olabilir. Yeniden deneyin.","error.details":"Teknik ayrıntılar","col.star":"Yıldız","toolbar.view_label":"Görünüm","list.aria":"Dosya listesi","grid.aria":"Dosya ızgarası","tabs.strip":"Sekmeler","tabs.new":"Yeni sekme","tabs.close":"Sekmeyi kapat","tabs.split":"Görünümü böl","tabs.split_off":"Bölmeyi kapat","ctx.open_new_tab":"Yeni sekmede aç","shortcuts.group.tabs":"Sekmeler","shortcuts.tab_new":"Yeni sekme","shortcuts.tab_close":"Sekmeyi kapat","shortcuts.tab_next":"Sonraki sekme","shortcuts.tab_prev":"Önceki sekme","cmd.tab_new":"Yeni sekme aç","cmd.split_toggle":"Görünümü böl / birleştir","split.pane":"İkincil panel","split.close":"Yan paneli kapat","split.error":"Liste yüklenemedi","split.retry":"Yeniden dene","split.copy_queued":"Kopyalama kuyruğa alındı","split.cross_copy":"Depolar farklı — kopyalama kuyruğa alındı","dragout.downloading":"Bırakılan klasöre indiriliyor…","dragout.not_found":"Bırakılan yer bulunamadı — dosya bir klasöre değil bir uygulamaya bırakıldıysa indirme yapılamaz","dragout.done":"İndirme tamamlandı","dragout.ready":"Dosyalar hazır — masaüstüne sürükleyebilirsin","dragout.preparing":"Sürükleme için hazırlanıyor…","split.cross_move":"Depolar farklı — taşıma kuyruğa alındı (baytlar aktarılıp kaynak silinir)","toolbar.view.gallery":"Galeri","gallery.aria":"Dosya galerisi","inspector.section.comments":"Yorumlar","inspector.comments.empty":"Henüz yorum yok.","inspector.comments.placeholder":"Yorum yaz…","inspector.comments.send":"Gönder","inspector.comments.delete":"Yorumu sil","e2e.create.title":"Şifreli klasör oluştur","e2e.create.option":"Şifreli klasör oluştur…","e2e.create.pw_placeholder":"Klasör parolası (en az 8 karakter)","e2e.create.pw2_placeholder":"Parolayı tekrar girin","e2e.create.warn_title":"GERİ DÖNÜŞÜ YOK","e2e.create.warn_body":"Dosyalar yalnız bu parolayla açılır. Parola sunucuda TUTULMAZ; unutursanız içerik sonsuza dek kaybolur. Kurtarma yolu yoktur — yönetici dahil kimse açamaz.","e2e.create.ack":"Anladım: parolayı kaybedersem verilerim kurtarılamaz.","e2e.create.ack_required":"Devam etmek için uyarıyı onaylayın.","e2e.create.pw_short":"Parola en az 8 karakter olmalı.","e2e.create.pw_mismatch":"Parolalar birbirini tutmuyor.","e2e.create.bad_name":"Geçersiz klasör adı.","e2e.create.create":"Şifreli klasörü oluştur","e2e.create.busy":"Oluşturuluyor…","e2e.create.done":"Şifreli klasör oluşturuldu","e2e.create.failed":"Şifreli klasör oluşturulamadı","e2e.create.nested":"Şifreli klasörün içine ikinci bir şifreli klasör açılamaz.","e2e.locked.title":"Bu klasör uçtan uca şifreli","e2e.locked.hint":"İçeriği görmek için klasör parolasını girin. Parola yalnız bu sekmede, bellekte tutulur.","e2e.locked.pw_placeholder":"Klasör parolası","e2e.locked.unlock":"Kilidi aç","e2e.locked.busy":"Doğrulanıyor…","e2e.unlock.wrong":"Parola yanlış.","e2e.unlock.marker_missing":"Şifre dosyası (.filex-e2e.json) okunamadı.","e2e.strip.label":"Şifreli klasör — kilit açık","e2e.strip.lock":"Kilitle","e2e.locked_toast":"Klasör kilitlendi","e2e.upload.too_big":"200 MB üstü dosyalar şifreli klasöre yüklenemez (MVP sınırı)","e2e.upload.locked":"Önce klasörün kilidini açın","e2e.decrypting":"Çözülüyor…","e2e.decrypt_failed":"Dosya çözülemedi (parola değişmiş ya da dosya bozulmuş olabilir).","e2e.download.failed":"Şifreli dosya indirilemedi.","conn.title":"Depo bağlantıları","conn.subtitle":"{host} sunucusunu bir arka uca bağlayın ya da kendi bilgisayarınızı {host} sunucusuna bağlayın.","conn.close":"Kapat","conn.tab.storages":"Depolar","conn.tab.connect":"Nasıl bağlanılır","conn.loading":"Yükleniyor…","conn.visibleOnly":"bu depoya göz atabilirsiniz","conn.denied.title":"Buraya depo ekleyebilen tek kişi yöneticidir","conn.denied.none":"Hesabınız dosyalara göz atabilir ama bu sunucunun nereye bağlı olduğunu değiştiremez. Depo eklemek ya da düzenlemek için sunucunun yöneticisine başvurun.","conn.denied.anonymous":"Bu sunucuda oturum açmış değilsiniz.","conn.denied.unreachable":"Sunucu yanıt vermedi: {error}","conn.denied.guideHint":"Zaten görebildiğiniz depolara kendi bilgisayarınızdan bağlanmak için yönetici yetkisi gerekmez.","conn.denied.guideCta":"Nasıl bağlanacağımı göster","conn.list.count":"{n} depo","conn.list.add":"Depo ekle","conn.list.empty":"Henüz yapılandırılmış depo yok. Bir tane ekleyin, dosyalar dosya yöneticisinde görünsün.","conn.list.edit":"Düzenle","conn.list.remove":"Kaldır","conn.list.confirm":"Gerçekten kaldırılsın mı?","conn.list.readOnly":"salt okunur","conn.list.disabled":"kapalı","conn.form.newTitle":"Yeni depo","conn.form.editTitle":"“{name}” düzenleniyor","conn.form.name":"Görünen isim","conn.form.namePlaceholder":"fotograflar","conn.form.nameHelp":"Bu deponun her yerdeki adı: dosya yöneticisinde, yollarda (isim://klasor) ve WebDAV adreslerinde.","conn.form.driver":"Tür","conn.form.driverLocked":"Bir deponun türü oluşturulduktan sonra değiştirilemez — yollar zaten ona işaret ediyor.","conn.form.readOnly":"Salt okunur (bu depoya hiçbir şey yazılamaz)","conn.form.enabled":"Etkin","conn.form.test":"Bağlantıyı sına","conn.form.testing":"Sınanıyor…","conn.form.testOk":"Bağlandı. Kökte {count} öğe var.","conn.form.testFail":"Bağlanılamadı: {error}","conn.form.save":"Kaydet","conn.form.saving":"Kaydediliyor…","conn.form.cancel":"Vazgeç","conn.form.nameRequired":"Depoya bir isim verin.","conn.form.fillRequired":"* ile işaretli alanları doldurun.","conn.form.required":"Zorunlu","conn.form.advanced":"Gelişmiş ayarlar","conn.form.noFields":"Bu sunucu bu sürücü için hiçbir ayar tanımlamadı.","conn.form.reveal":"Göster","conn.form.hide":"Gizle","conn.guide.protocol":"Protokol","conn.guide.storage":"Depo","conn.guide.allStorages":"Tüm depolar","conn.guide.copy":"Kopyala","conn.guide.copied":"Kopyalandı","conn.guide.goodToKnow":"Bilmekte fayda var","conn.guide.userPlaceholder":"eposta@ornek.com","conn.guide.secretPlaceholder":"parolaniz-ya-da-token","conn.guide.fact.url":"Adres","conn.guide.fact.urlRootHint":"Görebildiğiniz her depo bu adresin altında bir klasör olarak görünür.","conn.guide.fact.urlStorageHint":"Doğrudan “{storage}” deposunu bağlar. Son parçayı silerseniz tüm depoları görürsünüz.","conn.guide.fact.user":"Kullanıcı adı","conn.guide.fact.password":"Parola","conn.guide.webdav.summary":"WebDAV, filex’i bir sürücü gibi bağlar: Windows Gezgini, macOS Finder, Linux, rclone ve Cyberduck bu protokolü konuşur ve yapılan her değişiklik filex’e yansır.","conn.guide.webdav.userHint":"filex hesabınızın e-posta adresi — görünen adınız değil.","conn.guide.webdav.passwordHint":"Hesap parolanız ya da bir API token (Ayarlar → API token). İki adımlı doğrulaması açık bir hesap ZORUNLU olarak token kullanır: Basic kimlik doğrulamasında ikinci adım için yer yoktur.","conn.guide.webdav.win.s1":"Dosya Gezgini’ni açın, Bu bilgisayar’a sağ tıklayın ve “Ağ sürücüsü bağla…” deyin.","conn.guide.webdav.win.s2":"Bir sürücü harfi seçin ve klasör olarak {url} adresini girin.","conn.guide.webdav.win.s3":"“Farklı kimlik bilgileri kullanarak bağlan” kutusunu işaretleyin ve yukarıdaki kullanıcı adı/parola ile girin.","conn.guide.webdav.win.cmdCaption":"Komut İstemi (sihirbaz olmadan aynı iş)","conn.guide.webdav.win.limits":"Windows’un tam olarak filex hatası gibi görünen üç yerleşik sınırı vardır: aktarımlar ~47,7 MB’ta durur, yaklaşık bin dosyalı klasörler açılmaz (“Disk biçimlendirilmemiş”) ve her iki ayarı değiştirdikten sonra WebClient hizmeti yeniden başlatılmalıdır.","conn.guide.webdav.win.regCaption":"Yönetici olarak çalıştırın, sonra sürücüyü yeniden bağlayın","conn.guide.webdav.win.https":"HTTPS zorunludur. Windows Basic kimlik bilgilerini yalnızca TLS üzerinden gönderir; düz http:// üzerinde hiçbir açıklama vermeden reddeder. BasicAuthLevel değerini 2 yapmayın — TLS kullanın.","conn.guide.webdav.win.persist":"Bağlanan sürücü oturum kapatmayı atlatamaz: Windows 7’den beri Basic kimlik bilgileri Kimlik Bilgisi Yöneticisi’nde saklanamaz ve /persistent:yes bunu değiştirmez. Kendiliğinden geri gelsin istiyorsanız komutu bir oturum açma betiğinden yeniden çalıştırın.","conn.guide.webdav.win.service":"Hiç bağlanamıyorsa WebClient hizmetinin çalıştığından emin olun: sc config WebClient start= auto && net start WebClient.","conn.guide.webdav.mac.s1":"Finder’da Git → Sunucuya Bağlan… (⌘K) yolunu izleyin.","conn.guide.webdav.mac.s2":"{url} adresini girip bağlanın.","conn.guide.webdav.mac.s3":"Yukarıdaki kullanıcı adı ve parolayla kimliğinizi doğrulayın.","conn.guide.webdav.mac.note":"Sürücü Konumlar altında görünür; her depo en üst düzeyde bir klasördür.","conn.guide.webdav.linux.mountCaption":"davfs2 ya da masaüstü dosya yöneticisi (GNOME Dosyalar, Dolphin)","conn.guide.webdav.linux.gvfsComment":"ya da bu adresi GNOME Dosyalar / Dolphin icine yapistirin","conn.guide.webdav.linux.locks":"davfs2 için kilitler kapatılmalıdır. filex WebDAV kilitlerini süreç belleğinde tutar; yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar — davfs2 tersini varsayar ve takılır.","conn.guide.webdav.rclone.obscureCaption":"rclone parolayı gizlenmiş biçimde saklar — önce bunu çalıştırıp çıktısını aşağıya yapıştırın","conn.guide.webdav.rclone.passPlaceholder":"<rclone obscure çıktısı>","conn.guide.webdav.rclone.useCaption":"Kullanımı","conn.guide.webdav.duck.s1":"Yeni Yer İmi → WebDAV (HTTPS).","conn.guide.webdav.duck.s2":"Sunucu {host}, port 443.","conn.guide.webdav.duck.s3":"Yol {path}.","conn.guide.webdav.duck.s4":"Kullanıcı adı {user}, parola yukarıdaki gibi.","conn.guide.webdav.note.delete":"WebDAV üzerinden silme kalıcıdır. Web arayüzü dosyaları filex çöp kutusuna taşır; istemciden silme ise nesneyi doğrudan arka uçtan kaldırır.","conn.guide.webdav.note.locks":"Kilitler sunucu belleğinde durur: yeniden başlatmayı atlatamazlar ve kopyalar arasında paylaşılmazlar. Windows ile Office’i memnun etmek için varlar, eşzamanlı düzenlemeyi hakemlemek için değil.","conn.guide.webdav.note.permissions":"Web arayüzünde ne görüyorsanız burada da onu görürsünüz. Kök yalnızca açabildiğiniz depoları listeler; yetkiniz dışındaki bir yol 403 değil 404 döner, böylece ağaç neyin var olduğunu sızdırmaz.","conn.guide.webdav.note.http":"Bu sunucuya düz http:// ile erişiliyor. Windows kimlik bilgilerinizi hiç göndermez, diğer tüm istemciler ise parolanızı açık metin olarak yollar. Bağlamadan önce filex’i TLS arkasına alın.","conn.s3keys.title":"S3 erişim anahtarları","conn.s3keys.lead":"Bir erişim anahtarı, S3 konuşan her istemcinin — rclone, restic, AWS CLI, mc, s3fs, Cyberduck — filex’e bağlanmasını sağlar. Anahtar sizin yetkinizi taşır, bir fazlasını değil.","conn.s3keys.disabled":"Bu sunucuda S3 ucu kapalı (FILEX_S3). Burada üretilen anahtar, yönetici ucu tekrar açana kadar bağlanmaz.","conn.s3keys.cannotMint":"Erişim anahtarı üretebilecek bir hesapla oturum açmış değilsiniz. Aşağıdaki talimatlar yine geçerli — bir anahtar isteyip yapıştırmanız yeter.","conn.s3keys.label":"Ne için? (dizüstü yedeği, CI, …)","conn.s3keys.defaultLabel":"erişim anahtarı","conn.s3keys.everyBucket":"Görebildiğim tüm kovalar","conn.s3keys.prefix":"Kova içindeki klasör (isteğe bağlı)","conn.s3keys.mint":"Anahtar oluştur","conn.s3keys.inheritNote":"Bir anahtar sahip olduğunuz yetkiyi yalnızca DARALTABİLİR: yetkileriniz, kiracınız, rolünüz. Anahtarı tek bir kovaya ya da klasöre kısıtlamak, bir dizüstü yedeği ile her şeyi okuyabilen bir kimlik arasındaki farktır.","conn.s3keys.once":"Gizli anahtarı şimdi kopyalayın — bir daha gösterilmeyecek.","conn.s3keys.accessKeyID":"Erişim anahtarı kimliği","conn.s3keys.secret":"Gizli anahtar","conn.s3keys.dismiss":"Kopyaladım","conn.s3keys.col.label":"Etiket","conn.s3keys.col.key":"Erişim anahtarı kimliği","conn.s3keys.col.scope":"Kapsam","conn.s3keys.col.lastUsed":"Son kullanım","conn.s3keys.scopeAll":"görebildiğiniz her şey","conn.s3keys.noLabel":"(etiketsiz)","conn.s3keys.neverUsed":"hiç","conn.s3keys.enable":"Aç","conn.s3keys.disable":"Kapat","conn.s3keys.revoke":"İptal et","conn.s3keys.confirm":"Emin misiniz?","conn.s3keys.empty":"Henüz erişim anahtarı yok.","conn.guide.s3.summary":"S3 ucu, S3 konuşan her şeyin — yedekleme, senkron araçları, SDK’lar — hedefi olarak filex’i kullanmanızı sağlar; hem de zaten sahip olduğunuz depolarla.","conn.guide.s3.keyPlaceholder":"yukarıdan bir anahtar oluşturun","conn.guide.s3.secretPlaceholder":"anahtarı oluştururken bir kez gösterilir","conn.guide.s3.fact.endpoint":"Uç adresi","conn.guide.s3.fact.endpointHint":"İstemciyi buraya yöneltin, filex’in web adresine değil.","conn.guide.s3.fact.bucket":"Kova","conn.guide.s3.fact.bucketHint":"Kova = filex deposu. Kovaları istemci değil yönetici oluşturur.","conn.guide.s3.fact.key":"Erişim anahtarı kimliği","conn.guide.s3.fact.keyHint":"Genel yarısı; her istekte gider.","conn.guide.s3.fact.secret":"Gizli anahtar","conn.guide.s3.fact.secretHint":"Yalnızca anahtar oluşturulurken bir kez gösterilir. filex bir daha gösteremez — kaybolduysa yeni anahtar üretin.","conn.guide.s3.fact.region":"Bölge","conn.guide.s3.fact.regionHint":"filex’te bölge yok; hangi değeri verirseniz aynen geri döner. Yine de istemciler bir değer ister.","conn.guide.s3.fact.addressing":"Adresleme","conn.guide.s3.fact.pathStyle":"yol tabanlı (zorunlu)","conn.guide.s3.fact.pathStyleHint":"Bu kurulumda S3’e ayrılmış bir alan adı yok, yani kova.host çözülmez.","conn.guide.s3.fact.virtualHosted":"sanal-host ya da yol tabanlı","conn.guide.s3.fact.virtualHostedHint":"Bu kurulumun kendi S3 alan adı var, iki adresleme de çalışır.","conn.guide.s3.rclone.useCaption":"Kullanımı","conn.guide.s3.rclone.mtime":"filex dosyanın değişiklik zamanını taşır (x-amz-meta-mtime); böylece rclone sync ilk turdan sonra oturur, her seferinde her şeyi yeniden yüklemez.","conn.guide.s3.aws.configureCaption":"Bir kez ayarlayın","conn.guide.s3.aws.useCaption":"Kullanımı","conn.guide.s3.aws.pathStyle":"AWS yapılandırmanıza yol tabanlı adreslemeyi ekleyin; yoksa her komut DNS aşamasında düşer.","conn.guide.s3.restic.envCaption":"Ortam değişkenleri","conn.guide.s3.restic.useCaption":"Yedekle, doğrula, buda","conn.guide.s3.restic.verified":"Bu uca karşı ölçüldü: restic check --read-data her pack’i bayt bayt okuyor ve hata bulmuyor.","conn.guide.s3.mc.aliasCaption":"Takma adı ekleyin","conn.guide.s3.mc.useCaption":"Kullanımı","conn.guide.s3.s3fs.credsCaption":"Kimlik dosyası","conn.guide.s3.s3fs.mountCaption":"Bağlayın","conn.guide.s3.s3fs.note":"s3fs üzerinden bir dosyayı düzenlemek nesnenin tamamını yeniden yazar; silme ise filex çöpüne gider. Paylaşılan bir klasör için iyi, veritabanı için değil.","conn.guide.s3.duck.s1":"Yeni yer imi → Amazon S3.","conn.guide.s3.duck.s2":"Sunucu: {host}.","conn.guide.s3.duck.s3":"Erişim anahtarı kimliği: {key}, gizli anahtar yukarıdaki.","conn.guide.s3.duck.s4":"Yer imini açın; kovalar sizin filex depolarınızdır.","conn.guide.s3.duck.pathStyle":'Tercihler → S3 altında "Use virtual host style" seçeneğini KAPATIN — bu kurulumda joker S3 alan adı yok.',"conn.guide.s3.sdk.note":"SigV4 konuşan her istemci aynı şekilde çalışır: uç adresi, anahtar, gizli anahtar ve bu kurulumun kendi S3 alan adı yoksa yol tabanlı adresleme.","conn.guide.s3.note.buckets":"Kova = filex deposu. İstemci kovanın İÇİNDE klasör ve nesne oluşturabilir, ama kovanın kendisini oluşturamaz: kova bir sürücü ve bir yol ister, bunu bir S3 isteği ifade edemez.","conn.guide.s3.note.permissions":'Anahtar tam olarak sizin gördüğünüzü görür. Açamayacağınız bir kova "yasak" değil "böyle bir kova yok" der; böylece uç, neyin var olduğunu sızdırmaz.',"conn.guide.s3.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.s3.note.mtime":"Yüklemeler değişiklik zamanını taşır; istemcinin gönderdiği sağlama toplamları (Content-MD5, x-amz-checksum-*) doğrulanır — bozulmuş bir yükleme saklanmaz, reddedilir.","conn.guide.s3.note.pathStyle":"Bu kurulumda S3’e ayrılmış alan adı yok; istemcilere yol tabanlı adresleme söylenmeli. Söylenmezse güncel bir SDK, ne filex’i ne de sebebi anan bir DNS hatasıyla düşer.","conn.guide.s3.note.http":"Bu uç düz http://. İmzalar isteği yine korur ama nesneler açık metin gider. Bir yedeği buraya yöneltmeden önce filex’i TLS arkasına alın.","conn.sshkeys.title":"SSH anahtarları","conn.sshkeys.lead":"Bir açık anahtar kaydedin; SSH konuşan her istemci — sftp, scp, WinSCP, FileZilla, rclone, sshfs — parolanızı göndermeden bağlansın.","conn.sshkeys.disabled":"Bu sunucuda SFTP ucu kapalı (FILEX_SFTP). Burada kaydedilen anahtar, yönetici ucu açana kadar bağlanmaz.","conn.sshkeys.cannotAdd":"Anahtar kaydedebilecek bir hesapla oturum açmış değilsiniz.","conn.sshkeys.paste":"~/.ssh/id_ed25519.pub dosyasının içeriğini yapıştırın","conn.sshkeys.name":"Ad (isteğe bağlı — boşsa anahtarın kendi yorumu kullanılır)","conn.sshkeys.add":"Anahtar ekle","conn.sshkeys.noCopyId":"ssh-copy-id burada çalışamaz: kabuk üzerinden ~/.ssh/authorized_keys dosyasına ekler, filex’in kabuğu yoktur. Giriş yolu bu kutudur.","conn.sshkeys.col.name":"Ad","conn.sshkeys.col.fingerprint":"Parmak izi","conn.sshkeys.col.added":"Eklendi","conn.sshkeys.col.lastUsed":"Son kullanım","conn.sshkeys.noName":"(adsız)","conn.sshkeys.neverUsed":"hiç","conn.sshkeys.enable":"Aç","conn.sshkeys.disable":"Kapat","conn.sshkeys.remove":"Sil","conn.sshkeys.confirm":"Emin misiniz?","conn.sshkeys.empty":"Henüz anahtar yok. Anahtarsız istemciler hesap parolanızla giriş yapar.","conn.guide.sftp.summary":"SFTP, filex’i SSH konuşan her şeyin erişebileceği hâle getirir: bir yedekleme işi, bir tarayıcı, WinSCP, rclone ya da bağlanmış bir klasör.","conn.guide.sftp.fact.host":"Sunucu","conn.guide.sftp.fact.hostHint":"Web uygulamasıyla aynı makine, kendine ait bir portta.","conn.guide.sftp.fact.port":"Port","conn.guide.sftp.fact.portHint":"Ne 22 ne 443: SFTP ham TCP’dir, web vekilinin içinden geçemez.","conn.guide.sftp.fact.userHint":"Kısa giriş adınız. Giriş adındaki @ işareti çoğu istemcinin ayar dosyasında tırnaklanmak zorundadır; bu alan tam da onu ortadan kaldırır.","conn.guide.sftp.fact.auth":"Giriş yöntemi","conn.guide.sftp.fact.authKey":"kayıtlı SSH anahtarınız (ya da parolanız)","conn.guide.sftp.fact.authPassword":"hesap parolanız — ya da yukarıdan bir anahtar kaydedin","conn.guide.sftp.fact.authHint":"API token da parola yerine geçer ve tek başına iptal edilebilir. İki adımlı doğrulaması açık bir hesap anahtar ya da token kullanmalıdır.","conn.guide.sftp.fact.path":"Yol","conn.guide.sftp.fact.pathHint":"İlk klasör bir depodur; kök, açabildiğiniz depoları listeler.","conn.guide.sftp.openssh.connectCaption":"Bağlan, gönder, al","conn.guide.sftp.openssh.noShell":"Burada kabuk yok, yalnız SFTP alt sistemi var. `ssh sunucu komut` bilerek reddedilir; scp çalışır çünkü OpenSSH 9 onun için de SFTP konuşur.","conn.guide.sftp.key.tab":"Anahtar kurulumu","conn.guide.sftp.key.s1":"Bağlanacak makinede bir anahtar çifti üretin (zaten varsa atlayın).","conn.guide.sftp.key.s2":"AÇIK yarısını kopyalayın — .pub dosyası, asla diğeri değil.","conn.guide.sftp.key.s3":"Yukarıdaki kutuya yapıştırıp bağlanın; o andan sonra parola gönderilmez.","conn.guide.sftp.key.genCaption":"Kendi makinenizde","conn.guide.sftp.key.noCopyId":"ssh-copy-id filex’e karşı ÇALIŞMAZ: ~/.ssh/authorized_keys dosyasına eklemek için kabuğa ihtiyacı var, filex’te kabuk yok. Anahtarı yukarıdan yapıştırın.","conn.guide.sftp.winscp.s1":"Yeni site → Dosya protokolü: SFTP.","conn.guide.sftp.winscp.s2":"Sunucu adı: {host}, port: {port}.","conn.guide.sftp.winscp.s3":"Kullanıcı adı: {user}. Anahtar için: Gelişmiş → SSH → Kimlik Doğrulama → özel anahtar dosyası.","conn.guide.sftp.winscp.s4":"WinSCP .ppk biçiminde özel anahtar ister — OpenSSH anahtarını kendi aracıyla (Araçlar → PuTTYgen) bir kez dönüştürün.","conn.guide.sftp.filezilla.s1":"Dosya → Site Yöneticisi → Yeni site, Protokol: SFTP.","conn.guide.sftp.filezilla.s2":"Sunucu: {host}, port: {port}.","conn.guide.sftp.filezilla.s3":"Kullanıcı: {user}. Giriş türü: parola için Normal, anahtar için Anahtar dosyası.","conn.guide.sftp.rclone.useCaption":"Kullanımı","conn.guide.sftp.sshfs.mountCaption":"Bağla ve çöz","conn.guide.sftp.sshfs.note":"Bağlanmış bir klasörde her kayıt dosyanın tamamını yeniden yazar. Belgeler için iyi; veritabanı ya da yerinde düzenlediğiniz bir video için değil.","conn.guide.sftp.note.storages":"Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.","conn.guide.sftp.note.permissions":"İstemcinizin çizdiği izin bitleri buradaki erişim seviyenizden gelir; yani salt-okunur görünen bir dosya sizin için gerçekten öyledir.","conn.guide.sftp.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.sftp.note.totp":"Hesabınızda iki adımlı doğrulama açıksa parola burada çalışmaz — SSH’ın kodu soracak bir kanalı yok. Bir anahtar kaydedin ya da parola yerine API token kullanın.","conn.guide.sftp.note.disabled":"Bu sunucuda SFTP ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.","conn.guide.ftps.summary":"FTPS, yalnızca FTP öğrenmiş ekipman için var: tarayıp-klasöre-atan yazıcılar, EDI muhatapları, eski laboratuvar ve endüstri yazılımları. Her zaman TLS üzerinden.","conn.guide.ftps.fact.host":"Sunucu","conn.guide.ftps.fact.hostHint":"Web uygulamasıyla aynı makine, kendine ait bir portta.","conn.guide.ftps.fact.port":"Port","conn.guide.ftps.fact.portHint":"Kontrol kanalı. Veri, aşağıdaki pasif aralıktan ayrı bir porttan akar.","conn.guide.ftps.fact.mode":"Şifreleme","conn.guide.ftps.fact.modeValue":"FTPS — açık (explicit) TLS, zorunlu","conn.guide.ftps.fact.modeHint":'Düz FTP, parola okunmadan reddedilir. "Require explicit FTP over TLS" seçin; "plain FTP" ya da "implicit" asla.',"conn.guide.ftps.fact.userHint":"Kısa giriş adınız ya da e-postanız. Parola yerine API token da geçer ve tek başına iptal edilebilir.","conn.guide.ftps.fact.passwordHint":"Hesap parolanız ya da bir API token. İki adımlı doğrulaması açık hesap token kullanmalıdır — FTP'nin kodu soracak bir yolu yok.","conn.guide.ftps.fact.pasv":"Pasif portlar","conn.guide.ftps.fact.pasvHint":"Veri bağlantıları buraya düşer. Güvenlik duvarınız bu aralığı kapatıyorsa aktarım iki tarafta da hata vermeden ASILI KALIR — FTP'nin klasik arızası budur.","conn.guide.ftps.filezilla.s1":"Dosya → Site Yöneticisi → Yeni site, Protokol: FTP.","conn.guide.ftps.filezilla.s2":"Sunucu: {host}, port: {port}.","conn.guide.ftps.filezilla.s3":'Şifreleme: "Require explicit FTP over TLS". Giriş türü: Normal, kullanıcı: {user}.',"conn.guide.ftps.filezilla.s4":"Aktarım ayarları → Pasif. Bu sunucu aktif modu reddeder.","conn.guide.ftps.winscp.s1":"Yeni site → Dosya protokolü: FTP, Şifreleme: TLS/SSL Explicit encryption.","conn.guide.ftps.winscp.s2":"Sunucu adı: {host}, port: {port}.","conn.guide.ftps.winscp.s3":"Kullanıcı adı: {user}, parola yukarıdaki.","conn.guide.ftps.curl.caption":"Gönder ve al","conn.guide.ftps.curl.sslReqd":"--ssl-reqd isteğe bağlı değil: curl'ün düz metne geri düşmek yerine TLS'i ZORUNLU kılmasını sağlar. Bu sunucu zaten düz metni reddediyor, ama alışkanlık sizi reddetmeyen sunuculara karşı korur.","conn.guide.ftps.lftp.caption":"Bağlan","conn.guide.ftps.lftp.protectData":"ssl-protect-data yalnız girişi değil DOSYAYI da şifreler. Olmazsa lftp TLS ile giriş yapar ve dosyayı açık metin gönderir — sahada en sık yapılan FTPS yanlışı budur.","conn.guide.ftps.rclone.useCaption":"Kullanımı","conn.guide.ftps.printer.tab":"Tarayıcı / yazıcı","conn.guide.ftps.printer.s1":"Cihazın tara-ve-FTP'ye-gönder ayarlarında: sunucu {host}, port {port}.","conn.guide.ftps.printer.s2":"Kullanıcı: {user}, parola yukarıdaki. Cihaz için kendi parolanız yerine bir API token üretin — başka hiçbir şeyi değiştirmeden iptal edilebilir.","conn.guide.ftps.printer.s3":"Yol: {path} — ya da önceden oluşturduğunuz bir alt klasör. Cihaz depo oluşturamaz.","conn.guide.ftps.printer.s4":'"SSL/TLS" ya da "FTPS explicit" seçeneğini AÇIN ve PASİF modu seçin.',"conn.guide.ftps.printer.noTLS":"Tara-ve-gönder yazılımlarının önemli bir kısmı TLS konuşamıyor. Bu sunucu öyle bir cihazla konuşmayacak ve bu bilinçli: alternatifi, belgelerinizin ve parolanızın ofis ağında açık metin dolaşması.","conn.guide.ftps.note.tls":"TLS zorunludur ve kapatan bir düğme yoktur. Düz FTP parolanızı açık metin gönderir, ardından dosyanızı da.","conn.guide.ftps.note.passive":"Yalnızca pasif mod. Aktif modda sunucu istemciyi geri arar; bu NAT arkasında çalışmaz ve çoğu güvenlik duvarı tarafından engellenir.","conn.guide.ftps.note.storages":"Kök bir ev dizini değildir: açabildiğiniz depoları listeler ve yolun ilk parçası bir depoyu adlandırır.","conn.guide.ftps.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.ftps.note.prefer":"İstemci SFTP konuşabiliyorsa onu tercih edin: tek bağlantı, tek port, pasif mod sürprizi yok.","conn.guide.ftps.note.selfSigned":"Bu sunucu kendinden imzalı bir sertifika kullanıyor. Kanalı şifreler ama karşı tarafın kim olduğunu kanıtlamaz; çoğu istemci bir kez onay ister. Önemli bir iş için gerçek sertifika koyun.","conn.guide.ftps.note.disabled":"Bu sunucuda FTPS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.","conn.nfs.title":"NFS export'ları","conn.nfs.lead":"Bir export, ağınızdaki bir makinenin filex'i sürücü olarak bağlamasını sağlar — medya oynatıcı, derleme sunucusu, yedek kutusu.","conn.nfs.pathIsSecret":"⚠ Export yolu PAROLANIN TA KENDİSİDİR. NFS, Kerberos olmadan istemciye kim olduğunu soramaz; bu yüzden filex yola 32 rastgele bayt koyar: yolu bilen sizin adınıza bağlanır. Bağlama satırını bir kimlik bilgisi gibi saklayın — /etc/fstab çoğu sistemde herkes tarafından okunabilir.","conn.nfs.disabled":"Bu sunucuda NFS ucu kapalı (FILEX_NFS). Burada oluşturulan export, yönetici ucu açana kadar bağlanmaz.","conn.nfs.cannotMint":"Export oluşturabilecek bir hesapla oturum açmış değilsiniz.","conn.nfs.label":"Ne için? (medya oynatıcı, yedek kutusu, …)","conn.nfs.defaultLabel":"nfs export","conn.nfs.everyStorage":"Görebildiğim tüm depolar","conn.nfs.prefix":"Depo içindeki klasör (isteğe bağlı)","conn.nfs.allowCidrs":"İzinli adresler, örn. 192.168.1.0/24 (isteğe bağlı)","conn.nfs.readOnly":"Salt okunur","conn.nfs.readOnlyHint":"Bir makine için güvenli varsayılan salt okunurdur: sizin yetkiniz ne olursa olsun bu bağlantı üzerinden her yazmayı reddeder. Adres listesi daha da daraltır — listenin dışından gelen bağlanamaz.","conn.nfs.mint":"Export oluştur","conn.nfs.once":"Şimdi kopyalayın — yol yalnızca bir kez gösterilir ve geri alınamaz.","conn.nfs.dismiss":"Kopyaladım","conn.nfs.col.label":"Etiket","conn.nfs.col.scope":"Kapsam","conn.nfs.col.mode":"Mod","conn.nfs.col.lastUsed":"Son bağlanma","conn.nfs.scopeAll":"görebildiğiniz her şey","conn.nfs.modeRead":"salt okunur","conn.nfs.modeWrite":"okuma/yazma","conn.nfs.noLabel":"(etiketsiz)","conn.nfs.neverUsed":"hiç","conn.nfs.enable":"Aç","conn.nfs.disable":"Kapat","conn.nfs.revoke":"İptal et","conn.nfs.confirm":"Emin misiniz?","conn.nfs.empty":"Henüz export yok.","conn.guide.nfs.summary":"NFS, filex'i kendi ağınızdaki bir makinede sürücü olarak bağlar — NAS protokolü, onu bekleyen cihazlar için.","conn.guide.nfs.pathPlaceholder":"yukarıdan bir export oluşturun","conn.guide.nfs.fact.host":"Sunucu","conn.guide.nfs.fact.hostHint":"Web uygulamasıyla aynı makine, kendine ait bir portta.","conn.guide.nfs.fact.port":"Port","conn.guide.nfs.fact.portHint":"Hem port= hem mountport= buna ayarlanmalı; filex mount ve NFS servislerini tek portta veriyor.","conn.guide.nfs.fact.export":"Export yolu","conn.guide.nfs.fact.exportHint":"Kimlik bilgisi budur. Export oluşturulurken bir kez gösterilir ve hash'li saklanır — filex bir daha gösteremez.","conn.guide.nfs.fact.options":"Bağlama seçenekleri","conn.guide.nfs.fact.optionsHint":"nolock, çünkü filex NFS kilit yöneticisini çalıştırmıyor; nfsvers=3, çünkü bu sunucunun konuştuğu sürüm bu.","conn.guide.nfs.linux.mountCaption":"Bağla","conn.guide.nfs.linux.fstabSecret":"Bu yolu içeren bir /etc/fstab satırı, herkesin okuyabildiği bir dosyadaki paroladır. Ortamınızda önemliyse kimlik korumalı automount kullanın ya da bağlamayı yalnız root'un okuyabildiği bir unit dosyasında tutun.","conn.guide.nfs.mac.mountCaption":"Bağla","conn.guide.nfs.mac.resvport":"macOS resvport ister: istemcisi ayrıcalıklı bir kaynak portta ısrar eder ve olmadan bağlantıyı reddeder.","conn.guide.nfs.win.s1":`Windows Özellikleri'nden "Services for NFS" → "Client for NFS" bileşenini açın (yalnız Pro ve Enterprise; Home'da yok).`,"conn.guide.nfs.win.s2":"Komut İstemi'ni yönetici olarak açın.","conn.guide.nfs.win.s3":"Aşağıdaki komutla export'u bir sürücü harfine bağlayın.","conn.guide.nfs.win.cmdCaption":"Z: sürücüsüne bağla","conn.guide.nfs.win.port":"Windows'un mount servisinin portunu söyleme imkânı yok; yalnızca standart 2049 portundaki bir NFS sunucusuna erişebilir. Bu sunucu başka bir porttaysa SFTP'yi ya da filex masaüstü uygulamasını kullanın.","conn.guide.nfs.nas.tab":"NAS / medya oynatıcı","conn.guide.nfs.nas.s1":"Cihazın NFS ayarlarında: sunucu {host}, port {port} (ayrı ayrı soruyorsa hem NFS hem mount portunu ayarlayın).","conn.guide.nfs.nas.s2":"Uzak yol: yukarıdaki export yolu, birebir.","conn.guide.nfs.nas.s3":"NFS sürüm 3, kilitleme kapalı. Cihazın gerçekten yazması gerekmiyorsa export'u salt okunur oluşturun.","conn.guide.nfs.note.unencrypted":"NFSv3 şifreli değildir. Trafiği okuyabilen dosyalarınızı görür, yolu öğrenen bağlanabilir. Ev/ofis ağında ya da VPN üzerinden kullanın — internet üzerinden asla.","conn.guide.nfs.note.pathIsSecret":"Export yolu kimlik bilgisinin tamamıdır. Sızarsa yukarıdaki listeden iptal edin; değiştirilecek başka bir şey yok.","conn.guide.nfs.note.noPortmapper":"111 portunda portmapper yok; portu söylenmeyen istemci sunucuyu bulamaz. Buradaki her komutun port= ve mountport= taşımasının sebebi bu.","conn.guide.nfs.note.uid":"İstemcinizin gönderdiği kullanıcı ve grup kimlikleri yok sayılır: bağlantı zaten kime ait olduğunu biliyor. Gördüğünüz izinler filex'teki erişiminizden gelir.","conn.guide.nfs.note.trash":"Silme her yerdeki gibi filex çöpüne gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.nfs.note.revoke":"İptal anında değil, bir sonraki istekte etkili olur: NFS'te sonlandırılacak bir oturum yok, bağlantısı açık olan istemci sıradaki işleminde hata alır.","conn.guide.nfs.note.disabled":"Bu sunucuda NFS ucu kapalı. Yönetici açtığında bu talimatlar çalışacaktır.","conn.tokens.title":"API jetonları","conn.tokens.lead":"FTPS, WebDAV ve filex mount hesap parolanız yerine bir jetonla giriş yapar. Buradan üretin — tek başına iptal edilebilir, ayrıca iki adımlı doğrulaması açık bir hesap bunlarda parolasını zaten kullanamaz.","conn.tokens.mint":"Jeton oluştur","conn.tokens.once":"Şimdi kopyalayın — yalnızca bir kez gösterilir. Sunucuda yalnız özeti saklandığı için bir daha gösterilemez.","conn.tokens.dismiss":"Kopyaladım","conn.tokens.cannotMint":"Bu oturum jeton üretemiyor. Kendi hesabınızla giriş yapıp oluşturun.","conn.tokens.empty":"Henüz jeton yok.","conn.tokens.neverUsed":"hiç","conn.tokens.revoke":"İptal et","conn.tokens.confirm":"Emin misin?","conn.tokens.col.label":"Ad","conn.tokens.col.scopes":"Yetkisi","conn.tokens.col.used":"Son kullanım","conn.tokens.revokeHint":"İptal, yalnız bir sonraki girişi değil AÇIK bağlantıyı da durdurur: SFTP ya da FTPS oturumu kesilir, bağlı bir sürücü yarım dakika içinde çalışmayı bırakır.","conn.guide.mount.summary":"filex mount, uzaktaki bir filex sunucusunu bu makinede bir klasöre bağlar — tarayıcının kullandığı aynı HTTPS üzerinden. Buradakilerin her yerden çalışan tek yöntemi: yerel ağ da gerekmez, ek sunucu da, üçüncü parti bir istemci de.","conn.guide.mount.fact.url":"Sunucu adresi","conn.guide.mount.fact.urlHint":"Tarayıcıda kullandığınız adresin aynısı. Başka hiçbir şeye erişilebilir olması gerekmez.","conn.guide.mount.fact.token":"API jetonu","conn.guide.mount.fact.tokenPlaceholder":"Jetonlar bölümünden oluşturun","conn.guide.mount.fact.tokenHint":"Parolanız değil, jeton — tek başına iptal edilebilir, ayrıca 2FA açık bir hesap burada parolasını zaten kullanamaz.","conn.guide.mount.fact.remote":"Neyi bağlayacağınız","conn.guide.mount.fact.remoteHint":"--remote vermezseniz her depo bir klasör olarak görünür; tek bir depoyu — ya da onun içindeki bir klasörü — adlandırırsanız yalnızca o bağlanır.","conn.guide.mount.linux.mountCaption":"Bağlayın","conn.guide.mount.linux.umountCaption":"Ayırın","conn.guide.mount.linux.umountWarn":"Süreci öldürerek değil, fusermount ile ayırın. Ayrılmadan ölen bir bağlantı, birileri elle fusermount çalıştırana kadar her ls komutunun asılı kaldığı bir klasör bırakır.","conn.guide.mount.linux.systemdCaption":"Girişte otomatik bağlansın (systemd kullanıcı birimi)","conn.guide.mount.win.winfsp":"Windows'ta bir kez WinFsp kurulması gerekiyor — ücretsiz ve açık kaynak: https://winfsp.dev. Başka bir şey gerekmiyor, sonrasında yönetici hakkı da istemiyor.","conn.guide.mount.win.mountCaption":"Sürücü olarak bağlayın","conn.guide.mount.win.freeLetter":"BOŞ bir sürücü harfi seçin. Harf bağlama sırasında oluşturulur, var olan bir şeye eklenmez; kullanımdaki bir harfi verirseniz bunu söylemeyen bir hatayla başarısız olur.","conn.guide.mount.win.stop":"O pencerede Ctrl-C ile durdurun. Sürücü kaybolur ve bu makinede hiçbir şey kalmaz.","conn.guide.mount.mac.unsupported":"filex mount macOS'ta çalışmıyor. macFUSE gerekiyor; lisansı filex gibi bir programın onu sizin yerinize kurmasına izin vermiyor ve Go bağlaması filex'in bilinçli olarak kullanmadığı bir C derleyicisi istiyor. Komut burada çalışıyormuş gibi görünüp hiçbir şey yapmak yerine açıkça reddediyor.","conn.guide.mount.mac.alternatives":"macOS'ta filex masaüstü uygulamasını klasör senkronuyla kullanın (dosyalar diskte durur) ya da sürücü bağlayabilen bir istemciyle SFTP.","conn.guide.mount.note.notASync":"Bu bir senkronizasyon değildir. Küçük bir okuma önbelleği dışında bu makineye hiçbir şey kopyalanmaz; yüz bin dosyanın içinden birini gerisini indirmeden açar. Dosyaları çevrimdışıyken istiyorsanız klasör senkronunu kullanın.","conn.guide.mount.note.reachable":"Sunucuya, tarayıcının geçtiği hangi vekil ya da tünel varsa oradan ulaşır — çünkü altında aynı API vardır. İzinleriniz, depolarınız ve çok kiracılı bir sunucuda kiracınız da birlikte gelir.","conn.guide.mount.note.wholeFileWrites":"Bağlantı üzerinden yazdığınız dosya, yazılırken değil, program onu kapattığında yüklenir. Çok büyük bir dosyayı yerinde düzenlemek burada yerel diskten yavaştır; içeri ve dışarı kopyalamak değildir.","conn.guide.mount.note.trash":"Silme her yerdeki gibi filex çöp kutusuna gider ve saklama politikası süpürene kadar geri alınabilir.","conn.guide.mount.note.revoke":"Bir bağlantıyı durdurmak için jetonu iptal edin. Bağlantı hâlâ takılı olsa bile yarım dakika içinde hizmet vermeyi bırakır.","storages.driver.ftp":"FTP / FTPS","storages.driver.local":"Yerel dosya sistemi","storages.driver.s3":"S3 / Hetzner / MinIO","storages.driver.sftp":"SFTP","storages.driver.smb":"SMB / CIFS (NAS)","storages.driver.webdav":"WebDAV","storages.fieldHelp.smbShare":"Sunucu adı olmadan yalnızca paylaşım adı: `\\\\nas\\media` değil, `media`.","storages.fieldHelp.smbDomain":"Yalnızca Windows etki alanı hesabı için. NAS kullanıyorsanız boş bırakın.","storages.fieldHelp.smbRoot":"Paylaşımın içindeki alt klasör. Paylaşımın tamamı için boş bırakın.","storages.fields.share":"Paylaşım","storages.fields.domain":"Etki alanı / çalışma grubu","storages.fields.dialTimeout":"Bağlanma zaman aşımı (saniye)","storages.fieldHelp.disablePresign":"Depo, SDK'nın imzaladığı URL'leri reddediyorsa açın (Ceph RGW / bazı Hetzner kurulumları SignatureDoesNotMatch döner); yüklemeler o zaman arka uç üzerinden akar.","storages.fieldHelp.endpoint":"AWS S3 için boş bırakın. S3 uyumlu diğer tüm depolar kendi endpoint'ini ister.","storages.fieldHelp.hostKey":"authorized_keys / known_hosts satır biçiminde tek bir açık anahtar.","storages.fieldHelp.insecureSkipHostKey":"Her sunucu anahtarını kabul eder. Yalnızca geçici sunucular için.","storages.fieldHelp.keyPath":"Sunucudaki anahtar dosyasının yolu; depo başlarken okunur. PEM alanı boşken kullanılır.","storages.fieldHelp.knownHosts":"Katı sunucu anahtarı denetimi için OpenSSH known_hosts yolu. Varsayılan, ~/.filex/known_hosts içinde ilk bağlantıda güven.","storages.fieldHelp.passive":"Kapatmak aktif moda geçirir; bu, sunucunun bu makineye geri bağlanmasını gerektirir.","storages.fieldHelp.path":"Sunucudaki dizin. Yoksa oluşturulur; filex asla / dizinini mount etmez.","storages.fieldHelp.pathStyle":"AWS dışındaki tüm depolarda açık olmalı. Endpoint girildiyse ve bu alana hiç dokunulmadıysa kendiliğinden açılır.","storages.fieldHelp.prefix":"Bucket içindeki alt klasör. Zorunlu: filex bucket kökünün sahipliğini asla almaz.","storages.fieldHelp.region":'Boş bırakılırsa "auto" kullanılır.',"storages.fieldHelp.root":"Arka uçtaki alt klasör. Zorunlu: filex hesabın kökünü asla mount etmez.","storages.fieldHelp.sftpAuth":"Parola ya da özel anahtardan biri zorunludur.","storages.fieldHelp.tls":"Düz FTP kimlik bilgilerini açık metin gönderir — sunucu destekliyorsa açın.","storages.fields.accessKey":"Access key","storages.fields.basePath":"Temel yol","storages.fields.bucket":"Bucket","storages.fields.disablePresign":"İmzalı URL'leri kapat","storages.fields.endpoint":"Endpoint","storages.fields.host":"Sunucu","storages.fields.hostKey":"Sabitlenmiş sunucu anahtarı","storages.fields.insecureSkipHostKey":"Sunucu anahtarı doğrulamasını atla (güvensiz)","storages.fields.keyPath":"Özel anahtar dosyası","storages.fields.knownHosts":"known_hosts dosyası","storages.fields.name":"Görünen isim","storages.fields.namePlaceholder":"Kişisel fotoğraflar","storages.fields.passive":"Pasif mod (PASV)","storages.fields.password":"Parola","storages.fields.path":"Dizin yolu","storages.fields.pathStyle":"Path-style URL kullan (Hetzner, MinIO)","storages.fields.port":"Port","storages.fields.prefix":"Önek (prefix)","storages.fields.privateKey":"Özel anahtar (PEM)","storages.fields.rbac":"Öğe bazlı erişim denetimi (RBAC)","storages.fields.rbacHint":"Açıkken admin olmayanlar yalnızca izin panelinden kendilerine verilen dosya/klasörleri görür. Kapalıyken depo tüm kullanıcılara açıktır (yetki role göre).","storages.fields.readOnly":"Salt okunur mount","storages.fields.region":"Bölge","storages.fields.root":"Temel yol","storages.fields.secretKey":"Secret key","storages.fields.tls":"FTPS (açık AUTH TLS)","storages.fields.url":"Temel URL","storages.fields.user":"Kullanıcı"},Wf={"toolbar.new_folder":"New Folder","toolbar.upload":"Upload","toolbar.search":"Search","toolbar.search.placeholder":"Search by name or tag:…","toolbar.view.list":"List","toolbar.view.grid":"Grid","toolbar.refresh":"Refresh","toolbar.go_up":"Up one level","ctx.open":"Open","ctx.preview":"Preview","ctx.download":"Download","ctx.convert":"Convert","ctx.rename":"Rename","ctx.delete":"Delete","ctx.delete_perm":"Delete Permanently","ctx.restore":"Restore","ctx.share":"Share","ctx.move":"Move","ctx.copy":"Copy","ctx.cut":"Cut","ctx.show_hidden":"Show hidden files","ctx.hide_hidden":"Hide hidden files","ctx.keep_local":"Keep on this computer","ctx.keep_online":"Keep online only","ctx.keep_reveal":"Open local folder","ctx.keep_inherited":"Kept on this computer with its parent","keep.started":"Will be kept on this computer — sync started","keep.failed":"Could not keep on this computer","keep.badge_kept":"On this computer","keep.badge_syncing":"Syncing…","keep.badge_cloud":"Online only","keep.badge_partial":"Contains items kept on this computer","keep.strip_transfer":"Syncing {name} — {done}/{total} ({pct}%)","keep.strip_inventory":"Syncing {name} — scanning the server…","keep.strip_settling":"Syncing {name} — settling…","ctx.paste":"Paste","ctx.info":"Info","ctx.duplicate":"Duplicate","ctx.new_file":"New File","modal.delete.title":"Delete?","modal.delete.message":"{count} item(s) will be moved to trash.","modal.delete.confirm":"Move to Trash","modal.delete.cancel":"Cancel","modal.rename.title":"Rename","modal.rename.save":"Save","modal.rename.cancel":"Cancel","modal.newfolder.title":"New Folder","modal.newfolder.placeholder":"Folder name","modal.newfolder.create":"Create","modal.newfolder.cancel":"Cancel","modal.share.title":"Share Link","modal.share.pin":"PIN protected","modal.share.expires":"Expires at","modal.share.max_downloads":"Download limit","modal.share.create":"Share","modal.share.cancel":"Cancel","modal.share.close":"Close","modal.share.limit_applied":"(server limit applied)","modal.share.copy":"Copy","modal.share.url_copied":"Link copied","modal.share.pin_copied":"PIN copied","modal.share.cli_copied":"CLI command copied","upload.progress":"Uploading","upload.done":"Done","upload.error":"Error","upload.failed":"Could not upload “{name}”","upload.aborted":"Aborted","upload.cancel":"Cancel","upload.resuming":"Resuming “{name}” from {percent}%","upload.committing":"Finishing","upload.transferring":"Moving to storage","empty.folder":"This folder is empty","empty.search":"No results",loading:"Loading…","notFound.title":"Folder not found","notFound.desc":"This folder does not exist, was moved, or you do not have access to it.","notFound.goRoot":"Go to root folder","col.name":"Name","col.size":"Size","col.modified":"Modified","col.type":"Type","unit.bytes":"B","unit.kb":"KB","unit.mb":"MB","unit.gb":"GB","unit.tb":"TB","breadcrumb.root":"Root","breadcrumb.copy_path":"Copy Path","breadcrumb.go_to_path":"Go To Path","breadcrumb.path_placeholder":"fileman/foo/bar","ops.copy":"Copying","ops.move":"Moving","ops.delete":"Deleting","ops.queued":"queued","ops.done":"done","ops.error":"error","node.trash":"Trash","viewer.open_in_new_tab":"Open in New Tab","viewer.loading":"Loading…","viewer.failed_to_load":"Failed to load file","viewer.peer_not_installed":"Optional viewer library is not installed. Install the peer dependency or use the download button.","viewer.format_unsupported_3d":"This 3D format is not supported in the browser preview (model-viewer only reads .glb / .gltf / .usdz). Please download and open with a local tool.","viewer.zoom_in":"Zoom in","viewer.zoom_out":"Zoom out","viewer.fit_width":"Fit width","viewer.next_page":"Next page","viewer.prev_page":"Previous page","viewer.page_n_of_m":"Page {n} of {m}","viewer.tags":"Tags","viewer.layers":"Layers","viewer.toc":"Contents","viewer.font_smaller":"Smaller text","viewer.font_larger":"Larger text","viewer.search":"Search","viewer.download":"Download","viewer.saving":"Saving…","viewer.save":"Save (Ctrl+S)","viewer.saved":"Saved","viewer.save_error":"Error","viewer.editor_loading":"Loading editor…","viewer.no_preview":"No preview for this file type yet.","viewer.edit":"Edit","viewer.close":"Close","presence.expand":"Show names","presence.collapse":"Collapse","viewer.save_annotations":"Save annotations","viewer.annotations_on":"Annotations: on","viewer.annotations_off":"Annotations: off","viewer.read_only":"Read only","viewer.csv_first_row_header":"First row as header","viewer.csv_filter":"Filter rows…","viewer.epub_prev":"Previous","viewer.epub_next":"Next","viewer.drawio.disabled":"diagrams.net embed is not configured for this filex instance — operator must wire FILEX_DRAWIO_URL to enable the editor.","viewer.archive.entries":"{n} files","viewer.archive.empty":"Archive is empty.","viewer.archive.error":"Could not read archive contents.","viewer.name":"Name","viewer.size":"Size","col.sort":"Sort","group.today":"Today","group.yesterday":"Yesterday","group.this_week":"This Week","group.this_month":"This Month","group.no_date":"No date","toolbar.density.compact":"Compact view","toolbar.density.comfortable":"Comfortable view","palette.placeholder":"Search files, folders or commands…","palette.files":"Files","palette.commands":"Commands","palette.goto":"Go to path","palette.empty":"No results","palette.hint":"↑↓ navigate · Enter select · Esc close","cmd.view_toggle":"Toggle view (list ⇄ grid)","cmd.trash":"Open trash","shortcuts.title":"Keyboard Shortcuts","shortcuts.group.nav":"Navigation","shortcuts.group.selection":"Selection","shortcuts.group.file":"File operations","shortcuts.palette":"Command palette","shortcuts.search":"Focus search","shortcuts.go_up":"Go up one level","shortcuts.open":"Open selected item","shortcuts.close":"Close / cancel","shortcuts.toggle_hidden":"Show/hide hidden files","shortcuts.help":"This help dialog","shortcuts.select_all":"Select all","shortcuts.rename":"Rename","shortcuts.delete":"Delete","shortcuts.cut":"Cut","shortcuts.copy":"Copy","shortcuts.paste":"Paste","breadcrumb.more":"Hidden folders","empty.hint":"Drag and drop files here","empty.upload":"Upload files","empty.search.title":"No files match your search","empty.search.hint":"Try a different search term","empty.trash.title":"Trash is empty","error.title":"Could not load this folder","error.retry":"Try again","toast.undo":"Undo","toast.undone":"Undone","toast.undo_failed":"Could not undo","toast.renamed":"Renamed","toast.moved":"Moved","toast.trashed":"Moved to trash","conn.offline":"No live connection — changes may be delayed","conn.tooltip":"Live connection to the server is unavailable; the list refreshes periodically. This notice disappears once the connection is back.","palette.everywhere":"Everywhere","palette.searching":"Searching…","palette.saved":"Saved searches","palette.save":"Save search","palette.saved.delete":"Delete saved search","search.in_content":"In content","toolbar.more":"More actions","toolbar.search.close":"Close search","sheet.menu":"Actions","sheet.close":"Close","toolbar.inspector":"Details","ctx.details":"Details","shortcuts.inspector":"Toggle details panel","inspector.title":"Details","inspector.close":"Close","inspector.section.general":"General","inspector.section.versions":"Versions","inspector.section.permissions":"Permissions","inspector.section.shares":"Shares","inspector.path":"Path","inspector.size":"Size","inspector.modified":"Modified","inspector.mime":"MIME type","inspector.etag":"ETag","inspector.copy":"Copy","inspector.copied":"Copied","inspector.error":"Could not load","inspector.items_summary":"{n} items, {size} total","inspector.folder_items":"{n} items","inspector.versions.empty":"No version history","inspector.versions.v":"Version {n}","inspector.versions.restore":"Restore","inspector.versions.restore_confirm":"Restore this version?","inspector.versions.snapshot_current":"Snapshot the current state first","inspector.versions.confirm":"Confirm","inspector.versions.cancel":"Cancel","inspector.versions.take_snapshot":"Snapshot current state","inspector.versions.restored":"Version restored","inspector.versions.snapshotted":"Snapshot taken","inspector.versions.unsupported":"The server does not support this operation","inspector.perm.none":"No access","inspector.perm.viewer":"Viewer","inspector.perm.editor":"Editor","inspector.perm.owner":"Owner","inspector.perm.manage":"Manage permissions","inspector.shares.empty":"No share links","inspector.shares.copy":"Copy link","theme.menu":"Theme","theme.title":"Theme Gallery","theme.hint":"A theme only changes the colour palette — day or night is the choice above.","theme.mode.label":"Appearance","theme.mode.light":"Day","theme.mode.dark":"Night","theme.mode.auto":"Automatic","theme.reset":"Reset to default","theme.close":"Close","theme.selected":"Selected","theme.name.default":"Default","theme.name.night":"Night Blue","theme.name.forest":"Forest","theme.name.amber":"Amber","theme.name.lilac":"Lilac","theme.name.contrast":"High Contrast","theme.name.gray":"Soft Gray","theme.name.terminal":"Terminal Green","shortcuts.quicklook":"Quick look","shortcuts.customize":"Customize","shortcuts.settings.menu":"Shortcuts","shortcuts.settings.title":"Shortcut Settings","shortcuts.settings.hint":'To remap a shortcut, press "Change" and then the new key combination. Changes are stored in this browser only.',"shortcuts.settings.change":"Change","shortcuts.settings.capture":"Press keys… (Esc cancels)","shortcuts.settings.reset":"Reset to default","shortcuts.settings.reset_all":"Reset all","shortcuts.settings.unbound":"Not set","shortcuts.settings.fixed":"Fixed","shortcuts.settings.customized":"Customized","shortcuts.settings.conflict":'is already used by "{name}".',"shortcuts.settings.conflict_fixed":'is reserved by the fixed shortcut "{name}" — it cannot be used.',"shortcuts.settings.conflict_take":"Unassign old and use here","shortcuts.settings.conflict_cancel":"Cancel","quicklook.hint_close":"close","quicklook.hint_nav":"previous/next","quicklook.hint_open":"open","opc.title":"Operations","opc.aria_badge":"{n} operations — toggle operations center","opc.close":"Close","opc.active":"In progress","opc.history":"History","opc.clear":"Clear","opc.empty":"No operations","opc.cancel":"Cancel","opc.retry":"Retry","opc.dismiss":"Dismiss","opc.queued":"Queued","opc.percent":"{n}%","opc.status.running":"In progress","opc.status.done":"Done","opc.status.error":"Failed","opc.status.aborted":"Cancelled","opc.kind.upload":"Upload","opc.kind.copy":"Copy","opc.kind.move":"Move","opc.kind.delete":"Delete","opc.kind.convert":"Convert","opc.kind.archive":"Archive","tour.aria":"Onboarding tour","tour.restart":"Restart the tour","tour.skip":"Skip tour","tour.back":"Back","tour.next":"Next","tour.done":"Done","tour.progress":"{n} / {m}","tour.step.nav.title":"Storages & folders","tour.step.nav.desc":"Your current location lives here. Click any crumb to jump back to parent folders or the storage root.","tour.step.upload.title":"Upload files","tour.step.upload.desc":"Pick files with this button — or simply drag & drop them anywhere in the window.","tour.step.search.title":"Search","tour.step.search.desc":'This box searches the whole storage by name — separators and one typo are forgiven, so "invoice 2026" finds invoice_2026.pdf. Add tag:invoice to filter by tag. The Ctrl+K command palette also runs commands.',"tour.step.view.title":"Switch views","tour.step.view.desc":"Toggle between the list and grid layout; your choice is remembered.","tour.step.share.title":"Sharing","tour.step.share.desc":'Right-click any file and use "Share / Permissions" to create a link with an optional PIN and expiry.',"tour.step.help.title":"Shortcuts","tour.step.help.desc":'Press ? for the shortcut cheat-sheet and Ctrl+K for the command palette. Replay this tour any time via "Restart the tour" in the menu.',"error.hint":"This may be a temporary network or server problem. Please try again.","error.details":"Technical details","col.star":"Star","toolbar.view_label":"View","list.aria":"File list","grid.aria":"File grid","tabs.strip":"Tabs","tabs.new":"New tab","tabs.close":"Close tab","tabs.split":"Split view","tabs.split_off":"Close split","ctx.open_new_tab":"Open in new tab","shortcuts.group.tabs":"Tabs","shortcuts.tab_new":"New tab","shortcuts.tab_close":"Close tab","shortcuts.tab_next":"Next tab","shortcuts.tab_prev":"Previous tab","cmd.tab_new":"Open a new tab","cmd.split_toggle":"Toggle split view","split.pane":"Secondary pane","split.close":"Close the side pane","split.error":"Could not load the listing","split.retry":"Retry","split.copy_queued":"Copy queued","split.cross_copy":"Different storages — copy queued instead","dragout.downloading":"Downloading into the folder you dropped on…","dragout.not_found":"Could not find where it was dropped — a drop onto an application (rather than a folder) cannot be filled in","dragout.done":"Download finished","dragout.ready":"Files are ready — drag them to your desktop","dragout.preparing":"Getting them ready to drag…","split.cross_move":"Different storages — move queued (bytes travel, then the original is removed)","toolbar.view.gallery":"Gallery","gallery.aria":"File gallery","inspector.section.comments":"Comments","inspector.comments.empty":"No comments yet.","inspector.comments.placeholder":"Write a comment…","inspector.comments.send":"Send","inspector.comments.delete":"Delete comment","e2e.create.title":"Create encrypted folder","e2e.create.option":"Create encrypted folder…","e2e.create.pw_placeholder":"Folder password (min 8 characters)","e2e.create.pw2_placeholder":"Repeat the password","e2e.create.warn_title":"NO WAY BACK","e2e.create.warn_body":"Files open ONLY with this password. The password is NEVER stored on the server; if you forget it the content is lost forever. There is no recovery — not even an admin can open it.","e2e.create.ack":"I understand: if I lose the password my data cannot be recovered.","e2e.create.ack_required":"Please confirm the warning to continue.","e2e.create.pw_short":"Password must be at least 8 characters.","e2e.create.pw_mismatch":"Passwords do not match.","e2e.create.bad_name":"Invalid folder name.","e2e.create.create":"Create encrypted folder","e2e.create.busy":"Creating…","e2e.create.done":"Encrypted folder created","e2e.create.failed":"Could not create the encrypted folder","e2e.create.nested":"You cannot create an encrypted folder inside another one.","e2e.locked.title":"This folder is end-to-end encrypted","e2e.locked.hint":"Enter the folder password to see its contents. The password stays in this tab’s memory only.","e2e.locked.pw_placeholder":"Folder password","e2e.locked.unlock":"Unlock","e2e.locked.busy":"Verifying…","e2e.unlock.wrong":"Wrong password.","e2e.unlock.marker_missing":"Could not read the key file (.filex-e2e.json).","e2e.strip.label":"Encrypted folder — unlocked","e2e.strip.lock":"Lock","e2e.locked_toast":"Folder locked","e2e.upload.too_big":"Files over 200 MB cannot be uploaded to an encrypted folder (MVP limit)","e2e.upload.locked":"Unlock the folder first","e2e.decrypting":"Decrypting…","e2e.decrypt_failed":"Could not decrypt the file (password changed or file corrupted).","e2e.download.failed":"Could not download the encrypted file.","conn.title":"Storage connections","conn.subtitle":"Connect {host} to a backend, or connect your computer to {host}.","conn.close":"Close","conn.tab.storages":"Storages","conn.tab.connect":"How to connect","conn.loading":"Loading…","conn.visibleOnly":"you can browse this one","conn.denied.title":"Only an administrator can add storages here","conn.denied.none":"Your account may browse files but not change what this server is connected to. Ask an administrator of this server to add or edit a storage.","conn.denied.anonymous":"You are not signed in on this server.","conn.denied.unreachable":"The server did not answer: {error}","conn.denied.guideHint":"You do not need administrator rights to connect your own computer to the storages you can already see.","conn.denied.guideCta":"Show me how to connect","conn.list.count":"{n} storage(s)","conn.list.add":"Add a storage","conn.list.empty":"No storage is configured yet. Add one and the files show up in the explorer.","conn.list.edit":"Edit","conn.list.remove":"Remove","conn.list.confirm":"Really remove?","conn.list.readOnly":"read-only","conn.list.disabled":"disabled","conn.form.newTitle":"New storage","conn.form.editTitle":"Edit “{name}”","conn.form.name":"Display name","conn.form.namePlaceholder":"photos","conn.form.nameHelp":"What this storage is called everywhere: in the explorer, in paths (name://folder) and in WebDAV URLs.","conn.form.driver":"Type","conn.form.driverLocked":"A storage's type cannot change after it is created — the paths already point at it.","conn.form.readOnly":"Read-only (nothing may be written to this storage)","conn.form.enabled":"Enabled","conn.form.test":"Test connection","conn.form.testing":"Testing…","conn.form.testOk":"Connected. {count} item(s) at the root.","conn.form.testFail":"Could not connect: {error}","conn.form.save":"Save","conn.form.saving":"Saving…","conn.form.cancel":"Cancel","conn.form.nameRequired":"Give the storage a name.","conn.form.fillRequired":"Fill in the fields marked with *.","conn.form.required":"Required","conn.form.advanced":"Advanced settings","conn.form.noFields":"This server did not describe any settings for this driver.","conn.form.reveal":"Show","conn.form.hide":"Hide","conn.guide.protocol":"Protocol","conn.guide.storage":"Storage","conn.guide.allStorages":"All storages","conn.guide.copy":"Copy","conn.guide.copied":"Copied","conn.guide.goodToKnow":"Good to know","conn.guide.userPlaceholder":"your-email@example.com","conn.guide.secretPlaceholder":"your-password-or-token","conn.guide.fact.url":"Address","conn.guide.fact.urlRootHint":"Every storage you can see appears as a folder under this address.","conn.guide.fact.urlStorageHint":"Mounts “{storage}” directly. Drop the last segment to see every storage.","conn.guide.fact.user":"Username","conn.guide.fact.password":"Password","conn.guide.webdav.summary":"WebDAV mounts filex as a drive: Windows Explorer, macOS Finder, Linux, rclone and Cyberduck all speak it, and every change is mirrored back into filex.","conn.guide.webdav.userHint":"Your filex account e-mail — not a display name.","conn.guide.webdav.passwordHint":"Your account password, or an API token (Settings → API tokens). An account with two-factor authentication MUST use a token: Basic auth has no second-factor slot.","conn.guide.webdav.win.s1":"Open File Explorer, right-click This PC and choose “Map network drive…”.","conn.guide.webdav.win.s2":"Pick a drive letter and enter {url} as the folder.","conn.guide.webdav.win.s3":"Tick “Connect using different credentials” and sign in with the username and password above.","conn.guide.webdav.win.cmdCaption":"Command Prompt (same thing, without the wizard)","conn.guide.webdav.win.limits":"Windows has three built-in limits that look exactly like filex bugs: transfers stop at ~47.7 MB, folders with about a thousand files refuse to open (“Disk is not formatted”), and the WebClient service must be restarted after changing either.","conn.guide.webdav.win.regCaption":"Run as administrator, then reconnect the drive","conn.guide.webdav.win.https":"HTTPS is mandatory. Windows sends Basic credentials over TLS only, and over plain http:// it silently refuses with no useful message. Do not set BasicAuthLevel to 2 — use TLS.","conn.guide.webdav.win.persist":"The mapped drive does not survive a sign-out: since Windows 7 Basic credentials cannot be stored in Credential Manager, and /persistent:yes does not change that. Re-run the command from a logon script if you need it back automatically.","conn.guide.webdav.win.service":"If nothing mounts at all, make sure the WebClient service is running: sc config WebClient start= auto && net start WebClient.","conn.guide.webdav.mac.s1":"In Finder choose Go → Connect to Server… (⌘K).","conn.guide.webdav.mac.s2":"Enter {url} and connect.","conn.guide.webdav.mac.s3":"Authenticate with the username and password above.","conn.guide.webdav.mac.note":"The drive appears under Locations; each storage is a top-level folder.","conn.guide.webdav.linux.mountCaption":"davfs2, or the desktop file manager (GNOME Files, Dolphin)","conn.guide.webdav.linux.gvfsComment":"or paste this address into GNOME Files / Dolphin","conn.guide.webdav.linux.locks":"davfs2 needs locking turned off. filex keeps WebDAV locks in process memory, so they do not survive a restart and are not shared between replicas — davfs2 assumes otherwise and hangs.","conn.guide.webdav.rclone.obscureCaption":"rclone stores an obscured password — run this first and paste the output below","conn.guide.webdav.rclone.passPlaceholder":"<output of rclone obscure>","conn.guide.webdav.rclone.useCaption":"Using it","conn.guide.webdav.duck.s1":"New Bookmark → WebDAV (HTTPS).","conn.guide.webdav.duck.s2":"Server {host}, port 443.","conn.guide.webdav.duck.s3":"Path {path}.","conn.guide.webdav.duck.s4":"Username {user}, password as above.","conn.guide.webdav.note.delete":"A WebDAV delete is permanent. The web UI moves files to the filex trash; a client delete removes the object from the backing storage directly.","conn.guide.webdav.note.locks":"Locks live in server memory: they do not survive a restart and are not shared between replicas. They exist to satisfy Windows and Office, not to arbitrate concurrent edits.","conn.guide.webdav.note.permissions":"You see exactly what you see in the web UI. The root lists only the storages you may open, and a path outside your grants answers 404 rather than 403, so the tree never leaks what exists.","conn.guide.webdav.note.http":"This server is reachable over plain http://. Windows will refuse to send your credentials at all, and every other client sends your password in the clear. Put filex behind TLS before mounting it.","conn.s3keys.title":"S3 access keys","conn.s3keys.lead":"An access key lets any S3 client — rclone, restic, the AWS CLI, mc, s3fs, Cyberduck — connect to filex. It carries your own permissions and nothing more.","conn.s3keys.disabled":"The S3 endpoint is switched off on this server (FILEX_S3). A key minted here will not connect until an operator turns it back on.","conn.s3keys.cannotMint":"You are not signed in with an account that can mint access keys. The instructions below still apply — ask for a key and paste it in.","conn.s3keys.label":"What is it for? (laptop backup, CI, …)","conn.s3keys.defaultLabel":"access key","conn.s3keys.everyBucket":"Every bucket I can see","conn.s3keys.prefix":"Folder inside the bucket (optional)","conn.s3keys.mint":"Create key","conn.s3keys.inheritNote":"A key can only ever narrow what you already have: your grants, your tenant, your role. Confining it to one bucket or folder is the difference between a laptop backup and a credential that can read everything.","conn.s3keys.once":"Copy the secret now — this is the only time it is shown.","conn.s3keys.accessKeyID":"Access key ID","conn.s3keys.secret":"Secret key","conn.s3keys.dismiss":"I have copied it","conn.s3keys.col.label":"Label","conn.s3keys.col.key":"Access key ID","conn.s3keys.col.scope":"Limited to","conn.s3keys.col.lastUsed":"Last used","conn.s3keys.scopeAll":"everything you can see","conn.s3keys.noLabel":"(no label)","conn.s3keys.neverUsed":"never","conn.s3keys.enable":"Enable","conn.s3keys.disable":"Disable","conn.s3keys.revoke":"Revoke","conn.s3keys.confirm":"Sure?","conn.s3keys.empty":"No access keys yet.","conn.guide.s3.summary":"The S3 endpoint makes filex the destination for anything that speaks S3 — backups, sync tools, SDKs — using the storages you already have.","conn.guide.s3.keyPlaceholder":"create a key above","conn.guide.s3.secretPlaceholder":"shown once, when you create the key","conn.guide.s3.fact.endpoint":"Endpoint","conn.guide.s3.fact.endpointHint":"Point the client here, not at the web address of filex.","conn.guide.s3.fact.bucket":"Bucket","conn.guide.s3.fact.bucketHint":"A bucket is a filex storage. Buckets are created by an administrator, not by the client.","conn.guide.s3.fact.key":"Access key ID","conn.guide.s3.fact.keyHint":"The public half. It travels in every request.","conn.guide.s3.fact.secret":"Secret key","conn.guide.s3.fact.secretHint":"Shown once, when the key is created. filex cannot show it again — create a new key if it is lost.","conn.guide.s3.fact.region":"Region","conn.guide.s3.fact.regionHint":"filex has no regions; any value works and is echoed back. Clients still insist on one.","conn.guide.s3.fact.addressing":"Addressing","conn.guide.s3.fact.pathStyle":"path-style (required)","conn.guide.s3.fact.pathStyleHint":"There is no dedicated S3 host on this install, so bucket.host does not resolve.","conn.guide.s3.fact.virtualHosted":"virtual-hosted or path-style","conn.guide.s3.fact.virtualHostedHint":"This install has its own S3 host, so both styles work.","conn.guide.s3.rclone.useCaption":"Use it","conn.guide.s3.rclone.mtime":"filex carries the file modification time (x-amz-meta-mtime), so rclone sync settles after the first run instead of re-uploading everything.","conn.guide.s3.aws.configureCaption":"Configure once","conn.guide.s3.aws.useCaption":"Use it","conn.guide.s3.aws.pathStyle":"Add path addressing to your AWS config, or every command fails at DNS.","conn.guide.s3.restic.envCaption":"Environment","conn.guide.s3.restic.useCaption":"Back up, verify, prune","conn.guide.s3.restic.verified":"Verified against this endpoint: restic check --read-data reads every pack byte for byte and reports no errors.","conn.guide.s3.mc.aliasCaption":"Add the alias","conn.guide.s3.mc.useCaption":"Use it","conn.guide.s3.s3fs.credsCaption":"Credentials file","conn.guide.s3.s3fs.mountCaption":"Mount it","conn.guide.s3.s3fs.note":"Editing a file over s3fs rewrites the whole object, and a delete goes to the filex trash. Good for a shared folder, not for a database.","conn.guide.s3.duck.s1":"New bookmark → Amazon S3.","conn.guide.s3.duck.s2":"Server: {host}.","conn.guide.s3.duck.s3":"Access key ID: {key}, secret as above.","conn.guide.s3.duck.s4":"Open the bookmark; the buckets are your filex storages.","conn.guide.s3.duck.pathStyle":'In Preferences → S3, turn OFF "Use virtual host style" — this install has no wildcard S3 host.',"conn.guide.s3.sdk.note":"Any SigV4 client works the same way: endpoint, key, secret, and path addressing when this install has no S3 host of its own.","conn.guide.s3.note.buckets":"A bucket is a filex storage. A client can create folders and objects inside one, but not the bucket itself — that needs a driver and a path, which an S3 request cannot express.","conn.guide.s3.note.permissions":'The key sees exactly what you see. A bucket you may not open answers "no such bucket" rather than "forbidden", so the endpoint never reveals what exists.',"conn.guide.s3.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.s3.note.mtime":"Uploads carry their modification time, and the checksums clients send (Content-MD5, x-amz-checksum-*) are verified — a corrupted upload is refused rather than stored.","conn.guide.s3.note.pathStyle":"This install has no dedicated S3 host, so clients must be told to use path-style addressing. Without it a current SDK fails at DNS with an error that names neither filex nor the cause.","conn.guide.s3.note.http":"This endpoint is plain http://. Signatures still protect the request, but the objects travel in the clear. Put filex behind TLS before pointing a backup at it.","conn.sshkeys.title":"SSH keys","conn.sshkeys.lead":"Register a public key and every SSH client — sftp, scp, WinSCP, FileZilla, rclone, sshfs — can connect without sending your password.","conn.sshkeys.disabled":"The SFTP endpoint is switched off on this server (FILEX_SFTP). A key registered here will not connect until an operator turns it back on.","conn.sshkeys.cannotAdd":"You are not signed in with an account that can register keys.","conn.sshkeys.paste":"Paste the contents of ~/.ssh/id_ed25519.pub","conn.sshkeys.name":"Name (optional — the key comment is used otherwise)","conn.sshkeys.add":"Add key","conn.sshkeys.noCopyId":"ssh-copy-id cannot work here: it appends to ~/.ssh/authorized_keys over a shell, and filex has none. This box is the way in.","conn.sshkeys.col.name":"Name","conn.sshkeys.col.fingerprint":"Fingerprint","conn.sshkeys.col.added":"Added","conn.sshkeys.col.lastUsed":"Last used","conn.sshkeys.noName":"(no name)","conn.sshkeys.neverUsed":"never","conn.sshkeys.enable":"Enable","conn.sshkeys.disable":"Disable","conn.sshkeys.remove":"Remove","conn.sshkeys.confirm":"Sure?","conn.sshkeys.empty":"No keys yet. Without one, clients sign in with your account password.","conn.guide.sftp.summary":"SFTP makes filex reachable by anything that already speaks SSH — a backup job, a scanner, WinSCP, rclone, or a mounted folder.","conn.guide.sftp.fact.host":"Host","conn.guide.sftp.fact.hostHint":"The same machine as the web app, on a port of its own.","conn.guide.sftp.fact.port":"Port","conn.guide.sftp.fact.portHint":"Not 22 and not 443: SFTP is raw TCP and cannot go through the web proxy.","conn.guide.sftp.fact.userHint":"Your short login name. An @ in a login has to be quoted in most client config files, which is what this avoids.","conn.guide.sftp.fact.auth":"Sign in with","conn.guide.sftp.fact.authKey":"your registered SSH key (or your password)","conn.guide.sftp.fact.authPassword":"your account password — or register a key above","conn.guide.sftp.fact.authHint":"An API token works as a password too, and is revocable on its own. An account with two-factor sign-in must use a key or a token.","conn.guide.sftp.fact.path":"Path","conn.guide.sftp.fact.pathHint":"The first folder is a storage; the root lists the ones you may open.","conn.guide.sftp.openssh.connectCaption":"Connect, put, get","conn.guide.sftp.openssh.noShell":"There is no shell here — only the SFTP subsystem. `ssh host command` is refused on purpose, and scp works because OpenSSH 9 speaks SFTP for it.","conn.guide.sftp.key.tab":"Set up a key","conn.guide.sftp.key.s1":"Generate a key pair on the machine that will connect (skip if you already have one).","conn.guide.sftp.key.s2":"Copy the PUBLIC half — the .pub file, never the other one.","conn.guide.sftp.key.s3":"Paste it into the box above and connect; no password is sent from then on.","conn.guide.sftp.key.genCaption":"On your own machine","conn.guide.sftp.key.noCopyId":"ssh-copy-id will NOT work against filex: it needs a shell to append to ~/.ssh/authorized_keys, and there is none. Paste the key above instead.","conn.guide.sftp.winscp.s1":"New site → File protocol: SFTP.","conn.guide.sftp.winscp.s2":"Host name: {host}, port: {port}.","conn.guide.sftp.winscp.s3":"User name: {user}. For a key: Advanced → SSH → Authentication → private key file.","conn.guide.sftp.winscp.s4":"WinSCP needs a .ppk private key — use its own tool (Tools → PuTTYgen) to convert an OpenSSH key once.","conn.guide.sftp.filezilla.s1":"File → Site Manager → New site, Protocol: SFTP.","conn.guide.sftp.filezilla.s2":"Host: {host}, port: {port}.","conn.guide.sftp.filezilla.s3":"User: {user}. Logon type: Normal for a password, or Key file for a key.","conn.guide.sftp.rclone.useCaption":"Use it","conn.guide.sftp.sshfs.mountCaption":"Mount and unmount","conn.guide.sftp.sshfs.note":"A mounted folder rewrites the whole file on every save. Good for documents, not for a database or a video you are editing in place.","conn.guide.sftp.note.storages":"The root is not a home directory: it lists the storages you may open, and the first path segment names one.","conn.guide.sftp.note.permissions":"The permission bits your client draws come from your access level here, so a file shown as read-only really is one for you.","conn.guide.sftp.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.sftp.note.totp":"If your account has two-factor sign-in, the password will not work here — SSH has no way to ask for the code. Register a key, or use an API token as the password.","conn.guide.sftp.note.disabled":"The SFTP endpoint is switched off on this server. These instructions will work once an operator enables it.","conn.guide.ftps.summary":"FTPS is here for the equipment that only ever learned FTP — scan-to-folder printers, EDI counterparties, older lab and industrial software. Always over TLS.","conn.guide.ftps.fact.host":"Host","conn.guide.ftps.fact.hostHint":"The same machine as the web app, on a port of its own.","conn.guide.ftps.fact.port":"Port","conn.guide.ftps.fact.portHint":"The control channel. Data moves on a separate port from the passive range below.","conn.guide.ftps.fact.mode":"Encryption","conn.guide.ftps.fact.modeValue":"FTPS — explicit TLS (AUTH TLS), required","conn.guide.ftps.fact.modeHint":'Plain FTP is refused before the password is read. Choose "Require explicit FTP over TLS", never "plain FTP" and never "implicit".',"conn.guide.ftps.fact.userHint":"Your short login name, or your e-mail. An API token works as the password too and can be revoked on its own.","conn.guide.ftps.fact.passwordHint":"Your account password, or an API token. An account with two-factor sign-in must use a token — FTP has no way to ask for the code.","conn.guide.ftps.fact.pasv":"Passive ports","conn.guide.ftps.fact.pasvHint":"Data connections land here. If your firewall blocks this range the transfer HANGS with no error on either side — that is the classic FTP failure.","conn.guide.ftps.filezilla.s1":"File → Site Manager → New site, Protocol: FTP.","conn.guide.ftps.filezilla.s2":"Host: {host}, port: {port}.","conn.guide.ftps.filezilla.s3":'Encryption: "Require explicit FTP over TLS". Logon type: Normal, user: {user}.',"conn.guide.ftps.filezilla.s4":"Transfer settings → Passive. Active mode is refused by this server.","conn.guide.ftps.winscp.s1":"New site → File protocol: FTP, Encryption: TLS/SSL Explicit encryption.","conn.guide.ftps.winscp.s2":"Host name: {host}, port: {port}.","conn.guide.ftps.winscp.s3":"User name: {user}, password as above.","conn.guide.ftps.curl.caption":"Upload and download","conn.guide.ftps.curl.sslReqd":"--ssl-reqd is not optional: it makes curl REQUIRE TLS instead of falling back to plaintext. This server refuses plaintext anyway, but the habit protects you against the servers that do not.","conn.guide.ftps.lftp.caption":"Connect","conn.guide.ftps.lftp.protectData":"ssl-protect-data encrypts the FILE as well as the login. Without it lftp logs in over TLS and then sends your file in the clear — which is the FTPS misconfiguration people actually ship.","conn.guide.ftps.rclone.useCaption":"Use it","conn.guide.ftps.printer.tab":"Scanner / printer","conn.guide.ftps.printer.s1":"In the device's scan-to-FTP settings: server {host}, port {port}.","conn.guide.ftps.printer.s2":"User: {user}, password as above. Create an API token for the device rather than using your own password — it can be revoked without changing anything else.","conn.guide.ftps.printer.s3":"Path: {path} — or a folder inside it that you created first. The device cannot create a storage.","conn.guide.ftps.printer.s4":'Turn ON "SSL/TLS" or "FTPS explicit", and PASSIVE mode.',"conn.guide.ftps.printer.noTLS":"Plenty of scan-to-FTP firmware cannot do TLS at all. This server will not talk to such a device, and that is deliberate — the alternative is your documents and your password crossing the office network in the clear.","conn.guide.ftps.note.tls":"TLS is mandatory and there is no switch to turn it off. Plain FTP sends your password in the clear and your file after it.","conn.guide.ftps.note.passive":"Passive mode only. Active mode has the server dial back to the client, which does not survive NAT and is blocked by most firewalls.","conn.guide.ftps.note.storages":"The root is not a home directory: it lists the storages you may open, and the first path segment names one.","conn.guide.ftps.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.ftps.note.prefer":"If the client can speak SFTP, prefer it: one connection, one port, no passive-mode surprises.","conn.guide.ftps.note.selfSigned":"This server is using a self-signed certificate. It encrypts the channel but proves nothing about who is on the other end — most clients will ask you to accept it once. Supply a real certificate for anything that matters.","conn.guide.ftps.note.disabled":"The FTPS endpoint is switched off on this server. These instructions will work once an operator enables it.","conn.nfs.title":"NFS exports","conn.nfs.lead":"An export lets a machine on your network mount filex as a drive — a media player, a build server, a backup box.","conn.nfs.pathIsSecret":"⚠ The export path IS the password. NFS cannot ask a client who it is without Kerberos, so filex puts 32 random bytes in the path instead: whoever knows it can mount as you. Treat the mount line like a credential — /etc/fstab is world-readable on most systems.","conn.nfs.disabled":"The NFS endpoint is switched off on this server (FILEX_NFS). An export created here will not mount until an operator turns it back on.","conn.nfs.cannotMint":"You are not signed in with an account that can create exports.","conn.nfs.label":"What is it for? (media player, backup box, …)","conn.nfs.defaultLabel":"nfs export","conn.nfs.everyStorage":"Every storage I can see","conn.nfs.prefix":"Folder inside the storage (optional)","conn.nfs.allowCidrs":"Allowed addresses, e.g. 192.168.1.0/24 (optional)","conn.nfs.readOnly":"Read-only","conn.nfs.readOnlyHint":"Read-only is the safer default for a machine: it refuses every write through this mount whatever your own permissions are. An address list narrows it further — outside it, the mount is refused.","conn.nfs.mint":"Create export","conn.nfs.once":"Copy this now — the path is shown only once and cannot be recovered.","conn.nfs.dismiss":"I have copied it","conn.nfs.col.label":"Label","conn.nfs.col.scope":"Limited to","conn.nfs.col.mode":"Mode","conn.nfs.col.lastUsed":"Last mounted","conn.nfs.scopeAll":"everything you can see","conn.nfs.modeRead":"read-only","conn.nfs.modeWrite":"read/write","conn.nfs.noLabel":"(no label)","conn.nfs.neverUsed":"never","conn.nfs.enable":"Enable","conn.nfs.disable":"Disable","conn.nfs.revoke":"Revoke","conn.nfs.confirm":"Sure?","conn.nfs.empty":"No exports yet.","conn.guide.nfs.summary":"NFS mounts filex as a drive on a machine in your own network — the NAS protocol, for the devices that expect one.","conn.guide.nfs.pathPlaceholder":"create an export above","conn.guide.nfs.fact.host":"Host","conn.guide.nfs.fact.hostHint":"The same machine as the web app, on a port of its own.","conn.guide.nfs.fact.port":"Port","conn.guide.nfs.fact.portHint":"Both port= and mountport= must be set to this; filex serves the mount and NFS services on one port.","conn.guide.nfs.fact.export":"Export path","conn.guide.nfs.fact.exportHint":"This is the credential. It is shown once, when you create the export, and is stored hashed — filex cannot show it again.","conn.guide.nfs.fact.options":"Mount options","conn.guide.nfs.fact.optionsHint":"nolock because filex does not run the NFS lock manager; nfsvers=3 because that is what this server speaks.","conn.guide.nfs.linux.mountCaption":"Mount it","conn.guide.nfs.linux.fstabSecret":"An /etc/fstab line containing this path is a password in a world-readable file. Use a credentials-protected automount, or keep the mount in a root-only unit, if that matters where you are.","conn.guide.nfs.mac.mountCaption":"Mount it","conn.guide.nfs.mac.resvport":"macOS needs resvport: its client insists on a privileged source port and refuses the mount without it.","conn.guide.nfs.win.s1":'Turn on "Services for NFS" → "Client for NFS" in Windows Features (Pro and Enterprise only; Home does not have it).',"conn.guide.nfs.win.s2":"Open a Command Prompt as administrator.","conn.guide.nfs.win.s3":"Map the export to a drive letter with the command below.","conn.guide.nfs.win.cmdCaption":"Map it to Z:","conn.guide.nfs.win.port":"Windows has no way to say which port the mount service is on, so it can only reach an NFS server on the standard port 2049. If this server is on another port, use SFTP or the filex desktop app instead.","conn.guide.nfs.nas.tab":"NAS / media player","conn.guide.nfs.nas.s1":"In the device's NFS settings: server {host}, port {port} (set both the NFS and the mount port if it asks for them separately).","conn.guide.nfs.nas.s2":"Remote path: the export path above, exactly as shown.","conn.guide.nfs.nas.s3":"NFS version 3, no locking. Create the export read-only unless the device genuinely needs to write.","conn.guide.nfs.note.unencrypted":"NFSv3 is not encrypted. Anyone who can read the traffic sees your files, and anyone who learns the path can mount them. Use it on a home or office network, or over a VPN — never across the internet.","conn.guide.nfs.note.pathIsSecret":"The export path is the whole credential. Revoke it from the list above if it leaks; there is nothing else to change.","conn.guide.nfs.note.noPortmapper":"There is no portmapper on port 111, so a client that is not told the port cannot find the server. That is why every command here carries port= and mountport=.","conn.guide.nfs.note.uid":"The user and group ids your client sends are ignored: the mount already knows whose it is. The permissions you see come from your access in filex.","conn.guide.nfs.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.nfs.note.revoke":"Revoking takes effect on the next request, not instantly: NFS has no session to end, so a client with the mount open sees its next operation fail.","conn.guide.nfs.note.disabled":"The NFS endpoint is switched off on this server. These instructions will work once an operator enables it.","conn.tokens.title":"API tokens","conn.tokens.lead":"FTPS, WebDAV and filex mount all sign in with a token instead of your account password. Mint one here — it can be revoked on its own, and an account with two-factor sign-in cannot use its password on these at all.","conn.tokens.mint":"Create token","conn.tokens.once":"Copy it now — this is the only time it is shown. Only a hash is stored, so it cannot be shown again.","conn.tokens.dismiss":"I have copied it","conn.tokens.cannotMint":"This session cannot create tokens. Sign in with your own account to make one.","conn.tokens.empty":"No tokens yet.","conn.tokens.neverUsed":"never","conn.tokens.revoke":"Revoke","conn.tokens.confirm":"Sure?","conn.tokens.col.label":"Name","conn.tokens.col.scopes":"Can do","conn.tokens.col.used":"Last used","conn.tokens.revokeHint":"Revoking stops a connection that is already open, not just the next sign-in: an SFTP or FTPS session is cut and a mount stops working within about half a minute.","conn.guide.mount.summary":"filex mount attaches a remote filex server to a folder on this machine, over the same HTTPS the browser uses. It is the only one of these that works from anywhere — no LAN, no extra server, no third-party client.","conn.guide.mount.fact.url":"Server URL","conn.guide.mount.fact.urlHint":"The same address you use in the browser. Nothing else has to be reachable.","conn.guide.mount.fact.token":"API token","conn.guide.mount.fact.tokenPlaceholder":"create one under Tokens","conn.guide.mount.fact.tokenHint":"A token, not your password — it can be revoked on its own, and an account with 2FA cannot use its password here at all.","conn.guide.mount.fact.remote":"What to mount","conn.guide.mount.fact.remoteHint":"Leave --remote off to see every storage as a folder, or name one storage — or a folder inside it — to mount just that.","conn.guide.mount.linux.mountCaption":"Mount it","conn.guide.mount.linux.umountCaption":"Unmount it","conn.guide.mount.linux.umountWarn":"Unmount with fusermount, not by killing the process. A mount whose process died without detaching leaves a folder where every ls hangs until somebody runs fusermount by hand.","conn.guide.mount.linux.systemdCaption":"Mount it at login (systemd user unit)","conn.guide.mount.win.winfsp":"Windows needs WinFsp installed once — it is free and open source: https://winfsp.dev. Nothing else, and no administrator rights after that.","conn.guide.mount.win.mountCaption":"Mount it as a drive","conn.guide.mount.win.freeLetter":"Pick a drive letter that is FREE. The letter is created by the mount, not attached to something that already exists, and pointing it at one that is in use fails with a message that does not say so.","conn.guide.mount.win.stop":"Stop it with Ctrl-C in that window. The drive disappears and nothing is left behind on this machine.","conn.guide.mount.mac.unsupported":"filex mount does not work on macOS. It needs macFUSE, whose licence does not allow a program like filex to install it for you, and whose Go binding needs a C compiler filex deliberately does not require. The command refuses here rather than appearing to work and doing nothing.","conn.guide.mount.mac.alternatives":"On macOS, use the filex desktop app with folder sync (keeps the files on disk), or SFTP with a client that mounts drives.","conn.guide.mount.note.notASync":"This is not a sync. Nothing is copied to this machine except a small read cache, so a mount opens one file out of a hundred thousand without downloading the rest. If you want the files when you are offline, use folder sync instead.","conn.guide.mount.note.reachable":"It reaches the server through whatever proxy or tunnel the browser goes through, because underneath it is the same API. Your permissions, your storages and — on a multi-tenant server — your tenant come with it.","conn.guide.mount.note.wholeFileWrites":"A file you write through the mount is uploaded when the program closes it, not while it is being written. Editing a very large file in place is slower here than a local disk; copying it in and out is not.","conn.guide.mount.note.trash":"A delete goes to the filex trash, the same as everywhere else, and is recoverable until the retention policy sweeps it.","conn.guide.mount.note.revoke":"Revoke the token to stop a mount. It stops serving within half a minute, even if the mount is still attached.","storages.driver.ftp":"FTP / FTPS","storages.driver.local":"Local filesystem","storages.driver.s3":"S3 / Hetzner / MinIO","storages.driver.sftp":"SFTP","storages.driver.smb":"SMB / CIFS (NAS)","storages.driver.webdav":"WebDAV","storages.fieldHelp.smbShare":"The share name alone, without the server: `media`, not `\\\\nas\\media`.","storages.fieldHelp.smbDomain":"Only for a Windows domain account. Leave empty for a NAS.","storages.fieldHelp.smbRoot":"Sub-folder inside the share. Leave empty for the whole share.","storages.fields.share":"Share","storages.fields.domain":"Domain / workgroup","storages.fields.dialTimeout":"Connect timeout (seconds)","storages.fieldHelp.disablePresign":"Turn on when the store rejects SDK-signed URLs (Ceph RGW / some Hetzner setups answer SignatureDoesNotMatch); uploads then stream through the backend.","storages.fieldHelp.endpoint":"Leave empty for AWS S3. Any S3-compatible store needs its endpoint.","storages.fieldHelp.hostKey":"A single public key in authorized_keys / known_hosts line form.","storages.fieldHelp.insecureSkipHostKey":"Accepts any host key. Only for throwaway hosts.","storages.fieldHelp.keyPath":"Path to a key file on the server, read when the storage starts. Used when the PEM field is empty.","storages.fieldHelp.knownHosts":"OpenSSH known_hosts path for strict host-key checking. Default is trust-on-first-use in ~/.filex/known_hosts.","storages.fieldHelp.passive":"Off switches to active mode, which needs the server to dial back into this host.","storages.fieldHelp.path":"Directory on the server. It is created if missing; filex never mounts /.","storages.fieldHelp.pathStyle":"On for every non-AWS store. It is turned on automatically when an endpoint is set and this was never touched.","storages.fieldHelp.prefix":"Sub-folder inside the bucket. Required: filex never takes ownership of the bucket root.","storages.fieldHelp.region":'Defaults to "auto" when left empty.',"storages.fieldHelp.root":"Sub-folder on the backend. Required: filex never mounts the account root.","storages.fieldHelp.sftpAuth":"Either a password or a private key is required.","storages.fieldHelp.tls":"Plain FTP sends credentials in the clear — turn this on whenever the server supports it.","storages.fields.accessKey":"Access key","storages.fields.basePath":"Base path","storages.fields.bucket":"Bucket","storages.fields.disablePresign":"Disable presigned URLs","storages.fields.endpoint":"Endpoint","storages.fields.host":"Host","storages.fields.hostKey":"Pinned host key","storages.fields.insecureSkipHostKey":"Skip host-key verification (insecure)","storages.fields.keyPath":"Private key file","storages.fields.knownHosts":"known_hosts file","storages.fields.name":"Display name","storages.fields.namePlaceholder":"Personal photos","storages.fields.passive":"Passive mode (PASV)","storages.fields.password":"Password","storages.fields.path":"Filesystem path","storages.fields.pathStyle":"Use path-style URLs (Hetzner, MinIO)","storages.fields.port":"Port","storages.fields.prefix":"Prefix","storages.fields.privateKey":"Private key (PEM)","storages.fields.rbac":"Per-item access control (RBAC)","storages.fields.rbacHint":"When on, non-admins see only files/folders explicitly granted to them via the permissions panel. When off, the storage is open to all users (capability by role).","storages.fields.readOnly":"Read-only mount","storages.fields.region":"Region","storages.fields.root":"Base path","storages.fields.secretKey":"Secret key","storages.fields.tls":"FTPS (explicit AUTH TLS)","storages.fields.url":"Base URL","storages.fields.user":"User"},Dc={tr:qf,en:Wf};function zt(e){const t=n.computed(()=>{const o=typeof e=="function"?e():e.value;return Dc[o]??Dc.tr});function a(o,s={}){const l=t.value[o]??o;return Object.entries(s).reduce((c,[d,u])=>c.replaceAll(`{${d}}`,String(u)),l)}function r(o){if(o==null||o<0)return"—";if(o===0)return`0 ${a("unit.bytes")}`;const s=[[1024**4,"unit.tb"],[1024**3,"unit.gb"],[1024**2,"unit.mb"],[1024,"unit.kb"],[1,"unit.bytes"]];for(const[l,c]of s)if(o>=l){const d=o/l;return`${d>=100?Math.round(d):d.toFixed(d>=10?1:2)} ${a(c)}`}return`${o} ${a("unit.bytes")}`}function i(o){if(o.basename===".trash")return a("node.trash");const s=o.basename.match(/^\d{8}-\d{6}-[A-Za-z0-9]+__(.+)$/);return s?s[1]:o.basename}return{t:a,formatSize:r,nodeDisplayName:i}}const qk=2e3,Wk=8e3;function jf(e){const t=(...l)=>{for(const c of l)if(typeof c=="number")return c;return 0},a=(...l)=>{for(const c of l)if(typeof c=="string"&&c!=="")return c;return null},r=String(e.status??"pending"),i=r==="ok"||r==="done"?"done":r==="failed"||r==="partial"||r==="error"?"error":r==="running"?"running":"pending",o=Array.isArray(e.sources)?e.sources:[],s=a(e.op_type,e.kind)??"delete";return{id:t(e.id),op_type:s==="copy"||s==="move"?s:"delete",status:i,progress_total:t(e.progress_total,e.total,o.length),progress_done:t(e.progress_done,e.done),target_path:a(e.target_path,e.dest),source_dir:a(e.source_dir),source_count:t(e.source_count,o.length),error_message:a(e.error_message,e.error),started_at:a(e.started_at),finished_at:a(e.finished_at),created_at:a(e.created_at)}}function Yf(e,t,a={}){const r=n.ref([]),i=new Set,o=new Map;let s=!1;const l=n.computed(()=>r.value.some(_=>_.status==="pending"||_.status==="running"));let c;function d(){c||t.endpoints.opsList&&(c=setInterval(()=>{p()},qk),p())}function u(){c&&(clearInterval(c),c=void 0)}async function p(){var _;if(t.endpoints.opsList)try{const k=((await t.jsonFetch(t.endpoints.opsList)).ops||[]).map(jf);for(const w of k)(w.status==="done"||w.status==="error")&&!i.has(w.id)&&(i.add(w.id),o.set(w.id,Date.now()),s&&((_=a.onSettled)==null||_.call(a,w)));const m=new Set(r.value.map(w=>w.id)),v=k.filter(w=>w.status==="pending"||w.status==="running"?!0:s?m.has(w.id):!1),g=new Set(v.map(w=>w.id)),y=r.value.filter(w=>!g.has(w.id)),S=[...v,...y];s=!0;const x=Date.now(),N=S.filter(w=>{if(w.status==="pending"||w.status==="running")return!0;const E=o.get(w.id);return E!==void 0&&x-E<Wk});r.value=N,!l.value&&N.length===0&&u()}catch(b){console.warn("[usePendingOps] poll failed:",b)}}function f(_){const b=jf(_);r.value.some(m=>m.id===b.id)||(r.value=[b,...r.value]),d()}function h(_){r.value=r.value.filter(b=>b.id!==_),o.delete(_)}return n.onBeforeUnmount(()=>{u()}),{ops:r,hasActive:l,register:f,dismiss:h,poll:p,startPolling:d,stopPolling:u}}const jk=25e3,Yk=15e3,Xk=6;class Zk{constructor(t){Sa(this,"ws",null);Sa(this,"opts");Sa(this,"closed",!1);Sa(this,"connecting",!1);Sa(this,"retries",0);Sa(this,"fallback",!1);Sa(this,"pingTimer",null);Sa(this,"reconnectTimer",null);Sa(this,"currentPath",null);Sa(this,"currentFocus",null);this.opts=t,this.connect()}subscribe(t){this.currentPath=t,this.currentFocus=null,t&&this.send({type:"subscribe",path:t})}setFocus(t){this.currentFocus=t,this.send({type:"focus",file:t})}close(){this.closed=!0,this.clearTimers(),this.dropSocket()}async connect(){if(this.closed||this.connecting||this.ws)return;this.connecting=!0;let t=null;try{t=await this.opts.getTicket()}catch{t=null}if(this.connecting=!1,this.closed)return;if(!t||!t.ticket||!t.ws_url){this.fail();return}const a=t.ws_url.includes("?")?"&":"?";let r;try{r=new WebSocket(`${t.ws_url}${a}ticket=${encodeURIComponent(t.ticket)}`)}catch{this.fail();return}this.ws=r,r.onopen=()=>{var i,o;this.retries=0,this.setFallback(!1),(o=(i=this.opts.handlers).onStatus)==null||o.call(i,!0),this.currentPath&&this.send({type:"subscribe",path:this.currentPath}),this.currentFocus!==null&&this.send({type:"focus",file:this.currentFocus}),this.startPing()},r.onmessage=i=>{var l,c,d,u;let o;try{o=JSON.parse(typeof i.data=="string"?i.data:"")}catch{return}const s=o;(s==null?void 0:s.type)==="change"?(c=(l=this.opts.handlers).onChange)==null||c.call(l,o):(s==null?void 0:s.type)==="presence"&&((u=(d=this.opts.handlers).onPresence)==null||u.call(d,o))},r.onerror=()=>{},r.onclose=()=>{var i,o;this.stopPing(),this.ws=null,(o=(i=this.opts.handlers).onStatus)==null||o.call(i,!1),this.fail()}}fail(){if(this.closed||this.reconnectTimer)return;if(this.retries>=Xk){this.setFallback(!0);return}const t=Math.min(1e3*2**this.retries,Yk);this.retries+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},t)}setFallback(t){var a,r;this.fallback!==t&&(this.fallback=t,(r=(a=this.opts.handlers).onFallback)==null||r.call(a,t))}send(t){const a=this.ws;if(!(!a||a.readyState!==WebSocket.OPEN))try{a.send(JSON.stringify(t))}catch{}}startPing(){this.stopPing(),this.pingTimer=setInterval(()=>this.send({type:"ping"}),jk)}stopPing(){this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=null)}dropSocket(){if(this.ws){try{this.ws.onclose=null,this.ws.close()}catch{}this.ws=null}}clearTimers(){this.stopPing(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}}const Jk=200,Qk=12e3;function e_(e,t){const a=n.ref([]),r=n.ref(!1),i=n.ref(!1);let o=null,s=null,l=null,c=null;function d(){l&&clearTimeout(l),l=setTimeout(()=>{l=null,t.reload()},Jk)}function u(k){s&&k.path&&k.path!==s||(a.value=Array.isArray(k.users)?k.users:[])}function p(k){i.value=k,k?(a.value=[],c||(c=setInterval(()=>t.reload(),Qk))):c&&(clearInterval(c),c=null)}function f(){o||(o=new Zk({getTicket:()=>e.wsTicket(),handlers:{onChange:d,onPresence:u,onFallback:p,onStatus:k=>{r.value=k}}}))}function h(k){a.value=[],s=k,o==null||o.subscribe(k)}function _(k){o==null||o.setFocus(k)}function b(){l&&(clearTimeout(l),l=null),c&&(clearInterval(c),c=null),o==null||o.close(),o=null,i.value=!1}return{presenceUsers:a,connected:r,degraded:i,start:f,subscribe:h,setFocus:_,stop:b}}const t_=500;function n_(e,t){const a=n.ref({}),r=[],i=new Set,o=new Set;function s(d){if(/^https?:\/\//i.test(d))return d;const u=(e||"").replace(/\/+$/,"");return u&&d.startsWith("/")?u+d:d}function l(d){const u=d.thumb_url;if(!u)return null;const p=a.value[u];return p||(!i.has(u)&&!o.has(u)&&c(u),null)}async function c(d){o.add(d);try{const u=await fetch(s(d),{headers:await t.authHeaders({Accept:"*/*"}),credentials:t.credentialsMode()});if(!u.ok)throw new Error(String(u.status));const p=await u.blob();if(r.length>=t_){const f=r.shift();if(f&&a.value[f]){URL.revokeObjectURL(a.value[f]);const h={...a.value};delete h[f],a.value=h}}r.push(d),a.value={...a.value,[d]:URL.createObjectURL(p)}}catch{i.add(d)}finally{o.delete(d)}}return{src:l}}let hs=null,ms=null,gs=null,bs=null;function lo(){hs||(hs=import("monaco-editor").then(e=>(gs=e.default??e,gs)).catch(()=>(gs=null,null))),ms||(ms=Promise.resolve().then(()=>JB).then(e=>(bs=e.default??e,bs)).catch(()=>(bs=null,null)))}async function ys(){return hs||lo(),hs}async function vs(){return ms||lo(),ms}function Bc(){return gs}function Xf(){return bs}function a_(){return lo(),{ensureMonaco:ys,ensureHighlight:vs,getMonaco:Bc,getHighlight:Xf}}const r_=["title"],i_=["src","alt"],o_={key:2,class:"fx-presence-dot","aria-hidden":"true"},Zf=n.defineComponent({__name:"PresenceAvatar",props:{user:{},title:{}},setup(e){const t=e,a=n.computed(()=>{const l=(t.user.avatar??"").trim();return/^(data:image\/|https?:\/\/|\/)/.test(l)?l:""}),r=n.ref(!1),i=n.computed(()=>!!a.value&&!r.value),o=n.computed(()=>{const l=t.user.name.trim().split(/\s+/).filter(Boolean);return l.length===0?"?":l.length===1?l[0].slice(0,2).toUpperCase():(l[0][0]+l[l.length-1][0]).toUpperCase()}),s=n.computed(()=>{const l=t.user.uid??String(t.user.id);let c=0;for(let d=0;d<l.length;d++)c=c*31+l.charCodeAt(d)>>>0;return c%360});return(l,c)=>(n.openBlock(),n.createElementBlock("span",{class:n.normalizeClass(["fx-presence-avatar",{"fx-presence-avatar--photo":i.value}]),style:n.normalizeStyle({backgroundColor:`hsl(${s.value} 60% 45%)`}),title:e.title},[i.value?(n.openBlock(),n.createElementBlock("img",{key:0,class:"fx-presence-photo",src:a.value,alt:e.user.name,onError:c[0]||(c[0]=d=>r.value=!0)},null,40,i_)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString(o.value),1)],64)),e.user.file?(n.openBlock(),n.createElementBlock("span",o_)):n.createCommentVNode("",!0)],14,r_))}}),s_={key:0,class:"fx-presence-chips"},l_=["title"],c_={class:"fx-presence-chip-name"},d_={key:0,class:"fx-presence-chip-file"},u_=["title"],f_={key:0,class:"fx-presence-more"},p_=["title"],h_={class:"fx-presence-file"},m_=["title","aria-expanded"],Jf="filex.presence.expanded",g_=n.defineComponent({__name:"PresenceBar",props:{users:{},selfId:{},locale:{}},setup(e){const t=e,{t:a}=zt(()=>t.locale??"tr"),r=n.computed(()=>(t.users??[]).filter(c=>t.selfId==null||c.id!==t.selfId)),i=n.ref((()=>{try{return localStorage.getItem(Jf)==="1"}catch{return!1}})());function o(){i.value=!i.value;try{localStorage.setItem(Jf,i.value?"1":"0")}catch{}}function s(c){return c.uid??String(c.id)}function l(c){return c.file?`${c.name} · ${c.file}`:c.name}return(c,d)=>r.value.length?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fx-presence",{"fx-presence--wide":i.value}])},[i.value?(n.openBlock(),n.createElementBlock("div",s_,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r.value,u=>(n.openBlock(),n.createElementBlock("span",{key:s(u),class:"fx-presence-chip",title:l(u)},[n.createVNode(Zf,{user:u},null,8,["user"]),n.createElementVNode("span",c_,n.toDisplayString(u.name),1),u.file?(n.openBlock(),n.createElementBlock("span",d_,"· "+n.toDisplayString(u.file),1)):n.createCommentVNode("",!0)],8,l_))),128))])):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",{class:"fx-presence-avatars",title:r.value.map(l).join(", ")},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r.value.slice(0,5),u=>(n.openBlock(),n.createBlock(Zf,{key:s(u),user:u,title:l(u)},null,8,["user","title"]))),128)),r.value.length>5?(n.openBlock(),n.createElementBlock("span",f_,"+"+n.toDisplayString(r.value.length-5),1)):n.createCommentVNode("",!0)],8,u_),n.createElementVNode("span",{class:"fx-presence-text",title:r.value.map(l).join(", ")},[n.createTextVNode(n.toDisplayString(r.value.length===1?r.value[0].name:`${r.value.length} kişi`)+" ",1),r.value.length===1&&r.value[0].file?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[d[0]||(d[0]=n.createTextVNode(" · ",-1)),n.createElementVNode("span",h_,n.toDisplayString(r.value[0].file),1)],64)):n.createCommentVNode("",!0)],8,p_)],64)),n.createElementVNode("button",{type:"button",class:"fx-presence-toggle",title:i.value?n.unref(a)("presence.collapse"):n.unref(a)("presence.expand"),"aria-expanded":i.value,onClick:o},n.toDisplayString(i.value?"‹":"›"),9,m_)],2)):n.createCommentVNode("",!0)}}),b_=["data-prefers-dark"],y_=["aria-label"],v_=["aria-label","onKeydown"],k_={class:"fe-sheet__items"},__={key:0,class:"fe-ctx__sep",role:"separator"},w_=["disabled","onClick"],E_={key:0,class:"fe-ctx__icon","aria-hidden":"true"},S_={class:"fe-ctx__label"},x_=["aria-label"],C_={key:0,class:"fe-ctx__sep",role:"separator"},N_=["disabled","onClick"],T_={key:0,class:"fe-ctx__icon","aria-hidden":"true"},D_={class:"fe-ctx__label"},Ac=n.defineComponent({__name:"ContextMenu",props:{locale:{},actions:{},theme:{},sheet:{type:Boolean}},emits:["select"],setup(e,{expose:t,emit:a}){const r=e,i=a,{t:o}=zt(()=>r.locale),s=n.ref(!1),l=n.ref(0),c=n.ref(0),d=n.ref([]),u=n.ref(null);let p=0,f=0,h=null;async function _(z,H){var O;if(h=document.activeElement??null,s.value=!0,l.value=z.clientX,c.value=z.clientY,p=z.clientX,f=z.clientY,d.value=H,await n.nextTick(),r.sheet){(O=y.value)==null||O.focus();return}b(),v(0)}function b(){const z=u.value;if(!z||typeof window>"u")return;const H=z.getBoundingClientRect(),O=8,P=window.innerWidth,K=window.innerHeight;if(f+H.height>K-O){const J=f-H.height;c.value=J>=O?J:Math.max(O,K-H.height-O)}if(p+H.width>P-O){const J=p-H.width;l.value=J>=O?J:Math.max(O,P-H.width-O)}}function k(){var z;s.value=!1,S.value=!1,x.value=0,(z=h==null?void 0:h.focus)==null||z.call(h),h=null}function m(){const z=r.sheet?y.value:u.value;return z?Array.from(z.querySelectorAll(".fe-ctx__item:not(:disabled)")):[]}function v(z){var P;const H=m();if(H.length===0)return;const O=(z%H.length+H.length)%H.length;(P=H[O])==null||P.focus()}function g(z){const H=m();if(H.length===0)return;const O=document.activeElement,P=O?H.indexOf(O):-1;if(P===-1){v(z>0?0:H.length-1);return}v(P+z)}const y=n.ref(null),S=n.ref(!1),x=n.ref(0);let N=0;function w(z){const H=z.touches[0];H&&(S.value=!0,N=H.clientY,x.value=0)}function E(z){if(!S.value)return;const H=z.touches[0];H&&(x.value=Math.max(0,H.clientY-N))}function C(){if(!S.value)return;const z=x.value>72;S.value=!1,z?k():x.value=0}const A=n.computed(()=>x.value>0?{transform:`translateY(${x.value}px)`,transition:"none"}:void 0);function L(z){z.disabled||(i("select",z,d.value),k())}function R(z){if(z.key==="Escape"){z.stopPropagation(),k();return}if(z.key==="Enter"||z.key===" "){z.stopPropagation();return}z.key==="ArrowDown"?(z.preventDefault(),z.stopPropagation(),g(1)):z.key==="ArrowUp"?(z.preventDefault(),z.stopPropagation(),g(-1)):z.key==="Home"?(z.preventDefault(),v(0)):z.key==="End"?(z.preventDefault(),v(-1)):z.key==="Tab"&&(z.preventDefault(),k())}const $=n.computed(()=>{const z=r.actions.filter(O=>!O.hidden),H=[];for(const O of z)O.divider&&(H.length===0||H[H.length-1].divider)||H.push(O);for(;H.length>0&&H[H.length-1].divider;)H.pop();return H}),Y=n.ref(!1);let F;function q(z){Y.value=!!(z&&"matches"in z&&z.matches)}n.onMounted(()=>{var z;typeof window>"u"||(F=window.matchMedia("(prefers-color-scheme: dark)"),q(F),(z=F.addEventListener)==null||z.call(F,"change",q))}),n.onBeforeUnmount(()=>{var z;(z=F==null?void 0:F.removeEventListener)==null||z.call(F,"change",q)});const X=n.computed(()=>`fe-ctx-backdrop--theme-${r.theme||"auto"}`);return t({show:_,hide:k}),(z,H)=>(n.openBlock(),n.createBlock(n.Teleport,{to:"body"},[n.createVNode(n.Transition,{name:e.sheet?"fe-sheet":"fe-ctx"},{default:n.withCtx(()=>[s.value?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe-ctx-backdrop",[X.value,{"fe-ctx-backdrop--sheet":e.sheet}]]),"data-prefers-dark":Y.value?"1":"0",onClick:k,onContextmenu:n.withModifiers(k,["prevent"]),onKeydown:R},[e.sheet?(n.openBlock(),n.createElementBlock("div",{key:0,ref_key:"sheetEl",ref:y,class:"fe-sheet",role:"menu","aria-label":n.unref(o)("sheet.menu"),tabindex:"-1",style:n.normalizeStyle(A.value),onClick:H[0]||(H[0]=n.withModifiers(()=>{},["stop"]))},[n.createElementVNode("div",{class:"fe-sheet__handle",role:"button",tabindex:"0","aria-label":n.unref(o)("sheet.close"),onClick:k,onKeydown:n.withKeys(n.withModifiers(k,["prevent"]),["enter"]),onTouchstartPassive:w,onTouchmovePassive:E,onTouchend:C,onTouchcancel:C},null,40,v_),n.createElementVNode("div",k_,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList($.value,(O,P)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:O.key||P},[O.divider?(n.openBlock(),n.createElementBlock("div",__)):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:n.normalizeClass(["fe-ctx__item fe-sheet__item",{"is-danger":O.danger,"is-disabled":O.disabled}]),disabled:O.disabled,role:"menuitem",onClick:K=>L(O)},[O.icon?(n.openBlock(),n.createElementBlock("span",E_,n.toDisplayString(O.icon),1)):n.createCommentVNode("",!0),n.createElementVNode("span",S_,n.toDisplayString(O.label),1)],10,w_))],64))),128))])],12,y_)):(n.openBlock(),n.createElementBlock("div",{key:1,ref_key:"menuEl",ref:u,class:"fe-ctx",role:"menu","aria-orientation":"vertical","aria-label":n.unref(o)("sheet.menu"),style:n.normalizeStyle({top:c.value+"px",left:l.value+"px"}),onClick:H[1]||(H[1]=n.withModifiers(()=>{},["stop"]))},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList($.value,(O,P)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:O.key||P},[O.divider?(n.openBlock(),n.createElementBlock("div",C_)):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:n.normalizeClass(["fe-ctx__item",{"is-danger":O.danger,"is-disabled":O.disabled}]),disabled:O.disabled,role:"menuitem",onClick:K=>L(O)},[O.icon?(n.openBlock(),n.createElementBlock("span",T_,n.toDisplayString(O.icon),1)):n.createCommentVNode("",!0),n.createElementVNode("span",D_,n.toDisplayString(O.label),1)],10,N_))],64))),128))],12,x_))],42,b_)):n.createCommentVNode("",!0)]),_:1},8,["name"])]))}}),B_=["title","aria-label"],A_=["title"],M_={class:"fe-btn__label"},O_=["disabled","title","onClick"],I_={class:"fe-icon"},R_={class:"fe-btn__label"},L_=["title","aria-label"],z_={class:"fe-icon"},F_={class:"fe-btn__label"},P_=["title"],$_={class:"fe-btn__label"},V_={class:"fe-toolbar__search-group"},U_={class:"fe-search"},H_=["placeholder","value","aria-label"],G_=["title","aria-label"],K_=["title","aria-label"],q_=["aria-pressed","aria-label","title"],W_={key:0,class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","aria-hidden":"true",focusable:"false"},j_={key:1,class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","aria-hidden":"true",focusable:"false"},Y_=["aria-pressed","title","aria-label"],X_=["title","aria-label"],Z_=["aria-label"],J_=["aria-selected","title","aria-label"],Q_=["aria-selected","title","aria-label"],e4=["aria-selected","title","aria-label"],t4={class:"fe-search fe-search--full"},n4=["placeholder","value","aria-label","onKeydown"],a4=["title","aria-label"],r4=["title","aria-label"],i4=["title","aria-label"],o4=["title","aria-label"],s4=["title","aria-label"],Qf="filex.density",l4=40,c4=n.defineComponent({__name:"Toolbar",props:{viewMode:{},searchQuery:{},trashActive:{type:Boolean},actions:{},selectionMode:{},pasteEnabled:{type:Boolean},convertEnabled:{type:Boolean},canGoUp:{type:Boolean},atVirtualRoot:{type:Boolean},canWrite:{type:Boolean},locale:{},narrow:{type:Boolean},theme:{},inspectorOpen:{type:Boolean}},emits:["update:viewMode","update:searchQuery","new-folder","upload","refresh","go-up","action","open-recents","update:density","toggle-inspector","open-theme","open-shortcut-settings"],setup(e,{expose:t,emit:a}){const r=e,i=a,o=n.ref((()=>{try{return localStorage.getItem(Qf)==="compact"?"compact":"comfortable"}catch{return"comfortable"}})());n.onMounted(()=>i("update:density",o.value));function s(){o.value=o.value==="compact"?"comfortable":"compact";try{localStorage.setItem(Qf,o.value)}catch{}i("update:density",o.value)}const{t:l}=zt(()=>r.locale),c=n.ref(null),d=n.ref(r.searchQuery);n.watch(()=>r.searchQuery,O=>{d.value=O});let u;function p(O){const P=O.target.value;d.value=P,u&&clearTimeout(u),u=setTimeout(()=>i("update:searchQuery",P),200)}async function f(){var O,P;r.narrow&&!C.value&&(C.value=!0,await n.nextTick()),(O=c.value)==null||O.focus(),(P=c.value)==null||P.select()}t({focusSearch:f});const h=n.computed(()=>r.selectionMode??"none"),_=n.computed(()=>r.actions.filter(O=>!O.divider&&!O.hidden)),b=n.ref(null),k=n.ref(null),m=n.ref(null),v=n.ref(null),g=n.ref(Number.MAX_SAFE_INTEGER),y=n.computed(()=>_.value.slice(0,g.value)),S=n.computed(()=>_.value.slice(g.value));function x(){if(r.narrow)return;const O=b.value,P=k.value;if(!O||!P){g.value=_.value.length;return}const K=parseFloat(getComputedStyle(O).gap)||8;let J=0;for(const _e of Array.from(O.children))_e===P||_e===m.value||_e.classList.contains("fe-btn--fold")||_e.offsetWidth>0&&(J+=_e.offsetWidth+K);const de=Array.from(P.children).map(_e=>_e.offsetWidth+K),xe=de.reduce((_e,Ce)=>_e+Ce,0),ke=O.clientWidth-J;if(xe<=ke){g.value=de.length;return}let ae=l4+K,be=0;for(const _e of de){if(ae+_e>ke)break;ae+=_e,be+=1}g.value=be}let N;n.onMounted(()=>{typeof ResizeObserver<"u"&&b.value&&(N=new ResizeObserver(()=>x()),N.observe(b.value)),n.nextTick(x)}),n.onBeforeUnmount(()=>N==null?void 0:N.disconnect()),n.watch(()=>[_.value,r.narrow,r.trashActive,h.value],()=>void n.nextTick(x),{deep:!1});function w(){var P,K;const O=(P=m.value)==null?void 0:P.getBoundingClientRect();(K=v.value)==null||K.show({clientX:O?O.right:0,clientY:O?O.bottom+4:0},[])}function E(O){i("action",O)}const C=n.ref(!1);n.watch(()=>r.narrow,O=>{O||(C.value=!1)});async function A(){var O;C.value=!0,await n.nextTick(),(O=c.value)==null||O.focus()}function L(){C.value=!1}const R=n.ref(!1);let $;function Y(O){R.value=!!(O&&"matches"in O&&O.matches)}n.onMounted(()=>{var O;typeof window>"u"||!window.matchMedia||($=window.matchMedia("(pointer: coarse)"),Y($),(O=$.addEventListener)==null||O.call($,"change",Y))}),n.onBeforeUnmount(()=>{var O;(O=$==null?void 0:$.removeEventListener)==null||O.call($,"change",Y)});const F=n.ref(null),q=n.ref(null),X=n.computed(()=>{const O=[],P=!r.trashActive&&!r.atVirtualRoot&&r.canWrite!==!1;return h.value==="none"&&P&&(O.push({key:"new-folder",label:l("toolbar.new_folder"),icon:"📁"}),r.pasteEnabled&&O.push({key:"paste",label:l("ctx.paste"),icon:"📋"})),O.push(..._.value),O.length&&O.push({divider:!0,key:"bag-sep",label:""}),O.push({key:"refresh",label:l("toolbar.refresh"),icon:"↻"}),O.push({key:"density",label:o.value==="compact"?l("toolbar.density.comfortable"):l("toolbar.density.compact"),icon:"⇅"}),r.viewMode!=="list"&&O.push({key:"view-list",label:l("toolbar.view.list"),icon:"☰"}),r.viewMode!=="grid"&&O.push({key:"view-grid",label:l("toolbar.view.grid"),icon:"▦"}),r.viewMode!=="gallery"&&O.push({key:"view-gallery",label:l("toolbar.view.gallery"),icon:"▣"}),O.push({key:"inspector",label:l("toolbar.inspector"),icon:"ℹ"}),O.push({key:"theme",label:l("theme.menu"),icon:"🎨"}),O.push({key:"shortcut-settings",label:l("shortcuts.settings.menu"),icon:"⌨"}),O.push({key:"tour",label:l("tour.restart"),icon:"🎓"}),O});function z(){var P,K;const O=(P=F.value)==null?void 0:P.getBoundingClientRect();(K=q.value)==null||K.show({clientX:O?O.right:0,clientY:O?O.bottom+4:0},[])}function H(O){var P;switch(O.key){case"new-folder":i("new-folder");break;case"refresh":i("refresh");break;case"density":s();break;case"view-list":i("update:viewMode","list");break;case"view-grid":i("update:viewMode","grid");break;case"view-gallery":i("update:viewMode","gallery");break;case"inspector":i("toggle-inspector");break;case"theme":i("open-theme");break;case"shortcut-settings":i("open-shortcut-settings");break;case"tour":(P=F.value)==null||P.dispatchEvent(new CustomEvent("fe:tour-restart",{bubbles:!0}));break;default:E(O.key)}}return(O,P)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-toolbar",{"fe-toolbar--narrow":e.narrow,"fe-toolbar--searching":e.narrow&&C.value}])},[e.narrow?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[C.value?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",t4,[n.createElementVNode("input",{ref_key:"searchEl",ref:c,type:"search",class:"fe-search__input",placeholder:n.unref(l)("toolbar.search.placeholder"),value:d.value,"aria-label":n.unref(l)("toolbar.search"),onInput:p,onKeydown:n.withKeys(n.withModifiers(L,["stop","prevent"]),["esc"])},null,40,n4)]),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.search.close"),"aria-label":n.unref(l)("toolbar.search.close"),onClick:L},[...P[27]||(P[27]=[n.createElementVNode("span",{class:"fe-icon"},"✕",-1)])],8,a4)],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[e.canGoUp?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.go_up"),"aria-label":n.unref(l)("toolbar.go_up"),onClick:P[10]||(P[10]=K=>i("go-up"))},[...P[28]||(P[28]=[n.createElementVNode("span",{class:"fe-icon"},"↑",-1)])],8,r4)):n.createCommentVNode("",!0),P[32]||(P[32]=n.createElementVNode("div",{class:"fe-toolbar__spacer"},null,-1)),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only fe-toolbar__search-toggle",{"is-active":!!d.value}]),title:n.unref(l)("toolbar.search"),"aria-label":n.unref(l)("toolbar.search"),onClick:A},[...P[29]||(P[29]=[n.createElementVNode("span",{class:"fe-icon"},"🔍",-1)])],10,i4),!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.upload"),"aria-label":n.unref(l)("toolbar.upload"),onClick:P[11]||(P[11]=K=>i("upload"))},[...P[30]||(P[30]=[n.createElementVNode("span",{class:"fe-icon"},"⬆",-1)])],8,o4)):n.createCommentVNode("",!0),n.createElementVNode("button",{ref_key:"moreBtnEl",ref:F,type:"button",class:"fe-btn fe-btn--icon-only fe-toolbar__more",title:n.unref(l)("toolbar.more"),"aria-label":n.unref(l)("toolbar.more"),"aria-haspopup":"menu",onClick:z},[...P[31]||(P[31]=[n.createElementVNode("span",{class:"fe-icon"},"⋯",-1)])],8,s4)],64)),n.createVNode(Ac,{ref_key:"moreRef",ref:q,locale:e.locale,theme:e.theme||"auto",sheet:R.value,actions:X.value,onSelect:H},null,8,["locale","theme","sheet","actions"])],64)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",{ref_key:"primaryEl",ref:b,class:"fe-toolbar__primary"},[e.canGoUp?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.go_up"),"aria-label":n.unref(l)("toolbar.go_up"),onClick:P[0]||(P[0]=K=>i("go-up"))},[...P[13]||(P[13]=[n.createElementVNode("span",{class:"fe-icon"},"↑",-1)])],8,B_)):n.createCommentVNode("",!0),h.value==="none"&&!e.trashActive&&!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-btn--primary",title:n.unref(l)("toolbar.new_folder"),onClick:P[1]||(P[1]=K=>i("new-folder"))},[P[14]||(P[14]=n.createElementVNode("span",{class:"fe-icon"},"📁",-1)),n.createElementVNode("span",M_,n.toDisplayString(n.unref(l)("toolbar.new_folder")),1)],8,A_)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(y.value,K=>(n.openBlock(),n.createElementBlock("button",{key:K.key,type:"button",class:n.normalizeClass(["fe-btn fe-btn--fold",{"fe-btn--danger":K.danger,"is-disabled":K.disabled}]),disabled:K.disabled,title:K.label,onClick:J=>E(K.key)},[n.createElementVNode("span",I_,n.toDisplayString(K.icon),1),n.createElementVNode("span",R_,n.toDisplayString(K.label),1)],10,O_))),128)),S.value.length>0?(n.openBlock(),n.createElementBlock("button",{key:2,ref_key:"wideMoreBtnEl",ref:m,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.more"),"aria-label":n.unref(l)("toolbar.more"),"aria-haspopup":"menu",onClick:w},[...P[15]||(P[15]=[n.createElementVNode("span",{class:"fe-icon"},"⋯",-1)])],8,L_)):n.createCommentVNode("",!0),n.createElementVNode("div",{ref_key:"measureEl",ref:k,class:"fe-toolbar__measure","aria-hidden":"true"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(_.value,K=>(n.openBlock(),n.createElementBlock("button",{key:"m-"+K.key,type:"button",class:"fe-btn",tabindex:"-1"},[n.createElementVNode("span",z_,n.toDisplayString(K.icon),1),n.createElementVNode("span",F_,n.toDisplayString(K.label),1)]))),128))],512),e.pasteEnabled&&h.value==="none"&&!e.trashActive&&!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:3,type:"button",class:"fe-btn",title:n.unref(l)("ctx.paste"),onClick:P[2]||(P[2]=K=>E("paste"))},[P[16]||(P[16]=n.createElementVNode("span",{class:"fe-icon"},"📋",-1)),n.createElementVNode("span",$_,n.toDisplayString(n.unref(l)("ctx.paste")),1)],8,P_)):n.createCommentVNode("",!0)],512),P[26]||(P[26]=n.createElementVNode("div",{class:"fe-toolbar__spacer"},null,-1)),n.createElementVNode("div",V_,[n.createElementVNode("div",U_,[n.createElementVNode("input",{ref_key:"searchEl",ref:c,type:"search",class:"fe-search__input",placeholder:n.unref(l)("toolbar.search.placeholder"),value:d.value,"aria-label":n.unref(l)("toolbar.search"),onInput:p},null,40,H_)]),!e.atVirtualRoot&&e.canWrite!==!1?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.upload"),"aria-label":n.unref(l)("toolbar.upload"),onClick:P[3]||(P[3]=K=>i("upload"))},[...P[17]||(P[17]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"⬆",-1)])],8,G_)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--icon-only",title:n.unref(l)("toolbar.refresh"),"aria-label":n.unref(l)("toolbar.refresh"),onClick:P[4]||(P[4]=K=>i("refresh"))},[...P[18]||(P[18]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"↻",-1)])],8,K_)]),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only fe-toolbar__density",{"is-active":o.value==="compact"}]),"aria-pressed":o.value==="compact","aria-label":o.value==="compact"?n.unref(l)("toolbar.density.comfortable"):n.unref(l)("toolbar.density.compact"),title:o.value==="compact"?n.unref(l)("toolbar.density.comfortable"):n.unref(l)("toolbar.density.compact"),onClick:s},[o.value==="compact"?(n.openBlock(),n.createElementBlock("svg",W_,[...P[19]||(P[19]=[n.createElementVNode("path",{d:"M4 6.5h16M4 10.5h16M4 14.5h16M4 18.5h16"},null,-1)])])):(n.openBlock(),n.createElementBlock("svg",j_,[...P[20]||(P[20]=[n.createElementVNode("path",{d:"M4 5.5h16M4 12h16M4 18.5h16"},null,-1)])]))],10,q_),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only fe-toolbar__inspector",{"is-active":e.inspectorOpen}]),"aria-pressed":!!e.inspectorOpen,title:n.unref(l)("toolbar.inspector"),"aria-label":n.unref(l)("toolbar.inspector"),onClick:P[5]||(P[5]=K=>i("toggle-inspector"))},[...P[21]||(P[21]=[n.createElementVNode("svg",{class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","aria-hidden":"true",focusable:"false"},[n.createElementVNode("circle",{cx:"12",cy:"12",r:"9"}),n.createElementVNode("path",{d:"M12 11v5"}),n.createElementVNode("circle",{cx:"12",cy:"7.6",r:"1",fill:"currentColor",stroke:"none"})],-1)])],10,Y_),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--icon-only fe-toolbar__theme",title:n.unref(l)("theme.menu"),"aria-label":n.unref(l)("theme.menu"),onClick:P[6]||(P[6]=K=>i("open-theme"))},[...P[22]||(P[22]=[n.createElementVNode("svg",{class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},[n.createElementVNode("path",{d:"M12 3a9 9 0 1 0 0 18h1.4a2.1 2.1 0 0 0 1.5-3.6 2.1 2.1 0 0 1 1.5-3.6H19a2 2 0 0 0 2-2A9 9 0 0 0 12 3z"}),n.createElementVNode("circle",{cx:"7.8",cy:"10.2",r:"1.15",fill:"currentColor",stroke:"none"}),n.createElementVNode("circle",{cx:"11.6",cy:"7.2",r:"1.15",fill:"currentColor",stroke:"none"}),n.createElementVNode("circle",{cx:"16",cy:"8.6",r:"1.15",fill:"currentColor",stroke:"none"})],-1)])],8,X_),n.createElementVNode("div",{class:"fe-toolbar__view",role:"tablist","aria-label":n.unref(l)("toolbar.view_label")},[n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only",{"is-active":e.viewMode==="list"}]),role:"tab","aria-selected":e.viewMode==="list",title:n.unref(l)("toolbar.view.list"),"aria-label":n.unref(l)("toolbar.view.list"),onClick:P[7]||(P[7]=K=>i("update:viewMode","list"))},[...P[23]||(P[23]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"☰",-1)])],10,J_),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only",{"is-active":e.viewMode==="grid"}]),role:"tab","aria-selected":e.viewMode==="grid",title:n.unref(l)("toolbar.view.grid"),"aria-label":n.unref(l)("toolbar.view.grid"),onClick:P[8]||(P[8]=K=>i("update:viewMode","grid"))},[...P[24]||(P[24]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"▦",-1)])],10,Q_),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-btn fe-btn--icon-only",{"is-active":e.viewMode==="gallery"}]),role:"tab","aria-selected":e.viewMode==="gallery",title:n.unref(l)("toolbar.view.gallery"),"aria-label":n.unref(l)("toolbar.view.gallery"),onClick:P[9]||(P[9]=K=>i("update:viewMode","gallery"))},[...P[25]||(P[25]=[n.createElementVNode("span",{class:"fe-icon","aria-hidden":"true"},"▣",-1)])],10,e4)],8,Z_)],64)),e.narrow?n.createCommentVNode("",!0):(n.openBlock(),n.createBlock(Ac,{key:2,ref_key:"wideMoreRef",ref:v,locale:e.locale,theme:e.theme||"auto",sheet:!1,actions:S.value,onSelect:P[12]||(P[12]=K=>E(K.key))},null,8,["locale","theme","actions"]))],2))}}),d4=["onClick"],ep=n.defineComponent({__name:"TagPicker",props:{nodeId:{},apiBase:{},authHeaders:{type:Function},authCredentials:{},palette:{}},emits:["change","error"],setup(e,{emit:t}){const a=e,r=t,i=n.ref([]),o=n.ref(!1),s=n.ref(!1),l=n.ref(""),c=n.computed(()=>a.palette??["#ef4444","#f59e0b","#10b981","#3b82f6","#8b5cf6","#ec4899","#14b8a6","#f97316"]);function d(b){let k=0;for(let v=0;v<b.length;v++)k=k*31+b.charCodeAt(v)|0;const m=c.value;return m[Math.abs(k)%m.length]}async function u(b={}){return{...await(a.authHeaders??(()=>({})))(),...b}}async function p(){o.value=!0;try{const b=a.apiBase??"",k=await fetch(`${b}/api/files/manager/tags?node_id=${a.nodeId}`,{headers:await u(),credentials:a.authCredentials??"same-origin"});if(k.ok){const m=await k.json();i.value=Array.isArray(m.tags)?m.tags:[]}}catch(b){r("error",b instanceof Error?b.message:String(b))}finally{o.value=!1}}async function f(b){const k=[...i.value];i.value=b;try{const m=a.apiBase??"",v=await fetch(`${m}/api/files/manager/tags`,{method:"POST",headers:await u({"Content-Type":"application/json"}),credentials:a.authCredentials??"same-origin",body:JSON.stringify({node_id:a.nodeId,tags:b})});if(!v.ok)throw new Error(`tag save failed: ${v.status}`);r("change",b)}catch(m){i.value=k,r("error",m instanceof Error?m.message:String(m))}}function h(){const b=l.value.trim();if(!b||i.value.includes(b)){l.value="",s.value=!1;return}f([...i.value,b]),l.value="",s.value=!1}function _(b){f(i.value.filter(k=>k!==b))}return n.onMounted(p),n.watch(()=>a.nodeId,p),(b,k)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["filex-tag-picker",{"is-loading":o.value}])},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.value,m=>(n.openBlock(),n.createElementBlock("span",{key:m,class:"filex-tag",style:n.normalizeStyle({"--filex-tag-color":d(m)})},[n.createTextVNode(n.toDisplayString(m)+" ",1),n.createElementVNode("button",{class:"filex-tag-x",type:"button",onClick:v=>_(m),"aria-label":"Remove tag"},"×",8,d4)],4))),128)),s.value?(n.openBlock(),n.createElementBlock("form",{key:0,class:"filex-tag-add",onSubmit:n.withModifiers(h,["prevent"])},[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":k[0]||(k[0]=m=>l.value=m),autofocus:"",placeholder:"tag name",onBlur:h,onKeydown:k[1]||(k[1]=n.withKeys(m=>{s.value=!1,l.value=""},["escape"]))},null,544),[[n.vModelText,l.value]])],32)):(n.openBlock(),n.createElementBlock("button",{key:1,class:"filex-tag-add-btn",type:"button",onClick:k[2]||(k[2]=m=>s.value=!0)},"+ Add tag"))],2))}}),u4={class:"filex-recent"},f4=["disabled"],p4={key:0},h4=["onClick"],m4={class:"filex-recent-name"},g4={class:"filex-recent-meta"},b4={key:1,class:"filex-recent-empty"},y4={key:2,class:"filex-recent-empty"},tp=n.defineComponent({__name:"RecentlyOpened",props:{apiBase:{},authHeaders:{type:Function},authCredentials:{},limit:{},refreshKey:{}},emits:["open","error"],setup(e,{emit:t}){const a=e,r=t,i=n.ref([]),o=n.ref(!1);async function s(){o.value=!0;try{const c=await(a.authHeaders??(()=>({})))(),d=a.apiBase??"",u=a.limit??20,p=await fetch(`${d}/api/files/manager/recent?limit=${u}`,{headers:c,credentials:a.authCredentials??"same-origin"});if(p.ok){const f=await p.json();i.value=Array.isArray(f.entries)?f.entries:Array.isArray(f)?f:[]}}catch(c){r("error",c instanceof Error?c.message:String(c))}finally{o.value=!1}}function l(c){if(!c)return"";const d=new Date(c).getTime();if(Number.isNaN(d))return"";const u=Date.now()-d;return u<6e4?"just now":u<36e5?`${Math.floor(u/6e4)}m ago`:u<864e5?`${Math.floor(u/36e5)}h ago`:`${Math.floor(u/864e5)}d ago`}return n.onMounted(s),n.watch(()=>a.refreshKey,s),(c,d)=>(n.openBlock(),n.createElementBlock("div",u4,[n.createElementVNode("header",null,[d[0]||(d[0]=n.createElementVNode("h3",null,"Recently opened",-1)),n.createElementVNode("button",{class:"filex-recent-refresh",type:"button",onClick:s,disabled:o.value}," ↻ ",8,f4)]),i.value.length?(n.openBlock(),n.createElementBlock("ul",p4,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(i.value,u=>(n.openBlock(),n.createElementBlock("li",{key:u.id},[n.createElementVNode("button",{type:"button",onClick:p=>r("open",u),class:"filex-recent-item"},[n.createElementVNode("span",m4,n.toDisplayString(u.name),1),n.createElementVNode("span",g4,n.toDisplayString(l(u.last_opened)),1)],8,h4)]))),128))])):o.value?(n.openBlock(),n.createElementBlock("p",y4,"Loading…")):(n.openBlock(),n.createElementBlock("p",b4,"Nothing here yet."))]))}}),np="application/x-brf-files",v4="application/x-brf-files-src";let li=null;const k4=5*6e4;function _4(e,t){li={items:e.slice(),origin:t,startedAt:Date.now()}}function ci(){li=null}function co(){return li?Date.now()-li.startedAt>k4?(li=null,null):li:null}function ta(e){var t;return(t=e.dataTransfer)!=null&&t.types.includes(np)?!0:co()!==null}function ks(e){var r;const t=(r=e.dataTransfer)==null?void 0:r.getData(np);if(t)try{const i=JSON.parse(t);return Array.isArray(i)&&i.length>0?i:null}catch{return null}const a=co();return a&&a.items.length>0?a.items:null}function Mc(e){var a,r;const t=(a=e.dataTransfer)==null?void 0:a.getData(v4);return t||((r=co())==null?void 0:r.origin)||void 0}function w4(e){const t=E4(e);return t===void 0||t==="none"||t==="csrf"}function E4(e){if(!e||typeof e!="object")return;const t=e;return typeof t.kind=="string"?t.kind:typeof t.type=="string"?t.type:void 0}function S4(e,t,a){if(e.type!=="file")return null;let r=t;try{r=new URL(t,typeof location<"u"?location.href:void 0).toString()}catch{return null}if(!/^https?:/i.test(r))return null;const i=e.basename.replace(/[:\r\n]/g,"_");return`${a&&a.trim()?a:"application/octet-stream"}:${i}:${r}`}function x4(e){return e.map(t=>t.path).sort().join("\0")}const C4={class:"fe-breadcrumb","aria-label":"Breadcrumb"},N4=["aria-current","onClick","onContextmenu","onDrop"],T4={key:0,class:"fe-breadcrumb__sep","aria-hidden":"true"},D4=["aria-expanded","aria-label","title"],B4={key:0,class:"fe-breadcrumb__menu",role:"menu"},A4=["onClick"],M4=["aria-current","onClick","onContextmenu","onDrop"],O4={key:0,class:"fe-breadcrumb__sep","aria-hidden":"true"},I4=["title","aria-label"],R4=["placeholder","onKeydown"],L4=4,z4=n.defineComponent({__name:"Breadcrumb",props:{dirname:{},adapter:{},rootLabel:{},locale:{},multiStorageRoot:{type:Boolean},rootPath:{}},emits:["navigate","copy-path","crumb-context","crumb-drop"],setup(e,{emit:t}){const a=e,r=n.computed(()=>{if(!a.rootPath)return"";const A=a.rootPath,L=A.indexOf("://");return(L>=0?A.slice(L+3):A).replace(/^\/+|\/+$/g,"")}),i=n.computed(()=>{const A=r.value;if(!A)return a.rootLabel||a.adapter;const L=A.split("/");return L[L.length-1]||a.rootLabel||a.adapter}),{t:o}=zt(()=>a.locale),s=t,l=n.computed(()=>{const A=`${a.adapter}://`,L=a.dirname.startsWith(A)?a.dirname.slice(A.length):a.dirname,R=L.split("/").filter(Boolean),$=[];if(a.rootPath){const F=r.value,q=L.replace(/^\/+|\/+$/g,""),X=F&&(q===F||q.startsWith(F+"/"))?q.slice(F.length).replace(/^\/+/,""):"";$.push({label:i.value,adapterPath:a.rootPath});let z=F;for(const H of X.split("/").filter(Boolean))z=z?`${z}/${H}`:H,$.push({label:H===".trash"?o("node.trash"):H,adapterPath:`${A}${z}`});return $}a.multiStorageRoot?($.push({label:"/",adapterPath:""}),a.adapter&&$.push({label:a.rootLabel||a.adapter,adapterPath:A})):$.push({label:a.rootLabel||a.adapter,adapterPath:A});let Y="";for(const F of R){Y=Y?`${Y}/${F}`:F;const q=F===".trash"?o("node.trash"):F;$.push({label:q,adapterPath:`${A}${Y}`})}return $}),c=n.computed(()=>l.value.length>L4),d=n.computed(()=>c.value?l.value.slice(0,1):l.value),u=n.computed(()=>c.value?l.value.slice(1,-2):[]),p=n.computed(()=>c.value?l.value.slice(-2):[]),f=n.ref(!1),h=n.ref(null);function _(A){f.value=!1,s("navigate",A.adapterPath)}function b(A){const L=h.value;L&&A.target instanceof Node&&L.contains(A.target)||(f.value=!1)}function k(A){A.key==="Escape"&&(A.stopPropagation(),f.value=!1)}n.watch(f,A=>{A?(document.addEventListener("click",b,!0),document.addEventListener("keydown",k,!0)):(document.removeEventListener("click",b,!0),document.removeEventListener("keydown",k,!0))}),n.watch(l,()=>{f.value=!1}),n.onBeforeUnmount(()=>{document.removeEventListener("click",b,!0),document.removeEventListener("keydown",k,!0)});function m(A){s("navigate",A.adapterPath)}function v(A,L){A.preventDefault(),A.stopPropagation(),s("crumb-context",{x:A.clientX,y:A.clientY,adapterPath:L.adapterPath,label:L.label})}function g(A){ta(A)&&(A.preventDefault(),A.stopPropagation(),A.dataTransfer&&(A.dataTransfer.dropEffect="move"))}function y(A,L){ta(A)&&(A.preventDefault(),A.stopPropagation(),s("crumb-drop",L.adapterPath,A))}const S=n.ref(!1),x=n.ref(""),N=n.ref(null);function w(){const A=`${a.adapter}://`,L=a.dirname.startsWith(A)?a.dirname.slice(A.length):a.dirname;if(a.rootPath){const R=r.value,$=L.replace(/^\/+|\/+$/g,""),Y=R&&($===R||$.startsWith(R+"/"))?$.slice(R.length).replace(/^\/+/,""):"";x.value=Y?`/${Y}`:"/",S.value=!0,n.nextTick(()=>{var F,q;(F=N.value)==null||F.focus(),(q=N.value)==null||q.select()});return}if(a.multiStorageRoot)if(!a.adapter)x.value="/";else{const R=L.replace(/^\/+|\/+$/g,"");x.value=R?`/${a.adapter}/${R}`:`/${a.adapter}`}else x.value=L;S.value=!0,n.nextTick(()=>{var R,$;(R=N.value)==null||R.focus(),($=N.value)==null||$.select()})}function E(){const A=x.value.trim();if(S.value=!1,a.rootPath){const R=A.replace(/^\/+|\/+$/g,""),$=r.value,Y=R?$?`${$}/${R}`:R:$;s("navigate",Y?`${a.adapter}://${Y}`:`${a.adapter}://`);return}if(a.multiStorageRoot){const R=A.replace(/^\/+|\/+$/g,"");if(!R){s("navigate","");return}const $=R.indexOf("/"),Y=$===-1?R:R.slice(0,$),F=$===-1?"":R.slice($+1);s("navigate",F?`${Y}://${F}`:`${Y}://`);return}const L=A.replace(/^\/+|\/+$/g,"");L&&s("navigate",`${a.adapter}://${L}`)}function C(){S.value=!1}return(A,L)=>(n.openBlock(),n.createElementBlock("nav",C4,[S.value?n.withDirectives((n.openBlock(),n.createElementBlock("input",{key:1,ref_key:"pathInput",ref:N,"onUpdate:modelValue":L[1]||(L[1]=R=>x.value=R),type:"text",class:"fe-breadcrumb__input",placeholder:n.unref(o)("breadcrumb.path_placeholder"),spellcheck:"false",autocomplete:"off",onKeydown:[n.withKeys(n.withModifiers(E,["prevent"]),["enter"]),n.withKeys(n.withModifiers(C,["prevent"]),["escape"])],onBlur:C},null,40,R4)),[[n.vModelText,x.value]]):(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d.value,(R,$)=>(n.openBlock(),n.createElementBlock("button",{key:R.adapterPath,class:n.normalizeClass(["fe-breadcrumb__crumb",{"is-last":!c.value&&$===d.value.length-1}]),type:"button","aria-current":!c.value&&$===d.value.length-1?"page":void 0,onClick:Y=>m(R),onContextmenu:Y=>v(Y,R),onDragover:g,onDrop:Y=>y(Y,R)},[n.createElementVNode("span",null,n.toDisplayString(R.label),1),c.value||$<d.value.length-1?(n.openBlock(),n.createElementBlock("span",T4,"›")):n.createCommentVNode("",!0)],42,N4))),128)),u.value.length?(n.openBlock(),n.createElementBlock("span",{key:0,ref_key:"moreWrapEl",ref:h,class:"fe-breadcrumb__more-wrap"},[n.createElementVNode("button",{type:"button",class:"fe-breadcrumb__more","aria-haspopup":"menu","aria-expanded":f.value,"aria-label":n.unref(o)("breadcrumb.more"),title:n.unref(o)("breadcrumb.more"),onClick:L[0]||(L[0]=R=>f.value=!f.value)},"…",8,D4),L[2]||(L[2]=n.createElementVNode("span",{class:"fe-breadcrumb__sep","aria-hidden":"true"},"›",-1)),f.value?(n.openBlock(),n.createElementBlock("div",B4,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(u.value,R=>(n.openBlock(),n.createElementBlock("button",{key:R.adapterPath,type:"button",class:"fe-breadcrumb__menu-item",role:"menuitem",onClick:$=>_(R)},n.toDisplayString(R.label),9,A4))),128))])):n.createCommentVNode("",!0)],512)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(p.value,(R,$)=>(n.openBlock(),n.createElementBlock("button",{key:R.adapterPath,class:n.normalizeClass(["fe-breadcrumb__crumb",{"is-last":$===p.value.length-1}]),type:"button","aria-current":$===p.value.length-1?"page":void 0,onClick:Y=>m(R),onContextmenu:Y=>v(Y,R),onDragover:g,onDrop:Y=>y(Y,R)},[n.createElementVNode("span",null,n.toDisplayString(R.label),1),$<p.value.length-1?(n.openBlock(),n.createElementBlock("span",O4,"›")):n.createCommentVNode("",!0)],42,M4))),128)),n.createElementVNode("button",{type:"button",class:"fe-breadcrumb__edit",title:n.unref(o)("breadcrumb.go_to_path"),"aria-label":n.unref(o)("breadcrumb.go_to_path"),onClick:w},"✏",8,I4)],64))]))}}),ap={};function Ca(e,t){for(const a of t)ap[a]=e}Ca("image",["jpg","jpeg","png","webp","gif","bmp","avif","heic","svg","ico","tiff","tif"]),Ca("video",["mp4","webm","mov","mkv","avi","ogv","m4v"]),Ca("audio",["mp3","wav","flac","ogg","m4a","aac","opus"]),Ca("pdf",["pdf"]),Ca("doc",["doc","docx","odt","rtf"]),Ca("sheet",["xls","xlsx","ods","csv"]),Ca("slides",["ppt","pptx","odp"]),Ca("archive",["zip","tar","gz","bz2","7z","rar","xz","zst"]),Ca("code",["js","ts","jsx","tsx","mjs","cjs","vue","py","go","rs","php","rb","java","kt","swift","c","cpp","h","hpp","cs","css","scss","less","html","htm","json","yml","yaml","xml","sh","bash","ps1","sql","toml"]),Ca("text",["txt","md","markdown","log","ini","conf","cfg","env"]);function F4(e){if(e.type==="dir")return"folder";const t=(e.extension||"").toLowerCase();return ap[t]??"unknown"}const dr='<path d="M6.5 3h7L18.5 8v11.5a1.5 1.5 0 0 1-1.5 1.5H6.5A1.5 1.5 0 0 1 5 19.5v-15A1.5 1.5 0 0 1 6.5 3z"/><path d="M13.5 3v5h5"/>',P4={folder:'<path d="M3 7a2 2 0 0 1 2-2h4.2l2 2.4H19a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" fill="currentColor" fill-opacity="0.14"/>',image:'<rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="8.6" cy="10" r="1.6"/><path d="M5.2 16.6l4.3-4.3 3 3 2.4-2.4 3.9 3.7"/>',video:'<rect x="3" y="5" width="18" height="14" rx="2"/><path d="M10.2 9.3v5.4l4.8-2.7z" fill="currentColor" stroke="none"/>',audio:'<path d="M9 17.5V7.2l9-2.2v10.4"/><circle cx="6.8" cy="17.6" r="2.2"/><circle cx="15.8" cy="15.5" r="2.2"/>',pdf:dr+'<rect x="7.5" y="12" width="9" height="5" rx="1" fill="currentColor" fill-opacity="0.14"/>',doc:dr+'<path d="M8.5 13h7M8.5 16h7"/>',sheet:dr+'<path d="M8 12.5h8M8 15.5h8M8 18h8M12 12.5V18"/>',slides:dr+'<rect x="8" y="12.5" width="8" height="5" rx="0.8"/>',archive:dr+'<path d="M10 3v1.6M10 6.6v1.6M10 10.2v1.6"/><rect x="8.6" y="14" width="2.8" height="3.4" rx="0.8"/>',code:dr+'<path d="M10.4 12.5L8.3 15l2.1 2.5M13.6 12.5l2.1 2.5-2.1 2.5"/>',text:dr+'<path d="M8.5 12h7M8.5 15h7M8.5 18h4.5"/>',unknown:dr+'<path d="M10.3 13.1a1.8 1.8 0 1 1 2.5 1.9c-.6.3-.8.7-.8 1.4"/><circle cx="12" cy="18.4" r="0.9" fill="currentColor" stroke="none"/>'},rp=new Map;function $4(e){let t=rp.get(e);return t||(t=`<svg class="fe-ficon fe-ficon--${e}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">${P4[e]}</svg>`,rp.set(e,t)),t}function di(e){return $4(F4(e))}function uo(e){const t=[];if(!e)return t;const a=/«([^«»]*)»/g;let r=0,i;for(;(i=a.exec(e))!==null;)i.index>r&&t.push({text:e.slice(r,i.index),match:!1}),i[1]&&t.push({text:i[1],match:!0}),r=i.index+i[0].length;return r<e.length&&t.push({text:e.slice(r),match:!1}),t}function Oc(e){return e==="content"||e==="both"}function Ic(e,t,a){const r=e.dataTransfer;if(!(!r||typeof document>"u"||typeof r.setDragImage!="function"))try{const i=document.createElement("div");i.className="fe-dragghost";const o=document.createElement("span");if(o.className="fe-dragghost__name",o.textContent=t,i.appendChild(o),a>1){const s=document.createElement("span");s.className="fe-dragghost__badge",s.textContent=String(a),i.appendChild(s)}i.style.position="fixed",i.style.top="-1000px",i.style.left="-1000px",document.body.appendChild(i),r.setDragImage(i,14,14),setTimeout(()=>i.remove(),0)}catch{}}const V4=["aria-pressed","title"],U4={viewBox:"0 0 24 24",width:"16",height:"16","aria-hidden":"true"},H4=["fill"],G4={key:0,class:"filex-star-label"},ip=n.defineComponent({__name:"StarButton",props:{starred:{type:Boolean},nodeId:{},apiBase:{},authHeaders:{type:Function},authCredentials:{},compact:{type:Boolean}},emits:["change","error"],setup(e,{emit:t}){const a=e,r=t,i=n.ref(a.starred);n.watch(()=>a.starred,s=>{i.value=s});async function o(){const s=!i.value;i.value=s;try{const l={"Content-Type":"application/json",...await(a.authHeaders??(()=>({})))()},c=a.apiBase??"",d=await fetch(`${c}/api/files/manager/star`,{method:"POST",headers:l,credentials:a.authCredentials??"same-origin",body:JSON.stringify({node_id:a.nodeId,starred:s})});if(!d.ok)throw new Error(`star toggle failed: ${d.status}`);r("change",s)}catch(l){i.value=!s,r("error",l instanceof Error?l.message:String(l))}}return(s,l)=>(n.openBlock(),n.createElementBlock("button",{type:"button",class:n.normalizeClass(["filex-star-btn",{"is-starred":i.value,"is-compact":e.compact}]),"aria-pressed":i.value,title:i.value?"Unstar":"Star",onClick:n.withModifiers(o,["stop"])},[(n.openBlock(),n.createElementBlock("svg",U4,[n.createElementVNode("path",{fill:i.value?"currentColor":"none",stroke:"currentColor","stroke-width":"2","stroke-linejoin":"round",d:"M12 2.5l3.09 6.26 6.91 1-5 4.87 1.18 6.87L12 18.27l-6.18 3.23L7 14.63 2 9.76l6.91-1z"},null,8,H4)])),e.compact?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("span",G4,n.toDisplayString(i.value?"Starred":"Star"),1))],10,V4))}}),K4=["aria-label","aria-busy"],q4={class:"fe-list__head",role:"row"},W4=["aria-label"],j4=["aria-sort"],Y4=["title"],X4={key:0,class:"fe-list__sort-arrow","aria-hidden":"true"},Z4=["aria-sort"],J4=["title"],Q4={key:0,class:"fe-list__sort-arrow","aria-hidden":"true"},e3=["aria-sort"],t3=["title"],n3={key:0,class:"fe-list__sort-arrow","aria-hidden":"true"},a3={class:"fe-list__body",role:"rowgroup"},r3={key:0,class:"fe-list__group",role:"presentation"},i3=["aria-selected","aria-label","data-fe-path","onClick","onDblclick","onContextmenu","onDragstart","onDragover","onDragleave","onDrop","onTouchstartPassive"],o3={class:"fe-list__col fe-list__col--name",role:"gridcell"},s3={key:0,class:"fe-list__icon","aria-hidden":"true"},l3=["innerHTML"],c3={class:"fe-list__name-wrap"},d3=["title"],u3={key:0,class:"fe-list__badge"},f3=["title","aria-label"],p3=["title"],h3={key:1,class:"fe-list__snippet"},m3={key:0,class:"fe-list__mark"},g3={class:"fe-list__col fe-list__col--size",role:"gridcell"},b3={class:"fe-list__col fe-list__col--mod",role:"gridcell"},y3={key:0,class:"fe-list__empty"},op="filex.list-sort",sp=n.defineComponent({__name:"ListView",props:{files:{},selected:{},clipped:{},showParentPath:{type:Boolean},locale:{},loading:{type:Boolean},starredIds:{},apiBase:{},authHeaders:{type:Function},authCredentials:{},keepBadgeFor:{type:Function}},emits:["click-row","dbl-row","context-row","item-drag-start","item-drop-into","star-change"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale);function l(O){return a.selected.has(O.path)}function c(O,P){r("click-row",O,{ctrl:P.ctrlKey||P.metaKey,shift:P.shiftKey})}function d(O){r("dbl-row",O)}function u(O,P){P.preventDefault(),P.stopPropagation(),r("context-row",O,P)}function p(O,P){Ic(P,s(O),a.selected.has(O.path)?a.selected.size:1),r("item-drag-start",O,P)}const f=n.ref(null);function h(O,P){O.type==="dir"&&ta(P)&&(P.preventDefault(),P.stopPropagation(),P.dataTransfer&&(P.dataTransfer.dropEffect="move"),f.value=O.path)}function _(O){f.value===O.path&&(f.value=null)}function b(O,P){f.value=null,O.type==="dir"&&ta(P)&&(P.preventDefault(),P.stopPropagation(),r("item-drop-into",O,P))}let k,m=null;function v(O,P){m=O,k&&clearTimeout(k),k=setTimeout(()=>{if(m){const K=P.touches[0];r("context-row",m,{clientX:K.clientX,clientY:K.clientY,preventDefault:()=>{}})}},500)}function g(){k&&clearTimeout(k),m=null}function y(O){return O.basename===".trash"?"🗑":O.mime_type==="inode/storage"?"💾":O.type==="dir"&&O.e2e===!0?"🔒":null}function S(O){return O==="kept"?"✓":O==="syncing"?"⟳":O==="partial"?"◐":"☁"}function x(O){return O.basename===".trash"||O.mime_type==="inode/storage"}function N(O){return O?new Date(O*(O<1e12?1e3:1)).toLocaleString():"—"}function w(O){const P=O.replace(/^[a-z][a-z0-9+.-]*:\/\//i,""),K=P.lastIndexOf("/");return K===-1?"":P.slice(0,K)}function E(O){const P=O.snippet;return typeof P=="string"?P:""}function C(O){return Oc(O.matched)}const A=n.ref(null),L=n.ref("asc");try{const O=localStorage.getItem(op);if(O){const P=JSON.parse(O);(P.key==="name"||P.key==="size"||P.key==="modified")&&(A.value=P.key),(P.dir==="asc"||P.dir==="desc")&&(L.value=P.dir)}}catch{}function R(O){return O==="modified"?"desc":"asc"}function $(O){A.value!==O?(A.value=O,L.value=R(O)):L.value===R(O)?L.value=L.value==="asc"?"desc":"asc":A.value=null;try{localStorage.setItem(op,JSON.stringify({key:A.value,dir:L.value}))}catch{}}function Y(O){return A.value!==O?"none":L.value==="asc"?"ascending":"descending"}function F(O){const P=O.last_modified;return P?P*(P<1e12?1e3:1):null}const q=n.computed(()=>{const O=A.value;if(!O)return a.files;const P=[],K=[];for(const de of a.files)(x(de)?P:K).push(de);const J=L.value==="asc"?1:-1;return K.sort((de,xe)=>{if(O==="name")return J*de.basename.localeCompare(xe.basename,void 0,{numeric:!0,sensitivity:"base"});if(O==="size")return J*((de.size??-1)-(xe.size??-1));const ke=F(de),ae=F(xe);return ke==null&&ae==null?0:ke==null?1:ae==null?-1:J*(ke-ae)}),[...P,...K]}),X=n.computed(()=>new Intl.DateTimeFormat(a.locale==="tr"?"tr-TR":"en-US",{month:"long",year:"numeric"}));function z(O){if(O==null)return{id:"none",label:i("group.no_date")};const P=new Date(O),K=new Date,J=ae=>new Date(ae.getFullYear(),ae.getMonth(),ae.getDate()).getTime(),de=J(K),xe=J(P),ke=864e5;return xe>=de?{id:"today",label:i("group.today")}:xe===de-ke?{id:"yesterday",label:i("group.yesterday")}:xe>de-7*ke?{id:"week",label:i("group.this_week")}:P.getFullYear()===K.getFullYear()&&P.getMonth()===K.getMonth()?{id:"month",label:i("group.this_month")}:{id:`m-${P.getFullYear()}-${P.getMonth()}`,label:X.value.format(P)}}const H=n.computed(()=>{const O=q.value;if(A.value!=="modified")return[{id:"all",label:null,nodes:O}];const P=[];let K=null;for(const J of O){const de=x(J)?{id:"pinned",label:null}:z(F(J));(!K||K.id!==de.id)&&(K={id:de.id,label:de.label,nodes:[]},P.push(K)),K.nodes.push(J)}return P});return(O,P)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-list",{"is-loading":e.loading,"has-star-col":!!e.apiBase||e.apiBase===""}]),role:"grid","aria-label":n.unref(i)("list.aria"),"aria-busy":e.loading?"true":void 0},[n.createElementVNode("div",q4,[n.createElementVNode("div",{class:"fe-list__col fe-list__col--star",role:"columnheader","aria-label":n.unref(i)("col.star")},null,8,W4),n.createElementVNode("div",{class:"fe-list__col fe-list__col--name",role:"columnheader","aria-sort":Y("name")},[n.createElementVNode("button",{type:"button",class:"fe-list__sort",title:n.unref(i)("col.sort"),onClick:P[0]||(P[0]=K=>$("name"))},[n.createTextVNode(n.toDisplayString(n.unref(i)("col.name"))+" ",1),A.value==="name"?(n.openBlock(),n.createElementBlock("span",X4,n.toDisplayString(L.value==="asc"?"↑":"↓"),1)):n.createCommentVNode("",!0)],8,Y4)],8,j4),n.createElementVNode("div",{class:"fe-list__col fe-list__col--size",role:"columnheader","aria-sort":Y("size")},[n.createElementVNode("button",{type:"button",class:"fe-list__sort",title:n.unref(i)("col.sort"),onClick:P[1]||(P[1]=K=>$("size"))},[n.createTextVNode(n.toDisplayString(n.unref(i)("col.size"))+" ",1),A.value==="size"?(n.openBlock(),n.createElementBlock("span",Q4,n.toDisplayString(L.value==="asc"?"↑":"↓"),1)):n.createCommentVNode("",!0)],8,J4)],8,Z4),n.createElementVNode("div",{class:"fe-list__col fe-list__col--mod",role:"columnheader","aria-sort":Y("modified")},[n.createElementVNode("button",{type:"button",class:"fe-list__sort",title:n.unref(i)("col.sort"),onClick:P[2]||(P[2]=K=>$("modified"))},[n.createTextVNode(n.toDisplayString(n.unref(i)("col.modified"))+" ",1),A.value==="modified"?(n.openBlock(),n.createElementBlock("span",n3,n.toDisplayString(L.value==="asc"?"↑":"↓"),1)):n.createCommentVNode("",!0)],8,t3)],8,e3)]),n.createElementVNode("div",a3,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(H.value,K=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:K.id},[K.label?(n.openBlock(),n.createElementBlock("div",r3,n.toDisplayString(K.label),1)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(K.nodes,J=>{var de,xe;return n.openBlock(),n.createElementBlock("div",{key:J.path,class:n.normalizeClass(["fe-list__row",{"is-selected":l(J),"is-dir":J.type==="dir","is-trash":J.trashed,"is-clipped":(de=e.clipped)==null?void 0:de.has(J.path),"is-droptarget":f.value===J.path}]),role:"row",tabindex:"0","aria-selected":l(J)?"true":"false","aria-label":n.unref(s)(J),"data-fe-path":J.path,draggable:"true",onClick:ke=>c(J,ke),onDblclick:ke=>d(J),onContextmenu:ke=>u(J,ke),onDragstart:ke=>p(J,ke),onDragover:ke=>h(J,ke),onDragleave:ke=>_(J),onDrop:ke=>b(J,ke),onTouchstartPassive:ke=>v(J,ke),onTouchend:g,onTouchmove:g},[n.createElementVNode("div",{class:"fe-list__col fe-list__col--star",role:"gridcell",onClick:P[3]||(P[3]=n.withModifiers(()=>{},["stop"]))},[typeof J.id=="number"&&J.type==="file"?(n.openBlock(),n.createBlock(ip,{key:0,starred:!!((xe=e.starredIds)!=null&&xe.has(J.id)),"node-id":J.id,"api-base":e.apiBase,"auth-headers":e.authHeaders,"auth-credentials":e.authCredentials,compact:"",onChange:ke=>r("star-change",J,ke)},null,8,["starred","node-id","api-base","auth-headers","auth-credentials","onChange"])):n.createCommentVNode("",!0)]),n.createElementVNode("div",o3,[y(J)?(n.openBlock(),n.createElementBlock("span",s3,n.toDisplayString(y(J)),1)):(n.openBlock(),n.createElementBlock("span",{key:1,class:"fe-list__icon fe-list__icon--svg","aria-hidden":"true",innerHTML:n.unref(di)(J)},null,8,l3)),n.createElementVNode("div",c3,[n.createElementVNode("span",{class:"fe-list__name",title:J.basename},[n.createTextVNode(n.toDisplayString(n.unref(s)(J))+" ",1),C(J)?(n.openBlock(),n.createElementBlock("span",u3,n.toDisplayString(n.unref(i)("search.in_content")),1)):n.createCommentVNode("",!0),e.keepBadgeFor&&e.keepBadgeFor(J)?(n.openBlock(),n.createElementBlock("span",{key:1,class:n.normalizeClass(["fe-keepbadge","fe-keepbadge--"+e.keepBadgeFor(J)]),title:n.unref(i)("keep.badge_"+e.keepBadgeFor(J)),role:"img","aria-label":n.unref(i)("keep.badge_"+e.keepBadgeFor(J))},n.toDisplayString(S(e.keepBadgeFor(J))),11,f3)):n.createCommentVNode("",!0)],8,d3),e.showParentPath?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-list__parent",title:w(J.path)},n.toDisplayString(w(J.path)||"—"),9,p3)):n.createCommentVNode("",!0),E(J)?(n.openBlock(),n.createElementBlock("span",h3,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(uo)(E(J)),(ke,ae)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:ae},[ke.match?(n.openBlock(),n.createElementBlock("mark",m3,n.toDisplayString(ke.text),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString(ke.text),1)],64))],64))),128))])):n.createCommentVNode("",!0)])]),n.createElementVNode("div",g3,n.toDisplayString(n.unref(o)(J.size)),1),n.createElementVNode("div",b3,n.toDisplayString(N(J.last_modified)),1)],42,i3)}),128))],64))),128)),!e.loading&&q.value.length===0?(n.openBlock(),n.createElementBlock("div",y3,n.toDisplayString(n.unref(i)("empty.folder")),1)):n.createCommentVNode("",!0)])],10,K4))}}),v3=["aria-label","aria-busy"],k3=["aria-selected","aria-label","data-fe-path","onClick","onDblclick","onContextmenu","onDragstart","onDragover","onDragleave","onDrop","onTouchstartPassive"],_3={class:"fe-grid__thumb"},w3=["src","alt"],E3={key:1,class:"fe-grid__icon"},S3=["innerHTML"],x3=["title"],C3=["title","aria-label"],N3=["title"],T3={class:"fe-grid__meta"},D3=["title"],B3={key:0,class:"fe-grid__mark"},A3={key:0,class:"fe-grid__empty"},lp=n.defineComponent({__name:"GridView",props:{files:{},selected:{},clipped:{},showParentPath:{type:Boolean},locale:{},loading:{type:Boolean},thumbSrc:{type:Function},keepBadgeFor:{type:Function}},emits:["click-card","dbl-card","context-card","item-drag-start","item-drop-into"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale);function l(C){return a.thumbSrc?a.thumbSrc(C):C.thumb_url??null}function c(C){return a.selected.has(C.path)}function d(C,A){r("click-card",C,{ctrl:A.ctrlKey||A.metaKey,shift:A.shiftKey})}function u(C){r("dbl-card",C)}function p(C,A){A.preventDefault(),A.stopPropagation(),r("context-card",C,A)}function f(C,A){Ic(A,s(C),a.selected.has(C.path)?a.selected.size:1),r("item-drag-start",C,A)}const h=n.ref(null);function _(C,A){C.type==="dir"&&ta(A)&&(A.preventDefault(),A.stopPropagation(),A.dataTransfer&&(A.dataTransfer.dropEffect="move"),h.value=C.path)}function b(C){h.value===C.path&&(h.value=null)}function k(C,A){h.value=null,C.type==="dir"&&ta(A)&&(A.preventDefault(),A.stopPropagation(),r("item-drop-into",C,A))}let m,v=null;function g(C,A){v=C,m&&clearTimeout(m),m=setTimeout(()=>{if(v){const L=A.touches[0];r("context-card",v,{clientX:L.clientX,clientY:L.clientY,preventDefault:()=>{}})}},500)}function y(){m&&clearTimeout(m),v=null}function S(C){const A=C.replace(/^[a-z][a-z0-9+.-]*:\/\//i,""),L=A.lastIndexOf("/");return L===-1?"":A.slice(0,L)}function x(C){return C==="kept"?"✓":C==="syncing"?"⟳":C==="partial"?"◐":"☁"}function N(C){return C.basename===".trash"?"🗑":C.mime_type==="inode/storage"?"💾":C.type==="dir"&&C.e2e===!0?"🔒":null}function w(C){const A=C.snippet;return typeof A=="string"?A:""}function E(C){return uo(C).map(A=>A.text).join("")}return(C,A)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-grid",{"is-loading":e.loading}]),role:"listbox","aria-multiselectable":"true","aria-label":n.unref(i)("grid.aria"),"aria-busy":e.loading?"true":void 0},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,L=>{var R;return n.openBlock(),n.createElementBlock("div",{key:L.path,class:n.normalizeClass(["fe-grid__card",{"is-selected":c(L),"is-dir":L.type==="dir","is-trash":L.trashed,"is-clipped":(R=e.clipped)==null?void 0:R.has(L.path),"is-droptarget":h.value===L.path}]),tabindex:"0",role:"option","aria-selected":c(L)?"true":"false","aria-label":n.unref(s)(L),"data-fe-path":L.path,draggable:"true",onClick:$=>d(L,$),onDblclick:$=>u(L),onContextmenu:$=>p(L,$),onDragstart:$=>f(L,$),onDragover:$=>_(L,$),onDragleave:$=>b(L),onDrop:$=>k(L,$),onTouchstartPassive:$=>g(L,$),onTouchend:y,onTouchmove:y},[n.createElementVNode("div",_3,[l(L)?(n.openBlock(),n.createElementBlock("img",{key:0,src:l(L),alt:L.basename,loading:"lazy",draggable:"false"},null,8,w3)):N(L)?(n.openBlock(),n.createElementBlock("span",E3,n.toDisplayString(N(L)),1)):(n.openBlock(),n.createElementBlock("span",{key:2,class:"fe-grid__icon fe-grid__icon--svg",innerHTML:n.unref(di)(L)},null,8,S3))]),n.createElementVNode("div",{class:"fe-grid__label",title:L.basename},[n.createTextVNode(n.toDisplayString(n.unref(s)(L))+" ",1),e.keepBadgeFor&&e.keepBadgeFor(L)?(n.openBlock(),n.createElementBlock("span",{key:0,class:n.normalizeClass(["fe-keepbadge","fe-keepbadge--"+e.keepBadgeFor(L)]),title:n.unref(i)("keep.badge_"+e.keepBadgeFor(L)),role:"img","aria-label":n.unref(i)("keep.badge_"+e.keepBadgeFor(L))},n.toDisplayString(x(e.keepBadgeFor(L))),11,C3)):n.createCommentVNode("",!0)],8,x3),e.showParentPath?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-grid__parent",title:S(L.path)},n.toDisplayString(S(L.path)||"—"),9,N3)):n.createCommentVNode("",!0),n.createElementVNode("div",T3,n.toDisplayString(n.unref(o)(L.size)),1),w(L)?(n.openBlock(),n.createElementBlock("div",{key:1,class:"fe-grid__snippet",title:E(w(L))},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(uo)(w(L)),($,Y)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:Y},[$.match?(n.openBlock(),n.createElementBlock("mark",B3,n.toDisplayString($.text),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString($.text),1)],64))],64))),128))],8,D3)):n.createCommentVNode("",!0)],42,k3)}),128)),!e.loading&&e.files.length===0?(n.openBlock(),n.createElementBlock("div",A3,n.toDisplayString(n.unref(i)("empty.folder")),1)):n.createCommentVNode("",!0)],10,v3))}}),M3=["aria-label","aria-busy"],O3=["aria-selected","aria-label","onClick","onDblclick","onContextmenu","onDragstart","onDragover","onDragleave","onDrop","onTouchstartPassive"],I3={class:"fe-gal__thumb"},R3=["src","alt"],L3={key:1,class:"fe-gal__icon"},z3=["innerHTML"],F3={class:"fe-gal__meta","aria-hidden":"true"},P3={key:0,class:"fe-gal__meta-line"},$3=["title"],V3=["title"],U3={key:0,class:"fe-gal__empty"},cp=n.defineComponent({__name:"GalleryView",props:{files:{},selected:{},clipped:{},showParentPath:{type:Boolean},locale:{},loading:{type:Boolean},thumbSrc:{type:Function}},emits:["click-card","dbl-card","context-card","item-drag-start","item-drop-into"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale);function l(E){return a.thumbSrc?a.thumbSrc(E):E.thumb_url??null}function c(E){return a.selected.has(E.path)}function d(E,C){r("click-card",E,{ctrl:C.ctrlKey||C.metaKey,shift:C.shiftKey})}function u(E){r("dbl-card",E)}function p(E,C){C.preventDefault(),C.stopPropagation(),r("context-card",E,C)}function f(E,C){Ic(C,s(E),a.selected.has(E.path)?a.selected.size:1),r("item-drag-start",E,C)}const h=n.ref(null);function _(E,C){E.type==="dir"&&ta(C)&&(C.preventDefault(),C.stopPropagation(),C.dataTransfer&&(C.dataTransfer.dropEffect="move"),h.value=E.path)}function b(E){h.value===E.path&&(h.value=null)}function k(E,C){h.value=null,E.type==="dir"&&ta(C)&&(C.preventDefault(),C.stopPropagation(),r("item-drop-into",E,C))}let m,v=null;function g(E,C){v=E,m&&clearTimeout(m),m=setTimeout(()=>{if(v){const A=C.touches[0];r("context-card",v,{clientX:A.clientX,clientY:A.clientY,preventDefault:()=>{}})}},500)}function y(){m&&clearTimeout(m),v=null}function S(E){const C=E.replace(/^[a-z][a-z0-9+.-]*:\/\//i,""),A=C.lastIndexOf("/");return A===-1?"":C.slice(0,A)}function x(E){return E.basename===".trash"?"🗑":E.mime_type==="inode/storage"?"💾":E.type==="dir"&&E.e2e===!0?"🔒":null}function N(E){return E?new Date(E*(E<1e12?1e3:1)).toLocaleString():""}function w(E){const C=N(E.last_modified);return[E.type==="dir"?"":o(E.size),C].filter(L=>!!L).join(" · ")}return(E,C)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["fe-gal",{"is-loading":e.loading}]),role:"listbox","aria-multiselectable":"true","aria-label":n.unref(i)("gallery.aria"),"aria-busy":e.loading?"true":void 0},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.files,A=>{var L;return n.openBlock(),n.createElementBlock("div",{key:A.path,class:n.normalizeClass(["fe-gal__card",{"is-selected":c(A),"is-dir":A.type==="dir","is-trash":A.trashed,"is-clipped":(L=e.clipped)==null?void 0:L.has(A.path),"is-droptarget":h.value===A.path}]),tabindex:"0",role:"option","aria-selected":c(A)?"true":"false","aria-label":n.unref(s)(A),draggable:"true",onClick:R=>d(A,R),onDblclick:R=>u(A),onContextmenu:R=>p(A,R),onDragstart:R=>f(A,R),onDragover:R=>_(A,R),onDragleave:R=>b(A),onDrop:R=>k(A,R),onTouchstartPassive:R=>g(A,R),onTouchend:y,onTouchmove:y},[n.createElementVNode("div",I3,[l(A)?(n.openBlock(),n.createElementBlock("img",{key:0,src:l(A),alt:A.basename,loading:"lazy",draggable:"false"},null,8,R3)):x(A)?(n.openBlock(),n.createElementBlock("span",L3,n.toDisplayString(x(A)),1)):(n.openBlock(),n.createElementBlock("span",{key:2,class:"fe-gal__icon fe-gal__icon--svg",innerHTML:n.unref(di)(A)},null,8,z3)),n.createElementVNode("div",F3,[w(A)?(n.openBlock(),n.createElementBlock("span",P3,n.toDisplayString(w(A)),1)):n.createCommentVNode("",!0),e.showParentPath&&S(A.path)?(n.openBlock(),n.createElementBlock("span",{key:1,class:"fe-gal__meta-line fe-gal__meta-line--path",title:S(A.path)},n.toDisplayString(S(A.path)),9,$3)):n.createCommentVNode("",!0)])]),n.createElementVNode("div",{class:"fe-gal__label",title:A.basename},n.toDisplayString(n.unref(s)(A)),9,V3)],42,O3)}),128)),!e.loading&&e.files.length===0?(n.openBlock(),n.createElementBlock("div",U3,n.toDisplayString(n.unref(i)("empty.folder")),1)):n.createCommentVNode("",!0)],10,M3))}}),H3=n.defineComponent({__name:"UploadProgress",props:{jobs:{},locale:{},center:{}},emits:["cancel","dismiss","retry"],setup(e,{emit:t}){const a=e,r=t;function i(o){return o==="done"?"done":o==="error"?"error":o==="aborted"?"aborted":"running"}return n.watch(()=>a.jobs,o=>{a.center.sync("upload",o.map(s=>({input:{id:s.id,kind:"upload",name:s.file.name,percent:s.totalBytes>0||s.status==="done"?s.percent:null,status:i(s.status),error:s.error??null,uploadedBytes:s.uploadedBytes,totalBytes:s.totalBytes,cancellable:s.status==="uploading"||s.status==="initializing",retryable:s.status==="error"},actions:{cancel:()=>r("cancel",s),dismiss:()=>r("dismiss",s),retry:()=>r("retry",s)}})))},{immediate:!0}),(o,s)=>n.createCommentVNode("",!0)}}),G3=n.defineComponent({__name:"PendingOpsTray",props:{ops:{},locale:{},center:{}},emits:["dismiss"],setup(e,{emit:t}){const a=e,r=t;function i(s){return s.status==="done"?"done":s.status==="error"?"error":"running"}function o(s){return s.status==="done"?100:s.progress_total<=0?null:Math.min(100,Math.round(s.progress_done/s.progress_total*100))}return n.watch(()=>a.ops,s=>{a.center.sync("ops",s.map(l=>({input:{id:l.id,kind:l.op_type,name:l.target_path||l.source_dir||"",percent:o(l),status:i(l),error:l.error_message,queued:l.status==="pending",doneCount:l.progress_done,totalCount:l.progress_total,cancellable:!1,retryable:!1},actions:{dismiss:()=>r("dismiss",l.id)}})))},{immediate:!0}),(s,l)=>n.createCommentVNode("",!0)}}),K3=["aria-label"],q3={class:"fe-inspector__head"},W3={class:"fe-inspector__title"},j3=["title","aria-label"],Y3={class:"fe-inspector__scroll"},X3={class:"fe-inspector__section"},Z3={class:"fe-inspector__heading"},J3={key:0,class:"fe-inspector__hero"},Q3=["innerHTML"],ew={class:"fe-inspector__name"},tw={class:"fe-inspector__hero"},nw=["src"],aw=["innerHTML"],rw=["title"],iw={class:"fe-inspector__meta"},ow={class:"fe-inspector__row"},sw={class:"fe-inspector__pathcell"},lw=["title"],cw=["title","aria-label"],dw={key:0,class:"fe-inspector__row"},uw={class:"fe-inspector__row"},fw={key:1,class:"fe-inspector__row"},pw={class:"fe-inspector__mime"},hw={key:2,class:"fe-inspector__row"},mw={class:"fe-inspector__pathcell"},gw=["title"],bw=["title","aria-label"],yw={key:2,class:"fe-inspector__hero"},vw=["innerHTML"],kw=["title"],_w={class:"fe-inspector__sub"},ww={key:0,class:"fe-inspector__section"},Ew={class:"fe-inspector__heading"},Sw={key:0,class:"fe-inspector__empty"},xw={key:0,class:"fe-inspector__empty"},Cw={key:1,class:"fe-inspector__versions"},Nw={class:"fe-inspector__version-main"},Tw={class:"fe-inspector__version-n"},Dw={class:"fe-inspector__version-meta"},Bw={key:0,class:"fe-inspector__confirm"},Aw={class:"fe-inspector__confirm-q"},Mw={class:"fe-inspector__check"},Ow={class:"fe-inspector__confirm-actions"},Iw=["disabled","onClick"],Rw=["disabled"],Lw=["disabled","onClick"],zw=["disabled"],Fw={key:1,class:"fe-inspector__section"},Pw={class:"fe-inspector__heading"},$w={class:"fe-inspector__permrow"},Vw={key:2,class:"fe-inspector__section"},Uw={class:"fe-inspector__heading"},Hw={key:0,class:"fe-inspector__empty"},Gw={key:1,class:"fe-inspector__shares"},Kw=["title"],qw={key:0,class:"fe-inspector__badge fe-inspector__badge--pin"},Ww={key:1,class:"fe-inspector__share-exp"},jw=["title","aria-label","onClick"],Yw={key:3,class:"fe-inspector__section"},Xw={class:"fe-inspector__heading"},Zw={key:0,class:"fe-inspector__countbadge"},Jw={key:0,class:"fe-inspector__empty"},Qw={key:0,class:"fe-inspector__empty"},e5={key:1,class:"fe-inspector__comments"},t5={class:"fe-inspector__comment-top"},n5=["title"],a5=["title"],r5=["disabled","title","aria-label","onClick"],i5={class:"fe-inspector__comment-body"},o5=["placeholder","aria-label","disabled"],s5=["disabled"],l5=n.defineComponent({__name:"InspectorPanel",props:{api:{},nodes:{},dirLabel:{},dirCount:{},dirPerm:{},locale:{},narrow:{type:Boolean},thumbSrc:{type:Function}},emits:["close","manage-permissions","toast","changed"],setup(e,{emit:t}){const a=e,r=t,{t:i,formatSize:o,nodeDisplayName:s}=zt(()=>a.locale),l=n.computed(()=>a.nodes.length===1?a.nodes[0]:null),c=n.computed(()=>a.nodes.length>1),d=n.computed(()=>{var ae;return((ae=l.value)==null?void 0:ae.type)==="file"}),u=n.computed(()=>{var ae;return typeof((ae=l.value)==null?void 0:ae.id)=="number"?l.value.id:null}),p=n.computed(()=>a.nodes.reduce((ae,be)=>ae+(typeof be.size=="number"?be.size:0),0)),f=n.computed(()=>{var be;const ae=(be=l.value)==null?void 0:be.etag;return typeof ae=="string"&&ae!==""?ae:null}),h=n.computed(()=>l.value&&d.value&&a.thumbSrc?a.thumbSrc(l.value):null);function _(ae){return ae.length>12?`${ae.slice(0,12)}…`:ae}function b(ae){if(!ae)return"—";try{return new Date(ae).toLocaleString(a.locale==="en"?"en-GB":"tr-TR",{dateStyle:"medium",timeStyle:"short"})}catch{return new Date(ae).toISOString()}}function k(ae){if(!ae)return"—";const be=Date.parse(ae);return Number.isNaN(be)?ae:b(be)}async function m(ae){try{await navigator.clipboard.writeText(ae),r("toast",i("inspector.copied"))}catch{r("toast",ae)}}const v=n.computed(()=>{if(!l.value)return"";const ae=l.value.perm;return typeof ae=="string"&&ae!==""?ae:a.dirPerm||""}),g=n.computed(()=>v.value==="editor"||v.value==="owner");function y(ae){return i(`inspector.perm.${ae}`)===`inspector.perm.${ae}`?ae:i(`inspector.perm.${ae}`)}const S=n.ref("idle"),x=n.ref([]),N=n.ref(null),w=n.ref(!0),E=n.ref(!1),C=n.ref("idle"),A=n.ref([]);let L=0;async function R(){const ae=++L;if(N.value=null,x.value=[],A.value=[],l.value&&d.value&&u.value!=null?(S.value="loading",$(ae)):S.value="hidden",l.value){C.value="loading";const be=l.value.path;try{const{shares:_e}=await a.api.listShares(be);if(ae!==L)return;A.value=Array.isArray(_e)?_e:[],C.value="ok"}catch{if(ae!==L)return;C.value="hidden"}}else C.value="hidden"}async function $(ae){const be=u.value;if(be!=null)try{const _e=await a.api.listVersions(be);if(ae!==L)return;x.value=_e,S.value="ok"}catch(_e){if(ae!==L)return;const Ce=_e.status;Ce===401||Ce===403||Ce===404?S.value="hidden":S.value="error"}}function Y(ae){N.value=ae.id,w.value=!0}async function F(ae){const be=u.value;if(!(be==null||E.value)){E.value=!0;try{await a.api.restoreVersion(be,ae.id,w.value),r("toast",i("inspector.versions.restored")),N.value=null,r("changed"),await $(++L)}catch(_e){r("toast",_e.message)}finally{E.value=!1}}}async function q(){const ae=u.value;if(!(ae==null||E.value)){E.value=!0;try{await a.api.snapshotVersion(ae),r("toast",i("inspector.versions.snapshotted")),await $(++L)}catch(be){const _e=be.status;_e===404||_e===405||_e===501?r("toast",i("inspector.versions.unsupported")):r("toast",be.message)}finally{E.value=!1}}}n.watch(()=>a.nodes.map(ae=>ae.path).join("\0"),()=>void R(),{immediate:!0});const X=n.ref("hidden"),z=n.ref([]),H=n.ref(""),O=n.ref(!1),P=n.computed(()=>{var ae;return typeof((ae=l.value)==null?void 0:ae.id)=="number"?l.value.id:null});let K=0;async function J(){const ae=++K,be=P.value;if(be==null){X.value="hidden",z.value=[];return}X.value=z.value.length>0?"ok":"loading";try{const _e=await a.api.listComments(be);if(ae!==K)return;z.value=_e,X.value="ok"}catch(_e){if(ae!==K)return;z.value=[];const Ce=_e.status;X.value=Ce===401||Ce===403||Ce===404?"hidden":"error"}}async function de(){const ae=P.value,be=H.value.trim();if(!(ae==null||be===""||O.value)){O.value=!0;try{await a.api.addComment(ae,be),H.value="",await J()}catch(_e){r("toast",_e.message)}finally{O.value=!1}}}async function xe(ae){if(!O.value){O.value=!0;try{await a.api.deleteComment(ae.id),await J()}catch(be){r("toast",be.message)}finally{O.value=!1}}}function ke(ae){const be=Date.parse(ae);if(Number.isNaN(be))return ae;const _e=Math.round((be-Date.now())/1e3),Ce=Math.abs(_e),Ve=[["year",31536e3],["month",2592e3],["day",86400],["hour",3600],["minute",60]];try{const rt=new Intl.RelativeTimeFormat(a.locale==="en"?"en":"tr",{numeric:"auto"});for(const[tt,Pe]of Ve)if(Ce>=Pe)return rt.format(Math.trunc(_e/Pe),tt);return rt.format(_e,"second")}catch{return k(ae)}}return n.watch(()=>P.value,()=>{z.value=[],H.value="",J()},{immediate:!0}),(ae,be)=>(n.openBlock(),n.createElementBlock("aside",{class:n.normalizeClass(["fe-inspector",{"fe-inspector--overlay":e.narrow}]),role:"complementary","aria-label":n.unref(i)("inspector.title")},[n.createElementVNode("header",q3,[n.createElementVNode("h2",W3,n.toDisplayString(n.unref(i)("inspector.title")),1),n.createElementVNode("button",{type:"button",class:"fe-inspector__close",title:n.unref(i)("inspector.close"),"aria-label":n.unref(i)("inspector.close"),onClick:be[0]||(be[0]=_e=>r("close"))},"×",8,j3)]),n.createElementVNode("div",Y3,[n.createElementVNode("section",X3,[n.createElementVNode("h3",Z3,n.toDisplayString(n.unref(i)("inspector.section.general")),1),c.value?(n.openBlock(),n.createElementBlock("div",J3,[n.createElementVNode("span",{class:"fe-inspector__bigicon",innerHTML:n.unref(di)({type:"dir"})},null,8,Q3),n.createElementVNode("p",ew,n.toDisplayString(n.unref(i)("inspector.items_summary",{n:e.nodes.length,size:n.unref(o)(p.value)})),1)])):l.value?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",tw,[h.value?(n.openBlock(),n.createElementBlock("img",{key:0,class:"fe-inspector__thumb",src:h.value,alt:"","aria-hidden":"true"},null,8,nw)):(n.openBlock(),n.createElementBlock("span",{key:1,class:"fe-inspector__bigicon",innerHTML:n.unref(di)(l.value)},null,8,aw)),n.createElementVNode("p",{class:"fe-inspector__name",title:l.value.basename},n.toDisplayString(n.unref(s)(l.value)),9,rw)]),n.createElementVNode("dl",iw,[n.createElementVNode("div",ow,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.path")),1),n.createElementVNode("dd",sw,[n.createElementVNode("span",{class:"fe-inspector__path",title:l.value.path},n.toDisplayString(l.value.path),9,lw),n.createElementVNode("button",{type:"button",class:"fe-inspector__copy",title:n.unref(i)("inspector.copy"),"aria-label":n.unref(i)("inspector.copy"),onClick:be[1]||(be[1]=_e=>m(l.value.path))},"⧉",8,cw)])]),d.value?(n.openBlock(),n.createElementBlock("div",dw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.size")),1),n.createElementVNode("dd",null,n.toDisplayString(n.unref(o)(typeof l.value.size=="number"?l.value.size:null)),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",uw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.modified")),1),n.createElementVNode("dd",null,n.toDisplayString(b(l.value.last_modified)),1)]),d.value&&l.value.mime_type?(n.openBlock(),n.createElementBlock("div",fw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.mime")),1),n.createElementVNode("dd",pw,n.toDisplayString(l.value.mime_type),1)])):n.createCommentVNode("",!0),f.value?(n.openBlock(),n.createElementBlock("div",hw,[n.createElementVNode("dt",null,n.toDisplayString(n.unref(i)("inspector.etag")),1),n.createElementVNode("dd",mw,[n.createElementVNode("span",{class:"fe-inspector__path",title:f.value},n.toDisplayString(_(f.value)),9,gw),n.createElementVNode("button",{type:"button",class:"fe-inspector__copy",title:n.unref(i)("inspector.copy"),"aria-label":n.unref(i)("inspector.copy"),onClick:be[2]||(be[2]=_e=>m(f.value))},"⧉",8,bw)])])):n.createCommentVNode("",!0)])],64)):(n.openBlock(),n.createElementBlock("div",yw,[n.createElementVNode("span",{class:"fe-inspector__bigicon",innerHTML:n.unref(di)({type:"dir"})},null,8,vw),n.createElementVNode("p",{class:"fe-inspector__name",title:e.dirLabel},n.toDisplayString(e.dirLabel),9,kw),n.createElementVNode("p",_w,n.toDisplayString(n.unref(i)("inspector.folder_items",{n:e.dirCount})),1)]))]),S.value==="ok"||S.value==="error"?(n.openBlock(),n.createElementBlock("section",ww,[n.createElementVNode("h3",Ew,n.toDisplayString(n.unref(i)("inspector.section.versions")),1),S.value==="error"?(n.openBlock(),n.createElementBlock("p",Sw,n.toDisplayString(n.unref(i)("inspector.error")),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[x.value.length===0?(n.openBlock(),n.createElementBlock("p",xw,n.toDisplayString(n.unref(i)("inspector.versions.empty")),1)):(n.openBlock(),n.createElementBlock("ul",Cw,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(x.value,_e=>(n.openBlock(),n.createElementBlock("li",{key:_e.id,class:"fe-inspector__version"},[n.createElementVNode("div",Nw,[n.createElementVNode("span",Tw,n.toDisplayString(n.unref(i)("inspector.versions.v",{n:_e.version_n})),1),n.createElementVNode("span",Dw,n.toDisplayString(k(_e.created_at))+" · "+n.toDisplayString(n.unref(o)(_e.size)),1)]),N.value===_e.id?(n.openBlock(),n.createElementBlock("div",Bw,[n.createElementVNode("p",Aw,n.toDisplayString(n.unref(i)("inspector.versions.restore_confirm")),1),n.createElementVNode("label",Mw,[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":be[3]||(be[3]=Ce=>w.value=Ce),type:"checkbox"},null,512),[[n.vModelCheckbox,w.value]]),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("inspector.versions.snapshot_current")),1)]),n.createElementVNode("div",Ow,[n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary fe-btn--sm",disabled:E.value,onClick:Ce=>F(_e)},n.toDisplayString(n.unref(i)("inspector.versions.confirm")),9,Iw),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--sm",disabled:E.value,onClick:be[4]||(be[4]=Ce=>N.value=null)},n.toDisplayString(n.unref(i)("inspector.versions.cancel")),9,Rw)])])):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-btn--sm",disabled:E.value,onClick:Ce=>Y(_e)},n.toDisplayString(n.unref(i)("inspector.versions.restore")),9,Lw))]))),128))])),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--sm fe-inspector__snapshot",disabled:E.value,onClick:q},n.toDisplayString(n.unref(i)("inspector.versions.take_snapshot")),9,zw)],64))])):n.createCommentVNode("",!0),l.value&&v.value?(n.openBlock(),n.createElementBlock("section",Fw,[n.createElementVNode("h3",Pw,n.toDisplayString(n.unref(i)("inspector.section.permissions")),1),n.createElementVNode("div",$w,[n.createElementVNode("span",{class:n.normalizeClass(["fe-inspector__badge",`fe-inspector__badge--${v.value}`])},n.toDisplayString(y(v.value)),3),g.value?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--sm",onClick:be[5]||(be[5]=_e=>r("manage-permissions",l.value))},n.toDisplayString(n.unref(i)("inspector.perm.manage")),1)):n.createCommentVNode("",!0)])])):n.createCommentVNode("",!0),C.value==="ok"?(n.openBlock(),n.createElementBlock("section",Vw,[n.createElementVNode("h3",Uw,n.toDisplayString(n.unref(i)("inspector.section.shares")),1),A.value.length===0?(n.openBlock(),n.createElementBlock("p",Hw,n.toDisplayString(n.unref(i)("inspector.shares.empty")),1)):(n.openBlock(),n.createElementBlock("ul",Gw,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(A.value,_e=>(n.openBlock(),n.createElementBlock("li",{key:_e.uuid,class:"fe-inspector__share"},[n.createElementVNode("span",{class:"fe-inspector__share-url",title:_e.url},n.toDisplayString(_e.url),9,Kw),_e.password_pin?(n.openBlock(),n.createElementBlock("span",qw,"PIN")):n.createCommentVNode("",!0),_e.expires_at?(n.openBlock(),n.createElementBlock("span",Ww,n.toDisplayString(k(_e.expires_at)),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-inspector__copy",title:n.unref(i)("inspector.shares.copy"),"aria-label":n.unref(i)("inspector.shares.copy"),onClick:Ce=>m(_e.url)},"⧉",8,jw)]))),128))]))])):n.createCommentVNode("",!0),X.value==="ok"||X.value==="error"?(n.openBlock(),n.createElementBlock("section",Yw,[n.createElementVNode("h3",Xw,[n.createTextVNode(n.toDisplayString(n.unref(i)("inspector.section.comments"))+" ",1),z.value.length>0?(n.openBlock(),n.createElementBlock("span",Zw,n.toDisplayString(z.value.length),1)):n.createCommentVNode("",!0)]),X.value==="error"?(n.openBlock(),n.createElementBlock("p",Jw,n.toDisplayString(n.unref(i)("inspector.error")),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[z.value.length===0?(n.openBlock(),n.createElementBlock("p",Qw,n.toDisplayString(n.unref(i)("inspector.comments.empty")),1)):(n.openBlock(),n.createElementBlock("ul",e5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(z.value,_e=>(n.openBlock(),n.createElementBlock("li",{key:_e.id,class:"fe-inspector__comment"},[n.createElementVNode("div",t5,[n.createElementVNode("span",{class:"fe-inspector__comment-author",title:_e.author_name},n.toDisplayString(_e.author_name||"—"),9,n5),n.createElementVNode("span",{class:"fe-inspector__comment-time",title:k(_e.created_at)},n.toDisplayString(ke(_e.created_at)),9,a5),_e.can_delete?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-inspector__comment-del",disabled:O.value,title:n.unref(i)("inspector.comments.delete"),"aria-label":n.unref(i)("inspector.comments.delete"),onClick:Ce=>xe(_e)},"×",8,r5)):n.createCommentVNode("",!0)]),n.createElementVNode("p",i5,n.toDisplayString(_e.body),1)]))),128))])),n.createElementVNode("form",{class:"fe-inspector__comment-form",onSubmit:n.withModifiers(de,["prevent"])},[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":be[6]||(be[6]=_e=>H.value=_e),type:"text",class:"fe-inspector__comment-input",maxlength:"5000",placeholder:n.unref(i)("inspector.comments.placeholder"),"aria-label":n.unref(i)("inspector.comments.placeholder"),disabled:O.value},null,8,o5),[[n.vModelText,H.value]]),n.createElementVNode("button",{type:"submit",class:"fe-btn fe-btn--primary fe-btn--sm",disabled:O.value||H.value.trim()===""},n.toDisplayString(n.unref(i)("inspector.comments.send")),9,s5)],32)],64))])):n.createCommentVNode("",!0)])],10,K3))}}),c5=["aria-label"],d5={class:"fe-cmdp__inputwrap"},u5=["placeholder"],f5=["aria-selected","onMouseenter","onClick"],p5={class:"fe-cmdp__icon","aria-hidden":"true"},h5={class:"fe-cmdp__label"},m5={class:"fe-cmdp__group"},g5=["aria-selected","onMouseenter","onClick"],b5={class:"fe-cmdp__icon","aria-hidden":"true"},y5={class:"fe-cmdp__label"},v5={class:"fe-cmdp__group"},k5={key:0,class:"fe-cmdp__loading"},_5=["aria-selected","onMouseenter","onClick"],w5={class:"fe-cmdp__icon","aria-hidden":"true"},E5={class:"fe-cmdp__hitbody"},S5={class:"fe-cmdp__hitline"},x5={class:"fe-cmdp__label"},C5={key:0,class:"fe-cmdp__badge"},N5=["title"],T5={key:1,class:"fe-cmdp__snippet"},D5={key:0,class:"fe-cmdp__mark"},B5={class:"fe-cmdp__group"},A5=["aria-selected","onMouseenter","onClick","onKeydown"],M5={class:"fe-cmdp__icon","aria-hidden":"true"},O5={class:"fe-cmdp__label"},I5=["title","aria-label","onClick"],R5={class:"fe-cmdp__group"},L5=["aria-selected","onMouseenter","onClick"],z5={class:"fe-cmdp__icon","aria-hidden":"true"},F5={class:"fe-cmdp__label"},P5={key:4,class:"fe-cmdp__empty"},$5={class:"fe-cmdp__hint"},V5=3,U5=8,H5=250,dp="filex.saved-searches",up=10,G5=n.defineComponent({__name:"CommandPalette",props:{open:{type:Boolean},locale:{},files:{},viewMode:{},canWrite:{type:Boolean},canGoUp:{type:Boolean},globalSearch:{type:Function},splitEnabled:{type:Boolean}},emits:["close","open-node","navigate","new-folder","upload","toggle-view","open-trash","refresh","go-up","open-hit","open-theme","open-shortcut-settings","start-tour","tab-new","split-toggle"],setup(e,{emit:t}){const a=e,r=t,{t:i,nodeDisplayName:o}=zt(()=>a.locale),s=n.ref(""),l=n.ref(0),c=n.ref(null),d=n.ref(null);function u(z,H){if(!H)return 0;const O=z.toLocaleLowerCase(),P=H.toLocaleLowerCase(),K=O.indexOf(P);if(K===-1)return-1;let J=100-Math.min(K,50);return K===0&&(J+=40),J-=Math.min(O.length,40)/4,J}const p=n.computed(()=>{const z=s.value.trim();if(!z.includes("/"))return[];const H=z.replace(/^\/+|\/+$/g,"");return H?[{kind:"goto",id:`goto:${H}`,label:`${i("palette.goto")}: ${H}`,icon:"➜",path:H}]:[]}),f=n.computed(()=>{const z=s.value.trim(),H=a.files.map(O=>({f:O,name:o(O),s:u(o(O),z)})).filter(O=>O.s>=0);return z&&H.sort((O,P)=>P.s-O.s),H.slice(0,8).map(O=>({kind:"file",id:`file:${O.f.path}`,label:O.name,icon:O.f.type==="dir"?"📁":"📄",node:O.f}))}),h=n.computed(()=>{const z=s.value.trim();return[{command:"new-folder",label:i("toolbar.new_folder"),icon:"📁",enabled:a.canWrite!==!1},{command:"upload",label:i("toolbar.upload"),icon:"⬆",enabled:a.canWrite!==!1},{command:"toggle-view",label:i("cmd.view_toggle"),icon:a.viewMode==="list"?"▦":a.viewMode==="grid"?"▣":"☰",enabled:!0},{command:"open-trash",label:i("cmd.trash"),icon:"🗑",enabled:!0},{command:"refresh",label:i("toolbar.refresh"),icon:"⟳",enabled:!0},{command:"go-up",label:i("toolbar.go_up"),icon:"↑",enabled:a.canGoUp!==!1},{command:"open-theme",label:i("theme.menu"),icon:"🎨",enabled:!0},{command:"open-shortcut-settings",label:i("shortcuts.settings.menu"),icon:"⌨",enabled:!0},{command:"start-tour",label:i("tour.restart"),icon:"🎓",enabled:!0},{command:"tab-new",label:i("cmd.tab_new"),icon:"⧉",enabled:!0},{command:"split-toggle",label:i("cmd.split_toggle"),icon:"◫",enabled:a.splitEnabled!==!1}].filter(O=>O.enabled&&u(O.label,z)>=0).map(O=>({kind:"command",id:`cmd:${O.command}`,label:O.label,icon:O.icon,command:O.command}))}),_=n.ref([]),b=n.ref(!1);let k,m=0;function v(z){k&&clearTimeout(k);const H=a.globalSearch;if(!H||z.length<V5){_.value=[],b.value=!1;return}b.value=!0,k=setTimeout(async()=>{const O=++m;try{const P=await H(z);if(O!==m)return;_.value=Array.isArray(P)?P.slice(0,U5):[]}catch{O===m&&(_.value=[])}finally{O===m&&(b.value=!1)}},H5)}function g(z){const H=String(z.path??"").replace(/^\/+|\/+$/g,""),O=H.lastIndexOf("/"),P=O===-1?"":H.slice(0,O),K=typeof z.storage=="string"&&z.storage||typeof z.storage_name=="string"&&z.storage_name||"";return K&&P?`${K}/${P}`:K||P||"/"}const y=n.computed(()=>_.value.map(z=>({kind:"hit",id:`hit:${z.storage_id??""}:${z.path??""}:${z.id??""}`,label:String(z.name??z.path??""),icon:z.type==="dir"?"📁":"📄",hit:z,crumb:g(z),inContent:Oc(z.matched),snippet:typeof z.snippet=="string"?z.snippet:""}))),S=n.ref([]);function x(){try{const z=localStorage.getItem(dp);if(!z)return[];const H=JSON.parse(z);return Array.isArray(H)?H.filter(O=>typeof O=="string"&&O.trim()!=="").slice(0,up):[]}catch{return[]}}function N(z){S.value=z.slice(0,up);try{localStorage.setItem(dp,JSON.stringify(S.value))}catch{}}function w(z){const H=z.trim();if(!H)return;const O=S.value.filter(P=>P!==H);O.unshift(H),N(O)}function E(z){N(S.value.filter(H=>H!==z)),l.value>=A.value.length&&(l.value=Math.max(0,A.value.length-1))}const C=n.computed(()=>{const z=s.value.trim(),H=[];z&&!S.value.includes(z)&&H.push({kind:"save",id:`save:${z}`,label:`${i("palette.save")}: ${z}`,icon:"💾",query:z});const O=S.value.map(P=>({s:P,sc:u(P,z)})).filter(P=>P.sc>=0||!z);for(const P of O)H.push({kind:"saved",id:`saved:${P.s}`,label:P.s,icon:"🔖",query:P.s});return H}),A=n.computed(()=>[...p.value,...f.value,...y.value,...C.value,...h.value]),L=n.computed(()=>p.value.length),R=n.computed(()=>L.value+f.value.length),$=n.computed(()=>R.value+y.value.length),Y=n.computed(()=>$.value+C.value.length);n.watch(s,z=>{l.value=0,v(z.trim())});function F(z){const H=A.value.length;H&&(l.value=(l.value+z+H)%H,n.nextTick(()=>{var O,P;(P=(O=d.value)==null?void 0:O.querySelector(".is-active"))==null||P.scrollIntoView({block:"nearest"})}))}function q(z){const H=z??A.value[l.value];if(H){if(H.kind==="saved"){s.value=H.query,n.nextTick(()=>{var O;return(O=c.value)==null?void 0:O.focus()});return}if(H.kind==="save"){w(H.query),n.nextTick(()=>{var O;return(O=c.value)==null?void 0:O.focus()});return}if(r("close"),H.kind==="hit"){r("open-hit",H.hit);return}if(H.kind==="file")r("open-node",H.node);else if(H.kind==="goto")r("navigate",H.path);else switch(H.command){case"new-folder":r("new-folder");break;case"upload":r("upload");break;case"toggle-view":r("toggle-view");break;case"open-trash":r("open-trash");break;case"refresh":r("refresh");break;case"go-up":r("go-up");break;case"open-theme":r("open-theme");break;case"open-shortcut-settings":r("open-shortcut-settings");break;case"start-tour":r("start-tour");break;case"tab-new":r("tab-new");break;case"split-toggle":r("split-toggle");break}}}function X(z){if(a.open)switch(z.key){case"ArrowDown":z.preventDefault(),z.stopPropagation(),F(1);break;case"ArrowUp":z.preventDefault(),z.stopPropagation(),F(-1);break;case"Enter":z.preventDefault(),z.stopPropagation(),q();break;case"Escape":z.preventDefault(),z.stopPropagation(),r("close");break}}return n.watch(()=>a.open,z=>{z?(s.value="",l.value=0,_.value=[],b.value=!1,S.value=x(),document.addEventListener("keydown",X,!0),n.nextTick(()=>{var H;return(H=c.value)==null?void 0:H.focus()})):(k&&clearTimeout(k),document.removeEventListener("keydown",X,!0))}),n.onBeforeUnmount(()=>{k&&clearTimeout(k),document.removeEventListener("keydown",X,!0)}),(z,H)=>(n.openBlock(),n.createBlock(n.Transition,{name:"fe-modal"},{default:n.withCtx(()=>[e.open?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-modal__backdrop fe-cmdp__backdrop",role:"presentation",onClick:H[2]||(H[2]=O=>r("close"))},[n.createElementVNode("div",{class:"fe-cmdp",role:"dialog","aria-modal":"true","aria-label":n.unref(i)("palette.placeholder"),onClick:H[1]||(H[1]=n.withModifiers(()=>{},["stop"]))},[n.createElementVNode("div",d5,[H[3]||(H[3]=n.createElementVNode("svg",{class:"fe-cmdp__glyph",width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","aria-hidden":"true"},[n.createElementVNode("circle",{cx:"7",cy:"7",r:"4.5"}),n.createElementVNode("path",{d:"m10.5 10.5 3.5 3.5"})],-1)),n.withDirectives(n.createElementVNode("input",{ref_key:"inputEl",ref:c,"onUpdate:modelValue":H[0]||(H[0]=O=>s.value=O),type:"text",class:"fe-cmdp__input",placeholder:n.unref(i)("palette.placeholder"),autocomplete:"off",spellcheck:"false"},null,8,u5),[[n.vModelText,s.value]])]),n.createElementVNode("div",{ref_key:"listEl",ref:d,class:"fe-cmdp__list",role:"listbox"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(p.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item",{"is-active":P===l.value}]),role:"option","aria-selected":P===l.value,onMouseenter:K=>l.value=P,onClick:K=>q(O)},[n.createElementVNode("span",p5,n.toDisplayString(O.icon),1),n.createElementVNode("span",h5,n.toDisplayString(O.label),1)],42,f5))),128)),f.value.length?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createElementVNode("div",m5,n.toDisplayString(n.unref(i)("palette.files")),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(f.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item",{"is-active":L.value+P===l.value}]),role:"option","aria-selected":L.value+P===l.value,onMouseenter:K=>l.value=L.value+P,onClick:K=>q(O)},[n.createElementVNode("span",b5,n.toDisplayString(O.icon),1),n.createElementVNode("span",y5,n.toDisplayString(O.label),1)],42,g5))),128))],64)):n.createCommentVNode("",!0),y.value.length||b.value?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",v5,n.toDisplayString(n.unref(i)("palette.everywhere")),1),b.value&&!y.value.length?(n.openBlock(),n.createElementBlock("div",k5,n.toDisplayString(n.unref(i)("palette.searching")),1)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(y.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item fe-cmdp__item--hit",{"is-active":R.value+P===l.value}]),role:"option","aria-selected":R.value+P===l.value,onMouseenter:K=>l.value=R.value+P,onClick:K=>q(O)},[n.createElementVNode("span",w5,n.toDisplayString(O.icon),1),n.createElementVNode("span",E5,[n.createElementVNode("span",S5,[n.createElementVNode("span",x5,n.toDisplayString(O.label),1),O.inContent?(n.openBlock(),n.createElementBlock("span",C5,n.toDisplayString(n.unref(i)("search.in_content")),1)):n.createCommentVNode("",!0)]),O.crumb?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-cmdp__crumb",title:O.crumb},n.toDisplayString(O.crumb),9,N5)):n.createCommentVNode("",!0),O.snippet?(n.openBlock(),n.createElementBlock("span",T5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(uo)(O.snippet),(K,J)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:J},[K.match?(n.openBlock(),n.createElementBlock("mark",D5,n.toDisplayString(K.text),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createTextVNode(n.toDisplayString(K.text),1)],64))],64))),128))])):n.createCommentVNode("",!0)])],42,_5))),128))],64)):n.createCommentVNode("",!0),C.value.length?(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("div",B5,n.toDisplayString(n.unref(i)("palette.saved")),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(C.value,(O,P)=>(n.openBlock(),n.createElementBlock("div",{key:O.id,class:n.normalizeClass(["fe-cmdp__item fe-cmdp__item--saved",{"is-active":$.value+P===l.value}]),role:"option","aria-selected":$.value+P===l.value,tabindex:"-1",onMouseenter:K=>l.value=$.value+P,onClick:K=>q(O),onKeydown:n.withKeys(n.withModifiers(K=>q(O),["prevent"]),["enter"])},[n.createElementVNode("span",M5,n.toDisplayString(O.icon),1),n.createElementVNode("span",O5,n.toDisplayString(O.label),1),O.kind==="saved"?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-cmdp__del",title:n.unref(i)("palette.saved.delete"),"aria-label":n.unref(i)("palette.saved.delete"),onClick:n.withModifiers(K=>E(O.query),["stop"])},"🗑",8,I5)):n.createCommentVNode("",!0)],42,A5))),128))],64)):n.createCommentVNode("",!0),h.value.length?(n.openBlock(),n.createElementBlock(n.Fragment,{key:3},[n.createElementVNode("div",R5,n.toDisplayString(n.unref(i)("palette.commands")),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(h.value,(O,P)=>(n.openBlock(),n.createElementBlock("button",{key:O.id,type:"button",class:n.normalizeClass(["fe-cmdp__item",{"is-active":Y.value+P===l.value}]),role:"option","aria-selected":Y.value+P===l.value,onMouseenter:K=>l.value=Y.value+P,onClick:K=>q(O)},[n.createElementVNode("span",z5,n.toDisplayString(O.icon),1),n.createElementVNode("span",F5,n.toDisplayString(O.label),1)],42,L5))),128))],64)):n.createCommentVNode("",!0),A.value.length===0&&!b.value?(n.openBlock(),n.createElementBlock("div",P5,n.toDisplayString(n.unref(i)("palette.empty")),1)):n.createCommentVNode("",!0)],512),n.createElementVNode("div",$5,n.toDisplayString(n.unref(i)("palette.hint")),1)],8,c5)])):n.createCommentVNode("",!0)]),_:1}))}}),K5=["aria-labelledby","aria-label"],q5={key:0,class:"fe-modal__head"},W5={class:"fe-modal__body"},j5={key:1,class:"fe-modal__actions"},fp='input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),a[href],[tabindex]:not([tabindex="-1"])',Ua=n.defineComponent({__name:"Modal",props:{open:{type:Boolean},title:{},size:{},closeOnBackdrop:{type:Boolean},chromeless:{type:Boolean},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,i=n.ref(null);let o=0;const s=`fe-modal-title-${++o}-${Math.random().toString(36).slice(2,7)}`;let l=null;n.watch(()=>a.open,u=>{var p;u?(l=document.activeElement??null,document.addEventListener("keydown",c),setTimeout(()=>{var h;const f=(h=i.value)==null?void 0:h.querySelector(fp);f==null||f.focus()},30)):(document.removeEventListener("keydown",c),(p=l==null?void 0:l.focus)==null||p.call(l),l=null)}),n.onBeforeUnmount(()=>document.removeEventListener("keydown",c));function c(u){if(u.key==="Escape"){r("close");return}if(u.key==="Tab"&&i.value){const p=Array.from(i.value.querySelectorAll(fp)).filter(b=>b.offsetParent!==null||b===document.activeElement);if(p.length===0)return;const f=p[0],h=p[p.length-1],_=document.activeElement;u.shiftKey&&(_===f||!i.value.contains(_))?(u.preventDefault(),h.focus()):!u.shiftKey&&(_===h||!i.value.contains(_))&&(u.preventDefault(),f.focus())}}function d(){a.closeOnBackdrop!==!1&&r("close")}return(u,p)=>(n.openBlock(),n.createBlock(n.Transition,{name:"fe-modal"},{default:n.withCtx(()=>[e.open?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe fe-modal__backdrop",[{"fe-modal__backdrop--chromeless":e.chromeless},e.theme==="light"?"fe--theme-light":"",e.theme==="dark"?"fe--theme-dark":""]]),role:"presentation",onClick:d},[n.createElementVNode("div",{ref_key:"cardEl",ref:i,class:n.normalizeClass(["fe-modal__card",[`fe-modal__card--${e.size||"md"}`,e.chromeless&&"fe-modal__card--chromeless"]]),role:"dialog","aria-modal":"true","aria-labelledby":e.title&&!e.chromeless?s:void 0,"aria-label":(!e.title||e.chromeless)&&e.title||void 0,onClick:p[1]||(p[1]=n.withModifiers(()=>{},["stop"]))},[e.title&&!e.chromeless?(n.openBlock(),n.createElementBlock("header",q5,[n.createElementVNode("h2",{id:s,class:"fe-modal__title"},n.toDisplayString(e.title),1),n.createElementVNode("button",{type:"button",class:"fe-modal__close","aria-label":"Close",onClick:p[0]||(p[0]=f=>r("close"))},"×")])):n.createCommentVNode("",!0),n.createElementVNode("div",W5,[n.renderSlot(u.$slots,"default")]),u.$slots.actions&&!e.chromeless?(n.openBlock(),n.createElementBlock("footer",j5,[n.renderSlot(u.$slots,"actions")])):n.createCommentVNode("",!0)],10,K5)],2)):n.createCommentVNode("",!0)]),_:3}))}}),Y5={class:"fe-shortcuts"},X5={class:"fe-shortcuts__heading"},Z5={class:"fe-shortcuts__table"},J5={class:"fe-shortcuts__keys"},Q5={key:0,class:"fe-shortcuts__unbound"},e6={class:"fe-kbd"},t6={key:0,class:"fe-shortcuts__or","aria-hidden":"true"},n6={class:"fe-shortcuts__desc"},a6=["title"],r6=n.defineComponent({__name:"ShortcutsHelp",props:{open:{type:Boolean},locale:{}},emits:["close","customize"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=Tc(),s=n.computed(()=>{const l=[],c=new Map;for(const d of o.value)c.has(d.groupKey)||(c.set(d.groupKey,[]),l.push(d.groupKey)),c.get(d.groupKey).push(d);return l.map(d=>({key:d,items:c.get(d)}))});return(l,c)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("shortcuts.title"),size:"md",onClose:c[2]||(c[2]=d=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:c[0]||(c[0]=d=>r("customize"))}," ⌨ "+n.toDisplayString(n.unref(i)("shortcuts.customize")),1),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:c[1]||(c[1]=d=>r("close"))},n.toDisplayString(n.unref(i)("viewer.close")),1)]),default:n.withCtx(()=>[n.createElementVNode("div",Y5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(s.value,d=>(n.openBlock(),n.createElementBlock("section",{key:d.key,class:"fe-shortcuts__group"},[n.createElementVNode("h3",X5,n.toDisplayString(n.unref(i)(d.key)),1),n.createElementVNode("div",Z5,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(d.items,u=>(n.openBlock(),n.createElementBlock("div",{key:u.id,class:"fe-shortcuts__row"},[n.createElementVNode("span",J5,[u.keys.length===0?(n.openBlock(),n.createElementBlock("span",Q5,n.toDisplayString(n.unref(i)("shortcuts.settings.unbound")),1)):(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(u.keys,(p,f)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:p},[n.createElementVNode("kbd",e6,n.toDisplayString(p),1),f<u.keys.length-1?(n.openBlock(),n.createElementBlock("span",t6,"/")):n.createCommentVNode("",!0)],64))),128))]),n.createElementVNode("span",n6,[n.createTextVNode(n.toDisplayString(n.unref(i)(u.labelKey))+" ",1),u.overridden?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-shortcuts__custom",title:n.unref(i)("shortcuts.settings.customized")},"●",8,a6)):n.createCommentVNode("",!0)])]))),128))])]))),128))])]),_:1},8,["open","title"]))}}),fo="filex.theme",pa="default",_s=[{id:pa,nameKey:"theme.name.default",light:{"--fe-bg":"#ffffff","--fe-bg-elev":"#f7f8fa","--fe-bg-hover":"#edf0f5","--fe-bg-selected":"#dfe8ff","--fe-border":"#e2e6ed","--fe-border-strong":"#c7ced9","--fe-text":"#1a1e27","--fe-text-muted":"#5a6475","--fe-text-on-primary":"#ffffff","--fe-primary":"#3b82f6","--fe-primary-hover":"#2563eb","--fe-danger":"#dc2626","--fe-danger-hover":"#b91c1c"},dark:{"--fe-bg":"#0f1419","--fe-bg-elev":"#161c25","--fe-bg-hover":"#1f2733","--fe-bg-selected":"#23324a","--fe-border":"#2a323e","--fe-border-strong":"#3a4453","--fe-text":"#e5e9f0","--fe-text-muted":"#8b95a7","--fe-text-on-primary":"#ffffff","--fe-primary":"#60a5fa","--fe-primary-hover":"#3b82f6","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"night",nameKey:"theme.name.night",light:{"--fe-bg":"#f6f8fd","--fe-bg-elev":"#edf1fa","--fe-bg-hover":"#e2e9f7","--fe-bg-selected":"#d2ddf4","--fe-border":"#d6deee","--fe-border-strong":"#aebfda","--fe-text":"#151f38","--fe-text-muted":"#49587a","--fe-text-on-primary":"#ffffff","--fe-primary":"#2c4a9e","--fe-primary-hover":"#213a80","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#0a1024","--fe-bg-elev":"#111a35","--fe-bg-hover":"#1a2547","--fe-bg-selected":"#243665","--fe-border":"#26335a","--fe-border-strong":"#3c4e84","--fe-text":"#dfe6f7","--fe-text-muted":"#96a5cc","--fe-text-on-primary":"#050b26","--fe-primary":"#6d8dfc","--fe-primary-hover":"#5273f2","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"forest",nameKey:"theme.name.forest",light:{"--fe-bg":"#f5faf5","--fe-bg-elev":"#eaf3eb","--fe-bg-hover":"#dcecdf","--fe-bg-selected":"#c8e2ce","--fe-border":"#d2e2d4","--fe-border-strong":"#a2c3a8","--fe-text":"#182b1d","--fe-text-muted":"#42604a","--fe-text-on-primary":"#ffffff","--fe-primary":"#2b7a41","--fe-primary-hover":"#226334","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#0d1611","--fe-bg-elev":"#132019","--fe-bg-hover":"#1b2d23","--fe-bg-selected":"#264532","--fe-border":"#28402f","--fe-border-strong":"#3e5f49","--fe-text":"#dcebe0","--fe-text-muted":"#93b09b","--fe-text-on-primary":"#04180b","--fe-primary":"#54c17a","--fe-primary-hover":"#3fae66","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"amber",nameKey:"theme.name.amber",light:{"--fe-bg":"#fdf9f0","--fe-bg-elev":"#f7efdd","--fe-bg-hover":"#f0e3c8","--fe-bg-selected":"#ead6ab","--fe-border":"#e6dabf","--fe-border-strong":"#c6b184","--fe-text":"#33270f","--fe-text-muted":"#655631","--fe-text-on-primary":"#ffffff","--fe-primary":"#9a4b00","--fe-primary-hover":"#7c3c00","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#191307","--fe-bg-elev":"#231a0c","--fe-bg-hover":"#2f2312","--fe-bg-selected":"#44331b","--fe-border":"#3b2e17","--fe-border-strong":"#5b4a29","--fe-text":"#f2e7d4","--fe-text-muted":"#bda887","--fe-text-on-primary":"#2a1c02","--fe-primary":"#f5a524","--fe-primary-hover":"#ffb84d","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"lilac",nameKey:"theme.name.lilac",light:{"--fe-bg":"#faf7fd","--fe-bg-elev":"#f2ecfa","--fe-bg-hover":"#e8ddf5","--fe-bg-selected":"#dccaf0","--fe-border":"#e1d6ee","--fe-border-strong":"#bda6d9","--fe-text":"#241a33","--fe-text-muted":"#584871","--fe-text-on-primary":"#ffffff","--fe-primary":"#7231e0","--fe-primary-hover":"#5f21c4","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#130f1c","--fe-bg-elev":"#1b1527","--fe-bg-hover":"#261d37","--fe-bg-selected":"#37294f","--fe-border":"#302546","--fe-border-strong":"#4b3a6d","--fe-text":"#e9e2f5","--fe-text-muted":"#a999c5","--fe-text-on-primary":"#180d33","--fe-primary":"#b197fa","--fe-primary-hover":"#9c7cf4","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"contrast",nameKey:"theme.name.contrast",light:{"--fe-bg":"#ffffff","--fe-bg-elev":"#f2f2f2","--fe-bg-hover":"#e0e0e0","--fe-bg-selected":"#c9dcff","--fe-border":"#5c5c5c","--fe-border-strong":"#000000","--fe-text":"#000000","--fe-text-muted":"#3d3d3d","--fe-text-on-primary":"#ffffff","--fe-primary":"#003d99","--fe-primary-hover":"#002a6b","--fe-danger":"#a80000","--fe-danger-hover":"#7d0000","--fe-shadow":"0 0 0 1px #000000, 0 10px 32px rgba(0, 0, 0, 0.25)","--fe-shadow-sm":"0 0 0 1px #000000"},dark:{"--fe-bg":"#000000","--fe-bg-elev":"#0d0d0d","--fe-bg-hover":"#212121","--fe-bg-selected":"#003d80","--fe-border":"#8f8f8f","--fe-border-strong":"#ffffff","--fe-text":"#ffffff","--fe-text-muted":"#d6d6d6","--fe-text-on-primary":"#001430","--fe-primary":"#7ab8ff","--fe-primary-hover":"#9ccaff","--fe-danger":"#ff7575","--fe-danger-hover":"#ff9999","--fe-shadow":"0 0 0 1px #ffffff, 0 12px 32px rgba(0, 0, 0, 0.65)","--fe-shadow-sm":"0 0 0 1px #ffffff"}},{id:"gray",nameKey:"theme.name.gray",light:{"--fe-bg":"#f7f7f8","--fe-bg-elev":"#efeff1","--fe-bg-hover":"#e4e4e7","--fe-bg-selected":"#d6d7db","--fe-border":"#dfdfe2","--fe-border-strong":"#b9b9c0","--fe-text":"#26272b","--fe-text-muted":"#585a63","--fe-text-on-primary":"#ffffff","--fe-primary":"#4b4b54","--fe-primary-hover":"#38383f","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f"},dark:{"--fe-bg":"#131316","--fe-bg-elev":"#1b1b1f","--fe-bg-hover":"#26262b","--fe-bg-selected":"#35353c","--fe-border":"#2d2d33","--fe-border-strong":"#4a4a52","--fe-text":"#e6e6e9","--fe-text-muted":"#a4a4ad","--fe-text-on-primary":"#17171b","--fe-primary":"#b0b0ba","--fe-primary-hover":"#c4c4cd","--fe-danger":"#f87171","--fe-danger-hover":"#ef4444"}},{id:"terminal",nameKey:"theme.name.terminal",light:{"--fe-bg":"#f3f9f4","--fe-bg-elev":"#e5f2e8","--fe-bg-hover":"#d5ead9","--fe-bg-selected":"#bce3c6","--fe-border":"#cbe2d1","--fe-border-strong":"#94c2a0","--fe-text":"#0c2913","--fe-text-muted":"#31573c","--fe-text-on-primary":"#ffffff","--fe-primary":"#116b33","--fe-primary-hover":"#0c5427","--fe-danger":"#c62828","--fe-danger-hover":"#a51f1f","--fe-font":'ui-monospace, "SF Mono", Consolas, Menlo, monospace'},dark:{"--fe-bg":"#050d07","--fe-bg-elev":"#0a1710","--fe-bg-hover":"#112418","--fe-bg-selected":"#1a3a26","--fe-border":"#1c3a2a","--fe-border-strong":"#316144","--fe-text":"#4fdd8b","--fe-text-muted":"#38a668","--fe-text-on-primary":"#03180a","--fe-primary":"#25c95e","--fe-primary-hover":"#4fdd8b","--fe-danger":"#ff6b62","--fe-danger-hover":"#ff8d86","--fe-font":'ui-monospace, "SF Mono", Consolas, Menlo, monospace'}}];function ui(e){return _s.find(t=>t.id===e)}const i6=Array.from(new Set(_s.flatMap(e=>[...Object.keys(e.light),...Object.keys(e.dark)])));function o6(){try{const e=localStorage.getItem(fo);return e&&ui(e)?e:pa}catch{return pa}}const Rc=n.ref(typeof window>"u"?pa:o6());function pp(e){const t=ui(e)?e:pa;Rc.value=t;try{t===pa?localStorage.removeItem(fo):localStorage.setItem(fo,t)}catch{}}function hp(){return{themeId:Rc,setTheme:pp}}const ws="filex.thememode",Lc=["host","auto","light","dark"];function s6(){try{const e=localStorage.getItem(ws);return e&&Lc.includes(e)?e:"host"}catch{return"host"}}const zc=n.ref(typeof window>"u"?"host":s6());function l6(e){const t=Lc.includes(e)?e:"host";zc.value=t;try{t==="host"?localStorage.removeItem(ws):localStorage.setItem(ws,t)}catch{}}function c6(){return{themeMode:zc,setThemeMode:l6}}if(typeof window<"u")try{window.addEventListener("storage",e=>{if(e.key!==ws)return;const t=e.newValue;zc.value=t&&Lc.includes(t)?t:"host"})}catch{}if(typeof window<"u")try{window.addEventListener("storage",e=>{e.key===fo&&(Rc.value=e.newValue&&ui(e.newValue)?e.newValue:pa)})}catch{}function mp(e,t,a){for(const o of i6)e.style.removeProperty(o);if(t===pa)return;const r=ui(t);if(!r)return;const i=a?r.dark:r.light;for(const[o,s]of Object.entries(i))e.style.setProperty(o,s)}const gp="data-filex-theme";function bp(e){return Object.entries(e).map(([t,a])=>`${t}:${a};`).join("")}function yp(e){const t=bp(e.light),a=bp(e.dark),r=[".fe--theme-dark",":root[data-theme='dark'] .fe",".fe.fe--theme-dark",":root.dark",".dark",":root.dark .fe",".dark .fe",".fe-ctx-backdrop--theme-dark",".fe-ctx-backdrop--theme-auto[data-prefers-dark='1']"].join(","),i=[".fe:not(.fe--theme-light)",".fe-ctx-backdrop--theme-auto:not(.fe-ctx-backdrop--theme-light)"].join(",");return`/* filex theme: ${e.id} */:root,.fe{${t}}${r}{${a}}@media (prefers-color-scheme: dark){${i}{${a}}}`}function vp(e){if(typeof document>"u")return;let t=document.head.querySelector(`style[${gp}]`);const a=e===pa?void 0:ui(e);if(!a){t&&(t.textContent="");return}t?t!==document.head.lastElementChild&&document.head.appendChild(t):(t=document.createElement("style"),t.setAttribute(gp,""),document.head.appendChild(t));const r=yp(a);t.textContent!==r&&(t.textContent=r)}const d6=["aria-label"],u6={class:"fe-thememode__label"},f6={class:"fe-thememode__seg"},p6=["aria-pressed","onClick"],h6={class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},m6={key:1,d:"M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"},g6={class:"fe-themes__hint"},b6=["aria-label"],y6=["aria-selected","onClick"],v6={class:"fe-themecard__name"},k6=["title"],_6=["disabled"],kp=n.defineComponent({__name:"ThemeGallery",props:{open:{type:Boolean},locale:{},theme:{},dark:{type:Boolean},current:{},mode:{},hostMode:{}},emits:["close","select","mode"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=[{id:"light",labelKey:"theme.mode.light"},{id:"dark",labelKey:"theme.mode.dark"},{id:"auto",labelKey:"theme.mode.auto"}],s=n.computed(()=>a.mode==="host"?a.hostMode:a.mode);function l(d){return a.dark?d.dark:d.light}const c=pa;return(d,u)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("theme.title"),size:"lg",theme:e.theme,onClose:u[2]||(u[2]=p=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",disabled:e.current===n.unref(c),onClick:u[0]||(u[0]=p=>r("select",n.unref(c)))},n.toDisplayString(n.unref(i)("theme.reset")),9,_6),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:u[1]||(u[1]=p=>r("close"))},n.toDisplayString(n.unref(i)("theme.close")),1)]),default:n.withCtx(()=>[n.createElementVNode("div",{class:"fe-thememode",role:"group","aria-label":n.unref(i)("theme.mode.label")},[n.createElementVNode("span",u6,n.toDisplayString(n.unref(i)("theme.mode.label")),1),n.createElementVNode("div",f6,[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(o,p=>n.createElementVNode("button",{key:p.id,type:"button",class:n.normalizeClass(["fe-thememode__opt",{"is-active":s.value===p.id}]),"aria-pressed":s.value===p.id,onClick:f=>r("mode",p.id)},[(n.openBlock(),n.createElementBlock("svg",h6,[p.id==="light"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[u[3]||(u[3]=n.createElementVNode("circle",{cx:"12",cy:"12",r:"4"},null,-1)),u[4]||(u[4]=n.createElementVNode("path",{d:"M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"},null,-1))],64)):p.id==="dark"?(n.openBlock(),n.createElementBlock("path",m6)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[u[5]||(u[5]=n.createElementVNode("circle",{cx:"12",cy:"12",r:"9"},null,-1)),u[6]||(u[6]=n.createElementVNode("path",{d:"M12 3a9 9 0 0 1 0 18z",fill:"currentColor",stroke:"none"},null,-1))],64))])),n.createElementVNode("span",null,n.toDisplayString(n.unref(i)(p.labelKey)),1)],10,p6)),64))])],8,d6),n.createElementVNode("p",g6,n.toDisplayString(n.unref(i)("theme.hint")),1),n.createElementVNode("div",{class:"fe-themes",role:"listbox","aria-label":n.unref(i)("theme.title")},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(n.unref(_s),p=>(n.openBlock(),n.createElementBlock("button",{key:p.id,type:"button",class:n.normalizeClass(["fe-themecard",{"is-selected":p.id===e.current}]),role:"option","aria-selected":p.id===e.current,style:n.normalizeStyle(l(p)),onClick:f=>r("select",p.id)},[u[7]||(u[7]=n.createElementVNode("span",{class:"fe-themecard__preview","aria-hidden":"true"},[n.createElementVNode("span",{class:"fe-themecard__topbar"},[n.createElementVNode("span",{class:"fe-themecard__chip fe-themecard__chip--primary"}),n.createElementVNode("span",{class:"fe-themecard__chip"}),n.createElementVNode("span",{class:"fe-themecard__chip fe-themecard__chip--ghost"})]),n.createElementVNode("span",{class:"fe-themecard__row"},[n.createElementVNode("span",{class:"fe-themecard__dot"}),n.createElementVNode("span",{class:"fe-themecard__line",style:{width:"62%"}})]),n.createElementVNode("span",{class:"fe-themecard__row fe-themecard__row--selected"},[n.createElementVNode("span",{class:"fe-themecard__dot fe-themecard__dot--primary"}),n.createElementVNode("span",{class:"fe-themecard__line",style:{width:"44%"}})]),n.createElementVNode("span",{class:"fe-themecard__row"},[n.createElementVNode("span",{class:"fe-themecard__dot fe-themecard__dot--muted"}),n.createElementVNode("span",{class:"fe-themecard__line fe-themecard__line--muted",style:{width:"74%"}})])],-1)),n.createElementVNode("span",v6,[n.createTextVNode(n.toDisplayString(n.unref(i)(p.nameKey))+" ",1),p.id===e.current?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-themecard__check",title:n.unref(i)("theme.selected")},"✓",8,k6)):n.createCommentVNode("",!0)])],14,y6))),128))],8,b6)]),_:1},8,["open","title","theme"]))}}),w6={class:"fe-shortset"},E6={class:"fe-shortset__topbar"},S6={class:"fe-shortset__hint"},x6=["disabled"],C6={class:"fe-shortcuts__heading"},N6={class:"fe-shortset__row"},T6={class:"fe-shortset__label"},D6=["title"],B6={class:"fe-shortset__keys"},A6={key:0,class:"fe-shortset__capture",role:"status"},M6={key:0,class:"fe-shortcuts__unbound"},O6={class:"fe-kbd"},I6={key:0,class:"fe-shortcuts__or","aria-hidden":"true"},R6={class:"fe-shortset__actions"},L6=["onClick"],z6=["title","aria-label","onClick"],F6={key:1,class:"fe-shortset__fixed"},P6={key:0,class:"fe-shortset__conflict",role:"alert"},$6={class:"fe-shortset__conflict-msg"},V6={class:"fe-kbd"},U6={class:"fe-shortset__conflict-actions"},_p=n.defineComponent({__name:"ShortcutSettings",props:{open:{type:Boolean},locale:{},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=Tc(),s=n.computed(()=>{const y=[],S=new Map;for(const x of o.value)S.has(x.groupKey)||(S.set(x.groupKey,[]),y.push(x.groupKey)),S.get(x.groupKey).push(x);return y.map(x=>({key:x,items:S.get(x)}))}),l=n.computed(()=>o.value.some(y=>y.overridden)),c=n.ref(null),d=n.ref(null);function u(y){const S=cr.find(x=>x.id===y);return S?i(S.labelKey):y}function p(y){d.value=null,c.value=y}function f(){c.value=null}function h(y,S){if(c.value=null,S===so(y))return;const x=Gf(S,y);if(x){d.value={id:y,combo:S,conflictId:x.id,fixed:x.fixed};return}ps(y,S)}function _(){const y=d.value;!y||y.fixed||(ps(y.conflictId,""),ps(y.id,y.combo),d.value=null)}function b(){d.value=null}function k(y){d.value=null,Uf(y)}function m(){d.value=null,c.value=null,Hf()}function v(y){if(c.value){if(y.preventDefault(),y.stopPropagation(),y.key==="Escape"){f();return}const S=Nc(y);if(!S)return;h(c.value,S);return}y.key==="Escape"||y.key==="Tab"||y.stopPropagation()}n.watch(()=>a.open,y=>{y?window.addEventListener("keydown",v,!0):(window.removeEventListener("keydown",v,!0),c.value=null,d.value=null)}),n.onBeforeUnmount(()=>window.removeEventListener("keydown",v,!0));function g(){if(c.value){f();return}r("close")}return(y,S)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("shortcuts.settings.title"),size:"lg",theme:e.theme,onClose:g},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:g},n.toDisplayString(n.unref(i)("viewer.close")),1)]),default:n.withCtx(()=>[n.createElementVNode("div",w6,[n.createElementVNode("div",E6,[n.createElementVNode("p",S6,n.toDisplayString(n.unref(i)("shortcuts.settings.hint")),1),n.createElementVNode("button",{type:"button",class:"fe-btn fe-shortset__reset-all",disabled:!l.value,onClick:m}," ↺ "+n.toDisplayString(n.unref(i)("shortcuts.settings.reset_all")),9,x6)]),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(s.value,x=>(n.openBlock(),n.createElementBlock("section",{key:x.key,class:"fe-shortset__group"},[n.createElementVNode("h3",C6,n.toDisplayString(n.unref(i)(x.key)),1),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(x.items,N=>{var w;return n.openBlock(),n.createElementBlock("div",{key:N.id,class:n.normalizeClass(["fe-shortset__item",{"is-capturing":c.value===N.id,"is-conflict":((w=d.value)==null?void 0:w.id)===N.id}])},[n.createElementVNode("div",N6,[n.createElementVNode("span",T6,[n.createTextVNode(n.toDisplayString(n.unref(i)(N.labelKey))+" ",1),N.overridden?(n.openBlock(),n.createElementBlock("span",{key:0,class:"fe-shortcuts__custom",title:n.unref(i)("shortcuts.settings.customized")},"●",8,D6)):n.createCommentVNode("",!0)]),n.createElementVNode("span",B6,[c.value===N.id?(n.openBlock(),n.createElementBlock("span",A6,n.toDisplayString(n.unref(i)("shortcuts.settings.capture")),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[N.keys.length===0?(n.openBlock(),n.createElementBlock("span",M6,n.toDisplayString(n.unref(i)("shortcuts.settings.unbound")),1)):(n.openBlock(!0),n.createElementBlock(n.Fragment,{key:1},n.renderList(N.keys,(E,C)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:E},[n.createElementVNode("kbd",O6,n.toDisplayString(E),1),C<N.keys.length-1?(n.openBlock(),n.createElementBlock("span",I6,"/")):n.createCommentVNode("",!0)],64))),128))],64))]),n.createElementVNode("span",R6,[N.customizable?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[c.value!==N.id?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-shortset__btn",onClick:E=>p(N.id)},n.toDisplayString(n.unref(i)("shortcuts.settings.change")),9,L6)):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn fe-shortset__btn",onClick:f},n.toDisplayString(n.unref(i)("shortcuts.settings.conflict_cancel")),1)),N.overridden?(n.openBlock(),n.createElementBlock("button",{key:2,type:"button",class:"fe-btn fe-btn--icon-only fe-shortset__btn",title:n.unref(i)("shortcuts.settings.reset"),"aria-label":n.unref(i)("shortcuts.settings.reset"),onClick:E=>k(N.id)}," ↺ ",8,z6)):n.createCommentVNode("",!0)],64)):(n.openBlock(),n.createElementBlock("span",F6,n.toDisplayString(n.unref(i)("shortcuts.settings.fixed")),1))])]),d.value&&d.value.id===N.id?(n.openBlock(),n.createElementBlock("div",P6,[n.createElementVNode("span",$6,[n.createElementVNode("kbd",V6,n.toDisplayString(d.value.combo),1),n.createTextVNode(" "+n.toDisplayString(d.value.fixed?n.unref(i)("shortcuts.settings.conflict_fixed",{name:u(d.value.conflictId)}):n.unref(i)("shortcuts.settings.conflict",{name:u(d.value.conflictId)})),1)]),n.createElementVNode("span",U6,[d.value.fixed?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--danger fe-shortset__btn",onClick:_},n.toDisplayString(n.unref(i)("shortcuts.settings.conflict_take")),1)),n.createElementVNode("button",{type:"button",class:"fe-btn fe-shortset__btn",onClick:b},n.toDisplayString(n.unref(i)("shortcuts.settings.conflict_cancel")),1)])])):n.createCommentVNode("",!0)],2)}),128))]))),128))])]),_:1},8,["open","title","theme"]))}}),H6={key:0,class:"fe-preview"},G6=["src","alt"],K6=["src"],q6=["src"],W6=["data"],j6={class:"fe-preview__fallback"},Y6=["href"],X6={key:0,class:"fe-preview__fallback"},Z6={key:1,class:"fe-preview__fallback"},J6=["href"],Q6={key:2,class:"fe-preview__md-split"},e8={class:"fe-preview__md-split-bar"},t8={key:0,class:"fe-preview__md-split-error"},n8=["disabled"],a8={class:"fe-preview__md-split-body"},r8=["onKeydown"],i8={key:0,class:"fe-preview__md-split-output fe-preview__md"},o8=["innerHTML"],s8={key:3,class:"fe-preview__fallback"},l8=["href"],c8=["innerHTML"],d8={key:5,class:"fe-preview__pre"},u8={key:0,class:"fe-preview__fallback"},f8=["href"],p8={key:1,class:"fe-preview__fallback"},h8={key:0,class:"fe-preview__fallback"},m8={key:1,class:"fe-preview__fallback"},g8=["href"],b8={key:2,class:"fe-preview__fallback"},y8=["href"],v8={key:3,class:"fe-preview__code-wrap"},k8={class:"fe-preview__code-toolbar"},_8={class:"fe-preview__code-lang"},w8={key:0,class:"fe-preview__code-status"},E8={key:1,class:"fe-preview__code-status fe-preview__code-status--ok"},S8=["title"],x8={key:3,class:"fe-preview__code-status"},C8=["disabled"],N8={key:0,class:"fe-preview__pre fe-preview__code hljs"},T8=["innerHTML"],D8=["data-lang"],B8={key:0,class:"fe-preview__fallback"},A8=["href"],M8={key:8,class:"fe-preview__fallback"},O8=["href"],I8=["href"],Fc=1e6,wp="fe-onlyoffice-api-js",Pc=n.defineComponent({__name:"PreviewModal",props:{open:{type:Boolean},locale:{},file:{},previewUrl:{type:Function},downloadUrl:{type:Function},onlyOfficeBase:{},onlyOfficeConfigEndpoint:{},saveTextEndpoint:{},openMode:{},authHeaders:{type:Function},authCredentials:{},drawioUrl:{},pdfWorkerUrl:{},pdfSaveUrl:{},viewerBaseUrl:{},newTabEnabled:{type:Boolean},chromeless:{type:Boolean},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale);function o(oe){return((oe==null?void 0:oe.extension)||"").toLowerCase()}const s=["jpg","jpeg","png","webp","gif","bmp","avif","svg","heic"],l=["mp4","webm","mov","mkv","m4v","ogv"],c=["mp3","wav","ogg","flac","m4a","aac","opus"],d={md:"markdown",markdown:"markdown",txt:"plaintext",log:"plaintext",js:"javascript",mjs:"javascript",cjs:"javascript",ts:"typescript",tsx:"typescript",jsx:"javascript",vue:"xml",svelte:"xml",html:"xml",htm:"xml",xml:"xml",svg:"xml",css:"css",scss:"scss",sass:"scss",less:"less",json:"json",jsonc:"json",yml:"yaml",yaml:"yaml",php:"php",py:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",swift:"swift",cpp:"cpp",c:"c",h:"cpp",hpp:"cpp",cs:"csharp",dart:"dart",sh:"bash",bash:"bash",zsh:"bash",fish:"bash",sql:"sql",toml:"ini",ini:"ini",conf:"ini",env:"bash",cfg:"ini",dockerfile:"dockerfile",graphql:"graphql",gql:"graphql",diff:"diff",patch:"diff"},u=["txt","log"],p=["docx","doc","xlsx","xls","pptx","ppt","odt","ods","odp","rtf"],f={glb:()=>Promise.resolve().then(()=>mi),gltf:()=>Promise.resolve().then(()=>mi),obj:()=>Promise.resolve().then(()=>mi),stl:()=>Promise.resolve().then(()=>mi),fbx:()=>Promise.resolve().then(()=>mi),"3ds":()=>Promise.resolve().then(()=>mi),epub:()=>Promise.resolve().then(()=>sA),mmd:()=>Promise.resolve().then(()=>Tm),mermaid:()=>Promise.resolve().then(()=>Tm),drawio:()=>Promise.resolve().then(()=>Dm),dio:()=>Promise.resolve().then(()=>Dm),tif:()=>Promise.resolve().then(()=>Bm),tiff:()=>Promise.resolve().then(()=>Bm),psd:()=>Promise.resolve().then(()=>CA),ipynb:()=>Promise.resolve().then(()=>GA),csv:()=>Promise.resolve().then(()=>Mm),tsv:()=>Promise.resolve().then(()=>Mm),zip:()=>Promise.resolve().then(()=>fM)},h=n.computed(()=>{const oe=o(a.file);if(!oe)return"other";if(s.includes(oe))return"image";if(l.includes(oe))return"video";if(c.includes(oe))return"audio";if(oe==="pdf")return"pdf";const ie=a.openMode!=="view";return oe==="md"||oe==="markdown"?"markdown":oe in d?"code":oe in f?"viewer":p.includes(oe)?"office":u.includes(oe)?ie?"code":"text":"other"}),_=n.shallowRef(null),b=n.ref(null),k=n.ref(!1);async function m(oe){_.value=null,b.value=null;const ie=f[oe];if(ie)try{const we=await ie();_.value=we.default??we}catch(we){b.value=we instanceof Error?we.message:"viewer load failed",oe==="pdf"&&(k.value=!0)}}function v(){k.value=!0}const g=n.computed(()=>{var we;const oe=o(a.file),ie={url:E.value,ext:oe,mime:(we=a.file)==null?void 0:we.mime_type,t:i,authHeaders:a.authHeaders,authCredentials:a.authCredentials};return a.file&&(ie.filePath=A(a.file.path),(oe==="zip"||oe==="rar"||oe==="7z"||oe==="tar"||oe==="gz"||oe==="tgz")&&(ie.filePath=a.file.path)),(oe==="drawio"||oe==="dio")&&(ie.drawioUrl=a.drawioUrl??void 0,ie.saveUrl=a.saveTextEndpoint??void 0,ie.readOnly=a.openMode==="view"),oe==="pdf"&&(ie.pdfWorkerUrl=a.pdfWorkerUrl??void 0,ie.pdfSaveUrl=a.pdfSaveUrl??void 0),ie});function y(){x(a.openMode||"edit")}function S(){x("edit")}function x(oe){if(!a.file)return;const ie=o(a.file),we=a.viewerBaseUrl||"/files/edit",te=we.includes("?")?"&":"?",ye=`${we}${te}path=${encodeURIComponent(a.file.path)}&type=${encodeURIComponent(ie)}&mode=${encodeURIComponent(oe)}`;window.open(ye,"_blank","noopener")}const N=new Set(["docx","doc","xlsx","xls","pptx","ppt","odt","ods","odp","rtf","drawio","dio","mmd","mermaid","md","markdown","txt","log","json","jsonc","yaml","yml","xml","svg","html","htm","js","mjs","cjs","ts","tsx","jsx","vue","svelte","css","scss","sass","less","php","py","rb","go","rs","java","kt","swift","cpp","c","h","hpp","cs","dart","sh","bash","sql","toml","ini","conf","cfg","env","dockerfile","graphql","gql"]),w=n.computed(()=>!!a.file&&N.has(o(a.file))),E=n.computed(()=>a.file?a.previewUrl(a.file.path):""),C=n.computed(()=>a.file?a.downloadUrl(a.file.path):"");function A(oe){const ie=oe.indexOf("://");return ie===-1?oe:oe.slice(ie+3)}const L=n.ref(!1),R=n.ref(null),$=n.ref(""),Y=n.ref(!1),F=n.ref(!1),q=n.ref(!1);let X,z;function H(){F.value=!0,X&&clearTimeout(X),X=setTimeout(()=>{xe($.value)},250),z&&clearTimeout(z),z=setTimeout(()=>{O()},1500)}async function O(){if(!(!a.saveTextEndpoint||!a.file||q.value)){q.value=!0,R.value=null;try{const oe={"Content-Type":"application/json",...await(a.authHeaders??(()=>({})))()},ie=await fetch(a.saveTextEndpoint,{method:"POST",headers:oe,credentials:a.authCredentials||"same-origin",body:JSON.stringify({path:A(a.file.path),content:$.value})});if(!ie.ok)throw new Error(`save failed: ${ie.status} ${await ie.text()}`);F.value=!1}catch(oe){R.value=oe instanceof Error?oe.message:String(oe)}finally{q.value=!1}}}async function P(oe){L.value=!0,R.value=null,$.value="",Y.value=!1;try{const ie={};a.authHeaders&&Object.assign(ie,await a.authHeaders());const we=await fetch(oe,{credentials:a.authCredentials||"same-origin",headers:ie});if(!we.ok)throw new Error(`${we.status} ${we.statusText}`);if(Number(we.headers.get("content-length")||"0")>Fc){Y.value=!0;return}const ye=await we.text();ye.length>Fc?(Y.value=!0,$.value=ye.slice(0,Fc)):$.value=ye}catch(ie){R.value=ie instanceof Error?ie.message:String(ie)}finally{L.value=!1}}const K=n.ref(""),J=n.ref(null),de=n.ref(!1);async function xe(oe){try{const ie=await import("markdown-it").catch(()=>null);if(!ie){K.value="",de.value=!0;return}de.value=!1;const we=ie.default??ie,ye=new we({html:!0,linkify:!0,breaks:!0,typographer:!0}).render(oe);K.value=ke(ye),await new Promise(V=>setTimeout(V,0)),await ae()}catch(ie){K.value="",R.value=ie instanceof Error?ie.message:String(ie)}}function ke(oe){return oe.replace(/<\s*script\b[^<]*(?:(?!<\s*\/\s*script\s*>)<[^<]*)*<\s*\/\s*script\s*>/gi,"").replace(/<\s*iframe\b[\s\S]*?<\s*\/\s*iframe\s*>/gi,"").replace(/<\s*object\b[\s\S]*?<\s*\/\s*object\s*>/gi,"").replace(/<\s*embed\b[^>]*>/gi,"").replace(/\son\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi,"").replace(/(href|src|action|formaction|xlink:href)\s*=\s*(?:"\s*javascript:[^"]*"|'\s*javascript:[^']*')/gi,'$1="#"')}async function ae(){var ye,V,Be;if(!J.value)return;const oe=J.value,ie=Array.from(oe.querySelectorAll("pre > code"));if(ie.length===0)return;let we,te;for(const st of ie){const D=st.className||"",Ee=/\blanguage-mermaid\b/.test(D)||/\blanguage-mmd\b/.test(D),Se=/\blanguage-math\b/.test(D)||/\blanguage-latex\b/.test(D)||/\blanguage-tex\b/.test(D);if(Ee){if(we===void 0)try{const G=await import("mermaid");we=G.default??G,(ye=we.initialize)==null||ye.call(we,{startOnLoad:!1,securityLevel:"strict"})}catch{we=null}if(!we)continue;try{const G=`filex-md-mermaid-${Math.random().toString(36).slice(2)}`,{svg:re}=await we.render(G,st.textContent||""),ve=document.createElement("div");ve.className="fe-preview__md-mermaid",ve.innerHTML=re,(V=st.parentElement)==null||V.replaceWith(ve)}catch{}}else if(Se){if(te===void 0)try{const G=await Promise.resolve().then(()=>XO);te=G.default??G}catch{te=null}if(!te)continue;try{const G=te.renderToString(st.textContent||"",{displayMode:!0,throwOnError:!1}),re=document.createElement("div");re.className="fe-preview__md-math",re.innerHTML=G,(Be=st.parentElement)==null||Be.replaceWith(re)}catch{}}}}const be=n.ref("");async function _e(oe,ie){try{const we=await vs();if(!we){be.value="";return}const te=we.default??we;if(te.getLanguage(ie)){const ye=te.highlight(oe,{language:ie,ignoreIllegals:!0});be.value=ye.value}else{const ye=te.highlightAuto(oe);be.value=ye.value}}catch(we){be.value="",R.value=we instanceof Error?we.message:String(we)}}const Ce=n.ref(null);let Ve=null,rt;const tt=n.ref(!1),Pe=n.ref(!1),ze=n.ref(!1),Ie=n.ref(!1),pe=n.ref(null);function Ge(){if(Ve){try{Ve.dispose()}catch{}Ve=null}tt.value=!1,Ie.value=!1,pe.value=null}function ge(oe){return{js:"javascript",mjs:"javascript",cjs:"javascript",ts:"typescript",tsx:"typescript",jsx:"javascript",json:"json",jsonc:"json",css:"css",scss:"scss",sass:"scss",less:"less",html:"html",htm:"html",vue:"html",svelte:"html",xml:"xml",svg:"xml",md:"markdown",markdown:"markdown",php:"php",py:"python",yml:"yaml",yaml:"yaml",go:"go",rs:"rust",sql:"sql",cpp:"cpp",c:"c",h:"cpp",hpp:"cpp",sh:"shell",bash:"shell",dockerfile:"dockerfile",toml:"ini",ini:"ini",conf:"ini",cfg:"ini"}[oe]??"plaintext"}async function he(oe,ie){var te;const we=await ys();if(we||(Pe.value=!0),!we||!Ce.value)return!1;try{Ge();const ye=!!a.saveTextEndpoint&&a.openMode!=="view",V=a.theme==="dark"?!0:a.theme==="light"?!1:(te=window.matchMedia)==null?void 0:te.call(window,"(prefers-color-scheme: dark)").matches;return Ve=we.editor.create(Ce.value,{value:oe,language:ge(ie),readOnly:!ye,theme:V?"vs-dark":"vs",automaticLayout:!0,minimap:{enabled:!1},fontSize:13}),ye&&(Ve.addCommand(we.KeyMod.CtrlCmd|we.KeyCode.KeyS,()=>void Ae()),Ve.onDidChangeModelContent(()=>{rt&&clearTimeout(rt),rt=setTimeout(()=>{Ae()},1500)})),tt.value=!0,!0}catch(ye){return R.value=`Monaco mount fail: ${ye.message}`,!1}}async function Ae(){if(!(!a.saveTextEndpoint||!a.file)&&a.openMode!=="view"&&!ze.value){ze.value=!0,Ie.value=!1,pe.value=null;try{const oe=Ve?Ve.getValue():"",ie={"Content-Type":"application/json"};a.authHeaders&&Object.assign(ie,await a.authHeaders());const we=await fetch(a.saveTextEndpoint,{method:"POST",headers:ie,credentials:a.authCredentials||"same-origin",body:JSON.stringify({path:A(a.file.path),content:oe})});if(!we.ok){const te=await we.text().catch(()=>"");throw new Error(`${we.status} ${we.statusText}${te?" — "+te.slice(0,150):""}`)}Ie.value=!0,setTimeout(()=>{Ie.value=!1},2500)}catch(oe){pe.value=oe.message}finally{ze.value=!1}}}async function nt(oe,ie,we){if($.value="",K.value="",be.value="",R.value=null,fe.value=null,_.value=null,b.value=null,k.value=!1,et(),Ge(),!(!oe||!ie)){if(we==="viewer"){await m(o(a.file));return}if(we==="markdown"||we==="code"||we==="text"){if(await P(ie),Y.value)return;if(we==="markdown"){await xe($.value);return}const te=d[o(a.file)]||"";Bc()?(await new Promise(Be=>setTimeout(Be,0)),await he($.value,o(a.file))||await _e($.value,te)):(we==="code"&&await _e($.value,te),ys().then(async V=>{if(!V){Pe.value=!0;return}a.open&&(await new Promise(Be=>setTimeout(Be,0)),await he($.value,o(a.file)))}))}else we==="office"&&(await new Promise(te=>setTimeout(te,0)),await Ue())}}n.watch(()=>[a.open,E.value,h.value,a.openMode],([oe,ie,we])=>{nt(oe,ie,we)}),n.onMounted(()=>{n.nextTick(()=>{a.open&&nt(a.open,E.value,h.value)})});const Re=n.computed(()=>d[o(a.file)]||"plaintext"),Me=n.ref(null),fe=n.ref(null);let Te=null;async function Ue(){if(fe.value=null,!(!a.file||h.value!=="office")){if(!a.onlyOfficeConfigEndpoint){fe.value="OnlyOffice yapılandırması yok";return}if(Me.value)try{const oe={"Content-Type":"application/json"};a.authHeaders&&Object.assign(oe,await a.authHeaders());const ie=await fetch(a.onlyOfficeConfigEndpoint,{method:"POST",headers:oe,credentials:a.authCredentials||"same-origin",body:JSON.stringify({path:a.file.path,mode:a.openMode||"edit"})});if(!ie.ok)throw new Error(`Config fetch ${ie.status}: ${(await ie.text()).slice(0,200)}`);const{config:we,documentServerUrl:te}=await ie.json();await j(te),et();const ye="fe-onlyoffice-mount";Me.value.id=ye,we.events={onError:Be=>{fe.value=_t(Be)}};const V=window;if(!V.DocsAPI||!V.DocsAPI.DocEditor)throw new Error("DocsAPI not available after script load");Te=new V.DocsAPI.DocEditor(ye,we)}catch(oe){fe.value=oe instanceof Error?oe.message:String(oe)}}}function et(){var oe;try{(oe=Te==null?void 0:Te.destroyEditor)==null||oe.call(Te)}catch{}Te=null}n.onBeforeUnmount(()=>{et(),Ge()});function _t(oe){if(typeof oe=="string")return oe;const ie=oe;if(ie!=null&&ie.data&&typeof ie.data=="object"){const we=ie.data;if(typeof we.errorDescription=="string")return we.errorDescription;if(typeof we.message=="string")return we.message;if(we.errorCode!==void 0)return`OnlyOffice error ${we.errorCode}`}if(typeof(ie==null?void 0:ie.data)=="string")return ie.data;if(typeof(ie==null?void 0:ie.errorDescription)=="string")return ie.errorDescription;if(typeof(ie==null?void 0:ie.message)=="string")return ie.message;try{return JSON.stringify(oe)}catch{return"OnlyOffice error"}}function j(oe){return new Promise((ie,we)=>{var V;if((V=window.DocsAPI)!=null&&V.DocEditor){ie();return}const te=document.getElementById(wp);if(te){te.addEventListener("load",()=>ie()),te.addEventListener("error",()=>we(new Error("OnlyOffice api.js load failed")));return}const ye=document.createElement("script");ye.id=wp,ye.src=`${oe.replace(/\/$/,"")}/web-apps/apps/api/documents/api.js`,ye.async=!0,ye.onload=()=>ie(),ye.onerror=()=>we(new Error("OnlyOffice api.js load failed")),document.head.appendChild(ye)})}return(oe,ie)=>{var we;return n.openBlock(),n.createBlock(Ua,{open:e.open,size:"xl",title:((we=e.file)==null?void 0:we.basename)||"",chromeless:e.chromeless,theme:e.theme,onClose:ie[2]||(ie[2]=te=>r("close"))},{actions:n.withCtx(()=>[e.file&&e.openMode==="view"&&w.value&&e.newTabEnabled!==!1?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--primary",onClick:S},"✏ "+n.toDisplayString(n.unref(i)("viewer.edit")),1)):n.createCommentVNode("",!0),e.file&&e.newTabEnabled!==!1?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-btn",onClick:y},"↗ "+n.toDisplayString(n.unref(i)("viewer.open_in_new_tab")),1)):n.createCommentVNode("",!0),e.file?(n.openBlock(),n.createElementBlock("a",{key:2,href:C.value,class:"fe-btn"},n.toDisplayString(n.unref(i)("viewer.download")),9,I8)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:ie[1]||(ie[1]=te=>r("close"))},n.toDisplayString(n.unref(i)("viewer.close")),1)]),default:n.withCtx(()=>[e.file?(n.openBlock(),n.createElementBlock("div",H6,[h.value==="image"?(n.openBlock(),n.createElementBlock("img",{key:0,src:E.value,alt:e.file.basename,class:"fe-preview__image"},null,8,G6)):h.value==="video"?(n.openBlock(),n.createElementBlock("video",{key:1,src:E.value,controls:"",preload:"metadata",class:"fe-preview__video"},null,8,K6)):h.value==="audio"?(n.openBlock(),n.createElementBlock("audio",{key:2,src:E.value,controls:"",class:"fe-preview__audio"},null,8,q6)):h.value==="pdf"?(n.openBlock(),n.createElementBlock("object",{key:3,data:E.value,type:"application/pdf",class:"fe-preview__iframe"},[n.createElementVNode("div",j6,[ie[3]||(ie[3]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"📕",-1)),ie[4]||(ie[4]=n.createElementVNode("p",null,"Tarayıcı PDF'i inline açamadı.",-1)),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary",target:"_blank",rel:"noopener"},"PDF'i Yeni Sekmede Aç",8,Y6)])],8,W6)):h.value==="markdown"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:4},[L.value?(n.openBlock(),n.createElementBlock("div",X6,n.toDisplayString(n.unref(i)("viewer.loading")),1)):Y.value?(n.openBlock(),n.createElementBlock("div",Z6,[ie[5]||(ie[5]=n.createTextVNode(" Dosya çok büyük (>1 MB). ",-1)),n.createElementVNode("a",{href:C.value,class:"fe-btn"},n.toDisplayString(n.unref(i)("viewer.download")),9,J6)])):e.openMode==="edit"&&e.saveTextEndpoint?(n.openBlock(),n.createElementBlock("div",Q6,[n.createElementVNode("div",e8,[ie[6]||(ie[6]=n.createElementVNode("span",{class:"fe-preview__md-split-label"},"MARKDOWN",-1)),R.value?(n.openBlock(),n.createElementBlock("span",t8,n.toDisplayString(R.value),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",disabled:!F.value||q.value,onClick:O},n.toDisplayString(q.value?n.unref(i)("viewer.saving"):F.value?n.unref(i)("viewer.save"):n.unref(i)("viewer.saved")),9,n8)]),n.createElementVNode("div",a8,[n.withDirectives(n.createElementVNode("textarea",{class:"fe-preview__md-split-input","onUpdate:modelValue":ie[0]||(ie[0]=te=>$.value=te),onInput:H,onKeydown:[n.withKeys(n.withModifiers(O,["ctrl","prevent"]),["s"]),n.withKeys(n.withModifiers(O,["meta","prevent"]),["s"])],spellcheck:"false",placeholder:"# Markdown buraya…"},null,40,r8),[[n.vModelText,$.value]]),de.value?(n.openBlock(),n.createElementBlock("div",i8,n.toDisplayString(n.unref(i)("viewer.peer_not_installed")),1)):(n.openBlock(),n.createElementBlock("div",{key:1,ref_key:"markdownEl",ref:J,class:"fe-preview__md-split-output fe-preview__md",innerHTML:K.value},null,8,o8))])])):R.value?(n.openBlock(),n.createElementBlock("div",s8,[n.createElementVNode("p",null,n.toDisplayString(R.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,l8)])):K.value?(n.openBlock(),n.createElementBlock("div",{key:4,ref_key:"markdownEl",ref:J,class:"fe-preview__md",innerHTML:K.value},null,8,c8)):(n.openBlock(),n.createElementBlock("pre",d8,n.toDisplayString($.value),1))],64)):h.value==="viewer"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:5},[b.value&&!k.value?(n.openBlock(),n.createElementBlock("div",u8,[ie[7]||(ie[7]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"⚠️",-1)),n.createElementVNode("p",null,n.toDisplayString(b.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,f8)])):_.value?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(_.value),n.mergeProps({key:2},g.value,{class:"fe-preview__viewer",onFallback:v}),null,16)):(n.openBlock(),n.createElementBlock("div",p8,[ie[8]||(ie[8]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"⏳",-1)),n.createElementVNode("p",null,n.toDisplayString(n.unref(i)("viewer.loading")),1)]))],64)):h.value==="code"||h.value==="text"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:6},[L.value?(n.openBlock(),n.createElementBlock("div",h8,n.toDisplayString(n.unref(i)("viewer.loading")),1)):Y.value?(n.openBlock(),n.createElementBlock("div",m8,[ie[9]||(ie[9]=n.createTextVNode(" Dosya çok büyük (>1 MB). ",-1)),n.createElementVNode("a",{href:C.value,class:"fe-btn"},n.toDisplayString(n.unref(i)("viewer.download")),9,g8)])):R.value?(n.openBlock(),n.createElementBlock("div",b8,[n.createElementVNode("p",null,n.toDisplayString(R.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,y8)])):(n.openBlock(),n.createElementBlock("div",v8,[n.createElementVNode("div",k8,[n.createElementVNode("span",_8,n.toDisplayString(Re.value),1),!tt.value&&be.value?(n.openBlock(),n.createElementBlock("span",w8,n.toDisplayString(e.saveTextEndpoint&&!Pe.value?n.unref(i)("viewer.editor_loading"):n.unref(i)("viewer.read_only")),1)):n.createCommentVNode("",!0),Ie.value?(n.openBlock(),n.createElementBlock("span",E8,"✓ "+n.toDisplayString(n.unref(i)("viewer.saved")),1)):n.createCommentVNode("",!0),pe.value?(n.openBlock(),n.createElementBlock("span",{key:2,class:"fe-preview__code-status fe-preview__code-status--err",title:pe.value},"✗ "+n.toDisplayString(n.unref(i)("viewer.save_error")),9,S8)):n.createCommentVNode("",!0),e.openMode==="view"?(n.openBlock(),n.createElementBlock("span",x8,n.toDisplayString(n.unref(i)("viewer.read_only")),1)):e.saveTextEndpoint&&tt.value?(n.openBlock(),n.createElementBlock("button",{key:4,type:"button",class:"fe-btn fe-btn--primary",disabled:ze.value,onClick:Ae},n.toDisplayString(ze.value?n.unref(i)("viewer.saving"):n.unref(i)("viewer.save")),9,C8)):n.createCommentVNode("",!0)]),n.createElementVNode("div",{ref_key:"monacoEl",ref:Ce,class:n.normalizeClass(["fe-preview__code-editor",{"is-hidden":!tt.value}])},null,2),!tt.value&&be.value?(n.openBlock(),n.createElementBlock("pre",N8,[n.createElementVNode("code",{class:n.normalizeClass(`language-${Re.value}`),innerHTML:be.value},null,10,T8)])):!tt.value&&!be.value?(n.openBlock(),n.createElementBlock("pre",{key:1,class:"fe-preview__pre","data-lang":Re.value},n.toDisplayString($.value),9,D8)):n.createCommentVNode("",!0)]))],64)):h.value==="office"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:7},[fe.value?(n.openBlock(),n.createElementBlock("div",B8,[ie[10]||(ie[10]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"📄",-1)),n.createElementVNode("p",null,n.toDisplayString(fe.value),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,A8)])):(n.openBlock(),n.createElementBlock("div",{key:1,ref_key:"officeEl",ref:Me,class:"fe-preview__office"},null,512))],64)):(n.openBlock(),n.createElementBlock("div",M8,[ie[11]||(ie[11]=n.createElementVNode("span",{class:"fe-preview__fallback-icon"},"📎",-1)),n.createElementVNode("p",null,n.toDisplayString(n.unref(i)("viewer.no_preview")),1),n.createElementVNode("a",{href:C.value,class:"fe-btn fe-btn--primary"},n.toDisplayString(n.unref(i)("viewer.download")),9,O8)]))])):n.createCommentVNode("",!0)]),_:1},8,["open","title","chromeless","theme"])}}}),Ep=n.defineComponent({__name:"QuickLook",props:{open:{type:Boolean},locale:{},file:{},previewUrl:{type:Function},downloadUrl:{type:Function},onlyOfficeBase:{},onlyOfficeConfigEndpoint:{},authHeaders:{type:Function},authCredentials:{},drawioUrl:{},pdfWorkerUrl:{},viewerBaseUrl:{},theme:{}},emits:["close","nav","open-full"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale);function o(l){const c=l;return!!(c&&(c.tagName==="INPUT"||c.tagName==="TEXTAREA"||c.tagName==="SELECT"||c.isContentEditable))}function s(l){if(a.open&&!(l.ctrlKey||l.metaKey||l.altKey)&&!o(l.target))switch(l.key){case" ":l.preventDefault(),l.stopPropagation(),r("close");break;case"ArrowRight":case"ArrowDown":l.preventDefault(),l.stopPropagation(),r("nav",1);break;case"ArrowLeft":case"ArrowUp":l.preventDefault(),l.stopPropagation(),r("nav",-1);break;case"Enter":l.preventDefault(),l.stopPropagation(),r("open-full");break}}return n.watch(()=>a.open,l=>{l?window.addEventListener("keydown",s,!0):window.removeEventListener("keydown",s,!0)},{immediate:!0}),n.onBeforeUnmount(()=>window.removeEventListener("keydown",s,!0)),(l,c)=>(n.openBlock(),n.createElementBlock(n.Fragment,null,[n.createVNode(Pc,{class:"fe-quicklook",open:e.open,locale:e.locale,file:e.file,theme:e.theme,"preview-url":e.previewUrl,"download-url":e.downloadUrl,"only-office-base":e.onlyOfficeBase,"only-office-config-endpoint":e.onlyOfficeConfigEndpoint,"open-mode":"view","auth-headers":e.authHeaders,"auth-credentials":e.authCredentials,"drawio-url":e.drawioUrl,"pdf-worker-url":e.pdfWorkerUrl,"viewer-base-url":e.viewerBaseUrl,onClose:c[0]||(c[0]=d=>r("close"))},null,8,["open","locale","file","theme","preview-url","download-url","only-office-base","only-office-config-endpoint","auth-headers","auth-credentials","drawio-url","pdf-worker-url","viewer-base-url"]),n.createVNode(n.Transition,{name:"fe-toast"},{default:n.withCtx(()=>[e.open?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe fe-ql-hint",{"fe--theme-light":e.theme==="light","fe--theme-dark":e.theme==="dark"}]),"aria-hidden":"true"},[c[1]||(c[1]=n.createElementVNode("kbd",{class:"fe-kbd"},"Space",-1)),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("quicklook.hint_close"))+" ",1),c[2]||(c[2]=n.createElementVNode("span",{class:"fe-ql-hint__sep"},"·",-1)),c[3]||(c[3]=n.createElementVNode("kbd",{class:"fe-kbd"},"↑",-1)),c[4]||(c[4]=n.createElementVNode("kbd",{class:"fe-kbd"},"↓",-1)),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("quicklook.hint_nav"))+" ",1),c[5]||(c[5]=n.createElementVNode("span",{class:"fe-ql-hint__sep"},"·",-1)),c[6]||(c[6]=n.createElementVNode("kbd",{class:"fe-kbd"},"Enter",-1)),n.createTextVNode(" "+n.toDisplayString(n.unref(i)("quicklook.hint_open")),1)],2)):n.createCommentVNode("",!0)]),_:1})],64))}}),R8=["aria-label"],L8={class:"fe-opc__head"},z8=["aria-label"],F8={class:"fe-opc__body"},P8={key:0,class:"fe-opc__section","aria-live":"polite"},$8={class:"fe-opc__section-title"},V8={class:"fe-opc__list"},U8={class:"fe-opc__kicon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},H8=["d"],G8={class:"fe-opc__mid"},K8=["title"],q8={class:"fe-opc__sub"},W8={class:"fe-opc__kind"},j8={class:"fe-opc__state"},Y8=["aria-valuenow"],X8={key:0,class:"fe-opc__spin","aria-hidden":"true"},Z8={class:"fe-opc__acts"},J8=["onClick"],Q8=["onClick"],e7=["aria-label","onClick"],t7={key:1,class:"fe-opc__section"},n7={class:"fe-opc__section-title"},a7={class:"fe-opc__list fe-opc__list--history"},r7={class:"fe-opc__kicon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},i7=["d"],o7={class:"fe-opc__mid"},s7=["title"],l7={key:0,class:"fe-opc__sub fe-opc__sub--err"},c7={key:2,class:"fe-opc__empty"},d7=["aria-expanded","aria-label"],u7=["stroke-dashoffset"],f7={class:"fe-opc__count"},p7={key:0,class:"fe-opc__pct"},$c=8.5,Sp=n.defineComponent({__name:"OperationsCenter",props:{center:{},locale:{},narrow:{type:Boolean}},setup(e){const t=e,{t:a,formatSize:r}=zt(()=>t.locale),i=n.ref(!1),o=n.ref(null),s=n.computed(()=>t.center.active.value),l=n.computed(()=>t.center.history.value),c=n.computed(()=>t.center.hasError.value),d=n.computed(()=>t.center.overallPercent.value),u=n.computed(()=>t.center.runningCount.value),p=n.computed(()=>s.value.length>0||i.value&&l.value.length>0);n.watch(p,w=>{w||(i.value=!1)});const f=2*Math.PI*$c,h=n.computed(()=>{const w=d.value;return w===null?f*.72:f*(1-Math.min(100,Math.max(0,w))/100)}),_=n.computed(()=>d.value===null&&u.value>0),b=n.computed(()=>u.value===0||d.value===null?"":a("opc.percent",{n:d.value})),k=n.computed(()=>a("opc.aria_badge",{n:s.value.length})),m={upload:"M12 16V5M7 9.5 12 5l5 4.5M5 19h14",copy:"M9 9h11v11H9zM5 15V4h11",move:"M4 12h13M12 6l6 6-6 6",delete:"M5 7h14M9 7V5h6v2M8 7l1 13h6l1-13",convert:"M20 8A8 8 0 0 0 6 6L4 8M4 16a8 8 0 0 0 14 2l2-2M20 3v5h-5M4 21v-5h5",archive:"M4 8V5h16v3zM5 8h14v12H5zM10 12h4"};function v(w){return a(`opc.kind.${w.kind}`)}function g(w){return w.name||v(w)}function y(w){return w.status==="running"?w.queued?a("opc.queued"):w.totalBytes&&w.totalBytes>0?`${r(w.uploadedBytes??0)} / ${r(w.totalBytes)}`:w.totalCount&&w.totalCount>0?`${w.doneCount??0}/${w.totalCount}`:a("opc.status.running"):w.status==="done"?a("opc.status.done"):w.status==="aborted"?a("opc.status.aborted"):w.error||a("opc.status.error")}function S(w){return a(`opc.status.${w.status==="running"?"running":w.status}`)}function x(w){if(!i.value)return;const E=o.value;E&&w.target instanceof Node&&!E.contains(w.target)&&(i.value=!1)}function N(w){i.value&&w.key==="Escape"&&(i.value=!1)}return n.onMounted(()=>{document.addEventListener("mousedown",x),document.addEventListener("keydown",N)}),n.onBeforeUnmount(()=>{document.removeEventListener("mousedown",x),document.removeEventListener("keydown",N)}),(w,E)=>p.value?(n.openBlock(),n.createElementBlock("div",{key:0,ref_key:"rootEl",ref:o,class:n.normalizeClass(["fe-opc",{"fe-opc--narrow":e.narrow,"fe-opc--open":i.value}])},[n.createVNode(n.Transition,{name:"fe-opc-pop"},{default:n.withCtx(()=>[i.value?(n.openBlock(),n.createElementBlock("section",{key:0,class:"fe-opc__panel",role:"dialog","aria-label":n.unref(a)("opc.title")},[n.createElementVNode("header",L8,[n.createElementVNode("strong",null,n.toDisplayString(n.unref(a)("opc.title")),1),n.createElementVNode("button",{type:"button",class:"fe-opc__x","aria-label":n.unref(a)("opc.close"),onClick:E[0]||(E[0]=C=>i.value=!1)},"×",8,z8)]),n.createElementVNode("div",F8,[s.value.length>0?(n.openBlock(),n.createElementBlock("div",P8,[n.createElementVNode("h3",$8,n.toDisplayString(n.unref(a)("opc.active")),1),n.createElementVNode("ul",V8,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(s.value,C=>(n.openBlock(),n.createElementBlock("li",{key:C.key,class:n.normalizeClass(["fe-opc__item",`is-${C.status}`])},[(n.openBlock(),n.createElementBlock("svg",U8,[n.createElementVNode("path",{d:m[C.kind]},null,8,H8)])),n.createElementVNode("div",G8,[n.createElementVNode("div",{class:"fe-opc__name",title:g(C)},n.toDisplayString(g(C)),9,K8),n.createElementVNode("div",q8,[n.createElementVNode("span",W8,n.toDisplayString(v(C)),1),E[3]||(E[3]=n.createElementVNode("span",{class:"fe-opc__dot","aria-hidden":"true"},"·",-1)),n.createElementVNode("span",j8,n.toDisplayString(y(C)),1)]),C.status==="running"&&C.percent!==null?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-opc__bar",role:"progressbar","aria-valuenow":C.percent,"aria-valuemin":"0","aria-valuemax":"100"},[n.createElementVNode("div",{class:"fe-opc__bar-fill",style:n.normalizeStyle({width:C.percent+"%"})},null,4)],8,Y8)):n.createCommentVNode("",!0)]),C.status==="running"&&C.percent===null&&!C.queued?(n.openBlock(),n.createElementBlock("span",X8)):n.createCommentVNode("",!0),n.createElementVNode("div",Z8,[C.status==="running"&&C.cancellable?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-opc__act",onClick:A=>e.center.cancel(C.key)},n.toDisplayString(n.unref(a)("opc.cancel")),9,J8)):n.createCommentVNode("",!0),C.status==="error"&&C.retryable?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-opc__act fe-opc__act--retry",onClick:A=>e.center.retry(C.key)},n.toDisplayString(n.unref(a)("opc.retry")),9,Q8)):n.createCommentVNode("",!0),C.status!=="running"?(n.openBlock(),n.createElementBlock("button",{key:2,type:"button",class:"fe-opc__x","aria-label":n.unref(a)("opc.dismiss"),onClick:A=>e.center.dismiss(C.key)},"×",8,e7)):n.createCommentVNode("",!0)])],2))),128))])])):n.createCommentVNode("",!0),l.value.length>0?(n.openBlock(),n.createElementBlock("div",t7,[n.createElementVNode("h3",n7,[n.createTextVNode(n.toDisplayString(n.unref(a)("opc.history"))+" ",1),n.createElementVNode("button",{type:"button",class:"fe-opc__act",onClick:E[1]||(E[1]=C=>e.center.clearHistory())},n.toDisplayString(n.unref(a)("opc.clear")),1)]),n.createElementVNode("ul",a7,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(l.value,C=>(n.openBlock(),n.createElementBlock("li",{key:"h-"+C.key,class:n.normalizeClass(["fe-opc__item fe-opc__item--history",`is-${C.status}`])},[(n.openBlock(),n.createElementBlock("svg",r7,[n.createElementVNode("path",{d:m[C.kind]},null,8,i7)])),n.createElementVNode("div",o7,[n.createElementVNode("div",{class:"fe-opc__name",title:g(C)},n.toDisplayString(g(C)),9,s7),C.status==="error"&&C.error?(n.openBlock(),n.createElementBlock("div",l7,n.toDisplayString(C.error),1)):n.createCommentVNode("",!0)]),n.createElementVNode("span",{class:n.normalizeClass(["fe-opc__chip",`is-${C.status}`])},n.toDisplayString(S(C)),3)],2))),128))])])):n.createCommentVNode("",!0),s.value.length===0&&l.value.length===0?(n.openBlock(),n.createElementBlock("p",c7,n.toDisplayString(n.unref(a)("opc.empty")),1)):n.createCommentVNode("",!0)])],8,R8)):n.createCommentVNode("",!0)]),_:1}),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-opc__badge",{"is-error":c.value}]),"aria-expanded":i.value,"aria-label":k.value,onClick:E[2]||(E[2]=C=>i.value=!i.value)},[(n.openBlock(),n.createElementBlock("svg",{class:n.normalizeClass(["fe-opc__ring",{"fe-opc__ring--spin":_.value}]),viewBox:"0 0 22 22","aria-hidden":"true",focusable:"false"},[n.createElementVNode("circle",{class:"fe-opc__ring-track",cx:"11",cy:"11",r:$c,fill:"none","stroke-width":"2.5"}),n.createElementVNode("circle",{class:"fe-opc__ring-fill",cx:"11",cy:"11",r:$c,fill:"none","stroke-width":"2.5","stroke-linecap":"round","stroke-dasharray":f,"stroke-dashoffset":h.value,transform:"rotate(-90 11 11)"},null,8,u7)],2)),n.createElementVNode("span",f7,n.toDisplayString(s.value.length),1),b.value?(n.openBlock(),n.createElementBlock("span",p7,n.toDisplayString(b.value),1)):n.createCommentVNode("",!0)],10,d7)],2)):n.createCommentVNode("",!0)}}),h7=4e3,xp=50;function m7(e,t,a){const r=t.status!=="running";return{key:e,kind:t.kind,name:t.name,percent:t.percent,status:t.status,error:t.error??null,queued:t.queued??!1,doneCount:t.doneCount??null,totalCount:t.totalCount??null,uploadedBytes:t.uploadedBytes??null,totalBytes:t.totalBytes??null,cancellable:t.cancellable??!1,retryable:t.retryable??!1,startedAt:(a==null?void 0:a.startedAt)??Date.now(),settledAt:(a==null?void 0:a.settledAt)??(r?Date.now():null)}}function Cp(){const e=n.ref([]),t=n.ref([]),a=new Map,r=new Set,i=new Map;function o(m){const v=i.get(m);v!==void 0&&(clearTimeout(v),i.delete(m))}function s(m,v={}){o(m);const g=e.value.findIndex(S=>S.key===m);if(g===-1)return;const[y]=e.value.splice(g,1);e.value=[...e.value],r.add(m),v.toHistory!==!1&&(t.value=[{...y,settledAt:y.settledAt??Date.now()},...t.value].slice(0,xp))}function l(m){i.has(m)||i.set(m,setTimeout(()=>{var g;i.delete(m);const v=a.get(m);s(m),(g=v==null?void 0:v.dismiss)==null||g.call(v)},h7))}function c(m,v){const g=`${m}:`,y=new Set;let S=[...e.value],x=!1;for(const N of v){const w=`${m}:${N.input.id}`;if(y.add(w),N.actions&&a.set(w,N.actions),r.has(w))continue;const E=S.findIndex(A=>A.key===w),C=m7(w,N.input,E===-1?void 0:S[E]);E===-1?(S=[C,...S],x=!0):JSON.stringify(S[E])!==JSON.stringify(C)&&(S[E]=C,x=!0),(C.status==="done"||C.status==="aborted")&&l(w)}for(const N of[...S])!N.key.startsWith(g)||y.has(N.key)||N.status!=="error"&&(o(N.key),S=S.filter(w=>w.key!==N.key),x=!0,N.status!=="running"&&(r.add(N.key),t.value=[{...N,settledAt:N.settledAt??Date.now()},...t.value].slice(0,xp)));for(const N of[...r])N.startsWith(g)&&!y.has(N)&&r.delete(N);for(const N of[...a.keys()])N.startsWith(g)&&!y.has(N)&&!e.value.some(w=>w.key===N)&&(S.some(w=>w.key===N)||a.delete(N));x&&(e.value=S)}function d(m){var v,g;(g=(v=a.get(m))==null?void 0:v.cancel)==null||g.call(v)}function u(m){var g,y;const v=a.get(m);s(m),(g=v==null?void 0:v.dismiss)==null||g.call(v),(y=v==null?void 0:v.retry)==null||y.call(v)}function p(m){var g;const v=a.get(m);s(m),(g=v==null?void 0:v.dismiss)==null||g.call(v)}function f(){t.value=[]}const h=n.computed(()=>e.value.filter(m=>m.status==="running").length),_=n.computed(()=>e.value.filter(m=>m.status==="error").length),b=n.computed(()=>_.value>0),k=n.computed(()=>{const m=e.value.filter(y=>y.status==="running");let v=0,g=0;for(const y of m){let S=null;y.totalBytes&&y.totalBytes>0?S=Math.min(1,(y.uploadedBytes??0)/y.totalBytes):y.totalCount&&y.totalCount>0?S=Math.min(1,(y.doneCount??0)/y.totalCount):y.percent!==null&&(S=Math.min(1,y.percent/100)),S!==null&&(v+=S,g+=1)}return g===0?null:Math.round(v/g*100)});return n.getCurrentScope()&&n.onScopeDispose(()=>{for(const m of i.values())clearTimeout(m);i.clear()}),{active:e,history:t,runningCount:h,errorCount:_,hasError:b,overallPercent:k,sync:c,cancel:d,retry:u,dismiss:p,clearHistory:f}}const g7=["data-prefers-dark","aria-label"],b7={key:1,class:"fe-tour__dim","aria-hidden":"true"},y7={class:"fe-tour__progress","aria-hidden":"true"},v7={class:"fe-tour__title"},k7={class:"fe-tour__desc"},_7={class:"fe-tour__dots","aria-hidden":"true"},w7={class:"fe-tour__actions"},fi=6,Np=12,E7=n.defineComponent({__name:"OnboardingTour",props:{open:{type:Boolean},locale:{},root:{},theme:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale);function o(E,C){const A=E.querySelectorAll("button[title]");for(const L of Array.from(A))if(L.getAttribute("title")===C)return L;return null}const s=[{id:"nav",titleKey:"tour.step.nav.title",descKey:"tour.step.nav.desc",target:E=>E.querySelector(".fe-breadcrumb")},{id:"upload",titleKey:"tour.step.upload.title",descKey:"tour.step.upload.desc",target:E=>o(E,i("toolbar.upload"))||E.querySelector(".fe-fab")},{id:"search",titleKey:"tour.step.search.title",descKey:"tour.step.search.desc",target:E=>E.querySelector(".fe-search__input")||E.querySelector(".fe-toolbar__search-toggle")},{id:"view",titleKey:"tour.step.view.title",descKey:"tour.step.view.desc",target:E=>E.querySelector(".fe-toolbar__view")},{id:"share",titleKey:"tour.step.share.title",descKey:"tour.step.share.desc",target:E=>E.querySelector(".fe__body")},{id:"help",titleKey:"tour.step.help.title",descKey:"tour.step.help.desc",target:()=>null}],l=n.ref([]),c=n.ref(0),d=n.computed(()=>l.value[c.value]??null),u=n.computed(()=>l.value.length);function p(){const E=a.root;l.value=s.filter(C=>{if(C.id==="help")return!0;if(!E)return!1;const A=C.target(E);if(!A)return!1;const L=A.getBoundingClientRect();return L.width>0&&L.height>0})}const f=n.ref(null),h=n.ref({}),_=n.ref(null);async function b(){var z;const E=d.value,C=a.root;if(!E)return;const A=C?E.target(C):null;if(!A){f.value=null,h.value={};return}const L=A.getBoundingClientRect();if(L.width<=0&&L.height<=0){f.value=null,h.value={};return}f.value={top:L.top-fi,left:L.left-fi,width:L.width+fi*2,height:L.height+fi*2},await n.nextTick();const R=window.innerWidth,$=window.innerHeight,Y=Math.min(340,R-24),F=((z=_.value)==null?void 0:z.offsetHeight)??160;let q=L.bottom+fi+Np;q+F>$-12&&(q=Math.max(12,L.top-fi-Np-F));let X=L.left+L.width/2-Y/2;X=Math.min(Math.max(12,X),R-Y-12),h.value={top:`${Math.round(q)}px`,left:`${Math.round(X)}px`,width:`${Y}px`}}function k(){a.open&&b()}function m(){if(c.value>=u.value-1){r("close");return}c.value+=1}function v(){c.value>0&&(c.value-=1)}function g(){r("close")}function y(E){a.open&&(E.key==="Escape"?(E.stopPropagation(),g()):E.key==="ArrowRight"||E.key==="Enter"?(E.preventDefault(),m()):E.key==="ArrowLeft"&&(E.preventDefault(),v()))}n.watch(()=>a.open,async E=>{var C;E&&(c.value=0,p(),await n.nextTick(),await b(),(C=_.value)==null||C.focus())}),n.watch(c,async()=>{var E;await b(),(E=_.value)==null||E.focus()}),n.onMounted(()=>{window.addEventListener("resize",k),window.addEventListener("scroll",k,!0)}),n.onBeforeUnmount(()=>{window.removeEventListener("resize",k),window.removeEventListener("scroll",k,!0)});const S=n.ref(!1);let x;function N(E){S.value=!!(E&&"matches"in E&&E.matches)}n.onMounted(()=>{var E;typeof window>"u"||(x=window.matchMedia("(prefers-color-scheme: dark)"),N(x),(E=x.addEventListener)==null||E.call(x,"change",N))}),n.onBeforeUnmount(()=>{var E;(E=x==null?void 0:x.removeEventListener)==null||E.call(x,"change",N)});const w=n.computed(()=>`fe-ctx-backdrop--theme-${a.theme||"auto"}`);return(E,C)=>(n.openBlock(),n.createBlock(n.Teleport,{to:"body"},[n.createVNode(n.Transition,{name:"fe-tour"},{default:n.withCtx(()=>[e.open&&d.value?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["fe-tour",w.value]),"data-prefers-dark":S.value?"1":"0",role:"dialog","aria-modal":"true","aria-label":n.unref(i)("tour.aria"),onKeydown:y},[f.value?(n.openBlock(),n.createElementBlock("div",{key:0,class:"fe-tour__spot",style:n.normalizeStyle({top:f.value.top+"px",left:f.value.left+"px",width:f.value.width+"px",height:f.value.height+"px"}),"aria-hidden":"true"},null,4)):(n.openBlock(),n.createElementBlock("div",b7)),n.createElementVNode("div",{ref_key:"cardEl",ref:_,class:n.normalizeClass(["fe-tour__card",{"fe-tour__card--center":!f.value}]),style:n.normalizeStyle(f.value?h.value:{}),tabindex:"-1"},[n.createElementVNode("p",y7,n.toDisplayString(n.unref(i)("tour.progress",{n:c.value+1,m:u.value})),1),n.createElementVNode("h3",v7,n.toDisplayString(n.unref(i)(d.value.titleKey)),1),n.createElementVNode("p",k7,n.toDisplayString(n.unref(i)(d.value.descKey)),1),n.createElementVNode("div",_7,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(l.value,(A,L)=>(n.openBlock(),n.createElementBlock("span",{key:A.id,class:n.normalizeClass(["fe-tour__dot",{"is-active":L===c.value}])},null,2))),128))]),n.createElementVNode("div",w7,[n.createElementVNode("button",{type:"button",class:"fe-btn fe-tour__skip",onClick:g},n.toDisplayString(n.unref(i)("tour.skip")),1),C[0]||(C[0]=n.createElementVNode("span",{class:"fe-tour__actions-spacer"},null,-1)),c.value>0?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn",onClick:v},n.toDisplayString(n.unref(i)("tour.back")),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:m},n.toDisplayString(c.value>=u.value-1?n.unref(i)("tour.done"):n.unref(i)("tour.next")),1)])],6)],42,g7)):n.createCommentVNode("",!0)]),_:1})]))}}),S7=["aria-label"],x7={class:"fe-tabs__scroll"},C7=["aria-selected","title","onClick","onKeydown","onAuxclick","onDragstart","onDragover","onDragleave","onDrop"],N7={key:0,class:"fe-tabs__splitdot","aria-hidden":"true"},T7={class:"fe-tabs__label"},D7=["aria-label","title","onClick"],B7=["aria-label","title"],A7=["aria-label","title","aria-pressed"],Tp=n.defineComponent({__name:"TabBar",props:{tabs:{},activeId:{},locale:{},splitEnabled:{type:Boolean},splitActive:{type:Boolean}},emits:["select","close","new","reorder","toggle-split"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=n.ref(null),s=n.ref(null);function l(_,b){var k;o.value=_,b.dataTransfer&&(b.dataTransfer.effectAllowed="move",b.dataTransfer.setData("text/plain",((k=a.tabs[_])==null?void 0:k.id)??""))}function c(_,b){o.value!==null&&(b.preventDefault(),b.stopPropagation(),b.dataTransfer&&(b.dataTransfer.dropEffect="move"),s.value=_)}function d(_){s.value===_&&(s.value=null)}function u(_,b){o.value!==null&&(b.preventDefault(),b.stopPropagation(),o.value!==_&&r("reorder",o.value,_),o.value=null,s.value=null)}function p(){o.value=null,s.value=null}function f(_){_.button===1&&_.preventDefault()}function h(_,b){b.button===1&&(b.preventDefault(),b.stopPropagation(),r("close",_))}return(_,b)=>(n.openBlock(),n.createElementBlock("div",{class:"fe-tabs",role:"tablist","aria-label":n.unref(i)("tabs.strip")},[n.createElementVNode("div",x7,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(e.tabs,(k,m)=>(n.openBlock(),n.createElementBlock("div",{key:k.id,class:n.normalizeClass(["fe-tabs__tab",{"is-active":k.id===e.activeId,"is-dragover":s.value===m&&o.value!==null&&o.value!==m}]),role:"tab","aria-selected":k.id===e.activeId?"true":"false",tabindex:"0",draggable:"true",title:k.label,onClick:v=>r("select",k.id),onKeydown:n.withKeys(n.withModifiers(v=>r("select",k.id),["prevent"]),["enter"]),onMousedown:b[0]||(b[0]=v=>f(v)),onAuxclick:v=>h(k.id,v),onDragstart:v=>l(m,v),onDragover:v=>c(m,v),onDragleave:v=>d(m),onDrop:v=>u(m,v),onDragend:p},[k.split?(n.openBlock(),n.createElementBlock("span",N7)):n.createCommentVNode("",!0),n.createElementVNode("span",T7,n.toDisplayString(k.label),1),n.createElementVNode("button",{type:"button",class:"fe-tabs__close","aria-label":n.unref(i)("tabs.close"),title:n.unref(i)("tabs.close"),onClick:n.withModifiers(v=>r("close",k.id),["stop"])},"×",8,D7)],42,C7))),128))]),n.createElementVNode("button",{type:"button",class:"fe-tabs__new","aria-label":n.unref(i)("tabs.new"),title:n.unref(i)("tabs.new"),onClick:b[1]||(b[1]=k=>r("new"))},"+",8,B7),e.splitEnabled!==!1?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:n.normalizeClass(["fe-tabs__split",{"is-active":e.splitActive}]),"aria-label":e.splitActive?n.unref(i)("tabs.split_off"):n.unref(i)("tabs.split"),title:e.splitActive?n.unref(i)("tabs.split_off"):n.unref(i)("tabs.split"),"aria-pressed":e.splitActive?"true":"false",onClick:b[2]||(b[2]=k=>r("toggle-split"))},[...b[3]||(b[3]=[n.createElementVNode("svg",{class:"fe-ficon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.8","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"},[n.createElementVNode("rect",{x:"3",y:"4",width:"18",height:"16",rx:"2"}),n.createElementVNode("path",{d:"M12 4v16"})],-1)])],10,A7)):n.createCommentVNode("",!0)],8,S7))}}),po=".filex-e2e.json",Dp="filexe2e",ho=1,Bp=6e5,M7=6e5,Vc=200*1024*1024,Ap=8,Mp="filex-e2e-verify-v1",Es=new TextEncoder().encode(Dp),Ss=97,Uc=9,Hc=21,O7=48,Gc=69,Na=12;class Kc extends Error{constructor(t="e2e: decrypt failed"){super(t),this.name="E2eDecryptError"}}function Op(e){let t="";for(let a=0;a<e.length;a++)t+=String.fromCharCode(e[a]);return btoa(t)}function Ip(e){const t=atob(e),a=new Uint8Array(t.length);for(let r=0;r<t.length;r++)a[r]=t.charCodeAt(r);return a}async function qc(e,t,a){const r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(t).buffer,iterations:a,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}async function Rp(e,t=Bp){const a=Math.max(M7,t),r=crypto.getRandomValues(new Uint8Array(16)),i=await qc(e,r,a),o=crypto.getRandomValues(new Uint8Array(Na)),s=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o.buffer},i,new TextEncoder().encode(Mp))),l=new Uint8Array(Na+s.length);return l.set(o,0),l.set(s,Na),{marker:{v:ho,salt:Op(r),iter:a,verify:Op(l)},kek:i}}function Lp(e){try{const t=JSON.parse(e);return!t||t.v!==ho||typeof t.salt!="string"||typeof t.verify!="string"||typeof t.iter!="number"||t.iter<1?null:t}catch{return null}}async function zp(e,t){const a=Ip(e.salt),r=await qc(t,a,e.iter),i=Ip(e.verify);if(i.length<=Na)return null;try{const o=await crypto.subtle.decrypt({name:"AES-GCM",iv:i.slice(0,Na).buffer},r,i.slice(Na).buffer);return new TextDecoder().decode(o)!==Mp?null:r}catch{return null}}function xs(e){const t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<Es.length)return!1;for(let a=0;a<Es.length;a++)if(t[a]!==Es[a])return!1;return!0}async function Fp(e,t){if(t.byteLength>Vc)throw new Error("e2e: file exceeds the 200MB single-shot limit");const a=crypto.getRandomValues(new Uint8Array(32)),r=await crypto.subtle.importKey("raw",a.buffer,{name:"AES-GCM"},!1,["encrypt"]),i=crypto.getRandomValues(new Uint8Array(Na)),o=crypto.getRandomValues(new Uint8Array(Na)),s=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:i.buffer},e,a.buffer)),l=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o.buffer},r,t));a.fill(0);const c=new Uint8Array(Ss+l.length);return c.set(Es,0),c[8]=ho,c.set(i,Uc),c.set(s,Hc),c.set(o,Gc),c.set(l,Ss),c.buffer}async function Wc(e,t){const a=new Uint8Array(t);if(!xs(a)||a.length<Ss)throw new Error("e2e: not an encrypted file");if(a[8]!==ho)throw new Error(`e2e: unsupported version ${a[8]}`);const r=a.slice(Uc,Uc+Na),i=a.slice(Hc,Hc+O7),o=a.slice(Gc,Gc+Na);let s;try{s=await crypto.subtle.decrypt({name:"AES-GCM",iv:r.buffer},e,i.buffer)}catch{throw new Kc("e2e: DEK unwrap failed (wrong password?)")}const l=await crypto.subtle.importKey("raw",s,{name:"AES-GCM"},!1,["decrypt"]);try{return await crypto.subtle.decrypt({name:"AES-GCM",iv:o.buffer},l,a.slice(Ss).buffer)}catch{throw new Kc("e2e: content decrypt failed")}}function Pp(){const e=new Map;return{get(t){return e.get(t)},set(t,a){e.set(t,a)},lock(t){e.delete(t)},has(t){return e.has(t)},clear(){e.clear()}}}function $p(e){const t=e.indexOf("://");return t===-1?e:e.slice(t+3)}function I7(e){return(e||[]).filter(t=>!(t.path.includes(".thumbs")||t.path.includes(".versions")||t.basename===".versions"||t.basename===".trash"||t.basename===".filex-open"||t.basename===".keepdir"||t.basename===po))}const Vp="filex.showHidden";function R7(){try{return localStorage.getItem(Vp)==="1"}catch{return!1}}const mo=n.ref(R7());function L7(e){mo.value=e;try{localStorage.setItem(Vp,e?"1":"0")}catch{}}function z7(e,t){return t?e||[]:(e||[]).filter(a=>!(a.basename||"").startsWith("."))}function Up(e){return z7(I7(e),mo.value)}function F7(e){const t=$p(e);return t==="fileman"||t===""}function P7(e){return $p(e).startsWith("fileman/.trash")}function $7(e){return{type:"dir",path:`${e}://fileman/.trash`,basename:".trash",extension:"",storage:e,visibility:"private",size:0,file_size:0,mime_type:"inode/directory",extra_metadata:{}}}function Hp(e,t,a,r){return!r||P7(a)||!F7(a)?!1:(e.unshift($7(t)),!0)}async function Gp(e,t,a){try{const{entries:r}=await a.listTrash(t),i=e.find(l=>l.basename===".trash");if(!i)return;let o=0,s=0;for(const l of r){o+=l.size||0;const c=Date.parse(l.deleted_at);!Number.isNaN(c)&&c>s&&(s=c)}i.size=o,s>0&&(i.last_modified=s)}catch{}}const V7=["aria-label"],U7={class:"fe-split__crumbs"},H7=["title"],G7=["title","onClick"],K7=["aria-label","title"],q7={key:0,class:"fe-split__state",role:"status"},W7={key:1,class:"fe-split__state"},j7={key:2,class:"fe-split__state"},Y7="application/x-brf-files",X7="application/x-brf-files-src",Kp=n.defineComponent({__name:"SecondaryPane",props:{api:{},initialPath:{},locale:{},qualify:{type:Function},toUser:{type:Function},clamp:{type:Function},rootLabel:{},floor:{},multiRoot:{type:Boolean},virtualRows:{type:Function},active:{type:Boolean},viewMode:{},thumbSrc:{type:Function},keepBadgeFor:{type:Function},trashVisible:{type:Boolean}},emits:["navigate","activate","close","open-tab","transfer","context","open-trash"],setup(e,{expose:t,emit:a}){const r=e,i=a,{t:o}=zt(()=>r.locale),s=n.ref(""),l=n.ref([]),c=n.ref(!1),d=n.ref(""),u=n.ref(new Set);function p(H){return H.mime_type==="inode/storage"}const f=n.computed(()=>!!r.multiRoot&&!(s.value??"").replace(/^\/+|\/+$/g,""));async function h(H){const O=r.clamp(H??s.value??"");c.value=!0,d.value="";try{if(r.multiRoot&&!O){l.value=r.virtualRows?r.virtualRows():[],s.value="",u.value=new Set,i("navigate","");return}const P=await r.api.index(r.qualify(O));l.value=Up(P.files),Hp(l.value,P.adapter,P.dirname,r.trashVisible!==!1)&&Gp(l.value,P.adapter,r.api),s.value=r.toUser(P.dirname),u.value=new Set,i("navigate",s.value)}catch(P){d.value=P instanceof Error?P.message:String(P)}finally{c.value=!1}}h(r.initialPath??"");const _=n.computed(()=>{const H=(s.value||"").replace(/^\/+|\/+$/g,""),O=H?H.split("/"):[],P=(r.floor||"").replace(/^\/+|\/+$/g,""),K=[];let J="";for(const de of O)J=J?`${J}/${de}`:de,!(P&&!(J===P||J.startsWith(P+"/")))&&K.push({label:de,target:J,last:!1});return K.length>0&&(K[K.length-1].last=!0),K}),b=n.computed(()=>!r.floor);function k(H){i("activate"),h(H)}function m(H,O){i("activate");const P=O.ctrl||O.shift,K=new Set(P?u.value:[]);P&&K.has(H.path)?K.delete(H.path):K.add(H.path),u.value=K}function v(H,O){O.preventDefault(),O.stopPropagation(),i("activate"),u.value.has(H.path)||(u.value=new Set([H.path])),i("context",H,O)}function g(H){H.preventDefault(),H.stopPropagation(),i("activate"),u.value=new Set,i("context",null,H)}function y(H,O){w.value=!1,!(H.type!=="dir"||p(H))&&E(O)&&C(O,H.path)}function S(H){if(H.type==="dir"){if(H.basename===".trash"){i("activate"),i("open-trash");return}h(p(H)?H.path:r.toUser(H.path))}}function x(){u.value=new Set}function N(H,O){if(!O.dataTransfer)return;if(p(H)||f.value||H.basename===".trash"){O.preventDefault();return}u.value.has(H.path)||(u.value=new Set([H.path]));const P=l.value.filter(K=>u.value.has(K.path)&&!p(K)).map(K=>({path:K.path,basename:K.basename,type:K.type}));if(P.length===0){O.preventDefault();return}O.dataTransfer.setData(Y7,JSON.stringify(P)),O.dataTransfer.setData(X7,r.qualify(s.value)),O.dataTransfer.setData("text/plain",P.map(K=>K.path).join(`
|
|
2
2
|
`)),O.dataTransfer.effectAllowed="move"}const w=n.ref(!1);function E(H){return ta(H)}function C(H,O){const P=ks(H);if(!P||!O)return;const K=Mc(H),J=P.map(de=>de.path).filter(de=>de&&de!==O&&!O.startsWith(de+"/"));J.length!==0&&(H.preventDefault(),H.stopPropagation(),i("transfer",{sources:J,targetWire:O,originWire:K}))}function A(H){!E(H)||f.value||(H.preventDefault(),H.stopPropagation(),H.dataTransfer&&(H.dataTransfer.dropEffect="move"),w.value=!0)}function L(){w.value=!1}function R(H){w.value=!1,!(!E(H)||f.value)&&C(H,r.qualify(s.value))}function $(){const H=(s.value??"").replace(/^\/+|\/+$/g,""),O=(r.floor||"").replace(/^\/+|\/+$/g,"");if(!H||H===O)return;const P=H.lastIndexOf("/");h(P===-1?"":H.slice(0,P))}function Y(){u.value=new Set(l.value.filter(H=>!p(H)).map(H=>H.path))}function F(){return l.value.filter(H=>u.value.has(H.path))}function q(){const H=F()[0];H&&H.type==="dir"&&S(H)}function X(){return h()}function z(){return s.value}return t({reload:X,goUp:$,selectAll:Y,openSelected:q,selectedNodes:F,getPath:z}),(H,O)=>(n.openBlock(),n.createElementBlock("section",{class:n.normalizeClass(["fe-split",{"fe-pane--focus":e.active}]),role:"region","aria-label":n.unref(o)("split.pane"),onPointerdown:O[3]||(O[3]=P=>i("activate"))},[n.createElementVNode("header",U7,[b.value?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:n.normalizeClass(["fe-split__crumb",{"is-last":_.value.length===0}]),title:e.rootLabel,onClick:O[0]||(O[0]=P=>k(""))},n.toDisplayString(e.rootLabel),11,H7)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(_.value,P=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:P.target},[O[4]||(O[4]=n.createElementVNode("span",{class:"fe-split__sep","aria-hidden":"true"},"›",-1)),n.createElementVNode("button",{type:"button",class:n.normalizeClass(["fe-split__crumb",{"is-last":P.last}]),title:P.label,onClick:K=>k(P.target)},n.toDisplayString(P.label),11,G7)],64))),128)),O[5]||(O[5]=n.createElementVNode("span",{class:"fe-split__spacer"},null,-1)),n.createElementVNode("button",{type:"button",class:"fe-split__closebtn","aria-label":n.unref(o)("split.close"),title:n.unref(o)("split.close"),onClick:O[1]||(O[1]=P=>i("close"))},"×",8,K7)]),n.createElementVNode("div",{class:n.normalizeClass(["fe-split__body",{"is-dropover":w.value}]),onClick:n.withModifiers(x,["self"]),onContextmenu:g,onDragover:A,onDragleave:L,onDrop:R},[c.value&&l.value.length===0?(n.openBlock(),n.createElementBlock("div",q7,n.toDisplayString(n.unref(o)("loading")),1)):d.value?(n.openBlock(),n.createElementBlock("div",W7,[n.createElementVNode("span",null,n.toDisplayString(n.unref(o)("split.error")),1),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:O[2]||(O[2]=()=>h())},n.toDisplayString(n.unref(o)("split.retry")),1)])):l.value.length===0?(n.openBlock(),n.createElementBlock("div",j7,n.toDisplayString(n.unref(o)("empty.folder")),1)):(e.viewMode??"list")==="list"?(n.openBlock(),n.createBlock(sp,{key:3,files:l.value,selected:u.value,locale:e.locale,loading:c.value,"keep-badge-for":e.keepBadgeFor,onClickRow:m,onDblRow:S,onContextRow:v,onItemDragStart:N,onItemDropInto:y},null,8,["files","selected","locale","loading","keep-badge-for"])):e.viewMode==="grid"?(n.openBlock(),n.createBlock(lp,{key:4,files:l.value,selected:u.value,locale:e.locale,loading:c.value,"thumb-src":e.thumbSrc,"keep-badge-for":e.keepBadgeFor,onClickCard:m,onDblCard:S,onContextCard:v,onItemDragStart:N,onItemDropInto:y},null,8,["files","selected","locale","loading","thumb-src","keep-badge-for"])):(n.openBlock(),n.createBlock(cp,{key:5,files:l.value,selected:u.value,locale:e.locale,loading:c.value,"thumb-src":e.thumbSrc,onClickCard:m,onDblCard:S,onContextCard:v,onItemDragStart:N,onItemDropInto:y},null,8,["files","selected","locale","loading","thumb-src"]))],34)],42,V7))}});function jc(){try{return crypto.randomUUID()}catch{return`t${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}}function qp(e){const t=n.ref([]),a=n.ref(""),r=n.computed(()=>t.value.find(k=>k.id===a.value)??null),i=n.computed(()=>t.value.findIndex(k=>k.id===a.value)),o=n.computed(()=>t.value.length>1);function s(){if(!e.storageKey)return!1;try{const k=localStorage.getItem(e.storageKey);if(!k)return!1;const m=JSON.parse(k);if(!m||!Array.isArray(m.tabs)||m.tabs.length===0)return!1;const v=[];for(const g of m.tabs){if(!g||typeof g.path!="string")continue;const y=typeof g.viewMode=="string"&&g.viewMode?g.viewMode:"list",S=g.split,x=S&&typeof S=="object"&&typeof S.path=="string"?{path:S.path,viewMode:typeof S.viewMode=="string"&&S.viewMode?S.viewMode:void 0}:null;v.push({id:typeof g.id=="string"&&g.id?g.id:jc(),path:g.path,viewMode:y,split:x})}return v.length===0?!1:(t.value=v,a.value=v.some(g=>g.id===m.active)?String(m.active):v[0].id,!0)}catch{return!1}}function l(){if(e.storageKey)try{localStorage.setItem(e.storageKey,JSON.stringify({v:1,active:a.value,tabs:t.value}))}catch{}}n.watch([t,a],l,{deep:!0});function c(k,m){if(t.value.length>0)return;const v={id:jc(),path:k,viewMode:m,split:null};t.value=[v],a.value=v.id}function d(k){const m=r.value;m&&(k.path!==void 0&&(m.path=k.path),k.viewMode!==void 0&&(m.viewMode=k.viewMode))}function u(k,m){const v={id:jc(),path:k,viewMode:m.viewMode,split:m.split??null},g=i.value;return t.value.splice(g===-1?t.value.length:g+1,0,v),m.background||(a.value=v.id),v}function p(k){if(t.value.length<=1)return null;const m=t.value.findIndex(y=>y.id===k);if(m===-1)return null;const v=t.value[m].id===a.value;if(t.value.splice(m,1),!v)return null;const g=t.value[Math.min(m,t.value.length-1)];return a.value=g.id,g}function f(k){const m=t.value.find(v=>v.id===k);return!m||m.id===a.value?null:(a.value=m.id,m)}function h(k){if(t.value.length<2)return null;const m=i.value===-1?0:i.value,v=t.value[(m+k+t.value.length)%t.value.length];return f(v.id)}function _(k,m){if(k===m||k<0||m<0||k>=t.value.length||m>=t.value.length)return;const v=[...t.value],[g]=v.splice(k,1);v.splice(m,0,g),t.value=v}function b(k){const m=r.value;m&&(m.split=k)}return{tabs:t,activeId:a,activeTab:r,activeIndex:i,hasMultiple:o,restore:s,seed:c,syncActive:d,openTab:u,closeTab:p,activate:f,step:h,move:_,setSplit:b}}const Z7=["placeholder","disabled"],J7=["placeholder","disabled"],Q7=["placeholder","disabled","onKeydown"],eE={class:"fe-e2e-warn",role:"alert"},tE={class:"fe-e2e-ack"},nE=["disabled"],aE={key:0,class:"fe-form__error"},rE=["disabled"],iE=["disabled"],Wp=n.defineComponent({__name:"EncryptedFolderModal",props:{open:{type:Boolean},locale:{},busy:{type:Boolean}},emits:["close","submit"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=n.ref(""),s=n.ref(""),l=n.ref(""),c=n.ref(!1),d=n.ref(null);n.watch(()=>a.open,p=>{p&&(o.value="",s.value="",l.value="",c.value=!1,d.value=null)});function u(){if(a.busy)return;const p=o.value.trim();if(!p){d.value=i("modal.newfolder.placeholder");return}if(/[\\/]/.test(p)||p==="."||p===".."||p.startsWith(".filex")){d.value=i("e2e.create.bad_name");return}if(s.value.length<Ap){d.value=i("e2e.create.pw_short");return}if(s.value!==l.value){d.value=i("e2e.create.pw_mismatch");return}if(!c.value){d.value=i("e2e.create.ack_required");return}d.value=null,r("submit",{name:p,password:s.value})}return(p,f)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("e2e.create.title"),size:"sm",onClose:f[5]||(f[5]=h=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",disabled:e.busy,onClick:f[4]||(f[4]=h=>r("close"))},n.toDisplayString(n.unref(i)("modal.newfolder.cancel")),9,rE),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",disabled:e.busy,onClick:u},n.toDisplayString(e.busy?n.unref(i)("e2e.create.busy"):n.unref(i)("e2e.create.create")),9,iE)]),default:n.withCtx(()=>[n.createElementVNode("form",{class:"fe-e2e-form",onSubmit:n.withModifiers(u,["prevent"])},[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":f[0]||(f[0]=h=>o.value=h),type:"text",class:"fe-input",placeholder:n.unref(i)("modal.newfolder.placeholder"),autocomplete:"off",disabled:e.busy},null,8,Z7),[[n.vModelText,o.value]]),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":f[1]||(f[1]=h=>s.value=h),type:"password",class:"fe-input",placeholder:n.unref(i)("e2e.create.pw_placeholder"),autocomplete:"new-password",disabled:e.busy},null,8,J7),[[n.vModelText,s.value]]),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":f[2]||(f[2]=h=>l.value=h),type:"password",class:"fe-input",placeholder:n.unref(i)("e2e.create.pw2_placeholder"),autocomplete:"new-password",disabled:e.busy,onKeydown:n.withKeys(n.withModifiers(u,["prevent"]),["enter"])},null,40,Q7),[[n.vModelText,l.value]]),n.createElementVNode("div",eE,[n.createElementVNode("strong",null,n.toDisplayString(n.unref(i)("e2e.create.warn_title")),1),n.createElementVNode("p",null,n.toDisplayString(n.unref(i)("e2e.create.warn_body")),1)]),n.createElementVNode("label",tE,[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":f[3]||(f[3]=h=>c.value=h),type:"checkbox",disabled:e.busy},null,8,nE),[[n.vModelCheckbox,c.value]]),n.createElementVNode("span",null,n.toDisplayString(n.unref(i)("e2e.create.ack")),1)]),d.value?(n.openBlock(),n.createElementBlock("p",aE,n.toDisplayString(d.value),1)):n.createCommentVNode("",!0)],32)]),_:1},8,["open","title"]))}});function jp(e){const t=String(e??"").indexOf("://");return t===-1?"":e.slice(0,t)}function Yp(e,t,a="auto"){const r=jp(t),i=e.some(o=>{const s=jp(o);return s!==""&&r!==""&&s!==r});return a==="copy"?{kind:"copy",cross:i}:a==="move"?{kind:"move",cross:i}:{kind:i?"copy":"move",cross:i}}const oE=["placeholder","onKeydown"],sE={key:0,class:"fe-form__error"},lE=n.defineComponent({__name:"NewFolderModal",props:{open:{type:Boolean},locale:{},encryptedOption:{type:Boolean}},emits:["close","submit","encrypted"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=n.ref(""),s=n.ref(null);n.watch(()=>a.open,c=>{c&&(o.value="",s.value=null)});function l(){const c=o.value.trim();if(!c){s.value=i("modal.newfolder.placeholder");return}if(/[\\/]/.test(c)||c==="."||c===".."){s.value="Geçersiz karakter";return}r("submit",c)}return(c,d)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("modal.newfolder.title"),size:"sm",onClose:d[3]||(d[3]=u=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:d[2]||(d[2]=u=>r("close"))},n.toDisplayString(n.unref(i)("modal.newfolder.cancel")),1),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:l},n.toDisplayString(n.unref(i)("modal.newfolder.create")),1)]),default:n.withCtx(()=>[n.createElementVNode("form",{onSubmit:n.withModifiers(l,["prevent"])},[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":d[0]||(d[0]=u=>o.value=u),type:"text",class:"fe-input",placeholder:n.unref(i)("modal.newfolder.placeholder"),autocomplete:"off",onKeydown:n.withKeys(n.withModifiers(l,["prevent"]),["enter"])},null,40,oE),[[n.vModelText,o.value]]),s.value?(n.openBlock(),n.createElementBlock("p",sE,n.toDisplayString(s.value),1)):n.createCommentVNode("",!0),e.encryptedOption!==!1?(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:"fe-e2e-optlink",onClick:d[1]||(d[1]=u=>r("encrypted"))}," 🔒 "+n.toDisplayString(n.unref(i)("e2e.create.option")),1)):n.createCommentVNode("",!0)],32)]),_:1},8,["open","title"]))}}),cE=["onKeydown"],dE=n.defineComponent({__name:"RenameModal",props:{open:{type:Boolean},locale:{},currentName:{}},emits:["close","submit"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=n.ref("");n.watch(()=>[a.open,a.currentName],([l,c])=>{l&&(o.value=c)});function s(){const l=o.value.trim();l&&(/[\\/]/.test(l)||l==="."||l===".."||r("submit",l))}return(l,c)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("modal.rename.title"),size:"sm",onClose:c[2]||(c[2]=d=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:c[1]||(c[1]=d=>r("close"))},n.toDisplayString(n.unref(i)("modal.rename.cancel")),1),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--primary",onClick:s},n.toDisplayString(n.unref(i)("modal.rename.save")),1)]),default:n.withCtx(()=>[n.createElementVNode("form",{onSubmit:n.withModifiers(s,["prevent"])},[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":c[0]||(c[0]=d=>o.value=d),type:"text",class:"fe-input",autocomplete:"off",onKeydown:n.withKeys(n.withModifiers(s,["prevent"]),["enter"])},null,40,cE),[[n.vModelText,o.value]])],32)]),_:1},8,["open","title"]))}}),uE=n.defineComponent({__name:"DeleteConfirmModal",props:{open:{type:Boolean},locale:{},count:{}},emits:["close","confirm"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale);return(o,s)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("modal.delete.title"),size:"sm",onClose:s[2]||(s[2]=l=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:s[0]||(s[0]=l=>r("close"))},n.toDisplayString(n.unref(i)("modal.delete.cancel")),1),n.createElementVNode("button",{type:"button",class:"fe-btn fe-btn--danger",onClick:s[1]||(s[1]=l=>r("confirm"))},n.toDisplayString(n.unref(i)("modal.delete.confirm")),1)]),default:n.withCtx(()=>[n.createElementVNode("p",null,n.toDisplayString(n.unref(i)("modal.delete.message",{count:e.count})),1)]),_:1},8,["open","title"]))}});function Xp(e){return`'${e.replace(/'/g,"'\\''")}'`}function Zp(e){if(!(e!=null&&e.url))return"";let t=e.url;const a=[];e.isDir&&a.push("zip=wait"),e.pin&&a.push("pin="+encodeURIComponent(e.pin)),a.length&&(t+=(t.includes("?")?"&":"?")+a.join("&"));let r="-OJ ";return e.filename&&(r=`-o ${Xp(e.isDir?`${e.filename}.zip`:e.filename)} `),`curl -fSL ${r}${Xp(t)}`}const fE=[0,1,7,30];function pE(e,t,a){const r=t&&t>0?Math.floor(t):0;let i=r?e.filter(o=>o>0&&o<=r):e.slice();return r&&!i.includes(r)&&i.push(r),i=Array.from(new Set(i)).sort((o,s)=>o===0?-1:s===0?1:o-s),i.map(o=>({v:o,l:a(o)}))}function Cs(e){return e&&e>0?Math.floor(e):0}function hE(e,t,a=new Date){const r=t&&t>0?Math.floor(t):0;if(!r)return{iso:e?e.toISOString():null,clamped:!1};const i=new Date(a.getTime()+r*864e5);return!e||e.getTime()>i.getTime()?{iso:i.toISOString(),clamped:!0}:{iso:e.toISOString(),clamped:!1}}function mE(e,t=new Date){const a=e&&e>0?Math.floor(e):0;if(!a)return;const r=new Date(t.getTime()+a*864e5),i=o=>String(o).padStart(2,"0");return`${r.getFullYear()}-${i(r.getMonth()+1)}-${i(r.getDate())}T${i(r.getHours())}:${i(r.getMinutes())}`}function Jp(e,t){if(!e)return t==="tr"?"Bu bağlantının süresi yoktur.":"This link does not expire.";const a=new Date(e),r=Number.isNaN(a.getTime())?e:a.toLocaleString(t==="tr"?"tr-TR":"en-GB",{dateStyle:"medium",timeStyle:"short"});return t==="tr"?`Bu bağlantı ${r} tarihine kadar geçerli.`:`This link is valid until ${r}.`}function Qp(e,t){const a=e&&e>0?Math.floor(e):0;return a?t==="tr"?`Bağlantılar en fazla ${a} gün geçerli olabilir (sunucu ayarı).`:`Links can be valid for at most ${a} day${a===1?"":"s"} (server setting).`:""}const gE={class:"fe-form__row"},bE={class:"fe-form__row fe-form__row--stack"},yE=["max"],vE={key:0,class:"fe-form__hint"},kE={class:"fe-form__row fe-form__row--stack"},_E={key:1,class:"fe-share-result"},wE={class:"fe-share-result__row fe-share-result__row--note"},EE={class:"fe-share-result__row"},SE={class:"fe-share-result__copy"},xE=["value"],CE={key:0,class:"fe-share-result__row"},NE={class:"fe-share-result__copy"},TE=["value"],DE={class:"fe-share-result__row"},BE={class:"fe-share-result__copy"},AE=["value"],ME=n.defineComponent({__name:"ShareModal",props:{open:{type:Boolean},locale:{},share:{},shareMaxTtlDays:{}},emits:["close","submit","toast"],setup(e,{emit:t}){const a=e,r=t,{t:i}=zt(()=>a.locale),o=n.ref(!1),s=n.ref(""),l=n.ref("");n.watch(()=>a.open,_=>{_&&(o.value=!1,s.value="",l.value="")});const c=n.computed(()=>mE(a.shareMaxTtlDays)),d=n.computed(()=>Qp(a.shareMaxTtlDays,a.locale==="tr"?"tr":"en")),u=n.computed(()=>a.share?Jp(a.share.expires_at??null,a.locale==="tr"?"tr":"en"):"");function p(){const _=s.value?new Date(s.value):null;r("submit",{password:o.value,expires_at:hE(_,a.shareMaxTtlDays).iso,max_downloads:l.value?Number(l.value):null})}async function f(_,b){try{await navigator.clipboard.writeText(_),r("toast",b)}catch{}}const h=n.computed(()=>Zp(a.share?{url:a.share.url,pin:a.share.password_pin,filename:a.share.filename}:null));return(_,b)=>(n.openBlock(),n.createBlock(Ua,{open:e.open,title:n.unref(i)("modal.share.title"),size:"md",onClose:b[7]||(b[7]=k=>r("close"))},{actions:n.withCtx(()=>[n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:b[6]||(b[6]=k=>r("close"))},n.toDisplayString(e.share?n.unref(i)("modal.share.close"):n.unref(i)("modal.share.cancel")),1),e.share?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"fe-btn fe-btn--primary",onClick:p},n.toDisplayString(n.unref(i)("modal.share.create")),1))]),default:n.withCtx(()=>[e.share?(n.openBlock(),n.createElementBlock("div",_E,[n.createElementVNode("div",wE,[n.createElementVNode("small",null,[n.createTextVNode(n.toDisplayString(u.value),1),e.share.expiry_clamped?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[n.createTextVNode(n.toDisplayString(n.unref(i)("modal.share.limit_applied")),1)],64)):n.createCommentVNode("",!0)])]),n.createElementVNode("div",EE,[b[8]||(b[8]=n.createElementVNode("label",null,"Link",-1)),n.createElementVNode("div",SE,[n.createElementVNode("input",{value:e.share.url,readonly:"",class:"fe-input"},null,8,xE),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:b[3]||(b[3]=k=>f(e.share.url,n.unref(i)("modal.share.url_copied")))},n.toDisplayString(n.unref(i)("modal.share.copy")),1)])]),e.share.password_pin?(n.openBlock(),n.createElementBlock("div",CE,[b[9]||(b[9]=n.createElementVNode("label",null,"PIN",-1)),n.createElementVNode("div",NE,[n.createElementVNode("input",{value:e.share.password_pin,readonly:"",class:"fe-input fe-input--mono"},null,8,TE),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:b[4]||(b[4]=k=>f(e.share.password_pin,n.unref(i)("modal.share.pin_copied")))},n.toDisplayString(n.unref(i)("modal.share.copy")),1)])])):n.createCommentVNode("",!0),n.createElementVNode("div",DE,[b[10]||(b[10]=n.createElementVNode("label",null,"CLI",-1)),n.createElementVNode("div",BE,[n.createElementVNode("input",{value:h.value,readonly:"",class:"fe-input fe-input--mono"},null,8,AE),n.createElementVNode("button",{type:"button",class:"fe-btn",onClick:b[5]||(b[5]=k=>f(h.value,n.unref(i)("modal.share.cli_copied")))},n.toDisplayString(n.unref(i)("modal.share.copy")),1)])])])):(n.openBlock(),n.createElementBlock("form",{key:0,class:"fe-form",onSubmit:n.withModifiers(p,["prevent"])},[n.createElementVNode("label",gE,[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":b[0]||(b[0]=k=>o.value=k),type:"checkbox"},null,512),[[n.vModelCheckbox,o.value]]),n.createElementVNode("span",null,n.toDisplayString(n.unref(i)("modal.share.pin")),1)]),n.createElementVNode("label",bE,[n.createElementVNode("span",null,n.toDisplayString(n.unref(i)("modal.share.expires")),1),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":b[1]||(b[1]=k=>s.value=k),type:"datetime-local",class:"fe-input",max:c.value},null,8,yE),[[n.vModelText,s.value]]),d.value?(n.openBlock(),n.createElementBlock("small",vE,n.toDisplayString(d.value),1)):n.createCommentVNode("",!0)]),n.createElementVNode("label",kE,[n.createElementVNode("span",null,n.toDisplayString(n.unref(i)("modal.share.max_downloads")),1),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":b[2]||(b[2]=k=>l.value=k),type:"number",min:"1",class:"fe-input"},null,512),[[n.vModelText,l.value]])])],32))]),_:1},8,["open","title"]))}}),OE={class:"filex-cv"},IE={class:"filex-cv__head"},RE={key:0,class:"filex-cv__msg"},LE={key:1,class:"filex-cv__msg filex-cv__ok"},zE={class:"filex-cv__src"},FE=["placeholder"],PE={class:"filex-cv__list"},$E=["onClick"],VE={key:0,class:"filex-cv__empty"},UE={key:0,class:"filex-cv__err"},HE={class:"filex-cv__foot"},GE=["disabled"],KE=["src"],qE=n.defineComponent({__name:"ConvertModal",props:{convertUrl:{},fileName:{},fetchBytes:{type:Function},upload:{type:Function},t:{type:Function}},emits:["close","done"],setup(e,{emit:t}){const a=e,r=t,i=n.ref(null),o=n.ref("loading"),s=n.ref(null),l=n.ref([]),c=n.ref(""),d=n.ref(null),u=n.computed(()=>(a.fileName.split(".").pop()||"").toLowerCase()),p=n.computed(()=>{const S=l.value.filter(x=>x.from);return S.find(x=>(x.ext||"").toLowerCase()===u.value)||S.find(x=>(x.format||"").toLowerCase()===u.value)||null}),f=n.computed(()=>{const S=c.value.trim().toLowerCase(),x=new Set,N=[];for(const w of l.value){if(!w.to)continue;const E=(w.ext||w.format||"").toLowerCase();!E||x.has(E)||(x.add(E),N.push(w))}return N.sort((w,E)=>(w.ext||w.format).localeCompare(E.ext||E.format)),S?N.filter(w=>(w.ext||"").toLowerCase().includes(S)||(w.format||"").toLowerCase().includes(S)||(w.name||"").toLowerCase().includes(S)||(w.mime||"").toLowerCase().includes(S)):N}),h=n.computed(()=>`${a.convertUrl.replace(/\/$/,"")}/?embed=1`);let _=0;const b=new Map;function k(S,x={},N=[]){const w=++_;return new Promise((E,C)=>{var A,L;b.set(w,{resolve:E,reject:C}),(L=(A=i.value)==null?void 0:A.contentWindow)==null||L.postMessage({target:"convert-embed",id:w,cmd:S,...x},"*",N),setTimeout(()=>{b.has(w)&&(b.delete(w),C(new Error("convert timeout")))},18e4)})}function m(S){const x=S.data;if(!x||x.source!=="convert-embed")return;if(x.event==="ready"){v();return}const N=b.get(x.id);N&&(b.delete(x.id),x.ok?N.resolve(x):N.reject(new Error(x.error||"convert error")))}async function v(){try{const S=await k("listFormats");l.value=S.formats||[],o.value="ready",p.value||(s.value=y("convert.unsupportedInput","Bu dosya tipi için kaynak format bulunamadı."))}catch(S){s.value=S.message,o.value="error"}}async function g(){if(!(!d.value||!p.value)){o.value="converting",s.value=null;try{const S=await a.fetchBytes(),x=await k("convert",{name:a.fileName,bytes:S,fromIndex:p.value.index,toIndex:d.value.index},[S]),N=a.fileName.replace(/\.[^.]+$/,""),w=x.ext||d.value.ext||d.value.format,E=`${N}.${w}`,C=new File([x.bytes],E,{type:d.value.mime||"application/octet-stream"});await a.upload(C),o.value="done",r("done",E)}catch(S){s.value=S.message,o.value="error"}}}function y(S,x){return a.t?a.t(S,x):x}return n.onMounted(()=>window.addEventListener("message",m)),n.onBeforeUnmount(()=>window.removeEventListener("message",m)),(S,x)=>(n.openBlock(),n.createElementBlock("div",{class:"filex-cv__bg",onClick:x[3]||(x[3]=n.withModifiers(N=>r("close"),["self"]))},[n.createElementVNode("div",OE,[n.createElementVNode("header",IE,[n.createElementVNode("h3",null,n.toDisplayString(y("convert.title","Dönüştür"))+" — "+n.toDisplayString(e.fileName),1),n.createElementVNode("button",{class:"filex-cv__x",onClick:x[0]||(x[0]=N=>r("close"))},"✕")]),o.value==="loading"?(n.openBlock(),n.createElementBlock("div",RE,n.toDisplayString(y("convert.loading","Dönüştürücü yükleniyor…")),1)):o.value==="done"?(n.openBlock(),n.createElementBlock("div",LE,[n.createElementVNode("p",null,"✓ "+n.toDisplayString(y("convert.done","Dönüştürüldü ve klasöre yüklendi.")),1),n.createElementVNode("button",{class:"filex-cv__convert",onClick:x[1]||(x[1]=N=>r("close"))},n.toDisplayString(y("convert.close","Kapat")),1)])):(n.openBlock(),n.createElementBlock(n.Fragment,{key:2},[n.createElementVNode("p",zE,[n.createTextVNode(n.toDisplayString(y("convert.from","Kaynak"))+": ",1),n.createElementVNode("b",null,n.toDisplayString(u.value||"?"),1)]),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":x[2]||(x[2]=N=>c.value=N),class:"filex-cv__search",placeholder:y("convert.searchFmt","Hedef format ara (pdf, mp4, png…)")},null,8,FE),[[n.vModelText,c.value]]),n.createElementVNode("div",PE,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(f.value,N=>{var w;return n.openBlock(),n.createElementBlock("button",{key:N.index,class:n.normalizeClass(["filex-cv__fmt",{"is-sel":((w=d.value)==null?void 0:w.index)===N.index}]),onClick:E=>d.value=N},[n.createElementVNode("b",null,n.toDisplayString((N.ext||N.format).toUpperCase()),1),n.createElementVNode("small",null,n.toDisplayString(N.name),1)],10,$E)}),128)),f.value.length===0?(n.openBlock(),n.createElementBlock("div",VE,n.toDisplayString(y("convert.noFmt","Eşleşen format yok.")),1)):n.createCommentVNode("",!0)]),s.value?(n.openBlock(),n.createElementBlock("div",UE,n.toDisplayString(s.value),1)):n.createCommentVNode("",!0),n.createElementVNode("footer",HE,[n.createElementVNode("button",{class:"filex-cv__convert",disabled:!d.value||!p.value||o.value==="converting",onClick:g},n.toDisplayString(o.value==="converting"?y("convert.converting","Dönüştürülüyor…"):y("convert.convert","Dönüştür")),9,GE)])],64)),n.createElementVNode("iframe",{ref_key:"iframeRef",ref:i,src:h.value,class:"filex-cv__frame",title:"converter"},null,8,KE)])]))}}),WE={class:"fx-perm-modal"},jE={class:"fx-perm-head"},YE={class:"fx-perm-title"},XE={class:"fx-perm-ico","aria-hidden":"true"},ZE={class:"fx-perm-titletext"},JE=["title"],QE={class:"fx-perm-subdim"},eS={class:"fx-perm-tabs"},tS={class:"fx-perm-body"},nS={key:0,class:"fx-perm-warn"},aS={key:1,class:"fx-perm-warn"},rS={key:2,class:"fx-perm-muted"},iS={class:"fx-perm-addcard"},oS={class:"fx-perm-add"},sS={class:"fx-perm-emailwrap"},lS=["placeholder"],cS={key:0,class:"fx-perm-suggest"},dS=["onMousedown"],uS={class:"fx-perm-suggest-av"},fS={class:"fx-perm-suggest-txt"},pS={class:"fx-perm-suggest-name"},hS={class:"fx-perm-suggest-meta"},mS=["title"],gS=["value"],bS=["disabled"],yS={key:0,class:"fx-perm-invite"},vS={class:"fx-perm-muted"},kS={class:"fx-perm-invite-actions"},_S={class:"fx-perm-invite-row"},wS={value:"user"},ES={value:"viewer"},SS=["disabled"],xS=["disabled"],CS={key:1,class:"fx-perm-notice"},NS={key:2,class:"fx-perm-reveal"},TS={class:"fx-perm-section"},DS={key:0,class:"fx-perm-empty"},BS={class:"fx-perm-av"},AS=["title"],MS=["value","onChange"],OS=["value"],IS=["disabled","title","onClick"],RS={class:"fx-perm-av fx-perm-av--dim"},LS=["title"],zS={class:"fx-perm-badge"},FS=["title"],PS={class:"fx-perm-addcard"},$S={class:"fx-perm-share-opts"},VS={class:"fx-perm-check"},US={class:"fx-perm-field"},HS={class:"fx-perm-muted"},GS=["value"],KS={class:"fx-perm-field"},qS={class:"fx-perm-muted"},WS=["value"],jS={key:0,class:"fx-perm-hint fx-perm-ttlhint","data-testid":"share-ttl-hint"},YS=["disabled"],XS={key:1,class:"fx-perm-warn"},ZS={key:2,class:"fx-perm-result"},JS={class:"fx-perm-linkrow"},QS=["href"],ex={class:"fx-perm-muted fx-perm-validuntil","data-testid":"share-valid-until"},tx={key:0},nx={key:0,class:"fx-perm-pin"},ax={class:"fx-perm-cli"},rx={class:"fx-perm-clilabel"},ix={class:"fx-perm-clirow"},ox=["title"],sx={class:"fx-perm-mailrow"},lx=["placeholder"],cx=["disabled"],dx={key:1,class:"fx-perm-notice"},ux={key:3,class:"fx-perm-hint"},fx={class:"fx-perm-section"},px={key:0,class:"fx-perm-empty"},hx=["title"],mx=["onClick"],gx=["disabled","title","onClick"],bx={key:2,class:"fx-perm-addcard"},yx={class:"fx-perm-muted fx-perm-dropintro"},vx={class:"fx-perm-share-opts"},kx={class:"fx-perm-check"},_x={class:"fx-perm-field"},wx={class:"fx-perm-muted"},Ex=["value"],Sx={key:0,class:"fx-perm-hint fx-perm-ttlhint"},xx=["disabled"],Cx={key:1,class:"fx-perm-adv"},Nx={class:"fx-perm-adv-row"},Tx={class:"fx-perm-muted"},Dx={class:"fx-perm-adv-row"},Bx={class:"fx-perm-muted"},Ax={class:"fx-perm-adv-row"},Mx={class:"fx-perm-muted"},Ox=["placeholder"],Ix={class:"fx-perm-check"},Rx={key:2,class:"fx-perm-warn"},Lx={key:3,class:"fx-perm-result"},zx={class:"fx-perm-linkrow"},Fx=["href"],Px={class:"fx-perm-muted fx-perm-validuntil"},$x={key:0},Vx={key:0,class:"fx-perm-pin"},Ux={class:"fx-perm-mailrow"},Hx=["placeholder"],Gx=["disabled"],Kx={key:1,class:"fx-perm-notice"},qx=n.defineComponent({__name:"PermissionsModal",props:{api:{},path:{},isDir:{type:Boolean},size:{},locale:{},shareMaxTtlDays:{}},emits:["close"],setup(e,{emit:t}){const a=e,r=t,i=n.computed(()=>(a.locale??"tr")!=="en");function o(ce,le){return i.value?ce:le}const s=n.computed(()=>{const ce=/^([^:]+):\/\/(.*)$/.exec(a.path),le=ce?ce[1]:"",He=ce?ce[2]:a.path,yt=He.split("/").filter(Boolean);return{adapter:le,name:yt.length?yt[yt.length-1]:le,rel:He}}),l=n.ref("perms"),c=n.ref(!1),d=n.ref(!0),u=n.ref(""),p=n.ref([]),f=n.ref([]),h=n.ref(!0),_=n.ref(""),b=n.ref("viewer"),k=n.ref(!1),m=n.ref(""),v=n.ref(!1),g=n.ref("user"),y=n.ref(null),S=n.ref([]),x=n.ref(!1);let N;const w=[{v:"viewer",l:o("Görüntüleyen","Viewer"),d:o("görüntüle + indir","view + download")},{v:"editor",l:o("Düzenleyen","Editor"),d:o("oku + yaz + sil","read + write + delete")},{v:"owner",l:o("Sahip","Owner"),d:o("düzenle + izin yönet","edit + manage access")}];function E(ce){var le;return((le=w.find(He=>He.v===ce))==null?void 0:le.l)??ce}const C=n.ref([]),A=n.ref(!1),L=n.ref(!1),R=n.ref(Cs(a.shareMaxTtlDays)),$=n.ref(null),Y=n.ref(""),F=n.ref(""),q=n.ref(""),X=n.ref(!1),z=n.ref("");function H(ce){return ce===0?o("Süresiz","Never"):i.value?`${ce} gün`:`${ce} day${ce===1?"":"s"}`}const O=n.computed(()=>pE(fE,a.shareMaxTtlDays,H)),P=n.computed(()=>Qp(a.shareMaxTtlDays,i.value?"tr":"en"));n.watch(()=>a.shareMaxTtlDays,()=>{const ce=O.value.map(le=>le.v);ce.includes(R.value)||(R.value=Cs(a.shareMaxTtlDays)),ce.includes(ke.value)||(ke.value=Cs(a.shareMaxTtlDays))});const K=n.ref(0),J=[{v:0,l:o("Sınırsız","Unlimited")},{v:1,l:o("1 indirme","1 download")},{v:3,l:o("3 indirme","3 downloads")},{v:5,l:o("5 indirme","5 downloads")},{v:10,l:o("10 indirme","10 downloads")},{v:25,l:o("25 indirme","25 downloads")}],de=n.computed(()=>Zp($.value?{url:$.value.url,pin:$.value.pin,filename:s.value.name,isDir:!!a.isDir}:null)),xe=n.ref(!1),ke=n.ref(Cs(a.shareMaxTtlDays)),ae=n.ref(!1),be=n.ref(""),_e=n.ref(""),Ce=n.ref(""),Ve=n.ref(!0),rt=n.ref(!1),tt=n.ref(""),Pe=n.ref(null),ze=n.ref(""),Ie=n.ref(!1),pe=n.ref("");function Ge(ce){const le=new Set,He=[];for(const yt of ce.split(/[,;\s]+/)){const Ne=yt.trim().toLowerCase();Ne&&Ne.includes("@")&&!le.has(Ne)&&(le.add(Ne),He.push(Ne))}return He}function ge(ce){var yt,Ne;const le=((yt=ce.sent)==null?void 0:yt.length)??0,He=((Ne=ce.failed)==null?void 0:Ne.length)??0;return He===0?o(`E-posta gönderildi ✓ (${le})`,`Email sent ✓ (${le})`):o(`${le} gönderildi, ${He} başarısız`,`${le} sent, ${He} failed`)}async function he(){d.value=!0,u.value="";try{const ce=await a.api.listPermissions(a.path);p.value=ce.direct??[],f.value=ce.inherited??[],h.value=ce.storage_rbac,c.value=!0}catch(ce){ce.status===403?(c.value=!1,l.value="share"):u.value=ce instanceof Error?ce.message:String(ce)}finally{d.value=!1}}async function Ae(){try{const ce=await a.api.listShares(a.path);C.value=ce.shares??[]}catch{C.value=[]}}n.onMounted(async()=>{await he(),await Ae()}),n.onBeforeUnmount(()=>{N&&clearTimeout(N)});function nt(){v.value=!1,y.value=null,m.value="";const ce=_.value.trim();if(N&&clearTimeout(N),ce.length<1){S.value=[],x.value=!1;return}N=setTimeout(async()=>{try{const le=await a.api.searchUsers(ce);S.value=le.users??[],x.value=S.value.length>0}catch{x.value=!1}},180)}async function Re(ce){x.value=!1,_.value=ce.email;let le=b.value;ce.role==="viewer"&&le!=="viewer"&&(le="viewer"),k.value=!0,m.value="";try{await a.api.addPermission({path:a.path,user_id:ce.id,level:le,is_dir:!!a.isDir}),_.value="",S.value=[],await he(),m.value=o("Yetki verildi.","Access granted.")}catch(He){m.value=He instanceof Error?He.message:String(He)}finally{k.value=!1}}async function Me(){const ce=_.value.trim().toLowerCase();if(!ce||!ce.includes("@")){m.value=o("Geçerli bir e-posta girin.","Enter a valid email.");return}x.value=!1,k.value=!0,m.value="",y.value=null;try{const le=await a.api.resolveEmail(ce);if(le.found&&le.user){let He=b.value;le.user.role==="viewer"&&He!=="viewer"&&(He="viewer"),await a.api.addPermission({path:a.path,user_id:le.user.id,level:He,is_dir:!!a.isDir}),_.value="",await he(),m.value=o("Yetki verildi.","Access granted.")}else v.value=!0}catch(le){m.value=le instanceof Error?le.message:String(le)}finally{k.value=!1}}async function fe(){k.value=!0,m.value="";try{const ce=await a.api.invitePermission({path:a.path,email:_.value.trim().toLowerCase(),level:b.value,create_user:!0,role:g.value,is_dir:!!a.isDir,locale:a.locale??"tr"});y.value={tempPassword:ce.temp_password},m.value=ce.emailed?o("Kullanıcı açıldı, davet e-postası gönderildi.","User created, invite emailed."):o("Kullanıcı açıldı. Geçici parolayı iletin.","User created. Share the temp password."),v.value=!1,_.value="",await he()}catch(ce){m.value=ce instanceof Error?ce.message:String(ce)}finally{k.value=!1}}function Te(){q.value=_.value.trim().toLowerCase(),v.value=!1,m.value="",l.value="share"}async function Ue(ce,le){if(le!==ce.level){k.value=!0;try{await a.api.updatePermission(ce.id,le),await he()}catch(He){m.value=He instanceof Error?He.message:String(He)}finally{k.value=!1}}}async function et(ce){k.value=!0;try{await a.api.deletePermission(ce.id),await he()}catch(le){m.value=le instanceof Error?le.message:String(le)}finally{k.value=!1}}function _t(ce){return ce.user_display_name||ce.user_email||`#${ce.user_id}`}function j(ce){return(ce.user_display_name||ce.user_email||"?").charAt(0).toUpperCase()}function oe(){return R.value?new Date(Date.now()+R.value*864e5).toISOString():null}async function ie(){A.value=!0,Y.value="",$.value=null,z.value="";try{const ce=await a.api.createShare({path:a.path,password:L.value,expires_at:oe(),max_downloads:K.value||null});$.value={url:ce.share.url,pin:ce.share.password_pin??null,expiresAt:ce.share.expires_at??null,clamped:!!ce.share.expiry_clamped},await Ae()}catch(ce){Y.value=ce instanceof Error?ce.message:String(ce)}finally{A.value=!1}}async function we(){var le;const ce=Ge(q.value);if(!ce.length){z.value=o("Geçerli bir e-posta girin.","Enter a valid email.");return}if((le=$.value)!=null&&le.url){X.value=!0,z.value="";try{const He=await a.api.shareMail({path:a.path,emails:ce,url:$.value.url,pin:$.value.pin??void 0,expires_days:R.value||void 0,locale:a.locale??"tr",is_dir:!!a.isDir,size:a.size});z.value=ge(He)}catch(He){const yt=He.detail??"";yt.includes("not_configured")?z.value=o("SMTP ayarlı/doğrulanmış değil — linki elle iletin.","SMTP not set up/verified — share the link manually."):yt.includes("send_failed")?z.value=o("Gönderilemedi (geçici hata) — tekrar deneyin.","Send failed (temporary) — please retry."):z.value=He instanceof Error?He.message:String(He)}finally{X.value=!1}}}function te(){return ke.value?new Date(Date.now()+ke.value*864e5).toISOString():null}async function ye(){rt.value=!0,tt.value="",Pe.value=null,pe.value="";try{const ce={ask_name:Ve.value};be.value&&(ce.max_files=Number(be.value)),_e.value&&(ce.max_file_size_mb=Number(_e.value));const le=Ce.value.split(/[,\s]+/).map(yt=>yt.trim().replace(/^\./,"")).filter(Boolean);le.length&&(ce.allowed_ext=le);const He=await a.api.createShare({path:a.path,kind:"drop",password:xe.value,expires_at:te(),drop_settings:ce});Pe.value={url:He.share.url,pin:He.share.password_pin??null,expiresAt:He.share.expires_at??null,clamped:!!He.share.expiry_clamped}}catch(ce){tt.value=ce instanceof Error?ce.message:String(ce)}finally{rt.value=!1}}async function V(){var le;const ce=Ge(ze.value);if(!ce.length){pe.value=o("Geçerli bir e-posta girin.","Enter a valid email.");return}if((le=Pe.value)!=null&&le.url){Ie.value=!0,pe.value="";try{const He=await a.api.shareMail({path:a.path,emails:ce,url:Pe.value.url,pin:Pe.value.pin??void 0,expires_days:ke.value||void 0,locale:a.locale??"tr",is_dir:!0,mode:"drop"});pe.value=ge(He)}catch(He){(He.detail??"").includes("not_configured")?pe.value=o("SMTP ayarlı/doğrulanmış değil — linki elle iletin.","SMTP not set up/verified — share the link manually."):pe.value=He instanceof Error?He.message:String(He)}finally{Ie.value=!1}}}async function Be(ce){A.value=!0;try{await a.api.revokeShare(ce.uuid),await Ae()}catch(le){Y.value=le instanceof Error?le.message:String(le)}finally{A.value=!1}}function st(ce,le="url"){var He;(He=navigator.clipboard)==null||He.writeText(ce),F.value=le,setTimeout(()=>{F.value===le&&(F.value="")},1400)}const D=n.computed(()=>typeof navigator<"u"&&typeof navigator.share=="function");function Ee(ce){if(!ce||ce<=0)return"";const le=1024;if(ce<le)return`${ce} B`;const He=["K","M","G","T","P","E"];let yt=le,Ne=0;for(let ot=ce/le;ot>=le;ot/=le)yt*=le,Ne++;return`${(ce/yt).toFixed(1)} ${He[Ne]}B`}function Se(ce){return ce>0?o(`Bu bağlantı ${ce} gün geçerlidir.`,`This link is valid for ${ce} day(s).`):o("Bu bağlantının süresi yoktur.","This link does not expire.")}function G(ce){return Jp((ce==null?void 0:ce.expiresAt)??null,i.value?"tr":"en")}function re(){var Wt,Dt;const ce=s.value.name,le=((Wt=$.value)==null?void 0:Wt.url)??"",He=((Dt=$.value)==null?void 0:Dt.pin)??"",yt=a.isDir?o("klasör","folder"):o("dosya","file"),Ne=i.value?`${ce} ${a.isDir?"klasörü":"dosyası"} sizinle paylaşıldı`:`${ce} has been shared with you`,ot=[];if(ot.push(o("Merhaba,","Hello,"),""),ot.push(o(`Sizinle bir ${yt} paylaşıldı:`,`A ${yt} has been shared with you:`),""),a.isDir)ot.push(o(`Klasör: ${ce}`,`Folder: ${ce}`));else{ot.push(o(`Dosya: ${ce}`,`File: ${ce}`));const Lt=Ee(a.size);Lt&&ot.push(o(`Boyut: ${Lt}`,`Size: ${Lt}`))}return ot.push("",o("İndirmek için:","Download it here:"),le),He&&ot.push("",o(`PIN (erişim kodu): ${He}`,`PIN (access code): ${He}`)),ot.push("",Se(R.value)),{title:Ne,text:ot.join(`
|
|
3
3
|
`)}}function ve(){var Lt,Ea;const ce=s.value.name,le=((Lt=Pe.value)==null?void 0:Lt.url)??"",He=((Ea=Pe.value)==null?void 0:Ea.pin)??"",yt=Number(be.value)||20,Ne=Number(_e.value)||500,ot=Ce.value.split(/[,\s]+/).map(_n=>_n.trim().replace(/^\./,"")).filter(Boolean),Wt=o(`${ce} adlı klasöre dosya eklemeniz istendi`,`You've been asked to add files to ${ce}`),Dt=[];return Dt.push(o("Merhaba,","Hello,"),""),Dt.push(o("Dosya yüklemeniz istendi.","You've been invited to upload files."),""),Dt.push(o(`Klasör: ${ce}`,`Folder: ${ce}`)),Dt.push(o(`Sınır: en fazla ${yt} dosya, dosya başına ${Ne} MB.`,`Limit: up to ${yt} file(s), ${Ne} MB per file.`)),Dt.push(ot.length?o(`İzinli türler: ${ot.join(", ")}`,`Allowed types: ${ot.join(", ")}`):o("İzinli türler: tüm türler","Allowed types: all")),Dt.push("",o("Dosyalarınızı buradan yükleyebilirsiniz:","Upload your files here:"),le),He&&Dt.push("",o(`PIN (erişim kodu): ${He}`,`PIN (access code): ${He}`)),Dt.push("",Se(ke.value)),{title:Wt,text:Dt.join(`
|
|
4
4
|
`)}}async function ut(ce){if(D.value)try{await navigator.share(ce)}catch{}}return(ce,le)=>{var He,yt;return n.openBlock(),n.createElementBlock("div",{class:"fx-perm-overlay",onClick:le[26]||(le[26]=n.withModifiers(Ne=>r("close"),["self"]))},[n.createElementVNode("div",WE,[n.createElementVNode("header",jE,[n.createElementVNode("div",YE,[n.createElementVNode("span",XE,n.toDisplayString(e.isDir?"📁":"📄"),1),n.createElementVNode("div",ZE,[n.createElementVNode("h3",null,n.toDisplayString(o("Paylaş / İzinler","Share / Permissions")),1),n.createElementVNode("span",{class:"fx-perm-sub",title:e.path},[n.createTextVNode(n.toDisplayString(s.value.name),1),n.createElementVNode("span",QE," · "+n.toDisplayString(s.value.adapter),1)],8,JE)])]),n.createElementVNode("button",{class:"fx-perm-x",onClick:le[0]||(le[0]=Ne=>r("close")),"aria-label":"close"},"✕")]),n.createElementVNode("div",eS,[c.value?(n.openBlock(),n.createElementBlock("button",{key:0,class:n.normalizeClass(["fx-perm-tab",{"is-active":l.value==="perms"}]),onClick:le[1]||(le[1]=Ne=>l.value="perms")},n.toDisplayString(o("Kişiler","People")),3)):n.createCommentVNode("",!0),n.createElementVNode("button",{class:n.normalizeClass(["fx-perm-tab",{"is-active":l.value==="share"}]),onClick:le[2]||(le[2]=Ne=>l.value="share")},n.toDisplayString(o("Bağlantı","Link")),3),e.isDir?(n.openBlock(),n.createElementBlock("button",{key:1,class:n.normalizeClass(["fx-perm-tab",{"is-active":l.value==="drop"}]),onClick:le[3]||(le[3]=Ne=>l.value="drop")},n.toDisplayString(o("Dosya İste","Request files")),3)):n.createCommentVNode("",!0)]),n.createElementVNode("div",tS,[l.value==="perms"&&c.value?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[h.value?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("div",nS,n.toDisplayString(o("Bu diskte RBAC kapalı — izinler yalnızca RBAC açık disklerde geçerli.","RBAC is off on this storage — grants only apply when RBAC is enabled.")),1)),u.value?(n.openBlock(),n.createElementBlock("div",aS,n.toDisplayString(u.value),1)):n.createCommentVNode("",!0),d.value?(n.openBlock(),n.createElementBlock("div",rS,n.toDisplayString(o("Yükleniyor…","Loading…")),1)):(n.openBlock(),n.createElementBlock(n.Fragment,{key:3},[n.createElementVNode("div",iS,[n.createElementVNode("div",oS,[n.createElementVNode("div",sS,[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":le[4]||(le[4]=Ne=>_.value=Ne),type:"email",class:"fx-perm-input",autocomplete:"off",placeholder:o("İsim veya e-posta","Name or email"),onInput:nt,onKeyup:n.withKeys(Me,["enter"]),onFocus:nt},null,40,lS),[[n.vModelText,_.value]]),x.value?(n.openBlock(),n.createElementBlock("ul",cS,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(S.value,Ne=>(n.openBlock(),n.createElementBlock("li",{key:Ne.id,onMousedown:n.withModifiers(ot=>Re(Ne),["prevent"])},[n.createElementVNode("span",uS,n.toDisplayString((Ne.display_name||Ne.email).charAt(0).toUpperCase()),1),n.createElementVNode("span",fS,[n.createElementVNode("span",pS,n.toDisplayString(Ne.display_name||Ne.email),1),n.createElementVNode("span",hS,n.toDisplayString(Ne.email)+" · "+n.toDisplayString(Ne.role),1)])],40,dS))),128))])):n.createCommentVNode("",!0)]),n.withDirectives(n.createElementVNode("select",{"onUpdate:modelValue":le[5]||(le[5]=Ne=>b.value=Ne),class:"fx-perm-sel",title:(He=w.find(Ne=>Ne.v===b.value))==null?void 0:He.d},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(w,Ne=>n.createElementVNode("option",{key:Ne.v,value:Ne.v},n.toDisplayString(Ne.l),9,gS)),64))],8,mS),[[n.vModelSelect,b.value]]),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--primary",disabled:k.value,onClick:Me},n.toDisplayString(o("Ekle","Add")),9,bS)]),v.value?(n.openBlock(),n.createElementBlock("div",yS,[n.createElementVNode("p",vS,n.toDisplayString(o("Bu e-postada hesap yok. Ne yapmak istersiniz?","No account for this email — what next?")),1),n.createElementVNode("div",kS,[n.createElementVNode("div",_S,[n.withDirectives(n.createElementVNode("select",{"onUpdate:modelValue":le[6]||(le[6]=Ne=>g.value=Ne),class:"fx-perm-sel"},[n.createElementVNode("option",wS,n.toDisplayString(o("Kullanıcı","User")),1),n.createElementVNode("option",ES,n.toDisplayString(o("Görüntüleyen","Viewer")),1)],512),[[n.vModelSelect,g.value]]),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--primary",disabled:k.value,onClick:fe},n.toDisplayString(o("Kullanıcı oluştur + yetki ver","Create user + grant")),9,SS)]),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--ghost",disabled:k.value,onClick:Te},n.toDisplayString(o("Sadece paylaşım linki gönder →","Just send a share link →")),9,xS)])])):n.createCommentVNode("",!0),m.value?(n.openBlock(),n.createElementBlock("div",CS,n.toDisplayString(m.value),1)):n.createCommentVNode("",!0),(yt=y.value)!=null&&yt.tempPassword?(n.openBlock(),n.createElementBlock("div",NS,[n.createTextVNode(n.toDisplayString(o("Geçici parola:","Temp password:"))+" ",1),n.createElementVNode("code",null,n.toDisplayString(y.value.tempPassword),1)])):n.createCommentVNode("",!0)]),n.createElementVNode("div",TS,[n.createElementVNode("h4",null,n.toDisplayString(o("Erişimi olanlar","People with access")),1),!p.value.length&&!f.value.length?(n.openBlock(),n.createElementBlock("div",DS,n.toDisplayString(o("Henüz kimseyle paylaşılmadı.","Not shared with anyone yet.")),1)):n.createCommentVNode("",!0),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(p.value,Ne=>(n.openBlock(),n.createElementBlock("div",{key:"d"+Ne.id,class:"fx-perm-person"},[n.createElementVNode("span",BS,n.toDisplayString(j(Ne)),1),n.createElementVNode("span",{class:"fx-perm-user",title:Ne.user_email},n.toDisplayString(_t(Ne)),9,AS),n.createElementVNode("select",{class:"fx-perm-sel fx-perm-sel--sm",value:Ne.level,onChange:ot=>Ue(Ne,ot.target.value)},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(w,ot=>n.createElementVNode("option",{key:ot.v,value:ot.v},n.toDisplayString(ot.l),9,OS)),64))],40,MS),n.createElementVNode("button",{class:"fx-perm-del",disabled:k.value,title:o("Kaldır","Remove"),onClick:ot=>et(Ne)},"✕",8,IS)]))),128)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(f.value,Ne=>(n.openBlock(),n.createElementBlock("div",{key:"i"+Ne.id,class:"fx-perm-person fx-perm-inh"},[n.createElementVNode("span",RS,n.toDisplayString(j(Ne)),1),n.createElementVNode("span",{class:"fx-perm-user",title:Ne.user_email},n.toDisplayString(_t(Ne)),9,LS),n.createElementVNode("span",zS,n.toDisplayString(E(Ne.level)),1),n.createElementVNode("span",{class:"fx-perm-from",title:o("Üst klasörden gelir","Inherited from")+": "+(Ne.path_prefix||"/")}," ↳ "+n.toDisplayString(Ne.path_prefix||"/"),9,FS)]))),128))])],64))],64)):n.createCommentVNode("",!0),l.value==="share"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:1},[n.createElementVNode("div",PS,[n.createElementVNode("div",$S,[n.createElementVNode("label",VS,[n.withDirectives(n.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":le[7]||(le[7]=Ne=>L.value=Ne)},null,512),[[n.vModelCheckbox,L.value]]),n.createTextVNode(" "+n.toDisplayString(o("PIN ile koru","Protect with a PIN")),1)]),n.createElementVNode("label",US,[n.createElementVNode("span",HS,n.toDisplayString(o("Süre","Expiry")),1),n.withDirectives(n.createElementVNode("select",{"onUpdate:modelValue":le[8]||(le[8]=Ne=>R.value=Ne),class:"fx-perm-sel fx-perm-sel--sm","data-testid":"share-expiry"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(O.value,Ne=>(n.openBlock(),n.createElementBlock("option",{key:Ne.v,value:Ne.v},n.toDisplayString(Ne.l),9,GS))),128))],512),[[n.vModelSelect,R.value,void 0,{number:!0}]])]),n.createElementVNode("label",KS,[n.createElementVNode("span",qS,n.toDisplayString(o("İndirme limiti","Download limit")),1),n.withDirectives(n.createElementVNode("select",{"onUpdate:modelValue":le[9]||(le[9]=Ne=>K.value=Ne),class:"fx-perm-sel fx-perm-sel--sm"},[(n.openBlock(),n.createElementBlock(n.Fragment,null,n.renderList(J,Ne=>n.createElementVNode("option",{key:Ne.v,value:Ne.v},n.toDisplayString(Ne.l),9,WS)),64))],512),[[n.vModelSelect,K.value,void 0,{number:!0}]])])]),P.value?(n.openBlock(),n.createElementBlock("p",jS,n.toDisplayString(P.value),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--primary fx-perm-create",disabled:A.value,onClick:ie},n.toDisplayString(o("Bağlantı oluştur","Create link")),9,YS),Y.value?(n.openBlock(),n.createElementBlock("div",XS,n.toDisplayString(Y.value),1)):n.createCommentVNode("",!0),$.value?(n.openBlock(),n.createElementBlock("div",ZS,[n.createElementVNode("div",JS,[n.createElementVNode("a",{href:$.value.url,target:"_blank",rel:"noopener",class:"fx-perm-link"},n.toDisplayString($.value.url),9,QS),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--sm",onClick:le[10]||(le[10]=Ne=>st($.value.url,"new"))},n.toDisplayString(F.value==="new"?o("Kopyalandı ✓","Copied ✓"):o("Kopyala","Copy")),1)]),n.createElementVNode("div",ex,[n.createTextVNode(n.toDisplayString(G($.value))+" ",1),$.value.clamped?(n.openBlock(),n.createElementBlock("span",tx,n.toDisplayString(o("(sunucu sınırı uygulandı)","(server limit applied)")),1)):n.createCommentVNode("",!0)]),$.value.pin?(n.openBlock(),n.createElementBlock("div",nx,[n.createElementVNode("span",null,[le[27]||(le[27]=n.createTextVNode("PIN: ",-1)),n.createElementVNode("code",null,n.toDisplayString($.value.pin),1)]),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--sm",onClick:le[11]||(le[11]=Ne=>st($.value.pin,"sharepin"))},n.toDisplayString(F.value==="sharepin"?o("Kopyalandı ✓","Copied ✓"):o("Kopyala","Copy")),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",ax,[n.createElementVNode("span",rx,n.toDisplayString(o("Komut satırı","Command line")),1),n.createElementVNode("div",ix,[n.createElementVNode("code",{class:"fx-perm-clicmd",title:de.value},n.toDisplayString(de.value),9,ox),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--sm",onClick:le[12]||(le[12]=Ne=>st(de.value,"sharecli"))},n.toDisplayString(F.value==="sharecli"?o("Kopyalandı ✓","Copied ✓"):o("Kopyala","Copy")),1)])]),n.createElementVNode("div",sx,[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":le[13]||(le[13]=Ne=>q.value=Ne),type:"text",class:"fx-perm-input",autocomplete:"off",placeholder:o("e-posta(lar) — virgülle ayırın","email(s) — comma separated"),onKeyup:n.withKeys(we,["enter"])},null,40,lx),[[n.vModelText,q.value]]),n.createElementVNode("button",{class:"fx-perm-btn",disabled:X.value,onClick:we},n.toDisplayString(o("Gönder","Send")),9,cx)]),z.value?(n.openBlock(),n.createElementBlock("div",dx,n.toDisplayString(z.value),1)):n.createCommentVNode("",!0),D.value?(n.openBlock(),n.createElementBlock("button",{key:2,type:"button",class:"fx-perm-btn fx-perm-btn--ghost fx-perm-sharebtn",onClick:le[14]||(le[14]=Ne=>ut(re()))},[le[28]||(le[28]=n.createElementVNode("span",{"aria-hidden":"true"},"📤",-1)),n.createTextVNode(" "+n.toDisplayString(o("Paylaş","Share")),1)])):n.createCommentVNode("",!0)])):q.value?(n.openBlock(),n.createElementBlock("p",ux,[n.createTextVNode(n.toDisplayString(o("Aşağıdan bir bağlantı oluşturun, ardından","Create a link below, then it will be sent to"))+" ",1),n.createElementVNode("strong",null,n.toDisplayString(q.value),1),n.createTextVNode(" "+n.toDisplayString(o("adresine gönderin.",".")),1)])):n.createCommentVNode("",!0)]),n.createElementVNode("div",fx,[n.createElementVNode("h4",null,n.toDisplayString(o("Mevcut bağlantılar","Existing links")),1),C.value.length?n.createCommentVNode("",!0):(n.openBlock(),n.createElementBlock("div",px,n.toDisplayString(o("Yok","None")),1)),(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(C.value,Ne=>(n.openBlock(),n.createElementBlock("div",{key:Ne.uuid,class:"fx-perm-person"},[n.createElementVNode("span",{class:"fx-perm-user fx-perm-link",title:Ne.url},n.toDisplayString(Ne.url),9,hx),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--sm",onClick:ot=>st(Ne.url,Ne.uuid)},n.toDisplayString(F.value===Ne.uuid?o("✓","✓"):o("Kopyala","Copy")),9,mx),n.createElementVNode("button",{class:"fx-perm-del",disabled:A.value,title:o("İptal","Revoke"),onClick:ot=>Be(Ne)},"✕",8,gx)]))),128))])],64)):n.createCommentVNode("",!0),l.value==="drop"?(n.openBlock(),n.createElementBlock("div",bx,[n.createElementVNode("p",yx,n.toDisplayString(o("Bu klasöre herkesin dosya YÜKLEYEBİLECEĞİ herkese açık bir bağlantı. Yükleyenler klasördeki mevcut dosyaları göremez.","A public link that lets anyone UPLOAD files into this folder. Uploaders never see the folder's existing files.")),1),n.createElementVNode("div",vx,[n.createElementVNode("label",kx,[n.withDirectives(n.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":le[15]||(le[15]=Ne=>xe.value=Ne)},null,512),[[n.vModelCheckbox,xe.value]]),n.createTextVNode(" "+n.toDisplayString(o("PIN ile koru","Protect with a PIN")),1)]),n.createElementVNode("label",_x,[n.createElementVNode("span",wx,n.toDisplayString(o("Süre","Expiry")),1),n.withDirectives(n.createElementVNode("select",{"onUpdate:modelValue":le[16]||(le[16]=Ne=>ke.value=Ne),class:"fx-perm-sel fx-perm-sel--sm","data-testid":"drop-expiry"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(O.value,Ne=>(n.openBlock(),n.createElementBlock("option",{key:Ne.v,value:Ne.v},n.toDisplayString(Ne.l),9,Ex))),128))],512),[[n.vModelSelect,ke.value,void 0,{number:!0}]])])]),P.value?(n.openBlock(),n.createElementBlock("p",Sx,n.toDisplayString(P.value),1)):n.createCommentVNode("",!0),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--primary fx-perm-create",disabled:rt.value,onClick:ye},n.toDisplayString(o("Bağlantı oluştur","Create link")),9,xx),n.createElementVNode("button",{type:"button",class:"fx-perm-btn fx-perm-btn--ghost fx-perm-advtoggle",onClick:le[17]||(le[17]=Ne=>ae.value=!ae.value)},n.toDisplayString(ae.value?o("Gelişmiş ▲","Advanced ▲"):o("Gelişmiş ▼","Advanced ▼")),1),ae.value?(n.openBlock(),n.createElementBlock("div",Cx,[n.createElementVNode("label",Nx,[n.createElementVNode("span",Tx,n.toDisplayString(o("En fazla dosya","Max files")),1),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":le[18]||(le[18]=Ne=>be.value=Ne),type:"number",min:"1",class:"fx-perm-input fx-perm-input--sm",placeholder:"20"},null,512),[[n.vModelText,be.value]])]),n.createElementVNode("label",Dx,[n.createElementVNode("span",Bx,n.toDisplayString(o("Dosya başı MB","MB / file")),1),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":le[19]||(le[19]=Ne=>_e.value=Ne),type:"number",min:"1",class:"fx-perm-input fx-perm-input--sm",placeholder:"500"},null,512),[[n.vModelText,_e.value]])]),n.createElementVNode("label",Ax,[n.createElementVNode("span",Mx,n.toDisplayString(o("İzinli türler","Allowed types")),1),n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":le[20]||(le[20]=Ne=>Ce.value=Ne),type:"text",class:"fx-perm-input fx-perm-input--sm",placeholder:o("hepsi (örn. pdf, jpg)","all (e.g. pdf, jpg)")},null,8,Ox),[[n.vModelText,Ce.value]])]),n.createElementVNode("label",Ix,[n.withDirectives(n.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":le[21]||(le[21]=Ne=>Ve.value=Ne)},null,512),[[n.vModelCheckbox,Ve.value]]),n.createTextVNode(" "+n.toDisplayString(o("Yükleyenin adını sor","Ask uploader name")),1)])])):n.createCommentVNode("",!0),tt.value?(n.openBlock(),n.createElementBlock("div",Rx,n.toDisplayString(tt.value),1)):n.createCommentVNode("",!0),Pe.value?(n.openBlock(),n.createElementBlock("div",Lx,[n.createElementVNode("div",zx,[n.createElementVNode("a",{href:Pe.value.url,target:"_blank",rel:"noopener",class:"fx-perm-link"},n.toDisplayString(Pe.value.url),9,Fx),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--sm",onClick:le[22]||(le[22]=Ne=>st(Pe.value.url,"drop"))},n.toDisplayString(F.value==="drop"?o("Kopyalandı ✓","Copied ✓"):o("Kopyala","Copy")),1)]),n.createElementVNode("div",Px,[n.createTextVNode(n.toDisplayString(G(Pe.value))+" ",1),Pe.value.clamped?(n.openBlock(),n.createElementBlock("span",$x,n.toDisplayString(o("(sunucu sınırı uygulandı)","(server limit applied)")),1)):n.createCommentVNode("",!0)]),Pe.value.pin?(n.openBlock(),n.createElementBlock("div",Vx,[n.createElementVNode("span",null,[le[29]||(le[29]=n.createTextVNode("PIN: ",-1)),n.createElementVNode("code",null,n.toDisplayString(Pe.value.pin),1)]),n.createElementVNode("button",{class:"fx-perm-btn fx-perm-btn--sm",onClick:le[23]||(le[23]=Ne=>st(Pe.value.pin,"droppin"))},n.toDisplayString(F.value==="droppin"?o("Kopyalandı ✓","Copied ✓"):o("Kopyala","Copy")),1)])):n.createCommentVNode("",!0),n.createElementVNode("div",Ux,[n.withDirectives(n.createElementVNode("input",{"onUpdate:modelValue":le[24]||(le[24]=Ne=>ze.value=Ne),type:"text",class:"fx-perm-input",autocomplete:"off",placeholder:o("e-posta(lar) — virgülle ayırın","email(s) — comma separated"),onKeyup:n.withKeys(V,["enter"])},null,40,Hx),[[n.vModelText,ze.value]]),n.createElementVNode("button",{class:"fx-perm-btn",disabled:Ie.value,onClick:V},n.toDisplayString(o("Gönder","Send")),9,Gx)]),pe.value?(n.openBlock(),n.createElementBlock("div",Kx,n.toDisplayString(pe.value),1)):n.createCommentVNode("",!0),D.value?(n.openBlock(),n.createElementBlock("button",{key:2,type:"button",class:"fx-perm-btn fx-perm-btn--ghost fx-perm-sharebtn",onClick:le[25]||(le[25]=Ne=>ut(ve()))},[le[30]||(le[30]=n.createElementVNode("span",{"aria-hidden":"true"},"📤",-1)),n.createTextVNode(" "+n.toDisplayString(o("Paylaş","Share")),1)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])):n.createCommentVNode("",!0)])])])}}}),Wx={key:0,class:"fe__presence"},jx=["title"],Yx={key:1,class:"fe-e2e-strip",role:"status"},Xx={class:"fe-e2e-strip__label"},Zx={key:0,class:"fe__skeleton",role:"status"},Jx={class:"fe-sr-only"},Qx={key:0,class:"fe-skel-grid","aria-hidden":"true"},e9={key:1,class:"fe-skel-list","aria-hidden":"true"},t9={key:1,class:"fe-state"},n9={class:"fe-state__title"},a9={class:"fe-state__path"},r9={class:"fe-state__hint"},i9={class:"fe-state__actions"},o9={key:2,class:"fe-state"},s9={class:"fe-state__title"},l9={class:"fe-state__hint"},c9={class:"fe-state__actions"},d9={class:"fe-state__details"},u9={class:"fe-state__details-summary"},f9={class:"fe-state__details-pre"},p9={key:3,class:"fe-state fe-e2e-lock"},h9={class:"fe-state__title"},m9={class:"fe-state__hint"},g9=["placeholder","disabled"],b9=["disabled"],y9={key:0,class:"fe-form__error",role:"alert"},v9={key:4,class:"fe-state"},k9={class:"fe-state__title"},_9={class:"fe-state__hint"},w9={key:5,class:"fe-state"},E9={class:"fe-state__title"},S9={key:6,class:"fe-state"},x9={class:"fe-state__art",viewBox:"0 0 120 100",width:"110",height:"92",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},C9={key:0},N9={class:"fe-state__title"},T9={key:0,class:"fe-state__hint"},D9={key:1,class:"fe-state__actions"},B9={key:1,class:"fe__dragover"},A9=["title","aria-label"],M9={key:3,class:"fe-keep-strip",role:"status","aria-live":"polite"},O9={class:"fe-keep-strip__label"},I9={key:0,class:"fe-keep-strip__bar","aria-hidden":"true"},R9={class:"fe-recents__header"},L9={class:"fe-modal__head"},z9={class:"fe-modal__title"},F9={class:"fe-modal__body"},P9={class:"fe-toast__msg"},eh="brf-file-explorer:view-mode",th="filex.inspector",Yc="brf-file-explorer:path",nh="application/x-brf-files",$9=8*1024*1024,V9=10,U9="/files/edit",ah="filex.tourDone",H9="application/x-brf-files-src",rh="filex.tabs",G9=n.defineComponent({__name:"FileExplorer",props:{config:{}},emits:["share-created","file-opened","error","upload-progress","selection-change","navigate"],setup(e,{expose:t,emit:a}){const r=e,i=a,o=zr(r.config),s=n.computed(()=>r.config.locale||"tr"),{t:l}=zt(s),c=e_(o,{reload:()=>It()}),d=c.presenceUsers,u=c.degraded;function p(B){const M=(B||"").replace(/^\/+|\/+$/g,"");if(M===".trash"||M.startsWith(".trash/"))return null;const ee=Jt(M);return!ee||!ee.includes("://")||ee.startsWith("://")?null:ee}n.onMounted(()=>{c.start(),c.subscribe(p(y.value))}),n.onBeforeUnmount(()=>c.stop());const f=n_(r.config.apiBase,o),h=Ff(r.config,o),_=new Map,b=Yf(r.config,o,{onSettled:B=>{var ee;const M=_.get(B.id);if(_.delete(B.id),B.status==="error")ct(B.error_message||"İşlem başarısız");else if(M)Rn(`${M.message} (${B.progress_total})`,M.fn);else{const se=B.op_type==="copy"?"Kopyalandı":B.op_type==="move"?"Taşındı":"Silindi";ct(`${se} (${B.progress_total})`)}It(),(ee=an.value)==null||ee.reload()}}),k=n.ref(!1),m=(r.config.rootPath||"").trim(),v=m.replace("://","/").replace(/^\/+|\/+$/g,""),g=v||r.config.initialPath||"",y=n.ref(g),S=n.ref(r.config.defaultAdapter||"brf"),x=n.ref(g),N=n.ref([]),w=n.ref(""),E=n.ref(""),C=n.ref("");let A;function L(){It(A)}const R=n.customRef((B,M)=>{let ee=(()=>{try{const se=localStorage.getItem(eh);if(se==="list"||se==="grid"||se==="gallery")return se}catch{}return r.config.viewMode??"list"})();return{get(){return B(),ee},set(se){if(se!==ee){ee=se;try{localStorage.setItem(eh,se)}catch{}M()}}}}),$=n.ref("comfortable"),Y=n.ref(""),F=n.ref(!1),q=n.ref(""),X=n.computed(()=>F.value),z=n.computed(()=>{if(!pn.value)return"";const B=r.config.storages??[];return B.length===1?B[0].name:""}),H=n.computed(()=>{const B=(y.value??"").replace(/^\/+|\/+$/g,"");return v&&B===v||z.value&&B===z.value?!1:B.length>0}),O=n.computed(()=>pn.value?!(y.value??"").replace(/^\/+|\/+$/g,""):!1);function P(){if(F.value){It(q.value);return}const B=(y.value??"").replace(/^\/+|\/+$/g,"");if(!B||B===v||z.value&&B===z.value)return;const M=B.lastIndexOf("/");let ee=M===-1?"":B.slice(0,M);v&&!(ee===v||ee.startsWith(v+"/"))&&(ee=v),It(ee)}const K=$f(()=>N.value);n.watch(()=>[...K.selected.value],()=>{i("selection-change",K.nodes.value.map(M=>({path:M.path,basename:M.basename,type:M.type})));const B=K.nodes.value.filter(M=>M.type==="file");c.setFocus(B.length===1?B[0].basename:null)});const J=n.ref({mode:null,items:[],sourcePath:null}),de=n.ref(null),xe=n.computed(()=>{var B;return((B=de.value)==null?void 0:B.share_max_ttl_days)??0}),ke=n.ref(new Set),ae=n.ref(!1),be=n.ref(!1),_e=n.ref(null),Ce=n.ref(0);async function Ve(){try{const B=await oi(),M=r.config.apiBase??"",ee=await fetch(`${M}/api/files/manager/star/list?limit=500`,{headers:B,credentials:o.credentialsMode()});if(!ee.ok)return;const se=await ee.json(),De=Array.isArray(se)?se:Array.isArray(se==null?void 0:se.entries)?se.entries:Array.isArray(se==null?void 0:se.nodes)?se.nodes:[];ke.value=new Set(De.map(me=>me.id).filter(me=>typeof me=="number"))}catch{}}function rt(B,M){if(typeof B.id!="number")return;const ee=new Set(ke.value);M?ee.add(B.id):ee.delete(B.id),ke.value=ee}async function tt(B){if(typeof B.id=="number")try{const M=r.config.apiBase??"";await fetch(`${M}/api/files/manager/recent`,{method:"POST",headers:await oi({"Content-Type":"application/json"}),credentials:o.credentialsMode(),body:JSON.stringify({node_id:B.id})}),Ce.value+=1}catch{}}function Pe(B){typeof B.id=="number"&&(_e.value=B,be.value=!0)}function ze(B){const M={type:"file",path:B.path,basename:B.name,extension:(B.name.split(".").pop()||"").toLowerCase(),id:B.id};ae.value=!1,$a(M)}const Ie=n.computed(()=>{var M,ee,se;if(r.config.onlyOfficeBase)return r.config.onlyOfficeBase;const B=(ee=(M=de.value)==null?void 0:M.external)==null?void 0:ee.onlyoffice;return B&&!vc(B)?null:((se=de.value)==null?void 0:se.onlyoffice_url)||null}),pe=n.computed(()=>Ie.value&&o.endpoints.onlyOfficeConfig||null),Ge=n.computed(()=>{var ee,se,De;const B=r.config.drawioUrl||r.config.drawioBase;if(B)return B;const M=(se=(ee=de.value)==null?void 0:ee.external)==null?void 0:se.drawio;return M&&!vc(M)?null:((De=de.value)==null?void 0:De.drawio_url)||null}),ge=n.computed(()=>{var B;return r.config.convertBase||((B=de.value)==null?void 0:B.convert_url)||null}),he=n.ref([]),Ae=n.ref(null),nt=n.ref(!1),Re=n.ref(!1),Me=n.ref(!1),fe=n.ref(!1),Te=n.ref(!1),Ue=n.ref(null),et=n.ref(!1),_t=n.ref(null),j=n.ref(null),oe=n.ref(null),ie=n.ref("edit"),we=n.ref(!1),te=n.ref(null),ye=n.ref(!1),V=n.ref(null),Be=n.ref((()=>{try{return localStorage.getItem(th)==="1"}catch{return!1}})());function st(B){try{localStorage.setItem(th,B?"1":"0")}catch{}}function D(){Be.value=!Be.value,st(Be.value)}function Ee(){Be.value||(Be.value=!0,st(!0))}function Se(){Be.value&&(Be.value=!1,st(!1))}const G=n.computed(()=>{if(F.value)return l("node.trash");const B=(y.value??"").replace(/^\/+|\/+$/g,"");return B?B.split("/").pop()||B:S.value||l("breadcrumb.root")});function re(B){V.value=B,ye.value=!0}function ve(B){return B===void 0||B==="editor"||B==="owner"}function ut(B){var M;return B.length===1&&typeof((M=B[0])==null?void 0:M.perm)=="string"?B[0].perm:w.value}const ce=n.computed(()=>ve(w.value)),le=n.computed(()=>ce.value&&!O.value&&!F.value),He=n.ref(null),yt=n.ref(null),Ne=n.ref(null),ot=n.ref(!1),Wt=n.ref(!1);let Dt,Lt;function Ea(B){Wt.value=!!(B&&"matches"in B&&B.matches)}n.onMounted(()=>{var B;typeof ResizeObserver<"u"&&yt.value&&(Dt=new ResizeObserver(M=>{var se,De,me;const ee=((De=(se=M[0])==null?void 0:se.contentRect)==null?void 0:De.width)??((me=yt.value)==null?void 0:me.clientWidth)??0;ot.value=ee>0&&ee<560}),Dt.observe(yt.value)),typeof window<"u"&&window.matchMedia&&(Lt=window.matchMedia("(pointer: coarse)"),Ea(Lt),(B=Lt.addEventListener)==null||B.call(Lt,"change",Ea))}),n.onBeforeUnmount(()=>{var B;Dt==null||Dt.disconnect(),Dt=void 0,(B=Lt==null?void 0:Lt.removeEventListener)==null||B.call(Lt,"change",Ea),Lt=void 0});const _n=n.ref(null);let jt;function Mn(B,M){_n.value=B,jt&&clearTimeout(jt),jt=setTimeout(()=>_n.value=null,M)}function ct(B){Mn({message:B},2500)}function Rn(B,M){Mn({message:B,actionLabel:l("toast.undo"),action:M},8e3)}function Ln(){jt&&(clearTimeout(jt),jt=void 0),_n.value=null}async function ac(){var M;const B=(M=_n.value)==null?void 0:M.action;if(Ln(),!!B)try{await B(),ct(l("toast.undone")),await It()}catch{ct(l("toast.undo_failed"))}}const pn=n.computed(()=>r.config.multiStorageRoot===!0);function NF(B){const M=B.replace(/^\/+|\/+$/g,"");if(!M)return{adapter:"",rel:""};const ee=M.indexOf("/");return ee===-1?{adapter:M,rel:""}:{adapter:M.slice(0,ee),rel:M.slice(ee+1)}}function af(B){if(B.includes("://"))return B;const{adapter:M,rel:ee}=NF(B);return M?ee?`${M}://${ee}`:`${M}://`:""}function Qi(B){const M=B.indexOf("://");if(M===-1)return B.replace(/^\/+|\/+$/g,"");const ee=B.slice(0,M),se=B.slice(M+3).replace(/^\/+|\/+$/g,"");return se?`${ee}/${se}`:ee}function W2(){return(r.config.storages??[]).map(M=>({type:"dir",path:M.name,basename:M.label||M.name,extension:"",storage:M.name,visibility:"private",file_size:0,mime_type:"inode/storage",extra_metadata:{driver:M.driver,readOnly:M.readOnly}}))}function j2(){var B;L7(!mo.value),It(),(B=an.value)==null||B.reload()}async function It(B){k.value=!0,F.value=!1;let M=B??y.value??"";try{if(E.value="",C.value="",v){const De=String(M).replace(/^\/+|\/+$/g,"");(!De||!(De===v||De.startsWith(v+"/")))&&(M=v)}if(pn.value&&!af(M)){if(z.value)return await It(z.value);y.value="",S.value="",x.value="",Qn.value="",N.value=W2();return}const ee=pn.value?af(M):Jt(M),se=Y.value?await o.search(ee,Y.value):await o.index(ee);S.value=se.adapter,x.value=se.dirname,w.value=se.perm||"",Qn.value=typeof se.e2e_root=="string"?se.e2e_root:"",N.value=Up(se.files),Hp(N.value,se.adapter,se.dirname,r.config.trashVisible!==!1)&&Gp(N.value,se.adapter,o),y.value=pn.value?Qi(se.dirname):ri(se.dirname)}catch(ee){const se=ee instanceof Error?ee.message:String(ee),De=ee.status;if(De===404||De===403){E.value=String(M),Qn.value="",N.value=[],i("error",{message:se,context:{path:B}});return}C.value=se,A=typeof M=="string"?M:void 0,i("error",{message:se,context:{path:B}}),N.value.length>0&&ct(se)}finally{k.value=!1}}function ri(B){const M=B.indexOf("://");return M===-1?B:B.slice(M+3)}function TF(){E.value="",ek(""),It("")}async function as(){k.value=!0,q.value=S.value||"",F.value=!0,Qn.value="",K.clear();try{const{entries:B}=await o.listTrash();N.value=B.map(M=>({type:"file",id:M.id,path:M.storage_name?`${M.storage_name}://${M.path}`:M.path,basename:M.name,extension:M.name.includes(".")&&M.name.split(".").pop()||"",storage:M.storage_name||"",visibility:"private",file_size:M.size,mime_type:M.mime||"",extra_metadata:{deleted_at:M.deleted_at,ttl_days:M.ttl_days??null}})),x.value=".trash",y.value=".trash"}catch(B){const M=B instanceof Error?B.message:String(B);i("error",{message:M,context:{op:"trash-list"}}),ct(M)}finally{k.value=!1}}function Jt(B){if(B&&B.includes("://"))return B;if(pn.value){const M=af(B??"");return M||(S.value?`${S.value}://`:"")}return B?`${S.value}://${B.replace(/^\/+/,"")}`:`${S.value}://`}function Y2(B){const M=B.indexOf("://"),ee=(M===-1?B:B.slice(M+3)).replace(/\/+$/,""),se=ee.lastIndexOf("/");return se===-1?ee:ee.slice(se+1)}function rc(B){const M=B.indexOf("://"),ee=M===-1?"":B.slice(0,M+3),se=(M===-1?B:B.slice(M+3)).replace(/\/+$/,""),De=se.lastIndexOf("/");return De===-1?ee:ee+se.slice(0,De)}function rf(B,M){const ee=se=>{const De=se.indexOf("://"),me=De===-1?"":se.slice(0,De+3),pt=(De===-1?se:se.slice(De+3)).replace(/\/+$/,"");return me+pt};return ee(B)===ee(M)}function rs(B,M){return B?B.endsWith("://")||B.endsWith("/")?B+M:`${B}/${M}`:M}function X2(B,M,ee,se){if(!se||!ee)return;const De=M.map(me=>rs(ee,Y2(me)));De.length!==0&&_.set(B,{message:l("toast.moved"),fn:async()=>{const{op:me}=await o.moveAsync(De,se,ee);b.register(me)}})}n.watch(()=>Y.value,()=>void It());function ic(){return r.config.pathPersist??"hash"}function Z2(){const B=ic();return B==="hash"||B==="hash+localStorage"}function DF(B){try{return decodeURIComponent(B)}catch{return B}}function J2(){try{return localStorage.getItem(Yc)||""}catch{return""}}function Q2(){const B=window.location.hash||"";return B.startsWith("#")?DF(B.slice(1)).replace(/^\/+|\/+$/g,""):""}function BF(){if(typeof window>"u")return"";const B=ic();if(B==="none")return"";if(B==="localStorage")return J2();const M=Q2();return M||B==="hash"?M:g?"":J2()}function ek(B){if(typeof window>"u")return;const M=ic();if(M==="none")return;if(M==="localStorage"||M==="hash+localStorage"){try{B?localStorage.setItem(Yc,B):localStorage.removeItem(Yc)}catch{}if(M==="localStorage")return}const ee=B?B.split("/").map(encodeURIComponent).join("/"):"",se=ee?`#${ee}`:"";(window.location.hash||"")!==se&&history.replaceState(null,"",se||window.location.pathname+window.location.search)}function tk(){if(!Z2())return;const B=Q2();B&&B!==y.value&&It(B)}n.watch(y,B=>{ek(B),i("navigate",{path:B}),c.subscribe(p(B))}),t({reload:()=>It()}),n.onMounted(async()=>{var M;lo();const B=BF();await It(B||void 0),await n.nextTick(),(M=yt.value)==null||M.focus(),Ve(),Z2()&&window.addEventListener("hashchange",tk),o.endpoints.opsList&&b.startPolling(),o.endpoints.capabilities&&o.capabilities().then(ee=>{de.value=ee}).catch(()=>{})});const of=n.ref(!1),oc=n.ref(!1);function AF(B){return o.globalSearch(B,{limit:8,scope:"all"})}async function MF(B){const M=String(B.path??"").replace(/^\/+|\/+$/g,"");if(!M)return;const ee=B.type==="dir",se=M.lastIndexOf("/"),De=ee?M:se===-1?"":M.slice(0,se);let me=De;if(pn.value){const Gt=r.config.storages??[],yn=typeof B.storage=="string"&&B.storage||typeof B.storage_name=="string"&&B.storage_name||(Gt.length===1?Gt[0].name:"")||S.value;if(!yn)return;me=De?`${yn}/${De}`:yn}if(await It(me),ee)return;const pt=String(B.name??M.slice(se+1)),Rt=N.value.find(Gt=>Gt.type==="file"&&Gt.basename===pt);Rt&&(K.click(Rt.path),$a(Rt))}Kf(yt,{onDelete:()=>{var B;if(fa.value){const M=((B=an.value)==null?void 0:B.selectedNodes())??[];M.length&&(eo.value=M,et.value=!0,Me.value=!0)}else K.isEmpty.value||(et.value=!1,Me.value=!0)},onRename:()=>{var B;if(fa.value){const M=((B=an.value)==null?void 0:B.selectedNodes())??[];M.length===1&&(Ue.value=M[0],et.value=!0,Re.value=!0)}else K.nodes.value.length===1&&(Ue.value=K.nodes.value[0],et.value=!1,Re.value=!0)},onSelectAll:()=>{var B;return fa.value?(B=an.value)==null?void 0:B.selectAll():K.selectAll()},onOpen:()=>{var M;if(fa.value)return(M=an.value)==null?void 0:M.openSelected();const B=K.nodes.value[0];B&&$a(B)},onClose:()=>{var B;nt.value=!1,Re.value=!1,Me.value=!1,fe.value=!1,Te.value=!1,(B=He.value)==null||B.hide(),Ln(),ot.value&&Se()},onFocusSearch:()=>{var B;return(B=Ne.value)==null?void 0:B.focusSearch()},onCut:()=>fa.value?Dk():YF(),onCopy:()=>fa.value?Bk():XF(),onPaste:()=>fa.value?void Ak():void ok(),onGoUp:()=>{var B;return fa.value?(B=an.value)==null?void 0:B.goUp():P()},onPathJump:()=>{of.value=!0},onShowHelp:()=>{oc.value=!0},onQuickLook:()=>vP(),onToggleHidden:()=>j2(),onToggleInspector:()=>D(),onTabNew:()=>Sf(),onTabClose:()=>wk(Ef.value),onTabNext:()=>BP(),onTabPrev:()=>AP(),hasSelection:()=>!K.isEmpty.value});const OF=new Set(["docx","xlsx","pptx","doc","xls","ppt","odt","ods","odp"]);function $a(B){if(B.basename===".trash"){as();return}if(B.type==="dir"){const ee=pn.value?Qi(B.path):ri(B.path);It(ee);return}if(Va.value&&B.type==="file"){Bf(B);return}if(Cf.value&&B.type==="file")return;const M=(B.extension||"").toLowerCase();ie.value=ve(B.perm??w.value)?RF(M):"view",oe.value=B,Te.value=!0,i("file-opened",{path:B.path,basename:B.basename}),tt(B)}const IF=new Set([...OF,"drawio","dio","pdf","epub","ipynb","tiff","tif","psd","mmd","mermaid","glb","gltf","obj","stl","fbx","3ds","zip","rar","7z","tar","gz","tgz","jpg","jpeg","png","webp","gif","bmp","avif","svg","heic","mp4","webm","mov","mkv","m4v","ogv","mp3","wav","ogg","flac","m4a","aac","opus"]);function RF(B){return IF.has(B)?"view":"edit"}async function LF(B){const M=B??K.nodes.value;if(M.length!==0)try{if(F.value){const De=M.map(pt=>pt.id).filter(pt=>typeof pt=="number"),{restored:me}=await o.restoreIds(De);ct(`${me} öğe geri getirildi`),K.clear(),await as();return}if(!o.endpoints.restore)return;const ee=M.map(De=>De.path),{restored:se}=await o.restore(ee);ct(`${se} öğe geri getirildi`),K.clear(),await It()}catch(ee){i("error",{message:ee.message,context:{op:"restore"}})}}function nk(B){if(Va.value&&B.type==="file"){Bf(B);return}ie.value="view",oe.value=B,Te.value=!0,tt(B)}function zF(B){if(B.type==="dir"){const pt=pn.value?Qi(B.path):ri(B.path);It(pt);return}if(ea.value){Va.value&&Bf(B);return}if(!ve(B.perm??w.value)){nk(B);return}const M=(B.extension||"").toLowerCase(),ee=r.config.openPageBase;if(!ee){$a(B);return}const se=gk(ee),De=se.includes("?")?"&":"?",me=`${se}${De}path=${encodeURIComponent(B.path)}&type=${encodeURIComponent(M)}&mode=edit`;window.open(me,"_blank","noopener"),i("file-opened",{path:B.path,basename:B.basename}),tt(B)}const zn=n.ref("selection"),sf=n.ref(""),eo=n.ref([]),FF=n.ref(""),PF=n.computed(()=>{const B=K.nodes.value;return B.length===0?"none":B.length===1?B[0].type==="dir"?"single-dir":"single-file":"multi"});async function $F(B){const M=K.nodes.value;if(B==="open"){M[0]&&$a(M[0]);return}await pf(B,M)}const ua=n.computed(()=>r.config.desktopSync??null),sc=n.ref([]);async function ii(){if(ua.value)try{sc.value=await ua.value.kept()}catch{}}const to=n.ref(null);async function ak(){const B=ua.value;if(B!=null&&B.status)try{to.value=(await B.status()).active??null}catch{to.value=null}}let no=null,lf=!0;function VF(){no||!lf||(no=setTimeout(()=>{no=null,lf&&(ak(),ii())},300))}n.onMounted(()=>{var B,M;ii(),ak(),(M=(B=ua.value)==null?void 0:B.onChange)==null||M.call(B,VF)}),n.onBeforeUnmount(()=>{lf=!1,no&&(clearTimeout(no),no=null)});function is(B){const M=String(B.path??"");return M.includes("://")?M.replace(/\/+$/,""):`${M}://`}function lc(B,M){return M.endsWith("://")?B.startsWith(M)&&B!==M:B===M?!1:B.startsWith(M+"/")}function cf(B){return sc.value.some(M=>M.remote===B)?"kept":sc.value.some(M=>lc(B,M.remote))?"inherited":sc.value.some(M=>lc(M.remote,B))?"partial":"none"}function df(B){if(!ua.value||X.value||B.basename===".trash")return null;const M=is(B),ee=to.value;if(ee&&(M===ee.remote||lc(M,ee.remote)||lc(ee.remote,M)))return"syncing";const se=cf(M);return se==="kept"||se==="inherited"?"kept":se==="partial"?"partial":"cloud"}const UF=n.computed(()=>{const B=to.value;if(!B)return"";const M=B.remote.endsWith("://")?B.remote.slice(0,-3):B.remote.slice(B.remote.lastIndexOf("/")+1);return B.phase==="transfer"&&B.total>0?l("keep.strip_transfer",{name:M,done:String(B.done),total:String(B.total),pct:String(Math.min(100,Math.round(B.done*100/B.total)))}):B.phase==="settling"?l("keep.strip_settling",{name:M}):l("keep.strip_inventory",{name:M})}),rk=n.computed(()=>{const B=to.value;return!B||B.phase!=="transfer"||B.total<=0?null:Math.min(100,Math.round(B.done*100/B.total))});function ik(B){var De,me,pt;const M=ua.value,ee=B.length===1&&(((De=B[0])==null?void 0:De.type)==="dir"||((me=B[0])==null?void 0:me.type)==="file");if(!M||!ee||X.value||ea.value||((pt=B[0])==null?void 0:pt.e2e)===!0)return[];const se=cf(is(B[0]));return[{divider:!0,key:"sep-keep",label:""},{key:"keep-local",label:l("ctx.keep_local"),icon:"📌",hidden:se==="kept"||se==="inherited"},{key:"keep-online",label:l("ctx.keep_online"),icon:"☁",hidden:se!=="kept"},{key:"keep-inherited",label:l("ctx.keep_inherited"),icon:"📌",disabled:!0,hidden:se!=="inherited"},{key:"keep-reveal",label:l("ctx.keep_reveal"),icon:"📂",hidden:se!=="kept"&&se!=="inherited"}]}async function uf(B,M){var ee;zn.value="selection",ii(),K.has(B.path)||(K.click(B.path),await n.nextTick()),(ee=He.value)==null||ee.show({clientX:M.clientX,clientY:M.clientY},K.nodes.value)}function HF(B){var M;B.preventDefault(),zn.value="selection",K.clear(),(M=He.value)==null||M.show({clientX:B.clientX,clientY:B.clientY},[])}function GF(B){var M;zn.value="breadcrumb",sf.value=B.adapterPath,FF.value=B.label,(M=He.value)==null||M.show({clientX:B.x,clientY:B.y},[])}function KF(B,M){var se,De;lr.value="split",ii();const ee=((se=an.value)==null?void 0:se.selectedNodes())??[];eo.value=B?ee.length>0?ee:[B]:[],zn.value="pane",(De=He.value)==null||De.show({clientX:M.clientX,clientY:M.clientY},eo.value)}const qF=n.computed(()=>{if(zn.value==="breadcrumb")return[{key:"open",label:l("ctx.open"),icon:"↗"},{key:"copy-path",label:l("breadcrumb.copy_path"),icon:"📋"}];if(zn.value==="pane"){const me=eo.value;return me.length===0?[{key:"new-folder",label:l("toolbar.new_folder"),icon:"📁"},{key:"paste",label:l("ctx.paste"),icon:"📋",disabled:!J.value.mode}]:ff(me)}const B=K.nodes.value,M=B.length>0,ee=B.length===1;if(X.value)return M?[{key:"restore",label:l("ctx.restore"),icon:"↩"},{divider:!0,key:"sep1",label:""},{key:"delete",label:l("ctx.delete_perm"),icon:"🗑",danger:!0}]:[];const se=(y.value??"").replace(/^\/+|\/+$/g,"");if(pn.value&&se==="")return M?ee?[{key:"open",label:l("ctx.open"),icon:"↗"},{key:"open-tab",label:l("ctx.open_new_tab"),icon:"⧉"},...ik(B)]:[]:[];if(!M){const me=[{key:"toggle-hidden",label:mo.value?l("ctx.hide_hidden"):l("ctx.show_hidden"),icon:mo.value?"🙈":"👁"}];return ve(w.value)?[{key:"new-folder",label:l("toolbar.new_folder"),icon:"📁"},{key:"paste",label:l("ctx.paste"),icon:"📋",disabled:!J.value.mode},...me]:me}return ff(B)});function ff(B){var Rk,Lk,zk;const M=B.length>0,ee=B.length===1,se=ee&&((Rk=B[0])==null?void 0:Rk.type)==="file",De=s.value==="en"?"Tags…":"Etiketler…",me=ee&&typeof((Lk=B[0])==null?void 0:Lk.id)=="number",pt=s.value==="en"?"Copy node id":"Node id'yi kopyala",Rt=ut(B),Gt=ve(Rt),yn=s.value==="en"?"Share / Permissions":"Paylaş / İzinler";return[{key:"open",label:l("ctx.open"),icon:"↗",hidden:!ee},{key:"open-tab",label:l("ctx.open_new_tab"),icon:"⧉",hidden:!ee||((zk=B[0])==null?void 0:zk.type)!=="dir"},{key:"preview",label:l("ctx.preview"),icon:"👁",hidden:!ee,disabled:!se},{key:"download",label:l("ctx.download"),icon:"⬇",hidden:!ee,disabled:!se},{key:"convert",label:l("ctx.convert"),icon:"🔄",hidden:!ee||!ge.value||!Gt||ea.value,disabled:!se},{key:"access",label:yn,icon:"🔗",hidden:!ee||!Gt||ea.value},{key:"details",label:l("ctx.details"),icon:"ℹ",hidden:!M},{key:"copy-id",label:pt,icon:"🆔",hidden:!me,disabled:!me},{divider:!0,key:"sep1",label:"",hidden:!Gt},{key:"rename",label:l("ctx.rename"),icon:"✎",hidden:!ee||!Gt,disabled:!ee},{key:"cut",label:l("ctx.cut"),icon:"✂",hidden:!M||!Gt,disabled:!M},{key:"copy",label:l("ctx.copy"),icon:"❐",hidden:!M,disabled:!M},{key:"paste",label:l("ctx.paste"),icon:"📋",hidden:!Gt,disabled:!J.value.mode},{divider:!0,key:"sep-meta",label:"",hidden:!me},{key:"tags",label:De,icon:"🏷",hidden:!me,disabled:!me},...ik(B),{divider:!0,key:"sep2",label:"",hidden:!Gt},{key:"delete",label:l("ctx.delete"),icon:"🗑",danger:!0,hidden:!M||!Gt,disabled:!M}]}const WF=n.computed(()=>{const B=K.nodes.value;if(X.value)return B.length===0?[]:[{key:"restore",label:l("ctx.restore"),icon:"↩"},{key:"delete",label:l("ctx.delete_perm"),icon:"🗑",danger:!0}];const M=(y.value??"").replace(/^\/+|\/+$/g,"");return pn.value&&M===""?B.length===1?[{key:"open",label:l("ctx.open"),icon:"↗"}]:[]:B.length===0?[]:ff(B)});async function jF(B,M){if(zn.value==="breadcrumb"){B.key==="open"?It(ri(sf.value)):B.key==="copy-path"&&await mk(sf.value);return}if(zn.value==="pane"){await pf(B.key,eo.value);return}await pf(B.key,M)}async function pf(B,M){var ee;switch(B){case"open":M[0]&&zF(M[0]);break;case"preview":M[0]&&nk(M[0]);break;case"download":M[0]&&JF(M[0]);break;case"keep-local":{const se=ua.value;if(!se||!M[0])break;const De=is(M[0]);try{await se.keep(De,M[0].type==="file"?"file":"dir"),await ii(),cf(De)!=="none"&&ct(l("keep.started"))}catch(me){await ii(),ct(`${l("keep.failed")}: ${String((me==null?void 0:me.message)??me)}`)}break}case"keep-online":{const se=ua.value;if(!se||!M[0])break;try{await se.unkeep(is(M[0]))}catch{}await ii();break}case"keep-reveal":{const se=ua.value;se&&M[0]&&se.reveal(is(M[0]));break}case"convert":M[0]&&aP(M[0]);break;case"share":M[0]&&nP(M[0]);break;case"access":M[0]&&(V.value=M[0],ye.value=!0);break;case"details":Ee();break;case"copy-id":if(M[0]&&typeof M[0].id=="number"){const se=M[0].id;(ee=navigator.clipboard)==null||ee.writeText(String(se)).then(()=>ct(s.value==="en"?`Node id ${se} copied`:`Node id ${se} kopyalandı`),()=>ct(`#${se}`))}break;case"tags":M[0]&&Pe(M[0]);break;case"rename":M[0]&&(Ue.value=M[0],et.value=zn.value==="pane",Re.value=!0);break;case"cut":zn.value==="pane"?Dk():(J.value={mode:"cut",items:M,sourcePath:y.value},ct("Kes → Yapıştır hazır"));break;case"copy":zn.value==="pane"?Bk():(J.value={mode:"copy",items:M,sourcePath:y.value},ct("Kopyala → Yapıştır hazır"));break;case"paste":zn.value==="pane"||fa.value?await Ak():await ok();break;case"delete":et.value=zn.value==="pane",Me.value=!0;break;case"restore":M.length>0&&await LF(M);break;case"toggle-hidden":j2();break;case"new-folder":et.value=zn.value==="pane",nt.value=!0;break;case"duplicate":M[0]&&await ZF(M[0]);break;case"open-tab":M[0]&&Ek(M[0]);break}}function YF(){K.isEmpty.value||(J.value={mode:"cut",items:K.nodes.value,sourcePath:y.value},ct("Kesildi"))}function XF(){K.isEmpty.value||(J.value={mode:"copy",items:K.nodes.value,sourcePath:y.value},ct("Kopyalandı"))}async function ok(){const B=J.value;if(!(!B.mode||B.items.length===0))try{const M=B.items.map(pt=>pt.path),ee=B.sourcePath||"";if(B.mode==="cut"&&ee===y.value){ct("Aynı klasöre kesilemez");return}const De=Jt(y.value),me=Yp(M,De,B.mode==="cut"?"move":"copy");if(B.mode==="cut"){const pt=Jt(ee)||void 0,{op:Rt}=await o.moveAsync(M,De,pt);X2(Rt.id,M,De,pt),b.register(Rt),ct(me.cross?l("split.cross_move"):"Taşıma kuyruğa alındı")}else{const{op:pt}=await o.copy(M,De);b.register(pt),ct(me.cross?l("split.cross_copy"):"Kopyalama kuyruğa alındı")}J.value={mode:null,items:[],sourcePath:null}}catch(M){i("error",{message:M.message,context:{op:"paste"}})}}async function ZF(B){try{const{op:M}=await o.copy([B.path],Jt(y.value));b.register(M)}catch(M){i("error",{message:M.message,context:{op:"duplicate"}})}}function JF(B){if(Va.value){GP(B);return}const M=o.downloadUrl(B.path);window.open(M,"_blank")}async function QF(B){var ee,se;const M=et.value;try{const De=Jt(M?((ee=an.value)==null?void 0:ee.getPath())??"":y.value);await o.newFolder(De,B),nt.value=!1,M?await((se=an.value)==null?void 0:se.reload()):await It()}catch(De){i("error",{message:De.message,context:{op:"newfolder"}})}}async function eP(B){var se,De;const M=Ue.value;if(!M)return;const ee=et.value;try{const me=Jt(ee?((se=an.value)==null?void 0:se.getPath())??"":y.value),pt=M.path,Rt=M.basename;if(await o.rename(me,pt,B),Re.value=!1,Ue.value=null,ee?await((De=an.value)==null?void 0:De.reload()):await It(),B&&B!==Rt){const Gt=rs(rc(pt),B);Rn(l("toast.renamed"),async()=>{await o.rename(me,Gt,Rt)})}}catch(me){i("error",{message:me.message,context:{op:"rename"}})}}async function tP(){var pt,Rt,Gt;if(F.value){Me.value=!1,ct("Çöpteki öğeler saklama süresi sonunda otomatik silinir. Kalıcı silme yönetici panelinden yapılır.");return}const B=et.value,M=B?eo.value:K.nodes.value,ee=Jt(B?((pt=an.value)==null?void 0:pt.getPath())??"":y.value),se=M.map(yn=>yn.path);if(se.length===0){Me.value=!1;return}const De=M.map(yn=>yn.id).filter(yn=>typeof yn=="number"),me=o.endpoints.trashRestore&&De.length===M.length?async()=>{const{restored:yn}=await o.restoreIds(De);if(yn===0)throw new Error("restore failed")}:null;try{if(o.endpoints.deleteAsync){const{op:yn}=await o.deleteAsync(se,ee);me&&_.set(yn.id,{message:l("toast.trashed"),fn:me}),b.register(yn),ct("Silme kuyruğa alındı")}else await o.deleteItems(ee,se),B?await((Rt=an.value)==null?void 0:Rt.reload()):await It(),me&&Rn(l("toast.trashed"),me);Me.value=!1,B?(Gt=an.value)==null||Gt.reload():K.clear()}catch(yn){i("error",{message:yn.message,context:{op:"delete"}})}}function nP(B){_t.value=B,j.value=null,fe.value=!0}function aP(B){te.value=B,we.value=!0}function rP(B){ct(s.value==="en"?`Converted → ${B}`:`Dönüştürüldü → ${B}`),It()}async function iP(B){const M=_t.value;if(M)try{const{share:ee}=await o.createShare({path:M.path,password:B.password,expires_at:B.expires_at,max_downloads:B.max_downloads});j.value=ee,i("share-created",{path:M.path,url:ee.url,pin:ee.password_pin??null})}catch(ee){i("error",{message:ee.message,context:{op:"share"}})}}function oP(){fe.value=!1,_t.value=null,j.value=null}function cc(){var B;if(!ce.value){ct(s.value==="en"?"Read-only here":"Burada yazma yetkiniz yok");return}(B=Ae.value)==null||B.click()}function sP(B){const M=B.target,ee=M.files?Array.from(M.files):[];M.value="",sk(ee)}async function sk(B){if(B.length!==0){if(Cf.value){ct(l("e2e.upload.locked"));return}if(!(Va.value&&(B=await KP(B),B.length===0))){for(const M of B){if(h.shouldChunk(M)){const ee=h.resumableFor(Jt(y.value),M);if(ee&&ct(l("upload.resuming",{name:M.name,percent:M.size>0?Math.round(ee.offset/M.size*100):0})),await ck(M))continue}await lk(M)}await It()}}}async function lk(B,M){const ee=crypto.randomUUID(),se=M??Jt(y.value);he.value=[...he.value,{id:ee,file:B,path:se,totalBytes:B.size,uploadedBytes:0,percent:0,status:"uploading",cancel(){}}];const De=me=>{const pt=he.value.findIndex(Gt=>Gt.id===ee);if(pt===-1)return;const Rt=[...he.value];Rt[pt]={...Rt[pt],...me},he.value=Rt};try{await o.uploadMultipart(se,[B],me=>{De({percent:me,uploadedBytes:Math.round(me/100*B.size)}),i("upload-progress",{uploadId:ee,percent:me,done:me>=100})}),De({percent:100,uploadedBytes:B.size,status:"done"}),i("upload-progress",{uploadId:ee,percent:100,done:!0})}catch(me){const pt=me.message;De({status:"error",error:pt}),ct(l("upload.failed",{name:B.name})),i("error",{message:pt,context:{op:"upload",file:B.name}})}}async function ck(B,M){const ee=crypto.randomUUID();let se=!1;const De=pt=>{if(!se){he.value=[...he.value,{...pt,id:ee}],se=!0;return}const Rt=he.value.findIndex(Gt=>Gt.id===ee);if(Rt!==-1){const Gt=[...he.value];Gt[Rt]={...pt,id:ee},he.value=Gt}},me=M??Jt(y.value);try{return await h.uploadFile({path:me,file:B,onProgress:pt=>{!se&&pt.status!=="uploading"&&pt.uploadedBytes<=0||(De(pt),i("upload-progress",{uploadId:pt.uploadId??ee,percent:pt.percent,done:pt.status==="done"}))}}),!0}catch(pt){if(zf(pt))return se&&(he.value=he.value.filter(Gt=>Gt.id!==ee)),!1;const Rt=pt.message;return se||(he.value=[...he.value,{id:ee,file:B,path:me,totalBytes:B.size,uploadedBytes:0,percent:0,status:"error",error:Rt,cancel(){}}],se=!0),ct(l("upload.failed",{name:B.name})),i("error",{message:Rt,context:{op:"upload",file:B.name}}),!0}}const Mr=n.ref(0),Or=n.ref(!1);function hf(B){const M=B.dataTransfer;if(!M||M.types&&M.types.includes(nh)||co())return!1;if(M.items&&M.items.length>0){let ee=!1;for(const se of Array.from(M.items))if(se.kind==="file"){ee=!0;break}return ee}return M.types?M.types.includes("Files"):!1}function lP(B){hf(B)&&(B.preventDefault(),Mr.value++,Or.value=!0)}function cP(){Mr.value=Math.max(0,Mr.value-1),Mr.value===0&&(Or.value=!1)}function dP(B){if(ta(B)){B.preventDefault();return}hf(B)&&B.preventDefault()}function uP(B){var ee;if(ta(B)){const se=Mc(B)||"",De=Jt(y.value),me=ks(B);if(me&&se&&De&&se!==De&&!F.value&&ce.value){B.preventDefault(),Mr.value=0,Or.value=!1,ci(),os(),cs(me.map(pt=>pt.path),De,se);return}}if(ta(B)){Mr.value=0,Or.value=!1,ci(),os();return}if(!hf(B)){Mr.value=0,Or.value=!1;return}if(B.preventDefault(),Mr.value=0,Or.value=!1,!ce.value){ct(s.value==="en"?"Read-only here":"Burada yazma yetkiniz yok");return}const M=(ee=B.dataTransfer)!=null&&ee.files?Array.from(B.dataTransfer.files):[];M.length!==0&&sk(M)}function dk(B){var M;(M=B.dataTransfer)!=null&&M.types.includes("Files")&&B.preventDefault()}function uk(B){const M=yt.value,ee=B.target;M&&ee&&!M.contains(ee)&&B.preventDefault()}n.onMounted(()=>{var B,M;window.addEventListener("dragover",dk),window.addEventListener("drop",uk),window.addEventListener("pointerup",dc),window.addEventListener("blur",dc),(M=(B=Ir.value)==null?void 0:B.onProgress)==null||M.call(B,ee=>{const se=!!(ee!=null&&ee.dropped);if((ee==null?void 0:ee.error)==="drop_not_found"){ct(l("dragout.not_found"));return}if(ee!=null&&ee.error){(se||!fc)&&ct(ee.error);return}if(se){ct(ee!=null&&ee.finished?l("dragout.done"):l("dragout.downloading"));return}fc||!(ee!=null&&ee.finished)&&(ee==null?void 0:ee.done)===0&&ct(l("dragout.preparing"))})});function dc(){co()&&ci()}function os(){var B;(B=Ir.value)!=null&&B.cancel&&Promise.resolve(Ir.value.cancel()).catch(()=>{})}n.onBeforeUnmount(()=>{window.removeEventListener("dragover",dk),window.removeEventListener("drop",uk),window.removeEventListener("hashchange",tk),window.removeEventListener("pointerup",dc),window.removeEventListener("blur",dc)});const uc=n.computed(()=>J.value.mode!=="cut"?new Set:new Set(J.value.items.map(B=>B.path)));function mf(B,M){if(!M.dataTransfer)return;if(B.basename===".trash"){M.preventDefault();return}K.has(B.path)||K.click(B.path);const ee=K.nodes.value.filter(se=>!uc.value.has(se.path)).filter(se=>se.basename!==".trash").map(se=>({path:se.path,basename:se.basename,type:se.type}));if(Ir.value&&ee.length>0){M.preventDefault(),_4(ee,Jt(y.value)),Promise.resolve(Ir.value.start(ee)).catch(se=>{ci(),os(),i("error",{message:se.message,context:{op:"drag-out"}})});return}if(M.dataTransfer.setData(nh,JSON.stringify(ee)),M.dataTransfer.setData(H9,Jt(y.value)),M.dataTransfer.setData("text/plain",ee.map(se=>se.path).join(`
|