cista 1.4.0__tar.gz → 1.4.1__tar.gz
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.
- {cista-1.4.0 → cista-1.4.1}/PKG-INFO +34 -1
- {cista-1.4.0 → cista-1.4.1}/README.md +33 -0
- {cista-1.4.0 → cista-1.4.1}/cista/_version.py +1 -1
- {cista-1.4.0 → cista-1.4.1}/cista/api.py +13 -8
- {cista-1.4.0 → cista-1.4.1}/cista/app.py +1 -4
- {cista-1.4.0 → cista-1.4.1}/cista/auth.py +13 -16
- cista-1.4.0/cista/frontend-build/assets/index-DQ2iYrs-.css → cista-1.4.1/cista/frontend-build/assets/index-B0IgN1zv.css +1 -1
- cista-1.4.0/cista/frontend-build/assets/index-D4WrmH4f.js → cista-1.4.1/cista/frontend-build/assets/index-PhZha5OE.js +1 -1
- {cista-1.4.0 → cista-1.4.1}/cista/frontend-build/index.html +2 -2
- {cista-1.4.0 → cista-1.4.1}/.gitignore +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/__init__.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/__main__.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/config.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/droppy.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/fileio.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/frontend-build/assets/icons-DMD182WZ.js +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/frontend-build/assets/logo-ctv8tVwU.svg +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/frontend-build/robots.txt +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/preview.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/protocol.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/serve.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/server80.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/session.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/sso.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/util/__init__.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/util/apphelpers.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/util/asynclink.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/util/filename.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/util/lrucache.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/util/pwgen.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/cista/watching.py +0 -0
- {cista-1.4.0 → cista-1.4.1}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cista
|
|
3
|
-
Version: 1.4.
|
|
3
|
+
Version: 1.4.1
|
|
4
4
|
Summary: Dropbox-like file server with modern web interface
|
|
5
5
|
Project-URL: Homepage, https://git.zi.fi/Vasanko/cista-storage
|
|
6
6
|
Author: Vasanko
|
|
@@ -89,6 +89,39 @@ pip install cista --break-system-packages
|
|
|
89
89
|
|
|
90
90
|
The server remembers its settings in the config folder (default `~/.local/share/cista/`), including the listen port and directory, for future runs without arguments.
|
|
91
91
|
|
|
92
|
+
## Authentication
|
|
93
|
+
|
|
94
|
+
Cista supports three authentication modes:
|
|
95
|
+
|
|
96
|
+
### Built-in Authentication (default)
|
|
97
|
+
|
|
98
|
+
User accounts are managed directly by Cista. Create users with the `--user` flag:
|
|
99
|
+
|
|
100
|
+
```fish
|
|
101
|
+
uvx cista --user admin --privileged # Create admin user
|
|
102
|
+
uvx cista --user guest # Create regular user
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Privileged users can manage other users and change settings via the Admin Settings menu.
|
|
106
|
+
|
|
107
|
+
### Public Mode
|
|
108
|
+
|
|
109
|
+
In public mode, anyone can read, send and even delete files without without logging in. Privileged users can still log in via the menu to access admin settings, from where the public mode can be toggled on or off.
|
|
110
|
+
|
|
111
|
+
### Paskia SSO Authentication
|
|
112
|
+
|
|
113
|
+
For centralized authentication, Cista can integrate with [Paskia](https://git.zi.fi/LeoVasanko/paskia) SSO server. Set the `PASKIA_BACKEND_URL` environment variable:
|
|
114
|
+
|
|
115
|
+
```fish
|
|
116
|
+
PASKIA_BACKEND_URL=http://localhost:4401 uvx cista
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
In Paskia mode:
|
|
120
|
+
- All `/auth/*` requests are proxied to the Paskia backend
|
|
121
|
+
- Users with `cista:login` permission can access files
|
|
122
|
+
- Users with `cista:admin` permission get privileged access (Admin Settings)
|
|
123
|
+
- Public mode works with Paskia: unauthenticated users can browse, while the menu has option to login
|
|
124
|
+
|
|
92
125
|
### Internet Access
|
|
93
126
|
|
|
94
127
|
Most admins find the [Caddy](https://caddyserver.com/) web server convenient for its auto TLS certificates and all. A proxy also allows running multiple web services or Cista instances on the same IP address but different (sub)domains.
|
|
@@ -38,6 +38,39 @@ pip install cista --break-system-packages
|
|
|
38
38
|
|
|
39
39
|
The server remembers its settings in the config folder (default `~/.local/share/cista/`), including the listen port and directory, for future runs without arguments.
|
|
40
40
|
|
|
41
|
+
## Authentication
|
|
42
|
+
|
|
43
|
+
Cista supports three authentication modes:
|
|
44
|
+
|
|
45
|
+
### Built-in Authentication (default)
|
|
46
|
+
|
|
47
|
+
User accounts are managed directly by Cista. Create users with the `--user` flag:
|
|
48
|
+
|
|
49
|
+
```fish
|
|
50
|
+
uvx cista --user admin --privileged # Create admin user
|
|
51
|
+
uvx cista --user guest # Create regular user
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Privileged users can manage other users and change settings via the Admin Settings menu.
|
|
55
|
+
|
|
56
|
+
### Public Mode
|
|
57
|
+
|
|
58
|
+
In public mode, anyone can read, send and even delete files without without logging in. Privileged users can still log in via the menu to access admin settings, from where the public mode can be toggled on or off.
|
|
59
|
+
|
|
60
|
+
### Paskia SSO Authentication
|
|
61
|
+
|
|
62
|
+
For centralized authentication, Cista can integrate with [Paskia](https://git.zi.fi/LeoVasanko/paskia) SSO server. Set the `PASKIA_BACKEND_URL` environment variable:
|
|
63
|
+
|
|
64
|
+
```fish
|
|
65
|
+
PASKIA_BACKEND_URL=http://localhost:4401 uvx cista
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
In Paskia mode:
|
|
69
|
+
- All `/auth/*` requests are proxied to the Paskia backend
|
|
70
|
+
- Users with `cista:login` permission can access files
|
|
71
|
+
- Users with `cista:admin` permission get privileged access (Admin Settings)
|
|
72
|
+
- Public mode works with Paskia: unauthenticated users can browse, while the menu has option to login
|
|
73
|
+
|
|
41
74
|
### Internet Access
|
|
42
75
|
|
|
43
76
|
Most admins find the [Caddy](https://caddyserver.com/) web server convenient for its auto TLS certificates and all. A proxy also allows running multiple web services or Cista instances on the same IP address but different (sub)domains.
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# This file is automatically generated by hatch build.
|
|
2
|
-
__version__ = '1.4.
|
|
2
|
+
__version__ = '1.4.1'
|
|
@@ -95,14 +95,19 @@ async def control(req, ws):
|
|
|
95
95
|
async def watch(req, ws):
|
|
96
96
|
# Build user info from either built-in auth or SSO
|
|
97
97
|
user_info = None
|
|
98
|
-
if
|
|
99
|
-
# SSO auth (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
98
|
+
if sso.paskia_enabled():
|
|
99
|
+
# SSO auth: call validation to get user info (don't enforce auth in public mode)
|
|
100
|
+
try:
|
|
101
|
+
await sso.validate_sso_request(req)
|
|
102
|
+
except Exception:
|
|
103
|
+
pass # Ignore auth errors, user_info stays None
|
|
104
|
+
if sso_user := getattr(req.ctx, "sso_user", None):
|
|
105
|
+
ctx = sso_user.get("ctx", {})
|
|
106
|
+
perms = ctx.get("permissions", [])
|
|
107
|
+
user_info = {
|
|
108
|
+
"username": ctx.get("user", {}).get("display_name", ""),
|
|
109
|
+
"privileged": "cista:admin" in perms,
|
|
110
|
+
}
|
|
106
111
|
elif req.ctx.user:
|
|
107
112
|
# Built-in auth: use local user database
|
|
108
113
|
user_info = {
|
|
@@ -257,10 +257,7 @@ def get_files(wanted: set) -> list[tuple[PurePosixPath, Path]]:
|
|
|
257
257
|
@app.get("/zip/<keys>/<zipfile:ext=zip>")
|
|
258
258
|
async def zip_download(req, keys, zipfile, ext):
|
|
259
259
|
"""Download a zip archive of the given keys"""
|
|
260
|
-
|
|
261
|
-
await auth.verify_sso(req)
|
|
262
|
-
else:
|
|
263
|
-
auth.verify(req)
|
|
260
|
+
await auth.verify(req)
|
|
264
261
|
|
|
265
262
|
wanted = set(keys.split("+"))
|
|
266
263
|
files = get_files(wanted)
|
|
@@ -236,39 +236,36 @@ async def verify(request, *, privileged=False):
|
|
|
236
236
|
|
|
237
237
|
For paskia mode (PASKIA_BACKEND_URL set), validates against the SSO backend.
|
|
238
238
|
For built-in mode, checks session-based authentication.
|
|
239
|
-
For public mode (config.public=True),
|
|
240
|
-
|
|
241
|
-
All 401/403 responses include auth.iframe URL for consistent frontend handling
|
|
242
|
-
via the paskia library's showAuthIframe().
|
|
239
|
+
For public mode (config.public=True), skips auth unless privileged is required.
|
|
243
240
|
|
|
244
241
|
Args:
|
|
245
242
|
request: The Sanic request object
|
|
246
|
-
privileged: If True, requires admin privileges
|
|
243
|
+
privileged: If True, requires admin privileges (always enforced even in public mode)
|
|
247
244
|
|
|
248
245
|
Raises:
|
|
249
246
|
Unauthorized: If authentication is required
|
|
250
247
|
Forbidden: If access is denied
|
|
251
248
|
"""
|
|
249
|
+
# Public mode: skip auth unless privileged access is required
|
|
250
|
+
if config.config.public and not privileged:
|
|
251
|
+
return
|
|
252
|
+
|
|
252
253
|
sso = _get_sso()
|
|
253
254
|
if sso.paskia_enabled():
|
|
254
|
-
# SSO validation against auth backend
|
|
255
|
-
# Always check cista:login; privileged flag comes from response perm list
|
|
256
255
|
perm = "cista:admin" if privileged else "cista:login"
|
|
257
256
|
await sso.validate_sso_request(request, perm=perm)
|
|
258
257
|
return
|
|
259
258
|
|
|
260
259
|
user = getattr(request.ctx, "user", None)
|
|
261
260
|
if privileged:
|
|
262
|
-
if user:
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
elif config.config.public or user:
|
|
261
|
+
if user and user.privileged:
|
|
262
|
+
return
|
|
263
|
+
raise Forbidden(
|
|
264
|
+
"Access Forbidden: Only for privileged users",
|
|
265
|
+
quiet=True,
|
|
266
|
+
)
|
|
267
|
+
if user:
|
|
270
268
|
return
|
|
271
|
-
# Return iframe URL for paskia library to show login dialog
|
|
272
269
|
raise Unauthorized(
|
|
273
270
|
f"Login required for {request.path}",
|
|
274
271
|
"cookie",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
@charset "UTF-8";:root{--primary-background: #ddd;--header-background: var(--soft-color);--header-color: #ccc;--input-background: #fff;--input-color: #000;--primary-color: #000;--soft-color: #146;--accent-color: #f80;--transition-time: .2s;--root-font-size: 1rem;--header-font-size: 1rem;--header-height: 4rem}@media(prefers-color-scheme:dark){:root{--primary-color: #ddd;--primary-background: var(--soft-color);--header-background: #000;--header-color: #ccc;--input-background: var(--soft-color);--input-color: #ddd}}@media screen and (max-width:600px){.size,.modified,.summary{display:none}}@media screen and (min-width:1000px){:root{--root-font-size: calc(8px + .8vw) }}@media screen and (min-width:2000px){:root{--root-font-size: 1.5rem}}@media screen and (max-height:600px){:root{--header-font-size: calc(10px + 10 * 100vh / 600);--root-font-size: .8rem;--header-height: 2rem}header .breadcrumb>*{padding-top:calc(8 + 8 * 100vh / 600)!important;padding-bottom:calc(8 + 8 * 100vh / 600)!important}}@media screen and (max-height:300px){:root{--header-font-size: 15px;--header-height: 28px ;--root-font-size: .6rem}header .breadcrumb>*{padding-top:14px!important;padding-bottom:14px!important}}@media screen and (orientation:landscape)and (min-width:700px){:root{--header-font-size: calc(8px + 8 * 100vh / 600)}header{display:flex;justify-content:space-between}header .headermain{order:1}header .breadcrumb{align-self:stretch}header .action-button{width:2em;height:2em}}@media print{:root{--primary-color: black;--primary-background: none;--header-background: none;--header-color: black}.headermain,.menu,.rename-button{display:none!important}.breadcrumb>a{color:#000!important;background:none!important;padding:0!important;margin:0!important;clip-path:none!important;max-width:none!important}.breadcrumb>a:after{content:"/"}.breadcrumb svg{fill:#000!important;margin:0 .5rem 0 1rem!important}body#app{position:static!important;height:auto!important}main{padding-bottom:0!important}thead tr{font-size:1rem!important;position:static!important;background:none!important;border-bottom:1pt solid black!important}audio::-webkit-media-controls-timeline,video::-webkit-media-controls-timeline{display:none}audio::-webkit-media-controls,video::-webkit-media-controls{display:none}tr,figure{page-break-inside:avoid}.selection{min-width:0!important;padding:0!important}.selection input{display:none}.selection input:checked{display:inherit}tbody .selection input:checked{opacity:1!important;transform:scale(.5);left:0}}*{box-sizing:border-box}html{font-size:var(--root-font-size);overflow:hidden}main{-ms-overflow-style:none;scrollbar-width:none}body{background-color:var(--primary-background);font-size:1rem;font-family:Roboto;color:var(--primary-color);margin:0;overflow:hidden;height:100vh;height:100dvh}tbody .size,tbody .modified{font-family:Roboto Mono}header{flex:0 0 auto;background-color:var(--header-background);color:var(--header-color);font-size:var(--header-font-size)}main{height:100%}::selection{color:#000;background:#ff0!important}button{font:inherit;color:inherit;margin:0;border:0;padding:0;background:none;cursor:pointer;min-width:1rem;min-height:1rem}input{margin:0}:focus{outline:none}a:link,a:visited,a:active,a:hover{color:var(--primary-color);text-decoration:none}table{border-collapse:collapse;border-spacing:0;border:0;gap:0}body#app{position:fixed;inset:0;display:flex;flex-direction:column}main{flex:1 1 auto;min-height:0;padding-bottom:3em;overflow-y:scroll;text-align:center}header nav.headermain{position:relative;z-index:100}.spacer{flex-grow:1}.smallgap{flex-shrink:1;width:2em}[data-tooltip]:hover:after{z-index:101;content:attr(data-tooltip);position:absolute;pointer-events:none;font-size:1rem;text-align:center;padding:.5rem 1rem;border-radius:3rem 0;box-shadow:0 0 1rem var(--accent-color);transform:translate(calc(1rem - 50%),150%);background-color:var(--accent-color);color:var(--primary-color);white-space:pre;animation:appearbriefly calc(10 * var(--transition-time)) linear forwards}@keyframes appearbriefly{0%{opacity:0}30%{opacity:0}40%{opacity:1}90%{opacity:1}to{opacity:0}}.error-message{padding:.5em;font-weight:700;background:var(--accent-color);color:#000}.transferprogress[data-v-fc92216f]{--bar: var(--accent-color);--nobar: var(--header-background);display:flex;flex-direction:column;color:var(--primary-color);width:100%}.statustext[data-v-fc92216f]{display:flex;align-items:center;margin:0 .5em;padding:.5rem 0}span[data-v-fc92216f]{color:#ccc;white-space:nowrap;text-align:right;padding:0 .5em}.filename[data-v-fc92216f]{color:#fff;flex:1 1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left}.index[data-v-fc92216f]{min-width:3.5em}.position[data-v-fc92216f],.speed[data-v-fc92216f]{min-width:4em}.upload .statustext[data-v-fc92216f]:before{font-size:1.5em;content:"🔺"}.download .statustext[data-v-fc92216f]:before{font-size:1.5em;content:"🔻"}:root{--breadcrumb-background-odd: #2d2d2d;--breadcrumb-background-even: #404040;--breadcrumb-color: #ddd;--breadcrumb-hover-color: #fff;--breadcrumb-hover-background-odd: #25a;--breadcrumb-hover-background-even: #812;--breadcrumb-transtime: .3s}.breadcrumb{flex:1 1 auto;display:flex;min-width:20%;max-width:100%;min-height:2em;margin:0;padding:0 1em 0 0;overflow:hidden}.breadcrumb>a{flex:0 4 auto;display:flex;align-items:center;margin:0 -.5em;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:var(--breadcrumb-color);padding:.3em 1.5em;clip-path:polygon(0 0,1em 50%,0 100%,100% 100%,100% 0,0 0);transition:all var(--breadcrumb-transtime)}.breadcrumb>a:first-child{flex:0 0 auto;padding-left:1.5em;padding-right:1.7em;clip-path:none}.breadcrumb>a:last-child{clip-path:polygon(0 0,calc(100% - 1em) 0,100% 50%,calc(100% - 1em) 100%,0 100%,1em 50%,0 0)}.breadcrumb>a:only-child{clip-path:polygon(0 0,calc(100% - 1em) 0,100% 50%,calc(100% - 1em) 100%,0 100%,0 0)}.breadcrumb svg{width:1.3em;height:1.3em;margin:-.5em;fill:var(--breadcrumb-color);transition:fill var(--breadcrumb-transtime)}.breadcrumb a:nth-child(odd){background:var(--breadcrumb-background-odd)}.breadcrumb a:nth-child(2n){background:var(--breadcrumb-background-even)}.breadcrumb a:nth-child(odd):hover,.breadcrumb a:focus:nth-child(odd){background:var(--breadcrumb-hover-background-odd)}.breadcrumb a:nth-child(2n):hover,.breadcrumb a:focus:nth-child(2n){background:var(--breadcrumb-hover-background-even)}.breadcrumb a:hover{color:var(--breadcrumb-hover-color)}.breadcrumb a:hover svg{fill:var(--breadcrumb-hover-color)}.breadcrumb a.current{color:var(--accent-color);max-width:none;flex:0 1 auto}.breadcrumb a.current svg{fill:var(--accent-color)}.action-button{background:none;border:none;color:#ccc;cursor:pointer;transition:all .2s ease;padding:.2em;width:3em;height:3em}.action-button:hover,.action-button:focus{color:#fff;transform:scale(1.1)}svg{fill:#ccc;transform:fill .2s ease}.action-button:hover svg,.action-button:focus svg{fill:#fff}@keyframes rotate-0494c508{0%{transform:rotate(0)}to{transform:rotate(360deg)}}svg.cog[data-v-0494c508]{width:10rem;height:10rem;margin:0 auto;animation:rotate-0494c508 10s linear infinite;filter:drop-shadow(0 0 1rem black);fill:#888}svg.cog.stopped[data-v-0494c508]{animation:none}input#FileRenameInput{color:var(--input-color);background:var(--input-background);border:0;border-radius:.3rem;padding:.4rem;margin:-.4rem;width:100%;outline:none;font:inherit}.gallery input#FileRenameInput{padding:.75em;font-weight:600;width:auto}img[data-v-47490c5c],embed[data-v-47490c5c],.icon[data-v-47490c5c],audio[data-v-47490c5c],video[data-v-47490c5c]{font-size:8em;overflow:hidden;min-width:50%;max-width:100%;max-height:100%;border-radius:.0625em}.folder[data-v-47490c5c]:before{content:"📁"}.folder[data-v-47490c5c]:hover:before,.cursor .folder[data-v-47490c5c]:before{content:"📂"}.archive[data-v-47490c5c]:before{content:"📦"}.file[data-v-47490c5c]:before{content:"📄"}.ext-img[data-v-47490c5c]:before{content:"💿"}.ext-exe[data-v-47490c5c]:before,.ext-msi[data-v-47490c5c]:before,.ext-dmg[data-v-47490c5c]:before,.ext-pkg[data-v-47490c5c]:before{content:"⚙️"}.ext-torrent[data-v-47490c5c]:before{content:"🏴☠️"}.audio audio[data-v-47490c5c]{opacity:0;transition:opacity var(--transition-time) ease-in-out}.audio:hover audio[data-v-47490c5c]{opacity:1}.audio.icon[data-v-47490c5c]:before{width:100%;content:"🔈"}.audio.icon[data-v-47490c5c]:has(audio[data-playing]):before{position:absolute;content:"🔊";bottom:0}.icon[data-v-47490c5c]{filter:brightness(.9)}figure.cursor .icon[data-v-47490c5c]{filter:brightness(1)}img[data-v-47490c5c]:before{text-shadow:0 0 .5rem #000;filter:grayscale(1);content:"❌"}.video-container[data-v-47490c5c]{position:relative;display:flex;align-items:center;justify-content:center;min-width:50%;max-width:100%;max-height:100%}.video-container video[data-v-47490c5c]{width:100%;height:100%;border-radius:.0625em;object-fit:contain}.play-overlay[data-v-47490c5c]{position:absolute;display:flex;align-items:center;justify-content:center;pointer-events:none;width:4em;height:4em;background:#0003;border-radius:50%;transition:opacity .2s ease,transform .2s ease}.play-overlay svg[data-v-47490c5c]{width:2em;height:2em;fill:#fff;margin-left:.25em}.video-container:hover .play-overlay[data-v-47490c5c]{transform:scale(1.1)}video[data-playing]+.play-overlay[data-v-47490c5c]{opacity:0}.cursor-tooltip[data-v-c5d421fc]{position:fixed;z-index:10000;padding:.5rem 1rem;border-radius:3rem 0;box-shadow:0 0 1rem var(--accent-color);background-color:var(--accent-color);color:var(--primary-color);white-space:nowrap;pointer-events:none;font-size:1rem}.tooltip-name[data-v-91479c1d]{font-weight:600;text-align:center}.tooltip-details[data-v-91479c1d]{text-align:center}figure[data-v-91479c1d]{max-height:15em;position:relative;border-radius:.5em;margin:0;display:flex;flex-direction:column;align-items:center;justify-content:center;overflow:hidden}figure>article[data-v-91479c1d]{flex:0 0 auto}figure[data-v-91479c1d] .video-container{height:15em}.titlespacer[data-v-91479c1d]{flex-shrink:100000;width:100%;height:2em}figcaption[data-v-91479c1d]{position:absolute;overflow:hidden;bottom:0;display:flex;align-items:center;justify-content:center;width:100%}figcaption input[type=checkbox][data-v-91479c1d]{width:1.5em;height:1.5em;margin:.25em 0 .25em .25em;opacity:0;flex-shrink:0;transition:opacity var(--transition-time) ease-in-out}figcaption input[type=checkbox][data-v-91479c1d]:checked,figcaption:hover input[type=checkbox][data-v-91479c1d]{opacity:1}figcaption span[data-v-91479c1d]{cursor:default;padding:.5em;color:#fff;font-weight:600;text-shadow:0 0 .2em #000,0 0 .2em #000;text-wrap:nowrap;text-overflow:ellipsis;overflow:hidden}.cursor figcaption span[data-v-91479c1d]{color:var(--accent-color)}figcaption .namespacer[data-v-91479c1d]{flex-shrink:100000;height:2em;width:2em}.gallery[data-v-9973e293]{padding:1em;width:100%;display:grid;gap:.5em;grid-template-columns:repeat(auto-fill,minmax(15em,1fr));align-items:end}.folder-indicator[data-v-9973e293]{grid-column:1 / -1}.folder-start[data-v-9973e293]{grid-column-start:1}.size.empty[data-v-444c7802]{color:#555}.size.bytes[data-v-444c7802]{color:#77a}.size.kB[data-v-444c7802]{color:#474}.size.MB[data-v-444c7802]{color:#a80}.size.GB[data-v-444c7802]{color:#f83}.size.TB[data-v-444c7802],.size.PB[data-v-444c7802],.size.EB[data-v-444c7802],.size.huge[data-v-444c7802]{color:#f44;text-shadow:0 0 .2em}@media(prefers-color-scheme:dark){.size.empty[data-v-444c7802]{color:#bbb}.size.bytes[data-v-444c7802]{color:#99d}.size.kB[data-v-444c7802]{color:#aea}.size.MB[data-v-444c7802]{color:#ff4}.size.GB[data-v-444c7802]{color:#f86}.size.TB[data-v-444c7802],.size.PB[data-v-444c7802],.size.EB[data-v-444c7802],.size.huge[data-v-444c7802]{color:#f55}}.cursor .size[data-v-444c7802]{color:inherit;text-shadow:none}table[data-v-c61c7c3a]{width:100%;table-layout:fixed}thead tr[data-v-c61c7c3a]{position:sticky;top:0;z-index:2}tbody tr[data-v-c61c7c3a]{position:relative;z-index:auto}table thead .selection input[type=checkbox][data-v-c61c7c3a]{position:inherit;width:1rem;height:1rem;padding:0;margin:auto}table tbody .selection input[type=checkbox][data-v-c61c7c3a]{width:2rem;height:2rem}table .selection[data-v-c61c7c3a]{width:3rem;text-align:center;text-overflow:clip;padding:0}table .selection input[data-v-c61c7c3a]{margin:auto}table .modified[data-v-c61c7c3a]{width:10rem;text-overflow:clip}table .size[data-v-c61c7c3a]{width:7rem;text-overflow:clip}table .menu[data-v-c61c7c3a]{width:2rem}tbody td[data-v-c61c7c3a]{font-size:1.2rem}table th[data-v-c61c7c3a],table td[data-v-c61c7c3a]{padding:0 .5rem;font-weight:400;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.name[data-v-c61c7c3a]{white-space:nowrap;position:relative}.name .rename-button[data-v-c61c7c3a]{position:absolute;right:0;animation:appear-c61c7c3a calc(5 * var(--transition-time)) linear}@keyframes appear-c61c7c3a{0%{opacity:0}80%{opacity:0}to{opacity:1}}thead tr[data-v-c61c7c3a]{font-size:.8rem;background:linear-gradient(to bottom,#eee,#fff 30%,#ddd);color:#000;box-shadow:0 0 .2rem #000}tbody tr.cursor[data-v-c61c7c3a]{background:var(--accent-color)}.right[data-v-c61c7c3a]{text-align:right}.sortcolumn[data-v-c61c7c3a]:hover{cursor:pointer}.sortcolumn[data-v-c61c7c3a]:hover:after{color:var(--accent-color)}.sortcolumn[data-v-c61c7c3a]{padding-right:1.5rem}.sortcolumn[data-v-c61c7c3a]:after{font-size:1rem;content:"▸";color:#888;margin-left:.5rem;margin-top:-.2rem;position:absolute;transition:all var(--transition-time) linear}.sortactive[data-v-c61c7c3a]:after{transform:rotate(90deg);color:var(--accent-color)}.name a[data-v-c61c7c3a]{text-decoration:none}tbody .selection input[data-v-c61c7c3a]{z-index:1;position:absolute;opacity:0;left:.5rem;top:0}.selection[data-v-c61c7c3a]{width:2em;height:2em}.selection input[data-v-c61c7c3a]:checked{opacity:.7}.file .selection[data-v-c61c7c3a]:before{content:"📄";font-size:1.5rem}.folder .selection[data-v-c61c7c3a]:before{height:2rem;content:"📁";font-size:1.5rem}.empty-container[data-v-c61c7c3a]{padding-top:3rem;text-align:center;font-size:3rem;color:var(--accent-color)}.folder-change[data-v-c61c7c3a]{margin-left:-.5rem}.loc[data-v-c61c7c3a],.summary[data-v-c61c7c3a]{color:#888}.empty-container[data-v-f7875394]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;font-size:2rem;text-shadow:0 0 .3rem #000,0 0 2rem #0008;color:var(--accent-color)}.buttons[data-v-f67e0d6e]{flex:1000 0 auto;padding:0;display:flex;align-items:center;z-index:10}input[type=search][data-v-f67e0d6e]{background:var(--input-background);color:var(--input-color);border:0;border-radius:.1em;outline:none;max-width:15ch}.select-text{color:var(--accent-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.modal-overlay{position:fixed;inset:0;z-index:1100;display:flex;align-items:center;justify-content:center}.modal-dialog{background:#ddd;color:#000;border:none;border-radius:.5rem;box-shadow:0 0 1rem #0008;padding:0;max-width:90vw;max-height:90vh;overflow:auto;font-size:1rem}.modal-dialog>h1{background:#146;color:#fff;font-size:1.2rem;font-weight:400;margin:0;padding:.5rem 1rem;position:sticky;top:0}.modal-dialog>.modal-content{padding:1rem}.modal-dialog h3{font-size:1rem;font-weight:600;margin:1rem 0 .5rem}.modal-dialog h3:first-child{margin-top:0}.modal-dialog a{color:#146}.modal-dialog a:hover{color:#f80}.modal-dialog input[type=text],.modal-dialog input[type=password],.modal-dialog select{font:inherit;font-size:1rem;padding:.5rem;border:2px solid #888;border-radius:.25rem;background:#fff;color:#000;min-width:12rem}.modal-dialog input[type=text]:focus,.modal-dialog input[type=password]:focus,.modal-dialog select:focus{outline:none;border-color:#f80}.modal-dialog label{font-size:1rem}.modal-dialog button,.modal-dialog input[type=submit],.modal-dialog input[type=reset],.modal-dialog .button{font:inherit;font-size:1rem;padding:.5rem 1rem;background:#146;color:#fff;border:none;border-radius:.25rem;cursor:pointer}.modal-dialog button:hover,.modal-dialog input[type=submit]:hover,.modal-dialog input[type=reset]:hover,.modal-dialog .button:hover{background:#f80}.modal-dialog button:disabled,.modal-dialog input[type=submit]:disabled,.modal-dialog input[type=reset]:disabled,.modal-dialog .button:disabled{background:#888;cursor:not-allowed}.modal-dialog .button.small{padding:.25rem .5rem;font-size:.875rem}.modal-dialog .button.danger{background:#c00}.modal-dialog .button.danger:hover:not(:disabled){background:red}.modal-dialog .form-row{display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;align-items:center;margin-bottom:.5rem}.modal-dialog .form-grid{display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;align-items:center}.modal-dialog .dialog-buttons{display:flex;justify-content:flex-end;align-items:center;gap:.5rem;margin-top:1rem}.modal-dialog .error-text{color:#c00;font-size:.875rem;min-height:1.2em;margin:.5rem 0}.modal-dialog .success-message{background:#f80;color:#000;padding:.5rem;border-radius:.25rem;margin:.5rem 0;display:flex;align-items:center;gap:.5rem;font-size:.875rem}.modal-dialog table{width:100%;border-collapse:collapse;margin:.5rem 0;font-size:1rem}.modal-dialog th,.modal-dialog td{border:1px solid #888;padding:.5rem;text-align:left}.modal-dialog th{background:#146;color:#fff;font-weight:400}.modal-dialog td{background:#fff}.modal-dialog td input[type=checkbox]{margin:0}.modal-dialog p{margin:0 0 .5rem;font-size:1rem}.modal-dialog .loading{padding:2rem;text-align:center;color:#666}.access-denied[data-v-eaaa3c09]{text-align:center;padding:2rem!important}.access-denied .icon[data-v-eaaa3c09]{font-size:4rem;margin:0 0 1rem}.access-denied .message[data-v-eaaa3c09]{font-size:1.5rem;font-weight:700;margin:0 0 1.5rem}.toast-message{position:fixed;top:1rem;left:50%;transform:translate(-50%);z-index:2000;padding:.75rem 1.5rem;background:var(--accent-color);color:#000;font-weight:700;border-radius:.25rem;box-shadow:0 .25rem 1rem #0000004d;cursor:pointer;max-width:90vw;text-align:center}:root{--vue-scroll-rect-scrollbar-thumb-color: rgba(122,122,122, .3);--vue-scroll-rect-scrollbar-thumb-color-light: rgba(122, 122, 122, .5);--vue-scroll-rect-scrollbar-thumb-color-pressed: rgba(112, 112, 112, .2);--vue-scroll-rect-scrollbar-thumb-radius: 5px;--vue-scroll-rect-scrollbar-thumb-margin: 0px;--vue-scroll-rect-scrollbar-size: 8px}.vue-scroll-rect{position:relative;width:100%;height:100%;margin:0;overflow:hidden}.vue-scroll-rect>.scroll-content{position:relative;max-width:100%;max-height:100%;scrollbar-width:none;-ms-overflow-style:none}.vue-scroll-rect>.scroll-content::-webkit-scrollbar{width:0;height:0}.vue-scroll-rect>.scroll-content::-ms-scrollbar{width:0;height:0}.vue-scroll-rect>.scroll-content.both{overflow:scroll}.vue-scroll-rect>.scroll-content.horizontal{overflow-x:scroll}.vue-scroll-rect>.scroll-content.vertical{overflow-y:scroll}.vue-scroll-rect:hover>.scrollbar{opacity:1;transition:opacity .1s}.vue-scroll-rect.always-show-scrollbar>.scrollbar,.vue-scroll-rect .dragging>.scrollbar{opacity:1}.vue-scroll-rect.background-clickable>.scrollbar{pointer-events:all}.vue-scroll-rect>.scrollbar{position:absolute;opacity:0;transition:opacity 1.5s;pointer-events:none}.vue-scroll-rect>.scrollbar:hover{opacity:1}.vue-scroll-rect>.scrollbar .thumb{position:absolute;background-color:var(--vue-scroll-rect-scrollbar-thumb-color);border-radius:var(--vue-scroll-rect-scrollbar-thumb-radius);pointer-events:all}.vue-scroll-rect>.scrollbar .thumb:hover{background-color:var(--vue-scroll-rect-scrollbar-thumb-color-light)}.vue-scroll-rect>.scrollbar .thumb:active{background-color:var(--vue-scroll-rect-scrollbar-thumb-color-pressed)}.vue-scroll-rect>.scrollbar.horizontal{left:0;bottom:0;right:0;height:var(--vue-scroll-rect-scrollbar-size)}.vue-scroll-rect>.scrollbar.horizontal .thumb{top:var(--vue-scroll-rect-scrollbar-thumb-margin);bottom:var(--vue-scroll-rect-scrollbar-thumb-margin)}.vue-scroll-rect>.scrollbar.vertical{top:0;bottom:0;right:0;width:var(--vue-scroll-rect-scrollbar-size)}.vue-scroll-rect>.scrollbar.vertical .thumb{left:var(--vue-scroll-rect-scrollbar-thumb-margin);right:var(--vue-scroll-rect-scrollbar-thumb-margin)}:root{--mx-menu-backgroud: #fff;--mx-menu-hover-backgroud: #f1f1f1;--mx-menu-active-backgroud: #dfdfdf;--mx-menu-open-backgroud: #f1f1f1;--mx-menu-open-hover-backgroud: #f1f1f1;--mx-menu-divider: #f0f0f0;--mx-menu-text: #2e2e2e;--mx-menu-hover-text: #2e2e2e;--mx-menu-active-text: #2e2e2e;--mx-menu-open-text: #2e2e2e;--mx-menu-open-hover-text: #2e2e2e;--mx-menu-disabled-text: #c9c8c8;--mx-menu-icon-size: 16px;--mx-menu-shadow-color: rgba(0, 0, 0, .1);--mx-menu-backgroud-radius: 10px;--mx-menu-scrollbar-thumb-color: rgba(0, 0, 0, .2);--mx-menu-scrollbar-thumb-color-light: rgba(0, 0, 0, .3);--mx-menu-scrollbar-thumb-color-pressed: rgba(0, 0, 0, .1);--mx-menu-shortcut-backgroud: #ebebeb;--mx-menu-shortcut-backgroud-hover:#ebebeb;--mx-menu-shortcut-backgroud-active:#ebebeb;--mx-menu-shortcut-backgroud-open:#ebebeb;--mx-menu-shortcut-backgroud-disabled:#fdfdfd;--mx-menu-shortcut-text: #424242;--mx-menu-shortcut-text-hover: #424242;--mx-menu-shortcut-text-active: #424242;--mx-menu-shortcut-text-open: #424242;--mx-menu-shortcut-text-disabled: #a5a5a5;--mx-menu-placeholder-width: 24px}.mx-context-menu{pointer-events:all;display:inline-block;overflow:visible;position:absolute;background-color:var(--mx-menu-backgroud);border-radius:var(--mx-menu-backgroud-radius);padding:12px 0;box-shadow:0 10px 40px 10px var(--mx-menu-shadow-color);opacity:1;transition:opacity .2s ease-in-out;--vue-scroll-rect-scrollbar-thumb-color: var(--mx-menu-scrollbar-thumb-color);--vue-scroll-rect-scrollbar-thumb-color-light: var(--mx-menu-scrollbar-thumb-color-light);--vue-scroll-rect-scrollbar-thumb-color-pressed: var(--mx-menu-scrollbar-thumb-color-pressed)}.mx-context-menu-items{position:relative;overflow:visible}.mx-context-menu-scroll{overscroll-behavior:contain}.mx-context-menu-item{display:flex;flex-direction:row;justify-content:space-between;align-items:center;position:relative;padding:6px 15px;-webkit-user-select:none;user-select:none;overflow:visible;white-space:nowrap;text-overflow:ellipsis;color:var(--mx-menu-text)}.mx-context-menu-item .mx-right-arrow,.mx-context-menu-item .mx-checked-mark{fill:var(--mx-menu-text)}.mx-context-menu-item:hover{background-color:var(--mx-menu-hover-backgroud);color:var(--mx-menu-hover-text)}.mx-context-menu-item:hover .mx-right-arrow,.mx-context-menu-item:hover .mx-checked-mark{fill:var(--mx-menu-hover-text)}.mx-context-menu-item:hover .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-hover);color:var(--mx-menu-shortcut-text-hover)}.mx-context-menu-item:active{background-color:var(--mx-menu-active-backgroud);color:var(--mx-menu-active-text)}.mx-context-menu-item:active .mx-right-arrow,.mx-context-menu-item:active .mx-checked-mark{fill:var(--mx-menu-active-text)}.mx-context-menu-item:active .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-active);color:var(--mx-menu-shortcut-text-active)}.mx-context-menu-item.open{background-color:var(--mx-menu-open-backgroud);color:var(--mx-menu-open-text)}.mx-context-menu-item.open:hover{background-color:var(--mx-menu-open-hover-backgroud);color:var(--mx-menu-open-hover-text)}.mx-context-menu-item.open .mx-right-arrow,.mx-context-menu-item.open .mx-checked-mark{fill:var(--mx-menu-open-text)}.mx-context-menu-item.open .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-open);color:var(--mx-menu-shortcut-text-open)}.mx-context-menu-item.keyboard-focus{background-color:var(--mx-menu-active-backgroud)}.mx-context-menu-item.disabled{color:var(--mx-menu-disabled-text);cursor:not-allowed}.mx-context-menu-item.disabled:hover,.mx-context-menu-item.disabled:active{background-color:transparent}.mx-context-menu-item.disabled .mx-right-arrow,.mx-context-menu-item.disabled .mx-checked-mark{fill:var(--mx-menu-disabled-text)}.mx-context-menu-item.disabled .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-disabled);color:var(--mx-menu-shortcut-text-second)}.mx-context-menu-item .mx-item-row{display:flex;flex-direction:row;align-items:center;max-width:100%}.mx-context-menu-item .mx-icon-placeholder{position:relative;display:flex;flex-direction:row;align-items:center;height:auto;overflow:hidden}.mx-context-menu-item .mx-icon-placeholder.preserve-width{width:var(--mx-menu-placeholder-width)}.mx-context-menu-item .icon{display:inline-block;font-size:var(--mx-menu-icon-size)}.mx-context-menu-item .icon.svg{width:var(--mx-menu-icon-size);height:var(--mx-menu-icon-size)}.mx-context-menu-item .label{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-inline-end:16px}.mx-context-menu-item-wrapper{position:relative}.mx-context-menu-item-sperator{display:block;padding:5px 0;background-color:var(--mx-menu-backgroud)}.mx-context-menu-item-sperator:after{display:block;content:"";background-color:var(--mx-menu-divider);height:1px}.mx-right-arrow{width:14px;height:14px}.mx-checked-mark{width:var(--mx-menu-icon-size);height:var(--mx-menu-icon-size)}.mx-shortcut{position:relative;justify-self:flex-end;font-size:11.5px;padding:2px 4px;background-color:var(--mx-menu-shortcut-backgroud);color:var(--mx-menu-shortcut-text)}.mx-menu-bar.dark,.mx-context-menu.dark{--mx-menu-backgroud: #303031;--mx-menu-hover-backgroud: #636363;--mx-menu-active-backgroud: #555555;--mx-menu-open-backgroud: #636363;--mx-menu-open-hover-backgroud: #636363;--mx-menu-divider: #464646;--mx-menu-text: #ffffff;--mx-menu-hover-text: #ffffff;--mx-menu-active-text: #ffffff;--mx-menu-open-text: #ffffff;--mx-menu-open-hover-text: #ffffff;--mx-menu-disabled-text: #9c9c9c;--mx-menu-shadow-color: rgba(51, 51, 51, .2);--mx-menu-scrollbar-thumb-color: rgba(255, 255, 255, .3);--mx-menu-scrollbar-thumb-color-light: rgba(255, 255, 255, .5);--mx-menu-scrollbar-thumb-color-pressed: rgba(255, 255, 255, .2);--mx-menu-shortcut-backgroud: #505050;--mx-menu-shortcut-backgroud-hover:#505050;--mx-menu-shortcut-backgroud-active:#505050;--mx-menu-shortcut-backgroud-open:#505050;--mx-menu-shortcut-backgroud-disabled:#444444;--mx-menu-shortcut-text: #f1f1f1;--mx-menu-shortcut-text-hover: #ffffff;--mx-menu-shortcut-text-active: #ffffff;--mx-menu-shortcut-text-open: #ffffff;--mx-menu-shortcut-text-disabled: #9d9d9d}.mx-menu-bar.flat,.mx-context-menu.flat{border-radius:0;padding:7px 0;box-shadow:0 1px 2px 1px var(--mx-menu-shadow-color)}.mx-menu-bar.flat .mx-context-menu-item,.mx-context-menu.flat .mx-context-menu-item{padding:3px 12px}.mx-menu-bar.win10,.mx-context-menu.win10{border-radius:0;padding:8px 0;border:1px solid var(--mx-menu-border-color);box-shadow:2px 2px 1px 0 var(--mx-menu-shadow-color)}.mx-menu-bar.win10,.mx-context-menu.win10{--mx-menu-backgroud: #eeeeee;--mx-menu-hover-backgroud: #d8d8d8;--mx-menu-active-backgroud: #dfdfdf;--mx-menu-open-backgroud: #f1f1f1;--mx-menu-open-hover-backgroud: #d8d8d8;--mx-menu-divider: #aaaaaa;--mx-menu-border-color: #b1b1b1;--mx-menu-shortcut-backgroud: transparent;--mx-menu-shortcut-backgroud-hover: transparent;--mx-menu-shortcut-backgroud-active: transparent;--mx-menu-shortcut-backgroud-open: transparent;--mx-menu-shortcut-backgroud-disabled:transparent;--mx-menu-shortcut-text: #272727;--mx-menu-shortcut-text-hover: #272727;--mx-menu-shortcut-text-active: #272727;--mx-menu-shortcut-text-open: #272727;--mx-menu-shortcut-text-disabled: #6b6b6b}.mx-menu-bar.win10 .mx-context-menu-item,.mx-context-menu.win10 .mx-context-menu-item{padding:2px 4px;margin:0 4px}.mx-menu-bar.win10 .mx-context-menu-item-sperator,.mx-context-menu.win10 .mx-context-menu-item-sperator{margin:0 4px}.mx-menu-bar.win10.dark,.mx-context-menu.win10.dark{--mx-menu-backgroud: #303031;--mx-menu-hover-backgroud: #636363;--mx-menu-active-backgroud: #555555;--mx-menu-open-backgroud: #636363;--mx-menu-open-hover-backgroud: #636363;--mx-menu-divider: #808080;--mx-menu-border-color: #656565;--mx-menu-shortcut-backgroud: #505050;--mx-menu-shortcut-backgroud-hover:#505050;--mx-menu-shortcut-backgroud-active:#505050;--mx-menu-shortcut-backgroud-open:#505050;--mx-menu-shortcut-backgroud-disabled:#444444;--mx-menu-shortcut-text: #f1f1f1;--mx-menu-shortcut-text-hover: #ffffff;--mx-menu-shortcut-text-active: #ffffff;--mx-menu-shortcut-text-open: #ffffff;--mx-menu-shortcut-text-disabled: #9d9d9d;padding:8px 0}.mx-menu-bar.win10.dark .mx-context-menu-item,.mx-context-menu.win10.dark .mx-context-menu-item{padding:6px 12px;margin:0}.mx-menu-bar.win10.dark .mx-context-menu-item-sperator,.mx-context-menu.win10.dark .mx-context-menu-item-sperator{margin:0 7px}.mx-menu-bar.mac,.mx-context-menu.mac{padding:8px 0;box-shadow:0 5px 7px 1px var(--mx-menu-shadow-color);border:1px solid var(--mx-menu-border-color)}.mx-menu-bar.mac,.mx-context-menu.mac{--mx-menu-backgroud: #ececec;--mx-menu-hover-backgroud: #0165e1;--mx-menu-active-backgroud: #0165e1;--mx-menu-open-backgroud: #858585;--mx-menu-open-hover-backgroud: #0165e1;--mx-menu-divider: #d2d2d2;--mx-menu-text: #232323;--mx-menu-hover-text: #fff;--mx-menu-active-text: #fff;--mx-menu-open-text: #fff;--mx-menu-open-hover-text: #fff;--mx-menu-disabled-text: #bbbbbb;--mx-menu-shadow-color: rgba(0, 0, 0, .1);--mx-menu-backgroud-radius: 10px;--mx-menu-shortcut-backgroud: transparent;--mx-menu-shortcut-backgroud-hover:transparent;--mx-menu-shortcut-backgroud-active:transparent;--mx-menu-shortcut-backgroud-open:transparent;--mx-menu-shortcut-backgroud-disabled:transparent;--mx-menu-shortcut-text: #424242;--mx-menu-shortcut-text-hover: #fff;--mx-menu-shortcut-text-active: #fff;--mx-menu-shortcut-text-open: #fff;--mx-menu-shortcut-text-disabled: #a5a5a5;--mx-menu-border-color: #bbbbbb}.mx-menu-bar.mac.dark,.mx-context-menu.mac.dark{--mx-menu-backgroud: #333333;--mx-menu-hover-backgroud: #0153d2;--mx-menu-active-backgroud: #0153d2;--mx-menu-open-hover-backgroud: #0153d2;--mx-menu-open-backgroud: #414346;--mx-menu-divider: #575757;--mx-menu-text: #dcdcdc;--mx-menu-hover-text: #fff;--mx-menu-active-text: #fff;--mx-menu-open-text: #fff;--mx-menu-open-hover-text: #fff;--mx-menu-disabled-text: #6a6a6a;--mx-menu-shadow-color: rgba(0, 0, 0, .1);--mx-menu-backgroud-radius: 10px;--mx-menu-shortcut-backgroud: transparent;--mx-menu-shortcut-backgroud-hover:transparent;--mx-menu-shortcut-backgroud-active:transparent;--mx-menu-shortcut-backgroud-open:transparent;--mx-menu-shortcut-backgroud-disabled:transparent;--mx-menu-shortcut-text: #dadada;--mx-menu-shortcut-text-hover: #fff;--mx-menu-shortcut-text-active: #fff;--mx-menu-shortcut-text-open: #fff;--mx-menu-shortcut-text-disabled: #6a6a6a;--mx-menu-border-color: #222}.mx-menu-bar.mac .mx-context-menu-item,.mx-context-menu.mac .mx-context-menu-item{border-radius:5px;margin:0 6px;padding:3px 6px}.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus{background-color:var(--mx-menu-active-backgroud);color:var(--mx-menu-active-text);outline:none}.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus .mx-right-arrow,.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus .mx-checked-mark,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus .mx-right-arrow,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus .mx-checked-mark{fill:var(--mx-menu-active-text)}.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus .mx-shortcut,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-active);color:var(--mx-menu-shortcut-text-active)}.mx-menu-bar.mac .mx-context-menu-item-sperator,.mx-context-menu.mac .mx-context-menu-item-sperator{margin:0 12px}.mx-context-menu .vue-scroll-rect>.scroll-content{overflow-y:scroll;height:100%;width:auto;position:relative!important}.mx-menu-ghost-host{position:absolute;inset:0;overflow:hidden;pointer-events:none}.mx-menu-ghost-host.fullscreen{position:fixed}.mx-menu-bar{flex:1;display:flex;flex-direction:row;align-items:center;background-color:var(--mx-menu-backgroud);padding:5px 0}.mx-menu-bar.mini{flex-grow:0}.mx-menu-bar .mx-menu-bar-content{display:flex;flex-direction:row;align-items:center}.mx-menu-bar .mx-menu-bar-item{padding:2px 8px;border-radius:5px;-webkit-user-select:none;user-select:none;background-color:var(--mx-menu-backgroud);color:var(--mx-menu-text)}.mx-menu-bar .mx-menu-bar-item:hover{background-color:var(--mx-menu-hover-backgroud);color:var(--mx-menu-hover-text)}.mx-menu-bar .mx-menu-bar-item:hover .mx-menu-bar-icon-menu{fill:var(--mx-menu-hover-text)}.mx-menu-bar .mx-menu-bar-item:active,.mx-menu-bar .mx-menu-bar-item.active{background-color:var(--mx-menu-active-backgroud);color:var(--mx-menu-active-text)}.mx-menu-bar .mx-menu-bar-item:active .mx-menu-bar-icon-menu,.mx-menu-bar .mx-menu-bar-item.active .mx-menu-bar-icon-menu{fill:var(--mx-menu-active-text)}.mx-menu-bar .mx-menu-bar-icon-menu{fill:var(--mx-menu-text);width:var(--mx-menu-icon-size);height:var(--mx-menu-icon-size)}.mx-menu-bar.flat .mx-menu-bar-item{border-radius:0}
|
|
1
|
+
@charset "UTF-8";:root{--primary-background: #ddd;--header-background: var(--soft-color);--header-color: #ccc;--input-background: #fff;--input-color: #000;--primary-color: #000;--soft-color: #146;--accent-color: #f80;--transition-time: .2s;--root-font-size: 1rem;--header-font-size: 1rem;--header-height: 4rem}@media(prefers-color-scheme:dark){:root{--primary-color: #ddd;--primary-background: var(--soft-color);--header-background: #000;--header-color: #ccc;--input-background: var(--soft-color);--input-color: #ddd}}@media screen and (max-width:600px){.size,.modified,.summary{display:none}}@media screen and (min-width:1000px){:root{--root-font-size: calc(8px + .8vw) }}@media screen and (min-width:2000px){:root{--root-font-size: 1.5rem}}@media screen and (max-height:600px){:root{--header-font-size: calc(10px + 10 * 100vh / 600);--root-font-size: .8rem;--header-height: 2rem}header .breadcrumb>*{padding-top:calc(8 + 8 * 100vh / 600)!important;padding-bottom:calc(8 + 8 * 100vh / 600)!important}}@media screen and (max-height:300px){:root{--header-font-size: 15px;--header-height: 28px ;--root-font-size: .6rem}header .breadcrumb>*{padding-top:14px!important;padding-bottom:14px!important}}@media screen and (orientation:landscape)and (min-width:700px){:root{--header-font-size: calc(8px + 8 * 100vh / 600)}header{display:flex;justify-content:space-between}header .headermain{order:1}header .breadcrumb{align-self:stretch}header .action-button{width:2em;height:2em}}@media print{:root{--primary-color: black;--primary-background: none;--header-background: none;--header-color: black}.headermain,.menu,.rename-button{display:none!important}.breadcrumb>a{color:#000!important;background:none!important;padding:0!important;margin:0!important;clip-path:none!important;max-width:none!important}.breadcrumb>a:after{content:"/"}.breadcrumb svg{fill:#000!important;margin:0 .5rem 0 1rem!important}body#app{position:static!important;height:auto!important}main{padding-bottom:0!important}thead tr{font-size:1rem!important;position:static!important;background:none!important;border-bottom:1pt solid black!important}audio::-webkit-media-controls-timeline,video::-webkit-media-controls-timeline{display:none}audio::-webkit-media-controls,video::-webkit-media-controls{display:none}tr,figure{page-break-inside:avoid}.selection{min-width:0!important;padding:0!important}.selection input{display:none}.selection input:checked{display:inherit}tbody .selection input:checked{opacity:1!important;transform:scale(.5);left:0}}*{box-sizing:border-box}html{font-size:var(--root-font-size);overflow:hidden}main{-ms-overflow-style:none;scrollbar-width:none}body{background-color:var(--primary-background);font-size:1rem;font-family:Roboto;color:var(--primary-color);margin:0;overflow:hidden;height:100vh;height:100dvh}tbody .size,tbody .modified{font-family:Roboto Mono}header{flex:0 0 auto;background-color:var(--header-background);color:var(--header-color);font-size:var(--header-font-size)}main{height:100%}::selection{color:#000;background:#ff0!important}button{font:inherit;color:inherit;margin:0;border:0;padding:0;background:none;cursor:pointer;min-width:1rem;min-height:1rem}input{margin:0}:focus{outline:none}a:link,a:visited,a:active,a:hover{color:var(--primary-color);text-decoration:none}table{border-collapse:collapse;border-spacing:0;border:0;gap:0}body#app{position:fixed;inset:0;display:flex;flex-direction:column}main{flex:1 1 auto;min-height:0;padding-bottom:3em;overflow-y:scroll;text-align:center}header nav.headermain{position:relative;z-index:100}.spacer{flex-grow:1}.smallgap{flex-shrink:1;width:2em}[data-tooltip]:hover:after{z-index:101;content:attr(data-tooltip);position:absolute;pointer-events:none;font-size:1rem;text-align:center;padding:.5rem 1rem;border-radius:3rem 0;box-shadow:0 0 1rem var(--accent-color);transform:translate(calc(1rem - 50%),150%);background-color:var(--accent-color);color:var(--primary-color);white-space:pre;animation:appearbriefly calc(10 * var(--transition-time)) linear forwards}@keyframes appearbriefly{0%{opacity:0}30%{opacity:0}40%{opacity:1}90%{opacity:1}to{opacity:0}}.error-message{padding:.5em;font-weight:700;background:var(--accent-color);color:#000}.transferprogress[data-v-fc92216f]{--bar: var(--accent-color);--nobar: var(--header-background);display:flex;flex-direction:column;color:var(--primary-color);width:100%}.statustext[data-v-fc92216f]{display:flex;align-items:center;margin:0 .5em;padding:.5rem 0}span[data-v-fc92216f]{color:#ccc;white-space:nowrap;text-align:right;padding:0 .5em}.filename[data-v-fc92216f]{color:#fff;flex:1 1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left}.index[data-v-fc92216f]{min-width:3.5em}.position[data-v-fc92216f],.speed[data-v-fc92216f]{min-width:4em}.upload .statustext[data-v-fc92216f]:before{font-size:1.5em;content:"🔺"}.download .statustext[data-v-fc92216f]:before{font-size:1.5em;content:"🔻"}:root{--breadcrumb-background-odd: #2d2d2d;--breadcrumb-background-even: #404040;--breadcrumb-color: #ddd;--breadcrumb-hover-color: #fff;--breadcrumb-hover-background-odd: #25a;--breadcrumb-hover-background-even: #812;--breadcrumb-transtime: .3s}.breadcrumb{flex:1 1 auto;display:flex;min-width:20%;max-width:100%;min-height:2em;margin:0;padding:0 1em 0 0;overflow:hidden}.breadcrumb>a{flex:0 4 auto;display:flex;align-items:center;margin:0 -.5em;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:var(--breadcrumb-color);padding:.3em 1.5em;clip-path:polygon(0 0,1em 50%,0 100%,100% 100%,100% 0,0 0);transition:all var(--breadcrumb-transtime)}.breadcrumb>a:first-child{flex:0 0 auto;padding-left:1.5em;padding-right:1.7em;clip-path:none}.breadcrumb>a:last-child{clip-path:polygon(0 0,calc(100% - 1em) 0,100% 50%,calc(100% - 1em) 100%,0 100%,1em 50%,0 0)}.breadcrumb>a:only-child{clip-path:polygon(0 0,calc(100% - 1em) 0,100% 50%,calc(100% - 1em) 100%,0 100%,0 0)}.breadcrumb svg{width:1.3em;height:1.3em;margin:-.5em;fill:var(--breadcrumb-color);transition:fill var(--breadcrumb-transtime)}.breadcrumb a:nth-child(odd){background:var(--breadcrumb-background-odd)}.breadcrumb a:nth-child(2n){background:var(--breadcrumb-background-even)}.breadcrumb a:nth-child(odd):hover,.breadcrumb a:focus:nth-child(odd){background:var(--breadcrumb-hover-background-odd)}.breadcrumb a:nth-child(2n):hover,.breadcrumb a:focus:nth-child(2n){background:var(--breadcrumb-hover-background-even)}.breadcrumb a:hover{color:var(--breadcrumb-hover-color)}.breadcrumb a:hover svg{fill:var(--breadcrumb-hover-color)}.breadcrumb a.current{color:var(--accent-color);max-width:none;flex:0 1 auto}.breadcrumb a.current svg{fill:var(--accent-color)}.action-button{background:none;border:none;color:#ccc;cursor:pointer;transition:all .2s ease;padding:.2em;width:3em;height:3em}.action-button:hover,.action-button:focus{color:#fff;transform:scale(1.1)}svg{fill:#ccc;transform:fill .2s ease}.action-button:hover svg,.action-button:focus svg{fill:#fff}@keyframes rotate-0494c508{0%{transform:rotate(0)}to{transform:rotate(360deg)}}svg.cog[data-v-0494c508]{width:10rem;height:10rem;margin:0 auto;animation:rotate-0494c508 10s linear infinite;filter:drop-shadow(0 0 1rem black);fill:#888}svg.cog.stopped[data-v-0494c508]{animation:none}input#FileRenameInput{color:var(--input-color);background:var(--input-background);border:0;border-radius:.3rem;padding:.4rem;margin:-.4rem;width:100%;outline:none;font:inherit}.gallery input#FileRenameInput{padding:.75em;font-weight:600;width:auto}img[data-v-47490c5c],embed[data-v-47490c5c],.icon[data-v-47490c5c],audio[data-v-47490c5c],video[data-v-47490c5c]{font-size:8em;overflow:hidden;min-width:50%;max-width:100%;max-height:100%;border-radius:.0625em}.folder[data-v-47490c5c]:before{content:"📁"}.folder[data-v-47490c5c]:hover:before,.cursor .folder[data-v-47490c5c]:before{content:"📂"}.archive[data-v-47490c5c]:before{content:"📦"}.file[data-v-47490c5c]:before{content:"📄"}.ext-img[data-v-47490c5c]:before{content:"💿"}.ext-exe[data-v-47490c5c]:before,.ext-msi[data-v-47490c5c]:before,.ext-dmg[data-v-47490c5c]:before,.ext-pkg[data-v-47490c5c]:before{content:"⚙️"}.ext-torrent[data-v-47490c5c]:before{content:"🏴☠️"}.audio audio[data-v-47490c5c]{opacity:0;transition:opacity var(--transition-time) ease-in-out}.audio:hover audio[data-v-47490c5c]{opacity:1}.audio.icon[data-v-47490c5c]:before{width:100%;content:"🔈"}.audio.icon[data-v-47490c5c]:has(audio[data-playing]):before{position:absolute;content:"🔊";bottom:0}.icon[data-v-47490c5c]{filter:brightness(.9)}figure.cursor .icon[data-v-47490c5c]{filter:brightness(1)}img[data-v-47490c5c]:before{text-shadow:0 0 .5rem #000;filter:grayscale(1);content:"❌"}.video-container[data-v-47490c5c]{position:relative;display:flex;align-items:center;justify-content:center;min-width:50%;max-width:100%;max-height:100%}.video-container video[data-v-47490c5c]{width:100%;height:100%;border-radius:.0625em;object-fit:contain}.play-overlay[data-v-47490c5c]{position:absolute;display:flex;align-items:center;justify-content:center;pointer-events:none;width:4em;height:4em;background:#0003;border-radius:50%;transition:opacity .2s ease,transform .2s ease}.play-overlay svg[data-v-47490c5c]{width:2em;height:2em;fill:#fff;margin-left:.25em}.video-container:hover .play-overlay[data-v-47490c5c]{transform:scale(1.1)}video[data-playing]+.play-overlay[data-v-47490c5c]{opacity:0}.cursor-tooltip[data-v-c5d421fc]{position:fixed;z-index:10000;padding:.5rem 1rem;border-radius:3rem 0;box-shadow:0 0 1rem var(--accent-color);background-color:var(--accent-color);color:var(--primary-color);white-space:nowrap;pointer-events:none;font-size:1rem}.tooltip-name[data-v-91479c1d]{font-weight:600;text-align:center}.tooltip-details[data-v-91479c1d]{text-align:center}figure[data-v-91479c1d]{max-height:15em;position:relative;border-radius:.5em;margin:0;display:flex;flex-direction:column;align-items:center;justify-content:center;overflow:hidden}figure>article[data-v-91479c1d]{flex:0 0 auto}figure[data-v-91479c1d] .video-container{height:15em}.titlespacer[data-v-91479c1d]{flex-shrink:100000;width:100%;height:2em}figcaption[data-v-91479c1d]{position:absolute;overflow:hidden;bottom:0;display:flex;align-items:center;justify-content:center;width:100%}figcaption input[type=checkbox][data-v-91479c1d]{width:1.5em;height:1.5em;margin:.25em 0 .25em .25em;opacity:0;flex-shrink:0;transition:opacity var(--transition-time) ease-in-out}figcaption input[type=checkbox][data-v-91479c1d]:checked,figcaption:hover input[type=checkbox][data-v-91479c1d]{opacity:1}figcaption span[data-v-91479c1d]{cursor:default;padding:.5em;color:#fff;font-weight:600;text-shadow:0 0 .2em #000,0 0 .2em #000;text-wrap:nowrap;text-overflow:ellipsis;overflow:hidden}.cursor figcaption span[data-v-91479c1d]{color:var(--accent-color)}figcaption .namespacer[data-v-91479c1d]{flex-shrink:100000;height:2em;width:2em}.gallery[data-v-9973e293]{padding:1em;width:100%;display:grid;gap:.5em;grid-template-columns:repeat(auto-fill,minmax(15em,1fr));align-items:end}.folder-indicator[data-v-9973e293]{grid-column:1 / -1}.folder-start[data-v-9973e293]{grid-column-start:1}.size.empty[data-v-444c7802]{color:#555}.size.bytes[data-v-444c7802]{color:#77a}.size.kB[data-v-444c7802]{color:#474}.size.MB[data-v-444c7802]{color:#a80}.size.GB[data-v-444c7802]{color:#f83}.size.TB[data-v-444c7802],.size.PB[data-v-444c7802],.size.EB[data-v-444c7802],.size.huge[data-v-444c7802]{color:#f44;text-shadow:0 0 .2em}@media(prefers-color-scheme:dark){.size.empty[data-v-444c7802]{color:#bbb}.size.bytes[data-v-444c7802]{color:#99d}.size.kB[data-v-444c7802]{color:#aea}.size.MB[data-v-444c7802]{color:#ff4}.size.GB[data-v-444c7802]{color:#f86}.size.TB[data-v-444c7802],.size.PB[data-v-444c7802],.size.EB[data-v-444c7802],.size.huge[data-v-444c7802]{color:#f55}}.cursor .size[data-v-444c7802]{color:inherit;text-shadow:none}table[data-v-c61c7c3a]{width:100%;table-layout:fixed}thead tr[data-v-c61c7c3a]{position:sticky;top:0;z-index:2}tbody tr[data-v-c61c7c3a]{position:relative;z-index:auto}table thead .selection input[type=checkbox][data-v-c61c7c3a]{position:inherit;width:1rem;height:1rem;padding:0;margin:auto}table tbody .selection input[type=checkbox][data-v-c61c7c3a]{width:2rem;height:2rem}table .selection[data-v-c61c7c3a]{width:3rem;text-align:center;text-overflow:clip;padding:0}table .selection input[data-v-c61c7c3a]{margin:auto}table .modified[data-v-c61c7c3a]{width:10rem;text-overflow:clip}table .size[data-v-c61c7c3a]{width:7rem;text-overflow:clip}table .menu[data-v-c61c7c3a]{width:2rem}tbody td[data-v-c61c7c3a]{font-size:1.2rem}table th[data-v-c61c7c3a],table td[data-v-c61c7c3a]{padding:0 .5rem;font-weight:400;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.name[data-v-c61c7c3a]{white-space:nowrap;position:relative}.name .rename-button[data-v-c61c7c3a]{position:absolute;right:0;animation:appear-c61c7c3a calc(5 * var(--transition-time)) linear}@keyframes appear-c61c7c3a{0%{opacity:0}80%{opacity:0}to{opacity:1}}thead tr[data-v-c61c7c3a]{font-size:.8rem;background:linear-gradient(to bottom,#eee,#fff 30%,#ddd);color:#000;box-shadow:0 0 .2rem #000}tbody tr.cursor[data-v-c61c7c3a]{background:var(--accent-color)}.right[data-v-c61c7c3a]{text-align:right}.sortcolumn[data-v-c61c7c3a]:hover{cursor:pointer}.sortcolumn[data-v-c61c7c3a]:hover:after{color:var(--accent-color)}.sortcolumn[data-v-c61c7c3a]{padding-right:1.5rem}.sortcolumn[data-v-c61c7c3a]:after{font-size:1rem;content:"▸";color:#888;margin-left:.5rem;margin-top:-.2rem;position:absolute;transition:all var(--transition-time) linear}.sortactive[data-v-c61c7c3a]:after{transform:rotate(90deg);color:var(--accent-color)}.name a[data-v-c61c7c3a]{text-decoration:none}tbody .selection input[data-v-c61c7c3a]{z-index:1;position:absolute;opacity:0;left:.5rem;top:0}.selection[data-v-c61c7c3a]{width:2em;height:2em}.selection input[data-v-c61c7c3a]:checked{opacity:.7}.file .selection[data-v-c61c7c3a]:before{content:"📄";font-size:1.5rem}.folder .selection[data-v-c61c7c3a]:before{height:2rem;content:"📁";font-size:1.5rem}.empty-container[data-v-c61c7c3a]{padding-top:3rem;text-align:center;font-size:3rem;color:var(--accent-color)}.folder-change[data-v-c61c7c3a]{margin-left:-.5rem}.loc[data-v-c61c7c3a],.summary[data-v-c61c7c3a]{color:#888}.empty-container[data-v-f7875394]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;font-size:2rem;text-shadow:0 0 .3rem #000,0 0 2rem #0008;color:var(--accent-color)}.buttons[data-v-b9ddc09f]{flex:1000 0 auto;padding:0;display:flex;align-items:center;z-index:10}input[type=search][data-v-b9ddc09f]{background:var(--input-background);color:var(--input-color);border:0;border-radius:.1em;outline:none;max-width:15ch}.select-text{color:var(--accent-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0}.modal-overlay{position:fixed;inset:0;z-index:1100;display:flex;align-items:center;justify-content:center}.modal-dialog{background:#ddd;color:#000;border:none;border-radius:.5rem;box-shadow:0 0 1rem #0008;padding:0;max-width:90vw;max-height:90vh;overflow:auto;font-size:1rem}.modal-dialog>h1{background:#146;color:#fff;font-size:1.2rem;font-weight:400;margin:0;padding:.5rem 1rem;position:sticky;top:0}.modal-dialog>.modal-content{padding:1rem}.modal-dialog h3{font-size:1rem;font-weight:600;margin:1rem 0 .5rem}.modal-dialog h3:first-child{margin-top:0}.modal-dialog a{color:#146}.modal-dialog a:hover{color:#f80}.modal-dialog input[type=text],.modal-dialog input[type=password],.modal-dialog select{font:inherit;font-size:1rem;padding:.5rem;border:2px solid #888;border-radius:.25rem;background:#fff;color:#000;min-width:12rem}.modal-dialog input[type=text]:focus,.modal-dialog input[type=password]:focus,.modal-dialog select:focus{outline:none;border-color:#f80}.modal-dialog label{font-size:1rem}.modal-dialog button,.modal-dialog input[type=submit],.modal-dialog input[type=reset],.modal-dialog .button{font:inherit;font-size:1rem;padding:.5rem 1rem;background:#146;color:#fff;border:none;border-radius:.25rem;cursor:pointer}.modal-dialog button:hover,.modal-dialog input[type=submit]:hover,.modal-dialog input[type=reset]:hover,.modal-dialog .button:hover{background:#f80}.modal-dialog button:disabled,.modal-dialog input[type=submit]:disabled,.modal-dialog input[type=reset]:disabled,.modal-dialog .button:disabled{background:#888;cursor:not-allowed}.modal-dialog .button.small{padding:.25rem .5rem;font-size:.875rem}.modal-dialog .button.danger{background:#c00}.modal-dialog .button.danger:hover:not(:disabled){background:red}.modal-dialog .form-row{display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;align-items:center;margin-bottom:.5rem}.modal-dialog .form-grid{display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;align-items:center}.modal-dialog .dialog-buttons{display:flex;justify-content:flex-end;align-items:center;gap:.5rem;margin-top:1rem}.modal-dialog .error-text{color:#c00;font-size:.875rem;min-height:1.2em;margin:.5rem 0}.modal-dialog .success-message{background:#f80;color:#000;padding:.5rem;border-radius:.25rem;margin:.5rem 0;display:flex;align-items:center;gap:.5rem;font-size:.875rem}.modal-dialog table{width:100%;border-collapse:collapse;margin:.5rem 0;font-size:1rem}.modal-dialog th,.modal-dialog td{border:1px solid #888;padding:.5rem;text-align:left}.modal-dialog th{background:#146;color:#fff;font-weight:400}.modal-dialog td{background:#fff}.modal-dialog td input[type=checkbox]{margin:0}.modal-dialog p{margin:0 0 .5rem;font-size:1rem}.modal-dialog .loading{padding:2rem;text-align:center;color:#666}.access-denied[data-v-eaaa3c09]{text-align:center;padding:2rem!important}.access-denied .icon[data-v-eaaa3c09]{font-size:4rem;margin:0 0 1rem}.access-denied .message[data-v-eaaa3c09]{font-size:1.5rem;font-weight:700;margin:0 0 1.5rem}.toast-message{position:fixed;top:1rem;left:50%;transform:translate(-50%);z-index:2000;padding:.75rem 1.5rem;background:var(--accent-color);color:#000;font-weight:700;border-radius:.25rem;box-shadow:0 .25rem 1rem #0000004d;cursor:pointer;max-width:90vw;text-align:center}:root{--vue-scroll-rect-scrollbar-thumb-color: rgba(122,122,122, .3);--vue-scroll-rect-scrollbar-thumb-color-light: rgba(122, 122, 122, .5);--vue-scroll-rect-scrollbar-thumb-color-pressed: rgba(112, 112, 112, .2);--vue-scroll-rect-scrollbar-thumb-radius: 5px;--vue-scroll-rect-scrollbar-thumb-margin: 0px;--vue-scroll-rect-scrollbar-size: 8px}.vue-scroll-rect{position:relative;width:100%;height:100%;margin:0;overflow:hidden}.vue-scroll-rect>.scroll-content{position:relative;max-width:100%;max-height:100%;scrollbar-width:none;-ms-overflow-style:none}.vue-scroll-rect>.scroll-content::-webkit-scrollbar{width:0;height:0}.vue-scroll-rect>.scroll-content::-ms-scrollbar{width:0;height:0}.vue-scroll-rect>.scroll-content.both{overflow:scroll}.vue-scroll-rect>.scroll-content.horizontal{overflow-x:scroll}.vue-scroll-rect>.scroll-content.vertical{overflow-y:scroll}.vue-scroll-rect:hover>.scrollbar{opacity:1;transition:opacity .1s}.vue-scroll-rect.always-show-scrollbar>.scrollbar,.vue-scroll-rect .dragging>.scrollbar{opacity:1}.vue-scroll-rect.background-clickable>.scrollbar{pointer-events:all}.vue-scroll-rect>.scrollbar{position:absolute;opacity:0;transition:opacity 1.5s;pointer-events:none}.vue-scroll-rect>.scrollbar:hover{opacity:1}.vue-scroll-rect>.scrollbar .thumb{position:absolute;background-color:var(--vue-scroll-rect-scrollbar-thumb-color);border-radius:var(--vue-scroll-rect-scrollbar-thumb-radius);pointer-events:all}.vue-scroll-rect>.scrollbar .thumb:hover{background-color:var(--vue-scroll-rect-scrollbar-thumb-color-light)}.vue-scroll-rect>.scrollbar .thumb:active{background-color:var(--vue-scroll-rect-scrollbar-thumb-color-pressed)}.vue-scroll-rect>.scrollbar.horizontal{left:0;bottom:0;right:0;height:var(--vue-scroll-rect-scrollbar-size)}.vue-scroll-rect>.scrollbar.horizontal .thumb{top:var(--vue-scroll-rect-scrollbar-thumb-margin);bottom:var(--vue-scroll-rect-scrollbar-thumb-margin)}.vue-scroll-rect>.scrollbar.vertical{top:0;bottom:0;right:0;width:var(--vue-scroll-rect-scrollbar-size)}.vue-scroll-rect>.scrollbar.vertical .thumb{left:var(--vue-scroll-rect-scrollbar-thumb-margin);right:var(--vue-scroll-rect-scrollbar-thumb-margin)}:root{--mx-menu-backgroud: #fff;--mx-menu-hover-backgroud: #f1f1f1;--mx-menu-active-backgroud: #dfdfdf;--mx-menu-open-backgroud: #f1f1f1;--mx-menu-open-hover-backgroud: #f1f1f1;--mx-menu-divider: #f0f0f0;--mx-menu-text: #2e2e2e;--mx-menu-hover-text: #2e2e2e;--mx-menu-active-text: #2e2e2e;--mx-menu-open-text: #2e2e2e;--mx-menu-open-hover-text: #2e2e2e;--mx-menu-disabled-text: #c9c8c8;--mx-menu-icon-size: 16px;--mx-menu-shadow-color: rgba(0, 0, 0, .1);--mx-menu-backgroud-radius: 10px;--mx-menu-scrollbar-thumb-color: rgba(0, 0, 0, .2);--mx-menu-scrollbar-thumb-color-light: rgba(0, 0, 0, .3);--mx-menu-scrollbar-thumb-color-pressed: rgba(0, 0, 0, .1);--mx-menu-shortcut-backgroud: #ebebeb;--mx-menu-shortcut-backgroud-hover:#ebebeb;--mx-menu-shortcut-backgroud-active:#ebebeb;--mx-menu-shortcut-backgroud-open:#ebebeb;--mx-menu-shortcut-backgroud-disabled:#fdfdfd;--mx-menu-shortcut-text: #424242;--mx-menu-shortcut-text-hover: #424242;--mx-menu-shortcut-text-active: #424242;--mx-menu-shortcut-text-open: #424242;--mx-menu-shortcut-text-disabled: #a5a5a5;--mx-menu-placeholder-width: 24px}.mx-context-menu{pointer-events:all;display:inline-block;overflow:visible;position:absolute;background-color:var(--mx-menu-backgroud);border-radius:var(--mx-menu-backgroud-radius);padding:12px 0;box-shadow:0 10px 40px 10px var(--mx-menu-shadow-color);opacity:1;transition:opacity .2s ease-in-out;--vue-scroll-rect-scrollbar-thumb-color: var(--mx-menu-scrollbar-thumb-color);--vue-scroll-rect-scrollbar-thumb-color-light: var(--mx-menu-scrollbar-thumb-color-light);--vue-scroll-rect-scrollbar-thumb-color-pressed: var(--mx-menu-scrollbar-thumb-color-pressed)}.mx-context-menu-items{position:relative;overflow:visible}.mx-context-menu-scroll{overscroll-behavior:contain}.mx-context-menu-item{display:flex;flex-direction:row;justify-content:space-between;align-items:center;position:relative;padding:6px 15px;-webkit-user-select:none;user-select:none;overflow:visible;white-space:nowrap;text-overflow:ellipsis;color:var(--mx-menu-text)}.mx-context-menu-item .mx-right-arrow,.mx-context-menu-item .mx-checked-mark{fill:var(--mx-menu-text)}.mx-context-menu-item:hover{background-color:var(--mx-menu-hover-backgroud);color:var(--mx-menu-hover-text)}.mx-context-menu-item:hover .mx-right-arrow,.mx-context-menu-item:hover .mx-checked-mark{fill:var(--mx-menu-hover-text)}.mx-context-menu-item:hover .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-hover);color:var(--mx-menu-shortcut-text-hover)}.mx-context-menu-item:active{background-color:var(--mx-menu-active-backgroud);color:var(--mx-menu-active-text)}.mx-context-menu-item:active .mx-right-arrow,.mx-context-menu-item:active .mx-checked-mark{fill:var(--mx-menu-active-text)}.mx-context-menu-item:active .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-active);color:var(--mx-menu-shortcut-text-active)}.mx-context-menu-item.open{background-color:var(--mx-menu-open-backgroud);color:var(--mx-menu-open-text)}.mx-context-menu-item.open:hover{background-color:var(--mx-menu-open-hover-backgroud);color:var(--mx-menu-open-hover-text)}.mx-context-menu-item.open .mx-right-arrow,.mx-context-menu-item.open .mx-checked-mark{fill:var(--mx-menu-open-text)}.mx-context-menu-item.open .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-open);color:var(--mx-menu-shortcut-text-open)}.mx-context-menu-item.keyboard-focus{background-color:var(--mx-menu-active-backgroud)}.mx-context-menu-item.disabled{color:var(--mx-menu-disabled-text);cursor:not-allowed}.mx-context-menu-item.disabled:hover,.mx-context-menu-item.disabled:active{background-color:transparent}.mx-context-menu-item.disabled .mx-right-arrow,.mx-context-menu-item.disabled .mx-checked-mark{fill:var(--mx-menu-disabled-text)}.mx-context-menu-item.disabled .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-disabled);color:var(--mx-menu-shortcut-text-second)}.mx-context-menu-item .mx-item-row{display:flex;flex-direction:row;align-items:center;max-width:100%}.mx-context-menu-item .mx-icon-placeholder{position:relative;display:flex;flex-direction:row;align-items:center;height:auto;overflow:hidden}.mx-context-menu-item .mx-icon-placeholder.preserve-width{width:var(--mx-menu-placeholder-width)}.mx-context-menu-item .icon{display:inline-block;font-size:var(--mx-menu-icon-size)}.mx-context-menu-item .icon.svg{width:var(--mx-menu-icon-size);height:var(--mx-menu-icon-size)}.mx-context-menu-item .label{font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-inline-end:16px}.mx-context-menu-item-wrapper{position:relative}.mx-context-menu-item-sperator{display:block;padding:5px 0;background-color:var(--mx-menu-backgroud)}.mx-context-menu-item-sperator:after{display:block;content:"";background-color:var(--mx-menu-divider);height:1px}.mx-right-arrow{width:14px;height:14px}.mx-checked-mark{width:var(--mx-menu-icon-size);height:var(--mx-menu-icon-size)}.mx-shortcut{position:relative;justify-self:flex-end;font-size:11.5px;padding:2px 4px;background-color:var(--mx-menu-shortcut-backgroud);color:var(--mx-menu-shortcut-text)}.mx-menu-bar.dark,.mx-context-menu.dark{--mx-menu-backgroud: #303031;--mx-menu-hover-backgroud: #636363;--mx-menu-active-backgroud: #555555;--mx-menu-open-backgroud: #636363;--mx-menu-open-hover-backgroud: #636363;--mx-menu-divider: #464646;--mx-menu-text: #ffffff;--mx-menu-hover-text: #ffffff;--mx-menu-active-text: #ffffff;--mx-menu-open-text: #ffffff;--mx-menu-open-hover-text: #ffffff;--mx-menu-disabled-text: #9c9c9c;--mx-menu-shadow-color: rgba(51, 51, 51, .2);--mx-menu-scrollbar-thumb-color: rgba(255, 255, 255, .3);--mx-menu-scrollbar-thumb-color-light: rgba(255, 255, 255, .5);--mx-menu-scrollbar-thumb-color-pressed: rgba(255, 255, 255, .2);--mx-menu-shortcut-backgroud: #505050;--mx-menu-shortcut-backgroud-hover:#505050;--mx-menu-shortcut-backgroud-active:#505050;--mx-menu-shortcut-backgroud-open:#505050;--mx-menu-shortcut-backgroud-disabled:#444444;--mx-menu-shortcut-text: #f1f1f1;--mx-menu-shortcut-text-hover: #ffffff;--mx-menu-shortcut-text-active: #ffffff;--mx-menu-shortcut-text-open: #ffffff;--mx-menu-shortcut-text-disabled: #9d9d9d}.mx-menu-bar.flat,.mx-context-menu.flat{border-radius:0;padding:7px 0;box-shadow:0 1px 2px 1px var(--mx-menu-shadow-color)}.mx-menu-bar.flat .mx-context-menu-item,.mx-context-menu.flat .mx-context-menu-item{padding:3px 12px}.mx-menu-bar.win10,.mx-context-menu.win10{border-radius:0;padding:8px 0;border:1px solid var(--mx-menu-border-color);box-shadow:2px 2px 1px 0 var(--mx-menu-shadow-color)}.mx-menu-bar.win10,.mx-context-menu.win10{--mx-menu-backgroud: #eeeeee;--mx-menu-hover-backgroud: #d8d8d8;--mx-menu-active-backgroud: #dfdfdf;--mx-menu-open-backgroud: #f1f1f1;--mx-menu-open-hover-backgroud: #d8d8d8;--mx-menu-divider: #aaaaaa;--mx-menu-border-color: #b1b1b1;--mx-menu-shortcut-backgroud: transparent;--mx-menu-shortcut-backgroud-hover: transparent;--mx-menu-shortcut-backgroud-active: transparent;--mx-menu-shortcut-backgroud-open: transparent;--mx-menu-shortcut-backgroud-disabled:transparent;--mx-menu-shortcut-text: #272727;--mx-menu-shortcut-text-hover: #272727;--mx-menu-shortcut-text-active: #272727;--mx-menu-shortcut-text-open: #272727;--mx-menu-shortcut-text-disabled: #6b6b6b}.mx-menu-bar.win10 .mx-context-menu-item,.mx-context-menu.win10 .mx-context-menu-item{padding:2px 4px;margin:0 4px}.mx-menu-bar.win10 .mx-context-menu-item-sperator,.mx-context-menu.win10 .mx-context-menu-item-sperator{margin:0 4px}.mx-menu-bar.win10.dark,.mx-context-menu.win10.dark{--mx-menu-backgroud: #303031;--mx-menu-hover-backgroud: #636363;--mx-menu-active-backgroud: #555555;--mx-menu-open-backgroud: #636363;--mx-menu-open-hover-backgroud: #636363;--mx-menu-divider: #808080;--mx-menu-border-color: #656565;--mx-menu-shortcut-backgroud: #505050;--mx-menu-shortcut-backgroud-hover:#505050;--mx-menu-shortcut-backgroud-active:#505050;--mx-menu-shortcut-backgroud-open:#505050;--mx-menu-shortcut-backgroud-disabled:#444444;--mx-menu-shortcut-text: #f1f1f1;--mx-menu-shortcut-text-hover: #ffffff;--mx-menu-shortcut-text-active: #ffffff;--mx-menu-shortcut-text-open: #ffffff;--mx-menu-shortcut-text-disabled: #9d9d9d;padding:8px 0}.mx-menu-bar.win10.dark .mx-context-menu-item,.mx-context-menu.win10.dark .mx-context-menu-item{padding:6px 12px;margin:0}.mx-menu-bar.win10.dark .mx-context-menu-item-sperator,.mx-context-menu.win10.dark .mx-context-menu-item-sperator{margin:0 7px}.mx-menu-bar.mac,.mx-context-menu.mac{padding:8px 0;box-shadow:0 5px 7px 1px var(--mx-menu-shadow-color);border:1px solid var(--mx-menu-border-color)}.mx-menu-bar.mac,.mx-context-menu.mac{--mx-menu-backgroud: #ececec;--mx-menu-hover-backgroud: #0165e1;--mx-menu-active-backgroud: #0165e1;--mx-menu-open-backgroud: #858585;--mx-menu-open-hover-backgroud: #0165e1;--mx-menu-divider: #d2d2d2;--mx-menu-text: #232323;--mx-menu-hover-text: #fff;--mx-menu-active-text: #fff;--mx-menu-open-text: #fff;--mx-menu-open-hover-text: #fff;--mx-menu-disabled-text: #bbbbbb;--mx-menu-shadow-color: rgba(0, 0, 0, .1);--mx-menu-backgroud-radius: 10px;--mx-menu-shortcut-backgroud: transparent;--mx-menu-shortcut-backgroud-hover:transparent;--mx-menu-shortcut-backgroud-active:transparent;--mx-menu-shortcut-backgroud-open:transparent;--mx-menu-shortcut-backgroud-disabled:transparent;--mx-menu-shortcut-text: #424242;--mx-menu-shortcut-text-hover: #fff;--mx-menu-shortcut-text-active: #fff;--mx-menu-shortcut-text-open: #fff;--mx-menu-shortcut-text-disabled: #a5a5a5;--mx-menu-border-color: #bbbbbb}.mx-menu-bar.mac.dark,.mx-context-menu.mac.dark{--mx-menu-backgroud: #333333;--mx-menu-hover-backgroud: #0153d2;--mx-menu-active-backgroud: #0153d2;--mx-menu-open-hover-backgroud: #0153d2;--mx-menu-open-backgroud: #414346;--mx-menu-divider: #575757;--mx-menu-text: #dcdcdc;--mx-menu-hover-text: #fff;--mx-menu-active-text: #fff;--mx-menu-open-text: #fff;--mx-menu-open-hover-text: #fff;--mx-menu-disabled-text: #6a6a6a;--mx-menu-shadow-color: rgba(0, 0, 0, .1);--mx-menu-backgroud-radius: 10px;--mx-menu-shortcut-backgroud: transparent;--mx-menu-shortcut-backgroud-hover:transparent;--mx-menu-shortcut-backgroud-active:transparent;--mx-menu-shortcut-backgroud-open:transparent;--mx-menu-shortcut-backgroud-disabled:transparent;--mx-menu-shortcut-text: #dadada;--mx-menu-shortcut-text-hover: #fff;--mx-menu-shortcut-text-active: #fff;--mx-menu-shortcut-text-open: #fff;--mx-menu-shortcut-text-disabled: #6a6a6a;--mx-menu-border-color: #222}.mx-menu-bar.mac .mx-context-menu-item,.mx-context-menu.mac .mx-context-menu-item{border-radius:5px;margin:0 6px;padding:3px 6px}.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus{background-color:var(--mx-menu-active-backgroud);color:var(--mx-menu-active-text);outline:none}.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus .mx-right-arrow,.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus .mx-checked-mark,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus .mx-right-arrow,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus .mx-checked-mark{fill:var(--mx-menu-active-text)}.mx-menu-bar.mac .mx-context-menu-item.keyboard-focus .mx-shortcut,.mx-context-menu.mac .mx-context-menu-item.keyboard-focus .mx-shortcut{background-color:var(--mx-menu-shortcut-backgroud-active);color:var(--mx-menu-shortcut-text-active)}.mx-menu-bar.mac .mx-context-menu-item-sperator,.mx-context-menu.mac .mx-context-menu-item-sperator{margin:0 12px}.mx-context-menu .vue-scroll-rect>.scroll-content{overflow-y:scroll;height:100%;width:auto;position:relative!important}.mx-menu-ghost-host{position:absolute;inset:0;overflow:hidden;pointer-events:none}.mx-menu-ghost-host.fullscreen{position:fixed}.mx-menu-bar{flex:1;display:flex;flex-direction:row;align-items:center;background-color:var(--mx-menu-backgroud);padding:5px 0}.mx-menu-bar.mini{flex-grow:0}.mx-menu-bar .mx-menu-bar-content{display:flex;flex-direction:row;align-items:center}.mx-menu-bar .mx-menu-bar-item{padding:2px 8px;border-radius:5px;-webkit-user-select:none;user-select:none;background-color:var(--mx-menu-backgroud);color:var(--mx-menu-text)}.mx-menu-bar .mx-menu-bar-item:hover{background-color:var(--mx-menu-hover-backgroud);color:var(--mx-menu-hover-text)}.mx-menu-bar .mx-menu-bar-item:hover .mx-menu-bar-icon-menu{fill:var(--mx-menu-hover-text)}.mx-menu-bar .mx-menu-bar-item:active,.mx-menu-bar .mx-menu-bar-item.active{background-color:var(--mx-menu-active-backgroud);color:var(--mx-menu-active-text)}.mx-menu-bar .mx-menu-bar-item:active .mx-menu-bar-icon-menu,.mx-menu-bar .mx-menu-bar-item.active .mx-menu-bar-icon-menu{fill:var(--mx-menu-active-text)}.mx-menu-bar .mx-menu-bar-icon-menu{fill:var(--mx-menu-text);width:var(--mx-menu-icon-size);height:var(--mx-menu-icon-size)}.mx-menu-bar.flat .mx-menu-bar-item{border-radius:0}
|
|
@@ -29,4 +29,4 @@ body.paskia-backdrop {
|
|
|
29
29
|
color-scheme: auto;
|
|
30
30
|
background: transparent;
|
|
31
31
|
}
|
|
32
|
-
`;let Le=null,Fe=null,Ye=null,Xe=null,Un=!1,Et=0;function Dr(){if(document.getElementById(zn))return;const e=document.createElement("style");e.id=zn,e.textContent=Nr,document.head.insertBefore(e,document.head.firstChild)}class Ze extends Error{constructor(){super("Authentication cancelled"),this.name="AuthCancelledError"}}function pn(){Et++,document.body.classList.add("paskia-backdrop")}function Po(){Et=Math.max(0,Et-1),Et===0&&document.body.classList.remove("paskia-backdrop")}function Lr(){return!!document.getElementById(At)}function on(){Le&&(Le.remove(),Le=null,Po())}function Tr(e){const t=e.data;if(t?.type)switch(t.type){case"auth-success":on(),Ye&&(Ye(),Fe=null,Ye=null,Xe=null);break;case"auth-back":on(),Xe&&(Xe(new Ze),Fe=null,Ye=null,Xe=null);break}}function Br(){Un||typeof window<"u"&&(window.addEventListener("message",Tr),Un=!0)}function mn(e,t="Authentication"){return Dr(),Br(),Fe||(document.getElementById(At)?(Fe=new Promise((n,o)=>{Ye=n,Xe=o}),Fe):(Fe=new Promise((n,o)=>{Ye=n,Xe=o}),on(),pn(),Le=document.createElement("iframe"),Le.id=At,Le.title=t,Le.src=e,document.body.appendChild(Le),Fe))}const Fr=1e3;class Hr extends Error{constructor(t,n,o){super(o?.detail||`Request failed: ${n.status}`),this.name="ApiError",this.url=t,this.status=n.status,this.statusText=n.statusText,this.data=o}}class Vt extends Error{constructor(t,n=null){super(t),this.name="NetworkError",this.originalError=n}}async function Oo(e,t={}){const{timeout:n=Fr,...o}=t;for(o.credentials=o.credentials||"include";;){let s;try{s=await fetch(e,{...o,signal:n?AbortSignal.timeout(n):void 0})}catch(r){const l=r;throw l.name==="TimeoutError"?new Vt("Request timed out",l):l.name==="AbortError"?r:l.name==="TypeError"&&l.message==="Failed to fetch"?new Vt("Unable to connect to server",l):new Vt(l.message||"Network error",l)}if(s.status===401||s.status===403){let r=null;try{r=await s.clone().json()}catch{}if(r?.auth?.iframe&&window===window.top){await mn(r.auth.iframe);continue}}return s}}async function xt(e,t={}){return Wr(e,t,Oo)}async function Wr(e,t={},n=fetch){const o={Accept:"application/json",...t.headers};let s;t.body&&typeof t.body=="object"&&!(t.body instanceof FormData)?(o["Content-Type"]="application/json",s=JSON.stringify(t.body)):s=t.body;const r={...t,headers:o,body:s},l=await n(e,r),i=await l.json();if(!l.ok)throw new Hr(e,l,i);return i}const Ct="/api/control",zr="/api/upload",Ur="/api/watch";let Se=[],Rt=500,mt=null,ht=!1;const No=()=>{Se=[]},jr=()=>{const e=localStorage["cista-files"];if(!e)return!1;const t=se();try{return Se=JSON.parse(e),t.updateRoot(Se),console.log(`Loaded session with ${Se.length} items cached`),!0}catch(n){return console.log("Loading session failed",n),!1}},Do=()=>{localStorage["cista-files"]=JSON.stringify(Se)},Ue=(e,t)=>{const n=new WebSocket(new URL(e,location.origin.replace(/^http/,"ws")));for(const[o,s]of Object.entries(t))n.addEventListener(o,s);return n};async function Lo(e){const t=e.error?.auth?.iframe;if(t){const n=se();n.clearSensitiveData(),No(),ht=!0,n.authInProgress=!0,n.error="",Ce!==null&&(clearTimeout(Ce),Ce=null);try{await mn(t),ht=!1,n.authInProgress=!1,Nt()}catch(o){ht=!1,n.authInProgress=!1,o instanceof Ze?(console.log("User cancelled authentication"),n.dialog="accessdenied"):console.error("Auth iframe error:",o)}return!0}return!1}const Nt=()=>{Ce!==null&&(clearTimeout(Ce),Ce=null);const e=se();e.error!=="Reconnecting..."&&(e.error="Connecting..."),console.log(e.error),mt=Ue(Ur,{message:Gr,close:qr}),mt.addEventListener("message",t=>{if(e.connected)return;const n=JSON.parse(t.data);if("error"in n){n.error.code===401||n.error.code===403?Lo(n):e.error=n.error.message;return}"server"in n&&(console.log("Connected to backend",n),e.server=n.server,e.connected=!0,Rt=500,e.error="",n.user?e.login(n.user.username,n.user.privileged):e.isUserLogged&&e.logout())})},Vr=()=>{mt&&(mt.close(),mt=null)},sn=()=>{ht=!1,Ce!==null&&(clearTimeout(Ce),Ce=null),Nt()};let Ce=null;const qr=e=>{const t=se();if(ht||Lr()){console.log("Skipping reconnect - awaiting authentication");return}t.connected&&(console.warn("Disconnected from server",e),t.connected=!1,t.error="Reconnecting..."),Ce!==null&&clearTimeout(Ce),Rt=Math.min(5e3,Rt+500),Ce=setTimeout(Nt,Rt)},Gr=e=>{const t=JSON.parse(e.data);switch(!0){case!!t.root:Kr(t);break;case!!t.update:Jr(t);break;case!!t.space:console.log("Watch space",t.space);break;case!!t.error:Yr(t);break}};function Kr({root:e}){const t=se();console.log("Watch root",e),t.updateRoot(e),Se=e,Do()}function Jr(e){const t=se(),n=e.update;if(console.log("Watch update",n),!Se)return console.error("Watch update before root");let o=[],s=0;for(const[r,l]of n)r==="k"?(o.push(...Se.slice(s,s+l)),s+=l):r==="d"?s+=l:r==="i"?o.push(...l):console.log("Unknown update action",r,l);if(s!=Se.length)throw Error(`Tree update out of sync, number of entries mismatch: got ${s}, expected ${Se.length}, new tree ${o.length}`);t.updateRoot(o),Se=o,Do()}function Yr(e){if(se(),e.error.code===401||e.error.code===403){Lo(e);return}}const To={name:(e,t)=>st.compare(e.name,t.name),modified:(e,t)=>t.mtime-e.mtime,size:(e,t)=>t.size-e.size},Bo=(e,t)=>{if(!t)return e;const n=[...e];return n.sort(To[t]),n},Xr=(e,t)=>{if(!t)return e;const n=To[t],o=new Map;for(const i of e){const a=i.loc;o.has(a)||o.set(a,[]),o.get(a).push(i)}for(const i of o.values())i.sort(n);const s=new Map;for(const[i,a]of o)s.set(i,a[0]);const r=[...o.keys()].sort((i,a)=>t==="name"?st.compare(i,a):n(s.get(i),s.get(a))),l=[];for(const i of r)l.push(...o.get(i));return l},se=ho("main",{state:()=>({document:[],selected:new Set([]),query:"",fileExplorer:null,error:"",connected:!1,authInProgress:!1,cursor:"",server:{},dialog:"",uprogress:{},dprogress:{},prefs:{gallery:!1,sortListing:"",sortFiltered:""},user:{username:"",privileged:!1,isLoggedIn:!1}}),persist:{pick:["prefs","cursor","selected"],serializer:{deserialize:e=>{const t=JSON.parse(e);return t.selected=new Set(t.selected),t},serialize:e=>(e.selected=Array.from(e.selected),JSON.stringify(e))}},actions:{updateRoot(e){const t=[];let n=[];for(const[o,s,r,l,i,a]of e)n=n.slice(0,o-1),t.push(new fn({name:s,loc:o?n.join("/"):"/",key:r,size:i,mtime:l,dir:!a})),n.push(s);this.document=t},login(e,t){this.user.username=e,this.user.privileged=t,this.user.isLoggedIn=!0,this.dialog="",this.connected||sn()},clearSensitiveData(){localStorage.removeItem("cista-files"),this.document=[],this.selected.clear(),this.user.username="",this.user.privileged=!1,this.user.isLoggedIn=!1,this.connected=!1,this.dialog="",this.cursor=""},async logout(){console.log("Logout");try{const e=await fetch("/auth/api/logout",{method:"POST"});if(!e.ok){const t=await e.json().catch(()=>({}));this.error=t.message||t.detail||"Logout failed";return}}catch{this.error="Logout failed";return}this.clearSensitiveData(),sn()},toggleSort(e){this.query?this.prefs.sortFiltered=this.prefs.sortFiltered===e?"":e:this.prefs.sortListing=this.prefs.sortListing===e?"":e},sort(e){this.query?this.prefs.sortFiltered=e:this.prefs.sortListing=e},focusBreadcrumb(){document.querySelector(".breadcrumb").focus()},cancelDownloads(){location.reload()},cancelUploads(){location.reload()}},getters:{sortOrder(){return this.query?this.prefs.sortFiltered:this.prefs.sortListing},isUserLogged(){return this.user.isLoggedIn},recentDocuments(){return Bo(this.document,"modified")},selectedFiles(){const e=this.selected,t=new Set,n={missing:new Set,docs:{},keys:[],recursive:[]};for(const r of this.document)e.has(r.key)&&(t.add(r.key),n.keys.push(r.key),n.docs[r.key]=r);for(const r of e)t.has(r)||n.missing.add(r);const o=new Set;function s(r,l,i){if(!i.dir&&o.has(r))throw Error(`Multiple selections conflict for: ${r}`);o.add(r),n.recursive.push([r,l,i])}for(const r of n.keys){const l=n.docs[r],i=l.loc?`${l.loc}/${l.name}`:l.name,a=l.loc.length;s(l.name,i,l);for(const c of this.document)if(c.loc===i||c.loc.startsWith(i)&&c.loc[i.length]==="/"){const m=c.loc?`${c.loc}/${c.name}`:c.name,u=m.slice(a);s(u,m,c)}}return n.recursive.sort((r,l)=>st.compare(r[0],l[0])),n}}}),Fo=e=>{const t=se(),n=e.join("/");return t.document.some(o=>(o.loc?`${o.loc}/${o.name}`:o.name)===n)},Zr=["aria-current"],Qr=["href","aria-current","onClick","title"],hn=X({__name:"BreadCrumb",props:{path:{},primary:{type:Boolean}},setup(e){const t=os,n=un(),o=[],s=(u,p)=>{p&&(o[u]=p)};ns(()=>{o.length=1});const r=e,l=T([]),i=u=>u==r.path.length?"location":void 0,a=()=>{ge(()=>{const u=r.path.length;u<o.length&&o[u].focus()})},c=u=>{if(!o[u])throw Error(`No link at index ${u} (path: ${r.path})`);const f=u?`/${l.value.slice(0,u).join("/")}/`:"/",x=l.value.length?`/${l.value.join("/")}/`:"/",R=decodeURIComponent(location.hash.slice(1).split("//")[0]??""),b=f.replaceAll("?","%3F").replaceAll("#","%23");i(u)?(l.value.splice(u),n.push(b)):x.startsWith(R)?n.replace(b):n.push(b)},m=u=>{const p=r.path.length+u;p<0||p>l.value.length||c(p)};return Ie(()=>{const u=l.value.slice(0,r.path.length);if(!u.every((f,x)=>f===r.path[x]))l.value=r.path;else if(r.path.length>u.length)l.value=u.concat(r.path.slice(u.length));else for(let f=r.path.length;f<l.value.length;++f)if(!Fo(l.value.slice(0,f+1))){l.value=l.value.slice(0,f);break}r.primary&&ge(()=>{const f=document.activeElement;(!f||[...o,document.body].includes(f))&&a()})}),(u,p)=>(I(),P("nav",{class:"breadcrumb","aria-label":"Breadcrumb",onKeydown:[p[1]||(p[1]=Qe(de(f=>m(-1),["stop"]),["left"])),p[2]||(p[2]=Qe(de(f=>m(1),["stop"]),["right"]))],onKeyup:p[3]||(p[3]=Qe(f=>m(0),["enter"])),onFocus:a,tabindex:"0"},[E("a",{href:"#/",ref:f=>s(0,f),class:me(["home",{current:!!i(0)}]),"aria-current":i(0),onClick:p[0]||(p[0]=de(f=>c(0),["prevent"])),title:"/"},[(I(),ee(an(w(t))))],10,Zr),(I(!0),P(fe,null,rt(l.value,(f,x)=>(I(),P("a",{key:x,href:`/#/${l.value.slice(0,x+1).join("/")}/`,class:me({current:!!i(x+1)}),"aria-current":i(x+1),onClick:de(R=>c(x+1),["prevent"]),ref_for:!0,ref:R=>s(x+1,R),title:`/${l.value.slice(0,x+1).join("/")}`},oe(f),11,Qr))),128))],32))}}),el={class:"action-button"},Dt=X({__name:"SvgButton",props:{name:{}},setup(e){return(t,n)=>(I(),P("button",el,[(I(),ee(an(w(ss)[e.name]))),ue(t.$slots,"default")]))}}),tl=X({__name:"UploadButton",props:{path:Array},setup(e){const t=T(),n=T(),o=se(),s=e;function r(k){const h=Array.from(k.clipboardData?.items??[]),g=[],C=[];for(const S of h){if(S.kind!=="file")continue;const A=S.webkitGetAsEntry();if(A?.isFile){const D=S.getAsFile();D&&g.push(D)}else A?.isDirectory&&C.push(A)}if(g.length||C.length){k.preventDefault(),a(g);for(const S of C)l(S,`${s.path.join("/")}/${S.name}`)}}const l=async(k,h)=>{const g=k.createReader(),C=await new Promise(A=>g.readEntries(A)),S=[];for(const A of C){const D=`${h}/${A.name}`;if(A.isFile){const J=await new Promise(Y=>A.file(Y));S.push({file:J,cloudName:D,cloudPos:0})}else A.isDirectory&&await l(A,D)}S.length&&c(S)};function i(k){k.preventDefault();const h=k.target,g=Array.from((h??k.dataTransfer)?.files??[]);h&&(h.value=""),g.length&&a(g)}const a=k=>{const h=s.path.join("/");let g=[];for(const C of k)g.push({file:C,cloudName:h+"/"+(C.webkitRelativePath||C.name),cloudPos:0});c(g)},c=k=>{const h=k.filter(g=>g.cloudName.includes("/."));h.length&&(o.error="Won't upload dotfiles",console.log("Dotfiles omitted",h),k=k.filter(g=>!g.cloudName.includes("/."))),k.length&&(k.sort((g,C)=>st.compare(g.cloudName,C.cloudName)),R=[...R,...k],x(k),y())},m={total:0,xfer:0,t0:0,tlast:0,statbytes:0,statdur:0,files:[],filestart:0,fileidx:0,filecount:0,filename:"",filesize:0,filepos:0,status:"idle"};o.uprogress={...m},setInterval(()=>{Date.now()-o.uprogress.tlast>3e3?(o.uprogress.statbytes=0,o.uprogress.statdur=1):(o.uprogress.statbytes*=.9,o.uprogress.statdur*=.9)},100);const u=({name:k,size:h,start:g,end:C})=>{if(k!==o.uprogress.filename)return;const S=Date.now();o.uprogress.xfer=o.uprogress.filestart+C,o.uprogress.filepos=C,o.uprogress.statbytes+=C-g,o.uprogress.statdur+=S-o.uprogress.tlast,o.uprogress.tlast=S,C===h&&(o.uprogress.filestart+=h,p(),++o.uprogress.fileidx>=o.uprogress.filecount&&f())},p=()=>{const k=o.uprogress.files.shift();if(!k)return f();o.uprogress.filepos=0,o.uprogress.filesize=k.file.size,o.uprogress.filename=k.cloudName},f=()=>{Object.assign(o.uprogress,m),o.uprogress.t0=Date.now(),o.uprogress.tlast=o.uprogress.t0+1},x=k=>{o.uprogress.files.length===0&&f(),o.uprogress.total+=k.reduce((h,g)=>h+g.file.size,0),o.uprogress.filecount+=k.length,o.uprogress.files=[...o.uprogress.files,...k],p()};let R=[];const b=async()=>await new Promise(k=>{const h=Ue(zr,{open(g){k(h)},error(g){console.error("Upload socket error",g),o.error="Upload socket error"},message(g){const C=JSON.parse(g.data);if("error"in C){console.error("Upload socket error",C.error),o.error=C.error.message;return}C.status==="ack"?u(C.req):console.log("Unknown upload response",C)}});h.sendMsg=g=>h.send(JSON.stringify(g)),h.sendData=async g=>{o.uprogress.status="uploading",await new Promise(C=>{const S=setInterval(()=>{h.bufferedAmount>1048576||(C(void 0),clearInterval(S))},1)}),o.uprogress.status="processing",h.send(g)}}),v=async()=>{const k=await b();for(;R.length;){const h=R[0],g=h.cloudPos,C=Math.min(h.file.size,g+(1<<20)),S={name:h.cloudName,size:h.file.size,start:g,end:C},A=h.file.slice(g,C);h.cloudPos=C,k.sendMsg(S),await k.sendData(A),h.cloudPos===h.file.size&&R.shift()}R.length&&y(),o.uprogress.status="idle",$=!1};let $=!1;const y=()=>{$===!1&&($=setTimeout(()=>{$=!0,v()},0))};return be(()=>{addEventListener("dragover",i),addEventListener("drop",i),addEventListener("paste",r)}),wt(()=>{removeEventListener("paste",r),removeEventListener("dragover",i),removeEventListener("drop",i)}),(k,h)=>{const g=Dt;return I(),P(fe,null,[E("template",null,[E("input",{ref_key:"fileInput",ref:t,onChange:i,type:"file",multiple:""},null,544),E("input",{ref_key:"folderInput",ref:n,onChange:i,type:"file",webkitdirectory:""},null,544)]),z(g,{name:"add-file","data-tooltip":"Upload files",onClick:h[0]||(h[0]=C=>t.value.click())}),z(g,{name:"add-folder","data-tooltip":"Upload folder",onClick:h[1]||(h[1]=C=>n.value.click())})],64)}}}),nl=ho("ssoAuth",()=>{const e=K(()=>se().server?.paskia===!0);function t(){se().clearSensitiveData(),No()}return{isExternalAuth:e,clearDataOnUnauth:t}});let Te=null;function ol(){return Te!==null}function sl(e){Te&&Ho(),Te=e}function jn(e){e===Te&&(Te=null)}function Ho(){Te&&(Te.closeMenu(),Te=null)}const Ee={defaultDirection:"br",defaultMinWidth:100,defaultMaxWidth:600,defaultZindex:100,defaultZoom:1,defaultAdjustPadding:{x:0,y:10}};function vt(e,t){let n=e.offsetTop;return e.offsetParent!=null&&e.offsetParent!=t&&(n-=e.offsetParent.scrollTop,n+=vt(e.offsetParent,t)),n}function gt(e,t){let n=e.offsetLeft;return e.offsetParent!=null&&e.offsetParent!=t&&(n-=e.offsetParent.scrollLeft,n+=gt(e.offsetParent,t)),n}function rl(e,t,n,o){return{x:gt(e,o)+t,y:vt(e,o)+n}}const qt="mx-menu-default-container",ll="mx-menu-container-";let al=0;function Wo(e){const{getContainer:t,zIndex:n}=e;if(t){const s=typeof t=="function"?t():t;if(s){let r=s.getAttribute("id");return r||(r=ll+al++,s.setAttribute("id",r)),{eleId:r,container:s,isNew:!1}}}let o=document.getElementById(qt);return o||(o=document.createElement("div"),o.setAttribute("id",qt),o.setAttribute("class","mx-menu-ghost-host fullscreen"),document.body.appendChild(o)),o.style.zIndex=n?.toString()||Ee.defaultZindex.toString(),{eleId:qt,container:o,isNew:!0}}function il(e){let t=0;for(let n=0;n<e.length;n++){const o=e.charCodeAt(n);t=(t<<5)-t+o,t|=0}return t}function Vn(e){return typeof e=="number"?`${e}px`:e}const _e=X({props:{vnode:{type:null},data:{type:null,default:null}},setup(e){const{vnode:t,data:n}=Ve(e);return()=>typeof t.value=="function"?t.value(n.value):t.value}});function cl(e,t){const n={...e};return delete n[t],n}var ul=Object.defineProperty,dl=(e,t,n)=>t in e?ul(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,qn=(e,t,n)=>dl(e,typeof t!="symbol"?t+"":t,n);class Gn{constructor(t,n){qn(this,"x",0),qn(this,"y",0),this.x=t||0,this.y=n||0}set(t,n){this.x=t,this.y=n}substract(t){this.x-=t.x,this.y-=t.y}}function Kn(e){const{onDown:t,onMove:n,onUp:o}=e,s=new Gn,r=new Gn;let l;function i(c){c.stopPropagation(),r.set(c.x,c.y),r.substract(s),n(s,r,c,l)}function a(c){o(c,l),s.set(0,0),document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",a)}return(c,m)=>t(c,m)?(l=m,s.set(c.x,c.y),document.addEventListener("mousemove",i),document.addEventListener("mouseup",a),c.stopPropagation(),!0):!1}function fl(e,t){let n=0;return{start(){n>0&&clearInterval(n),n=setInterval(()=>{n=0,t()},e)},stop(){n>0&&(clearInterval(n),n=0)}}}const dt=[],Jn=fl(100,()=>{for(const e of dt)e()});function pl(e,t,n,o){let s=0,r=0;function l(){e.value&&(t&&s!==e.value.offsetWidth&&t(e.value.offsetWidth),n&&r!==e.value.offsetHeight&&n(e.value.offsetHeight),s=e.value.offsetWidth,r=e.value.offsetHeight)}return{startResizeChecker(){Jn.start(),dt.push(l)},stopResizeChecker(){const i=dt.indexOf(l);i>=0&&dt.splice(i,1),dt.length===0&&Jn.stop()}}}const Yn=140,ml=70,hl=X({__name:"ScrollRect",props:{scroll:{type:String,default:"both"},scrollBarAlwaysShow:{type:Boolean,default:!1},scrollBarBackgroundClickable:{type:Boolean,default:!1},height:{type:Number,default:void 0},width:{type:Number,default:void 0},maxHeight:{type:Number,default:void 0},maxWidth:{type:Number,default:void 0},containerClass:{type:String,default:""},containerStyle:{type:null}},emits:["scroll","resized"],setup(e,{expose:t,emit:n}){const o=e,s=n,r=T(),l=T(),i=T(),a=T(),c=T(),m=T(),u=T(!1),p=K(()=>o.scroll==="horizontal"||o.scroll==="both"),f=K(()=>o.scroll==="vertical"||o.scroll==="both"),x=et({show:!1,size:0,sizeRaw:0,pos:0}),R=et({show:!1,size:0,sizeRaw:0,pos:0});let b=0,v=0,$=0,y=0,k=null;const h={attributes:!0,childList:!0};function g(){if(r.value){if(x.show){const _=r.value.offsetWidth/r.value.scrollWidth;x.sizeRaw=_*r.value.offsetWidth,x.size=_*100,x.pos=r.value.scrollLeft/(r.value.scrollWidth-r.value.offsetWidth)*(100-x.size),_>=1&&(x.show=!1)}if(R.show){const _=r.value.offsetHeight/r.value.scrollHeight;R.sizeRaw=_*r.value.offsetHeight,R.size=_*100,R.pos=r.value.scrollTop/(r.value.scrollHeight-r.value.offsetHeight)*(100-R.size),_>=1&&(R.show=!1)}s("scroll",r.value.scrollLeft,r.value.scrollTop)}}function C(_=!1){if(!r.value)return;let B=p.value,d=f.value;const O=B&&(b!==r.value.scrollWidth||$!==r.value.offsetWidth),M=f&&(v!==r.value.scrollHeight||y!==r.value.offsetHeight);if(!_&&!O&&!M)return;const N=window.getComputedStyle(r.value);(N.overflow==="hidden"||N.overflowX==="hidden")&&(B=!1),(N.overflow==="hidden"||N.overflowY==="hidden")&&(d=!1),x.show=B,R.show=d,g(),$=r.value.offsetWidth,y=r.value.offsetHeight,b=r.value.scrollWidth,v=r.value.scrollHeight,s("resized",b,v)}function S(_){var B;o.scroll=="horizontal"&&(_.deltaMode==0&&((B=r.value)==null||B.scrollTo({left:r.value.scrollLeft+(_.deltaY>0?Yn:-140),behavior:"smooth"})),_.preventDefault(),_.stopPropagation())}function A(_){var B;_.deltaMode==0&&((B=r.value)==null||B.scrollTo({left:r.value.scrollLeft+(_.deltaY>0?Yn:-140),behavior:"smooth"}),_.preventDefault(),_.stopPropagation())}function D(_){var B;_.deltaMode==0&&((B=r.value)==null||B.scrollTo({top:r.value.scrollTop+(_.deltaY>0?ml:-70),behavior:"smooth"}),_.preventDefault(),_.stopPropagation())}let J=0,Y=0,F=0,H=0;const U=Kn({onDown(_){return!i.value||!c.value?!1:(J=_.offsetX,Y=_.x-_.offsetX-c.value.offsetLeft,_.preventDefault(),u.value=!0,!0)},onMove(_,B,d){r.value&&i.value&&(we(d.x-J-Y),d.preventDefault(),d.stopPropagation())},onUp(){u.value=!1}}),Z=Kn({onDown(_){return!a.value||!m.value?!1:(F=_.offsetY,H=_.y-_.offsetY-m.value.offsetTop,_.preventDefault(),u.value=!0,!0)},onMove(_,B,d){r.value&&a.value&&(ke(d.y-F-H),d.preventDefault(),d.stopPropagation())},onUp(){u.value=!1}});function q(_){r.value&&(r.value.scrollLeft=_/100*(r.value.scrollWidth-r.value.offsetWidth))}function ie(_){r.value&&(r.value.scrollLeft=_/100*(r.value.scrollHeight-r.value.offsetHeight))}function we(_){r.value&&(r.value.scrollLeft=_/(r.value.offsetWidth-x.sizeRaw)*(r.value.scrollWidth-r.value.offsetWidth))}function ke(_){r.value&&(r.value.scrollTop=_/(r.value.offsetHeight-R.sizeRaw)*(r.value.scrollHeight-r.value.offsetHeight))}function te(_){o.scrollBarBackgroundClickable&&we(_.offsetX-x.sizeRaw/2)}function Ae(_){o.scrollBarBackgroundClickable&&ke(_.offsetY-R.sizeRaw/2)}const{startResizeChecker:Me,stopResizeChecker:L}=pl(r,()=>C(),()=>C());return be(()=>{ge(()=>{setTimeout(()=>C(!0),200),C(!0),Me(),k=new MutationObserver(()=>C()),k.observe(r.value,h)})}),$t(()=>{L(),k&&(k.disconnect(),k=null)}),t({refreshScrollState(){C(!0)},getScrollContainer(){return r.value},scrollTo(_,B){var d;(d=r.value)==null||d.scrollTo(_,B)},scrollToTop(){var _;(_=r.value)==null||_.scrollTo(0,0)},scrollToBottom(){var _;(_=r.value)==null||_.scrollTo(r.value.scrollWidth,r.value.scrollHeight)}}),(_,B)=>(I(),P("div",{ref_key:"scrollrect",ref:l,class:me(["vue-scroll-rect",e.scrollBarAlwaysShow?"always-show-scrollbar":"",e.scrollBarBackgroundClickable?"background-clickable":"",u.value?"dragging":""]),style:Je({width:e.width?`${e.width}px`:void 0,height:e.height?`${e.height}px`:void 0}),onWheel:S},[E("div",{ref_key:"container",ref:r,class:me(["scroll-content",e.scroll,e.containerClass]),style:Je({maxWidth:e.maxWidth?`${e.maxWidth}px`:void 0,maxHeight:e.maxHeight?`${e.maxHeight}px`:void 0,...e.containerStyle}),onScroll:g},[ue(_.$slots,"default")],38),x.show?ue(_.$slots,"scrollBarX",{key:0,scrollBarValue:x,onScroll:q},()=>[E("div",{ref_key:"scrollBarRefX",ref:i,class:"scrollbar horizontal",onClick:te,onWheel:A},[E("div",{class:"thumb",ref_key:"scrollBarThumbRefX",ref:c,style:Je({left:`${x.pos}%`,width:`${x.size}%`}),onMousedown:B[0]||(B[0]=(...d)=>w(U)&&w(U)(...d)),onWheel:A},null,36)],544)]):G("",!0),R.show?ue(_.$slots,"scrollBarY",{key:1,scrollBarValue:R,onScroll:ie},()=>[R.show?(I(),P("div",{key:0,ref_key:"scrollBarRefY",ref:a,class:"scrollbar vertical",onClick:Ae,onWheel:D},[E("div",{class:"thumb",ref_key:"scrollBarThumbRefY",ref:m,style:Je({top:`${R.pos}%`,height:`${R.size}%`}),onMousedown:B[1]||(B[1]=(...d)=>w(Z)&&w(Z)(...d)),onWheel:D},null,36)],544)):G("",!0)]):G("",!0)],38))}}),vn=(e,t)=>{const n=e.__vccOpts||e;for(const[o,s]of t)n[o]=s;return n},vl={},gl={class:"mx-checked-mark","aria-hidden":"true",viewBox:"0 0 1024 1024"},yl=E("path",{d:"M129.3,428.6L52,512l345,372.5l575-620.8l-69.5-75L400.4,718.2L129.3,428.6z"},null,-1),wl=[yl];function kl(e,t){return I(),P("svg",gl,wl)}const bl=vn(vl,[["render",kl]]),Cl={},Sl={class:"mx-right-arrow","aria-hidden":"true",viewBox:"0 0 1024 1024"},xl=E("path",{d:"M307.018 49.445c11.517 0 23.032 4.394 31.819 13.18L756.404 480.18c8.439 8.438 13.181 19.885 13.181 31.82s-4.741 23.38-13.181 31.82L338.838 961.376c-17.574 17.573-46.065 17.573-63.64-0.001-17.573-17.573-17.573-46.065 0.001-63.64L660.944 512 275.198 126.265c-17.574-17.573-17.574-46.066-0.001-63.64C283.985 53.839 295.501 49.445 307.018 49.445z"},null,-1),_l=[xl];function El(e,t){return I(),P("svg",Sl,_l)}const Rl=vn(Cl,[["render",El]]),Il={class:"mx-item-row"},Al=["xlink:href"],$l={key:1,class:"label"},Ml={class:"mx-item-row"},Pl={class:"mx-shortcut"},gn=X({__name:"ContextMenuItem",props:{disabled:{type:Boolean,default:!1},hidden:{type:Boolean,default:!1},customRender:{type:Function,default:null},customClass:{type:String,default:""},clickHandler:{type:Function,default:null},label:{type:[String,Object,Function],default:""},icon:{type:[String,Object,Function],default:""},iconFontClass:{type:String,default:"iconfont"},checked:{type:Boolean,default:!1},shortcut:{type:String,default:""},svgIcon:{type:String,default:""},svgProps:{type:Object,default:null},preserveIconWidth:{type:Boolean,default:!0},showRightArrow:{type:Boolean,default:!1},hasChildren:{type:Boolean,default:!1},clickClose:{type:Boolean,default:!0},clickableWhenHasChildren:{type:Boolean,default:!1},rawMenuItem:{type:Object,default:void 0}},emits:["click","subMenuOpen","subMenuClose"],setup(e,{expose:t,emit:n}){const o=e,s=n,{clickHandler:r,clickClose:l,clickableWhenHasChildren:i,disabled:a,hidden:c,label:m,icon:u,iconFontClass:p,showRightArrow:f,shortcut:x,hasChildren:R}=Ve(o),b=T(!1),v=T(!1),$=T(),y=re("globalOptions"),k=re("globalHasSlot"),h=re("globalRenderSlot"),g=re("globalCloseMenu"),C=re("menuContext"),S=K(()=>typeof m.value=="string"?m.value:typeof m.value=="function"?il(m.value.toString()):"MenuItem[unknow]");ve("MenuItemName",S);const A={getSubMenuInstance:()=>{},showSubMenu:()=>b.value?(C.markActiveMenuItem(A,!0),!0):R.value?(J(),!0):!1,hideSubMenu:()=>{C.closeOtherSubMenu()},isDisabledOrHidden:()=>a.value||c.value,getElement:()=>$.value,focus:()=>v.value=!0,blur:()=>v.value=!1,click:D};ve("menuItemInstance",A),be(()=>{C.isMenuItemDataCollectedFlag()?ge(()=>{let H=0;const U=C.getElement();if(U){let Z=0;for(let q=0;q<U.children.length;q++){const ie=U.children[q];if(ie.getAttribute("data-type")==="ContextMenuItem"){if(ie===$.value){H=Z;break}Z++}}}C.addChildMenuItem(A,H)}):C.addChildMenuItem(A)}),$t(()=>{C.removeChildMenuItem(A)});function D(H){if(!a.value){if(H){const U=H.target;if(U.classList.contains("mx-context-no-clickable")||y.value.ignoreClickClassName&&U.classList.contains(y.value.ignoreClickClassName))return;if(y.value.clickCloseClassName&&U.classList.contains(y.value.clickCloseClassName)){H.stopPropagation(),g(o.rawMenuItem);return}}R.value?i.value?(typeof r.value=="function"&&r.value(H),s("click",H)):b.value||J():(typeof r.value=="function"&&r.value(H),s("click",H),l.value&&g(o.rawMenuItem))}}function J(H){v.value=!1,C.checkCloseOtherSubMenuTimeOut()||C.closeOtherSubMenu(),a.value||(C.markActiveMenuItem(A),R.value&&(H||C.markThisOpenedByKeyBoard(),C.addOpenedSubMenu(Y),b.value=!0,ge(()=>s("subMenuOpen",A))))}function Y(){v.value=!1,b.value=!1,s("subMenuClose",A)}function F(){return{disabled:a.value,label:m.value,icon:u.value,iconFontClass:p.value,showRightArrow:f.value,clickClose:l.value,clickableWhenHasChildren:i.value,shortcut:x.value,theme:y.value.theme,isOpen:b,hasChildren:R,onClick:D,onMouseEnter:J,closeMenu:g}}return t(A),(H,U)=>w(c)?G("",!0):(I(),P("div",{key:0,class:"mx-context-menu-item-wrapper",ref_key:"menuItemRef",ref:$,"data-type":"ContextMenuItem"},[w(k)("itemRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemRender",F())},null,8,["vnode"])):e.customRender?(I(),ee(w(_e),{key:1,vnode:e.customRender,data:F()},null,8,["vnode","data"])):(I(),P("div",{key:2,class:me(["mx-context-menu-item",w(a)?"disabled":"",v.value?"keyboard-focus":"",e.customClass?" "+e.customClass:"",b.value?"open":""]),onClick:D,onMouseenter:J},[ue(H.$slots,"default",{},()=>[E("div",Il,[E("div",{class:me(["mx-icon-placeholder",e.preserveIconWidth?"preserve-width":""])},[ue(H.$slots,"icon",{},()=>[w(k)("itemIconRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemIconRender",F())},null,8,["vnode"])):typeof e.svgIcon=="string"&&e.svgIcon?(I(),P("svg",Jt({key:1,class:"icon svg"},e.svgProps),[E("use",{"xlink:href":e.svgIcon},null,8,Al)],16)):typeof w(u)!="string"?(I(),ee(w(_e),{key:2,vnode:w(u),data:w(u)},null,8,["vnode","data"])):typeof w(u)=="string"&&w(u)!==""?(I(),P("i",{key:3,class:me(w(u)+" icon "+w(p)+" "+w(y).iconFontClass)},null,2)):G("",!0)]),e.checked?ue(H.$slots,"check",{key:0},()=>[w(k)("itemCheckRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemCheckRender",F())},null,8,["vnode"])):G("",!0),z(bl)]):G("",!0)],2),ue(H.$slots,"label",{},()=>[w(k)("itemLabelRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemLabelRender",F())},null,8,["vnode"])):typeof w(m)=="string"?(I(),P("span",$l,oe(w(m)),1)):(I(),ee(w(_e),{key:2,vnode:w(m),data:w(m)},null,8,["vnode","data"]))])]),E("div",Ml,[w(x)||H.$slots.shortcut?ue(H.$slots,"shortcut",{key:0},()=>[w(k)("itemShortcutRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemShortcutRender",F())},null,8,["vnode"])):G("",!0),E("span",Pl,oe(w(x)),1)]):G("",!0),w(f)?ue(H.$slots,"rightArrow",{key:1},()=>[w(k)("itemRightArrowRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemRightArrowRender",F())},null,8,["vnode"])):G("",!0),z(Rl)]):G("",!0)])])],34)),ue(H.$slots,"submenu",{context:A,show:b.value})],512))}}),Ol=X({name:"ContextMenuSperator",components:{VNodeRender:_e},setup(){const e=re("globalHasSlot"),t=re("globalRenderSlot");return{globalHasSlot:e,globalRenderSlot:t}}}),Nl={key:1,class:"mx-context-menu-item-sperator mx-context-no-clickable"};function Dl(e,t,n,o,s,r){const l=io("VNodeRender");return e.globalHasSlot("separatorRender")?(I(),ee(l,{key:0,vnode:()=>e.globalRenderSlot("separatorRender",{})},null,8,["vnode"])):(I(),P("div",Nl))}const yt=vn(Ol,[["render",Dl]]),yn=X({__name:"ContextSubMenu",props:{items:{type:Object,default:null},show:{type:Boolean,default:!1},maxHeight:{type:Number,default:0},maxWidth:{type:[String,Number],default:0},minWidth:{type:[String,Number],default:0},adjustPosition:{type:Boolean,default:!0},direction:{type:String,default:"br"},parentMenuItemContext:{type:Object,default:null}},emits:["closeAnimFinished"],setup(e,{expose:t,emit:n}){const o=e,s=n,r=T(!1),l=re("globalGetMenuHostId",""),i=re("menuContext"),a=re("globalOptions");re("globalHasSlot"),re("globalRenderSlot");const c=T("UnknowOrRoot"),m=re("MenuItemName",c),{zIndex:u,getParentWidth:p,getParentHeight:f,getZoom:x}=i,{adjustPosition:R}=Ve(o),b=T(),v=T(),$=T(),y=[],k=re("globalSetCurrentSubMenu"),h=[];let g=null,C=0;function S(){g&&g.blur()}function A(L,_){if(L){for(let B=_!==void 0?_:0;B<h.length;B++)if(!h[B].isDisabledOrHidden()){D(B);break}}else for(let B=_!==void 0?_:h.length-1;B>=0;B--)if(!h[B].isDisabledOrHidden()){D(B);break}}function D(L){if(g&&S(),L!==void 0&&(g=h[Math.max(0,Math.min(L,h.length-1))]),!g)return;g.focus();const _=g.getElement();_&&_.scrollIntoView({behavior:"auto",block:"nearest",inline:"nearest"})}function J(){k(Y)}const Y={el:$,name:m,isTopLevel:()=>i.getParentContext()===null,closeSelfAndActiveParent:()=>{const L=U.getParentContext();if(L){L.closeOtherSubMenu();const _=L.getSubMenuInstanceContext();if(_)return _.focusCurrentItem(),!0}return!1},closeCurrentSubMenu:()=>{var L;return(L=U.getParentContext())==null?void 0:L.closeOtherSubMenu()},moveCurrentItemFirst:()=>A(!0),moveCurrentItemLast:()=>A(!1),moveCurrentItemDown:()=>A(!0,g?h.indexOf(g)+1:0),moveCurrentItemUp:()=>A(!1,g?h.indexOf(g)-1:0),focusCurrentItem:()=>D(),openCurrentItemSubMenu:()=>g?g?.showSubMenu():!1,triggerCurrentItemClick:L=>g?.click(L)};let F=!1,H=!1;const U={zIndex:u+1,container:i.container,adjustPadding:a.value.adjustPadding||Ee.defaultAdjustPadding,getParentWidth:()=>{var L;return((L=$.value)==null?void 0:L.offsetWidth)||0},getParentHeight:()=>{var L;return((L=$.value)==null?void 0:L.offsetHeight)||0},getPositon:()=>[te.value.x,te.value.y],getZoom:()=>a.value.zoom||Ee.defaultZoom,addOpenedSubMenu(L){y.push(L)},closeOtherSubMenu(){y.forEach(L=>L()),y.splice(0,y.length),k(Y)},checkCloseOtherSubMenuTimeOut(){return C?(clearTimeout(C),C=0,!0):!1},closeOtherSubMenuWithTimeOut(){C=setTimeout(()=>{C=0,this.closeOtherSubMenu()},200)},addChildMenuItem:(L,_)=>{_===void 0?h.push(L):h.splice(_,0,L)},removeChildMenuItem:L=>{h.splice(h.indexOf(L),1),L.getSubMenuInstance=()=>{}},markActiveMenuItem:(L,_=!1)=>{S(),g=L,_&&D()},markThisOpenedByKeyBoard:()=>{F=!0},isOpenedByKeyBoardFlag:()=>F?(F=!1,!0):!1,isMenuItemDataCollectedFlag:()=>H,getElement:()=>$.value||null,getParentContext:()=>i,getSubMenuInstanceContext:()=>Y};ve("menuContext",U);const Z={getChildItem:L=>h[L],getMenuDimensions:()=>v.value?{width:v.value.offsetWidth,height:v.value.offsetHeight}:{width:0,height:0},getSubmenuRoot:()=>v.value,getMenu:()=>$.value,getScrollValue:()=>{var L,_;return((_=(L=b.value)==null?void 0:L.getScrollContainer())==null?void 0:_.scrollTop)||0},setScrollValue:L=>{var _;return(_=b.value)==null?void 0:_.scrollTo(0,L)},getScrollHeight:()=>ie.value,adjustPosition:()=>{Ae()},getMaxHeight:()=>we.value,getPosition:()=>te.value,setPosition:(L,_)=>{te.value.x=L,te.value.y=_}},q=re("menuItemInstance",void 0);q&&(q.getSubMenuInstance=()=>Z);const ie=T(0),we=T(0),ke=T(!1),te=T({x:0,y:0});function Ae(){ge(()=>{var L;const _=$.value,B=v.value;if(_&&B&&b.value){const{container:d}=i,O=p?.()??0,M=f?.()??0,N=getComputedStyle(B),j=parseFloat(N.paddingLeft),ne=parseFloat(N.paddingTop),V=M>0?ne:0,W=document.documentElement.scrollHeight/x(),ae=document.documentElement.scrollWidth/x(),Be=Math.min(ae,d.offsetWidth),pe=Math.min(W,d.offsetHeight);let Bt=gt(_,d),Ft=vt(_,d);if(o.direction.includes("l")?te.value.x-=_.offsetWidth+j:o.direction.includes("r")?te.value.x+=O+j:(te.value.x+=O/2,te.value.x-=(_.offsetWidth+j)/2),o.direction.includes("t")){const at=(L=o.parentMenuItemContext)==null?void 0:L.getElement();at&&(te.value.y+=at.offsetHeight),te.value.y-=(_.offsetHeight+ne)/x()}else o.direction.includes("b")?te.value.y-=ne/x():te.value.y-=_.offsetHeight/2/x();ge(()=>{var at,kn;Bt=gt(_,d),Ft=vt(_,d);const bn=((kn=(at=b.value)==null?void 0:at.getScrollContainer())==null?void 0:kn.scrollHeight)||0,Jo=o.maxHeight;ie.value=o.maxHeight?Math.min(bn,o.maxHeight):bn;const Yo=Bt+_.offsetWidth-Be,Cn=Ft+ie.value+V*2-pe;if(ke.value=Cn>0,R.value&&Yo>0){const it=O+_.offsetWidth-j,ct=Bt;it>ct?te.value.x-=ct:te.value.x-=it}if(ke.value){if(R.value){const it=Cn,ct=Ft;it>ct?te.value.y-=ct-V:te.value.y-=it-V}we.value=pe-(te.value.y+ne)}else we.value=Jo||0})}})}function Me(){var L;const _=(L=o.parentMenuItemContext)==null?void 0:L.getElement();if(_){const B=gt(_,i.container),d=vt(_,i.container);te.value.x=B,te.value.y=d}else{const[B,d]=i.getPositon();te.value.x=B,te.value.y=d}ge(()=>{var B;k(Y),(B=$.value)==null||B.focus({preventScroll:!0}),i.isOpenedByKeyBoardFlag()&&ge(()=>A(!0)),H=!0}),Ae()}return ze(()=>o.show,L=>{L&&Me()}),be(()=>{r.value=!0,o.show?Me():Ae()}),$t(()=>{r.value=!1,q&&(q.getSubMenuInstance=()=>{})}),t(Z),(L,_)=>{const B=io("ContextSubMenu",!0);return r.value?(I(),ee(cn,{key:0,to:`#${w(l)}`},[z(as,Jt({appear:""},w(a).menuTransitionProps||{duration:10},{onAfterLeave:_[0]||(_[0]=d=>s("closeAnimFinished"))}),{default:Re(()=>[e.show?(I(),P("div",Jt({key:0,ref_key:"submenuRoot",ref:v},L.$attrs,{class:["mx-context-menu",w(a).customClass?w(a).customClass:"",w(a).theme??""],style:{maxWidth:e.maxWidth?w(Vn)(e.maxWidth):`${w(Ee).defaultMaxWidth}px`,minWidth:e.minWidth?w(Vn)(e.minWidth):`${w(Ee).defaultMinWidth}px`,zIndex:w(u),left:`${te.value.x}px`,top:`${te.value.y}px`},"data-type":"ContextSubMenu",onClick:J}),[z(w(hl),{ref_key:"scrollRectRef",ref:b,scroll:"vertical",maxHeight:we.value,containerClass:"mx-context-menu-scroll"},{default:Re(()=>[E("div",{class:me(["mx-context-menu-items"]),ref_key:"menu",ref:$},[ue(L.$slots,"default",{},()=>[(I(!0),P(fe,null,rt(e.items,(d,O)=>(I(),P(fe,{key:O},[d.hidden!==!0&&d.divided==="up"?(I(),ee(yt,{key:0})):G("",!0),d.hidden!==!0&&d.divided==="self"?(I(),ee(yt,{key:1})):(I(),ee(gn,{key:2,clickHandler:d.onClick?M=>d.onClick(M):void 0,disabled:typeof d.disabled=="object"?d.disabled.value:d.disabled,hidden:typeof d.hidden=="object"?d.hidden.value:d.hidden,icon:d.icon,iconFontClass:d.iconFontClass,svgIcon:d.svgIcon,svgProps:d.svgProps,label:d.label,customRender:d.customRender,customClass:d.customClass,checked:typeof d.checked=="object"?d.checked.value:d.checked,shortcut:d.shortcut,clickClose:d.clickClose,clickableWhenHasChildren:d.clickableWhenHasChildren,preserveIconWidth:d.preserveIconWidth!==void 0?d.preserveIconWidth:w(a).preserveIconWidth,showRightArrow:d.children&&d.children.length>0,hasChildren:d.children&&d.children.length>0,rawMenuItem:d,onSubMenuOpen:M=>{var N;return(N=d.onSubMenuOpen)==null?void 0:N.call(d,M)},onSubMenuClose:M=>{var N;return(N=d.onSubMenuClose)==null?void 0:N.call(d,M)}},ao({_:2},[d.children&&d.children.length>0?{name:"submenu",fn:Re(({context:M,show:N})=>[z(B,{show:N,parentMenuItemContext:M,items:d.children,maxWidth:d.maxWidth,minWidth:d.minWidth,maxHeight:d.maxHeight,adjustPosition:d.adjustSubMenuPosition!==void 0?d.adjustSubMenuPosition:w(a).adjustPosition,direction:d.direction!==void 0?d.direction:w(a).direction},null,8,["show","parentMenuItemContext","items","maxWidth","minWidth","maxHeight","adjustPosition","direction"])]),key:"0"}:void 0]),1032,["clickHandler","disabled","hidden","icon","iconFontClass","svgIcon","svgProps","label","customRender","customClass","checked","shortcut","clickClose","clickableWhenHasChildren","preserveIconWidth","showRightArrow","hasChildren","rawMenuItem","onSubMenuOpen","onSubMenuClose"])),d.hidden!==!0&&(d.divided==="down"||d.divided===!0)?(I(),ee(yt,{key:3})):G("",!0)],64))),128))])],512)]),_:3},8,["maxHeight"])],16)):G("",!0)]),_:3},16)],8,["to"])):G("",!0)}}}),zo=X({__name:"ContextSubMenuWrapper",props:{options:{type:Object,default:null},show:{type:null,default:null},container:{type:Object,default:null},isFullScreenContainer:{type:Boolean,default:!0}},emits:["close","closeAnimFinished"],setup(e,{expose:t,emit:n}){const o=e,s=n,r=lo(),l=T(),{options:i,show:a,container:c}=Ve(o);be(()=>{a.value&&p()}),$t(()=>{b()}),ze(a,g=>{g?p():(jn(m),b())});const m={closeMenu:f,isClosed:x,getMenuRef:()=>l.value,getMenuDimensions:()=>{var g;return((g=l.value)==null?void 0:g.getMenuDimensions())??{width:0,height:0}}};let u=!1;function p(){R(),sl(m)}function f(g){u=!0,s("close",g),i.value.menuTransitionProps||s("closeAnimFinished"),jn(m)}function x(){return u}function R(){setTimeout(()=>{document.addEventListener("click",k,!0),document.addEventListener("contextmenu",k,!0),document.addEventListener("scroll",y,!0),!o.isFullScreenContainer&&c.value&&c.value.addEventListener("scroll",y,!0),i.value.keyboardControl!==!1&&document.addEventListener("keydown",$,!0)},50)}function b(){document.removeEventListener("contextmenu",k,!0),document.removeEventListener("click",k,!0),document.removeEventListener("scroll",y,!0),!o.isFullScreenContainer&&c.value&&c.value.removeEventListener("scroll",y,!0),i.value.keyboardControl!==!1&&document.removeEventListener("keydown",$,!0)}const v=T();ve("globalSetCurrentSubMenu",g=>v.value=g),ve("globalGetMenuHostId",c.value.id);function $(g){var C,S,A,D,J,Y,F,H,U,Z,q,ie,we;let ke=!0;switch(g.key){case"Escape":{((C=v.value)==null?void 0:C.isTopLevel())===!1?(S=v.value)==null||S.closeCurrentSubMenu():f();break}case"ArrowDown":(A=v.value)==null||A.moveCurrentItemDown();break;case"ArrowUp":(D=v.value)==null||D.moveCurrentItemUp();break;case"Home":(J=v.value)==null||J.moveCurrentItemFirst();break;case"End":(Y=v.value)==null||Y.moveCurrentItemLast();break;case"ArrowLeft":{(F=v.value)!=null&&F.closeSelfAndActiveParent()||(U=(H=i.value).onKeyFocusMoveLeft)==null||U.call(H);break}case"ArrowRight":(Z=v.value)!=null&&Z.openCurrentItemSubMenu()||(ie=(q=i.value).onKeyFocusMoveRight)==null||ie.call(q);break;case"Enter":(we=v.value)==null||we.triggerCurrentItemClick(g);break;default:ke=!1;break}ke&&v.value&&(g.stopPropagation(),g.preventDefault())}function y(g){i.value.closeWhenScroll!==!1&&h(g.target,null)}function k(g){h(g.target,g)}function h(g,C){for(var S,A;g;){if(g.classList&&g.classList.contains("mx-context-menu"))return;g=g.parentNode}C?i.value.clickCloseOnOutside!==!1?(b(),f()):(A=(S=i.value).onClickOnOutside)==null||A.call(S,C):(b(),f())}return ve("globalOptions",i),ve("globalCloseMenu",f),ve("globalIsFullScreenContainer",o.isFullScreenContainer),ve("globalHasSlot",g=>r[g]!==void 0),ve("globalRenderSlot",(g,C)=>ue(r,g,{...C},()=>[tt("span","Render slot failed")],!1)),ve("menuContext",{zIndex:i.value.zIndex||Ee.defaultZindex,container:c.value,adjustPadding:{x:0,y:0},getZoom:()=>i.value.zoom||Ee.defaultZoom,getParentWidth:()=>0,getParentHeight:()=>0,getPositon:()=>[i.value.x,i.value.y],closeOtherSubMenuWithTimeOut:()=>{},checkCloseOtherSubMenuTimeOut:()=>!1,addOpenedSubMenu:()=>{},closeOtherSubMenu:()=>{},getParentContext:()=>null,getSubMenuInstanceContext:()=>null,getElement:()=>null,addChildMenuItem:()=>{},removeChildMenuItem:()=>{},markActiveMenuItem:()=>{},markThisOpenedByKeyBoard:()=>{},isOpenedByKeyBoardFlag:()=>!1,isMenuItemDataCollectedFlag:()=>!1}),t(m),(g,C)=>(I(),ee(yn,{ref_key:"submenuInstance",ref:l,show:w(a),items:w(i).items,adjustPosition:w(i).adjustPosition,maxWidth:w(i).maxWidth||w(Ee).defaultMaxWidth,minWidth:w(i).minWidth||w(Ee).defaultMinWidth,maxHeight:w(i).maxHeight,direction:w(i).direction||w(Ee).defaultDirection,onCloseAnimFinished:C[0]||(C[0]=S=>s("closeAnimFinished"))},{default:Re(()=>[ue(g.$slots,"default")]),_:3},8,["show","items","adjustPosition","maxWidth","minWidth","maxHeight","direction"]))}}),Ll=X({__name:"ContextMenu",props:{options:{type:Object,default:null},show:{type:Boolean,default:!1}},emits:["update:show","close"],setup(e,{expose:t,emit:n}){const o=n,s=e,{options:r,show:l}=Ve(s),{isNew:i,container:a,eleId:c}=Wo(r.value),m=T(null),u=lo();function p(f){var x,R;o("update:show",!1),o("close"),(R=(x=r.value).onClose)==null||R.call(x,f)}return t({closeMenu:()=>o("update:show",!1),isClosed:()=>!l.value,getMenuRef:()=>{var f;return(f=m.value)==null?void 0:f.getMenuRef()},getMenuDimensions:()=>{var f;return((f=m.value)==null?void 0:f.getMenuDimensions())??{width:0,height:0}}}),(f,x)=>(I(),ee(cn,{to:`#${w(c)}`},[z(zo,{ref_key:"menuRef",ref:m,options:w(r),show:w(l),container:w(a),isFullScreenContainer:!w(i),onClose:p},ao({_:2},[rt(w(u),(R,b)=>({name:b,fn:Re(v=>[ue(f.$slots,b,rs(ls(v)))])}))]),1032,["options","show","container","isFullScreenContainer"])],8,["to"]))}}),Tl=X({name:"ContextMenuGroup",props:{disabled:{type:Boolean,default:!1},hidden:{type:Boolean,default:!1},clickHandler:{type:Function,default:null},label:{type:String,default:""},icon:{type:String,default:""},iconFontClass:{type:String,default:"iconfont"},checked:{type:Boolean,default:!1},shortcut:{type:String,default:""},svgIcon:{type:String,default:""},svgProps:{type:Object,default:null},preserveIconWidth:{type:Boolean,default:!0},showRightArrow:{type:Boolean,default:!1},clickClose:{type:Boolean,default:!0},adjustSubMenuPosition:{type:Boolean,default:void 0},maxHeight:{type:[String,Number],default:0},maxWidth:{type:[String,Number],default:0},minWidth:{type:[String,Number],default:0}},setup(e,t){const n=re("globalOptions"),{adjustSubMenuPosition:o,maxWidth:s,minWidth:r,maxHeight:l}=Ve(e),i=typeof o.value<"u"?o.value:n.value.adjustPosition,a=T(),c=T();return t.expose({getSubMenuRef:()=>a.value,getMenuItemRef:()=>c.value}),()=>tt(gn,{...e,ref:c,showRightArrow:!0,maxWidth:void 0,minWidth:void 0,maxHeight:void 0,adjustSubMenuPosition:void 0,hasChildren:typeof t.slots.default!==void 0},t.slots.default?{submenu:m=>tt(yn,{ref:a,show:m.show,maxWidth:s.value,minWidth:r.value,maxHeight:l.value,adjustPosition:i,parentMenuItemContext:m.context},{default:t.slots.default}),...cl(t.slots,"default")}:t.slots)}});function Bl(e,t,n,o){const s=T(!0),r=tt(zo,{options:e,show:s,container:t,isFullScreenContainer:!n,onCloseAnimFinished:()=>{Sn(null,t)},onClose:l=>{var i;(i=e.onClose)==null||i.call(e,l),s.value=!1}},o);return Sn(r,t),r.component}function Xn(e,t){const n=Wo(e);return Bl(e,n.container,n.isNew,t).exposed}const Lt={install(e){e.config.globalProperties.$contextmenu=Xn,e.component("ContextMenu",Ll),e.component("ContextMenuItem",gn),e.component("ContextMenuGroup",Tl),e.component("ContextMenuSperator",yt),e.component("ContextMenuSeparator",yt),e.component("ContextSubMenu",yn)},showContextMenu(e,t){return Xn(e,t)},isAnyContextMenuOpen(){return ol()},closeContextMenu:Ho,transformMenuPosition:rl},Fl={key:0,class:"empty-container"},Hl={key:0},Wl={key:1},zl={key:2},Ul={key:3},jl={key:4},Vl={key:5},ql=X({__name:"EmptyFolder",props:{path:{},documents:{}},setup(e){const t=is,n=se(),o=e;return(s,r)=>!o.path||e.documents.length===0?(I(),P("div",Fl,[(I(),ee(an(w(t)),{class:me(["cog",{stopped:w(n).dialog==="accessdenied"||w(n).authInProgress}])},null,8,["class"])),w(n).dialog==="accessdenied"?(I(),P("p",Hl,"Access Denied")):w(n).connected?w(n).document.length===0?(I(),P("p",zl,"Waiting for File List")):w(n).query?(I(),P("p",Ul,"No matches!")):w(Fo)(o.path)?(I(),P("p",Vl,"Empty folder")):(I(),P("p",jl,"Folder not found")):(I(),P("p",Wl,"No Connection"))])):G("",!0)}}),Gl=ye(ql,[["__scopeId","data-v-0494c508"]]),Kl=["checked"],Jl=X({__name:"SelectBox",props:{doc:{}},setup(e){const t=se();return(n,o)=>(I(),P("input",{type:"checkbox",tabindex:"-1",checked:w(t).selected.has(e.doc.key),onClick:o[0]||(o[0]=de(()=>{},["stop"])),onChange:o[1]||(o[1]=s=>{s.target.checked?w(t).selected.add(e.doc.key):w(t).selected.delete(e.doc.key)})},null,40,Kl))}}),rn=X({__name:"FileRenameInput",props:{doc:{},rename:{type:Function},exit:{type:Function}},setup(e){const t=T(null),n=T("");be(()=>{n.value=o.doc.name;const r=n.value.lastIndexOf(".");ge(()=>{t.value.focus(),t.value.setSelectionRange(0,r>0?r:n.value.length)})});const o=e,s=()=>{o.exit(),!(o.doc.key!=="new"&&(n.value===o.doc.name||n.value.length===0))&&o.rename(o.doc,n.value)};return(r,l)=>kt((I(),P("input",{ref_key:"input",ref:t,id:"FileRenameInput",type:"text",autocorrect:"off","onUpdate:modelValue":l[0]||(l[0]=i=>n.value=i),onBlur:l[1]||(l[1]=(...i)=>e.exit&&e.exit(...i)),onKeyup:[l[2]||(l[2]=Qe((...i)=>e.exit&&e.exit(...i),["esc"])),Qe(s,["enter"])]},null,544)),[[Yt,n.value]])}}),Yl=["src"],Xl=["src"],Zl={key:2,class:"folder icon"},Ql={key:3,class:"video-container"},ea=["src","poster"],ta={class:"play-overlay"},na={key:4,class:"audio icon"},oa=["src"],sa={key:5,class:"archive icon"},ra=X({__name:"MediaPreview",props:{doc:{},quality:{}},setup(e,{expose:t}){const n=T(null),o=T(null),s=K(()=>n.value||o.value),r=K(()=>`${l.doc.previewurl}?${l.quality}&t=${l.doc.mtime}`),l=e,i=()=>{s.value&&(s.value.controls=!0,s.value.setAttribute("data-playing",""))},a=()=>{s.value&&(s.value.controls=!1,s.value.removeAttribute("data-playing"))};let c=null;const m=()=>{if(!s.value)return;s.value.load();const R=Array.from(document.querySelectorAll("video, audio"));if(R.length===0)return;let b=null;for(const v in R)if(R[v]===(c||s.value)){b=R[+v+1]??R[0]??null;break}if(b)if(b.tagName==="VIDEO"&&document.fullscreenElement===s.value){const v=s.value,$=b;if(v===$){$.play();return}c||v.addEventListener("fullscreenchange",y=>{c&&(c.currentTime=v.currentTime,c.click(),v.paused||c.play(),c=null,v.src=l.doc.url,v.poster=r.value,a())},{once:!0}),c=$,v.src=$.src,v.poster="",v.play()}else document.exitFullscreen(),b.click()};t({play(){if(!s.value)return!1;if(s.value.paused){s.value.play();for(const R of Array.from(document.querySelectorAll("video, audio")))R!==s.value&&R.pause()}else s.value.pause();return!0},media:s});const u=()=>["mkv","mp4","webm","mov","avi"].includes(l.doc.ext),p=()=>["mp3","flac","ogg","aac"].includes(l.doc.ext),f=()=>["zip","tar","gz","bz2","xz","7z","rar"].includes(l.doc.ext),x=()=>["bmp","ico","tif","tiff","heic","heif","pdf","epub","mobi"].includes(l.doc.ext)||l.doc.size>5e5&&["avif","webp","png","jpg","jpeg"].includes(l.doc.ext);return(R,b)=>x()?(I(),P("img",{key:0,src:`${e.doc.previewurl}?${e.quality}&t=${e.doc.mtime}`,alt:""},null,8,Yl)):e.doc.img?(I(),P("img",{key:1,src:e.doc.url,alt:""},null,8,Xl)):e.doc.dir?(I(),P("span",Zl)):u()?(I(),P("div",Ql,[E("video",{ref_key:"vid",ref:o,src:e.doc.url,poster:r.value,preload:"none",onPlay:i,onPause:a,onEnded:m,onSeeking:b[0]||(b[0]=v=>s.value.play())},null,40,ea),E("div",ta,[z(w(cs))])])):p()?(I(),P("div",na,[E("audio",{ref_key:"aud",ref:n,src:e.doc.url,class:"icon",preload:"none",onPlay:i,onPause:a,onEnded:m,onSeeking:b[1]||(b[1]=v=>s.value.play())},null,40,oa)])):f()?(I(),P("span",sa)):(I(),P("span",{key:6,class:me(["file icon",`ext-${e.doc.ext}`])},null,2))}}),la=ye(ra,[["__scopeId","data-v-47490c5c"]]);let Gt=!1,Ge=null,Kt=!1;const aa=X({__name:"CursorTooltip",props:{text:{},delay:{}},setup(e,{expose:t}){const n=e,o=T(!1),s=T(0),r=T(0);let l=null,i=0,a=0;const c=8,m=K(()=>({left:`${s.value}px`,top:`${r.value}px`})),u=()=>window.matchMedia("(pointer: fine)").matches,p=()=>{o.value=!0,Gt=!0},f=()=>{l&&clearTimeout(l),Ge&&(clearTimeout(Ge),Ge=null);const v=Gt?0:n.delay??900;l=setTimeout(p,v)};return t({startHover:v=>{!u()&&!Kt||(s.value=v.clientX,r.value=v.clientY,i=v.clientX,a=v.clientY)},updatePosition:v=>{if((v.movementX!==0||v.movementY!==0)&&(Kt=!0),!u()&&!Kt||(s.value=v.clientX,r.value=v.clientY,o.value))return;const $=v.clientX-i,y=v.clientY-a;Math.sqrt($*$+y*y)>c&&(i=v.clientX,a=v.clientY,l&&(clearTimeout(l),l=null)),l||f()},endHover:()=>{l&&(clearTimeout(l),l=null),o.value=!1,Ge&&clearTimeout(Ge),Ge=setTimeout(()=>{Gt=!1},400)}}),(v,$)=>(I(),ee(cn,{to:"body"},[o.value?(I(),P("div",{key:0,class:"cursor-tooltip",style:Je(m.value)},[ue(v.$slots,"default",{},void 0,!0)],4)):G("",!0)]))}}),Uo=ye(aa,[["__scopeId","data-v-c5d421fc"]]),ia=["id","href"],ca={class:"tooltip-name"},ua={class:"tooltip-details"},da=X({__name:"GalleryFigure",props:{doc:{},editing:{}},setup(e){const t=se(),n=e,o=T(null),s=T(null),r=K(()=>n.doc.key),l=i=>{o.value.play()&&i.preventDefault(),t.cursor=n.doc.key};return(i,a)=>{const c=rn,m=Jl;return I(),P("a",{id:`file-${e.doc.key}`,href:e.doc.url,tabindex:"-1",class:me({file:!e.doc.dir,folder:e.doc.dir,cursor:w(t).cursor===e.doc.key}),onContextmenu:a[3]||(a[3]=de(()=>{},["stop"])),onFocus:a[4]||(a[4]=de(u=>w(t).cursor=e.doc.key,["stop"])),onClick:l,onMouseenter:a[5]||(a[5]=(...u)=>s.value?.startHover&&s.value?.startHover(...u)),onMousemove:a[6]||(a[6]=(...u)=>s.value?.updatePosition&&s.value?.updatePosition(...u)),onMouseleave:a[7]||(a[7]=(...u)=>s.value?.endHover&&s.value?.endHover(...u))},[E("figure",null,[ue(i.$slots,"default",{},void 0,!0),z(la,{ref_key:"m",ref:o,doc:e.doc,tabindex:"-1",quality:"sz=512",class:"figcontent"},null,8,["doc"]),a[9]||(a[9]=E("div",{class:"titlespacer"},null,-1)),E("figcaption",{onClick:a[1]||(a[1]=de(()=>{},["prevent"])),onContextmenu:a[2]||(a[2]=de(u=>i.$emit("menu",u),["prevent"]))},[e.editing?(I(),ee(c,{key:0,doc:e.doc,rename:e.editing.rename,exit:e.editing.exit},null,8,["doc","rename","exit"])):(I(),P(fe,{key:1},[z(m,{doc:e.doc,onClick:a[0]||(a[0]=u=>w(t).cursor=e.doc.key)},null,8,["doc"]),E("span",null,oe(e.doc.name),1),a[8]||(a[8]=E("div",{class:"namespacer"},null,-1))],64))],32)]),z(Uo,{ref_key:"tooltip",ref:s,text:r.value},{default:Re(()=>[E("div",ca,oe(e.doc.name),1),E("div",ua,oe(e.doc.modified)+" — "+oe(e.doc.sizedisp),1)]),_:1},8,["text"])],42,ia)}}}),fa=ye(da,[["__scopeId","data-v-91479c1d"]]),pa=X({__name:"Gallery",props:{path:{},documents:{}},setup(e,{expose:t}){const n=e,o=se(),s=un(),r=ln(null),l=()=>{r.value=null},i=(h,g)=>{const C=h.name,S=Ue(Ct,{message(A){const D=JSON.parse(A.data);"error"in D?(console.error("Rename failed",D.error.message,D.error),h.name=C):console.log("Rename succeeded",D)}});S.onopen=()=>{S.send(JSON.stringify({op:"rename",path:`${h.loc}/${C}`,to:g}))},h.name=g},a=T(),c=T(1),m=()=>{a.value&&(c.value=getComputedStyle(a.value).gridTemplateColumns.split(" ").length)},u=K(()=>c.value);t({newFolder(){const h=Math.floor(Date.now()/1e3);r.value=new fn({loc:y.value,key:"new",name:"New Folder",dir:!0,mtime:h,size:0}),o.cursor=r.value.key},toggleSelectAll(){console.log("Select"),$.value=!$.value},toggleSortColumn(h){const g=["","name","modified","size",""][h];g&&o.toggleSort(g)},isCursor(){return o.cursor&&r.value===null},cursorRename(){r.value=n.documents.find(h=>h.key===o.cursor)??null},cursorSelect(){const h=o.cursor;h&&(o.selected.has(h)?o.selected.delete(h):o.selected.add(h),this.cursorMove(1,null))},up(h){this.cursorMove(-u.value,h)},down(h){this.cursorMove(u.value,h)},left(h){this.cursorMove(-1,h)},right(h){this.cursorMove(1,h)},cursorMove(h,g){const C=!!g?.shiftKey,S=n.documents;if(S.length===0){o.cursor="";return}const A=S.length,D=(U,Z)=>(U%Z+Z)%Z,J=(U,Z)=>D(U+Z,A+1),Y=o.cursor?S.findIndex(U=>U.key===o.cursor):A;if(g&&Y===0&&g.key==="ArrowLeft"||g&&Y===A-1&&g.key==="ArrowRight")return;let F;Y===A?F=h>0?0:A-1:(F=J(Y,h),(Math.abs(h)>=A||Math.sign(h)!==Math.sign(F-Y))&&(F=A)),o.cursor=S[F]?.key??"";const H=o.cursor?document.getElementById(`file-${o.cursor}`):"";if(C){let[U,Z]=h>0?[Y,F]:[F,Y];for(let q=U;q!==Z;q=J(q,1)){if(q===A)continue;const ie=S[q].key;o.selected.has(ie)?o.selected.delete(ie):o.selected.add(ie)}}x=H,f||(f=setTimeout(()=>{x&&x.scrollIntoView({block:"center",behavior:"smooth"}),f=null},300)),F===A&&p()}});const p=()=>{const h=document.querySelector(".breadcrumb");h&&h.focus()};let f=null,x=null;Ie(()=>{if(o.cursor&&o.cursor!==r.value?.key&&(r.value=null),r.value&&(o.cursor=r.value.key),o.cursor){const h=document.querySelector(`#file-${o.cursor}`);h&&(h.focus(),h.scrollIntoView({block:"center",behavior:"smooth"}))}}),Ie(()=>{!n.documents.length&&o.cursor&&(o.cursor="",p())});let R=null;be(()=>{const h=document.querySelector(".cursor");h&&(h.scrollIntoView({block:"center",behavior:"instant"}),h.focus()),m(),a.value&&(R=new ResizeObserver(m),R.observe(a.value))}),wt(()=>{R?.disconnect()});const b=(h,g)=>{const C=Ue(Ct,{open(){C.send(JSON.stringify({op:"mkdir",path:`${h.loc}/${g}`}))},message(S){const A=JSON.parse(S.data);"error"in A?(console.error("Mkdir failed",A.error.message,A.error),r.value=null):(console.log("mkdir",A),s.push(h.urlrouter))}});h.name=g,h.key=crypto.randomUUID()},v=h=>{const g=n.documents,C=g[h].loc;return h===0?C!==y.value:C!==g[h-1].loc},$=K({get:()=>n.documents.length>0&&n.documents.every(h=>o.selected.has(h.key)),set:h=>{console.log("Setting allSelected",h);for(const g of n.documents)h?o.selected.add(g.key):o.selected.delete(g.key)}}),y=K(()=>n.path.join("/")),k=(h,g)=>{o.cursor=g.key,Lt.showContextMenu({x:h.x,y:h.y,items:[{label:"Rename",onClick:()=>{r.value=g}}]})};return(h,g)=>{const C=fa,S=hn;return n.documents.length||r.value?(I(),P("div",{key:0,class:"gallery",ref_key:"gallery",ref:a},[r.value?.key==="new"?(I(),ee(C,{doc:r.value,key:r.value.key,editing:{rename:b,exit:l}},null,8,["doc","editing"])):G("",!0),(I(!0),P(fe,null,rt(e.documents,(A,D)=>(I(),P(fe,{key:A.key},[v(D)?(I(),ee(S,{key:0,path:A.loc?A.loc.split("/"):[],class:"folder-indicator"},null,8,["path"])):G("",!0),z(C,{doc:A,editing:r.value===A?{rename:i,exit:l}:null,onMenu:J=>k(J,A),class:me({"folder-start":v(D)})},null,8,["doc","editing","onMenu","class"])],64))),128))],512)):G("",!0)}}}),ma=ye(pa,[["__scopeId","data-v-9973e293"]]),ha=X({__name:"FileSize",props:{doc:{}},setup(e){const t=K(()=>{const o=n.doc.sizedisp.split(" ").slice(-1)[0];return+o?"bytes":o}),n=e;return(o,s)=>(I(),P("td",{class:me(["size right",t.value])},oe(e.doc.sizedisp),3))}}),va=ye(ha,[["__scopeId","data-v-444c7802"]]),ga={class:"modified right"},ya=["datetime"],wa=X({__name:"FileModified",props:{doc:{},now:{}},setup(e){const t=e,n=T(null),o=K(()=>(t.now,Mo(t.doc.mtime))),s=K(()=>new Date(1e3*t.doc.mtime).toISOString().replace(".000Z","Z")),r=K(()=>s.value.replace("T"," ").replace("Z"," UTC"));return(l,i)=>(I(),P("td",ga,[E("time",{datetime:s.value,onMouseenter:i[0]||(i[0]=(...a)=>n.value?.startHover&&n.value?.startHover(...a)),onMousemove:i[1]||(i[1]=(...a)=>n.value?.updatePosition&&n.value?.updatePosition(...a)),onMouseleave:i[2]||(i[2]=(...a)=>n.value?.endHover&&n.value?.endHover(...a))},oe(o.value),41,ya),z(Uo,{ref_key:"tooltip",ref:n,text:r.value},{default:Re(()=>[He(oe(r.value),1)]),_:1},8,["text"])]))}}),ka={key:0},ba={class:"selection"},Ca=["indeterminate"],Sa={key:0,class:"folder"},xa={class:"name"},_a={key:0,class:"folder-change"},Ea={colspan:"5"},Ra=["id","onClick","onContextmenu"],Ia=["onClick"],Aa=["checked","onChange"],$a={class:"name"},Ma=["href","onFocus"],Pa=["onClick"],Oa={class:"menu"},Na=["onClick"],Da={key:1,class:"summary"},La={colspan:"3",class:"right"},Ta={class:"size right"},Ba=X({__name:"FileExplorer",props:{path:{},documents:{}},setup(e,{expose:t}){const n=e,o=se(),s=un(),r=ln(null),l=(y,k)=>{const h=y.name,g=Ue(Ct,{message(C){const S=JSON.parse(C.data);"error"in S?(console.error("Rename failed",S.error.message,S.error),y.name=h):console.log("Rename succeeded",S)}});g.onopen=()=>{g.send(JSON.stringify({op:"rename",path:`${y.loc}/${h}`,to:k}))},y.name=k};t({newFolder(){console.log("New folder");const y=Math.floor(Date.now()/1e3);r.value=new fn({loc:v.value,key:"new",name:"New Folder",dir:!0,mtime:y,size:0}),o.cursor=r.value.key},toggleSelectAll(){console.log("Select"),b.value=!b.value},isCursor(){return o.cursor&&r.value===null},cursorRename(){r.value=n.documents.find(y=>y.key===o.cursor)??null},cursorSelect(){const y=o.cursor;y&&(o.selected.has(y)?o.selected.delete(y):o.selected.add(y),this.cursorMove(1,null))},up(y){this.cursorMove(-1,y)},down(y){this.cursorMove(1,y)},left(y){s.back()},right(y){const k=document.querySelector(`#file-${o.cursor} a`);k&&k.click()},cursorMove(y,k){const h=!!k?.shiftKey,g=n.documents;if(g.length===0){o.cursor="";return}const C=g.length,S=(F,H)=>(F%H+H)%H,A=(F,H)=>S(F+H,C+1),D=o.cursor?g.findIndex(F=>F.key===o.cursor):g.length,J=A(D,y);o.cursor=g[J]?.key??"";const Y=o.cursor?document.getElementById(`file-${o.cursor}`):"";if(h){let[F,H]=y>0?[D,J]:[J,D];for(let U=F;U!==H;U=A(U,1)){if(U===C)continue;const Z=g[U].key;o.selected.has(Z)?o.selected.delete(Z):o.selected.add(Z)}}c=Y,a||(a=setTimeout(()=>{c&&c.scrollIntoView({block:"center",behavior:"smooth"}),a=null},300)),J===C&&i()}});const i=()=>{const y=document.querySelector(".breadcrumb");y&&y.focus()};let a=null,c=null;Ie(()=>{if(o.cursor&&o.cursor!==r.value?.key&&(r.value=null),r.value&&(o.cursor=r.value?.key),o.cursor){const y=document.querySelector(`#file-${o.cursor} .name a`);y&&y.focus()}}),Ie(()=>{!n.documents.length&&o.cursor&&(o.cursor="",i())});let m=T(0),u=null;const p=()=>{m.value=Math.floor(Date.now()/1e3)};be(()=>{p(),u=setInterval(p,1e3);const y=document.querySelector(".cursor");y&&(y.scrollIntoView({block:"center",behavior:"instant"}),y.focus())}),wt(()=>{clearInterval(u)});const f=(y,k)=>{const h=Ue(Ct,{open(){h.send(JSON.stringify({op:"mkdir",path:`${y.loc}/${k}`}))},message(g){const C=JSON.parse(g.data);"error"in C?(console.error("Mkdir failed",C.error.message,C.error),r.value=null):(console.log("mkdir",C),s.push(y.urlrouter))}});y.name=k,y.key=crypto.randomUUID()},x=y=>{const k=n.documents,h=k[y].loc;return y===0?h!==v.value:h!==k[y-1].loc},R=K({get:()=>n.documents.length>0&&n.documents.some(y=>o.selected.has(y.key))&&!b.value,set:y=>{}}),b=K({get:()=>n.documents.length>0&&n.documents.every(y=>o.selected.has(y.key)),set:y=>{console.log("Setting allSelected",y);for(const k of n.documents)y?o.selected.add(k.key):o.selected.delete(k.key)}}),v=K(()=>n.path.join("/")),$=(y,k)=>{o.cursor=k.key,Lt.showContextMenu({x:y.x,y:y.y,items:[{label:"Rename",onClick:()=>{r.value=k}}]})};return(y,k)=>{const h=wa,g=va,C=hn;return n.documents.length||r.value?(I(),P("table",ka,[E("thead",null,[E("tr",null,[E("th",ba,[kt(E("input",{type:"checkbox",tabindex:"-1","onUpdate:modelValue":k[0]||(k[0]=S=>b.value=S),indeterminate:R.value},null,8,Ca),[[co,b.value]])]),E("th",{class:me(["sortcolumn",{sortactive:w(o).sortOrder==="name"}]),onClick:k[1]||(k[1]=S=>w(o).toggleSort("name"))},"Name",2),E("th",{class:me(["sortcolumn modified right",{sortactive:w(o).sortOrder==="modified"}]),onClick:k[2]||(k[2]=S=>w(o).toggleSort("modified"))},"Modified",2),E("th",{class:me(["sortcolumn size right",{sortactive:w(o).sortOrder==="size"}]),onClick:k[3]||(k[3]=S=>w(o).toggleSort("size"))},"Size",2),k[5]||(k[5]=E("th",{class:"menu"},null,-1))])]),E("tbody",null,[r.value?.key==="new"?(I(),P("tr",Sa,[k[6]||(k[6]=E("td",{class:"selection"},null,-1)),E("td",xa,[z(rn,{doc:r.value,rename:f,exit:()=>{r.value=null}},null,8,["doc","exit"])]),z(h,{doc:r.value,now:w(m)},null,8,["doc","now"]),z(g,{doc:r.value},null,8,["doc"]),k[7]||(k[7]=E("td",{class:"menu"},null,-1))])):G("",!0),(I(!0),P(fe,null,rt(e.documents,(S,A)=>(I(),P(fe,{key:S.key},[x(A)?(I(),P("tr",_a,[E("th",Ea,[z(C,{path:S.loc?S.loc.split("/"):[]},null,8,["path"])])])):G("",!0),E("tr",{id:`file-${S.key}`,class:me({file:!S.dir,folder:S.dir,cursor:w(o).cursor===S.key}),onClick:D=>w(o).cursor=w(o).cursor===S.key?"":S.key,onContextmenu:de(D=>$(D,S),["prevent"])},[E("td",{class:"selection",onClick:de(D=>w(o).cursor=w(o).cursor===S.key?S.key:"",["stop"])},[E("input",{type:"checkbox",tabindex:"-1",checked:w(o).selected.has(S.key),onChange:D=>D.target.checked?w(o).selected.add(S.key):w(o).selected.delete(S.key)},null,40,Aa)],8,Ia),E("td",$a,[r.value===S?(I(),ee(rn,{key:0,doc:S,rename:l,exit:()=>{r.value=null}},null,8,["doc","exit"])):(I(),P(fe,{key:1},[E("a",{href:S.url,tabindex:"-1",onContextmenu:k[4]||(k[4]=de(()=>{},["stop"])),onFocus:de(D=>w(o).cursor=S.key,["stop"])},oe(S.name),41,Ma),w(o).cursor==S.key?(I(),P("button",{key:0,tabindex:"-1",class:"rename-button",onClick:()=>r.value=S},"🖊️",8,Pa)):G("",!0)],64))]),z(h,{doc:S,now:w(m)},null,8,["doc","now"]),z(g,{doc:S},null,8,["doc"]),E("td",Oa,[E("button",{tabindex:"-1",onClick:de(D=>$(D,S),["stop"])},"⋮",8,Na)])],42,Ra)],64))),128)),n.documents.length>1?(I(),P("tr",Da,[E("td",La,oe(n.documents.length)+" items",1),E("td",Ta,oe(w($o)(n.documents.reduce((S,A)=>S+A.size,0))),1),k[8]||(k[8]=E("td",{class:"menu"},null,-1))])):G("",!0)])])):G("",!0)}}}),Fa=ye(Ba,[["__scopeId","data-v-c61c7c3a"]]),Ha=X({__name:"ExplorerView",props:{path:{},query:{}},setup(e){const t=se(),n=T(),o=e,s=K(()=>{const r=o.path.join("/"),l=o.query;if(!l)return Bo(t.document.filter(p=>p.loc===r),t.prefs.sortListing);const i=Pr(l);let a=100,c=[];for(const p of t.recentDocuments)if(Or(p.haystack,i)&&(c.push(p),--a===0))break;const m=r+"/",u=t.prefs.sortFiltered;return u?Xr(c,u):(c.sort((p,f)=>(f.loc===r)-(p.loc===r)||(f.loc.slice(0,m.length)===m)-(p.loc.slice(0,m.length)===m)||st.compare(p.loc,f.loc)||(p.type==="file")-(f.type==="file")||f.name.includes(l)-p.name.includes(l)||st.compare(p.name,f.name)),c)});return Ie(()=>{t.fileExplorer=n.value,t.query=o.query}),ze([()=>o.path.join("/"),()=>t.document.length],([r,l],[i,a])=>{r===i&&a!==void 0&&a>0||(t.prefs.gallery=s.value.some(c=>c.previewable))},{immediate:!0}),(r,l)=>{const i=ma,a=Gl;return I(),P(fe,null,[w(t).prefs.gallery?(I(),ee(i,{ref_key:"fileExplorer",ref:n,key:`gallery-${w(je).currentRoute.value.path}`,path:o.path,documents:s.value},null,8,["path","documents"])):(I(),ee(Fa,{ref_key:"fileExplorer",ref:n,key:`explorer-${w(je).currentRoute.value.path}`,path:o.path,documents:s.value},null,8,["path","documents"])),z(a,{documents:s.value,path:o.path},null,8,["documents","path"])],64)}}}),Wa=ye(Ha,[["__scopeId","data-v-f7875394"]]),je=$r({history:cr("/"),routes:[{path:"/:pathMatch(.*)*",name:"explorer",component:Wa}]}),za={class:"headermain buttons"},Ua=["value"],ja=X({__name:"HeaderMain",props:{path:{},query:{}},setup(e,{expose:t}){const n=se(),o=nl(),s=T(!1),r=T(),l=T(),i=e,a=p=>{if(!s.value)return;s.value=!1,document.querySelector(".breadcrumb").focus(),c(p)},c=p=>{const f=p.target.value;let x=i.path.join("/");x=x?`/${x}`:"";const b=(f?`${x}//${f}`:x||"/").replaceAll("?","%3F").replaceAll("#","%23");!i.query&&f?je.push(b):je.replace(b)},m=p=>{if(s.value=!s.value,!s.value)return a(p);ge(()=>{const f=r.value;f&&f.focus()})};Ie(()=>{i.query&&(s.value=!0)});const u=p=>{const f=[];o.isExternalAuth&&n.user.isLoggedIn&&f.push({label:"👤 "+(n.user.username||"User Account"),onClick:()=>{window.location.href="/auth/"}}),!o.isExternalAuth&&n.user.isLoggedIn&&f.push({label:"🔑 Change Password",onClick:()=>{n.dialog="settings"}}),n.user.privileged&&f.push({label:"⚙️ Admin Settings",onClick:()=>{n.dialog="usermgmt"}}),n.user.isLoggedIn?f.push({label:"🚪 Logout",onClick:()=>n.logout()}):o.isExternalAuth||f.push({label:"🔐 Login",onClick:async()=>{try{await mn("/auth/restricted"),sn()}catch{console.log("Login cancelled")}}}),Lt.showContextMenu({x:p.target.getBoundingClientRect().right,y:p.target.getBoundingClientRect().bottom,items:f})};return t({toggleSearchInput:m,closeSearch:a}),(p,f)=>{const x=tl,R=Dt;return I(),P("nav",za,[z(x,{path:i.path},null,8,["path"]),z(R,{name:"create-folder","data-tooltip":"New folder",onClick:f[0]||(f[0]=()=>{console.log("New",w(n).fileExplorer),w(n).fileExplorer.newFolder(),console.log("Done")})}),ue(p.$slots,"default",{},void 0,!0),f[2]||(f[2]=E("div",{class:"spacer smallgap"},null,-1)),s.value?(I(),P("input",{key:0,ref_key:"search",ref:r,type:"search",value:e.query,onInput:c,placeholder:"Find files",class:"margin-input"},null,40,Ua)):G("",!0),z(R,{ref_key:"searchButton",ref:l,name:"find",onClick:de(m,["prevent"])},null,512),z(R,{name:"eye",onClick:f[1]||(f[1]=b=>w(n).prefs.gallery=!w(n).prefs.gallery)}),z(R,{name:"cog",onClick:u})])}}}),Va=ye(ja,[["__scopeId","data-v-f67e0d6e"]]);function _t(e){return typeof e=="object"&&e!==null&&"error"in e}class qa{async get(t){try{const n=await xt(t,{method:"GET"});if(_t(n))throw new Oe(n.error.code,n.error.message);return n}catch(n){throw n instanceof Ze?new Oe(401,"Authentication cancelled"):n}}async post(t,n){try{const o=await xt(t,{method:"POST",body:n});if(_t(o))throw new Oe(o.error.code,o.error.message);return o}catch(o){throw o instanceof Ze?new Oe(401,"Authentication cancelled"):o}}async put(t,n){try{const o=await xt(t,{method:"PUT",body:n});if(_t(o))throw new Oe(o.error.code,o.error.message);return o}catch(o){throw o instanceof Ze?new Oe(401,"Authentication cancelled"):o}}async delete(t){try{const n=await xt(t,{method:"DELETE"});if(_t(n))throw new Oe(n.error.code,n.error.message);return n}catch(n){throw n instanceof Ze?new Oe(401,"Authentication cancelled"):n}}}const lt=new qa;class Oe extends Error{code;constructor(t,n){super(n),this.code=t}}const Ga=X({__name:"DownloadButton",setup(e){const t=se(),n={total:0,xfer:0,t0:0,tlast:0,statbytes:0,statdur:0,files:[],filestart:0,fileidx:0,filecount:0,filename:"",filesize:0,filepos:0,status:"idle"};t.dprogress={...n},setInterval(()=>{Date.now()-t.dprogress.tlast>3e3?(t.dprogress.statbytes=0,t.dprogress.statdur=1):(t.dprogress.statbytes*=.9,t.dprogress.statdur*=.9)},100);const o=()=>{Object.assign(t.dprogress,n),t.dprogress.t0=Date.now(),t.dprogress.tlast=t.dprogress.t0+1},s=i=>{const a=document.createElement("a");a.href=i,a.download="",a.click()},r=async(i,a)=>{let c="",m=a;console.log("Downloading to filesystem",i.recursive);for(const[u,p,f]of i.recursive)f.dir||(t.dprogress.files.push(u),++t.dprogress.filecount,t.dprogress.total+=f.size);for(const[u,p,f]of i.recursive){c&&!u.startsWith(c+"/")&&(c="",m=a);const x=u.slice(c.length);for(const v of x.split("/").slice(0,f.dir?void 0:-1))if(v){c+=`${v}/`;try{m=await m.getDirectoryHandle(v.normalize("NFC"),{create:!0})}catch($){throw console.error("Failed to create directory",c,$),new Error(`Failed to create directory ${c}: ${$}`)}console.log("Created",c)}if(f.dir)continue;const R=u.split("/").pop().normalize("NFC");let b;try{b=await m.getFileHandle(R,{create:!0})}catch(v){throw console.error("Failed to create file",u,p,c+R,v),new Error(`Failed to create file ${c+R}: ${v}`)}try{const v=await b.createWritable(),$=`/files/${u}`;console.log("Fetching",$);const y=await Oo($);if(!y.ok)throw t.error=`Failed to download ${$}: ${y.status} ${y.statusText}`,new Error(`Failed to download ${$}: ${y.status} ${y.statusText}`);if(y.body){++t.dprogress.fileidx;const k=y.body.getReader();for(await v.truncate(0),t.error="Direct download.",t.dprogress.tlast=Date.now();;){const{value:h,done:g}=await k.read();if(g)break;await v.write(h);const C=Date.now(),S=h.byteLength;t.dprogress.xfer+=S,t.dprogress.filepos+=S,t.dprogress.statbytes+=S,t.dprogress.statdur+=C-t.dprogress.tlast,t.dprogress.tlast=C}}await v.close(),console.log("Saved",c+R)}catch(v){throw console.error("Failed to write file",c+R,v),new Error(`Failed to write file ${c+R}: ${v}`)}}o()},l=async()=>{const i=t.selectedFiles;if(console.log("Download",i),i.keys.length===0){console.warn("Attempted download but no files found. Missing selected keys:",i.missing),t.error="No existing files selected",t.selected.clear();return}const a=i.recursive.filter(([m,u,p])=>!p.dir);if(a.length===1)return t.selected.clear(),t.error="Single file via browser downloads",s(`/files/${a[0][1]}`);if("showDirectoryPicker"in window)try{const m=await window.showDirectoryPicker({startIn:"downloads",mode:"readwrite"});await r(i,m),t.selected.clear();return}catch(m){console.error("Download to folder aborted",m)}console.log("Falling back to zip download");const c=i.keys.length===1?i.docs[i.keys[0]].name:"download";s(`/zip/${Array.from(i.keys).join("+")}/${c}.zip`),t.error="Downloading as ZIP via browser downloads",t.selected.clear()};return(i,a)=>{const c=Dt;return I(),ee(c,{name:"download","data-tooltip":"Download",onClick:l})}}}),Ka={class:"select-text"},Ja=X({__name:"HeaderSelected",props:{path:Array},setup(e){const t=se(),n=e,o=K(()=>n.path.join("/")),s=(r,l)=>{const i=t.selectedFiles,a={op:r,sel:i.keys.map(m=>{const u=i.docs[m];return u.loc?`${u.loc}/${u.name}`:u.name})};l!==void 0&&(a.dst=l);const c=Ue(Ct,{message(m){const u=JSON.parse(m.data);if("error"in u){console.error("Control socket error",a,u.error),t.error=u.error.message;return}else if(u.status==="ack"){console.log("Control ack OK",u),c.close(),t.selected.clear();return}else console.log("Unknown control response",a,u)}});c.onopen=()=>{c.send(JSON.stringify(a))}};return(r,l)=>{const i=Ga,a=Dt;return w(t).selected.size?(I(),P(fe,{key:0},[l[4]||(l[4]=E("div",{class:"smallgap"},null,-1)),E("p",Ka,oe(w(t).selected.size)+" selected ➤",1),z(i),z(a,{name:"copy","data-tooltip":"Copy here",onClick:l[0]||(l[0]=c=>s("cp",o.value))}),z(a,{name:"paste","data-tooltip":"Move here",onClick:l[1]||(l[1]=c=>s("mv",o.value))}),z(a,{name:"trash","data-tooltip":"Delete ⚠️",onClick:l[2]||(l[2]=c=>s("rm"))}),E("button",{class:"action-button unselect","data-tooltip":"Unselect all",onClick:l[3]||(l[3]=c=>w(t).selected.clear())},"❌")],64)):G("",!0)}}}),Ya=["id"],Xa={key:0},Za={class:"modal-content"},jo=X({__name:"ModalDialog",props:{title:{},name:{}},setup(e,{expose:t}){const n=T(null),o=T(null),s=se(),r=()=>{s.dialog="",Po()},l=e;return t({show:()=>{s.dialog=l.name,pn(),ge(()=>{n.value?.focus();const a=o.value?.querySelector("input");a&&a.focus()})},close:r}),Ie(()=>{if(n.value){n.value.focus();const a=o.value?.querySelector("input");a&&a.focus()}}),(a,c)=>w(s).dialog===e.name?(I(),P("div",{key:0,class:"modal-overlay",onClick:de(r,["self"]),onKeydown:Qe(r,["escape"]),tabindex:"-1",ref_key:"overlay",ref:n},[E("div",{class:"modal-dialog",id:l.name,ref_key:"dialog",ref:o},[l.title?(I(),P("h1",Xa,oe(l.title),1)):G("",!0),E("div",Za,[ue(a.$slots,"default",{},()=>[c[0]||(c[0]=He(" Dialog with no content ",-1)),E("button",{onClick:r},"OK")])])],8,Ya)],544)):G("",!0)}}),Qa="/auth/password-change";async function ei(e,t,n){return await lt.post(Qa,{username:e,passwordChange:t,password:n})}const Tt="/auth/users";async function ti(){return await lt.get(Tt)}async function Zn(e,t,n){return await lt.post(Tt,{username:e,password:t,privileged:n})}async function Qn(e,t){return await lt.put(`${Tt}/${e}`,t)}async function eo(e){return await lt.delete(`${Tt}/${e}`)}async function ni(e){return await lt.put("/api/config/public",{public:e})}const oi={class:"form-grid"},si={class:"dialog-buttons"},ri=X({__name:"SettingsModal",setup(e){const t=T(!1),n=se(),o=T(),s=T(),r=et({passwordChange:"",password:""}),l=()=>{r.passwordChange="",r.password="",n.dialog=""},i=async a=>{a.preventDefault();try{if(r.passwordChange){if(!r.password){n.error="⚠️ Current password is required",s.value.focus();return}await ei(n.user.username,r.passwordChange,r.password)}l()}catch(c){const m=c;n.error=m.message||"🛑 Unknown error"}finally{t.value=!1}};return(a,c)=>{const m=jo;return I(),ee(m,{name:"settings",title:"Settings"},{default:Re(()=>[E("form",null,[w(n).user.isLoggedIn?(I(),P(fe,{key:0},[c[5]||(c[5]=E("h3",null,"Update your authentication",-1)),E("div",oi,[c[2]||(c[2]=E("label",{for:"passwordChange"},"New password:",-1)),kt(E("input",{ref_key:"passwordChange",ref:o,id:"passwordChange",type:"password",autocomplete:"new-password",spellcheck:"false",autocorrect:"off","onUpdate:modelValue":c[0]||(c[0]=u=>r.passwordChange=u)},null,512),[[Yt,r.passwordChange]]),c[3]||(c[3]=E("label",{for:"password"},"Current password:",-1)),kt(E("input",{ref_key:"password",ref:s,id:"password",name:"password",type:"password",autocomplete:"current-password",spellcheck:"false",autocorrect:"off","onUpdate:modelValue":c[1]||(c[1]=u=>r.password=u)},null,512),[[Yt,r.password]])]),E("div",si,[E("input",{id:"close",type:"reset",value:"Close",class:"button",onClick:l}),c[4]||(c[4]=E("div",{class:"spacer"},null,-1)),E("input",{id:"submit",type:"submit",value:"Submit",class:"button",onClick:de(i,["prevent"])})])],64)):(I(),P(fe,{key:1},[c[7]||(c[7]=E("p",null,"No settings are available because you have not logged in.",-1)),E("div",{class:"dialog-buttons"},[c[6]||(c[6]=E("div",{class:"spacer"},null,-1)),E("input",{id:"close",type:"reset",value:"Close",class:"button",onClick:l})])],64))])]),_:1})}}}),li=ye(ri,[["__scopeId","data-v-a4815627"]]),ai={key:0,class:"loading"},ii={key:1},ci={class:"form-row"},ui={for:"publicAccess"},di=["checked","onChange","disabled"],fi=["onClick"],pi=["onClick"],mi=["onClick","disabled"],hi=X({__name:"UserManagementModal",setup(e){const t=se(),n=T(!0),o=T([]),s=T(""),r=T("📋"),l=et({public:!1}),i=()=>{t.dialog="",s.value=""},a=async()=>{try{n.value=!0;const b=await ti();o.value=b.users}catch(b){const v=b;t.error=v.message||"Failed to load users"}finally{n.value=!1}},c=async()=>{const b=window.prompt("Enter username for new user:");if(!(!b||!b.trim()))try{s.value="";const v=await Zn(b.trim(),void 0,!1);await a(),v.password&&(s.value=`User ${b.trim()} created. Password: ${v.password}`)}catch(v){const $=v;t.error=$.message||"Failed to add user"}},m=async(b,v)=>{const $=v.target;try{await Qn(b.username,{privileged:$.checked}),b.privileged=$.checked}catch(y){const k=y;t.error=k.message||"Failed to update user",$.checked=b.privileged}},u=async b=>{const v=window.prompt("Enter new username:",b.username);if(!(!v||!v.trim()||v.trim()===b.username))try{s.value="";const $=await Zn(v.trim(),void 0,b.privileged);await eo(b.username),await a(),$.password&&(s.value=`User renamed to ${v.trim()}. New password: ${$.password}`)}catch($){const y=$;t.error=y.message||"Failed to rename user"}},p=async b=>{if(confirm(`Reset password for ${b.username}? A new password will be generated.`))try{s.value="";const v=await Qn(b.username,{password:""});v.password&&(s.value=`Password reset for ${b.username}. New password: ${v.password}`)}catch(v){const $=v;t.error=$.message||"Failed to reset password"}},f=async b=>{if(confirm(`Delete user ${b}?`))try{await eo(b),await a()}catch(v){const $=v;t.error=$.message||"Failed to delete user"}},x=async(b=!1)=>{const v=s.value.match(/(?:Password|New password): (.+)/);if(v)if(await navigator.clipboard.writeText(v[1]),b){r.value="✅ Copied!";const $=s.value.replace(/(?:Password|New password): .+/,"Password copied to clipboard!");s.value=$,setTimeout(()=>{s.value="",r.value="📋"},3e3)}else s.value=""},R=async()=>{try{s.value="",await ni(l.public),t.server.public=l.public,s.value="Server settings updated"}catch(b){const v=b;t.error=v.message||"Failed to update settings"}};return be(()=>{l.public=t.server.public||!1,n.value=!1}),ze(()=>t.dialog,b=>{b==="usermgmt"&&!t.server.paskia&&a()}),ze(()=>t.server.public,b=>{l.public=b||!1}),(b,v)=>{const $=jo;return I(),ee($,{name:"usermgmt",title:"Admin Settings"},{default:Re(()=>[n.value?(I(),P("div",ai,"Loading...")):(I(),P("div",ii,[v[8]||(v[8]=E("h3",null,"Server Settings",-1)),E("div",ci,[E("label",ui,[kt(E("input",{type:"checkbox",id:"publicAccess","onUpdate:modelValue":v[0]||(v[0]=y=>l.public=y),onChange:R},null,544),[[co,l.public]]),v[3]||(v[3]=He(" Public access (anyone can read and write) ",-1))])]),w(t).server.paskia?(I(),P(fe,{key:0},[v[4]||(v[4]=E("h3",null,"User Management",-1)),v[5]||(v[5]=E("p",null,[He("See "),E("a",{href:"/auth/admin/"},"Paskia Admin"),He(".")],-1))],64)):(I(),P(fe,{key:1},[v[7]||(v[7]=E("h3",null,"Users",-1)),E("button",{onClick:c,class:"button",title:"Add new user"},"➕ Add User"),s.value?(I(),P("div",{key:0,class:"success-message",onClick:v[2]||(v[2]=y=>x(!1))},[He(oe(s.value)+" ",1),s.value.includes("Password:")||s.value.includes("New password:")?(I(),P("button",{key:0,onClick:v[1]||(v[1]=de(y=>x(!0),["stop"])),class:"button small",title:"Copy to clipboard"},oe(r.value),1)):G("",!0)])):G("",!0),E("table",null,[v[6]||(v[6]=E("thead",null,[E("tr",null,[E("th",null,"Username"),E("th",null,"Admin"),E("th",null,"Actions")])],-1)),E("tbody",null,[(I(!0),P(fe,null,rt(o.value,y=>(I(),P("tr",{key:y.username},[E("td",null,oe(y.username),1),E("td",null,[E("input",{type:"checkbox",checked:y.privileged,onChange:k=>m(y,k),disabled:y.username===w(t).user.username},null,40,di)]),E("td",null,[E("button",{onClick:k=>u(y),class:"button small",title:"Rename user"},"✏️",8,fi),E("button",{onClick:k=>p(y),class:"button small",title:"Reset password"},"🔑",8,pi),E("button",{onClick:k=>f(y.username),class:"button small danger",disabled:y.username===w(t).user.username,title:"Delete user"},"🗑️",8,mi)])]))),128))])])],64)),E("div",{class:"dialog-buttons"},[E("button",{onClick:i,class:"button"},"Close")])]))]),_:1})}}}),vi=ye(hi,[["__scopeId","data-v-f58072c3"]]),gi={key:0,class:"modal-overlay"},yi=X({__name:"AccessDeniedModal",setup(e){const t=se(),n=()=>{location.reload()};return Ie(()=>{t.dialog==="accessdenied"&&pn()}),(o,s)=>w(t).dialog==="accessdenied"?(I(),P("div",gi,[E("div",{class:"modal-dialog",id:"accessdenied"},[E("div",{class:"modal-content access-denied"},[s[0]||(s[0]=E("p",{class:"icon"},"⛔",-1)),s[1]||(s[1]=E("p",{class:"message"},"Access Denied",-1)),E("button",{onClick:n,class:"button"},"Reload")])])])):G("",!0)}}),wi=ye(yi,[["__scopeId","data-v-eaaa3c09"]]),ki=X({__name:"App",setup(e){const t=se(),n=K(()=>{const l=decodeURIComponent(je.currentRoute.value.path).split("//"),i=(l[0]??"").split("/").filter(c=>c!==""),a=l.slice(1).join("//");return{path:l[0]??"",pathList:i,query:a}});Ie(()=>{document.title=n.value.path.replace(/\/$/,"").split("/").pop()||t.server.name||"Cista Storage"}),be(jr),be(Nt),wt(Vr);const o=T(null);let s=null;const r=l=>{if(t.dialog){s&&(clearTimeout(s),s=null);return}const i=t.fileExplorer;if(!i)return;const a=i.isCursor(),c=l.target.tagName==="INPUT",m=l.type==="keyup";if(l.repeat){(l.key==="ArrowUp"||l.key==="ArrowDown"||l.key==="ArrowLeft"||l.key==="ArrowRight"||a&&l.code==="Space")&&(c||l.preventDefault());return}let u="";if(!c&&l.key.startsWith("Arrow"))u=l.key.slice(5).toLowerCase();else if(!m&&l.key==="f"&&(l.ctrlKey||l.metaKey))o.value.toggleSearchInput();else if(!c&&m&&l.key==="/")o.value.toggleSearchInput();else if(m&&l.key==="Escape")t.error="",o.value.closeSearch(l),t.focusBreadcrumb();else if(!c&&m&&l.key==="Backspace")je.back();else if(!c&&!m&&l.key==="a"&&(l.ctrlKey||l.metaKey))i.toggleSelectAll();else if(!c&&m&&l.key==="g")t.prefs.gallery=!t.prefs.gallery;else if(!c&&m&&(l.code==="Backquote"||l.key==="1"||l.key==="2"||l.key==="3"))t.sort(["","name","modified","size"][+l.key||0]);else if(!c&&a&&m&&!l.ctrlKey&&(l.key==="F2"||l.key==="r"))i.cursorRename();else if(!c&&a&&l.code==="Space")m&&!l.altKey&&!l.ctrlKey&&i.cursorSelect();else return;l.preventDefault(),s&&(clearTimeout(s),s=null);let p;switch(u){case"up":p=()=>i.up(l);break;case"down":p=()=>i.down(l);break;case"left":p=()=>i.left(l);break;case"right":p=()=>i.right(l);break}if(p&&!m){const x=l.altKey?20:100;p(),s=setTimeout(()=>{s=setInterval(p,x)},200-x)}};return be(()=>{window.addEventListener("keydown",r),window.addEventListener("keyup",r)}),wt(()=>{window.removeEventListener("keydown",r),window.removeEventListener("keyup",r)}),(l,i)=>{const a=li,c=Ja,m=Va,u=hn,p=xs;return I(),P(fe,null,[w(t).error&&!w(t).authInProgress?(I(),P("div",{key:0,class:"toast-message",onClick:i[0]||(i[0]=f=>w(t).error="")},oe(w(t).error),1)):G("",!0),z(a),z(vi),z(wi),E("header",null,[z(m,{ref_key:"headerMain",ref:o,path:n.value.pathList,query:n.value.query},{default:Re(()=>[z(c,{path:n.value.pathList},null,8,["path"])]),_:1},8,["path","query"]),z(u,{path:n.value.pathList,primary:""},null,8,["path"])]),E("main",null,[z(w(Ao),{path:n.value.pathList,query:n.value.query},null,8,["path","query"])]),E("footer",null,[z(p,{status:w(t).uprogress,onCancel:w(t).cancelUploads,class:"upload"},null,8,["status","onCancel"]),z(p,{status:w(t).dprogress,onCancel:w(t).cancelDownloads,class:"download"},null,8,["status","onCancel"])])],64)}}});function bi(e,t){if(e==null)return;let n=e;for(let o=0;o<t.length;o++){if(n===void 0||n[t[o]]===void 0)return;if(n===null||n[t[o]]===null)return null;n=n[t[o]]}return n}function wn(e,t,n){if(n.length===0)return t;const o=n[0];return n.length>1&&(t=wn(typeof e!="object"||e===null||!Object.prototype.hasOwnProperty.call(e,o)?Number.isInteger(Number(n[1]))?[]:{}:e[o],t,Array.prototype.slice.call(n,1))),Number.isInteger(Number(o))&&Array.isArray(e)?e.slice()[o]:Object.assign({},e,{[o]:t})}function Vo(e,t){if(e==null||t.length===0)return e;if(t.length===1){if(e==null)return e;if(Number.isInteger(t[0])&&Array.isArray(e))return Array.prototype.slice.call(e,0).splice(t[0],1);const n={};for(const o in e)n[o]=e[o];return delete n[t[0]],n}if(e[t[0]]==null){if(Number.isInteger(t[0])&&Array.isArray(e))return Array.prototype.concat.call([],e);const n={};for(const o in e)n[o]=e[o];return n}return wn(e,Vo(e[t[0]],Array.prototype.slice.call(t,1)),[t[0]])}function qo(e,t){return t.map(n=>n.split(".")).map(n=>[n,bi(e,n)]).filter(n=>n[1]!==void 0).reduce((n,o)=>wn(n,o[1],o[0]),{})}function Go(e,t){return t.map(n=>n.split(".")).reduce((n,o)=>Vo(n,o),e)}function to(e,{storage:t,serializer:n,key:o,debug:s,pick:r,omit:l,beforeHydrate:i,afterHydrate:a},c,m=!0){try{m&&i?.(c);const u=t.getItem(o);if(u){const p=n.deserialize(u),f=r?qo(p,r):p,x=l?Go(f,l):f;e.$patch(x)}m&&a?.(c)}catch(u){s&&console.error("[pinia-plugin-persistedstate]",u)}}function no(e,{storage:t,serializer:n,key:o,debug:s,pick:r,omit:l}){try{const i=r?qo(e,r):e,a=l?Go(i,l):i,c=n.serialize(a);t.setItem(o,c)}catch(i){s&&console.error("[pinia-plugin-persistedstate]",i)}}function Ci(e,t){return typeof e=="function"?e(t):typeof e=="string"?e:t}function Si(e,t,n){const{pinia:o,store:s,options:{persist:r=n}}=e;if(!r)return;if(!(s.$id in o.state.value)){const i=o._s.get(s.$id.replace("__hot:",""));i&&Promise.resolve().then(()=>i.$persist());return}const l=(Array.isArray(r)?r:r===!0?[{}]:[r]).map(t);s.$hydrate=({runHooks:i=!0}={})=>{l.forEach(a=>{to(s,a,e,i)})},s.$persist=()=>{l.forEach(i=>{no(s.$state,i)})},l.forEach(i=>{to(s,i,e),s.$subscribe((a,c)=>no(c,i),{detached:!0})})}function xi(e={}){return function(t){Si(t,n=>{const o=Ci(n.key,t.store.$id);return{key:(e.key?e.key:s=>s)(o),debug:n.debug??e.debug??!1,serializer:n.serializer??e.serializer??{serialize:s=>JSON.stringify(s),deserialize:s=>JSON.parse(s)},storage:n.storage??e.storage??window.localStorage,beforeHydrate:n.beforeHydrate??e.beforeHydrate,afterHydrate:n.afterHydrate??e.afterHydrate,pick:n.pick,omit:n.omit}},e.auto??!1)}}var _i=xi();const St=us(ki);St.config.errorHandler=e=>{console.log(e)};const Ko=ds();Ko.use(_i);St.use(Ko);St.use(je);St.use(Lt);St.mount("#app");
|
|
32
|
+
`;let Le=null,Fe=null,Ye=null,Xe=null,Un=!1,Et=0;function Dr(){if(document.getElementById(zn))return;const e=document.createElement("style");e.id=zn,e.textContent=Nr,document.head.insertBefore(e,document.head.firstChild)}class Ze extends Error{constructor(){super("Authentication cancelled"),this.name="AuthCancelledError"}}function pn(){Et++,document.body.classList.add("paskia-backdrop")}function Po(){Et=Math.max(0,Et-1),Et===0&&document.body.classList.remove("paskia-backdrop")}function Lr(){return!!document.getElementById(At)}function on(){Le&&(Le.remove(),Le=null,Po())}function Tr(e){const t=e.data;if(t?.type)switch(t.type){case"auth-success":on(),Ye&&(Ye(),Fe=null,Ye=null,Xe=null);break;case"auth-back":on(),Xe&&(Xe(new Ze),Fe=null,Ye=null,Xe=null);break}}function Br(){Un||typeof window<"u"&&(window.addEventListener("message",Tr),Un=!0)}function mn(e,t="Authentication"){return Dr(),Br(),Fe||(document.getElementById(At)?(Fe=new Promise((n,o)=>{Ye=n,Xe=o}),Fe):(Fe=new Promise((n,o)=>{Ye=n,Xe=o}),on(),pn(),Le=document.createElement("iframe"),Le.id=At,Le.title=t,Le.src=e,document.body.appendChild(Le),Fe))}const Fr=1e3;class Hr extends Error{constructor(t,n,o){super(o?.detail||`Request failed: ${n.status}`),this.name="ApiError",this.url=t,this.status=n.status,this.statusText=n.statusText,this.data=o}}class Vt extends Error{constructor(t,n=null){super(t),this.name="NetworkError",this.originalError=n}}async function Oo(e,t={}){const{timeout:n=Fr,...o}=t;for(o.credentials=o.credentials||"include";;){let s;try{s=await fetch(e,{...o,signal:n?AbortSignal.timeout(n):void 0})}catch(r){const l=r;throw l.name==="TimeoutError"?new Vt("Request timed out",l):l.name==="AbortError"?r:l.name==="TypeError"&&l.message==="Failed to fetch"?new Vt("Unable to connect to server",l):new Vt(l.message||"Network error",l)}if(s.status===401||s.status===403){let r=null;try{r=await s.clone().json()}catch{}if(r?.auth?.iframe&&window===window.top){await mn(r.auth.iframe);continue}}return s}}async function xt(e,t={}){return Wr(e,t,Oo)}async function Wr(e,t={},n=fetch){const o={Accept:"application/json",...t.headers};let s;t.body&&typeof t.body=="object"&&!(t.body instanceof FormData)?(o["Content-Type"]="application/json",s=JSON.stringify(t.body)):s=t.body;const r={...t,headers:o,body:s},l=await n(e,r),i=await l.json();if(!l.ok)throw new Hr(e,l,i);return i}const Ct="/api/control",zr="/api/upload",Ur="/api/watch";let Se=[],Rt=500,mt=null,ht=!1;const No=()=>{Se=[]},jr=()=>{const e=localStorage["cista-files"];if(!e)return!1;const t=se();try{return Se=JSON.parse(e),t.updateRoot(Se),console.log(`Loaded session with ${Se.length} items cached`),!0}catch(n){return console.log("Loading session failed",n),!1}},Do=()=>{localStorage["cista-files"]=JSON.stringify(Se)},Ue=(e,t)=>{const n=new WebSocket(new URL(e,location.origin.replace(/^http/,"ws")));for(const[o,s]of Object.entries(t))n.addEventListener(o,s);return n};async function Lo(e){const t=e.error?.auth?.iframe;if(t){const n=se();n.clearSensitiveData(),No(),ht=!0,n.authInProgress=!0,n.error="",Ce!==null&&(clearTimeout(Ce),Ce=null);try{await mn(t),ht=!1,n.authInProgress=!1,Nt()}catch(o){ht=!1,n.authInProgress=!1,o instanceof Ze?(console.log("User cancelled authentication"),n.dialog="accessdenied"):console.error("Auth iframe error:",o)}return!0}return!1}const Nt=()=>{Ce!==null&&(clearTimeout(Ce),Ce=null);const e=se();e.error!=="Reconnecting..."&&(e.error="Connecting..."),console.log(e.error),mt=Ue(Ur,{message:Gr,close:qr}),mt.addEventListener("message",t=>{if(e.connected)return;const n=JSON.parse(t.data);if("error"in n){n.error.code===401||n.error.code===403?Lo(n):e.error=n.error.message;return}"server"in n&&(console.log("Connected to backend",n),e.server=n.server,e.connected=!0,Rt=500,e.error="",n.user?e.login(n.user.username,n.user.privileged):e.isUserLogged&&e.logout())})},Vr=()=>{mt&&(mt.close(),mt=null)},sn=()=>{ht=!1,Ce!==null&&(clearTimeout(Ce),Ce=null),Nt()};let Ce=null;const qr=e=>{const t=se();if(ht||Lr()){console.log("Skipping reconnect - awaiting authentication");return}t.connected&&(console.warn("Disconnected from server",e),t.connected=!1,t.error="Reconnecting..."),Ce!==null&&clearTimeout(Ce),Rt=Math.min(5e3,Rt+500),Ce=setTimeout(Nt,Rt)},Gr=e=>{const t=JSON.parse(e.data);switch(!0){case!!t.root:Kr(t);break;case!!t.update:Jr(t);break;case!!t.space:console.log("Watch space",t.space);break;case!!t.error:Yr(t);break}};function Kr({root:e}){const t=se();console.log("Watch root",e),t.updateRoot(e),Se=e,Do()}function Jr(e){const t=se(),n=e.update;if(console.log("Watch update",n),!Se)return console.error("Watch update before root");let o=[],s=0;for(const[r,l]of n)r==="k"?(o.push(...Se.slice(s,s+l)),s+=l):r==="d"?s+=l:r==="i"?o.push(...l):console.log("Unknown update action",r,l);if(s!=Se.length)throw Error(`Tree update out of sync, number of entries mismatch: got ${s}, expected ${Se.length}, new tree ${o.length}`);t.updateRoot(o),Se=o,Do()}function Yr(e){if(se(),e.error.code===401||e.error.code===403){Lo(e);return}}const To={name:(e,t)=>st.compare(e.name,t.name),modified:(e,t)=>t.mtime-e.mtime,size:(e,t)=>t.size-e.size},Bo=(e,t)=>{if(!t)return e;const n=[...e];return n.sort(To[t]),n},Xr=(e,t)=>{if(!t)return e;const n=To[t],o=new Map;for(const i of e){const a=i.loc;o.has(a)||o.set(a,[]),o.get(a).push(i)}for(const i of o.values())i.sort(n);const s=new Map;for(const[i,a]of o)s.set(i,a[0]);const r=[...o.keys()].sort((i,a)=>t==="name"?st.compare(i,a):n(s.get(i),s.get(a))),l=[];for(const i of r)l.push(...o.get(i));return l},se=ho("main",{state:()=>({document:[],selected:new Set([]),query:"",fileExplorer:null,error:"",connected:!1,authInProgress:!1,cursor:"",server:{},dialog:"",uprogress:{},dprogress:{},prefs:{gallery:!1,sortListing:"",sortFiltered:""},user:{username:"",privileged:!1,isLoggedIn:!1}}),persist:{pick:["prefs","cursor","selected"],serializer:{deserialize:e=>{const t=JSON.parse(e);return t.selected=new Set(t.selected),t},serialize:e=>(e.selected=Array.from(e.selected),JSON.stringify(e))}},actions:{updateRoot(e){const t=[];let n=[];for(const[o,s,r,l,i,a]of e)n=n.slice(0,o-1),t.push(new fn({name:s,loc:o?n.join("/"):"/",key:r,size:i,mtime:l,dir:!a})),n.push(s);this.document=t},login(e,t){this.user.username=e,this.user.privileged=t,this.user.isLoggedIn=!0,this.dialog="",this.connected||sn()},clearSensitiveData(){localStorage.removeItem("cista-files"),this.document=[],this.selected.clear(),this.user.username="",this.user.privileged=!1,this.user.isLoggedIn=!1,this.connected=!1,this.dialog="",this.cursor=""},async logout(){console.log("Logout");try{const e=await fetch("/auth/api/logout",{method:"POST"});if(!e.ok){const t=await e.json().catch(()=>({}));this.error=t.message||t.detail||"Logout failed";return}}catch{this.error="Logout failed";return}this.clearSensitiveData(),sn()},toggleSort(e){this.query?this.prefs.sortFiltered=this.prefs.sortFiltered===e?"":e:this.prefs.sortListing=this.prefs.sortListing===e?"":e},sort(e){this.query?this.prefs.sortFiltered=e:this.prefs.sortListing=e},focusBreadcrumb(){document.querySelector(".breadcrumb").focus()},cancelDownloads(){location.reload()},cancelUploads(){location.reload()}},getters:{sortOrder(){return this.query?this.prefs.sortFiltered:this.prefs.sortListing},isUserLogged(){return this.user.isLoggedIn},recentDocuments(){return Bo(this.document,"modified")},selectedFiles(){const e=this.selected,t=new Set,n={missing:new Set,docs:{},keys:[],recursive:[]};for(const r of this.document)e.has(r.key)&&(t.add(r.key),n.keys.push(r.key),n.docs[r.key]=r);for(const r of e)t.has(r)||n.missing.add(r);const o=new Set;function s(r,l,i){if(!i.dir&&o.has(r))throw Error(`Multiple selections conflict for: ${r}`);o.add(r),n.recursive.push([r,l,i])}for(const r of n.keys){const l=n.docs[r],i=l.loc?`${l.loc}/${l.name}`:l.name,a=l.loc.length;s(l.name,i,l);for(const c of this.document)if(c.loc===i||c.loc.startsWith(i)&&c.loc[i.length]==="/"){const m=c.loc?`${c.loc}/${c.name}`:c.name,u=m.slice(a);s(u,m,c)}}return n.recursive.sort((r,l)=>st.compare(r[0],l[0])),n}}}),Fo=e=>{const t=se(),n=e.join("/");return t.document.some(o=>(o.loc?`${o.loc}/${o.name}`:o.name)===n)},Zr=["aria-current"],Qr=["href","aria-current","onClick","title"],hn=X({__name:"BreadCrumb",props:{path:{},primary:{type:Boolean}},setup(e){const t=os,n=un(),o=[],s=(u,p)=>{p&&(o[u]=p)};ns(()=>{o.length=1});const r=e,l=T([]),i=u=>u==r.path.length?"location":void 0,a=()=>{ge(()=>{const u=r.path.length;u<o.length&&o[u].focus()})},c=u=>{if(!o[u])throw Error(`No link at index ${u} (path: ${r.path})`);const f=u?`/${l.value.slice(0,u).join("/")}/`:"/",x=l.value.length?`/${l.value.join("/")}/`:"/",R=decodeURIComponent(location.hash.slice(1).split("//")[0]??""),b=f.replaceAll("?","%3F").replaceAll("#","%23");i(u)?(l.value.splice(u),n.push(b)):x.startsWith(R)?n.replace(b):n.push(b)},m=u=>{const p=r.path.length+u;p<0||p>l.value.length||c(p)};return Ie(()=>{const u=l.value.slice(0,r.path.length);if(!u.every((f,x)=>f===r.path[x]))l.value=r.path;else if(r.path.length>u.length)l.value=u.concat(r.path.slice(u.length));else for(let f=r.path.length;f<l.value.length;++f)if(!Fo(l.value.slice(0,f+1))){l.value=l.value.slice(0,f);break}r.primary&&ge(()=>{const f=document.activeElement;(!f||[...o,document.body].includes(f))&&a()})}),(u,p)=>(I(),P("nav",{class:"breadcrumb","aria-label":"Breadcrumb",onKeydown:[p[1]||(p[1]=Qe(de(f=>m(-1),["stop"]),["left"])),p[2]||(p[2]=Qe(de(f=>m(1),["stop"]),["right"]))],onKeyup:p[3]||(p[3]=Qe(f=>m(0),["enter"])),onFocus:a,tabindex:"0"},[E("a",{href:"#/",ref:f=>s(0,f),class:me(["home",{current:!!i(0)}]),"aria-current":i(0),onClick:p[0]||(p[0]=de(f=>c(0),["prevent"])),title:"/"},[(I(),ee(an(w(t))))],10,Zr),(I(!0),P(fe,null,rt(l.value,(f,x)=>(I(),P("a",{key:x,href:`/#/${l.value.slice(0,x+1).join("/")}/`,class:me({current:!!i(x+1)}),"aria-current":i(x+1),onClick:de(R=>c(x+1),["prevent"]),ref_for:!0,ref:R=>s(x+1,R),title:`/${l.value.slice(0,x+1).join("/")}`},oe(f),11,Qr))),128))],32))}}),el={class:"action-button"},Dt=X({__name:"SvgButton",props:{name:{}},setup(e){return(t,n)=>(I(),P("button",el,[(I(),ee(an(w(ss)[e.name]))),ue(t.$slots,"default")]))}}),tl=X({__name:"UploadButton",props:{path:Array},setup(e){const t=T(),n=T(),o=se(),s=e;function r(k){const h=Array.from(k.clipboardData?.items??[]),g=[],C=[];for(const S of h){if(S.kind!=="file")continue;const A=S.webkitGetAsEntry();if(A?.isFile){const D=S.getAsFile();D&&g.push(D)}else A?.isDirectory&&C.push(A)}if(g.length||C.length){k.preventDefault(),a(g);for(const S of C)l(S,`${s.path.join("/")}/${S.name}`)}}const l=async(k,h)=>{const g=k.createReader(),C=await new Promise(A=>g.readEntries(A)),S=[];for(const A of C){const D=`${h}/${A.name}`;if(A.isFile){const J=await new Promise(Y=>A.file(Y));S.push({file:J,cloudName:D,cloudPos:0})}else A.isDirectory&&await l(A,D)}S.length&&c(S)};function i(k){k.preventDefault();const h=k.target,g=Array.from((h??k.dataTransfer)?.files??[]);h&&(h.value=""),g.length&&a(g)}const a=k=>{const h=s.path.join("/");let g=[];for(const C of k)g.push({file:C,cloudName:h+"/"+(C.webkitRelativePath||C.name),cloudPos:0});c(g)},c=k=>{const h=k.filter(g=>g.cloudName.includes("/."));h.length&&(o.error="Won't upload dotfiles",console.log("Dotfiles omitted",h),k=k.filter(g=>!g.cloudName.includes("/."))),k.length&&(k.sort((g,C)=>st.compare(g.cloudName,C.cloudName)),R=[...R,...k],x(k),y())},m={total:0,xfer:0,t0:0,tlast:0,statbytes:0,statdur:0,files:[],filestart:0,fileidx:0,filecount:0,filename:"",filesize:0,filepos:0,status:"idle"};o.uprogress={...m},setInterval(()=>{Date.now()-o.uprogress.tlast>3e3?(o.uprogress.statbytes=0,o.uprogress.statdur=1):(o.uprogress.statbytes*=.9,o.uprogress.statdur*=.9)},100);const u=({name:k,size:h,start:g,end:C})=>{if(k!==o.uprogress.filename)return;const S=Date.now();o.uprogress.xfer=o.uprogress.filestart+C,o.uprogress.filepos=C,o.uprogress.statbytes+=C-g,o.uprogress.statdur+=S-o.uprogress.tlast,o.uprogress.tlast=S,C===h&&(o.uprogress.filestart+=h,p(),++o.uprogress.fileidx>=o.uprogress.filecount&&f())},p=()=>{const k=o.uprogress.files.shift();if(!k)return f();o.uprogress.filepos=0,o.uprogress.filesize=k.file.size,o.uprogress.filename=k.cloudName},f=()=>{Object.assign(o.uprogress,m),o.uprogress.t0=Date.now(),o.uprogress.tlast=o.uprogress.t0+1},x=k=>{o.uprogress.files.length===0&&f(),o.uprogress.total+=k.reduce((h,g)=>h+g.file.size,0),o.uprogress.filecount+=k.length,o.uprogress.files=[...o.uprogress.files,...k],p()};let R=[];const b=async()=>await new Promise(k=>{const h=Ue(zr,{open(g){k(h)},error(g){console.error("Upload socket error",g),o.error="Upload socket error"},message(g){const C=JSON.parse(g.data);if("error"in C){console.error("Upload socket error",C.error),o.error=C.error.message;return}C.status==="ack"?u(C.req):console.log("Unknown upload response",C)}});h.sendMsg=g=>h.send(JSON.stringify(g)),h.sendData=async g=>{o.uprogress.status="uploading",await new Promise(C=>{const S=setInterval(()=>{h.bufferedAmount>1048576||(C(void 0),clearInterval(S))},1)}),o.uprogress.status="processing",h.send(g)}}),v=async()=>{const k=await b();for(;R.length;){const h=R[0],g=h.cloudPos,C=Math.min(h.file.size,g+(1<<20)),S={name:h.cloudName,size:h.file.size,start:g,end:C},A=h.file.slice(g,C);h.cloudPos=C,k.sendMsg(S),await k.sendData(A),h.cloudPos===h.file.size&&R.shift()}R.length&&y(),o.uprogress.status="idle",$=!1};let $=!1;const y=()=>{$===!1&&($=setTimeout(()=>{$=!0,v()},0))};return be(()=>{addEventListener("dragover",i),addEventListener("drop",i),addEventListener("paste",r)}),wt(()=>{removeEventListener("paste",r),removeEventListener("dragover",i),removeEventListener("drop",i)}),(k,h)=>{const g=Dt;return I(),P(fe,null,[E("template",null,[E("input",{ref_key:"fileInput",ref:t,onChange:i,type:"file",multiple:""},null,544),E("input",{ref_key:"folderInput",ref:n,onChange:i,type:"file",webkitdirectory:""},null,544)]),z(g,{name:"add-file","data-tooltip":"Upload files",onClick:h[0]||(h[0]=C=>t.value.click())}),z(g,{name:"add-folder","data-tooltip":"Upload folder",onClick:h[1]||(h[1]=C=>n.value.click())})],64)}}}),nl=ho("ssoAuth",()=>{const e=K(()=>se().server?.paskia===!0);function t(){se().clearSensitiveData(),No()}return{isExternalAuth:e,clearDataOnUnauth:t}});let Te=null;function ol(){return Te!==null}function sl(e){Te&&Ho(),Te=e}function jn(e){e===Te&&(Te=null)}function Ho(){Te&&(Te.closeMenu(),Te=null)}const Ee={defaultDirection:"br",defaultMinWidth:100,defaultMaxWidth:600,defaultZindex:100,defaultZoom:1,defaultAdjustPadding:{x:0,y:10}};function vt(e,t){let n=e.offsetTop;return e.offsetParent!=null&&e.offsetParent!=t&&(n-=e.offsetParent.scrollTop,n+=vt(e.offsetParent,t)),n}function gt(e,t){let n=e.offsetLeft;return e.offsetParent!=null&&e.offsetParent!=t&&(n-=e.offsetParent.scrollLeft,n+=gt(e.offsetParent,t)),n}function rl(e,t,n,o){return{x:gt(e,o)+t,y:vt(e,o)+n}}const qt="mx-menu-default-container",ll="mx-menu-container-";let al=0;function Wo(e){const{getContainer:t,zIndex:n}=e;if(t){const s=typeof t=="function"?t():t;if(s){let r=s.getAttribute("id");return r||(r=ll+al++,s.setAttribute("id",r)),{eleId:r,container:s,isNew:!1}}}let o=document.getElementById(qt);return o||(o=document.createElement("div"),o.setAttribute("id",qt),o.setAttribute("class","mx-menu-ghost-host fullscreen"),document.body.appendChild(o)),o.style.zIndex=n?.toString()||Ee.defaultZindex.toString(),{eleId:qt,container:o,isNew:!0}}function il(e){let t=0;for(let n=0;n<e.length;n++){const o=e.charCodeAt(n);t=(t<<5)-t+o,t|=0}return t}function Vn(e){return typeof e=="number"?`${e}px`:e}const _e=X({props:{vnode:{type:null},data:{type:null,default:null}},setup(e){const{vnode:t,data:n}=Ve(e);return()=>typeof t.value=="function"?t.value(n.value):t.value}});function cl(e,t){const n={...e};return delete n[t],n}var ul=Object.defineProperty,dl=(e,t,n)=>t in e?ul(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,qn=(e,t,n)=>dl(e,typeof t!="symbol"?t+"":t,n);class Gn{constructor(t,n){qn(this,"x",0),qn(this,"y",0),this.x=t||0,this.y=n||0}set(t,n){this.x=t,this.y=n}substract(t){this.x-=t.x,this.y-=t.y}}function Kn(e){const{onDown:t,onMove:n,onUp:o}=e,s=new Gn,r=new Gn;let l;function i(c){c.stopPropagation(),r.set(c.x,c.y),r.substract(s),n(s,r,c,l)}function a(c){o(c,l),s.set(0,0),document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",a)}return(c,m)=>t(c,m)?(l=m,s.set(c.x,c.y),document.addEventListener("mousemove",i),document.addEventListener("mouseup",a),c.stopPropagation(),!0):!1}function fl(e,t){let n=0;return{start(){n>0&&clearInterval(n),n=setInterval(()=>{n=0,t()},e)},stop(){n>0&&(clearInterval(n),n=0)}}}const dt=[],Jn=fl(100,()=>{for(const e of dt)e()});function pl(e,t,n,o){let s=0,r=0;function l(){e.value&&(t&&s!==e.value.offsetWidth&&t(e.value.offsetWidth),n&&r!==e.value.offsetHeight&&n(e.value.offsetHeight),s=e.value.offsetWidth,r=e.value.offsetHeight)}return{startResizeChecker(){Jn.start(),dt.push(l)},stopResizeChecker(){const i=dt.indexOf(l);i>=0&&dt.splice(i,1),dt.length===0&&Jn.stop()}}}const Yn=140,ml=70,hl=X({__name:"ScrollRect",props:{scroll:{type:String,default:"both"},scrollBarAlwaysShow:{type:Boolean,default:!1},scrollBarBackgroundClickable:{type:Boolean,default:!1},height:{type:Number,default:void 0},width:{type:Number,default:void 0},maxHeight:{type:Number,default:void 0},maxWidth:{type:Number,default:void 0},containerClass:{type:String,default:""},containerStyle:{type:null}},emits:["scroll","resized"],setup(e,{expose:t,emit:n}){const o=e,s=n,r=T(),l=T(),i=T(),a=T(),c=T(),m=T(),u=T(!1),p=K(()=>o.scroll==="horizontal"||o.scroll==="both"),f=K(()=>o.scroll==="vertical"||o.scroll==="both"),x=et({show:!1,size:0,sizeRaw:0,pos:0}),R=et({show:!1,size:0,sizeRaw:0,pos:0});let b=0,v=0,$=0,y=0,k=null;const h={attributes:!0,childList:!0};function g(){if(r.value){if(x.show){const _=r.value.offsetWidth/r.value.scrollWidth;x.sizeRaw=_*r.value.offsetWidth,x.size=_*100,x.pos=r.value.scrollLeft/(r.value.scrollWidth-r.value.offsetWidth)*(100-x.size),_>=1&&(x.show=!1)}if(R.show){const _=r.value.offsetHeight/r.value.scrollHeight;R.sizeRaw=_*r.value.offsetHeight,R.size=_*100,R.pos=r.value.scrollTop/(r.value.scrollHeight-r.value.offsetHeight)*(100-R.size),_>=1&&(R.show=!1)}s("scroll",r.value.scrollLeft,r.value.scrollTop)}}function C(_=!1){if(!r.value)return;let B=p.value,d=f.value;const O=B&&(b!==r.value.scrollWidth||$!==r.value.offsetWidth),M=f&&(v!==r.value.scrollHeight||y!==r.value.offsetHeight);if(!_&&!O&&!M)return;const N=window.getComputedStyle(r.value);(N.overflow==="hidden"||N.overflowX==="hidden")&&(B=!1),(N.overflow==="hidden"||N.overflowY==="hidden")&&(d=!1),x.show=B,R.show=d,g(),$=r.value.offsetWidth,y=r.value.offsetHeight,b=r.value.scrollWidth,v=r.value.scrollHeight,s("resized",b,v)}function S(_){var B;o.scroll=="horizontal"&&(_.deltaMode==0&&((B=r.value)==null||B.scrollTo({left:r.value.scrollLeft+(_.deltaY>0?Yn:-140),behavior:"smooth"})),_.preventDefault(),_.stopPropagation())}function A(_){var B;_.deltaMode==0&&((B=r.value)==null||B.scrollTo({left:r.value.scrollLeft+(_.deltaY>0?Yn:-140),behavior:"smooth"}),_.preventDefault(),_.stopPropagation())}function D(_){var B;_.deltaMode==0&&((B=r.value)==null||B.scrollTo({top:r.value.scrollTop+(_.deltaY>0?ml:-70),behavior:"smooth"}),_.preventDefault(),_.stopPropagation())}let J=0,Y=0,F=0,H=0;const U=Kn({onDown(_){return!i.value||!c.value?!1:(J=_.offsetX,Y=_.x-_.offsetX-c.value.offsetLeft,_.preventDefault(),u.value=!0,!0)},onMove(_,B,d){r.value&&i.value&&(we(d.x-J-Y),d.preventDefault(),d.stopPropagation())},onUp(){u.value=!1}}),Z=Kn({onDown(_){return!a.value||!m.value?!1:(F=_.offsetY,H=_.y-_.offsetY-m.value.offsetTop,_.preventDefault(),u.value=!0,!0)},onMove(_,B,d){r.value&&a.value&&(ke(d.y-F-H),d.preventDefault(),d.stopPropagation())},onUp(){u.value=!1}});function q(_){r.value&&(r.value.scrollLeft=_/100*(r.value.scrollWidth-r.value.offsetWidth))}function ie(_){r.value&&(r.value.scrollLeft=_/100*(r.value.scrollHeight-r.value.offsetHeight))}function we(_){r.value&&(r.value.scrollLeft=_/(r.value.offsetWidth-x.sizeRaw)*(r.value.scrollWidth-r.value.offsetWidth))}function ke(_){r.value&&(r.value.scrollTop=_/(r.value.offsetHeight-R.sizeRaw)*(r.value.scrollHeight-r.value.offsetHeight))}function te(_){o.scrollBarBackgroundClickable&&we(_.offsetX-x.sizeRaw/2)}function Ae(_){o.scrollBarBackgroundClickable&&ke(_.offsetY-R.sizeRaw/2)}const{startResizeChecker:Me,stopResizeChecker:L}=pl(r,()=>C(),()=>C());return be(()=>{ge(()=>{setTimeout(()=>C(!0),200),C(!0),Me(),k=new MutationObserver(()=>C()),k.observe(r.value,h)})}),$t(()=>{L(),k&&(k.disconnect(),k=null)}),t({refreshScrollState(){C(!0)},getScrollContainer(){return r.value},scrollTo(_,B){var d;(d=r.value)==null||d.scrollTo(_,B)},scrollToTop(){var _;(_=r.value)==null||_.scrollTo(0,0)},scrollToBottom(){var _;(_=r.value)==null||_.scrollTo(r.value.scrollWidth,r.value.scrollHeight)}}),(_,B)=>(I(),P("div",{ref_key:"scrollrect",ref:l,class:me(["vue-scroll-rect",e.scrollBarAlwaysShow?"always-show-scrollbar":"",e.scrollBarBackgroundClickable?"background-clickable":"",u.value?"dragging":""]),style:Je({width:e.width?`${e.width}px`:void 0,height:e.height?`${e.height}px`:void 0}),onWheel:S},[E("div",{ref_key:"container",ref:r,class:me(["scroll-content",e.scroll,e.containerClass]),style:Je({maxWidth:e.maxWidth?`${e.maxWidth}px`:void 0,maxHeight:e.maxHeight?`${e.maxHeight}px`:void 0,...e.containerStyle}),onScroll:g},[ue(_.$slots,"default")],38),x.show?ue(_.$slots,"scrollBarX",{key:0,scrollBarValue:x,onScroll:q},()=>[E("div",{ref_key:"scrollBarRefX",ref:i,class:"scrollbar horizontal",onClick:te,onWheel:A},[E("div",{class:"thumb",ref_key:"scrollBarThumbRefX",ref:c,style:Je({left:`${x.pos}%`,width:`${x.size}%`}),onMousedown:B[0]||(B[0]=(...d)=>w(U)&&w(U)(...d)),onWheel:A},null,36)],544)]):G("",!0),R.show?ue(_.$slots,"scrollBarY",{key:1,scrollBarValue:R,onScroll:ie},()=>[R.show?(I(),P("div",{key:0,ref_key:"scrollBarRefY",ref:a,class:"scrollbar vertical",onClick:Ae,onWheel:D},[E("div",{class:"thumb",ref_key:"scrollBarThumbRefY",ref:m,style:Je({top:`${R.pos}%`,height:`${R.size}%`}),onMousedown:B[1]||(B[1]=(...d)=>w(Z)&&w(Z)(...d)),onWheel:D},null,36)],544)):G("",!0)]):G("",!0)],38))}}),vn=(e,t)=>{const n=e.__vccOpts||e;for(const[o,s]of t)n[o]=s;return n},vl={},gl={class:"mx-checked-mark","aria-hidden":"true",viewBox:"0 0 1024 1024"},yl=E("path",{d:"M129.3,428.6L52,512l345,372.5l575-620.8l-69.5-75L400.4,718.2L129.3,428.6z"},null,-1),wl=[yl];function kl(e,t){return I(),P("svg",gl,wl)}const bl=vn(vl,[["render",kl]]),Cl={},Sl={class:"mx-right-arrow","aria-hidden":"true",viewBox:"0 0 1024 1024"},xl=E("path",{d:"M307.018 49.445c11.517 0 23.032 4.394 31.819 13.18L756.404 480.18c8.439 8.438 13.181 19.885 13.181 31.82s-4.741 23.38-13.181 31.82L338.838 961.376c-17.574 17.573-46.065 17.573-63.64-0.001-17.573-17.573-17.573-46.065 0.001-63.64L660.944 512 275.198 126.265c-17.574-17.573-17.574-46.066-0.001-63.64C283.985 53.839 295.501 49.445 307.018 49.445z"},null,-1),_l=[xl];function El(e,t){return I(),P("svg",Sl,_l)}const Rl=vn(Cl,[["render",El]]),Il={class:"mx-item-row"},Al=["xlink:href"],$l={key:1,class:"label"},Ml={class:"mx-item-row"},Pl={class:"mx-shortcut"},gn=X({__name:"ContextMenuItem",props:{disabled:{type:Boolean,default:!1},hidden:{type:Boolean,default:!1},customRender:{type:Function,default:null},customClass:{type:String,default:""},clickHandler:{type:Function,default:null},label:{type:[String,Object,Function],default:""},icon:{type:[String,Object,Function],default:""},iconFontClass:{type:String,default:"iconfont"},checked:{type:Boolean,default:!1},shortcut:{type:String,default:""},svgIcon:{type:String,default:""},svgProps:{type:Object,default:null},preserveIconWidth:{type:Boolean,default:!0},showRightArrow:{type:Boolean,default:!1},hasChildren:{type:Boolean,default:!1},clickClose:{type:Boolean,default:!0},clickableWhenHasChildren:{type:Boolean,default:!1},rawMenuItem:{type:Object,default:void 0}},emits:["click","subMenuOpen","subMenuClose"],setup(e,{expose:t,emit:n}){const o=e,s=n,{clickHandler:r,clickClose:l,clickableWhenHasChildren:i,disabled:a,hidden:c,label:m,icon:u,iconFontClass:p,showRightArrow:f,shortcut:x,hasChildren:R}=Ve(o),b=T(!1),v=T(!1),$=T(),y=re("globalOptions"),k=re("globalHasSlot"),h=re("globalRenderSlot"),g=re("globalCloseMenu"),C=re("menuContext"),S=K(()=>typeof m.value=="string"?m.value:typeof m.value=="function"?il(m.value.toString()):"MenuItem[unknow]");ve("MenuItemName",S);const A={getSubMenuInstance:()=>{},showSubMenu:()=>b.value?(C.markActiveMenuItem(A,!0),!0):R.value?(J(),!0):!1,hideSubMenu:()=>{C.closeOtherSubMenu()},isDisabledOrHidden:()=>a.value||c.value,getElement:()=>$.value,focus:()=>v.value=!0,blur:()=>v.value=!1,click:D};ve("menuItemInstance",A),be(()=>{C.isMenuItemDataCollectedFlag()?ge(()=>{let H=0;const U=C.getElement();if(U){let Z=0;for(let q=0;q<U.children.length;q++){const ie=U.children[q];if(ie.getAttribute("data-type")==="ContextMenuItem"){if(ie===$.value){H=Z;break}Z++}}}C.addChildMenuItem(A,H)}):C.addChildMenuItem(A)}),$t(()=>{C.removeChildMenuItem(A)});function D(H){if(!a.value){if(H){const U=H.target;if(U.classList.contains("mx-context-no-clickable")||y.value.ignoreClickClassName&&U.classList.contains(y.value.ignoreClickClassName))return;if(y.value.clickCloseClassName&&U.classList.contains(y.value.clickCloseClassName)){H.stopPropagation(),g(o.rawMenuItem);return}}R.value?i.value?(typeof r.value=="function"&&r.value(H),s("click",H)):b.value||J():(typeof r.value=="function"&&r.value(H),s("click",H),l.value&&g(o.rawMenuItem))}}function J(H){v.value=!1,C.checkCloseOtherSubMenuTimeOut()||C.closeOtherSubMenu(),a.value||(C.markActiveMenuItem(A),R.value&&(H||C.markThisOpenedByKeyBoard(),C.addOpenedSubMenu(Y),b.value=!0,ge(()=>s("subMenuOpen",A))))}function Y(){v.value=!1,b.value=!1,s("subMenuClose",A)}function F(){return{disabled:a.value,label:m.value,icon:u.value,iconFontClass:p.value,showRightArrow:f.value,clickClose:l.value,clickableWhenHasChildren:i.value,shortcut:x.value,theme:y.value.theme,isOpen:b,hasChildren:R,onClick:D,onMouseEnter:J,closeMenu:g}}return t(A),(H,U)=>w(c)?G("",!0):(I(),P("div",{key:0,class:"mx-context-menu-item-wrapper",ref_key:"menuItemRef",ref:$,"data-type":"ContextMenuItem"},[w(k)("itemRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemRender",F())},null,8,["vnode"])):e.customRender?(I(),ee(w(_e),{key:1,vnode:e.customRender,data:F()},null,8,["vnode","data"])):(I(),P("div",{key:2,class:me(["mx-context-menu-item",w(a)?"disabled":"",v.value?"keyboard-focus":"",e.customClass?" "+e.customClass:"",b.value?"open":""]),onClick:D,onMouseenter:J},[ue(H.$slots,"default",{},()=>[E("div",Il,[E("div",{class:me(["mx-icon-placeholder",e.preserveIconWidth?"preserve-width":""])},[ue(H.$slots,"icon",{},()=>[w(k)("itemIconRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemIconRender",F())},null,8,["vnode"])):typeof e.svgIcon=="string"&&e.svgIcon?(I(),P("svg",Jt({key:1,class:"icon svg"},e.svgProps),[E("use",{"xlink:href":e.svgIcon},null,8,Al)],16)):typeof w(u)!="string"?(I(),ee(w(_e),{key:2,vnode:w(u),data:w(u)},null,8,["vnode","data"])):typeof w(u)=="string"&&w(u)!==""?(I(),P("i",{key:3,class:me(w(u)+" icon "+w(p)+" "+w(y).iconFontClass)},null,2)):G("",!0)]),e.checked?ue(H.$slots,"check",{key:0},()=>[w(k)("itemCheckRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemCheckRender",F())},null,8,["vnode"])):G("",!0),z(bl)]):G("",!0)],2),ue(H.$slots,"label",{},()=>[w(k)("itemLabelRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemLabelRender",F())},null,8,["vnode"])):typeof w(m)=="string"?(I(),P("span",$l,oe(w(m)),1)):(I(),ee(w(_e),{key:2,vnode:w(m),data:w(m)},null,8,["vnode","data"]))])]),E("div",Ml,[w(x)||H.$slots.shortcut?ue(H.$slots,"shortcut",{key:0},()=>[w(k)("itemShortcutRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemShortcutRender",F())},null,8,["vnode"])):G("",!0),E("span",Pl,oe(w(x)),1)]):G("",!0),w(f)?ue(H.$slots,"rightArrow",{key:1},()=>[w(k)("itemRightArrowRender")?(I(),ee(w(_e),{key:0,vnode:()=>w(h)("itemRightArrowRender",F())},null,8,["vnode"])):G("",!0),z(Rl)]):G("",!0)])])],34)),ue(H.$slots,"submenu",{context:A,show:b.value})],512))}}),Ol=X({name:"ContextMenuSperator",components:{VNodeRender:_e},setup(){const e=re("globalHasSlot"),t=re("globalRenderSlot");return{globalHasSlot:e,globalRenderSlot:t}}}),Nl={key:1,class:"mx-context-menu-item-sperator mx-context-no-clickable"};function Dl(e,t,n,o,s,r){const l=io("VNodeRender");return e.globalHasSlot("separatorRender")?(I(),ee(l,{key:0,vnode:()=>e.globalRenderSlot("separatorRender",{})},null,8,["vnode"])):(I(),P("div",Nl))}const yt=vn(Ol,[["render",Dl]]),yn=X({__name:"ContextSubMenu",props:{items:{type:Object,default:null},show:{type:Boolean,default:!1},maxHeight:{type:Number,default:0},maxWidth:{type:[String,Number],default:0},minWidth:{type:[String,Number],default:0},adjustPosition:{type:Boolean,default:!0},direction:{type:String,default:"br"},parentMenuItemContext:{type:Object,default:null}},emits:["closeAnimFinished"],setup(e,{expose:t,emit:n}){const o=e,s=n,r=T(!1),l=re("globalGetMenuHostId",""),i=re("menuContext"),a=re("globalOptions");re("globalHasSlot"),re("globalRenderSlot");const c=T("UnknowOrRoot"),m=re("MenuItemName",c),{zIndex:u,getParentWidth:p,getParentHeight:f,getZoom:x}=i,{adjustPosition:R}=Ve(o),b=T(),v=T(),$=T(),y=[],k=re("globalSetCurrentSubMenu"),h=[];let g=null,C=0;function S(){g&&g.blur()}function A(L,_){if(L){for(let B=_!==void 0?_:0;B<h.length;B++)if(!h[B].isDisabledOrHidden()){D(B);break}}else for(let B=_!==void 0?_:h.length-1;B>=0;B--)if(!h[B].isDisabledOrHidden()){D(B);break}}function D(L){if(g&&S(),L!==void 0&&(g=h[Math.max(0,Math.min(L,h.length-1))]),!g)return;g.focus();const _=g.getElement();_&&_.scrollIntoView({behavior:"auto",block:"nearest",inline:"nearest"})}function J(){k(Y)}const Y={el:$,name:m,isTopLevel:()=>i.getParentContext()===null,closeSelfAndActiveParent:()=>{const L=U.getParentContext();if(L){L.closeOtherSubMenu();const _=L.getSubMenuInstanceContext();if(_)return _.focusCurrentItem(),!0}return!1},closeCurrentSubMenu:()=>{var L;return(L=U.getParentContext())==null?void 0:L.closeOtherSubMenu()},moveCurrentItemFirst:()=>A(!0),moveCurrentItemLast:()=>A(!1),moveCurrentItemDown:()=>A(!0,g?h.indexOf(g)+1:0),moveCurrentItemUp:()=>A(!1,g?h.indexOf(g)-1:0),focusCurrentItem:()=>D(),openCurrentItemSubMenu:()=>g?g?.showSubMenu():!1,triggerCurrentItemClick:L=>g?.click(L)};let F=!1,H=!1;const U={zIndex:u+1,container:i.container,adjustPadding:a.value.adjustPadding||Ee.defaultAdjustPadding,getParentWidth:()=>{var L;return((L=$.value)==null?void 0:L.offsetWidth)||0},getParentHeight:()=>{var L;return((L=$.value)==null?void 0:L.offsetHeight)||0},getPositon:()=>[te.value.x,te.value.y],getZoom:()=>a.value.zoom||Ee.defaultZoom,addOpenedSubMenu(L){y.push(L)},closeOtherSubMenu(){y.forEach(L=>L()),y.splice(0,y.length),k(Y)},checkCloseOtherSubMenuTimeOut(){return C?(clearTimeout(C),C=0,!0):!1},closeOtherSubMenuWithTimeOut(){C=setTimeout(()=>{C=0,this.closeOtherSubMenu()},200)},addChildMenuItem:(L,_)=>{_===void 0?h.push(L):h.splice(_,0,L)},removeChildMenuItem:L=>{h.splice(h.indexOf(L),1),L.getSubMenuInstance=()=>{}},markActiveMenuItem:(L,_=!1)=>{S(),g=L,_&&D()},markThisOpenedByKeyBoard:()=>{F=!0},isOpenedByKeyBoardFlag:()=>F?(F=!1,!0):!1,isMenuItemDataCollectedFlag:()=>H,getElement:()=>$.value||null,getParentContext:()=>i,getSubMenuInstanceContext:()=>Y};ve("menuContext",U);const Z={getChildItem:L=>h[L],getMenuDimensions:()=>v.value?{width:v.value.offsetWidth,height:v.value.offsetHeight}:{width:0,height:0},getSubmenuRoot:()=>v.value,getMenu:()=>$.value,getScrollValue:()=>{var L,_;return((_=(L=b.value)==null?void 0:L.getScrollContainer())==null?void 0:_.scrollTop)||0},setScrollValue:L=>{var _;return(_=b.value)==null?void 0:_.scrollTo(0,L)},getScrollHeight:()=>ie.value,adjustPosition:()=>{Ae()},getMaxHeight:()=>we.value,getPosition:()=>te.value,setPosition:(L,_)=>{te.value.x=L,te.value.y=_}},q=re("menuItemInstance",void 0);q&&(q.getSubMenuInstance=()=>Z);const ie=T(0),we=T(0),ke=T(!1),te=T({x:0,y:0});function Ae(){ge(()=>{var L;const _=$.value,B=v.value;if(_&&B&&b.value){const{container:d}=i,O=p?.()??0,M=f?.()??0,N=getComputedStyle(B),j=parseFloat(N.paddingLeft),ne=parseFloat(N.paddingTop),V=M>0?ne:0,W=document.documentElement.scrollHeight/x(),ae=document.documentElement.scrollWidth/x(),Be=Math.min(ae,d.offsetWidth),pe=Math.min(W,d.offsetHeight);let Bt=gt(_,d),Ft=vt(_,d);if(o.direction.includes("l")?te.value.x-=_.offsetWidth+j:o.direction.includes("r")?te.value.x+=O+j:(te.value.x+=O/2,te.value.x-=(_.offsetWidth+j)/2),o.direction.includes("t")){const at=(L=o.parentMenuItemContext)==null?void 0:L.getElement();at&&(te.value.y+=at.offsetHeight),te.value.y-=(_.offsetHeight+ne)/x()}else o.direction.includes("b")?te.value.y-=ne/x():te.value.y-=_.offsetHeight/2/x();ge(()=>{var at,kn;Bt=gt(_,d),Ft=vt(_,d);const bn=((kn=(at=b.value)==null?void 0:at.getScrollContainer())==null?void 0:kn.scrollHeight)||0,Jo=o.maxHeight;ie.value=o.maxHeight?Math.min(bn,o.maxHeight):bn;const Yo=Bt+_.offsetWidth-Be,Cn=Ft+ie.value+V*2-pe;if(ke.value=Cn>0,R.value&&Yo>0){const it=O+_.offsetWidth-j,ct=Bt;it>ct?te.value.x-=ct:te.value.x-=it}if(ke.value){if(R.value){const it=Cn,ct=Ft;it>ct?te.value.y-=ct-V:te.value.y-=it-V}we.value=pe-(te.value.y+ne)}else we.value=Jo||0})}})}function Me(){var L;const _=(L=o.parentMenuItemContext)==null?void 0:L.getElement();if(_){const B=gt(_,i.container),d=vt(_,i.container);te.value.x=B,te.value.y=d}else{const[B,d]=i.getPositon();te.value.x=B,te.value.y=d}ge(()=>{var B;k(Y),(B=$.value)==null||B.focus({preventScroll:!0}),i.isOpenedByKeyBoardFlag()&&ge(()=>A(!0)),H=!0}),Ae()}return ze(()=>o.show,L=>{L&&Me()}),be(()=>{r.value=!0,o.show?Me():Ae()}),$t(()=>{r.value=!1,q&&(q.getSubMenuInstance=()=>{})}),t(Z),(L,_)=>{const B=io("ContextSubMenu",!0);return r.value?(I(),ee(cn,{key:0,to:`#${w(l)}`},[z(as,Jt({appear:""},w(a).menuTransitionProps||{duration:10},{onAfterLeave:_[0]||(_[0]=d=>s("closeAnimFinished"))}),{default:Re(()=>[e.show?(I(),P("div",Jt({key:0,ref_key:"submenuRoot",ref:v},L.$attrs,{class:["mx-context-menu",w(a).customClass?w(a).customClass:"",w(a).theme??""],style:{maxWidth:e.maxWidth?w(Vn)(e.maxWidth):`${w(Ee).defaultMaxWidth}px`,minWidth:e.minWidth?w(Vn)(e.minWidth):`${w(Ee).defaultMinWidth}px`,zIndex:w(u),left:`${te.value.x}px`,top:`${te.value.y}px`},"data-type":"ContextSubMenu",onClick:J}),[z(w(hl),{ref_key:"scrollRectRef",ref:b,scroll:"vertical",maxHeight:we.value,containerClass:"mx-context-menu-scroll"},{default:Re(()=>[E("div",{class:me(["mx-context-menu-items"]),ref_key:"menu",ref:$},[ue(L.$slots,"default",{},()=>[(I(!0),P(fe,null,rt(e.items,(d,O)=>(I(),P(fe,{key:O},[d.hidden!==!0&&d.divided==="up"?(I(),ee(yt,{key:0})):G("",!0),d.hidden!==!0&&d.divided==="self"?(I(),ee(yt,{key:1})):(I(),ee(gn,{key:2,clickHandler:d.onClick?M=>d.onClick(M):void 0,disabled:typeof d.disabled=="object"?d.disabled.value:d.disabled,hidden:typeof d.hidden=="object"?d.hidden.value:d.hidden,icon:d.icon,iconFontClass:d.iconFontClass,svgIcon:d.svgIcon,svgProps:d.svgProps,label:d.label,customRender:d.customRender,customClass:d.customClass,checked:typeof d.checked=="object"?d.checked.value:d.checked,shortcut:d.shortcut,clickClose:d.clickClose,clickableWhenHasChildren:d.clickableWhenHasChildren,preserveIconWidth:d.preserveIconWidth!==void 0?d.preserveIconWidth:w(a).preserveIconWidth,showRightArrow:d.children&&d.children.length>0,hasChildren:d.children&&d.children.length>0,rawMenuItem:d,onSubMenuOpen:M=>{var N;return(N=d.onSubMenuOpen)==null?void 0:N.call(d,M)},onSubMenuClose:M=>{var N;return(N=d.onSubMenuClose)==null?void 0:N.call(d,M)}},ao({_:2},[d.children&&d.children.length>0?{name:"submenu",fn:Re(({context:M,show:N})=>[z(B,{show:N,parentMenuItemContext:M,items:d.children,maxWidth:d.maxWidth,minWidth:d.minWidth,maxHeight:d.maxHeight,adjustPosition:d.adjustSubMenuPosition!==void 0?d.adjustSubMenuPosition:w(a).adjustPosition,direction:d.direction!==void 0?d.direction:w(a).direction},null,8,["show","parentMenuItemContext","items","maxWidth","minWidth","maxHeight","adjustPosition","direction"])]),key:"0"}:void 0]),1032,["clickHandler","disabled","hidden","icon","iconFontClass","svgIcon","svgProps","label","customRender","customClass","checked","shortcut","clickClose","clickableWhenHasChildren","preserveIconWidth","showRightArrow","hasChildren","rawMenuItem","onSubMenuOpen","onSubMenuClose"])),d.hidden!==!0&&(d.divided==="down"||d.divided===!0)?(I(),ee(yt,{key:3})):G("",!0)],64))),128))])],512)]),_:3},8,["maxHeight"])],16)):G("",!0)]),_:3},16)],8,["to"])):G("",!0)}}}),zo=X({__name:"ContextSubMenuWrapper",props:{options:{type:Object,default:null},show:{type:null,default:null},container:{type:Object,default:null},isFullScreenContainer:{type:Boolean,default:!0}},emits:["close","closeAnimFinished"],setup(e,{expose:t,emit:n}){const o=e,s=n,r=lo(),l=T(),{options:i,show:a,container:c}=Ve(o);be(()=>{a.value&&p()}),$t(()=>{b()}),ze(a,g=>{g?p():(jn(m),b())});const m={closeMenu:f,isClosed:x,getMenuRef:()=>l.value,getMenuDimensions:()=>{var g;return((g=l.value)==null?void 0:g.getMenuDimensions())??{width:0,height:0}}};let u=!1;function p(){R(),sl(m)}function f(g){u=!0,s("close",g),i.value.menuTransitionProps||s("closeAnimFinished"),jn(m)}function x(){return u}function R(){setTimeout(()=>{document.addEventListener("click",k,!0),document.addEventListener("contextmenu",k,!0),document.addEventListener("scroll",y,!0),!o.isFullScreenContainer&&c.value&&c.value.addEventListener("scroll",y,!0),i.value.keyboardControl!==!1&&document.addEventListener("keydown",$,!0)},50)}function b(){document.removeEventListener("contextmenu",k,!0),document.removeEventListener("click",k,!0),document.removeEventListener("scroll",y,!0),!o.isFullScreenContainer&&c.value&&c.value.removeEventListener("scroll",y,!0),i.value.keyboardControl!==!1&&document.removeEventListener("keydown",$,!0)}const v=T();ve("globalSetCurrentSubMenu",g=>v.value=g),ve("globalGetMenuHostId",c.value.id);function $(g){var C,S,A,D,J,Y,F,H,U,Z,q,ie,we;let ke=!0;switch(g.key){case"Escape":{((C=v.value)==null?void 0:C.isTopLevel())===!1?(S=v.value)==null||S.closeCurrentSubMenu():f();break}case"ArrowDown":(A=v.value)==null||A.moveCurrentItemDown();break;case"ArrowUp":(D=v.value)==null||D.moveCurrentItemUp();break;case"Home":(J=v.value)==null||J.moveCurrentItemFirst();break;case"End":(Y=v.value)==null||Y.moveCurrentItemLast();break;case"ArrowLeft":{(F=v.value)!=null&&F.closeSelfAndActiveParent()||(U=(H=i.value).onKeyFocusMoveLeft)==null||U.call(H);break}case"ArrowRight":(Z=v.value)!=null&&Z.openCurrentItemSubMenu()||(ie=(q=i.value).onKeyFocusMoveRight)==null||ie.call(q);break;case"Enter":(we=v.value)==null||we.triggerCurrentItemClick(g);break;default:ke=!1;break}ke&&v.value&&(g.stopPropagation(),g.preventDefault())}function y(g){i.value.closeWhenScroll!==!1&&h(g.target,null)}function k(g){h(g.target,g)}function h(g,C){for(var S,A;g;){if(g.classList&&g.classList.contains("mx-context-menu"))return;g=g.parentNode}C?i.value.clickCloseOnOutside!==!1?(b(),f()):(A=(S=i.value).onClickOnOutside)==null||A.call(S,C):(b(),f())}return ve("globalOptions",i),ve("globalCloseMenu",f),ve("globalIsFullScreenContainer",o.isFullScreenContainer),ve("globalHasSlot",g=>r[g]!==void 0),ve("globalRenderSlot",(g,C)=>ue(r,g,{...C},()=>[tt("span","Render slot failed")],!1)),ve("menuContext",{zIndex:i.value.zIndex||Ee.defaultZindex,container:c.value,adjustPadding:{x:0,y:0},getZoom:()=>i.value.zoom||Ee.defaultZoom,getParentWidth:()=>0,getParentHeight:()=>0,getPositon:()=>[i.value.x,i.value.y],closeOtherSubMenuWithTimeOut:()=>{},checkCloseOtherSubMenuTimeOut:()=>!1,addOpenedSubMenu:()=>{},closeOtherSubMenu:()=>{},getParentContext:()=>null,getSubMenuInstanceContext:()=>null,getElement:()=>null,addChildMenuItem:()=>{},removeChildMenuItem:()=>{},markActiveMenuItem:()=>{},markThisOpenedByKeyBoard:()=>{},isOpenedByKeyBoardFlag:()=>!1,isMenuItemDataCollectedFlag:()=>!1}),t(m),(g,C)=>(I(),ee(yn,{ref_key:"submenuInstance",ref:l,show:w(a),items:w(i).items,adjustPosition:w(i).adjustPosition,maxWidth:w(i).maxWidth||w(Ee).defaultMaxWidth,minWidth:w(i).minWidth||w(Ee).defaultMinWidth,maxHeight:w(i).maxHeight,direction:w(i).direction||w(Ee).defaultDirection,onCloseAnimFinished:C[0]||(C[0]=S=>s("closeAnimFinished"))},{default:Re(()=>[ue(g.$slots,"default")]),_:3},8,["show","items","adjustPosition","maxWidth","minWidth","maxHeight","direction"]))}}),Ll=X({__name:"ContextMenu",props:{options:{type:Object,default:null},show:{type:Boolean,default:!1}},emits:["update:show","close"],setup(e,{expose:t,emit:n}){const o=n,s=e,{options:r,show:l}=Ve(s),{isNew:i,container:a,eleId:c}=Wo(r.value),m=T(null),u=lo();function p(f){var x,R;o("update:show",!1),o("close"),(R=(x=r.value).onClose)==null||R.call(x,f)}return t({closeMenu:()=>o("update:show",!1),isClosed:()=>!l.value,getMenuRef:()=>{var f;return(f=m.value)==null?void 0:f.getMenuRef()},getMenuDimensions:()=>{var f;return((f=m.value)==null?void 0:f.getMenuDimensions())??{width:0,height:0}}}),(f,x)=>(I(),ee(cn,{to:`#${w(c)}`},[z(zo,{ref_key:"menuRef",ref:m,options:w(r),show:w(l),container:w(a),isFullScreenContainer:!w(i),onClose:p},ao({_:2},[rt(w(u),(R,b)=>({name:b,fn:Re(v=>[ue(f.$slots,b,rs(ls(v)))])}))]),1032,["options","show","container","isFullScreenContainer"])],8,["to"]))}}),Tl=X({name:"ContextMenuGroup",props:{disabled:{type:Boolean,default:!1},hidden:{type:Boolean,default:!1},clickHandler:{type:Function,default:null},label:{type:String,default:""},icon:{type:String,default:""},iconFontClass:{type:String,default:"iconfont"},checked:{type:Boolean,default:!1},shortcut:{type:String,default:""},svgIcon:{type:String,default:""},svgProps:{type:Object,default:null},preserveIconWidth:{type:Boolean,default:!0},showRightArrow:{type:Boolean,default:!1},clickClose:{type:Boolean,default:!0},adjustSubMenuPosition:{type:Boolean,default:void 0},maxHeight:{type:[String,Number],default:0},maxWidth:{type:[String,Number],default:0},minWidth:{type:[String,Number],default:0}},setup(e,t){const n=re("globalOptions"),{adjustSubMenuPosition:o,maxWidth:s,minWidth:r,maxHeight:l}=Ve(e),i=typeof o.value<"u"?o.value:n.value.adjustPosition,a=T(),c=T();return t.expose({getSubMenuRef:()=>a.value,getMenuItemRef:()=>c.value}),()=>tt(gn,{...e,ref:c,showRightArrow:!0,maxWidth:void 0,minWidth:void 0,maxHeight:void 0,adjustSubMenuPosition:void 0,hasChildren:typeof t.slots.default!==void 0},t.slots.default?{submenu:m=>tt(yn,{ref:a,show:m.show,maxWidth:s.value,minWidth:r.value,maxHeight:l.value,adjustPosition:i,parentMenuItemContext:m.context},{default:t.slots.default}),...cl(t.slots,"default")}:t.slots)}});function Bl(e,t,n,o){const s=T(!0),r=tt(zo,{options:e,show:s,container:t,isFullScreenContainer:!n,onCloseAnimFinished:()=>{Sn(null,t)},onClose:l=>{var i;(i=e.onClose)==null||i.call(e,l),s.value=!1}},o);return Sn(r,t),r.component}function Xn(e,t){const n=Wo(e);return Bl(e,n.container,n.isNew,t).exposed}const Lt={install(e){e.config.globalProperties.$contextmenu=Xn,e.component("ContextMenu",Ll),e.component("ContextMenuItem",gn),e.component("ContextMenuGroup",Tl),e.component("ContextMenuSperator",yt),e.component("ContextMenuSeparator",yt),e.component("ContextSubMenu",yn)},showContextMenu(e,t){return Xn(e,t)},isAnyContextMenuOpen(){return ol()},closeContextMenu:Ho,transformMenuPosition:rl},Fl={key:0,class:"empty-container"},Hl={key:0},Wl={key:1},zl={key:2},Ul={key:3},jl={key:4},Vl={key:5},ql=X({__name:"EmptyFolder",props:{path:{},documents:{}},setup(e){const t=is,n=se(),o=e;return(s,r)=>!o.path||e.documents.length===0?(I(),P("div",Fl,[(I(),ee(an(w(t)),{class:me(["cog",{stopped:w(n).dialog==="accessdenied"||w(n).authInProgress}])},null,8,["class"])),w(n).dialog==="accessdenied"?(I(),P("p",Hl,"Access Denied")):w(n).connected?w(n).document.length===0?(I(),P("p",zl,"Waiting for File List")):w(n).query?(I(),P("p",Ul,"No matches!")):w(Fo)(o.path)?(I(),P("p",Vl,"Empty folder")):(I(),P("p",jl,"Folder not found")):(I(),P("p",Wl,"No Connection"))])):G("",!0)}}),Gl=ye(ql,[["__scopeId","data-v-0494c508"]]),Kl=["checked"],Jl=X({__name:"SelectBox",props:{doc:{}},setup(e){const t=se();return(n,o)=>(I(),P("input",{type:"checkbox",tabindex:"-1",checked:w(t).selected.has(e.doc.key),onClick:o[0]||(o[0]=de(()=>{},["stop"])),onChange:o[1]||(o[1]=s=>{s.target.checked?w(t).selected.add(e.doc.key):w(t).selected.delete(e.doc.key)})},null,40,Kl))}}),rn=X({__name:"FileRenameInput",props:{doc:{},rename:{type:Function},exit:{type:Function}},setup(e){const t=T(null),n=T("");be(()=>{n.value=o.doc.name;const r=n.value.lastIndexOf(".");ge(()=>{t.value.focus(),t.value.setSelectionRange(0,r>0?r:n.value.length)})});const o=e,s=()=>{o.exit(),!(o.doc.key!=="new"&&(n.value===o.doc.name||n.value.length===0))&&o.rename(o.doc,n.value)};return(r,l)=>kt((I(),P("input",{ref_key:"input",ref:t,id:"FileRenameInput",type:"text",autocorrect:"off","onUpdate:modelValue":l[0]||(l[0]=i=>n.value=i),onBlur:l[1]||(l[1]=(...i)=>e.exit&&e.exit(...i)),onKeyup:[l[2]||(l[2]=Qe((...i)=>e.exit&&e.exit(...i),["esc"])),Qe(s,["enter"])]},null,544)),[[Yt,n.value]])}}),Yl=["src"],Xl=["src"],Zl={key:2,class:"folder icon"},Ql={key:3,class:"video-container"},ea=["src","poster"],ta={class:"play-overlay"},na={key:4,class:"audio icon"},oa=["src"],sa={key:5,class:"archive icon"},ra=X({__name:"MediaPreview",props:{doc:{},quality:{}},setup(e,{expose:t}){const n=T(null),o=T(null),s=K(()=>n.value||o.value),r=K(()=>`${l.doc.previewurl}?${l.quality}&t=${l.doc.mtime}`),l=e,i=()=>{s.value&&(s.value.controls=!0,s.value.setAttribute("data-playing",""))},a=()=>{s.value&&(s.value.controls=!1,s.value.removeAttribute("data-playing"))};let c=null;const m=()=>{if(!s.value)return;s.value.load();const R=Array.from(document.querySelectorAll("video, audio"));if(R.length===0)return;let b=null;for(const v in R)if(R[v]===(c||s.value)){b=R[+v+1]??R[0]??null;break}if(b)if(b.tagName==="VIDEO"&&document.fullscreenElement===s.value){const v=s.value,$=b;if(v===$){$.play();return}c||v.addEventListener("fullscreenchange",y=>{c&&(c.currentTime=v.currentTime,c.click(),v.paused||c.play(),c=null,v.src=l.doc.url,v.poster=r.value,a())},{once:!0}),c=$,v.src=$.src,v.poster="",v.play()}else document.exitFullscreen(),b.click()};t({play(){if(!s.value)return!1;if(s.value.paused){s.value.play();for(const R of Array.from(document.querySelectorAll("video, audio")))R!==s.value&&R.pause()}else s.value.pause();return!0},media:s});const u=()=>["mkv","mp4","webm","mov","avi"].includes(l.doc.ext),p=()=>["mp3","flac","ogg","aac"].includes(l.doc.ext),f=()=>["zip","tar","gz","bz2","xz","7z","rar"].includes(l.doc.ext),x=()=>["bmp","ico","tif","tiff","heic","heif","pdf","epub","mobi"].includes(l.doc.ext)||l.doc.size>5e5&&["avif","webp","png","jpg","jpeg"].includes(l.doc.ext);return(R,b)=>x()?(I(),P("img",{key:0,src:`${e.doc.previewurl}?${e.quality}&t=${e.doc.mtime}`,alt:""},null,8,Yl)):e.doc.img?(I(),P("img",{key:1,src:e.doc.url,alt:""},null,8,Xl)):e.doc.dir?(I(),P("span",Zl)):u()?(I(),P("div",Ql,[E("video",{ref_key:"vid",ref:o,src:e.doc.url,poster:r.value,preload:"none",onPlay:i,onPause:a,onEnded:m,onSeeking:b[0]||(b[0]=v=>s.value.play())},null,40,ea),E("div",ta,[z(w(cs))])])):p()?(I(),P("div",na,[E("audio",{ref_key:"aud",ref:n,src:e.doc.url,class:"icon",preload:"none",onPlay:i,onPause:a,onEnded:m,onSeeking:b[1]||(b[1]=v=>s.value.play())},null,40,oa)])):f()?(I(),P("span",sa)):(I(),P("span",{key:6,class:me(["file icon",`ext-${e.doc.ext}`])},null,2))}}),la=ye(ra,[["__scopeId","data-v-47490c5c"]]);let Gt=!1,Ge=null,Kt=!1;const aa=X({__name:"CursorTooltip",props:{text:{},delay:{}},setup(e,{expose:t}){const n=e,o=T(!1),s=T(0),r=T(0);let l=null,i=0,a=0;const c=8,m=K(()=>({left:`${s.value}px`,top:`${r.value}px`})),u=()=>window.matchMedia("(pointer: fine)").matches,p=()=>{o.value=!0,Gt=!0},f=()=>{l&&clearTimeout(l),Ge&&(clearTimeout(Ge),Ge=null);const v=Gt?0:n.delay??900;l=setTimeout(p,v)};return t({startHover:v=>{!u()&&!Kt||(s.value=v.clientX,r.value=v.clientY,i=v.clientX,a=v.clientY)},updatePosition:v=>{if((v.movementX!==0||v.movementY!==0)&&(Kt=!0),!u()&&!Kt||(s.value=v.clientX,r.value=v.clientY,o.value))return;const $=v.clientX-i,y=v.clientY-a;Math.sqrt($*$+y*y)>c&&(i=v.clientX,a=v.clientY,l&&(clearTimeout(l),l=null)),l||f()},endHover:()=>{l&&(clearTimeout(l),l=null),o.value=!1,Ge&&clearTimeout(Ge),Ge=setTimeout(()=>{Gt=!1},400)}}),(v,$)=>(I(),ee(cn,{to:"body"},[o.value?(I(),P("div",{key:0,class:"cursor-tooltip",style:Je(m.value)},[ue(v.$slots,"default",{},void 0,!0)],4)):G("",!0)]))}}),Uo=ye(aa,[["__scopeId","data-v-c5d421fc"]]),ia=["id","href"],ca={class:"tooltip-name"},ua={class:"tooltip-details"},da=X({__name:"GalleryFigure",props:{doc:{},editing:{}},setup(e){const t=se(),n=e,o=T(null),s=T(null),r=K(()=>n.doc.key),l=i=>{o.value.play()&&i.preventDefault(),t.cursor=n.doc.key};return(i,a)=>{const c=rn,m=Jl;return I(),P("a",{id:`file-${e.doc.key}`,href:e.doc.url,tabindex:"-1",class:me({file:!e.doc.dir,folder:e.doc.dir,cursor:w(t).cursor===e.doc.key}),onContextmenu:a[3]||(a[3]=de(()=>{},["stop"])),onFocus:a[4]||(a[4]=de(u=>w(t).cursor=e.doc.key,["stop"])),onClick:l,onMouseenter:a[5]||(a[5]=(...u)=>s.value?.startHover&&s.value?.startHover(...u)),onMousemove:a[6]||(a[6]=(...u)=>s.value?.updatePosition&&s.value?.updatePosition(...u)),onMouseleave:a[7]||(a[7]=(...u)=>s.value?.endHover&&s.value?.endHover(...u))},[E("figure",null,[ue(i.$slots,"default",{},void 0,!0),z(la,{ref_key:"m",ref:o,doc:e.doc,tabindex:"-1",quality:"sz=512",class:"figcontent"},null,8,["doc"]),a[9]||(a[9]=E("div",{class:"titlespacer"},null,-1)),E("figcaption",{onClick:a[1]||(a[1]=de(()=>{},["prevent"])),onContextmenu:a[2]||(a[2]=de(u=>i.$emit("menu",u),["prevent"]))},[e.editing?(I(),ee(c,{key:0,doc:e.doc,rename:e.editing.rename,exit:e.editing.exit},null,8,["doc","rename","exit"])):(I(),P(fe,{key:1},[z(m,{doc:e.doc,onClick:a[0]||(a[0]=u=>w(t).cursor=e.doc.key)},null,8,["doc"]),E("span",null,oe(e.doc.name),1),a[8]||(a[8]=E("div",{class:"namespacer"},null,-1))],64))],32)]),z(Uo,{ref_key:"tooltip",ref:s,text:r.value},{default:Re(()=>[E("div",ca,oe(e.doc.name),1),E("div",ua,oe(e.doc.modified)+" — "+oe(e.doc.sizedisp),1)]),_:1},8,["text"])],42,ia)}}}),fa=ye(da,[["__scopeId","data-v-91479c1d"]]),pa=X({__name:"Gallery",props:{path:{},documents:{}},setup(e,{expose:t}){const n=e,o=se(),s=un(),r=ln(null),l=()=>{r.value=null},i=(h,g)=>{const C=h.name,S=Ue(Ct,{message(A){const D=JSON.parse(A.data);"error"in D?(console.error("Rename failed",D.error.message,D.error),h.name=C):console.log("Rename succeeded",D)}});S.onopen=()=>{S.send(JSON.stringify({op:"rename",path:`${h.loc}/${C}`,to:g}))},h.name=g},a=T(),c=T(1),m=()=>{a.value&&(c.value=getComputedStyle(a.value).gridTemplateColumns.split(" ").length)},u=K(()=>c.value);t({newFolder(){const h=Math.floor(Date.now()/1e3);r.value=new fn({loc:y.value,key:"new",name:"New Folder",dir:!0,mtime:h,size:0}),o.cursor=r.value.key},toggleSelectAll(){console.log("Select"),$.value=!$.value},toggleSortColumn(h){const g=["","name","modified","size",""][h];g&&o.toggleSort(g)},isCursor(){return o.cursor&&r.value===null},cursorRename(){r.value=n.documents.find(h=>h.key===o.cursor)??null},cursorSelect(){const h=o.cursor;h&&(o.selected.has(h)?o.selected.delete(h):o.selected.add(h),this.cursorMove(1,null))},up(h){this.cursorMove(-u.value,h)},down(h){this.cursorMove(u.value,h)},left(h){this.cursorMove(-1,h)},right(h){this.cursorMove(1,h)},cursorMove(h,g){const C=!!g?.shiftKey,S=n.documents;if(S.length===0){o.cursor="";return}const A=S.length,D=(U,Z)=>(U%Z+Z)%Z,J=(U,Z)=>D(U+Z,A+1),Y=o.cursor?S.findIndex(U=>U.key===o.cursor):A;if(g&&Y===0&&g.key==="ArrowLeft"||g&&Y===A-1&&g.key==="ArrowRight")return;let F;Y===A?F=h>0?0:A-1:(F=J(Y,h),(Math.abs(h)>=A||Math.sign(h)!==Math.sign(F-Y))&&(F=A)),o.cursor=S[F]?.key??"";const H=o.cursor?document.getElementById(`file-${o.cursor}`):"";if(C){let[U,Z]=h>0?[Y,F]:[F,Y];for(let q=U;q!==Z;q=J(q,1)){if(q===A)continue;const ie=S[q].key;o.selected.has(ie)?o.selected.delete(ie):o.selected.add(ie)}}x=H,f||(f=setTimeout(()=>{x&&x.scrollIntoView({block:"center",behavior:"smooth"}),f=null},300)),F===A&&p()}});const p=()=>{const h=document.querySelector(".breadcrumb");h&&h.focus()};let f=null,x=null;Ie(()=>{if(o.cursor&&o.cursor!==r.value?.key&&(r.value=null),r.value&&(o.cursor=r.value.key),o.cursor){const h=document.querySelector(`#file-${o.cursor}`);h&&(h.focus(),h.scrollIntoView({block:"center",behavior:"smooth"}))}}),Ie(()=>{!n.documents.length&&o.cursor&&(o.cursor="",p())});let R=null;be(()=>{const h=document.querySelector(".cursor");h&&(h.scrollIntoView({block:"center",behavior:"instant"}),h.focus()),m(),a.value&&(R=new ResizeObserver(m),R.observe(a.value))}),wt(()=>{R?.disconnect()});const b=(h,g)=>{const C=Ue(Ct,{open(){C.send(JSON.stringify({op:"mkdir",path:`${h.loc}/${g}`}))},message(S){const A=JSON.parse(S.data);"error"in A?(console.error("Mkdir failed",A.error.message,A.error),r.value=null):(console.log("mkdir",A),s.push(h.urlrouter))}});h.name=g,h.key=crypto.randomUUID()},v=h=>{const g=n.documents,C=g[h].loc;return h===0?C!==y.value:C!==g[h-1].loc},$=K({get:()=>n.documents.length>0&&n.documents.every(h=>o.selected.has(h.key)),set:h=>{console.log("Setting allSelected",h);for(const g of n.documents)h?o.selected.add(g.key):o.selected.delete(g.key)}}),y=K(()=>n.path.join("/")),k=(h,g)=>{o.cursor=g.key,Lt.showContextMenu({x:h.x,y:h.y,items:[{label:"Rename",onClick:()=>{r.value=g}}]})};return(h,g)=>{const C=fa,S=hn;return n.documents.length||r.value?(I(),P("div",{key:0,class:"gallery",ref_key:"gallery",ref:a},[r.value?.key==="new"?(I(),ee(C,{doc:r.value,key:r.value.key,editing:{rename:b,exit:l}},null,8,["doc","editing"])):G("",!0),(I(!0),P(fe,null,rt(e.documents,(A,D)=>(I(),P(fe,{key:A.key},[v(D)?(I(),ee(S,{key:0,path:A.loc?A.loc.split("/"):[],class:"folder-indicator"},null,8,["path"])):G("",!0),z(C,{doc:A,editing:r.value===A?{rename:i,exit:l}:null,onMenu:J=>k(J,A),class:me({"folder-start":v(D)})},null,8,["doc","editing","onMenu","class"])],64))),128))],512)):G("",!0)}}}),ma=ye(pa,[["__scopeId","data-v-9973e293"]]),ha=X({__name:"FileSize",props:{doc:{}},setup(e){const t=K(()=>{const o=n.doc.sizedisp.split(" ").slice(-1)[0];return+o?"bytes":o}),n=e;return(o,s)=>(I(),P("td",{class:me(["size right",t.value])},oe(e.doc.sizedisp),3))}}),va=ye(ha,[["__scopeId","data-v-444c7802"]]),ga={class:"modified right"},ya=["datetime"],wa=X({__name:"FileModified",props:{doc:{},now:{}},setup(e){const t=e,n=T(null),o=K(()=>(t.now,Mo(t.doc.mtime))),s=K(()=>new Date(1e3*t.doc.mtime).toISOString().replace(".000Z","Z")),r=K(()=>s.value.replace("T"," ").replace("Z"," UTC"));return(l,i)=>(I(),P("td",ga,[E("time",{datetime:s.value,onMouseenter:i[0]||(i[0]=(...a)=>n.value?.startHover&&n.value?.startHover(...a)),onMousemove:i[1]||(i[1]=(...a)=>n.value?.updatePosition&&n.value?.updatePosition(...a)),onMouseleave:i[2]||(i[2]=(...a)=>n.value?.endHover&&n.value?.endHover(...a))},oe(o.value),41,ya),z(Uo,{ref_key:"tooltip",ref:n,text:r.value},{default:Re(()=>[He(oe(r.value),1)]),_:1},8,["text"])]))}}),ka={key:0},ba={class:"selection"},Ca=["indeterminate"],Sa={key:0,class:"folder"},xa={class:"name"},_a={key:0,class:"folder-change"},Ea={colspan:"5"},Ra=["id","onClick","onContextmenu"],Ia=["onClick"],Aa=["checked","onChange"],$a={class:"name"},Ma=["href","onFocus"],Pa=["onClick"],Oa={class:"menu"},Na=["onClick"],Da={key:1,class:"summary"},La={colspan:"3",class:"right"},Ta={class:"size right"},Ba=X({__name:"FileExplorer",props:{path:{},documents:{}},setup(e,{expose:t}){const n=e,o=se(),s=un(),r=ln(null),l=(y,k)=>{const h=y.name,g=Ue(Ct,{message(C){const S=JSON.parse(C.data);"error"in S?(console.error("Rename failed",S.error.message,S.error),y.name=h):console.log("Rename succeeded",S)}});g.onopen=()=>{g.send(JSON.stringify({op:"rename",path:`${y.loc}/${h}`,to:k}))},y.name=k};t({newFolder(){console.log("New folder");const y=Math.floor(Date.now()/1e3);r.value=new fn({loc:v.value,key:"new",name:"New Folder",dir:!0,mtime:y,size:0}),o.cursor=r.value.key},toggleSelectAll(){console.log("Select"),b.value=!b.value},isCursor(){return o.cursor&&r.value===null},cursorRename(){r.value=n.documents.find(y=>y.key===o.cursor)??null},cursorSelect(){const y=o.cursor;y&&(o.selected.has(y)?o.selected.delete(y):o.selected.add(y),this.cursorMove(1,null))},up(y){this.cursorMove(-1,y)},down(y){this.cursorMove(1,y)},left(y){s.back()},right(y){const k=document.querySelector(`#file-${o.cursor} a`);k&&k.click()},cursorMove(y,k){const h=!!k?.shiftKey,g=n.documents;if(g.length===0){o.cursor="";return}const C=g.length,S=(F,H)=>(F%H+H)%H,A=(F,H)=>S(F+H,C+1),D=o.cursor?g.findIndex(F=>F.key===o.cursor):g.length,J=A(D,y);o.cursor=g[J]?.key??"";const Y=o.cursor?document.getElementById(`file-${o.cursor}`):"";if(h){let[F,H]=y>0?[D,J]:[J,D];for(let U=F;U!==H;U=A(U,1)){if(U===C)continue;const Z=g[U].key;o.selected.has(Z)?o.selected.delete(Z):o.selected.add(Z)}}c=Y,a||(a=setTimeout(()=>{c&&c.scrollIntoView({block:"center",behavior:"smooth"}),a=null},300)),J===C&&i()}});const i=()=>{const y=document.querySelector(".breadcrumb");y&&y.focus()};let a=null,c=null;Ie(()=>{if(o.cursor&&o.cursor!==r.value?.key&&(r.value=null),r.value&&(o.cursor=r.value?.key),o.cursor){const y=document.querySelector(`#file-${o.cursor} .name a`);y&&y.focus()}}),Ie(()=>{!n.documents.length&&o.cursor&&(o.cursor="",i())});let m=T(0),u=null;const p=()=>{m.value=Math.floor(Date.now()/1e3)};be(()=>{p(),u=setInterval(p,1e3);const y=document.querySelector(".cursor");y&&(y.scrollIntoView({block:"center",behavior:"instant"}),y.focus())}),wt(()=>{clearInterval(u)});const f=(y,k)=>{const h=Ue(Ct,{open(){h.send(JSON.stringify({op:"mkdir",path:`${y.loc}/${k}`}))},message(g){const C=JSON.parse(g.data);"error"in C?(console.error("Mkdir failed",C.error.message,C.error),r.value=null):(console.log("mkdir",C),s.push(y.urlrouter))}});y.name=k,y.key=crypto.randomUUID()},x=y=>{const k=n.documents,h=k[y].loc;return y===0?h!==v.value:h!==k[y-1].loc},R=K({get:()=>n.documents.length>0&&n.documents.some(y=>o.selected.has(y.key))&&!b.value,set:y=>{}}),b=K({get:()=>n.documents.length>0&&n.documents.every(y=>o.selected.has(y.key)),set:y=>{console.log("Setting allSelected",y);for(const k of n.documents)y?o.selected.add(k.key):o.selected.delete(k.key)}}),v=K(()=>n.path.join("/")),$=(y,k)=>{o.cursor=k.key,Lt.showContextMenu({x:y.x,y:y.y,items:[{label:"Rename",onClick:()=>{r.value=k}}]})};return(y,k)=>{const h=wa,g=va,C=hn;return n.documents.length||r.value?(I(),P("table",ka,[E("thead",null,[E("tr",null,[E("th",ba,[kt(E("input",{type:"checkbox",tabindex:"-1","onUpdate:modelValue":k[0]||(k[0]=S=>b.value=S),indeterminate:R.value},null,8,Ca),[[co,b.value]])]),E("th",{class:me(["sortcolumn",{sortactive:w(o).sortOrder==="name"}]),onClick:k[1]||(k[1]=S=>w(o).toggleSort("name"))},"Name",2),E("th",{class:me(["sortcolumn modified right",{sortactive:w(o).sortOrder==="modified"}]),onClick:k[2]||(k[2]=S=>w(o).toggleSort("modified"))},"Modified",2),E("th",{class:me(["sortcolumn size right",{sortactive:w(o).sortOrder==="size"}]),onClick:k[3]||(k[3]=S=>w(o).toggleSort("size"))},"Size",2),k[5]||(k[5]=E("th",{class:"menu"},null,-1))])]),E("tbody",null,[r.value?.key==="new"?(I(),P("tr",Sa,[k[6]||(k[6]=E("td",{class:"selection"},null,-1)),E("td",xa,[z(rn,{doc:r.value,rename:f,exit:()=>{r.value=null}},null,8,["doc","exit"])]),z(h,{doc:r.value,now:w(m)},null,8,["doc","now"]),z(g,{doc:r.value},null,8,["doc"]),k[7]||(k[7]=E("td",{class:"menu"},null,-1))])):G("",!0),(I(!0),P(fe,null,rt(e.documents,(S,A)=>(I(),P(fe,{key:S.key},[x(A)?(I(),P("tr",_a,[E("th",Ea,[z(C,{path:S.loc?S.loc.split("/"):[]},null,8,["path"])])])):G("",!0),E("tr",{id:`file-${S.key}`,class:me({file:!S.dir,folder:S.dir,cursor:w(o).cursor===S.key}),onClick:D=>w(o).cursor=w(o).cursor===S.key?"":S.key,onContextmenu:de(D=>$(D,S),["prevent"])},[E("td",{class:"selection",onClick:de(D=>w(o).cursor=w(o).cursor===S.key?S.key:"",["stop"])},[E("input",{type:"checkbox",tabindex:"-1",checked:w(o).selected.has(S.key),onChange:D=>D.target.checked?w(o).selected.add(S.key):w(o).selected.delete(S.key)},null,40,Aa)],8,Ia),E("td",$a,[r.value===S?(I(),ee(rn,{key:0,doc:S,rename:l,exit:()=>{r.value=null}},null,8,["doc","exit"])):(I(),P(fe,{key:1},[E("a",{href:S.url,tabindex:"-1",onContextmenu:k[4]||(k[4]=de(()=>{},["stop"])),onFocus:de(D=>w(o).cursor=S.key,["stop"])},oe(S.name),41,Ma),w(o).cursor==S.key?(I(),P("button",{key:0,tabindex:"-1",class:"rename-button",onClick:()=>r.value=S},"🖊️",8,Pa)):G("",!0)],64))]),z(h,{doc:S,now:w(m)},null,8,["doc","now"]),z(g,{doc:S},null,8,["doc"]),E("td",Oa,[E("button",{tabindex:"-1",onClick:de(D=>$(D,S),["stop"])},"⋮",8,Na)])],42,Ra)],64))),128)),n.documents.length>1?(I(),P("tr",Da,[E("td",La,oe(n.documents.length)+" items",1),E("td",Ta,oe(w($o)(n.documents.reduce((S,A)=>S+A.size,0))),1),k[8]||(k[8]=E("td",{class:"menu"},null,-1))])):G("",!0)])])):G("",!0)}}}),Fa=ye(Ba,[["__scopeId","data-v-c61c7c3a"]]),Ha=X({__name:"ExplorerView",props:{path:{},query:{}},setup(e){const t=se(),n=T(),o=e,s=K(()=>{const r=o.path.join("/"),l=o.query;if(!l)return Bo(t.document.filter(p=>p.loc===r),t.prefs.sortListing);const i=Pr(l);let a=100,c=[];for(const p of t.recentDocuments)if(Or(p.haystack,i)&&(c.push(p),--a===0))break;const m=r+"/",u=t.prefs.sortFiltered;return u?Xr(c,u):(c.sort((p,f)=>(f.loc===r)-(p.loc===r)||(f.loc.slice(0,m.length)===m)-(p.loc.slice(0,m.length)===m)||st.compare(p.loc,f.loc)||(p.type==="file")-(f.type==="file")||f.name.includes(l)-p.name.includes(l)||st.compare(p.name,f.name)),c)});return Ie(()=>{t.fileExplorer=n.value,t.query=o.query}),ze([()=>o.path.join("/"),()=>t.document.length],([r,l],[i,a])=>{r===i&&a!==void 0&&a>0||(t.prefs.gallery=s.value.some(c=>c.previewable))},{immediate:!0}),(r,l)=>{const i=ma,a=Gl;return I(),P(fe,null,[w(t).prefs.gallery?(I(),ee(i,{ref_key:"fileExplorer",ref:n,key:`gallery-${w(je).currentRoute.value.path}`,path:o.path,documents:s.value},null,8,["path","documents"])):(I(),ee(Fa,{ref_key:"fileExplorer",ref:n,key:`explorer-${w(je).currentRoute.value.path}`,path:o.path,documents:s.value},null,8,["path","documents"])),z(a,{documents:s.value,path:o.path},null,8,["documents","path"])],64)}}}),Wa=ye(Ha,[["__scopeId","data-v-f7875394"]]),je=$r({history:cr("/"),routes:[{path:"/:pathMatch(.*)*",name:"explorer",component:Wa}]}),za={class:"headermain buttons"},Ua=["value"],ja=X({__name:"HeaderMain",props:{path:{},query:{}},setup(e,{expose:t}){const n=se(),o=nl(),s=T(!1),r=T(),l=T(),i=e,a=p=>{if(!s.value)return;s.value=!1,document.querySelector(".breadcrumb").focus(),c(p)},c=p=>{const f=p.target.value;let x=i.path.join("/");x=x?`/${x}`:"";const b=(f?`${x}//${f}`:x||"/").replaceAll("?","%3F").replaceAll("#","%23");!i.query&&f?je.push(b):je.replace(b)},m=p=>{if(s.value=!s.value,!s.value)return a(p);ge(()=>{const f=r.value;f&&f.focus()})};Ie(()=>{i.query&&(s.value=!0)});const u=p=>{const f=[];o.isExternalAuth&&n.user.isLoggedIn&&f.push({label:"👤 "+(n.user.username||"User Account"),onClick:()=>{window.location.href="/auth/"}}),!o.isExternalAuth&&n.user.isLoggedIn&&f.push({label:"🔑 Change Password",onClick:()=>{n.dialog="settings"}}),n.user.privileged&&f.push({label:"⚙️ Admin Settings",onClick:()=>{n.dialog="usermgmt"}}),n.user.isLoggedIn?f.push({label:"🚪 Logout",onClick:()=>n.logout()}):n.server.public&&f.push({label:"🔐 Login",onClick:async()=>{try{await mn("/auth/restricted#theme=light"),sn()}catch{console.log("Login cancelled")}}}),Lt.showContextMenu({x:p.target.getBoundingClientRect().right,y:p.target.getBoundingClientRect().bottom,items:f})};return t({toggleSearchInput:m,closeSearch:a}),(p,f)=>{const x=tl,R=Dt;return I(),P("nav",za,[z(x,{path:i.path},null,8,["path"]),z(R,{name:"create-folder","data-tooltip":"New folder",onClick:f[0]||(f[0]=()=>{console.log("New",w(n).fileExplorer),w(n).fileExplorer.newFolder(),console.log("Done")})}),ue(p.$slots,"default",{},void 0,!0),f[2]||(f[2]=E("div",{class:"spacer smallgap"},null,-1)),s.value?(I(),P("input",{key:0,ref_key:"search",ref:r,type:"search",value:e.query,onInput:c,placeholder:"Find files",class:"margin-input"},null,40,Ua)):G("",!0),z(R,{ref_key:"searchButton",ref:l,name:"find",onClick:de(m,["prevent"])},null,512),z(R,{name:"eye",onClick:f[1]||(f[1]=b=>w(n).prefs.gallery=!w(n).prefs.gallery)}),z(R,{name:"cog",onClick:u})])}}}),Va=ye(ja,[["__scopeId","data-v-b9ddc09f"]]);function _t(e){return typeof e=="object"&&e!==null&&"error"in e}class qa{async get(t){try{const n=await xt(t,{method:"GET"});if(_t(n))throw new Oe(n.error.code,n.error.message);return n}catch(n){throw n instanceof Ze?new Oe(401,"Authentication cancelled"):n}}async post(t,n){try{const o=await xt(t,{method:"POST",body:n});if(_t(o))throw new Oe(o.error.code,o.error.message);return o}catch(o){throw o instanceof Ze?new Oe(401,"Authentication cancelled"):o}}async put(t,n){try{const o=await xt(t,{method:"PUT",body:n});if(_t(o))throw new Oe(o.error.code,o.error.message);return o}catch(o){throw o instanceof Ze?new Oe(401,"Authentication cancelled"):o}}async delete(t){try{const n=await xt(t,{method:"DELETE"});if(_t(n))throw new Oe(n.error.code,n.error.message);return n}catch(n){throw n instanceof Ze?new Oe(401,"Authentication cancelled"):n}}}const lt=new qa;class Oe extends Error{code;constructor(t,n){super(n),this.code=t}}const Ga=X({__name:"DownloadButton",setup(e){const t=se(),n={total:0,xfer:0,t0:0,tlast:0,statbytes:0,statdur:0,files:[],filestart:0,fileidx:0,filecount:0,filename:"",filesize:0,filepos:0,status:"idle"};t.dprogress={...n},setInterval(()=>{Date.now()-t.dprogress.tlast>3e3?(t.dprogress.statbytes=0,t.dprogress.statdur=1):(t.dprogress.statbytes*=.9,t.dprogress.statdur*=.9)},100);const o=()=>{Object.assign(t.dprogress,n),t.dprogress.t0=Date.now(),t.dprogress.tlast=t.dprogress.t0+1},s=i=>{const a=document.createElement("a");a.href=i,a.download="",a.click()},r=async(i,a)=>{let c="",m=a;console.log("Downloading to filesystem",i.recursive);for(const[u,p,f]of i.recursive)f.dir||(t.dprogress.files.push(u),++t.dprogress.filecount,t.dprogress.total+=f.size);for(const[u,p,f]of i.recursive){c&&!u.startsWith(c+"/")&&(c="",m=a);const x=u.slice(c.length);for(const v of x.split("/").slice(0,f.dir?void 0:-1))if(v){c+=`${v}/`;try{m=await m.getDirectoryHandle(v.normalize("NFC"),{create:!0})}catch($){throw console.error("Failed to create directory",c,$),new Error(`Failed to create directory ${c}: ${$}`)}console.log("Created",c)}if(f.dir)continue;const R=u.split("/").pop().normalize("NFC");let b;try{b=await m.getFileHandle(R,{create:!0})}catch(v){throw console.error("Failed to create file",u,p,c+R,v),new Error(`Failed to create file ${c+R}: ${v}`)}try{const v=await b.createWritable(),$=`/files/${u}`;console.log("Fetching",$);const y=await Oo($);if(!y.ok)throw t.error=`Failed to download ${$}: ${y.status} ${y.statusText}`,new Error(`Failed to download ${$}: ${y.status} ${y.statusText}`);if(y.body){++t.dprogress.fileidx;const k=y.body.getReader();for(await v.truncate(0),t.error="Direct download.",t.dprogress.tlast=Date.now();;){const{value:h,done:g}=await k.read();if(g)break;await v.write(h);const C=Date.now(),S=h.byteLength;t.dprogress.xfer+=S,t.dprogress.filepos+=S,t.dprogress.statbytes+=S,t.dprogress.statdur+=C-t.dprogress.tlast,t.dprogress.tlast=C}}await v.close(),console.log("Saved",c+R)}catch(v){throw console.error("Failed to write file",c+R,v),new Error(`Failed to write file ${c+R}: ${v}`)}}o()},l=async()=>{const i=t.selectedFiles;if(console.log("Download",i),i.keys.length===0){console.warn("Attempted download but no files found. Missing selected keys:",i.missing),t.error="No existing files selected",t.selected.clear();return}const a=i.recursive.filter(([m,u,p])=>!p.dir);if(a.length===1)return t.selected.clear(),t.error="Single file via browser downloads",s(`/files/${a[0][1]}`);if("showDirectoryPicker"in window)try{const m=await window.showDirectoryPicker({startIn:"downloads",mode:"readwrite"});await r(i,m),t.selected.clear();return}catch(m){console.error("Download to folder aborted",m)}console.log("Falling back to zip download");const c=i.keys.length===1?i.docs[i.keys[0]].name:"download";s(`/zip/${Array.from(i.keys).join("+")}/${c}.zip`),t.error="Downloading as ZIP via browser downloads",t.selected.clear()};return(i,a)=>{const c=Dt;return I(),ee(c,{name:"download","data-tooltip":"Download",onClick:l})}}}),Ka={class:"select-text"},Ja=X({__name:"HeaderSelected",props:{path:Array},setup(e){const t=se(),n=e,o=K(()=>n.path.join("/")),s=(r,l)=>{const i=t.selectedFiles,a={op:r,sel:i.keys.map(m=>{const u=i.docs[m];return u.loc?`${u.loc}/${u.name}`:u.name})};l!==void 0&&(a.dst=l);const c=Ue(Ct,{message(m){const u=JSON.parse(m.data);if("error"in u){console.error("Control socket error",a,u.error),t.error=u.error.message;return}else if(u.status==="ack"){console.log("Control ack OK",u),c.close(),t.selected.clear();return}else console.log("Unknown control response",a,u)}});c.onopen=()=>{c.send(JSON.stringify(a))}};return(r,l)=>{const i=Ga,a=Dt;return w(t).selected.size?(I(),P(fe,{key:0},[l[4]||(l[4]=E("div",{class:"smallgap"},null,-1)),E("p",Ka,oe(w(t).selected.size)+" selected ➤",1),z(i),z(a,{name:"copy","data-tooltip":"Copy here",onClick:l[0]||(l[0]=c=>s("cp",o.value))}),z(a,{name:"paste","data-tooltip":"Move here",onClick:l[1]||(l[1]=c=>s("mv",o.value))}),z(a,{name:"trash","data-tooltip":"Delete ⚠️",onClick:l[2]||(l[2]=c=>s("rm"))}),E("button",{class:"action-button unselect","data-tooltip":"Unselect all",onClick:l[3]||(l[3]=c=>w(t).selected.clear())},"❌")],64)):G("",!0)}}}),Ya=["id"],Xa={key:0},Za={class:"modal-content"},jo=X({__name:"ModalDialog",props:{title:{},name:{}},setup(e,{expose:t}){const n=T(null),o=T(null),s=se(),r=()=>{s.dialog="",Po()},l=e;return t({show:()=>{s.dialog=l.name,pn(),ge(()=>{n.value?.focus();const a=o.value?.querySelector("input");a&&a.focus()})},close:r}),Ie(()=>{if(n.value){n.value.focus();const a=o.value?.querySelector("input");a&&a.focus()}}),(a,c)=>w(s).dialog===e.name?(I(),P("div",{key:0,class:"modal-overlay",onClick:de(r,["self"]),onKeydown:Qe(r,["escape"]),tabindex:"-1",ref_key:"overlay",ref:n},[E("div",{class:"modal-dialog",id:l.name,ref_key:"dialog",ref:o},[l.title?(I(),P("h1",Xa,oe(l.title),1)):G("",!0),E("div",Za,[ue(a.$slots,"default",{},()=>[c[0]||(c[0]=He(" Dialog with no content ",-1)),E("button",{onClick:r},"OK")])])],8,Ya)],544)):G("",!0)}}),Qa="/auth/password-change";async function ei(e,t,n){return await lt.post(Qa,{username:e,passwordChange:t,password:n})}const Tt="/auth/users";async function ti(){return await lt.get(Tt)}async function Zn(e,t,n){return await lt.post(Tt,{username:e,password:t,privileged:n})}async function Qn(e,t){return await lt.put(`${Tt}/${e}`,t)}async function eo(e){return await lt.delete(`${Tt}/${e}`)}async function ni(e){return await lt.put("/api/config/public",{public:e})}const oi={class:"form-grid"},si={class:"dialog-buttons"},ri=X({__name:"SettingsModal",setup(e){const t=T(!1),n=se(),o=T(),s=T(),r=et({passwordChange:"",password:""}),l=()=>{r.passwordChange="",r.password="",n.dialog=""},i=async a=>{a.preventDefault();try{if(r.passwordChange){if(!r.password){n.error="⚠️ Current password is required",s.value.focus();return}await ei(n.user.username,r.passwordChange,r.password)}l()}catch(c){const m=c;n.error=m.message||"🛑 Unknown error"}finally{t.value=!1}};return(a,c)=>{const m=jo;return I(),ee(m,{name:"settings",title:"Settings"},{default:Re(()=>[E("form",null,[w(n).user.isLoggedIn?(I(),P(fe,{key:0},[c[5]||(c[5]=E("h3",null,"Update your authentication",-1)),E("div",oi,[c[2]||(c[2]=E("label",{for:"passwordChange"},"New password:",-1)),kt(E("input",{ref_key:"passwordChange",ref:o,id:"passwordChange",type:"password",autocomplete:"new-password",spellcheck:"false",autocorrect:"off","onUpdate:modelValue":c[0]||(c[0]=u=>r.passwordChange=u)},null,512),[[Yt,r.passwordChange]]),c[3]||(c[3]=E("label",{for:"password"},"Current password:",-1)),kt(E("input",{ref_key:"password",ref:s,id:"password",name:"password",type:"password",autocomplete:"current-password",spellcheck:"false",autocorrect:"off","onUpdate:modelValue":c[1]||(c[1]=u=>r.password=u)},null,512),[[Yt,r.password]])]),E("div",si,[E("input",{id:"close",type:"reset",value:"Close",class:"button",onClick:l}),c[4]||(c[4]=E("div",{class:"spacer"},null,-1)),E("input",{id:"submit",type:"submit",value:"Submit",class:"button",onClick:de(i,["prevent"])})])],64)):(I(),P(fe,{key:1},[c[7]||(c[7]=E("p",null,"No settings are available because you have not logged in.",-1)),E("div",{class:"dialog-buttons"},[c[6]||(c[6]=E("div",{class:"spacer"},null,-1)),E("input",{id:"close",type:"reset",value:"Close",class:"button",onClick:l})])],64))])]),_:1})}}}),li=ye(ri,[["__scopeId","data-v-a4815627"]]),ai={key:0,class:"loading"},ii={key:1},ci={class:"form-row"},ui={for:"publicAccess"},di=["checked","onChange","disabled"],fi=["onClick"],pi=["onClick"],mi=["onClick","disabled"],hi=X({__name:"UserManagementModal",setup(e){const t=se(),n=T(!0),o=T([]),s=T(""),r=T("📋"),l=et({public:!1}),i=()=>{t.dialog="",s.value=""},a=async()=>{try{n.value=!0;const b=await ti();o.value=b.users}catch(b){const v=b;t.error=v.message||"Failed to load users"}finally{n.value=!1}},c=async()=>{const b=window.prompt("Enter username for new user:");if(!(!b||!b.trim()))try{s.value="";const v=await Zn(b.trim(),void 0,!1);await a(),v.password&&(s.value=`User ${b.trim()} created. Password: ${v.password}`)}catch(v){const $=v;t.error=$.message||"Failed to add user"}},m=async(b,v)=>{const $=v.target;try{await Qn(b.username,{privileged:$.checked}),b.privileged=$.checked}catch(y){const k=y;t.error=k.message||"Failed to update user",$.checked=b.privileged}},u=async b=>{const v=window.prompt("Enter new username:",b.username);if(!(!v||!v.trim()||v.trim()===b.username))try{s.value="";const $=await Zn(v.trim(),void 0,b.privileged);await eo(b.username),await a(),$.password&&(s.value=`User renamed to ${v.trim()}. New password: ${$.password}`)}catch($){const y=$;t.error=y.message||"Failed to rename user"}},p=async b=>{if(confirm(`Reset password for ${b.username}? A new password will be generated.`))try{s.value="";const v=await Qn(b.username,{password:""});v.password&&(s.value=`Password reset for ${b.username}. New password: ${v.password}`)}catch(v){const $=v;t.error=$.message||"Failed to reset password"}},f=async b=>{if(confirm(`Delete user ${b}?`))try{await eo(b),await a()}catch(v){const $=v;t.error=$.message||"Failed to delete user"}},x=async(b=!1)=>{const v=s.value.match(/(?:Password|New password): (.+)/);if(v)if(await navigator.clipboard.writeText(v[1]),b){r.value="✅ Copied!";const $=s.value.replace(/(?:Password|New password): .+/,"Password copied to clipboard!");s.value=$,setTimeout(()=>{s.value="",r.value="📋"},3e3)}else s.value=""},R=async()=>{try{s.value="",await ni(l.public),t.server.public=l.public,s.value="Server settings updated"}catch(b){const v=b;t.error=v.message||"Failed to update settings"}};return be(()=>{l.public=t.server.public||!1,n.value=!1}),ze(()=>t.dialog,b=>{b==="usermgmt"&&!t.server.paskia&&a()}),ze(()=>t.server.public,b=>{l.public=b||!1}),(b,v)=>{const $=jo;return I(),ee($,{name:"usermgmt",title:"Admin Settings"},{default:Re(()=>[n.value?(I(),P("div",ai,"Loading...")):(I(),P("div",ii,[v[8]||(v[8]=E("h3",null,"Server Settings",-1)),E("div",ci,[E("label",ui,[kt(E("input",{type:"checkbox",id:"publicAccess","onUpdate:modelValue":v[0]||(v[0]=y=>l.public=y),onChange:R},null,544),[[co,l.public]]),v[3]||(v[3]=He(" Public access (anyone can read and write) ",-1))])]),w(t).server.paskia?(I(),P(fe,{key:0},[v[4]||(v[4]=E("h3",null,"User Management",-1)),v[5]||(v[5]=E("p",null,[He("See "),E("a",{href:"/auth/admin/"},"Paskia Admin"),He(".")],-1))],64)):(I(),P(fe,{key:1},[v[7]||(v[7]=E("h3",null,"Users",-1)),E("button",{onClick:c,class:"button",title:"Add new user"},"➕ Add User"),s.value?(I(),P("div",{key:0,class:"success-message",onClick:v[2]||(v[2]=y=>x(!1))},[He(oe(s.value)+" ",1),s.value.includes("Password:")||s.value.includes("New password:")?(I(),P("button",{key:0,onClick:v[1]||(v[1]=de(y=>x(!0),["stop"])),class:"button small",title:"Copy to clipboard"},oe(r.value),1)):G("",!0)])):G("",!0),E("table",null,[v[6]||(v[6]=E("thead",null,[E("tr",null,[E("th",null,"Username"),E("th",null,"Admin"),E("th",null,"Actions")])],-1)),E("tbody",null,[(I(!0),P(fe,null,rt(o.value,y=>(I(),P("tr",{key:y.username},[E("td",null,oe(y.username),1),E("td",null,[E("input",{type:"checkbox",checked:y.privileged,onChange:k=>m(y,k),disabled:y.username===w(t).user.username},null,40,di)]),E("td",null,[E("button",{onClick:k=>u(y),class:"button small",title:"Rename user"},"✏️",8,fi),E("button",{onClick:k=>p(y),class:"button small",title:"Reset password"},"🔑",8,pi),E("button",{onClick:k=>f(y.username),class:"button small danger",disabled:y.username===w(t).user.username,title:"Delete user"},"🗑️",8,mi)])]))),128))])])],64)),E("div",{class:"dialog-buttons"},[E("button",{onClick:i,class:"button"},"Close")])]))]),_:1})}}}),vi=ye(hi,[["__scopeId","data-v-f58072c3"]]),gi={key:0,class:"modal-overlay"},yi=X({__name:"AccessDeniedModal",setup(e){const t=se(),n=()=>{location.reload()};return Ie(()=>{t.dialog==="accessdenied"&&pn()}),(o,s)=>w(t).dialog==="accessdenied"?(I(),P("div",gi,[E("div",{class:"modal-dialog",id:"accessdenied"},[E("div",{class:"modal-content access-denied"},[s[0]||(s[0]=E("p",{class:"icon"},"⛔",-1)),s[1]||(s[1]=E("p",{class:"message"},"Access Denied",-1)),E("button",{onClick:n,class:"button"},"Reload")])])])):G("",!0)}}),wi=ye(yi,[["__scopeId","data-v-eaaa3c09"]]),ki=X({__name:"App",setup(e){const t=se(),n=K(()=>{const l=decodeURIComponent(je.currentRoute.value.path).split("//"),i=(l[0]??"").split("/").filter(c=>c!==""),a=l.slice(1).join("//");return{path:l[0]??"",pathList:i,query:a}});Ie(()=>{document.title=n.value.path.replace(/\/$/,"").split("/").pop()||t.server.name||"Cista Storage"}),be(jr),be(Nt),wt(Vr);const o=T(null);let s=null;const r=l=>{if(t.dialog){s&&(clearTimeout(s),s=null);return}const i=t.fileExplorer;if(!i)return;const a=i.isCursor(),c=l.target.tagName==="INPUT",m=l.type==="keyup";if(l.repeat){(l.key==="ArrowUp"||l.key==="ArrowDown"||l.key==="ArrowLeft"||l.key==="ArrowRight"||a&&l.code==="Space")&&(c||l.preventDefault());return}let u="";if(!c&&l.key.startsWith("Arrow"))u=l.key.slice(5).toLowerCase();else if(!m&&l.key==="f"&&(l.ctrlKey||l.metaKey))o.value.toggleSearchInput();else if(!c&&m&&l.key==="/")o.value.toggleSearchInput();else if(m&&l.key==="Escape")t.error="",o.value.closeSearch(l),t.focusBreadcrumb();else if(!c&&m&&l.key==="Backspace")je.back();else if(!c&&!m&&l.key==="a"&&(l.ctrlKey||l.metaKey))i.toggleSelectAll();else if(!c&&m&&l.key==="g")t.prefs.gallery=!t.prefs.gallery;else if(!c&&m&&(l.code==="Backquote"||l.key==="1"||l.key==="2"||l.key==="3"))t.sort(["","name","modified","size"][+l.key||0]);else if(!c&&a&&m&&!l.ctrlKey&&(l.key==="F2"||l.key==="r"))i.cursorRename();else if(!c&&a&&l.code==="Space")m&&!l.altKey&&!l.ctrlKey&&i.cursorSelect();else return;l.preventDefault(),s&&(clearTimeout(s),s=null);let p;switch(u){case"up":p=()=>i.up(l);break;case"down":p=()=>i.down(l);break;case"left":p=()=>i.left(l);break;case"right":p=()=>i.right(l);break}if(p&&!m){const x=l.altKey?20:100;p(),s=setTimeout(()=>{s=setInterval(p,x)},200-x)}};return be(()=>{window.addEventListener("keydown",r),window.addEventListener("keyup",r)}),wt(()=>{window.removeEventListener("keydown",r),window.removeEventListener("keyup",r)}),(l,i)=>{const a=li,c=Ja,m=Va,u=hn,p=xs;return I(),P(fe,null,[w(t).error&&!w(t).authInProgress?(I(),P("div",{key:0,class:"toast-message",onClick:i[0]||(i[0]=f=>w(t).error="")},oe(w(t).error),1)):G("",!0),z(a),z(vi),z(wi),E("header",null,[z(m,{ref_key:"headerMain",ref:o,path:n.value.pathList,query:n.value.query},{default:Re(()=>[z(c,{path:n.value.pathList},null,8,["path"])]),_:1},8,["path","query"]),z(u,{path:n.value.pathList,primary:""},null,8,["path"])]),E("main",null,[z(w(Ao),{path:n.value.pathList,query:n.value.query},null,8,["path","query"])]),E("footer",null,[z(p,{status:w(t).uprogress,onCancel:w(t).cancelUploads,class:"upload"},null,8,["status","onCancel"]),z(p,{status:w(t).dprogress,onCancel:w(t).cancelDownloads,class:"download"},null,8,["status","onCancel"])])],64)}}});function bi(e,t){if(e==null)return;let n=e;for(let o=0;o<t.length;o++){if(n===void 0||n[t[o]]===void 0)return;if(n===null||n[t[o]]===null)return null;n=n[t[o]]}return n}function wn(e,t,n){if(n.length===0)return t;const o=n[0];return n.length>1&&(t=wn(typeof e!="object"||e===null||!Object.prototype.hasOwnProperty.call(e,o)?Number.isInteger(Number(n[1]))?[]:{}:e[o],t,Array.prototype.slice.call(n,1))),Number.isInteger(Number(o))&&Array.isArray(e)?e.slice()[o]:Object.assign({},e,{[o]:t})}function Vo(e,t){if(e==null||t.length===0)return e;if(t.length===1){if(e==null)return e;if(Number.isInteger(t[0])&&Array.isArray(e))return Array.prototype.slice.call(e,0).splice(t[0],1);const n={};for(const o in e)n[o]=e[o];return delete n[t[0]],n}if(e[t[0]]==null){if(Number.isInteger(t[0])&&Array.isArray(e))return Array.prototype.concat.call([],e);const n={};for(const o in e)n[o]=e[o];return n}return wn(e,Vo(e[t[0]],Array.prototype.slice.call(t,1)),[t[0]])}function qo(e,t){return t.map(n=>n.split(".")).map(n=>[n,bi(e,n)]).filter(n=>n[1]!==void 0).reduce((n,o)=>wn(n,o[1],o[0]),{})}function Go(e,t){return t.map(n=>n.split(".")).reduce((n,o)=>Vo(n,o),e)}function to(e,{storage:t,serializer:n,key:o,debug:s,pick:r,omit:l,beforeHydrate:i,afterHydrate:a},c,m=!0){try{m&&i?.(c);const u=t.getItem(o);if(u){const p=n.deserialize(u),f=r?qo(p,r):p,x=l?Go(f,l):f;e.$patch(x)}m&&a?.(c)}catch(u){s&&console.error("[pinia-plugin-persistedstate]",u)}}function no(e,{storage:t,serializer:n,key:o,debug:s,pick:r,omit:l}){try{const i=r?qo(e,r):e,a=l?Go(i,l):i,c=n.serialize(a);t.setItem(o,c)}catch(i){s&&console.error("[pinia-plugin-persistedstate]",i)}}function Ci(e,t){return typeof e=="function"?e(t):typeof e=="string"?e:t}function Si(e,t,n){const{pinia:o,store:s,options:{persist:r=n}}=e;if(!r)return;if(!(s.$id in o.state.value)){const i=o._s.get(s.$id.replace("__hot:",""));i&&Promise.resolve().then(()=>i.$persist());return}const l=(Array.isArray(r)?r:r===!0?[{}]:[r]).map(t);s.$hydrate=({runHooks:i=!0}={})=>{l.forEach(a=>{to(s,a,e,i)})},s.$persist=()=>{l.forEach(i=>{no(s.$state,i)})},l.forEach(i=>{to(s,i,e),s.$subscribe((a,c)=>no(c,i),{detached:!0})})}function xi(e={}){return function(t){Si(t,n=>{const o=Ci(n.key,t.store.$id);return{key:(e.key?e.key:s=>s)(o),debug:n.debug??e.debug??!1,serializer:n.serializer??e.serializer??{serialize:s=>JSON.stringify(s),deserialize:s=>JSON.parse(s)},storage:n.storage??e.storage??window.localStorage,beforeHydrate:n.beforeHydrate??e.beforeHydrate,afterHydrate:n.afterHydrate??e.afterHydrate,pick:n.pick,omit:n.omit}},e.auto??!1)}}var _i=xi();const St=us(ki);St.config.errorHandler=e=>{console.log(e)};const Ko=ds();Ko.use(_i);St.use(Ko);St.use(je);St.use(Lt);St.mount("#app");
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
9
|
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono&family=Roboto:wght@400;700&display=swap" rel="stylesheet">
|
|
10
|
-
<script type="module" crossorigin src="/assets/index-
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-PhZha5OE.js"></script>
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/icons-DMD182WZ.js">
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-B0IgN1zv.css">
|
|
13
13
|
|
|
14
14
|
<body id="app">
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|