diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index fea021fa..28ba6a56 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -24,7 +24,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: 1.22.2 + go-version: 1.23.0 - run: make lint-backend lint: runs-on: ubuntu-latest @@ -47,7 +47,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: 1.22.2 + go-version: 1.23.0 - run: make test-backend test: runs-on: ubuntu-latest @@ -66,7 +66,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@v5 with: - go-version: 1.22.2 + go-version: 1.23.0 - uses: actions/setup-node@v4 with: node-version: '18' diff --git a/.goreleaser.yml b/.goreleaser.yml index d500f967..2fbdefc6 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -1,3 +1,5 @@ +version: 2 + project_name: filebrowser env: @@ -189,7 +191,7 @@ brews: repository: owner: filebrowser name: homebrew-tap - folder: Formula + directory: Formula homepage: https://filebrowser.org commit_author: name: FileBrowser Robot diff --git a/.tx/config b/.tx/config index 339e80b4..f7363d04 100644 --- a/.tx/config +++ b/.tx/config @@ -1,6 +1,6 @@ [main] host = https://www.transifex.com -lang_map = pt_BR: pt-br, zh_CN: zh-cn, zh_HK: zh-hk, zh_TW: zh-tw, nl_BE: nl-be, sv_SE: sv-se +lang_map = pt_BR: pt-br, zh_CN: zh-cn, zh_HK: zh-hk, zh_TW: zh-tw, nl_BE: nl-be, sv_SE: sv-se, cz-CS: cz_cs [file-browser.file-browser] file_filter = frontend/src/i18n/.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 886f5df9..806f17e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,50 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [2.31.1](https://github.com/filebrowser/filebrowser/compare/v2.31.0...v2.31.1) (2024-08-30) + + +### Bug Fixes + +* command not found in shell ([#3438](https://github.com/filebrowser/filebrowser/issues/3438)) ([121d9ab](https://github.com/filebrowser/filebrowser/commit/121d9abecdc7d4e923cfc5023519995938a6ccae)) + + +### Build + +* update to alpine 3.20 ([#3447](https://github.com/filebrowser/filebrowser/issues/3447)) ([7de6bc4](https://github.com/filebrowser/filebrowser/commit/7de6bc4a912b5734dd0df02ed8391e78619e2615)) + +## [2.31.0](https://github.com/filebrowser/filebrowser/compare/v2.30.0...v2.31.0) (2024-08-29) + + +### Features + +* add Czech translation ([#3416](https://github.com/filebrowser/filebrowser/issues/3416)) ([8e67a12](https://github.com/filebrowser/filebrowser/commit/8e67a12f260caefcbe419c2281025b9b15f02bf3)) +* Added epub preview. Resolves [#3375](https://github.com/filebrowser/filebrowser/issues/3375) ([#3376](https://github.com/filebrowser/filebrowser/issues/3376)) ([99a6382](https://github.com/filebrowser/filebrowser/commit/99a6382b320874e94f9bd74708f46dd9a7485d3c)) +* implement markdown file preview in Ace editor ([#3431](https://github.com/filebrowser/filebrowser/issues/3431)) ([b0f4604](https://github.com/filebrowser/filebrowser/commit/b0f4604f44e6a35e07df3000f106f523cd942cfc)) +* support mime type for epub extension ([#3425](https://github.com/filebrowser/filebrowser/issues/3425)) ([f6f7e5f](https://github.com/filebrowser/filebrowser/commit/f6f7e5fea3ff7073ee652008a51cb5445a6f3d5d)) + + +### Bug Fixes + +* clipboard copy in safari ([#3261](https://github.com/filebrowser/filebrowser/issues/3261)) ([1fccc5d](https://github.com/filebrowser/filebrowser/commit/1fccc5d649add2a56c55e75cf9dec4851e6d7cbf)) +* CSS selectors for listing icons ([#3277](https://github.com/filebrowser/filebrowser/issues/3277)) ([2a90cdf](https://github.com/filebrowser/filebrowser/commit/2a90cdfdaff8655c7cb1167c01994a0978dece8f)) +* fix catalan i18n file ([090272e](https://github.com/filebrowser/filebrowser/commit/090272e3b7c56a940c4aa2d28f860c574aa17d53)) +* fixing an issue where the upload indicator would "jump" around in the UI ([#3354](https://github.com/filebrowser/filebrowser/issues/3354)) ([7be5644](https://github.com/filebrowser/filebrowser/commit/7be564495226bc6846289a56edb8893511036c6e)) +* **frontend:** N files selected hint use i18n ([#3390](https://github.com/filebrowser/filebrowser/issues/3390)) ([10bf3cf](https://github.com/filebrowser/filebrowser/commit/10bf3cffbf8eb7d95fe4e1cc6acf1012329744b9)) +* pdf preview header ([#3274](https://github.com/filebrowser/filebrowser/issues/3274)) ([a838868](https://github.com/filebrowser/filebrowser/commit/a8388689f3019083f263845900f683ddc13884dc)) +* pull down to refresh within editor ([#3378](https://github.com/filebrowser/filebrowser/issues/3378)) ([21783ed](https://github.com/filebrowser/filebrowser/commit/21783ed91a13ad52afdb411e43faf14fb6ef6e42)) + + +### Build + +* bump go libs ([b596567](https://github.com/filebrowser/filebrowser/commit/b596567c6163d57eaefbf3e30d84cfca65c24cdf)) +* bump go version to 1.23.0 ([364fdaa](https://github.com/filebrowser/filebrowser/commit/364fdaaf0c1eace82ff8637d337cc1b32e5e9972)) +* bump golangci-lint to 1.60.3 ([a6347c8](https://github.com/filebrowser/filebrowser/commit/a6347c88586e584b4565277b0010fa9ff2576b1f)) +* **deps-dev:** bump braces from 3.0.2 to 3.0.3 in /frontend ([#3316](https://github.com/filebrowser/filebrowser/issues/3316)) ([e8589be](https://github.com/filebrowser/filebrowser/commit/e8589be6409a2b29edd44ee2edd3fbf6b2d72724)) +* **deps-dev:** bump ws from 8.16.0 to 8.17.1 in /frontend ([#3321](https://github.com/filebrowser/filebrowser/issues/3321)) ([c3465f9](https://github.com/filebrowser/filebrowser/commit/c3465f99136506d51b813be4f31b289e708da0ce)) +* **deps:** bump golang.org/x/image from 0.15.0 to 0.18.0 ([#3335](https://github.com/filebrowser/filebrowser/issues/3335)) ([30a8ddf](https://github.com/filebrowser/filebrowser/commit/30a8ddf113862e3de2c09547662b7f2af8a30dfe)) +* fix goreleaser file ([056cfa8](https://github.com/filebrowser/filebrowser/commit/056cfa8facdca4c397a6b245028d4c9d3f0ca518)) + ## [2.30.0](https://github.com/filebrowser/filebrowser/compare/v2.29.0...v2.30.0) (2024-05-19) @@ -55,7 +99,7 @@ All notable changes to this project will be documented in this file. See [standa * close editor when click escape key ([#2947](https://github.com/filebrowser/filebrowser/issues/2947)) ([70c8261](https://github.com/filebrowser/filebrowser/commit/70c826133b8578b8712e6db8f762a15a076cd9a9)) * enable preview in shared folder ([#3055](https://github.com/filebrowser/filebrowser/issues/3055)) ([4c233c3](https://github.com/filebrowser/filebrowser/commit/4c233c3db39ea5a00d6e602ec0ecbddecb590877)) * focus editor when opened ([#2946](https://github.com/filebrowser/filebrowser/issues/2946)) ([b19710e](https://github.com/filebrowser/filebrowser/commit/b19710efca6daa7af56dc211d0051d500d2eea22)) -* freezing the list in the backgroud while previewing a file ([#3004](https://github.com/filebrowser/filebrowser/issues/3004)) ([e167c3e](https://github.com/filebrowser/filebrowser/commit/e167c3e1efed8b16be45d994a8d443fda1d8cf49)) +* freezing the list in the background while previewing a file ([#3004](https://github.com/filebrowser/filebrowser/issues/3004)) ([e167c3e](https://github.com/filebrowser/filebrowser/commit/e167c3e1efed8b16be45d994a8d443fda1d8cf49)) * prompt to confirm discard editor changes ([#2948](https://github.com/filebrowser/filebrowser/issues/2948)) ([fb1a09c](https://github.com/filebrowser/filebrowser/commit/fb1a09c7c172b913c12b30975ca545e505df0c05)) * select multiple files with ctrl even with singleClick option ([#2953](https://github.com/filebrowser/filebrowser/issues/2953)) ([d49c3df](https://github.com/filebrowser/filebrowser/commit/d49c3dfacfc0ff07e620b3ad2700e64927b06235)) diff --git a/Dockerfile.s6 b/Dockerfile.s6 index 233feb22..63c43018 100644 --- a/Dockerfile.s6 +++ b/Dockerfile.s6 @@ -1,4 +1,4 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:3.17 +FROM ghcr.io/linuxserver/baseimage-alpine:3.20 RUN apk --update add ca-certificates \ mailcap \ diff --git a/Dockerfile.s6.aarch64 b/Dockerfile.s6.aarch64 index d7f3dcee..752e3ed3 100644 --- a/Dockerfile.s6.aarch64 +++ b/Dockerfile.s6.aarch64 @@ -1,4 +1,4 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.17 +FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.20 RUN apk --update add ca-certificates \ mailcap \ diff --git a/Dockerfile.s6.armhf b/Dockerfile.s6.armhf deleted file mode 100644 index 17bd1def..00000000 --- a/Dockerfile.s6.armhf +++ /dev/null @@ -1,16 +0,0 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.17 - -RUN apk --update add ca-certificates \ - mailcap \ - curl - -HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \ - CMD curl -f http://localhost/health || exit 1 - -# copy local files -COPY docker/root/ / -COPY filebrowser /usr/bin/filebrowser - -# ports and volumes -VOLUME /srv /config /database -EXPOSE 80 \ No newline at end of file diff --git a/cmd/root.go b/cmd/root.go index 27c0a8db..59329c5c 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -76,7 +76,7 @@ var rootCmd = &cobra.Command{ Use: "filebrowser", Short: "A stylish web-based file browser", Long: `File Browser CLI lets you create the database to use with File Browser, -manage your users and all the configurations without acessing the +manage your users and all the configurations without accessing the web interface. If you've never run File Browser, you'll need to have a database for @@ -108,7 +108,7 @@ name in caps. So to set "database" via an env variable, you should set FB_DATABASE. Also, if the database path doesn't exist, File Browser will enter into -the quick setup mode and a new database will be bootstraped and a new +the quick setup mode and a new database will be bootstrapped and a new user created with the credentials from options "username" and "password".`, Run: python(func(cmd *cobra.Command, _ []string, d pythonData) { log.Println(cfgFile) diff --git a/cmd/utils.go b/cmd/utils.go index d4ccbacc..78f48d13 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -188,7 +188,7 @@ func cleanUpMapValue(v interface{}) interface{} { } // convertCmdStrToCmdArray checks if cmd string is blank (whitespace included) -// then returns empty string array, else returns the splitted word array of cmd. +// then returns empty string array, else returns the split word array of cmd. // This is to ensure the result will never be []string{""} func convertCmdStrToCmdArray(cmd string) []string { var cmdArray []string diff --git a/docker/root/etc/cont-init.d/20-config b/docker/root/custom-cont-init.d/20-config old mode 100644 new mode 100755 similarity index 97% rename from docker/root/etc/cont-init.d/20-config rename to docker/root/custom-cont-init.d/20-config index e9fa26b2..80bec7cd --- a/docker/root/etc/cont-init.d/20-config +++ b/docker/root/custom-cont-init.d/20-config @@ -12,4 +12,4 @@ fi chown abc:abc \ /config/settings.json \ /database \ - /srv \ No newline at end of file + /srv diff --git a/docker/root/etc/services.d/filebrowser/run b/docker/root/etc/services.d/filebrowser/run old mode 100644 new mode 100755 diff --git a/files/mime.go b/files/mime.go index 1f715f5c..33fd93bd 100644 --- a/files/mime.go +++ b/files/mime.go @@ -28,7 +28,7 @@ const ( ContentTextHeaderValue = "text/plain" // ContentXMLHeaderValue header value for XML data. ContentXMLHeaderValue = "text/xml" - // ContentXMLUnreadableHeaderValue obselete header value for XML. + // ContentXMLUnreadableHeaderValue obsolete header value for XML. ContentXMLUnreadableHeaderValue = "application/xml" // ContentMarkdownHeaderValue custom key/content type, the real is the text/html. ContentMarkdownHeaderValue = "text/markdown" @@ -597,6 +597,7 @@ var types = map[string]string{ ".m3u8": "application/x-mpegURL", ".mpd": "application/dash+xml", ".webp": "image/webp", + ".epub": "application/epub+zip", } //nolint:gochecknoinits diff --git a/fileutils/file.go b/fileutils/file.go index fdf11225..a12f2720 100644 --- a/fileutils/file.go +++ b/fileutils/file.go @@ -98,7 +98,7 @@ func CommonPrefix(sep byte, paths ...string) string { // (e.g. /home/user1, /home/user1/foo, /home/user1/bar). // path.Clean will have cleaned off trailing / separators with // the exception of the root directory, "/" (in which case we - // make it "//", but this will get fixed up to "/" bellow). + // make it "//", but this will get fixed up to "/" below). c = append(c, sep) // Ignore the first path since it's already in c diff --git a/frontend/package-lock.json b/frontend/package-lock.json index dcab386e..624f94eb 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -18,6 +18,7 @@ "js-base64": "^3.7.7", "jwt-decode": "^4.0.0", "lodash-es": "^4.17.21", + "marked": "^14.1.0", "material-icons": "^1.13.12", "normalize.css": "^8.0.1", "pinia": "^2.1.7", @@ -32,6 +33,7 @@ "vue-final-modal": "^4.5.4", "vue-i18n": "^9.10.2", "vue-lazyload": "^3.0.0", + "vue-reader": "^1.2.14", "vue-router": "^4.3.0", "vue-toastification": "^2.0.0-rc.5" }, @@ -54,7 +56,7 @@ "postcss": "^8.4.38", "prettier": "^3.2.5", "terser": "^5.30.0", - "vite": "^5.2.7", + "vite": "^5.4.6", "vite-plugin-compression2": "^1.0.0", "vue-tsc": "^2.0.7" }, @@ -1791,9 +1793,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -1807,9 +1809,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -1823,9 +1825,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -1839,9 +1841,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -1855,9 +1857,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -1871,9 +1873,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -1887,9 +1889,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -1903,9 +1905,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -1919,9 +1921,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -1935,9 +1937,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -1951,9 +1953,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -1967,9 +1969,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -1983,9 +1985,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -1999,9 +2001,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -2015,9 +2017,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -2031,9 +2033,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -2047,9 +2049,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -2063,9 +2065,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -2079,9 +2081,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -2095,9 +2097,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -2111,9 +2113,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -2127,9 +2129,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -2143,9 +2145,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -2556,9 +2558,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", + "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", "cpu": [ "arm" ], @@ -2569,9 +2571,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", + "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", "cpu": [ "arm64" ], @@ -2582,9 +2584,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", + "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", "cpu": [ "arm64" ], @@ -2595,9 +2597,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", + "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", "cpu": [ "x64" ], @@ -2608,9 +2610,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", + "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", + "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", "cpu": [ "arm" ], @@ -2621,9 +2636,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", + "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", "cpu": [ "arm64" ], @@ -2634,9 +2649,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", + "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", "cpu": [ "arm64" ], @@ -2647,11 +2662,11 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", + "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", "cpu": [ - "ppc64le" + "ppc64" ], "dev": true, "optional": true, @@ -2660,9 +2675,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", + "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", "cpu": [ "riscv64" ], @@ -2673,9 +2688,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", + "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", "cpu": [ "s390x" ], @@ -2686,9 +2701,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", + "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", "cpu": [ "x64" ], @@ -2699,9 +2714,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", + "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", "cpu": [ "x64" ], @@ -2712,9 +2727,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", + "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", "cpu": [ "arm64" ], @@ -2725,9 +2740,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", + "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", "cpu": [ "ia32" ], @@ -2738,9 +2753,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", + "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", "cpu": [ "x64" ], @@ -2762,6 +2777,16 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/localforage": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/localforage/-/localforage-0.0.34.tgz", + "integrity": "sha512-tJxahnjm9dEI1X+hQSC5f2BSd/coZaqbIl1m3TCl0q9SVuC52XcXfV0XmoCU1+PmjyucuVITwoTnN8OlTbEXXA==", + "deprecated": "This is a stub types definition for localforage (https://github.com/localForage/localForage). localforage provides its own type definitions, so you don't need @types/localforage installed!", + "license": "MIT", + "dependencies": { + "localforage": "*" + } + }, "node_modules/@types/lodash": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", @@ -3095,31 +3120,29 @@ } }, "node_modules/@volar/language-core": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.1.6.tgz", - "integrity": "sha512-pAlMCGX/HatBSiDFMdMyqUshkbwWbLxpN/RL7HCQDOo2gYBE+uS+nanosLc1qR6pTQ/U8q00xt8bdrrAFPSC0A==", + "version": "2.4.0-alpha.19", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.0-alpha.19.tgz", + "integrity": "sha512-8H6x3vC0/SbOqy1cU0s7/Hk9nNH61t8qOoghjX7XpguLagEyjF6zkMp6C5F/sBlpr0WpeByc1KDfyBHumB8ZfA==", "dev": true, "dependencies": { - "@volar/source-map": "2.1.6" + "@volar/source-map": "2.4.0-alpha.19" } }, "node_modules/@volar/source-map": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.1.6.tgz", - "integrity": "sha512-TeyH8pHHonRCHYI91J7fWUoxi0zWV8whZTVRlsWHSYfjm58Blalkf9LrZ+pj6OiverPTmrHRkBsG17ScQyWECw==", - "dev": true, - "dependencies": { - "muggle-string": "^0.4.0" - } + "version": "2.4.0-alpha.19", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.0-alpha.19.tgz", + "integrity": "sha512-f86wTDVVjWUtaBcmFYTTLtWpBfooNfZmwvn73f+KXIchYqKgQVzOuGbORuVPwSrAjYLPW0f8Aa5Gb9TbdI17Ug==", + "dev": true }, "node_modules/@volar/typescript": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.1.6.tgz", - "integrity": "sha512-JgPGhORHqXuyC3r6skPmPHIZj4LoMmGlYErFTuPNBq9Nhc9VTv7ctHY7A3jMN3ngKEfRrfnUcwXHztvdSQqNfw==", + "version": "2.4.0-alpha.19", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.0-alpha.19.tgz", + "integrity": "sha512-Q7tfVVL3HmvUlqjcoTEk/6LiwlDF13XP8avAARovK4Qc6Djsckc+COLovr+ZX6kIxxTdM+Ggv9C0nCNFjMeiSQ==", "dev": true, "dependencies": { - "@volar/language-core": "2.1.6", - "path-browserify": "^1.0.1" + "@volar/language-core": "2.4.0-alpha.19", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" } }, "node_modules/@vue/compiler-core": { @@ -3168,6 +3191,16 @@ "@vue/shared": "3.4.21" } }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, "node_modules/@vue/devtools-api": { "version": "6.6.1", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", @@ -3212,18 +3245,19 @@ } }, "node_modules/@vue/language-core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.7.tgz", - "integrity": "sha512-Vh1yZX3XmYjn9yYLkjU8DN6L0ceBtEcapqiyclHne8guG84IaTzqtvizZB1Yfxm3h6m7EIvjerLO5fvOZO6IIQ==", + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.29.tgz", + "integrity": "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==", "dev": true, "dependencies": { - "@volar/language-core": "~2.1.3", + "@volar/language-core": "~2.4.0-alpha.18", "@vue/compiler-dom": "^3.4.0", + "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.4.0", "computeds": "^0.0.1", "minimatch": "^9.0.3", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" @@ -4097,8 +4131,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -4148,6 +4181,19 @@ "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz", "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==" }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/data-urls": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", @@ -4299,10 +4345,76 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/epubjs": { + "version": "0.3.93", + "resolved": "https://registry.npmjs.org/epubjs/-/epubjs-0.3.93.tgz", + "integrity": "sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==", + "license": "BSD-2-Clause", + "dependencies": { + "@types/localforage": "0.0.34", + "@xmldom/xmldom": "^0.7.5", + "core-js": "^3.18.3", + "event-emitter": "^0.3.5", + "jszip": "^3.7.1", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "marks-pane": "^1.0.9", + "path-webpack": "0.0.3" + } + }, + "node_modules/epubjs/node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -4312,29 +4424,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -4657,6 +4769,21 @@ "node": ">=8" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -4734,6 +4861,25 @@ "node": ">=0.10.0" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5160,6 +5306,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5203,8 +5355,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -5318,8 +5469,7 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", @@ -5465,6 +5615,18 @@ "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/jwt-decode": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", @@ -5500,6 +5662,33 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/localforage/node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5518,8 +5707,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", @@ -5636,6 +5824,24 @@ "node": ">=12" } }, + "node_modules/marked": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-14.1.0.tgz", + "integrity": "sha512-P93GikH/Pde0hM5TAXEd8I4JAYi8IB03n8qzW8Bh1BIEFpEyBoYxi/XWZA53LSpTeLBiMQOoSMj0u5E/tiVYTA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/marks-pane": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/marks-pane/-/marks-pane-1.0.9.tgz", + "integrity": "sha512-Ahs4oeG90tbdPWwAJkAAoHg2lRR8lAs9mZXETNPO9hYg3AkjUJBKi1NQ4aaIQZVGrig7c/3NUV1jANl8rFTeMg==", + "license": "MIT" + }, "node_modules/material-icons": { "version": "1.13.12", "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.12.tgz", @@ -5663,12 +5869,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -5796,6 +6002,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -5976,6 +6188,12 @@ "node": ">=8" } }, + "node_modules/path-webpack": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/path-webpack/-/path-webpack-0.0.3.tgz", + "integrity": "sha512-AmeDxedoo5svf7aB3FYqSAKqMxys014lVKBzy1o/5vv9CtU7U4wgGWL1dA2o6MOzcD53ScN4Jmiq6VbtLz1vIQ==", + "license": "MIT" + }, "node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", @@ -5994,9 +6212,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -6113,9 +6331,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -6132,8 +6350,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -6216,8 +6434,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/proper-lockfile": { "version": "4.1.2", @@ -6308,7 +6525,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6475,9 +6691,9 @@ } }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", + "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -6490,21 +6706,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.21.3", + "@rollup/rollup-android-arm64": "4.21.3", + "@rollup/rollup-darwin-arm64": "4.21.3", + "@rollup/rollup-darwin-x64": "4.21.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", + "@rollup/rollup-linux-arm-musleabihf": "4.21.3", + "@rollup/rollup-linux-arm64-gnu": "4.21.3", + "@rollup/rollup-linux-arm64-musl": "4.21.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", + "@rollup/rollup-linux-riscv64-gnu": "4.21.3", + "@rollup/rollup-linux-s390x-gnu": "4.21.3", + "@rollup/rollup-linux-x64-gnu": "4.21.3", + "@rollup/rollup-linux-x64-musl": "4.21.3", + "@rollup/rollup-win32-arm64-msvc": "4.21.3", + "@rollup/rollup-win32-ia32-msvc": "4.21.3", + "@rollup/rollup-win32-x64-msvc": "4.21.3", "fsevents": "~2.3.2" } }, @@ -6557,8 +6774,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-json-parse": { "version": "4.0.0", @@ -6619,6 +6835,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6673,9 +6895,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -6719,7 +6941,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -6956,6 +7177,12 @@ "node": ">=18" } }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7134,8 +7361,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/video.js": { "version": "8.10.0", @@ -7207,14 +7433,14 @@ } }, "node_modules/vite": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", - "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -7233,6 +7459,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -7250,6 +7477,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -7290,6 +7520,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, "node_modules/vue": { "version": "3.4.21", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", @@ -7374,6 +7610,55 @@ "resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-3.0.0.tgz", "integrity": "sha512-h2keL/Rj550dLgesgOtXJS9qOiSMmuJNeVlfNAYV1/IYwOQYaWk5mFJlwRxmZDK9YC5gECcFLYYj7z1lKSf9ug==" }, + "node_modules/vue-reader": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/vue-reader/-/vue-reader-1.2.14.tgz", + "integrity": "sha512-aGtJsmEdYcWLZmMqOrAzcb8/SYUcaz8zj9GtYFP+1cHs53IBG45/uZkywn/7RjWwFtiixSkLO7w/7qiqcyjwGQ==", + "license": "ISC", + "workspaces": [ + "test/vue2", + "test/vue2.7" + ], + "dependencies": { + "epubjs": "^0.3.93", + "vue-demi": "latest" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-reader/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/vue-router": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz", @@ -7388,16 +7673,6 @@ "vue": "^3.2.0" } }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "node_modules/vue-toastification": { "version": "2.0.0-rc.5", "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz", @@ -7407,20 +7682,20 @@ } }, "node_modules/vue-tsc": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.7.tgz", - "integrity": "sha512-LYa0nInkfcDBB7y8jQ9FQ4riJTRNTdh98zK/hzt4gEpBZQmf30dPhP+odzCa+cedGz6B/guvJEd0BavZaRptjg==", + "version": "2.0.29", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.29.tgz", + "integrity": "sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==", "dev": true, "dependencies": { - "@volar/typescript": "~2.1.3", - "@vue/language-core": "2.0.7", + "@volar/typescript": "~2.4.0-alpha.18", + "@vue/language-core": "2.0.29", "semver": "^7.5.4" }, "bin": { "vue-tsc": "bin/vue-tsc.js" }, "peerDependencies": { - "typescript": "*" + "typescript": ">=5.0.0" } }, "node_modules/w3c-xmlserializer": { diff --git a/frontend/package.json b/frontend/package.json index a5089c94..a369a933 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,6 +29,7 @@ "jwt-decode": "^4.0.0", "lodash-es": "^4.17.21", "material-icons": "^1.13.12", + "marked": "^14.1.0", "normalize.css": "^8.0.1", "pinia": "^2.1.7", "pretty-bytes": "^6.1.1", @@ -42,6 +43,7 @@ "vue-final-modal": "^4.5.4", "vue-i18n": "^9.10.2", "vue-lazyload": "^3.0.0", + "vue-reader": "^1.2.14", "vue-router": "^4.3.0", "vue-toastification": "^2.0.0-rc.5" }, @@ -64,7 +66,7 @@ "postcss": "^8.4.38", "prettier": "^3.2.5", "terser": "^5.30.0", - "vite": "^5.2.7", + "vite": "^5.4.6", "vite-plugin-compression2": "^1.0.0", "vue-tsc": "^2.0.7" } diff --git a/frontend/src/api/tus.ts b/frontend/src/api/tus.ts index dd824357..5e4e116b 100644 --- a/frontend/src/api/tus.ts +++ b/frontend/src/api/tus.ts @@ -61,7 +61,7 @@ export async function upload( fileData.hasStarted = true; fileData.lastProgressTimestamp = Date.now(); - fileData.interval = setInterval(() => { + fileData.interval = window.setInterval(() => { calcProgress(filePath); }, SPEED_UPDATE_INTERVAL); } diff --git a/frontend/src/components/settings/Languages.vue b/frontend/src/components/settings/Languages.vue index 992a50c8..14acc4cb 100644 --- a/frontend/src/components/settings/Languages.vue +++ b/frontend/src/components/settings/Languages.vue @@ -18,6 +18,7 @@ export default { he: "עברית", hu: "Magyar", ar: "العربية", + ca: "Català", de: "Deutsch", el: "Ελληνικά", en: "English", diff --git a/frontend/src/css/_shell.css b/frontend/src/css/_shell.css index 1d2813a9..3b4eec0e 100644 --- a/frontend/src/css/_shell.css +++ b/frontend/src/css/_shell.css @@ -14,7 +14,7 @@ width: 100%; } -.shell__divider{ +.shell__divider { background: rgba(127, 127, 127, 0.3); width: 100%; height: 8px; @@ -69,8 +69,6 @@ body.rtl .shell-content { font-size: inherit; } - - .shell__prompt { width: 1.2rem; } @@ -84,5 +82,5 @@ body.rtl .shell-content { font-family: inherit; white-space: pre-wrap; width: 100%; - color:var(--textSecondary); + color: var(--textSecondary); } diff --git a/frontend/src/css/_variables.css b/frontend/src/css/_variables.css index a56285ba..85ad96ec 100644 --- a/frontend/src/css/_variables.css +++ b/frontend/src/css/_variables.css @@ -54,5 +54,5 @@ --borderPrimary: rgba(255, 255, 255, 0.05); --borderSecondary: rgba(255, 255, 255, 0.15); --dividerPrimary: rgba(30, 30, 30, 0.4); - --dividerSecondary:rgba(30, 30, 30, 0.6); + --dividerSecondary: rgba(30, 30, 30, 0.6); } diff --git a/frontend/src/css/epubReader.css b/frontend/src/css/epubReader.css new file mode 100644 index 00000000..a575fb27 --- /dev/null +++ b/frontend/src/css/epubReader.css @@ -0,0 +1,78 @@ +.epub-reader { + display: flex; + align-items: flex-end; + height: 100%; +} + +.epub-reader .container { + width: 100%; + max-width: 100%; + height: calc(100% - 64px); + margin: 0; +} + +.epub-reader .arrow.pre { + left: 0; +} + +.epub-reader .readerArea { + background-color: var(--background) !important; +} + +.epub-reader .titleArea { + color: var(--text); +} + +.epub-reader .tocButtonBar { + background: var(--divider); +} + +.epub-reader .tocButton { + color: var(--text); +} + +.epub-reader .tocButton.tocButtonExpanded { + background-color: var(--background); +} + +.epub-reader .tocAreaButton.active { + color: var(--blue); + border-color: var(--dark-blue); +} + +.epub-reader .tocArea { + background-color: var(--background); +} + +.epub-reader .readerArea .arrow { + color: var(--text); +} + +.epub-reader .readerArea .arrow:hover { + color: var(--hover); +} + +.epub-reader .size { + display: flex; + gap: 5px; + align-items: center; + z-index: 111; + right: 25px; + outline: none; + position: absolute; + top: 78px; +} + +.epub-reader .size span { + color: var(--textSecondary); +} + +.epub-reader .size button { + background: none; + outline: none; + border: none; + width: 25px; + height: 25px; + color: var(--textPrimary); + padding: 0; +} diff --git a/frontend/src/css/mdPreview.css b/frontend/src/css/mdPreview.css new file mode 100644 index 00000000..bf2863f6 --- /dev/null +++ b/frontend/src/css/mdPreview.css @@ -0,0 +1,13 @@ +.md_preview { + overflow-y: auto; + max-height: 80vh; + padding: 1rem; + border: 1px solid #000; + font-size: 20px; + line-height: 1.2; +} + +#preview-container { + overflow: auto; + max-height: 80vh; /* Match the max-height of md_preview for scrolling */ +} diff --git a/frontend/src/css/styles.css b/frontend/src/css/styles.css index f8d4ef9d..19b94b95 100644 --- a/frontend/src/css/styles.css +++ b/frontend/src/css/styles.css @@ -15,6 +15,8 @@ @import "./dashboard.css"; @import "./login.css"; @import "./mobile.css"; +@import "./epubReader.css"; +@import "./mdPreview.css"; /* For testing only :focus { diff --git a/frontend/src/i18n/ca.json b/frontend/src/i18n/ca.json new file mode 100644 index 00000000..bc00fd2a --- /dev/null +++ b/frontend/src/i18n/ca.json @@ -0,0 +1,264 @@ +{ + "buttons": { + "cancel": "Cancel·lar", + "clear": "Netejar", + "close": "Tancar", + "continue": "Continuar", + "copy": "Copiar", + "copyFile": "Copiar fitxer", + "copyToClipboard": "Copiar al porta-retalls", + "copyDownloadLinkToClipboard": "Copiar l'enllaç de descàrrega al portapapers", + "create": "Crear", + "delete": "Esborrar", + "download": "Descarregar", + "file": "Fitxer", + "folder": "Carpeta", + "fullScreen": "Canviar a pantalla completa", + "hideDotfiles": "Ocultar fitxers que comencen per punt", + "info": "Info", + "more": "Més", + "move": "Moure", + "moveFile": "Moure fitxer", + "new": "Nou", + "next": "Següent", + "ok": "D'acord", + "permalink": "Enllaç permanent", + "previous": "Anterior", + "publish": "Publicar", + "rename": "Reanomenar", + "replace": "Substituir", + "reportIssue": "Reportar problema", + "save": "Desar", + "schedule": "Programar", + "search": "Cercar", + "select": "Seleccionar", + "selectMultiple": "Selecció múltiple", + "share": "Compartir", + "shell": "Prem Enter per cercar...", + "submit": "Enviar", + "switchView": "Canviar vista", + "toggleSidebar": "Mostrar/ocultar menú", + "update": "Actualitzar", + "upload": "Pujar", + "openFile": "Obrir fitxer", + "discardChanges": "Descartar" + }, + "download": { + "downloadFile": "Descarregar fitxer", + "downloadFolder": "Descarregar directori", + "downloadSelected": "Descarregar seleccionats" + }, + "upload": { + "abortUpload": "Are you sure you wish to abort?" + }, + "errors": { + "forbidden": "No tens els permisos necessaris per accedir.", + "internal": "La veritat és que alguna cosa ha anat malament.", + "notFound": "No es pot accedir a aquest lloc.", + "connection": "No es pot accedir al servidor." + }, + "files": { + "body": "Cos", + "closePreview": "Tancar vista prèvia", + "files": "Fitxers", + "folders": "Carpetes", + "home": "Inici", + "lastModified": "Última modificació", + "loading": "Carregant...", + "lonely": "Un se sent molt sol aquí...", + "metadata": "Metadades", + "multipleSelectionEnabled": "Selecció múltiple activada", + "name": "Nom", + "size": "Mida", + "sortByLastModified": "Ordenar per última modificació", + "sortByName": "Ordenar per nom", + "sortBySize": "Ordenar per mida", + "noPreview": "La vista prèvia no està disponible per a aquest fitxer." + }, + "help": { + "click": "seleccionar fitxer o carpeta", + "ctrl": { + "click": "seleccionar múltiples fitxers o carpetes", + "f": "obre la cerca", + "s": "desa un fitxer o el descarrega a la carpeta en què estàs" + }, + "del": "elimina els ítems seleccionats", + "doubleClick": "obre un fitxer o carpeta", + "esc": "neteja la selecció i/o tanca la finestra", + "f1": "aquesta informació", + "f2": "reanomenar fitxer", + "help": "Ajuda" + }, + "login": { + "createAnAccount": "Crear un compte", + "loginInstead": "Usuari ja existent", + "password": "Contrasenya", + "passwordConfirm": "Confirmació de contrasenya", + "passwordsDontMatch": "Les contrasenyes no coincideixen", + "signup": "Registra't", + "submit": "Iniciar sessió", + "username": "Usuari", + "usernameTaken": "Nom d'usuari no disponible", + "wrongCredentials": "Usuari i/o contrasenya incorrectes" + }, + "permanent": "Permanent", + "prompts": { + "copy": "Copiar", + "copyMessage": "Tria el lloc on vols copiar els teus fitxers:", + "currentlyNavigating": "Actualment estàs a:", + "deleteMessageMultiple": "Estàs segur que vols eliminar {count} fitxer(s)?", + "deleteMessageSingle": "Estàs segur que vols eliminar aquest fitxer/carpeta?", + "deleteMessageShare": "Estàs segur que vols eliminar aquest recurs compartit ({path})?", + "deleteUser": "Esteu segur que voleu eliminar aquest usuari?", + "deleteTitle": "Esborrar fitxers", + "displayName": "Nom:", + "download": "Descarregar fitxers", + "downloadMessage": "Tria el format de descàrrega.", + "error": "Alguna cosa ha fallat", + "fileInfo": "Informació del fitxer", + "filesSelected": "{count} fitxers seleccionats.", + "lastModified": "Última modificació", + "move": "Moure", + "moveMessage": "Tria una nova casa per als teus fitxers/carpeta(s):", + "newArchetype": "Crea un nou post basat en un arquetip. El teu fitxer serà creat a la carpeta de contingut.", + "newDir": "Nova carpeta", + "newDirMessage": "Escriu el nom de la nova carpeta.", + "newFile": "Nou fitxer", + "newFileMessage": "Escriu el nom del nou fitxer.", + "numberDirs": "Nombre de carpetes", + "numberFiles": "Nombre de fitxers", + "rename": "Reanomenar", + "renameMessage": "Escriu el nou nom per a", + "replace": "Substituir", + "replaceMessage": "Un dels fitxers que intentes pujar està creant conflicte pel seu nom. Vols canviar el nom del ja existent?\n", + "schedule": "Programar", + "scheduleMessage": "Tria una hora i data per programar la publicació d'aquest post.", + "show": "Mostrar", + "size": "Mida", + "upload": "Pujar", + "uploadFiles": "Pujant {files} fitxers...", + "uploadMessage": "Seleccioneu una opció per pujar.", + "optionalPassword": "Contrasenya opcional", + "resolution": "Resolució", + "discardEditorChanges": "Esteu segur que voleu descartar els canvis que heu fet?" + }, + "search": { + "images": "Imatges", + "music": "Música", + "pdf": "PDF", + "pressToSearch": "Prem Enter per cercar...", + "search": "Cercar...", + "typeToSearch": "Escriu per fer una cerca...", + "types": "Tipus", + "video": "Vídeo" + }, + "settings": { + "admin": "Admin", + "administrator": "Administrador", + "allowCommands": "Executar comandes", + "allowEdit": "Editar, reanomenar i esborrar fitxers o carpetes", + "allowNew": "Crear nous fitxers i carpetes", + "allowPublish": "Publicar nous posts i pàgines", + "allowSignup": "Permetre registre d'usuaris", + "avoidChanges": "(deixar en blanc per evitar canvis)", + "branding": "Marca", + "brandingDirectoryPath": "Ruta de la carpeta de personalització de marca", + "brandingHelp": "Pots personalitzar com es veu la teva instància de FileBrowser canviant-li el nom, reemplaçant el logotip, afegint estils personalitzats i fins i tot deshabilitant els enllaços externs que apunten cap a GitHub. \nPer a més informació sobre personalització de marca, si us plau revisa el {0}.", + "changePassword": "Canviar contrasenya", + "commandRunner": "Executor de comandes", + "commandRunnerHelp": "Aquí pots establir les comandes que s'executen en els esdeveniments anomenats. Has d'escriure'n una per línia. Les variables d'entorn {0} i {1} estaran disponibles, sent {0} relativa a {1}. Per a més informació sobre aquesta característica i les variables d'entorn disponibles, si us plau llegeix el {2}.", + "commandsUpdated": "Comandes actualitzades!", + "createUserDir": "Crea automàticament una carpeta d'inici quan s'afegeix un usuari", + "tusUploads": "Càrregues a trossos", + "tusUploadsHelp": "El File Browser suporta càrregues de fitxers a trossos, permetent la creació de càrregues de fitxers eficients, fiables, reanudables i a trossos fins i tot en xarxes poc fiables.", + "tusUploadsChunkSize": "Indica la mida màxima d'una sol·licitud (s'utilitzaran càrregues directes per a càrregues més petites). Podeu introduir un enter pla que indiqui la mida en bytes o una cadena com 10MB, 1GB, etc.", + "tusUploadsRetryCount": "Nombre de reintents a realitzar si una part falla en carregar-se.", + "userHomeBasePath": "Ruta base per als directoris personals dels usuaris", + "userScopeGenerationPlaceholder": "L'àmbit es generarà automàticament", + "createUserHomeDirectory": "Crear el directori principal de l'usuari", + "customStylesheet": "Modificar full d'estils", + "defaultUserDescription": "Aquestes són les configuracions per defecte per a nous usuaris.", + "disableExternalLinks": "Deshabilitar enllaços externs (excepte documentació)", + "disableUsedDiskPercentage": "Desactivar el gràfic de percentatge de disc utilitzat", + "documentation": "documentació", + "examples": "Exemples", + "executeOnShell": "Executar a la shell", + "executeOnShellDescription": "Per defecte, FileBrowser executa les comandes cridant directament els seus binaris. Si vols executar-los en una shell en lloc (com Bash o PowerShell), pots definir-ho aquí amb els arguments i flags necessaris. Si es defineix, la comanda que s'executa s'afegirà com a argument. Això s'aplica tant a les comandes d'usuari com als ganxos d'esdeveniments.", + "globalRules": "Es tracta d'un conjunt global de regles de permís i rebuig. S'apliquen a tots els usuaris. Pots definir regles específiques en la configuració de cada usuari per anul·lar aquestes.", + "globalSettings": "Ajustos globals", + "hideDotfiles": "Ocultar fitxers que comencen per punt", + "insertPath": "Introdueix la ruta", + "insertRegex": "Introduir expressió regular", + "instanceName": "Nom de la instància", + "language": "Idioma", + "lockPassword": "Evitar que l'usuari canviï la contrasenya", + "newPassword": "La teva nova contrasenya", + "newPasswordConfirm": "Confirma la teva contrasenya", + "newUser": "Nou usuari", + "password": "Contrasenya", + "passwordUpdated": "Contrasenya actualitzada!", + "path": "Ruta", + "perm": { + "create": "Crear fitxers i directoris", + "delete": "Eliminar fitxers i directoris", + "download": "Descarregar", + "execute": "Executar comandes", + "modify": "Editar fitxers", + "rename": "Reanomenar o moure fitxers i directoris", + "share": "Compartir fitxers" + }, + "permissions": "Permisos", + "permissionsHelp": "Pots nomenar l'usuari com a administrador o triar els permisos individualment. Si selecciones \"Administrador\", totes les altres opcions s'activaran automàticament. L'administració d'usuaris és un privilegi d'administrador.\n", + "profileSettings": "Ajustos del perfil", + "ruleExample1": "prevé l'accés a una extensió de fitxer (Com .git) en cada carpeta.\n", + "ruleExample2": "bloqueja l'accés al fitxer anomenat Caddyfile a la carpeta arrel.", + "rules": "Regles", + "rulesHelp": "Aquí pots definir un conjunt de regles de permisos per a aquest usuari específic. Els fitxers bloquejats no es mostraran en les llistes i no seran accessibles per l'usuari. Pots utilitzar regex i rutes relatives a l'arrel de l'usuari.\n", + "scope": "Arrel", + "setDateFormat": "Establir el format exacte de la data", + "settingsUpdated": "Ajustos actualitzats!", + "shareDuration": "Compartir Duració", + "shareManagement": "Gestió Compartida", + "shareDeleted": "Recurs compartit eliminat!", + "singleClick": "Utilitza un sol clic per obrir fitxers i directoris", + "themes": { + "default": "Valor per defecte del sistema", + "dark": "Fosc", + "light": "Clar", + "title": "Tema" + }, + "user": "Usuari", + "userCommands": "Comandes", + "userCommandsHelp": "Una llista separada per espais amb les comandes permeses per a aquest usuari. Exemple:\n", + "userCreated": "Usuari creat!", + "userDefaults": "Configuració d'usuari per defecte", + "userDeleted": "Usuari eliminat!", + "userManagement": "Administració d'usuaris", + "userUpdated": "Usuari actualitzat!", + "username": "Usuari", + "users": "Usuaris" + }, + "sidebar": { + "help": "Ajuda", + "hugoNew": "Nou Hugo", + "login": "Iniciar sessió", + "logout": "Tancar sessió", + "myFiles": "Els meus fitxers", + "newFile": "Nou fitxer", + "newFolder": "Nova carpeta", + "preview": "Vista prèvia", + "settings": "Ajustos", + "signup": "Registra't", + "siteSettings": "Ajustos del lloc" + }, + "success": { + "linkCopied": "Enllaç copiat!" + }, + "time": { + "days": "Dies", + "hours": "Hores", + "minutes": "Minuts", + "seconds": "Segons", + "unit": "Unitat" + } +} diff --git a/frontend/src/i18n/cz_cs.json b/frontend/src/i18n/cz_cs.json new file mode 100644 index 00000000..1147f38c --- /dev/null +++ b/frontend/src/i18n/cz_cs.json @@ -0,0 +1,264 @@ +{ + "buttons": { + "cancel": "Zrušit", + "clear": "Vymazat", + "close": "Zavřít", + "continue": "Pokračovat", + "copy": "Kopírovat", + "copyFile": "Kopírovat soubor", + "copyToClipboard": "Kopírovat do schránky", + "copyDownloadLinkToClipboard": "Kopírovat odkaz na stažení do schránky", + "create": "Vytvořit", + "delete": "Smazat", + "download": "Stáhnout", + "file": "Soubor", + "folder": "Složka", + "fullScreen": "Přepnout na celou obrazovku", + "hideDotfiles": "Skrýt skryté soubory", + "info": "Informace", + "more": "Více", + "move": "Přesunout", + "moveFile": "Přesunout soubor", + "new": "Nový", + "next": "Další", + "ok": "OK", + "permalink": "Získat trvalý odkaz", + "previous": "Předchozí", + "publish": "Publikovat", + "rename": "Přejmenovat", + "replace": "Nahradit", + "reportIssue": "Nahlásit problém", + "save": "Uložit", + "schedule": "Naplánovat", + "search": "Hledat", + "select": "Vybrat", + "selectMultiple": "Vybrat více", + "share": "Sdílet", + "shell": "Přepnout shell", + "submit": "Odeslat", + "switchView": "Přepnout zobrazení", + "toggleSidebar": "Přepnout postranní panel", + "update": "Aktualizovat", + "upload": "Nahrát", + "openFile": "Otevřít soubor", + "discardChanges": "Zrušit změny" + }, + "download": { + "downloadFile": "Stáhnout soubor", + "downloadFolder": "Stáhnout složku", + "downloadSelected": "Stáhnout vybrané" + }, + "upload": { + "abortUpload": "Opravdu chcete přerušit nahrávání?" + }, + "errors": { + "forbidden": "Nemáte oprávnění k přístupu.", + "internal": "Nastala vážná chyba.", + "notFound": "Tuto lokaci nelze najít.", + "connection": "Server nelze dosáhnout." + }, + "files": { + "body": "Tělo", + "closePreview": "Zavřít náhled", + "files": "Soubory", + "folders": "Složky", + "home": "Domů", + "lastModified": "Naposledy změněno", + "loading": "Načítání...", + "lonely": "Je tu osaměle...", + "metadata": "Metadata", + "multipleSelectionEnabled": "Vícenásobný výběr povolen", + "name": "Název", + "size": "Velikost", + "sortByLastModified": "Seřadit podle poslední změny", + "sortByName": "Seřadit podle názvu", + "sortBySize": "Seřadit podle velikosti", + "noPreview": "Náhled pro tento soubor není k dispozici." + }, + "help": { + "click": "vyberte soubor nebo adresář", + "ctrl": { + "click": "vybrat více souborů nebo adresářů", + "f": "otevřít vyhledávání", + "s": "uložit soubor nebo stáhnout adresář, kde se nacházíte" + }, + "del": "smazat vybrané položky", + "doubleClick": "otevřít soubor nebo adresář", + "esc": "zrušit výběr a/nebo zavřít výzvu", + "f1": "tato informace", + "f2": "přejmenovat soubor", + "help": "Nápověda" + }, + "login": { + "createAnAccount": "Vytvořit účet", + "loginInstead": "Již máte účet", + "password": "Heslo", + "passwordConfirm": "Potvrzení hesla", + "passwordsDontMatch": "Hesla se neshodují", + "signup": "Registrace", + "submit": "Přihlásit se", + "username": "Uživatelské jméno", + "usernameTaken": "Uživatelské jméno již existuje", + "wrongCredentials": "Nesprávné přihlašovací údaje" + }, + "permanent": "Trvalý", + "prompts": { + "copy": "Kopírovat", + "copyMessage": "Vyberte místo, kam chcete soubory kopírovat:", + "currentlyNavigating": "Aktuálně navigujete v:", + "deleteMessageMultiple": "Opravdu chcete smazat {count} soubor(ů)?", + "deleteMessageSingle": "Opravdu chcete smazat tento soubor/složku?", + "deleteMessageShare": "Opravdu chcete smazat toto sdílení({path})?", + "deleteUser": "Opravdu chcete smazat tohoto uživatele?", + "deleteTitle": "Smazat soubory", + "displayName": "Zobrazované jméno:", + "download": "Stáhnout soubory", + "downloadMessage": "Vyberte formát, který chcete stáhnout.", + "error": "Něco se pokazilo", + "fileInfo": "Informace o souboru", + "filesSelected": "{count} souborů vybráno.", + "lastModified": "Naposledy změněno", + "move": "Přesunout", + "moveMessage": "Vyberte nové umístění pro váš soubor(y)/složku(y):", + "newArchetype": "Vytvořit nový příspěvek na základě archetypu. Váš soubor bude vytvořen ve složce content.", + "newDir": "Nový adresář", + "newDirMessage": "Pojmenujte svůj nový adresář.", + "newFile": "Nový soubor", + "newFileMessage": "Pojmenujte svůj nový soubor.", + "numberDirs": "Počet adresářů", + "numberFiles": "Počet souborů", + "rename": "Přejmenovat", + "renameMessage": "Vložte nový název pro", + "replace": "Nahradit", + "replaceMessage": "Jeden ze souborů, které se snažíte nahrát, má konfliktní název. Chcete tento soubor přeskočit a pokračovat v nahrávání, nebo nahradit stávající?", + "schedule": "Naplánovat", + "scheduleMessage": "Vyberte datum a čas pro naplánování publikace tohoto příspěvku.", + "show": "Zobrazit", + "size": "Velikost", + "upload": "Nahrát", + "uploadFiles": "Nahrávání {files} souborů...", + "uploadMessage": "Vyberte možnost pro nahrání.", + "optionalPassword": "Volitelné heslo", + "resolution": "Rozlišení", + "discardEditorChanges": "Opravdu chcete zrušit provedené změny?" + }, + "search": { + "images": "Obrázky", + "music": "Hudba", + "pdf": "PDF", + "pressToSearch": "Stiskněte enter pro hledání...", + "search": "Hledat...", + "typeToSearch": "Zadejte pro hledání...", + "types": "Typy", + "video": "Video" + }, + "settings": { + "admin": "Admin", + "administrator": "Administrátor", + "allowCommands": "Povolit příkazy", + "allowEdit": "Upravit, přejmenovat a mazat soubory nebo adresáře", + "allowNew": "Vytvářet nové soubory a adresáře", + "allowPublish": "Publikovat nové příspěvky a stránky", + "allowSignup": "Povolit uživatelům registraci", + "avoidChanges": "(ponechte prázdné pro zabránění změnám)", + "branding": "Branding", + "brandingDirectoryPath": "Cesta ke složce s brandingem", + "brandingHelp": "Můžete přizpůsobit vzhled a dojem z vaší instance File Browseru změnou názvu, nahrazením loga, přidáním vlastních stylů a dokonce zakázat externí odkazy na GitHub.\nPro více informací o přizpůsobení brandingu se podívejte na {0}.", + "changePassword": "Změnit heslo", + "commandRunner": "Spouštění příkazů", + "commandRunnerHelp": "Zde můžete nastavit příkazy, které se spustí při určených událostech. Každý příkaz musí být na samostatném řádku. Budou k dispozici proměnné prostředí {0} a {1}, přičemž {0} se vztahuje na {1}. Pro více informací o této funkci a dostupných proměnných prostředí si přečtěte {2}.", + "commandsUpdated": "Příkazy aktualizovány!", + "createUserDir": "Automaticky vytvořit domovskou složku uživatele při přidání nového uživatele", + "tusUploads": "Nahrávání po částech", + "tusUploadsHelp": "File Browser podporuje nahrávání souborů po částech, což umožňuje vytváření efektivních, spolehlivých, obnovitelných a rozdělených nahrávek souborů i na nespolehlivých sítích.", + "tusUploadsChunkSize": "Maximální velikost požadavku (přímé nahrávání bude použito pro menší nahrávky). Můžete zadat prosté číslo označující velikost v bajtech nebo řetězec jako 10MB, 1GB atd.", + "tusUploadsRetryCount": "Počet pokusů o opakování, pokud se nahrání části nezdaří.", + "userHomeBasePath": "Základní cesta pro domovské adresáře uživatelů", + "userScopeGenerationPlaceholder": "Rozsah bude automaticky vygenerován", + "createUserHomeDirectory": "Vytvořit domovský adresář uživatele", + "customStylesheet": "Vlastní stylový soubor", + "defaultUserDescription": "Toto jsou výchozí nastavení pro nové uživatele.", + "disableExternalLinks": "Zakázat externí odkazy (kromě dokumentace)", + "disableUsedDiskPercentage": "Zakázat graf s procentem využitého disku", + "documentation": "dokumentace", + "examples": "Příklady", + "executeOnShell": "Spustit na shellu", + "executeOnShellDescription": "Ve výchozím nastavení File Browser spouští příkazy přímo voláním jejich binárek. Pokud je chcete spouštět na shellu (např. Bash nebo PowerShell), můžete to zde definovat s požadovanými argumenty a příznaky. Pokud je nastaveno, příkaz, který spustíte, bude přidán jako argument. To platí jak pro uživatelské příkazy, tak pro háky událostí.", + "globalRules": "Jedná se o globální sadu povolení a zakázání pravidel. Platí pro každého uživatele. Specifická pravidla můžete definovat v nastaveních každého uživatele, aby přepsala tato pravidla.", + "globalSettings": "Globální nastavení", + "hideDotfiles": "Skrýt skryté soubory", + "insertPath": "Vložte cestu", + "insertRegex": "Vložte regex výraz", + "instanceName": "Název instance", + "language": "Jazyk", + "lockPassword": "Zabránit uživateli ve změně hesla", + "newPassword": "Vaše nové heslo", + "newPasswordConfirm": "Potvrďte své nové heslo", + "newUser": "Nový uživatel", + "password": "Heslo", + "passwordUpdated": "Heslo bylo aktualizováno!", + "path": "Cesta", + "perm": { + "create": "Vytvářet soubory a adresáře", + "delete": "Mazat soubory a adresáře", + "download": "Stahovat", + "execute": "Spouštět příkazy", + "modify": "Upravit soubory", + "rename": "Přejmenovat nebo přesunout soubory a adresáře", + "share": "Sdílet soubory" + }, + "permissions": "Oprávnění", + "permissionsHelp": "Můžete nastavit uživatele jako administrátora nebo zvolit jednotlivá oprávnění. Pokud vyberete \"Administrátor\", všechny ostatní možnosti budou automaticky zaškrtnuty. Správa uživatelů zůstává výsadou administrátora.\n", + "profileSettings": "Nastavení profilu", + "ruleExample1": "zabraňuje přístupu k jakémukoli skrytému souboru (např. .git, .gitignore) v každé složce.\n", + "ruleExample2": "blokuje přístup k souboru s názvem Caddyfile v kořenovém adresáři.", + "rules": "Pravidla", + "rulesHelp": "Zde můžete definovat sadu povolení a zakázání pravidel pro tohoto konkrétního uživatele. Blokované soubory se nebudou zobrazovat v seznamech a uživatel k nim nebude mít přístup. Podporujeme regex a cesty relativní k rozsahu uživatele.\n", + "scope": "Rozsah", + "setDateFormat": "Nastavit přesný formát data", + "settingsUpdated": "Nastavení aktualizována!", + "shareDuration": "Doba sdílení", + "shareManagement": "Správa sdílení", + "shareDeleted": "Sdílení bylo smazáno!", + "singleClick": "Použít jediné kliknutí pro otevření souborů a adresářů", + "themes": { + "default": "Systémové výchozí", + "dark": "Tmavý", + "light": "Světlý", + "title": "Motiv" + }, + "user": "Uživatel", + "userCommands": "Příkazy", + "userCommandsHelp": "Seznam dostupných příkazů pro tohoto uživatele oddělený mezerami. Příklad:\n", + "userCreated": "Uživatel vytvořen!", + "userDefaults": "Výchozí nastavení uživatele", + "userDeleted": "Uživatel smazán!", + "userManagement": "Správa uživatelů", + "userUpdated": "Uživatel aktualizován!", + "username": "Uživatelské jméno", + "users": "Uživatelé" + }, + "sidebar": { + "help": "Nápověda", + "hugoNew": "Hugo Nový", + "login": "Přihlásit se", + "logout": "Odhlásit se", + "myFiles": "Moje soubory", + "newFile": "Nový soubor", + "newFolder": "Nová složka", + "preview": "Náhled", + "settings": "Nastavení", + "signup": "Registrace", + "siteSettings": "Nastavení webu" + }, + "success": { + "linkCopied": "Odkaz zkopírován!" + }, + "time": { + "days": "Dny", + "hours": "Hodiny", + "minutes": "Minuty", + "seconds": "Sekundy", + "unit": "Časová jednotka" + } +} diff --git a/frontend/src/i18n/de.json b/frontend/src/i18n/de.json index 2609a5f3..97b44d94 100644 --- a/frontend/src/i18n/de.json +++ b/frontend/src/i18n/de.json @@ -46,7 +46,7 @@ }, "errors": { "forbidden": "Sie haben keine Berechtigung dies abzurufen.", - "internal": "Etwas ist schief gelaufen.", + "internal": "Etwas ist schiefgelaufen.", "notFound": "Dieser Ort kann nicht angezeigt werden.", "connection": "Der Server ist nicht erreichbar." }, @@ -73,7 +73,7 @@ "ctrl": { "click": "Markiere mehrere Dateien oder Ordner", "f": "Öffnet eine neue Suche", - "s": "Speichert eine Datei oder einen Ordner am akutellen Ort" + "s": "Speichert eine Datei oder einen Ordner am aktuellen Ort" }, "del": "Löscht die ausgewählten Elemente", "doubleClick": "Öffnet eine Datei oder einen Ordner", @@ -106,7 +106,7 @@ "displayName": "Anzeigename:", "download": "Lade Dateien", "downloadMessage": "Wählen Sie ein Format zum Herunterladen aus.", - "error": "Etwas ist schief gelaufen", + "error": "Etwas ist schiefgelaufen", "fileInfo": "Dateiinformation", "filesSelected": "{count} Dateien ausgewählt.", "lastModified": "Zuletzt geändert", @@ -150,13 +150,13 @@ "allowNew": "Erstellen neuer Dateien und Ordner", "allowPublish": "Veröffentlichen von neuen Beiträgen und Seiten", "allowSignup": "Erlaube Benutzern sich zu registrieren", - "avoidChanges": "(leer lassen um Änderungen zu vermeiden)", + "avoidChanges": "(leer lassen, um Änderungen zu vermeiden)", "branding": "Design", "brandingDirectoryPath": "Designverzeichnispfad", - "brandingHelp": "Sie können das Erscheinungsbild Ihres File Browser anpassen, in dem Sie den Namen ändern, das Logo austauchsen oder eigene Stile definieren und sogar externe Links zu GitHub deaktivieren.\nUm mehr Informationen zum Anpassen des Designs zu bekommen, gehen Sie bitte zu {0}.", + "brandingHelp": "Sie können das Erscheinungsbild Ihres File Browser anpassen, in dem Sie den Namen ändern, das Logo austauschen oder eigene Stile definieren und sogar externe Links zu GitHub deaktivieren.\nUm mehr Informationen zum Anpassen des Designs zu bekommen, gehen Sie bitte zu {0}.", "changePassword": "Passwort ändern", "commandRunner": "Befehlseingabe", - "commandRunnerHelp": "Hier könne Sie Befehle eintragen, welche bei den benannten Aktionen ausgeführt werden. Sie müssen pro Zeile jeweils einen Befehl eingeben. Die Umgebungsvariable {0} und {1} sind verfügbar, wobei {0} relative zu {1} ist. Für mehr Informationen über diese Funktion und die verfügbaren Umgebungsvariablen, lesen Sie bitte die {2}.", + "commandRunnerHelp": "Hier könne Sie Befehle eintragen, welche bei den benannten Aktionen ausgeführt werden. Sie müssen pro Zeile jeweils einen Befehl eingeben. Die Umgebungsvariable {0} und {1} sind verfügbar, wobei {0} relative zu {1} ist. Für mehr Informationen über diese Funktion und die verfügbaren Umgebungsvariablen lesen Sie bitte die {2}.", "commandsUpdated": "Befehle aktualisiert!", "createUserDir": "Automatisches Erstellen des Home-Verzeichnisses beim Anlegen neuer Benutzer", "tusUploads": "Gestückelter Upload", @@ -170,7 +170,7 @@ "documentation": "Dokumentation", "examples": "Beispiele", "executeOnShell": "In Shell ausführen", - "executeOnShellDescription": "Es ist voreingestellt das der File Brower Befehle ausführt in dem er die Befehlsdateien direkt aufruft. Wenn Sie wollen, dass sie über einer Kommandozeile (wie Bash oder PowerShell) laufen, könne Sie diese hier definieren mit allen bennötigten Argumenten und Optionen. Wenn gesetzt, wird das Kommando das ausgeführt werden soll als Parameter angehängt. Das gilt für Benuzerkommandos sowie auch für Ereignisse.", + "executeOnShellDescription": "Es ist voreingestellt, dass der File Brower Befehle ausführt, indem er die Befehlsdateien direkt aufruft. Wenn Sie wollen, dass sie über einer Kommandozeile (wie Bash oder PowerShell) laufen, könne Sie diese hier definieren mit allen benötigten Argumenten und Optionen. Wenn gesetzt, wird das Kommando das ausgeführt werden soll als Parameter angehängt. Das gilt für Benutzerkommandos sowie auch für Ereignisse.", "globalRules": "Das ist ein globales Set von Regeln die erlauben oder nicht erlauben. Die sind für alle Benutzer zutreffend. Es können spezielle Regeln in den Einstellungen der Benutzer definiert werden, die diese überschreiben.", "globalSettings": "Globale Einstellungen", "hideDotfiles": "Versteckte Dateien ausblenden", @@ -195,7 +195,7 @@ "share": "Datei teilen" }, "permissions": "Berechtigungen", - "permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigunen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n", + "permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigungen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n", "profileSettings": "Profileinstellungen", "ruleExample1": "Verhindert den Zugang zu versteckten Dateien (dot-Files, wie .git, .gitignore) in allen Ordnern\n", "ruleExample2": "blockiert den Zugang auf Dateien mit dem Namen Caddyfile in der Wurzel/Basis des Scopes.", diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 00d43b9d..1360bbec 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -24,6 +24,7 @@ "ok": "OK", "permalink": "Get Permanent Link", "previous": "Previous", + "preview": "Preview", "publish": "Publish", "rename": "Rename", "replace": "Replace", diff --git a/frontend/src/i18n/uk.json b/frontend/src/i18n/uk.json index b95a99c3..655988a0 100644 --- a/frontend/src/i18n/uk.json +++ b/frontend/src/i18n/uk.json @@ -36,7 +36,7 @@ "switchView": "Вид", "toggleSidebar": "Бічна панель", "update": "Оновити", - "upload": "Завантажити", + "upload": "Вивантажити", "openFile": "Відкрити файл" }, "download": { @@ -102,9 +102,9 @@ "deleteMessageMultiple": "Видалити ці файли ({count})?", "deleteMessageSingle": "Видалити цей файл/каталог?", "deleteMessageShare": "Видалити цей спільний файл/каталог ({path})?", - "deleteTitle": "Видалити файлы", + "deleteTitle": "Видалити файли", "displayName": "Відображене ім'я:", - "download": "Завантажити файлы", + "download": "Завантажити файли", "downloadMessage": "Виберіть формат, в якому хочете завантажити.", "error": "Помилка", "fileInfo": "Інформація про файл", @@ -127,8 +127,8 @@ "scheduleMessage": "Запланувати дату та час публікації.", "show": "Показати", "size": "Розмір", - "upload": "Завантажити", - "uploadMessage": "Виберіть варіант для завантаження.", + "upload": "Вивантажити", + "uploadMessage": "Виберіть варіант для вивантаження.", "optionalPassword": "Необов'язковий пароль" }, "search": { diff --git a/frontend/src/i18n/zh-cn.json b/frontend/src/i18n/zh-cn.json index 1aea4134..376dc029 100644 --- a/frontend/src/i18n/zh-cn.json +++ b/frontend/src/i18n/zh-cn.json @@ -22,6 +22,7 @@ "ok": "确定", "permalink": "获取永久链接", "previous": "上一个", + "preview": "预览", "publish": "发布", "rename": "重命名", "replace": "替换", diff --git a/frontend/src/i18n/zh-tw.json b/frontend/src/i18n/zh-tw.json index fdb2447c..050666f8 100644 --- a/frontend/src/i18n/zh-tw.json +++ b/frontend/src/i18n/zh-tw.json @@ -6,7 +6,7 @@ "copy": "複製", "copyFile": "複製檔案", "copyToClipboard": "複製到剪貼簿", - "copyDownloadLinkToClipboard": "複製到剪貼簿", + "copyDownloadLinkToClipboard": "複製到剪貼簿", "create": "建立", "delete": "刪除", "download": "下載", @@ -228,7 +228,7 @@ "title": "主題" }, "user": "使用者", - "userCommands": "使用者命令(Shell 命令)", + "userCommands": "使用者命令(Shell 命令)", "userCommandsHelp": "指定該使用者可以執行的命令(Shell 命令),用空格分隔。例如:", "userCreated": "使用者已建立!", "userDefaults": "使用者預設選項", diff --git a/frontend/src/stores/upload.ts b/frontend/src/stores/upload.ts index 4e814454..de712ee2 100644 --- a/frontend/src/stores/upload.ts +++ b/frontend/src/stores/upload.ts @@ -15,11 +15,14 @@ const beforeUnload = (event: Event) => { // Utility function to format bytes into a readable string function formatSize(bytes: number): string { - if (bytes === 0) return "0 Bytes"; + if (bytes === 0) return "0.00 Bytes"; + const k = 1024; const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; - const i = Math.floor(Math.log(bytes) / Math.log(1024)); - return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + " " + sizes[i]; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + + // Return the rounded size with two decimal places + return (bytes / k ** i).toFixed(2) + " " + sizes[i]; } export const useUploadStore = defineStore("upload", { @@ -167,12 +170,12 @@ export const useUploadStore = defineStore("upload", { async processUploads() { const uploadsCount = Object.keys(this.uploads).length; - const isBellowLimit = uploadsCount < UPLOADS_LIMIT; + const isBelowLimit = uploadsCount < UPLOADS_LIMIT; const isQueueEmpty = this.queue.length == 0; const isUploadsEmpty = uploadsCount == 0; const isFinished = isQueueEmpty && isUploadsEmpty; - const canProcess = isBellowLimit && !isQueueEmpty; + const canProcess = isBelowLimit && !isQueueEmpty; if (isFinished) { const fileStore = useFileStore(); diff --git a/frontend/src/views/files/Editor.vue b/frontend/src/views/files/Editor.vue index 1654937e..7e4d7a9b 100644 --- a/frontend/src/views/files/Editor.vue +++ b/frontend/src/views/files/Editor.vue @@ -1,5 +1,5 @@ @@ -33,10 +48,11 @@ import Breadcrumbs from "@/components/Breadcrumbs.vue"; import { useAuthStore } from "@/stores/auth"; import { useFileStore } from "@/stores/file"; import { useLayoutStore } from "@/stores/layout"; -import { inject, onBeforeUnmount, onMounted, ref } from "vue"; +import { inject, onBeforeUnmount, onMounted, ref, watchEffect } from "vue"; import { useRoute, useRouter } from "vue-router"; import { useI18n } from "vue-i18n"; import { getTheme } from "@/utils/theme"; +import { marked } from "marked"; const $showError = inject("$showError")!; @@ -51,11 +67,37 @@ const router = useRouter(); const editor = ref(null); +const isPreview = ref(false); +const previewContent = ref(""); +const isMarkdownFile = + fileStore.req?.name.endsWith(".md") || + fileStore.req?.name.endsWith(".markdown"); + onMounted(() => { window.addEventListener("keydown", keyEvent); + window.addEventListener("wheel", handleScroll); const fileContent = fileStore.req?.content || ""; + watchEffect(async () => { + if (isMarkdownFile && isPreview.value) { + const new_value = editor.value?.getValue() || ""; + try { + previewContent.value = await marked(new_value); + } catch (error) { + console.error("Failed to convert content to HTML:", error); + previewContent.value = ""; + } + + const previewContainer = document.getElementById("preview-container"); + if (previewContainer) { + previewContainer.addEventListener("wheel", handleScroll, { + capture: true, + }); + } + } + }); + ace.config.set( "basePath", `https://cdn.jsdelivr.net/npm/ace-builds@${ace_version}/src-min-noconflict/` @@ -82,6 +124,7 @@ onMounted(() => { onBeforeUnmount(() => { window.removeEventListener("keydown", keyEvent); + window.removeEventListener("wheel", handleScroll); editor.value?.destroy(); }); @@ -102,6 +145,13 @@ const keyEvent = (event: KeyboardEvent) => { save(); }; +const handleScroll = (event: WheelEvent) => { + const editorContainer = document.getElementById("preview-container"); + if (editorContainer) { + editorContainer.scrollTop += event.deltaY; + } +}; + const save = async () => { const button = "save"; buttons.loading("save"); @@ -126,4 +176,8 @@ const close = () => { let uri = url.removeLastDir(route.path) + "/"; router.push({ path: uri }); }; + +const preview = () => { + isPreview.value = !isPreview.value; +}; diff --git a/frontend/src/views/files/FileListing.vue b/frontend/src/views/files/FileListing.vue index a26ac67e..c1b048a6 100644 --- a/frontend/src/views/files/FileListing.vue +++ b/frontend/src/views/files/FileListing.vue @@ -82,9 +82,9 @@
- {{ fileStore.selectedCount }} selected + + {{ t("prompts.filesSelected", fileStore.selectedCount) }} + - + {{ name }}