diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 795aba6b..1199d2c7 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -12,7 +12,6 @@
"@vueuse/core": "^10.5.0",
"@vueuse/integrations": "^10.5.0",
"ace-builds": "^1.31.1",
- "clipboard": "^2.0.11",
"core-js": "^3.33.2",
"dayjs": "^1.11.10",
"filesize": "^10.1.0",
@@ -30,6 +29,7 @@
"videojs-hotkeys": "^0.2.28",
"videojs-mobile-ui": "^1.1.1",
"vue": "^3.3.4",
+ "vue-final-modal": "^4.4.5",
"vue-i18n": "^9.6.4",
"vue-lazyload": "^3.0.0",
"vue-router": "^4.2.5",
@@ -3677,16 +3677,6 @@
"node": ">= 6"
}
},
- "node_modules/clipboard": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
- "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
- "dependencies": {
- "good-listener": "^1.2.2",
- "select": "^1.1.2",
- "tiny-emitter": "^2.0.0"
- }
- },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -3936,11 +3926,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/delegate": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
- "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
- },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -4551,8 +4536,6 @@
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz",
"integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==",
- "optional": true,
- "peer": true,
"dependencies": {
"tabbable": "^6.2.0"
}
@@ -4704,14 +4687,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/good-listener": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
- "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
- "dependencies": {
- "delegate": "^3.1.2"
- }
- },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -6353,11 +6328,6 @@
"node": ">=v12.22.7"
}
},
- "node_modules/select": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
- "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
- },
"node_modules/semver": {
"version": "7.5.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
@@ -6544,9 +6514,7 @@
"node_modules/tabbable": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
- "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
- "optional": true,
- "peer": true
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="
},
"node_modules/terser": {
"version": "5.24.0",
@@ -6572,11 +6540,6 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
- "node_modules/tiny-emitter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
- "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
- },
"node_modules/titleize": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
@@ -7059,6 +7022,197 @@
"eslint": ">=6.0.0"
}
},
+ "node_modules/vue-final-modal": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/vue-final-modal/-/vue-final-modal-4.4.5.tgz",
+ "integrity": "sha512-5O1twpVcOuvxc8fJppNYtdZ4M0GGeoSMcHZTFUoie3BmtzSx3EE6Lvz8YgnpQbDkxVMmRKEjhsSBywqqWfoQVw==",
+ "dependencies": {
+ "@vueuse/core": "^9.13.0",
+ "@vueuse/integrations": "^9.13.0",
+ "focus-trap": "^7.4.0",
+ "vue": "^3.3.4"
+ },
+ "peerDependencies": {
+ "@vueuse/core": ">=9.11.1",
+ "@vueuse/integrations": ">=9.11.1",
+ "focus-trap": ">=7.2.0",
+ "vue": ">=3.2.0"
+ }
+ },
+ "node_modules/vue-final-modal/node_modules/@types/web-bluetooth": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+ "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+ },
+ "node_modules/vue-final-modal/node_modules/@vueuse/core": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz",
+ "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.16",
+ "@vueuse/metadata": "9.13.0",
+ "@vueuse/shared": "9.13.0",
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/vue-final-modal/node_modules/@vueuse/core/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "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-final-modal/node_modules/@vueuse/integrations": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-9.13.0.tgz",
+ "integrity": "sha512-I1kX/tsfcvWWLZD7HZaP0LsSfchK13YxReLfharXhk72SFXp87doLbRaTfIF5w8m/gr/vPtcNyQPAXW7Ubpuww==",
+ "dependencies": {
+ "@vueuse/core": "9.13.0",
+ "@vueuse/shared": "9.13.0",
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "async-validator": "*",
+ "axios": "*",
+ "change-case": "*",
+ "drauu": "*",
+ "focus-trap": "*",
+ "fuse.js": "*",
+ "idb-keyval": "*",
+ "jwt-decode": "*",
+ "nprogress": "*",
+ "qrcode": "*",
+ "universal-cookie": "*"
+ },
+ "peerDependenciesMeta": {
+ "async-validator": {
+ "optional": true
+ },
+ "axios": {
+ "optional": true
+ },
+ "change-case": {
+ "optional": true
+ },
+ "drauu": {
+ "optional": true
+ },
+ "focus-trap": {
+ "optional": true
+ },
+ "fuse.js": {
+ "optional": true
+ },
+ "idb-keyval": {
+ "optional": true
+ },
+ "jwt-decode": {
+ "optional": true
+ },
+ "nprogress": {
+ "optional": true
+ },
+ "qrcode": {
+ "optional": true
+ },
+ "universal-cookie": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-final-modal/node_modules/@vueuse/integrations/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "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-final-modal/node_modules/@vueuse/metadata": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz",
+ "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/vue-final-modal/node_modules/@vueuse/shared": {
+ "version": "9.13.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
+ "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
+ "dependencies": {
+ "vue-demi": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/vue-final-modal/node_modules/@vueuse/shared/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "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-i18n": {
"version": "9.6.4",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.6.4.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 5c23b6a5..0d0d4d27 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -22,7 +22,6 @@
"@vueuse/core": "^10.5.0",
"@vueuse/integrations": "^10.5.0",
"ace-builds": "^1.31.1",
- "clipboard": "^2.0.11",
"core-js": "^3.33.2",
"dayjs": "^1.11.10",
"filesize": "^10.1.0",
@@ -40,6 +39,7 @@
"videojs-hotkeys": "^0.2.28",
"videojs-mobile-ui": "^1.1.1",
"vue": "^3.3.4",
+ "vue-final-modal": "^4.4.5",
"vue-i18n": "^9.6.4",
"vue-lazyload": "^3.0.0",
"vue-router": "^4.2.5",
diff --git a/frontend/src/components/prompts/BaseModal.vue b/frontend/src/components/prompts/BaseModal.vue
new file mode 100644
index 00000000..38023839
--- /dev/null
+++ b/frontend/src/components/prompts/BaseModal.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/components/prompts/Copy.vue b/frontend/src/components/prompts/Copy.vue
index 66c07cdf..31cc8583 100644
--- a/frontend/src/components/prompts/Copy.vue
+++ b/frontend/src/components/prompts/Copy.vue
@@ -6,7 +6,7 @@
{{ $t("prompts.copyMessage") }}
-
(dest = val)">
+
(dest = val)" tabindex="1" />
@@ -15,14 +15,17 @@
@click="closeHovers"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')"
+ tabindex="3"
>
{{ $t("buttons.cancel") }}
diff --git a/frontend/src/components/prompts/Delete.vue b/frontend/src/components/prompts/Delete.vue
index 886591fd..096a334e 100644
--- a/frontend/src/components/prompts/Delete.vue
+++ b/frontend/src/components/prompts/Delete.vue
@@ -14,14 +14,17 @@
class="button button--flat button--grey"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')"
+ tabindex="2"
>
{{ $t("buttons.cancel") }}
diff --git a/frontend/src/components/prompts/DeleteUser.vue b/frontend/src/components/prompts/DeleteUser.vue
new file mode 100644
index 00000000..e45dab8e
--- /dev/null
+++ b/frontend/src/components/prompts/DeleteUser.vue
@@ -0,0 +1,40 @@
+
+
+
+
{{ t("prompts.deleteUser") }}
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/prompts/Download.vue b/frontend/src/components/prompts/Download.vue
index a1fc2fd6..553e766e 100644
--- a/frontend/src/components/prompts/Download.vue
+++ b/frontend/src/components/prompts/Download.vue
@@ -1,18 +1,18 @@
-
{{ $t("prompts.download") }}
+ {{ t("prompts.download") }}
-
{{ $t("prompts.downloadMessage") }}
+
{{ t("prompts.downloadMessage") }}
@@ -20,25 +20,21 @@
-
diff --git a/frontend/src/components/prompts/Help.vue b/frontend/src/components/prompts/Help.vue
index 10075959..a5c5d138 100644
--- a/frontend/src/components/prompts/Help.vue
+++ b/frontend/src/components/prompts/Help.vue
@@ -20,11 +20,13 @@
diff --git a/frontend/src/components/prompts/Info.vue b/frontend/src/components/prompts/Info.vue
index a07292aa..68a6cc9d 100644
--- a/frontend/src/components/prompts/Info.vue
+++ b/frontend/src/components/prompts/Info.vue
@@ -33,33 +33,45 @@
MD5: {{
- $t("prompts.show")
- }}{{ $t("prompts.show") }}
SHA1: {{
- $t("prompts.show")
- }}{{ $t("prompts.show") }}
SHA256: {{
- $t("prompts.show")
- }}{{ $t("prompts.show") }}
SHA512: {{
- $t("prompts.show")
- }}{{ $t("prompts.show") }}
@@ -67,6 +79,7 @@